mirror of
https://github.com/bobbimanners/Applecorn.git
synced 2024-06-15 19:29:32 +00:00
Merge branch 'main' into system
Pick up DUMP/TYPE/SPOOL update
This commit is contained in:
commit
d806d5d43f
580
auxmem.misc.s
580
auxmem.misc.s
|
@ -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**'
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
368
auxmem.oscli.s
368
auxmem.oscli.s
|
@ -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
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue
Block a user