mirror of
https://github.com/Asraelite/littlebigcomputer.git
synced 2025-07-17 08:16:50 +00:00
189 lines
2.6 KiB
Text
189 lines
2.6 KiB
Text
.arch parva_0_1
|
|
|
|
# 1(sp): score
|
|
# 2(sp): swap_block
|
|
|
|
# x4: block lines 0/1
|
|
# x5: block lines 2/3
|
|
# x6: field lines 0/1
|
|
# x7: field lines 2/3
|
|
|
|
.include consts
|
|
.include sys
|
|
|
|
.string_encoding sys-6
|
|
|
|
|
|
.data.ro
|
|
|
|
srs_kick_table:
|
|
# XY, 0 = 0, 1 = +1, 2 = +2, 7 = -1, 6 = -2
|
|
# I block
|
|
0o60_10_67_12
|
|
0o70_20_72_27
|
|
# TODO
|
|
# J, L, T, S, Z blocks
|
|
0o70_71_06_76
|
|
0o10_17_02_12
|
|
# TODO
|
|
|
|
block_table:
|
|
# I 0
|
|
0b_0_0000_000000_0_0_1111_000000_0
|
|
0b_0_1111_000000_0_0_0000_000000_0
|
|
# I 1
|
|
0b_0_0010_000000_0_0_0010_000000_0
|
|
0b_0_0010_000000_0_0_0010_000000_0
|
|
# TODO
|
|
|
|
hi_score_filename: .string "tet_hiscr.dat\0"
|
|
hi_score_file_error_message: .string .line_break 10 "could not open or create hi score file\0"
|
|
score_string: .string "score\0"
|
|
game_over_string: .string "game over\0"
|
|
.scores_button_string: .string "scores\0"
|
|
.start_button_string: .string "start\0"
|
|
.next_string: .string "next\0"
|
|
|
|
.data.rw
|
|
|
|
.align const.cache_line_size
|
|
swap_block: 0
|
|
score: 0
|
|
next_air_drop_time: 0
|
|
next_floor_drop_time: 0
|
|
stack: .repeat 0, 20
|
|
|
|
hi_scores:
|
|
.repeat 0, 20
|
|
|
|
.eq score_string_x 30
|
|
.eq score_string_y 10
|
|
|
|
|
|
.text
|
|
|
|
_start:
|
|
|
|
push ra
|
|
|
|
load_hi_scores:
|
|
|
|
li a0, hi_score_filename
|
|
li a1, hi_scores
|
|
li x0, 20
|
|
call sys.read_file
|
|
li x0, -1
|
|
beq a0, x0, create_hi_score_file
|
|
|
|
create_hi_score_file:
|
|
|
|
li a0, hi_score_filename
|
|
call sys.open_file
|
|
|
|
bltz a0, error_hi_score_file
|
|
|
|
wait:
|
|
|
|
wait_loop:
|
|
|
|
stub.kb.rdchar x0
|
|
|
|
beqi x0, const.char.left_arrow, move_left
|
|
beqi x0, const.char.right_arrow, move_right
|
|
beqi x0, const.char.up_arrow, rotate
|
|
beqi x0, const.char.space, hard_drop
|
|
beqi x0, const.char.backspace, swap
|
|
|
|
b wait_loop
|
|
|
|
rotate:
|
|
|
|
# x2 = current pos / block / rotation, [0 * 8, 4 bits for position x, 0 * 7, 3 bits for block type, 2 bits for rotation]
|
|
|
|
addi x3, x2, 1
|
|
andi x3, x3, 0b00011
|
|
andi x2, x2, 0b11100
|
|
or x2, x2, x3
|
|
ld d0, [x2 + block_table]
|
|
|
|
|
|
.align 4
|
|
move_left:
|
|
|
|
slli x0, x4, 1
|
|
and x0, x0, x6
|
|
bnez x0, fail
|
|
slli x0, x5, 1
|
|
and x0, x0, x7
|
|
bnez x0, fail
|
|
|
|
slli x4, x4, 1
|
|
slli x5, x5, 1
|
|
b move_successful
|
|
|
|
.align 4
|
|
move_right:
|
|
|
|
srli x0, x4, 1
|
|
and x0, x0, x6
|
|
bnez x0, fail
|
|
srli x0, x5, 1
|
|
and x0, x0, x7
|
|
bnez x0, fail
|
|
|
|
srli x4, x4, 1
|
|
srli x5, x5, 1
|
|
b move_successful
|
|
|
|
move_failed:
|
|
|
|
# TODO
|
|
|
|
move_successful:
|
|
|
|
# TODO
|
|
|
|
# decimal addition
|
|
# input: x0 = score change
|
|
.align 2
|
|
add_score:
|
|
|
|
lw x1, score
|
|
add x0, x0, x1
|
|
li x1, 0o1166
|
|
and x2, x0, 0o77
|
|
li x3, 10
|
|
blt x2, x3, 2
|
|
|
|
add x0, x0, x1
|
|
slli x1, x1, 6
|
|
srli x2, x0, 6
|
|
andi x2, x0, 0o77
|
|
blt x2, x3, end_score_change
|
|
add x0, x0, x1
|
|
|
|
slli x1, x1, 6
|
|
srli x2, x0, 6
|
|
andi x2, x0, 0o77
|
|
blt x2, x3, end_score_change
|
|
add x0, x0, x1
|
|
slli x1, x1, 6
|
|
|
|
srli x2 x0, 6
|
|
andi x2, x0, 0o77
|
|
blt x2, x3, end_score_change
|
|
add x0, x0, x1
|
|
|
|
.align 2
|
|
end_score_change:
|
|
|
|
sw x0, score
|
|
|
|
|
|
|
|
|
|
quit:
|
|
|
|
|
|
|
|
pop ra
|