[comp.binaries.apple2] PIDGIN.RT.S

tm@polari.UUCP (Toshi Morita) (07/24/90)

run-time file for Pidgin programs


*
* Pidgin run-time library
*
* (c) 1988 by Toshiyasu Morita, all rights reserved
*
* Started 9/1/88 @ 10:33 am
*

*
* Zero page equates
*

PNTR EQU $00
PNTR2 EQU $02
PNTR3 EQU $04

TEMP EQU $06
TEMP2 EQU $07
TEMP3 EQU $08

CH EQU $24
CV EQU $25

*
* Program equates
*

FILEBUF0 EQU $800
FILEBUF1 EQU $C00
FILEBUF2 EQU $1000

FNAME0 EQU $1400
FNAME1 EQU $1440
FNAME2 EQU $1480

REFNUM0 EQU $14C0
REFNUM1 EQU $14C1
REFNUM2 EQU $14C2

*
* ProDOS equates
*

MLI EQU $BF00

*
* ROM equates
*

BASCALC EQU $FC24
GETKEY EQU $FD0C
COUT EQU $FDED

*
* Start of actual code
*

*
* Interface to ROM GETKEY
*

__GETKEY JSR GETKEY
 AND #$7F
 RTS

*
* Interface to ROM COUT
*

__COUT ORA #$80
 JMP COUT

*
* Text string print
*

__MSG PLA
 STA PNTR
 PLA
 STA PNTR+1
 LDX #0

:LOOP INC PNTR
 BNE :SKIPINC
 INC PNTR+1

:SKIPINC LDA (PNTR,X)
 BEQ :FINIS
 JSR COUT
 JMP :LOOP

:FINIS LDA PNTR+1
 PHA
 LDA PNTR
 PHA
 RTS

*
* Print word in decimal
*

__PRTDEC STX TEMP
 LDA #0
 STA TEMP3 ; Zero flag

 LDX #4
:OUTER LDA #0 ; Current place value counter
 STA TEMP2
:INNER INC TEMP2
 TYA
 SEC
 SBC DECPWRL,X
 TAY
 LDA TEMP
 SBC DECPWRH,X
 STA TEMP
 BCS :INNER
 TYA
 ADC DECPWRL,X
 TAY
 LDA TEMP
 ADC DECPWRH,X
 STA TEMP

 DEC TEMP2
 BNE :PRT
 BIT TEMP3
 BPL :SKIPPRT
:PRT LDA TEMP2
 CLC
 ADC #$B0
 JSR COUT
 SEC
 ROR TEMP3
:SKIPPRT DEX
 BPL :OUTER
 BIT TEMP3
 BPL :ZERO
 RTS

:ZERO LDA #"0"
 JMP COUT

DECPWRL DFB #1,#10,#100,#1000,#10000

DECPWRH DFB #/1,#/10,#/100,#/1000,#/10000

********************************
* Start file I/O subroutines
********************************

*
* flen: get file length
*
* syntax: I$$=flen(#)
*

__FLEN PLA
 STA PNTR
 PLA
 STA PNTR+1

 LDA #$02 ; Two parameters for GET_EOF call
 STA PARMS

 LDY #$01 ; Fetch "channel" #
 LDA (PNTR),Y
 TAY
 LDA REFNUM0,Y
 STA PARMS+1

 INY ; Fetch variables for length
 LDA (PNTR),Y
 STA PNTR2
 INY
 LDA (PNTR),Y
 STA PNTR2+1
 INY
 LDA (PNTR),Y
 STA PNTR3
 INY
 LDA (PNTR),Y
 STA PNTR3+1

 JSR MLI ; Call ProDOS
 DFB $D1
 DW PARMS

 STA _ER:
 BCS :ERROR

 LDA #$00 ; Store file length in variables
 LDY #$01
 STA (PNTR3),Y
 LDA PARMS+3
 STA (PNTR2),Y
 DEY
 LDA PARMS+4
 STA (PNTR3),Y
 LDA PARMS+2
 STA (PNTR2),Y

:ERROR LDA #$05
 JMP EXIT

*
* fopen: open a file
*
* syntax: fopen(#,XX)
*

__FOPEN PLA
 STA PNTR
 PLA
 STA PNTR+1

 LDA #$03 ; Three parameters for OPEN call
 STA PARMS

 LDY #$01 ; Fetch "channel" #
 LDA (PNTR),Y
 STA LASTFILE
 TAX
 LDA FNAMEL,X ; Set up filename destination
 STA PNTR3
 STA PARMS+1
 LDA FNAMEH,X
 STA PNTR3+1
 STA PARMS+2

 INY ; Set up pointer to filename source
 LDA (PNTR),Y
 STA PNTR2
 INY
 LDA (PNTR),Y
 STA PNTR2+1

 LDA FILEBUFL,X ; Set up pointer to ProDOS file buffer
 STA PARMS+3
 LDA FILEBUFH,X
 STA PARMS+4

 LDY #$00 ; Convert filename to ProDOS format
:LOOP LDA (PNTR2),Y
 INY
 STA (PNTR3),Y
 TAX
 BNE :LOOP
 DEY
 TYA
 LDY #$00
 STA (PNTR3),Y

 JSR MLI ; Call ProDOS
 DFB $C8
 DW PARMS

 STA _ER:
 BCS :ERROR

 LDA PARMS+5 ; Save reference number
 LDX LASTFILE
 STA REFNUM0,X

:ERROR LDA #$03
 JMP EXIT

*
* fread: read a file
*
* syntax: fread(#,XX,IXX)
*

__FREAD PLA
 STA PNTR
 PLA
 STA PNTR+1

 LDA #$04 ; Four parameters for READ call
 STA PARMS

 LDY #$01 ; Set up reference number
 LDA (PNTR),Y
 TAX
 LDA REFNUM0,X
 STA PARMS+1

 INY ; Set up data buffer
 LDA (PNTR),Y
 STA PARMS+2
 INY
 LDA (PNTR),Y
 STA PARMS+3

 INY ; Set up requested length
 LDA (PNTR),Y
 STA PNTR2
 INY
 LDA (PNTR),Y
 STA PNTR2+1
 LDY #$00
 LDA (PNTR2),Y
 STA PARMS+4
 INY
 LDA (PNTR2),Y
 STA PARMS+5

 JSR MLI ; Call ProDOS
 DFB $CA
 DW PARMS

 STA _ER: ; Save error number, if any

 LDA #$05
 JMP EXIT

*
* fclose: close a file
*
* syntax: fclose(#)
*

__FCLOSE PLA
 STA PNTR
 PLA
 STA PNTR+1

 LDA #$01 ; One parameter
 STA PARMS

 LDY #$01
 LDA (PNTR),Y
 STA PARMS+1

 JSR MLI
 DFB $CC
 DW PARMS

 LDA #$01
 JMP EXIT

*
* Common exit code
*

EXIT CLC
 ADC PNTR
 TAY
 LDA PNTR+1
 ADC #$00
 PHA
 TYA
 PHA
 RTS

*
* ProDOS parameter list
*

PARMS DS 18

*
* Data area
*

LASTFILE DFB 1

_ER: DFB 1

FNAMEL DFB #<REFNUM0,#<REFNUM1,#<REFNUM2
FNAMEH DFB #>REFNUM0,#>REFNUM1,#>REFNUM2

FILEBUFL DFB #<FILEBUF0,#<FILEBUF1,#<FILEBUF2
FILEBUFH DFB #>FILEBUF0,#>FILEBUF1,#>FILEBUF2



********************************
* End file I/O subroutines
********************************