mirror of
https://github.com/bobbimanners/Applecorn.git
synced 2024-06-12 16:29:29 +00:00
Updated disk image. Builds in Merlin-16 again.
This commit is contained in:
parent
d4cea3ba9c
commit
8e5ca206f5
BIN
applecorn.po
BIN
applecorn.po
Binary file not shown.
|
@ -229,6 +229,8 @@ MAINZP MAC
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
|
@ -495,6 +495,8 @@ OSBM2 ASC ').'
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
|
@ -467,6 +467,8 @@ BYTE76 LDX #$00 ; Update LEDs and return X=SHIFT
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
|
@ -327,3 +327,5 @@ RELCOORD CLC
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
393
auxmem.hostfs.s
393
auxmem.hostfs.s
|
@ -34,23 +34,23 @@ FSCMDLINE EQU $CE
|
||||||
FINDHND PHX
|
FINDHND PHX
|
||||||
PHY
|
PHY
|
||||||
PHA
|
PHA
|
||||||
CMP #$00 ; A=$00 = close
|
CMP #$00 ; A=$00 = close
|
||||||
BEQ :CLOSE
|
BEQ :CLOSE
|
||||||
PHA
|
PHA
|
||||||
JSR PARSNAME ; Copy filename->MOSFILE
|
JSR PARSNAME ; Copy filename->MOSFILE
|
||||||
PLA ; Recover options
|
PLA ; Recover options
|
||||||
>>> XF2MAIN,OFILE
|
>>> XF2MAIN,OFILE
|
||||||
:CLOSE
|
:CLOSE
|
||||||
* >>> WRTMAIN
|
* >>> WRTMAIN
|
||||||
* STY MOSFILE ; Write file number
|
* STY MOSFILE ; Write file number
|
||||||
* >>> WRTAUX
|
* >>> WRTAUX
|
||||||
>>> XF2MAIN,CFILE ; Pass A,Y to main code
|
>>> XF2MAIN,CFILE ; Pass A,Y to main code
|
||||||
|
|
||||||
OSFINDRET >>> ENTAUX
|
OSFINDRET >>> ENTAUX
|
||||||
JSR CHKERROR ; Check if error returned
|
JSR CHKERROR ; Check if error returned
|
||||||
PLY ; Value of A on entry
|
PLY ; Value of A on entry
|
||||||
BNE :S1 ; It wasn't close
|
BNE :S1 ; It wasn't close
|
||||||
TYA ; Preserve A for close
|
TYA ; Preserve A for close
|
||||||
:S1 PLY
|
:S1 PLY
|
||||||
PLX
|
PLX
|
||||||
RTS
|
RTS
|
||||||
|
@ -65,14 +65,14 @@ OSGBPBM ASC 'OSGBPB.'
|
||||||
* OSBPUT - write one byte to an open file
|
* OSBPUT - write one byte to an open file
|
||||||
BPUTHND PHX
|
BPUTHND PHX
|
||||||
PHY
|
PHY
|
||||||
PHA ; Stash char to write
|
PHA ; Stash char to write
|
||||||
* >>> WRTMAIN
|
* >>> WRTMAIN
|
||||||
* STY MOSFILE ; File reference number
|
* STY MOSFILE ; File reference number
|
||||||
* >>> WRTAUX
|
* >>> WRTAUX
|
||||||
>>> XF2MAIN,FILEPUT ; Pass A,Y to main code
|
>>> XF2MAIN,FILEPUT ; Pass A,Y to main code
|
||||||
OSBPUTRET >>> ENTAUX
|
OSBPUTRET >>> ENTAUX
|
||||||
JSR CHKERROR
|
JSR CHKERROR
|
||||||
CLC ; Means no error
|
CLC ; Means no error
|
||||||
PLA
|
PLA
|
||||||
PLY
|
PLY
|
||||||
PLX
|
PLX
|
||||||
|
@ -84,13 +84,13 @@ BGETHND PHX
|
||||||
* >>> WRTMAIN
|
* >>> WRTMAIN
|
||||||
* STY MOSFILE ; File ref number
|
* STY MOSFILE ; File ref number
|
||||||
* >>> WRTAUX
|
* >>> WRTAUX
|
||||||
>>> XF2MAIN,FILEGET ; Pass A,Y to main code
|
>>> XF2MAIN,FILEGET ; Pass A,Y to main code
|
||||||
OSBGETRET >>> ENTAUX
|
OSBGETRET >>> ENTAUX
|
||||||
CPY #$01
|
CPY #$01
|
||||||
BCC :EXIT ; If no error, return CC
|
BCC :EXIT ; If no error, return CC
|
||||||
LDA #$FE
|
LDA #$FE
|
||||||
CPY #$4C
|
CPY #$4C
|
||||||
BEQ :EXIT ; If at EOF, return CS
|
BEQ :EXIT ; If at EOF, return CS
|
||||||
TYA
|
TYA
|
||||||
JSR CHKERROR
|
JSR CHKERROR
|
||||||
:EXIT PLY
|
:EXIT PLY
|
||||||
|
@ -120,15 +120,15 @@ ARGSHND PHX
|
||||||
PHA
|
PHA
|
||||||
CPY #$00
|
CPY #$00
|
||||||
BNE :HASFILE
|
BNE :HASFILE
|
||||||
CMP #$00 ; Y=0,A=0 => current file sys
|
CMP #$00 ; Y=0,A=0 => current file sys
|
||||||
BNE :S1
|
BNE :S1
|
||||||
PLA
|
PLA
|
||||||
LDA #105 ; 105=AppleFS filing system
|
LDA #105 ; 105=AppleFS filing system
|
||||||
PLY
|
PLY
|
||||||
PLX
|
PLX
|
||||||
RTS
|
RTS
|
||||||
|
|
||||||
:S1 CMP #$01 ; Y=0,A=1 => addr of CLI
|
:S1 CMP #$01 ; Y=0,A=1 => addr of CLI
|
||||||
BNE :S2
|
BNE :S2
|
||||||
LDA FSCMDLINE+0
|
LDA FSCMDLINE+0
|
||||||
STA $00,X
|
STA $00,X
|
||||||
|
@ -137,33 +137,33 @@ ARGSHND PHX
|
||||||
LDA #$FF
|
LDA #$FF
|
||||||
STA $02,X
|
STA $02,X
|
||||||
STA $03,X
|
STA $03,X
|
||||||
JMP OSARGSDONE ; Implemented
|
JMP OSARGSDONE ; Implemented
|
||||||
|
|
||||||
:S2 CMP #$FF ; Y=0,A=FF => flush all files
|
:S2 CMP #$FF ; Y=0,A=FF => flush all files
|
||||||
BNE :IEXIT
|
BNE :IEXIT
|
||||||
* >>> WRTMAIN
|
* >>> WRTMAIN
|
||||||
* STZ MOSFILE ; Zero means flush all
|
* STZ MOSFILE ; Zero means flush all
|
||||||
* >>> WRTAUX
|
* >>> WRTAUX
|
||||||
JMP :FLUSH
|
JMP :FLUSH
|
||||||
:IEXIT JMP :EXIT ; Exit preserved
|
:IEXIT JMP :EXIT ; Exit preserved
|
||||||
|
|
||||||
:HASFILE
|
:HASFILE
|
||||||
* >>> WRTMAIN
|
* >>> WRTMAIN
|
||||||
* STY MOSFILE ; File ref num
|
* STY MOSFILE ; File ref num
|
||||||
* STX MOSFILE+1 ; Pointer to ZP control block
|
* STX MOSFILE+1 ; Pointer to ZP control block
|
||||||
* >>> WRTAUX
|
* >>> WRTAUX
|
||||||
CMP #$00 ; Y!=0,A=0 => read seq ptr
|
CMP #$00 ; Y!=0,A=0 => read seq ptr
|
||||||
BNE :S3
|
BNE :S3
|
||||||
* >>> WRTMAIN
|
* >>> WRTMAIN
|
||||||
* STZ MOSFILE+2 ; 0 means get pos
|
* STZ MOSFILE+2 ; 0 means get pos
|
||||||
* >>> WRTAUX
|
* >>> WRTAUX
|
||||||
TXA
|
TXA
|
||||||
>>> XF2MAIN,TELL ; A=ZP, Y=channel
|
>>> XF2MAIN,TELL ; A=ZP, Y=channel
|
||||||
|
|
||||||
:S3 CMP #$01 ; Y!=0,A=1 => write seq ptr
|
:S3 CMP #$01 ; Y!=0,A=1 => write seq ptr
|
||||||
BNE :S4
|
BNE :S4
|
||||||
>>> WRTMAIN
|
>>> WRTMAIN
|
||||||
STY GMARKPL+1 ; Write to MLI control block
|
STY GMARKPL+1 ; Write to MLI control block
|
||||||
LDA $00,X
|
LDA $00,X
|
||||||
STA GMARKPL+2
|
STA GMARKPL+2
|
||||||
LDA $01,X
|
LDA $01,X
|
||||||
|
@ -171,21 +171,21 @@ ARGSHND PHX
|
||||||
LDA $02,X
|
LDA $02,X
|
||||||
STA GMARKPL+4
|
STA GMARKPL+4
|
||||||
>>> WRTAUX
|
>>> WRTAUX
|
||||||
>>> XF2MAIN,SEEK ; A=???, Y=channel
|
>>> XF2MAIN,SEEK ; A=???, Y=channel
|
||||||
|
|
||||||
:S4 CMP #$02 ; Y!=0,A=2 => read file len
|
:S4 CMP #$02 ; Y!=0,A=2 => read file len
|
||||||
BNE :S5
|
BNE :S5
|
||||||
* >>> WRTMAIN
|
* >>> WRTMAIN
|
||||||
* STA MOSFILE+2 ; Non-zero means get len
|
* STA MOSFILE+2 ; Non-zero means get len
|
||||||
* >>> WRTAUX
|
* >>> WRTAUX
|
||||||
TXA
|
TXA
|
||||||
>>> XF2MAIN,SIZE ; A=ZP, Y=channel
|
>>> XF2MAIN,SIZE ; A=ZP, Y=channel
|
||||||
|
|
||||||
:S5 CMP #$FF ; Y!=0,A=FF => flush file
|
:S5 CMP #$FF ; Y!=0,A=FF => flush file
|
||||||
BNE :EXIT
|
BNE :EXIT
|
||||||
:FLUSH >>> XF2MAIN,FLUSH
|
:FLUSH >>> XF2MAIN,FLUSH
|
||||||
|
|
||||||
:EXIT PLA ; Unimplemented
|
:EXIT PLA ; Unimplemented
|
||||||
PLY
|
PLY
|
||||||
PLX
|
PLX
|
||||||
RTS
|
RTS
|
||||||
|
@ -193,7 +193,7 @@ ARGSHND PHX
|
||||||
OSARGSRET >>> ENTAUX
|
OSARGSRET >>> ENTAUX
|
||||||
JSR CHKERROR
|
JSR CHKERROR
|
||||||
OSARGSDONE PLA
|
OSARGSDONE PLA
|
||||||
LDA #0 ; Implemented
|
LDA #0 ; Implemented
|
||||||
PLY
|
PLY
|
||||||
PLX
|
PLX
|
||||||
RTS
|
RTS
|
||||||
|
@ -208,8 +208,8 @@ OSARGSDONE PLA
|
||||||
* A=2 directory found
|
* A=2 directory found
|
||||||
* XY preserved
|
* XY preserved
|
||||||
* control block updated
|
* control block updated
|
||||||
OSFILEMIN EQU $FF ; $FF=LOAD
|
OSFILEMIN EQU $FF ; $FF=LOAD
|
||||||
OSFILEMAX EQU $08 ; $08=MKDIR
|
OSFILEMAX EQU $08 ; $08=MKDIR
|
||||||
|
|
||||||
FILEHND PHX
|
FILEHND PHX
|
||||||
PHY
|
PHY
|
||||||
|
@ -219,23 +219,23 @@ FILEHND PHX
|
||||||
CMP #OSFILEMAX+257-OSFILEMIN ; NB: LTR evaluation
|
CMP #OSFILEMAX+257-OSFILEMIN ; NB: LTR evaluation
|
||||||
BCS FILEIGNORE
|
BCS FILEIGNORE
|
||||||
|
|
||||||
STX FSCTRL+0 ; FSCTRL=>control block
|
STX FSCTRL+0 ; FSCTRL=>control block
|
||||||
STY FSCTRL+1
|
STY FSCTRL+1
|
||||||
LDA (FSCTRL) ; XY=>filename
|
LDA (FSCTRL) ; XY=>filename
|
||||||
TAX
|
TAX
|
||||||
LDY #$01
|
LDY #$01
|
||||||
LDA (FSCTRL),Y
|
LDA (FSCTRL),Y
|
||||||
TAY
|
TAY
|
||||||
JSR PARSNAME ; Copy filename->MOSFILE
|
JSR PARSNAME ; Copy filename->MOSFILE
|
||||||
|
|
||||||
LDY #$11
|
LDY #$11
|
||||||
>>> WRTMAIN
|
>>> WRTMAIN
|
||||||
:L1 LDA (FSCTRL),Y ; Copy control block to auxmem
|
:L1 LDA (FSCTRL),Y ; Copy control block to auxmem
|
||||||
STA FILEBLK,Y
|
STA FILEBLK,Y
|
||||||
DEY
|
DEY
|
||||||
BPL :L1
|
BPL :L1
|
||||||
>>> WRTAUX
|
>>> WRTAUX
|
||||||
PLA ; Get action back
|
PLA ; Get action back
|
||||||
>>> XF2MAIN,CALLFILE
|
>>> XF2MAIN,CALLFILE
|
||||||
|
|
||||||
* BEQ :SAVE ; A=00 -> SAVE
|
* BEQ :SAVE ; A=00 -> SAVE
|
||||||
|
@ -260,18 +260,18 @@ FILEHND PHX
|
||||||
|
|
||||||
* On return here, A<$20 return to caller, A>$1F ProDOS error
|
* On return here, A<$20 return to caller, A>$1F ProDOS error
|
||||||
OSFILERET >>> ENTAUX
|
OSFILERET >>> ENTAUX
|
||||||
JSR CHKERROR ; Check if error returned
|
JSR CHKERROR ; Check if error returned
|
||||||
PHA
|
PHA
|
||||||
LDY #$11 ; Copy updated control block back
|
LDY #$11 ; Copy updated control block back
|
||||||
:L3
|
:L3
|
||||||
* LDA AUXBLK,Y ; Mainmem left it in AUXBLK
|
* LDA AUXBLK,Y ; Mainmem left it in AUXBLK
|
||||||
LDA OSFILECB,Y ; Mainmem left it in OSFILECB
|
LDA OSFILECB,Y ; Mainmem left it in OSFILECB
|
||||||
STA (FSCTRL),Y
|
STA (FSCTRL),Y
|
||||||
DEY
|
DEY
|
||||||
BPL :L3
|
BPL :L3
|
||||||
|
|
||||||
FILEIGNORE PLA ; Returned object type
|
FILEIGNORE PLA ; Returned object type
|
||||||
PLY ; No error, return to caller
|
PLY ; No error, return to caller
|
||||||
PLX
|
PLX
|
||||||
RTS
|
RTS
|
||||||
|
|
||||||
|
@ -286,34 +286,34 @@ OSFSCM ASC 'OSFSC.'
|
||||||
*
|
*
|
||||||
FSCCOMMAND ASC 'CHDIR'
|
FSCCOMMAND ASC 'CHDIR'
|
||||||
DB $C0
|
DB $C0
|
||||||
DW FSCCHDIR-1 ; Change directory, XY=>params
|
DW FSCCHDIR-1 ; Change directory, XY=>params
|
||||||
ASC 'CD'
|
ASC 'CD'
|
||||||
DB $C0
|
DB $C0
|
||||||
DW FSCCHDIR-1 ; Change directory, XY=>params
|
DW FSCCHDIR-1 ; Change directory, XY=>params
|
||||||
ASC 'DIR'
|
ASC 'DIR'
|
||||||
DB $C0
|
DB $C0
|
||||||
DW FSCCHDIR-1 ; Change directory, XY=>params
|
DW FSCCHDIR-1 ; Change directory, XY=>params
|
||||||
* TO DO, CHDIR should be $80 for LPTR=>params
|
* TO DO, CHDIR should be $80 for LPTR=>params
|
||||||
ASC 'DRIVE'
|
ASC 'DRIVE'
|
||||||
DB $80
|
DB $80
|
||||||
DW FSCDRIVE-1 ; Select drive, LPTR=>params
|
DW FSCDRIVE-1 ; Select drive, LPTR=>params
|
||||||
ASC 'FREE'
|
ASC 'FREE'
|
||||||
DB $80
|
DB $80
|
||||||
DW FSCFREE-1 ; FREE <drive>, LPTR=>params
|
DW FSCFREE-1 ; FREE <drive>, LPTR=>params
|
||||||
ASC 'ACCESS'
|
ASC 'ACCESS'
|
||||||
DB $80
|
DB $80
|
||||||
DW FSCACCESS-1 ; ACCESS <objlist> <access>, LPTR=>params
|
DW FSCACCESS-1 ; ACCESS <objlist> <access>, LPTR=>params
|
||||||
ASC 'TITLE'
|
ASC 'TITLE'
|
||||||
DB $80
|
DB $80
|
||||||
DW FSCTITLE-1 ; TITLE (<drive>) <title>, LPTR=>params
|
DW FSCTITLE-1 ; TITLE (<drive>) <title>, LPTR=>params
|
||||||
ASC 'DESTROY'
|
ASC 'DESTROY'
|
||||||
DB $80
|
DB $80
|
||||||
DW FSCDESTROY-1 ; DESTROY <objlist>, LPTR=>params
|
DW FSCDESTROY-1 ; DESTROY <objlist>, LPTR=>params
|
||||||
ASC 'COPY'
|
ASC 'COPY'
|
||||||
DB $C0
|
DB $C0
|
||||||
DW COPY-1 ; COPY <source> <dest>, XY=>params
|
DW COPY-1 ; COPY <source> <dest>, XY=>params
|
||||||
*
|
*
|
||||||
DB $FF ; Terminator
|
DB $FF ; Terminator
|
||||||
|
|
||||||
|
|
||||||
* OSFSC - miscellanous file system calls
|
* OSFSC - miscellanous file system calls
|
||||||
|
@ -326,26 +326,26 @@ FSCCOMMAND ASC 'CHDIR'
|
||||||
*
|
*
|
||||||
FSCHND
|
FSCHND
|
||||||
CMP #$00
|
CMP #$00
|
||||||
BEQ FSOPT ; A=0 - *OPT
|
BEQ FSOPT ; A=0 - *OPT
|
||||||
CMP #$01
|
CMP #$01
|
||||||
BEQ CHKEOF ; A=1 - Read EOF
|
BEQ CHKEOF ; A=1 - Read EOF
|
||||||
CMP #$02
|
CMP #$02
|
||||||
BEQ FSCRUN ; A=2 - */filename
|
BEQ FSCRUN ; A=2 - */filename
|
||||||
CMP #$03
|
CMP #$03
|
||||||
BEQ FSC03 ; A=3 - *command
|
BEQ FSC03 ; A=3 - *command
|
||||||
CMP #$04
|
CMP #$04
|
||||||
BEQ FSCRUN ; A=4 - *RUN
|
BEQ FSCRUN ; A=4 - *RUN
|
||||||
CMP #$05
|
CMP #$05
|
||||||
BEQ JMPCAT ; A=5 - *CAT
|
BEQ JMPCAT ; A=5 - *CAT
|
||||||
CMP #$09
|
CMP #$09
|
||||||
BEQ JMPCAT ; A=9 - *EX
|
BEQ JMPCAT ; A=9 - *EX
|
||||||
CMP #$0A
|
CMP #$0A
|
||||||
BEQ JMPCAT ; A=10 - *INFO
|
BEQ JMPCAT ; A=10 - *INFO
|
||||||
CMP #$0C
|
CMP #$0C
|
||||||
BEQ FSCREN ; A=12 - *RENAME
|
BEQ FSCREN ; A=12 - *RENAME
|
||||||
|
|
||||||
* Performs OSFSC *OPT function
|
* Performs OSFSC *OPT function
|
||||||
FSOPT RTS ; No FS options for now
|
FSOPT RTS ; No FS options for now
|
||||||
|
|
||||||
FSCDRIVE JMP DRIVE
|
FSCDRIVE JMP DRIVE
|
||||||
|
|
||||||
|
@ -373,29 +373,29 @@ FSC03 JSR XYtoLPTR
|
||||||
BEQ FSCNULL
|
BEQ FSCNULL
|
||||||
JSR LPTRtoXY
|
JSR LPTRtoXY
|
||||||
*
|
*
|
||||||
FSCRUN STX OSFILECB ; Pointer to filename
|
FSCRUN STX OSFILECB ; Pointer to filename
|
||||||
STY OSFILECB+1
|
STY OSFILECB+1
|
||||||
JSR XYtoLPTR
|
JSR XYtoLPTR
|
||||||
FSCRUNLP LDA (OSLPTR),Y ; Look for command line
|
FSCRUNLP LDA (OSLPTR),Y ; Look for command line
|
||||||
INY
|
INY
|
||||||
CMP #'!'
|
CMP #'!'
|
||||||
BCS FSCRUNLP
|
BCS FSCRUNLP
|
||||||
DEY
|
DEY
|
||||||
JSR SKIPSPC
|
JSR SKIPSPC
|
||||||
JSR LPTRtoXY
|
JSR LPTRtoXY
|
||||||
STX FSCMDLINE+0 ; Set CMDLINE=>command line
|
STX FSCMDLINE+0 ; Set CMDLINE=>command line
|
||||||
STY FSCMDLINE+1 ; Collected by OSARGS 1,0
|
STY FSCMDLINE+1 ; Collected by OSARGS 1,0
|
||||||
LDA #$FF ; OSFILE load flag
|
LDA #$FF ; OSFILE load flag
|
||||||
STA OSFILECB+6 ; Use file's address
|
STA OSFILECB+6 ; Use file's address
|
||||||
LDX #<OSFILECB ; Pointer to control block
|
LDX #<OSFILECB ; Pointer to control block
|
||||||
LDY #>OSFILECB
|
LDY #>OSFILECB
|
||||||
JSR OSFILE
|
JSR OSFILE
|
||||||
JSR :CALL
|
JSR :CALL
|
||||||
LDA #$00 ; A=0 on return
|
LDA #$00 ; A=0 on return
|
||||||
RTS
|
RTS
|
||||||
:CALL LDA #$01 ; A=1 - entering code
|
:CALL LDA #$01 ; A=1 - entering code
|
||||||
SEC ; Not from RESET
|
SEC ; Not from RESET
|
||||||
JMP (OSFILECB+6) ; Jump to EXEC addr
|
JMP (OSFILECB+6) ; Jump to EXEC addr
|
||||||
|
|
||||||
FSCREN JMP RENAME
|
FSCREN JMP RENAME
|
||||||
|
|
||||||
|
@ -407,11 +407,11 @@ CHKEOF
|
||||||
* >>> WRTMAIN
|
* >>> WRTMAIN
|
||||||
* STX MOSFILE ; File reference number
|
* STX MOSFILE ; File reference number
|
||||||
* >>> WRTAUX
|
* >>> WRTAUX
|
||||||
TXA ; A=channel
|
TXA ; A=channel
|
||||||
>>> XF2MAIN,FILEEOF
|
>>> XF2MAIN,FILEEOF
|
||||||
CHKEOFRET >>> ENTAUX
|
CHKEOFRET >>> ENTAUX
|
||||||
TAX ; Return code -> X
|
TAX ; Return code -> X
|
||||||
TYA ; Y=any ProDOS error
|
TYA ; Y=any ProDOS error
|
||||||
JMP CHKERROR
|
JMP CHKERROR
|
||||||
|
|
||||||
|
|
||||||
|
@ -419,28 +419,28 @@ CHKEOFRET >>> ENTAUX
|
||||||
* A=5 *CAT, A=9 *EX, A=10 *INFO
|
* A=5 *CAT, A=9 *EX, A=10 *INFO
|
||||||
FSCCAT EOR #$06
|
FSCCAT EOR #$06
|
||||||
CLC
|
CLC
|
||||||
ROR A ; 01100000=*CAT
|
ROR A ; 01100000=*CAT
|
||||||
ROR A ; 11100000=*EX
|
ROR A ; 11100000=*EX
|
||||||
ROR A ; 10000000=*INFO
|
ROR A ; 10000000=*INFO
|
||||||
ROR A ; b7=long info
|
ROR A ; b7=long info
|
||||||
STA FSAREG ; b6=multiple items
|
STA FSAREG ; b6=multiple items
|
||||||
JSR PARSNAME ; Copy filename->MOSFILE
|
JSR PARSNAME ; Copy filename->MOSFILE
|
||||||
LDA FSAREG ; Get ARG back
|
LDA FSAREG ; Get ARG back
|
||||||
>>> XF2MAIN,CATALOG
|
>>> XF2MAIN,CATALOG
|
||||||
STARCATRET >>> ENTAUX
|
STARCATRET >>> ENTAUX
|
||||||
JSR CHKERROR ; See if error occurred
|
JSR CHKERROR ; See if error occurred
|
||||||
JSR FORCENL
|
JSR FORCENL
|
||||||
* CATDONE
|
* CATDONE
|
||||||
LDA #0 ; 0=OK
|
LDA #0 ; 0=OK
|
||||||
RTS
|
RTS
|
||||||
|
|
||||||
* Print one block of a catalog. Called by CATALOG
|
* Print one block of a catalog. Called by CATALOG
|
||||||
* Block is in AUXBLK
|
* Block is in AUXBLK
|
||||||
PRONEBLK >>> ENTAUX
|
PRONEBLK >>> ENTAUX
|
||||||
LDA AUXBLK+4 ; Get storage type
|
LDA AUXBLK+4 ; Get storage type
|
||||||
AND #$E0 ; Mask 3 MSBs
|
AND #$E0 ; Mask 3 MSBs
|
||||||
CMP #$E0
|
CMP #$E0
|
||||||
BNE :NOTKEY ; Not a key block
|
BNE :NOTKEY ; Not a key block
|
||||||
LDA #<:DIRM
|
LDA #<:DIRM
|
||||||
LDY #>:DIRM
|
LDY #>:DIRM
|
||||||
JSR PRSTR
|
JSR PRSTR
|
||||||
|
@ -454,7 +454,7 @@ PRONEBLK >>> ENTAUX
|
||||||
JSR OSNEWL
|
JSR OSNEWL
|
||||||
:L1X PLA
|
:L1X PLA
|
||||||
INC
|
INC
|
||||||
CMP #13 ; Number of dirents in block
|
CMP #13 ; Number of dirents in block
|
||||||
CLC
|
CLC
|
||||||
BNE :L1
|
BNE :L1
|
||||||
>>> XF2MAIN,CATALOGRET
|
>>> XF2MAIN,CATALOGRET
|
||||||
|
@ -465,14 +465,14 @@ PRONEBLK >>> ENTAUX
|
||||||
* On entry: A = dirent index in AUXBLK
|
* On entry: A = dirent index in AUXBLK
|
||||||
PRONEENT PHP
|
PRONEENT PHP
|
||||||
TAX
|
TAX
|
||||||
LDA #<AUXBLK+4 ; Skip pointers
|
LDA #<AUXBLK+4 ; Skip pointers
|
||||||
STA ZP3
|
STA ZP3
|
||||||
LDA #>AUXBLK+4
|
LDA #>AUXBLK+4
|
||||||
STA ZP3+1
|
STA ZP3+1
|
||||||
:L1 CPX #$00
|
:L1 CPX #$00
|
||||||
BEQ :S1
|
BEQ :S1
|
||||||
CLC
|
CLC
|
||||||
LDA #$27 ; Size of dirent
|
LDA #$27 ; Size of dirent
|
||||||
ADC ZP3
|
ADC ZP3
|
||||||
STA ZP3
|
STA ZP3
|
||||||
LDA #$00
|
LDA #$00
|
||||||
|
@ -482,8 +482,8 @@ PRONEENT PHP
|
||||||
BRA :L1
|
BRA :L1
|
||||||
:S1 LDY #$00
|
:S1 LDY #$00
|
||||||
LDA (ZP3),Y
|
LDA (ZP3),Y
|
||||||
BEQ :EXIT1 ; Inactive entry
|
BEQ :EXIT1 ; Inactive entry
|
||||||
AND #$0F ; Len of filename
|
AND #$0F ; Len of filename
|
||||||
TAX
|
TAX
|
||||||
LDY #$01
|
LDY #$01
|
||||||
:L2 CPX #$00
|
:L2 CPX #$00
|
||||||
|
@ -566,11 +566,11 @@ PRSPACE LDA #' '
|
||||||
|
|
||||||
* Perform FSCV $0C RENAME function
|
* Perform FSCV $0C RENAME function
|
||||||
* Parameter string in XY
|
* Parameter string in XY
|
||||||
RENAME JSR PARSNAME ; Copy Arg1->MOSFILE
|
RENAME JSR PARSNAME ; Copy Arg1->MOSFILE
|
||||||
CMP #$00 ; Length of arg1
|
CMP #$00 ; Length of arg1
|
||||||
BEQ :SYNTAX
|
BEQ :SYNTAX
|
||||||
JSR PARSLPTR2 ; Copy Arg2->MOSFILE2
|
JSR PARSLPTR2 ; Copy Arg2->MOSFILE2
|
||||||
CMP #$00 ; Length of arg2
|
CMP #$00 ; Length of arg2
|
||||||
BEQ :SYNTAX
|
BEQ :SYNTAX
|
||||||
>>> XF2MAIN,RENFILE
|
>>> XF2MAIN,RENFILE
|
||||||
:SYNTAX BRK
|
:SYNTAX BRK
|
||||||
|
@ -585,11 +585,11 @@ RENRET
|
||||||
|
|
||||||
* Perform *COPY function
|
* Perform *COPY function
|
||||||
* Parameter string in XY
|
* Parameter string in XY
|
||||||
COPY JSR PARSNAME ; Copy Arg1->MOSFILE
|
COPY JSR PARSNAME ; Copy Arg1->MOSFILE
|
||||||
CMP #$00 ; Length of arg1
|
CMP #$00 ; Length of arg1
|
||||||
BEQ :SYNTAX
|
BEQ :SYNTAX
|
||||||
JSR PARSLPTR2 ; Copy Arg2->MOSFILE2
|
JSR PARSLPTR2 ; Copy Arg2->MOSFILE2
|
||||||
CMP #$00 ; Length of arg2
|
CMP #$00 ; Length of arg2
|
||||||
BEQ :SYNTAX
|
BEQ :SYNTAX
|
||||||
>>> XF2MAIN,COPYFILE
|
>>> XF2MAIN,COPYFILE
|
||||||
:SYNTAX BRK
|
:SYNTAX BRK
|
||||||
|
@ -604,8 +604,8 @@ COPYRET
|
||||||
|
|
||||||
* Handle *DIR (directory change) command
|
* Handle *DIR (directory change) command
|
||||||
* On entry, XY points to command line
|
* On entry, XY points to command line
|
||||||
CHDIR JSR PARSNAME ; Copy filename->MOSFILE
|
CHDIR JSR PARSNAME ; Copy filename->MOSFILE
|
||||||
CMP #$00 ; Filename length
|
CMP #$00 ; Filename length
|
||||||
BNE :HASPARM
|
BNE :HASPARM
|
||||||
BRK
|
BRK
|
||||||
DB $DC
|
DB $DC
|
||||||
|
@ -615,11 +615,11 @@ CHDIR JSR PARSNAME ; Copy filename->MOSFILE
|
||||||
|
|
||||||
* Handle *DRIVE command, which is similar
|
* Handle *DRIVE command, which is similar
|
||||||
* On entry, (OSLPTR),Y points to command line
|
* On entry, (OSLPTR),Y points to command line
|
||||||
DRIVE LDA (OSLPTR),Y ; First char
|
DRIVE LDA (OSLPTR),Y ; First char
|
||||||
CMP #$3A ; Colon
|
CMP #$3A ; Colon
|
||||||
BNE :ERR
|
BNE :ERR
|
||||||
JSR PARSLPTR ; Copy arg->MOSFILE
|
JSR PARSLPTR ; Copy arg->MOSFILE
|
||||||
CMP #$03 ; Check 3 char arg
|
CMP #$03 ; Check 3 char arg
|
||||||
BEQ :HASPARM
|
BEQ :HASPARM
|
||||||
:ERR BRK
|
:ERR BRK
|
||||||
DB $DC
|
DB $DC
|
||||||
|
@ -633,17 +633,17 @@ CHDIRRET
|
||||||
CMP #$00
|
CMP #$00
|
||||||
BEQ :EXIT
|
BEQ :EXIT
|
||||||
BRK
|
BRK
|
||||||
DB $CE ; Bad directory
|
DB $CE ; Bad directory
|
||||||
ASC 'Bad dir'
|
ASC 'Bad dir'
|
||||||
BRK
|
BRK
|
||||||
:EXIT RTS
|
:EXIT RTS
|
||||||
|
|
||||||
* Handle *FREE command
|
* Handle *FREE command
|
||||||
FREE LDA (OSLPTR),Y ; First char
|
FREE LDA (OSLPTR),Y ; First char
|
||||||
CMP #$3A ; Colon
|
CMP #$3A ; Colon
|
||||||
BNE :ERR
|
BNE :ERR
|
||||||
JSR PARSLPTR ; Copy arg->MOSFILE
|
JSR PARSLPTR ; Copy arg->MOSFILE
|
||||||
CMP #$03 ; Check 3 char arg
|
CMP #$03 ; Check 3 char arg
|
||||||
BEQ :HASPARM
|
BEQ :HASPARM
|
||||||
:ERR BRK
|
:ERR BRK
|
||||||
DB $DC
|
DB $DC
|
||||||
|
@ -657,29 +657,29 @@ FREERET
|
||||||
CMP #$00
|
CMP #$00
|
||||||
BEQ :NOERR
|
BEQ :NOERR
|
||||||
BRK
|
BRK
|
||||||
DB $CE ; Bad directory
|
DB $CE ; Bad directory
|
||||||
ASC 'Bad dir'
|
ASC 'Bad dir'
|
||||||
BRK
|
BRK
|
||||||
:NOERR SEC
|
:NOERR SEC
|
||||||
LDA AUXBLK+2 ; LSB of total blks
|
LDA AUXBLK+2 ; LSB of total blks
|
||||||
SBC AUXBLK+0 ; LSB of blocks used
|
SBC AUXBLK+0 ; LSB of blocks used
|
||||||
TAX
|
TAX
|
||||||
LDA AUXBLK+3 ; MSB of total blks
|
LDA AUXBLK+3 ; MSB of total blks
|
||||||
SBC AUXBLK+1 ; MSB of blocks used
|
SBC AUXBLK+1 ; MSB of blocks used
|
||||||
TAY
|
TAY
|
||||||
LDA #$00 ; *TO DO* b16-b23 of free
|
LDA #$00 ; *TO DO* b16-b23 of free
|
||||||
* NEW
|
* NEW
|
||||||
JSR :FREEDEC ; Print 'AAYYXX blocks aaayyyxxx bytes '
|
JSR :FREEDEC ; Print 'AAYYXX blocks aaayyyxxx bytes '
|
||||||
LDX #<:FREE
|
LDX #<:FREE
|
||||||
LDY #>:FREE
|
LDY #>:FREE
|
||||||
JSR OUTSTR ; Print 'free'<nl>
|
JSR OUTSTR ; Print 'free'<nl>
|
||||||
LDX AUXBLK+0 ; Blocks used
|
LDX AUXBLK+0 ; Blocks used
|
||||||
LDY AUXBLK+1
|
LDY AUXBLK+1
|
||||||
LDA #$00 ; *TO DO* b16-b23 of used
|
LDA #$00 ; *TO DO* b16-b23 of used
|
||||||
JSR :FREEDEC ; Print 'AAYYXX blocks aaayyyxxx bytes '
|
JSR :FREEDEC ; Print 'AAYYXX blocks aaayyyxxx bytes '
|
||||||
LDX #<:USED
|
LDX #<:USED
|
||||||
LDY #>:USED
|
LDY #>:USED
|
||||||
JMP OUTSTR ; Print 'used'<nl>
|
JMP OUTSTR ; Print 'used'<nl>
|
||||||
|
|
||||||
* OLD
|
* OLD
|
||||||
* JSR PRDECXY ; Print in decimal
|
* JSR PRDECXY ; Print in decimal
|
||||||
|
@ -702,20 +702,20 @@ FREERET
|
||||||
STA FSNUM+3
|
STA FSNUM+3
|
||||||
* What's the maximum number of blocks?
|
* What's the maximum number of blocks?
|
||||||
* JSR PRHEX ; Blocks b16-b23 in hex
|
* JSR PRHEX ; Blocks b16-b23 in hex
|
||||||
JSR PR2HEX ; Blocks b0-b15 in hex
|
JSR PR2HEX ; Blocks b0-b15 in hex
|
||||||
LDX #<:BLOCKS
|
LDX #<:BLOCKS
|
||||||
LDY #>:BLOCKS
|
LDY #>:BLOCKS
|
||||||
JSR OUTSTR ; ' blocks '
|
JSR OUTSTR ; ' blocks '
|
||||||
STZ FSNUM+0 ; FSNUM=blocks*512
|
STZ FSNUM+0 ; FSNUM=blocks*512
|
||||||
ASL FSNUM+1
|
ASL FSNUM+1
|
||||||
ROL FSNUM+2
|
ROL FSNUM+2
|
||||||
ROL FSNUM+3
|
ROL FSNUM+3
|
||||||
LDX #FSNUM ; X=>number to print
|
LDX #FSNUM ; X=>number to print
|
||||||
LDY #8 ; Y=pad up to 8 digits
|
LDY #8 ; Y=pad up to 8 digits
|
||||||
JSR PRINTDEC ; Print it in decimal
|
JSR PRINTDEC ; Print it in decimal
|
||||||
LDX #<:BYTES
|
LDX #<:BYTES
|
||||||
LDY #>:BYTES
|
LDY #>:BYTES
|
||||||
JMP OUTSTR ; ' bytes '
|
JMP OUTSTR ; ' bytes '
|
||||||
:BLOCKS ASC ' blocks '
|
:BLOCKS ASC ' blocks '
|
||||||
DB 0
|
DB 0
|
||||||
:BYTES ASC ' bytes '
|
:BYTES ASC ' bytes '
|
||||||
|
@ -731,10 +731,10 @@ FREERET
|
||||||
*:USEDM ASC ' 512-byte Blocks Used'
|
*:USEDM ASC ' 512-byte Blocks Used'
|
||||||
* DB $00
|
* DB $00
|
||||||
|
|
||||||
ACCESS JSR PARSLPTR ; Copy filename->MOSFILE
|
ACCESS JSR PARSLPTR ; Copy filename->MOSFILE
|
||||||
CMP #$00 ; Filename length
|
CMP #$00 ; Filename length
|
||||||
BEQ :SYNTAX
|
BEQ :SYNTAX
|
||||||
JSR PARSLPTR2 ; Copy Arg2->MOSFILE2
|
JSR PARSLPTR2 ; Copy Arg2->MOSFILE2
|
||||||
>>> XF2MAIN,SETPERM
|
>>> XF2MAIN,SETPERM
|
||||||
:SYNTAX BRK
|
:SYNTAX BRK
|
||||||
DB $DC
|
DB $DC
|
||||||
|
@ -746,8 +746,8 @@ ACCRET >>> ENTAUX
|
||||||
LDA #$00
|
LDA #$00
|
||||||
RTS
|
RTS
|
||||||
|
|
||||||
DESTROY JSR PARSLPTR ; Copy filename->MOSFILE
|
DESTROY JSR PARSLPTR ; Copy filename->MOSFILE
|
||||||
CMP #$00 ; Filename length
|
CMP #$00 ; Filename length
|
||||||
BEQ :SYNTAX
|
BEQ :SYNTAX
|
||||||
>>> XF2MAIN,MULTIDEL
|
>>> XF2MAIN,MULTIDEL
|
||||||
:SYNTAX BRK
|
:SYNTAX BRK
|
||||||
|
@ -764,46 +764,46 @@ DESTRET >>> ENTAUX
|
||||||
* Write filename to MOSFILE in main memory
|
* Write filename to MOSFILE in main memory
|
||||||
* Returns length in A
|
* Returns length in A
|
||||||
PARSNAME JSR XYtoLPTR
|
PARSNAME JSR XYtoLPTR
|
||||||
PARSLPTR CLC ; Means parsing a filename
|
PARSLPTR CLC ; Means parsing a filename
|
||||||
JSR GSINIT ; Init gen string handling
|
JSR GSINIT ; Init gen string handling
|
||||||
PHP
|
PHP
|
||||||
SEI ; Disable IRQs
|
SEI ; Disable IRQs
|
||||||
LDX #$00 ; Length
|
LDX #$00 ; Length
|
||||||
:L1 JSR GSREAD ; Handle next char
|
:L1 JSR GSREAD ; Handle next char
|
||||||
BCS :DONE
|
BCS :DONE
|
||||||
STA $C004 ; Write to main mem
|
STA $C004 ; Write to main mem
|
||||||
STA MOSFILE+1,X
|
STA MOSFILE+1,X
|
||||||
STA $C005 ; Write to aux mem
|
STA $C005 ; Write to aux mem
|
||||||
INX
|
INX
|
||||||
BNE :L1
|
BNE :L1
|
||||||
:DONE STA $C004 ; Write to main mem
|
:DONE STA $C004 ; Write to main mem
|
||||||
STX MOSFILE ; Length byte (Pascal)
|
STX MOSFILE ; Length byte (Pascal)
|
||||||
STA $C005 ; Back to aux
|
STA $C005 ; Back to aux
|
||||||
PLP ; IRQs back as they were
|
PLP ; IRQs back as they were
|
||||||
TXA ; Return len in A
|
TXA ; Return len in A
|
||||||
RTS
|
RTS
|
||||||
|
|
||||||
* Parse filename pointed to by (OSLPTR),Y
|
* Parse filename pointed to by (OSLPTR),Y
|
||||||
* Write filename to MOSFILE2 in main memory
|
* Write filename to MOSFILE2 in main memory
|
||||||
* Returns length in A
|
* Returns length in A
|
||||||
PARSNAME2 JSR XYtoLPTR
|
PARSNAME2 JSR XYtoLPTR
|
||||||
PARSLPTR2 CLC ; Means parsing a filename
|
PARSLPTR2 CLC ; Means parsing a filename
|
||||||
JSR GSINIT ; Init gen string handling
|
JSR GSINIT ; Init gen string handling
|
||||||
PHP
|
PHP
|
||||||
SEI ; Disable IRQs
|
SEI ; Disable IRQs
|
||||||
LDX #$00 ; Length
|
LDX #$00 ; Length
|
||||||
:L1 JSR GSREAD ; Handle next char
|
:L1 JSR GSREAD ; Handle next char
|
||||||
BCS :DONE
|
BCS :DONE
|
||||||
STA $C004 ; Write to main mem
|
STA $C004 ; Write to main mem
|
||||||
STA MOSFILE2+1,X
|
STA MOSFILE2+1,X
|
||||||
STA $C005 ; Write to aux mem
|
STA $C005 ; Write to aux mem
|
||||||
INX
|
INX
|
||||||
BNE :L1
|
BNE :L1
|
||||||
:DONE STA $C004 ; Write to main mem
|
:DONE STA $C004 ; Write to main mem
|
||||||
STX MOSFILE2 ; Length byte (Pascal)
|
STX MOSFILE2 ; Length byte (Pascal)
|
||||||
STA $C005 ; Back to aux
|
STA $C005 ; Back to aux
|
||||||
PLP ; IRQs back as they were
|
PLP ; IRQs back as they were
|
||||||
TXA ; Return len in A
|
TXA ; Return len in A
|
||||||
RTS
|
RTS
|
||||||
|
|
||||||
* Move this somewhere
|
* Move this somewhere
|
||||||
|
@ -812,11 +812,11 @@ CHKERROR CMP #$20
|
||||||
RTS
|
RTS
|
||||||
|
|
||||||
*ERREXISTS LDA #$47 ; File exists
|
*ERREXISTS LDA #$47 ; File exists
|
||||||
ERRNOTFND LDA #$46 ; File not found
|
ERRNOTFND LDA #$46 ; File not found
|
||||||
|
|
||||||
MKERROR
|
MKERROR
|
||||||
BIT $E0
|
BIT $E0
|
||||||
BPL MKERROR1 ; *TEST*
|
BPL MKERROR1 ; *TEST*
|
||||||
PHA
|
PHA
|
||||||
LDX #15
|
LDX #15
|
||||||
MKERRLP
|
MKERRLP
|
||||||
|
@ -852,13 +852,13 @@ ERRMSG
|
||||||
MKERROR1
|
MKERROR1
|
||||||
CMP #$40
|
CMP #$40
|
||||||
BCS MKERROR2
|
BCS MKERROR2
|
||||||
ORA #$30 ; <$40 -> $30-$3F
|
ORA #$30 ; <$40 -> $30-$3F
|
||||||
MKERROR2
|
MKERROR2
|
||||||
SEC
|
SEC
|
||||||
SBC #$37
|
SBC #$37
|
||||||
CMP #$28
|
CMP #$28
|
||||||
BCC MKERROR3
|
BCC MKERROR3
|
||||||
LDA #$00 ; I/O error
|
LDA #$00 ; I/O error
|
||||||
MKERROR3
|
MKERROR3
|
||||||
ASL A
|
ASL A
|
||||||
TAX
|
TAX
|
||||||
|
@ -922,67 +922,68 @@ MKERROR4 DW ERROR27
|
||||||
|
|
||||||
* AcornOS ProDOS
|
* AcornOS ProDOS
|
||||||
ERROR40 DW $CC00
|
ERROR40 DW $CC00
|
||||||
ASC 'Bad filename' ; $40 - Invalid pathname syntax
|
ASC 'Bad filename' ; $40 - Invalid pathname syntax
|
||||||
ERROR41 DW $C400
|
ERROR41 DW $C400
|
||||||
ASC 'Is a directory' ; $41 - Duplicate filename (split from $47)
|
ASC 'Is a directory' ; $41 - Duplicate filename (split from $47)
|
||||||
ERROR42 DW $C000
|
ERROR42 DW $C000
|
||||||
ASC 'Too many open' ; $42 - File Control Block table full
|
ASC 'Too many open' ; $42 - File Control Block table full
|
||||||
ERROR43 DW $DE00
|
ERROR43 DW $DE00
|
||||||
ASC 'Channel not open' ; $43 - Invalid reference number
|
ASC 'Channel not open' ; $43 - Invalid reference number
|
||||||
ERROR44 ; $44 - Path not found
|
ERROR44 ; $44 - Path not found
|
||||||
ERROR46 DW $D600
|
ERROR46 DW $D600
|
||||||
ASC 'File not found' ; $46 - File not found
|
ASC 'File not found' ; $46 - File not found
|
||||||
ERROR45 DW $D600
|
ERROR45 DW $D600
|
||||||
ASC 'Disk not found' ; $45 - Volume directory not found
|
ASC 'Disk not found' ; $45 - Volume directory not found
|
||||||
ERROR47 DW $C400
|
ERROR47 DW $C400
|
||||||
ASC 'File exists' ; $47 - Duplicate filename (see also $41)
|
ASC 'File exists' ; $47 - Duplicate filename (see also $41)
|
||||||
ERROR48 DW $C600
|
ERROR48 DW $C600
|
||||||
ASC 'Disk full' ; $48 - Overrun error
|
ASC 'Disk full' ; $48 - Overrun error
|
||||||
ERROR49 DW $B300
|
ERROR49 DW $B300
|
||||||
ASC 'Directory full' ; $49 - Volume directory full
|
ASC 'Directory full' ; $49 - Volume directory full
|
||||||
ERROR4A ; $4A - Incompatible file format
|
ERROR4A ; $4A - Incompatible file format
|
||||||
ERROR4B ; $4B - Unsupported storage_type
|
ERROR4B ; $4B - Unsupported storage_type
|
||||||
ERROR52 DW $C800
|
ERROR52 DW $C800
|
||||||
ASC 'Disk not recognised' ; $52 - Not a ProDOS disk
|
ASC 'Disk not recognised' ; $52 - Not a ProDOS disk
|
||||||
ERROR4C DW $DF00
|
ERROR4C DW $DF00
|
||||||
ASC 'End of file' ; $4C - End of file has been encountered
|
ASC 'End of file' ; $4C - End of file has been encountered
|
||||||
ERROR4D DW $C100
|
ERROR4D DW $C100
|
||||||
ASC 'Not open for update' ; $4D - Position out of range
|
ASC 'Not open for update' ; $4D - Position out of range
|
||||||
ERROR4E DW $BD00
|
ERROR4E DW $BD00
|
||||||
ASC 'Insufficient access' ; $4E - Access error (see also $4F)
|
ASC 'Insufficient access' ; $4E - Access error (see also $4F)
|
||||||
ERROR4F DW $C300
|
ERROR4F DW $C300
|
||||||
ASC 'Entry locked' ; $4F - Access error (split from $4E)
|
ASC 'Entry locked' ; $4F - Access error (split from $4E)
|
||||||
ERROR50 DW $C200
|
ERROR50 DW $C200
|
||||||
ASC 'Can'
|
ASC 'Can'
|
||||||
DB $27
|
DB $27
|
||||||
ASC 't - file open' ; $50 - File is open
|
ASC 't - file open' ; $50 - File is open
|
||||||
ERROR51 DW $A800
|
ERROR51 DW $A800
|
||||||
ASC 'Broken directory' ; $51 - Directory count error
|
ASC 'Broken directory' ; $51 - Directory count error
|
||||||
ERROR53 DW $DC00
|
ERROR53 DW $DC00
|
||||||
ASC 'Invalid parameter' ; $53 - Invalid parameter
|
ASC 'Invalid parameter' ; $53 - Invalid parameter
|
||||||
ERROR54 DW $D400
|
ERROR54 DW $D400
|
||||||
ASC 'Directory not empty' ; $54 - Directory not empty
|
ASC 'Directory not empty' ; $54 - Directory not empty
|
||||||
ERROR55 DW $FF00
|
ERROR55 DW $FF00
|
||||||
ASC 'ProDOS: VCB full' ; $55 - Volume Control Block table full
|
ASC 'ProDOS: VCB full' ; $55 - Volume Control Block table full
|
||||||
ERROR56 DW $FF00
|
ERROR56 DW $FF00
|
||||||
ASC 'ProDOS: Bad addr' ; $56 - Bad buffer address
|
ASC 'ProDOS: Bad addr' ; $56 - Bad buffer address
|
||||||
ERROR57 DW $FF00
|
ERROR57 DW $FF00
|
||||||
ASC 'ProDOS: Dup volm' ; $57 - Duplicate volume
|
ASC 'ProDOS: Dup volm' ; $57 - Duplicate volume
|
||||||
ERROR5B ; spare
|
ERROR5B ; spare
|
||||||
ERROR27 DW $FF00
|
ERROR27 DW $FF00
|
||||||
ASC 'I/O error' ; $27 - I/O error
|
ASC 'I/O error' ; $27 - I/O error
|
||||||
ERROR28 DW $D200
|
ERROR28 DW $D200
|
||||||
ASC 'Disk not present' ; $28 - No device detected/connected
|
ASC 'Disk not present' ; $28 - No device detected/connected
|
||||||
ERROR5A DW $FF00
|
ERROR5A DW $FF00
|
||||||
ASC 'Sector not found' ; $5A - Bit map disk address is impossible
|
ASC 'Sector not found' ; $5A - Bit map disk address is impossible
|
||||||
ERROR2B DW $C900
|
ERROR2B DW $C900
|
||||||
ASC 'Disk write protected'; $2B - Disk write protected
|
ASC 'Disk write protected' ; $2B - Disk write protected
|
||||||
ERROR5D DW $CA00
|
ERROR5D DW $CA00
|
||||||
ASC 'Data lost' ; $5D - EOF during LOAD or SAVE
|
ASC 'Data lost' ; $5D - EOF during LOAD or SAVE
|
||||||
ERROR5E DW $C000
|
ERROR5E DW $C000
|
||||||
ASC 'Can'
|
ASC 'Can'
|
||||||
DB $27
|
DB $27
|
||||||
ASC 't save' ; $5E - Couldn't open for save
|
ASC 't save' ; $5E - Couldn't open for save
|
||||||
ERROR2E DW $C800
|
ERROR2E DW $C800
|
||||||
ASC 'Disk changed' ; $2E - Disk switched
|
ASC 'Disk changed' ; $2E - Disk switched
|
||||||
DB $00
|
DB $00
|
||||||
|
|
||||||
|
|
|
@ -138,8 +138,8 @@ MOSHIGH SEI
|
||||||
* X=ROM number to select
|
* X=ROM number to select
|
||||||
*
|
*
|
||||||
BYTE8E PHP ; Save CLC=RESET, SEC=Not RESET
|
BYTE8E PHP ; Save CLC=RESET, SEC=Not RESET
|
||||||
JSR ROMSELECT ; Bring ROM X into memory
|
JSR ROMSELECT ; Bring ROM X into memory
|
||||||
STX BYTEVARBASE+$FC ; Set current language ROM
|
STX BYTEVARBASE+$FC ; Set current language ROM
|
||||||
LDA #$00
|
LDA #$00
|
||||||
STA FAULT+0
|
STA FAULT+0
|
||||||
LDA #$80
|
LDA #$80
|
||||||
|
@ -156,27 +156,27 @@ BYTE8E PHP ; Save CLC=RESET, SEC=Not RESET
|
||||||
* OSBYTE $8F - Issue service call
|
* OSBYTE $8F - Issue service call
|
||||||
* X=service call, Y=parameter
|
* X=service call, Y=parameter
|
||||||
*
|
*
|
||||||
SERVICE TAX ; Enter here with A=Service Num
|
SERVICE TAX ; Enter here with A=Service Num
|
||||||
BYTE8F
|
BYTE8F
|
||||||
SERVICEX LDA $F4
|
SERVICEX LDA $F4
|
||||||
PHA ; Save current ROM
|
PHA ; Save current ROM
|
||||||
TXA
|
TXA
|
||||||
LDX MAXROM ; Start at highest ROM
|
LDX MAXROM ; Start at highest ROM
|
||||||
:SERVLP JSR ROMSELECT ; Bring it into memory
|
:SERVLP JSR ROMSELECT ; Bring it into memory
|
||||||
BIT $8006
|
BIT $8006
|
||||||
BPL :SERVSKIP ; No service entry
|
BPL :SERVSKIP ; No service entry
|
||||||
JSR $8003 ; Call service entry
|
JSR $8003 ; Call service entry
|
||||||
TAX
|
TAX
|
||||||
BEQ :SERVDONE
|
BEQ :SERVDONE
|
||||||
:SERVSKIP LDX $F4 ; Restore X=current ROM
|
:SERVSKIP LDX $F4 ; Restore X=current ROM
|
||||||
DEX ; Step down to next
|
DEX ; Step down to next
|
||||||
BPL :SERVLP ; Loop until ROM 0 done
|
BPL :SERVLP ; Loop until ROM 0 done
|
||||||
:SERVDONE PLA ; Get caller's ROM back
|
:SERVDONE PLA ; Get caller's ROM back
|
||||||
PHX ; Save return from service call
|
PHX ; Save return from service call
|
||||||
TAX
|
TAX
|
||||||
JSR ROMSELECT ; Restore caller's ROM
|
JSR ROMSELECT ; Restore caller's ROM
|
||||||
PLX ; Get return value back
|
PLX ; Get return value back
|
||||||
TXA ; Return in A and X and set EQ/NE
|
TXA ; Return in A and X and set EQ/NE
|
||||||
RTS
|
RTS
|
||||||
|
|
||||||
|
|
||||||
|
@ -195,3 +195,5 @@ HELLO ASC 'Applecorn MOS 2021-10-24'
|
||||||
DB $00 ; Unify MOS messages
|
DB $00 ; Unify MOS messages
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
422
auxmem.misc.s
422
auxmem.misc.s
|
@ -11,28 +11,28 @@
|
||||||
************************************
|
************************************
|
||||||
* 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
|
||||||
|
|
||||||
|
|
||||||
|
@ -57,21 +57,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
|
||||||
|
@ -81,9 +81,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
|
||||||
|
@ -102,7 +102,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
|
||||||
|
@ -113,16 +113,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 *
|
||||||
|
@ -144,35 +144,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
|
||||||
|
@ -193,16 +193,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
|
||||||
|
@ -245,13 +245,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
|
||||||
|
@ -259,54 +259,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
|
||||||
|
@ -318,16 +318,16 @@ GSREADOK INY ; Step to next character
|
||||||
* 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 $F4
|
||||||
PHA
|
PHA
|
||||||
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 ($F6),Y ; Read the byte
|
||||||
PLX
|
PLX
|
||||||
|
|
||||||
* Select a sideways ROM
|
* Select a sideways ROM
|
||||||
* X=ROM to select
|
* X=ROM to select
|
||||||
* All registers must be preserved
|
* All registers must be preserved
|
||||||
ROMSELECT CPX $F4
|
ROMSELECT CPX $F4
|
||||||
BEQ :ROMSELOK ; Already selected
|
BEQ :ROMSELOK ; Already selected
|
||||||
|
|
||||||
* 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.
|
||||||
|
@ -337,21 +337,21 @@ ROMSELECT CPX $F4
|
||||||
TXA
|
TXA
|
||||||
ASL A
|
ASL A
|
||||||
TAX
|
TAX
|
||||||
LDA ROMTAB,X ; LSB of pointer to name
|
LDA ROMTAB,X ; LSB of pointer to name
|
||||||
STA OSFILECB+0
|
STA OSFILECB+0
|
||||||
LDA ROMTAB+1,X ; MSB of pointer to name
|
LDA ROMTAB+1,X ; MSB of pointer to name
|
||||||
STA OSFILECB+1
|
STA OSFILECB+1
|
||||||
STZ OSFILECB+2 ; Dest address $8000
|
STZ OSFILECB+2 ; Dest address $8000
|
||||||
LDA #$80
|
LDA #$80
|
||||||
STA OSFILECB+3
|
STA OSFILECB+3
|
||||||
LDX #<OSFILECB
|
LDX #<OSFILECB
|
||||||
LDY #>OSFILECB
|
LDY #>OSFILECB
|
||||||
LDA #$FF ; Means 'LOAD'
|
LDA #$FF ; Means 'LOAD'
|
||||||
JSR OSFILE
|
JSR OSFILE
|
||||||
PLY
|
PLY
|
||||||
PLX
|
PLX
|
||||||
PLA
|
PLA
|
||||||
STX $F4 ; Set Current ROM number
|
STX $F4 ; Set Current ROM number
|
||||||
:ROMSELOK
|
:ROMSELOK
|
||||||
EVENT RTS
|
EVENT RTS
|
||||||
|
|
||||||
|
@ -379,14 +379,14 @@ PASCROM1 ASC 'PASC.1.10.1.ROM'
|
||||||
PASCROM2 ASC 'PASC.1.10.2.ROM'
|
PASCROM2 ASC 'PASC.1.10.2.ROM'
|
||||||
DB $0D,$00
|
DB $0D,$00
|
||||||
|
|
||||||
MAXROM DB $00 ; Index of highest sideways ROM
|
MAXROM DB $00 ; Index of highest sideways ROM
|
||||||
|
|
||||||
* Initialize ROMTAB according to user selection in menu
|
* Initialize ROMTAB according to user selection in menu
|
||||||
INITROMS STZ MAXROM ; One sideways ROM only
|
INITROMS STZ MAXROM ; One sideways ROM only
|
||||||
STA $C002 ; Read main mem
|
STA $C002 ; Read main mem
|
||||||
LDA USERSEL
|
LDA USERSEL
|
||||||
STA $C003 ; Read aux mem
|
STA $C003 ; Read aux mem
|
||||||
ASL ; x2
|
ASL ; x2
|
||||||
CLC
|
CLC
|
||||||
ADC #<ROMS
|
ADC #<ROMS
|
||||||
STA OSLPTR+0
|
STA OSLPTR+0
|
||||||
|
@ -399,18 +399,18 @@ INITROMS STZ MAXROM ; One sideways ROM only
|
||||||
INY
|
INY
|
||||||
LDA (OSLPTR),Y
|
LDA (OSLPTR),Y
|
||||||
STA ROMTAB+1
|
STA ROMTAB+1
|
||||||
STA $C002 ; Read main mem
|
STA $C002 ; Read main mem
|
||||||
LDA USERSEL
|
LDA USERSEL
|
||||||
STA $C003 ; Read aux mem
|
STA $C003 ; Read aux mem
|
||||||
CMP #6 ; Menu entry 7 has two ROMs
|
CMP #6 ; Menu entry 7 has two ROMs
|
||||||
BNE :S1
|
BNE :S1
|
||||||
LDA #<PASCROM2
|
LDA #<PASCROM2
|
||||||
STA ROMTAB+2
|
STA ROMTAB+2
|
||||||
LDA #>PASCROM2
|
LDA #>PASCROM2
|
||||||
STA ROMTAB+3
|
STA ROMTAB+3
|
||||||
INC MAXROM ; Two ROMs
|
INC MAXROM ; Two ROMs
|
||||||
BRA :DONE
|
BRA :DONE
|
||||||
:S1 CMP #7 ; Menu entry 8
|
:S1 CMP #7 ; Menu entry 8
|
||||||
BNE :DONE
|
BNE :DONE
|
||||||
LDA #<PASCROM1
|
LDA #<PASCROM1
|
||||||
STA ROMTAB+0
|
STA ROMTAB+0
|
||||||
|
@ -444,29 +444,29 @@ INITROMS STZ MAXROM ; One sideways ROM only
|
||||||
STA ROMTAB+14
|
STA ROMTAB+14
|
||||||
LDA #>BASICROM
|
LDA #>BASICROM
|
||||||
STA ROMTAB+15
|
STA ROMTAB+15
|
||||||
LDA #7 ; 8 sideways ROMs
|
LDA #7 ; 8 sideways ROMs
|
||||||
STA MAXROM
|
STA MAXROM
|
||||||
:DONE LDA #$FF
|
:DONE LDA #$FF
|
||||||
STA $F4 ; Force ROM to load
|
STA $F4 ; Force ROM to load
|
||||||
RTS
|
RTS
|
||||||
|
|
||||||
* Active sideways ROMs
|
* Active sideways ROMs
|
||||||
ROMTAB DW $0000 ; ROM0
|
ROMTAB DW $0000 ; ROM0
|
||||||
DW $0000 ; ROM1
|
DW $0000 ; ROM1
|
||||||
DW $0000 ; ROM2
|
DW $0000 ; ROM2
|
||||||
DW $0000 ; ROM3
|
DW $0000 ; ROM3
|
||||||
DW $0000 ; ROM4
|
DW $0000 ; ROM4
|
||||||
DW $0000 ; ROM5
|
DW $0000 ; ROM5
|
||||||
DW $0000 ; ROM6
|
DW $0000 ; ROM6
|
||||||
DW $0000 ; ROM7
|
DW $0000 ; ROM7
|
||||||
DW $0000 ; ROM8
|
DW $0000 ; ROM8
|
||||||
DW $0000 ; ROM9
|
DW $0000 ; ROM9
|
||||||
DW $0000 ; ROMA
|
DW $0000 ; ROMA
|
||||||
DW $0000 ; ROMB
|
DW $0000 ; ROMB
|
||||||
DW $0000 ; ROMC
|
DW $0000 ; ROMC
|
||||||
DW $0000 ; ROMD
|
DW $0000 ; ROMD
|
||||||
DW $0000 ; ROME
|
DW $0000 ; ROME
|
||||||
DW $0000 ; ROMF
|
DW $0000 ; ROMF
|
||||||
|
|
||||||
* ROM filenames in same order as in the menu
|
* ROM filenames in same order as in the menu
|
||||||
* ROMMENU copies these to ROMTAB upon user selection
|
* ROMMENU copies these to ROMTAB upon user selection
|
||||||
|
@ -491,7 +491,7 @@ ROMS DW BASICROM
|
||||||
**********************************************************
|
**********************************************************
|
||||||
|
|
||||||
* 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
|
||||||
|
|
||||||
|
@ -499,43 +499,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
|
||||||
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
|
STA $C005 ; Write to aux memory
|
||||||
|
|
||||||
TXA
|
TXA
|
||||||
PHA
|
PHA
|
||||||
CLD
|
CLD
|
||||||
TSX
|
TSX
|
||||||
LDA $103,X ; Get PSW from stack
|
LDA $103,X ; Get PSW from stack
|
||||||
AND #$10
|
AND #$10
|
||||||
BEQ :IRQ ; IRQ
|
BEQ :IRQ ; IRQ
|
||||||
SEC
|
SEC
|
||||||
LDA $0104,X
|
LDA $0104,X
|
||||||
SBC #$01
|
SBC #$01
|
||||||
STA FAULT+0 ; FAULT=>error block after BRK
|
STA FAULT+0 ; FAULT=>error block after BRK
|
||||||
LDA $0105,X
|
LDA $0105,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
|
||||||
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
|
||||||
CLI
|
CLI
|
||||||
JMP (BRKV) ; Pass on to BRK handler
|
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
|
||||||
|
@ -555,7 +555,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: '
|
||||||
|
@ -563,33 +563,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
|
||||||
|
|
||||||
*
|
*
|
||||||
|
@ -605,56 +605,58 @@ 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
|
||||||
AUXBLK ASC '**ENDOFCODE**'
|
AUXBLK ASC '**ENDOFCODE**'
|
||||||
DS $200-13
|
DS $200-13
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
142
auxmem.mosequ.s
142
auxmem.mosequ.s
|
@ -1,70 +1,72 @@
|
||||||
* AUXMEM.MOSEQU.S
|
* AUXMEM.MOSEQU.S
|
||||||
* (c) Bobbi 2021 GPLv3
|
* (c) Bobbi 2021 GPLv3
|
||||||
*
|
*
|
||||||
|
|
||||||
*******************************
|
*******************************
|
||||||
* BBC MOS WORKSPACE LOCATIONS *
|
* BBC MOS WORKSPACE LOCATIONS *
|
||||||
*******************************
|
*******************************
|
||||||
|
|
||||||
* $00-$8F Language workspace
|
* $00-$8F Language workspace
|
||||||
* $90-$9F Network workspace
|
* $90-$9F Network workspace
|
||||||
* $A0-$A7 NMI workspace
|
* $A0-$A7 NMI workspace
|
||||||
* $A8-$AF Non-MOS *command workspace
|
* $A8-$AF Non-MOS *command workspace
|
||||||
* $B0-$BF Temporary filing system workspace
|
* $B0-$BF Temporary filing system workspace
|
||||||
* $C0-$CF Persistant filing system workspace
|
* $C0-$CF Persistant filing system workspace
|
||||||
* $D0-$DF VDU driver workspace
|
* $D0-$DF VDU driver workspace
|
||||||
* $E0-$EE Internal MOS workspace
|
* $E0-$EE Internal MOS workspace
|
||||||
* $EF-$FF MOS API workspace
|
* $EF-$FF MOS API workspace
|
||||||
|
|
||||||
FSFLAG1 EQU $E2
|
FSFLAG1 EQU $E2
|
||||||
FSFLAG2 EQU $E3
|
FSFLAG2 EQU $E3
|
||||||
GSFLAG EQU $E4 ; $E4 GSREAD processing flags
|
GSFLAG EQU $E4 ; $E4 GSREAD processing flags
|
||||||
GSCHAR EQU $E5 ; $E5 GSREAD accumulator
|
GSCHAR EQU $E5 ; $E5 GSREAD accumulator
|
||||||
OSTEXT EQU $E6 ; $E6 => text string $E6 OSNUM+0
|
OSTEXT EQU $E6 ; $E6 => text string $E6 OSNUM+0
|
||||||
MAXLEN EQU OSTEXT+2 ; $E8 $E8 OSNUM+2
|
MAXLEN EQU OSTEXT+2 ; $E8 $E8 OSNUM+2
|
||||||
MINCHAR EQU OSTEXT+3 ; $E9 $E9 OSNUM+3
|
MINCHAR EQU OSTEXT+3 ; $E9 $E9 OSNUM+3
|
||||||
MAXCHAR EQU OSTEXT+4 ; $EA $EA OSPAD
|
MAXCHAR EQU OSTEXT+4 ; $EA $EA OSPAD
|
||||||
OSTEMP EQU $EB ; $EB $EB OSTEMP
|
OSTEMP EQU $EB ; $EB $EB OSTEMP
|
||||||
OSKBD1 EQU $EC ; $EC kbd ws
|
OSKBD1 EQU $EC ; $EC kbd ws
|
||||||
OSKBD2 EQU OSKBD1+1 ; $ED kbd ws
|
OSKBD2 EQU OSKBD1+1 ; $ED kbd ws
|
||||||
OSKBD3 EQU OSKBD1+2 ; $EE kbd ws
|
OSKBD3 EQU OSKBD1+2 ; $EE kbd ws
|
||||||
OSAREG EQU $EF ; $EF A register
|
OSAREG EQU $EF ; $EF A register
|
||||||
OSXREG EQU OSAREG+1 ; $F0 X register
|
OSXREG EQU OSAREG+1 ; $F0 X register
|
||||||
OSYREG EQU OSXREG+1 ; $F1 Y register
|
OSYREG EQU OSXREG+1 ; $F1 Y register
|
||||||
OSCTRL EQU OSXREG ; $F0 (XY)=>control block
|
OSCTRL EQU OSXREG ; $F0 (XY)=>control block
|
||||||
OSLPTR EQU $F2 ; $F2 => command line
|
OSLPTR EQU $F2 ; $F2 => command line
|
||||||
OSROMNUM EQU $F4 ; $F4 current ROM
|
OSROMNUM EQU $F4 ; $F4 current ROM
|
||||||
*
|
*
|
||||||
OSINTWS EQU $FA ; $FA IRQ ZP pointer, use when IRQs off
|
OSINTWS EQU $FA ; $FA IRQ ZP pointer, use when IRQs off
|
||||||
OSINTA EQU $FC ; $FC IRQ register A store
|
OSINTA EQU $FC ; $FC IRQ register A store
|
||||||
FAULT EQU $FD ; $FD Error message pointer
|
FAULT EQU $FD ; $FD Error message pointer
|
||||||
ESCFLAG EQU $FF ; $FF Escape status
|
ESCFLAG EQU $FF ; $FF Escape status
|
||||||
|
|
||||||
|
|
||||||
* $0200-$0235 Vectors
|
* $0200-$0235 Vectors
|
||||||
* $0236-$028F OSBYTE variables ($190+BYTENUM)
|
* $0236-$028F OSBYTE variables ($190+BYTENUM)
|
||||||
* $0290-$02ED
|
* $0290-$02ED
|
||||||
* $02EE-$02FF MOS control block
|
* $02EE-$02FF MOS control block
|
||||||
|
|
||||||
USERV EQU $200 ; USER vector
|
USERV EQU $200 ; USER vector
|
||||||
BRKV EQU $202 ; BRK vector
|
BRKV EQU $202 ; BRK vector
|
||||||
CLIV EQU $208 ; OSCLI vector
|
CLIV EQU $208 ; OSCLI vector
|
||||||
BYTEV EQU $20A ; OSBYTE vector
|
BYTEV EQU $20A ; OSBYTE vector
|
||||||
WORDV EQU $20C ; OSWORD vector
|
WORDV EQU $20C ; OSWORD vector
|
||||||
WRCHV EQU $20E ; OSWRCH vector
|
WRCHV EQU $20E ; OSWRCH vector
|
||||||
RDCHV EQU $210 ; OSRDCH vector
|
RDCHV EQU $210 ; OSRDCH vector
|
||||||
FILEV EQU $212 ; OSFILE vector
|
FILEV EQU $212 ; OSFILE vector
|
||||||
ARGSV EQU $214 ; OSARGS vector
|
ARGSV EQU $214 ; OSARGS vector
|
||||||
BGETV EQU $216 ; OSBGET vector
|
BGETV EQU $216 ; OSBGET vector
|
||||||
BPUTV EQU $218 ; OSBPUT vector
|
BPUTV EQU $218 ; OSBPUT vector
|
||||||
GBPBV EQU $21A ; OSGBPB vector
|
GBPBV EQU $21A ; OSGBPB vector
|
||||||
FINDV EQU $21C ; OSFIND vector
|
FINDV EQU $21C ; OSFIND vector
|
||||||
FSCV EQU $21E ; FSCV misc file ops
|
FSCV EQU $21E ; FSCV misc file ops
|
||||||
|
|
||||||
BYTEVARBASE EQU $190 ; Base of OSBYTE variables
|
BYTEVARBASE EQU $190 ; Base of OSBYTE variables
|
||||||
OSFILECB EQU $2EE ; OSFILE control block
|
OSFILECB EQU $2EE ; OSFILE control block
|
||||||
OSGBPBCB EQU OSFILECB+1 ; OSGBPB control block
|
OSGBPBCB EQU OSFILECB+1 ; OSGBPB control block
|
||||||
|
|
||||||
|
|
||||||
* $0300-$03DF
|
* $0300-$03DF
|
||||||
* $03E0-$03FF Used for interfacing with ProDOS XFER
|
* $03E0-$03FF Used for interfacing with ProDOS XFER
|
||||||
|
|
||||||
|
|
||||||
|
|
|
@ -520,6 +520,8 @@ ECHOLP1 JSR GSREAD
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
|
@ -1004,3 +1004,5 @@ VDU01 RTS
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
|
@ -85,6 +85,8 @@ GEOFCMD EQU $D1
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
|
@ -227,3 +227,5 @@ MHGRTAB DW $2000,$2080,$2100,$2180,$2200,$2280,$2300,$2380
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
|
@ -131,6 +131,8 @@ RESET TSX
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
|
@ -173,3 +173,5 @@ LOADCODE PHP ; Save carry flag
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
|
@ -127,6 +127,8 @@ QUITPL HEX 04 ; Number of parameters
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
|
@ -99,3 +99,5 @@ MSG8 ASC " 8. Everything! (8 ROMs)"
|
||||||
|
|
||||||
USERSEL DB $00
|
USERSEL DB $00
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
304
mainmem.misc.s
304
mainmem.misc.s
|
@ -7,194 +7,196 @@
|
||||||
* A1L/A1H: Start address
|
* A1L/A1H: Start address
|
||||||
* A2L/A2H: End address
|
* A2L/A2H: End address
|
||||||
* A4L/A4H: Destination start address
|
* A4L/A4H: Destination start address
|
||||||
MEMCPY LDA (A1L)
|
MEMCPY LDA (A1L)
|
||||||
STA (A4L)
|
STA (A4L)
|
||||||
LDA A1H
|
LDA A1H
|
||||||
CMP A2H
|
CMP A2H
|
||||||
BNE :S1
|
BNE :S1
|
||||||
LDA A1L
|
LDA A1L
|
||||||
CMP A2L
|
CMP A2L
|
||||||
BNE :S1
|
BNE :S1
|
||||||
BRA :DONE
|
BRA :DONE
|
||||||
:S1 INC A1L
|
:S1 INC A1L
|
||||||
BNE :S2
|
BNE :S2
|
||||||
INC A1H
|
INC A1H
|
||||||
:S2 INC A4L
|
:S2 INC A4L
|
||||||
BNE :S3
|
BNE :S3
|
||||||
INC A4H
|
INC A4H
|
||||||
:S3 BRA MEMCPY
|
:S3 BRA MEMCPY
|
||||||
:DONE RTS
|
:DONE RTS
|
||||||
|
|
||||||
* Copy 512 bytes from BLKBUF to AUXBLK in aux LC
|
* Copy 512 bytes from BLKBUF to AUXBLK in aux LC
|
||||||
COPYAUXBLK >>> ALTZP ; Alt ZP & Alt LC on
|
COPYAUXBLK >>> ALTZP ; Alt ZP & Alt LC on
|
||||||
LDY #$00
|
LDY #$00
|
||||||
:L1 LDA BLKBUF,Y
|
:L1 LDA BLKBUF,Y
|
||||||
STA $C005 ; Write aux mem
|
STA $C005 ; Write aux mem
|
||||||
STA AUXBLK,Y
|
STA AUXBLK,Y
|
||||||
STA $C004 ; Write main mem
|
STA $C004 ; Write main mem
|
||||||
CPY #$FF
|
CPY #$FF
|
||||||
BEQ :S1
|
BEQ :S1
|
||||||
INY
|
INY
|
||||||
BRA :L1
|
BRA :L1
|
||||||
:S1 LDY #$00
|
:S1 LDY #$00
|
||||||
:L2 LDA BLKBUF+$100,Y
|
:L2 LDA BLKBUF+$100,Y
|
||||||
STA $C005 ; Write aux mem
|
STA $C005 ; Write aux mem
|
||||||
STA AUXBLK+$100,Y
|
STA AUXBLK+$100,Y
|
||||||
STA $C004 ; Write main mem
|
STA $C004 ; Write main mem
|
||||||
CPY #$FF
|
CPY #$FF
|
||||||
BEQ :S2
|
BEQ :S2
|
||||||
INY
|
INY
|
||||||
BRA :L2
|
BRA :L2
|
||||||
:S2 >>> MAINZP ; Alt ZP off, ROM back in
|
:S2 >>> MAINZP ; Alt ZP off, ROM back in
|
||||||
RTS
|
RTS
|
||||||
|
|
||||||
* Search FILEREFS for value in A
|
* Search FILEREFS for value in A
|
||||||
* On return, buffer number is in X (or $FF if no bufs)
|
* On return, buffer number is in X (or $FF if no bufs)
|
||||||
FINDBUF LDX #$00
|
FINDBUF LDX #$00
|
||||||
:L1 CMP FILEREFS,X
|
:L1 CMP FILEREFS,X
|
||||||
BEQ :END
|
BEQ :END
|
||||||
INX
|
INX
|
||||||
CPX #$04
|
CPX #$04
|
||||||
BNE :L1
|
BNE :L1
|
||||||
LDX #$FF ; $FF for not found
|
LDX #$FF ; $FF for not found
|
||||||
:END RTS
|
:END RTS
|
||||||
|
|
||||||
* Obtain I/O buffer address
|
* Obtain I/O buffer address
|
||||||
* On entry: buffer number in X
|
* On entry: buffer number in X
|
||||||
* On exit: buffer address in AY
|
* On exit: buffer address in AY
|
||||||
* Carry set if no bufs, clear otherwise
|
* Carry set if no bufs, clear otherwise
|
||||||
BUFADDR CPX #$00
|
BUFADDR CPX #$00
|
||||||
BNE :S1
|
BNE :S1
|
||||||
LDA #<IOBUF1
|
LDA #<IOBUF1
|
||||||
LDY #>IOBUF1
|
LDY #>IOBUF1
|
||||||
BRA :EXIT
|
BRA :EXIT
|
||||||
:S1 CPX #$01
|
:S1 CPX #$01
|
||||||
BNE :S2
|
BNE :S2
|
||||||
LDA #<IOBUF2
|
LDA #<IOBUF2
|
||||||
LDY #>IOBUF2
|
LDY #>IOBUF2
|
||||||
BRA :EXIT
|
BRA :EXIT
|
||||||
:S2 CPX #$02
|
:S2 CPX #$02
|
||||||
BNE :S3
|
BNE :S3
|
||||||
LDA #<IOBUF3
|
LDA #<IOBUF3
|
||||||
LDY #>IOBUF3
|
LDY #>IOBUF3
|
||||||
BRA :EXIT
|
BRA :EXIT
|
||||||
:S3 CPX #$03
|
:S3 CPX #$03
|
||||||
BNE :NOBUFS
|
BNE :NOBUFS
|
||||||
LDA #<IOBUF4
|
LDA #<IOBUF4
|
||||||
LDY #>IOBUF4
|
LDY #>IOBUF4
|
||||||
:EXIT CLC
|
:EXIT CLC
|
||||||
RTS
|
RTS
|
||||||
:NOBUFS SEC
|
:NOBUFS SEC
|
||||||
RTS
|
RTS
|
||||||
|
|
||||||
* Check if file exists
|
* Check if file exists
|
||||||
* Return A=0 if doesn't exist, A=1 file, A=2 dir
|
* Return A=0 if doesn't exist, A=1 file, A=2 dir
|
||||||
EXISTS LDA #<MOSFILE
|
EXISTS LDA #<MOSFILE
|
||||||
STA GINFOPL+1
|
STA GINFOPL+1
|
||||||
LDA #>MOSFILE
|
LDA #>MOSFILE
|
||||||
STA GINFOPL+2
|
STA GINFOPL+2
|
||||||
JSR GETINFO ; GET_FILE_INFO
|
JSR GETINFO ; GET_FILE_INFO
|
||||||
BCS :NOEXIST
|
BCS :NOEXIST
|
||||||
LDA GINFOPL+7 ; Storage type
|
LDA GINFOPL+7 ; Storage type
|
||||||
CMP #$0D
|
CMP #$0D
|
||||||
BCS :DIR ; >= $0D
|
BCS :DIR ; >= $0D
|
||||||
LDA #$01 ; File
|
LDA #$01 ; File
|
||||||
RTS
|
RTS
|
||||||
:DIR LDA #$02
|
:DIR LDA #$02
|
||||||
RTS
|
RTS
|
||||||
:NOEXIST LDA #$00
|
:NOEXIST LDA #$00
|
||||||
RTS
|
RTS
|
||||||
|
|
||||||
|
|
||||||
* Copy FILEBLK to OSFILECB in aux memory
|
* Copy FILEBLK to OSFILECB in aux memory
|
||||||
* Preserves A
|
* Preserves A
|
||||||
COPYFB PHA
|
COPYFB PHA
|
||||||
LDX #$11 ; 18 bytes in FILEBLK
|
LDX #$11 ; 18 bytes in FILEBLK
|
||||||
* >>> WRTAUX ; Alt ZP and LC
|
* >>> WRTAUX ; Alt ZP and LC
|
||||||
>>> WRTAUX ; Write to Aux mem
|
>>> WRTAUX ; Write to Aux mem
|
||||||
:L1 LDA FILEBLK,X
|
:L1 LDA FILEBLK,X
|
||||||
* STA AUXBLK,X
|
* STA AUXBLK,X
|
||||||
STA OSFILECB,X
|
STA OSFILECB,X
|
||||||
DEX
|
DEX
|
||||||
BPL :L1
|
BPL :L1
|
||||||
* >>> MAINZP ; Back to normal
|
* >>> MAINZP ; Back to normal
|
||||||
>>> WRTMAIN ; Back to Main mem
|
>>> WRTMAIN ; Back to Main mem
|
||||||
PLA
|
PLA
|
||||||
RTS
|
RTS
|
||||||
|
|
||||||
* Get file info
|
* Get file info
|
||||||
GETINFO JSR MLI
|
GETINFO JSR MLI
|
||||||
DB GINFOCMD
|
DB GINFOCMD
|
||||||
DW GINFOPL
|
DW GINFOPL
|
||||||
RTS
|
RTS
|
||||||
|
|
||||||
* Set file info
|
* Set file info
|
||||||
SETINFO LDA #$07 ; SET_FILE_INFO 7 parms
|
SETINFO LDA #$07 ; SET_FILE_INFO 7 parms
|
||||||
STA GINFOPL
|
STA GINFOPL
|
||||||
JSR MLI
|
JSR MLI
|
||||||
DB SINFOCMD
|
DB SINFOCMD
|
||||||
DW GINFOPL ; Re-use PL from GFI
|
DW GINFOPL ; Re-use PL from GFI
|
||||||
LDA #$0A ; GET_FILE_INFO 10 parms
|
LDA #$0A ; GET_FILE_INFO 10 parms
|
||||||
STA GINFOPL
|
STA GINFOPL
|
||||||
RTS
|
RTS
|
||||||
|
|
||||||
* Create disk file
|
* Create disk file
|
||||||
* Uses filename in MOSFILE
|
* Uses filename in MOSFILE
|
||||||
CRTFILE JSR MLI ; GET_TIME
|
CRTFILE JSR MLI ; GET_TIME
|
||||||
DB GTIMECMD
|
DB GTIMECMD
|
||||||
LDA #<MOSFILE
|
LDA #<MOSFILE
|
||||||
STA CREATEPL+1
|
STA CREATEPL+1
|
||||||
LDA #>MOSFILE
|
LDA #>MOSFILE
|
||||||
STA CREATEPL+2
|
STA CREATEPL+2
|
||||||
LDA #$C3 ; Open permissions
|
LDA #$C3 ; Open permissions
|
||||||
STA CREATEPL+3
|
STA CREATEPL+3
|
||||||
LDA $BF90 ; Current date
|
LDA $BF90 ; Current date
|
||||||
STA CREATEPL+8
|
STA CREATEPL+8
|
||||||
LDA $BF91
|
LDA $BF91
|
||||||
STA CREATEPL+9
|
STA CREATEPL+9
|
||||||
LDA $BF92 ; Current time
|
LDA $BF92 ; Current time
|
||||||
STA CREATEPL+10
|
STA CREATEPL+10
|
||||||
LDA $BF93
|
LDA $BF93
|
||||||
STA CREATEPL+11
|
STA CREATEPL+11
|
||||||
JSR MLI
|
JSR MLI
|
||||||
DB CREATCMD
|
DB CREATCMD
|
||||||
DW CREATEPL
|
DW CREATEPL
|
||||||
RTS
|
RTS
|
||||||
|
|
||||||
* Open disk file
|
* Open disk file
|
||||||
OPENMOSFILE LDA #<MOSFILE ; Open filename in MOSFILE
|
OPENMOSFILE LDA #<MOSFILE ; Open filename in MOSFILE
|
||||||
STA OPENPL+1
|
STA OPENPL+1
|
||||||
LDA #>MOSFILE
|
LDA #>MOSFILE
|
||||||
STA OPENPL+2
|
STA OPENPL+2
|
||||||
OPENFILE JSR MLI
|
OPENFILE JSR MLI
|
||||||
DB OPENCMD
|
DB OPENCMD
|
||||||
DW OPENPL
|
DW OPENPL
|
||||||
RTS
|
RTS
|
||||||
|
|
||||||
* Close disk file
|
* Close disk file
|
||||||
CLSFILE JSR MLI
|
CLSFILE JSR MLI
|
||||||
DB CLSCMD
|
DB CLSCMD
|
||||||
DW CLSPL
|
DW CLSPL
|
||||||
RTS
|
RTS
|
||||||
|
|
||||||
* Read 512 bytes into BLKBUF
|
* Read 512 bytes into BLKBUF
|
||||||
RDFILE JSR MLI
|
RDFILE JSR MLI
|
||||||
DB READCMD
|
DB READCMD
|
||||||
DW READPL
|
DW READPL
|
||||||
RTS
|
RTS
|
||||||
|
|
||||||
* Write data in BLKBUF to disk
|
* Write data in BLKBUF to disk
|
||||||
WRTFILE JSR MLI
|
WRTFILE JSR MLI
|
||||||
DB WRITECMD
|
DB WRITECMD
|
||||||
DW WRITEPL
|
DW WRITEPL
|
||||||
RTS
|
RTS
|
||||||
|
|
||||||
* Put ProDOS prefix in PREFIX
|
* Put ProDOS prefix in PREFIX
|
||||||
GETPREF JSR MLI
|
GETPREF JSR MLI
|
||||||
DB GPFXCMD
|
DB GPFXCMD
|
||||||
DW GPFXPL
|
DW GPFXPL
|
||||||
RTS
|
RTS
|
||||||
|
|
||||||
* Map of file reference numbers to IOBUF1..4
|
* Map of file reference numbers to IOBUF1..4
|
||||||
FILEREFS DB $00,$00,$00,$00
|
FILEREFS DB $00,$00,$00,$00
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
|
@ -313,6 +313,8 @@ PREFIX DS 65 ; Buffer for ProDOS prefix
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
1822
mainmem.svc.s
1822
mainmem.svc.s
File diff suppressed because it is too large
Load Diff
|
@ -407,6 +407,8 @@ MATCHBUF DS 65 ; For storing match results (Pascal str)
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue
Block a user