Merge branch 'main' into system

Pick up DUMP/TYPE/SPOOL update
This commit is contained in:
apple2geek 2022-10-08 15:38:45 -06:00
commit d806d5d43f
2 changed files with 351 additions and 597 deletions

View File

@ -9,34 +9,35 @@
* 26-Oct-2021 Corrected entry parameters to OSRDRM. * 26-Oct-2021 Corrected entry parameters to OSRDRM.
* 03-Nov-2021 Temp'y fix, if can't find SROM, ignores it. * 03-Nov-2021 Temp'y fix, if can't find SROM, ignores it.
* 13-Nov-2021 ROMSELECT calls mainmem to load ROM. * 13-Nov-2021 ROMSELECT calls mainmem to load ROM.
* 08-Oct-2022 ROMSEL doesn't call loder if already paged in.
* OSBYTE $80 - ADVAL * OSBYTE $80 - ADVAL
************************************ ************************************
* Read input device or buffer status * Read input device or buffer status
BYTE80 LDY #$00 ; Prepare return=&00xx BYTE80 LDY #$00 ; Prepare return=&00xx
TXA ; X<0 - info about buffers TXA ; X<0 - info about buffers
BMI ADVALBUF ; X>=0 - read input devices BMI ADVALBUF ; X>=0 - read input devices
CPX #$7F CPX #$7F
BNE ADVALNONE BNE ADVALNONE
ADVALWAIT JSR KBDREAD ADVALWAIT JSR KBDREAD
BCS ADVALWAIT BCS ADVALWAIT
TAX TAX
BPL ADVALOK1 ; &00xx for normal keys BPL ADVALOK1 ; &00xx for normal keys
INY ; &01xx for function/edit keys INY ; &01xx for function/edit keys
ADVALOK1 RTS ADVALOK1 RTS
ADVALNONE LDX #$00 ; Input, just return 0 ADVALNONE LDX #$00 ; Input, just return 0
RTS RTS
ADVALBUF INX ADVALBUF INX
BEQ :ADVALKBD ; Fake keyboard buffer BEQ :ADVALKBD ; Fake keyboard buffer
INX INX
BEQ :ADVALOK ; Serial input, return 0 BEQ :ADVALOK ; Serial input, return 0
LDX #$01 ; For outputs, return 1 char free LDX #$01 ; For outputs, return 1 char free
RTS RTS
:ADVALKBD BIT $C000 ; Test keyboard data/strobe :ADVALKBD BIT $C000 ; Test keyboard data/strobe
BPL :ADVALOK ; No Strobe, return 0 BPL :ADVALOK ; No Strobe, return 0
INX ; Strobe, return 1 INX ; Strobe, return 1
:ADVALOK RTS :ADVALOK RTS
@ -61,21 +62,21 @@ ADVALBUF INX
* (8 * frequency ) * (8 * frequency )
* BEEPX EQU #57 ; note=C5 * BEEPX EQU #57 ; note=C5
BEEPX EQU #116 ; note=C4 BEEPX EQU #116 ; note=C4
BEEP PHA BEEP PHA
PHX PHX
PHY PHY
LDY #$00 ; duration LDY #$00 ; duration
:L1 LDX #BEEPX ; 2cy pitch 2cy :L1 LDX #BEEPX ; 2cy pitch 2cy
*------------------------------------------------------ *------------------------------------------------------
:L2 DEX ; 2cy BEEPX * 2cy :L2 DEX ; 2cy BEEPX * 2cy
BNE :L2 ; 3cy/2cy (BEEPX-1) * 3cy + 1 * 2cy BNE :L2 ; 3cy/2cy (BEEPX-1) * 3cy + 1 * 2cy
*------------------------------------------------------ *------------------------------------------------------
* BEEPX*5-1cy * BEEPX*5-1cy
LDA $C030 ; 4cy BEEPX*5+5 LDA $C030 ; 4cy BEEPX*5+5
DEY ; 2cy BEEPX*5+7 DEY ; 2cy BEEPX*5+7
BNE :L1 ; 3cy/2cy BEEPX*5+10 BNE :L1 ; 3cy/2cy BEEPX*5+10
PLY ; PLY ;
PLX PLX
PLA PLA
RTS RTS
@ -85,9 +86,9 @@ BEEP PHA
OUTSTR TXA OUTSTR TXA
* Print string pointed to by A,Y to the screen * Print string pointed to by A,Y to the screen
PRSTR STA OSTEXT+0 ; String in A,Y PRSTR STA OSTEXT+0 ; String in A,Y
STY OSTEXT+1 STY OSTEXT+1
:L1 LDA (OSTEXT) ; Ptr to string in OSTEXT :L1 LDA (OSTEXT) ; Ptr to string in OSTEXT
BEQ PRSTROK BEQ PRSTROK
JSR OSASCI JSR OSASCI
INC OSTEXT INC OSTEXT
@ -106,7 +107,7 @@ FORCENL LDA #$86
* Print XY in hex * Print XY in hex
OUT2HEX TYA OUT2HEX TYA
JSR OUTHEX JSR OUTHEX
TXA ; Continue into OUTHEX TXA ; Continue into OUTHEX
* Print hex byte in A * Print hex byte in A
OUTHEX PHA OUTHEX PHA
@ -117,16 +118,16 @@ OUTHEX PHA
AND #$0F AND #$0F
JSR PRNIB JSR PRNIB
PLA PLA
AND #$0F ; Continue into PRNIB AND #$0F ; Continue into PRNIB
* Print hex nibble in A * Print hex nibble in A
PRNIB CMP #$0A PRNIB CMP #$0A
BCC :S1 BCC :S1
CLC ; >= $0A CLC ; >= $0A
ADC #'A'-$0A ADC #'A'-$0A
JSR OSWRCH JSR OSWRCH
RTS RTS
:S1 ADC #'0' ; < $0A :S1 ADC #'0' ; < $0A
JMP OSWRCH JMP OSWRCH
* TEMP ENTRY * * TEMP ENTRY *
@ -148,35 +149,35 @@ OSPAD EQU OSTEXT+4
* X=>four byte zero page locations * X=>four byte zero page locations
* Y= number of digits to pad to, 0 for no padding * Y= number of digits to pad to, 0 for no padding
* *
PRINTDEC sty OSPAD ; Number of padding+digits PRINTDEC sty OSPAD ; Number of padding+digits
ldy #0 ; Digit counter ldy #0 ; Digit counter
PRDECDIGIT lda #32 ; 32-bit divide PRDECDIGIT lda #32 ; 32-bit divide
sta OSTEMP sta OSTEMP
lda #0 ; Remainder=0 lda #0 ; Remainder=0
clv ; V=0 means div result = 0 clv ; V=0 means div result = 0
PRDECDIV10 cmp #10/2 ; Calculate OSNUM/10 PRDECDIV10 cmp #10/2 ; Calculate OSNUM/10
bcc PRDEC10 bcc PRDEC10
sbc #10/2+$80 ; Remove digit & set V=1 to show div result > 0 sbc #10/2+$80 ; Remove digit & set V=1 to show div result > 0
sec ; Shift 1 into div result sec ; Shift 1 into div result
PRDEC10 rol 0,x ; Shift /10 result into OSNUM PRDEC10 rol 0,x ; Shift /10 result into OSNUM
rol 1,x rol 1,x
rol 2,x rol 2,x
rol 3,x rol 3,x
rol a ; Shift bits of input into acc (input mod 10) rol a ; Shift bits of input into acc (input mod 10)
dec OSTEMP dec OSTEMP
bne PRDECDIV10 ; Continue 32-bit divide bne PRDECDIV10 ; Continue 32-bit divide
ora #48 ora #48
pha ; Push low digit 0-9 to print pha ; Push low digit 0-9 to print
iny iny
bvs PRDECDIGIT ; If V=1, result of /10 was > 0 & do next digit bvs PRDECDIGIT ; If V=1, result of /10 was > 0 & do next digit
lda #32 lda #32
PRDECLP1 cpy OSPAD PRDECLP1 cpy OSPAD
bcs PRDECLP2 ; Enough padding pushed bcs PRDECLP2 ; Enough padding pushed
pha ; Push leading space characters pha ; Push leading space characters
iny iny
bne PRDECLP1 bne PRDECLP1
PRDECLP2 pla ; Pop character left to right PRDECLP2 pla ; Pop character left to right
jsr OSWRCH ; Print it jsr OSWRCH ; Print it
dey dey
bne PRDECLP2 bne PRDECLP2
rts rts
@ -197,16 +198,16 @@ PRDECLP2 pla ; Pop character left to right
* Very difficult to write this without it being a direct clone * Very difficult to write this without it being a direct clone
* from the BBC MOS. ;) * from the BBC MOS. ;)
* *
GSINTGO ROR GSFLAG ; CY initially into bit 7 GSINTGO ROR GSFLAG ; CY initially into bit 7
JSR SKIPSPC ; Skip any spaces JSR SKIPSPC ; Skip any spaces
INY ; Step past in case it's a quote INY ; Step past in case it's a quote
CMP #$22 ; Is it a quote? CMP #$22 ; Is it a quote?
BEQ GSINTGO1 BEQ GSINTGO1
DEY ; Wasn't a quote, step back DEY ; Wasn't a quote, step back
CLC ; Prepare CC=no leading quote CLC ; Prepare CC=no leading quote
GSINTGO1 ROR GSFLAG ; Rotate 'leading-quote' into flags GSINTGO1 ROR GSFLAG ; Rotate 'leading-quote' into flags
CMP #$0D CMP #$0D
RTS ; Return EQ if end of line RTS ; Return EQ if end of line
* GSFLAG set to: * GSFLAG set to:
* bit7: leading quote found * bit7: leading quote found
* bit6: CC=filename CS=*KEY * bit6: CC=filename CS=*KEY
@ -249,13 +250,13 @@ GSINTGO1 ROR GSFLAG ; Rotate 'leading-quote' into flags
* INX:BNE loop * INX:BNE loop
* done * done
* *
GSRDGO LDA #$00 ; Prepare to clear accumulator GSRDGO LDA #$00 ; Prepare to clear accumulator
GSREADLP STA GSCHAR ; Update accumulator GSREADLP STA GSCHAR ; Update accumulator
LDA (OSLPTR),Y ; Get current character LDA (OSLPTR),Y ; Get current character
CMP #$0D ; End of line? CMP #$0D ; End of line?
BNE GSREAD2 ; No, check character BNE GSREAD2 ; No, check character
BIT GSFLAG BIT GSFLAG
BPL GSREADEND ; We aren't waiting for a closing quote BPL GSREADEND ; We aren't waiting for a closing quote
* ; End of line before closing quote * ; End of line before closing quote
ERRBADSTR BRK ERRBADSTR BRK
DB $FD DB $FD
@ -263,54 +264,54 @@ ERRBADSTR BRK
BRK BRK
GSREAD2 CMP #' ' GSREAD2 CMP #' '
BCC ERRBADSTR ; Embedded control char BCC ERRBADSTR ; Embedded control char
BNE GSREAD3 ; Not a space, process it BNE GSREAD3 ; Not a space, process it
BIT GSFLAG ; Can space terminate string? BIT GSFLAG ; Can space terminate string?
BMI GSREADCHAR ; We're waiting for a terminating quote BMI GSREADCHAR ; We're waiting for a terminating quote
* ; so return the space character * ; so return the space character
BVC GSREADEND ; Space is a terminator, finish BVC GSREADEND ; Space is a terminator, finish
GSREAD3 CMP #$22 ; Is it a quote? GSREAD3 CMP #$22 ; Is it a quote?
BNE GSREADESC ; Not quote, check for escapes BNE GSREADESC ; Not quote, check for escapes
BIT GSFLAG ; Was there an opening quote? BIT GSFLAG ; Was there an opening quote?
BPL GSREADCHAR ; Not waiting for a closing quote BPL GSREADCHAR ; Not waiting for a closing quote
INY ; Waiting for quote, check next character INY ; Waiting for quote, check next character
LDA (OSLPTR),Y LDA (OSLPTR),Y
CMP #$22 ; Is it another quote? CMP #$22 ; Is it another quote?
BEQ GSREADCHAR ; Quote-Quote, expand to single quote BEQ GSREADCHAR ; Quote-Quote, expand to single quote
* End of string * End of string
* Either closing quote, or a space seperator, or end of line * Either closing quote, or a space seperator, or end of line
GSREADEND JSR SKIPSPC ; Skip any spaces to next word GSREADEND JSR SKIPSPC ; Skip any spaces to next word
SEC ; SEC=end of string SEC ; SEC=end of string
RTS ; and (OSLPTR),Y=>next word or end of line RTS ; and (OSLPTR),Y=>next word or end of line
* CS=end of string * CS=end of string
* EQ=end of line * EQ=end of line
* NE=not end of line, more words follow * NE=not end of line, more words follow
GSREADESC CMP #$7C ; Is it '|' escape character GSREADESC CMP #$7C ; Is it '|' escape character
BNE GSREADCHAR ; No, return as character BNE GSREADCHAR ; No, return as character
INY ; Step to next character INY ; Step to next character
LDA (OSLPTR),Y LDA (OSLPTR),Y
CMP #$7C CMP #$7C
BEQ GSREADCHAR ; bar-bar expands to bar BEQ GSREADCHAR ; bar-bar expands to bar
CMP #$22 CMP #$22
BEQ GSREADCHAR ; bar-quote expands to quote BEQ GSREADCHAR ; bar-quote expands to quote
CMP #'!' ; Is it bar-pling? CMP #'!' ; Is it bar-pling?
BNE GSREAD5 ; No, check for bar-letter BNE GSREAD5 ; No, check for bar-letter
INY ; Step past it INY ; Step past it
LDA #$80 ; Set bit 7 in accumulator LDA #$80 ; Set bit 7 in accumulator
BNE GSREADLP ; Loop back to check next character(s) BNE GSREADLP ; Loop back to check next character(s)
GSREAD5 CMP #'?' ; Check for '?' GSREAD5 CMP #'?' ; Check for '?'
BCC ERRBADSTR ; <'?', bad character BCC ERRBADSTR ; <'?', bad character
BEQ GSREADDEL ; bar-query -> DEL BEQ GSREADDEL ; bar-query -> DEL
AND #$1F ; Convert bar-letter to control code AND #$1F ; Convert bar-letter to control code
BIT SETV ; SEV=control character BIT SETV ; SEV=control character
BVS GSREADOK BVS GSREADOK
GSREADDEL LDA #$7F GSREADDEL LDA #$7F
GSREADCHAR CLV ; CLV=not control character GSREADCHAR CLV ; CLV=not control character
GSREADOK INY ; Step to next character GSREADOK INY ; Step to next character
ORA GSCHAR ; Add in any bit 7 from |! prefix ORA GSCHAR ; Add in any bit 7 from |! prefix
CLC ; CLC=not end of string CLC ; CLC=not end of string
RTS RTS
* CC=not end of string * CC=not end of string
* VS=control character * VS=control character
@ -320,13 +321,13 @@ GSREADOK INY ; Step to next character
* Read a byte from sideways ROM * Read a byte from sideways ROM
* On entry, Y=ROM to read from * On entry, Y=ROM to read from
* On exit, A=byte read, X=current ROM, Y=$00 * On exit, A=byte read, X=current ROM, Y=$00
RDROM LDA $F4 RDROM LDA ROMID
PHA ; Save current ROM PHA ; Save current ROM
TYA TYA
TAX ; X=ROM to read from TAX ; X=ROM to read from
JSR ROMSELECT ; Page in the required ROM JSR ROMSELECT ; Page in the required ROM
LDY #$00 LDY #$00
LDA ($F6),Y ; Read the byte LDA (ROMPTR),Y ; Read the byte
PLX PLX
* Select a sideways ROM * Select a sideways ROM
@ -335,106 +336,33 @@ RDROM LDA $F4
ROMSELECT ROMSELECT
* Insert code here for faking sideways ROMs by loading or otherwise * Insert code here for faking sideways ROMs by loading or otherwise
* fetching code to $8000. All registers must be preserved. * fetching code to $8000. All registers must be preserved.
:ROMSEL PHP PHP
CPX ROMID ; Speed up by checking if
BEQ ROMSELOK ; already paged in
PHA PHA
PHX PHX
PHY PHY
TXA ; A=ROM to select SEI
TXA ; A=ROM to select
>>> XF2MAIN,SELECTROM >>> XF2MAIN,SELECTROM
ROMSELDONE >>> ENTAUX ROMSELDONE >>> ENTAUX
PLY PLY
PLX PLX
PLA PLA
PLP STX ROMID ; Set Current ROM number
:ROMSELOK STX $F4 ; Set Current ROM number ROMSELOK PLP
RTS RTS
ROMXX
* CPX $F8
* BEQ :ROMSELOK ; Already selected
*
** Insert code here for faking sideways ROMs by loading or otherwise
** fetching code to $8000. All registers must be preserved.
* CPX MAXROM
* BEQ :ROMSEL
* BCS :ROMSELOK ; Out of range, ignore
*:ROMSEL PHA
* PHX
* PHY
*
* LDA OSLPTR+0
* PHA
* LDA OSLPTR+1
* PHA
*
* TXA
* ASL A
* TAX
* LDA ROMTAB+0,X ; LSB of pointer to name
* STA OSFILECB+0
* LDA ROMTAB+1,X ; MSB of pointer to name
* STA OSFILECB+1
*
* LDX #<OSFILECB
* LDY #>OSFILECB
* LDA #$05 ; Means 'INFO'
* JSR OSFILE
* CMP #$01
* BNE :ROMNOTFND ; File not found
*
* STZ OSFILECB+2 ; Dest address $8000
* LDA #$80
* STA OSFILECB+3
* STZ OSFILECB+4
* STZ OSFILECB+5
* STZ OSFILECB+6 ; Load to specified address
* LDX #<OSFILECB
* LDY #>OSFILECB
* LDA #$FF ; Means 'LOAD'
* JSR OSFILE
*:ROMNOTFND
* PLA
* STA OSLPTR+1
* PLA
* STA OSLPTR+0
* PLY
* PLX
* PLA
* STX $F8 ; Set ROM loaded
*:ROMSELOK STX $F4 ; Set Current ROM number
EVENT RTS EVENT RTS
*BASICROM ASC 'BASIC2.ROM'
* DB $0D,$00
*
*COMALROM ASC 'COMAL.ROM'
* DB $0D,$00
*
*LISPROM ASC 'LISP501.ROM'
* DB $0D,$00
*
*FORTHROM ASC 'FORTH103.ROM'
* DB $0D,$00
*
*PROLOGROM ASC 'MPROLOG310.ROM'
* DB $0D,$00
*
*BCPLROM ASC 'BCPL7.0.ROM'
* DB $0D,$00
*
*PASCROM1 ASC 'PASC.1.10.1.ROM'
* DB $0D,$00
*
*PASCROM2 ASC 'PASC.1.10.2.ROM'
* DB $0D,$00
*
* Initialize ROMTAB according to user selection in menu * Initialize ROMTAB according to user selection in menu
ROMINIT STZ MAXROM ; One sideways ROM only ROMINIT STZ MAXROM ; One sideways ROM only
STA $C002 ; Read main mem STA $C002 ; Read main mem
LDA USERSEL LDA USERSEL ; *TO DO* Should be actual number of ROMs
STA $C003 ; Read aux mem STA $C003 ; Read aux mem
CMP #6 CMP #6
BNE :X1 BNE :X1
@ -444,112 +372,13 @@ ROMINIT STZ MAXROM ; One sideways ROM only
STA MAXROM STA MAXROM
:X2 RTS :X2 RTS
* ASL ; x2
* CLC
* ADC #<ROMS
* STA OSLPTR+0
* LDA #>ROMS
* ADC #$00
* STA OSLPTR+1
* LDY #$00
* LDA (OSLPTR),Y
* STA ROMTAB+0
* INY
* LDA (OSLPTR),Y
* STA ROMTAB+1
* STA $C002 ; Read main mem
* LDA USERSEL
* STA $C003 ; Read aux mem
* CMP #6 ; Menu entry 7 has two ROMs
* BNE :S1
* LDA #<PASCROM2
* STA ROMTAB+2
* LDA #>PASCROM2
* STA ROMTAB+3
* INC MAXROM ; Two ROMs
* BRA :DONE
*:S1 CMP #7 ; Menu entry 8
* BNE :DONE
* LDA #<PASCROM1
* STA ROMTAB+0
* LDA #>PASCROM1
* STA ROMTAB+1
* LDA #<PASCROM2
* STA ROMTAB+2
* LDA #>PASCROM2
* STA ROMTAB+3
* LDA #<LISPROM
* STA ROMTAB+4
* LDA #>LISPROM
* STA ROMTAB+5
* LDA #<FORTHROM
* STA ROMTAB+6
* LDA #>FORTHROM
* STA ROMTAB+7
* LDA #<PROLOGROM
* STA ROMTAB+8
* LDA #>PROLOGROM
* STA ROMTAB+9
* LDA #<BCPLROM
* STA ROMTAB+10
* LDA #>BCPLROM
* STA ROMTAB+11
* LDA #<COMALROM
* STA ROMTAB+12
* LDA #>COMALROM
* STA ROMTAB+13
* LDA #<BASICROM
* STA ROMTAB+14
* LDA #>BASICROM
* STA ROMTAB+15
* LDA #7 ; 8 sideways ROMs
* STA MAXROM
*:DONE LDA #$FF
* STA $F8 ; Force ROM to load
* RTS
*
** Active sideways ROMs
*ROMTAB DW $0000 ; ROM0
* DW $0000 ; ROM1
* DW $0000 ; ROM2
* DW $0000 ; ROM3
* DW $0000 ; ROM4
* DW $0000 ; ROM5
* DW $0000 ; ROM6
* DW $0000 ; ROM7
* DW $0000 ; ROM8
* DW $0000 ; ROM9
* DW $0000 ; ROMA
* DW $0000 ; ROMB
* DW $0000 ; ROMC
* DW $0000 ; ROMD
* DW $0000 ; ROME
* DW $0000 ; ROMF
*
** ROM filenames in same order as in the menu
** ROMMENU copies these to ROMTAB upon user selection
*ROMS DW BASICROM
* DW COMALROM
* DW LISPROM
* DW FORTHROM
* DW PROLOGROM
* DW BCPLROM
* DW PASCROM1
* DW PASCROM2
*EVENT LDA #<OSEVENM
* LDY #>OSEVENM
* JMP PRSTR
*OSEVENM ASC 'OSEVEN.'
* DB $00
********************************************************** **********************************************************
* Interrupt Handlers, MOS redirection vectors etc. * Interrupt Handlers, MOS redirection vectors etc.
********************************************************** **********************************************************
* Invoked from GSBRK in main memory. On IIgs only. * Invoked from GSBRK in main memory. On IIgs only.
GSBRKAUX >>> IENTAUX ; IENTAUX does not do CLI GSBRKAUX >>> IENTAUX ; IENTAUX does not do CLI
* Continue into IRQBRKHDLR * Continue into IRQBRKHDLR
* TO DO: Check, IENTAUX modifies X * TO DO: Check, IENTAUX modifies X
@ -557,56 +386,43 @@ GSBRKAUX >>> IENTAUX ; IENTAUX does not do CLI
IRQBRKHDLR PHA IRQBRKHDLR PHA
* Mustn't enable IRQs within the IRQ handler * Mustn't enable IRQs within the IRQ handler
* Do not use WRTMAIN/WRTAUX macros * Do not use WRTMAIN/WRTAUX macros
BIT $C014 ; Set N if aux write active STA $C004 ; Write to main memory
STA $C004 ; Write to main memory STA $45 ; $45=A for ProDOS IRQ handlers
STA $45 ; $45=A for ProDOS IRQ handlers STA $C005 ; Write to aux memory
BPL :S1 ; If aux write wasn't active, skip
STA $C005 ; Write to aux memory
:S1 LDA GSSPEED ; See if GS was set to 2.8MHz
CMP #$80
BNE :S2 ; Nope, continue slow
TSB $C036 ; GS: Enable 'fast' speed
:S2 TXA TXA
PHA PHA
CLD CLD
TSX TSX
PHX LDA $103,X ; Get PSW from stack
INX
INX
INX
LDA $100,X ; Get PSW from stack
AND #$10 AND #$10
BEQ :IRQ ; IRQ BEQ :IRQ ; IRQ
SEC SEC
INX LDA $0104,X
LDA $0100,X
SBC #$01 SBC #$01
STA FAULT+0 ; FAULT=>error block after BRK STA FAULT+0 ; FAULT=>error block after BRK
INX LDA $0105,X
LDA $0100,X
SBC #$00 SBC #$00
STA FAULT+1 STA FAULT+1
LDA $F4 ; Get current ROM LDA $F4 ; Get current ROM
STA BYTEVARBASE+$BA ; Set ROM at last BRK STA BYTEVARBASE+$BA ; Set ROM at last BRK
PLX STX OSXREG ; Pass stack pointer
STX OSXREG ; Pass stack pointer LDA #$06 ; Service Call 6 = BRK occured
LDA #$06 ; Service Call 6 = BRK occured
JSR SERVICE JSR SERVICE
LDX BYTEVARBASE+$FC ; Get current language LDX BYTEVARBASE+$FC ; Get current language
JSR ROMSELECT ; Bring it into memory JSR ROMSELECT ; Bring it into memory
PLA PLA
TAX TAX
PLA PLA
JMP (BRKV) ; Pass on to BRK handler CLI
JMP (BRKV) ; Pass on to BRK handler
:IRQ >>> XF2MAIN,A2IRQ ; Bounce to Apple IRQ handler :IRQ >>> XF2MAIN,A2IRQ ; Bounce to Apple IRQ handler
IRQBRKRET IRQBRKRET
>>> IENTAUX ; IENTAUX does not do CLI >>> IENTAUX ; IENTAUX does not do CLI
PLA ; TODO: Pass on to IRQ1V PLA ; TODO: Pass on to IRQ1V
TAX TAX
PLA PLA
NULLRTI RTI NULLRTI RTI
@ -626,7 +442,7 @@ MOSBRKHDLR LDA #<MSGBRK
JSR PRERR JSR PRERR
JSR OSNEWL JSR OSNEWL
JSR OSNEWL JSR OSNEWL
STOP JMP STOP ; Cannot return from a BRK STOP JMP STOP ; Cannot return from a BRK
MSGBRK DB $0D MSGBRK DB $0D
ASC 'ERROR: ' ASC 'ERROR: '
@ -634,33 +450,33 @@ MSGBRK DB $0D
* Default page 2 contents * Default page 2 contents
DEFVEC DW NULLRTS ; $200 USERV DEFVEC DW NULLRTS ; $200 USERV
DW MOSBRKHDLR ; $202 BRKV DW MOSBRKHDLR ; $202 BRKV
DW NULLRTI ; $204 IRQ1V DW NULLRTI ; $204 IRQ1V
DW NULLRTI ; $206 IRQ2V DW NULLRTI ; $206 IRQ2V
DW CLIHND ; $208 CLIV DW CLIHND ; $208 CLIV
DW BYTEHND ; $20A BYTEV DW BYTEHND ; $20A BYTEV
DW WORDHND ; $20C WORDV DW WORDHND ; $20C WORDV
DW WRCHHND ; $20E WRCHV DW WRCHHND ; $20E WRCHV
DW RDCHHND ; $210 RDCHV DW RDCHHND ; $210 RDCHV
DW FILEHND ; $212 FILEV DW FILEHND ; $212 FILEV
DW ARGSHND ; $214 ARGSV DW ARGSHND ; $214 ARGSV
DW BGETHND ; $216 BGETV DW BGETHND ; $216 BGETV
DW BPUTHND ; $218 BPUTV DW BPUTHND ; $218 BPUTV
DW GBPBHND ; $21A GBPBV DW GBPBHND ; $21A GBPBV
DW FINDHND ; $21C FINDV DW FINDHND ; $21C FINDV
DW FSCHND ; $21E FSCV DW FSCHND ; $21E FSCV
DW NULLRTS ; $220 EVENTV DW NULLRTS ; $220 EVENTV
DW NULLRTS ; $222 DW NULLRTS ; $222
DW NULLRTS ; $224 DW NULLRTS ; $224
DW NULLRTS ; $226 DW NULLRTS ; $226
DW NULLRTS ; $228 DW NULLRTS ; $228
DW NULLRTS ; $22A DW NULLRTS ; $22A
DW NULLRTS ; $22C DW NULLRTS ; $22C
DW NULLRTS ; $22E DW NULLRTS ; $22E
DW NULLRTS ; $230 SPARE1V DW NULLRTS ; $230 SPARE1V
DW NULLRTS ; $232 SPARE2V DW NULLRTS ; $232 SPARE2V
DW NULLRTS ; $234 SPARE3V DW NULLRTS ; $234 SPARE3V
ENDVEC ENDVEC
* *
@ -676,53 +492,53 @@ MOSAPI EQU $FF95
* OPTIONAL ENTRIES * OPTIONAL ENTRIES
* ---------------- * ----------------
OSSERV JMP SERVICE ; FF95 OSSERV OSSERV JMP SERVICE ; FF95 OSSERV
OSCOLD JMP NULLRTS ; FF98 OSCOLD OSCOLD JMP NULLRTS ; FF98 OSCOLD
OSPRSTR JMP OUTSTR ; FF9B OSPRSTR OSPRSTR JMP OUTSTR ; FF9B OSPRSTR
OSSCANDEC JMP SCANDEC ; FF9E SCANDEC OSSCANDEC JMP SCANDEC ; FF9E SCANDEC
OSSCANHEX JMP SCANHEX ; FFA1 SCANHEX OSSCANHEX JMP SCANHEX ; FFA1 SCANHEX
OSFFA4 JMP NULLRTS ; FFA4 (DISKACC) OSFFA4 JMP NULLRTS ; FFA4 (DISKACC)
OSFFA7 JMP NULLRTS ; FFA7 (DISKCCP) OSFFA7 JMP NULLRTS ; FFA7 (DISKCCP)
PRHEX JMP OUTHEX ; FFAA PRHEX PRHEX JMP OUTHEX ; FFAA PRHEX
PR2HEX JMP OUT2HEX ; FFAD PR2HEX PR2HEX JMP OUT2HEX ; FFAD PR2HEX
OSFFB0 JMP PRINTDEC ; FFB0 (USERINT) OSFFB0 JMP PRINTDEC ; FFB0 (USERINT)
OSWRRM JMP NULLRTS ; FFB3 OSWRRM OSWRRM JMP NULLRTS ; FFB3 OSWRRM
* COMPULSARY ENTRIES * COMPULSARY ENTRIES
* ------------------ * ------------------
VECSIZE DB ENDVEC-DEFVEC ; FFB6 VECSIZE Size of vectors VECSIZE DB ENDVEC-DEFVEC ; FFB6 VECSIZE Size of vectors
VECBASE DW DEFVEC ; FFB7 VECBASE Base of default vectors VECBASE DW DEFVEC ; FFB7 VECBASE Base of default vectors
OSRDRM JMP RDROM ; FFB9 OSRDRM Read byte from paged ROM OSRDRM JMP RDROM ; FFB9 OSRDRM Read byte from paged ROM
OSCHROUT JMP OUTCHAR ; FFBC CHROUT Send char to VDU driver OSCHROUT JMP OUTCHAR ; FFBC CHROUT Send char to VDU driver
OSEVEN JMP EVENT ; FFBF OSEVEN Signal an event OSEVEN JMP EVENT ; FFBF OSEVEN Signal an event
GSINIT JMP GSINTGO ; FFC2 GSINIT Init string reading GSINIT JMP GSINTGO ; FFC2 GSINIT Init string reading
GSREAD JMP GSRDGO ; FFC5 GSREAD Parse general string GSREAD JMP GSRDGO ; FFC5 GSREAD Parse general string
NVWRCH JMP WRCHHND ; FFC8 NVWRCH Nonvectored WRCH NVWRCH JMP WRCHHND ; FFC8 NVWRCH Nonvectored WRCH
NVRDCH JMP RDCHHND ; FFCB NVRDCH Nonvectored RDCH NVRDCH JMP RDCHHND ; FFCB NVRDCH Nonvectored RDCH
OSFIND JMP (FINDV) ; FFCE OSFIND OSFIND JMP (FINDV) ; FFCE OSFIND
OSGBPB JMP (GBPBV) ; FFD1 OSGBPB OSGBPB JMP (GBPBV) ; FFD1 OSGBPB
OSBPUT JMP (BPUTV) ; FFD4 OSBPUT OSBPUT JMP (BPUTV) ; FFD4 OSBPUT
OSBGET JMP (BGETV) ; FFD7 OSBGET OSBGET JMP (BGETV) ; FFD7 OSBGET
OSARGS JMP (ARGSV) ; FFDA OSARGS OSARGS JMP (ARGSV) ; FFDA OSARGS
OSFILE JMP (FILEV) ; FFDD OSFILE OSFILE JMP (FILEV) ; FFDD OSFILE
OSRDCH JMP (RDCHV) ; FFE0 OSRDCH OSRDCH JMP (RDCHV) ; FFE0 OSRDCH
OSASCI CMP #$0D ; FFE3 OSASCI OSASCI CMP #$0D ; FFE3 OSASCI
BNE OSWRCH BNE OSWRCH
OSNEWL LDA #$0A ; FFE7 OSNEWL OSNEWL LDA #$0A ; FFE7 OSNEWL
JSR OSWRCH JSR OSWRCH
OSWRCR LDA #$0D ; FFEC OSWRCR OSWRCR LDA #$0D ; FFEC OSWRCR
OSWRCH JMP (WRCHV) ; FFEE OSWRCH OSWRCH JMP (WRCHV) ; FFEE OSWRCH
OSWORD JMP (WORDV) ; FFF1 OSWORD OSWORD JMP (WORDV) ; FFF1 OSWORD
OSBYTE JMP (BYTEV) ; FFF4 OSBYTE OSBYTE JMP (BYTEV) ; FFF4 OSBYTE
OSCLI JMP (CLIV) ; FFF7 OSCLI OSCLI JMP (CLIV) ; FFF7 OSCLI
NMIVEC DW NULLRTI ; FFFA NMIVEC NMIVEC DW NULLRTI ; FFFA NMIVEC
RSTVEC DW STOP ; FFFC RSTVEC RSTVEC DW STOP ; FFFC RSTVEC
IRQVEC IRQVEC
* Assembler doesn't like running up to $FFFF, so we bodge a bit * Assembler doesn't like running up to $FFFF, so we bodge a bit
MOSEND MOSEND
ORG MOSEND-MOSAPI+MOSVEC ORG MOSEND-MOSAPI+MOSVEC
DW IRQBRKHDLR ; FFFE IRQVEC DW IRQBRKHDLR ; FFFE IRQVEC
MOSVEND MOSVEND
* Buffer for one 512 byte disk block in aux mem * Buffer for one 512 byte disk block in aux mem
@ -731,7 +547,3 @@ AUXBLK ASC '**ENDOFCODE**'

View File

@ -10,11 +10,15 @@
* 12-Sep-2021 *HELP uses subject lookup, *HELP MOS, *HELP HOSTFS. * 12-Sep-2021 *HELP uses subject lookup, *HELP MOS, *HELP HOSTFS.
* 25-Oct-2021 Implemented *BASIC. * 25-Oct-2021 Implemented *BASIC.
* 07-Oct-2022 *CLOSE is a host command, fixed *EXEC. * 07-Oct-2022 *CLOSE is a host command, fixed *EXEC.
* 08-Oct-2022 Rewrote *TYPE, *DUMP, *SPOOL, shares code with *EXEC.
* COMMAND TABLE * COMMAND TABLE
*************** ***************
* Table structure is: { string, byte OR $80, destword-1 } $00 * Table structure is: { string, byte OR $80, destword-1 } $00
* Commands are entered with A=command byte with b7=1
* if b6=1 (LPTR),Y=>parameters
* if b6=0 XY=>parameters
* fsc commands * fsc commands
CMDTABLE ASC 'CAT' ; Must be first command so matches '*.' CMDTABLE ASC 'CAT' ; Must be first command so matches '*.'
DB $85 DB $85
@ -79,19 +83,19 @@ CMDTABLE ASC 'CAT' ; Must be first command so matches '*.'
* filing utilities * filing utilities
ASC 'TYPE' ASC 'TYPE'
DB $80 DB $80
DW TYPE-1 ; TYPE -> (LPTR)=>params DW CMDTYPE-1 ; TYPE -> (LPTR)=>params
ASC 'DUMP' ASC 'DUMP'
DB $80 DB $80
DW DUMP-1 ; DUMP -> (LPTR)=>params DW CMDDUMP-1 ; DUMP -> (LPTR)=>params
ASC 'SPOOL' ASC 'SPOOL'
DB $80 DB $80
DW SPOOL-1 ; SPOOL -> (LPTR)=>params DW CMDSPOOL-1 ; SPOOL -> (LPTR)=>params
ASC 'EXEC' ASC 'EXEC'
DB $80 DB $80
DW EXEC-1 ; EXEC -> (LPTR)=>params DW CMDEXEC-1 ; EXEC -> (LPTR)=>params
ASC 'CLOSE' ASC 'CLOSE'
DB $80 DB $80
DW STARCLOSE-1 ; CLOSE -> (LPTR)=>params DW CMDCLOSE-1 ; CLOSE -> (LPTR)=>params
* BUILD <file> * BUILD <file>
* terminator * terminator
DB $FF DB $FF
@ -166,8 +170,8 @@ CLIMATCH3 JSR SKIPSPC ; (OSLPTR),Y=>parameters
PHA ; Push address low PHA ; Push address low
TXA ; Command byte TXA ; Command byte
PHA PHA
ASL A ; Drop bit 7 ASL A ; Move bit 6 into bit 7
BEQ CLICALL ; If $80 don't convert LPTR BEQ CLICALL ; If $80-&BF don't convert LPTR
JSR LPTRtoXY ; XY=>parameters JSR LPTRtoXY ; XY=>parameters
CLICALL PLA ; A=command parameter CLICALL PLA ; A=command parameter
RTS ; Call command routine RTS ; Call command routine
@ -371,7 +375,7 @@ LPTRtoXY CLC
XYtoLPTR STX OSLPTR+0 XYtoLPTR STX OSLPTR+0
STY OSLPTR+1 STY OSLPTR+1
LDY #0 LDY #0
RTS STARHELP9 RTS
* Print *HELP text * Print *HELP text
STARHELP JSR XYtoLPTR ; (OSLPTR),Y=>parameters STARHELP JSR XYtoLPTR ; (OSLPTR),Y=>parameters
@ -379,8 +383,9 @@ STARHELP JSR XYtoLPTR ; (OSLPTR),Y=>parameters
LDX #<HLPTABLE ; XY=>command table LDX #<HLPTABLE ; XY=>command table
LDY #>HLPTABLE LDY #>HLPTABLE
JSR CLILOOKUP ; Look for *HELP subject JSR CLILOOKUP ; Look for *HELP subject
BEQ STARHELP9 ; Matched
LDA $8006 ; Does ROM have service entry? LDA $8006 ; Does ROM have service entry?
BMI STARHELP6 ; Yes, send service call BMI STARHELP6 ; Yes, skip to send service call
JSR OSNEWL JSR OSNEWL
LDA #$09 ; Language name LDA #$09 ; Language name
LDY #$80 ; *TO DO* make this and BYTE8E LDY #$80 ; *TO DO* make this and BYTE8E
@ -533,236 +538,179 @@ ECHOLP1 JSR GSREAD
JMP ECHOLP1 JMP ECHOLP1
* FILING UTILITIES * FILING UTILITIES
****************** * ================
* *CLOSE * *CLOSE
******** ********
STARCLOSE LDA #$00 CMDCLOSE LDA #$00
TAY TAY
JSR OSFIND ; Close all files JSR OSFIND ; Close all files
STA FXEXEC ; Clear Spool/Exec handles STA FXEXEC ; Ensure Spool/Exec handles cleared
STA FXSPOOL STA FXSPOOL
RTS RTS
* Handle *TYPE command * *TYPE <afsp>
**************
* LPTR=>parameters string * LPTR=>parameters string
* *
TYPE JSR LPTRtoXY CMDTYPE
PHX LDA (OSLPTR),Y ; TEMP
PHY CMP #$0D ; TEMP
JSR XYtoLPTR BEQ ERRTYPE ; No filename
JSR PARSLPTR ; Just for error handling JSR LPTRtoXY ; TEMP
BEQ :SYNTAX ; No filename *
PLY JSR OPENINFILE ; Try to open file
PLX :LOOP JSR OSBGET ; Read a byte
LDA #$40 ; Open for input BCS TYPDMPEND ; EOF
JSR OSFIND ; Try to open file CMP #$0A
CMP #$00 ; Was file opened? BEQ :LOOP ; Ignore <lf>
BEQ :NOTFOUND TAX ; Remember last character
TAY ; File handle in Y JSR OSASCI ; Print the character
:L1 JSR BGETHND ; Read a byte BIT ESCFLAG
BCS :CLOSE ; EOF BPL :LOOP ; No Escape, keep going
CMP #$0A ; Don't print LF TYPEESC JSR TYPCLOSE
BEQ :S1 ERRESCAPE BRK
JSR OSASCI ; Print the character
:S1 LDA ESCFLAG
BMI :ESC
BRA :L1
:CLOSE LDA #$00
JSR OSFIND ; Close file
:DONE RTS
:SYNTAX BRK
DB $DC
ASC 'Syntax: TYPE <*objspec*>'
BRK
:NOTFOUND BRK
DB $D6
ASC 'Not found'
BRK
:ESC LDA #$00 ; Close file
JSR OSFIND
BRK
DB $11 DB $11
ASC 'Escape' ASC 'Escape'
BRK BRK
TYPDMPEND CPX #$0D
BEQ TYPCLOSE
JSR OSNEWL
TYPCLOSE LDA #$00
JMP OSFIND ; Close file
ERRTYPE BRK
DB $DC
ASC 'Syntax: TYPE <afsp>'
BRK
* Handle *DUMP command * Handle *DUMP command
* LPTR=>parameters string * LPTR=>parameters string
* *
DUMP JSR LPTRtoXY CMDDUMP
PHX LDA (OSLPTR),Y ; TEMP
PHY CMP #$0D ; TEMP
JSR XYtoLPTR BEQ :ERRDUMP ; No filename
JSR PARSLPTR ; Just for error handling JSR LPTRtoXY ; TEMP
BEQ :SYNTAX ; No filename *
PLY JSR OPENINFILE ; Try to open file
PLX STZ OSNUM+0 ; Offset = zero
LDA #$40 ; Open for input STZ OSNUM+1
JSR OSFIND ; Try to open file :LOOP1 BIT ESCFLAG
CMP #$00 ; Was file opened? BMI TYPEESC ; Escape pressed
BEQ :NOTFOUND PHY ; Save handle
TAY ; File handle in Y LDX OSNUM+0 ; Print file offset
STZ DUMPOFF LDY OSNUM+1
STZ DUMPOFF+1 JSR PR2HEX
:L1 JSR BGETHND ; Read a byte JSR PRSPACE
BCS :CLOSE ; EOF PLY ; Get handle back
PHA LDA #8 ; 8 bytes to dump
LDA DUMPOFF+0 STA OSNUM+2
AND #$07 TSX ; Reserve bytes on stack
BNE :INC TXA
LDA DUMPOFF+1 ; Print file offset SEC
JSR PRHEXBYTE SBC OSNUM+2
LDA DUMPOFF+0 TAX
JSR PRHEXBYTE TXS ; X=>space on stack
LDA #' ' :LOOP2 JSR OSBGET ; Read a byte
JSR OSASCI BCS :DUMPEOF
LDX #$07 STA $0101,X ; Store on stack
LDA #' ' ; Clear ASCII buffer JSR PRHEX ; Print as hex
:L2 STA DUMPASCI,X JSR PRSPACE
DEX
BNE :L2
:INC INC DUMPOFF+0 ; Increment file offset
BNE :S1
INC DUMPOFF+1
:S1 PLA
STA DUMPASCI,X
JSR PRHEXBYTE
INX INX
LDA #' ' DEC OSNUM+2
JSR OSASCI BNE :LOOP2 ; Loop to do 8 bytes
CPX #$08 ; If EOL .. CLC ; CLC=Not EOF
BNE :S2 BCC :DUMPCHRS ; Jump to display characters
JSR PRCHARS ; Print ASCII representation :DUMPEOF LDA #$2A ; EOF met, pad with '**'
:S2 LDA ESCFLAG JSR OSWRCH
BMI :ESC JSR OSWRCH
BRA :L1 JSR PRSPACE
:CLOSE JSR PRCHARS ; Print ASCII representation
LDA #$00 LDA #$00
JSR OSFIND ; Close file STA $0101,X
:DONE RTS
:SYNTAX BRK
DB $DC
ASC 'Syntax: DUMP <*objspec*>'
BRK
:NOTFOUND BRK
DB $D6
ASC 'Not found'
BRK
:ESC LDA #$00 ; Close file
JSR OSFIND
BRK
DB $11
ASC 'Escape'
BRK
DUMPOFF DW $0000
DUMPASCI DS 8
* Print byte in A in hex format
PRHEXBYTE PHA
LSR A
LSR A
LSR A
LSR A
JSR PRHEXNIB
PLA
JSR PRHEXNIB
RTS
* Print nibble in A in hex format
PRHEXNIB AND #$0F
CMP #10
BPL :LETTER
CLC
ADC #'0'
BRA :PRINT
:LETTER CLC
ADC #'A'-10
:PRINT JSR OSASCI
RTS
* Print ASCII char buffer
* with non-printing chars shown as '.'
PRCHARS CPX #$00
BEQ :DONE
CPX #$08 ; Pad final line
BEQ :S0
LDA #' '
JSR OSASCI
JSR OSASCI
JSR OSASCI
INX INX
BRA PRCHARS DEC OSNUM+2
:S0 LDX #$00 BNE :DUMPEOF ; Loop to do 8 bytes
:L2 LDA DUMPASCI,X SEC ; SEC=EOF
CMP #$20 :DUMPCHRS LDX #8 ; 8 bytes to print
BMI :NOTPRINT :LOOP4 PLA ; Get character
PHP ; Save EOF flag
CMP #$7F CMP #$7F
BPL :NOTPRINT BEQ :DUMPDOT
JSR OSASCI CMP #$20
:S1 INX BCS :DUMPCHR
CPX #$08 :DUMPDOT LDA #$2E
BNE :L2 :DUMPCHR JSR OSWRCH ; Print character
INC OSNUM+0 ; Increment offset
BNE :DUMPNXT
INC OSNUM+1
:DUMPNXT PLP ; Get EOF flag back
DEX
BNE :LOOP4 ; Loop to do 8 bytes
PHP
JSR OSNEWL JSR OSNEWL
LDX #$00 PLP
:DONE RTS BCC :LOOP1
:NOTPRINT LDA #'.' JMP TYPCLOSE ; Close and finish
JSR OSASCI :ERRDUMP BRK
BRA :S1 DB $DC
ASC 'Syntax: DUMP <afsp>'
BRK
* Handle *SPOOL command * Handle *SPOOL command
* LPTR=>parameters string * LPTR=>parameters string
* *
SPOOL JSR LPTRtoXY CMDSPOOL
PHX LDA (OSLPTR),Y ; TEMP
PHY CMP #$0D ; TEMP
JSR XYtoLPTR PHP ; TEMP
JSR PARSLPTR ; Just for error handling JSR LPTRtoXY ; TEMP
BEQ :CLOSE ; No filename - stop spooling *
LDY FXSPOOL ; Already spooling? PHY ; Save Y
BEQ :OPEN LDY FXSPOOL ; Get SPOOL handle
LDA #$00 ; If so, close file BEQ :SPOOL1 ; Wasn't open, skip closing
JSR OSFIND LDA #$00 ; A=CLOSE
:OPEN PLY STA FXSPOOL ; Clear SPOOL handle
PLX JSR OSFIND ; Close SPOOL file
LDA #$80 ; Open for writing :SPOOL1 PLY ; Get Y back, XY=>filename
JSR OSFIND ; Try to open file PLP ; Get NE=filename, EQ=no filename
STA FXSPOOL ; Store SPOOL file handle BEQ :DONE ; No filename, all done
RTS LDA #$80 ; A=OPENOUT, for writing
:CLOSE PLY ; Clean up stack JSR OUTPUTFILE ; Try to open file
PLX STA FXSPOOL ; Store SPOOL handle
LDY FXSPOOL
BEQ :DONE
LDA #$00
JSR OSFIND ; Close file
STZ FXSPOOL
:DONE RTS :DONE RTS
* Handle *EXEC command * Handle *EXEC command
* LPTR=>parameters string * LPTR=>parameters string
* *
EXEC PHY CMDEXEC
LDY FXEXEC LDA (OSLPTR),Y ; TEMP
BEQ :EXEC1 CMP #$0D ; TEMP
LDA #$00 PHP ; TEMP
STA FXEXEC JSR LPTRtoXY ; TEMP
JSR OSFIND ; If Exec open, close it *
:EXEC1 PLY PHY ; Save Y
LDA (OSLPTR),Y LDY FXEXEC ; Get EXEC handle
CMP #$0D BEQ :EXEC1 ; Wasn't open, skip closing it
BEQ :DONE ; No filename, all done LDA #$00 ; A=CLOSE
JSR LPTRtoXY ; XY=>filename STA FXEXEC ; Clear EXEC handle
LDA #$40 ; Open for input JSR OSFIND ; Close EXEC file
JSR OSFIND ; Try to open file :EXEC1 PLY ; Get Y back, XY=>filename
TAY ; Was file opened? PLP ; Get NE=filename, EQ=no filename
BEQ :NOTFOUND BEQ EXECDONE ; No filename, all done
STA FXEXEC ; Store EXEC file handle JSR OPENINFILE ; Try to open file
:DONE RTS STA FXEXEC ; Store EXEC file handle
:NOTFOUND BRK EXECDONE RTS
DB $D6
ASC 'Not found' OPENINFILE LDA #$40 ; Open for input
BRK OUTPUTFILE JSR OSFIND ; Try to open file
TAY ; Was file opened?
BNE EXECDONE ; File opened
EXECNOTFND LDA #$46
JMP MKERROR ; File not found
* *
* Handle *FAST command * Handle *FAST command
@ -824,9 +772,3 @@ LOCKZIP LDA #$A5
STA $C05A STA $C05A
RTS RTS