C64
This commit is contained in:
parent
59264dfa91
commit
ae461a8709
5 changed files with 415 additions and 0 deletions
2
.gitignore
vendored
Normal file
2
.gitignore
vendored
Normal file
|
@ -0,0 +1,2 @@
|
||||||
|
rust/target
|
||||||
|
c64/*.vs
|
137
c64/main.asm
Normal file
137
c64/main.asm
Normal file
|
@ -0,0 +1,137 @@
|
||||||
|
// vim: filetype=kickass
|
||||||
|
#import "math.inc"
|
||||||
|
|
||||||
|
* = $0801 // BASIC start address (#2049)
|
||||||
|
.byte $0d,$08,$dc,$07,$9e,$20,$34,$39 // BASIC loader to start at $c000...
|
||||||
|
.byte $31,$35,$32,$00,$00,$00 // puts BASIC line 2012 SYS 49152
|
||||||
|
|
||||||
|
* = $c000
|
||||||
|
|
||||||
|
.const SCREEN_RAM = $0400
|
||||||
|
.const COLOR_RAM = $d800
|
||||||
|
|
||||||
|
.const kernal_scinit = $ff81
|
||||||
|
.const kernal_chrout = $ffd2
|
||||||
|
.const kernal_write_byte = $e716
|
||||||
|
|
||||||
|
.const zp_temp = $02
|
||||||
|
.const cursor_pointer_lo = $05
|
||||||
|
.const cursor_pointer_hi = $06
|
||||||
|
|
||||||
|
//
|
||||||
|
// main
|
||||||
|
//
|
||||||
|
main:
|
||||||
|
jsr clear_screen
|
||||||
|
|
||||||
|
// lda #0
|
||||||
|
// sta $d020
|
||||||
|
// sta $d021
|
||||||
|
|
||||||
|
jsr day01
|
||||||
|
|
||||||
|
!loop:
|
||||||
|
// inc $d020
|
||||||
|
jmp !loop-
|
||||||
|
|
||||||
|
string:
|
||||||
|
.text "The quick brown newline jumped over the lazy dog."
|
||||||
|
.byte '\n'
|
||||||
|
.byte 0
|
||||||
|
|
||||||
|
string_cr:
|
||||||
|
.text "The quick brown carriage return jumped over the lazy dog."
|
||||||
|
.byte '\r'
|
||||||
|
.byte 0
|
||||||
|
|
||||||
|
|
||||||
|
day01:
|
||||||
|
lda #<str_input
|
||||||
|
sta $03
|
||||||
|
lda #>str_input
|
||||||
|
sta $04
|
||||||
|
jsr write_string
|
||||||
|
|
||||||
|
lda #<day01_input
|
||||||
|
sta $03
|
||||||
|
lda #>day01_input
|
||||||
|
sta $04
|
||||||
|
jsr write_string
|
||||||
|
|
||||||
|
lda #<str_converted
|
||||||
|
sta $03
|
||||||
|
lda #>str_converted
|
||||||
|
sta $04
|
||||||
|
jsr write_string
|
||||||
|
|
||||||
|
|
||||||
|
lda #<day01_input
|
||||||
|
sta $03
|
||||||
|
lda #>day01_input
|
||||||
|
sta $04
|
||||||
|
|
||||||
|
.break
|
||||||
|
ldy #0
|
||||||
|
|
||||||
|
!line:
|
||||||
|
lda #0
|
||||||
|
sta $22
|
||||||
|
sta $23
|
||||||
|
|
||||||
|
!digit:
|
||||||
|
lda ($03), y
|
||||||
|
cmp #'\n'
|
||||||
|
beq !break+
|
||||||
|
|
||||||
|
i16_mul10($22, $23)
|
||||||
|
|
||||||
|
lda ($03), y
|
||||||
|
|
||||||
|
sec
|
||||||
|
sbc #'0'
|
||||||
|
|
||||||
|
i16_i8_add_a($22, $23)
|
||||||
|
|
||||||
|
iny
|
||||||
|
jmp !digit-
|
||||||
|
|
||||||
|
!break:
|
||||||
|
sty $24
|
||||||
|
|
||||||
|
lda $23
|
||||||
|
jsr print_hex_0x
|
||||||
|
lda $22
|
||||||
|
jsr print_hex
|
||||||
|
|
||||||
|
jsr print_newline
|
||||||
|
jsr print_carriage_return
|
||||||
|
|
||||||
|
ldy $24
|
||||||
|
iny
|
||||||
|
|
||||||
|
lda ($03), y
|
||||||
|
bne !line-
|
||||||
|
|
||||||
|
!done:
|
||||||
|
rts
|
||||||
|
|
||||||
|
|
||||||
|
day01_input:
|
||||||
|
.import text "../rust/inputs/day01_example"
|
||||||
|
.byte 0
|
||||||
|
|
||||||
|
str_input:
|
||||||
|
.text "# Input"
|
||||||
|
.byte '\n', 0
|
||||||
|
|
||||||
|
str_converted:
|
||||||
|
.byte '\n'
|
||||||
|
.text "# Converted"
|
||||||
|
.byte '\n', 0
|
||||||
|
|
||||||
|
|
||||||
|
buffer:
|
||||||
|
.fill $0100, 0
|
||||||
|
|
||||||
|
|
||||||
|
#import "screen.asm"
|
BIN
c64/main.prg
Normal file
BIN
c64/main.prg
Normal file
Binary file not shown.
94
c64/math.inc
Normal file
94
c64/math.inc
Normal file
|
@ -0,0 +1,94 @@
|
||||||
|
// vim: filetype=kickass
|
||||||
|
|
||||||
|
.macro i8_div5_a() {
|
||||||
|
sta zp_temp
|
||||||
|
lsr
|
||||||
|
adc #13
|
||||||
|
adc zp_temp
|
||||||
|
ror
|
||||||
|
lsr
|
||||||
|
lsr
|
||||||
|
adc zp_temp
|
||||||
|
ror
|
||||||
|
adc zp_temp
|
||||||
|
ror
|
||||||
|
lsr
|
||||||
|
lsr
|
||||||
|
}
|
||||||
|
|
||||||
|
.macro i16_div8(lo, hi) {
|
||||||
|
lsr cursor_pointer_hi
|
||||||
|
ror cursor_pointer_lo
|
||||||
|
|
||||||
|
lsr cursor_pointer_hi
|
||||||
|
ror cursor_pointer_lo
|
||||||
|
|
||||||
|
lsr cursor_pointer_hi
|
||||||
|
ror cursor_pointer_lo
|
||||||
|
}
|
||||||
|
|
||||||
|
.macro i8_mul5_a() {
|
||||||
|
sta zp_temp
|
||||||
|
asl
|
||||||
|
asl
|
||||||
|
clc
|
||||||
|
adc zp_temp
|
||||||
|
}
|
||||||
|
|
||||||
|
// Destroys: lo, hi
|
||||||
|
.macro i16_mul2(lo, hi) {
|
||||||
|
asl lo
|
||||||
|
rol hi
|
||||||
|
}
|
||||||
|
|
||||||
|
// Destroys: lo, hi
|
||||||
|
.macro i16_mul4(lo, hi) {
|
||||||
|
i16_mul2(lo, hi)
|
||||||
|
i16_mul2(lo, hi)
|
||||||
|
}
|
||||||
|
|
||||||
|
// Destroys: lo, hi
|
||||||
|
.macro i16_mul8(lo, hi) {
|
||||||
|
i16_mul4(lo, hi)
|
||||||
|
i16_mul2(lo, hi)
|
||||||
|
}
|
||||||
|
|
||||||
|
// Destroys: a, lo, hi, $fd, $fe
|
||||||
|
.macro i16_mul10(lo, hi) {
|
||||||
|
i16_mul2(lo, hi)
|
||||||
|
|
||||||
|
lda lo
|
||||||
|
sta $fd
|
||||||
|
lda hi
|
||||||
|
sta $fe
|
||||||
|
|
||||||
|
i16_mul4(lo, hi)
|
||||||
|
i16_i16_add(lo, hi, $fd, $fe)
|
||||||
|
}
|
||||||
|
|
||||||
|
// Destroys: a, dst_lo, dst_hi
|
||||||
|
.macro i16_i8_add_a(dst_lo, dst_hi) {
|
||||||
|
clc
|
||||||
|
adc dst_lo
|
||||||
|
sta dst_lo
|
||||||
|
bcc !cc+
|
||||||
|
inc dst_hi
|
||||||
|
!cc:
|
||||||
|
}
|
||||||
|
|
||||||
|
// Destroys: a, dst_lo, dst_hi
|
||||||
|
.macro i16_i16_add(dst_lo, dst_hi, src_lo, src_hi) {
|
||||||
|
clc
|
||||||
|
lda dst_lo
|
||||||
|
adc src_lo
|
||||||
|
sta dst_lo
|
||||||
|
lda dst_hi
|
||||||
|
adc src_hi
|
||||||
|
sta dst_hi
|
||||||
|
}
|
||||||
|
|
||||||
|
// Destroys: a, dst_lo, dst_hi
|
||||||
|
.macro i16_inc(lo, hi) {
|
||||||
|
lda #1
|
||||||
|
i16_i8_add_a(lo, hi)
|
||||||
|
}
|
182
c64/screen.asm
Normal file
182
c64/screen.asm
Normal file
|
@ -0,0 +1,182 @@
|
||||||
|
// 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"
|
||||||
|
|
Loading…
Reference in a new issue