solitaire-c64/utils.c65

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