183 lines
2.6 KiB
NASM
183 lines
2.6 KiB
NASM
|
// vim: filetype=kickass
|
||
|
|
||
|
//
|
||
|
// clear_screen
|
||
|
//
|
||
|
// Destroys: a, y
|
||
|
//
|
||
|
clear_screen:
|
||
|
ldy #0
|
||
|
|
||
|
!loop:
|
||
|
lda #' '
|
||
|
sta SCREEN_RAM, y
|
||
|
sta SCREEN_RAM + $0100, y
|
||
|
sta SCREEN_RAM + $0200, y
|
||
|
sta SCREEN_RAM + $0300, y
|
||
|
sta SCREEN_RAM + $03e7, y
|
||
|
|
||
|
lda #1
|
||
|
sta COLOR_RAM, y
|
||
|
sta COLOR_RAM + $0100, y
|
||
|
sta COLOR_RAM + $0200, y
|
||
|
sta COLOR_RAM + $0300, y
|
||
|
sta COLOR_RAM + $03e7, y
|
||
|
|
||
|
iny
|
||
|
bne !loop-
|
||
|
|
||
|
lda #<SCREEN_RAM
|
||
|
sta cursor_pointer_lo
|
||
|
lda #>SCREEN_RAM
|
||
|
sta cursor_pointer_hi
|
||
|
|
||
|
lda #23
|
||
|
sta $d018
|
||
|
|
||
|
rts
|
||
|
|
||
|
|
||
|
//
|
||
|
// print_carriage_return
|
||
|
//
|
||
|
// Input:
|
||
|
// - cursor_pointer_{lo,hi} - Cursor pointer.
|
||
|
//
|
||
|
// Destroys: a, zp_temp
|
||
|
//
|
||
|
print_newline:
|
||
|
sec
|
||
|
lda $05
|
||
|
adc #40
|
||
|
sta cursor_pointer_lo
|
||
|
bcc !done+
|
||
|
inc cursor_pointer_hi
|
||
|
|
||
|
!done:
|
||
|
rts
|
||
|
|
||
|
|
||
|
//
|
||
|
// print_carriage_return
|
||
|
//
|
||
|
// Input:
|
||
|
// - cursor_pointer_{lo,hi} - Cursor pointer.
|
||
|
//
|
||
|
// Destroys: a, zp_temp
|
||
|
//
|
||
|
print_carriage_return:
|
||
|
// Subtract SCREEN_RAM from cursor pointer
|
||
|
sec
|
||
|
lda cursor_pointer_hi
|
||
|
sbc #>SCREEN_RAM
|
||
|
sta cursor_pointer_hi
|
||
|
|
||
|
// Divide the cursor position by 40 (one row)
|
||
|
i16_div8(cursor_pointer_lo, cursor_pointer_hi)
|
||
|
|
||
|
// At this point, the pointer fits in a 8-bit register
|
||
|
lda cursor_pointer_lo
|
||
|
i8_div5_a()
|
||
|
|
||
|
// Multiply it by 40 again
|
||
|
i8_mul5_a()
|
||
|
sta cursor_pointer_lo
|
||
|
|
||
|
i16_mul8(cursor_pointer_lo, cursor_pointer_hi)
|
||
|
|
||
|
// Add SCREEN_RAM back
|
||
|
clc
|
||
|
lda cursor_pointer_hi
|
||
|
adc #>SCREEN_RAM
|
||
|
sta cursor_pointer_hi
|
||
|
|
||
|
rts
|
||
|
|
||
|
|
||
|
//
|
||
|
// write_string
|
||
|
//
|
||
|
// Input:
|
||
|
// - $03-$04 - Pointer to null-terminated string.
|
||
|
// - $05-$06 - Cursor pointer.
|
||
|
//
|
||
|
// Destroys: a, x, y
|
||
|
//
|
||
|
write_string:
|
||
|
ldx #0
|
||
|
ldy #0
|
||
|
|
||
|
!loop:
|
||
|
lda ($03), y
|
||
|
beq !done+
|
||
|
|
||
|
cmp #'\r'
|
||
|
beq !carriage_return+
|
||
|
cmp #'\n'
|
||
|
beq !newline+
|
||
|
|
||
|
sta (cursor_pointer_lo, x)
|
||
|
|
||
|
i16_inc(cursor_pointer_lo, cursor_pointer_hi)
|
||
|
|
||
|
iny
|
||
|
jmp !loop-
|
||
|
|
||
|
!newline:
|
||
|
jsr print_newline
|
||
|
|
||
|
!carriage_return:
|
||
|
jsr print_carriage_return
|
||
|
|
||
|
iny
|
||
|
jmp !loop-
|
||
|
|
||
|
!done:
|
||
|
rts
|
||
|
|
||
|
|
||
|
print_hex_0x:
|
||
|
sta zp_temp
|
||
|
|
||
|
ldx #0
|
||
|
|
||
|
lda #'0'
|
||
|
sta (cursor_pointer_lo, x)
|
||
|
i16_inc(cursor_pointer_lo, cursor_pointer_hi)
|
||
|
|
||
|
lda #'x'
|
||
|
sta (cursor_pointer_lo, x)
|
||
|
i16_inc(cursor_pointer_lo, cursor_pointer_hi)
|
||
|
|
||
|
lda zp_temp
|
||
|
|
||
|
// fallthrough
|
||
|
|
||
|
print_hex:
|
||
|
ldx #0
|
||
|
sta zp_temp
|
||
|
|
||
|
lsr
|
||
|
lsr
|
||
|
lsr
|
||
|
lsr
|
||
|
tay
|
||
|
|
||
|
lda !hex_chars+, y
|
||
|
sta (cursor_pointer_lo, x)
|
||
|
i16_inc(cursor_pointer_lo, cursor_pointer_hi)
|
||
|
|
||
|
lda zp_temp
|
||
|
and #$0f
|
||
|
tay
|
||
|
|
||
|
lda !hex_chars+, y
|
||
|
sta (cursor_pointer_lo, x)
|
||
|
i16_inc(cursor_pointer_lo, cursor_pointer_hi)
|
||
|
|
||
|
rts
|
||
|
|
||
|
!hex_chars:
|
||
|
.text "0123456789ABCDEF"
|
||
|
|