From 67f230d07acdd68cce9efb5b52b4782d5c6b6231 Mon Sep 17 00:00:00 2001 From: Bobbi Webber-Manners Date: Sun, 22 Aug 2021 19:04:30 -0400 Subject: [PATCH] Replaced OSCLI dispatcher with JGH's table driven version --- applecorn.po | Bin 819200 -> 819200 bytes auxmem.oscli.s | 968 ++++++++++++++++++++++++++----------------------- mainmem.s | 2 +- 3 files changed, 521 insertions(+), 449 deletions(-) diff --git a/applecorn.po b/applecorn.po index f908b6430205e9dac3cdd998bd7b61914c2ffc8b..0ae64ccf2840a76d3ef58b98711eef7ba3e0a366 100644 GIT binary patch delta 17243 zcmeHOeQaCTb=Q+E+ewNfwH<$Cc5>Y&U52$;;%rHaZNZAxK^!kB)}ZOfA44$=$REqF z0$VW*81UQ;=!Ojhwy7{UpG%WI6-gEA`=bU>!?m0YoaPPr`d&5t!*S7b6YW?r`YFqlh zzy4`@J1gJH^6kMs9(-QDeNDdUeNQ~Mt>;s}(6j9qwJlHelzZ^urOmxPzx4U9eC_pp zuRr^RS3m#d{a�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 delta 10371 zcmeHLd2kcg8Q+z>w!y?U29w00u$B+vut*m%t?VJs1jl?8kc9A5ecTrQb z+6am$$&mLksxZp|`}fl2J)J)FPB$@)C|@G&<7VfA*)sixbdBnVxu)0C+bDgm>TZ%` z-^x>OX1Nt=+LWuhi~Lh|Q#P45k1bk3{(#MYjGC+Ud+0WgneOWi1?fn*Hxvs->E00C zd5#|F2@m#Nq`wa0y;JmiQ9ZIb9qsNmPHgW)@O2JxK7S|orPz4DzHRTa}uazt`b%+1rq0f^)cSI1;exwsQ~+N>C0g#zd?D#Dr2j zz8l!#4Z3%L?hg0&2Sc%VP!4;i!*AU66j^kiv_w*Bdp|dy?r=b~KED-w8ROLBO6uP} z*|T@wr?va*`1%6}g@(VINL7T?ipB#F#3`Q_RJ~9daAWgvX5TQ;>Xj^;Wyf;3vS$!V zIJa5H@U0|{?Zk+*ao1L_BrO#qVcn>(4jGM34HQPGW7{_+G8@ah37gk)P`WmU_jdD2 z;@H*?jaZk2lY&2#2;S+jw%u+$LDfpfHMaf3BlczSBnO8R4t&-#_S+pKQOCC51opMk z!CSquc#?yrgadDf`*!- ztiCV29@mHqSw&GgSwQl$?})+B#IfbCPz70BtLWs+9d2KTsDJb56b9oRU=Co2FBZkX z1}IwR@nIn44@$^s<>W2<)-T9OTFk%^Ior;0d-oX(aRAw8ID}0EqgQ&ngY+S~BNPpG zhcAbEzYSibZT%OqSSMCE0b&q1J@&d3N|%6$kuXk!sw8M^Af24FOga}Zfy^M5 z92`JXQgpCagy;49^f|ZkwGuvaR-cXAk5P6%;@Vm{Tz)g4n@opAGTA888x&N4ADIXX z1sS7;Ovft)15Z0b-3cG@`_v$yMHq^jXklMTEyPmOwD4ME!6CE`R>veUb<(Qd_pd(-_|Z4 zoOJEuo|mp)m&50hSPnNPB`#l4QefBrfttjg&mhM?qcE^{KMj#dc9W=kMo}eW3HxSA zl(RW)h=bEc<~W1%*@41Ne2vP_8i*l)2rn)SyXZBln9Zyt7qX{br>5oA(|!+rGZF&> z19Uh<$HMw&Bl+z2wo>!hIr(HdyLKz}Ae-|9IjaPlz}3Co@Y&A5 zC}A7TLtCku40dS-IWt>o3*3x0r`OiXy0%e8Y53A_{$eBfwrVOcTJ3g#FB~?ir`rRe zi+w@59(M{`o=CDKC zsJqzZ+o}243F~r)VfzbJb|>rJMok}UoB<>-sSzF;gUy+1(;^8CrH_>tJXUTG-DOjqt|DPc9NlOxK}7hlR-&8-b^u}xH)UK$Z~b@C;_xNOMY1G51H0Al6KxQNJrJV@@CzxtG{>$6gCVRiztuN_`Ev0uAeE*dl|`>XBLt8D2@ z4G)sbs5r$`<8oXi**sCbjIXF( z4$l?*W7YS;^L}2};HJBX2vtyUN_VyTfyMMhTgXl899Ve;Lr2PZ3bbZcFW16i1^?r? z8ZC?RFQKTKFG2(AM?OU{HSa(XHLpS6sLhCKsUb*|*3$4U{_G)Y`qg{rnviyN!(h|-y39~7btrs_$K zXj~RahXS?huKd2LzMiv+BH)F`>*ng~30qG%JP_mpTx+Y1)4F=QqhTDTnW!tY7G5a4 zRXAOZ1!RAI!Hz z)a~LRXdprj@?cEJwV+aqFwuf$Sls27Dl_!9P}w3p*&;mMB0SrIM^T&9>Y^g0s;ygv zcU$0t#C?Ntt)_%Qh8 zH=#TRMh9djF)%#54NYeFbd=BV1eyY0?7aqck(MXug(Wq2lynhdI!|y9>ZW#)(rT41 zuS+GZR_ijm)Z$Fwu0z?(Uvd~QJptRj1N&~zVhlM#F4F)uh9Vgsm6zyLJP}XeUYvkm zkpPjXjIc?ZPH$ig3*hNl z!x&}?k28z=*D0Zp?Rrr90uTQ#dMm(|GCYD$Q zH`oAEHTqX5SU7nr>8@wY`@L$;|nfglAAk_z{F-So{3JFt4 km_ou75~h$ag@h?2Od(+k2~$XzLc$ah{@)^@K3BE-Ke8Ww#sB~S diff --git a/auxmem.oscli.s b/auxmem.oscli.s index 99a6cb0..cd88585 100644 --- a/auxmem.oscli.s +++ b/auxmem.oscli.s @@ -1,491 +1,563 @@ * AUXMEM.OSCLI.S +**************** * (c) BOBBI 2021 GPLv3 * * Handle OSCLI system calls +* 22-Aug-2021 Uses dispatch table +* Prepares parameters and hands on to API call + + +* COMMAND TABLE +*************** +* +* fsc commands +CMDTABLE ASC 'CAT' ; Must be first command to match '*.' + 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 +* other filing commands + ASC 'CHDIR' + DB $80 + DW STARCHDIR-1 ; Should be a FSC call + ASC 'DIR' + DB $80 + DW STARCHDIR-1 ; Should be a FSC call + ASC 'DRIVE' + DB $80 + DW STARDRIVE-1 ; Should be a FSC call +* 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 +* others + ASC 'QUIT' + DB $80 + DW STARQUIT-1 ; QUIT -> (LPTR)=>params + ASC 'HELP' + DB $80 + DW STARHELP-1 ; HELP -> (LPTR)=>params + ASC 'BASIC' + DB $80 + DW STARBASIC-1 ; BASIC -> (LPTR)=>params + ASC 'KEY' + DB $80 + DW STARKEY-1 ; KEY -> (LPTR)=>params +* terminator + DB $00 + + * OSCLI HANDLER * On entry, XY=>command string -* TO DO: line pointer in XY should be in LPTR +* On exit, AXY corrupted or error generated * -CLIHND PHX - PHY - STX ZP1+0 ; Pointer to CLI - STY ZP1+1 -:L1 LDA (ZP1) - CMP #'*' ; Trim any leading stars - BEQ :NEXT - CMP #' ' ; Trim any leading spaces - BEQ :NEXT - BRA :TRIMMED -:NEXT INC ZP1 - BNE :L1 - INC ZP1+1 - BRA :L1 -:TRIMMED CMP #'|' ; | is comment - BEQ :IEXIT2 - CMP #$0D ; Carriage return - BEQ :IEXIT - LDA #<:QUIT - STA ZP2 - LDA #>:QUIT - STA ZP2+1 - JSR STRCMP - BCS :S1 - JSR STARQUIT -:IEXIT2 BRA :IEXIT -:S1 LDA #<:CAT - STA ZP2 - LDA #>:CAT - STA ZP2+1 - JSR STRCMP - BCS :S2 - JSR STARCAT - BRA :IEXIT -:S2 LDA #<:CAT2 - STA ZP2 - LDA #>:CAT2 - STA ZP2+1 - JSR STRCMP - BCS :S3 - JSR STARCAT - BRA :IEXIT -:S3 LDA #<:DIR - STA ZP2 - LDA #>:DIR - STA ZP2+1 - JSR STRCMP - BCS :S4 - JSR STARDIR - BRA :IEXIT -:S4 LDA #<:LOAD - STA ZP2 - LDA #>:LOAD - STA ZP2+1 - JSR STRCMP - BCS :S5 - JSR STARLOAD - BRA :IEXIT -:S5 LDA #<:SAVE - STA ZP2 - LDA #>:SAVE - STA ZP2+1 - JSR STRCMP - BCS :S6 - JSR STARSAVE - BRA :IEXIT -:S6 LDA #<:RUN - STA ZP2 - LDA #>:RUN - STA ZP2+1 - JSR STRCMP - BCS :S7 - JSR STARRUN - BRA :EXIT -:IEXIT BRA :EXIT -:S7 LDA #<:DELETE - STA ZP2 - LDA #>:DELETE - STA ZP2+1 - JSR STRCMP - BCS :S8 - JSR STARDEL - BRA :EXIT -:S8 LDA #<:RENAME - STA ZP2 - LDA #>:RENAME - STA ZP2+1 - JSR STRCMP - BCS :S9 - JSR STARREN - BRA :EXIT -:S9 LDA #<:HELP - STA ZP2 - LDA #>:HELP - STA ZP2+1 - JSR STRCMP - BCS :ASKROM - JSR STARHELP - BRA :EXIT -:ASKROM LDA $8006 ; Check for service entry - BPL :UNSUPP ; No service entry - LDA ZP1 ; String in (OSLPTR),Y - STA OSLPTR - LDA ZP1+1 - STA OSLPTR+1 - LDY #$00 - LDA #$04 ; Service 4 Unrecognized Cmd - LDX #$0F ; ROM slot - JSR $8003 ; Service entry point - TAX ; Check return - BEQ :EXIT ; Call claimed +CLIHND STX OSLPTR+0 + STY OSLPTR+1 ; LPTR=>command line + LDY #0 +CLILP1 LDA (OSLPTR),Y + CMP #$0D + BEQ CLI2 + INY + BNE CLILP1 +CLIEXIT1 RTS ; No terminating +CLI2 LDY #0 +CLILP2 LDA (OSLPTR),Y + INY + CMP #' ' ; Skip leading spaces + BEQ CLILP2 + CMP #'*' ; Skip leading stars + BEQ CLILP2 + CMP #$0D + BEQ CLIEXIT1 ; Null string + CMP #'|' + BEQ CLIEXIT1 ; Comment + CMP #'/' + BEQ CLISLASH + DEY + JSR LPTRtoXY ; Add Y to LPTR + STX OSLPTR+0 + STY OSLPTR+1 ; LPTR=>start of actual command +; +* Search command table + LDX #0 ; Start of command table +CLILP4 LDY #0 ; Start of command line +CLILP5 LDA CMDTABLE,X + BEQ CLIUNKNOWN ; End of command table + BMI CLIMATCH ; End of table string + EOR (OSLPTR),Y + AND #$DF ; Force upper case match + BNE CLINOMATCH + INX ; Step to next table char + INY ; Step to next command char + BNE CLILP5 ; Loop to check -:UNSUPP LDA #<:OSCLIM - LDY #>:OSCLIM - JSR PRSTR - PLY - PLX - STX ZP3 - STY ZP3+1 - LDY #$00 -:PL1 LDA (ZP3),Y - CMP #$0D - BEQ :PS1 - CMP #$00 - BEQ :PS1 - JSR OSWRCH - INY - BRA :PL1 -:PS1 LDA #<:OSCLIM2 - LDY #>:OSCLIM2 - JSR PRSTR - RTS -:EXIT PLY - PLX - RTS -:QUIT ASC 'QUIT' - DB $00 -:CAT ASC 'CAT' - DB $00 -:CAT2 ASC '.' - DB $00 -:DIR ASC 'DIR' - DB $00 -:LOAD ASC 'LOAD' - DB $00 -:SAVE ASC 'SAVE' - DB $00 -:RUN ASC 'RUN' - DB $00 -:DELETE ASC 'DELETE' - DB $00 -:RENAME ASC 'RENAME' - DB $00 -:HELP ASC 'HELP' - DB $00 -:OSCLIM ASC 'OSCLI(' - DB $00 -:OSCLIM2 ASC ').' - DB $00 +CLINOMATCH LDA (OSLPTR),Y + CMP #'.' ; Abbreviation? + BEQ CLIDOT +CLINEXT INX ; No match, step to next entry + LDA CMDTABLE,X + BPL CLINEXT +CLINEXT2 INX ; Step past byte, address + INX + INX + BNE CLILP4 ; Loop to check next -* String comparison for OSCLI -* Compares str in ZP1 with null-terminated str in ZP2 -* Clear carry if match, set carry otherwise -* Leaves (ZP1),Y pointing to char after verb -STRCMP LDY #$00 -:L1 LDA (ZP2),Y - BEQ :PMATCH - CMP (ZP1),Y - BNE :MISMTCH - INY - BRA :L1 -:PMATCH LDA (ZP1),Y - CMP #$0D - BEQ :MATCH - CMP #' ' - BEQ :MATCH - CMP #'"' - BEQ :MATCH - BRA :MISMTCH -:MATCH CLC - RTS -:MISMTCH SEC - RTS +CLIDOT LDA CMDTABLE,X + BMI CLINEXT2 ; Dot after full word, no match +CLIDOT2 INX ; Step to command address + LDA CMDTABLE,X + BPL CLIDOT2 + INY ; Step past dot + BNE CLIMATCH2 ; Jump to this command -* Print *HELP test -STARHELP LDA #<:MSG - LDY #>:MSG - JSR PRSTR - LDA #$09 ; Language name - LDY #$80 - JSR PRSTR - LDA #<:MSG2 - LDY #>:MSG2 - JSR PRSTR -* TODO: Pass on to filing system - RTS -:MSG DB $0D - ASC 'Applecorn MOS v0.01' - DB $0D,$0D,$00 -:MSG2 DB $0D,$00 +CLIMATCH LDA (OSLPTR),Y + CMP #'.' + BEQ CLINEXT ; Longer abbreviation, eg 'CAT.' + CMP #'A' + BCS CLINEXT ; More letters, eg 'HELPER' +CLIMATCH2 JSR SKIPSPC ; (OSLPTR),Y=>parameters + LDA CMDTABLE+2,X ; Push destination address + PHA + LDA CMDTABLE+1,X + PHA + LDA CMDTABLE+0,X ; A=command parameter + PHA + ASL A ; Drop bit 7 + BEQ CLICALL ; If $80 don't convert LPTR + JSR LPTRtoXY ; XY=>parameters +CLICALL PLA ; A=command parameter +CLIDONE RTS + +CLISLASH JSR SKIPSPC + BEQ CLIDONE ; */ + LDA #$02 + BNE STARFSC2 ; FSC 2 = */filename + +CLIUNKNOWN LDA #$04 + JSR SERVICE ; Offer to sideways ROM(s) + BEQ CLIDONE ; Claimed + JSR LPTRtoXY ; XY=>command + LDA #$03 ; FSC 3 = unknown command +STARFSC AND #$7F ; A=command, XY=>parameters +STARFSC2 JSR CALLFSCV ; Hand on to filing system +* TO DO: hostfs.s needs to return A=0 + TAX + BEQ CLIDONE + RTS ; *TEMP* +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 +; +* Commands passed to OSBYTE +*************************** +STARBYTE STX OSLPTR+0 + STY OSLPTR+1 + LDY #$00 +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 + +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 + +SKIPCOMMA LDA (OSLPTR),Y + CMP #$2C + BNE SKIPSPC +; +* Skip spaces +SKIPSPCLP INY ; Step past space or comma +SKIPSPC LDA (OSLPTR),Y + CMP #' ' + BEQ SKIPSPCLP + CMP #$0D ; Return EQ= + RTS + +* Convert (LPTR),Y to XY +LPTRtoXY CLC + TYA + ADC OSLPTR+0 + TAX + LDA #0 + ADC OSLPTR+1 + TAY + RTS + +* Commands passed to OSFILE +*************************** +STARFILE AND #$7F + STX OSFILECB+0 + STY OSFILECB+1 + JMP OSFILE + +STARDRIVE +STARBASIC +STARKEY RTS + +STARCHDIR STX ZP1+0 ; TEMP + STY ZP1+1 ; TEMP + LDY #$00 ; TEMP + JMP STARDIR ; TEMP + +* Print *HELP text +STARHELP PHY + LDA #HLPMSG + JSR PRSTR + PLY + PHY + LDA (OSLPTR),Y + CMP #'.' + BNE STARHELP5 + LDX #0 +STARHELPLP1 LDY #10 + LDA CMDTABLE,X + BEQ STARHELP4 +STARHELPLP2 LDA CMDTABLE,X + BMI STARHELP3 + JSR OSWRCH + DEY + INX + BNE STARHELPLP2 +STARHELP3 LDA #32 + JSR OSWRCH + DEY + BNE STARHELP3 + INX + INX + INX + BNE STARHELPLP1 +STARHELP4 JSR OSNEWL +STARHELP5 JSR OSNEWL + LDA #$09 ; Language name + LDY #$80 + JSR PRSTR + LDA #HLPMSG2 + JSR PRSTR + PLY + LDA #9 + JMP SERVICE ; Pass to sideways ROM(s) +HLPMSG DB $0D + ASC 'Applecorn MOS v0.01' + DB $0D,$00 +HLPMSG2 DB $0D,$00 * Handle *QUIT command -STARQUIT >>> XF2MAIN,QUIT +STARQUIT >>> XF2MAIN,QUIT -* Handle *CAT / *. command (list directory) -STARCAT LDA #$05 - JMP JUMPFSCV ; Pass to filing system +;* Handle *CAT / *. command (list directory) +;STARCAT LDA #$05 +; JMP JUMPFSCV ; Hand on to filing system * Consume spaces in command line. Treat " as space! * Return C set if no space found, C clear otherwise * Command line pointer in (ZP1),Y -EATSPC LDA (ZP1),Y ; Check first char is ... - CMP #' ' ; ... space - BEQ :START - CMP #'"' ; Or quote mark - BEQ :START - BRA :NOTFND -:START INY -:L1 LDA (ZP1),Y ; Eat any additional ... - CMP #' ' ; ... spaces - BEQ :CONT - CMP #'"' ; Or quote marks - BNE :DONE -:CONT INY - BRA :L1 -:DONE CLC - RTS -:NOTFND SEC - RTS +EATSPC LDA (ZP1),Y ; Check first char is ... + CMP #' ' ; ... space + BEQ :START + CMP #'"' ; Or quote mark + BEQ :START + BRA :NOTFND +:START INY +:L1 LDA (ZP1),Y ; Eat any additional ... + CMP #' ' ; ... spaces + BEQ :CONT + CMP #'"' ; Or quote marks + BNE :DONE +:CONT INY + BRA :L1 +:DONE CLC + RTS +:NOTFND SEC + RTS * Consume chars in command line until space or " is found * Command line pointer in (ZP1),Y * Returns with carry set if EOL -EATWORD LDA (ZP1),Y - CMP #' ' - BEQ :SPC - CMP #'"' - BEQ :SPC - CMP #$0D ; Carriage return - BEQ :EOL - INY - BRA EATWORD -:SPC CLC - RTS -:EOL SEC - RTS +EATWORD LDA (ZP1),Y + CMP #' ' + BEQ :SPC + CMP #'"' + BEQ :SPC + CMP #$0D ; Carriage return + BEQ :EOL + INY + BRA EATWORD +:SPC CLC + RTS +:EOL SEC + RTS * Add Y to ZP1 pointer. Clear Y. -ADDZP1Y CLC - TYA - ADC ZP1 - STA ZP1 - LDA #$00 - ADC ZP1+1 - STA ZP1+1 - LDY #$00 - RTS +ADDZP1Y CLC + TYA + ADC ZP1 + STA ZP1 + LDA #$00 + ADC ZP1+1 + STA ZP1+1 + LDY #$00 + RTS * Decode ASCII hex digit in A * Returns with carry set if bad char, C clear otherwise -HEXDIGIT CMP #'F'+1 - BCS :BADCHAR ; char > 'F' - CMP #'A' - BCC :S1 - SEC ; 'A' <= char <= 'F' - SBC #'A'-10 - CLC - RTS -:S1 CMP #'9'+1 - BCS :BADCHAR ; '9' < char < 'A' - CMP #'0' - BCC :BADCHAR ; char < '0' - SEC ; '0' <= char <= '9' - SBC #'0' - CLC - RTS -:BADCHAR SEC - RTS +HEXDIGIT CMP #'F'+1 + BCS :BADCHAR ; char > 'F' + CMP #'A' + BCC :S1 + SEC ; 'A' <= char <= 'F' + SBC #'A'-10 + CLC + RTS +:S1 CMP #'9'+1 + BCS :BADCHAR ; '9' < char < 'A' + CMP #'0' + BCC :BADCHAR ; char < '0' + SEC ; '0' <= char <= '9' + SBC #'0' + CLC + RTS +:BADCHAR SEC + RTS * Decode hex constant on command line * On entry, ZP1 points to command line -HEXCONST LDX #$00 -:L1 STZ :BUF,X ; Clear :BUF - INX - CPX #$04 - BNE :L1 - LDX #$00 - LDY #$00 -:L2 LDA (ZP1),Y ; Parse hex digits into - JSR HEXDIGIT ; :BUF, left aligned - BCS :NOTHEX - STA :BUF,X - INY - INX - CPX #$04 - BNE :L2 - LDA (ZP1),Y ; Peek at next char -:NOTHEX CPX #$00 ; Was it the first digit? - BEQ :ERR ; If so, bad hex constant - CMP #' ' ; If whitespace, then okay - BEQ :OK - CMP #$0D - BEQ :OK -:ERR SEC - RTS -:OK LDA :BUF-4,X - ASL - ASL - ASL - ASL - ORA :BUF-3,X - STA ADDRBUF+1 - LDA :BUF-2,X - ASL - ASL - ASL - ASL - ORA :BUF-1,X - STA ADDRBUF - CLC - RTS -:ZEROPAD DB $00,$00,$00 -:BUF DB $00,$00,$00,$00 +HEXCONST LDX #$00 +:L1 STZ :BUF,X ; Clear :BUF + INX + CPX #$04 + BNE :L1 + LDX #$00 + LDY #$00 +:L2 LDA (ZP1),Y ; Parse hex digits into + JSR HEXDIGIT ; :BUF, left aligned + BCS :NOTHEX + STA :BUF,X + INY + INX + CPX #$04 + BNE :L2 + LDA (ZP1),Y ; Peek at next char +:NOTHEX CPX #$00 ; Was it the first digit? + BEQ :ERR ; If so, bad hex constant + CMP #' ' ; If whitespace, then okay + BEQ :OK + CMP #$0D + BEQ :OK +:ERR SEC + RTS +:OK LDA :BUF-4,X + ASL + ASL + ASL + ASL + ORA :BUF-3,X + STA ADDRBUF+1 + LDA :BUF-2,X + ASL + ASL + ASL + ASL + ORA :BUF-1,X + STA ADDRBUF + CLC + RTS +:ZEROPAD DB $00,$00,$00 +:BUF DB $00,$00,$00,$00 -ADDRBUF DW $0000 ; Used by HEXCONST +ADDRBUF DW $0000 ; Used by HEXCONST * Handle *LOAD command +STARLOAD +* TEMP + STX ZP1+0 ; need (ZP1),Y=>parameters + STY ZP1+1 + LDY #$00 +* TEMP * On entry, ZP1 points to command line -STARLOAD JSR CLRCB - JSR EATSPC ; Eat leading spaces - BCS :ERR - JSR ADDZP1Y ; Advance ZP1 - LDA ZP1 ; Pointer to filename - STA OSFILECB - LDA ZP1+1 - STA OSFILECB+1 - JSR EATWORD ; Advance past filename - BCS :NOADDR ; No load address given - LDA #$0D ; Carriage return - STA (ZP1),Y ; Terminate filename - INY - JSR EATSPC ; Eat any whitespace - JSR ADDZP1Y ; Update ZP1 - JSR HEXCONST - BCS :ERR ; Bad hex constant - LDA ADDRBUF - STA OSFILECB+2 ; Load address LSB - LDA ADDRBUF+1 - STA OSFILECB+3 ; Load address MSB -:OSFILE LDX #OSFILECB - LDA #$FF ; OSFILE load flag - JSR OSFILE -:END RTS -:NOADDR LDA #$FF ; Set OSFILECB+6 to non-zero - STA OSFILECB+6 ; Means use the file's addr - BRA :OSFILE -:ERR JSR BEEP - RTS + JSR CLRCB +* JSR EATSPC ; Eat leading spaces +* BCS :ERR + JSR ADDZP1Y ; Advance ZP1 + LDA ZP1 ; Pointer to filename + STA OSFILECB + LDA ZP1+1 + STA OSFILECB+1 + JSR EATWORD ; Advance past filename + BCS :NOADDR ; No load address given + LDA #$0D ; Carriage return + STA (ZP1),Y ; Terminate filename + INY + JSR EATSPC ; Eat any whitespace + JSR ADDZP1Y ; Update ZP1 + JSR HEXCONST + BCS :ERR ; Bad hex constant + LDA ADDRBUF + STA OSFILECB+2 ; Load address LSB + LDA ADDRBUF+1 + STA OSFILECB+3 ; Load address MSB +:OSFILE LDX #OSFILECB + LDA #$FF ; OSFILE load flag + JSR OSFILE +:END RTS +:NOADDR LDA #$FF ; Set OSFILECB+6 to non-zero + STA OSFILECB+6 ; Means use the file's addr + BRA :OSFILE +:ERR JMP ERRBADADD * Handle *SAVE command +STARSAVE +* TEMP + STX ZP1+0 ; need (ZP1),Y=>parameters + STY ZP1+1 + LDY #$00 +* TEMP * On entry, ZP1 points to command line -STARSAVE JSR CLRCB - JSR EATSPC ; Eat leading space - BCS :ERR - JSR ADDZP1Y ; Advance ZP1 - LDA ZP1 ; Pointer to filename - STA OSFILECB - LDA ZP1+1 - STA OSFILECB+1 - JSR EATWORD - BCS :ERR ; No start address given - LDA #$0D ; Carriage return - STA (ZP1),Y ; Terminate filename - INY - JSR EATSPC ; Eat any whitespace - JSR ADDZP1Y ; Update ZP1 - JSR HEXCONST - BCS :ERR ; Bad start address - LDA ADDRBUF - STA OSFILECB+10 - LDA ADDRBUF+1 - STA OSFILECB+11 - JSR EATSPC ; Eat any whitespace - JSR ADDZP1Y ; Update ZP1 - JSR HEXCONST - BCS :ERR ; Bad end address - LDA ADDRBUF - STA OSFILECB+14 - LDA ADDRBUF+1 - STA OSFILECB+15 - LDX #OSFILECB - LDA #$00 ; OSFILE save flag - JSR OSFILE -:END RTS -:ERR JSR BEEP - RTS + JSR CLRCB +* JSR EATSPC ; Eat leading space +* BCS :ERR + JSR ADDZP1Y ; Advance ZP1 + LDA ZP1 ; Pointer to filename + STA OSFILECB + LDA ZP1+1 + STA OSFILECB+1 + JSR EATWORD + BCS :ERR ; No start address given + LDA #$0D ; Carriage return + STA (ZP1),Y ; Terminate filename + INY + JSR EATSPC ; Eat any whitespace + JSR ADDZP1Y ; Update ZP1 + JSR HEXCONST + BCS :ERR ; Bad start address + LDA ADDRBUF + STA OSFILECB+10 + LDA ADDRBUF+1 + STA OSFILECB+11 + JSR EATSPC ; Eat any whitespace + JSR ADDZP1Y ; Update ZP1 + JSR HEXCONST + BCS :ERR ; Bad end address + LDA ADDRBUF + STA OSFILECB+14 + LDA ADDRBUF+1 + STA OSFILECB+15 + LDX #OSFILECB + LDA #$00 ; OSFILE save flag + JSR OSFILE +:END RTS +:ERR JMP ERRBADADD * Handle *RUN command * On entry, ZP1 points to command line -STARRUN LDA #$04 -JUMPFSCV PHA - JSR EATSPC ; Eat leading space - JSR ADDZP1Y ; Advance ZP1 - LDX ZP1+0 - LDY ZP1+1 - PLA -CALLFSCV JMP (FSCV) ; Hand on to filing system - -* Handle *DELETE command -* On entry, ZP1 points to command line -STARDEL JSR EATSPC ; Eat leading space - JSR ADDZP1Y ; Advance ZP1 - LDA ZP1 - STA OSFILECB+0 - LDA ZP1+1 - STA OSFILECB+1 - JSR EATWORD - LDA #$0D - STA (ZP1),Y ; Terminate filename - LDX #OSFILECB - LDA #$06 ; OSFILE delete command - JSR OSFILE - RTS -:ERR JSR BEEP - RTS - -* Handle *RENAME command -* On entry, ZP1 points to command line -STARREN JSR EATSPC ; Eat leading space - JSR ADDZP1Y ; Advance ZP1 - LDY #$00 -:L1 LDA (ZP1),Y ; Copy arg1 -> MOSFILE - CMP #' ' - BEQ :ENDARG1 - CMP #$0D ; Carriage return - BEQ :ERR - INY - >>> WRTMAIN - STA MOSFILE,Y - >>> WRTAUX - BRA :L1 -:ENDARG1 >>> WRTMAIN - STY MOSFILE ; Length of arg1 - >>> WRTAUX - JSR EATSPC ; Eat space between args - JSR ADDZP1Y ; Advance ZP1 - LDY #$00 -:L2 LDA (ZP1),Y ; Copy arg2 -> MOSFILE - CMP #' ' - BEQ :ENDARG2 - CMP #$0D - BEQ :ENDARG2 - INY - >>> WRTMAIN - STA MOSFILE2,Y - >>> WRTAUX - BRA :L2 -:ENDARG2 >>> WRTMAIN - STY MOSFILE2 ; Length of arg2 - >>> WRTAUX - >>> XF2MAIN,RENFILE -:ERR -* TODO: Handle errors - JSR BEEP - RTS - -STARRENRET - >>> ENTAUX - RTS +STARRUN LDA #$04 +JUMPFSCV PHA + JSR EATSPC ; Eat leading spaces + JSR ADDZP1Y + LDX ZP1+0 + LDY ZP1+1 + PLA + AND #$7F ; A=command, XY=>parameters +CALLFSCV JMP (FSCV) ; Hand on to filing system * Clear OSFILE control block to zeros -CLRCB LDA #$00 - LDX #$00 -:L1 STA OSFILECB,X - INX - CPX #18 - BNE :L1 - RTS +CLRCB LDA #$00 + LDX #$00 +:L1 STA OSFILECB,X + INX + CPX #18 + BNE :L1 + RTS diff --git a/mainmem.s b/mainmem.s index 7aead42..ba2e1f7 100644 --- a/mainmem.s +++ b/mainmem.s @@ -157,7 +157,7 @@ DESTROY LDA #>> ENTMAIN JSR RENAME - >>> XF2AUX,STARRENRET +** >>> XF2AUX,STARRENRET **** TODO FIX THIS!!! RENAME LDA #