aoc_omni/gb/2015/1/not_quite_lisp.asm
2024-12-29 18:10:38 -05:00

174 lines
2.5 KiB
NASM

INCLUDE "lib/hardware.inc"
INCLUDE "lib/macros.inc"
SECTION "VBlank Interrupt", ROM0[$40]
jp VBlankHandler
SECTION "Header", ROM0[$100]
jp EntryPoint
ds $150 - @, 0 ; Make room for the header
SECTION "Init", ROM0[$150]
EntryPoint:
StartInit
ClearScreen
ClearOAM
LoadTiles
MemClear current_frame, 2
MemClear current_floor, 2
MemClear first_basement_floor, 2
MemClear done_flag, 1
;; Initialize input_index
ld bc, input
ld a, b
ld [input_index], a
ld a, c
ld [input_index + 1], a
FinishInit
ei
CheckInput:
ld a, [input_index]
ld h, a
ld a, [input_index + 1]
ld l, a
ld a, [hl]
cp a, "("
jr z, GoingUp
cp a, ")"
jr z, GoingDown
jr GoingNowhere
GoingUp:
call IncrementCurrentFloor
jr GoingNowhere
GoingDown:
ld a, [current_floor]
ld b, a
ld a, [current_floor + 1]
and a, b
call z, SaveBasementFloor
call DecrementCurrentFloor
GoingNowhere:
IncrementWord input_index
ld de, input_end
ld a, [input_index]
cp a, d
jr nz, CheckInput
ld a, [input_index + 1]
cp a, e
jr nz, CheckInput
ld a, 1
ld [done_flag], a
halt
nop
jr Done
Done:
halt
nop
jr Done
IncrementCurrentFloor:
ld a, [current_floor]
ld b, a
ld a, [current_floor + 1]
ld c, a
inc bc
ld a, b
ld [current_floor], a
ld a, c
ld [current_floor + 1], a
ret
DecrementCurrentFloor:
ld a, [current_floor]
ld b, a
ld a, [current_floor + 1]
ld c, a
dec bc
ld a, b
ld [current_floor], a
ld a, c
ld [current_floor + 1], a
ret
SaveBasementFloor:
ld a, [first_basement_floor]
ld b, a
ld a, [first_basement_floor + 1]
or a, b
ret nz
ld a, [input_index]
ld [first_basement_floor], a
ld a, [input_index + 1]
ld [first_basement_floor + 1], a
ret
VBlankHandler:
push AF
push BC
push DE
push HL
IncrementFrameCount
PrintString part_1_string, 0, 1
PrintString part_2_string, 0, 2
;; PrintByteHex current_frame, 0, 0
;; PrintByte current_frame, 0, 1
;; PrintByteHex current_floor, 0, 2
;; PrintByteHex current_floor + 1, 2, 2
ld a, [done_flag]
cp a, 1
jp nz, NotDone
PrintString done_string, 3, 3
PrintByte current_floor + 1, 8, 1
;; PrintByte first_basement_floor + 1, 8, 2
NotDone:
pop HL
pop DE
pop BC
pop AF
reti
SECTION "High RAM", HRAM
current_floor: DS 2
first_basement_floor: DS 2
done_flag: DS 1
SECTION "Input", ROM0
input:
INCBIN "../data/2015/1/input.txt"
input_end:
done_string:
db "Done", 0
done_string_end:
part_1_string: db "Part 1: "
part_1_string_end:
part_2_string: db "Part 2: "
part_2_string_end:
INCLUDE "lib/tiles.asm"