150 lines
2.3 KiB
Text
150 lines
2.3 KiB
Text
|
|
#IFNDEF __lib_utils
|
|
#DEFINE __lib_utils 1
|
|
|
|
GOTO __skip_lib_utils
|
|
|
|
FUNC fill_mem({WORD start_addr @ $fb} {WORD end_addr} {BYTE value})
|
|
|
|
FOR start_addr = start_addr TO end_addr
|
|
POKE start_addr , value
|
|
NEXT
|
|
FEND
|
|
|
|
FUNC mem_copy({WORD start_addr @ $fb} {WORD end_addr} {WORD target_addr @ $fd})
|
|
BYTE value
|
|
|
|
FOR start_addr = start_addr TO end_addr
|
|
value = PEEK start_addr
|
|
POKE target_addr , value
|
|
target_addr++
|
|
NEXT
|
|
FEND
|
|
|
|
|
|
FUNC mem_copy_range({WORD start_addr @ $fb} {WORD target_addr @ $fd} {WORD range})
|
|
BYTE value
|
|
|
|
WHILE range
|
|
value = PEEK start_addr
|
|
POKE target_addr , value
|
|
start_addr++
|
|
target_addr++
|
|
range--
|
|
WEND
|
|
FEND
|
|
|
|
FUNC set_vic_bank({BYTE bank})
|
|
|
|
ASM
|
|
lda $dd02
|
|
ora #3
|
|
sta $dd02
|
|
|
|
; sanitize and reverse value (so bank 0 = $0000. bank 1 = $4000 etc)
|
|
lda |bank|
|
|
and #3
|
|
eor #3
|
|
sta |bank|
|
|
|
|
|
|
lda $dd00
|
|
and #%11111100
|
|
ora |bank|
|
|
sta $dd00
|
|
ENDASM
|
|
FEND
|
|
|
|
|
|
// Screen mem goes in banks of $0400
|
|
// 0=$0000
|
|
// 1=$0400
|
|
// 2=$0800
|
|
// ...
|
|
FUNC set_vic_screenmem({BYTE screenmem})
|
|
|
|
ASM
|
|
; sanitize screenmem and move to relevant $d018 bits
|
|
lda |screenmem|
|
|
and #$0f
|
|
clc
|
|
rol
|
|
rol
|
|
rol
|
|
rol
|
|
sta |screenmem|
|
|
|
|
lda $d018
|
|
and #$0f
|
|
ora |screenmem|
|
|
sta $d018
|
|
ENDASM
|
|
|
|
FEND
|
|
|
|
// Char mem goes in banks of $0800
|
|
// 0=$0000
|
|
// 1=$0800
|
|
// 2=$1000
|
|
// ...
|
|
// (Bitmaps in banks of $2000)
|
|
// 0=$0000
|
|
// 4=$2000
|
|
FUNC set_vic_charmem({BYTE charmem})
|
|
|
|
ASM
|
|
; sanitize charmem and move to relevant $d018 bits
|
|
lda |charmem|
|
|
and #%00000111
|
|
clc
|
|
rol
|
|
sta |charmem|
|
|
|
|
lda $d018
|
|
and #$f0
|
|
ora |charmem|
|
|
sta $d018
|
|
ENDASM
|
|
|
|
FEND
|
|
|
|
FUNC set_vic_ecm
|
|
ASM
|
|
lda $d011
|
|
and #$1f ; leave DEN bit + all scroll stuff
|
|
ora #64
|
|
sta $d011
|
|
ENDASM
|
|
FEND
|
|
|
|
// Wait for a keypress using direct CIA keyboard scan
|
|
// No interrupts needed
|
|
FUNC wait_key
|
|
BYTE row @ $dc01
|
|
BYTE col @ $dc00
|
|
|
|
// Wait for NO key pressed first (debounce)
|
|
col = 0
|
|
WHILE row <> $ff
|
|
WEND
|
|
|
|
// Now wait for ANY key pressed
|
|
WHILE row == $ff
|
|
WEND
|
|
|
|
// Wait for key release (debounce)
|
|
WHILE row <> $ff
|
|
WEND
|
|
FEND
|
|
|
|
FUNC save_zeropage
|
|
mem_copy_range($0000, $cf00, 256)
|
|
FEND
|
|
|
|
FUNC restore_zeropage
|
|
mem_copy_range($cf00, $0000, 256)
|
|
FEND
|
|
|
|
LABEL __skip_lib_utils
|
|
|
|
#IFEND
|