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
PHY
PHA
CMP #$00 ; A=$00 = close
CMP #$00 ; A=$00 = close
BEQ :CLOSE
PHA
JSR PARSNAME ; Copy filename->MOSFILE
PLA ; Recover options
JSR PARSNAME ; Copy filename->MOSFILE
PLA ; Recover options
>>> XF2MAIN,OFILE
:CLOSE
* >>> WRTMAIN
* STY MOSFILE ; Write file number
* >>> WRTAUX
>>> XF2MAIN,CFILE ; Pass A,Y to main code
>>> XF2MAIN,CFILE ; Pass A,Y to main code
OSFINDRET >>> ENTAUX
JSR CHKERROR ; Check if error returned
PLY ; Value of A on entry
BNE :S1 ; It wasn't close
TYA ; Preserve A for close
JSR CHKERROR ; Check if error returned
PLY ; Value of A on entry
BNE :S1 ; It wasn't close
TYA ; Preserve A for close
:S1 PLY
PLX
RTS
@ -65,14 +65,14 @@ OSGBPBM ASC 'OSGBPB.'
* OSBPUT - write one byte to an open file
BPUTHND PHX
PHY
PHA ; Stash char to write
PHA ; Stash char to write
* >>> WRTMAIN
* STY MOSFILE ; File reference number
* >>> WRTAUX
>>> XF2MAIN,FILEPUT ; Pass A,Y to main code
>>> XF2MAIN,FILEPUT ; Pass A,Y to main code
OSBPUTRET >>> ENTAUX
JSR CHKERROR
CLC ; Means no error
CLC ; Means no error
PLA
PLY
PLX
@ -84,13 +84,13 @@ BGETHND PHX
* >>> WRTMAIN
* STY MOSFILE ; File ref number
* >>> WRTAUX
>>> XF2MAIN,FILEGET ; Pass A,Y to main code
>>> XF2MAIN,FILEGET ; Pass A,Y to main code
OSBGETRET >>> ENTAUX
CPY #$01
BCC :EXIT ; If no error, return CC
BCC :EXIT ; If no error, return CC
LDA #$FE
CPY #$4C
BEQ :EXIT ; If at EOF, return CS
BEQ :EXIT ; If at EOF, return CS
TYA
JSR CHKERROR
:EXIT PLY
@ -120,15 +120,15 @@ ARGSHND PHX
PHA
CPY #$00
BNE :HASFILE
CMP #$00 ; Y=0,A=0 => current file sys
CMP #$00 ; Y=0,A=0 => current file sys
BNE :S1
PLA
LDA #105 ; 105=AppleFS filing system
LDA #105 ; 105=AppleFS filing system
PLY
PLX
RTS
:S1 CMP #$01 ; Y=0,A=1 => addr of CLI
:S1 CMP #$01 ; Y=0,A=1 => addr of CLI
BNE :S2
LDA FSCMDLINE+0
STA $00,X
@ -137,33 +137,33 @@ ARGSHND PHX
LDA #$FF
STA $02,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
* >>> WRTMAIN
* STZ MOSFILE ; Zero means flush all
* >>> WRTAUX
JMP :FLUSH
:IEXIT JMP :EXIT ; Exit preserved
:IEXIT JMP :EXIT ; Exit preserved
:HASFILE
* >>> WRTMAIN
* STY MOSFILE ; File ref num
* STX MOSFILE+1 ; Pointer to ZP control block
* >>> WRTAUX
CMP #$00 ; Y!=0,A=0 => read seq ptr
CMP #$00 ; Y!=0,A=0 => read seq ptr
BNE :S3
* >>> WRTMAIN
* STZ MOSFILE+2 ; 0 means get pos
* >>> WRTAUX
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
>>> WRTMAIN
STY GMARKPL+1 ; Write to MLI control block
STY GMARKPL+1 ; Write to MLI control block
LDA $00,X
STA GMARKPL+2
LDA $01,X
@ -171,21 +171,21 @@ ARGSHND PHX
LDA $02,X
STA GMARKPL+4
>>> 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
* >>> WRTMAIN
* STA MOSFILE+2 ; Non-zero means get len
* >>> WRTAUX
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
:FLUSH >>> XF2MAIN,FLUSH
:EXIT PLA ; Unimplemented
:EXIT PLA ; Unimplemented
PLY
PLX
RTS
@ -193,7 +193,7 @@ ARGSHND PHX
OSARGSRET >>> ENTAUX
JSR CHKERROR
OSARGSDONE PLA
LDA #0 ; Implemented
LDA #0 ; Implemented
PLY
PLX
RTS
@ -208,8 +208,8 @@ OSARGSDONE PLA
* A=2 directory found
* XY preserved
* control block updated
OSFILEMIN EQU $FF ; $FF=LOAD
OSFILEMAX EQU $08 ; $08=MKDIR
OSFILEMIN EQU $FF ; $FF=LOAD
OSFILEMAX EQU $08 ; $08=MKDIR
FILEHND PHX
PHY
@ -219,23 +219,23 @@ FILEHND PHX
CMP #OSFILEMAX+257-OSFILEMIN ; NB: LTR evaluation
BCS FILEIGNORE
STX FSCTRL+0 ; FSCTRL=>control block
STX FSCTRL+0 ; FSCTRL=>control block
STY FSCTRL+1
LDA (FSCTRL) ; XY=>filename
LDA (FSCTRL) ; XY=>filename
TAX
LDY #$01
LDA (FSCTRL),Y
TAY
JSR PARSNAME ; Copy filename->MOSFILE
JSR PARSNAME ; Copy filename->MOSFILE
LDY #$11
>>> WRTMAIN
:L1 LDA (FSCTRL),Y ; Copy control block to auxmem
:L1 LDA (FSCTRL),Y ; Copy control block to auxmem
STA FILEBLK,Y
DEY
BPL :L1
>>> WRTAUX
PLA ; Get action back
PLA ; Get action back
>>> XF2MAIN,CALLFILE
* BEQ :SAVE ; A=00 -> SAVE
@ -260,18 +260,18 @@ FILEHND PHX
* On return here, A<$20 return to caller, A>$1F ProDOS error
OSFILERET >>> ENTAUX
JSR CHKERROR ; Check if error returned
JSR CHKERROR ; Check if error returned
PHA
LDY #$11 ; Copy updated control block back
LDY #$11 ; Copy updated control block back
:L3
* 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
DEY
BPL :L3
FILEIGNORE PLA ; Returned object type
PLY ; No error, return to caller
FILEIGNORE PLA ; Returned object type
PLY ; No error, return to caller
PLX
RTS
@ -286,34 +286,34 @@ OSFSCM ASC 'OSFSC.'
*
FSCCOMMAND ASC 'CHDIR'
DB $C0
DW FSCCHDIR-1 ; Change directory, XY=>params
DW FSCCHDIR-1 ; Change directory, XY=>params
ASC 'CD'
DB $C0
DW FSCCHDIR-1 ; Change directory, XY=>params
DW FSCCHDIR-1 ; Change directory, XY=>params
ASC 'DIR'
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
ASC 'DRIVE'
DB $80
DW FSCDRIVE-1 ; Select drive, LPTR=>params
DW FSCDRIVE-1 ; Select drive, LPTR=>params
ASC 'FREE'
DB $80
DW FSCFREE-1 ; FREE <drive>, LPTR=>params
DW FSCFREE-1 ; FREE <drive>, LPTR=>params
ASC 'ACCESS'
DB $80
DW FSCACCESS-1 ; ACCESS <objlist> <access>, LPTR=>params
DW FSCACCESS-1 ; ACCESS <objlist> <access>, LPTR=>params
ASC 'TITLE'
DB $80
DW FSCTITLE-1 ; TITLE (<drive>) <title>, LPTR=>params
DW FSCTITLE-1 ; TITLE (<drive>) <title>, LPTR=>params
ASC 'DESTROY'
DB $80
DW FSCDESTROY-1 ; DESTROY <objlist>, LPTR=>params
DW FSCDESTROY-1 ; DESTROY <objlist>, LPTR=>params
ASC 'COPY'
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
@ -326,26 +326,26 @@ FSCCOMMAND ASC 'CHDIR'
*
FSCHND
CMP #$00
BEQ FSOPT ; A=0 - *OPT
BEQ FSOPT ; A=0 - *OPT
CMP #$01
BEQ CHKEOF ; A=1 - Read EOF
BEQ CHKEOF ; A=1 - Read EOF
CMP #$02
BEQ FSCRUN ; A=2 - */filename
BEQ FSCRUN ; A=2 - */filename
CMP #$03
BEQ FSC03 ; A=3 - *command
BEQ FSC03 ; A=3 - *command
CMP #$04
BEQ FSCRUN ; A=4 - *RUN
BEQ FSCRUN ; A=4 - *RUN
CMP #$05
BEQ JMPCAT ; A=5 - *CAT
BEQ JMPCAT ; A=5 - *CAT
CMP #$09
BEQ JMPCAT ; A=9 - *EX
BEQ JMPCAT ; A=9 - *EX
CMP #$0A
BEQ JMPCAT ; A=10 - *INFO
BEQ JMPCAT ; A=10 - *INFO
CMP #$0C
BEQ FSCREN ; A=12 - *RENAME
BEQ FSCREN ; A=12 - *RENAME
* Performs OSFSC *OPT function
FSOPT RTS ; No FS options for now
FSOPT RTS ; No FS options for now
FSCDRIVE JMP DRIVE
@ -373,29 +373,29 @@ FSC03 JSR XYtoLPTR
BEQ FSCNULL
JSR LPTRtoXY
*
FSCRUN STX OSFILECB ; Pointer to filename
FSCRUN STX OSFILECB ; Pointer to filename
STY OSFILECB+1
JSR XYtoLPTR
FSCRUNLP LDA (OSLPTR),Y ; Look for command line
FSCRUNLP LDA (OSLPTR),Y ; Look for command line
INY
CMP #'!'
BCS FSCRUNLP
DEY
JSR SKIPSPC
JSR LPTRtoXY
STX FSCMDLINE+0 ; Set CMDLINE=>command line
STY FSCMDLINE+1 ; Collected by OSARGS 1,0
LDA #$FF ; OSFILE load flag
STA OSFILECB+6 ; Use file's address
LDX #<OSFILECB ; Pointer to control block
STX FSCMDLINE+0 ; Set CMDLINE=>command line
STY FSCMDLINE+1 ; Collected by OSARGS 1,0
LDA #$FF ; OSFILE load flag
STA OSFILECB+6 ; Use file's address
LDX #<OSFILECB ; Pointer to control block
LDY #>OSFILECB
JSR OSFILE
JSR :CALL
LDA #$00 ; A=0 on return
LDA #$00 ; A=0 on return
RTS
:CALL LDA #$01 ; A=1 - entering code
SEC ; Not from RESET
JMP (OSFILECB+6) ; Jump to EXEC addr
:CALL LDA #$01 ; A=1 - entering code
SEC ; Not from RESET
JMP (OSFILECB+6) ; Jump to EXEC addr
FSCREN JMP RENAME
@ -407,11 +407,11 @@ CHKEOF
* >>> WRTMAIN
* STX MOSFILE ; File reference number
* >>> WRTAUX
TXA ; A=channel
TXA ; A=channel
>>> XF2MAIN,FILEEOF
CHKEOFRET >>> ENTAUX
TAX ; Return code -> X
TYA ; Y=any ProDOS error
TAX ; Return code -> X
TYA ; Y=any ProDOS error
JMP CHKERROR
@ -419,28 +419,28 @@ CHKEOFRET >>> ENTAUX
* A=5 *CAT, A=9 *EX, A=10 *INFO
FSCCAT EOR #$06
CLC
ROR A ; 01100000=*CAT
ROR A ; 11100000=*EX
ROR A ; 10000000=*INFO
ROR A ; b7=long info
STA FSAREG ; b6=multiple items
JSR PARSNAME ; Copy filename->MOSFILE
LDA FSAREG ; Get ARG back
ROR A ; 01100000=*CAT
ROR A ; 11100000=*EX
ROR A ; 10000000=*INFO
ROR A ; b7=long info
STA FSAREG ; b6=multiple items
JSR PARSNAME ; Copy filename->MOSFILE
LDA FSAREG ; Get ARG back
>>> XF2MAIN,CATALOG
STARCATRET >>> ENTAUX
JSR CHKERROR ; See if error occurred
JSR CHKERROR ; See if error occurred
JSR FORCENL
* CATDONE
LDA #0 ; 0=OK
LDA #0 ; 0=OK
RTS
* Print one block of a catalog. Called by CATALOG
* Block is in AUXBLK
PRONEBLK >>> ENTAUX
LDA AUXBLK+4 ; Get storage type
AND #$E0 ; Mask 3 MSBs
LDA AUXBLK+4 ; Get storage type
AND #$E0 ; Mask 3 MSBs
CMP #$E0
BNE :NOTKEY ; Not a key block
BNE :NOTKEY ; Not a key block
LDA #<:DIRM
LDY #>:DIRM
JSR PRSTR
@ -454,7 +454,7 @@ PRONEBLK >>> ENTAUX
JSR OSNEWL
:L1X PLA
INC
CMP #13 ; Number of dirents in block
CMP #13 ; Number of dirents in block
CLC
BNE :L1
>>> XF2MAIN,CATALOGRET
@ -465,14 +465,14 @@ PRONEBLK >>> ENTAUX
* On entry: A = dirent index in AUXBLK
PRONEENT PHP
TAX
LDA #<AUXBLK+4 ; Skip pointers
LDA #<AUXBLK+4 ; Skip pointers
STA ZP3
LDA #>AUXBLK+4
STA ZP3+1
:L1 CPX #$00
BEQ :S1
CLC
LDA #$27 ; Size of dirent
LDA #$27 ; Size of dirent
ADC ZP3
STA ZP3
LDA #$00
@ -482,8 +482,8 @@ PRONEENT PHP
BRA :L1
:S1 LDY #$00
LDA (ZP3),Y
BEQ :EXIT1 ; Inactive entry
AND #$0F ; Len of filename
BEQ :EXIT1 ; Inactive entry
AND #$0F ; Len of filename
TAX
LDY #$01
:L2 CPX #$00
@ -566,11 +566,11 @@ PRSPACE LDA #' '
* Perform FSCV $0C RENAME function
* Parameter string in XY
RENAME JSR PARSNAME ; Copy Arg1->MOSFILE
CMP #$00 ; Length of arg1
RENAME JSR PARSNAME ; Copy Arg1->MOSFILE
CMP #$00 ; Length of arg1
BEQ :SYNTAX
JSR PARSLPTR2 ; Copy Arg2->MOSFILE2
CMP #$00 ; Length of arg2
JSR PARSLPTR2 ; Copy Arg2->MOSFILE2
CMP #$00 ; Length of arg2
BEQ :SYNTAX
>>> XF2MAIN,RENFILE
:SYNTAX BRK
@ -585,11 +585,11 @@ RENRET
* Perform *COPY function
* Parameter string in XY
COPY JSR PARSNAME ; Copy Arg1->MOSFILE
CMP #$00 ; Length of arg1
COPY JSR PARSNAME ; Copy Arg1->MOSFILE
CMP #$00 ; Length of arg1
BEQ :SYNTAX
JSR PARSLPTR2 ; Copy Arg2->MOSFILE2
CMP #$00 ; Length of arg2
JSR PARSLPTR2 ; Copy Arg2->MOSFILE2
CMP #$00 ; Length of arg2
BEQ :SYNTAX
>>> XF2MAIN,COPYFILE
:SYNTAX BRK
@ -604,8 +604,8 @@ COPYRET
* Handle *DIR (directory change) command
* On entry, XY points to command line
CHDIR JSR PARSNAME ; Copy filename->MOSFILE
CMP #$00 ; Filename length
CHDIR JSR PARSNAME ; Copy filename->MOSFILE
CMP #$00 ; Filename length
BNE :HASPARM
BRK
DB $DC
@ -615,11 +615,11 @@ CHDIR JSR PARSNAME ; Copy filename->MOSFILE
* Handle *DRIVE command, which is similar
* On entry, (OSLPTR),Y points to command line
DRIVE LDA (OSLPTR),Y ; First char
CMP #$3A ; Colon
DRIVE LDA (OSLPTR),Y ; First char
CMP #$3A ; Colon
BNE :ERR
JSR PARSLPTR ; Copy arg->MOSFILE
CMP #$03 ; Check 3 char arg
JSR PARSLPTR ; Copy arg->MOSFILE
CMP #$03 ; Check 3 char arg
BEQ :HASPARM
:ERR BRK
DB $DC
@ -633,17 +633,17 @@ CHDIRRET
CMP #$00
BEQ :EXIT
BRK
DB $CE ; Bad directory
DB $CE ; Bad directory
ASC 'Bad dir'
BRK
:EXIT RTS
* Handle *FREE command
FREE LDA (OSLPTR),Y ; First char
CMP #$3A ; Colon
FREE LDA (OSLPTR),Y ; First char
CMP #$3A ; Colon
BNE :ERR
JSR PARSLPTR ; Copy arg->MOSFILE
CMP #$03 ; Check 3 char arg
JSR PARSLPTR ; Copy arg->MOSFILE
CMP #$03 ; Check 3 char arg
BEQ :HASPARM
:ERR BRK
DB $DC
@ -657,29 +657,29 @@ FREERET
CMP #$00
BEQ :NOERR
BRK
DB $CE ; Bad directory
DB $CE ; Bad directory
ASC 'Bad dir'
BRK
:NOERR SEC
LDA AUXBLK+2 ; LSB of total blks
SBC AUXBLK+0 ; LSB of blocks used
LDA AUXBLK+2 ; LSB of total blks
SBC AUXBLK+0 ; LSB of blocks used
TAX
LDA AUXBLK+3 ; MSB of total blks
SBC AUXBLK+1 ; MSB of blocks used
LDA AUXBLK+3 ; MSB of total blks
SBC AUXBLK+1 ; MSB of blocks used
TAY
LDA #$00 ; *TO DO* b16-b23 of free
LDA #$00 ; *TO DO* b16-b23 of free
* NEW
JSR :FREEDEC ; Print 'AAYYXX blocks aaayyyxxx bytes '
JSR :FREEDEC ; Print 'AAYYXX blocks aaayyyxxx bytes '
LDX #<:FREE
LDY #>:FREE
JSR OUTSTR ; Print 'free'<nl>
LDX AUXBLK+0 ; Blocks used
JSR OUTSTR ; Print 'free'<nl>
LDX AUXBLK+0 ; Blocks used
LDY AUXBLK+1
LDA #$00 ; *TO DO* b16-b23 of used
JSR :FREEDEC ; Print 'AAYYXX blocks aaayyyxxx bytes '
LDA #$00 ; *TO DO* b16-b23 of used
JSR :FREEDEC ; Print 'AAYYXX blocks aaayyyxxx bytes '
LDX #<:USED
LDY #>:USED
JMP OUTSTR ; Print 'used'<nl>
JMP OUTSTR ; Print 'used'<nl>
* OLD
* JSR PRDECXY ; Print in decimal
@ -702,20 +702,20 @@ FREERET
STA FSNUM+3
* What's the maximum number of blocks?
* JSR PRHEX ; Blocks b16-b23 in hex
JSR PR2HEX ; Blocks b0-b15 in hex
JSR PR2HEX ; Blocks b0-b15 in hex
LDX #<:BLOCKS
LDY #>:BLOCKS
JSR OUTSTR ; ' blocks '
STZ FSNUM+0 ; FSNUM=blocks*512
JSR OUTSTR ; ' blocks '
STZ FSNUM+0 ; FSNUM=blocks*512
ASL FSNUM+1
ROL FSNUM+2
ROL FSNUM+3
LDX #FSNUM ; X=>number to print
LDY #8 ; Y=pad up to 8 digits
JSR PRINTDEC ; Print it in decimal
LDX #FSNUM ; X=>number to print
LDY #8 ; Y=pad up to 8 digits
JSR PRINTDEC ; Print it in decimal
LDX #<:BYTES
LDY #>:BYTES
JMP OUTSTR ; ' bytes '
JMP OUTSTR ; ' bytes '
:BLOCKS ASC ' blocks '
DB 0
:BYTES ASC ' bytes '
@ -731,10 +731,10 @@ FREERET
*:USEDM ASC ' 512-byte Blocks Used'
* DB $00
ACCESS JSR PARSLPTR ; Copy filename->MOSFILE
CMP #$00 ; Filename length
ACCESS JSR PARSLPTR ; Copy filename->MOSFILE
CMP #$00 ; Filename length
BEQ :SYNTAX
JSR PARSLPTR2 ; Copy Arg2->MOSFILE2
JSR PARSLPTR2 ; Copy Arg2->MOSFILE2
>>> XF2MAIN,SETPERM
:SYNTAX BRK
DB $DC
@ -746,8 +746,8 @@ ACCRET >>> ENTAUX
LDA #$00
RTS
DESTROY JSR PARSLPTR ; Copy filename->MOSFILE
CMP #$00 ; Filename length
DESTROY JSR PARSLPTR ; Copy filename->MOSFILE
CMP #$00 ; Filename length
BEQ :SYNTAX
>>> XF2MAIN,MULTIDEL
:SYNTAX BRK
@ -764,46 +764,46 @@ DESTRET >>> ENTAUX
* Write filename to MOSFILE in main memory
* Returns length in A
PARSNAME JSR XYtoLPTR
PARSLPTR CLC ; Means parsing a filename
JSR GSINIT ; Init gen string handling
PARSLPTR CLC ; Means parsing a filename
JSR GSINIT ; Init gen string handling
PHP
SEI ; Disable IRQs
LDX #$00 ; Length
:L1 JSR GSREAD ; Handle next char
SEI ; Disable IRQs
LDX #$00 ; Length
:L1 JSR GSREAD ; Handle next char
BCS :DONE
STA $C004 ; Write to main mem
STA $C004 ; Write to main mem
STA MOSFILE+1,X
STA $C005 ; Write to aux mem
STA $C005 ; Write to aux mem
INX
BNE :L1
:DONE STA $C004 ; Write to main mem
STX MOSFILE ; Length byte (Pascal)
STA $C005 ; Back to aux
PLP ; IRQs back as they were
TXA ; Return len in A
:DONE STA $C004 ; Write to main mem
STX MOSFILE ; Length byte (Pascal)
STA $C005 ; Back to aux
PLP ; IRQs back as they were
TXA ; Return len in A
RTS
* Parse filename pointed to by (OSLPTR),Y
* Write filename to MOSFILE2 in main memory
* Returns length in A
PARSNAME2 JSR XYtoLPTR
PARSLPTR2 CLC ; Means parsing a filename
JSR GSINIT ; Init gen string handling
PARSLPTR2 CLC ; Means parsing a filename
JSR GSINIT ; Init gen string handling
PHP
SEI ; Disable IRQs
LDX #$00 ; Length
:L1 JSR GSREAD ; Handle next char
SEI ; Disable IRQs
LDX #$00 ; Length
:L1 JSR GSREAD ; Handle next char
BCS :DONE
STA $C004 ; Write to main mem
STA $C004 ; Write to main mem
STA MOSFILE2+1,X
STA $C005 ; Write to aux mem
STA $C005 ; Write to aux mem
INX
BNE :L1
:DONE STA $C004 ; Write to main mem
STX MOSFILE2 ; Length byte (Pascal)
STA $C005 ; Back to aux
PLP ; IRQs back as they were
TXA ; Return len in A
:DONE STA $C004 ; Write to main mem
STX MOSFILE2 ; Length byte (Pascal)
STA $C005 ; Back to aux
PLP ; IRQs back as they were
TXA ; Return len in A
RTS
* Move this somewhere
@ -812,11 +812,11 @@ CHKERROR CMP #$20
RTS
*ERREXISTS LDA #$47 ; File exists
ERRNOTFND LDA #$46 ; File not found
ERRNOTFND LDA #$46 ; File not found
MKERROR
BIT $E0
BPL MKERROR1 ; *TEST*
BPL MKERROR1 ; *TEST*
PHA
LDX #15
MKERRLP
@ -852,13 +852,13 @@ ERRMSG
MKERROR1
CMP #$40
BCS MKERROR2
ORA #$30 ; <$40 -> $30-$3F
ORA #$30 ; <$40 -> $30-$3F
MKERROR2
SEC
SBC #$37
CMP #$28
BCC MKERROR3
LDA #$00 ; I/O error
LDA #$00 ; I/O error
MKERROR3
ASL A
TAX
@ -922,67 +922,68 @@ MKERROR4 DW ERROR27
* AcornOS ProDOS
ERROR40 DW $CC00
ASC 'Bad filename' ; $40 - Invalid pathname syntax
ASC 'Bad filename' ; $40 - Invalid pathname syntax
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
ASC 'Too many open' ; $42 - File Control Block table full
ASC 'Too many open' ; $42 - File Control Block table full
ERROR43 DW $DE00
ASC 'Channel not open' ; $43 - Invalid reference number
ERROR44 ; $44 - Path not found
ASC 'Channel not open' ; $43 - Invalid reference number
ERROR44 ; $44 - Path not found
ERROR46 DW $D600
ASC 'File not found' ; $46 - File not found
ASC 'File not found' ; $46 - File not found
ERROR45 DW $D600
ASC 'Disk not found' ; $45 - Volume directory not found
ASC 'Disk not found' ; $45 - Volume directory not found
ERROR47 DW $C400
ASC 'File exists' ; $47 - Duplicate filename (see also $41)
ASC 'File exists' ; $47 - Duplicate filename (see also $41)
ERROR48 DW $C600
ASC 'Disk full' ; $48 - Overrun error
ASC 'Disk full' ; $48 - Overrun error
ERROR49 DW $B300
ASC 'Directory full' ; $49 - Volume directory full
ERROR4A ; $4A - Incompatible file format
ERROR4B ; $4B - Unsupported storage_type
ASC 'Directory full' ; $49 - Volume directory full
ERROR4A ; $4A - Incompatible file format
ERROR4B ; $4B - Unsupported storage_type
ERROR52 DW $C800
ASC 'Disk not recognised' ; $52 - Not a ProDOS disk
ASC 'Disk not recognised' ; $52 - Not a ProDOS disk
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
ASC 'Not open for update' ; $4D - Position out of range
ASC 'Not open for update' ; $4D - Position out of range
ERROR4E DW $BD00
ASC 'Insufficient access' ; $4E - Access error (see also $4F)
ASC 'Insufficient access' ; $4E - Access error (see also $4F)
ERROR4F DW $C300
ASC 'Entry locked' ; $4F - Access error (split from $4E)
ASC 'Entry locked' ; $4F - Access error (split from $4E)
ERROR50 DW $C200
ASC 'Can'
DB $27
ASC 't - file open' ; $50 - File is open
ASC 't - file open' ; $50 - File is open
ERROR51 DW $A800
ASC 'Broken directory' ; $51 - Directory count error
ASC 'Broken directory' ; $51 - Directory count error
ERROR53 DW $DC00
ASC 'Invalid parameter' ; $53 - Invalid parameter
ASC 'Invalid parameter' ; $53 - Invalid parameter
ERROR54 DW $D400
ASC 'Directory not empty' ; $54 - Directory not empty
ASC 'Directory not empty' ; $54 - Directory not empty
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
ASC 'ProDOS: Bad addr' ; $56 - Bad buffer address
ASC 'ProDOS: Bad addr' ; $56 - Bad buffer address
ERROR57 DW $FF00
ASC 'ProDOS: Dup volm' ; $57 - Duplicate volume
ERROR5B ; spare
ASC 'ProDOS: Dup volm' ; $57 - Duplicate volume
ERROR5B ; spare
ERROR27 DW $FF00
ASC 'I/O error' ; $27 - I/O error
ASC 'I/O error' ; $27 - I/O error
ERROR28 DW $D200
ASC 'Disk not present' ; $28 - No device detected/connected
ASC 'Disk not present' ; $28 - No device detected/connected
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
ASC 'Disk write protected'; $2B - Disk write protected
ASC 'Disk write protected' ; $2B - Disk write protected
ERROR5D DW $CA00
ASC 'Data lost' ; $5D - EOF during LOAD or SAVE
ASC 'Data lost' ; $5D - EOF during LOAD or SAVE
ERROR5E DW $C000
ASC 'Can'
DB $27
ASC 't save' ; $5E - Couldn't open for save
ASC 't save' ; $5E - Couldn't open for save
ERROR2E DW $C800
ASC 'Disk changed' ; $2E - Disk switched
ASC 'Disk changed' ; $2E - Disk switched
DB $00

View File

@ -138,8 +138,8 @@ MOSHIGH SEI
* X=ROM number to select
*
BYTE8E PHP ; Save CLC=RESET, SEC=Not RESET
JSR ROMSELECT ; Bring ROM X into memory
STX BYTEVARBASE+$FC ; Set current language ROM
JSR ROMSELECT ; Bring ROM X into memory
STX BYTEVARBASE+$FC ; Set current language ROM
LDA #$00
STA FAULT+0
LDA #$80
@ -156,27 +156,27 @@ BYTE8E PHP ; Save CLC=RESET, SEC=Not RESET
* OSBYTE $8F - Issue service call
* X=service call, Y=parameter
*
SERVICE TAX ; Enter here with A=Service Num
SERVICE TAX ; Enter here with A=Service Num
BYTE8F
SERVICEX LDA $F4
PHA ; Save current ROM
PHA ; Save current ROM
TXA
LDX MAXROM ; Start at highest ROM
:SERVLP JSR ROMSELECT ; Bring it into memory
LDX MAXROM ; Start at highest ROM
:SERVLP JSR ROMSELECT ; Bring it into memory
BIT $8006
BPL :SERVSKIP ; No service entry
JSR $8003 ; Call service entry
BPL :SERVSKIP ; No service entry
JSR $8003 ; Call service entry
TAX
BEQ :SERVDONE
:SERVSKIP LDX $F4 ; Restore X=current ROM
DEX ; Step down to next
BPL :SERVLP ; Loop until ROM 0 done
:SERVDONE PLA ; Get caller's ROM back
PHX ; Save return from service call
:SERVSKIP LDX $F4 ; Restore X=current ROM
DEX ; Step down to next
BPL :SERVLP ; Loop until ROM 0 done
:SERVDONE PLA ; Get caller's ROM back
PHX ; Save return from service call
TAX
JSR ROMSELECT ; Restore caller's ROM
PLX ; Get return value back
TXA ; Return in A and X and set EQ/NE
JSR ROMSELECT ; Restore caller's ROM
PLX ; Get return value back
TXA ; Return in A and X and set EQ/NE
RTS
@ -195,3 +195,5 @@ HELLO ASC 'Applecorn MOS 2021-10-24'
DB $00 ; Unify MOS messages

View File

@ -11,28 +11,28 @@
************************************
* Read input device or buffer status
BYTE80 LDY #$00 ; Prepare return=&00xx
TXA ; X<0 - info about buffers
BMI ADVALBUF ; X>=0 - read input devices
BYTE80 LDY #$00 ; Prepare return=&00xx
TXA ; X<0 - info about buffers
BMI ADVALBUF ; X>=0 - read input devices
CPX #$7F
BNE ADVALNONE
ADVALWAIT JSR KBDREAD
BCS ADVALWAIT
TAX
BPL ADVALOK1 ; &00xx for normal keys
INY ; &01xx for function/edit keys
BPL ADVALOK1 ; &00xx for normal keys
INY ; &01xx for function/edit keys
ADVALOK1 RTS
ADVALNONE LDX #$00 ; Input, just return 0
ADVALNONE LDX #$00 ; Input, just return 0
RTS
ADVALBUF INX
BEQ :ADVALKBD ; Fake keyboard buffer
BEQ :ADVALKBD ; Fake keyboard buffer
INX
BEQ :ADVALOK ; Serial input, return 0
LDX #$01 ; For outputs, return 1 char free
BEQ :ADVALOK ; Serial input, return 0
LDX #$01 ; For outputs, return 1 char free
RTS
:ADVALKBD BIT $C000 ; Test keyboard data/strobe
BPL :ADVALOK ; No Strobe, return 0
INX ; Strobe, return 1
:ADVALKBD BIT $C000 ; Test keyboard data/strobe
BPL :ADVALOK ; No Strobe, return 0
INX ; Strobe, return 1
:ADVALOK RTS
@ -57,21 +57,21 @@ ADVALBUF INX
* (8 * frequency )
* BEEPX EQU #57 ; note=C5
BEEPX EQU #116 ; note=C4
BEEPX EQU #116 ; note=C4
BEEP PHA
PHX
PHY
LDY #$00 ; duration
:L1 LDX #BEEPX ; 2cy pitch 2cy
LDY #$00 ; duration
:L1 LDX #BEEPX ; 2cy pitch 2cy
*------------------------------------------------------
:L2 DEX ; 2cy BEEPX * 2cy
BNE :L2 ; 3cy/2cy (BEEPX-1) * 3cy + 1 * 2cy
:L2 DEX ; 2cy BEEPX * 2cy
BNE :L2 ; 3cy/2cy (BEEPX-1) * 3cy + 1 * 2cy
*------------------------------------------------------
* BEEPX*5-1cy
LDA $C030 ; 4cy BEEPX*5+5
DEY ; 2cy BEEPX*5+7
BNE :L1 ; 3cy/2cy BEEPX*5+10
PLY ;
LDA $C030 ; 4cy BEEPX*5+5
DEY ; 2cy BEEPX*5+7
BNE :L1 ; 3cy/2cy BEEPX*5+10
PLY ;
PLX
PLA
RTS
@ -81,9 +81,9 @@ BEEP PHA
OUTSTR TXA
* Print string pointed to by A,Y to the screen
PRSTR STA OSTEXT+0 ; String in A,Y
PRSTR STA OSTEXT+0 ; String in A,Y
STY OSTEXT+1
:L1 LDA (OSTEXT) ; Ptr to string in OSTEXT
:L1 LDA (OSTEXT) ; Ptr to string in OSTEXT
BEQ PRSTROK
JSR OSASCI
INC OSTEXT
@ -102,7 +102,7 @@ FORCENL LDA #$86
* Print XY in hex
OUT2HEX TYA
JSR OUTHEX
TXA ; Continue into OUTHEX
TXA ; Continue into OUTHEX
* Print hex byte in A
OUTHEX PHA
@ -113,16 +113,16 @@ OUTHEX PHA
AND #$0F
JSR PRNIB
PLA
AND #$0F ; Continue into PRNIB
AND #$0F ; Continue into PRNIB
* Print hex nibble in A
PRNIB CMP #$0A
BCC :S1
CLC ; >= $0A
CLC ; >= $0A
ADC #'A'-$0A
JSR OSWRCH
RTS
:S1 ADC #'0' ; < $0A
:S1 ADC #'0' ; < $0A
JMP OSWRCH
* TEMP ENTRY *
@ -144,35 +144,35 @@ OSPAD EQU OSTEXT+4
* X=>four byte zero page locations
* Y= number of digits to pad to, 0 for no padding
*
PRINTDEC sty OSPAD ; Number of padding+digits
ldy #0 ; Digit counter
PRDECDIGIT lda #32 ; 32-bit divide
PRINTDEC sty OSPAD ; Number of padding+digits
ldy #0 ; Digit counter
PRDECDIGIT lda #32 ; 32-bit divide
sta OSTEMP
lda #0 ; Remainder=0
clv ; V=0 means div result = 0
PRDECDIV10 cmp #10/2 ; Calculate OSNUM/10
lda #0 ; Remainder=0
clv ; V=0 means div result = 0
PRDECDIV10 cmp #10/2 ; Calculate OSNUM/10
bcc PRDEC10
sbc #10/2+$80 ; Remove digit & set V=1 to show div result > 0
sec ; Shift 1 into div result
PRDEC10 rol 0,x ; Shift /10 result into OSNUM
sbc #10/2+$80 ; Remove digit & set V=1 to show div result > 0
sec ; Shift 1 into div result
PRDEC10 rol 0,x ; Shift /10 result into OSNUM
rol 1,x
rol 2,x
rol 3,x
rol a ; Shift bits of input into acc (input mod 10)
rol a ; Shift bits of input into acc (input mod 10)
dec OSTEMP
bne PRDECDIV10 ; Continue 32-bit divide
bne PRDECDIV10 ; Continue 32-bit divide
ora #48
pha ; Push low digit 0-9 to print
pha ; Push low digit 0-9 to print
iny
bvs PRDECDIGIT ; If V=1, result of /10 was > 0 & do next digit
bvs PRDECDIGIT ; If V=1, result of /10 was > 0 & do next digit
lda #32
PRDECLP1 cpy OSPAD
bcs PRDECLP2 ; Enough padding pushed
pha ; Push leading space characters
bcs PRDECLP2 ; Enough padding pushed
pha ; Push leading space characters
iny
bne PRDECLP1
PRDECLP2 pla ; Pop character left to right
jsr OSWRCH ; Print it
PRDECLP2 pla ; Pop character left to right
jsr OSWRCH ; Print it
dey
bne PRDECLP2
rts
@ -193,16 +193,16 @@ PRDECLP2 pla ; Pop character left to right
* Very difficult to write this without it being a direct clone
* from the BBC MOS. ;)
*
GSINTGO ROR GSFLAG ; CY initially into bit 7
JSR SKIPSPC ; Skip any spaces
INY ; Step past in case it's a quote
CMP #$22 ; Is it a quote?
GSINTGO ROR GSFLAG ; CY initially into bit 7
JSR SKIPSPC ; Skip any spaces
INY ; Step past in case it's a quote
CMP #$22 ; Is it a quote?
BEQ GSINTGO1
DEY ; Wasn't a quote, step back
CLC ; Prepare CC=no leading quote
GSINTGO1 ROR GSFLAG ; Rotate 'leading-quote' into flags
DEY ; Wasn't a quote, step back
CLC ; Prepare CC=no leading quote
GSINTGO1 ROR GSFLAG ; Rotate 'leading-quote' into flags
CMP #$0D
RTS ; Return EQ if end of line
RTS ; Return EQ if end of line
* GSFLAG set to:
* bit7: leading quote found
* bit6: CC=filename CS=*KEY
@ -245,13 +245,13 @@ GSINTGO1 ROR GSFLAG ; Rotate 'leading-quote' into flags
* INX:BNE loop
* done
*
GSRDGO LDA #$00 ; Prepare to clear accumulator
GSREADLP STA GSCHAR ; Update accumulator
LDA (OSLPTR),Y ; Get current character
CMP #$0D ; End of line?
BNE GSREAD2 ; No, check character
GSRDGO LDA #$00 ; Prepare to clear accumulator
GSREADLP STA GSCHAR ; Update accumulator
LDA (OSLPTR),Y ; Get current character
CMP #$0D ; End of line?
BNE GSREAD2 ; No, check character
BIT GSFLAG
BPL GSREADEND ; We aren't waiting for a closing quote
BPL GSREADEND ; We aren't waiting for a closing quote
* ; End of line before closing quote
ERRBADSTR BRK
DB $FD
@ -259,54 +259,54 @@ ERRBADSTR BRK
BRK
GSREAD2 CMP #' '
BCC ERRBADSTR ; Embedded control char
BNE GSREAD3 ; Not a space, process it
BIT GSFLAG ; Can space terminate string?
BMI GSREADCHAR ; We're waiting for a terminating quote
BCC ERRBADSTR ; Embedded control char
BNE GSREAD3 ; Not a space, process it
BIT GSFLAG ; Can space terminate string?
BMI GSREADCHAR ; We're waiting for a terminating quote
* ; so return the space character
BVC GSREADEND ; Space is a terminator, finish
GSREAD3 CMP #$22 ; Is it a quote?
BNE GSREADESC ; Not quote, check for escapes
BIT GSFLAG ; Was there an opening quote?
BPL GSREADCHAR ; Not waiting for a closing quote
INY ; Waiting for quote, check next character
BVC GSREADEND ; Space is a terminator, finish
GSREAD3 CMP #$22 ; Is it a quote?
BNE GSREADESC ; Not quote, check for escapes
BIT GSFLAG ; Was there an opening quote?
BPL GSREADCHAR ; Not waiting for a closing quote
INY ; Waiting for quote, check next character
LDA (OSLPTR),Y
CMP #$22 ; Is it another quote?
BEQ GSREADCHAR ; Quote-Quote, expand to single quote
CMP #$22 ; Is it another quote?
BEQ GSREADCHAR ; Quote-Quote, expand to single quote
* End of string
* Either closing quote, or a space seperator, or end of line
GSREADEND JSR SKIPSPC ; Skip any spaces to next word
SEC ; SEC=end of string
RTS ; and (OSLPTR),Y=>next word or end of line
GSREADEND JSR SKIPSPC ; Skip any spaces to next word
SEC ; SEC=end of string
RTS ; and (OSLPTR),Y=>next word or end of line
* CS=end of string
* EQ=end of line
* NE=not end of line, more words follow
GSREADESC CMP #$7C ; Is it '|' escape character
BNE GSREADCHAR ; No, return as character
INY ; Step to next character
GSREADESC CMP #$7C ; Is it '|' escape character
BNE GSREADCHAR ; No, return as character
INY ; Step to next character
LDA (OSLPTR),Y
CMP #$7C
BEQ GSREADCHAR ; bar-bar expands to bar
BEQ GSREADCHAR ; bar-bar expands to bar
CMP #$22
BEQ GSREADCHAR ; bar-quote expands to quote
CMP #'!' ; Is it bar-pling?
BNE GSREAD5 ; No, check for bar-letter
INY ; Step past it
LDA #$80 ; Set bit 7 in accumulator
BNE GSREADLP ; Loop back to check next character(s)
BEQ GSREADCHAR ; bar-quote expands to quote
CMP #'!' ; Is it bar-pling?
BNE GSREAD5 ; No, check for bar-letter
INY ; Step past it
LDA #$80 ; Set bit 7 in accumulator
BNE GSREADLP ; Loop back to check next character(s)
GSREAD5 CMP #'?' ; Check for '?'
BCC ERRBADSTR ; <'?', bad character
BEQ GSREADDEL ; bar-query -> DEL
AND #$1F ; Convert bar-letter to control code
BIT SETV ; SEV=control character
GSREAD5 CMP #'?' ; Check for '?'
BCC ERRBADSTR ; <'?', bad character
BEQ GSREADDEL ; bar-query -> DEL
AND #$1F ; Convert bar-letter to control code
BIT SETV ; SEV=control character
BVS GSREADOK
GSREADDEL LDA #$7F
GSREADCHAR CLV ; CLV=not control character
GSREADOK INY ; Step to next character
ORA GSCHAR ; Add in any bit 7 from |! prefix
CLC ; CLC=not end of string
GSREADCHAR CLV ; CLV=not control character
GSREADOK INY ; Step to next character
ORA GSCHAR ; Add in any bit 7 from |! prefix
CLC ; CLC=not end of string
RTS
* CC=not end of string
* VS=control character
@ -318,16 +318,16 @@ GSREADOK INY ; Step to next character
* On exit, A=byte read, X=current ROM, Y=$00
RDROM LDA $F4
PHA
JSR ROMSELECT ; Page in the required ROM
JSR ROMSELECT ; Page in the required ROM
LDY #$00
LDA ($F6),Y ; Read the byte
LDA ($F6),Y ; Read the byte
PLX
* Select a sideways ROM
* X=ROM to select
* All registers must be preserved
ROMSELECT CPX $F4
BEQ :ROMSELOK ; Already selected
BEQ :ROMSELOK ; Already selected
* Insert code here for faking sideways ROMs by loading or otherwise
* fetching code to $8000. All registers must be preserved.
@ -337,21 +337,21 @@ ROMSELECT CPX $F4
TXA
ASL A
TAX
LDA ROMTAB,X ; LSB of pointer to name
LDA ROMTAB,X ; LSB of pointer to name
STA OSFILECB+0
LDA ROMTAB+1,X ; MSB of pointer to name
LDA ROMTAB+1,X ; MSB of pointer to name
STA OSFILECB+1
STZ OSFILECB+2 ; Dest address $8000
STZ OSFILECB+2 ; Dest address $8000
LDA #$80
STA OSFILECB+3
LDX #<OSFILECB
LDY #>OSFILECB
LDA #$FF ; Means 'LOAD'
LDA #$FF ; Means 'LOAD'
JSR OSFILE
PLY
PLX
PLA
STX $F4 ; Set Current ROM number
STX $F4 ; Set Current ROM number
:ROMSELOK
EVENT RTS
@ -379,14 +379,14 @@ PASCROM1 ASC 'PASC.1.10.1.ROM'
PASCROM2 ASC 'PASC.1.10.2.ROM'
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
INITROMS STZ MAXROM ; One sideways ROM only
STA $C002 ; Read main mem
INITROMS STZ MAXROM ; One sideways ROM only
STA $C002 ; Read main mem
LDA USERSEL
STA $C003 ; Read aux mem
ASL ; x2
STA $C003 ; Read aux mem
ASL ; x2
CLC
ADC #<ROMS
STA OSLPTR+0
@ -399,18 +399,18 @@ INITROMS STZ MAXROM ; One sideways ROM only
INY
LDA (OSLPTR),Y
STA ROMTAB+1
STA $C002 ; Read main mem
STA $C002 ; Read main mem
LDA USERSEL
STA $C003 ; Read aux mem
CMP #6 ; Menu entry 7 has two ROMs
STA $C003 ; Read aux mem
CMP #6 ; Menu entry 7 has two ROMs
BNE :S1
LDA #<PASCROM2
STA ROMTAB+2
LDA #>PASCROM2
STA ROMTAB+3
INC MAXROM ; Two ROMs
INC MAXROM ; Two ROMs
BRA :DONE
:S1 CMP #7 ; Menu entry 8
:S1 CMP #7 ; Menu entry 8
BNE :DONE
LDA #<PASCROM1
STA ROMTAB+0
@ -444,29 +444,29 @@ INITROMS STZ MAXROM ; One sideways ROM only
STA ROMTAB+14
LDA #>BASICROM
STA ROMTAB+15
LDA #7 ; 8 sideways ROMs
LDA #7 ; 8 sideways ROMs
STA MAXROM
:DONE LDA #$FF
STA $F4 ; Force ROM to load
STA $F4 ; Force ROM to load
RTS
* Active sideways ROMs
ROMTAB DW $0000 ; ROM0
DW $0000 ; ROM1
DW $0000 ; ROM2
DW $0000 ; ROM3
DW $0000 ; ROM4
DW $0000 ; ROM5
DW $0000 ; ROM6
DW $0000 ; ROM7
DW $0000 ; ROM8
DW $0000 ; ROM9
DW $0000 ; ROMA
DW $0000 ; ROMB
DW $0000 ; ROMC
DW $0000 ; ROMD
DW $0000 ; ROME
DW $0000 ; ROMF
ROMTAB DW $0000 ; ROM0
DW $0000 ; ROM1
DW $0000 ; ROM2
DW $0000 ; ROM3
DW $0000 ; ROM4
DW $0000 ; ROM5
DW $0000 ; ROM6
DW $0000 ; ROM7
DW $0000 ; ROM8
DW $0000 ; ROM9
DW $0000 ; ROMA
DW $0000 ; ROMB
DW $0000 ; ROMC
DW $0000 ; ROMD
DW $0000 ; ROME
DW $0000 ; ROMF
* ROM filenames in same order as in the menu
* ROMMENU copies these to ROMTAB upon user selection
@ -491,7 +491,7 @@ ROMS DW BASICROM
**********************************************************
* Invoked from GSBRK in main memory. On IIgs only.
GSBRKAUX >>> IENTAUX ; IENTAUX does not do CLI
GSBRKAUX >>> IENTAUX ; IENTAUX does not do CLI
* Continue into IRQBRKHDLR
* TO DO: Check, IENTAUX modifies X
@ -499,43 +499,43 @@ GSBRKAUX >>> IENTAUX ; IENTAUX does not do CLI
IRQBRKHDLR PHA
* Mustn't enable IRQs within the IRQ handler
* Do not use WRTMAIN/WRTAUX macros
STA $C004 ; Write to main memory
STA $45 ; $45=A for ProDOS IRQ handlers
STA $C005 ; Write to aux memory
STA $C004 ; Write to main memory
STA $45 ; $45=A for ProDOS IRQ handlers
STA $C005 ; Write to aux memory
TXA
PHA
CLD
TSX
LDA $103,X ; Get PSW from stack
LDA $103,X ; Get PSW from stack
AND #$10
BEQ :IRQ ; IRQ
BEQ :IRQ ; IRQ
SEC
LDA $0104,X
SBC #$01
STA FAULT+0 ; FAULT=>error block after BRK
STA FAULT+0 ; FAULT=>error block after BRK
LDA $0105,X
SBC #$00
STA FAULT+1
LDA $F4 ; Get current ROM
STA BYTEVARBASE+$BA ; Set ROM at last BRK
STX OSXREG ; Pass stack pointer
LDA #$06 ; Service Call 6 = BRK occured
LDA $F4 ; Get current ROM
STA BYTEVARBASE+$BA ; Set ROM at last BRK
STX OSXREG ; Pass stack pointer
LDA #$06 ; Service Call 6 = BRK occured
JSR SERVICE
LDX BYTEVARBASE+$FC ; Get current language
JSR ROMSELECT ; Bring it into memory
LDX BYTEVARBASE+$FC ; Get current language
JSR ROMSELECT ; Bring it into memory
PLA
TAX
PLA
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
>>> IENTAUX ; IENTAUX does not do CLI
PLA ; TODO: Pass on to IRQ1V
>>> IENTAUX ; IENTAUX does not do CLI
PLA ; TODO: Pass on to IRQ1V
TAX
PLA
NULLRTI RTI
@ -555,7 +555,7 @@ MOSBRKHDLR LDA #<MSGBRK
JSR PRERR
JSR OSNEWL
JSR OSNEWL
STOP JMP STOP ; Cannot return from a BRK
STOP JMP STOP ; Cannot return from a BRK
MSGBRK DB $0D
ASC 'ERROR: '
@ -563,33 +563,33 @@ MSGBRK DB $0D
* Default page 2 contents
DEFVEC DW NULLRTS ; $200 USERV
DW MOSBRKHDLR ; $202 BRKV
DW NULLRTI ; $204 IRQ1V
DW NULLRTI ; $206 IRQ2V
DW CLIHND ; $208 CLIV
DW BYTEHND ; $20A BYTEV
DW WORDHND ; $20C WORDV
DW WRCHHND ; $20E WRCHV
DW RDCHHND ; $210 RDCHV
DW FILEHND ; $212 FILEV
DW ARGSHND ; $214 ARGSV
DW BGETHND ; $216 BGETV
DW BPUTHND ; $218 BPUTV
DW GBPBHND ; $21A GBPBV
DW FINDHND ; $21C FINDV
DW FSCHND ; $21E FSCV
DW NULLRTS ; $220 EVENTV
DW NULLRTS ; $222
DW NULLRTS ; $224
DW NULLRTS ; $226
DW NULLRTS ; $228
DW NULLRTS ; $22A
DW NULLRTS ; $22C
DW NULLRTS ; $22E
DW NULLRTS ; $230 SPARE1V
DW NULLRTS ; $232 SPARE2V
DW NULLRTS ; $234 SPARE3V
DEFVEC DW NULLRTS ; $200 USERV
DW MOSBRKHDLR ; $202 BRKV
DW NULLRTI ; $204 IRQ1V
DW NULLRTI ; $206 IRQ2V
DW CLIHND ; $208 CLIV
DW BYTEHND ; $20A BYTEV
DW WORDHND ; $20C WORDV
DW WRCHHND ; $20E WRCHV
DW RDCHHND ; $210 RDCHV
DW FILEHND ; $212 FILEV
DW ARGSHND ; $214 ARGSV
DW BGETHND ; $216 BGETV
DW BPUTHND ; $218 BPUTV
DW GBPBHND ; $21A GBPBV
DW FINDHND ; $21C FINDV
DW FSCHND ; $21E FSCV
DW NULLRTS ; $220 EVENTV
DW NULLRTS ; $222
DW NULLRTS ; $224
DW NULLRTS ; $226
DW NULLRTS ; $228
DW NULLRTS ; $22A
DW NULLRTS ; $22C
DW NULLRTS ; $22E
DW NULLRTS ; $230 SPARE1V
DW NULLRTS ; $232 SPARE2V
DW NULLRTS ; $234 SPARE3V
ENDVEC
*
@ -605,56 +605,58 @@ MOSAPI EQU $FF95
* OPTIONAL ENTRIES
* ----------------
OSSERV JMP SERVICE ; FF95 OSSERV
OSCOLD JMP NULLRTS ; FF98 OSCOLD
OSPRSTR JMP OUTSTR ; FF9B OSPRSTR
OSSCANDEC JMP SCANDEC ; FF9E SCANDEC
OSSCANHEX JMP SCANHEX ; FFA1 SCANHEX
OSFFA4 JMP NULLRTS ; FFA4 (DISKACC)
OSFFA7 JMP NULLRTS ; FFA7 (DISKCCP)
PRHEX JMP OUTHEX ; FFAA PRHEX
PR2HEX JMP OUT2HEX ; FFAD PR2HEX
OSFFB0 JMP PRINTDEC ; FFB0 (USERINT)
OSWRRM JMP NULLRTS ; FFB3 OSWRRM
OSSERV JMP SERVICE ; FF95 OSSERV
OSCOLD JMP NULLRTS ; FF98 OSCOLD
OSPRSTR JMP OUTSTR ; FF9B OSPRSTR
OSSCANDEC JMP SCANDEC ; FF9E SCANDEC
OSSCANHEX JMP SCANHEX ; FFA1 SCANHEX
OSFFA4 JMP NULLRTS ; FFA4 (DISKACC)
OSFFA7 JMP NULLRTS ; FFA7 (DISKCCP)
PRHEX JMP OUTHEX ; FFAA PRHEX
PR2HEX JMP OUT2HEX ; FFAD PR2HEX
OSFFB0 JMP PRINTDEC ; FFB0 (USERINT)
OSWRRM JMP NULLRTS ; FFB3 OSWRRM
* COMPULSARY ENTRIES
* ------------------
VECSIZE DB ENDVEC-DEFVEC ; FFB6 VECSIZE Size of vectors
VECBASE DW DEFVEC ; FFB7 VECBASE Base of default vectors
OSRDRM JMP RDROM ; FFB9 OSRDRM Read byte from paged ROM
OSCHROUT JMP OUTCHAR ; FFBC CHROUT Send char to VDU driver
OSEVEN JMP EVENT ; FFBF OSEVEN Signal an event
GSINIT JMP GSINTGO ; FFC2 GSINIT Init string reading
GSREAD JMP GSRDGO ; FFC5 GSREAD Parse general string
NVWRCH JMP WRCHHND ; FFC8 NVWRCH Nonvectored WRCH
NVRDCH JMP RDCHHND ; FFCB NVRDCH Nonvectored RDCH
OSFIND JMP (FINDV) ; FFCE OSFIND
OSGBPB JMP (GBPBV) ; FFD1 OSGBPB
OSBPUT JMP (BPUTV) ; FFD4 OSBPUT
OSBGET JMP (BGETV) ; FFD7 OSBGET
OSARGS JMP (ARGSV) ; FFDA OSARGS
OSFILE JMP (FILEV) ; FFDD OSFILE
OSRDCH JMP (RDCHV) ; FFE0 OSRDCH
OSASCI CMP #$0D ; FFE3 OSASCI
VECSIZE DB ENDVEC-DEFVEC ; FFB6 VECSIZE Size of vectors
VECBASE DW DEFVEC ; FFB7 VECBASE Base of default vectors
OSRDRM JMP RDROM ; FFB9 OSRDRM Read byte from paged ROM
OSCHROUT JMP OUTCHAR ; FFBC CHROUT Send char to VDU driver
OSEVEN JMP EVENT ; FFBF OSEVEN Signal an event
GSINIT JMP GSINTGO ; FFC2 GSINIT Init string reading
GSREAD JMP GSRDGO ; FFC5 GSREAD Parse general string
NVWRCH JMP WRCHHND ; FFC8 NVWRCH Nonvectored WRCH
NVRDCH JMP RDCHHND ; FFCB NVRDCH Nonvectored RDCH
OSFIND JMP (FINDV) ; FFCE OSFIND
OSGBPB JMP (GBPBV) ; FFD1 OSGBPB
OSBPUT JMP (BPUTV) ; FFD4 OSBPUT
OSBGET JMP (BGETV) ; FFD7 OSBGET
OSARGS JMP (ARGSV) ; FFDA OSARGS
OSFILE JMP (FILEV) ; FFDD OSFILE
OSRDCH JMP (RDCHV) ; FFE0 OSRDCH
OSASCI CMP #$0D ; FFE3 OSASCI
BNE OSWRCH
OSNEWL LDA #$0A ; FFE7 OSNEWL
OSNEWL LDA #$0A ; FFE7 OSNEWL
JSR OSWRCH
OSWRCR LDA #$0D ; FFEC OSWRCR
OSWRCH JMP (WRCHV) ; FFEE OSWRCH
OSWORD JMP (WORDV) ; FFF1 OSWORD
OSBYTE JMP (BYTEV) ; FFF4 OSBYTE
OSCLI JMP (CLIV) ; FFF7 OSCLI
NMIVEC DW NULLRTI ; FFFA NMIVEC
RSTVEC DW STOP ; FFFC RSTVEC
OSWRCR LDA #$0D ; FFEC OSWRCR
OSWRCH JMP (WRCHV) ; FFEE OSWRCH
OSWORD JMP (WORDV) ; FFF1 OSWORD
OSBYTE JMP (BYTEV) ; FFF4 OSBYTE
OSCLI JMP (CLIV) ; FFF7 OSCLI
NMIVEC DW NULLRTI ; FFFA NMIVEC
RSTVEC DW STOP ; FFFC RSTVEC
IRQVEC
* Assembler doesn't like running up to $FFFF, so we bodge a bit
MOSEND
ORG MOSEND-MOSAPI+MOSVEC
DW IRQBRKHDLR ; FFFE IRQVEC
DW IRQBRKHDLR ; FFFE IRQVEC
MOSVEND
* Buffer for one 512 byte disk block in aux mem
AUXBLK ASC '**ENDOFCODE**'
DS $200-13

View File

@ -1,70 +1,72 @@
* AUXMEM.MOSEQU.S
* (c) Bobbi 2021 GPLv3
*
*******************************
* BBC MOS WORKSPACE LOCATIONS *
*******************************
* $00-$8F Language workspace
* $90-$9F Network workspace
* $A0-$A7 NMI workspace
* $A8-$AF Non-MOS *command workspace
* $B0-$BF Temporary filing system workspace
* $C0-$CF Persistant filing system workspace
* $D0-$DF VDU driver workspace
* $E0-$EE Internal MOS workspace
* $EF-$FF MOS API workspace
FSFLAG1 EQU $E2
FSFLAG2 EQU $E3
GSFLAG EQU $E4 ; $E4 GSREAD processing flags
GSCHAR EQU $E5 ; $E5 GSREAD accumulator
OSTEXT EQU $E6 ; $E6 => text string $E6 OSNUM+0
MAXLEN EQU OSTEXT+2 ; $E8 $E8 OSNUM+2
MINCHAR EQU OSTEXT+3 ; $E9 $E9 OSNUM+3
MAXCHAR EQU OSTEXT+4 ; $EA $EA OSPAD
OSTEMP EQU $EB ; $EB $EB OSTEMP
OSKBD1 EQU $EC ; $EC kbd ws
OSKBD2 EQU OSKBD1+1 ; $ED kbd ws
OSKBD3 EQU OSKBD1+2 ; $EE kbd ws
OSAREG EQU $EF ; $EF A register
OSXREG EQU OSAREG+1 ; $F0 X register
OSYREG EQU OSXREG+1 ; $F1 Y register
OSCTRL EQU OSXREG ; $F0 (XY)=>control block
OSLPTR EQU $F2 ; $F2 => command line
OSROMNUM EQU $F4 ; $F4 current ROM
*
OSINTWS EQU $FA ; $FA IRQ ZP pointer, use when IRQs off
OSINTA EQU $FC ; $FC IRQ register A store
FAULT EQU $FD ; $FD Error message pointer
ESCFLAG EQU $FF ; $FF Escape status
* $0200-$0235 Vectors
* $0236-$028F OSBYTE variables ($190+BYTENUM)
* $0290-$02ED
* $02EE-$02FF MOS control block
USERV EQU $200 ; USER vector
BRKV EQU $202 ; BRK vector
CLIV EQU $208 ; OSCLI vector
BYTEV EQU $20A ; OSBYTE vector
WORDV EQU $20C ; OSWORD vector
WRCHV EQU $20E ; OSWRCH vector
RDCHV EQU $210 ; OSRDCH vector
FILEV EQU $212 ; OSFILE vector
ARGSV EQU $214 ; OSARGS vector
BGETV EQU $216 ; OSBGET vector
BPUTV EQU $218 ; OSBPUT vector
GBPBV EQU $21A ; OSGBPB vector
FINDV EQU $21C ; OSFIND vector
FSCV EQU $21E ; FSCV misc file ops
BYTEVARBASE EQU $190 ; Base of OSBYTE variables
OSFILECB EQU $2EE ; OSFILE control block
OSGBPBCB EQU OSFILECB+1 ; OSGBPB control block
* $0300-$03DF
* $03E0-$03FF Used for interfacing with ProDOS XFER
* AUXMEM.MOSEQU.S
* (c) Bobbi 2021 GPLv3
*
*******************************
* BBC MOS WORKSPACE LOCATIONS *
*******************************
* $00-$8F Language workspace
* $90-$9F Network workspace
* $A0-$A7 NMI workspace
* $A8-$AF Non-MOS *command workspace
* $B0-$BF Temporary filing system workspace
* $C0-$CF Persistant filing system workspace
* $D0-$DF VDU driver workspace
* $E0-$EE Internal MOS workspace
* $EF-$FF MOS API workspace
FSFLAG1 EQU $E2
FSFLAG2 EQU $E3
GSFLAG EQU $E4 ; $E4 GSREAD processing flags
GSCHAR EQU $E5 ; $E5 GSREAD accumulator
OSTEXT EQU $E6 ; $E6 => text string $E6 OSNUM+0
MAXLEN EQU OSTEXT+2 ; $E8 $E8 OSNUM+2
MINCHAR EQU OSTEXT+3 ; $E9 $E9 OSNUM+3
MAXCHAR EQU OSTEXT+4 ; $EA $EA OSPAD
OSTEMP EQU $EB ; $EB $EB OSTEMP
OSKBD1 EQU $EC ; $EC kbd ws
OSKBD2 EQU OSKBD1+1 ; $ED kbd ws
OSKBD3 EQU OSKBD1+2 ; $EE kbd ws
OSAREG EQU $EF ; $EF A register
OSXREG EQU OSAREG+1 ; $F0 X register
OSYREG EQU OSXREG+1 ; $F1 Y register
OSCTRL EQU OSXREG ; $F0 (XY)=>control block
OSLPTR EQU $F2 ; $F2 => command line
OSROMNUM EQU $F4 ; $F4 current ROM
*
OSINTWS EQU $FA ; $FA IRQ ZP pointer, use when IRQs off
OSINTA EQU $FC ; $FC IRQ register A store
FAULT EQU $FD ; $FD Error message pointer
ESCFLAG EQU $FF ; $FF Escape status
* $0200-$0235 Vectors
* $0236-$028F OSBYTE variables ($190+BYTENUM)
* $0290-$02ED
* $02EE-$02FF MOS control block
USERV EQU $200 ; USER vector
BRKV EQU $202 ; BRK vector
CLIV EQU $208 ; OSCLI vector
BYTEV EQU $20A ; OSBYTE vector
WORDV EQU $20C ; OSWORD vector
WRCHV EQU $20E ; OSWRCH vector
RDCHV EQU $210 ; OSRDCH vector
FILEV EQU $212 ; OSFILE vector
ARGSV EQU $214 ; OSARGS vector
BGETV EQU $216 ; OSBGET vector
BPUTV EQU $218 ; OSBPUT vector
GBPBV EQU $21A ; OSGBPB vector
FINDV EQU $21C ; OSFIND vector
FSCV EQU $21E ; FSCV misc file ops
BYTEVARBASE EQU $190 ; Base of OSBYTE variables
OSFILECB EQU $2EE ; OSFILE control block
OSGBPBCB EQU OSFILECB+1 ; OSGBPB control block
* $0300-$03DF
* $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

View File

@ -7,194 +7,196 @@
* A1L/A1H: Start address
* A2L/A2H: End address
* A4L/A4H: Destination start address
MEMCPY LDA (A1L)
STA (A4L)
LDA A1H
CMP A2H
BNE :S1
LDA A1L
CMP A2L
BNE :S1
BRA :DONE
:S1 INC A1L
BNE :S2
INC A1H
:S2 INC A4L
BNE :S3
INC A4H
:S3 BRA MEMCPY
:DONE RTS
MEMCPY LDA (A1L)
STA (A4L)
LDA A1H
CMP A2H
BNE :S1
LDA A1L
CMP A2L
BNE :S1
BRA :DONE
:S1 INC A1L
BNE :S2
INC A1H
:S2 INC A4L
BNE :S3
INC A4H
:S3 BRA MEMCPY
:DONE RTS
* Copy 512 bytes from BLKBUF to AUXBLK in aux LC
COPYAUXBLK >>> ALTZP ; Alt ZP & Alt LC on
LDY #$00
:L1 LDA BLKBUF,Y
STA $C005 ; Write aux mem
STA AUXBLK,Y
STA $C004 ; Write main mem
CPY #$FF
BEQ :S1
INY
BRA :L1
:S1 LDY #$00
:L2 LDA BLKBUF+$100,Y
STA $C005 ; Write aux mem
STA AUXBLK+$100,Y
STA $C004 ; Write main mem
CPY #$FF
BEQ :S2
INY
BRA :L2
:S2 >>> MAINZP ; Alt ZP off, ROM back in
RTS
COPYAUXBLK >>> ALTZP ; Alt ZP & Alt LC on
LDY #$00
:L1 LDA BLKBUF,Y
STA $C005 ; Write aux mem
STA AUXBLK,Y
STA $C004 ; Write main mem
CPY #$FF
BEQ :S1
INY
BRA :L1
:S1 LDY #$00
:L2 LDA BLKBUF+$100,Y
STA $C005 ; Write aux mem
STA AUXBLK+$100,Y
STA $C004 ; Write main mem
CPY #$FF
BEQ :S2
INY
BRA :L2
:S2 >>> MAINZP ; Alt ZP off, ROM back in
RTS
* Search FILEREFS for value in A
* On return, buffer number is in X (or $FF if no bufs)
FINDBUF LDX #$00
:L1 CMP FILEREFS,X
BEQ :END
INX
CPX #$04
BNE :L1
LDX #$FF ; $FF for not found
:END RTS
FINDBUF LDX #$00
:L1 CMP FILEREFS,X
BEQ :END
INX
CPX #$04
BNE :L1
LDX #$FF ; $FF for not found
:END RTS
* Obtain I/O buffer address
* On entry: buffer number in X
* On exit: buffer address in AY
* Carry set if no bufs, clear otherwise
BUFADDR CPX #$00
BNE :S1
LDA #<IOBUF1
LDY #>IOBUF1
BRA :EXIT
:S1 CPX #$01
BNE :S2
LDA #<IOBUF2
LDY #>IOBUF2
BRA :EXIT
:S2 CPX #$02
BNE :S3
LDA #<IOBUF3
LDY #>IOBUF3
BRA :EXIT
:S3 CPX #$03
BNE :NOBUFS
LDA #<IOBUF4
LDY #>IOBUF4
:EXIT CLC
RTS
:NOBUFS SEC
RTS
BUFADDR CPX #$00
BNE :S1
LDA #<IOBUF1
LDY #>IOBUF1
BRA :EXIT
:S1 CPX #$01
BNE :S2
LDA #<IOBUF2
LDY #>IOBUF2
BRA :EXIT
:S2 CPX #$02
BNE :S3
LDA #<IOBUF3
LDY #>IOBUF3
BRA :EXIT
:S3 CPX #$03
BNE :NOBUFS
LDA #<IOBUF4
LDY #>IOBUF4
:EXIT CLC
RTS
:NOBUFS SEC
RTS
* Check if file exists
* Return A=0 if doesn't exist, A=1 file, A=2 dir
EXISTS LDA #<MOSFILE
STA GINFOPL+1
LDA #>MOSFILE
STA GINFOPL+2
JSR GETINFO ; GET_FILE_INFO
BCS :NOEXIST
LDA GINFOPL+7 ; Storage type
CMP #$0D
BCS :DIR ; >= $0D
LDA #$01 ; File
RTS
:DIR LDA #$02
RTS
:NOEXIST LDA #$00
RTS
EXISTS LDA #<MOSFILE
STA GINFOPL+1
LDA #>MOSFILE
STA GINFOPL+2
JSR GETINFO ; GET_FILE_INFO
BCS :NOEXIST
LDA GINFOPL+7 ; Storage type
CMP #$0D
BCS :DIR ; >= $0D
LDA #$01 ; File
RTS
:DIR LDA #$02
RTS
:NOEXIST LDA #$00
RTS
* Copy FILEBLK to OSFILECB in aux memory
* Preserves A
COPYFB PHA
LDX #$11 ; 18 bytes in FILEBLK
COPYFB PHA
LDX #$11 ; 18 bytes in FILEBLK
* >>> WRTAUX ; Alt ZP and LC
>>> WRTAUX ; Write to Aux mem
:L1 LDA FILEBLK,X
>>> WRTAUX ; Write to Aux mem
:L1 LDA FILEBLK,X
* STA AUXBLK,X
STA OSFILECB,X
DEX
BPL :L1
STA OSFILECB,X
DEX
BPL :L1
* >>> MAINZP ; Back to normal
>>> WRTMAIN ; Back to Main mem
PLA
RTS
>>> WRTMAIN ; Back to Main mem
PLA
RTS
* Get file info
GETINFO JSR MLI
DB GINFOCMD
DW GINFOPL
RTS
GETINFO JSR MLI
DB GINFOCMD
DW GINFOPL
RTS
* Set file info
SETINFO LDA #$07 ; SET_FILE_INFO 7 parms
STA GINFOPL
JSR MLI
DB SINFOCMD
DW GINFOPL ; Re-use PL from GFI
LDA #$0A ; GET_FILE_INFO 10 parms
STA GINFOPL
RTS
SETINFO LDA #$07 ; SET_FILE_INFO 7 parms
STA GINFOPL
JSR MLI
DB SINFOCMD
DW GINFOPL ; Re-use PL from GFI
LDA #$0A ; GET_FILE_INFO 10 parms
STA GINFOPL
RTS
* Create disk file
* Uses filename in MOSFILE
CRTFILE JSR MLI ; GET_TIME
DB GTIMECMD
LDA #<MOSFILE
STA CREATEPL+1
LDA #>MOSFILE
STA CREATEPL+2
LDA #$C3 ; Open permissions
STA CREATEPL+3
LDA $BF90 ; Current date
STA CREATEPL+8
LDA $BF91
STA CREATEPL+9
LDA $BF92 ; Current time
STA CREATEPL+10
LDA $BF93
STA CREATEPL+11
JSR MLI
DB CREATCMD
DW CREATEPL
RTS
CRTFILE JSR MLI ; GET_TIME
DB GTIMECMD
LDA #<MOSFILE
STA CREATEPL+1
LDA #>MOSFILE
STA CREATEPL+2
LDA #$C3 ; Open permissions
STA CREATEPL+3
LDA $BF90 ; Current date
STA CREATEPL+8
LDA $BF91
STA CREATEPL+9
LDA $BF92 ; Current time
STA CREATEPL+10
LDA $BF93
STA CREATEPL+11
JSR MLI
DB CREATCMD
DW CREATEPL
RTS
* Open disk file
OPENMOSFILE LDA #<MOSFILE ; Open filename in MOSFILE
STA OPENPL+1
LDA #>MOSFILE
STA OPENPL+2
OPENFILE JSR MLI
DB OPENCMD
DW OPENPL
RTS
OPENMOSFILE LDA #<MOSFILE ; Open filename in MOSFILE
STA OPENPL+1
LDA #>MOSFILE
STA OPENPL+2
OPENFILE JSR MLI
DB OPENCMD
DW OPENPL
RTS
* Close disk file
CLSFILE JSR MLI
DB CLSCMD
DW CLSPL
RTS
CLSFILE JSR MLI
DB CLSCMD
DW CLSPL
RTS
* Read 512 bytes into BLKBUF
RDFILE JSR MLI
DB READCMD
DW READPL
RTS
RDFILE JSR MLI
DB READCMD
DW READPL
RTS
* Write data in BLKBUF to disk
WRTFILE JSR MLI
DB WRITECMD
DW WRITEPL
RTS
WRTFILE JSR MLI
DB WRITECMD
DW WRITEPL
RTS
* Put ProDOS prefix in PREFIX
GETPREF JSR MLI
DB GPFXCMD
DW GPFXPL
RTS
GETPREF JSR MLI
DB GPFXCMD
DW GPFXPL
RTS
* 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)