mirror of
https://github.com/bobbimanners/Applecorn.git
synced 2025-02-06 02:30:15 +00:00
Updated disk image. Builds in Merlin-16 again.
This commit is contained in:
parent
d4cea3ba9c
commit
8e5ca206f5
BIN
applecorn.po
BIN
applecorn.po
Binary file not shown.
@ -229,6 +229,8 @@ MAINZP MAC
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
@ -495,6 +495,8 @@ OSBM2 ASC ').'
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
@ -467,6 +467,8 @@ BYTE76 LDX #$00 ; Update LEDs and return X=SHIFT
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
@ -327,3 +327,5 @@ RELCOORD CLC
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
393
auxmem.hostfs.s
393
auxmem.hostfs.s
@ -34,23 +34,23 @@ FSCMDLINE EQU $CE
|
||||
FINDHND PHX
|
||||
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
|
||||
|
||||
|
@ -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
|
||||
|
||||
|
||||
|
||||
|
||||
|
422
auxmem.misc.s
422
auxmem.misc.s
@ -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
|
||||
|
||||
|
||||
|
||||
|
@ -16,29 +16,29 @@
|
||||
* $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
|
||||
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
|
||||
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
|
||||
@ -46,25 +46,27 @@ ESCFLAG EQU $FF ; $FF Escape status
|
||||
* $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
|
||||
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
|
||||
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
|
||||
|
||||
|
||||
|
@ -520,6 +520,8 @@ ECHOLP1 JSR GSREAD
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
@ -1004,3 +1004,5 @@ VDU01 RTS
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
@ -85,6 +85,8 @@ GEOFCMD EQU $D1
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
@ -227,3 +227,5 @@ MHGRTAB DW $2000,$2080,$2100,$2180,$2200,$2280,$2300,$2380
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
@ -131,6 +131,8 @@ RESET TSX
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
@ -173,3 +173,5 @@ LOADCODE PHP ; Save carry flag
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
@ -127,6 +127,8 @@ QUITPL HEX 04 ; Number of parameters
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
@ -99,3 +99,5 @@ MSG8 ASC " 8. Everything! (8 ROMs)"
|
||||
|
||||
USERSEL DB $00
|
||||
|
||||
|
||||
|
||||
|
304
mainmem.misc.s
304
mainmem.misc.s
@ -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
|
||||
|
||||
|
||||
|
||||
|
@ -313,6 +313,8 @@ PREFIX DS 65 ; Buffer for ProDOS prefix
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
1822
mainmem.svc.s
1822
mainmem.svc.s
File diff suppressed because it is too large
Load Diff
@ -407,6 +407,8 @@ MATCHBUF DS 65 ; For storing match results (Pascal str)
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
Loading…
x
Reference in New Issue
Block a user