From 052e46f98acf8491e3baab39e6aae54d55ec4e7e Mon Sep 17 00:00:00 2001 From: Bobbi Webber-Manners Date: Sun, 12 Sep 2021 02:05:17 -0400 Subject: [PATCH] Fix bug with *INFO on filename without wildcard. --- applecorn.po | Bin 819200 -> 819200 bytes applecorn.s | 2 + auxmem.bytwrd.s | 2 + auxmem.chario.s | 8 +- auxmem.hostfs.s | 4 +- auxmem.init.s | 96 +++--- auxmem.misc.s | 4 +- auxmem.mosequ.s | 76 ++--- auxmem.oscli.s | 792 ++++++++++++++++++++++++------------------------ auxmem.vdu.s | 2 + mainmem.fsequ.s | 2 + mainmem.init.s | 2 + mainmem.ldr.s | 2 + mainmem.lists.s | 2 + mainmem.menu.s | 2 + mainmem.misc.s | 2 + mainmem.path.s | 2 + mainmem.svc.s | 11 +- mainmem.wild.s | 19 +- 19 files changed, 538 insertions(+), 492 deletions(-) diff --git a/applecorn.po b/applecorn.po index 750aea6b7b6779bc5edb5b89040009e608a3ec1e..fa82492d9f272374fc362b7f594e37726b61760b 100644 GIT binary patch delta 13411 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 ENTAUX JSR CHKERROR LDA #$00 RTS - + * Parse filename pointed to by XY * Write filename to MOSFILE in main memory * Returns length in A @@ -926,3 +926,5 @@ ERROR2E DW $C800 + + diff --git a/auxmem.init.s b/auxmem.init.s index 02ee39d..7504551 100644 --- a/auxmem.init.s +++ b/auxmem.init.s @@ -7,8 +7,8 @@ * BBC Micro 'virtual machine' in Apple //e aux memory *********************************************************** -ZP1 EQU $90 ; $90-$9f are spare Econet space - ; so safe to use +ZP1 EQU $90 ; $90-$9f are spare Econet space + ; so safe to use ZP2 EQU $92 ZP3 EQU $94 @@ -16,11 +16,11 @@ ZP3 EQU $94 ** TO DO: will be moved to VDU space *COL EQU $96 ; Cursor column *ROW EQU $97 ; Cursor row -STRTBCKL EQU $9D ; *TO DO* don't need to preserve +STRTBCKL EQU $9D ; *TO DO* don't need to preserve STRTBCKH EQU $9E MOSSHIM - ORG AUXMOS ; MOS shim implementation + ORG AUXMOS ; MOS shim implementation * * Shim code to service Acorn MOS entry points using @@ -30,23 +30,23 @@ MOSSHIM * * Initially executing at $3000 until copied to $D000 -MOSINIT LDX #$FF ; Initialize Alt SP to $1FF +MOSINIT LDX #$FF ; Initialize Alt SP to $1FF TXS - STA $C005 ; Make sure we are writing aux - STA $C000 ; Make sure 80STORE is off + STA $C005 ; Make sure we are writing aux + STA $C000 ; Make sure 80STORE is off - LDA $C08B ; LC RAM Rd/Wt, 1st 4K bank + LDA $C08B ; LC RAM Rd/Wt, 1st 4K bank LDA $C08B -:MODBRA BRA :RELOC ; NOPped out on first run +:MODBRA BRA :RELOC ; NOPped out on first run BRA :NORELOC - LDA #$EA ; NOP opcode + LDA #$EA ; NOP opcode STA :MODBRA STA :MODBRA+1 -:RELOC LDA #AUXMOS1 STA A1H @@ -105,30 +105,30 @@ MOSINIT LDX #$FF ; Initialize Alt SP to $1FF :S7 BRA :L2 :NORELOC -:S8 STA $C00D ; 80 col on - STA $C003 ; Alt charset off - STA $C055 ; PAGE2 - JMP MOSHIGH ; Ensure executing in high memory here +:S8 STA $C00D ; 80 col on + STA $C003 ; Alt charset off + STA $C055 ; PAGE2 + JMP MOSHIGH ; Ensure executing in high memory here MOSHIGH SEI LDX #$FF - TXS ; Initialise stack - INX ; X=$00 + TXS ; Initialise stack + INX ; X=$00 TXA -:SCLR STA $0000,X ; Clear Kernel memory +:SCLR STA $0000,X ; Clear Kernel memory STA $0200,X STA $0300,X INX BNE :SCLR LDX #ENDVEC-DEFVEC-1 -:INITPG2 LDA DEFVEC,X ; Set up vectors +:INITPG2 LDA DEFVEC,X ; Set up vectors STA $200,X DEX BPL :INITPG2 - JSR KBDINIT ; Returns A=startup MODE - JSR VDUINIT ; Initialise VDU driver + JSR KBDINIT ; Returns A=startup MODE + JSR VDUINIT ; Initialise VDU driver JSR PRHELLO LDA #7 JSR OSWRCH @@ -138,33 +138,33 @@ MOSHIGH SEI * OSBYTE $8E - Enter language ROM * -BYTE8E PHP ; Save CLC=RESET, SEC=Not RESET - LDA #$00 - STA FAULT+0 - LDA #$80 - STA FAULT+1 - LDY #$09 - JSR PRERRLP ; Print ROM name with PRERR to set - STY FAULT+0 ; FAULT pointing to version string - JSR OSNEWL - JSR OSNEWL - PLP ; Get entry type back - LDA #$01 - JMP AUXADDR +BYTE8E PHP ; Save CLC=RESET, SEC=Not RESET + LDA #$00 + STA FAULT+0 + LDA #$80 + STA FAULT+1 + LDY #$09 + JSR PRERRLP ; Print ROM name with PRERR to set + STY FAULT+0 ; FAULT pointing to version string + JSR OSNEWL + JSR OSNEWL + PLP ; Get entry type back + LDA #$01 + JMP AUXADDR * OSBYTE $8F - Issue service call * X=service call, Y=parameter * BYTE8F -SERVICEX TXA -SERVICE LDX #$0F - BIT $8006 - BPL :SERVSKIP ; No service entry - JSR $8003 ; Call service entry - TAX - BEQ :SERVDONE -:SERVSKIP LDX #$FF -:SERVDONE RTS +SERVICEX TXA +SERVICE LDX #$0F + BIT $8006 + BPL :SERVSKIP ; No service entry + JSR $8003 ; Call service entry + TAX + BEQ :SERVDONE +:SERVSKIP LDX #$FF +:SERVDONE RTS PRHELLO LDA # text string $E6 OSNUM+0 -MAXLEN EQU OSTEXT+2 ; $E8 $E8 OSNUM+2 -MINCHAR EQU OSTEXT+3 ; $E9 $E9 OSNUM+3 -MAXCHAR EQU OSTEXT+4 ; $EA $EA OSPAD -OSTEMP EQU $EB ; $EB -OSKBD1 EQU $EC ; $EC kbd ws -OSKBD2 EQU OSKBD1+1 ; $ED kbd ws -OSKBD3 EQU OSKBD1+2 ; $EE kbd ws -OSAREG EQU $EF ; $EF A register -OSXREG EQU OSAREG+1 ; $F0 X register -OSYREG EQU OSXREG+1 ; $F1 Y register -OSCTRL EQU OSXREG ; $F0 (XY)=>control block -OSLPTR EQU $F2 ; $F2 => command line +FSFLAG1 EQU $E2 +FSFLAG2 EQU $E3 +GSFLAG EQU $E4 ; $E4 GSREAD processing flags +GSCHAR EQU $E5 ; $E5 GSREAD accumulator +OSTEXT EQU $E6 ; $E6 => text string $E6 OSNUM+0 +MAXLEN EQU OSTEXT+2 ; $E8 $E8 OSNUM+2 +MINCHAR EQU OSTEXT+3 ; $E9 $E9 OSNUM+3 +MAXCHAR EQU OSTEXT+4 ; $EA $EA OSPAD +OSTEMP EQU $EB ; $EB +OSKBD1 EQU $EC ; $EC kbd ws +OSKBD2 EQU OSKBD1+1 ; $ED kbd ws +OSKBD3 EQU OSKBD1+2 ; $EE kbd ws +OSAREG EQU $EF ; $EF A register +OSXREG EQU OSAREG+1 ; $F0 X register +OSYREG EQU OSXREG+1 ; $F1 Y register +OSCTRL EQU OSXREG ; $F0 (XY)=>control block +OSLPTR EQU $F2 ; $F2 => command line * -OSINTWS EQU $FA ; $FA IRQ ZP pointer, use when IRQs off -OSINTA EQU $FC ; $FC IRQ register A store -FAULT EQU $FD ; $FD Error message pointer -ESCFLAG EQU $FF ; $FF Escape status +OSINTWS EQU $FA ; $FA IRQ ZP pointer, use when IRQs off +OSINTA EQU $FC ; $FC IRQ register A store +FAULT EQU $FD ; $FD Error message pointer +ESCFLAG EQU $FF ; $FF Escape status * $0200-$0235 Vectors @@ -45,24 +45,26 @@ ESCFLAG EQU $FF ; $FF Escape status * $0290-$02ED * $02EE-$02FF MOS control block -USERV EQU $200 ; USER vector -BRKV EQU $202 ; BRK vector -CLIV EQU $208 ; OSCLI vector -BYTEV EQU $20A ; OSBYTE vector -WORDV EQU $20C ; OSWORD vector -WRCHV EQU $20E ; OSWRCH vector -RDCHV EQU $210 ; OSRDCH vector -FILEV EQU $212 ; OSFILE vector -ARGSV EQU $214 ; OSARGS vector -BGETV EQU $216 ; OSBGET vector -BPUTV EQU $218 ; OSBPUT vector -GBPBV EQU $21A ; OSGBPB vector -FINDV EQU $21C ; OSFIND vector -FSCV EQU $21E ; FSCV misc file ops +USERV EQU $200 ; USER vector +BRKV EQU $202 ; BRK vector +CLIV EQU $208 ; OSCLI vector +BYTEV EQU $20A ; OSBYTE vector +WORDV EQU $20C ; OSWORD vector +WRCHV EQU $20E ; OSWRCH vector +RDCHV EQU $210 ; OSRDCH vector +FILEV EQU $212 ; OSFILE vector +ARGSV EQU $214 ; OSARGS vector +BGETV EQU $216 ; OSBGET vector +BPUTV EQU $218 ; OSBPUT vector +GBPBV EQU $21A ; OSGBPB vector +FINDV EQU $21C ; OSFIND vector +FSCV EQU $21E ; FSCV misc file ops -BYTEVARBASE EQU $190 ; Base of OSBYTE variables -OSFILECB EQU $2EE ; OSFILE control block +BYTEVARBASE EQU $190 ; Base of OSBYTE variables +OSFILECB EQU $2EE ; OSFILE control block * $0300-$03DF * $03E0-$03FF Used for interfacing with ProDOS XFER + + diff --git a/auxmem.oscli.s b/auxmem.oscli.s index dadf915..0ea4b78 100644 --- a/auxmem.oscli.s +++ b/auxmem.oscli.s @@ -14,75 +14,75 @@ *************** * Table structure is: { string, byte OR $80, destword-1 } $00 * fsc commands -CMDTABLE ASC 'CAT' ; Must be first command so matches '*.' - DB $85 - DW STARFSC-1 ; CAT -> FSC 5, XY=>params - ASC 'RUN' - DB $84 - DW STARFSC-1 ; RUN -> FSC 4, XY=>params - ASC 'EX' - DB $89 - DW STARFSC-1 ; EX -> FSC 9, XY=>params - ASC 'INFO' - DB $8A - DW STARFSC-1 ; INFO -> FSC 10, XY=>params - ASC 'RENAME' - DB $8C - DW STARFSC-1 ; RENAME -> FSC 12, XY=>params +CMDTABLE ASC 'CAT' ; Must be first command so matches '*.' + DB $85 + DW STARFSC-1 ; CAT -> FSC 5, XY=>params + ASC 'RUN' + DB $84 + DW STARFSC-1 ; RUN -> FSC 4, XY=>params + ASC 'EX' + DB $89 + DW STARFSC-1 ; EX -> FSC 9, XY=>params + ASC 'INFO' + DB $8A + DW STARFSC-1 ; INFO -> FSC 10, XY=>params + ASC 'RENAME' + DB $8C + DW STARFSC-1 ; RENAME -> FSC 12, XY=>params * osfile commands - ASC 'LOAD' - DB $FF - DW STARLOAD-1 ; LOAD -> OSFILE FF, CBLK=>filename - ASC 'SAVE' - DB $FF - DW STARSAVE-1 ; SAVE -> OSFILE 00, CBLK=>filename - ASC 'DELETE' - DB $86 - DW STARFILE-1 ; DELETE -> OSFILE 06, CBLK=>filename - ASC 'MKDIR' - DB $88 - DW STARFILE-1 ; MKDIR -> OSFILE 08, CBLK=>filename - ASC 'CDIR' - DB $88 - DW STARFILE-1 ; CDIR -> OSFILE 08, CBLK=>filename + ASC 'LOAD' + DB $FF + DW STARLOAD-1 ; LOAD -> OSFILE FF, CBLK=>filename + ASC 'SAVE' + DB $FF + DW STARSAVE-1 ; SAVE -> OSFILE 00, CBLK=>filename + ASC 'DELETE' + DB $86 + DW STARFILE-1 ; DELETE -> OSFILE 06, CBLK=>filename + ASC 'MKDIR' + DB $88 + DW STARFILE-1 ; MKDIR -> OSFILE 08, CBLK=>filename + ASC 'CDIR' + DB $88 + DW STARFILE-1 ; CDIR -> OSFILE 08, CBLK=>filename * osbyte commands - ASC 'FX' - DB $80 - DW STARFX-1 ; FX -> OSBYTE A,X,Y (LPTR)=>params - ASC 'OPT' - DB $8B - DW STARBYTE-1 ; OPT -> OSBYTE &8B,X,Y XY=>params + ASC 'FX' + DB $80 + DW STARFX-1 ; FX -> OSBYTE A,X,Y (LPTR)=>params + ASC 'OPT' + DB $8B + DW STARBYTE-1 ; OPT -> OSBYTE &8B,X,Y XY=>params * others - ASC 'QUIT' - DB $80 - DW STARQUIT-1 ; QUIT -> (LPTR)=>params - ASC 'HELP' - DB $FF - DW STARHELP-1 ; HELP -> XY=>params - ASC 'BASIC' - DB $80 - DW STARBASIC-1 ; BASIC -> (LPTR)=>params - ASC 'KEY' - DB $80 - DW STARKEY-1 ; KEY -> (LPTR)=>params - ASC 'ECHO' - DB $80 - DW ECHO-1 ; ECHO -> (LPTR)=>params + ASC 'QUIT' + DB $80 + DW STARQUIT-1 ; QUIT -> (LPTR)=>params + ASC 'HELP' + DB $FF + DW STARHELP-1 ; HELP -> XY=>params + ASC 'BASIC' + DB $80 + DW STARBASIC-1 ; BASIC -> (LPTR)=>params + ASC 'KEY' + DB $80 + DW STARKEY-1 ; KEY -> (LPTR)=>params + ASC 'ECHO' + DB $80 + DW ECHO-1 ; ECHO -> (LPTR)=>params * DUMP * TYPE * BUILD * terminator - DB $FF + DB $FF * *HELP TABLE ************* -HLPTABLE ASC 'MOS' - DB $80 - DW HELPMOS-1 ; *HELP MOS - ASC 'HOSTFS' - DB $80 - DW HELPHOSTFS-1 ; *HELP HOSTFS - DB $FF +HLPTABLE ASC 'MOS' + DB $80 + DW HELPMOS-1 ; *HELP MOS + ASC 'HOSTFS' + DB $80 + DW HELPHOSTFS-1 ; *HELP HOSTFS + DB $FF * Command table lookup @@ -92,402 +92,402 @@ HLPTABLE ASC 'MOS' * A<>0 no match * * Search command table -CLILOOKUP STX OSTEXT+0 ; Start of command table - STY OSTEXT+1 - LDX #0 ; (ZP,X)=>command table -CLILP4 LDY #0 ; Start of command line -CLILP5 LDA (OSTEXT,X) - BMI CLIMATCH ; End of table string - EOR (OSLPTR),Y - AND #$DF ; Force upper case match - BNE CLINOMATCH - JSR CLISTEP ; Step to next table char - INY ; Step to next command char - BNE CLILP5 ; Loop to check +CLILOOKUP STX OSTEXT+0 ; Start of command table + STY OSTEXT+1 + LDX #0 ; (ZP,X)=>command table +CLILP4 LDY #0 ; Start of command line +CLILP5 LDA (OSTEXT,X) + BMI CLIMATCH ; End of table string + EOR (OSLPTR),Y + AND #$DF ; Force upper case match + BNE CLINOMATCH + JSR CLISTEP ; Step to next table char + INY ; Step to next command char + BNE CLILP5 ; Loop to check -CLINOMATCH LDA (OSLPTR),Y - CMP #'.' ; Abbreviation? - BEQ CLIDOT -CLINEXT JSR CLISTEP ; No match, step to next entry - BPL CLINEXT -CLINEXT2 JSR CLISTEP ; Step past byte, address - JSR CLISTEP - JSR CLISTEP - BPL CLILP4 ; Loop to check next - RTS ; Exit, A>$7F +CLINOMATCH LDA (OSLPTR),Y + CMP #'.' ; Abbreviation? + BEQ CLIDOT +CLINEXT JSR CLISTEP ; No match, step to next entry + BPL CLINEXT +CLINEXT2 JSR CLISTEP ; Step past byte, address + JSR CLISTEP + JSR CLISTEP + BPL CLILP4 ; Loop to check next + RTS ; Exit, A>$7F -CLIDOT LDA (OSTEXT,X) - BMI CLINEXT2 ; Dot after full word, no match -CLIDOT2 JSR CLISTEP ; Step to command address - BPL CLIDOT2 - INY ; Step past dot - BNE CLIMATCH2 ; Jump to this command +CLIDOT LDA (OSTEXT,X) + BMI CLINEXT2 ; Dot after full word, no match +CLIDOT2 JSR CLISTEP ; Step to command address + BPL CLIDOT2 + INY ; Step past dot + BNE CLIMATCH2 ; Jump to this command -CLIMATCH LDA (OSLPTR),Y - CMP #'.' - BEQ CLINEXT ; Longer abbreviation, eg 'CAT.' - CMP #'A' - BCS CLINEXT ; More letters, eg 'HELPER' -CLIMATCH2 JSR CLIMATCH3 ; Call the routine - LDA #0 - RTS ; Return A=0 to claim +CLIMATCH LDA (OSLPTR),Y + CMP #'.' + BEQ CLINEXT ; Longer abbreviation, eg 'CAT.' + CMP #'A' + BCS CLINEXT ; More letters, eg 'HELPER' +CLIMATCH2 JSR CLIMATCH3 ; Call the routine + LDA #0 + RTS ; Return A=0 to claim -CLIMATCH3 JSR SKIPSPC ; (OSLPTR),Y=>parameters - LDA (OSTEXT,X) ; Command byte - PHA - JSR CLISTEP ; Address low byte - STA OSTEMP - JSR CLISTEP ; Address high byte - PLX ; Get command byte - PHA ; Push address high - LDA OSTEMP - PHA ; Push address low - TXA ; Command byte - PHA - ASL A ; Drop bit 7 - BEQ CLICALL ; If $80 don't convert LPTR - JSR LPTRtoXY ; XY=>parameters -CLICALL PLA ; A=command parameter - RTS ; Call command routine +CLIMATCH3 JSR SKIPSPC ; (OSLPTR),Y=>parameters + LDA (OSTEXT,X) ; Command byte + PHA + JSR CLISTEP ; Address low byte + STA OSTEMP + JSR CLISTEP ; Address high byte + PLX ; Get command byte + PHA ; Push address high + LDA OSTEMP + PHA ; Push address low + TXA ; Command byte + PHA + ASL A ; Drop bit 7 + BEQ CLICALL ; If $80 don't convert LPTR + JSR LPTRtoXY ; XY=>parameters +CLICALL PLA ; A=command parameter + RTS ; Call command routine -CLISTEP INC OSTEXT+0,X ; Point to next table byte - BNE CLISTEP2 - INC OSTEXT+1,X -CLISTEP2 LDA (OSTEXT,X) ; Get next byte - RTS +CLISTEP INC OSTEXT+0,X ; Point to next table byte + BNE CLISTEP2 + INC OSTEXT+1,X +CLISTEP2 LDA (OSTEXT,X) ; Get next byte + RTS * OSCLI HANDLER * On entry, XY=>command string * On exit, AXY corrupted or error generated * -CLIHND JSR XYtoLPTR ; LPTR=>command line -CLILP1 LDA (OSLPTR),Y - CMP #$0D - BEQ CLI2 - INY - BNE CLILP1 -CLIEXIT1 RTS ; No terminating -CLI2 LDY #$FF -CLILP2 JSR SKIPSPC1 ; Skip leading spaces - CMP #'*' ; Skip leading stars - BEQ CLILP2 - CMP #$0D - BEQ CLIEXIT1 ; Null string - CMP #'|' - BEQ CLIEXIT1 ; Comment - CMP #'/' - BEQ CLISLASH - JSR LPTRtoXY ; Add Y to LPTR - JSR XYtoLPTR ; LPTR=>start of actual command - LDX #command table - LDY #>CMDTABLE - JSR CLILOOKUP ; Look for command - BNE CLIUNKNOWN ; No match -CLIDONE RTS +CLIHND JSR XYtoLPTR ; LPTR=>command line +CLILP1 LDA (OSLPTR),Y + CMP #$0D + BEQ CLI2 + INY + BNE CLILP1 +CLIEXIT1 RTS ; No terminating +CLI2 LDY #$FF +CLILP2 JSR SKIPSPC1 ; Skip leading spaces + CMP #'*' ; Skip leading stars + BEQ CLILP2 + CMP #$0D + BEQ CLIEXIT1 ; Null string + CMP #'|' + BEQ CLIEXIT1 ; Comment + CMP #'/' + BEQ CLISLASH + JSR LPTRtoXY ; Add Y to LPTR + JSR XYtoLPTR ; LPTR=>start of actual command + LDX #command table + LDY #>CMDTABLE + JSR CLILOOKUP ; Look for command + BNE CLIUNKNOWN ; No match +CLIDONE RTS -CLISLASH JSR SKIPSPC1 - BEQ CLIDONE ; */ - LDA #$02 - BNE STARFSC2 ; FSC 2 = */filename +CLISLASH JSR SKIPSPC1 + BEQ CLIDONE ; */ + LDA #$02 + BNE STARFSC2 ; FSC 2 = */filename -CLIUNKNOWN LDA #$04 - JSR SERVICE ; Offer to sideways ROM(s) - BEQ CLIDONE ; Claimed - LDA #$03 ; FSC 3 = unknown command -STARFSC2 PHA - JSR LPTRtoXY ; XY=>command - PLA -STARFSC AND #$7F ; A=command, XY=>parameters - JSR CALLFSCV ; Hand on to filing system - TAX - BEQ CLIDONE ; A=0, FSC call implemented -ERRBADCMD BRK - DB $FE - ASC 'Bad command' -ERRBADNUM BRK - DB $FC - ASC 'Bad number' -ERRBADADD BRK - DB $FC - ASC 'Bad address' - BRK +CLIUNKNOWN LDA #$04 + JSR SERVICE ; Offer to sideways ROM(s) + BEQ CLIDONE ; Claimed + LDA #$03 ; FSC 3 = unknown command +STARFSC2 PHA + JSR LPTRtoXY ; XY=>command + PLA +STARFSC AND #$7F ; A=command, XY=>parameters + JSR CALLFSCV ; Hand on to filing system + TAX + BEQ CLIDONE ; A=0, FSC call implemented +ERRBADCMD BRK + DB $FE + ASC 'Bad command' +ERRBADNUM BRK + DB $FC + ASC 'Bad number' +ERRBADADD BRK + DB $FC + ASC 'Bad address' + BRK * *FX num(,num(,num)) ********************* -STARFX JSR SCANDEC - BRA STARBYTE1 +STARFX JSR SCANDEC + BRA STARBYTE1 * Commands passed to OSBYTE *************************** -STARBYTE JSR XYtoLPTR -STARBYTE1 STA OSAREG ; Save OSBYTE number - LDA #$00 ; Default X and Y - STA OSXREG - STA OSYREG - JSR SKIPCOMMA ; Step past any comma/spaces - BEQ STARBYTE2 ; End of line, do it - JSR SCANDEC ; Scan for X param - STA OSXREG ; Store it - JSR SKIPCOMMA ; Step past any comma/spaces - BEQ STARBYTE2 ; End of line, do it - JSR SCANDEC ; Scan for Y param - STA OSYREG ; Store it - JSR SKIPSPC - BNE ERRBADCMD ; More params, error -STARBYTE2 LDY OSYREG - LDX OSXREG - LDA OSAREG - JSR OSBYTE - BVS ERRBADCMD - RTS +STARBYTE JSR XYtoLPTR +STARBYTE1 STA OSAREG ; Save OSBYTE number + LDA #$00 ; Default X and Y + STA OSXREG + STA OSYREG + JSR SKIPCOMMA ; Step past any comma/spaces + BEQ STARBYTE2 ; End of line, do it + JSR SCANDEC ; Scan for X param + STA OSXREG ; Store it + JSR SKIPCOMMA ; Step past any comma/spaces + BEQ STARBYTE2 ; End of line, do it + JSR SCANDEC ; Scan for Y param + STA OSYREG ; Store it + JSR SKIPSPC + BNE ERRBADCMD ; More params, error +STARBYTE2 LDY OSYREG + LDX OSXREG + LDA OSAREG + JSR OSBYTE + BVS ERRBADCMD + RTS * Scan decimal number -SCANDEC JSR SKIPSPC - JSR SCANDIGIT ; Check first digit - BCS ERRBADNUM ; Doesn't start with a digit -SCANDECLP STA OSTEMP ; Store as current number - JSR SCANDIGIT ; Check next digit - BCS SCANDECOK ; No more digits - PHA - LDA OSTEMP - CMP #26 - BCS ERRBADNUM ; num>25, num*25>255 - ASL A ; num*2 - ASL A ; num*4 - ADC OSTEMP ; num*4+num = num*5 - ASL A ; num*10 - STA OSTEMP - PLA - ADC OSTEMP ; num=num*10+digit - BCC SCANDECLP - BCS ERRBADNUM ; Overflowed +SCANDEC JSR SKIPSPC + JSR SCANDIGIT ; Check first digit + BCS ERRBADNUM ; Doesn't start with a digit +SCANDECLP STA OSTEMP ; Store as current number + JSR SCANDIGIT ; Check next digit + BCS SCANDECOK ; No more digits + PHA + LDA OSTEMP + CMP #26 + BCS ERRBADNUM ; num>25, num*25>255 + ASL A ; num*2 + ASL A ; num*4 + ADC OSTEMP ; num*4+num = num*5 + ASL A ; num*10 + STA OSTEMP + PLA + ADC OSTEMP ; num=num*10+digit + BCC SCANDECLP + BCS ERRBADNUM ; Overflowed -SCANDECOK LDA OSTEMP ; Return A=number -SCANDIG2 SEC - RTS +SCANDECOK LDA OSTEMP ; Return A=number +SCANDIG2 SEC + RTS -SCANDIGIT LDA (OSLPTR),Y - CMP #'0' - BCC SCANDIG2 ; <'0' - CMP #'9'+1 - BCS SCANDIG2 ; >'9' - INY - AND #$0F - RTS +SCANDIGIT LDA (OSLPTR),Y + CMP #'0' + BCC SCANDIG2 ; <'0' + CMP #'9'+1 + BCS SCANDIG2 ; >'9' + INY + AND #$0F + RTS -HEXDIGIT JSR SCANDIGIT - BCC HEXDIGIT2 ; Decimal digit - AND #$DF - CMP #'A' - BCC SCANDIG2 ; Bad hex character - CMP #'G' - BCS HEXDIGIT2 ; Bad hex character - SBC #$36 ; Convert 'A'-'F' to $0A-$0F - INY - CLC -HEXDIGIT2 RTS +HEXDIGIT JSR SCANDIGIT + BCC HEXDIGIT2 ; Decimal digit + AND #$DF + CMP #'A' + BCC SCANDIG2 ; Bad hex character + CMP #'G' + BCS HEXDIGIT2 ; Bad hex character + SBC #$36 ; Convert 'A'-'F' to $0A-$0F + INY + CLC +HEXDIGIT2 RTS * Scan hex address * (OSLPTR),Y=>first character * $200,X = 4-byte accumulator -SCANHEX JSR HEXDIGIT ; Get first digit - BCS ERRBADADD1 ; Not a hex character - STA $200,X ; Store first digit - LDA #0 - STA $201,X ; Clear rest of accumulator - STA $202,X - STA $203,X -SCANHEXLP1 JSR HEXDIGIT ; Get next digit - BCS SKIPSPC ; Done, exit by skipping spaces - STY OSTEMP - LDY #4 ; Four bits to rotate -SCANHEXLP2 ASL $200,X ; Multiple accumulator by 16 - ROL $201,X - ROL $202,X - ROL $203,X - BCS ERRBADADD1 ; Overflowed - DEY - BNE SCANHEXLP2 ; Loop for four bits - ORA $200,X ; Add in current digit - STA $200,X - LDY OSTEMP ; Get Y back - BNE SCANHEXLP1 -ERRBADADD1 JMP ERRBADADD +SCANHEX JSR HEXDIGIT ; Get first digit + BCS ERRBADADD1 ; Not a hex character + STA $200,X ; Store first digit + LDA #0 + STA $201,X ; Clear rest of accumulator + STA $202,X + STA $203,X +SCANHEXLP1 JSR HEXDIGIT ; Get next digit + BCS SKIPSPC ; Done, exit by skipping spaces + STY OSTEMP + LDY #4 ; Four bits to rotate +SCANHEXLP2 ASL $200,X ; Multiple accumulator by 16 + ROL $201,X + ROL $202,X + ROL $203,X + BCS ERRBADADD1 ; Overflowed + DEY + BNE SCANHEXLP2 ; Loop for four bits + ORA $200,X ; Add in current digit + STA $200,X + LDY OSTEMP ; Get Y back + BNE SCANHEXLP1 +ERRBADADD1 JMP ERRBADADD -SKIPCOMMA LDA (OSLPTR),Y - CMP #$2C - BNE SKIPSPC ; Drop through +SKIPCOMMA LDA (OSLPTR),Y + CMP #$2C + BNE SKIPSPC ; Drop through * * Skip spaces -SKIPSPC1 INY ; Step past a character -SKIPSPC LDA (OSLPTR),Y - CMP #' ' - BEQ SKIPSPC1 - CMP #$0D ; Return EQ= - RTS +SKIPSPC1 INY ; Step past a character +SKIPSPC LDA (OSLPTR),Y + CMP #' ' + BEQ SKIPSPC1 + CMP #$0D ; Return EQ= + RTS * Skip a string -SKIPWORD CLC - JSR GSINIT -SKIPWORDLP JSR GSREAD - BCC SKIPWORDLP - RTS +SKIPWORD CLC + JSR GSINIT +SKIPWORDLP JSR GSREAD + BCC SKIPWORDLP + RTS * Convert (LPTR),Y to XY -LPTRtoXY CLC - TYA - ADC OSLPTR+0 - TAX - LDA #0 - ADC OSLPTR+1 - TAY - RTS +LPTRtoXY CLC + TYA + ADC OSLPTR+0 + TAX + LDA #0 + ADC OSLPTR+1 + TAY + RTS * Convert XY to (LPTR),Y -XYtoLPTR STX OSLPTR+0 - STY OSLPTR+1 - LDY #0 - RTS +XYtoLPTR STX OSLPTR+0 + STY OSLPTR+1 + LDY #0 + RTS * Print *HELP text -STARHELP JSR XYtoLPTR ; (OSLPTR),Y=>parameters - JSR PRHELLO ; Unify version message - LDX #command table - LDY #>HLPTABLE - JSR CLILOOKUP ; Look for *HELP subject - LDA $8006 ; Does ROM have service entry? - BMI STARHELP6 ; Yes, send service call - JSR OSNEWL - LDA #$09 ; Language name - LDY #$80 ; *TO DO* make this and BYTE8E - JSR PRSTR ; use same code - JSR OSNEWL -STARHELP6 LDY #0 ; (OSLPTR),Y=>parameters - LDA #9 - JMP SERVICE ; Pass to sideways ROM(s) +STARHELP JSR XYtoLPTR ; (OSLPTR),Y=>parameters + JSR PRHELLO ; Unify version message + LDX #command table + LDY #>HLPTABLE + JSR CLILOOKUP ; Look for *HELP subject + LDA $8006 ; Does ROM have service entry? + BMI STARHELP6 ; Yes, send service call + JSR OSNEWL + LDA #$09 ; Language name + LDY #$80 ; *TO DO* make this and BYTE8E + JSR PRSTR ; use same code + JSR OSNEWL +STARHELP6 LDY #0 ; (OSLPTR),Y=>parameters + LDA #9 + JMP SERVICE ; Pass to sideways ROM(s) -HELPHOSTFS LDX #FSCCOMMAND - BNE HELPLIST -HELPMOS LDX #CMDTABLE +HELPHOSTFS LDX #FSCCOMMAND + BNE HELPLIST +HELPMOS LDX #CMDTABLE -HELPLIST STX OSTEXT+0 ; Start of command table - STY OSTEXT+1 - LDX #0 -HELPLP1 LDA #32 - JSR OSWRCH - JSR OSWRCH -HELPLP2 LDY #10 -HELPLP3 LDA (OSTEXT,X) - BMI HELPLP4 - JSR OSWRCH - DEY - JSR CLISTEP - BPL HELPLP3 -HELPLP4 LDA #32 - JSR OSWRCH - DEY - BNE HELPLP4 - JSR CLISTEP - JSR CLISTEP - JSR CLISTEP - BPL HELPLP2 -STARHELP4 LDA #$08 - JSR OSWRCH - JSR OSWRCH - JMP FORCENL +HELPLIST STX OSTEXT+0 ; Start of command table + STY OSTEXT+1 + LDX #0 +HELPLP1 LDA #32 + JSR OSWRCH + JSR OSWRCH +HELPLP2 LDY #10 +HELPLP3 LDA (OSTEXT,X) + BMI HELPLP4 + JSR OSWRCH + DEY + JSR CLISTEP + BPL HELPLP3 +HELPLP4 LDA #32 + JSR OSWRCH + DEY + BNE HELPLP4 + JSR CLISTEP + JSR CLISTEP + JSR CLISTEP + BPL HELPLP2 +STARHELP4 LDA #$08 + JSR OSWRCH + JSR OSWRCH + JMP FORCENL * Handle *QUIT command -STARQUIT >>> XF2MAIN,QUIT +STARQUIT >>> XF2MAIN,QUIT -STARSAVE LDA #$00 ; Set A=0 - SAVE -STARLOAD PHA ; Entered with A=$FF - LOAD - JSR XYtoLPTR ; OSLPTR=>filename - JSR SKIPWORD ; Step past filename - BNE STARLDSV3 ; filename followed by addr +STARSAVE LDA #$00 ; Set A=0 - SAVE +STARLOAD PHA ; Entered with A=$FF - LOAD + JSR XYtoLPTR ; OSLPTR=>filename + JSR SKIPWORD ; Step past filename + BNE STARLDSV3 ; filename followed by addr * * filename followed by no address, must be *LOAD name -STARLDSV1 LDA #$FF ; $FF=load to file's address -STARLOAD2 STA OSFILECB+6 - PLA - BEQ ERRBADADD2 ; *save name - LDA #$7F ; Will become A=$FF - JMP STARLDSVGO ; Do the load +STARLDSV1 LDA #$FF ; $FF=load to file's address +STARLOAD2 STA OSFILECB+6 + PLA + BEQ ERRBADADD2 ; *save name + LDA #$7F ; Will become A=$FF + JMP STARLDSVGO ; Do the load * At least one address specified -STARLDSV3 LDX #OSFILECB+2-$200 ; X=>load - JSR SCANHEX - BNE STARSAVE3 ; Another address - LDA #$00 ; $00=load to supplied address - BEQ STARLOAD2 ; Only one address, must be *LOAD +STARLDSV3 LDX #OSFILECB+2-$200 ; X=>load + JSR SCANHEX + BNE STARSAVE3 ; Another address + LDA #$00 ; $00=load to supplied address + BEQ STARLOAD2 ; Only one address, must be *LOAD * More than one address, must be *SAVE -STARSAVE3 PLA - BNE ERRBADADD2 ; Can't be *LOAD - LDX #3 -STARSAVE4 LDA OSFILECB+2,X ; Get load - STA OSFILECB+6,X ; copy to exec - STA OSFILECB+10,X ; and to start - DEX - BPL STARSAVE4 - LDA (OSLPTR),Y - CMP #'+' - PHP - BNE STARSAVE5 ; Not start+length - JSR SKIPSPC1 ; Step past '+' and spaces -STARSAVE5 LDX #OSFILECB+14-$200 - JSR SCANHEX ; Get end or length - PLP - BNE STARSAVE7 ; Not +length - LDX #0 - CLC -STARSAVE6 LDA OSFILECB+10,X ; end=start+length - ADC OSFILECB+14,X - STA OSFILECB+14,X - INX - TXA - AND #3 - BNE STARSAVE6 +STARSAVE3 PLA + BNE ERRBADADD2 ; Can't be *LOAD + LDX #3 +STARSAVE4 LDA OSFILECB+2,X ; Get load + STA OSFILECB+6,X ; copy to exec + STA OSFILECB+10,X ; and to start + DEX + BPL STARSAVE4 + LDA (OSLPTR),Y + CMP #'+' + PHP + BNE STARSAVE5 ; Not start+length + JSR SKIPSPC1 ; Step past '+' and spaces +STARSAVE5 LDX #OSFILECB+14-$200 + JSR SCANHEX ; Get end or length + PLP + BNE STARSAVE7 ; Not +length + LDX #0 + CLC +STARSAVE6 LDA OSFILECB+10,X ; end=start+length + ADC OSFILECB+14,X + STA OSFILECB+14,X + INX + TXA + AND #3 + BNE STARSAVE6 * load =start * exec =start * start=start * end =end or start+length -STARSAVE7 JSR SKIPSPC - BEQ STARSAVE10 ; No more, do it - LDX #OSFILECB+6-$200 - JSR SCANHEX ; Get exec - BEQ STARSAVE10 ; No more, do it - LDX #OSFILECB+2-$200 - JSR SCANHEX ; Get load - BEQ STARSAVE10 ; No more, do it -ERRBADADD2 JMP ERRBADADD ; Too many parameters +STARSAVE7 JSR SKIPSPC + BEQ STARSAVE10 ; No more, do it + LDX #OSFILECB+6-$200 + JSR SCANHEX ; Get exec + BEQ STARSAVE10 ; No more, do it + LDX #OSFILECB+2-$200 + JSR SCANHEX ; Get load + BEQ STARSAVE10 ; No more, do it +ERRBADADD2 JMP ERRBADADD ; Too many parameters -STARSAVE10 LDA #$80 ; Will become $00 - SAVE -STARLDSVGO LDX OSLPTR+0 - LDY OSLPTR+1 ; Continue through... +STARSAVE10 LDA #$80 ; Will become $00 - SAVE +STARLDSVGO LDX OSLPTR+0 + LDY OSLPTR+1 ; Continue through... * * Commands passed to OSFILE *************************** -STARFILE EOR #$80 - STX OSFILECB+0 - STY OSFILECB+1 - LDX #OSFILECB - JSR OSFILE - TAX - BNE STARDONE - JMP ERRNOTFND +STARFILE EOR #$80 + STX OSFILECB+0 + STY OSFILECB+1 + LDX #OSFILECB + JSR OSFILE + TAX + BNE STARDONE + JMP ERRNOTFND STARBASIC STARKEY -STARDONE RTS +STARDONE RTS * *ECHO @@ -497,20 +497,20 @@ ECHO * CLC * JSR ECHO0 * PLY - SEC -ECHO0 JSR GSINIT + SEC +ECHO0 JSR GSINIT * PHP * PLA * JSR OUTHEX -ECHOLP1 JSR GSREAD - BCS STARDONE +ECHOLP1 JSR GSREAD + BCS STARDONE * BCS ECHO3 * CMP #$20 * BCC ECHO2 * CMP #$7F * BCS ECHO2 - JSR OSWRCH - JMP ECHOLP1 + JSR OSWRCH + JMP ECHOLP1 *ECHO2 PHA * LDA #'<' * JSR OSWRCH @@ -524,3 +524,5 @@ ECHOLP1 JSR GSREAD * PLA * JSR OUTHEX * JMP OSNEWL + + diff --git a/auxmem.vdu.s b/auxmem.vdu.s index 4e4a75d..4892114 100644 --- a/auxmem.vdu.s +++ b/auxmem.vdu.s @@ -619,3 +619,5 @@ BYTEA0 LDY #79 ; Read VDU variable $09,$0A LDX #23 RTS * TEST + + diff --git a/mainmem.fsequ.s b/mainmem.fsequ.s index 5c39514..55a3497 100644 --- a/mainmem.fsequ.s +++ b/mainmem.fsequ.s @@ -58,3 +58,5 @@ GEOFCMD EQU $D1 + + diff --git a/mainmem.init.s b/mainmem.init.s index 904179f..bf6d5e3 100644 --- a/mainmem.init.s +++ b/mainmem.init.s @@ -104,3 +104,5 @@ RESET TSX + + diff --git a/mainmem.ldr.s b/mainmem.ldr.s index 3c38247..0e3f519 100644 --- a/mainmem.ldr.s +++ b/mainmem.ldr.s @@ -130,6 +130,8 @@ CANTOPEN ASC "Unable to open ROM file" + + diff --git a/mainmem.lists.s b/mainmem.lists.s index aa4dfca..44c115c 100644 --- a/mainmem.lists.s +++ b/mainmem.lists.s @@ -108,3 +108,5 @@ QUITPL HEX 04 ; Number of parameters + + diff --git a/mainmem.menu.s b/mainmem.menu.s index c004fac..e6b83cc 100644 --- a/mainmem.menu.s +++ b/mainmem.menu.s @@ -136,6 +136,8 @@ ROM8 STR "USERROM2.ROM" + + diff --git a/mainmem.misc.s b/mainmem.misc.s index 22f0ea2..0bcf478 100644 --- a/mainmem.misc.s +++ b/mainmem.misc.s @@ -157,3 +157,5 @@ FILEREFS DB $00,$00,$00,$00 + + diff --git a/mainmem.path.s b/mainmem.path.s index 37fe761..820219a 100644 --- a/mainmem.path.s +++ b/mainmem.path.s @@ -284,3 +284,5 @@ PREFIX DS 65 ; Buffer for ProDOS prefix + + diff --git a/mainmem.svc.s b/mainmem.svc.s index f117101..bbd092e 100644 --- a/mainmem.svc.s +++ b/mainmem.svc.s @@ -701,6 +701,7 @@ CATARG DB $00 * Handle *INFO INFO JSR PREPATH ; Preprocess pathname + SEC JSR WILDCARD ; Handle any wildcards JSR EXISTS ; Check matches something CMP #$00 @@ -708,10 +709,6 @@ INFO JSR PREPATH ; Preprocess pathname LDA #$46 ; Not found (TO DO: err code?) BRA CATEXIT -** BUG: If the last segment is a literal with no wildcard, then -** the directory block is never loaded into memory, so printing -** it does not go well ;) - INFOREENTRY JSR WILDNEXT2 ; Start of new block BCS INFOEXIT ; No more matches @@ -729,7 +726,7 @@ INFOEXIT CMP #$4C ; EOF LDA #$00 ; EOF is not an error INFOCLS JSR CLSDIR ; Be sure to close it! BRA CATEXIT - + * Set prefix. Used by *CHDIR to change directory SETPFX >>> ENTMAIN @@ -778,6 +775,7 @@ DRVINFO >>> ENTMAIN SETPERM >>> ENTMAIN JSR PREPATH ; Preprocess pathname BCS :SYNERR + CLC JSR WILDCARD ; Handle any wildcards BCS :NONE STZ :LFLAG @@ -844,6 +842,7 @@ SETPERM >>> ENTMAIN MULTIDEL >>> ENTMAIN JSR PREPATH ; Preprocess pathname BCS :SYNERR + CLC JSR WILDCARD ; Handle any wildcards BCS :NONE BRA :MAINLOOP @@ -881,3 +880,5 @@ MAINRDMEM STA A1L LDA (A1L) MAINRDEXIT >>> XF2AUX,NULLRTS ; Back to an RTS + + diff --git a/mainmem.wild.s b/mainmem.wild.s index 6c388fd..893adb5 100644 --- a/mainmem.wild.s +++ b/mainmem.wild.s @@ -5,7 +5,8 @@ * Performs wildcard matching for operations that only require the * first match. <*obj-spec*> in Acorn ADFS terminology. -WILDONE JSR WILDCARD +WILDONE CLC + JSR WILDCARD JSR CLSDIR RTS @@ -13,8 +14,13 @@ WILDONE JSR WILDCARD * by '/'), and for each segment see if it contains wildcard chars. * If so, pass it to SRCHBLK to expand the wildcard. If not, just * append the segment as it is. Uses MFTEMP to build up the path. +* On entry: SEC to force leaf noden lookup even if no wildcard, +* CLC otherwise * Returns with carry set if wildcard match fails, clear otherwise -WILDCARD STZ :LAST +WILDCARD STZ :ALWAYS ; Set :ALWAYS if carry set + BCC :NORMAL + DEC :ALWAYS +:NORMAL STZ :LAST LDX #$00 ; Start with first char STX MFTEMP ; Clear MFTEMP (len=0) PHX @@ -32,7 +38,11 @@ WILDCARD STZ :LAST BEQ :L1 ; ... go again :S1 JSR HASWILD ; See if it has '*'/'#'/'?' BCS :WILD ; It does - JSR APPSEG ; Not wild: Append SEGBUF to MFTEMP + LDA :ALWAYS ; Always do leaf-node lookup? + BEQ :S2 + LDA :LAST ; If it is the last segment do .. + BNE :WILD ; .. wildcard lookup anyhow (for *INFO) +:S2 JSR APPSEG ; Not wild: Append SEGBUF to MFTEMP BRA :NEXT :WILD LDX #MFTEMP ; in the directory path MFTEMP @@ -52,6 +62,7 @@ WILDCARD STZ :LAST SEC RTS :LAST DB $00 ; Flag for last segment +:ALWAYS DB $00 ; Flag to always lookup leafnode * Obtain subsequent wildcard matches * WILDCARD must have been called first @@ -369,3 +380,5 @@ MATCHBUF DS 65 ; For storing match results (Pascal str) + +