This commit is contained in:
Sijmen 2020-12-06 18:07:35 +01:00
parent 59264dfa91
commit ae461a8709
Signed by: vijfhoek
GPG key ID: DAF7821E067D9C48
5 changed files with 415 additions and 0 deletions

2
.gitignore vendored Normal file
View file

@ -0,0 +1,2 @@
rust/target
c64/*.vs

137
c64/main.asm Normal file
View 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

Binary file not shown.

94
c64/math.inc Normal file
View 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
View 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"