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 ********************************