c64(day02): Implement

This commit is contained in:
Sijmen 2020-12-18 20:04:14 +01:00
parent 5bacc864b4
commit 8efa00bd48
Signed by: vijfhoek
GPG Key ID: DAF7821E067D9C48
5 changed files with 697 additions and 83 deletions

View File

@ -106,3 +106,73 @@ tree_contains:
rts
brk
test_tree:
move_16_imm($03, !str_test+)
jsr write_string
move_16_imm($03, $10)
jsr tree_insert
move_16_imm($03, $08)
jsr tree_insert
move_16_imm($03, $04)
jsr tree_insert
move_16_imm($03, $12)
jsr tree_insert
move_16_imm($03, $1337)
jsr tree_insert
move_16_imm($03, $08)
jsr tree_contains
bne !fail+
move_16_imm($03, $13)
jsr tree_contains
beq !fail+
move_16_imm($03, $12)
jsr tree_contains
bne !fail+
move_16_imm($03, $1337)
jsr tree_contains
bne !fail+
move_16_imm($03, $0420)
jsr tree_contains
beq !fail+
move_16_imm($03, !str_success+)
jsr write_string
rts
!fail:
u16_u16_move($10, $03)
move_16_imm($03, !str_fail+)
jsr write_string
lda $11
jsr print_hex_0x
lda $10
jsr print_hex
jsr print_newline
rts
!str_test:
.text "[ ] test-tree"
.byte '\r', 0
!str_fail:
.text "[!!]"
.byte '\n'
.text "Failed: "
.byte 0
!str_success:
.text "[OK]"
.byte '\n', 0

View File

@ -2,7 +2,7 @@
* = * "Day 01 Input"
day01_input:
.import text "../rust/inputs/day01"
//.import text "../rust/inputs/day01"
.byte 0
* = * "Day 01 Code"

500
c64/day02.asm Normal file
View File

@ -0,0 +1,500 @@
// vim: filetype=kickass
* = * "Day 02 Input"
!input:
.import binary "../inputs/02"
.byte 0
!str_title:
.text "# Day 02"
.byte '\n', '\n'
.text "Part 1: "
.byte 0
* = * "Day 02 Code"
day02:
{
.const input_pointer = $40
.const range_low = $42
.const range_high = $43
.const letter = $44
.const is_valid = $45
.const valid_count = $46
{
move_16_imm($03, !str_title-)
jsr write_string
.break
move_16_imm(input_pointer, !input-)
ldy #0
sty valid_count + 0
sty valid_count + 1
part1_loop:
jsr parse_rule
beq part1_done
// Increment range_high so we can beq.
inc range_high
// Decrement range_low so it overflows on invalid passwords
dec range_low
password:
lda (input_pointer), y
y_buf_inc(input_pointer)
cmp #$0a
beq newline
cmp letter
bne password
dec range_low
dec range_high
bne password
// range_high went to 0, so it contains the letter too many times
// Skip to newline, then loop back around.
!:
lda (input_pointer), y
y_buf_inc(input_pointer)
cmp #$0a
bne !-
jmp part1_loop
newline:
// If range_low is positive, we didn't meet the minimum
lda range_low
bpl part1_loop
inc valid_count + 0
bne part1_loop
inc valid_count + 1
jmp part1_loop
part1_done:
.break
lda valid_count + 0; sta udivmod32_dividend + 0
lda valid_count + 1; sta udivmod32_dividend + 1
lda #0
sta udivmod32_dividend + 2
sta udivmod32_dividend + 3
jsr print_decimal_u32
}
{
move_16_imm($03, str_part2)
jsr write_string
.break
move_16_imm(input_pointer, !input-)
ldy #0
sty valid_count + 0
sty valid_count + 1
part2_loop:
jsr parse_rule
beq part2_done
lda #0
sta is_valid
password:
lda (input_pointer), y
tax
y_buf_inc(input_pointer)
cmp #$0a
beq newline
dec range_low
bne !+
cmp letter
bne !+
lda #1
eor is_valid
sta is_valid
!:
dec range_high
bne !+++
txa
cmp letter
bne !+
lda #1
eor is_valid
sta is_valid
!:
// If we checked both numbers, we can skip the rest of the password.
!:
lda (input_pointer), y
y_buf_inc(input_pointer)
cmp #$0a
bne !-
jmp newline
!:
jmp password
newline:
lda is_valid
beq part2_loop
inc valid_count + 0
bne part2_loop
inc valid_count + 1
jmp part2_loop
part2_done:
.break
lda valid_count + 0; sta udivmod32_dividend + 0
lda valid_count + 1; sta udivmod32_dividend + 1
lda #0
sta udivmod32_dividend + 2
sta udivmod32_dividend + 3
jsr print_decimal_u32
}
move_16_imm($03, str_done)
jsr write_string
ldy #0
!:
ldx #0
!: inx; bne !-
!: inx; bne !-
!: inx; bne !-
!: inx; bne !-
iny
bne !-----
lda #1
sta $d020
ldy #0
!:
ldx #0
!: inx; bne !-
!: inx; bne !-
iny
bne !---
sta $d021
ldy #0
!:
ldx #0
!: inx; bne !-
!: inx; bne !-
!: inx; bne !-
iny
bne !----
{
.const timer = $40
.const xvel = $41
lda #(sprite1 / 64)
sta $07f8
lda #(sprite2 / 64)
sta $07f9
lda #(sprite3 / 64)
sta $07fa
lda #(sprite4 / 64)
sta $07fb
lda #0
sta $d001 // TL y
sta $d003 // TR y
lda #0
sta $d005 // BL y
sta $d007 // BR y
lda #0
sta $d000 // TL x
sta $d004 // BL x
lda #48
sta $d002 // TR x
sta $d006 // BR x
lda #0
sta $d010
lda #$0f
sta $d015 // sprite enable
sta $d01c // enable multicolor
sta $d01d // double width
sta $d017 // double height
lda #$09
sta $d025
lda #$08
sta $d026
lda #$00
sta $d027
sta $d028
sta $d029
sta $d02a
lda #0
sta timer
lda #127
sta xvel
SetRasterInterrupt(raster_irq)
cli
jmp *
raster_irq:
pha
txa
pha
tya
pha
dec timer
beq !+
jmp done
!:
lda #200
sta timer
// 0-214: Move bottom sprites
inc $d005
inc $d007
bne !+
// If they wrap around, disable them
lda $d015
and #%0011
sta $d015
!:
// 42-256: Move top sprites
// if top_sprite.disabled || top_sprite.y >= 42
lda $d015
and #$08
beq !+
lda $d007
cmp #42
bcc !++
!:
inc $d001
inc $d003
bne !+
// If they wrap around, disable them
lda $d015
and #%1100
sta $d015
!:
lda xvel
beq !+
jmp no_flip
!:
// If velocity is negative, flip the sprites
ldy #63
flip_loop:
//
// Sprite 1
//
lda sprite1 - 3, y
sta zp_temp
ldx sprite1 - 1, y
lda flip_map, x
sta sprite1 - 3, y
ldx zp_temp
lda flip_map, x
sta sprite1 - 1, y
ldx sprite1 - 2, y
lda flip_map, x
sta sprite1 - 2, y
//
// Sprite 2
//
lda sprite2 - 3, y
sta zp_temp
ldx sprite2 - 1, y
lda flip_map, x
sta sprite2 - 3, y
ldx zp_temp
lda flip_map, x
sta sprite2 - 1, y
ldx sprite2 - 2, y
lda flip_map, x
sta sprite2 - 2, y
//
// Sprite 3
//
lda sprite3 - 3, y
sta zp_temp
ldx sprite3 - 1, y
lda flip_map, x
sta sprite3 - 3, y
ldx zp_temp
lda flip_map, x
sta sprite3 - 1, y
ldx sprite3 - 2, y
lda flip_map, x
sta sprite3 - 2, y
//
// Sprite 4
//
lda sprite4 - 3, y
sta zp_temp
ldx sprite4 - 1, y
lda flip_map, x
sta sprite4 - 3, y
ldx zp_temp
lda flip_map, x
sta sprite4 - 1, y
ldx sprite4 - 2, y
lda flip_map, x
sta sprite4 - 2, y
dey; dey; dey
beq !+
jmp flip_loop
!:
lda $d000; clc; adc #48; sta $d000; sta $d004
lda $d002; sec; sbc #48; sta $d002; sta $d006
no_flip:
lda xvel
cmp #$80; ror
cmp #$80; ror
cmp #$80; ror
cmp #$80; ror
cmp #$80; ror
tax
// Move left sprites
txa; clc; adc $d000; sta $d000; sta $d004
bne !+
// If they wrap around, disable them
lda $d015
and #%1010
sta $d015
!:
// Move right sprites
txa; clc; adc $d002; sta $d002; sta $d006
bne !+
// If they wrap around, disable them
lda $d015
and #%0101
sta $d015
!:
dec xvel
done:
pla
tay
pla
tax
pla
rti
}
mul10:
asl
sta zp_temp
asl
asl
adc zp_temp
rts
parse_rule:
low_number:
// 13-16 k: kkkkkgmkbvkkrskhd
// ^^^
lda (input_pointer), y
bne !+
// Check for null terminator
rts
!:
y_buf_inc(input_pointer)
sec; sbc #'0'
sta range_low
lda (input_pointer), y
y_buf_inc(input_pointer)
cmp #$2d
beq !+
tax
lda range_low
jsr mul10
sta range_low
txa
sec; sbc #'0'
clc; adc range_low
sta range_low
y_buf_inc(input_pointer)
!:
high_number:
// 13-16 k: kkkkkgmkbvkkrskhd
// ^^^
lda (input_pointer), y
y_buf_inc(input_pointer)
sec; sbc #'0'
sta range_high
lda (input_pointer), y
y_buf_inc(input_pointer)
cmp #$20
beq !+
tax
lda range_high
jsr mul10
sta range_high
txa
sec; sbc #'0'
clc; adc range_high
sta range_high
y_buf_inc(input_pointer)
!:
//
// 13-16 k: kkkkkgmkbvkkrskhd
// ^^^
//
lda (input_pointer), y
sta letter
// TODO adc #3 instead?
y_buf_inc(input_pointer)
y_buf_inc(input_pointer)
y_buf_inc(input_pointer)
lda #1
rts
}

View File

@ -40,75 +40,6 @@
}
}
test_tree:
move_16_imm($03, !str_test+)
jsr write_string
move_16_imm($03, $10)
jsr tree_insert
move_16_imm($03, $08)
jsr tree_insert
move_16_imm($03, $04)
jsr tree_insert
move_16_imm($03, $12)
jsr tree_insert
move_16_imm($03, $1337)
jsr tree_insert
move_16_imm($03, $08)
jsr tree_contains
bne !fail+
move_16_imm($03, $13)
jsr tree_contains
beq !fail+
move_16_imm($03, $12)
jsr tree_contains
bne !fail+
move_16_imm($03, $1337)
jsr tree_contains
bne !fail+
move_16_imm($03, $0420)
jsr tree_contains
beq !fail+
move_16_imm($03, !str_success+)
jsr write_string
rts
!fail:
u16_u16_move($10, $03)
move_16_imm($03, !str_fail+)
jsr write_string
lda $11
jsr print_hex_0x
lda $10
jsr print_hex
jsr print_newline
rts
!str_test:
.text "[ ] test-tree"
.byte '\r', 0
!str_fail:
.text "[!!]"
.byte '\n'
.text "Failed: "
.byte 0
!str_success:
.text "[OK]"
.byte '\n', 0
//
// main
//
@ -131,10 +62,123 @@ main:
jmp !-
#import "day01.asm"
#import "day05.asm"
#import "day09.asm"
#import "screen.asm"
#import "math.asm"
#import "btree.asm"
#import "menu.asm"
*=$2000 "Sprite"
.align 64
sprite1:
.byte $00, $00, $00
.byte $00, $00, $00
.byte $00, $00, $00
.byte $00, $00, $00
.byte $00, $00, $00
.byte $00, $00, $00
.byte $00, $00, $00
.byte $00, $00, $00
.byte $00, $00, $00
.byte $00, $00, $00
.byte $00, $00, $A0
.byte $00, $0A, $B8
.byte $00, $AB, $F8
.byte $0A, $BF, $FE
.byte $AB, $FF, $FE
.byte $BF, $FF, $FF
.byte $BF, $FF, $FD
.byte $BF, $FF, $D5
.byte $BF, $FD, $57
.byte $2F, $D5, $7F
.byte $2D, $57, $FF
.align 64
sprite2:
.byte $00, $00, $00
.byte $00, $00, $00
.byte $00, $00, $00
.byte $00, $00, $00
.byte $00, $00, $00
.byte $00, $00, $00
.byte $00, $00, $00
.byte $00, $00, $00
.byte $00, $00, $00
.byte $00, $00, $00
.byte $00, $00, $00
.byte $00, $00, $00
.byte $00, $00, $00
.byte $00, $00, $00
.byte $00, $00, $00
.byte $00, $00, $00
.byte $80, $00, $00
.byte $80, $00, $00
.byte $A0, $00, $00
.byte $E0, $00, $00
.byte $E8, $02, $80
.align 64
sprite3:
.byte $09, $7F, $FF
.byte $0B, $FF, $FF
.byte $0B, $FF, $F5
.byte $02, $FF, $5A
.byte $02, $F5, $5B
.byte $00, $95, $FA
.byte $00, $9F, $FE
.byte $00, $BF, $FE
.byte $00, $2F, $FF
.byte $00, $2F, $FF
.byte $00, $0B, $F5
.byte $00, $0B, $55
.byte $00, $09, $5F
.byte $00, $02, $FF
.byte $00, $02, $BF
.byte $00, $00, $BF
.byte $00, $00, $AE
.byte $00, $00, $2A
.byte $00, $00, $00
.byte $00, $00, $00
.byte $00, $00, $00
.align 64
sprite4:
.byte $F8, $2B, $80
.byte $FA, $BF, $E0
.byte $EB, $FF, $E0
.byte $BF, $FF, $E0
.byte $FF, $FF, $E0
.byte $FF, $FF, $F8
.byte $FF, $FF, $D8
.byte $FF, $FD, $58
.byte $BF, $D5, $78
.byte $BD, $57, $F8
.byte $95, $7F, $E0
.byte $97, $FF, $E0
.byte $BF, $FF, $A0
.byte $BF, $FE, $80
.byte $BF, $FA, $00
.byte $BF, $A8, $00
.byte $FA, $80, $00
.byte $A8, $00, $00
.byte $00, $00, $00
.byte $00, $00, $00
.byte $00, $00, $00
.align 256
flip_map:
.for (var i = 0; i < 256; i++) {
// 11001001 >> 6 = 11 & $03 == 11
// 11001001 >> 2 = 110010 & $0c == 00
// 11001001 << 2 = 001001 & $30 == 10
// 11001001 << 6 = 01 & $c0 == 01
// -------- |
// 01100011
.byte ((i >> 6) & $03) | ((i >> 2) & $0c) | ((i << 2) & $30) | ((i << 6) & $c0)
}
#import "day01.asm"
#import "day02.asm"
#import "day05.asm"
#import "day09.asm"
#import "btree.asm"

View File

@ -109,17 +109,17 @@ menu_update:
!days:
.word day01 // 1
.word 0 // 2
.word day02 // 2
.word 0 // 3
.word 0 // 4
.word day05 // 5
.word 0 // 6
.word 0 // 7
.word 0 // 8
.word 0
.word 0 // 17
.word day09 // 9
.word 0
.word 0
.word 0 // 16
.word 0 // 18
.word 0 // 15
.word 0
.word 0 // 10
@ -241,7 +241,7 @@ stabilized_irq:
* = * "Menu Data"
menu_characters:
.byte ' ',' ',' ',' ',$6f,$6f,$6f,$52,$52,$52,$46,$46,$46,$46,$42,$46,$46,$46,$46,$52,$52,$52,$6f,$6f,$6f,' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ','1','*','*'
.byte $45,$45,$77,$77,' ',$2e,$27,' ',' ',$2d,' ',' ',$2d,' ',' ',$4d,$2d,' ',$2e,$27,$27,$68,' ',$68,' ',$77,$77,$45,$45,$44,$43,$40,$46,$52,$6f,' ',' ','2',' ',' '
.byte $45,$45,$77,$77,' ',$2e,$27,' ',' ',$2d,' ',' ',$2d,' ',' ',$4d,$2d,' ',$2e,$27,$27,$68,' ',$68,' ',$77,$77,$45,$45,$44,$43,$40,$46,$52,$6f,' ',' ','2','*','*'
.byte $68,' ',' ',$68,' ',$27,$2e,$27,$2e,' ',$2d,' ',' ',' ',$2d,' ',$4d,' ',$2d,$27,$27,$3a,' ',' ',$68,' ',$68,' ',' ',' ',$68,' ',' ',$68,' ',' ',' ','3',' ',' '
.byte ' ',' ',$68,' ',$68,' ',' ',$68,' ',$27,$27,$2e,$2e,$27,$27,$27,$64,$1b,$1d,$2e,$27,' ',' ',$68,' ',' ',' ',' ',$68,' ',' ',' ',$68,' ',$68,' ',' ','4',' ',' '
.byte $27,$2e,' ',$68,' ',' ',$68,' ',' ',$68,' ',' ',$64,$64,$6f,$4e,$63,$27,$27,' ',' ',$68,' ',' ',$68,' ',' ',$68,' ',' ',' ',' ',' ',$68,' ',' ',' ','5','*','*'
@ -251,7 +251,7 @@ menu_characters:
.byte ' ',' ',$68,' ',' ',' ',$4d,' ',' ',$68,' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',$68,' ',' ',' ',' ',' ',' ',$68,' ',' ',' ',' ',' ',' ','1','7',' ',' '
.byte ' ',' ',' ',' ',' ',$68,' ',$4d,' ',' ',' ',' ',' ',' ',' ',' ',' ',$27,$27,'.','.',' ',' ',' ',' ',$68,' ',' ',' ',' ',' ',' ',' ',$68,' ',' ',' ','9','*','*'
.byte ' ',' ',' ',' ',' ',' ',' ',' ',$4d,' ',$68,' ',' ',' ',' ',' ',$27,' ','[',']','.',' ',' ',' ',' ',' ',' ',' ',$68,' ',' ',$68,' ',' ',$2e,' ','1','6',' ',' '
.byte ' ',' ',' ',' ',' ',' ',' ',' ',' ',$4d,' ',' ',' ',' ',' ',$27,' ',',',' ',':',$4d,' ',' ',$68,' ',' ',' ',' ',' ',' ',' ',$3a,$27,$27,' ',' ',' ',' ',' ',' '
.byte ' ',' ',' ',' ',' ',' ',' ',' ',' ',$4d,' ',' ',' ',' ',' ',$27,' ',',',' ',':',$4d,' ',' ',$68,' ',' ',' ',' ',' ',' ',' ',$3a,$27,$27,' ',' ','1','8',' ',' '
.byte ' ',' ',' ',' ',' ',' ',' ',' ',' ',$68,$4d,' ',' ',' ',' ',$27,'.','.',$27,' ',' ',$4d,$6f,$6f,$64,$64,$64,' ',' ',$68,' ',$27,$2e,' ',$2c,' ','1','5',' ',' '
.byte ' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',$4d,' ',$68,' ',' ',' ',' ',' ',' ',' ',$68,' ',' ',$63,$63,$63,$77,$77,$4d,' ',' ',$3a,' ',' ',' ',' ',' ',' ',' '
.byte ' ',' ',' ',' ',' ',' ',' ',' ',' ',$68,' ',' ',$4d,' ',' ',' ',$68,' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',$2e,$4d,$27,' ',$2c,' ',' ','1','0',' ',' '
@ -270,15 +270,15 @@ menu_colors:
.byte $6f, $0e, $6e, $0e, $0e, $0e, $0e, $0e, $0e, $0e, $0e, $6e, $0e, $0e, $02, $0e, $0e, $0e, $0e, $0e // 0;00 - 0;20 | 6;10 - 6;30
.byte $0e, $0e, $0e, $0e, $0e, $00, $00, $f0, $00, $00, $00, $00, $00, $50, $50, $10, $e0, $6f, $07, $07 // 0;20 - 1;00 | 6;30 - 7;10
.byte $0e, $0e, $0e, $0e, $0e, $01, $61, $0e, $0e, $61, $00, $00, $01, $00, $01, $01, $61, $0e, $01, $01 // 1;00 - 1;20 | 7;10 - 7;30
.byte $01, $06, $00, $66, $0e, $0e, $0e, $fe, $0e, $0e, $0e, $0e, $6e, $0e, $0e, $00, $10, $0f, $00, $60 // 1;20 - 2;00 | 7;30 - 8;10
.byte $01, $06, $00, $66, $0e, $0e, $0e, $fe, $0e, $0e, $0e, $0e, $6e, $0e, $0e, $00, $10, $0f, $07, $67 // 1;20 - 2;00 | 7;30 - 8;10
.byte $06, $0e, $0e, $06, $0e, $01, $01, $01, $01, $0e, $01, $00, $b0, $00, $01, $0e, $01, $0e, $01, $61 // 2;00 - 2;20 | 8;10 - 8;30
.byte $01, $01, $00, $00, $06, $00, $b6, $b0, $00, $00, $06, $03, $03, $06, $03, $60, $00, $1f, $00, $00 // 2;20 - 3;00 | 8;30 - 9;10
.byte $01, $01, $00, $00, $06, $00, $f6, $f0, $00, $00, $06, $03, $03, $06, $03, $60, $00, $1f, $00, $00 // 2;20 - 3;00 | 8;30 - 9;10
.byte $0e, $0e, $06, $0e, $06, $0e, $0e, $c6, $ce, $c1, $c1, $01, $01, $01, $01, $61, $01, $01, $01, $01 // 3;00 - 3;20 | 9;10 - 9;30
.byte $01, $00, $00, $66, $00, $00, $00, $f0, $76, $70, $00, $00, $06, $0e, $06, $00, $00, $0f, $10, $00 // 3;20 - 4;00 | 9;30 - 10;10
.byte $65, $05, $00, $06, $0e, $0e, $b6, $0e, $1e, $16, $51, $01, $01, $01, $01, $01, $01, $01, $61, $00 // 4;00 - 4;20 | 10;10 - 10;30
.byte $00, $66, $00, $00, $56, $00, $f0, $f6, $00, $00, $00, $00, $00, $06, $00, $00, $00, $0f, $07, $17 // 4;20 - 5;00 | 10;30 - 11;10
.byte $05, $00, $00, $05, $05, $b1, $01, $b1, $01, $b1, $11, $01, $01, $61, $01, $00, $06, $00, $00, $06 // 5;00 - 5;20 | 11;10 - 11;30
.byte $00, $50, $56, $50, $00, $00, $00, $00, $00, $06, $00, $00, $00, $00, $00, $00, $00, $0f, $00, $60 // 5;20 - 6;00 | 11;30 - 12;10
.byte $00, $50, $56, $50, $00, $00, $f0, $f0, $00, $06, $00, $00, $00, $00, $00, $00, $00, $0f, $00, $60 // 5;20 - 6;00 | 11;30 - 12;10
.byte $16, $00, $05, $01, $01, $c5, $55, $c5, $50, $00 // 6;00 - 6;10 | 12;10 - 12;20
.byte $00, $01, $01, $01, $01, $01, $f1, $f1, $01, $06, $00, $05, $05, $0e, $05, $00, $0f, $0f, $00, $00 // 12;20 - 13;00 | 18;30 - 19;10