Updated disk image. Builds in Merlin-16 again.

This commit is contained in:
Bobbi Webber-Manners 2021-10-24 20:38:32 -04:00
parent d4cea3ba9c
commit 8e5ca206f5
21 changed files with 1591 additions and 1554 deletions

Binary file not shown.

View File

@ -229,6 +229,8 @@ MAINZP MAC

View File

@ -495,6 +495,8 @@ OSBM2 ASC ').'

View File

@ -467,6 +467,8 @@ BYTE76 LDX #$00 ; Update LEDs and return X=SHIFT

View File

@ -327,3 +327,5 @@ RELCOORD CLC

View File

@ -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

View File

@ -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

View File

@ -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

View File

@ -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

View File

@ -520,6 +520,8 @@ ECHOLP1 JSR GSREAD

View File

@ -1004,3 +1004,5 @@ VDU01 RTS

View File

@ -85,6 +85,8 @@ GEOFCMD EQU $D1

View File

@ -227,3 +227,5 @@ MHGRTAB DW $2000,$2080,$2100,$2180,$2200,$2280,$2300,$2380

View File

@ -131,6 +131,8 @@ RESET TSX

View File

@ -173,3 +173,5 @@ LOADCODE PHP ; Save carry flag

View File

@ -127,6 +127,8 @@ QUITPL HEX 04 ; Number of parameters

View File

@ -99,3 +99,5 @@ MSG8 ASC " 8. Everything! (8 ROMs)"
USERSEL DB $00 USERSEL DB $00

View File

@ -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

View File

@ -313,6 +313,8 @@ PREFIX DS 65 ; Buffer for ProDOS prefix

File diff suppressed because it is too large Load Diff

View File

@ -407,6 +407,8 @@ MATCHBUF DS 65 ; For storing match results (Pascal str)