allow reading to screen memory
This commit is contained in:
parent
39c9b809bb
commit
caf39d5b83
223
PRORWTS2.S
223
PRORWTS2.S
|
@ -59,14 +59,14 @@ ver_02 = 1
|
|||
return_size = 0 ;set to 1 to receive file size on open in read-only mode
|
||||
one_shot = 0 ;set to 1 to load entire file in one pass (avoids the need to specify size)
|
||||
no_interrupts= 0 ;set to 1 to disable interrupts across calls
|
||||
detect_err = 0 ;set to 1 to to detect errors in no_interrupt mode
|
||||
detect_err = 0 ;set to 1 to to detect errors in no_interrupts mode
|
||||
swap_zp = 0 ;set to 1 to include code to preserve zpage
|
||||
;used only by RWTS mode
|
||||
swap_scrn = 0 ;set to 1 to preserve screen hole contents across SmartPort calls
|
||||
;reading directly into screen memory that includes holes (either main or aux) is not recommended
|
||||
;because SCSI firmware writes there (i.e. whichever bank is active) on exit, which will damage read content
|
||||
;recommended if allow_aux is used, to avoid device reset
|
||||
;requires 64 bytes to save all holes
|
||||
read_scrn = 0 ;set to 1 to support reading into screen memory
|
||||
;requires swap_scrn
|
||||
rwts_mode = 0 ;set to 1 to enable emulation of DOS RWTS when running from hard disk
|
||||
;uses a one-time open of a tree file, no other file access allowed
|
||||
;use unique volume numbers to distinguish between images in the same file
|
||||
|
@ -116,7 +116,7 @@ ver_02 = 1
|
|||
status = $50 ;returns non-zero on error
|
||||
} ;might_exist = 1 or poll_drive = 1
|
||||
!if write_sparse = 1 {
|
||||
sparseblk = $50 ;(internal) last-read block was sparse
|
||||
sparseblk = $50 ;(internal) last-read block was sparse if zero
|
||||
} ;write_sparse = 1
|
||||
!if allow_aux = 1 {
|
||||
auxreq = $51 ;set to 1 to read/write aux memory, else main memory is used
|
||||
|
@ -491,11 +491,20 @@ slot ldx $cfff
|
|||
!if use_smartport = 1 {
|
||||
!if enable_floppy = 1 {
|
||||
beq +
|
||||
} ;enable_floppy = 1
|
||||
bcs ++
|
||||
+ jmp bankram
|
||||
++
|
||||
} else { ;enable_floppy = 0
|
||||
!if rwts_mode = 0 {
|
||||
bcc bankram
|
||||
} else { ;rwts_mode = 1
|
||||
bcs +
|
||||
jmp bankram
|
||||
+
|
||||
} ;rwts_mode = 0
|
||||
} ;enable_floppy = 1
|
||||
|
||||
++ ldy #$8c ;STY
|
||||
ldy #$8c ;STY
|
||||
!if (rwts_mode + enable_write) > 1 {
|
||||
sty unrcommand1
|
||||
} ;rwts_mode = 1 and enable_write = 1
|
||||
|
@ -688,6 +697,11 @@ unrdrvoff1 lda MOTOROFF
|
|||
!if one_page = 1 {
|
||||
!error "one_page must be 0"
|
||||
} ;one_page = 0
|
||||
!if >(hddcodeend - reloc) > 1 {
|
||||
!if three_pages = 0 {
|
||||
!error "three_pages must be 1"
|
||||
} ;three_pages = 0
|
||||
} ;hddcodeend
|
||||
} ;hddcodeend
|
||||
} ;PASS2
|
||||
!if three_pages = 1 {
|
||||
|
@ -718,9 +732,6 @@ multicopy
|
|||
lda #$91
|
||||
sta initpatch
|
||||
} ;swap_scrn = 1
|
||||
!if load_aux = 1 {
|
||||
sta CLRAUXWR + (load_banked * 4) ;CLRAUXWR or CLRAUXZP
|
||||
} ;load_aux = 1
|
||||
|
||||
!if rwts_mode = 1 {
|
||||
;read volume directory key block
|
||||
|
@ -825,6 +836,14 @@ hddfoundname iny
|
|||
lda #>iob
|
||||
ldy #<iob
|
||||
jsr reloc
|
||||
lda #9
|
||||
sta sect
|
||||
lda #$bf
|
||||
sta addr + 1
|
||||
lda #>iob
|
||||
ldy #<iob
|
||||
jsr reloc
|
||||
ldx #$60
|
||||
jmp $b700
|
||||
|
||||
filename !byte filename_e-filename_b
|
||||
|
@ -837,6 +856,9 @@ sect !byte 0
|
|||
addr !byte 0, $b6
|
||||
!byte 0, 0, 1, 0, 0
|
||||
} else { ;rwts_mode = 0
|
||||
!if load_aux = 1 {
|
||||
sta CLRAUXWR + (load_banked * 4) ;CLRAUXWR or CLRAUXZP
|
||||
} ;load_aux = 1
|
||||
!if load_banked = 1 {
|
||||
ROMIN = $c081
|
||||
} ;load_banked = 1
|
||||
|
@ -883,12 +905,7 @@ unrblockhi = unrelocdsk + (* - reloc)
|
|||
lda #0
|
||||
jsr readdirsel
|
||||
|
||||
readdir ;note that calling this location directly limits subdirectories to 14 entries!
|
||||
lda #NAME_LENGTH + ENTRY_SIZE
|
||||
firstent sta scratchlo
|
||||
lda #>(dirbuf - 1)
|
||||
sta scratchhi
|
||||
|
||||
readdir
|
||||
!if might_exist = 1 {
|
||||
lda dirbuf + FILE_COUNT ;assuming only 256 files per subdirectory
|
||||
sta entries
|
||||
|
@ -898,6 +915,11 @@ firstent sta scratchlo
|
|||
} ;many_files = 1
|
||||
} ;might_exist = 1
|
||||
|
||||
lda #NAME_LENGTH + ENTRY_SIZE
|
||||
firstent sta scratchlo
|
||||
lda #>(dirbuf - 1)
|
||||
sta scratchhi
|
||||
|
||||
;there can be only one page crossed, so we can increment here
|
||||
|
||||
nextent1 inc scratchhi
|
||||
|
@ -2112,14 +2134,6 @@ dataend = nibtbl + 106
|
|||
unrelochdd
|
||||
!pseudopc reloc {
|
||||
!if rwts_mode = 1 {
|
||||
!if no_interrupts = 1 {
|
||||
php
|
||||
sei
|
||||
jsr +
|
||||
plp
|
||||
rts
|
||||
+
|
||||
} ;no_interrupts = 1
|
||||
!if swap_zp = 1 {
|
||||
sta zp_array + namhi - first_zp
|
||||
sty zp_array + namlo - first_zp
|
||||
|
@ -2128,6 +2142,8 @@ unrelochdd
|
|||
sta namhi
|
||||
sty namlo
|
||||
} ;swap_zp = 1
|
||||
|
||||
loopsect
|
||||
!if ver_02 = 1 {
|
||||
lda #0
|
||||
sta sizehi
|
||||
|
@ -2267,7 +2283,7 @@ runinit
|
|||
} ;enable_format = 1
|
||||
!if write_sparse = 1 {
|
||||
lda sparseblk
|
||||
bne writesparse
|
||||
beq writesparse
|
||||
} ;write_sparse = 1
|
||||
- lda (scratchlo),y
|
||||
sta (adrlo),y
|
||||
|
@ -2342,9 +2358,7 @@ swap_zpg ldx #(last_zp - first_zp)
|
|||
} ;swap_zp = 1
|
||||
|
||||
!if (enable_write + swap_zp) > 0 {
|
||||
!if no_interrupts = 0 {
|
||||
clc
|
||||
} ;no_interrupts = 0
|
||||
rts
|
||||
} ;enable_write = 1 or swap_zp = 1
|
||||
|
||||
|
@ -2428,14 +2442,12 @@ unrblokhi3 = unrelochdd + (* - reloc)
|
|||
|
||||
;disk full
|
||||
|
||||
!if swap_zpg = 0 {
|
||||
!if no_interrupts = 0 {
|
||||
!if swap_zp = 0 {
|
||||
clc
|
||||
} ;no_interrupts = 0
|
||||
rts
|
||||
} else { ;swap_zpg = 1
|
||||
} else { ;swap_zp = 1
|
||||
beq swap_zpg
|
||||
} ;swap_zpg = 0
|
||||
} ;swap_zp = 0
|
||||
|
||||
;allocate block and update bitmap
|
||||
|
||||
|
@ -2483,27 +2495,10 @@ seek1 sta blkidx
|
|||
!if (enable_readseq + allow_subdir) > 0 {
|
||||
hddrdwrpart jmp hddrdwrfile
|
||||
} ;enable_readseq = 1 or allow_subdir = 1
|
||||
hddopendir
|
||||
!if no_interrupts = 1 {
|
||||
!if detect_err = 1 {
|
||||
clc
|
||||
} ;detect_err = 1
|
||||
php
|
||||
sei
|
||||
jsr +
|
||||
!if detect_err = 1 {
|
||||
pla
|
||||
adc #0
|
||||
pha
|
||||
} ;detect_err = 1
|
||||
plp
|
||||
rts
|
||||
+
|
||||
} ;no_interrupts = 1
|
||||
|
||||
;read volume directory key block
|
||||
;self-modified by init code
|
||||
|
||||
hddopendir
|
||||
unrhddblocklo = unrelochdd + (* - reloc)
|
||||
ldx #2
|
||||
unrhddblockhi = unrelochdd + (* - reloc)
|
||||
|
@ -2517,12 +2512,7 @@ unrhddblockhi = unrelochdd + (* - reloc)
|
|||
}
|
||||
} ;enable_floppy = 1
|
||||
|
||||
hddreaddir ;note that calling this location directly limits subdirectories to 14 entries!
|
||||
lda #NAME_LENGTH + ENTRY_SIZE
|
||||
hddfirstent sta scratchlo
|
||||
lda #>(hdddirbuf - 1)
|
||||
sta scratchhi
|
||||
|
||||
hddreaddir
|
||||
!if might_exist = 1 {
|
||||
lda hdddirbuf + FILE_COUNT ;assuming only 256 files per subdirectory
|
||||
sta entries
|
||||
|
@ -2532,6 +2522,11 @@ hddfirstent sta scratchlo
|
|||
} ;many_files = 1
|
||||
} ;might_exist = 1
|
||||
|
||||
lda #NAME_LENGTH + ENTRY_SIZE
|
||||
hddfirstent sta scratchlo
|
||||
lda #>(hdddirbuf - 1)
|
||||
sta scratchhi
|
||||
|
||||
;there can be only one page crossed, so we can increment here
|
||||
|
||||
hddnextent1 inc scratchhi
|
||||
|
@ -2803,24 +2798,6 @@ hddrdwrfile
|
|||
clc
|
||||
++
|
||||
} ;allow_subdir = 1
|
||||
!if (no_interrupts + (rwts_mode xor 1)) > 1 {
|
||||
!if detect_err = 1 {
|
||||
!if allow_subdir = 0 {
|
||||
clc
|
||||
} ;allow_subdir = 0
|
||||
} ;detect_err = 1
|
||||
php
|
||||
sei
|
||||
jsr +
|
||||
!if detect_err = 1 {
|
||||
pla
|
||||
adc #0
|
||||
pha
|
||||
} ;detect_err = 1
|
||||
plp
|
||||
rts
|
||||
+
|
||||
} ;no_interrupts = 1 and rwts_mode = 0
|
||||
|
||||
hddrdwrfilei
|
||||
!if rwts_mode = 0 {
|
||||
|
@ -2916,6 +2893,9 @@ hddcopyblock
|
|||
+
|
||||
!if enable_seek = 1 {
|
||||
lda sizehi
|
||||
!if read_scrn = 1 {
|
||||
clv
|
||||
} ;read_scrn = 1
|
||||
} else { ;enable_seek = 0
|
||||
ldy sizehi
|
||||
} ;enable_seek = 1
|
||||
|
@ -2938,12 +2918,7 @@ hddcopyblock
|
|||
sta sizehi
|
||||
ora sizelo
|
||||
!if allow_subdir = 1 {
|
||||
!if no_interrupts = 1 {
|
||||
clc
|
||||
bne hddrdwrfilei
|
||||
} else { ;no_interrupts = 0
|
||||
bne hddrdwrfile
|
||||
} ;no_interrupts = 1
|
||||
} else { ;allow_subdir = 0
|
||||
bne hddrdwrfilei
|
||||
} ;allow_subdir = 1
|
||||
|
@ -2978,7 +2953,27 @@ hddrdwrloop
|
|||
|
||||
lda sizehi
|
||||
cmp #2
|
||||
!if read_scrn = 1 {
|
||||
clv
|
||||
bcc redirect
|
||||
cpx #0
|
||||
beq +
|
||||
ldy ldrhi
|
||||
cpy #8
|
||||
bcs +
|
||||
bit knownrts ;set O flag
|
||||
lda sizehi
|
||||
pha
|
||||
lda sizelo
|
||||
pha
|
||||
txa
|
||||
dex
|
||||
stx sizelo
|
||||
|
||||
redirect
|
||||
} else { ;read_scrn = 0
|
||||
bcs +
|
||||
} ;read_scrn = 1
|
||||
pha
|
||||
|
||||
;redirect read to private buffer for partial copy
|
||||
|
@ -3049,14 +3044,6 @@ lastblk = * + 1
|
|||
} ;mem_swap = 0
|
||||
php
|
||||
pla
|
||||
!if write_sparse = 1 {
|
||||
!if ver_02 = 1 {
|
||||
ldy #0
|
||||
sty sparseblk
|
||||
} else { ;ver_02 = 0
|
||||
stz sparseblk
|
||||
} ;ver_02 = 1
|
||||
} ;write_sparse = 1
|
||||
!if mem_swap = 0 {
|
||||
;read whenever tree index changes
|
||||
|
||||
|
@ -3073,6 +3060,11 @@ lasttree = * + 1
|
|||
bne readtree
|
||||
pha
|
||||
plp
|
||||
!if enable_write = 1 {
|
||||
bne readtree
|
||||
lda reqcmd
|
||||
lsr
|
||||
} ;enable_write = 1
|
||||
beq skipblk
|
||||
|
||||
readtree
|
||||
|
@ -3197,11 +3189,18 @@ unrcommand2 = unrelochdd + (* - reloc)
|
|||
lastblk = * + 1
|
||||
cpy #$d1
|
||||
} ;mem_swap = 0
|
||||
!if enable_write = 0 {
|
||||
beq skipblk
|
||||
} else { ;enable_write = 1
|
||||
bne +
|
||||
lda reqcmd
|
||||
lsr
|
||||
beq skipblk
|
||||
+
|
||||
} ;enable_write = 0
|
||||
sty lastblk
|
||||
} ;fast_subindex = 1
|
||||
} ;rwts_mode = 0
|
||||
|
||||
ldx hdddirbuf, y
|
||||
lda hdddirbuf + 256, y
|
||||
!if detect_treof = 1 {
|
||||
|
@ -3220,12 +3219,19 @@ hddnoteof2
|
|||
jmp hddseekrd
|
||||
} else { ;enable_write = 1
|
||||
ldy reqcmd
|
||||
!if enable_seek = 1 {
|
||||
jmp hddseekrdwr
|
||||
} else { ;enable_seek = 0
|
||||
bne hddseekrdwr
|
||||
} ;enable_seek = 1
|
||||
} ;enable_write = 0
|
||||
} ;rwts_mode = 1
|
||||
} else { ;allow_sparse = 1
|
||||
pha
|
||||
ora hdddirbuf, y
|
||||
!if write_sparse = 1 {
|
||||
sta sparseblk
|
||||
} ;write_sparse = 1
|
||||
!if (rwts_mode + enable_write) > 1 {
|
||||
cmp #1
|
||||
} else { ;rwts_mode = 0 or enable_write = 0
|
||||
|
@ -3239,6 +3245,7 @@ hddnoteof2
|
|||
!if enable_write = 1 {
|
||||
ldy reqcmd
|
||||
bcs hddseekrdwr
|
||||
savebyte
|
||||
tay
|
||||
} else { ;enable_write = 0
|
||||
dey
|
||||
|
@ -3270,13 +3277,16 @@ hddresparse
|
|||
!if aligned_read = 0 {
|
||||
plp
|
||||
+ bcc +
|
||||
} ;aligned_read = 0
|
||||
inc adrhi
|
||||
inc adrhi
|
||||
!if aligned_read = 0 {
|
||||
resumescrn
|
||||
!if bounds_check = 1 {
|
||||
dec blefthi
|
||||
dec blefthi
|
||||
} ;bounds_check = 1
|
||||
} ;aligned_read = 0
|
||||
inc adrhi
|
||||
inc adrhi
|
||||
dec sizehi
|
||||
dec sizehi
|
||||
bne hddrdwrloop
|
||||
|
@ -3304,9 +3314,6 @@ hddissparse
|
|||
!if rwts_mode = 0 {
|
||||
beq hddresparse
|
||||
} else { ;rwts_mode = 1
|
||||
!if write_sparse = 1 {
|
||||
inc sparseblk
|
||||
} ;write_sparse = 1
|
||||
skipblk rts
|
||||
} ;rwts_mode = 0
|
||||
} ;allow_sparse = 1
|
||||
|
@ -3341,12 +3348,27 @@ hddcopycache
|
|||
bne -
|
||||
inc scratchhi
|
||||
inc adrhi
|
||||
!if read_scrn = 1 {
|
||||
bvs copyhalf
|
||||
} ;read_scrn = 1
|
||||
bne +
|
||||
copyhalf
|
||||
- lda (adrlo), y
|
||||
sta (scratchlo), y
|
||||
iny
|
||||
+ cpy sizelo
|
||||
bne -
|
||||
!if read_scrn = 1 {
|
||||
bvc ++
|
||||
pla
|
||||
sta sizelo
|
||||
pla
|
||||
sta sizehi
|
||||
ldx scratchhi
|
||||
inx
|
||||
stx adrhi
|
||||
bvs resumescrn
|
||||
} ;read_scrn = 1
|
||||
++
|
||||
!if one_shot = 0 {
|
||||
!if bounds_check = 1 {
|
||||
|
@ -3379,10 +3401,6 @@ hddcopycache
|
|||
} ;allow_aux = 1
|
||||
} ;one_shot = 0
|
||||
} ;aligned_read = 0
|
||||
} else { ;rwts_mode = 1
|
||||
!if allow_sparse = 0 {
|
||||
skipblk rts
|
||||
} ;allow_sparse = 0
|
||||
} ;rwts_mode = 0
|
||||
|
||||
hddreaddirsel
|
||||
|
@ -3450,8 +3468,15 @@ hddwriteimm lda adrhi ;for Trackstar support
|
|||
jsr saveslot
|
||||
} ;swap_scrn = 1
|
||||
|
||||
!if no_interrupts = 1 {
|
||||
php
|
||||
sei
|
||||
} ;no_interrupts = 1
|
||||
unrentry = unrelochdd + (* - reloc)
|
||||
jsr $d1d1
|
||||
!if no_interrupts = 1 {
|
||||
plp
|
||||
} ;no_interrupts = 1
|
||||
!if use_smartport = 1 {
|
||||
unrpcommand = unrelochdd + (* - reloc)
|
||||
pcommand !byte $2c ;hide packet in non-SmartPort mode
|
||||
|
@ -3487,6 +3512,9 @@ initpatch lda ($48), y
|
|||
dec $4a
|
||||
bne --
|
||||
} ;swap_scrn = 1
|
||||
!if (rwts_mode + (allow_sparse xor 1)) > 1 {
|
||||
skipblk
|
||||
} ;rwts_mode = 1 and allow_sparse = 0
|
||||
rts
|
||||
|
||||
!if use_smartport = 1 {
|
||||
|
@ -3584,6 +3612,9 @@ hdddataend
|
|||
} ;aligned_read = 0 or enable_write = 1
|
||||
!if allow_trees = 1 {
|
||||
!if fast_trees = 1 {
|
||||
!if enable_write = 0 {
|
||||
encbuf = dirbuf ;there is no encbuf
|
||||
} ;enable_write = 0
|
||||
!if ((aligned_read xor 1) + rwts_mode) > 0 {
|
||||
!if encbuf < reloc {
|
||||
treebuf = encbuf - $200
|
||||
|
|
Loading…
Reference in New Issue