From 94a198059f18e8f5d43fb8dcc5cbfdea7bffb10a Mon Sep 17 00:00:00 2001 From: jgharston Date: Sat, 8 Oct 2022 15:45:44 +0100 Subject: [PATCH] Updated DUMP, TYPE, SPOOL Updated TYPE, DUMP, SPOOL, with EXEC all share code. Tweek to ROMSELECT to speed up slightly. --- auxmem.misc.s | 580 +++++++++++++++++-------------------------------- auxmem.oscli.s | 368 +++++++++++++------------------ 2 files changed, 351 insertions(+), 597 deletions(-) diff --git a/auxmem.misc.s b/auxmem.misc.s index 01c3529..4be2df3 100644 --- a/auxmem.misc.s +++ b/auxmem.misc.s @@ -9,34 +9,35 @@ * 26-Oct-2021 Corrected entry parameters to OSRDRM. * 03-Nov-2021 Temp'y fix, if can't find SROM, ignores it. * 13-Nov-2021 ROMSELECT calls mainmem to load ROM. +* 08-Oct-2022 ROMSEL doesn't call loder if already paged in. * OSBYTE $80 - ADVAL ************************************ * Read input device or buffer status -BYTE80 LDY #$00 ; Prepare return=&00xx - TXA ; X<0 - info about buffers - BMI ADVALBUF ; X>=0 - read input devices +BYTE80 LDY #$00 ; Prepare return=&00xx + TXA ; X<0 - info about buffers + BMI ADVALBUF ; X>=0 - read input devices CPX #$7F BNE ADVALNONE ADVALWAIT JSR KBDREAD BCS ADVALWAIT TAX - BPL ADVALOK1 ; &00xx for normal keys - INY ; &01xx for function/edit keys + BPL ADVALOK1 ; &00xx for normal keys + INY ; &01xx for function/edit keys ADVALOK1 RTS -ADVALNONE LDX #$00 ; Input, just return 0 +ADVALNONE LDX #$00 ; Input, just return 0 RTS ADVALBUF INX - BEQ :ADVALKBD ; Fake keyboard buffer + BEQ :ADVALKBD ; Fake keyboard buffer INX - BEQ :ADVALOK ; Serial input, return 0 - LDX #$01 ; For outputs, return 1 char free + BEQ :ADVALOK ; Serial input, return 0 + LDX #$01 ; For outputs, return 1 char free RTS -:ADVALKBD BIT $C000 ; Test keyboard data/strobe - BPL :ADVALOK ; No Strobe, return 0 - INX ; Strobe, return 1 +:ADVALKBD BIT $C000 ; Test keyboard data/strobe + BPL :ADVALOK ; No Strobe, return 0 + INX ; Strobe, return 1 :ADVALOK RTS @@ -61,21 +62,21 @@ ADVALBUF INX * (8 * frequency ) * BEEPX EQU #57 ; note=C5 -BEEPX EQU #116 ; note=C4 +BEEPX EQU #116 ; note=C4 BEEP PHA PHX PHY - LDY #$00 ; duration -:L1 LDX #BEEPX ; 2cy pitch 2cy + LDY #$00 ; duration +:L1 LDX #BEEPX ; 2cy pitch 2cy *------------------------------------------------------ -:L2 DEX ; 2cy BEEPX * 2cy - BNE :L2 ; 3cy/2cy (BEEPX-1) * 3cy + 1 * 2cy +:L2 DEX ; 2cy BEEPX * 2cy + BNE :L2 ; 3cy/2cy (BEEPX-1) * 3cy + 1 * 2cy *------------------------------------------------------ * BEEPX*5-1cy - LDA $C030 ; 4cy BEEPX*5+5 - DEY ; 2cy BEEPX*5+7 - BNE :L1 ; 3cy/2cy BEEPX*5+10 - PLY ; + LDA $C030 ; 4cy BEEPX*5+5 + DEY ; 2cy BEEPX*5+7 + BNE :L1 ; 3cy/2cy BEEPX*5+10 + PLY ; PLX PLA RTS @@ -85,9 +86,9 @@ BEEP PHA OUTSTR TXA * 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 -:L1 LDA (OSTEXT) ; Ptr to string in OSTEXT +:L1 LDA (OSTEXT) ; Ptr to string in OSTEXT BEQ PRSTROK JSR OSASCI INC OSTEXT @@ -106,7 +107,7 @@ FORCENL LDA #$86 * Print XY in hex OUT2HEX TYA JSR OUTHEX - TXA ; Continue into OUTHEX + TXA ; Continue into OUTHEX * Print hex byte in A OUTHEX PHA @@ -117,16 +118,16 @@ OUTHEX PHA AND #$0F JSR PRNIB PLA - AND #$0F ; Continue into PRNIB + AND #$0F ; Continue into PRNIB * Print hex nibble in A PRNIB CMP #$0A BCC :S1 - CLC ; >= $0A + CLC ; >= $0A ADC #'A'-$0A JSR OSWRCH RTS -:S1 ADC #'0' ; < $0A +:S1 ADC #'0' ; < $0A JMP OSWRCH * TEMP ENTRY * @@ -148,35 +149,35 @@ OSPAD EQU OSTEXT+4 * X=>four byte zero page locations * Y= number of digits to pad to, 0 for no padding * -PRINTDEC sty OSPAD ; Number of padding+digits - ldy #0 ; Digit counter -PRDECDIGIT lda #32 ; 32-bit divide +PRINTDEC sty OSPAD ; Number of padding+digits + ldy #0 ; Digit counter +PRDECDIGIT lda #32 ; 32-bit divide sta OSTEMP - lda #0 ; Remainder=0 - clv ; V=0 means div result = 0 -PRDECDIV10 cmp #10/2 ; Calculate OSNUM/10 + lda #0 ; Remainder=0 + clv ; V=0 means div result = 0 +PRDECDIV10 cmp #10/2 ; Calculate OSNUM/10 bcc PRDEC10 - sbc #10/2+$80 ; Remove digit & set V=1 to show div result > 0 - sec ; Shift 1 into div result -PRDEC10 rol 0,x ; Shift /10 result into OSNUM + sbc #10/2+$80 ; Remove digit & set V=1 to show div result > 0 + sec ; Shift 1 into div result +PRDEC10 rol 0,x ; Shift /10 result into OSNUM rol 1,x rol 2,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 - bne PRDECDIV10 ; Continue 32-bit divide + bne PRDECDIV10 ; Continue 32-bit divide ora #48 - pha ; Push low digit 0-9 to print + pha ; Push low digit 0-9 to print 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 PRDECLP1 cpy OSPAD - bcs PRDECLP2 ; Enough padding pushed - pha ; Push leading space characters + bcs PRDECLP2 ; Enough padding pushed + pha ; Push leading space characters iny bne PRDECLP1 -PRDECLP2 pla ; Pop character left to right - jsr OSWRCH ; Print it +PRDECLP2 pla ; Pop character left to right + jsr OSWRCH ; Print it dey bne PRDECLP2 rts @@ -197,16 +198,16 @@ PRDECLP2 pla ; Pop character left to right * Very difficult to write this without it being a direct clone * from the BBC MOS. ;) * -GSINTGO ROR GSFLAG ; CY initially into bit 7 - JSR SKIPSPC ; Skip any spaces - INY ; Step past in case it's a quote - CMP #$22 ; Is it a quote? +GSINTGO ROR GSFLAG ; CY initially into bit 7 + JSR SKIPSPC ; Skip any spaces + INY ; Step past in case it's a quote + CMP #$22 ; Is it a quote? BEQ GSINTGO1 - DEY ; Wasn't a quote, step back - CLC ; Prepare CC=no leading quote -GSINTGO1 ROR GSFLAG ; Rotate 'leading-quote' into flags + DEY ; Wasn't a quote, step back + CLC ; Prepare CC=no leading quote +GSINTGO1 ROR GSFLAG ; Rotate 'leading-quote' into flags CMP #$0D - RTS ; Return EQ if end of line + RTS ; Return EQ if end of line * GSFLAG set to: * bit7: leading quote found * bit6: CC=filename CS=*KEY @@ -249,13 +250,13 @@ GSINTGO1 ROR GSFLAG ; Rotate 'leading-quote' into flags * INX:BNE loop * done * -GSRDGO LDA #$00 ; Prepare to clear accumulator -GSREADLP STA GSCHAR ; Update accumulator - LDA (OSLPTR),Y ; Get current character - CMP #$0D ; End of line? - BNE GSREAD2 ; No, check character +GSRDGO LDA #$00 ; Prepare to clear accumulator +GSREADLP STA GSCHAR ; Update accumulator + LDA (OSLPTR),Y ; Get current character + CMP #$0D ; End of line? + BNE GSREAD2 ; No, check character 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 ERRBADSTR BRK DB $FD @@ -263,54 +264,54 @@ ERRBADSTR BRK BRK GSREAD2 CMP #' ' - BCC ERRBADSTR ; Embedded control char - BNE GSREAD3 ; Not a space, process it - BIT GSFLAG ; Can space terminate string? - BMI GSREADCHAR ; We're waiting for a terminating quote + BCC ERRBADSTR ; Embedded control char + BNE GSREAD3 ; Not a space, process it + BIT GSFLAG ; Can space terminate string? + BMI GSREADCHAR ; We're waiting for a terminating quote * ; so return the space character - BVC GSREADEND ; Space is a terminator, finish -GSREAD3 CMP #$22 ; Is it a quote? - BNE GSREADESC ; Not quote, check for escapes - BIT GSFLAG ; Was there an opening quote? - BPL GSREADCHAR ; Not waiting for a closing quote - INY ; Waiting for quote, check next character + BVC GSREADEND ; Space is a terminator, finish +GSREAD3 CMP #$22 ; Is it a quote? + BNE GSREADESC ; Not quote, check for escapes + BIT GSFLAG ; Was there an opening quote? + BPL GSREADCHAR ; Not waiting for a closing quote + INY ; Waiting for quote, check next character LDA (OSLPTR),Y - CMP #$22 ; Is it another quote? - BEQ GSREADCHAR ; Quote-Quote, expand to single quote + CMP #$22 ; Is it another quote? + BEQ GSREADCHAR ; Quote-Quote, expand to single quote * End of string * Either closing quote, or a space seperator, or end of line -GSREADEND JSR SKIPSPC ; Skip any spaces to next word - SEC ; SEC=end of string - RTS ; and (OSLPTR),Y=>next word or end of line +GSREADEND JSR SKIPSPC ; Skip any spaces to next word + SEC ; SEC=end of string + RTS ; and (OSLPTR),Y=>next word or end of line * CS=end of string * EQ=end of line * NE=not end of line, more words follow -GSREADESC CMP #$7C ; Is it '|' escape character - BNE GSREADCHAR ; No, return as character - INY ; Step to next character +GSREADESC CMP #$7C ; Is it '|' escape character + BNE GSREADCHAR ; No, return as character + INY ; Step to next character LDA (OSLPTR),Y CMP #$7C - BEQ GSREADCHAR ; bar-bar expands to bar + BEQ GSREADCHAR ; bar-bar expands to bar CMP #$22 - BEQ GSREADCHAR ; bar-quote expands to quote - CMP #'!' ; Is it bar-pling? - BNE GSREAD5 ; No, check for bar-letter - INY ; Step past it - LDA #$80 ; Set bit 7 in accumulator - BNE GSREADLP ; Loop back to check next character(s) + BEQ GSREADCHAR ; bar-quote expands to quote + CMP #'!' ; Is it bar-pling? + BNE GSREAD5 ; No, check for bar-letter + INY ; Step past it + LDA #$80 ; Set bit 7 in accumulator + BNE GSREADLP ; Loop back to check next character(s) -GSREAD5 CMP #'?' ; Check for '?' - BCC ERRBADSTR ; <'?', bad character - BEQ GSREADDEL ; bar-query -> DEL - AND #$1F ; Convert bar-letter to control code - BIT SETV ; SEV=control character +GSREAD5 CMP #'?' ; Check for '?' + BCC ERRBADSTR ; <'?', bad character + BEQ GSREADDEL ; bar-query -> DEL + AND #$1F ; Convert bar-letter to control code + BIT SETV ; SEV=control character BVS GSREADOK GSREADDEL LDA #$7F -GSREADCHAR CLV ; CLV=not control character -GSREADOK INY ; Step to next character - ORA GSCHAR ; Add in any bit 7 from |! prefix - CLC ; CLC=not end of string +GSREADCHAR CLV ; CLV=not control character +GSREADOK INY ; Step to next character + ORA GSCHAR ; Add in any bit 7 from |! prefix + CLC ; CLC=not end of string RTS * CC=not end of string * VS=control character @@ -320,13 +321,13 @@ GSREADOK INY ; Step to next character * Read a byte from sideways ROM * On entry, Y=ROM to read from * On exit, A=byte read, X=current ROM, Y=$00 -RDROM LDA $F4 - PHA ; Save current ROM +RDROM LDA ROMID + PHA ; Save current ROM TYA - TAX ; X=ROM to read from - JSR ROMSELECT ; Page in the required ROM + TAX ; X=ROM to read from + JSR ROMSELECT ; Page in the required ROM LDY #$00 - LDA ($F6),Y ; Read the byte + LDA (ROMPTR),Y ; Read the byte PLX * Select a sideways ROM @@ -335,106 +336,33 @@ RDROM LDA $F4 ROMSELECT * Insert code here for faking sideways ROMs by loading or otherwise * 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 PHX PHY - TXA ; A=ROM to select + SEI + TXA ; A=ROM to select >>> XF2MAIN,SELECTROM ROMSELDONE >>> ENTAUX PLY PLX PLA - PLP -:ROMSELOK STX $F4 ; Set Current ROM number + STX ROMID ; Set Current ROM number +ROMSELOK PLP 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 -* 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 -* 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 -*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 -ROMINIT STZ MAXROM ; One sideways ROM only - STA $C002 ; Read main mem - LDA USERSEL - STA $C003 ; Read aux mem +ROMINIT STZ MAXROM ; One sideways ROM only + STA $C002 ; Read main mem + LDA USERSEL ; *TO DO* Should be actual number of ROMs + STA $C003 ; Read aux mem CMP #6 BNE :X1 @@ -444,112 +372,13 @@ ROMINIT STZ MAXROM ; One sideways ROM only STA MAXROM :X2 RTS -* ASL ; x2 -* CLC -* ADC #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+3 -* INC MAXROM ; Two ROMs -* BRA :DONE -*:S1 CMP #7 ; Menu entry 8 -* BNE :DONE -* LDA #PASCROM1 -* STA ROMTAB+1 -* LDA #PASCROM2 -* STA ROMTAB+3 -* LDA #LISPROM -* STA ROMTAB+5 -* LDA #FORTHROM -* STA ROMTAB+7 -* LDA #PROLOGROM -* STA ROMTAB+9 -* LDA #BCPLROM -* STA ROMTAB+11 -* LDA #COMALROM -* STA ROMTAB+13 -* 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 -* JMP PRSTR -*OSEVENM ASC 'OSEVEN.' -* DB $00 - ********************************************************** * Interrupt Handlers, MOS redirection vectors etc. ********************************************************** * 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 * TO DO: Check, IENTAUX modifies X @@ -557,56 +386,43 @@ GSBRKAUX >>> IENTAUX ; IENTAUX does not do CLI IRQBRKHDLR PHA * Mustn't enable IRQs within the IRQ handler * Do not use WRTMAIN/WRTAUX macros - BIT $C014 ; Set N if aux write active - STA $C004 ; Write to main memory - STA $45 ; $45=A for ProDOS IRQ handlers - 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 + STA $C004 ; Write to main memory + STA $45 ; $45=A for ProDOS IRQ handlers + STA $C005 ; Write to aux memory -:S2 TXA + TXA PHA CLD TSX - PHX - INX - INX - INX - LDA $100,X ; Get PSW from stack + LDA $103,X ; Get PSW from stack AND #$10 - BEQ :IRQ ; IRQ + BEQ :IRQ ; IRQ SEC - INX - LDA $0100,X + LDA $0104,X SBC #$01 - STA FAULT+0 ; FAULT=>error block after BRK - INX - LDA $0100,X + STA FAULT+0 ; FAULT=>error block after BRK + LDA $0105,X SBC #$00 STA FAULT+1 - LDA $F4 ; Get current ROM - STA BYTEVARBASE+$BA ; Set ROM at last BRK - PLX - STX OSXREG ; Pass stack pointer - LDA #$06 ; Service Call 6 = BRK occured + LDA $F4 ; Get current ROM + STA BYTEVARBASE+$BA ; Set ROM at last BRK + STX OSXREG ; Pass stack pointer + LDA #$06 ; Service Call 6 = BRK occured JSR SERVICE - LDX BYTEVARBASE+$FC ; Get current language - JSR ROMSELECT ; Bring it into memory + LDX BYTEVARBASE+$FC ; Get current language + JSR ROMSELECT ; Bring it into memory PLA TAX 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 - >>> IENTAUX ; IENTAUX does not do CLI - PLA ; TODO: Pass on to IRQ1V + >>> IENTAUX ; IENTAUX does not do CLI + PLA ; TODO: Pass on to IRQ1V TAX PLA NULLRTI RTI @@ -626,7 +442,7 @@ MOSBRKHDLR LDA #parameters +* if b6=0 XY=>parameters * fsc commands CMDTABLE ASC 'CAT' ; Must be first command so matches '*.' DB $85 @@ -79,19 +83,19 @@ CMDTABLE ASC 'CAT' ; Must be first command so matches '*.' * filing utilities ASC 'TYPE' DB $80 - DW TYPE-1 ; TYPE -> (LPTR)=>params + DW CMDTYPE-1 ; TYPE -> (LPTR)=>params ASC 'DUMP' DB $80 - DW DUMP-1 ; DUMP -> (LPTR)=>params + DW CMDDUMP-1 ; DUMP -> (LPTR)=>params ASC 'SPOOL' DB $80 - DW SPOOL-1 ; SPOOL -> (LPTR)=>params + DW CMDSPOOL-1 ; SPOOL -> (LPTR)=>params ASC 'EXEC' DB $80 - DW EXEC-1 ; EXEC -> (LPTR)=>params + DW CMDEXEC-1 ; EXEC -> (LPTR)=>params ASC 'CLOSE' DB $80 - DW STARCLOSE-1 ; CLOSE -> (LPTR)=>params + DW CMDCLOSE-1 ; CLOSE -> (LPTR)=>params * BUILD * terminator DB $FF @@ -166,8 +170,8 @@ CLIMATCH3 JSR SKIPSPC ; (OSLPTR),Y=>parameters PHA ; Push address low TXA ; Command byte PHA - ASL A ; Drop bit 7 - BEQ CLICALL ; If $80 don't convert LPTR + ASL A ; Move bit 6 into bit 7 + BEQ CLICALL ; If $80-&BF don't convert LPTR JSR LPTRtoXY ; XY=>parameters CLICALL PLA ; A=command parameter RTS ; Call command routine @@ -371,7 +375,7 @@ LPTRtoXY CLC XYtoLPTR STX OSLPTR+0 STY OSLPTR+1 LDY #0 - RTS +STARHELP9 RTS * Print *HELP text STARHELP JSR XYtoLPTR ; (OSLPTR),Y=>parameters @@ -379,8 +383,9 @@ STARHELP JSR XYtoLPTR ; (OSLPTR),Y=>parameters LDX #command table LDY #>HLPTABLE JSR CLILOOKUP ; Look for *HELP subject + BEQ STARHELP9 ; Matched LDA $8006 ; Does ROM have service entry? - BMI STARHELP6 ; Yes, send service call + BMI STARHELP6 ; Yes, skip to send service call JSR OSNEWL LDA #$09 ; Language name LDY #$80 ; *TO DO* make this and BYTE8E @@ -533,236 +538,179 @@ ECHOLP1 JSR GSREAD JMP ECHOLP1 * FILING UTILITIES -****************** +* ================ * *CLOSE ******** -STARCLOSE LDA #$00 +CMDCLOSE LDA #$00 TAY JSR OSFIND ; Close all files - STA FXEXEC ; Clear Spool/Exec handles + STA FXEXEC ; Ensure Spool/Exec handles cleared STA FXSPOOL RTS -* Handle *TYPE command +* *TYPE +************** * LPTR=>parameters string * -TYPE JSR LPTRtoXY - PHX - PHY - JSR XYtoLPTR - JSR PARSLPTR ; Just for error handling - BEQ :SYNTAX ; No filename - PLY - PLX - LDA #$40 ; Open for input - JSR OSFIND ; Try to open file - CMP #$00 ; Was file opened? - BEQ :NOTFOUND - TAY ; File handle in Y -:L1 JSR BGETHND ; Read a byte - BCS :CLOSE ; EOF - CMP #$0A ; Don't print LF - BEQ :S1 - 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 +CMDTYPE + LDA (OSLPTR),Y ; TEMP + CMP #$0D ; TEMP + BEQ ERRTYPE ; No filename + JSR LPTRtoXY ; TEMP +* + JSR OPENINFILE ; Try to open file +:LOOP JSR OSBGET ; Read a byte + BCS TYPDMPEND ; EOF + CMP #$0A + BEQ :LOOP ; Ignore + TAX ; Remember last character + JSR OSASCI ; Print the character + BIT ESCFLAG + BPL :LOOP ; No Escape, keep going +TYPEESC JSR TYPCLOSE +ERRESCAPE BRK DB $11 ASC 'Escape' BRK - +TYPDMPEND CPX #$0D + BEQ TYPCLOSE + JSR OSNEWL +TYPCLOSE LDA #$00 + JMP OSFIND ; Close file +ERRTYPE BRK + DB $DC + ASC 'Syntax: TYPE ' + BRK * Handle *DUMP command * LPTR=>parameters string * -DUMP JSR LPTRtoXY - PHX - PHY - JSR XYtoLPTR - JSR PARSLPTR ; Just for error handling - BEQ :SYNTAX ; No filename - PLY - PLX - LDA #$40 ; Open for input - JSR OSFIND ; Try to open file - CMP #$00 ; Was file opened? - BEQ :NOTFOUND - TAY ; File handle in Y - STZ DUMPOFF - STZ DUMPOFF+1 -:L1 JSR BGETHND ; Read a byte - BCS :CLOSE ; EOF - PHA - LDA DUMPOFF+0 - AND #$07 - BNE :INC - LDA DUMPOFF+1 ; Print file offset - JSR PRHEXBYTE - LDA DUMPOFF+0 - JSR PRHEXBYTE - LDA #' ' - JSR OSASCI - LDX #$07 - LDA #' ' ; Clear ASCII buffer -:L2 STA DUMPASCI,X - DEX - BNE :L2 -:INC INC DUMPOFF+0 ; Increment file offset - BNE :S1 - INC DUMPOFF+1 -:S1 PLA - STA DUMPASCI,X - JSR PRHEXBYTE +CMDDUMP + LDA (OSLPTR),Y ; TEMP + CMP #$0D ; TEMP + BEQ :ERRDUMP ; No filename + JSR LPTRtoXY ; TEMP +* + JSR OPENINFILE ; Try to open file + STZ OSNUM+0 ; Offset = zero + STZ OSNUM+1 +:LOOP1 BIT ESCFLAG + BMI TYPEESC ; Escape pressed + PHY ; Save handle + LDX OSNUM+0 ; Print file offset + LDY OSNUM+1 + JSR PR2HEX + JSR PRSPACE + PLY ; Get handle back + LDA #8 ; 8 bytes to dump + STA OSNUM+2 + TSX ; Reserve bytes on stack + TXA + SEC + SBC OSNUM+2 + TAX + TXS ; X=>space on stack +:LOOP2 JSR OSBGET ; Read a byte + BCS :DUMPEOF + STA $0101,X ; Store on stack + JSR PRHEX ; Print as hex + JSR PRSPACE INX - LDA #' ' - JSR OSASCI - CPX #$08 ; If EOL .. - BNE :S2 - JSR PRCHARS ; Print ASCII representation -:S2 LDA ESCFLAG - BMI :ESC - BRA :L1 -:CLOSE JSR PRCHARS ; Print ASCII representation + DEC OSNUM+2 + BNE :LOOP2 ; Loop to do 8 bytes + CLC ; CLC=Not EOF + BCC :DUMPCHRS ; Jump to display characters +:DUMPEOF LDA #$2A ; EOF met, pad with '**' + JSR OSWRCH + JSR OSWRCH + JSR PRSPACE LDA #$00 - JSR OSFIND ; Close file -: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 + STA $0101,X INX - BRA PRCHARS -:S0 LDX #$00 -:L2 LDA DUMPASCI,X - CMP #$20 - BMI :NOTPRINT + DEC OSNUM+2 + BNE :DUMPEOF ; Loop to do 8 bytes + SEC ; SEC=EOF +:DUMPCHRS LDX #8 ; 8 bytes to print +:LOOP4 PLA ; Get character + PHP ; Save EOF flag CMP #$7F - BPL :NOTPRINT - JSR OSASCI -:S1 INX - CPX #$08 - BNE :L2 + BEQ :DUMPDOT + CMP #$20 + BCS :DUMPCHR +:DUMPDOT LDA #$2E +: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 - LDX #$00 -:DONE RTS -:NOTPRINT LDA #'.' - JSR OSASCI - BRA :S1 + PLP + BCC :LOOP1 + JMP TYPCLOSE ; Close and finish +:ERRDUMP BRK + DB $DC + ASC 'Syntax: DUMP ' + BRK + * Handle *SPOOL command * LPTR=>parameters string * -SPOOL JSR LPTRtoXY - PHX - PHY - JSR XYtoLPTR - JSR PARSLPTR ; Just for error handling - BEQ :CLOSE ; No filename - stop spooling - LDY FXSPOOL ; Already spooling? - BEQ :OPEN - LDA #$00 ; If so, close file - JSR OSFIND -:OPEN PLY - PLX - LDA #$80 ; Open for writing - JSR OSFIND ; Try to open file - STA FXSPOOL ; Store SPOOL file handle - RTS -:CLOSE PLY ; Clean up stack - PLX - LDY FXSPOOL - BEQ :DONE - LDA #$00 - JSR OSFIND ; Close file - STZ FXSPOOL +CMDSPOOL + LDA (OSLPTR),Y ; TEMP + CMP #$0D ; TEMP + PHP ; TEMP + JSR LPTRtoXY ; TEMP +* + PHY ; Save Y + LDY FXSPOOL ; Get SPOOL handle + BEQ :SPOOL1 ; Wasn't open, skip closing + LDA #$00 ; A=CLOSE + STA FXSPOOL ; Clear SPOOL handle + JSR OSFIND ; Close SPOOL file +:SPOOL1 PLY ; Get Y back, XY=>filename + PLP ; Get NE=filename, EQ=no filename + BEQ :DONE ; No filename, all done + LDA #$80 ; A=OPENOUT, for writing + JSR OUTPUTFILE ; Try to open file + STA FXSPOOL ; Store SPOOL handle :DONE RTS * Handle *EXEC command * LPTR=>parameters string * -EXEC PHY - LDY FXEXEC - BEQ :EXEC1 - LDA #$00 - STA FXEXEC - JSR OSFIND ; If Exec open, close it -:EXEC1 PLY - LDA (OSLPTR),Y - CMP #$0D - BEQ :DONE ; No filename, all done - JSR LPTRtoXY ; XY=>filename - LDA #$40 ; Open for input - JSR OSFIND ; Try to open file - TAY ; Was file opened? - BEQ :NOTFOUND - STA FXEXEC ; Store EXEC file handle -:DONE RTS -:NOTFOUND BRK - DB $D6 - ASC 'Not found' - BRK +CMDEXEC + LDA (OSLPTR),Y ; TEMP + CMP #$0D ; TEMP + PHP ; TEMP + JSR LPTRtoXY ; TEMP +* + PHY ; Save Y + LDY FXEXEC ; Get EXEC handle + BEQ :EXEC1 ; Wasn't open, skip closing it + LDA #$00 ; A=CLOSE + STA FXEXEC ; Clear EXEC handle + JSR OSFIND ; Close EXEC file +:EXEC1 PLY ; Get Y back, XY=>filename + PLP ; Get NE=filename, EQ=no filename + BEQ EXECDONE ; No filename, all done + JSR OPENINFILE ; Try to open file + STA FXEXEC ; Store EXEC file handle +EXECDONE RTS + +OPENINFILE LDA #$40 ; Open for input +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 @@ -824,9 +772,3 @@ LOCKZIP LDA #$A5 STA $C05A RTS - - - - - -