#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