enable use of REU for faster scrolling

If enabled, the first 32 pages (8kB) of REU are used as a temporary area
to speed up screen scrolling.

The programs "80colreu", "80r[234]", and their compressed versions
are built to use the REU.

Lightly tested in vice, typical commandline
```
x64sc -reu -reusize 128 -autostart 80r3-compressed.prg
```
This commit is contained in:
Jeff Epler 2021-09-22 09:57:36 -05:00
parent c817deeba2
commit e34694b843
4 changed files with 109 additions and 9 deletions

6
.gitignore vendored
View file

@ -1,4 +1,8 @@
*.bin
*.d64
*.dbg
*.lst
*.map
*.o *.o
*.prg *.prg
*.bin
bin bin

2
80colreu.s Normal file
View file

@ -0,0 +1,2 @@
USE_REU = 1
.include "80columns.s"

View file

@ -45,6 +45,61 @@ VICSCN = $C000 ; NEW Video Matrix: 25 Lines X 80 Columns
VICCOL = $D800 ; new color RAM is in RAM at the same address VICCOL = $D800 ; new color RAM is in RAM at the same address
BITMAP = $E000 BITMAP = $E000
.ifndef USE_REU
USE_REU = 0
.endif
.if USE_REU
REU_STATUS = $DF00 ; Status register
REU_COMMAND = $DF01 ; Command register
REU_C64ADDR = $DF02 ; C64 base address register
REU_REUADDR = $DF04 ; REU base address register
REU_COUNT = $DF07 ; Transfer count register
REU_IRQMASK = $DF09 ; IRQ mask register
REU_CONTROL = $DF0A ; Control register
REU_TRIGGER = $FF00 ; REU command trigger
OP_COPYFROM = $ED
OP_COPYTO = $EC
.macro REU_OP addr, len, op
lda R6510
pha
lda #%00110101
sta R6510
lda #0
sta $DF0A ; hold neither address
lda #<(addr)
sta REU_C64ADDR
lda #>(addr)
sta REU_C64ADDR+1
lda #<(len)
sta REU_COUNT
lda #>(len)
sta REU_COUNT+1
ldx #op
jsr reu_op
pla
sta R6510
.endmacro
.macro REU_COPYFROM addr, len
REU_OP addr, len, OP_COPYFROM
.endmacro
.macro REU_COPYTO addr, len
REU_OP addr, len, OP_COPYTO
.endmacro
.macro REU_MEMMOVE addr1, addr2, len
REU_COPYTO addr1, len
REU_COPYFROM addr2, len
.endmacro
.endif
; constants ; constants
COLUMNS = 80 COLUMNS = 80
LINES = 25 LINES = 25
@ -517,9 +572,17 @@ scroll_up:
bne @1 bne @1
dey dey
bne @1 bne @1
@2:
; note that Y is now 0
; ***END*** identical to $E94B in KERNAL ; ***END*** identical to $E94B in KERNAL
; scroll screen up ; scroll screen up
@2: lda #COLUMNS .if USE_REU
; move bitmap RAM (starting at BITMAP) up by 320 bytes
REU_MEMMOVE BITMAP+320, BITMAP, 24*40*8
; move character RAM (starting at VICSCN) up by 80 bytes
REU_MEMMOVE VICSCN+80, VICSCN, 24*80
.else
lda #COLUMNS
sta PNT sta PNT
lda #>VICSCN lda #>VICSCN
sta PNT + 1 sta PNT + 1
@ -542,7 +605,9 @@ scroll_up:
cpy #$a0 cpy #$a0
beq :+ beq :+
jmp :- jmp :-
: ldy #40 :
.endif
ldy #40
lda #>VICCOL lda #>VICCOL
sty USER sty USER
sta USER + 1 sta USER + 1
@ -571,7 +636,6 @@ scroll_up:
lda #4 lda #4
sta BLNCT sta BLNCT
rts ;returns Z clear because of LDA rts ;returns Z clear because of LDA
petscii_to_screencode: petscii_to_screencode:
cmp #$FF ; PI cmp #$FF ; PI
bne @1 bne @1
@ -866,6 +930,21 @@ new_cinv:
jsr calc_user jsr calc_user
@a6: jmp $EA61 @a6: jmp $EA61
.if USE_REU
reu_op:
lda #0
sta REU_REUADDR
sta REU_REUADDR+1
sta REU_REUADDR+2
stx REU_COMMAND
lda REU_TRIGGER
sta REU_TRIGGER
rts
.endif
.macro exec0 addr, save_y .macro exec0 addr, save_y
php php
sei sei

View file

@ -2,13 +2,14 @@ export PATH:= $(abspath bin):$(PATH)
.PHONY: all .PHONY: all
all: 80columns-compressed.prg 80c2-compressed.prg 80c3-compressed.prg 80c4-compressed.prg all: 80columns-compressed.prg 80c2-compressed.prg 80c3-compressed.prg 80c4-compressed.prg
all: 80colreu-compressed.prg 80r2-compressed.prg 80r3-compressed.prg 80r4-compressed.prg
all: charset.prg charset2.prg charset3.prg charset4.prg all: charset.prg charset2.prg charset3.prg charset4.prg
ifneq ($(shell which c1541 2>/dev/null),) ifneq ($(shell which c1541 2>/dev/null),)
all: 80columns.d64 all: 80columns.d64
endif endif
80columns.d64: 80columns-compressed.prg charset.prg charset2.prg charset3.prg charset4.prg 80columns.d64: 80colreu-compressed.prg 80columns-compressed.prg charset.prg charset2.prg charset3.prg charset4.prg
rm -f $@ rm -f $@
c1541 -format 80columns,80 d64 80columns.d64.tmp c1541 -format 80columns,80 d64 80columns.d64.tmp
for i in $^; do \ for i in $^; do \
@ -50,19 +51,33 @@ update-font-images: charset.bin charset2.bin charset3.bin charset4.bin mkfontimg
python mkfontimg.py -l charset4.bin img/t4.png python mkfontimg.py -l charset4.bin img/t4.png
python mkfontimg.py charset4.bin img/g4.png python mkfontimg.py charset4.bin img/g4.png
.INTERMEDIATE: 80colreu.bin
80colreu.bin: 80colreu.o charset.o 80columns.cfg
ld65 -C 80columns.cfg $(filter %.o,$^) -o $@ --mapfile ${@:.bin=.map}
.INTERMEDIATE: 80columns.bin .INTERMEDIATE: 80columns.bin
80columns.bin: 80columns.o charset.o 80columns.cfg 80columns.bin: 80columns.o charset.o 80columns.cfg
ld65 -C 80columns.cfg $(filter %.o,$^) -o $@ ld65 -C 80columns.cfg $(filter %.o,$^) -o $@ --mapfile ${@:.bin=.map}
80r%.bin: 80colreu.o charset%.o 80columns.cfg
ld65 -C 80columns.cfg $(filter %.o,$^) -o $@ --mapfile ${@:.bin=.map} --dbgfile ${@:.bin=.dbg}
80c%.bin: 80columns.o charset%.o 80columns.cfg 80c%.bin: 80columns.o charset%.o 80columns.cfg
ld65 -C 80columns.cfg $(filter %.o,$^) -o $@ ld65 -C 80columns.cfg $(filter %.o,$^) -o $@ --mapfile ${@:.bin=.map} --dbgfile ${@:.bin=.dbg}
80r%.bin: 80colreu.o charset%.o 80columns.cfg
ld65 -C 80columns.cfg $(filter %.o,$^) -o $@ --mapfile ${@:.bin=.map} --dbgfile ${@:.bin=.dbg}
80colreu.s: 80columns.s
80colreu.s: 80columns.s
%.o: %.s %.o: %.s
ca65 -o $@ $< ca65 -o $@ $< --debug --listing ${@:.o=.lst}
.PHONY: clean .PHONY: clean
clean: clean:
rm -f *.prg *.bin *.o 80columns.d64 rm -f *.lst *.map *.prg *.bin *.o 80columns.d64
.PHONY: toolchain .PHONY: toolchain
toolchain: toolchain-cc65 toolchain-exomizer toolchain: toolchain-cc65 toolchain-exomizer