Updated DUMP, TYPE, SPOOL

Updated TYPE, DUMP, SPOOL, with EXEC all share code.
Tweek to ROMSELECT to speed up slightly.
This commit is contained in:
jgharston 2022-10-08 15:45:44 +01:00 committed by GitHub
parent 835e2327de
commit 94a198059f
2 changed files with 351 additions and 597 deletions

View File

@ -9,6 +9,7 @@
* 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
@ -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
RDROM LDA ROMID
PHA ; Save current ROM
TYA
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,105 +336,32 @@ 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
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
* 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
*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
LDA USERSEL ; *TO DO* Should be actual number of ROMs
STA $C003 ; Read aux mem
CMP #6
@ -444,105 +372,6 @@ ROMINIT STZ MAXROM ; One sideways ROM only
STA MAXROM
: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.
@ -557,41 +386,27 @@ 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
: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
SEC
INX
LDA $0100,X
LDA $0104,X
SBC #$01
STA FAULT+0 ; FAULT=>error block after BRK
INX
LDA $0100,X
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
JSR SERVICE
@ -601,6 +416,7 @@ IRQBRKHDLR PHA
PLA
TAX
PLA
CLI
JMP (BRKV) ; Pass on to BRK handler
:IRQ >>> XF2MAIN,A2IRQ ; Bounce to Apple IRQ handler
@ -731,7 +547,3 @@ AUXBLK ASC '**ENDOFCODE**'

View File

@ -10,11 +10,15 @@
* 12-Sep-2021 *HELP uses subject lookup, *HELP MOS, *HELP HOSTFS.
* 25-Oct-2021 Implemented *BASIC.
* 07-Oct-2022 *CLOSE is a host command, fixed *EXEC.
* 08-Oct-2022 Rewrote *TYPE, *DUMP, *SPOOL, shares code with *EXEC.
* COMMAND TABLE
***************
* 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
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 <file>
* 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 #<HLPTABLE ; XY=>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 <afsp>
**************
* 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
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 <lf>
TAX ; Remember last character
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
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 <afsp>'
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 <afsp>'
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
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
:DONE RTS
:NOTFOUND BRK
DB $D6
ASC 'Not found'
BRK
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