mirror of https://github.com/A2osX/A2osX.git
Kernel 0.93+
This commit is contained in:
parent
839a06b945
commit
a35dde3f8d
Binary file not shown.
|
@ -5,23 +5,24 @@ NEW
|
|||
* $2F80-$2FFC moved to $D742
|
||||
|
||||
.OP 65816
|
||||
ofsC .EQ cclock_0-tclk_in offset to Cortland clock org
|
||||
ofsC .EQ *-tclk_in offset to Cortland clock org
|
||||
|
||||
cclock_0 SHORT I,M 8 bit mode.
|
||||
cclock_0
|
||||
* SHORT I,M 8 bit mode.
|
||||
lda statereg state register.
|
||||
sta savestate save for restore after tool call.
|
||||
and #$CF clear the read/write aux memory bits.
|
||||
sta statereg make it real
|
||||
clc set e = 0 to set native mode
|
||||
xce
|
||||
LONG I,M 16 bit mode.
|
||||
* LONG I,M 16 bit mode.
|
||||
lda #$0000 zero out result space.
|
||||
pha push 4 words for hex time result
|
||||
pha
|
||||
pha
|
||||
pha
|
||||
_ReadTimeHex
|
||||
SHORT M back to 8 bit to get results from stack
|
||||
>IIGS ReadTimeHex
|
||||
* SHORT M back to 8 bit to get results from stack
|
||||
lda savestate restore state register
|
||||
sta statereg
|
||||
pla pull off seconds and ignore
|
||||
|
@ -61,7 +62,8 @@ savestate .EQ *-ofsC
|
|||
.HS 000000000000
|
||||
cclk_end .EQ * end of obj cclock_0.
|
||||
.HS 000000 pad to page boundary
|
||||
LONGI OFF
|
||||
* LONG I OFF
|
||||
.OP 65C02
|
||||
*--------------------------------------
|
||||
MAN
|
||||
SAVE USR/SRC/PRODOS.203/PRODOS.S.CCLK
|
||||
|
|
|
@ -1,16 +1,9 @@
|
|||
NEW
|
||||
AUTO 3,1
|
||||
* disk ii driver. object code = xrw_0
|
||||
|
||||
* critical timing requires page bound considerations for code and data.
|
||||
* virtually the entire 'write' routine must not cross page boundaries.
|
||||
* critical branches in the 'write', 'read', and 'read adr' subroutines
|
||||
* which must not cross page boundaries are noted in comments.
|
||||
* the cld at blockio must be present to determine bank of $D000
|
||||
* $5300-5A00 moved to language card bank 1 at $D000
|
||||
|
||||
.OP 6502
|
||||
.OR $D000
|
||||
ofsD .EQ *-rwts offset to disk ii driver or
|
||||
|
||||
blockio cld $D8 to flag language card bank 1 (main)
|
||||
jsr rsetphse
|
||||
|
@ -110,7 +103,7 @@ L537F lda #$01 wait 100us for each count in montime
|
|||
|
||||
L538E lda A4L get command #
|
||||
beq L53FD if 0 then status command
|
||||
lsr a set carry = 1 for read, 0 for write.
|
||||
lsr set carry = 1 for read, 0 for write.
|
||||
bcs L5398 must prenibblize for write
|
||||
jsr prenib16
|
||||
L5398 ldy #$40 64 retries
|
||||
|
@ -630,13 +623,13 @@ L57F0 rts
|
|||
drvindx .EQ *-ofsD
|
||||
pha preserve acc across call
|
||||
lda A4L+1
|
||||
lsr a
|
||||
lsr a
|
||||
lsr a
|
||||
lsr a
|
||||
lsr
|
||||
lsr
|
||||
lsr
|
||||
lsr
|
||||
cmp #$08
|
||||
and #$07
|
||||
rol a
|
||||
rol
|
||||
tax index to table.
|
||||
pla restore acc
|
||||
rts
|
||||
|
@ -719,7 +712,7 @@ wrefa2 .EQ *-ofsD
|
|||
beq L58C0 (2+) branch if code written was page aligned.
|
||||
lda A2H (3) get byte address of last byte to be written.
|
||||
beq L58B3 (2+) branch if only 1 byte left to write.
|
||||
lsr a (2) test for odd or even last byte (carry set/clear)
|
||||
lsr (2) test for odd or even last byte (carry set/clear)
|
||||
lda pch (3) restore nibl to acc.
|
||||
sta q6h,x (5)
|
||||
lda q6l,x (4)
|
||||
|
@ -755,7 +748,7 @@ wrefa6 .EQ *-ofsD
|
|||
bcc L5881 (3-) branch if not the last.
|
||||
bcs L58B1 (3) waste 3 cycles, branch always.
|
||||
L58B1 bcs L58C0 (3) branch always.
|
||||
L58B3 lda |pch (4) absolute reference to zero page
|
||||
L58B3 lda pch (4) absolute reference to zero page
|
||||
sta q6h,x (5)
|
||||
lda q6l,x (4)
|
||||
pha (3) waste 14 micro-seconds total
|
||||
|
@ -872,7 +865,7 @@ prn3 .EQ *-ofsD get byte from highest group.
|
|||
L595F sta pch
|
||||
beq L596F branch if data to be written is page
|
||||
lda A2H aligned. check if last byte is even
|
||||
lsr a or odd address. shift even/odd -> carry.
|
||||
lsr or odd address. shift even/odd -> carry.
|
||||
lda (buf),y if even, then leave intact.
|
||||
bcc L596D branch if odd.
|
||||
iny if even, then pre-xor with byte 1.
|
||||
|
@ -953,7 +946,6 @@ spunit .EQ *-ofsD ref pathbuf-$10
|
|||
.HS 0000000000000000
|
||||
|
||||
* pathname buffer starts at this page boundary (pathbuf = $D700)
|
||||
*--------------------------------------
|
||||
MAN
|
||||
SAVE USR/SRC/PRODOS.203/PRODOS.S.DISKII
|
||||
LOAD USR/SRC/PRODOS.203/PRODOS.S
|
||||
|
|
|
@ -55,7 +55,7 @@ aftirq .EQ *-ofsG irq returns here.
|
|||
oldacc .EQ *-ofsG
|
||||
.DA #0
|
||||
afbank .EQ *-ofsG
|
||||
.HS 0
|
||||
.HS 00
|
||||
|
||||
* memory map of lower 48k. each bit represents 1 page.
|
||||
* protected pages = 1, unprotected = 0
|
||||
|
|
|
@ -0,0 +1,769 @@
|
|||
NEW
|
||||
AUTO 3,1
|
||||
.OP 65C02
|
||||
|
||||
H2000 jmp prostart
|
||||
jmp atalkset appletalk setup for network boot
|
||||
jmp p16start GQuit setup for gs/os
|
||||
|
||||
LDR.MSG.AppleII .AS "Apple II"
|
||||
LDR.MSG.ProDOS .AS "ProDOS 8 V2.0.3 "
|
||||
.AS "06-May-93"
|
||||
H202F .AS " "
|
||||
H203B .AS "Copyright Apple Computer, Inc., 1983-93"
|
||||
H2062 .AS "All Rights Reserved."
|
||||
|
||||
p16start inc setuprts set = 2 for GQuit rts
|
||||
atalkset inc setuprts set = 1 for appletalk rts
|
||||
prostart lda unitnum
|
||||
sta LDR.MLIONLINE.P+1
|
||||
jsr LDR.Splash
|
||||
|
||||
* test for at least a 65c02
|
||||
|
||||
sed
|
||||
lda #$99 a negative #
|
||||
clc
|
||||
adc #$01 +1 in decimal = 0 (positive)
|
||||
cld
|
||||
bmi m48k if 6502 because will not clear N flag
|
||||
|
||||
* machine at least an m65c02
|
||||
|
||||
lda #$01 patch for the gs rom
|
||||
trb statereg to force off intcxrom
|
||||
ldx #H232B yx=232B location table
|
||||
ldy /H232B
|
||||
jsr reloc move interpreter loader to $800
|
||||
bcs m48k error
|
||||
|
||||
* test for at least 64k
|
||||
|
||||
ldy #$00
|
||||
lda #$FF
|
||||
sta kversion at least 48k ?
|
||||
eor kversion
|
||||
sec
|
||||
bne m48k if not.
|
||||
|
||||
sta kversion try again to be sure
|
||||
lda kversion
|
||||
bne m48k still not.
|
||||
|
||||
lda romin read ROM
|
||||
jsr whchrom get preliminary system config
|
||||
bcs m48k machine too small
|
||||
lda idapple
|
||||
and #$20
|
||||
bne m64k if at least 64k //+.
|
||||
m48k jmp H22EB need enhanced IIe
|
||||
|
||||
* we have 64k, now determine model: //e , iic, or Cortland (//gs)
|
||||
|
||||
m64k ldx #H2367 yx=2367 relocation table
|
||||
ldy /H2367
|
||||
jsr reloc
|
||||
lda kversion
|
||||
sta xdosver save current version for dir use
|
||||
|
||||
H20CE bcc H20D3
|
||||
jmp relocerr
|
||||
|
||||
H20D3 lda romin read ROM
|
||||
ldx version ROM id byte
|
||||
cpx #$06
|
||||
bne H211D then it's a //e
|
||||
lda #$E0
|
||||
bit zidbyte another ROM id byte
|
||||
php
|
||||
lda idapple
|
||||
and #$37
|
||||
plp
|
||||
bvc set3 if //c or //x
|
||||
bmi set7 if //e
|
||||
|
||||
set3 php
|
||||
ora #$08
|
||||
plp
|
||||
bpl mach2 if //c
|
||||
ora #$40
|
||||
bpl H20FD always taken.
|
||||
|
||||
mach2 inc cflag //c or later
|
||||
bvs H20FD
|
||||
set7 ora #$80
|
||||
|
||||
H20FD sta idapple
|
||||
lda romin read ROM
|
||||
sec
|
||||
jsr idroutine returns system info
|
||||
bcs H211D branch if // family
|
||||
inc cortland it's a Cortland, set loader flag
|
||||
stz vmode force setvid to reset cursor
|
||||
jsr setvid reset output to screen
|
||||
lda setuprts
|
||||
bne H211D branch if prodos 8 alone
|
||||
|
||||
* running from gs/os shell so zero out os_boot for appletalk
|
||||
|
||||
sta >OS_BOOT indicates O/S initially booted.
|
||||
jsr patch101 patch for gs/os - rev note #101
|
||||
|
||||
* put dispatcher in bank 2 of language card
|
||||
|
||||
H211D lda LDR.MLIONLINE.P+1 place boot devnum in globals
|
||||
sta LDR.MLIREADBLOCK.P+1
|
||||
sta devnum last device used
|
||||
jsr devsrch finish setting up globals
|
||||
lda LDR.MLIREADBLOCK.P+1
|
||||
sta devnum
|
||||
jsr lc1in switch in language card bank 1.
|
||||
ldx #rlclk64 set up clock
|
||||
ldy /rlclk64
|
||||
jsr reloc
|
||||
|
||||
H2139 bcs H20CE
|
||||
lda #calldisp
|
||||
sta jspare+1 P8 system death vector
|
||||
lda /calldisp
|
||||
sta jspare+2
|
||||
lda altram read/write RAM bank 2
|
||||
lda altram
|
||||
ldx #altdsptbl GQuit dispatcher
|
||||
ldy /altdsptbl
|
||||
lda setuprts
|
||||
cmp #$02 is this a GQuit setup?
|
||||
beq H216E taken to use GQuit dispatcher.
|
||||
ldx #newquitbl else, use Bird's Better Bye
|
||||
ldy /newquitbl if correct machine.
|
||||
lda machid machine ID byte
|
||||
bit #$00 //c ?
|
||||
bne H216E if yes, can use.
|
||||
and #$C2
|
||||
cmp #$82 //e with 80 col card ?
|
||||
beq H216E if yes, can use.
|
||||
ldx #dsp64 else, use original quit code
|
||||
ldy /dsp64
|
||||
inc newquitflag using old quit code so set flag
|
||||
|
||||
H216E jsr reloc
|
||||
lda #$EE byte to distinguish LC bank 2
|
||||
sta $D000
|
||||
jsr lc1in switch in LC bank 1
|
||||
bcs H2139
|
||||
|
||||
* test for 128k needed to install ram disk
|
||||
|
||||
lda machid machine ID byte
|
||||
and #$30
|
||||
eor #$30
|
||||
bne noramdsk if < 128k
|
||||
ldx #$FF
|
||||
php save interrupt status
|
||||
pla in acc.
|
||||
sei no interrupts.
|
||||
sta setaltzp use alt zero page/stack
|
||||
stx auxsp init aux sp to $FF
|
||||
sta setstdzp use main zero page/stack
|
||||
pha restore interrupt status
|
||||
plp
|
||||
sta int3rom enable internal slot 3 ROM
|
||||
jsr H2C80 install ram disk
|
||||
|
||||
* check interrupt vector to determine ROM version
|
||||
|
||||
noramdsk lda romin1 read ROM/write RAM bank 2
|
||||
ldy irqv interrupt vector
|
||||
ldx irqv+1 x = high byte
|
||||
jsr lc1in set language card bank 1 to r/w
|
||||
cpx #$D0 is it > $D000 (old roms)
|
||||
lda #$00
|
||||
bcs H21C5 branch if old roms
|
||||
sta setaltzp use alt zero page/stack
|
||||
lda #$FF set aux sp = $FF
|
||||
sta auxsp
|
||||
stx irqv+1 interrupt vector
|
||||
sty irqv save irq vector in aux lc
|
||||
sta setstdzp use main zero page/stack
|
||||
stx irqv+1 save irq vector in main lc
|
||||
sty irqv
|
||||
lda #$01
|
||||
|
||||
H21C5 sta irqflag 1 = new roms
|
||||
stz cortflag assume not Cortland system
|
||||
lda cortland running on a Cortland ?
|
||||
beq H21D5 branch if not.
|
||||
inc cortflag yes it's Cortland
|
||||
bra docard
|
||||
|
||||
* check for a rom in slot 3. if no rom, use internal $C300 firmware
|
||||
|
||||
H21D5 sta int3rom enable internal slot 3 ROM
|
||||
lda rommap slot ROM bit map
|
||||
and #$08 mask all but slot 3
|
||||
bne isromin3 taken if rom in slot 3
|
||||
bra H2247 else continue booting
|
||||
|
||||
* found a rom in slot 3. is it an external, identifiable 80 col card
|
||||
* with interrupt routines? if so, enable it else use internal $C300 firmware.
|
||||
|
||||
isromin3 sta slot3rom enable slot 3 rom
|
||||
lda slot3id1 check card id bytes
|
||||
cmp #$38
|
||||
bne hitswtch not terminal card
|
||||
lda slot3id2
|
||||
cmp #$18
|
||||
bne hitswtch
|
||||
lda slot3id3
|
||||
cmp #$01
|
||||
bne hitswtch
|
||||
lda ext80col is it an apple 80 col compatible card?
|
||||
and #$F0
|
||||
cmp #$80
|
||||
bne hitswtch if not.
|
||||
lda machid machine ID byte
|
||||
and #$C8
|
||||
cmp #$C0 is it a //+ ?
|
||||
beq docard yes
|
||||
lda slot3irq
|
||||
cmp #$2C does card have an interrupt handler?
|
||||
beq docard yes
|
||||
|
||||
hitswtch sta int3rom enable internal $C300 firmware
|
||||
|
||||
* verify that the card in aux slot is actually present
|
||||
|
||||
sta store80on enable 80-col store
|
||||
sta txtpage2 switch in text page 2
|
||||
lda #$EE
|
||||
sta txtp2
|
||||
asl
|
||||
asl txtp2
|
||||
cmp txtp2
|
||||
bne H2230
|
||||
lsr
|
||||
lsr txtp2
|
||||
cmp txtp2
|
||||
|
||||
H2230 sta txtpage1 main memory
|
||||
sta store80off disable 80-col store
|
||||
beq docard branch if card is there
|
||||
lda machid machine ID byte
|
||||
and #$FD clear 80-col bit 2 (no card)
|
||||
bne H2244 always
|
||||
|
||||
docard lda machid
|
||||
ora #$02 turn bit 2 on (80-col card is present)
|
||||
|
||||
H2244 sta machid
|
||||
H2247 lda cortland are we running on a //gs ?
|
||||
beq H225D if not.
|
||||
lda #$4C enable clock routine by putting a jmp
|
||||
sta clockv in front of clock vector
|
||||
ldx #cortclock yx = relocation table
|
||||
ldy /cortclock for cortland clock driver
|
||||
jsr reloc
|
||||
lda #$01 set bit 0 = clock present
|
||||
tsb machid
|
||||
|
||||
H225D lda setuprts get setup entry point flag
|
||||
beq H2267 taken if normal boot.
|
||||
lda romin read ROM
|
||||
rts return to caller at setup entry point.
|
||||
|
||||
setuprts .DA #$00 0 = normal boot, <>0 = return
|
||||
|
||||
* set prefix to boot device
|
||||
|
||||
H2267 jsr MLI online
|
||||
.DA #MLIONLINE
|
||||
.DA LDR.MLIONLINE.P
|
||||
bcs relocerr
|
||||
|
||||
lda PrefixBuf+1 get volume name length.
|
||||
and #$0F strip devnum
|
||||
beq relocerr
|
||||
|
||||
inc add 1 for leading '/'
|
||||
sta PrefixBuf save prefix length.
|
||||
lda #'/' place leading '/' in prefix buffer
|
||||
sta PrefixBuf+1
|
||||
|
||||
jsr MLI set prefix
|
||||
.DA #MLISETPREFIX
|
||||
.DA LDR.MLISETPREFIX.P
|
||||
bcs relocerr
|
||||
|
||||
tax =0
|
||||
stx ZP.DstPtr
|
||||
ldy #$02 read directory into buffer
|
||||
lda /DirBlkBuf
|
||||
|
||||
H228E sta ZP.DstPtr+1
|
||||
sta LDR.MLIREADBLOCK.P+4
|
||||
sty LDR.MLIREADBLOCK.P+5
|
||||
stx LDR.MLIREADBLOCK.P+6
|
||||
|
||||
jsr MLI read block
|
||||
.DA #MLIREADBLOCK
|
||||
.DA LDR.MLIREADBLOCK.P
|
||||
bcs relocerr
|
||||
|
||||
ldy #$03 get next block# from link
|
||||
lda (ZP.DstPtr),y
|
||||
tax
|
||||
dey
|
||||
ora (ZP.DstPtr),y if both bytes are the same
|
||||
beq H22B7 then no more blocks of directory.
|
||||
lda (ZP.DstPtr),y
|
||||
tay
|
||||
lda ZP.DstPtr+1
|
||||
clc
|
||||
adc #$02 add $200 to buffer pointer
|
||||
cmp /dbuf+$800 until it points past end of buffer.
|
||||
bcc H228E if ok, read next block.
|
||||
|
||||
H22B7 jmp lodintrp jmp to 'licode' (load interpreter)
|
||||
|
||||
* relocation/configuration error
|
||||
|
||||
relocerr sta romin read ROM
|
||||
jsr home
|
||||
|
||||
ldy #$1D
|
||||
|
||||
.1 lda LDR.MSG.LdrErr,y
|
||||
sta vline12+4,y
|
||||
dey
|
||||
bpl .1
|
||||
|
||||
bmi *
|
||||
|
||||
LDR.MSG.LdrErr .AS "Relocation/Configuration Error"
|
||||
|
||||
ldy #$23
|
||||
|
||||
.1 lda LDR.MSG.EnhErr,y
|
||||
sta vline14+2,y
|
||||
dey
|
||||
bpl .1
|
||||
|
||||
bmi *
|
||||
|
||||
LDR.MSG.EnhErr .AS "REQUIRES ENHANCED APPLE IIE OR LATER"
|
||||
|
||||
LDR.MLIONLINE.P .DA #2
|
||||
.DA #$60
|
||||
.DA PrefixBuf+1
|
||||
|
||||
LDR.MLISETPREFIX.P
|
||||
.DA #1
|
||||
.DA PrefixBuf
|
||||
|
||||
LDR.MLIREADBLOCK.P
|
||||
.DA #3
|
||||
.DA #0 unit number
|
||||
.DA 0 2 byte data buffer
|
||||
.DA 0 2 byte block number
|
||||
|
||||
cortland .BS 1 cortland loader flag (1 = Cortland)
|
||||
newquitflag .BS 1 1 = old quit code
|
||||
|
||||
H232B .DA #1 move interpreter loader code
|
||||
.DA lodintrp destination address
|
||||
.DA H257B-licode length to move
|
||||
.DA licode source address
|
||||
.DA #$01 move $3F0 vectors
|
||||
.DA p3vect destination
|
||||
.DA $0010 16 bytes to move
|
||||
.DA H257B source
|
||||
.DA #$01
|
||||
.DA lookptr
|
||||
.DA $0002
|
||||
.DA ZP.DstPtr
|
||||
.DA #$01 move 128k test to zero page
|
||||
.DA tst128 destination
|
||||
.DA H2622-H25DC length
|
||||
.DA H25DC source
|
||||
.DA #FF done
|
||||
|
||||
dsp64 .DA #$01 move p8 dispatcher code
|
||||
.DA displc2 destination
|
||||
.DA birdbye-disp1obj length (must be <= 3 pages)
|
||||
.DA disp1obj source
|
||||
.DA #FF done
|
||||
|
||||
newquitbl .DA #$01 move Bird's Bye code
|
||||
.DA displc2 dest
|
||||
.DA GQdisp-birdbye length (must be <= 3 pages)
|
||||
.DA birdbye source
|
||||
.DA #FF done
|
||||
|
||||
altdsptbl .DA #$01 move GQuit launcher
|
||||
.DA displc2 destination
|
||||
.DA $0300 length (must be <= 3 pages)
|
||||
.DA GQdisp source
|
||||
.DA #$01 move a copy of GQuit launcher
|
||||
.DA dispadr to dispadr for gsos
|
||||
.DA $0300 length (must be <= 3 pages)
|
||||
.DA GQdisp source
|
||||
.DA #FF done
|
||||
|
||||
* tables for moving 64k version of mli for execution
|
||||
|
||||
H2367 .DA #$01 relocation table. 1=move src to ZP.DstPtr
|
||||
.DA lanirq destination
|
||||
.DA H2E00-H2D9B length to move
|
||||
.DA H2D9B source
|
||||
.DA #$01
|
||||
.DA MLI globals
|
||||
.DA $0100 in one page
|
||||
.DA H2E00
|
||||
.HS 00 0=clear buffers $D700-$DDFF
|
||||
.DA pathbuf
|
||||
.DA xdosorg-pathbuf
|
||||
.DA #$01
|
||||
.DA xdosorg
|
||||
.DA ramsrc-xdosobj length of mli
|
||||
.DA xdosobj
|
||||
.DA #$01
|
||||
.DA rwts
|
||||
.DA disp1obj-blockio length of disk ii driver
|
||||
.DA blockio
|
||||
.DA #FF done
|
||||
|
||||
* move thunderclock
|
||||
|
||||
rlclk64 .DA #$01 relocation table. 1=move src to ZP.DstPtr
|
||||
.DA tclk_in destination
|
||||
.DA tclk_end-tclock_0 length of thunderclock driver
|
||||
.DA tclock_0 source
|
||||
.DA #$04 4=relocate and move program
|
||||
.DA tclk_in
|
||||
.DA H2F69-tclock_0
|
||||
.DA tclk_in
|
||||
.HS 00
|
||||
.HS C1C1
|
||||
clock64 .DA #$00
|
||||
.DA #FF done
|
||||
|
||||
* move cortland clock
|
||||
|
||||
cortclock .DA #$01 relocation table. 1=move src to ZP.DstPtr
|
||||
.DA tclk_in destination
|
||||
.DA cclk_end-cclock_0 length of cortland clock driver
|
||||
.DA cclock_0 source
|
||||
.DA #FF done
|
||||
|
||||
* load and run appletalk configuration file (atinit) if present
|
||||
* or continue loading and running .system file
|
||||
|
||||
* loader origin $800
|
||||
|
||||
ofsL .EQ *-lodintrp offset from loader org
|
||||
|
||||
licode jsr MLI check for file 'atinit'
|
||||
.DA #MLIGETFILEINFO
|
||||
.DA gfi_list
|
||||
bcc gfi_ok branch if 'atinit' file found
|
||||
cmp #$46 file not found?
|
||||
beq H23DF if so, continue loading interpreter
|
||||
bne H23E2
|
||||
gfi_ok lda gfi_type
|
||||
cmp #$E2 is 'atinit' correct file type?
|
||||
bne H23E2 error - wrong file type
|
||||
jsr MLI open 'atinit' file
|
||||
.DA #$C8
|
||||
.DA atopen parms
|
||||
bne H23E2 error
|
||||
lda #$9F max size = 39.75k ($2000-$BF00)
|
||||
sta rdlen+1
|
||||
stz rdlen
|
||||
jsr MLI read 'atinit' file to 'sysentry'
|
||||
.DA #$CA
|
||||
.DA rdparm
|
||||
bne H23E2 error - too big
|
||||
jsr MLI close 'atinit' file
|
||||
.DA #$CC
|
||||
.DA clparm
|
||||
bne H23E2 error
|
||||
lda romin enable ROM
|
||||
jsr sysentry execute ATinit
|
||||
H23DF jmp goloadint execute .system file
|
||||
|
||||
* fatal error
|
||||
|
||||
H23E2 ldx H23F0
|
||||
H23E5 lda H23F0,x
|
||||
sta vline16,x
|
||||
dex
|
||||
bne H23E5
|
||||
beq *
|
||||
|
||||
H23F0 .DA #$1A length of message
|
||||
.AS "Unable to load ATInit file"
|
||||
|
||||
gfi_list .EQ *-ofsL
|
||||
.DA #$0A
|
||||
.DA atinitname
|
||||
.HS 00
|
||||
gfi_type .EQ *-ofsL
|
||||
.HS 00000000
|
||||
.HS 0000000000000000
|
||||
.HS 0000
|
||||
atopen .EQ *-ofsL parms to open 'atinit'
|
||||
.HS 03
|
||||
.DA atinitname
|
||||
.DA iobuf i/o buffer
|
||||
.HS 01 ref# hard coded since no other files
|
||||
atinitname .EQ *-ofsL
|
||||
.DA #06 length of name
|
||||
.AS "atinit" name of appletalk config file
|
||||
goloadint .EQ *-ofsL
|
||||
lda /dbuf search directory buffer
|
||||
sta idxl+1
|
||||
lda #$04 start 1 entry past header
|
||||
bne H2434 always.
|
||||
H2432 lda idxl calc next entry position
|
||||
H2434 clc
|
||||
adc dbuf+35 inc to next entry address
|
||||
sta idxl
|
||||
bcs H2451 branch if page cross.
|
||||
adc dbuf+35 test for end of block.
|
||||
bcc H2453 branch if not page cross
|
||||
lda idxl+1
|
||||
lsr end of block?
|
||||
bcc H2453 no.
|
||||
cmp #$09 end of directory?
|
||||
bne H244D no.
|
||||
jmp nointrp no interpreter, go quit.
|
||||
H244D lda #$04 reset index to 1st entry in next block.
|
||||
sta idxl
|
||||
H2451 inc idxl+1 inc to next page.
|
||||
H2453 ldy #$10 check file type.
|
||||
lda #$FF must be a prodos sys file
|
||||
eor (idxl),y
|
||||
bne H2432 if not sys.
|
||||
tay see if active
|
||||
lda (idxl),y
|
||||
beq H2432 if deleted file.
|
||||
and #$0F strip file 'kind'.
|
||||
sta PrefixBuf save length of name.
|
||||
cmp #$08 must be at least 'x.system'
|
||||
bcc H2432 else, ignore it.
|
||||
tay compare last 7 chars for '.system'
|
||||
ldx #$06
|
||||
H246C lda (idxl),y
|
||||
eor iterp,x
|
||||
asl
|
||||
bne H2432 branch if something else
|
||||
dey
|
||||
dex
|
||||
bpl H246C
|
||||
ldy #$00
|
||||
H247A iny
|
||||
lda (idxl),y
|
||||
sta PrefixBuf,y
|
||||
ora #$80 msb on so can be displayed if error
|
||||
sta iomess+$11,y
|
||||
cpy PrefixBuf
|
||||
bne H247A
|
||||
lda #$A0 space after name
|
||||
sta iomess+$12,y
|
||||
tya error message length
|
||||
adc #$13 (carry set)
|
||||
sta ierlen
|
||||
jsr MLI open interpreter file
|
||||
.DA #$C8
|
||||
.DA opparm
|
||||
bne badlod
|
||||
jsr MLI get eof (length of file)
|
||||
.DA #$D1
|
||||
.DA efparm
|
||||
bne badlod
|
||||
lda eof+2
|
||||
bne toolong
|
||||
lda eof+1
|
||||
cmp #$9F max size = 39.75k ($2000-$BF00)
|
||||
bcs toolong
|
||||
sta rdlen+1
|
||||
lda eof
|
||||
sta rdlen (read entire file)
|
||||
jsr MLI read interpreter file
|
||||
.DA #$CA
|
||||
.DA rdparm
|
||||
beq H24C8 go close if successfully read.
|
||||
cmp #$56 memory conflict?
|
||||
beq toolong then too large
|
||||
bne badlod else, unable to load.
|
||||
H24C8 jsr MLI close interpreter file
|
||||
.DA #$CC
|
||||
.DA clparm
|
||||
bne badlod hopefully never taken
|
||||
|
||||
* if booting on a //c then see if esc is in keyboard buffer
|
||||
* and clear it. it may have been pressed to shift speed
|
||||
* of accelerator chip
|
||||
|
||||
lda cflag
|
||||
beq H24DF taken if not booting on a //c
|
||||
lda kbd else, check for keypress
|
||||
cmp #$9B escape?
|
||||
bne H24DF if not.
|
||||
sta kbdstrobe clear keyboard
|
||||
H24DF lda romin enable ROM
|
||||
jmp sysentry go run interpreter
|
||||
cflag .EQ *-ofsL
|
||||
.HS 00 set if a //c.
|
||||
nointrp .EQ *-ofsL no interpreter found,
|
||||
jsr MLI so quit.
|
||||
.DA #$65
|
||||
.DA quitparm
|
||||
badlod ldy ierlen center the error message
|
||||
lda #$27
|
||||
sec
|
||||
sbc ierlen
|
||||
lsr
|
||||
adc ierlen
|
||||
tax
|
||||
H24FA lda iomess,y
|
||||
sta vline16,x
|
||||
dex
|
||||
dey
|
||||
bpl H24FA
|
||||
bmi H2511
|
||||
toolong ldy #$1E
|
||||
H2508 lda lgmess,y
|
||||
sta vline16+5,y
|
||||
dey
|
||||
bpl H2508
|
||||
H2511 bmi H2511
|
||||
lgmess .EQ *-ofsL
|
||||
.AS "** System program too large **"
|
||||
iomess .EQ *-ofsL
|
||||
.AS "** Unable to load"
|
||||
.AS " X.System *********"
|
||||
ierlen .EQ *-ofsL
|
||||
.HS 00
|
||||
opparm .EQ *-ofsL parms for open call
|
||||
.HS 03
|
||||
.DA PrefixBuf
|
||||
.DA iobuf
|
||||
.HS 01
|
||||
efparm .EQ *-ofsL parms for get eof call
|
||||
.HS 02
|
||||
.DA #01
|
||||
eof .EQ *-ofsL
|
||||
.HS 000000 length of file.
|
||||
rdparm .EQ *-ofsL parms for read call
|
||||
.HS 04
|
||||
.HS 01
|
||||
.DA sysentry
|
||||
rdlen .EQ *-ofsL
|
||||
.HS 0000
|
||||
.HS 0000
|
||||
clparm .EQ *-ofsL parms for close call
|
||||
.HS 01
|
||||
.HS 00
|
||||
quitparm .EQ *-ofsL parms for quit call
|
||||
.HS 04
|
||||
.HS 00
|
||||
.HS 0000
|
||||
.HS 00
|
||||
.HS 0000
|
||||
iterp .EQ *-ofsL interpreter suffix that is required
|
||||
.AS ".SYSTEM"
|
||||
|
||||
* 16 bytes moved to $03F0 vectors
|
||||
|
||||
H257B .DA breakv
|
||||
.DA oldrst
|
||||
.DA #$5A powerup byte
|
||||
jmp oldrst '&' vector
|
||||
jmp oldrst ctrl-y vector
|
||||
.HS 004000
|
||||
.DA irqent global page interrupt vector
|
||||
lc1in lda ramin read/write language card RAM bank 1
|
||||
lda ramin
|
||||
rts
|
||||
|
||||
* determine which system model and save in machine id (idapple)
|
||||
|
||||
whchrom stz idapple assume standard apple //
|
||||
ldx version check hardware id
|
||||
cpx #$38 is it apple // (autostart rom)?
|
||||
beq H25BE if yes
|
||||
lda #$80
|
||||
cpx #$06 apple //e?
|
||||
beq H25BC if yes
|
||||
lda #$40
|
||||
cpx #$EA apple //+?
|
||||
bne H25B6 it not, then machine is unknown.
|
||||
ldx HFB1E apple /// in emulation?
|
||||
cpx #$AD
|
||||
beq H25BC taken if apple //+.
|
||||
lda #$D0 test again for apple /// emulation
|
||||
cpx #$8A because will only have 48k memory.
|
||||
bne H25B6 if taken, then machine is unknown.
|
||||
H25B4 sec apple /// emulation is not allowed
|
||||
rts because insufficient memory.
|
||||
H25B6 lda #$02 machine unknown
|
||||
sta (ZP.DstPtr),y
|
||||
bne H25D9 always.
|
||||
H25BC sta idapple save machine id
|
||||
|
||||
* check for language card ram
|
||||
|
||||
H25BE jsr lc1in switch in language card bank 1
|
||||
lda #$AA
|
||||
sta $D000
|
||||
eor $D000 if LC present, result = 0.
|
||||
bne H25B4 othewise, insufficient memory.
|
||||
lsr $D000 check lc again
|
||||
lda #$55
|
||||
eor $D000
|
||||
bne H25B4 not sufficent memory.
|
||||
lda #$20 LC ram is available
|
||||
ora idapple
|
||||
H25D9 jmp tst128 jumps to page 0 routine below
|
||||
|
||||
* test for 128k. use page 0 for this routine
|
||||
|
||||
H25DC sta idapple H25DC-2621 was moved to location tst128
|
||||
bpl not128 if already determined < 128k
|
||||
lda #$EE
|
||||
sta wrcardram write to aux mem while on main zp
|
||||
sta rdcardram and read aux mem.
|
||||
sta dbuf write these locs just to test aux mem
|
||||
sta lodintrp 1k apart from each other.
|
||||
lda dbuf
|
||||
cmp #$EE
|
||||
bne noaux
|
||||
asl dbuf may be sparse mem mapping so
|
||||
asl change value and see what happens.
|
||||
cmp dbuf
|
||||
bne noaux branch if not sparse mapping.
|
||||
cmp lodintrp
|
||||
bne H2606 if not sparse.
|
||||
noaux sec no aux memory available.
|
||||
bcs H2607
|
||||
H2606 clc
|
||||
H2607 sta wrmainram switch back to main memory
|
||||
sta rdmainram
|
||||
bcs not128 if < 128k
|
||||
lda idapple
|
||||
ora #$30 set id = 128k present
|
||||
sta idapple
|
||||
not128 lda lookptr+1
|
||||
sec
|
||||
sbc #$05
|
||||
sta lookptr+1
|
||||
bcs H2620
|
||||
dec lookptr
|
||||
H2620 clc
|
||||
rts
|
||||
|
||||
MAN
|
||||
SAVE USR/SRC/PRODOS.203/PRODOS.S.LDR.A
|
||||
LOAD USR/SRC/PRODOS.203/PRODOS.S
|
||||
ASM
|
|
@ -0,0 +1,908 @@
|
|||
NEW
|
||||
AUTO 3,1
|
||||
|
||||
* prodos greeting splash screen
|
||||
|
||||
LDR.Splash lda spkr click speaker
|
||||
sta clr80vid disable 80 col hardware
|
||||
sta store80off disable 80 col store
|
||||
jsr setnorm set normal text mode
|
||||
jsr init init text screen
|
||||
jsr setvid reset output to screen
|
||||
jsr setkbd reset input to keyboard
|
||||
cld
|
||||
jsr home
|
||||
|
||||
ldx #$07
|
||||
|
||||
.1 lda H2009,x print title
|
||||
sta vline10+16,x
|
||||
dex
|
||||
bpl .1
|
||||
|
||||
ldx #$1D
|
||||
|
||||
.2 lda H2011,x
|
||||
sta vline12+5,x
|
||||
dex
|
||||
bpl .2
|
||||
|
||||
ldx #$0B
|
||||
|
||||
.3 lda H202F,x
|
||||
sta vline14+14,x
|
||||
dex
|
||||
bpl .3
|
||||
|
||||
ldx #$26
|
||||
|
||||
.4 lda H203B,x
|
||||
sta vline23,x
|
||||
dex
|
||||
bpl .4
|
||||
|
||||
ldx #$13
|
||||
|
||||
.5 lda H2062,x
|
||||
sta vline24+10,x
|
||||
dex
|
||||
bpl .5
|
||||
|
||||
sec
|
||||
jsr idroutine returns system info
|
||||
bcs .8 taken if not a //gs
|
||||
|
||||
lda #$80
|
||||
trb newvideo video mode select
|
||||
|
||||
.8 lda spkr click speaker
|
||||
rts
|
||||
|
||||
* find all disk devices in system slots and set up address
|
||||
* and device table in prodos global page. if there is a disk
|
||||
* card in slot 2 then limit the # of devices in slot 5
|
||||
* smartport to only 2
|
||||
|
||||
numdev2 .HS 0000000000000000 8 bytes for smartport call
|
||||
driveradr .DA 0
|
||||
d2idx .DA #0
|
||||
diskins2 .DA #0 msb clear if drive in slot 2
|
||||
|
||||
devsrch stz ZP.DstPtr
|
||||
stz ZP.DstPtr+1
|
||||
stz idxl
|
||||
ldx #$FF init to no active devices.
|
||||
stx numdevs count (-1) active devices.
|
||||
lda #$0E start disk // area at end of devlist.
|
||||
sta d2idx
|
||||
|
||||
* check slot 2. if there is a disk card then clear the msb of diskins2. this
|
||||
* will limit the # of devices in any slot 5 spartport card to 2.
|
||||
|
||||
lda #$C2
|
||||
sta idxl+1 check slot 2
|
||||
jsr cmpid is there a disk in slot 2 ?
|
||||
ror diskins2 if so, clear msb else set it.
|
||||
lda #$C7 search slots from high to low
|
||||
sta idxl+1
|
||||
|
||||
H26AB jsr cmpid
|
||||
bcs H270C if no ProDOS device in this slot.
|
||||
lda (idxl),y check last byte of $Cn rom (y = $ff)
|
||||
beq diskii branch if 16 sector disk II.
|
||||
cmp #$FF if = $FF then 13 sector disk II.
|
||||
bcs H270C ignore if 13 sector boot ROM
|
||||
sta driveradr else assume it's an intelligent disk.
|
||||
ldy #$07 check for a smartport device.
|
||||
lda (idxl),y
|
||||
bne H26C4 no smartport
|
||||
jmp smartprt
|
||||
H26C4 ldy #$FE
|
||||
lda (idxl),y get attributes.
|
||||
and #$03 verify it provides read and status calls.
|
||||
cmp #$03
|
||||
sec assume it's an off-brand disk
|
||||
bne H270C
|
||||
jsr setdevid set up the devid byte from attributes
|
||||
clc
|
||||
php remember that it's not a disk //.
|
||||
lsr move # of units (0=1, 1=2) to carry.
|
||||
lda idxl+1 store hi entry addr (low already done)
|
||||
bne H26E6 branch always.
|
||||
diskii sta devid =0 since disk ii's have null attributes
|
||||
sec
|
||||
php remember it's a disk //
|
||||
lda H2802
|
||||
sta driveradr
|
||||
lda H2802+1
|
||||
H26E6 sta driveradr+1
|
||||
jsr installdev install 1 or 2 devices from this slot.
|
||||
plp get back if it's a disk // (carry).
|
||||
bcc nxtdsk2 if not disk //.
|
||||
dex move the list pointer back by 2 devices
|
||||
dex
|
||||
stx numdevs count (-1) active devices
|
||||
dec d2idx increase the disk two index
|
||||
dec d2idx
|
||||
ldy d2idx
|
||||
inx adj since device count starts with $FF.
|
||||
lda devlist+1,x get entries for disk //
|
||||
sta devlist,y move then toward the end of the list
|
||||
lda devlist,x
|
||||
sta devlist+1,y
|
||||
dex back to numdevs again
|
||||
nxtdsk2 clc
|
||||
H270C jsr sltrom test for ROM in given slot and set flags
|
||||
dec idxl+1 next lower slot.
|
||||
lda idxl+1
|
||||
and #$07 have all slots been checked ?
|
||||
bne H26AB no.
|
||||
|
||||
* perform the new device search, mapping unmounted smartport devices
|
||||
* to empty slots in the device table.
|
||||
|
||||
jsr newmount
|
||||
|
||||
* now copy the disk // list to the end of the regular list.
|
||||
* start by making the device count include disk //'s
|
||||
|
||||
ldx numdevs current device count - 1
|
||||
lda #$0E
|
||||
sec
|
||||
sbc d2idx
|
||||
beq H2747 if there were no disk //'s then done.
|
||||
clc
|
||||
adc numdevs sum of disk //'s and others.
|
||||
sta numdevs
|
||||
inx move to open space in regular list.
|
||||
ldy #$0D first disk // entry.
|
||||
H272F lda devlist,y
|
||||
pha
|
||||
lda devlist,x
|
||||
sta devlist,y
|
||||
pla
|
||||
sta devlist,x
|
||||
inx
|
||||
dey
|
||||
sty d2idx use as a temp
|
||||
cpx d2idx
|
||||
bcc H272F continue until indexes cross
|
||||
H2747 ldy #$00
|
||||
ldx numdevs now change the device order so that
|
||||
H274C lda devlist,x the boot device will have highest
|
||||
pha priority.
|
||||
and #$7F strip off high bit
|
||||
eor devnum for comparison.
|
||||
asl
|
||||
bne H275A
|
||||
pla
|
||||
iny
|
||||
H275A dex
|
||||
bpl H274C
|
||||
ldx numdevs now reverse order of search, hi to lo.
|
||||
tya was boot device found ?
|
||||
beq H2777
|
||||
lda devnum make boot device 1st in search order.
|
||||
sta devlist,x
|
||||
dex
|
||||
bmi H277E branch if only one device.
|
||||
dey is this a 2 drive device ?
|
||||
beq H2777 branch if not.
|
||||
eor #$80 make boot device, drive 2 next.
|
||||
sta devlist,x
|
||||
dex
|
||||
bmi H277E branch if only 1 device, 2 drives.
|
||||
H2777 pla
|
||||
sta devlist,x
|
||||
dex
|
||||
bpl H2777
|
||||
H277E jsr fndtrd save accumulated machine id.
|
||||
beq H2787
|
||||
sta machid machine ID byte
|
||||
rts
|
||||
H2787 jmp H25B6
|
||||
stadrv ora devid combine with attributes.
|
||||
ldx numdevs
|
||||
inx put device # into device list.
|
||||
sta devlist,x
|
||||
asl now form drive 2 device number, if any.
|
||||
rts
|
||||
sltrom bcc H27F3 branch if disk drive
|
||||
|
||||
* test for clock card
|
||||
|
||||
ldy #$06
|
||||
H2799 lda (idxl),y
|
||||
cmp dskid,y
|
||||
bne H27BA no clock
|
||||
dey
|
||||
dey
|
||||
bpl H2799
|
||||
lda idxl+1 transfer hi slot address
|
||||
sbc #$C1 minus $C1 (default) to relocate
|
||||
sta clock64 references to clock rom.
|
||||
lda #$4C enable jump vector in globals.
|
||||
sta clockv P8 clock vector.
|
||||
lda idapple mark clock as present.
|
||||
beq H277E
|
||||
ora #$01
|
||||
sta idapple xxxxxxx1 = clock present.
|
||||
bne H27F3 always taken.
|
||||
|
||||
* test for 80 col card
|
||||
|
||||
H27BA ldy #$05
|
||||
lda (idxl),y
|
||||
cmp #$38
|
||||
bne H27E4
|
||||
ldy #$07
|
||||
lda (idxl),y
|
||||
cmp #$18
|
||||
bne H27E4
|
||||
ldy #$0B
|
||||
lda (idxl),y
|
||||
dec a must = 1
|
||||
bne H27E4
|
||||
iny
|
||||
lda (idxl),y
|
||||
and #$F0 mask off low nibble.
|
||||
cmp #$80 generic for 80-col card.
|
||||
bne H27E4
|
||||
lda idapple
|
||||
beq H277E
|
||||
ora #$02
|
||||
sta idapple xxxxxx1x = 80 col card.
|
||||
bne H27F3 always taken.
|
||||
|
||||
* test for any other rom
|
||||
|
||||
H27E4 ldx #$00
|
||||
lda (idxl)
|
||||
cmp #$FF apple /// non-slot?
|
||||
beq H2801 invalid rom
|
||||
H27EC cmp (idxl) look for floating bus
|
||||
bne H2801 no rom
|
||||
inx
|
||||
bne H27EC
|
||||
H27F3 lda idxl+1 mark a bit in slot byte
|
||||
and #$07 to indicate rom present.
|
||||
tax
|
||||
lda sltbit,x
|
||||
ora rommap mark bit to flag rom present
|
||||
sta rommap slot ROM bit map
|
||||
H2801 rts
|
||||
|
||||
H2802 .DA rwts disk ii driver
|
||||
|
||||
* id bytes: evens for clock, odds for disk
|
||||
|
||||
dskid .HS 082028005803703C
|
||||
|
||||
* slot bits
|
||||
|
||||
sltbit .HS 0002040810204080
|
||||
|
||||
fndtrd clc
|
||||
ldy sltbit
|
||||
H2818 lda (lookptr),y
|
||||
and #$DF
|
||||
adc sltbit
|
||||
sta sltbit
|
||||
rol sltbit
|
||||
iny
|
||||
cpy sltbit+3
|
||||
bne H2818
|
||||
tya
|
||||
asl
|
||||
asl
|
||||
asl
|
||||
asl
|
||||
tay
|
||||
eor sltbit
|
||||
adc #$0B
|
||||
bne H283B
|
||||
lda idapple
|
||||
rts
|
||||
|
||||
H283B lda #$00
|
||||
rts
|
||||
|
||||
installdev php how many drives (carry).
|
||||
lda idxl+1 get index to global device table
|
||||
and #$07 for this slot...
|
||||
asl
|
||||
tay into y reg.
|
||||
asl
|
||||
asl now form device # = slot #
|
||||
asl in high nibble.
|
||||
jsr stadrv OR in low nibble, store in dev list.
|
||||
plp restore # of devices in carry.
|
||||
ror if 2 drives, then bit 7=1.
|
||||
bpl H2853 branch if a 1 drive device (e.g. hard drive)
|
||||
inx else presume that 2nd drive is present.
|
||||
sta devlist,x active device list.
|
||||
|
||||
H2853 stx numdevs save updated device count.
|
||||
asl shift # of drives back into carry.
|
||||
lda driveradr get high address of device driver.
|
||||
sta drivertbl1,y device driver table 1.
|
||||
bcc H2862 branch if single drive.
|
||||
sta drivertbl2,y device driver table 2.
|
||||
|
||||
H2862 lda driveradr+1
|
||||
sta drivertbl1+1,y
|
||||
bcc H286D
|
||||
sta drivertbl2+1,y
|
||||
|
||||
H286D rts
|
||||
|
||||
* query smartport status to determine # of devices
|
||||
* and install up to 4 units in table if card is in slot 5
|
||||
* otherwise only 2 units. this includes a patch #74
|
||||
|
||||
smartprt jsr setdevid setup the devid byte from attributes
|
||||
lda idxl+1
|
||||
sta driveradr+1
|
||||
lda driveradr
|
||||
sta pscall+1 modify operand
|
||||
clc
|
||||
adc #$03
|
||||
sta spvect+1
|
||||
lda driveradr+1
|
||||
sta spvect+2
|
||||
sta pscall+2 modify operand
|
||||
asl convert $Cn to $n0
|
||||
asl
|
||||
asl
|
||||
asl
|
||||
sta unitnum unit number
|
||||
stz A4L force a prodos status call
|
||||
stz buf dummy pointer
|
||||
stz bloknml # of bytes to transfer
|
||||
stz bloknml+1
|
||||
lda #$10
|
||||
sta buf+1 dummy pointer should be <> 0
|
||||
|
||||
* do a prodos status call patched in from above
|
||||
|
||||
pscall jsr $0000 self modifying code
|
||||
ldy #$FB
|
||||
lda (idxl),y check device id
|
||||
and #$02 SCSI?
|
||||
beq H28B1 no, no need to init Cocoon
|
||||
sta statunit device = 2 for SCSI
|
||||
|
||||
* initialize SCSI Cocoon to build internal device tables
|
||||
* and report true # of devices attached
|
||||
|
||||
jsr spvect status of Cocoon
|
||||
.HS 00
|
||||
.DA spcparms ignore any errors.
|
||||
H28B1 stz statunit set unit# = 0
|
||||
jsr spvect call to get the device count.
|
||||
.HS 00 this is a status call
|
||||
.DA spcparms
|
||||
lda numdev2
|
||||
beq donesp no devices, so done.
|
||||
cmp #$02 carry set if 2,3,4
|
||||
jsr installdev do the 1st and 2nd device if exists.
|
||||
lda idxl+1
|
||||
cmp #$C5
|
||||
bne donesp if not slot 5
|
||||
|
||||
* for slot 5, if there is a disk card in slot 2
|
||||
* then only install 2 devices otherwise map
|
||||
* extra devices as slot 2
|
||||
|
||||
bit diskins2 disk in slot 2 ?
|
||||
bpl donesp yes - so done
|
||||
lda numdev2
|
||||
cmp #$03 carry set if 3,4,...
|
||||
bcc donesp
|
||||
cmp #$04 carry set if 4,5,6,...
|
||||
lda #$C2 map extra devices as slot 2
|
||||
sta idxl+1
|
||||
jsr installdev
|
||||
lda #$C5
|
||||
sta idxl+1
|
||||
donesp jmp nxtdsk2 it's a disk device.
|
||||
setdevid ldy #$FE check attributes byte.
|
||||
H28E8 lda (idxl),y
|
||||
lsr move hi nibble to lo nibble for
|
||||
lsr device table entries.
|
||||
lsr
|
||||
lsr
|
||||
sta devid
|
||||
rts
|
||||
|
||||
* check unknown card to see if disk id = $Cn00:nn 20 nn 00 nn 03
|
||||
|
||||
cmpid lda clrrom switch out $C8 ROMs
|
||||
ldy #$05
|
||||
H28F6 lda (idxl),y compare id bytes
|
||||
cmp dskid,y
|
||||
sec set if no disk card
|
||||
bne H2903
|
||||
dey
|
||||
dey
|
||||
bpl H28F6 loop until all 4 id bytes match.
|
||||
clc clear if disk card
|
||||
H2903 rts
|
||||
|
||||
* smartport call parameters
|
||||
|
||||
spcparms .DA #$03 # of parms
|
||||
statunit .DA #$00 unit number (code for smartport stat)
|
||||
.DA numdev2
|
||||
.DA #00 status code (0 = general status)
|
||||
|
||||
* indexes into driver table
|
||||
|
||||
driveridx .DA #$06 s3, d1
|
||||
.DA #$1E s7, d2
|
||||
.DA #$0E s7, d1
|
||||
.DA #$1C s6, d2
|
||||
.DA #$0C s6, d1
|
||||
.DA #$1A s5, d2
|
||||
.DA #$0A s5, d1
|
||||
.DA #$14 s2, d2
|
||||
.DA #$04 s2, d1
|
||||
.DA #$12 s1, d2
|
||||
.DA #$02 s1, d1
|
||||
.DA #$18 s4, d2
|
||||
.DA #$08 s4, d1
|
||||
|
||||
* self modifying jmp = smartport entry address
|
||||
|
||||
spvect jmp $0000 self modifying
|
||||
newmount stz idxl
|
||||
lda #$C7 start with slot 7 ($C700)
|
||||
sta idxl+1
|
||||
H291F jsr H29EB is there a smartport device here?
|
||||
bcs H2974 no, next device.
|
||||
ldy #$FF get smartport address.
|
||||
lda (idxl),y
|
||||
clc
|
||||
adc #$03 add 3 for smartport call
|
||||
sta spvect+1
|
||||
lda idxl+1
|
||||
sta spvect+2
|
||||
dey
|
||||
jsr H28E8 set up device attributes
|
||||
stz statunit
|
||||
jsr spvect do a status call on smartport itself
|
||||
.HS 00
|
||||
.DA spcparms
|
||||
lda numdev2 # of devices on smartport
|
||||
cmp #$03
|
||||
bcc H2974 only 2 devices,skip to next one.
|
||||
inc add 1 for comparisons.
|
||||
sta driveradr # of devices + 1.
|
||||
lda #$03 start at unit #3 (non-slot 5)
|
||||
ldx spvect+2
|
||||
cpx #$C5 is this slot 5?
|
||||
bne H295B no, start at 3.
|
||||
bit diskins2 disk controller in slot 2?
|
||||
bpl H295B yes, so allow remapping of s5 devices
|
||||
lda #$05 else start looking at unit #5
|
||||
|
||||
* find block devices on this smartport
|
||||
|
||||
H295B cmp driveradr have we done all units in this slot?
|
||||
bcs H2974 yes, skip to next slot.
|
||||
sta statunit store the unit#.
|
||||
jsr spvect do status call
|
||||
.HS 00
|
||||
.DA spcparms
|
||||
lda numdev2 is this a block device?
|
||||
bmi mount yes, so mount it.
|
||||
H296E lda statunit go check the next unit#
|
||||
inc
|
||||
bra H295B
|
||||
H2974 dec idxl+1
|
||||
lda idxl+1
|
||||
cmp #$C0 searched down to slot 0?
|
||||
bne H291F if not.
|
||||
rts
|
||||
mount ldx #$0C
|
||||
H297F ldy driveridx,x
|
||||
lda drivertbl1,y device driver table 1
|
||||
cmp #nodevice
|
||||
bne H2990
|
||||
lda drivertbl1+1,y
|
||||
cmp /nodevice
|
||||
beq H2994
|
||||
H2990 dex
|
||||
bpl H297F
|
||||
rts ran out of space for devices, exit.
|
||||
|
||||
* empty slot found
|
||||
|
||||
H2994 lda idxl+1
|
||||
pha
|
||||
phx
|
||||
phy
|
||||
tya which slot is empty?
|
||||
lsr shift into slot#
|
||||
and #$07 now 1-7
|
||||
ora #$C0 now $C1-$C7
|
||||
sta idxl+1
|
||||
jsr H29EB smartport interface in this slot?
|
||||
ply
|
||||
plx
|
||||
pla
|
||||
sta idxl+1
|
||||
bcc H2990 yes, can't use to mirror the device.
|
||||
jsr lc1in write enable LC ram bank 1.
|
||||
tya divide index by 2
|
||||
lsr
|
||||
tax
|
||||
lda statunit
|
||||
sta spunit-1,x store the smartport unit #
|
||||
lda spvect+1 and entry address.
|
||||
sta spvectlo-1,x
|
||||
lda spvect+2
|
||||
sta spvecthi-1,x
|
||||
lda romin write protect lc ram.
|
||||
inc numdevs
|
||||
ldx numdevs
|
||||
tya
|
||||
lsr
|
||||
cmp #$08
|
||||
bcc nodev2 drive 2 mount
|
||||
sbc #$08
|
||||
ora #$08
|
||||
nodev2 asl
|
||||
asl
|
||||
asl
|
||||
asl
|
||||
ora devid include device attributes
|
||||
sta devlist,x in the active device list.
|
||||
lda #remap_sp
|
||||
sta drivertbl1,y device driver table 1
|
||||
lda /remap_sp
|
||||
sta drivertbl1+1,y
|
||||
bra H296E
|
||||
H29EB jsr cmpid is it a disk controller?
|
||||
bcs H29F8 no, so return.
|
||||
sec assume no smartport
|
||||
ldy #$07
|
||||
lda (idxl),y is it a smartport?
|
||||
bne H29F8 if not.
|
||||
clc smartport found
|
||||
H29F8 rts
|
||||
|
||||
* relocation subroutine. on entry, regs yx = address of parameter table
|
||||
* with the following parameters:
|
||||
*
|
||||
* (1) command: 0 = zero destination range
|
||||
* 1 = move data from src to ZP.DstPtr
|
||||
* 2 = hi addr ref tbl, relocate and move
|
||||
* 3 = lo/hi addr ref tbl, relocate and move
|
||||
* 4 = program, relocate and move
|
||||
* >4 = end of sequence of commands
|
||||
* (2) destination
|
||||
* (2) length
|
||||
* (2) source
|
||||
* (1) # of address ranges (n) to be relocated
|
||||
* (n+1) list of low page addresses to be relocated
|
||||
* (n+1) list of high page addresses to be relocated
|
||||
* (n+1) list of offset amounts to be added to be added
|
||||
* if low and high limits have not been met
|
||||
*
|
||||
* on exit, carry set if error and yx = addr of error
|
||||
* with acc = $00 for table error or $FF if illegal opcode
|
||||
|
||||
reloc stx idxl save address of control table
|
||||
sty idxl+1
|
||||
rloop lda (idxl) get relocation command.
|
||||
cmp #$05
|
||||
bcs rlend taken if >= 5 then done.
|
||||
tax move destination to page 0
|
||||
ldy #$01 for indirect access.
|
||||
lda (idxl),y
|
||||
sta ZP.DstPtr
|
||||
iny
|
||||
lda (idxl),y
|
||||
sta ZP.DstPtr+1
|
||||
iny
|
||||
lda (idxl),y also the length (byte count)
|
||||
sta cnt of the destination area.
|
||||
iny
|
||||
lda (idxl),y
|
||||
sta cnt+1
|
||||
bmi rlerr branch if >= 32k.
|
||||
txa is it a request to zero destination?
|
||||
beq zero if yes.
|
||||
iny
|
||||
lda (idxl),y get source address.
|
||||
sta src used for move.
|
||||
sta cde used for relocation
|
||||
iny
|
||||
clc
|
||||
adc cnt add length to get final address
|
||||
sta ecde
|
||||
lda (idxl),y
|
||||
sta src+1
|
||||
sta cde+1
|
||||
adc cnt+1
|
||||
sta ecde+1
|
||||
dex test for 'move' command
|
||||
beq H2AA3 branch if move only (no relocation)
|
||||
stx wsize save element size (1,2,3)
|
||||
iny
|
||||
lda (idxl),y get # of ranges that are valid
|
||||
sta sgcnt relocation target addresses.
|
||||
tax separate serial range groups into tbls
|
||||
H2A42 iny
|
||||
lda (idxl),y transfer low limits to 'limlo' table
|
||||
sta limlo,x
|
||||
dex
|
||||
bpl H2A42
|
||||
ldx sgcnt # of ranges
|
||||
H2A4E iny
|
||||
lda (idxl),y transfer high limits to 'limhi' table
|
||||
sta limhi,x
|
||||
dex
|
||||
bpl H2A4E
|
||||
ldx sgcnt # of ranges
|
||||
H2A5A iny
|
||||
lda (idxl),y transfer offsets to 'ofset' table
|
||||
sta ofset,x
|
||||
dex
|
||||
bpl H2A5A
|
||||
jsr adjtbl adj index pointer to next entry.
|
||||
ldx wsize test for machine code relocation
|
||||
cpx #$03
|
||||
beq rlcode branch if program relocation
|
||||
jsr reladr otherwise, relocate addresses in
|
||||
H2A70 jsr move tables then move to destination.
|
||||
bra rloop do next table
|
||||
rlend clc
|
||||
rts
|
||||
rlerr jmp tblerr
|
||||
rlcode jsr rlprog relocate machine code refs
|
||||
bra H2A70
|
||||
|
||||
* fill destination range with 0's
|
||||
|
||||
zero jsr adjtbl adj table pointer to next entry.
|
||||
lda #$00
|
||||
ldy cnt+1 is it at least 1 page?
|
||||
beq H2A94 branch if not.
|
||||
tay
|
||||
H2A89 sta (ZP.DstPtr),y
|
||||
iny
|
||||
bne H2A89
|
||||
inc ZP.DstPtr+1 next page
|
||||
dec cnt+1
|
||||
bne H2A89 if more pages to clear.
|
||||
H2A94 ldy cnt any bytes left to 0?
|
||||
beq H2AA0 if not.
|
||||
tay
|
||||
H2A99 sta (ZP.DstPtr),y zero out remainder
|
||||
iny
|
||||
cpy cnt
|
||||
bcc H2A99
|
||||
H2AA0 jmp rloop
|
||||
H2AA3 jsr adjtbl
|
||||
bra H2A70
|
||||
adjtbl tya add previous table length to
|
||||
sec get next entry position in table
|
||||
adc idxl
|
||||
sta idxl
|
||||
bcc H2AB2
|
||||
inc idxl+1
|
||||
H2AB2 rts
|
||||
move lda src+1 is move up, down or not at all?
|
||||
cmp ZP.DstPtr+1
|
||||
bcc movup
|
||||
bne movdn
|
||||
lda src
|
||||
cmp ZP.DstPtr
|
||||
bcc movup
|
||||
bne movdn
|
||||
rts no move.
|
||||
movup ldy cnt+1 calc highest page to move up
|
||||
tya and adj src and ZP.DstPtr.
|
||||
clc
|
||||
adc src+1
|
||||
sta src+1
|
||||
tya
|
||||
clc
|
||||
adc ZP.DstPtr+1
|
||||
sta ZP.DstPtr+1
|
||||
ldy cnt move partial page 1st.
|
||||
beq H2ADE taken if no partial pages
|
||||
H2AD6 dey
|
||||
lda (src),y
|
||||
sta (ZP.DstPtr),y
|
||||
tya end of page transfer?
|
||||
bne H2AD6 no
|
||||
H2ADE dec ZP.DstPtr+1
|
||||
dec src+1
|
||||
dec cnt+1 done with all pages?
|
||||
bpl H2AD6 no
|
||||
rts
|
||||
movdn ldy #$00
|
||||
lda cnt+1 partial page move only?
|
||||
beq H2AFC taken if < 1 page to move
|
||||
H2AED lda (src),y
|
||||
sta (ZP.DstPtr),y
|
||||
iny
|
||||
bne H2AED
|
||||
inc ZP.DstPtr+1 next page
|
||||
inc src+1
|
||||
dec cnt+1 more pages?
|
||||
bne H2AED if more.
|
||||
H2AFC lda cnt move partial page.
|
||||
beq H2B09 if no more to move
|
||||
H2B00 lda (src),y
|
||||
sta (ZP.DstPtr),y
|
||||
iny
|
||||
cpy cnt
|
||||
bne H2B00
|
||||
H2B09 rts
|
||||
|
||||
* relocate addresses
|
||||
|
||||
reladr ldy wsize 1 or 2 byte reference
|
||||
dey
|
||||
lda (cde),y
|
||||
jsr adjadr relocate reference.
|
||||
lda wsize update and test code pointer.
|
||||
jsr adjcde
|
||||
bcc reladr if more to do
|
||||
rts
|
||||
rlprog ldy #$00 get next opcode
|
||||
lda (cde),y
|
||||
jsr oplen determine if a 3 byte instruction.
|
||||
beq rperr branch if not an opcode
|
||||
cmp #$03
|
||||
bne H2B30
|
||||
ldy #$02
|
||||
jsr adjadr relocate address
|
||||
lda #$03
|
||||
H2B30 jsr adjcde update and test if done.
|
||||
bcc rlprog if more to do
|
||||
rts
|
||||
rperr pla
|
||||
pla
|
||||
ldx cde bad code address in y,x
|
||||
ldy cde+1
|
||||
lda #$FF indicates bad opcode
|
||||
sec
|
||||
rts
|
||||
tblerr ldx idxl bad table address in y,x
|
||||
ldy idxl+1
|
||||
lda #$00 indicates input table error
|
||||
sec
|
||||
rts
|
||||
adjadr lda (cde),y get page address and
|
||||
ldx sgcnt test against limits.
|
||||
H2B4D cmp limlo,x is it >= low?
|
||||
bcc H2B59 if not.
|
||||
cmp limhi,x is it <= high?
|
||||
bcc H2B5D branch if it is
|
||||
beq H2B5D
|
||||
H2B59 dex try next limit set
|
||||
bpl H2B4D
|
||||
rts return w/o adjustment.
|
||||
H2B5D clc add offset to form relocated
|
||||
adc ofset,x page address and replace
|
||||
sta (cde),y old address with result.
|
||||
rts
|
||||
adjcde clc update code pointer
|
||||
adc cde
|
||||
ldy cde+1
|
||||
bcc H2B6C branch if not page cross
|
||||
iny otherwise, update page#.
|
||||
H2B6C cpy ecde+1 has all code/data been processed?
|
||||
bcc H2B72 if not.
|
||||
cmp ecde
|
||||
H2B72 sta cde save updated values.
|
||||
sty cde+1
|
||||
rts return result (carry set = done).
|
||||
oplen pha form index to tbl & which 2-bit group.
|
||||
and #$03 low 2 bits specify group
|
||||
tay
|
||||
pla
|
||||
lsr upper 6 bits specify byte in table
|
||||
lsr
|
||||
tax
|
||||
lda opcodln,x
|
||||
nxgroup dey is opcode len in lowest 2 bits of acc?
|
||||
bmi H2B89 branch if it is
|
||||
lsr shift to next group.
|
||||
lsr (if length = 0 then error)
|
||||
bne nxgroup
|
||||
H2B89 and #$03
|
||||
rts if z-set then error
|
||||
|
||||
* relocation table contains length of each opcode in 2-bit groups
|
||||
|
||||
opcodln .HS 0928193C0A280D3C
|
||||
.HS 0B2A193F0A280D3C
|
||||
.HS 0928193F0A280D3C
|
||||
.HS 0928193F0A280D3C
|
||||
.HS 082A113F0A2A1D0C
|
||||
.HS 2A2A193F0A2A1D3F
|
||||
.HS 0A2A193F0A280D3C
|
||||
.HS 0A2A193F0A280D3C
|
||||
|
||||
wsize .HS 00
|
||||
sgcnt .HS 00
|
||||
limlo .HS 0000000000000000
|
||||
limhi .HS 0000000000000000
|
||||
ofset .HS 0000000000000000
|
||||
|
||||
* patch to gsos vectors so error is returned for os calls - rev note #101
|
||||
|
||||
patch101 .OP 65816
|
||||
php
|
||||
sei disable interrupts
|
||||
clc
|
||||
xce full native mode
|
||||
|
||||
phb save DBR
|
||||
pha
|
||||
pha
|
||||
pea $0000 length of patch
|
||||
pea $0010 0000/0010 = 16 bytes
|
||||
pea $3101 user id for prodos 8
|
||||
pea $8018 attributes (locked/nospec/nocross)
|
||||
pha
|
||||
pha
|
||||
>IIGS NewHandle
|
||||
lda $01,s retrieve handle
|
||||
tax
|
||||
lda $03,s
|
||||
tay
|
||||
pea $0000 copy the code into the handle
|
||||
pea L2C4D
|
||||
phy
|
||||
phx
|
||||
pea $0000 length of patch = 0000/0010
|
||||
pea $0010
|
||||
_PtrToHand
|
||||
plx low word of handle
|
||||
plb set DBR to handle's bank
|
||||
lda >1,x get upper 16 bits of 24 bit address
|
||||
tay save in y
|
||||
lda 0,x get low 8 bits of address
|
||||
and #$00FF clear high byte
|
||||
xba put address in high byte
|
||||
ora #$005C include JML opcode
|
||||
sta >GSOS2 store in gsos vectors
|
||||
clc
|
||||
adc #$000B
|
||||
sta >GSOS
|
||||
tya store upper 16 bits too
|
||||
sta >GSOS2+2
|
||||
adc #$0000 adj for possible page crossing
|
||||
sta >GSOS+2
|
||||
plb remove garbage byte from stack
|
||||
plb restore DBR.
|
||||
sec
|
||||
xce back to emulation mode
|
||||
plp
|
||||
rts
|
||||
|
||||
* copy of the code that goes in the handle
|
||||
|
||||
L2C4D lda $01,s
|
||||
sta $07,s
|
||||
lda $02,s
|
||||
sta $08,s
|
||||
pla
|
||||
pla
|
||||
pla
|
||||
lda #$00FF #NoOS
|
||||
sec
|
||||
rtl
|
||||
|
||||
.BS $2C80-*
|
||||
MAN
|
||||
SAVE USR/SRC/PRODOS.203/PRODOS.S.LDR.B
|
||||
LOAD USR/SRC/PRODOS.203/PRODOS.S
|
||||
ASM
|
File diff suppressed because it is too large
Load Diff
|
@ -4,7 +4,7 @@ NEW
|
|||
* /RAM driver (main bank portion)
|
||||
* origin = $FF00
|
||||
|
||||
ofsR2 .EQ lcsrc-lcdest offset from ram driver org
|
||||
ofsR2 .EQ *-lcdest offset from ram driver org
|
||||
|
||||
lcsrc cld no decimal.
|
||||
ldx #$0B save 13 bytes of parms
|
||||
|
|
|
@ -42,7 +42,7 @@ RAM_1 .BS $2C80-*
|
|||
rts end of obj ram_1
|
||||
|
||||
RAM_1_END .EQ * end of /RAM installer
|
||||
.BS #256-* pad 0's to page boundary
|
||||
.BS 256-* pad 0's to page boundary
|
||||
*--------------------------------------
|
||||
MAN
|
||||
SAVE USR/SRC/PRODOS.203/PRODOS.S.RAMI
|
||||
|
|
|
@ -1,6 +1,6 @@
|
|||
NEW
|
||||
AUTO 3,1
|
||||
object code = ram_0
|
||||
* object code = ram_0
|
||||
* /RAM driver (aux bank portion)
|
||||
* this code is packed into $200 length with no room for expansion !!
|
||||
* (see note at end of this obj)
|
||||
|
@ -16,7 +16,7 @@ object code = ram_0
|
|||
* $60-$67: returns blocks $68-$7F in bank 1 of language card
|
||||
* $68-$7F: returns blocks $68-$7F in bank 2 of language card
|
||||
|
||||
ofsR0 .EQ ramsrc-ramdest offset to /RAM driver org
|
||||
ofsR0 .EQ *-ramdest offset to /RAM driver org
|
||||
|
||||
ramsrc lda rd80col read 80 store
|
||||
pha save for later
|
||||
|
@ -29,7 +29,7 @@ L5109 lda A4L,x cmd, unit, bufptr and block (lo)
|
|||
and formatflg format the volume first time
|
||||
bne L514F thru, or when requested.
|
||||
ldx bloknml save R01 during format.
|
||||
lda #>vblock1 block to be cleared.
|
||||
lda /vblock1 block to be cleared.
|
||||
jsr clrbuf1 clears all buffers.
|
||||
ldy #$03 format volume in 2 chunks.
|
||||
L511F lda VDIR,y
|
||||
|
@ -87,9 +87,9 @@ L5179 sta R01 restore R1.
|
|||
pha
|
||||
ldx R2L
|
||||
sta setaltzp use alternate zero page/stack
|
||||
lda #>dbuf set R2 to dbuf
|
||||
lda /dbuf set R2 to dbuf
|
||||
sta R2H
|
||||
lda #<dbuf
|
||||
lda #dbuf
|
||||
sta R2L
|
||||
jsr setptr set pointers
|
||||
tay A > 0 from setptr
|
||||
|
@ -119,7 +119,7 @@ L51B8 jsr blockdo0 transfer main to dbuf.
|
|||
* write is done (R2->R1); if cmd is 1, a read is done (R1->R2).
|
||||
|
||||
blockdo0 .EQ *-ofsR0 set up R1 = dbuf
|
||||
lda #>dbuf
|
||||
lda /dbuf
|
||||
blockdo1 .EQ *-ofsR0
|
||||
sta R01
|
||||
blockdo .EQ *-ofsR0
|
||||
|
@ -136,16 +136,16 @@ L51CC lda (A1L),y transfer A1,A2 to A4,A3
|
|||
sta wrcardram back the way it was.
|
||||
donewrt .EQ *-ofsR0 mainwrt returns here
|
||||
rts
|
||||
L51DB lda #<mainwrt pointers set up,
|
||||
L51DB lda #mainwrt pointers set up,
|
||||
sta passit pass control to main ram
|
||||
lda #>mainwrt
|
||||
lda /mainwrt
|
||||
jmp ex1 set passit+1 and transfer
|
||||
|
||||
* setptr is used by other routines to set up pointers and dtect read or write
|
||||
|
||||
setptr .EQ *-ofsR0
|
||||
lda tcmd is it read or write ?
|
||||
lsr a
|
||||
lsr
|
||||
bcs L5208 taken if write.
|
||||
lda R2H destination page
|
||||
sta A4L+1
|
||||
|
@ -160,7 +160,7 @@ setptr .EQ *-ofsR0
|
|||
sta A1L
|
||||
sta A2L
|
||||
beq L5223
|
||||
L5208 lda R2H source page
|
||||
L5208 lda R2H source page
|
||||
sta A1L+1
|
||||
sta A2L+1
|
||||
lda R2L
|
||||
|
@ -172,8 +172,8 @@ L5208 lda R2H source page
|
|||
lda #$00 destination page aligned
|
||||
sta A4L
|
||||
sta A3L
|
||||
L5223 inc2L+1
|
||||
inc3L+1
|
||||
L5223 inc A2L+1
|
||||
inc A3L+1
|
||||
rts
|
||||
|
||||
* tzip is called if blocks 0,1,4,5 are requested.
|
||||
|
@ -187,7 +187,7 @@ tzip jsr clrbuf0 fill dbuf with 0's
|
|||
* should only be called on a read or format.
|
||||
|
||||
clrbuf0 .EQ *-ofsR0
|
||||
lda #>dbuf dbuf is temp buffer.
|
||||
lda /dbuf dbuf is temp buffer.
|
||||
clrbuf1 .EQ *-ofsR0
|
||||
sta R01 assign to block.
|
||||
clrbuf2 .EQ *-ofsR0
|
||||
|
@ -266,7 +266,7 @@ L5285 asl acc = 2 * acc
|
|||
* at $800 is used to build/read a full size bitmap block.
|
||||
|
||||
tbmap .EQ *-ofsR0
|
||||
lda #>dbuf use temp buffer as block
|
||||
lda /dbuf use temp buffer as block
|
||||
sta R01
|
||||
jsr setptr set pointers, test read/write.
|
||||
bcs L52A9 branch if it's write.
|
||||
|
@ -307,7 +307,7 @@ VDIR .EQ *-ofsR0 start of vdir.
|
|||
.HS F3 storage type = F, name length = 3
|
||||
.AS "RAM"
|
||||
access .EQ *-ofsR0
|
||||
.DA #C3 destroy, rename, read enabled
|
||||
.DA #$C3 destroy, rename, read enabled
|
||||
.HS 27 entry length
|
||||
.HS 0D
|
||||
.HS 0000
|
||||
|
|
|
@ -9,7 +9,7 @@ NEW
|
|||
* must remain somewhere between $E000-$F7FF. this routine must be less
|
||||
* than 3 pages in length.
|
||||
|
||||
ofsS .EQ disp1obj-dispadr offset to dispatcher org
|
||||
ofsS .EQ *-dispadr offset to dispatcher org
|
||||
|
||||
disp1obj lda romin read ROM
|
||||
sta clr80vid disable 80 col hardware
|
||||
|
@ -31,14 +31,14 @@ L5A22 sta memmap,x
|
|||
sta memmap $400-$7FF (text screen display)
|
||||
L5A2D jsr home clear screen
|
||||
jsr crout position top/left
|
||||
ldx #<dsp1msg0-dsp1msgs
|
||||
ldx #dsp1msg0-dsp1msgs
|
||||
jsr prntmsg 'enter prefix...'
|
||||
lda #$03 line 3
|
||||
sta cv
|
||||
jsr crout
|
||||
jsr MLI get prefix
|
||||
.DA #$C7'
|
||||
.DA dsp1pfx'
|
||||
.DA #$C7
|
||||
.DA dsp1pfx
|
||||
ldx PrefixBuf get prefix length
|
||||
lda #$00 put 0 at end of prefix
|
||||
sta PrefixBuf+1,x
|
||||
|
@ -99,15 +99,15 @@ L5ABD cpx #$00 prefix length = 0 ?
|
|||
beq L5AD3 if yes, don't set length.
|
||||
stx PrefixBuf set prefix length.
|
||||
jsr MLI call mli to set prefix.
|
||||
.DA #$C6'
|
||||
.DA dsp1pfx'
|
||||
.DA #$C6
|
||||
.DA dsp1pfx
|
||||
bcc L5AD3 if ok, go get filename.
|
||||
jsr bell if not, ring bell
|
||||
lda #$00 and try again for prefix.
|
||||
L5AD1 beq L5A76
|
||||
L5AD3 jsr home clear screen for application name.
|
||||
jsr crout
|
||||
ldx #<disp1msg-dsp1msgs
|
||||
ldx #disp1msg-dsp1msgs
|
||||
jsr prntmsg 'enter pathname...'
|
||||
retryrich .EQ *-ofsS
|
||||
lda #$03 line 3
|
||||
|
@ -159,8 +159,8 @@ L5B3C lda #$A0
|
|||
jsr cout after cr, blank out the cursor.
|
||||
stx PrefixBuf put length in front of the name.
|
||||
jsr MLI get file info for pathname in PrefixBuf
|
||||
.DA #$C4'
|
||||
.DA dsp1info'
|
||||
.DA #$C4
|
||||
.DA dsp1info
|
||||
bcc L5B4F if no errors.
|
||||
jmp dsp1error
|
||||
L5B4F lda dsp1type
|
||||
|
@ -171,8 +171,8 @@ L5B4F lda dsp1type
|
|||
L5B5B lda #$00 it's a system file
|
||||
sta dsp1cln
|
||||
jsr MLI close all open files
|
||||
.DA #$CC'
|
||||
.DA dsp1cls'
|
||||
.DA #$CC
|
||||
.DA dsp1cls
|
||||
bcc L5B6B
|
||||
jmp dsp1error
|
||||
L5B6B lda dsp1acess check for proper access.
|
||||
|
@ -181,16 +181,16 @@ L5B6B lda dsp1acess check for proper access.
|
|||
lda #$27 i/o error
|
||||
jmp dsp1error
|
||||
L5B77 jsr MLI open the file
|
||||
.DA #$C8'
|
||||
.DA dsp1open'
|
||||
.DA #$C8
|
||||
.DA dsp1open
|
||||
bcc L5B82
|
||||
jmp dsp1error
|
||||
L5B82 lda dsp1refn copy the reference number
|
||||
sta dsp1rdn
|
||||
sta dsp1eofn
|
||||
jsr MLI get eof
|
||||
.DA #$D1'
|
||||
.DA dsp1eof'
|
||||
.DA #$D1
|
||||
.DA dsp1eof
|
||||
bcs L5BE2
|
||||
lda dsp1eofb+2 3rd of 3 bytes.
|
||||
beq L5B9C if 0 then ok
|
||||
|
@ -201,12 +201,12 @@ L5B9C lda dsp1eofb move eof to # of bytes to read.
|
|||
lda dsp1eofb+1
|
||||
sta dsp1cnt+1
|
||||
jsr MLI read the file
|
||||
.DA #$CA'
|
||||
.DA dsp1read'
|
||||
.DA #$CA
|
||||
.DA dsp1read
|
||||
php save the status.
|
||||
jsr MLI close the file.
|
||||
.DA #$CC'
|
||||
.DA dsp1cls'
|
||||
.DA #$CC
|
||||
.DA dsp1cls
|
||||
bcc L5BBB
|
||||
L5BB7 plp get status (it is irrelevant now)
|
||||
bne L5BE2 if close generated an error
|
||||
|
@ -242,7 +242,7 @@ L5BE2 sta errnum
|
|||
lda errnum
|
||||
cmp #$01
|
||||
bne L5BF5
|
||||
ldx #<dsp1err1-dsp1msgs not a type 'sys' file
|
||||
ldx #dsp1err1-dsp1msgs not a type 'sys' file
|
||||
bne L5C0B handled separately.
|
||||
L5BF5 cmp #$40 syntax error in pathname ?
|
||||
beq L5C09
|
||||
|
@ -252,69 +252,69 @@ L5BF5 cmp #$40 syntax error in pathname ?
|
|||
beq L5C09
|
||||
cmp #$46 file not found ?
|
||||
beq L5C09
|
||||
ldx #<dsp1err2-dsp1msgs if not the errors above then 'i/o error'
|
||||
ldx #dsp1err2-dsp1msgs if not the errors above then 'i/o error'
|
||||
bne L5C0B
|
||||
L5C09 ldx #<dsp1err3-dsp1msgs otherwise display 'file/path not found'
|
||||
L5C09 ldx #dsp1err3-dsp1msgs otherwise display 'file/path not found'
|
||||
L5C0B jsr prntmsg
|
||||
jmp retryrich retry for application pathname
|
||||
msb on
|
||||
|
||||
dsp1msgs .EQ *-ofsS
|
||||
dsp1msg0 .EQ *-ofsS
|
||||
dc c'ENTER PREFIX (PRESS "RETURN" TO ACCEPT)'
|
||||
.AS "ENTER PREFIX (PRESS "RETURN" TO ACCEPT)"
|
||||
.HS 00
|
||||
disp1msg .EQ *-ofsS
|
||||
dc c'ENTER PATHNAME OF NEXT APPLICATION'
|
||||
.AS "ENTER PATHNAME OF NEXT APPLICATION"
|
||||
.HS 00
|
||||
dsp1err1 .EQ *-ofsS
|
||||
.DA #87'
|
||||
dc c'NOT A TYPE "SYS" FILE'
|
||||
.DA #$87
|
||||
.AS "NOT A TYPE "SYS" FILE"
|
||||
.HS 00
|
||||
dsp1err2 .EQ *-ofsS
|
||||
.DA #87'
|
||||
dc c'I/O ERROR '
|
||||
.DA #$87
|
||||
.AS "I/O ERROR "
|
||||
.HS 00
|
||||
dsp1err3 .EQ *-ofsS
|
||||
.DA #87'
|
||||
dc c'FILE/PATH NOT FOUND '
|
||||
.DA #$87
|
||||
.AS "FILE/PATH NOT FOUND "
|
||||
.HS 00
|
||||
dsp1info .EQ *-ofsS get file info parms
|
||||
.DA #0A' 10 parameters
|
||||
.DA PrefixBuf' pathname buffer
|
||||
.DA #$0A 10 parameters
|
||||
.DA PrefixBuf pathname buffer
|
||||
dsp1acess .EQ *-ofsS
|
||||
.HS 00 access
|
||||
dsp1type .EQ *-ofsS
|
||||
.HS 00 file type
|
||||
ds 13 the rest are unimportant
|
||||
.BS 13 the rest are unimportant
|
||||
dsp1open .EQ *-ofsS open file parms
|
||||
dc h'03' 3 parameters for open
|
||||
.DA PrefixBuf' pathname buffer
|
||||
.DA fbuf' fcb buffer
|
||||
.HS 03 3 parameters for open
|
||||
.DA PrefixBuf pathname buffer
|
||||
.DA fbuf fcb buffer
|
||||
dsp1refn .EQ *-ofsS
|
||||
.HS 00 reference #
|
||||
dsp1cls .EQ *-ofsS close file parms
|
||||
.DA #01' 1 parameter for close
|
||||
.DA #01 1 parameter for close
|
||||
dsp1cln .EQ *-ofsS
|
||||
.HS 00 reference #
|
||||
dsp1read .EQ *-ofsS
|
||||
dc h'04' 4 parameters for read
|
||||
.HS 04 4 parameters for read
|
||||
dsp1rdn .EQ *-ofsS
|
||||
.HS 00 reference #
|
||||
.DA sysentry' .SYS load address
|
||||
.DA sysentry .SYS load address
|
||||
dsp1cnt .EQ *-ofsS
|
||||
.HS 0000 byte count
|
||||
.HS 0000
|
||||
dsp1eof .EQ *-ofsS get eof parms
|
||||
dc h'02' 2 parameters
|
||||
.HS 02 2 parameters
|
||||
dsp1eofn .EQ *-ofsS
|
||||
.HS 00 reference #
|
||||
dsp1eofb .EQ *-ofsS
|
||||
dc h'000000' 3 byte eof
|
||||
.HS 000000 3 byte eof
|
||||
dsp1pfx .EQ *-ofsS get/set prefix parms
|
||||
.DA #01' 1 parameter
|
||||
.DA PrefixBuf' prefix buffer
|
||||
.DA #01 1 parameter
|
||||
.DA PrefixBuf prefix buffer
|
||||
|
||||
disp1end .EQ *
|
||||
ds $300-(disp1end-disp1obj) fill to page boundary
|
||||
.BS $300-disp1end+disp1obj fill to page boundary
|
||||
|
||||
* end of obj sel_0
|
||||
*--------------------------------------
|
||||
|
|
|
@ -3,12 +3,12 @@ NEW
|
|||
* object code = sel_1
|
||||
* Bird's Better Bye at org = dispadr
|
||||
|
||||
ofsB .EQ birdbye-dispadr offset to Bird's Bye org
|
||||
ofsB .EQ *-dispadr offset to Bird's Bye org
|
||||
|
||||
birdbye cld
|
||||
lda romin read ROM
|
||||
stz softev
|
||||
lda #>dispadr set reset vector to 'dispadr'
|
||||
lda /dispadr set reset vector to 'dispadr'
|
||||
sta softev+1
|
||||
jsr setpwrc create power-up byte
|
||||
lda #$A0
|
||||
|
@ -46,8 +46,8 @@ L5D3F dex decrement list pointer and restore.
|
|||
|
||||
volname sta ol_unit store unit number for online.
|
||||
jsr MLI
|
||||
.DA #$C5' online call
|
||||
.DA ol_parms'
|
||||
.DA #$C5 online call
|
||||
.DA ol_parms
|
||||
bcs L5D32 error check.
|
||||
stz dlevel haven't read root directory yet.
|
||||
lda PrefixBuf+1 load description byte.
|
||||
|
@ -65,8 +65,8 @@ vnam1 .EQ *-ofsB
|
|||
* open and read directory
|
||||
|
||||
jsr MLI
|
||||
.DA #$C8' open
|
||||
.DA op_parms'
|
||||
.DA #$C8 open
|
||||
.DA op_parms
|
||||
bcc L5D7F good open.
|
||||
lda dlevel trying to open root directory ?
|
||||
beq L5D32 yes, just move to next volume.
|
||||
|
@ -124,8 +124,8 @@ L5DCE dey decrement file block counter
|
|||
L5DD8 adc #$04 add 4 and put in
|
||||
sta fpos_lo low byte of setmark.
|
||||
jsr MLI call mli
|
||||
.DA #$CE' set mark
|
||||
.DA #smparms' parameters address = $0060
|
||||
.DA #$CE set mark
|
||||
.DA #smparms parameters address = $0060
|
||||
.HS 00
|
||||
bcs L5DB3 error
|
||||
jsr doread
|
||||
|
@ -161,8 +161,8 @@ L5E15 lda sysentry,y get byte of filename
|
|||
bne L5DB5 get next file (branch always)
|
||||
L5E26 jmp ds2 error. try next unit.
|
||||
L5E29 jsr MLI close directory file
|
||||
.DA #$CC'
|
||||
.DA cl_parms'
|
||||
.DA #$CC
|
||||
.DA cl_parms
|
||||
bcs L5E26 error.
|
||||
jsr settxt use full screen for windows
|
||||
jsr home
|
||||
|
@ -262,8 +262,8 @@ L5EF1 jmp vnam1 get new directory info.
|
|||
* run selected file
|
||||
|
||||
L5EF4 jsr MLI set prefix
|
||||
.DA #$C6'
|
||||
.DA pf_parms'
|
||||
.DA #$C6
|
||||
.DA pf_parms
|
||||
bcs L5EED error.
|
||||
ldx valcnt get name number.
|
||||
jsr namecalc set up name storage area (on return y=0)
|
||||
|
@ -276,15 +276,15 @@ L5F04 iny start at y = 1.
|
|||
bcc L5F04 loop until all transferred.
|
||||
stx PrefixBuf put prefix length into buffer.
|
||||
ldy valcnt get file number.
|
||||
lda |filetyps,y get file type.
|
||||
lda filetyps,y get file type.
|
||||
bpl L5EF0 branch if directory.
|
||||
jsr settxt reset to full window.
|
||||
jsr home makes for no flash.
|
||||
lda #$95 ctrl-u
|
||||
jsr cout turn off 80 columns.
|
||||
jsr MLI open file
|
||||
.DA #$C8'
|
||||
.DA op_parms'
|
||||
.DA #$C8
|
||||
.DA op_parms
|
||||
bcs L5EED if error.
|
||||
lda op_refn move reference number
|
||||
sta rd_refn for read.
|
||||
|
@ -294,8 +294,8 @@ L5F04 iny start at y = 1.
|
|||
jsr doread read selected file.
|
||||
php save possible error.
|
||||
jsr MLI close file. ignore any error from close
|
||||
.DA #$CC'
|
||||
.DA cl_parms'
|
||||
.DA #$CC
|
||||
.DA cl_parms
|
||||
plp restore status from read.
|
||||
bcs L5EED if any errors.
|
||||
jmp sysentry execute selected system file.
|
||||
|
@ -327,7 +327,7 @@ namecalc .EQ *-ofsB
|
|||
asl
|
||||
rol fnstore+1
|
||||
sta fnstore low pointer
|
||||
lda #>iobuf
|
||||
lda /iobuf
|
||||
clc
|
||||
adc fnstore+1
|
||||
sta fnstore+1
|
||||
|
@ -353,7 +353,7 @@ nameprnt .EQ *-ofsB
|
|||
stz ch80col adjust cursor position.
|
||||
lda invflg save current inverse setting
|
||||
pha
|
||||
ldy #<fldrmsg-dsp2msg
|
||||
ldy #fldrmsg-dsp2msg
|
||||
jsr msgout display the folder.
|
||||
pla restore inverse setting.
|
||||
sta invflg
|
||||
|
@ -374,45 +374,45 @@ output .EQ *-ofsB
|
|||
L5FB1 jmp cout output to screen.
|
||||
doread .EQ *-ofsB
|
||||
jsr MLI mli read call
|
||||
.DA #$CA'
|
||||
.DA rd_parms'
|
||||
.DA #$CA
|
||||
.DA rd_parms
|
||||
rts
|
||||
|
||||
* data area
|
||||
|
||||
dsp2msg .EQ *-ofsB
|
||||
dc c'RETURN: Select | TAB: Chg Vol | '
|
||||
dc c'ESC: Back'
|
||||
.DA #$00'
|
||||
.AS "RETURN: Select | TAB: Chg Vol | "
|
||||
.AS "ESC: Back"
|
||||
.DA #$00
|
||||
fldrmsg .EQ *-ofsB
|
||||
.DA #0F' inverse control code
|
||||
dc h'1B' enable mousetext
|
||||
dc c'XY' folder characters
|
||||
dc h'18' disable mousetext
|
||||
dc h'0E' normal control code
|
||||
.DA #$0F inverse control code
|
||||
.HS 1B enable mousetext
|
||||
.AS "XY" folder characters
|
||||
.HS 18 disable mousetext
|
||||
.HS 0E normal control code
|
||||
.HS 00
|
||||
op_parms .EQ *-ofsB open parameters
|
||||
.DA #03' 3 parms
|
||||
.DA PrefixBuf' pathname
|
||||
.DA op_buf' file buffer
|
||||
.DA #$03 3 parms
|
||||
.DA PrefixBuf pathname
|
||||
.DA op_buf file buffer
|
||||
op_refn .EQ *-ofsB
|
||||
.HS 00 reference number
|
||||
cl_parms .EQ *-ofsB close parameters
|
||||
dc h'01' 1 parm
|
||||
.HS 01 1 parm
|
||||
.HS 00 reference number.
|
||||
ol_parms .EQ *-ofsB online parameters
|
||||
dc h'02' 2 parms
|
||||
.HS 02 2 parms
|
||||
ol_unit .EQ *-ofsB
|
||||
dc h'60' unit number, default = s6, d1
|
||||
.DA PrefixBuf+1' data buffer
|
||||
.HS 60 unit number, default = s6, d1
|
||||
.DA PrefixBuf+1 data buffer
|
||||
pf_parms .EQ *-ofsB set prefix parameters
|
||||
.DA #01' one parm
|
||||
.DA PrefixBuf' pathname
|
||||
.DA #01 one parm
|
||||
.DA PrefixBuf pathname
|
||||
rd_parms .EQ *-ofsB read parameters
|
||||
.DA #04' 4 parms
|
||||
.DA #04 4 parms
|
||||
rd_refn .EQ *-ofsB
|
||||
dc h'01' reference number
|
||||
.DA sysentry' data buffer
|
||||
.HS 01 reference number
|
||||
.DA sysentry data buffer
|
||||
|
||||
* these last 2 parms (4 bytes) may extend past $300 length limit since
|
||||
* the request count is set prior to using the parm block and the transfer
|
||||
|
|
|
@ -15,7 +15,7 @@ NEW
|
|||
|
||||
.OP 65816
|
||||
|
||||
ofsQ .EQ GQdisp-dispadr offset to GQuit dispatcher org
|
||||
ofsQ .EQ *-dispadr offset to GQuit dispatcher org
|
||||
|
||||
GQdisp lda ramin read/write LC bank 1
|
||||
clc
|
||||
|
@ -41,8 +41,8 @@ GQdisp lda ramin read/write LC bank 1
|
|||
* so in case of an error setting the P8 prefix, it can be displayed in the
|
||||
* error message.
|
||||
|
||||
SHORT M 8 bit accumulator
|
||||
LONGI ON
|
||||
* SHORT M 8 bit accumulator
|
||||
* LONG I ON
|
||||
pha save the switch status.
|
||||
ldx #inbuf point to passed prefix.
|
||||
jsr copyvol copy the name into the buffer.
|
||||
|
@ -68,7 +68,7 @@ L6020 jsr MLI set prefix
|
|||
* load application at $2000
|
||||
|
||||
L602D xce native mode (carry clear)
|
||||
LONG I 16 bit regs, 8 bit acc.
|
||||
* LONG I 16 bit regs, 8 bit acc.
|
||||
lda PrefixBuf+1 is the application name
|
||||
cmp #$2F a complete pathname ?
|
||||
bne L603D no, use prefix as volume name
|
||||
|
@ -126,7 +126,7 @@ L6099 lda romin enable ROM
|
|||
gqerror .EQ *-ofsQ
|
||||
clc
|
||||
xce 16 bit native mode
|
||||
LONG I,M
|
||||
* LONG I,M
|
||||
jsr mountvol mount volume.
|
||||
bcs L60AB if error.
|
||||
sec back to emulation mode.
|
||||
|
@ -138,13 +138,13 @@ gqerror .EQ *-ofsQ
|
|||
|
||||
L60AB clc native mode
|
||||
xce
|
||||
LONG I,M
|
||||
* LONG I,M
|
||||
and #$00FF mask off high byte of error code.
|
||||
pha put on stack for IntMath tool call.
|
||||
pea $0000 errval>>16
|
||||
pea errval push address of string buffer.
|
||||
pea $0004 make string 4 digits long.
|
||||
_Int2Hex convert value to hex string.
|
||||
>IIGS Int2Hex convert value to hex string.
|
||||
pha make space for return value.
|
||||
pea $0000 quitstr1>>16
|
||||
pea quitstr1 push first error message address
|
||||
|
@ -154,11 +154,11 @@ L60AB clc native mode
|
|||
pea button1 push first button text address
|
||||
pea $0000 quitbtn2>>16
|
||||
pea quitbtn2 push 2nd button text address (null)
|
||||
_TLTextMountVolume make the dialog box
|
||||
>IIGS TLTextMountVolume make the dialog box
|
||||
pla retrieve button press (not used)
|
||||
sec emulation mode
|
||||
xce
|
||||
jsr MLI quit back to GQuit
|
||||
jsr MLI quit back to GQuit
|
||||
.DA #$65
|
||||
.DA quitparms
|
||||
|
||||
|
@ -203,7 +203,7 @@ L6101 pha save error code in case esc pressed.
|
|||
pea button1 'Return'
|
||||
pea $0000 button2>>16
|
||||
pea button2 'Escape'
|
||||
_TLTextMountVolume
|
||||
>IIGS TLTextMountVolume
|
||||
lda [$01] restore first 2 bytes of vilume name
|
||||
xba back to their original positions
|
||||
inc and values.
|
||||
|
@ -227,12 +227,12 @@ L613C sec indicate Escape was pressed.
|
|||
* output: volume name is stored in volbuf.
|
||||
|
||||
copyvol .EQ *-ofsQ
|
||||
lda |1,x get the first slash
|
||||
sta volbuf+1
|
||||
ldy #$0002 initialize the length count.
|
||||
LONGI OFF
|
||||
LONGA OFF
|
||||
L6148 lda |2,x now copy the volume name up to
|
||||
lda 1,x get the first slash
|
||||
sta volbuf+1
|
||||
ldy #$0002 initialize the length count.
|
||||
* LONGI OFF
|
||||
* LONGA OFF
|
||||
L6148 lda 2,x now copy the volume name up to
|
||||
cmp #$2F the separating slash.
|
||||
beq L6156
|
||||
sta volbuf,y
|
||||
|
@ -264,9 +264,9 @@ L6170 lda #$FF put flag conditioning value on
|
|||
pha the stack (assume error).
|
||||
clc native 16-bit mode.
|
||||
xce
|
||||
LONG I,M
|
||||
* LONG I,M
|
||||
pha make room on stack for user id.
|
||||
_MMStartUp start up the memory manager.
|
||||
>IIGS MMStartUp start up the memory manager.
|
||||
pla get the user id and
|
||||
pha leave it on the stack.
|
||||
pha
|
||||
|
@ -277,7 +277,7 @@ L6170 lda #$FF put flag conditioning value on
|
|||
pea $0000 totally unrestricted block.
|
||||
pha LocationPtr (not used)
|
||||
pha
|
||||
_NewHandle go get the block of memory.
|
||||
>IIGS NewHandle go get the block of memory.
|
||||
pla get the handle from the stack.
|
||||
plx
|
||||
bcs L620A branch if error, no memory available.
|
||||
|
@ -287,7 +287,7 @@ L6170 lda #$FF put flag conditioning value on
|
|||
pea $0001 get a type 1 (filename) message.
|
||||
phx put the message handle on the stack
|
||||
pha (still in acc and x regs)
|
||||
_MessageCenter
|
||||
>IIGS MessageCenter
|
||||
bcs L6203 branch if no message.
|
||||
pha leave 4 bytes free on stack
|
||||
pha (will be used as a direct page pointer)
|
||||
|
@ -311,7 +311,7 @@ L6170 lda #$FF put flag conditioning value on
|
|||
inc $02
|
||||
L61D1 lda [$00] get the length of the string.
|
||||
and #$00FF mask off high (leaving just the length)
|
||||
SHORT M 8 bit accumulator
|
||||
* SHORT M 8 bit accumulator
|
||||
cmp sysentry+5 check against length of app buffer.
|
||||
beq L61DF if equal then continue with move.
|
||||
bcs bad_msg if too long then bad message.
|
||||
|
@ -323,7 +323,8 @@ L61E0 lda [$00],y get a character.
|
|||
bpl L61E0
|
||||
lda #$00 change flag conditioning value on stack
|
||||
sta $0D,s to indicate a filename is passed.
|
||||
bad_msg LONG M 16-bit acc.
|
||||
bad_msg
|
||||
* LONG M 16-bit acc.
|
||||
pld restore direct register.
|
||||
pla fix stack because handle and userid
|
||||
pla still on stack.
|
||||
|
@ -331,12 +332,12 @@ bad_msg LONG M 16-bit acc.
|
|||
pea $0001 message type 1.
|
||||
pha garbage handle (not used).
|
||||
pha
|
||||
_MessageCenter go delete the message.
|
||||
L6203 _DisposeHandle throw away message (handle is on stack)
|
||||
L620A _MMShutDown shutdown the memory manager (userid is
|
||||
>IIGS MessageCenter go delete the message.
|
||||
L6203 >IIGS DisposeHandle throw away message (handle is on stack)
|
||||
L620A >IIGS MMShutDown shutdown the memory manager (userid is
|
||||
sec on stack).
|
||||
xce back to emulation mode.
|
||||
LONGA OFF
|
||||
* LONGA OFF
|
||||
pla condition z-flag with value on stack.
|
||||
bne L6231 then done.
|
||||
ldx inbuf get length of pathname.
|
||||
|
@ -359,11 +360,11 @@ L6231 rts and go launch the app.
|
|||
* on exit:
|
||||
* carry clear = disk was found
|
||||
* carry set = disk not found
|
||||
|
||||
.OP 65816
|
||||
ckfordrv .EQ *-ofsQ
|
||||
clc native mode
|
||||
xce
|
||||
LONG I 16-bit regs, 8-bit acc.
|
||||
* LONG I 16-bit regs, 8-bit acc.
|
||||
ldx #sysentry+6 point to pathname buffer.
|
||||
jsr copyvol copy volume name to pathname buffer.
|
||||
.1 sec emulation mode.
|
||||
|
@ -374,14 +375,14 @@ ckfordrv .EQ *-ofsQ
|
|||
bcc .2 branch if volume found,
|
||||
clc (native mode)
|
||||
xce
|
||||
LONG I,M
|
||||
* LONG I,M
|
||||
jsr mountvol else ask user to mount the volume.
|
||||
bcc .1 if <return> pressed, then try again.
|
||||
sec emulation mode.
|
||||
xce
|
||||
sec disk not found.
|
||||
.2 rts
|
||||
|
||||
.OP 65C02
|
||||
* Prodos 8 parameter lists
|
||||
|
||||
pfxparms .EQ *-ofsQ set prefix parms.
|
||||
|
|
|
@ -6,7 +6,7 @@ NEW
|
|||
|
||||
* $2F00-2F7C moved to $D742
|
||||
|
||||
ofsT .EQ tclock_0-tclk_in offset to Thunderclock org
|
||||
ofsT .EQ *-tclk_in offset to Thunderclock org
|
||||
|
||||
tclock_0 ldx clkslt clock slot = $C1.
|
||||
lda clkmode,x save current mode
|
||||
|
|
|
@ -0,0 +1,663 @@
|
|||
NEW
|
||||
AUTO 3,1
|
||||
* object code = mli_2
|
||||
* xdos mli system call processor
|
||||
.OP 65C02
|
||||
ofsX .EQ *-xdosorg offset to xdos org
|
||||
|
||||
xdosmli .EQ *-ofsX xdos MLI in aux ram
|
||||
* cld no decimal.
|
||||
pla get processor status
|
||||
sta spare1 save it temporarily
|
||||
sty mliy save x and y
|
||||
stx mlix
|
||||
pla find out the address of the caller
|
||||
sta A3L
|
||||
clc preserve the address of the call spec.
|
||||
adc #$04
|
||||
sta mliretn last MLI call return address
|
||||
pla
|
||||
sta A3L+1
|
||||
adc #$00
|
||||
sta mliretn+1
|
||||
lda spare1
|
||||
pha pull processor status
|
||||
plp to re-enable interrupts.
|
||||
cld still no decimal
|
||||
ldy #$00
|
||||
sty p8error clear any previous errors.
|
||||
iny find out if command is valid.
|
||||
lda (A3L),y get command #
|
||||
lsr and hash it to a range of 0-$1F
|
||||
lsr
|
||||
lsr
|
||||
lsr
|
||||
clc
|
||||
adc (A3L),y
|
||||
and #$1F
|
||||
tax
|
||||
lda (A3L),y check result to see if valid command #
|
||||
cmp scnums,x
|
||||
bne scnerr
|
||||
iny index to call spec parm list.
|
||||
lda (A3L),y make A3L point to parameter count byte
|
||||
pha in parameter block.
|
||||
iny
|
||||
lda (A3L),y
|
||||
sta A3L+1
|
||||
pla
|
||||
sta A3L
|
||||
ldy #$00 make sure parameter list has the
|
||||
lda pcntbl,x correct # of parameters.
|
||||
beq goclock clock has 0 parameters.
|
||||
cmp (A3L),y
|
||||
bne scperr error if wrong count.
|
||||
lda scnums,x get call # again
|
||||
cmp #$65 is it quit?
|
||||
beq special if so, then call quit dispatcher
|
||||
asl carry set if bfm or dev mgr
|
||||
bpl godevmgr
|
||||
bcs gobfmgr
|
||||
lsr shift back down for interrupt manager
|
||||
and #$03 valid calls are 0 and 1
|
||||
jsr intmgr
|
||||
bra exitmli
|
||||
special jmp jspare P8 system death vector
|
||||
goclock jsr clockv go read clock.
|
||||
bra exitmli no errors possible
|
||||
godevmgr lsr shift back down for device manager.
|
||||
adc #$01 valid commands are 1 and 2.
|
||||
sta A4L save command #.
|
||||
jsr devmgr execute read or write request.
|
||||
bra exitmli
|
||||
gobfmgr lsr shift back down for block file manager.
|
||||
and #$1F valid commands are 0-$13
|
||||
tax
|
||||
jsr bfmgr
|
||||
exitmli stz bubit clear backup bit
|
||||
ldy p8error P8 error code
|
||||
cpy #$01 if > 0 then set carry
|
||||
tya and set z flag.
|
||||
php disable interrupts until exit complete.
|
||||
sei
|
||||
lsr mliact indicate MLI done.
|
||||
plx save status register until return.
|
||||
lda mliretn+1 place last MLI call return address
|
||||
pha on stack. return is done via 'rti'
|
||||
lda mliretn so the status register is restored
|
||||
pha at the same time, so
|
||||
phx place status back on stack
|
||||
tya return error, if any.
|
||||
ldx mlix MLI X register savearea
|
||||
ldy mliy MLI Y register savearea
|
||||
pha
|
||||
lda bnkbyt1 restore language card status
|
||||
jmp HBFA0 and return.
|
||||
nodevice .EQ *-ofsX
|
||||
lda #$28 no device connected.
|
||||
jsr p8errv P8 error vector.
|
||||
scnerr lda #$01 no such command.
|
||||
bne H30B0
|
||||
scperr lda #$04 parameter count is invalid
|
||||
H30B0 jsr gosyserr
|
||||
bcs exitmli always taken
|
||||
|
||||
* ProDOS Device Manager
|
||||
|
||||
devmgr .EQ *-ofsX
|
||||
ldy #$05
|
||||
php do not allow interrupts.
|
||||
sei the call spec for devices must
|
||||
H30B9 lda (A3L),y be passed to drivers in page zero:
|
||||
sta (A4L),y sta $0042,y
|
||||
dey
|
||||
bne H30B9
|
||||
ldx buf+1 buffer page
|
||||
stx usrbuf+1 to user buffer
|
||||
inx
|
||||
inx
|
||||
lda buf is buffer page aligned (nn00) ?
|
||||
beq H30CC branch if it is
|
||||
inx else account for 3-page straddle
|
||||
H30CC jsr vldbuf1 make sure user buffer is not
|
||||
bcs dvmgrerr conflicting with protected ram.
|
||||
jsr dmgr call internal entry for device dispatch
|
||||
bcs dvmgrerr branch if error
|
||||
plp
|
||||
clc no error
|
||||
rts
|
||||
dvmgrerr plp restore interrupt status
|
||||
gosyserr .EQ *-ofsX
|
||||
jsr p8errv P8 error vector
|
||||
dmgr .EQ *-ofsX interrupts must always be off.
|
||||
lda unitnum get device # and
|
||||
and #$F0 strip misc lower nibble
|
||||
sta unitnum then save it.
|
||||
lsr use as index to device table
|
||||
lsr
|
||||
lsr
|
||||
tax
|
||||
lda drivertbl1,x fetch driver address
|
||||
sta goadr
|
||||
lda drivertbl1+1,x
|
||||
sta goadr+1
|
||||
gocmd .EQ *-ofsX
|
||||
jmp (goadr) goto driver (or error if no driver)
|
||||
|
||||
* ProDOS interrupt manager
|
||||
|
||||
intmgr .EQ *-ofsX
|
||||
sta A4L interrupt command
|
||||
lsr allocate interrupt or deallocate?
|
||||
bcs dealcint branch if deallocate.
|
||||
ldx #$03 test for a free interrupt space in tbl.
|
||||
alcint lda inttbl-2,x test high address for 0.
|
||||
bne H3118 branch if spot occupied.
|
||||
ldy #$03 get address of routine.
|
||||
lda (A3L),y must not be zero page.
|
||||
beq badint error if it is.
|
||||
sta inttbl-2,x save high address
|
||||
dey
|
||||
lda (A3L),y
|
||||
sta inttbl-3,x and low address.
|
||||
txa return interrupt # in range 1-4
|
||||
lsr
|
||||
dey
|
||||
sta (A3L),y pass back to user.
|
||||
clc no errors.
|
||||
rts
|
||||
H3118 inx
|
||||
inx next lower priority spot
|
||||
cpx #$0B are all 4 already allocated?
|
||||
bne alcint branch if not.
|
||||
lda #$25 interrupt table full
|
||||
bne H3124
|
||||
badint lda #$53 invalid parameter.
|
||||
H3124 jsr p8errv P8 error vector.
|
||||
dealcint ldy #$01 zero out interrupt vector
|
||||
lda (A3L),y but make sure it is a valid #.
|
||||
beq badint error if < 1
|
||||
cmp #$05 or > 4
|
||||
bcs badint
|
||||
asl
|
||||
tax
|
||||
lda #$00 now clear it
|
||||
sta inttbl-2,x
|
||||
sta inttbl-1,x
|
||||
clc
|
||||
rts
|
||||
irqrecev .EQ *-ofsX
|
||||
lda accsav get acc from where old ROM put it.
|
||||
sta p8areg
|
||||
stx p8xreg entry point on ram card interrupt
|
||||
sty p8yreg
|
||||
tsx
|
||||
stx p8sreg
|
||||
lda irqflag irq flag = 0 if old roms
|
||||
bne H315D and 1 if new roms.
|
||||
pla restore return address and p-reg.
|
||||
sta p8preg
|
||||
pla
|
||||
sta intadr interrupt return address
|
||||
pla
|
||||
sta intadr+1
|
||||
H315D txs
|
||||
lda mslot set up to re-enable $Cn00 rom
|
||||
sta irqdev+2
|
||||
tsx make sure stack has room for 16 bytes.
|
||||
bmi H3170 branch if stack ok
|
||||
ldy #$0F otherwise, make room and save it.
|
||||
H3169 pla
|
||||
sta svstack,y
|
||||
dey
|
||||
bpl H3169
|
||||
H3170 ldx #$FA save 6 bytes of page 0
|
||||
H3172 lda $00,x
|
||||
sta svzerop-$FA,x
|
||||
inx
|
||||
bne H3172
|
||||
|
||||
* poll interrupt routines for a claimer
|
||||
|
||||
lda inttbl+1 test for a valid routine.
|
||||
beq intr2 branch if no routine.
|
||||
jsr goint1 execute
|
||||
bcc irqdone
|
||||
intr2 lda inttbl+3 repeat 3 more times
|
||||
beq intr3
|
||||
jsr goint2
|
||||
bcc irqdone
|
||||
intr3 lda inttbl+5
|
||||
beq intr4
|
||||
jsr goint3
|
||||
bcc irqdone
|
||||
intr4 lda inttbl+7
|
||||
beq H31A2
|
||||
jsr goint4
|
||||
bcc irqdone
|
||||
H31A2 inc irqcount allow 255 unclaimed interrupts
|
||||
bne irqdone before system death.
|
||||
lda #$01 bad irq so
|
||||
jsr sysdeath kill the system.
|
||||
irqdone ldx #$FA
|
||||
H31AE lda svzerop-$FA,x restore the zero page
|
||||
sta $00,x
|
||||
inx
|
||||
bne H31AE
|
||||
ldx p8sreg test if stack needs restoring.
|
||||
bmi H31C6 branch if not.
|
||||
ldy #$00
|
||||
H31BD lda svstack,y restore stack
|
||||
pha
|
||||
iny
|
||||
cpy #$10
|
||||
bne H31BD
|
||||
H31C6 lda irqflag check for old roms.
|
||||
bne H31DD branch if new roms.
|
||||
ldy p8yreg restore registers.
|
||||
ldx p8xreg
|
||||
lda clrrom re-enable i/o card.
|
||||
irqdev .EQ *-ofsX
|
||||
lda $C100 Cn is self modifying.
|
||||
lda irqdev+2 restore device id.
|
||||
sta mslot slot being accessed.
|
||||
H31DD jmp irqexit do necessary bank switches and return.
|
||||
irqflag .EQ *-ofsX
|
||||
.HS 00 0 = old roms. 1 = new roms.
|
||||
irqcount .EQ *-ofsX
|
||||
.HS 00 # of unclaimed interrupts.
|
||||
svstack .EQ *-ofsX temporary save area from stack
|
||||
.HS 0000000000000000
|
||||
.HS 0000000000000000
|
||||
svzerop .EQ *-ofsX temporary save area for zero page
|
||||
.HS 000000000000
|
||||
goint1 .EQ *-ofsX
|
||||
jmp (inttbl) interrupt routine 1
|
||||
goint2 .EQ *-ofsX
|
||||
jmp (inttbl+2) interrupt routine 2
|
||||
goint3 .EQ *-ofsX
|
||||
jmp (inttbl+4) interrupt routine 3
|
||||
goint4 .EQ *-ofsX
|
||||
jmp (inttbl+6) interrupt routine 4
|
||||
syserr1 .EQ *-ofsX
|
||||
sta p8error P8 error code
|
||||
plx
|
||||
plx pop 1 level of return
|
||||
sec
|
||||
rts
|
||||
sysdeath1 .EQ *-ofsX
|
||||
tax death error code.
|
||||
sta clr80vid disable 80 col hardware.
|
||||
lda txtset switch in text.
|
||||
lda cortflag is this a Cortland?
|
||||
beq H321A if not, don't use super hires switch.
|
||||
stz newvideo force off super hires.
|
||||
H321A lda txtpage1 switch in text page 1.
|
||||
ldy #$13
|
||||
H321F lda #$20 inverse space border
|
||||
sta vline11+10,y
|
||||
sta vline13+10,y
|
||||
lda deathmsg,y
|
||||
sta vline12+10,y 'RESTART SYSTEM-$0x'
|
||||
dey
|
||||
bpl H321F
|
||||
txa x = death error code
|
||||
and #$0F convert to ascii
|
||||
ora #$B0
|
||||
cmp #$BA
|
||||
bcc H323B branch if not > 9.
|
||||
adc #$06 inc to alpha a-f
|
||||
H323B sta vline12+28 death error code 1 to F
|
||||
H323E bra H323E end of xdos mli
|
||||
|
||||
* ProDOS Block File Manager
|
||||
|
||||
bfmgr .EQ *-ofsX
|
||||
lda disptch,x translate into command address.
|
||||
asl bit 7 indicates pathname to process
|
||||
sta cmdtemp
|
||||
and #$3F bit 6 is refnum, 5 is time to process
|
||||
tax
|
||||
lda cmdtable,x move address to indirect jump
|
||||
sta goadr
|
||||
lda cmdtable+1,x high byte
|
||||
sta goadr+1
|
||||
lda #$20 init backup bit flag
|
||||
sta bkbitflg to say 'file modified'
|
||||
bcc nopath
|
||||
jsr setpath process pathname before calling command
|
||||
bcs errorsys branch if bad name.
|
||||
nopath asl cmdtemp test for refnum processing
|
||||
bcc nopreref
|
||||
jsr findfcb set pointers to fcb and vcb of file
|
||||
bcs errorsys
|
||||
nopreref asl cmdtemp check for necessity of time stamp
|
||||
bcc H3274
|
||||
jsr clockv date/time
|
||||
H3274 jsr gocmd execute command
|
||||
bcc goodop
|
||||
errorsys jsr p8errv P8 error vector
|
||||
goodop rts
|
||||
setpath .EQ *-ofsX
|
||||
ldy #$01 index to pathname pointer
|
||||
lda (A3L),y low pointer address
|
||||
sta zpt
|
||||
iny
|
||||
lda (A3L),y hi pointer address
|
||||
sta zpt+1
|
||||
synpath .EQ *-ofsX entry used by rename for 2nd pathname.
|
||||
ldx #$00 x = index to pathbuf
|
||||
ldy #$00 y = index to input pathname.
|
||||
stx prfxflg assume prefix is in use.
|
||||
stx pathbuf mark pathbuf = nothing processed.
|
||||
lda (zpt),y validate pathname length > 0 and < 65
|
||||
beq errsyn
|
||||
cmp #$41
|
||||
bcs errsyn
|
||||
sta pathcnt this is used to compare for
|
||||
inc pathcnt end of pathname processing.
|
||||
iny now check for full pathname...
|
||||
lda (zpt),y (full name if starts with '/')
|
||||
ora #$80
|
||||
cmp #$AF
|
||||
bne H32AD branch if prefix appended.
|
||||
sta prfxflg set prefix flag = prefix not used.
|
||||
iny index to 1st character of pathname.
|
||||
H32AD lda #$FF set current position of pathbuf
|
||||
sta pathbuf,x to indicate end of pathname.
|
||||
sta namcnt $FF = no chars processed in local name.
|
||||
stx namptr pointer to local name length byte.
|
||||
H32B8 cpy pathcnt done with pathname processing?
|
||||
bcs endpath
|
||||
lda (zpt),y get character
|
||||
and #$7F
|
||||
inx prepare for next char
|
||||
iny
|
||||
cmp #$2F is it delimiter '/' ?
|
||||
beq endname yes
|
||||
cmp #$61 lowercase?
|
||||
bcc H32CD no
|
||||
and #$5F shift to uppercase
|
||||
H32CD sta pathbuf,x store char
|
||||
inc namcnt is it the 1st char of a local name?
|
||||
bne H32DA no
|
||||
inc namcnt increment to 1
|
||||
bne H32E6 1st char must be alpha (always taken)
|
||||
H32DA cmp #$2E is it '.' ?
|
||||
beq H32B8 ok, then do next char
|
||||
cmp #$30 at least a '0' ?
|
||||
bcc errsyn error if not
|
||||
cmp #$3A is it numeric?
|
||||
bcc H32B8 yes, get next char
|
||||
H32E6 cmp #$41 at least an 'a' ?
|
||||
bcc errsyn error if not
|
||||
cmp #$5B is it > 'z' ?
|
||||
bcc H32B8 branch if valid alpha to get next char
|
||||
errsyn sec bad pathname
|
||||
lda #$40
|
||||
rts
|
||||
endpath lda #$00 end pathname with a 0
|
||||
bit namcnt also make sure count is positive
|
||||
bpl H32FD
|
||||
sta namcnt
|
||||
dex
|
||||
H32FD inx
|
||||
sta pathbuf,x
|
||||
beq errsyn error if '/' only.
|
||||
stx pathcnt save length of pathname
|
||||
tax
|
||||
endname lda namcnt validate local name < 16
|
||||
cmp #$10
|
||||
bcs errsyn
|
||||
phx save pointer
|
||||
ldx namptr get index to beginning of local name
|
||||
sta pathbuf,x save local name's length
|
||||
plx restore pointer
|
||||
bne H32AD branch if more names to process
|
||||
clc probably no error, but
|
||||
lda prfxflg make sure all pathnames are prefixed
|
||||
bne H3323 or begin with a '/'.
|
||||
lda newpfxptr must be non-zero
|
||||
beq errsyn
|
||||
H3323 rts
|
||||
|
||||
* set prefix command
|
||||
|
||||
setprefx .EQ *-ofsX
|
||||
jsr setpath call is made to detect if a null path.
|
||||
bcc H3333 path ok.
|
||||
ldy pathbuf is it a null pathname?
|
||||
bne pfxerr error if not
|
||||
jsr stypfx indicate null prefix
|
||||
clc no error
|
||||
rts
|
||||
H3333 jsr findfile go find specified prefix directory.
|
||||
bcc H333C if no error.
|
||||
cmp #$40 bad pathname.
|
||||
bne pfxerr branch if error is not root directory.
|
||||
H333C lda d_stor make sure last local name is dir type
|
||||
and #$D0 (either root or sub).
|
||||
eor #$D0 directory?
|
||||
bne ptyperr wrong type
|
||||
ldy prfxflg new or appended prefix?
|
||||
bne H334D
|
||||
lda newpfxptr append new prefix to old
|
||||
H334D tay
|
||||
sec find new beginning of prefix
|
||||
sbc pathcnt
|
||||
cmp #$C0 too long?
|
||||
bcc errsyn then error
|
||||
tax
|
||||
jsr stapfx
|
||||
lda d_dev save device #
|
||||
sta p_dev
|
||||
lda d_frst and address of 1st block
|
||||
sta p_blok
|
||||
lda d_frst+1
|
||||
sta p_blok+1
|
||||
movprfx lda pathbuf,y
|
||||
sta pathbuf,x
|
||||
iny
|
||||
inx
|
||||
bne movprfx
|
||||
clc good prefix
|
||||
rts
|
||||
ptyperr lda #$4B filetype error (not a directory)
|
||||
pfxerr sec
|
||||
rts
|
||||
|
||||
* get prefix command
|
||||
|
||||
getprefx .EQ *-ofsX calc how big a buffer is needed.
|
||||
clc get index to users pathname buffer
|
||||
ldy #$01
|
||||
lda (A3L),y
|
||||
sta usrbuf user buffer ptr
|
||||
iny
|
||||
lda (A3L),y
|
||||
sta usrbuf+1
|
||||
stz cbytes+1 set buffer length at 64 char max
|
||||
lda #$40
|
||||
sta cbytes
|
||||
jsr valdbuf go validate prefix buffer address
|
||||
bcs pfxerr
|
||||
ldy #$00 y = indirect index to user buffer.
|
||||
lda newpfxptr get address of beginning of prefix
|
||||
tax
|
||||
beq nulprfx if null prefix.
|
||||
eor #$FF get total length of prefix
|
||||
adc #$02 add 2 for leading and trailing slashes.
|
||||
nulprfx sta (usrbuf),y store length in user's buffer.
|
||||
beq gotprfx branch if null prefix.
|
||||
sendprfx iny inc to next user buffer location.
|
||||
lda pathbuf,x get next char of prefix.
|
||||
sndlimit sta (usrbuf),y give char to user.
|
||||
and #$F0 check for length descriptor.
|
||||
bne H33B3 branch if regular character
|
||||
lda #$2F otherwise, substitute a slash.
|
||||
bne sndlimit branch always
|
||||
H33B3 inx
|
||||
bne sendprfx branch if more to send.
|
||||
iny
|
||||
lda #$2F end with '/'
|
||||
sta (usrbuf),y
|
||||
gotprfx clc no error
|
||||
rts
|
||||
findfcb .EQ *-ofsX
|
||||
ldy #$01 index to ref#
|
||||
lda (A3L),y is it a valid file# ?
|
||||
beq badref must not be 0.
|
||||
cmp #$09 must be 1 to 8 only.
|
||||
bcs badref
|
||||
pha
|
||||
dec a
|
||||
lsr
|
||||
ror
|
||||
ror
|
||||
ror multiply by 32.
|
||||
sta fcbptr used as an index to fcb
|
||||
tay
|
||||
pla restore ref# in acc
|
||||
cmp fcbbuf,y
|
||||
bne errnoref
|
||||
fndfcbuf .EQ *-ofsX get page address of file buffer.
|
||||
lda fcbbuf+11,y
|
||||
jsr getbufadr get file's address into bufaddrl,h
|
||||
ldx bufaddrh (y=fcbptr preserved)
|
||||
beq fcbdead fcb corrupted
|
||||
stx datptr+1 save ptr to data area of buffer
|
||||
inx
|
||||
inx index block always 2 pages after data
|
||||
stx zpt+1
|
||||
lda fcbbuf+1,y also set up device #
|
||||
sta devnum
|
||||
lda bufaddrl
|
||||
sta datptr index and data buffers always on
|
||||
sta zpt page boundaries.
|
||||
fndfvol tax search for associated vcb
|
||||
lda vcbbuf+16,x
|
||||
cmp fcbbuf+1,y is this vcb the same device?
|
||||
beq tstvopen if it is, make sure volume is active.
|
||||
nxtfvol txa adjust index to next vcb.
|
||||
clc
|
||||
adc #$20
|
||||
bcc fndfvol loop until volume found.
|
||||
lda #$0A open file has no volume so
|
||||
jsr sysdeath kill the system.
|
||||
fcbdead lda #$0B fcb error so
|
||||
jsr sysdeath kill the system.
|
||||
tstvopen lda vcbbuf,x make sure this vcb is open.
|
||||
beq nxtfvol branch if it is not active.
|
||||
stx vcbptr save ptr to good vcb.
|
||||
clc no error
|
||||
rts
|
||||
errnoref lda #$00 put a zero into this fcb to
|
||||
sta fcbbuf,y show free fcb.
|
||||
badref lda #$43 requested refnum is
|
||||
sec illegal (out of range)
|
||||
rts
|
||||
|
||||
* online command
|
||||
|
||||
online .EQ *-ofsX move user spec'd buffer ptr to usrbuf.
|
||||
jsr mvdbufr figure out how big buffer has to be.
|
||||
stz cbytes set this for valdbuf routine.
|
||||
stz cbytes+1
|
||||
ldy #$01
|
||||
lda (A3L),y if 0 then cbytes=$100 else $010 for one
|
||||
and #$F0 device. mask out unused nibble.
|
||||
sta devnum last device used.
|
||||
beq H343C branch if all devices.
|
||||
lda #$10 cbytes = $010
|
||||
sta cbytes
|
||||
bne H343F always taken
|
||||
H343C inc cbytes+1 cbytes = $100
|
||||
H343F jsr valdbuf go validate buffer range against
|
||||
bcs onlinerr allocated memory.
|
||||
lda #$00 zero out user buffer space
|
||||
ldy cbytes
|
||||
H3449 dey
|
||||
sta (usrbuf),y
|
||||
bne H3449
|
||||
sta namptr used as pointer to user buffer.
|
||||
lda devnum get device # again.
|
||||
bne H3474 branch if only 1 device to process.
|
||||
jsr mvdevnums get list of currently recognized dev's.
|
||||
H3459 phx save index to last item on list
|
||||
lda loklst,x
|
||||
sta devnum save desired device to look at.
|
||||
jsr online1 log this volume and return it's name.
|
||||
lda namptr inc pointer for next device
|
||||
clc
|
||||
adc #$10
|
||||
sta namptr
|
||||
plx get index to device list.
|
||||
dex next device.
|
||||
bpl H3459 branch if there is another device.
|
||||
lda #$00 no errors for multiple on-line
|
||||
clc
|
||||
onlinerr rts
|
||||
online1 .EQ *-ofsX
|
||||
H3474 jsr fnddvcb see if it has already been logged in.
|
||||
bcs olinerr1 branch if vcb is full.
|
||||
ldx #$00 read in root (volume) directory
|
||||
lda #$02
|
||||
jsr rdblk read it into general purpose buffer.
|
||||
ldx vcbptr index to the vcb entry.
|
||||
bcc volfound branch if read was ok.
|
||||
tay error value.
|
||||
lda vcbbuf+17,x don't take the vcb offline if
|
||||
bne rtrnerr there are active files present.
|
||||
sta vcbbuf,x now take the volume offline
|
||||
sta vcbbuf+16,x
|
||||
rtrnerr tya error value.
|
||||
bcs olinerr1 branch if unable to read.
|
||||
volfound lda vcbbuf,x has it been logged in before?
|
||||
beq H349E if not.
|
||||
lda vcbbuf+17,x it has, are there active files?
|
||||
bmi H34AA branch if volume is currently busy.
|
||||
H349E jsr logvcb1 go log it in.
|
||||
bcs olinerr1 branch if there is a problem.
|
||||
lda #$57 anticipate a duplicate active volume
|
||||
bit duplflag exits.
|
||||
bmi olinerr1 branch if so.
|
||||
H34AA ldx vcbptr
|
||||
jsr cmpvcb does vol read compare with logged vol?
|
||||
lda #$2E anticipate wrong volume mounted.
|
||||
bcc H34D0 branch if ok.
|
||||
olinerr1 pha save error code.
|
||||
jsr svdevn report what device has problem.
|
||||
pla error code.
|
||||
iny tell what error was encountered.
|
||||
sta (usrbuf),y
|
||||
cmp #$57 duplicate volume error?
|
||||
bne H34CE no.
|
||||
iny report which other device has same name
|
||||
ldx vcbentry
|
||||
lda vcbbuf+16,x
|
||||
sta (usrbuf),y
|
||||
stz duplflag clear duplicate flag.
|
||||
lda #$57 duplicate volume error code.
|
||||
H34CE sec flag error
|
||||
rts
|
||||
H34D0 lda vcbbuf,x get volume name count
|
||||
sta namcnt
|
||||
ldy namptr index to user's buffer.
|
||||
H34D9 lda vcbbuf,x move name to user's buffer
|
||||
sta (usrbuf),y
|
||||
inx
|
||||
iny
|
||||
dec namcnt
|
||||
bpl H34D9
|
||||
svdevn .EQ *-ofsX
|
||||
ldy namptr index to 1st byte of this entry.
|
||||
lda devnum upper nibble = device# and
|
||||
ora (usrbuf),y lower nibble = name length.
|
||||
sta (usrbuf),y
|
||||
clc no errors
|
||||
rts end of block file manager
|
||||
|
||||
MAN
|
||||
SAVE USR/SRC/PRODOS.203/PRODOS.S.XDOS.A
|
||||
LOAD USR/SRC/PRODOS.203/PRODOS.S
|
||||
ASM
|
|
@ -0,0 +1,869 @@
|
|||
NEW
|
||||
AUTO 3,1
|
||||
|
||||
* create file
|
||||
|
||||
create .EQ *-ofsX
|
||||
jsr lookfile check for duplicate, get free entry
|
||||
bcs tstfnf error code may be 'file not found'
|
||||
lda #$47 name already exists
|
||||
crerr1 sec
|
||||
rts
|
||||
tstfnf cmp #$46 'file not found' is ok
|
||||
bne crerr1 otherwise exit with error.
|
||||
ldy #$07 test for tree or directory file,
|
||||
lda (A3L),y no other kinds are legal.
|
||||
cmp #$04 is it seed, sapling or tree?
|
||||
bcc tstdspc branch if it is
|
||||
cmp #$0D
|
||||
bne ctyperr report type error if not directory.
|
||||
tstdspc lda devnum make sure destination device
|
||||
jsr twrprot1 is not write protected.
|
||||
bcs H351D
|
||||
lda nofree is there space in directory to
|
||||
beq xtndir add this file? branch if not
|
||||
jmp creat1 otherwise, go create file.
|
||||
ctyperr lda #$4B filetype error
|
||||
sec
|
||||
H351D rts
|
||||
xtndir lda own_blk before extending directory,
|
||||
ora own_blk+1 make sure it's a subdirectory.
|
||||
bne H352A
|
||||
lda #$49 otherwise, directory full error
|
||||
sec
|
||||
rts
|
||||
H352A lda bloknml preserve disk address of current (last)
|
||||
pha directory link, before allocating an
|
||||
lda bloknml+1 extended block.
|
||||
pha
|
||||
jsr alc1blk allocate a block for extending directory
|
||||
plx
|
||||
stx bloknml+1 restore block addr of dir info in gbuf
|
||||
plx
|
||||
stx bloknml
|
||||
bcs H351D unable to allocate.
|
||||
sta gbuf+2 save block address in y,a to
|
||||
sty gbuf+3 current directory.
|
||||
jsr wrtgbuf update directory block with new link.
|
||||
bcs H351D if error
|
||||
ldx #$01
|
||||
swpbloks lda bloknml,x prepare new directory block
|
||||
sta gbuf,x using current block as back link
|
||||
lda gbuf+2,x
|
||||
sta bloknml,x and save new block as next to be written
|
||||
dex
|
||||
bpl swpbloks
|
||||
inx
|
||||
txa x and a = 0
|
||||
clrdir sta gbuf+2,x
|
||||
sta gbuf+$100,x
|
||||
inx
|
||||
bne clrdir
|
||||
jsr wrtgbuf write prepared directory extension.
|
||||
bcs H351D if error
|
||||
lda own_blk
|
||||
ldx own_blk+1
|
||||
jsr rdblk read in parent directory block
|
||||
ldx own_ent and calc entry address.
|
||||
lda /gbuf
|
||||
sta zpt+1
|
||||
lda #$04
|
||||
ocalc clc
|
||||
dex has entry address been calulated?
|
||||
beq H3584 if yes.
|
||||
adc own_len next entry address
|
||||
bcc ocalc
|
||||
inc zpt+1 entry must be in 2nd 256 bytes of block
|
||||
bcs ocalc always taken.
|
||||
H3584 sta zpt
|
||||
ldy #$13 index to block count
|
||||
H3588 lda (zpt),y
|
||||
adc dinctbl-$13,y add 1 to block count and
|
||||
sta (zpt),y
|
||||
iny
|
||||
tya $200 to the directory's eof.
|
||||
eor #$18 done with usage/eof update?
|
||||
bne H3588 branch if not.
|
||||
jsr wrtgbuf go update parent.
|
||||
bcs crerr2
|
||||
jmp create
|
||||
crerr2 rts return and report errors
|
||||
creat1 .EQ *-ofsX
|
||||
ldx #$00 zero out gbuf
|
||||
H35A0 stz gbuf,x
|
||||
stz gbuf+$100,x and data block of file.
|
||||
inx
|
||||
bne H35A0
|
||||
ldy #$0B move user specified date/time
|
||||
cmvtime lda (A3L),y to directory.
|
||||
sta d_filid,y
|
||||
txa if all 4 bytes of date/time = 0
|
||||
ora (A3L),y then use built-in date/time.
|
||||
tax
|
||||
dey
|
||||
cpy #$07
|
||||
bne cmvtime
|
||||
txa does user want default time?
|
||||
bne cmvname if not.
|
||||
ldx #$03
|
||||
mvdftime lda p8date,x move current default date/time
|
||||
sta d_credt,x
|
||||
dex
|
||||
bpl mvdftime
|
||||
cmvname lda (A3L),y y = index to file kind.
|
||||
cmp #$04
|
||||
lda #$10 assume tree type
|
||||
bcc csvfkind
|
||||
lda #$D0 it's directory.
|
||||
csvfkind ldx namptr index to local name of pathname.
|
||||
ora pathbuf,x combine file kind with name length.
|
||||
sta d_stor sos calls this 'storage type'.
|
||||
and #$0F strip back to name length
|
||||
tay and use as counter for move.
|
||||
clc
|
||||
adc namptr calc end of name
|
||||
tax
|
||||
crname lda pathbuf,x move local name as filename
|
||||
sta d_stor,y
|
||||
dex
|
||||
dey
|
||||
bne crname
|
||||
ldy #$03 index to 'access' parameter
|
||||
lda (A3L),y
|
||||
sta d_attr
|
||||
iny also move 'file identification'
|
||||
lda (A3L),y
|
||||
sta d_filid
|
||||
cmvauxid iny move auxillary identification bytes
|
||||
lda (A3L),y
|
||||
sta d_auxid-5,y
|
||||
cpy #$06
|
||||
bne cmvauxid
|
||||
lda xdosver save current xdos version #
|
||||
sta d_sosver
|
||||
lda compat and backward compatibility #
|
||||
sta d_comp
|
||||
lda #$01 usage is always 1 block
|
||||
sta d_usage
|
||||
lda d_head place back pointer to header block
|
||||
sta d_dhdr
|
||||
lda d_head+1
|
||||
sta d_dhdr+1
|
||||
lda d_stor storage type.
|
||||
and #$E0 is it a directory?
|
||||
beq cralcblk branch if seed file.
|
||||
ldx #$1E move header to data block
|
||||
cmvheadr lda d_stor,x
|
||||
sta gbuf+4,x
|
||||
dex
|
||||
bpl cmvheadr
|
||||
eor #$30
|
||||
sta gbuf+4 make it a directory header mark.
|
||||
ldx #$07 overwrite password area and other
|
||||
cmvpass lda pass,x header info.
|
||||
sta gbuf+20,x
|
||||
lda xdosver,x
|
||||
sta gbuf+32,x
|
||||
dex
|
||||
bpl cmvpass
|
||||
ldx #$02 and include info about parent directory
|
||||
stx d_eof+1
|
||||
cmvparnt lda d_entblk,x
|
||||
sta gbuf+39,x
|
||||
dex
|
||||
bpl cmvparnt
|
||||
lda h_entln lastly, the length of parent's
|
||||
sta gbuf+42 directory entries.
|
||||
cralcblk jsr alc1blk get address of file's data block
|
||||
bcs crerr3
|
||||
sta d_frst
|
||||
sty d_frst+1
|
||||
sta bloknml
|
||||
sty bloknml+1
|
||||
jsr wrtgbuf go write data block of file
|
||||
bcs crerr3
|
||||
inc h_fcnt add 1 to total # of files in this dir
|
||||
bne credone
|
||||
inc h_fcnt+1
|
||||
credone jsr drevise go revise directories with new file
|
||||
bcs crerr3
|
||||
jmp upbmap lastly, update volume bitmap
|
||||
entcalc .EQ *-ofsX
|
||||
lda /gbuf set high address of dir entry
|
||||
sta zpt+1 index pointer.
|
||||
lda #$04 calc address of entry based
|
||||
ldx d_entnum on the entry #.
|
||||
H3689 clc
|
||||
H368A dex addr = gbuf + ((d_entnum-1) * h_entln)
|
||||
beq H3696 branch with carry clear = no errors.
|
||||
adc h_entln
|
||||
bcc H368A
|
||||
inc zpt+1 inc hi address.
|
||||
bcs H3689 always.
|
||||
H3696 sta zpt newly calculated low address.
|
||||
crerr3 rts carry set if error.
|
||||
drevise .EQ *-ofsX
|
||||
lda p8date
|
||||
beq H36A9 if no clock, then don't mod date/time.
|
||||
ldx #$03
|
||||
modtime lda p8date,x move last modification date/time
|
||||
sta d_moddt,x to entry being updated.
|
||||
dex
|
||||
bpl modtime
|
||||
drevise1 .EQ *-ofsX
|
||||
H36A9 lda d_attr mark entry as backupable
|
||||
ora bkbitflg (bit 5 = backup needed)
|
||||
sta d_attr
|
||||
lda d_dev get device # of directory
|
||||
sta devnum to be revised
|
||||
lda d_entblk and address of direcotry block.
|
||||
ldx d_entblk+1
|
||||
jsr rdblk read block into general purpose buffer
|
||||
bcs crerr3
|
||||
jsr entcalc fix up ptr to entry location within gbuf.
|
||||
ldy h_entln now move 'd.' info to directory.
|
||||
dey
|
||||
H36CA lda d_stor,y
|
||||
sta (zpt),y
|
||||
dey
|
||||
bpl H36CA
|
||||
lda d_head is the entry block same as
|
||||
cmp bloknml the entry's header block?
|
||||
bne H36E0 if no, go save entry block
|
||||
lda d_head+1 then maybe, so test high addresses.
|
||||
cmp bloknml+1
|
||||
beq uphead branch if they are the same block.
|
||||
H36E0 jsr wrtgbuf go write updated directory block.
|
||||
bcs crerr3
|
||||
lda d_head get address of header block and
|
||||
ldx d_head+1
|
||||
jsr rdblk go read in header block to modify.
|
||||
bcs crerr3
|
||||
uphead ldy #$01 update current # of files in this dir.
|
||||
H36F2 lda h_fcnt,y
|
||||
sta gbuf+37,y (current entry count)
|
||||
dey
|
||||
bpl H36F2
|
||||
lda h_attr also update header's attributes.
|
||||
sta gbuf+34
|
||||
jsr wrtgbuf go write updated header
|
||||
bcs H375A
|
||||
ripple lda gbuf+4 test for 'root' directory because
|
||||
and #$F0 if it is, then directory revision
|
||||
eor #$F0 is complete (leaves carry clear).
|
||||
beq H3770 branch if done.
|
||||
lda gbuf+41 get entry #
|
||||
sta d_entnum
|
||||
lda gbuf+42 and the length of ertries in that dir
|
||||
sta h_entln
|
||||
lda gbuf+39 get addr of parent entry's dir block
|
||||
ldx gbuf+40
|
||||
jsr rdblk read it
|
||||
bcs H375A
|
||||
jsr entcalc get indirect ptr to parent entry in gbuf
|
||||
lda p8date don't touch mod
|
||||
beq H373B if no clock...
|
||||
ldx #$03 update the modification date & time
|
||||
ldy #$24 for this entry too
|
||||
H3732 lda p8date,x
|
||||
sta (zpt),y
|
||||
dey
|
||||
dex
|
||||
bpl H3732
|
||||
H373B jsr wrtgbuf write updated entry back to disk.
|
||||
bcs H375A if error.
|
||||
ldy #$25 compare current block # to this
|
||||
lda (zpt),y entry's header block.
|
||||
iny
|
||||
cmp bloknml are low addresses the same?
|
||||
sta bloknml
|
||||
bne H3751 branch if entry doesn't reside in same
|
||||
lda (zpt),y block as header.
|
||||
cmp bloknml+1 are high address the same?
|
||||
beq ripple they are the same, continue to root dir.
|
||||
H3751 lda (zpt),y not same so read in this dir's header.
|
||||
sta bloknml+1
|
||||
jsr rdgbuf
|
||||
bcc ripple continue if read was good
|
||||
H375A rts
|
||||
tsterr lda #$52 not tree or dir, unrecognized type
|
||||
sec
|
||||
rts
|
||||
tstsos .EQ *-ofsX test if xdos disk.
|
||||
lda gbuf pointer to previous dir block
|
||||
ora gbuf+1 must be null
|
||||
bne tsterr
|
||||
lda gbuf+4 test for header
|
||||
and #$E0
|
||||
cmp #$E0
|
||||
bne tsterr
|
||||
H3770 clc no error
|
||||
rts
|
||||
findfile .EQ *-ofsX
|
||||
jsr lookfile see if file exists
|
||||
bcs nofind
|
||||
moventry .EQ *-ofsX
|
||||
ldy h_entln
|
||||
H377A lda (zpt),y move entry into storage
|
||||
sta d_stor,y
|
||||
dey
|
||||
bpl H377A
|
||||
lda #$00 no errors
|
||||
nofind rts
|
||||
lookfile .EQ *-ofsX
|
||||
jsr preproot go find volume
|
||||
bcs fnderr
|
||||
bne L37C5 branch if more than root
|
||||
lda /gbuf otherwise, report a bad path error
|
||||
sta zpt+1 (but 1st create a phantom entry
|
||||
lda #$04 for open)
|
||||
sta zpt
|
||||
ldy #$1F move in id and date info
|
||||
phantm1 lda (zpt),y
|
||||
sta d_stor,y
|
||||
dey
|
||||
cpy #$17
|
||||
bne phantm1
|
||||
phantm2 lda rootstuf-$10,y
|
||||
sta d_stor,y
|
||||
dey
|
||||
cpy #$0F
|
||||
bne phantm2
|
||||
lda #$D0 fake directory file
|
||||
sta d_stor
|
||||
lda gbuf+2 check forward link.
|
||||
ora gbuf+3 if non-zero, assume full sized directory
|
||||
bne H37C2 else assume it's the slot 3 /RAM volume
|
||||
lda #$02 so reset eof and blocks_used fields
|
||||
sta d_eof+1
|
||||
lda #$01
|
||||
sta d_usage
|
||||
H37C2 lda #$40 bad path (carry set)
|
||||
rts
|
||||
lookfil0 .EQ *-ofsX
|
||||
L37C5 stz nofree reset free entry indicator.
|
||||
sec dir to be searched has header in this block.
|
||||
L37C9 stz totent reset entry counter.
|
||||
jsr looknam look for name pointed to by pnptr.
|
||||
bcc namfound if name was found.
|
||||
lda entcntl have we looked at all of the
|
||||
sbc totent entries in this directory?
|
||||
bcc L37E2 maybe, check hi count.
|
||||
bne L37EB no, read next directory block.
|
||||
cmp entcnth has the last entry been looked at?
|
||||
beq errfnf yes, give 'file not found' error
|
||||
bne L37EB or branch always.
|
||||
L37E2 dec entcnth should be at least one
|
||||
bpl L37EB so this should be branch always...
|
||||
errdir lda #$51 directory error
|
||||
fnderr sec
|
||||
rts
|
||||
L37EB sta entcntl keep a running count.
|
||||
lda /gbuf reset indirect pointer
|
||||
sta zpt+1
|
||||
lda gbuf+2 get link to next dir block
|
||||
bne L37FC (if there is one).
|
||||
cmp gbuf+3 are both zero, i.e. no link? if so,
|
||||
beq errdir then not all entries were acct'd for.
|
||||
L37FC ldx gbuf+3 acc has value for block# (low).
|
||||
jsr rdblk go read the next linked directory.
|
||||
bcc L37C9 if no error.
|
||||
rts return error in acc.
|
||||
errfnf lda nofree was any free entry found?
|
||||
bne fnf0
|
||||
lda gbuf+2 test link
|
||||
bne L3814
|
||||
cmp gbuf+3 if both are 0 then give up.
|
||||
beq fnf0 report 'not found'.
|
||||
L3814 sta d_entblk
|
||||
lda gbuf+3
|
||||
sta d_entblk+1 assume 1st entry of next block
|
||||
lda #$01 is free for use.
|
||||
sta d_entnum mark as valid (for create)
|
||||
sta nofree
|
||||
fnf0 jsr nxtpnam1 'file not found' or 'path not found'?
|
||||
errpath1 sec if non-zero then 'path not found'
|
||||
beq fnf1
|
||||
lda #$44 path not found
|
||||
rts
|
||||
fnf1 lda #$46 file not found
|
||||
rts
|
||||
namfound jsr nxtpname adj index to next name in path.
|
||||
beq filfound branch if that was the last name.
|
||||
ldy #$00 be sure this is a directory entry.
|
||||
lda (zpt),y high nibble will tell.
|
||||
and #$F0
|
||||
cmp #$D0 is it a subdirectory?
|
||||
bne errpath1 error if not.
|
||||
ldy #$11 get address of 1st subdirectory block
|
||||
lda (zpt),y
|
||||
sta bloknml (no checking done for a valid block#)
|
||||
iny
|
||||
sta d_head save as file's header block too
|
||||
lda (zpt),y
|
||||
sta bloknml+1
|
||||
sta d_head+1
|
||||
jsr rdgbuf read subdirectory into gbuf.
|
||||
bcs fnderr1 if error.
|
||||
lda gbuf+37 get the # of files contained in this
|
||||
sta entcntl directory.
|
||||
lda gbuf+38
|
||||
sta entcnth
|
||||
lda gbuf+20 make sure password is disabled
|
||||
ldx #$00
|
||||
sec
|
||||
rol
|
||||
L3869 bcc L386C
|
||||
inx
|
||||
L386C asl
|
||||
bne L3869
|
||||
cpx #$05 is password disabled?
|
||||
beq movhead
|
||||
lda #$4A directory is not compatible
|
||||
fnderr1 sec
|
||||
rts
|
||||
movhead jsr movhed0 move directory info.
|
||||
jmp lookfil0 do next local pathname.
|
||||
movhed0 .EQ *-ofsX
|
||||
ldx #$0A move this directory info
|
||||
L387F lda gbuf+28,x
|
||||
sta h_credt,x
|
||||
dex
|
||||
bpl L387F
|
||||
lda gbuf+4 if this is root, then nothing to do
|
||||
and #$F0
|
||||
eor #$F0 test header type.
|
||||
beq L389C branch if root
|
||||
ldx #$03 otherwise, save owner info about
|
||||
L3893 lda gbuf+39,x this header.
|
||||
sta own_blk,x
|
||||
dex
|
||||
bpl L3893
|
||||
L389C rts
|
||||
entadr .EQ *-ofsX
|
||||
filfound lda h_maxent figure out which entry # this is
|
||||
sec
|
||||
sbc cntent max entries - count entries + 1
|
||||
adc #$00 = entry # (carry was set)
|
||||
sta d_entnum
|
||||
lda bloknml and indicate block # of this directory
|
||||
sta d_entblk
|
||||
lda bloknml+1
|
||||
sta d_entblk+1
|
||||
clc
|
||||
rts
|
||||
looknam .EQ *-ofsX reset count of files per block
|
||||
lda h_maxent
|
||||
sta cntent
|
||||
lda /gbuf
|
||||
sta zpt+1
|
||||
lda #$04
|
||||
L38C1 sta zpt reset indirect pointer to gbuf
|
||||
bcs L38F8 branch if this block contains a header
|
||||
ldy #$00
|
||||
lda (zpt),y get length of name in directory.
|
||||
bne isname branch if there is a name.
|
||||
lda nofree test if a free entry has been declared.
|
||||
bne L38F8 yes, inc to next entry.
|
||||
jsr entadr set address for current entry.
|
||||
inc nofree indicate a free spot has been found.
|
||||
bne L38F8 always.
|
||||
isname and #$0F strip byte (is checked by 'filfound')
|
||||
inc totent inc count of valid files found.
|
||||
sta namcnt save name length as counter.
|
||||
ldx namptr get index to current path.
|
||||
cmp pathbuf,x are both names the same length?
|
||||
bne L38F8 no, inc to next entry.
|
||||
cmpname inx (first) next letter index
|
||||
iny
|
||||
lda (zpt),y compare names letter by letter
|
||||
cmp pathbuf,x
|
||||
bne L38F8
|
||||
dec namcnt all letters compared?
|
||||
bne cmpname no, continue.
|
||||
clc a match is found.
|
||||
noname rts
|
||||
L38F8 dec cntent checked all entries in this block?
|
||||
sec
|
||||
beq noname yes, no name match.
|
||||
lda h_entln add entry length to current pointer
|
||||
clc
|
||||
adc zpt
|
||||
bcc L38C1 branch if still in 1st page.
|
||||
inc zpt+1 look on 2nd page.
|
||||
clc carry should always be clear before
|
||||
bcc L38C1 looking at next.
|
||||
preproot .EQ *-ofsX
|
||||
jsr findvol search vcb's and dev's for spec'd volume
|
||||
bcs novolume
|
||||
lda #$00 zero out directory temps
|
||||
ldy #$42
|
||||
L3914 sta own_blk,y and owner info
|
||||
dey
|
||||
bpl L3914
|
||||
lda devnum setup device # for this directory
|
||||
sta d_dev
|
||||
jsr movhed0 setup other header info from directory
|
||||
ldy #$01 in gbuf and clean up misc info.
|
||||
ldx vcbptr
|
||||
inx
|
||||
L3929 lda vcbbuf+18,x misc info includes
|
||||
sta h_tblk,y total # of blocks,
|
||||
lda vcbbuf+26,x the address of the 1st bitmap,
|
||||
sta h_bmap,y
|
||||
lda bloknml,y directory's disk address,
|
||||
sta d_head,y
|
||||
lda h_fcnt,y and setting up a counter for the # of
|
||||
sta entcntl,y files in this directory.
|
||||
dex
|
||||
dey
|
||||
bpl L3929
|
||||
nxtpname .EQ *-ofsX
|
||||
jsr nxtpnam1 get new namptr in y and namlen in acc.
|
||||
sty namptr save new pathname pointer.
|
||||
rts (status reg according to accumulator)
|
||||
nxtpnam1 .EQ *-ofsX
|
||||
ldy namptr inc pathname pointer to next name
|
||||
lda pathbuf,y in the path.
|
||||
sec
|
||||
adc namptr if this addition results in zero,
|
||||
tay then prefixed directory has been moved
|
||||
bne L395F to another device. branch if not.
|
||||
lda devnum revise devnum for prefixed directory
|
||||
sta p_dev
|
||||
L395F lda pathbuf,y test for end of name.
|
||||
clc no errors
|
||||
novolume rts
|
||||
findvol .EQ *-ofsX
|
||||
lda #$00
|
||||
ldy preflag use prefix volume name to look up vcb.
|
||||
bit prfxflg is this a prefixed path?
|
||||
bpl L396F branch if it is
|
||||
tay set ptr to volume name
|
||||
L396F sty vnptr and save.
|
||||
sta devnum zero out dev# until vcb located.
|
||||
L3975 pha acc now used as vcb lookup index.
|
||||
tax index pointer to x.
|
||||
lda vcbbuf,x get vcb volume name length.
|
||||
bne L3987 branch if claimed vcb to be tested.
|
||||
L397C ldy vnptr restore pointer to requested vol name.
|
||||
pla now adj vcb index to next vcb entry.
|
||||
clc
|
||||
adc #$20
|
||||
bcc L3975 branch if more vcb's to check
|
||||
bcs L39D4 otherwise go look for unlogged volumes.
|
||||
L3987 sta namcnt save length of vol name to be compared.
|
||||
L398A cmp pathbuf,y is it the same as requested vol name?
|
||||
bne L397C branch if not
|
||||
inx
|
||||
iny next character
|
||||
lda vcbbuf,x
|
||||
dec namcnt last character?
|
||||
bpl L398A if not.
|
||||
plx restore pointer to matching vcb.
|
||||
stx vcbptr save it for future reference.
|
||||
lda vcbbuf+16,x get it's device #
|
||||
sta devnum and save it.
|
||||
stz bloknml+1 assume prefix is not used and
|
||||
lda #$02 that root directory is to be used.
|
||||
sta bloknml
|
||||
lda vnptr = 0 if no prefix.
|
||||
L39AC tay if prefix then find ptr to prefixed
|
||||
sta namptr dir name. save path ptr.
|
||||
beq L39C2 branch if no prefix.
|
||||
sec
|
||||
adc pathbuf,y inc to next dir in prefix path.
|
||||
bcc L39AC branch if another dir in prefix.
|
||||
lda p_blok volume verification will occur at
|
||||
sta bloknml subdirectory level.
|
||||
lda p_blok+1
|
||||
sta bloknml+1
|
||||
|
||||
* verify volume name
|
||||
|
||||
L39C2 jsr rdgbuf read in directory (or prefix dir)
|
||||
bcs L39CC if error then look on other devices.
|
||||
jsr cmppnam compare dir name with path name.
|
||||
bcc L39F0 if they match, stop looking.
|
||||
L39CC ldx vcbptr check if current (matched) vcb is active
|
||||
lda vcbbuf+17,x i.e. does it have open files?
|
||||
bmi L39ED report not found if active.
|
||||
L39D4 lda vnptr make path ptr same as volume ptr
|
||||
sta namptr
|
||||
jsr mvdevnums copy all device #'s to be examined.
|
||||
lda devnum log current device 1st before searching
|
||||
bne L39F1 others.
|
||||
L39E2 ldx numdevs scan look list for devices we need
|
||||
L39E5 lda loklst,x to search for the requested volume.
|
||||
bne L39F4 branch if we've a device to look at.
|
||||
dex
|
||||
bpl L39E5 look at next one.
|
||||
L39ED lda #$45 no mounted volume
|
||||
sec error
|
||||
L39F0 rts
|
||||
L39F1 ldx numdevs now remove the device from the list
|
||||
L39F4 cmp loklst,x of prospective devices.
|
||||
beq L39FE branch if match.
|
||||
dex look until found.
|
||||
bpl L39F4 always taken (usually) unless
|
||||
bmi L39ED if dev was removed from devlst (/RAM).
|
||||
L39FE sta devnum preserve device to be checked next.
|
||||
stz loklst,x mark this one as tested.
|
||||
jsr fnddvcb find vcb that claims this dev (if any).
|
||||
bcs L3A29 branch if vcb full.
|
||||
ldx vcbptr did fndvcb find it or return free vcb?
|
||||
lda vcbbuf,x
|
||||
beq L3A16 if free vcb.
|
||||
lda vcbbuf+17,x is this volume active?
|
||||
bmi L39E2 if so, no need to re-log.
|
||||
L3A16 lda #$02 go read root dir into gbuf
|
||||
ldx #$00
|
||||
jsr rdblk
|
||||
bcs L39E2 ignore if unable to read.
|
||||
jsr logvcb go log in volume name.
|
||||
bcs L39E2 look at next if non-xdos disk mounted.
|
||||
jsr cmppnam is this the volume ?
|
||||
bcs L39E2 if not
|
||||
L3A29 rts
|
||||
mvdevnums .EQ *-ofsX
|
||||
ldx numdevs copy all dev #'s to be checked.
|
||||
L3A2D lda devlist,x active device list.
|
||||
and #$F0 strip device type info.
|
||||
sta loklst,x copy them to a temp workspace
|
||||
dex
|
||||
bpl L3A2D
|
||||
ldx numdevs
|
||||
rts
|
||||
fnddvcb .EQ *-ofsX look for vcb with this device#
|
||||
lda #$00
|
||||
ldy #$FF
|
||||
L3A40 tax new index to next vcb
|
||||
lda vcbbuf+16,x check all devnums
|
||||
cmp devnum is this the vcb?
|
||||
bne L3A4E if not
|
||||
stx vcbptr
|
||||
clc indicates found
|
||||
rts
|
||||
L3A4E lda vcbbuf,x is this a free vcb?
|
||||
bne L3A57 if not
|
||||
iny
|
||||
stx vcbptr
|
||||
L3A57 txa
|
||||
clc inc index to next vcb
|
||||
adc #$20
|
||||
bne L3A40
|
||||
tya any free vcb's available?
|
||||
bpl L3A79 yes
|
||||
lda #$00 look for an entry to kick out
|
||||
L3A62 tax
|
||||
lda vcbbuf+17,x any open files?
|
||||
bpl L3A70 no, kick this one out.
|
||||
txa next vcb
|
||||
clc
|
||||
adc #$20 (vcb entry size)
|
||||
bne L3A62
|
||||
beq L3A7A all vcb entries have open files
|
||||
L3A70 stx vcbptr save entry index.
|
||||
stz vcbbuf,x free this entry
|
||||
stz vcbbuf+16,x
|
||||
L3A79 clc no error.
|
||||
L3A7A lda #$55 # vcb full error
|
||||
rts
|
||||
cmppnam .EQ *-ofsX
|
||||
ldx #$00 index to directory name.
|
||||
ldy namptr index to pathname.
|
||||
lda gbuf+4 get dir name length and type.
|
||||
cmp #$E0 is it a directory?
|
||||
bcc L3A90 if not.
|
||||
and #$0F isolate name length and
|
||||
sta namcnt save as a counter.
|
||||
bne L3A95 branch if valid length.
|
||||
L3A90 sec indicate not found
|
||||
rts
|
||||
L3A92 lda gbuf+4,x next char
|
||||
L3A95 cmp pathbuf,y
|
||||
bne L3A90 if not the same.
|
||||
inx check next char
|
||||
iny
|
||||
dec namcnt
|
||||
bpl L3A92 if more to compare.
|
||||
clc match found
|
||||
rts
|
||||
logvcb .EQ *-ofsX
|
||||
ldx vcbptr previously logged in volume?
|
||||
lda vcbbuf,x (acc = 0?)
|
||||
beq L3AB0 no, go prepare vcb.
|
||||
jsr cmpvcb does vcb match vol read?
|
||||
bcc L3B05 yes, do not disturb.
|
||||
logvcb1 .EQ *-ofsX
|
||||
L3AB0 ldy #$1F zero out vcb entry
|
||||
L3AB2 stz vcbbuf,x
|
||||
inx
|
||||
dey
|
||||
bpl L3AB2
|
||||
jsr tstsos make sure it's an xdos disk
|
||||
bcs L3B05 if not, return carry set.
|
||||
jsr tstdupvol does a duplicate with open files
|
||||
bcs L3B04 already exist? branch if yes.
|
||||
lda gbuf+4 move volume name to vcb.
|
||||
and #$0F strip root marker
|
||||
tay
|
||||
pha
|
||||
ora vcbptr
|
||||
tax
|
||||
L3ACE lda gbuf+4,y
|
||||
sta vcbbuf,x
|
||||
dex
|
||||
dey
|
||||
bne L3ACE
|
||||
pla get length again
|
||||
sta vcbbuf,x and save.
|
||||
lda devnum last device used.
|
||||
sta vcbbuf+16,x save device # and
|
||||
lda gbuf+41 total # of blocks on this unit.
|
||||
sta vcbbuf+18,x
|
||||
lda gbuf+42
|
||||
sta vcbbuf+19,x
|
||||
lda bloknml save address of root directory.
|
||||
sta vcbbuf+22,x
|
||||
lda bloknml+1
|
||||
sta vcbbuf+23,x
|
||||
lda gbuf+39 save address of the 1st bitmap.
|
||||
sta vcbbuf+26,x
|
||||
lda gbuf+40
|
||||
sta vcbbuf+27,x
|
||||
L3B04 clc indicate logged if possible
|
||||
L3B05 rts
|
||||
cmpvcb .EQ *-ofsX compare volume name in vcb
|
||||
lda gbuf+4 with name in directory.
|
||||
and #$0F
|
||||
cmp vcbbuf,x are they the same length?
|
||||
stx xvcbptr (see rev note #23)
|
||||
bne L3B1E if not the same.
|
||||
tay
|
||||
ora xvcbptr
|
||||
tax
|
||||
L3B18 lda gbuf+4,y
|
||||
cmp vcbbuf,x
|
||||
L3B1E sec anticipate different names.
|
||||
bne L3B26 if not the same.
|
||||
dex
|
||||
dey
|
||||
bne L3B18
|
||||
clc indicate match.
|
||||
L3B26 ldx xvcbptr offset to start of vcb (rev note #23)
|
||||
rts
|
||||
tstdupvol .EQ *-ofsX check for other logged in volumes
|
||||
lda #$00 with the same name.
|
||||
L3B2C tax
|
||||
jsr cmpvcb
|
||||
bcs L3B41 if no match.
|
||||
lda vcbbuf+17,x test for any open files.
|
||||
bmi L3B4B cannot look at this volume.
|
||||
lda #$00 take duplicate offline if no open files
|
||||
sta vcbbuf,x
|
||||
sta vcbbuf+16,x
|
||||
beq L3B49 ok to log in new volume.
|
||||
L3B41 txa index to next vcb
|
||||
clc
|
||||
and #$E0 strip odd stuff.
|
||||
adc #$20 inc to next entry.
|
||||
bcc L3B2C branch if more to check
|
||||
L3B49 clc
|
||||
rts
|
||||
L3B4B sta duplflag duplicate has been found.
|
||||
stx vcbentry save pointer to conflicting vcb.
|
||||
sec error.
|
||||
rts
|
||||
tstfrblk .EQ *-ofsX test if enough free blocks available
|
||||
ldx vcbptr for request.
|
||||
lda vcbbuf+21,x check if proper count for this volume.
|
||||
ora vcbbuf+20,x
|
||||
bne L3BAD branch if count is non-zero.
|
||||
tkfrecnt .EQ *-ofsX
|
||||
jsr cntbms get # of bitmaps
|
||||
sta bmcnt and save.
|
||||
stz scrtch start count at 0
|
||||
stz scrtch+1
|
||||
lda #$FF mark 'first free' temp as unknown
|
||||
sta nofree
|
||||
jsr upbmap update volume bitmap.
|
||||
bcs L3BC1 if error.
|
||||
ldx vcbptr get address of 1st bitmap
|
||||
lda vcbbuf+26,x
|
||||
sta bloknml
|
||||
lda vcbbuf+27,x
|
||||
sta bloknml+1
|
||||
L3B81 jsr rdgbuf use general buffer for temp space to
|
||||
bcs L3BC1 count free blocks (bits).
|
||||
jsr count
|
||||
dec bmcnt was that the last bitmap?
|
||||
bmi L3B96 if so, go change fcb so not done again.
|
||||
inc bloknml
|
||||
bne L3B81
|
||||
inc bloknml+1
|
||||
bra L3B81
|
||||
L3B96 ldx vcbptr mark which block had 1st free space
|
||||
lda nofree
|
||||
bmi L3BBE if no free space was found.
|
||||
sta vcbbuf+28,x update the free count.
|
||||
lda scrtch+1
|
||||
sta vcbbuf+21,x update volume control byte.
|
||||
lda scrtch
|
||||
sta vcbbuf+20,x
|
||||
L3BAD lda vcbbuf+20,x compare total available free blocks
|
||||
sec on this volume.
|
||||
sbc reql
|
||||
lda vcbbuf+21,x
|
||||
sbc reqh
|
||||
bcc L3BBE
|
||||
clc
|
||||
rts
|
||||
L3BBE lda #$48 disk full
|
||||
sec
|
||||
L3BC1 rts
|
||||
count .EQ *-ofsX
|
||||
ldy #$00
|
||||
L3BC4 lda gbuf,y bit pattern.
|
||||
beq L3BCC don't count
|
||||
jsr cntfree
|
||||
L3BCC lda gbuf+$100,y do both pages with same loop
|
||||
beq L3BD4
|
||||
jsr cntfree
|
||||
L3BD4 iny
|
||||
bne L3BC4 loop until all 512 bytes counted.
|
||||
bit nofree has 1st block w/free space been found?
|
||||
bpl L3BEE if yes.
|
||||
lda scrtch test to see if any blocks were counted
|
||||
ora scrtch+1
|
||||
beq L3BEE branch if none counted.
|
||||
jsr cntbms get total # of maps.
|
||||
sec subtract countdown from total bitmaps
|
||||
sbc bmcnt
|
||||
sta nofree
|
||||
L3BEE rts
|
||||
cntfree .EQ *-ofsX
|
||||
L3BEF asl count the # of bits in this byte
|
||||
bcc L3BFA
|
||||
inc scrtch
|
||||
bne L3BFA
|
||||
inc scrtch+1
|
||||
L3BFA ora #$00
|
||||
bne L3BEF loop until all bits counted
|
||||
rts
|
||||
cntbms .EQ *-ofsX
|
||||
ldx vcbptr
|
||||
ldy vcbbuf+19,x return the # of bitmaps
|
||||
lda vcbbuf+18,x possible with the total count
|
||||
bne L3C0B found in the vcb.
|
||||
dey adj for bitmap block boundary
|
||||
L3C0B tya
|
||||
lsr divide by 16. the result is
|
||||
lsr the # of bitmaps.
|
||||
lsr
|
||||
lsr
|
||||
rts
|
||||
MAN
|
||||
SAVE USR/SRC/PRODOS.203/PRODOS.S.XDOS.B
|
||||
LOAD USR/SRC/PRODOS.203/PRODOS.S
|
||||
ASM
|
File diff suppressed because it is too large
Load Diff
|
@ -0,0 +1,590 @@
|
|||
NEW
|
||||
AUTO 3,1
|
||||
|
||||
* read command
|
||||
|
||||
readf .EQ *-ofsX
|
||||
jsr mvdbufr xfer buffer address and request count
|
||||
jsr mvcbytes to a more accessable location, also
|
||||
pha get fcb attributes and save on stack.
|
||||
jsr calcmrk calc mark after read, test if mark > eof
|
||||
pla carry set means end mark > eof.
|
||||
and #$01 test for read enabled.
|
||||
bne L41DE branch if ok to read.
|
||||
lda #$4E illegal access.
|
||||
bne L4202 always.
|
||||
L41DE bcc L4205 branch if result mark < eof. adjust
|
||||
ldy fcbptr request to read until just before eof.
|
||||
lda fcbbuf+21,y result = (eof-1) - position
|
||||
sbc tposll
|
||||
sta cbytes
|
||||
sta rwreql
|
||||
lda fcbbuf+22,y
|
||||
sbc tposlh
|
||||
sta cbytes+1
|
||||
sta rwreqh
|
||||
ora cbytes if both bytes = 0 then eof error
|
||||
bne L4210
|
||||
lda #$4C eof error
|
||||
L4202 jmp errfix1
|
||||
L4205 lda cbytes
|
||||
ora cbytes+1
|
||||
bne L4210 if read request definitely non-zero.
|
||||
L420D jmp rwdone do nothing.
|
||||
L4210 jsr valdbuf validate user's data buffer range.
|
||||
bcs L4202 branch if memory conflict.
|
||||
jsr gfcbstyp get storage type
|
||||
cmp #$04 and find out if it's a tree or other.
|
||||
bcc L421F branch if a tree file
|
||||
jmp dread otherwise assume it's a directory.
|
||||
L421F jsr rdposn set up data pointer.
|
||||
bcs L4202 errors.
|
||||
jsr preprw test for newline, setup for partial
|
||||
jsr readpart read. move current data buffer contents
|
||||
bvs L420D to user area. branch if satisfied.
|
||||
bcs L421F indicates newline is set.
|
||||
lda rwreqh how many blocks are to be read ?
|
||||
lsr if < 2 then use the slow way.
|
||||
beq L421F
|
||||
sta cmdtemp save bulk block count.
|
||||
jsr gfcbstat make sure current data area doesn't
|
||||
and #$40 need writing before resetting ptr to
|
||||
bne L421F read into user's area. branch if data
|
||||
sta ioaccess needs to be written to force 1st call
|
||||
lda usrbuf thru all dev handler checking. make
|
||||
sta datptr the data buffer the user's space.
|
||||
lda usrbuf+1
|
||||
sta datptr+1
|
||||
L4249 jsr rdposn get next block directly into user space.
|
||||
bcs L42B7 if error.
|
||||
L424E inc datptr+1 incll ptrs by one block (512 bytes)
|
||||
inc datptr+1
|
||||
dec rwreqh
|
||||
dec rwreqh
|
||||
inc tposlh
|
||||
inc tposlh
|
||||
bne L4269 if pos'n doesn't get to a 64k boundary
|
||||
inc tposhi otherwise, must check for a 128k one.
|
||||
lda tposhi carry set if 128k boundary reached.
|
||||
eor #$01
|
||||
lsr
|
||||
L4269 dec cmdtemp has all been read fast ?
|
||||
bne L427B branch if more to read.
|
||||
jsr fxdatptr go fix up data pointer to xdos buffer.
|
||||
lda rwreql test for end of read.
|
||||
ora rwreqh are both 0 ?
|
||||
beq L42C3 yes, done.
|
||||
bne L421F no, read last partial block
|
||||
L427B bcs L4249
|
||||
lda tposhi get index to next block address
|
||||
lsr
|
||||
lda tposlh
|
||||
ror
|
||||
tay index to address = int(pos/512)
|
||||
lda (zpt),y get low address
|
||||
sta bloknml
|
||||
inc zpt+1
|
||||
cmp (zpt),y are hi and low address the same?
|
||||
bne L4299 no, it's a real block address.
|
||||
cmp #$00 are both bytes 0 ?
|
||||
bne L4299 no, must be real data.
|
||||
sta ioaccess don't do repeat io just after sparse.
|
||||
beq L429C branch always (carry set).
|
||||
L4299 lda (zpt),y get high address
|
||||
clc
|
||||
L429C dec zpt+1
|
||||
bcs L4249 if no block to read.
|
||||
sta bloknml+1
|
||||
lda ioaccess has 1st call gone to device yet ?
|
||||
beq L4249 no, go thru normal route
|
||||
clc
|
||||
php interrupts can't occur during dmgr call
|
||||
sei
|
||||
lda datptr+1 reset hi buffer address for dev handler
|
||||
sta buf+1
|
||||
jsr dmgr
|
||||
bcs L42B6 if error
|
||||
plp
|
||||
bcc L424E no errors, branch always.
|
||||
L42B6 plp restore interrupts.
|
||||
L42B7 pha save error code.
|
||||
jsr fxdatptr go restore data pointers, etc.
|
||||
pla
|
||||
errfix1 .EQ *-ofsX
|
||||
pha save error code
|
||||
jsr rwdone pass back # of bytes actually read
|
||||
pla
|
||||
sec error
|
||||
rts
|
||||
rwdone .EQ *-ofsX
|
||||
L42C3 ldy #$06 return total # of bytes actually read
|
||||
sec derived from cbytes-rwreq.
|
||||
lda cbytes
|
||||
sbc rwreql
|
||||
sta (A3L),y
|
||||
iny
|
||||
lda cbytes+1
|
||||
sbc rwreqh
|
||||
sta (A3L),y
|
||||
jmp rdposn leave with valid position in fcb.
|
||||
preprw .EQ *-ofsX
|
||||
ldy fcbptr adj pointer to user's buffer to make
|
||||
sec the transfer
|
||||
lda usrbuf
|
||||
sbc tposll
|
||||
sta usrbuf
|
||||
bcs L42E9 if no adjustment to hi address needed
|
||||
dec usrbuf+1
|
||||
L42E9 lda fcbbuf+31,y test for new line enabled.
|
||||
clc
|
||||
beq L42F9 if new line not enabled.
|
||||
sec carry indicates new line enabled
|
||||
sta nlmask
|
||||
lda fcbbuf+10,y move newline character to more
|
||||
sta nlchar accesible spot.
|
||||
L42F9 ldy tposll index to 1st data.
|
||||
lda datptr reset low order of position pointer to
|
||||
sta sos beginning of page.
|
||||
ldx rwreql get low order count of requested bytes.
|
||||
rts return statuses.
|
||||
readpart .EQ *-ofsX
|
||||
txa x = low count of bytes to move.
|
||||
bne L430F branch if request is not an even page.
|
||||
lda rwreqh a call of 0 bytes should never get here!
|
||||
beq L435D branch if nothing to do.
|
||||
dec rwreqh
|
||||
L430F dex
|
||||
L4310 lda (sos),y move data to user's buffer
|
||||
sta (usrbuf),y
|
||||
bcs tstnewl test for newline 1st !
|
||||
L4316 txa note: x must be unchanged from tstnewl !
|
||||
beq L4332 go see if read request is satified...
|
||||
L4319 dex dec # of bytes left to move.
|
||||
iny page crossed ?
|
||||
bne L4310 no, move next byte.
|
||||
lda sos+1 test for end of buffer, but first
|
||||
inc usrbuf+1 adjust user buffer pointer
|
||||
inc tposlh and position
|
||||
bne L4329
|
||||
inc tposhi
|
||||
L4329 inc sos+1 and sos buffer high address.
|
||||
eor datptr+1 (carry is undisturbed)
|
||||
beq L4310 branch if more to read in buffer.
|
||||
clv indicate not finished.
|
||||
bvc L4360 always.
|
||||
L4332 lda rwreqh
|
||||
beq L4350 branch if request is satisfied.
|
||||
iny done with this block of data ?
|
||||
bne L4340 no, adjust high byte of request.
|
||||
lda sos+1 maybe, check for end of block buffer.
|
||||
eor datptr+1 (don't disturb carry).
|
||||
bne L4343 if hi count can be dealt with next time
|
||||
L4340 dec rwreqh
|
||||
L4343 dey restore proper value
|
||||
bra L4319
|
||||
tstnewl lda (sos),y get last byte transferred again.
|
||||
and nlmask only bits on in mask are significant.
|
||||
eor nlchar does it match newline character?
|
||||
bne L4316 no, read next.
|
||||
L4350 iny adjust position.
|
||||
bne L435D
|
||||
inc usrbuf+1 inc pointers
|
||||
inc tposlh
|
||||
bne L435D
|
||||
inc tposhi
|
||||
L435D bit setvflg (sets v flag)
|
||||
L4360 sty tposll save low position
|
||||
bvs L4366
|
||||
inx leave request as +1 for next call
|
||||
L4366 stx rwreql and remainder of request count.
|
||||
php save statuses
|
||||
clc adjust user's low buffer address
|
||||
tya
|
||||
adc usrbuf
|
||||
sta usrbuf
|
||||
bcc L4374
|
||||
inc usrbuf+1 adjust hi address as needed.
|
||||
L4374 plp restore return statuses.
|
||||
setvflg .EQ *-ofsX this byte ($60) is used to set v flag.
|
||||
rts
|
||||
fxdatptr .EQ *-ofsX put current user buffer
|
||||
lda datptr address back to normal
|
||||
sta usrbuf
|
||||
lda datptr+1
|
||||
sta usrbuf+1 bank pair byte should be moved also.
|
||||
ldy fcbptr restore buffer address
|
||||
jmp fndfcbuf
|
||||
|
||||
* read directory file
|
||||
|
||||
dread .EQ *-ofsX
|
||||
L4384 jsr rdposn
|
||||
bcs L43B8 pass back any errors.
|
||||
jsr preprw prepare for transfer.
|
||||
jsr readpart move data to user's buffer.
|
||||
bvc L4384 repeat until request is satisfied.
|
||||
jsr rwdone update fcb as to new position.
|
||||
bcc L43B6 branch if done with no errors.
|
||||
cmp #$4C was last read to end of file ?
|
||||
sec anticipate some other error.
|
||||
bne L43B7 branch if not eof error.
|
||||
jsr svmark
|
||||
jsr zipdata clear out data block.
|
||||
ldy #$00 provide dummy back pointer for future
|
||||
ldx fcbptr re-position. x = hi byte of last block
|
||||
L43A6 lda fcbbuf+16,x
|
||||
sta (datptr),y
|
||||
lda #$00 mark current block as impossible
|
||||
sta fcbbuf+16,x
|
||||
inx
|
||||
iny inc indexes to do both hi and low bytes
|
||||
cpy #$02
|
||||
bne L43A6
|
||||
L43B6 clc no error
|
||||
L43B7 rts
|
||||
L43B8 jmp errfix1 report how much xfer'd before error.
|
||||
mvcbytes .EQ *-ofsX move request count to a more
|
||||
ldy #$04 accessable location
|
||||
lda (A3L),y
|
||||
sta cbytes
|
||||
sta rwreql
|
||||
iny
|
||||
lda (A3L),y
|
||||
sta cbytes+1
|
||||
sta rwreqh
|
||||
ldy fcbptr return y = val(fcbptr),
|
||||
lda fcbbuf+9,y a = attributes
|
||||
clc and carry clear...
|
||||
rts
|
||||
mvdbufr .EQ *-ofsX move the pointer to user's buffer
|
||||
ldy #$02 to the block file manager
|
||||
lda (A3L),y
|
||||
sta usrbuf z-page area
|
||||
iny
|
||||
lda (A3L),y
|
||||
sta usrbuf+1
|
||||
gfcbstyp .EQ *-ofsX
|
||||
ldy fcbptr return storage type
|
||||
lda fcbbuf+7,y
|
||||
rts
|
||||
|
||||
* this subroutine adds the requested byte count to mark and returns sum
|
||||
* in scrtch and also returns mark in tpos and oldmark.
|
||||
*
|
||||
* on exit:
|
||||
* y,x,a is unknown
|
||||
* carry set indicates scrtch > eof
|
||||
|
||||
calcmrk .EQ *-ofsX
|
||||
ldx #$00
|
||||
ldy fcbptr
|
||||
clc
|
||||
L43EE lda fcbbuf+18,y
|
||||
sta tposll,x
|
||||
sta oldmark,x
|
||||
adc cbytes,x
|
||||
sta scrtch,x
|
||||
txa
|
||||
eor #$02 cbytes+2 always=0
|
||||
beq L4406
|
||||
iny
|
||||
inx
|
||||
bne L43EE always.
|
||||
eoftest .EQ *-ofsX
|
||||
L4406 lda scrtch,x new mark in scrtch.
|
||||
cmp fcbbuf+21,y is new position > eof ?
|
||||
bcc L4414 no, proceed.
|
||||
bne L4414 yes, adjust 'cbytes' request
|
||||
dey
|
||||
dex all tree bytes compared ?
|
||||
bpl L4406 no, test next lowest
|
||||
L4414 rts
|
||||
werreof .EQ *-ofsX
|
||||
jsr plus2fcb reset eof to pre-error position.
|
||||
L4418 lda oldeof,x place oldeof back into fcb
|
||||
sta fcbbuf+21,y
|
||||
lda oldmark,x also reset mark to last best
|
||||
sta fcbbuf+18,y write position
|
||||
sta scrtch,x and copy mark to scrtch for test of
|
||||
dey eof less than mark.
|
||||
dex
|
||||
bpl L4418
|
||||
jsr plus2fcb get pointers to test eof < mark.
|
||||
jsr eoftest carry set means mark > eof !!
|
||||
|
||||
* drop into wadjeof to adjust eof to mark if necessary
|
||||
|
||||
wadjeof .EQ *-ofsX
|
||||
jsr plus2fcb get y=fcbptr+2, x=2, a=y.
|
||||
L4434 lda fcbbuf+21,y copy eof to old eof
|
||||
sta oldeof,x
|
||||
bcc L4442 and if carry set...
|
||||
lda scrtch,x then copy scrtch to fcb's eof.
|
||||
sta fcbbuf+21,y
|
||||
L4442 dey
|
||||
dex copy all 3 bytes
|
||||
bpl L4434
|
||||
rts
|
||||
plus2fcb .EQ *-ofsX
|
||||
lda #$02 on exit both a and y = fcbptr+2.
|
||||
tax x = 2
|
||||
ora fcbptr
|
||||
tay
|
||||
rts
|
||||
|
||||
* write command
|
||||
|
||||
writef .EQ *-ofsX first determine if requested
|
||||
jsr mvcbytes write is legal.
|
||||
pha
|
||||
jsr calcmrk save a copy of eof to old eof, set/clr
|
||||
jsr wadjeof carry to determine if new mark > eof.
|
||||
pla get attributes again.
|
||||
and #$02 is write enabled ?
|
||||
bne L4462 yes, continue...
|
||||
L445E lda #$4E illegal access error.
|
||||
bne L44A2
|
||||
L4462 jsr tstwprot otherwise, make sure device is not
|
||||
bcs L44A2 write protected. if so, branch to abort.
|
||||
lda cbytes
|
||||
ora cbytes+1 anything to write ?
|
||||
bne L4472 branch if so,
|
||||
jmp rwdone else do nothing.
|
||||
L4472 jsr mvdbufr move the user's buffer ptr to bfm zero
|
||||
cmp #$04 page area, also get storage type.
|
||||
bcs L445E if not tree, return an access error.
|
||||
L4479 jsr rdposn
|
||||
bcs L44A2
|
||||
jsr gfcbstat
|
||||
and #$07
|
||||
beq L44E9
|
||||
ldy #$00 is enough disk space available for
|
||||
L4487 iny indexes and data block ?
|
||||
lsr
|
||||
bne L4487
|
||||
sty reql
|
||||
sta reqh
|
||||
jsr tstfrblk
|
||||
bcs L44A2 pass back any errors.
|
||||
jsr gfcbstat now get more specific.
|
||||
and #$04 are we lacking a tree top ?
|
||||
beq L44AC no, test for lack of sapling level index
|
||||
jsr topdown go allocate tree top and adj file type.
|
||||
bcc L44B8 continue with allocation of data block.
|
||||
L44A2 pha save error.
|
||||
jsr errfix1 error return.
|
||||
jsr werreof adjust eof and mark to pre-error state.
|
||||
pla restore error code.
|
||||
sec
|
||||
rts
|
||||
L44AC jsr gfcbstat get status byte again.
|
||||
and #$02 do we need a sapling level index block ?
|
||||
beq L44B8 no, assume it's just a data block needed
|
||||
jsr sapdown go alloc an indx blk and update tree top
|
||||
bcs L44A2 if error.
|
||||
L44B8 jsr alcwblk go allocate for data block.
|
||||
bcs L44A2
|
||||
jsr gfcbstat clear allocation required bits in status
|
||||
ora #$80 but first indicate index block is dirty.
|
||||
and #$F8
|
||||
sta fcbbuf+8,y
|
||||
lda tposhi calculate position within index block.
|
||||
lsr
|
||||
lda tposlh
|
||||
ror
|
||||
tay now put block address into index block.
|
||||
inc zpt+1 high byte first.
|
||||
lda scrtch+1
|
||||
tax
|
||||
sta (zpt),y
|
||||
dec zpt+1 restore pointer to lower page of index
|
||||
lda scrtch block. get low block address.
|
||||
sta (zpt),y store low address.
|
||||
ldy fcbptr update fcb to indicate that this block
|
||||
sta fcbbuf+16,y is allocated.
|
||||
txa get high address again.
|
||||
sta fcbbuf+17,y
|
||||
L44E9 jsr preprw
|
||||
jsr wrtpart
|
||||
bvc L4479
|
||||
jmp rwdone update fcb with new position
|
||||
wrtpart .EQ *-ofsX
|
||||
txa
|
||||
bne L44FF branch if request is not even pages
|
||||
lda rwreqh a call of 0 bytes should never get here!
|
||||
beq L4546 do nothing
|
||||
dec rwreqh
|
||||
L44FF dex
|
||||
lda (usrbuf),y move data from user's buffer
|
||||
sta (sos),y
|
||||
txa
|
||||
beq L4525
|
||||
L4507 iny page crossed ?
|
||||
bne L44FF no, keep moving.
|
||||
lda sos+1 test for end of buffer
|
||||
inc usrbuf+1 but first adjust user buffer pointer
|
||||
inc tposlh and position
|
||||
bne L451C
|
||||
inc tposhi
|
||||
bne L451C
|
||||
lda #$4D out of range if > 32MB
|
||||
bne L44A2
|
||||
L451C inc sos+1 adjust sos buffer high address
|
||||
eor datptr+1 (carry is undisturbed)
|
||||
beq L44FF branch if more to write to buffer.
|
||||
clv indicates not finished.
|
||||
bvc L4549 always.
|
||||
L4525 lda rwreqh
|
||||
beq L4539 branch if request satisfied.
|
||||
iny done with this block of data ?
|
||||
bne L4533 if not.
|
||||
lda sos+1 this is necessary for proper
|
||||
eor datptr+1 adjustment of request count
|
||||
bne L4536
|
||||
L4533 dec rwreqh
|
||||
L4536 dey reset modified y
|
||||
bra L4507
|
||||
L4539 iny and position
|
||||
bne L4546
|
||||
inc usrbuf+1 inc pointers
|
||||
inc tposlh
|
||||
bne L4546
|
||||
inc tposhi
|
||||
L4546 bit setvflg set v flag
|
||||
L4549 sty tposll save low position
|
||||
stx rwreql and remainder of request count.
|
||||
php save statuses
|
||||
jsr gfcbstat
|
||||
ora #$50
|
||||
sta fcbbuf+8,y
|
||||
clc adjust user's low buffer address
|
||||
lda tposll
|
||||
adc usrbuf
|
||||
sta usrbuf
|
||||
bcc L4564
|
||||
inc usrbuf+1 adjust high address as needed.
|
||||
L4564 jsr fcbused set directory flush bit.
|
||||
plp restore return statuses
|
||||
rts
|
||||
topdown .EQ *-ofsX
|
||||
jsr swapdown make current 1st block an entry in new
|
||||
bcs L45B1 top. branch if errors.
|
||||
jsr gfcbstyp get storage type
|
||||
|
||||
* has storage type been changed to 'tree' ? if not, assume it was originally
|
||||
* a seed and both levels need to be built. otherwise, only an index needs
|
||||
* to be allocated.
|
||||
|
||||
cmp #$03 tree type
|
||||
beq L457A
|
||||
jsr swapdown make previous swap a sap level index
|
||||
bcs L45B1 block. branch if errors.
|
||||
L457A jsr alcwblk get another block address for the sap
|
||||
bcs L45B1 level index. branch if errors.
|
||||
lda tposhi calculate position of new index block
|
||||
lsr in the top of the tree.
|
||||
tay
|
||||
lda scrtch get address of newly allocated index
|
||||
tax block again.
|
||||
sta (zpt),y
|
||||
inc zpt+1
|
||||
lda scrtch+1
|
||||
sta (zpt),y save hi address
|
||||
dec zpt+1
|
||||
ldy fcbptr make newly allocated block the current
|
||||
sta fcbbuf+15,y index block.
|
||||
txa
|
||||
sta fcbbuf+14,y
|
||||
jsr wfcbfst save new top of tree
|
||||
bcs L45B1
|
||||
jmp zeroindex zero index block in user's i/o buffer.
|
||||
sapdown .EQ *-ofsX
|
||||
jsr gfcbstyp find out if dealing with a tree.
|
||||
cmp #$01 if seed then adj to file type is needed.
|
||||
beq L45B2 branch if seed
|
||||
jsr rfcbfst otherwise read in top of tree.
|
||||
bcc L457A if no error.
|
||||
L45B1 rts return errors.
|
||||
swapdown .EQ *-ofsX make current seed into a sapling.
|
||||
L45B2 jsr alcwblk allocate a block before swap.
|
||||
bcs L45F6 return errors.
|
||||
ldy fcbptr get previous first block
|
||||
lda fcbbuf+12,y address into index block.
|
||||
pha save temporarily while swapping in new
|
||||
lda scrtch top index. get new block address (low)
|
||||
tax
|
||||
sta fcbbuf+12,y
|
||||
lda fcbbuf+13,y
|
||||
pha
|
||||
lda scrtch+1 and high address too
|
||||
sta fcbbuf+13,y
|
||||
sta fcbbuf+15,y make new top also the current index in
|
||||
txa memory. get low address again.
|
||||
sta fcbbuf+14,y
|
||||
inc zpt+1 make previous the 1st entry in sub index
|
||||
pla
|
||||
sta (zpt)
|
||||
dec zpt+1
|
||||
pla
|
||||
sta (zpt)
|
||||
jsr wfcbfst save new file top.
|
||||
bcs L45F6 if error.
|
||||
jsr gfcbstyp now adjust storage type by adding 1
|
||||
adc #$01 (seed becomes sapling becomes tree)
|
||||
sta fcbbuf+7,y
|
||||
lda fcbbuf+8,y mark storage type modified
|
||||
ora #$08
|
||||
sta fcbbuf+8,y
|
||||
clc no error
|
||||
L45F6 rts
|
||||
alcwblk .EQ *-ofsX
|
||||
jsr alc1blk
|
||||
bcs L4616
|
||||
jsr gfcbstat mark usage as modified
|
||||
ora #$10
|
||||
sta fcbbuf+8,y
|
||||
lda fcbbuf+24,y inc current usage count by 1
|
||||
clc
|
||||
adc #$01
|
||||
sta fcbbuf+24,y
|
||||
lda fcbbuf+25,y
|
||||
adc #$00
|
||||
sta fcbbuf+25,y
|
||||
L4615 clc no error
|
||||
L4616 rts
|
||||
tstwprot .EQ *-ofsX check for 'never been modified'
|
||||
jsr gfcbstat condition
|
||||
and #$F0
|
||||
bne L4615 ordinary rts if known write ok.
|
||||
lda fcbbuf+1,y get file's dev #.
|
||||
sta devnum get current status of block device.
|
||||
twrprot1 .EQ *-ofsX make the device status call
|
||||
sta unitnum
|
||||
lda bloknml+1
|
||||
pha
|
||||
lda bloknml save the current block values
|
||||
pha
|
||||
stz A4L
|
||||
stz bloknml zero the block #
|
||||
stz bloknml+1
|
||||
php
|
||||
sei
|
||||
jsr dmgr
|
||||
bcs .1 branch if write protect error
|
||||
lda #$00 otherwise, assume no errors.
|
||||
.1 plp restore interrupt status
|
||||
clc
|
||||
tax save error.
|
||||
beq .2 branch if no error
|
||||
sec else, set carry to show error.
|
||||
.2 pla
|
||||
sta bloknml restore the block #
|
||||
pla
|
||||
sta bloknml+1
|
||||
txa
|
||||
rts carry is indeterminate.
|
||||
|
||||
MAN
|
||||
SAVE USR/SRC/PRODOS.203/PRODOS.S.XDOS.D
|
||||
LOAD USR/SRC/PRODOS.203/PRODOS.S
|
||||
ASM
|
|
@ -0,0 +1,615 @@
|
|||
NEW
|
||||
AUTO 3,1
|
||||
|
||||
* close command
|
||||
|
||||
closef .EQ *-ofsX close all ?
|
||||
ldy #$01
|
||||
lda (A3L),y
|
||||
bne L4683 no, just one of them.
|
||||
sta cferr clear global close error.
|
||||
lda #$00 start at the beginning.
|
||||
L4654 sta fcbptr save current low byte of pointer.
|
||||
tay get the level at which the file
|
||||
lda fcbbuf+27,y was opened.
|
||||
cmp flevel if file's level is < global level
|
||||
bcc L4675 then don't close.
|
||||
lda fcbbuf,y is this reference file open ?
|
||||
beq L4675 no, try next.
|
||||
jsr flush2 clean it out...
|
||||
bcs L46B6 return flush errors.
|
||||
jsr close2 update fcb & vcb
|
||||
ldy #$01
|
||||
lda (A3L),y
|
||||
beq L4675 no error if close all.
|
||||
bcs L46B6 close error.
|
||||
L4675 lda fcbptr inc pointer to next fcb
|
||||
clc
|
||||
adc #$20
|
||||
bcc L4654 branch if within same page.
|
||||
lda cferr on final close report logged errors.
|
||||
beq L46B4 branch if errors.
|
||||
rts (carry already set).
|
||||
L4683 jsr flush1 flush file 1st (including updating
|
||||
bcs L46B6 bitmap). branch if errors.
|
||||
close2 .EQ *-ofsX
|
||||
ldy fcbptr
|
||||
lda fcbbuf+11,y release file buffer
|
||||
jsr relbuffr
|
||||
bcs L46B6
|
||||
lda #$00
|
||||
ldy fcbptr
|
||||
sta fcbbuf,y free fcb too
|
||||
lda fcbbuf+1,y
|
||||
sta devnum go look for associated vcb
|
||||
jsr fnddvcb
|
||||
ldx vcbptr get vcb pointer.
|
||||
dec vcbbuf+30,x indicate one less file open.
|
||||
bne L46B4 branch if that wasn't the last...
|
||||
lda vcbbuf+17,x
|
||||
and #$7F strip 'files open' bit
|
||||
sta vcbbuf+17,x
|
||||
L46B4 clc
|
||||
rts
|
||||
L46B6 bcs L46E6 don't report close all error now.
|
||||
|
||||
* flush command
|
||||
|
||||
flushf .EQ *-ofsX
|
||||
ldy #$01 flush all ?
|
||||
lda (A3L),y
|
||||
bne L46E9 no, just one of them.
|
||||
sta cferr clear global flush error.
|
||||
lda #$00 start at the beginning.
|
||||
L46C3 sta fcbptr save current low byte of pointer.
|
||||
tay index to ref #.
|
||||
lda fcbbuf,y is this reference file open ?
|
||||
beq L46D1 no, try next.
|
||||
jsr flush2 clean it out...
|
||||
bcs L46E6 return anty errors.
|
||||
L46D1 lda fcbptr inc pointer to next fcb.
|
||||
clc
|
||||
adc #$20
|
||||
bcc L46C3 branch if within same page
|
||||
L46D9 clc
|
||||
lda cferr on last flush,
|
||||
beq L46E0 branch if no logged errors.
|
||||
sec report error now
|
||||
L46E0 rts
|
||||
flush2 .EQ *-ofsX
|
||||
jsr fndfcbuf must set up vcb & buffer locations 1st.
|
||||
bcc L46F1 branch if no error.
|
||||
L46E6 jmp glberr error so check for close or flush all.
|
||||
flush1 .EQ *-ofsX for normal refnum flush,
|
||||
L46E9 stz cferr clear global error.
|
||||
jsr findfcb setup pointer to fcb user references.
|
||||
bcs L46E6 return any errors.
|
||||
L46F1 lda fcbbuf+9,y test to see if file is modified.
|
||||
and #$02 is it write enabled ?
|
||||
beq L46D9 branch if 'read only'
|
||||
lda fcbbuf+28,y has eof been modified ?
|
||||
bmi L4704 if yes.
|
||||
jsr gfcbstat has data been modified ?
|
||||
and #$70 (was written to while it's been open?)
|
||||
beq L46D9 if not.
|
||||
L4704 jsr gfcbstat
|
||||
and #$40 does current data buffer need to be
|
||||
beq L4710 written ? branch if not.
|
||||
jsr wfcbdat if so, go write it.
|
||||
bcs L46E6 if error.
|
||||
L4710 jsr gfcbstat check to see if the index block (tree
|
||||
and #$80 files only) needs to be written.
|
||||
beq L471C branch if not.
|
||||
jsr wfcbidx
|
||||
bcs L46E6 return any errors.
|
||||
L471C lda #$06 prepare to update directory
|
||||
tax
|
||||
ora fcbptr
|
||||
tay
|
||||
L4723 lda fcbbuf,y note: this code depends on the defined
|
||||
sta d_dev-1,x order of the file control block and the
|
||||
dey temporary directory area in 'work space'
|
||||
dex
|
||||
bne L4723
|
||||
sta devnum
|
||||
lda d_head read the directory header for this file
|
||||
ldx d_head+1
|
||||
jsr rdblk into the general purpose buffer.
|
||||
bcs L46E6 if error.
|
||||
jsr movhed0 move header info.
|
||||
lda d_entblk get address of directory block that
|
||||
ldy d_entblk+1 contains the file entry.
|
||||
cmp d_head test to see if it's the same block the
|
||||
bne L474E header is in. branch if not.
|
||||
cpy d_head+1
|
||||
beq L4755 branch if header block = entry block
|
||||
L474E sta bloknml
|
||||
sty bloknml+1
|
||||
jsr rdgbuf get block with file entry in general
|
||||
L4755 jsr entcalc buffer. set up pointer to entry.
|
||||
jsr moventry move entry to temp entry buffer in
|
||||
ldy fcbptr 'work space'. update 'blocks used' count
|
||||
lda fcbbuf+24,y
|
||||
sta d_usage
|
||||
lda fcbbuf+25,y
|
||||
sta d_usage+1
|
||||
ldx #$00 and move in end of file mark whether
|
||||
L476C lda fcbbuf+21,y needed or not.
|
||||
sta d_eof,x
|
||||
inx
|
||||
cpx #$03 move all 3 bytes
|
||||
beq L4780
|
||||
lda fcbbuf+12,y also move in the address of the file's
|
||||
sta d_filid,x first block since it might have changed
|
||||
iny since the file first opened.
|
||||
bne L476C branch always.
|
||||
L4780 lda fcbbuf+5,y the last thing to update is storage
|
||||
asl type (y=fcbptr+2). shift into high
|
||||
asl nibble.
|
||||
asl
|
||||
asl
|
||||
sta scrtch
|
||||
lda d_stor get old type byte (might be the same).
|
||||
and #$0F strip off old type,
|
||||
ora scrtch add in the new type
|
||||
sta d_stor and put it away.
|
||||
jsr drevise go update directory.
|
||||
bcs L47B4 error.
|
||||
ldy fcbptr mark
|
||||
lda fcbbuf+28,y fcb/directory
|
||||
and #$7F as
|
||||
sta fcbbuf+28,y undirty.
|
||||
lda d_dev see if bitmap should be written.
|
||||
cmp bmadev is it in same as current file ?
|
||||
bne L47B2 yes, put it on the disk if necessary.
|
||||
jsr upbmap go put it away.
|
||||
bcs L47B4 flush error
|
||||
L47B2 clc
|
||||
rts
|
||||
|
||||
* report error only if not a close all or flush all
|
||||
|
||||
glberr .EQ *-ofsX
|
||||
L47B4 ldy #$01
|
||||
pha
|
||||
lda (A3L),y
|
||||
bne L47C1 not an 'all' so report now
|
||||
clc
|
||||
pla
|
||||
sta cferr save for later
|
||||
rts
|
||||
L47C1 pla
|
||||
rts
|
||||
gfcbstat .EQ *-ofsX
|
||||
ldy fcbptr index to fcb.
|
||||
lda fcbbuf+8,y return status byte.
|
||||
rts
|
||||
L47CA lda #$4E access error
|
||||
sec
|
||||
L47CD rts
|
||||
|
||||
seteof .EQ *-ofsX can only move end of tree, sapling
|
||||
jsr gfcbstyp or seed.
|
||||
cmp #$04 tree type ?
|
||||
bcs L47CA if not then access error
|
||||
asl
|
||||
asl
|
||||
asl
|
||||
asl
|
||||
sta stortyp may be used later.
|
||||
lda fcbbuf+9,y
|
||||
and #$02 is write enabled to set new eof ?
|
||||
beq L47CA no, access error.
|
||||
jsr tstwprot hardware write protected ?
|
||||
bcs L47CA yes, access error.
|
||||
ldy fcbptr save old eof so it can be seen
|
||||
iny whether blocks need to be released
|
||||
iny upon contraction.
|
||||
ldx #$02 all 3 bytes of the eof
|
||||
L47EF lda fcbbuf+21,y
|
||||
sta oldeof,x
|
||||
dey
|
||||
dex
|
||||
bpl L47EF
|
||||
ldy #$04
|
||||
ldx #$02
|
||||
L47FD lda (A3L),y position mark to new eof
|
||||
sta tposll,x
|
||||
dey
|
||||
dex
|
||||
bpl L47FD
|
||||
ldx #$02 point to 3rd byte.
|
||||
L4808 lda oldeof,x see if eof moved backwards so blocks
|
||||
cmp tposll,x can be released.
|
||||
bcc L4815 (branch if not)
|
||||
bne purge branch if blocks to be released
|
||||
dex
|
||||
bpl L4808 all 3 bytes
|
||||
eofset .EQ *-ofsX
|
||||
L4815 ldy #$04
|
||||
ldx fcbptr place new end of file into fcb
|
||||
inx
|
||||
inx
|
||||
L481C lda (A3L),y
|
||||
sta fcbbuf+21,x
|
||||
dex
|
||||
dey
|
||||
cpy #$02 all 3 bytes moved ?
|
||||
bcs L481C no.
|
||||
jmp fcbused mark fcb as dirty.
|
||||
purge jsr flush1 make sure file is current
|
||||
bcs L47CD
|
||||
ldx datptr+1 pointer to index block
|
||||
inx
|
||||
inx
|
||||
stx zpt+1 (zero page conflict with dir buf ptr)
|
||||
ldx datptr
|
||||
stx zpt
|
||||
ldy fcbptr check if eof < mark
|
||||
iny
|
||||
iny
|
||||
ldx #$02
|
||||
L4840 lda fcbbuf+18,y
|
||||
cmp tposll,x compare until not equal or carry clear.
|
||||
bcc L485F branch if eof > mark.
|
||||
bne L484E branch if eof < mark.
|
||||
dey
|
||||
dex
|
||||
bpl L4840 compare all 3 bytes
|
||||
L484E ldy fcbptr
|
||||
ldx #$00
|
||||
L4853 lda tposll,x fake position, correct position will
|
||||
sta fcbbuf+18,y be made below...
|
||||
iny
|
||||
inx
|
||||
cpx #$03 move all 3 bytes
|
||||
bne L4853
|
||||
L485F jsr tkfrecnt force free block count before releasing
|
||||
lda tposll blocks. prepare for purge of excess...
|
||||
sta dseed all blocks and bytes beyond new eof
|
||||
lda tposlh must be zero'd
|
||||
sta dsap
|
||||
and #$01
|
||||
sta dseed+1
|
||||
lda tposhi
|
||||
lsr a
|
||||
sta dtree
|
||||
ror dsap pass position in terms of block & bytes.
|
||||
lda dseed now adjust for boundaries of $200
|
||||
ora dseed+1
|
||||
bne L48A2 branch if no adjustment necessary.
|
||||
lda dsap get correct block ositions for sap
|
||||
sec and tree levels.
|
||||
sbc #$01
|
||||
sta dsap deallocate for last (phantom) block
|
||||
lda #$02 and don't modify last data block.
|
||||
bcs L489F branch if tree level unaffected.
|
||||
dec dtree
|
||||
bpl L489F branch if new eof not zero
|
||||
lda #$00
|
||||
sta dtree otherwise, make a null seed out of it.
|
||||
sta dsap
|
||||
L489F sta dseed+1
|
||||
L48A2 ldy fcbptr also must pass file's 1st block address.
|
||||
lda fcbbuf+12,y
|
||||
sta firstbl
|
||||
lda fcbbuf+13,y
|
||||
sta firstbh
|
||||
stz deblock lastly, initialize # of blocks to
|
||||
stz deblock+1 be free'd.
|
||||
jsr detree deallocate blocks from tree.
|
||||
php save any error status until fcb
|
||||
pha is cleaned up.
|
||||
sec
|
||||
ldy fcbptr
|
||||
ldx #$00
|
||||
L48C2 lda firstbl,x
|
||||
sta fcbbuf+12,y move in possible new first file block
|
||||
lda fcbbuf+24,y address. adjust usage count also
|
||||
sbc deblock,x
|
||||
sta fcbbuf+24,y
|
||||
iny
|
||||
inx
|
||||
txa
|
||||
and #$01 test for both bytes adjusted
|
||||
bne L48C2 without disturbing carry.
|
||||
lda stortyp get possibly modified storage type
|
||||
lsr a
|
||||
lsr a
|
||||
lsr a
|
||||
lsr a
|
||||
ldy fcbptr and save it in fcb.
|
||||
sta fcbbuf+7,y
|
||||
jsr clrstats make it look as though position has
|
||||
jsr dvcbrev nothing allocated, update total blocks
|
||||
ldy fcbptr in fcb and correct position.
|
||||
iny
|
||||
iny
|
||||
ldx #$02
|
||||
L48F2 lda fcbbuf+18,y tell 'rdposn' to go to correct
|
||||
sta tposll,x
|
||||
eor #$80 position from incorrect place.
|
||||
sta fcbbuf+18,y
|
||||
dey
|
||||
dex
|
||||
bpl L48F2
|
||||
jsr rdposn go to correct position.
|
||||
bcc L490D if no error.
|
||||
tax otherwise, report latest error.
|
||||
pla
|
||||
plp
|
||||
txa restore latest error code to stack
|
||||
sec
|
||||
php
|
||||
pha save new error.
|
||||
|
||||
* mark file as in need of a flush and update fcb with new end of file,
|
||||
* then flush it.
|
||||
|
||||
L490D jsr eofset go mark and update
|
||||
jsr flush1 then go do the flush.
|
||||
bcc L491C branch if no error.
|
||||
tax save latest error.
|
||||
pla clean previous error off stack
|
||||
plp
|
||||
txa and restore latest error to stack.
|
||||
sec show error condition.
|
||||
php restore error status to stack
|
||||
pha and the error code.
|
||||
L491C pla report any errors that may have
|
||||
plp appeared.
|
||||
rts
|
||||
|
||||
geteof .EQ *-ofsX
|
||||
ldx fcbptr index to end of file mark
|
||||
ldy #$02 and index to user's call parameters
|
||||
L4924 lda fcbbuf+21,x
|
||||
sta (A3L),y
|
||||
inx
|
||||
iny
|
||||
cpy #$05
|
||||
bne L4924 loop until all 3 bytes moved
|
||||
clc no errors
|
||||
rts
|
||||
|
||||
newline .EQ *-ofsX
|
||||
ldy #$02 adjust newline status for open file.
|
||||
lda (A3L),y on or off ?
|
||||
ldx fcbptr it will be 0 if off.
|
||||
sta fcbbuf+31,x set new line mask
|
||||
iny
|
||||
lda (A3L),y and move in 'new-line' byte
|
||||
sta fcbbuf+10,x
|
||||
clc no error possible
|
||||
rts
|
||||
|
||||
getinfo .EQ *-ofsX
|
||||
jsr findfile look for file.
|
||||
bcc L4988 no error.
|
||||
cmp #$40 was it a root directory file ?
|
||||
sec (in case of no match)
|
||||
bne L49A4 if not, then error.
|
||||
lda #$F0
|
||||
sta d_stor for get info, report proper storage
|
||||
stz reql type. forca a count of free blocks.
|
||||
stz reqh
|
||||
ldx vcbptr
|
||||
jsr tkfrecnt get a fresh count of free blocks on
|
||||
ldx vcbptr this volume.
|
||||
lda vcbbuf+21,x return total blocks and total in use.
|
||||
sta reqh 1st transfer 'free' blocks to zpage
|
||||
lda vcbbuf+20,x for later subtraction to determine
|
||||
sta reql the 'used' count.
|
||||
lda vcbbuf+19,x transfer to 'd.' table as aux id
|
||||
sta d_auxid+1 (total block count is considered aux id
|
||||
pha for the volume)
|
||||
lda vcbbuf+18,x
|
||||
sta d_auxid
|
||||
sec subtract and report the number of
|
||||
sbc reql blocks 'in use'
|
||||
sta d_usage
|
||||
pla
|
||||
sbc reqh
|
||||
sta d_usage+1
|
||||
L4988 lda d_stor transfer bytes from internal order to
|
||||
lsr a call spec via 'inftabl' translation
|
||||
lsr a table but first change storage type to
|
||||
lsr a external (low nibble) format.
|
||||
lsr a
|
||||
sta d_stor
|
||||
ldy #$11 index to last of user's spec table.
|
||||
L4994 lda inftabl-3,y
|
||||
and #$7F strip bit used by setinfo
|
||||
tax
|
||||
lda d_stor,x move directory info to call spec. table
|
||||
sta (A3L),y
|
||||
dey
|
||||
cpy #$03
|
||||
bcs L4994 if all info bytes moved, retn carry clr
|
||||
L49A4 rts
|
||||
|
||||
setinfo .EQ *-ofsX
|
||||
jsr findfile get the file to work on.
|
||||
bcs L49CF if error.
|
||||
lda bubit see if backup bit can be cleared
|
||||
eor #$20
|
||||
and d_attr
|
||||
and #$20
|
||||
sta bkbitflg or preserve current...
|
||||
ldy #$0D init pointer to user supplied list.
|
||||
L49B9 ldx inftabl-3,y get index to corresponding 'd.' table.
|
||||
bmi L49C3 branch if parameter can't be set.
|
||||
lda (A3L),y
|
||||
sta d_stor,x
|
||||
L49C3 dey has user's request been satisfied ?
|
||||
cpy #$03
|
||||
bcs L49B9 no, move next byte.
|
||||
and #$18 make sure no illegal access bits were
|
||||
beq L49D0 set !! branch if legal access.
|
||||
lda #$4E otherwise, access error.
|
||||
sec
|
||||
L49CF rts
|
||||
L49D0 ldy #$0B
|
||||
lda (A3L),y was clock null input ?
|
||||
beq L49D9 if yes.
|
||||
jmp drevise1 end by updating directory.
|
||||
L49D9 jmp drevise update with clock also...
|
||||
|
||||
rename .EQ *-ofsX
|
||||
jsr lookfile look for source (original) file.
|
||||
bcc L4A1E if found.
|
||||
cmp #$40 trying to rename a volume ?
|
||||
bne L49FD no, return error.
|
||||
jsr renpath syntax new name.
|
||||
bcs L49FD rename error.
|
||||
ldy pathbuf find out if only rootname for new name
|
||||
iny
|
||||
lda pathbuf,y must be $FF if volume name only.
|
||||
bne L4A72 if not single name
|
||||
ldx vcbptr check for open files before changing.
|
||||
lda vcbbuf+17,x
|
||||
bpl L49FF if volume not busy.
|
||||
lda #$50 file busy error.
|
||||
L49FD sec
|
||||
rts
|
||||
L49FF ldy #$00 get newname's length
|
||||
lda pathbuf,y
|
||||
ora #$F0 (root file storage type)
|
||||
jsr mvrotnam update root directory.
|
||||
bcs L4A74 rename error.
|
||||
ldy #$00
|
||||
ldx vcbptr update vcb also.
|
||||
L4A10 lda pathbuf,y move new name to vcb.
|
||||
beq L4A1C
|
||||
sta vcbbuf,x
|
||||
iny next character
|
||||
inx
|
||||
bne L4A10 always.
|
||||
L4A1C clc no errors
|
||||
rts
|
||||
L4A1E jsr getnamptr set y = 1st char of path, x = 0.
|
||||
L4A21 lda pathbuf,y move original name to gbuf
|
||||
sta gbuf,x for later comparison to new name.
|
||||
bmi L4A2D if last character has been moved
|
||||
iny otherwise, get the next one.
|
||||
inx
|
||||
bne L4A21 always.
|
||||
L4A2D jsr renpath get new name syntaxed.
|
||||
bcs L4A74 rename error.
|
||||
jsr getnamptr set y = path, x = 0.
|
||||
lda pathbuf,y now compare new name with old name
|
||||
L4A38 cmp gbuf,x to make sure they are in the same dir.
|
||||
php save result of comparison.
|
||||
and #$F0 was last char really a count ?
|
||||
bne L4A46 if not.
|
||||
sty rnptr save pointer to next name, it might
|
||||
stx namptr be the last.
|
||||
L4A46 plp result of last comparison ?
|
||||
bne L4A52 branch if different character or count.
|
||||
inx bump pointers.
|
||||
iny
|
||||
lda pathbuf,y was it the last character ?
|
||||
bne L4A38 if not.
|
||||
clc no operation, names were the same.
|
||||
rts
|
||||
L4A52 ldy rnptr index to last name in the chain.
|
||||
lda pathbuf,y get last name length.
|
||||
sec
|
||||
adc rnptr
|
||||
tay
|
||||
lda pathbuf,y this byte should be $00 !
|
||||
bne L4A72 if not, bad path error.
|
||||
ldx namptr index to last of original name
|
||||
lda gbuf,x
|
||||
sec
|
||||
adc namptr
|
||||
tax
|
||||
lda gbuf,x this byte should also be $00.
|
||||
beq L4A76 if so, continue processing.
|
||||
L4A72 lda #$40 bad pathname error.
|
||||
L4A74 sec
|
||||
rts
|
||||
L4A76 jsr lookfile test for duplicate file name.
|
||||
bcs L4A7F branch if file not found, which is ok !!
|
||||
lda #$47 duplicate name error.
|
||||
sec
|
||||
rts
|
||||
L4A7F cmp #$46 was it a valid file not found ?
|
||||
bne L4A74 no, rename error.
|
||||
jsr setpath syntax pathname of file to be changed.
|
||||
jsr findfile get all the info on this file.
|
||||
bcs L4A74 rename error.
|
||||
jsr tstopen is file in use ?
|
||||
lda #$50 anticipate file busy error.
|
||||
bcs L4A74 error if in use.
|
||||
lda d_attr test bit which allows rename.
|
||||
and #$40
|
||||
bne L4A9D branch if ok to rename
|
||||
lda #$4E otherwise, illegal access.
|
||||
L4A9B sec
|
||||
rts
|
||||
L4A9D lda d_stor find out which storage type.
|
||||
and #$F0 strip off name length.
|
||||
cmp #$D0 is it a directory ?
|
||||
beq L4AAE then ok.
|
||||
cmp #$40 is it a seed, sapling or tree ?
|
||||
bcc L4AAE then ok.
|
||||
lda #$4A file incompatible error.
|
||||
bne L4A9B always.
|
||||
L4AAE jsr renpath since both names go into the directory,
|
||||
bcs L4A74 syntax the new name to get the local
|
||||
ldy rnptr name address. y = index to local name
|
||||
ldx pathbuf,y length. adj y to last char of new name.
|
||||
tya
|
||||
adc pathbuf,y
|
||||
tay
|
||||
L4ABE lda pathbuf,y move local name to dir entry workspace.
|
||||
sta d_stor,x
|
||||
dey
|
||||
dex
|
||||
bne L4ABE
|
||||
lda d_stor preserve file storage type.
|
||||
and #$F0 strip off old name length.
|
||||
tax
|
||||
ora pathbuf,y add in new name's length.
|
||||
sta d_stor
|
||||
cpx #$D0 that file must be changed also.
|
||||
bne L4AF0 branch if not directory type.
|
||||
lda d_frst read in 1st header block of subdir
|
||||
ldx d_frst+1
|
||||
jsr rdblk
|
||||
bcs L4A74 errors.
|
||||
ldy rnptr change the header's name to match the
|
||||
lda pathbuf,y owner's new name. get local name length.
|
||||
ora #$E0 assume it's a header.
|
||||
jsr mvrotnam
|
||||
bcs L4A74
|
||||
L4AF0 jmp drevise1 end by updating all path directories.
|
||||
mvrotnam .EQ *-ofsX
|
||||
ldx #$00
|
||||
L4AF5 sta gbuf+4,x
|
||||
inx
|
||||
iny
|
||||
lda pathbuf,y
|
||||
bne L4AF5
|
||||
jmp wrtgbuf write changed header block.
|
||||
renpath .EQ *-ofsX
|
||||
ldy #$03 get address to new pathname
|
||||
lda (A3L),y
|
||||
iny
|
||||
sta zpt
|
||||
lda (A3L),y set up for syntaxing routine (synpath)
|
||||
sta zpt+1
|
||||
jmp synpath do syntax (returns y = local namelength)
|
||||
getnamptr .EQ *-ofsX
|
||||
ldy #$00 return pointer to 1st name of path.
|
||||
bit prfxflg is this a prefixed name ?
|
||||
bmi L4B1A branch if not.
|
||||
ldy newpfxptr
|
||||
L4B1A ldx #$00
|
||||
rts
|
||||
|
||||
MAN
|
||||
SAVE USR/SRC/PRODOS.203/PRODOS.S.XDOS.E
|
||||
LOAD USR/SRC/PRODOS.203/PRODOS.S
|
||||
ASM
|
|
@ -0,0 +1,355 @@
|
|||
NEW
|
||||
AUTO 3,1
|
||||
|
||||
destroy .EQ *-ofsX
|
||||
jsr findfile look for file to be destroyed.
|
||||
bcs L4B66 if error.
|
||||
jsr tstopen is it open ?
|
||||
lda totent
|
||||
bne L4B64 error if open.
|
||||
stz reql force proper free count in volume.
|
||||
stz reqh (no disk access occurs if already
|
||||
jsr tstfrblk proper)
|
||||
bcc L4B39 no errors.
|
||||
cmp #$48 was error a full disk ?
|
||||
bne L4B66 no, report error.
|
||||
L4B39 lda d_attr make sure ok to destroy file.
|
||||
and #$80
|
||||
bne L4B45 branch if ok to destroy.
|
||||
lda #$4E access error
|
||||
jsr p8errv (returns to caller)
|
||||
L4B45 lda devnum last device used.
|
||||
jsr twrprot1 test for write protected hardware
|
||||
bcs L4B66 before going thru deallocation.
|
||||
lda d_frst 'detree' needs first block address
|
||||
sta firstbl
|
||||
lda d_frst+1
|
||||
sta firstbh
|
||||
lda d_stor find out which storage type.
|
||||
and #$F0 strip off name length.
|
||||
cmp #$40 is it a seed, sapling or tree ?
|
||||
bcc L4B68 branch if it is.
|
||||
bra L4BCF otherwise, test for directory destroy.
|
||||
L4B64 lda #$50 file busy error.
|
||||
L4B66 sec can't be destroyed
|
||||
rts
|
||||
L4B68 sta stortyp destroy a tree file. save storage type.
|
||||
ldx #$05
|
||||
lda #$00 set 'detree' input variables, must be
|
||||
L4B6F sta stortyp,x in order: deblock, dtree, dsap, dseed.
|
||||
dex
|
||||
bne L4B6F loop until all zero'd.
|
||||
lda #$02 this avoids an extra file i/o and pre-
|
||||
sta dseed+1 vents destruction of any deleted data.
|
||||
inc delflag don't allow detree to zero index blocks.
|
||||
jsr detree make trees and saplings into seeds.
|
||||
dec delflag reset flag.
|
||||
bcs L4B93 (de-evolution)
|
||||
L4B85 ldx firstbh
|
||||
lda firstbl now deallocate seed.
|
||||
jsr dealloc
|
||||
bcs L4B93
|
||||
jsr upbmap
|
||||
L4B93 pha save possible error code.
|
||||
lda #$00 update directory to free entry space.
|
||||
sta d_stor
|
||||
cmp h_fcnt file entry wrap ?
|
||||
bne L4BA1 branch if no carry adjustment.
|
||||
dec h_fcnt+1 take carry from hi byte of file entries.
|
||||
L4BA1 dec h_fcnt mark header with one less file.
|
||||
jsr dvcbrev go update block count in vcb (ignore
|
||||
jsr drevise error, if any) and update dir last.
|
||||
tax save possible new error code,
|
||||
pla restore possible old error code.
|
||||
bcc L4BAF branch if last call succeeded.
|
||||
txa last call failed, use it's error code.
|
||||
L4BAF cmp #$01 adjust carry accordingly
|
||||
rts
|
||||
dvcbrev .EQ *-ofsX update block free count in vcb.
|
||||
ldy vcbptr point to vcb of correct device.
|
||||
lda deblock get # of blocks recently freed.
|
||||
adc vcbbuf+20,y
|
||||
sta vcbbuf+20,y update current free block count.
|
||||
lda deblock+1
|
||||
adc vcbbuf+21,y
|
||||
sta vcbbuf+21,y
|
||||
lda #$00 force re-scan from 1st bitmap
|
||||
sta vcbbuf+28,y
|
||||
rts
|
||||
L4BCD bcc L4B85 branch widened (always taken)
|
||||
L4BCF cmp #$D0 is this a directory file ?
|
||||
bne L4C1B no, file incompatible.
|
||||
jsr fndbmap make sure a buffer available for bitmap
|
||||
bcs L4C1A if error.
|
||||
lda d_frst read 1st block of directory into gbuf
|
||||
sta bloknml
|
||||
lda d_frst+1
|
||||
sta bloknml+1
|
||||
jsr rdgbuf
|
||||
bcs L4C1A
|
||||
lda gbuf+37 do any files exist in this directory ?
|
||||
bne L4BF1 if so, access error.
|
||||
lda gbuf+38
|
||||
beq L4BF6
|
||||
L4BF1 lda #$4E access error.
|
||||
jsr p8errv P8 error vector
|
||||
L4BF6 sta gbuf+4 make it an invalid subdirectory
|
||||
jsr wrtgbuf
|
||||
bcs L4C1A
|
||||
L4BFE lda gbuf+2 get forward link.
|
||||
cmp #$01 test for null block into carry.
|
||||
ldx gbuf+3 get the rest of the block address.
|
||||
bne L4C0A branch if not null.
|
||||
bcc L4BCD was the low part null as well ?
|
||||
L4C0A jsr dealloc free this block.
|
||||
bcs L4C1A
|
||||
lda gbuf+2
|
||||
ldx gbuf+3
|
||||
jsr rdblk
|
||||
bcc L4BFE loop until all freed
|
||||
L4C1A rts
|
||||
L4C1B lda #$4A file incompatible
|
||||
jsr p8errv (returns to caller)
|
||||
fcbused .EQ *-ofsX mark fcb as dirty so the directory
|
||||
pha will be flushed on 'flush'.
|
||||
tya save regs.
|
||||
pha
|
||||
ldy fcbptr
|
||||
lda fcbbuf+28,y fetch current fcb dirty byte.
|
||||
ora #$80 mark fcb as dirty.
|
||||
sta fcbbuf+28,y save it back
|
||||
pla and restore regs.
|
||||
tay
|
||||
pla
|
||||
rts
|
||||
|
||||
* 'detree' deallocates blocks from tree files. it is assumed that the device has
|
||||
* been pre-selected and the 'gbuf' may be used.
|
||||
*
|
||||
* on entry:
|
||||
* stortype = storage type in upper nibble, lower nibble is undisturbed.
|
||||
* firstbl & firstbh = first block of file (index or data).
|
||||
* deblock = 0
|
||||
* dtree = ptr to 1st block with data to be deallocated at tree level.
|
||||
* dsap = ptr to 1st block at sapling level.
|
||||
* dseed = byte (0-511) position to be zeroed from (inclusive).
|
||||
*
|
||||
* on exit:
|
||||
* stortype = modified result of storage type (if applicable).
|
||||
* firstbl & h = modified if storage type changed.
|
||||
* deblock = total number of blocks freed at all levels.
|
||||
* dtree, dsap, deseed unchanged.
|
||||
*
|
||||
* to trim a tree to a seed file, both dtree and dsap must be zero.
|
||||
* to go from tree to sapling, dtree alone must be zero.
|
||||
|
||||
detree .EQ *-ofsX
|
||||
lda stortyp which kind of tree ?
|
||||
cmp #$20 is it a 'seed' ?
|
||||
bcc L4C46 if yes.
|
||||
cmp #$30 a sapling ?
|
||||
bcc L4C51 if yes.
|
||||
cmp #$40 is it at least a 'tree' ?
|
||||
bcc L4C59 branch if it is.
|
||||
lda #$0C block allocation error.
|
||||
jsr sysdeath P8 system death vector
|
||||
|
||||
* seedling file type - make sure first desireable block is the only
|
||||
* block available in a seedling file.
|
||||
|
||||
L4C46 lda dsap
|
||||
ora dtree
|
||||
bne L4CC2
|
||||
jmp seedel0
|
||||
|
||||
* sapling file type - make sure first desireable block is within the range of
|
||||
* blocks available in a sapling file
|
||||
|
||||
L4C51 lda dtree can't have any blocks in this range
|
||||
bne L4CC2 if so then done
|
||||
jmp sapdel0 else go deallocate
|
||||
L4C59 lda #$80
|
||||
sta topdest for tree top start at end, work backwards.
|
||||
L4C5E jsr drdfrst read specified first block into gbuf.
|
||||
bcs L4CC2 return errors.
|
||||
ldy topdest get current pointer to top indexes.
|
||||
cpy dtree have enough sapling indexes been
|
||||
beq L4CC3 deallocated? yes, now deallocate blocks
|
||||
ldx #$07 buffer up to 8 sapling index block
|
||||
L4C6D lda gbuf,y addresses. fetch low block address
|
||||
sta dealbufl,x and save it.
|
||||
ora gbuf+$100,y is it a real block that is allocated?
|
||||
beq L4C81 branch if phantom block.
|
||||
lda gbuf+$100,y fetch high block address
|
||||
sta dealbufh,x and save it.
|
||||
dex decrement and test for dealc buf filled.
|
||||
bmi L4C93 branch if 8 addresses fetched.
|
||||
L4C81 dey look for end of deallocation limit.
|
||||
cpy dtree is this the last position on tree level?
|
||||
bne L4C6D if not.
|
||||
iny
|
||||
lda #$00 fill rest of dealc buffer with null addresses.
|
||||
L4C8A sta dealbufl,x
|
||||
sta dealbufh,x
|
||||
dex
|
||||
bpl L4C8A
|
||||
L4C93 dey decrement to prepare for next time.
|
||||
sty topdest save index.
|
||||
ldx #$07
|
||||
L4C99 stx dtmpx save index to dealc buf.
|
||||
lda dealbufl,x
|
||||
sta bloknml
|
||||
ora dealbufh,x finished ?
|
||||
beq L4C5E branch if done with this level.
|
||||
lda dealbufh,x complete address with high byte,
|
||||
sta bloknml+1
|
||||
jsr rdgbuf read sapling level into gbuf.
|
||||
bcs L4CC2 return errors.
|
||||
jsr dealblk go free all data indexes in this block
|
||||
bcs L4CC2
|
||||
jsr wrtgbuf write the flipped index block
|
||||
bcs L4CC2
|
||||
ldx dtmpx restore index to dealc buff.
|
||||
dex are there more to free?
|
||||
bpl L4C99 branch if so.
|
||||
bmi L4C5E branch always to get up to 8 more
|
||||
L4CC2 rts sapling block numbers.
|
||||
L4CC3 ldy dtree deallocate all sapling blocks greater
|
||||
iny than specified block.
|
||||
jsr dalblk1 (master index in gbuf)
|
||||
bcs L4CC2 if errors.
|
||||
jsr wrtgbuf write updated master index back to disk.
|
||||
bcs L4CC2
|
||||
ldy dtree figure out if tree can become sapling.
|
||||
beq L4CEB branch if it can.
|
||||
lda gbuf,y otherwise, continue with partial.
|
||||
sta bloknml deallocation of last sapling index.
|
||||
ora gbuf+$100,y is there such a sapling index block ?
|
||||
beq L4CC2 all done if not.
|
||||
lda gbuf+$100,y read in sapling level to be modified.
|
||||
sta bloknml+1
|
||||
jsr rdgbuf read highest sapling index into gbuf.
|
||||
bcc L4CF5
|
||||
rts
|
||||
L4CEB jsr shrink shrink tree to sapling
|
||||
bcs L4CC2
|
||||
sapdel0 .EQ *-ofsX
|
||||
jsr drdfrst read specified sapling level index
|
||||
bcs L4CC2 into gbuf. branch if error.
|
||||
L4CF5 ldy dsap pointer to last of desirable indexes.
|
||||
iny inc to 1st undesirable.
|
||||
beq L4D05 branch if all are desirable.
|
||||
jsr dalblk1 deallocate all indexes above specified.
|
||||
bcs L4CC2
|
||||
jsr wrtgbuf write out the index block
|
||||
bcs L4CC2
|
||||
L4D05 ldy dsap prepare to clean up last data block.
|
||||
beq L4D1F branch if possibility of making a seed.
|
||||
L4D0A lda gbuf,y fetch low order data block address.
|
||||
sta bloknml
|
||||
ora gbuf+$100,y is it a real block ?
|
||||
beq L4CC2 if not, then done.
|
||||
lda gbuf+$100,y
|
||||
sta bloknml+1
|
||||
jsr rdgbuf go read data block into gbuf.
|
||||
bcc L4D2E branch if good read
|
||||
rts or return error.
|
||||
L4D1F lda dtree are both tree and sap levels zero ?
|
||||
bne L4D0A if not.
|
||||
jsr shrink reduce this sap to a seed.
|
||||
bcs L4D52 if error.
|
||||
seedel0 .EQ *-ofsX
|
||||
jsr drdfrst go read data block.
|
||||
bcs L4D52 if error.
|
||||
L4D2E ldy dseed+1 check high byte for no deletion.
|
||||
beq L4D39 branch if all of 2nd page to be deleted.
|
||||
dey if dseed > $200 then all were done.
|
||||
bne L4D52 branch if that is the case.
|
||||
ldy dseed clear only bytes >= dseed.
|
||||
L4D39 lda #$00
|
||||
L4D3B sta gbuf+$100,y zero out unwanted data
|
||||
iny
|
||||
bne L4D3B
|
||||
ldy dseed+1 is that all ?
|
||||
bne L4D4F yes.
|
||||
ldy dseed
|
||||
L4D49 sta gbuf,y
|
||||
iny
|
||||
bne L4D49
|
||||
L4D4F jmp wrtgbuf update data block to disk.
|
||||
L4D52 rts return error status.
|
||||
drdfrst .EQ *-ofsX read specified 1st block into gbuf
|
||||
lda firstbl
|
||||
ldx firstbh
|
||||
jmp rdblk go read it
|
||||
|
||||
* beware that dealloc may bring in a new bitmap block and may destroy
|
||||
* locations 46 and 47 which are used to point to the current index block.
|
||||
|
||||
shrink .EQ *-ofsX
|
||||
ldx firstbh first deallocate top index block
|
||||
txa
|
||||
pha
|
||||
lda firstbl
|
||||
pha save block address of this index block.
|
||||
jsr dealloc free it from the bitmap
|
||||
pla
|
||||
sta bloknml set master of sapling
|
||||
pla index block address.
|
||||
sta bloknml+1
|
||||
bcs L4D8D report errors.
|
||||
lda gbuf get # of new 1st block from old index.
|
||||
sta firstbl
|
||||
lda gbuf+$100
|
||||
sta firstbh
|
||||
ldy #$00
|
||||
jsr swapme flip that one entry in old top index.
|
||||
sec now change file type,
|
||||
lda stortyp from tree to sapling,
|
||||
sbc #$10 or from sapling to seed.
|
||||
sta stortyp
|
||||
jsr wrtgbuf write the (deallocated) old top index.
|
||||
L4D8D rts return error status.
|
||||
dealblk .EQ *-ofsX
|
||||
ldy #$00 start at beginning.
|
||||
dalblk1 .EQ *-ofsX
|
||||
lda bloknml save disk address of gbuf's data.
|
||||
pha
|
||||
lda bloknml+1
|
||||
pha
|
||||
L4D96 sty saptr save current index.
|
||||
lda gbuf,y get low address of block to deallocate.
|
||||
cmp #$01 test for null block into carry.
|
||||
ldx gbuf+$100,y get remainder of block address.
|
||||
bne L4DA5 branch if not null.
|
||||
bcc L4DB0 was the low part null too ?
|
||||
L4DA5 jsr dealloc free it up on volume bitmap.
|
||||
bcs L4DB4 return any error.
|
||||
ldy saptr get index to sapling level index block.
|
||||
jsr swapme
|
||||
L4DB0 iny next block address.
|
||||
bne L4D96 if more to deallocate or test.
|
||||
clc no error.
|
||||
L4DB4 tax save error code, if any.
|
||||
pla restore blocknm (16 bit)
|
||||
sta bloknml+1
|
||||
pla
|
||||
sta bloknml
|
||||
txa restore return code
|
||||
rts
|
||||
swapme .EQ *-ofsX
|
||||
lda delflag swapping or zeroing ?
|
||||
bne L4DC5 skip if swapping.
|
||||
tax make x = 0.
|
||||
beq L4DCB zero the index (always taken).
|
||||
L4DC5 ldx gbuf+$100,y index high
|
||||
lda gbuf,y index low
|
||||
L4DCB sta gbuf+$100,y save index high
|
||||
txa
|
||||
sta gbuf,y save index low
|
||||
rts done.
|
||||
|
||||
MAN
|
||||
SAVE USR/SRC/PRODOS.203/PRODOS.S.XDOS.F
|
||||
LOAD USR/SRC/PRODOS.203/PRODOS.S
|
||||
ASM
|
|
@ -90,9 +90,9 @@ cmembit .EQ *-ofsX
|
|||
lda whichbit,y bit position representation.
|
||||
pha save bit position mask for now.
|
||||
txa page address.
|
||||
lsr a
|
||||
lsr a determine 2k set
|
||||
lsr a
|
||||
lsr
|
||||
lsr determine 2k set
|
||||
lsr
|
||||
tay return it in y.
|
||||
pla restore bit mask. return bit position
|
||||
rts in a & y, pointer to memtabl in x.
|
||||
|
@ -162,11 +162,11 @@ L4EC7 rts
|
|||
calldisp .EQ *-ofsX
|
||||
lda altram read/write RAM bank 2
|
||||
lda altram
|
||||
lda #>dispadr
|
||||
lda /dispadr
|
||||
sta A2L+1
|
||||
lda #<dispadr
|
||||
lda #dispadr
|
||||
sta A2L
|
||||
lda #>displc2
|
||||
lda /displc2
|
||||
sta A1L+1
|
||||
stz A1L
|
||||
ldy #$00
|
||||
|
@ -176,15 +176,15 @@ L4EE0 dey move a page of code.
|
|||
sta (A2L),y
|
||||
tya
|
||||
bne L4EE0
|
||||
inc1L+1 pointers to next page
|
||||
inc2L+1
|
||||
inc A1L+1 pointers to next page
|
||||
inc A2L+1
|
||||
dex move all pages needed
|
||||
bne L4EE0
|
||||
lda ramin read/write RAM bank 1
|
||||
lda ramin swap mli space back in
|
||||
stz mliact MLI active flag
|
||||
stz softev
|
||||
lda #>dispadr point RESET to dispatch entry
|
||||
lda /dispadr point RESET to dispatch entry
|
||||
sta softev+1
|
||||
eor #$A5
|
||||
sta pwredup power up byte
|
||||
|
@ -198,9 +198,9 @@ remap_sp .EQ *-ofsX
|
|||
lda A4L command number
|
||||
sta cmdnum
|
||||
bne L4F1B taken if not status call
|
||||
ldy #<spstatlist set up memory for the status list buffer
|
||||
ldy #spstatlist set up memory for the status list buffer
|
||||
sty buf fake up the prodos parameters
|
||||
ldy #>spstatlist
|
||||
ldy /spstatlist
|
||||
sty buf+1
|
||||
stz bloknml set statcode = 0 for simple status call
|
||||
L4F1B cmp #$03 format command ?
|
||||
|
@ -208,10 +208,10 @@ L4F1B cmp #$03 format command ?
|
|||
ldx #$01 format has only 1 parameter.
|
||||
L4F21 stx statparms set # of parms.
|
||||
lda unitnum
|
||||
lsr a turn unit number into an index
|
||||
lsr a
|
||||
lsr a
|
||||
lsr a
|
||||
lsr turn unit number into an index
|
||||
lsr
|
||||
lsr
|
||||
lsr
|
||||
tax
|
||||
lda spunit-1,x get the smartport unit number and
|
||||
sta sp_unitnum store into smartport parm list.
|
||||
|
@ -228,7 +228,7 @@ sp_vector .EQ *-ofsX smartport call
|
|||
jsr $0000 (entry address gets modified)
|
||||
cmdnum .EQ *-ofsX
|
||||
.HS 00 command #
|
||||
.DA statparms'
|
||||
.DA statparms
|
||||
bcs L4F6E
|
||||
ldx cmdnum status call ?
|
||||
bne L4F6E no...
|
||||
|
@ -246,90 +246,90 @@ L4F65 and #$44 mask all but write allowed and write
|
|||
L4F6D sec
|
||||
L4F6E rts
|
||||
spvectlo .EQ *-ofsX storage for low byte of smartport
|
||||
.DA #0000000000000000' entry.
|
||||
.DA #00000000000000'
|
||||
.HS 0000000000000000 entry.
|
||||
.HS 00000000000000
|
||||
spvecthi .EQ *-ofsX storage for high byte of smartport
|
||||
.DA #0000000000000000' entry.
|
||||
.DA #00000000000000'
|
||||
.HS 0000000000000000 entry.
|
||||
.HS 00000000000000
|
||||
statparms .EQ *-ofsX # of parms (always 3 except format)
|
||||
dc h'03'
|
||||
.HS 03
|
||||
sp_unitnum .EQ *-ofsX
|
||||
.HS 00 unit number
|
||||
sp_bufptr .EQ *-ofsX
|
||||
.HS 0000 data buffer
|
||||
dc h'000000' block number (3 bytes)
|
||||
.HS 000000 block number (3 bytes)
|
||||
|
||||
* data tables
|
||||
|
||||
scnums .EQ *-ofsX table of valid mli command numbers.
|
||||
dc h'D3000000'
|
||||
.DA #40410000808182'
|
||||
.DA #65C0C1C2C3C4C5C6'
|
||||
.DA #C7C8C9CACBCCCDCE'
|
||||
.DA #CF00D0D1D2'
|
||||
.HS D3000000
|
||||
.HS 40410000808182
|
||||
.HS 65C0C1C2C3C4C5C6
|
||||
.HS C7C8C9CACBCCCDCE
|
||||
.HS CF00D0D1D2
|
||||
pcntbl .EQ *-ofsX parameter counts for the calls
|
||||
dc h'02FFFF'
|
||||
.DA #FF0201FFFF030300'
|
||||
.DA #04070102070A0201'
|
||||
.DA #0103030404010102'
|
||||
.DA #02FF020202'
|
||||
.HS 02FFFF
|
||||
.HS FF0201FFFF030300
|
||||
.HS 04070102070A0201
|
||||
.HS 0103030404010102
|
||||
.HS 02FF020202
|
||||
|
||||
* command table
|
||||
|
||||
cmdtable .EQ *-ofsX
|
||||
.DA create' create
|
||||
.DA destroy' destroy
|
||||
.DA rename' rename
|
||||
.DA setinfo' setinfo
|
||||
.DA getinfo' getinfo
|
||||
.DA online' online
|
||||
.DA setprefx' set prefix
|
||||
.DA getprefx' get prefix
|
||||
.DA openf' open
|
||||
.DA newline' newline
|
||||
.DA readf' read
|
||||
.DA writef' write
|
||||
.DA closef' close
|
||||
.DA flushf' flush
|
||||
.DA setmark' set mark
|
||||
.DA getmark' get mark
|
||||
.DA seteof' seteof
|
||||
.DA geteof' geteof
|
||||
.DA setbuf' setbuf
|
||||
.DA getbuf' getbuf
|
||||
.DA create create
|
||||
.DA destroy destroy
|
||||
.DA rename rename
|
||||
.DA setinfo setinfo
|
||||
.DA getinfo getinfo
|
||||
.DA online online
|
||||
.DA setprefx set prefix
|
||||
.DA getprefx get prefix
|
||||
.DA openf open
|
||||
.DA newline newline
|
||||
.DA readf read
|
||||
.DA writef write
|
||||
.DA closef close
|
||||
.DA flushf flush
|
||||
.DA setmark set mark
|
||||
.DA getmark get mark
|
||||
.DA seteof seteof
|
||||
.DA geteof geteof
|
||||
.DA setbuf setbuf
|
||||
.DA getbuf getbuf
|
||||
|
||||
* corresponding command function bytes
|
||||
|
||||
disptch .EQ *-ofsX
|
||||
dc h'A0A1A2A3'
|
||||
.DA #84050607'
|
||||
dc h'88494A4B'
|
||||
.DA #2C2D4E4F'
|
||||
.DA #50515253'
|
||||
.HS A0A1A2A3
|
||||
.HS 84050607
|
||||
.HS 88494A4B
|
||||
.HS 2C2D4E4F
|
||||
.HS 50515253
|
||||
|
||||
dinctbl .EQ *-ofsX table to increment
|
||||
dc h'0100000200' directory usage/eof counts
|
||||
.HS 0100000200 directory usage/eof counts
|
||||
pass .EQ *-ofsX
|
||||
dc h'75'
|
||||
.HS 75
|
||||
xdosver .EQ *-ofsX
|
||||
dc h'00'
|
||||
.HS 00
|
||||
compat .EQ *-ofsX
|
||||
.HS 00
|
||||
dc h'C3270D000000'
|
||||
.HS C3270D000000
|
||||
rootstuf .EQ *-ofsX
|
||||
.DA #0F02000400000800'
|
||||
.HS 0F02000400000800
|
||||
whichbit .EQ *-ofsX
|
||||
.DA #8040201008040201'
|
||||
.HS 8040201008040201
|
||||
ofcbtbl .EQ *-ofsX
|
||||
.DA #0C0D1819151617'
|
||||
.HS 0C0D1819151617
|
||||
inftabl .EQ *-ofsX
|
||||
.DA #1E101F2080939421'
|
||||
.DA #22232418191A1B'
|
||||
.HS 1E101F2080939421
|
||||
.HS 22232418191A1B
|
||||
deathmsg .EQ *-ofsX
|
||||
dc h'20'
|
||||
msb on
|
||||
dc c'RESTART SYSTEM-$01'
|
||||
dc h'20'
|
||||
.HS 20
|
||||
|
||||
.AS 'RESTART SYSTEM-$01'
|
||||
.HS 20
|
||||
|
||||
*** work space ***
|
||||
|
||||
|
@ -368,8 +368,8 @@ d_entblk .EQ *-ofsX address of block which contains entry
|
|||
d_entnum .EQ *-ofsX entry number within block
|
||||
.HS 00
|
||||
d_stor .EQ *-ofsX
|
||||
dc h'0000000000000000' file name
|
||||
dc h'0000000000000000'
|
||||
.HS 0000000000000000 file name
|
||||
.HS 0000000000000000
|
||||
d_filid .EQ *-ofsX user's identification byte
|
||||
.HS 00
|
||||
d_frst .EQ *-ofsX first block of file
|
||||
|
@ -377,7 +377,7 @@ d_frst .EQ *-ofsX first block of file
|
|||
d_usage .EQ *-ofsX # of blocks allocated to this file
|
||||
.HS 0000
|
||||
d_eof .EQ *-ofsX current end of file marker
|
||||
dc h'000000'
|
||||
.HS 000000
|
||||
d_credt .EQ *-ofsX
|
||||
.HS 0000 file creation date
|
||||
.HS 0000 file creation time
|
||||
|
@ -395,11 +395,11 @@ d_moddt .EQ *-ofsX
|
|||
d_dhdr .EQ *-ofsX file directory header block address
|
||||
.HS 0000
|
||||
scrtch .EQ *-ofsX scratch area for
|
||||
.DA #00000000' allocation address conversion.
|
||||
.DA #00000000 allocation address conversion.
|
||||
oldeof .EQ *-ofsX temp used in r/w
|
||||
dc h'000000'
|
||||
.HS 000000
|
||||
oldmark .EQ *-ofsX
|
||||
.DA #000000'
|
||||
.DA #000000
|
||||
xvcbptr .EQ *-ofsX used in 'cmpvcb' as a temp
|
||||
.HS 00
|
||||
vcbptr .EQ *-ofsX
|
||||
|
|
File diff suppressed because it is too large
Load Diff
|
@ -5,17 +5,38 @@ NEW
|
|||
.OR $0000
|
||||
.TF PRODOS203,TSYS
|
||||
*--------------------------------------
|
||||
.INB INC/ZP.I
|
||||
.INB INC/IO.I
|
||||
.INB INC/MONITOR.I
|
||||
* .INB INC/MONITOR.I
|
||||
.INB INC/MLI.I
|
||||
.INB INC/MLI.E.I
|
||||
.INB INC/ZP.I
|
||||
*--------------------------------------
|
||||
MMStartUp .EQ 0000
|
||||
NewHandle .EQ 0000
|
||||
MessageCenter .EQ 0000
|
||||
DisposeHandle .EQ 0000
|
||||
MMShutDown .EQ 0000
|
||||
ReadTimeHex .EQ 0000
|
||||
Int2Hex .EQ 0000
|
||||
TLTextMountVolume .EQ 0000
|
||||
.MA IIGS
|
||||
ldx ##]1
|
||||
jsl $E10000
|
||||
.EM
|
||||
*--------------------------------------
|
||||
idxl .EQ $10 general use 16 bit index pointer
|
||||
ZP.SrcPtr .EQ $12
|
||||
ZP.DstPtr .EQ $14
|
||||
cnt .EQ $16
|
||||
*--------------------------------------
|
||||
ramdest .EQ $200 load address for aux bank /RAM driver
|
||||
PrefixBuf .EQ $280
|
||||
lodintrp .EQ $800
|
||||
DirBlkBuf .EQ $C00
|
||||
dispadr .EQ $1000
|
||||
tclk_in .EQ $D742 clock driver in bank 2
|
||||
xdosorg .EQ $DE00 xdos MLI in aux memory
|
||||
lcdest .EQ $FF00
|
||||
*--------------------------------------
|
||||
* $2000 mli_0 mli loader/relocator
|
||||
* $2C80 ram_1 installer for /RAM
|
||||
|
@ -31,25 +52,30 @@ DirBlkBuf .EQ $C00
|
|||
* $5D00 sel_1 enhanced quit code (Bird's Better Bye)
|
||||
* $6000 sel_2 GQuit dispatcher support
|
||||
|
||||
.PH $2000
|
||||
* .PH $2000
|
||||
|
||||
.INB USR/SRC/PRODOS.203/PRODOS.S.LDR
|
||||
.INB USR/SRC/PRODOS.203/PRODOS.S.RAMI
|
||||
.INB USR/SRC/PRODOS.203/PRODOS.S.RAM
|
||||
.INB USR/SRC/PRODOS.203/PRODOS.S.IRQ
|
||||
.INB USR/SRC/PRODOS.203/PRODOS.S.GP
|
||||
.INB USR/SRC/PRODOS.203/PRODOS.S.TCLK
|
||||
.INB USR/SRC/PRODOS.203/PRODOS.S.CCLK
|
||||
.INB USR/SRC/PRODOS.203/PRODOS.S.XDOS
|
||||
.INB USR/SRC/PRODOS.203/PRODOS.S.XDOS.C
|
||||
.INB USR/SRC/PRODOS.203/PRODOS.S.XDOS.M
|
||||
.INB USR/SRC/PRODOS.203/PRODOS.S.RAMX
|
||||
.INB USR/SRC/PRODOS.203/PRODOS.S.DISKII
|
||||
.INB USR/SRC/PRODOS.203/PRODOS.S.SEL0
|
||||
.INB USR/SRC/PRODOS.203/PRODOS.S.SEL1
|
||||
.INB USR/SRC/PRODOS.203/PRODOS.S.SEL2
|
||||
.INB USR/SRC/PRODOS.203/PRODOS.S.LDR.A
|
||||
.INB USR/SRC/PRODOS.203/PRODOS.S.LDR.B
|
||||
.INB USR/SRC/PRODOS.203/PRODOS.S.RAMI
|
||||
.INB USR/SRC/PRODOS.203/PRODOS.S.RAM
|
||||
.INB USR/SRC/PRODOS.203/PRODOS.S.IRQ
|
||||
.INB USR/SRC/PRODOS.203/PRODOS.S.GP
|
||||
.INB USR/SRC/PRODOS.203/PRODOS.S.TCLK
|
||||
.INB USR/SRC/PRODOS.203/PRODOS.S.CCLK
|
||||
.INB USR/SRC/PRODOS.203/PRODOS.S.XDOS.A
|
||||
.INB USR/SRC/PRODOS.203/PRODOS.S.XDOS.B
|
||||
.INB USR/SRC/PRODOS.203/PRODOS.S.XDOS.C
|
||||
.INB USR/SRC/PRODOS.203/PRODOS.S.XDOS.D
|
||||
.INB USR/SRC/PRODOS.203/PRODOS.S.XDOS.E
|
||||
.INB USR/SRC/PRODOS.203/PRODOS.S.XDOS.F
|
||||
.INB USR/SRC/PRODOS.203/PRODOS.S.XDOS.M
|
||||
.INB USR/SRC/PRODOS.203/PRODOS.S.RAMX
|
||||
.INB USR/SRC/PRODOS.203/PRODOS.S.DISKII
|
||||
.INB USR/SRC/PRODOS.203/PRODOS.S.SEL0
|
||||
.INB USR/SRC/PRODOS.203/PRODOS.S.SEL1
|
||||
.INB USR/SRC/PRODOS.203/PRODOS.S.SEL2
|
||||
|
||||
.EP
|
||||
* .EP
|
||||
*--------------------------------------
|
||||
MAN
|
||||
SAVE USR/SRC/PRODOS.203/PRODOS.S
|
||||
|
|
Loading…
Reference in New Issue