From 2a421396740049244d85e1591fdec91ae6d5fa08 Mon Sep 17 00:00:00 2001
From: mc78 <mc78@outlook.de>
Date: Fri, 29 Nov 2019 11:20:58 +0100
Subject: [PATCH 135/170] Changes in INSTALL routine from emd/c128-vdc.s. tmp1
was used at two places resulting in the bug that VDC_CSET was set to garbage
on 16k VDC. pagecount and curpage were not reset on INSTALL resulting in
non-reentrant code on static linkage of emd driver.
---
libsrc/c128/emd/c128-vdc.s | 48 +++++++++++++++++++++++---------------
1 file changed, 29 insertions(+), 19 deletions(-)
diff --git a/libsrc/c128/emd/c128-vdc.s b/libsrc/c128/emd/c128-vdc.s
index d915fdf2..3f08b0a7 100644
--- a/libsrc/c128/emd/c128-vdc.s
+++ b/libsrc/c128/emd/c128-vdc.s
@@ -52,13 +52,11 @@ VDC_DATA = 31
; ------------------------------------------------------------------------
; Data.
-.data
-
-pagecount: .word 64 ; $0000-$3fff as 16k default
-curpage: .word $ffff ; currently mapped-in page (invalid)
-
.bss
+pagecount: .res 1 ; $0000-$3fff as 16k default
+curpage: .res 2 ; currently mapped-in page (invalid)
+vdc_cset_save: .res 1
window: .res 256 ; memory window
.code
@@ -71,11 +69,15 @@ window: .res 256 ; memory window
;
INSTALL:
+ ; reset mapped-in page to invalid
+ lda #$ff
+ sta curpage
+ sta curpage+1
+
; do test for VDC presence here???
-
ldx #VDC_CSET ; determine size of RAM...
jsr vdcgetreg
- sta tmp1
+ sta vdc_cset_save
ora #%00010000
jsr vdcputreg ; turn on 64k
@@ -94,35 +96,39 @@ INSTALL:
lda tmp2
jsr vdcputbyte ; restore original value of test byte
+ ldx #0 ; prepare x with hi of default pagecount
+
lda ptr1 ; do bytes match?
cmp ptr1+1
bne @have64k
lda ptr2
cmp ptr2+1
bne @have64k
-
- ldx #VDC_CSET
- lda tmp1
- jsr vdcputreg ; restore 16/64k flag
- jmp @endok ; and leave default values for 16k
-
-@have64k:
- lda #<256
- ldx #>256
+
+ lda #64 ; assumes x = 0, here -> p.c = 64
+ bne @setpagecnt
+@have64k:
+ txa ; assumes x = 0, here
+ inx ; so that a/x becomes 0/1 -> p.c. = 256
+@setpagecnt:
sta pagecount
stx pagecount+1
-@endok:
+
+ ldx #VDC_CSET ; restore 16/64k flag
+ lda vdc_cset_save
+ jsr vdcputreg
+
lda #<EM_ERR_OK
ldx #>EM_ERR_OK
rts
test64k:
- sta tmp1
+ sta tmp3
sty ptr3
lda #0
sta ptr3+1
jsr settestadr1
- lda tmp1
+ lda tmp3
jsr vdcputbyte ; write $55
jsr settestadr1
jsr vdcgetbyte ; read here
@@ -199,6 +205,8 @@ transferin:
lda VDC_DATA_REG ; get 2 bytes at a time to speed-up
sta (ptr2),y ; (in fact up to 8 bytes could be fetched with special VDC config)
iny
+@L1: bit VDC_ADDR_REG ; XXX: Test waiting for register 31
+ bpl @L1
lda VDC_DATA_REG
sta (ptr2),y
iny
@@ -334,6 +342,8 @@ vdcsetsrcaddr:
dex
tya
stx VDC_ADDR_REG
+@L1: bit VDC_ADDR_REG ; XXX: Test waiting for register 18
+ bpl @L1
sta VDC_DATA_REG
rts
--
2.26.0