faster SmartPort handling

This commit is contained in:
Peter Ferrie 2019-09-30 11:18:57 -07:00
parent a57a87304a
commit 783a95efa7
7 changed files with 143 additions and 68 deletions

Binary file not shown.

View File

@ -56,20 +56,21 @@ Reenter
ldx #$A4
stx $3F4
RestoreStackNextTime
clc ; SMC
bcc SearchMode ; not an unconditional branch because code
; might change the 'clc' just before it
bne SearchMode ; (SMC) not an unconditional branch because code
; might change the branch target to the next opcode
; If we fall through to here, it's because we backed up the stack and
; stack pointer and wanted this routine to restore it and return to
; caller.
lda #$18 ; reset to 'clc' opcode so we don't try to
sta RestoreStackNextTime ; restore the same stack twice
lda #(SearchMode - RestoreStackNextTime) - 2
; reset to branch so we don't try to
sta RestoreStackNextTime + 1
; restore the same stack twice
ldx #$F1
- lda $DF00,x ; restore stack
- lda STACKBASE - $F0,x ; restore stack
sta $100,x
inx
bne -
ldx $DFF0 ; restore stack pointer
ldx STACKBASE ; restore stack pointer
txs
SwitchToBank1
+READ_RAM1_WRITE_RAM1
@ -119,21 +120,52 @@ SwitchToBank2
!word Reenter ; IRQ vector ($FFFE-F)
}
LastMover
!pseudopc $D600 {
!if ((hdddataend & 255) > $ec) and ((hdddataend & 255) < $f0) {
; in the unlikely event that a bit over 16 bytes are left in the page
; then use it for the stack
STACKBASE = (hdddataend + 15) and -16
FONTSRC = *
!pseudopc STACKBASE + 16 {
FONTDST = *
!source "src/ui.font.data.a"
COPYDST = *
COPYSRC = LastMover + COPYDST - FONTDST
!source "src/ui.font.a"
!source "src/prodos.impl.a"
LCRAM2_END = *
!if * > $DFEF {
!error "code is too large: ends at ", *
LCRAM2_END = *
!if * > $E000 {
!error "code is too large: ends at ", *
}
}
EvenLasterMover
} else {
; otherwise place stack after code
; and begin font on the next page
COPYSRC = *
!pseudopc hdddataend {
COPYDST = *
!source "src/prodos.impl.a"
!source "src/ui.font.a"
STACKBASE = *
LCRAM2_END = STACKBASE + 16
FONTDST = (LCRAM2_END + 255) and -256
}
EvenLasterMover
FONTSRC = *
!pseudopc FONTDST {
!source "src/ui.font.data.a"
!if * > $E000 {
!error "code is too large: ends at ", *
}
}
}
EvenLasterMover
!if RELBASE = $2000 {
!ifdef PASS2 {
} else { ;PASS2
!set PASS2=1
!warn "LCRAM2 ends at ", LCRAM2_END
!warn "ProRWTS ends at ", hddcodeend - 1
!warn "STACK at ", STACKBASE
!warn "LCRAM2 ends at ", LCRAM2_END - 1
!warn "RELBASE = ", $10000 - (LastMover - FirstMover)
}
}

View File

@ -121,9 +121,20 @@ NotGS clc
inc @FM+5
bne @FM
+ ldy #>(255 + EvenLasterMover - LastMover)
@LM lda LastMover,x ; relocate font data to $D600 in RAM bank 2
sta $D600,x ; and pseudo-ProDOS to $DA00 in RAM bank 2
ldy #4
@ELM lda FONTSRC,x
; relocate font data to RAM bank 2
sta FONTDST,x
inx
bne @ELM
inc @ELM+2
inc @ELM+5
dey
bne @ELM
ldy #>(255 + EvenLasterMover - LastMover)
@LM lda COPYSRC,x ; relocate pseudo-ProDOS to RAM bank 2
sta COPYDST,x
inx
bne @LM
inc @LM+2

View File

@ -9,16 +9,16 @@
; D000..E5F4 - persistent data structures (per-game cheat categories,
; gGlobalPrefsStore, gGamesListStore)
; ...unused...
; EC9F..FFF9 - main program code
; ECA0..FFF9 - main program code
; FFFA..FFFF - NMI, reset, IRQ vectors
;
; LC RAM BANK 2
; D000..D3FF - ProRWTS data
; D400..D5FF - ProRWTS code
; D600..D9FF - HGR font data
; DA00..DF5D - HGR font code & ProRWTS glue code
; D400..D5F7 - ProRWTS code
; D5F8..DB52 - HGR font code & ProRWTS glue code
; DB53..DB62 - backup of stack (during gameplay and self-running demos)
; ...unused...
; DFF0..DFFF - backup of stack (during gameplay and self-running demos)
; DC00..DFFF - HGR font data
;------------------------------------------------------------------------------
; soft switches

View File

@ -117,7 +117,8 @@ seekread stx bloklo
sty blokhi
entry jmp $d1d1
fakeMLI pla
fakeMLI beq readblk
retcall pla
tax
inx
inx
@ -125,6 +126,12 @@ fakeMLI pla
txa
pha
rts
readblk dey
dey
sty adrhi
tay
jsr seekread
bcc retcall
fakeMLI_e
filename !byte filename_e - filename_b

View File

@ -635,13 +635,13 @@ LaunchInternal
jsr SaveOrRestoreScreenHoles ; save screen hole contents
ldy #$F1
- lda $100,y
sta $DF00,y ; back up stack
sta STACKBASE - $F0,y ; back up stack
iny
bne -
tsx ; back up stack pointer
stx $DFF0
lda #$38 ; 'sec' opcode to tell |Reenter| to
sta RestoreStackNextTime ; restore the stack and stack pointer
stx STACKBASE
sty RestoreStackNextTime + 1
; tell |Reenter| to restore the stack and stack pointer
ldx #(end_promote-promote-1)
- lda promote,x ; copy ProDOS shim to main memory

View File

@ -16,7 +16,7 @@ ver_02 = 1
verbose_info = 0 ;set to 1 to enable display of memory usage
enable_floppy = 0 ;set to 1 to enable floppy drive support
poll_drive = 0 ;set to 1 to check if disk is in drive, recommended if allow_multi is enabled
allow_extend = 1 ;enable support for more than two MicroDrive (or more than four CFFA) partitions
use_smartport = 1 ;set to 1 to enable support for more than two MicroDrive (or more than four CFFA) partitions
override_adr = 1 ;set to 1 to require an explicit load address
aligned_read = 0 ;set to 1 if all reads can be a multiple of block size
enable_readseq=0 ;set to 1 to enable reading multiple sequential times from the same file without seek
@ -207,7 +207,9 @@ init jsr SETKBD
jsr SETVID
lda DEVNUM
sta x80_parms + 1
!if use_smartport = 0 {
sta unrunit1 + 1
} ;use_smartport
and #$70
!if (enable_floppy + enable_write) > 1 {
sta unrslot1 + 1
@ -380,16 +382,37 @@ adjpath tya
lsr
tay
ldx DEVADR01HI, y
!if (enable_floppy + allow_extend) > 0 {
cpx #$c8
bcc set_slot
!if enable_floppy = 1 {
php
!if enable_floppy = 1 {
;check if current device is floppy
lsr
ora #$c0
tax
plp
} else { ;enable_floppy = 0
stx blokhi
ldy #0
sty bloklo
iny
lda (bloklo), y
cmp #$20
bne not_floppy
iny
iny
lda (bloklo), y
bne not_floppy
iny
iny
lda (bloklo), y
cmp #3
bne not_floppy
ldy #$ff
lda (bloklo), y
beq set_slot
not_floppy
} ;enable_floppy
;find SmartPort device for basic MicroDrive support
@ -414,25 +437,22 @@ adjpath tya
ldy #$ff
lda (bloklo), y
beq -
} ;enable_floppy
} ;enable_floppy or allow_extend
set_slot stx slot + 2
!if allow_extend = 1 {
stx unrentry1 + 2
} ;allow_extend
!if use_smartport = 0 {
stx unrentry2 + 2
!if allow_extend = 1 {
} else { ;use_smartport = 1
stx unrentry1 + 2
stx unrentry3 + 2
} ;allow_extend
} ;use_smartport
slot ldx $cfff
!if enable_floppy = 1 {
php
beq bankram
} ;enable_floppy
!if use_smartport = 0 {
stx unrentry2 + 1
!if allow_extend = 1 {
bcc bankram
} else { ;use_smartport = 1
;use SmartPort entrypoint instead
@ -442,8 +462,6 @@ slot ldx $cfff
stx unrentry1 + 1
stx unrentry3 + 1
;detect extended remapping and update unit accordingly
lda #<(readbuff + $200)
sta adrlo
ldy #>(readbuff + $200)
@ -451,30 +469,24 @@ slot ldx $cfff
stx x80_parms + 4
lda #0
sta x80_parms + 5
jsr unrhddrd
jsr MLI
!byte $80
!word x80_parms
bcc + ;always
iterunit inc unrunit2
;enable use of SmartPort entrypoint
lda #$2c
sta unrentry2
unrentry1 jsr $d1d1
!byte cmdread
!word unrpacket
bcs iterunit
+ ldy #$0f
ldy #$0f
- lda readbuff + 4, y
cmp readbuff + $204, y
bne iterunit
dey
bpl -
} ;allow_extend
} ;use_smartport
bankram
!if load_banked = 1 {
@ -2608,7 +2620,11 @@ skiptree
beq +
} ;enable_seek
!if enable_write = 1 {
!if use_smartport = 0 {
stx command
} else { ;use_smartport = 1
stx pcommand
} ;use_smartport
} ;enable_write
} ;aligned_read
} else { ;rwts_mode = 1
@ -2813,34 +2829,43 @@ hddreaddirsect ldy #>hdddirbuf
ldy #>hdddirbuf
hddreaddirsect
} ;allow_trees
unrhddrd = unrelochdd + (* - reloc)
sty adrhi
hddseekrd ldy #cmdread
!if (aligned_read + enable_write) > 1 {
hddseekrdwr sty command
} else { ;aligned_read = 0 or enable_write = 0
hddseekrdwr
!if use_smartport = 0 {
sty command
} else { ;use_smartport = 1
sty pcommand
} ;use_smartport
} else { ;aligned_read = 0 or enable_write = 0
!if use_smartport = 0 {
sty command
} else { ;use_smartport = 1
sty pcommand
} ;use_smartport
hddseekrdwr
} ;aligned_read and enable_write
!if use_smartport = 0 {
stx bloklo
sta blokhi
} else { ;use_smartport = 1
stx pblock
sta pblock + 1
} ;use_smartport
!if use_smartport = 0 {
unrunit1 = unrelochdd + (* - reloc)
lda #$d1
sta unit
unrentry2 = unrelochdd + (* - reloc)
jmp $d1d1
!if allow_extend = 1 {
ldx #4
- lda command + 1, x
sta packet + 1, x
dex
bne -
lda command
sta pcommand
} else { ;use_smartport = 1
lda adrhi
sta paddr + 1
lda adrlo
sta paddr
unrentry3 = unrelochdd + (* - reloc)
jsr $d1d1
pcommand !byte 0
@ -2851,9 +2876,9 @@ unrpacket = unrelochdd + (* - reloc)
packet !byte 3
unrunit2 = unrelochdd + (* - reloc)
!byte 0
!word readbuff + $200
!byte 2, 0, 0
} ;allow_extend
paddr !word readbuff + $200
pblock !byte 2, 0, 0
} ;use_smartport
!if rwts_mode = 1 {
vollist_b