mirror of
https://github.com/Asraelite/littlebigcomputer.git
synced 2025-07-17 16:16:51 +00:00
Init commit
This commit is contained in:
commit
c45ad79440
48 changed files with 6786 additions and 0 deletions
1
programs/parva/add_carry_1.lbpasm
Normal file
1
programs/parva/add_carry_1.lbpasm
Normal file
|
@ -0,0 +1 @@
|
|||
.asm_version 0.1
|
48
programs/parva/assembler_1.lbpasm
Normal file
48
programs/parva/assembler_1.lbpasm
Normal file
|
@ -0,0 +1,48 @@
|
|||
hash_table:
|
||||
.data blablabla
|
||||
|
||||
|
||||
parse_line:
|
||||
li
|
||||
rw t0, 0(a0)
|
||||
srli t1, 18
|
||||
beqz end_of_line
|
||||
sub t1, t0, t1
|
||||
|
||||
end_of_line:
|
||||
|
||||
.char_encoding lbpc1
|
||||
|
||||
get_instruction:
|
||||
|
||||
a-z 0-9 () , space enter
|
||||
|
||||
li x2, 0 ; cursor position in line
|
||||
|
||||
listen:
|
||||
iord x0, 1, 0 ; get char from keyboard (device 1, buffer 0)
|
||||
beqz listen
|
||||
sub x1, x0, 'a'
|
||||
.eq diff 'z' - 'a'
|
||||
bleu x1, diff, okay
|
||||
sub x1, x0, '0'
|
||||
.eq diff '9' - '0'
|
||||
bleu x1, diff, okay
|
||||
|
||||
beq x0, ' ', okay
|
||||
beq x0, '\n', okay
|
||||
beq x0, '(', okay
|
||||
beq x0, ')', okay
|
||||
beq x0, ',', okay
|
||||
b invalid_input
|
||||
|
||||
invalid_input:
|
||||
iow 3, 1, 0o1214 ; play buzzing sound (sound card is device 3, play direct value command is 1)
|
||||
b listen
|
||||
|
||||
okay:
|
||||
iow 2, 2, x0, 0 ; print character x0 (gpu is device 2, print char command is 2)
|
||||
addi x2, x2, 1 ; move cursor right
|
||||
|
||||
|
||||
|
103
programs/parva/binary_to_decimal_1.lbpasm
Normal file
103
programs/parva/binary_to_decimal_1.lbpasm
Normal file
|
@ -0,0 +1,103 @@
|
|||
lw x0, value
|
||||
li x1, 0
|
||||
|
||||
# https://ridiculousfish.com/blog/posts/labor-of-division-episode-i.html
|
||||
dec_to_bin_loop:
|
||||
lw x4, ten_powers(x1)
|
||||
beqz x4, end_dec_to_bin_loop
|
||||
slli x5, x1, 1
|
||||
lw x3, ten_divisors(x5)
|
||||
lw x5, (ten_divisors + 1)(x5)
|
||||
mulhu x6, x0, x3
|
||||
sub x7, x0, x6
|
||||
srli x7, x7, 1
|
||||
add x3, x7, x6
|
||||
srl x3, x3, x5 # x3 = digit of result
|
||||
sw x3, result_string(x1)
|
||||
mulu x3, x3, x4
|
||||
sub x0, x0, x3
|
||||
addi x1, x1, 1
|
||||
b dec_to_bin_loop
|
||||
end_dec_to_bin_loop:
|
||||
|
||||
sw x0, result_string(x1)
|
||||
li x0, -1
|
||||
li x6, 1 # cursor x
|
||||
li x7, 1 # cursor y
|
||||
sw x0, 0b01_0100_000000(upper) # gpu clear screen
|
||||
|
||||
skip_zeroes:
|
||||
addi x0, x0, 1
|
||||
lw x1, result_string(x0)
|
||||
beqz x1, skip_zeroes
|
||||
print_loop:
|
||||
sd x67, 0b01_0000_000000(upper) # gpu move cursor
|
||||
lw x1, result_string(x0)
|
||||
bltz x1, end_print_loop
|
||||
slli x1, x1, 1
|
||||
lw x2, char_pixels(x1)
|
||||
lw x3, (char_pixels + 1)(x1)
|
||||
sd x23, 0b01_0010_000000(upper) # gpu print char
|
||||
addi x6, x6, 4
|
||||
addi x0, x0, 1
|
||||
b print_loop
|
||||
end_print_loop:
|
||||
|
||||
sd x01, 0b01_0011_000000(upper) # gpu show buffer
|
||||
wfi
|
||||
|
||||
ten_powers:
|
||||
.data 10000000
|
||||
.data 1000000
|
||||
.data 100000
|
||||
.data 10000
|
||||
.data 1000
|
||||
.data 100
|
||||
.data 10
|
||||
.data 0
|
||||
|
||||
ten_divisors:
|
||||
.data 0xad7f2a 23 # 10000000
|
||||
.data 0x0c6f7b 19 # 1000000
|
||||
.data 0x4f8b59 16 # 100000
|
||||
.data 0xa36e2f 13 # 10000
|
||||
.data 0x0624de 9 # 1000
|
||||
.data 0x47ae15 6 # 100
|
||||
.data 0x99999a 3 # 10
|
||||
|
||||
char_pixels:
|
||||
.data 0b111000_101000_101000_101000 # 0
|
||||
.data 0b111000_000000_000000_000000
|
||||
|
||||
.data 0b001000_001000_001000_001000 # 1
|
||||
.data 0b001000_000000_000000_000000
|
||||
|
||||
.data 0b111000_001000_111000_100000 # 2
|
||||
.data 0b111000_000000_000000_000000
|
||||
|
||||
.data 0b111000_001000_111000_001000 # 3
|
||||
.data 0b111000_000000_000000_000000
|
||||
|
||||
.data 0b101000_101000_111000_001000 # 4
|
||||
.data 0b001000_000000_000000_000000
|
||||
|
||||
.data 0b111000_100000_111000_001000 # 5
|
||||
.data 0b111000_000000_000000_000000
|
||||
|
||||
.data 0b111000_100000_111000_101000 # 6
|
||||
.data 0b111000_000000_000000_000000
|
||||
|
||||
.data 0b111000_001000_001000_010000 # 7
|
||||
.data 0b010000_000000_000000_000000
|
||||
|
||||
.data 0b111000_101000_111000_101000 # 8
|
||||
.data 0b111000_000000_000000_000000
|
||||
|
||||
.data 0b111000_101000_111000_001000 # 9
|
||||
.data 0b001000_000000_000000_000000
|
||||
result_string:
|
||||
.repeat 0 8
|
||||
.data -1
|
||||
|
||||
value:
|
||||
.data 6942069
|
109
programs/parva/binary_to_decimal_2.lbpasm
Normal file
109
programs/parva/binary_to_decimal_2.lbpasm
Normal file
|
@ -0,0 +1,109 @@
|
|||
li sp, stack
|
||||
|
||||
j main
|
||||
|
||||
main:
|
||||
sw x0, gpu_clear_screen(upper)
|
||||
|
||||
li x6, 1
|
||||
li x7, 1
|
||||
sd x67, cursor_pos
|
||||
li a0, 6942069
|
||||
call print_number
|
||||
|
||||
li x6, 1
|
||||
li x7, 7
|
||||
sd x67, cursor_pos
|
||||
li a0, 12345678
|
||||
call print_number
|
||||
|
||||
wfi
|
||||
|
||||
.eq gpu_clear_screen 0b01_0100_000000
|
||||
.eq gpu_move_cursor 0b01_0000_000000
|
||||
.eq gpu_print_char 0b01_0010_000000
|
||||
.eq gpu_show_buffer 0b01_0011_000000
|
||||
|
||||
|
||||
# void print_number(*void return: ra, int number: a0)
|
||||
.address 128
|
||||
print_number:
|
||||
push ra
|
||||
mv x0, a0
|
||||
li x2, 0
|
||||
li x4, 10000000
|
||||
|
||||
.align 2
|
||||
print_number__bin_to_dec_loop:
|
||||
divu x3, x0, x4
|
||||
remu x0, x0, x4
|
||||
sw x3, print_number__result_string(x2)
|
||||
divui x4, x4, 10
|
||||
addi x2, x2, 1
|
||||
bnez x4, print_number__bin_to_dec_loop
|
||||
|
||||
li x0, -1
|
||||
ld x67, cursor_pos
|
||||
print_number__skip_zeroes:
|
||||
addi x0, x0, 1
|
||||
lw x4, print_number__result_string(x0)
|
||||
beqz x4, print_number__skip_zeroes
|
||||
print_number__print_loop:
|
||||
lw x4, print_number__result_string(x0)
|
||||
bltz x4, print_number__end_print_loop
|
||||
sd x67, gpu_move_cursor(upper)
|
||||
slli x4, x4, 1
|
||||
ld x23, print_number__char_pixels(x4)
|
||||
addi x6, x6, 4
|
||||
addi x0, x0, 1
|
||||
sd x23, gpu_print_char(upper)
|
||||
b print_number__print_loop
|
||||
print_number__end_print_loop:
|
||||
sd x01, gpu_show_buffer(upper) # gpu show buffer
|
||||
sw x6, (cursor_pos + 0)
|
||||
pop ra
|
||||
j ra
|
||||
|
||||
print_number__char_pixels:
|
||||
.data 0b111000_101000_101000_101000 # 0
|
||||
.data 0b111000_000000_000000_000000
|
||||
|
||||
.data 0b001000_001000_001000_001000 # 1
|
||||
.data 0b001000_000000_000000_000000
|
||||
|
||||
.data 0b111000_001000_111000_100000 # 2
|
||||
.data 0b111000_000000_000000_000000
|
||||
|
||||
.data 0b111000_001000_111000_001000 # 3
|
||||
.data 0b111000_000000_000000_000000
|
||||
|
||||
.data 0b101000_101000_111000_001000 # 4
|
||||
.data 0b001000_000000_000000_000000
|
||||
|
||||
.data 0b111000_100000_111000_001000 # 5
|
||||
.data 0b111000_000000_000000_000000
|
||||
|
||||
.data 0b111000_100000_111000_101000 # 6
|
||||
.data 0b111000_000000_000000_000000
|
||||
|
||||
.data 0b111000_001000_001000_010000 # 7
|
||||
.data 0b010000_000000_000000_000000
|
||||
|
||||
.data 0b111000_101000_111000_101000 # 8
|
||||
.data 0b111000_000000_000000_000000
|
||||
|
||||
.data 0b111000_101000_111000_001000 # 9
|
||||
.data 0b001000_000000_000000_000000
|
||||
print_number__result_string:
|
||||
.repeat 0 8
|
||||
.data -1
|
||||
# end print_number()
|
||||
|
||||
.align 2
|
||||
cursor_pos:
|
||||
.data 1
|
||||
.data 1
|
||||
|
||||
.align 2
|
||||
stack:
|
||||
.data 0
|
96
programs/parva/calculator_1.lbpasm
Normal file
96
programs/parva/calculator_1.lbpasm
Normal file
|
@ -0,0 +1,96 @@
|
|||
# target parva_0_1
|
||||
|
||||
li sp, stack
|
||||
|
||||
# function
|
||||
tokenize:
|
||||
push ra
|
||||
addi x2, a0, -1 # x2 = pointer to input string
|
||||
|
||||
li x0, -1
|
||||
push x0 # mark the beginning of the token stack
|
||||
|
||||
tokenize__loop:
|
||||
addi x2, x2, 1
|
||||
lw x3, x2
|
||||
beqz x3, tokenize__end
|
||||
li x4, '0'
|
||||
blt x3, x4, tokenize__symbol
|
||||
li x5, '9'
|
||||
bgt x3, x5, tokenize__symbol
|
||||
|
||||
mv x6, sp
|
||||
.align 2
|
||||
tokenize__number_gather:
|
||||
push x3
|
||||
addi x2, x2, 1
|
||||
addi x3, x3, -'0'
|
||||
lw x3, x2
|
||||
blt x3, x4, tokenize__number_gather_end
|
||||
bgt x3, x5, tokenize__number_gather_end
|
||||
b tokenize__number_gather
|
||||
tokenize__number_gather_end:
|
||||
li x0, 0 # x0 = sum
|
||||
li x7, 1 # x7 = power of 10
|
||||
.align 2
|
||||
tokenize__number_sum:
|
||||
pop x3
|
||||
mulu x3, x3, x7
|
||||
add x0, x0, x3
|
||||
mului x7, x7, 10
|
||||
bne x6, sp, tokenize__number_sum
|
||||
|
||||
li x3, 1 # token type = 1 = number
|
||||
push x3
|
||||
push x0
|
||||
b tokenize__loop
|
||||
|
||||
tokenize__symbol:
|
||||
xori x3, x3, 42 # todo, set to appropriate value for hashing symbols
|
||||
lw x3, tokenize__symbol_hashtable(x3)
|
||||
beqz x3, error_invalid_input
|
||||
push x3
|
||||
b tokenize__loop
|
||||
|
||||
tokenize__end:
|
||||
|
||||
tokenize__shunting_yard:
|
||||
pop x3
|
||||
bnez x3, 3
|
||||
|
||||
|
||||
|
||||
b end
|
||||
|
||||
tokenize__output_queue:
|
||||
.repeat 0 40
|
||||
|
||||
tokenize__symbol_hashtable:
|
||||
.data 0
|
||||
.data 1
|
||||
.repeat 0 30 # todo
|
||||
|
||||
error_invalid_input:
|
||||
li a0, error_message_invalid_input
|
||||
li a1, 1
|
||||
call print
|
||||
b end
|
||||
|
||||
# function
|
||||
print:
|
||||
# todo
|
||||
ret
|
||||
|
||||
end:
|
||||
wfi
|
||||
|
||||
input_string:
|
||||
.string_encoding terminal
|
||||
.string "125+23*8"
|
||||
.string "\0"
|
||||
|
||||
error_message_invalid_input:
|
||||
.string_encoding ascii # todo, use correct encoding
|
||||
.string "Invalid input\0"
|
||||
|
||||
stack:
|
13
programs/parva/cli_1.lbpasm
Normal file
13
programs/parva/cli_1.lbpasm
Normal file
|
@ -0,0 +1,13 @@
|
|||
split_args: ; fn([str8; len]) -> ( [[str8; len]; len] )
|
||||
push ra
|
||||
ld x01, 0(r0) ; x0 = pointer to first char, x1 = length
|
||||
loop:
|
||||
lw t0, 0(a0)
|
||||
andi t0, a0, 0o77
|
||||
beqz end
|
||||
|
||||
end:
|
||||
|
||||
hash:
|
||||
|
||||
|
12
programs/parva/fibonacci_1.lbpasm
Normal file
12
programs/parva/fibonacci_1.lbpasm
Normal file
|
@ -0,0 +1,12 @@
|
|||
li x0, 0
|
||||
li x1, 1
|
||||
li x2, 20
|
||||
|
||||
loop:
|
||||
|
||||
add x0, x0, x1
|
||||
add x1, x0, x1
|
||||
subi x2, x2, 1
|
||||
bnez x2, loop
|
||||
|
||||
wfi
|
24
programs/parva/fibonacci_2.lbpasm
Normal file
24
programs/parva/fibonacci_2.lbpasm
Normal file
|
@ -0,0 +1,24 @@
|
|||
li x0, 1
|
||||
li x1, 0
|
||||
|
||||
li x2, 30 ; nth fibonacci number to calculate
|
||||
|
||||
andi x4, x2, 1 ; x4 = n odd?
|
||||
srli x2, x2, 1 ; n /= 2
|
||||
|
||||
loop:
|
||||
|
||||
add x0, x0, x1
|
||||
add x1, x0, x1
|
||||
subi x2, x2, 1
|
||||
bnez x2, loop
|
||||
|
||||
beqz x4, no_final_iteration
|
||||
|
||||
add x1, x0, x1
|
||||
|
||||
no_final_iteration:
|
||||
|
||||
mv x0, x1
|
||||
li x1, 0
|
||||
wfi
|
24
programs/parva/fibonacci_3.lbpasm
Normal file
24
programs/parva/fibonacci_3.lbpasm
Normal file
|
@ -0,0 +1,24 @@
|
|||
li x0, 1
|
||||
li x1, 0
|
||||
|
||||
li x2, 30 ; nth fibonacci number to calculate
|
||||
|
||||
andi x4, x2, 1 ; x4 = n odd?
|
||||
srli x2, x2, 1 ; n /= 2
|
||||
|
||||
loop:
|
||||
|
||||
add x0, x0, x1
|
||||
add x1, x0, x1
|
||||
subi x2, x2, 1
|
||||
bnez x2, loop
|
||||
|
||||
beqz x4, no_final_iteration
|
||||
|
||||
add x1, x0, x1
|
||||
|
||||
no_final_iteration:
|
||||
|
||||
mv x0, x1
|
||||
li x1, 0
|
||||
wfi
|
93
programs/parva/gpu_hello_world_1.lbpasm
Normal file
93
programs/parva/gpu_hello_world_1.lbpasm
Normal file
|
@ -0,0 +1,93 @@
|
|||
; CPU version 0.1
|
||||
; GPU version 0.1 on IO port 1
|
||||
|
||||
nop
|
||||
b _start
|
||||
|
||||
characters:
|
||||
char_H: ; 0
|
||||
.data 0b000000_100010_100010_111110 0b100010_100010_100010_000000
|
||||
char_e: ; 1
|
||||
.data 0b000000_000000_011000_100100 0b111100_100000_011100_000000
|
||||
char_l: ; 2
|
||||
.data 0b000000_100000_100000_100000 0b100000_100000_010000_000000
|
||||
char_o: ; 3
|
||||
.data 0b000000_000000_011000_100100 0b100100_100100_011000_000000
|
||||
char_w: ; 4
|
||||
.data 0b000000_000000_101010_101010 0b101010_101010_010100_000000
|
||||
char_r: ; 5
|
||||
.data 0b000000_000000_111000_100000 0b100000_100000_100000_000000
|
||||
char_d: ; 6
|
||||
.data 0b000100_011100_100100_100100 0b100100_100100_011100_000000
|
||||
|
||||
_start:
|
||||
|
||||
li x6, 1 ; x position
|
||||
li x7, 1 ; y position
|
||||
|
||||
sw zero, 0b01_0100_000000(upper) ; gpu clear screen
|
||||
sd x67, 0b01_0000_000000(upper) ; gpu move cursor
|
||||
|
||||
; H
|
||||
lw x0, 0(char_H)(zero) ; upper 24 pixels
|
||||
lw x1, 1(char_H)(zero) ; lower 24 pixels
|
||||
sd x01, 0b01_0010_000000(upper) ; gpu print 6x8 char
|
||||
addi x6, x6, 6 ; x position += 6
|
||||
|
||||
; e
|
||||
lw x0, 0(char_e)(zero)
|
||||
lw x1, 1(char_e)(zero)
|
||||
sd x01, 0b01_0010_000000(upper)
|
||||
addi x6, x6, 6
|
||||
|
||||
; l
|
||||
lw x0, 0(char_l)(zero)
|
||||
lw x1, 1(char_l)(zero)
|
||||
sd x01, 0b01_0010_000000(upper)
|
||||
addi x6, x6, 6
|
||||
|
||||
; l
|
||||
lw x0, 0(char_l)(zero)
|
||||
lw x1, 1(char_l)(zero)
|
||||
sd x01, 0b01_0010_000000(upper)
|
||||
addi x6, x6, 6
|
||||
|
||||
; o
|
||||
lw x0, 0(char_o)(zero)
|
||||
lw x1, 1(char_o)(zero)
|
||||
sd x01, 0b01_0010_000000(upper)
|
||||
addi x6, x6, 6
|
||||
|
||||
; w
|
||||
lw x0, 0(char_w)(zero)
|
||||
lw x1, 1(char_w)(zero)
|
||||
sd x01, 0b01_0010_000000(upper)
|
||||
addi x6, x6, 6
|
||||
|
||||
; o
|
||||
lw x0, 0(char_o)(zero)
|
||||
lw x1, 1(char_o)(zero)
|
||||
sd x01, 0b01_0010_000000(upper)
|
||||
addi x6, x6, 6
|
||||
|
||||
; r
|
||||
lw x0, 0(char_r)(zero)
|
||||
lw x1, 1(char_r)(zero)
|
||||
sd x01, 0b01_0010_000000(upper)
|
||||
addi x6, x6, 6
|
||||
|
||||
; l
|
||||
lw x0, 0(char_l)(zero)
|
||||
lw x1, 1(char_l)(zero)
|
||||
sd x01, 0b01_0010_000000(upper)
|
||||
addi x6, x6, 6
|
||||
|
||||
; d
|
||||
lw x0, 0(char_d)(zero)
|
||||
lw x1, 1(char_d)(zero)
|
||||
sd x01, 0b01_0010_000000(upper)
|
||||
addi x6, x6, 6
|
||||
|
||||
sd x01, 0b01_0011_000000(upper) ; gpu print buffer to screen
|
||||
|
||||
wfi
|
117
programs/parva/gpu_hello_world_2.lbpasm
Normal file
117
programs/parva/gpu_hello_world_2.lbpasm
Normal file
|
@ -0,0 +1,117 @@
|
|||
; CPU version 0.1
|
||||
; GPU version 0.1 on IO port 1
|
||||
|
||||
nop
|
||||
b _start
|
||||
|
||||
characters:
|
||||
char_H_top: ; 0
|
||||
.data 0b000000_100010_100010_111110
|
||||
char_H_bottom:
|
||||
.data 0b100010_100010_100010_000000
|
||||
char_e_top: ; 1
|
||||
.data 0b000000_000000_011000_100100
|
||||
char_e_bottom:
|
||||
.data 0b111100_100000_011100_000000
|
||||
char_l_top: ; 2
|
||||
.data 0b000000_100000_100000_100000
|
||||
char_l_bottom:
|
||||
.data 0b100000_100000_010000_000000
|
||||
char_o_top: ; 3
|
||||
.data 0b000000_000000_011000_100100
|
||||
char_o_bottom:
|
||||
.data 0b100100_100100_011000_000000
|
||||
char_w_top: ; 4
|
||||
.data 0b000000_000000_101010_101010
|
||||
char_w_bottom:
|
||||
.data 0b101010_101010_010100_000000
|
||||
char_r_top: ; 5
|
||||
.data 0b000000_000000_111000_100000
|
||||
char_r_bottom:
|
||||
.data 0b100000_100000_100000_000000
|
||||
char_d_top: ; 6
|
||||
.data 0b000100_011100_100100_100100
|
||||
char_d_bottom:
|
||||
.data 0b100100_100100_011100_000000
|
||||
|
||||
_start:
|
||||
|
||||
li x6, 1 ; x position
|
||||
li x7, 1 ; y position
|
||||
|
||||
sw x0, 0b01_0100_000000(upper) ; gpu clear screen
|
||||
sd x67, 0b01_0000_000000(upper) ; gpu move cursor
|
||||
|
||||
; H
|
||||
lw x0, char_H_top(zero) ; upper 24 pixels
|
||||
lw x1, char_H_bottom(zero) ; lower 24 pixels
|
||||
sd x01, 0b01_0010_000000(upper) ; gpu print 6x8 char
|
||||
addi x6, x6, 6 ; x position += 6
|
||||
sd x67, 0b01_0000_000000(upper) ; gpu move cursor
|
||||
|
||||
; e
|
||||
lw x0, char_e_top(zero)
|
||||
lw x1, char_e_bottom(zero)
|
||||
sd x01, 0b01_0010_000000(upper)
|
||||
addi x6, x6, 6
|
||||
sd x67, 0b01_0000_000000(upper) ; gpu move cursor
|
||||
|
||||
; l
|
||||
lw x0, char_l_top(zero)
|
||||
lw x1, char_l_bottom(zero)
|
||||
sd x01, 0b01_0010_000000(upper)
|
||||
addi x6, x6, 6
|
||||
sd x67, 0b01_0000_000000(upper) ; gpu move cursor
|
||||
|
||||
; l
|
||||
lw x0, char_l_top(zero)
|
||||
lw x1, char_l_bottom(zero)
|
||||
sd x01, 0b01_0010_000000(upper)
|
||||
addi x6, x6, 6
|
||||
sd x67, 0b01_0000_000000(upper) ; gpu move cursor
|
||||
|
||||
; o
|
||||
lw x0, char_o_top(zero)
|
||||
lw x1, char_o_bottom(zero)
|
||||
sd x01, 0b01_0010_000000(upper)
|
||||
addi x6, x6, 6
|
||||
sd x67, 0b01_0000_000000(upper) ; gpu move cursor
|
||||
|
||||
; w
|
||||
lw x0, char_w_top(zero)
|
||||
lw x1, char_w_bottom(zero)
|
||||
sd x01, 0b01_0010_000000(upper)
|
||||
addi x6, x6, 6
|
||||
sd x67, 0b01_0000_000000(upper) ; gpu move cursor
|
||||
|
||||
; o
|
||||
lw x0, char_o_top(zero)
|
||||
lw x1, char_o_bottom(zero)
|
||||
sd x01, 0b01_0010_000000(upper)
|
||||
addi x6, x6, 6
|
||||
sd x67, 0b01_0000_000000(upper) ; gpu move cursor
|
||||
|
||||
; r
|
||||
lw x0, char_r_top(zero)
|
||||
lw x1, char_r_bottom(zero)
|
||||
sd x01, 0b01_0010_000000(upper)
|
||||
addi x6, x6, 6
|
||||
sd x67, 0b01_0000_000000(upper) ; gpu move cursor
|
||||
|
||||
; l
|
||||
lw x0, char_l_top(zero)
|
||||
lw x1, char_l_bottom(zero)
|
||||
sd x01, 0b01_0010_000000(upper)
|
||||
addi x6, x6, 6
|
||||
sd x67, 0b01_0000_000000(upper) ; gpu move cursor
|
||||
|
||||
; d
|
||||
lw x0, char_d_top(zero)
|
||||
lw x1, char_d_bottom(zero)
|
||||
sd x01, 0b01_0010_000000(upper)
|
||||
nop
|
||||
nop
|
||||
nop ; wait for print to finish
|
||||
sd x01, 0b01_0011_000000(upper) ; gpu flush buffer to screen
|
||||
|
||||
wfi
|
59
programs/parva/gpu_hello_world_3.lbpasm
Normal file
59
programs/parva/gpu_hello_world_3.lbpasm
Normal file
|
@ -0,0 +1,59 @@
|
|||
; Parva CPU version 0.1
|
||||
; Parva GPU version 0.1 on IO port 0x1
|
||||
|
||||
nop
|
||||
b _start
|
||||
|
||||
string:
|
||||
.data 1 2 3 3 4 8 5 4 6 3 7 0
|
||||
|
||||
characters:
|
||||
; upper 24 pixels, lower 24 pixels, width
|
||||
char_null: ; 0
|
||||
.data 0
|
||||
characters_plus_1:
|
||||
.data 0
|
||||
characters_plus_2:
|
||||
.data 0
|
||||
char_H: ; 1
|
||||
.data 0b000000_100010_100010_111110 0b100010_100010_100010_000000 6
|
||||
char_e: ; 2
|
||||
.data 0b000000_000000_011000_100100 0b111100_100000_011100_000000 5
|
||||
char_l: ; 3
|
||||
.data 0b000000_100000_100000_100000 0b100000_100000_010000_000000 3
|
||||
char_o: ; 4
|
||||
.data 0b000000_000000_011000_100100 0b100100_100100_011000_000000 5
|
||||
char_w: ; 5
|
||||
.data 0b000000_000000_101010_101010 0b101010_101010_010100_000000 6
|
||||
char_r: ; 6
|
||||
.data 0b000000_000000_011000_100000 0b100000_100000_100000_000000 4
|
||||
char_d: ; 7
|
||||
.data 0b000000_000100_011100_100100 0b100100_100100_011100_000000 5
|
||||
char_space: ; 8
|
||||
.data 0 0 4
|
||||
|
||||
_start:
|
||||
|
||||
sw x0, 0b01_0100_000000(upper) ; gpu clear screen
|
||||
li x6, 1 ; x position
|
||||
li x7, 1 ; y position
|
||||
li x0, string
|
||||
loop:
|
||||
sd x67, 0b01_0000_000000(upper) ; gpu move cursor
|
||||
lw x1, 0(x0) ; x1 = current character
|
||||
beqz x1, end
|
||||
add x2, x1, x1
|
||||
add x1, x2, x1 ; x1 *= 3
|
||||
lw x2, characters(x1) ; upper 24 pixels
|
||||
lw x3, characters_plus_1(x1) ; lower 24 pixels
|
||||
sd x01, 0b01_0011_000000(upper) ; gpu print buffer to screen
|
||||
sd x23, 0b01_0010_000000(upper) ; gpu print 6x8 char
|
||||
lw x4, characters_plus_2(x1) ; width
|
||||
add x6, x6, x4 ; x position += width
|
||||
addi x0, x0, 1
|
||||
b loop
|
||||
|
||||
end:
|
||||
|
||||
sd x01, 0b01_0011_000000(upper) ; gpu print buffer to screen
|
||||
wfi
|
35
programs/parva/gpu_print_1
Normal file
35
programs/parva/gpu_print_1
Normal file
|
@ -0,0 +1,35 @@
|
|||
font_data:
|
||||
.data 0x8b18a9 0xf9a9d7 0xeba9a0 0xdeadbe 0xefdead 0xbeefde...
|
||||
|
||||
.export _start:
|
||||
li x0, font_data
|
||||
li x1, 16 # font data array length
|
||||
add x3, x0, x1
|
||||
|
||||
loop_1:
|
||||
lw x2, 0(x0)
|
||||
gpu.sw x2, 0(x1)
|
||||
addi x0, 1
|
||||
blt x0, x3 loop_1
|
||||
|
||||
li x6, 0
|
||||
loop_2:
|
||||
kb.rw x0
|
||||
beq x0, x6, loop_2
|
||||
|
||||
and x1, x0, 0x0f
|
||||
li x4, 2 # x position
|
||||
li x5, 2 # y position
|
||||
|
||||
# first char
|
||||
srl x1, x0, 4
|
||||
gpu.move x4, x5
|
||||
gpu.pchar x1
|
||||
|
||||
# second char
|
||||
addi x4, x4, 6
|
||||
gpu.move x4, x5
|
||||
gpu.pchar x1
|
||||
|
||||
gpu.swap
|
||||
b loop_2
|
33
programs/parva/memtest_1.lbpasm
Normal file
33
programs/parva/memtest_1.lbpasm
Normal file
|
@ -0,0 +1,33 @@
|
|||
li x0, program_end ; x0 = start
|
||||
li x1, 0xff ; x1 = end
|
||||
|
||||
mv x2, x0
|
||||
|
||||
loop_write:
|
||||
|
||||
xori x3, x2, 0xaaa
|
||||
sw x3, 0(x2)
|
||||
addi x2, x2, 1
|
||||
ble x2, x1, loop_write
|
||||
|
||||
mv x2, x0
|
||||
|
||||
loop_read:
|
||||
|
||||
xori x3, x2, 0xaaa
|
||||
lw x4, 0(x2)
|
||||
bne x3, x4, error
|
||||
addi x2, x2, 1
|
||||
ble x2, x1, loop_read
|
||||
|
||||
success:
|
||||
|
||||
li x0, 0
|
||||
wfi
|
||||
|
||||
error:
|
||||
|
||||
mv x0, x2
|
||||
wfi
|
||||
|
||||
program_end:
|
62
programs/parva/memtest_2.lbpasm
Normal file
62
programs/parva/memtest_2.lbpasm
Normal file
|
@ -0,0 +1,62 @@
|
|||
li x0, program_end
|
||||
li x1, 512
|
||||
|
||||
mv x2, x0
|
||||
|
||||
.align 2
|
||||
loop_write_word:
|
||||
|
||||
xori x3, x2, 0xaaa
|
||||
sw x3, 0(x2)
|
||||
addi x2, x2, 1
|
||||
blt x2, x1, loop_write_word
|
||||
|
||||
mv x2, x0
|
||||
|
||||
.align 2
|
||||
loop_read_word:
|
||||
|
||||
xori x3, x2, 0xaaa
|
||||
lw x4, 0(x2)
|
||||
bne x3, x4, error
|
||||
addi x2, x2, 1
|
||||
blt x2, x1, loop_read_word
|
||||
|
||||
.align 2
|
||||
loop_write_double:
|
||||
|
||||
xori x6, x2, 0xaaa
|
||||
xori x7, x2, 0x555
|
||||
sd x67, 0(x2)
|
||||
addi x2, x2, 2
|
||||
blt x2, x1, loop_write_double
|
||||
|
||||
mv x2, x0
|
||||
|
||||
.align 2
|
||||
loop_read_double:
|
||||
|
||||
xori x6, x2, 0xaaa
|
||||
xori x7, x2, 0x555
|
||||
ld x45, 0(x2)
|
||||
bne x4, x6, error
|
||||
bne x5, x7, error
|
||||
lw x4, 0(x2)
|
||||
bne x4, x6, error
|
||||
lw x5, 1(x2)
|
||||
bne x5, x7, error
|
||||
addi x2, x2, 2
|
||||
blt x2, x1, loop_read_double
|
||||
|
||||
success:
|
||||
|
||||
li x0, 0
|
||||
wfi
|
||||
|
||||
error:
|
||||
|
||||
mv x0, x2
|
||||
wfi
|
||||
|
||||
.align 2
|
||||
program_end:
|
16
programs/parva/multiply_1.lbpasm
Normal file
16
programs/parva/multiply_1.lbpasm
Normal file
|
@ -0,0 +1,16 @@
|
|||
li a0, 420
|
||||
li a1, 69
|
||||
|
||||
multiply:
|
||||
li t0, 0
|
||||
loop:
|
||||
andi t1, a1, 1
|
||||
beqz t1, no_add
|
||||
add t0, t0, a0
|
||||
no_add:
|
||||
slli a0, a0, 1
|
||||
srli a1, a1, 1
|
||||
bnez a1, loop
|
||||
mv a0, t0
|
||||
j ra
|
||||
|
105
programs/parva/pythagorean_triples_1.lbpasm
Normal file
105
programs/parva/pythagorean_triples_1.lbpasm
Normal file
|
@ -0,0 +1,105 @@
|
|||
; calculate all primitive pythogorean triples (a^2 + b^2 = c^2) where c <= 32
|
||||
|
||||
nop
|
||||
b _start
|
||||
|
||||
results:
|
||||
.repeat 0 15
|
||||
|
||||
table:
|
||||
.repeat 0 33
|
||||
|
||||
result_index:
|
||||
.data 0
|
||||
|
||||
_start:
|
||||
|
||||
li x7, 32 ; limit
|
||||
li x0, 1 ; prime
|
||||
li x2, 1 ; prime factor bit
|
||||
slli x2, x2, 23
|
||||
|
||||
loop_prime:
|
||||
|
||||
addi x0, x0, 1
|
||||
bgt x0, x7, squares
|
||||
lw x4, table(x0)
|
||||
srli x4, x4, 12
|
||||
bnez x4, loop_prime
|
||||
mv x3, x0 ; multiple
|
||||
|
||||
loop_index:
|
||||
|
||||
lw x4, table(x3) ; x4 = current prime factor bits
|
||||
or x4, x4, x2 ; x4 |= add current prime factor bit
|
||||
sw x4, table(x3)
|
||||
add x3, x3, x0
|
||||
ble x3, x7, loop_index
|
||||
srli x2, x2, 1 ; update prime bit
|
||||
b loop_prime
|
||||
|
||||
squares:
|
||||
|
||||
li x0, 0 ; n
|
||||
li x1, 0 ; n^2
|
||||
|
||||
loop_squares:
|
||||
|
||||
lw x4, table(x0) ; 70
|
||||
or x4, x4, x1
|
||||
sw x4, table(x0)
|
||||
add x1, x1, x0
|
||||
add x1, x1, x0
|
||||
addi x1, x1, 1
|
||||
addi x0, x0, 1
|
||||
ble x0, x7, loop_squares
|
||||
|
||||
li x0, 1 ; a = 1
|
||||
|
||||
iterate_a:
|
||||
|
||||
addi x0, x0, 1 ; 79
|
||||
bgt x0, x7, end
|
||||
lw x2, table(x0) ; a^2 (with prime bits)
|
||||
mv x6, x0 ; b = a
|
||||
|
||||
iterate_b:
|
||||
|
||||
addi x6, x6, 1 ; 83
|
||||
bgt x6, x7, iterate_a
|
||||
lw x3, table(x6) ; b^2 (with prime bits)
|
||||
and x4, x2, x3 ; check if a and b are coprime
|
||||
srli x4, x4, 12
|
||||
bnez x4, iterate_b ; 87
|
||||
add x3, x2, x3
|
||||
andi x3, x3, 0o77 ; a^2 + b^2
|
||||
mv x5, x6 ; x5 = c = b
|
||||
|
||||
; x0 = a, x1 = sp, x2 = a^2, x3 = a^2+b^2, x4 = (unused)
|
||||
; x5 = c, x6 = b, x7 = limit
|
||||
|
||||
iterate_c:
|
||||
|
||||
addi x5, x5, 1 ; c++ ; 92
|
||||
bgt x5, x7, iterate_b
|
||||
lw x4, table(x5) ; x4 = c^2|cp
|
||||
andi x4, x4, 0o77 ; x4 = c^2
|
||||
bgt x4, x3, iterate_b
|
||||
bne x5, x3, iterate_c
|
||||
|
||||
; found triple
|
||||
|
||||
; x0 = a, x6 = b, x5 = c
|
||||
|
||||
lw x4, result_index
|
||||
sw x0, 0(x4)
|
||||
sw x6, 1(x4)
|
||||
sw x5, 2(x4)
|
||||
addi x4, x4, 3
|
||||
sw x4, result_index
|
||||
|
||||
b iterate_a
|
||||
|
||||
end:
|
||||
|
||||
wfi
|
273
programs/parva/pythagorean_triples_2.lbpasm
Normal file
273
programs/parva/pythagorean_triples_2.lbpasm
Normal file
|
@ -0,0 +1,273 @@
|
|||
; calculate all primitive pythogorean triples (a^2 + b^2 = c^2) where c <= 32
|
||||
|
||||
.eq limit 32
|
||||
|
||||
li sp, stack
|
||||
|
||||
li x0, 1
|
||||
sw x0, cursor_x
|
||||
sw x0, cursor_y
|
||||
|
||||
sw x0, gpu_clear_screen(upper)
|
||||
|
||||
# main stack frame:
|
||||
# sp-(limit + 2): table
|
||||
# sp-2: a
|
||||
# sp-1: a^2
|
||||
main:
|
||||
li x7, limit # limit
|
||||
mv x6, sp # x6 = table base
|
||||
add sp, sp, x7
|
||||
addi sp, sp, 2 # reserve rest of stack frame
|
||||
|
||||
# --- zero-fill table ---
|
||||
|
||||
mv x5, x6
|
||||
li x2, 0
|
||||
|
||||
.align 2
|
||||
main__clear_table:
|
||||
sw x2, 0(x5)
|
||||
addi x5, x5, 1
|
||||
ble x5, sp, main__clear_table
|
||||
|
||||
# --- calculate primes factors ---
|
||||
|
||||
li x0, 1 # x0 = prime
|
||||
li x2, 1 # x2 = prime factor bit
|
||||
|
||||
main__primes:
|
||||
|
||||
addi x0, x0, 1
|
||||
bgt x0, x7, main__primes_end
|
||||
add x4, x6, x0
|
||||
lw x4, 0(x4)
|
||||
bnez x4, main__primes
|
||||
|
||||
mv x3, x0 # x3 = multiple
|
||||
|
||||
main__multiples:
|
||||
|
||||
add x5, x6, x3
|
||||
lw x4, 0(x5) # x4 = current prime factor bits
|
||||
or x4, x4, x2 # x4 |= add current prime factor bit
|
||||
sw x4, 0(x5)
|
||||
add x3, x3, x0
|
||||
ble x3, x7, main__multiples
|
||||
|
||||
slli x2, x2, 1 # update prime bit
|
||||
b main__primes
|
||||
|
||||
main__primes_end:
|
||||
|
||||
# --- find pythagorean triples ---
|
||||
|
||||
li x0, 1 # a = 1
|
||||
|
||||
main__iterate_a:
|
||||
|
||||
lw x0, -2(sp)
|
||||
addi x0, x0, 1 # x0 = a
|
||||
sw x0, -2(sp)
|
||||
bge x0, x7, main__end
|
||||
mulu x2, x0, x0 # x2 = a^2
|
||||
sw x2, -1(sp)
|
||||
add x3, x6, x0
|
||||
lw x3, 0(x3) # x3 = a prime factors
|
||||
|
||||
mv x4, x0 # x4 = b
|
||||
|
||||
main__iterate_b:
|
||||
|
||||
addi x4, x4, 1
|
||||
bgt x4, x7, main__iterate_a
|
||||
add x5, x6, x4
|
||||
lw x5, 0(x5) # x5 = b prime factors
|
||||
and x5, x5, x3
|
||||
bnez x5, main__iterate_b # check if a and b are coprime
|
||||
mulu x5, x4, x4
|
||||
lw x0, -1(sp) # x0 = a^2
|
||||
add x5, x5, x0 # x5 = a^2 + b^2
|
||||
|
||||
mv x0, x4 # x0 = c
|
||||
|
||||
addi x2, x0, 1
|
||||
mulu x2, x2, x2
|
||||
bgt x2, x5, main__iterate_a
|
||||
|
||||
main__iterate_c:
|
||||
|
||||
addi x0, x0, 1 ; c += 1
|
||||
mulu x2, x0, x0 # x2 = c^2
|
||||
bgt x2, x5, main__iterate_b
|
||||
bne x2, x5, main__iterate_c
|
||||
|
||||
# found triple
|
||||
|
||||
push x6
|
||||
push x7
|
||||
push x0
|
||||
push x4
|
||||
lw a0, -6(sp)
|
||||
call print_number
|
||||
|
||||
lw x6, cursor_x
|
||||
addi x6, x6, 4
|
||||
sw x6, cursor_x
|
||||
|
||||
pop a0
|
||||
call print_number
|
||||
|
||||
lw x6, cursor_x
|
||||
addi x6, x6, 4
|
||||
sw x6, cursor_x
|
||||
|
||||
pop a0
|
||||
call print_number
|
||||
|
||||
# newline
|
||||
li x6, 1
|
||||
sw x6, cursor_x
|
||||
lw x7, cursor_y
|
||||
addi x7, x7, 6
|
||||
sw x7, cursor_y
|
||||
|
||||
pop x7
|
||||
pop x6
|
||||
|
||||
b main__iterate_a
|
||||
|
||||
main__end:
|
||||
|
||||
wfi
|
||||
# end main()
|
||||
|
||||
.eq gpu_clear_screen 0b01_0100_000000
|
||||
.eq gpu_move_cursor 0b01_0000_000000
|
||||
.eq gpu_print_char 0b01_0010_000000
|
||||
.eq gpu_show_buffer 0b01_0011_000000
|
||||
|
||||
cursor_x:
|
||||
.data 1
|
||||
cursor_y:
|
||||
.data 1
|
||||
|
||||
# void print_number(*void return: ra, int number: a0)
|
||||
print_number:
|
||||
push ra
|
||||
mv x0, a0
|
||||
li x2, 0
|
||||
|
||||
.align 2
|
||||
# https://ridiculousfish.com/blog/posts/labor-of-division-episode-i.html
|
||||
print_number__bin_to_dec_loop:
|
||||
lw x4, print_number__ten_powers(x2)
|
||||
|
||||
beqz x4, print_number__end_bin_to_dec_loop
|
||||
slli x5, x2, 1
|
||||
|
||||
lw x3, print_number__ten_divisors(x5)
|
||||
|
||||
mulhu x6, x0, x3
|
||||
sub x7, x0, x6
|
||||
|
||||
srli x7, x7, 1
|
||||
lw x5, (print_number__ten_divisors + 1)(x5)
|
||||
|
||||
add x3, x7, x6
|
||||
srl x3, x3, x5 # x3 = digit of result
|
||||
|
||||
sw x3, print_number__result_string(x2)
|
||||
mulu x3, x3, x4
|
||||
|
||||
sub x0, x0, x3
|
||||
addi x2, x2, 1
|
||||
|
||||
b print_number__bin_to_dec_loop
|
||||
print_number__end_bin_to_dec_loop:
|
||||
|
||||
sw x0, print_number__result_string(x2)
|
||||
li x0, -1
|
||||
lw x6, cursor_x
|
||||
lw x7, cursor_y
|
||||
print_number__skip_zeroes:
|
||||
addi x0, x0, 1
|
||||
lw x4, print_number__result_string(x0)
|
||||
beqz x4, print_number__skip_zeroes
|
||||
print_number__print_loop:
|
||||
sd x67, gpu_move_cursor(upper)
|
||||
nop
|
||||
nop
|
||||
nop # give time for the cursor to move
|
||||
lw x4, print_number__result_string(x0)
|
||||
bltz x4, print_number__end_print_loop
|
||||
slli x4, x4, 1
|
||||
lw x2, print_number__char_pixels(x4)
|
||||
lw x3, (print_number__char_pixels + 1)(x4)
|
||||
addi x6, x6, 4
|
||||
addi x0, x0, 1
|
||||
sd x23, gpu_print_char(upper)
|
||||
b print_number__print_loop
|
||||
print_number__end_print_loop:
|
||||
sd x01, gpu_show_buffer(upper) # gpu show buffer
|
||||
sw x6, cursor_x
|
||||
pop ra
|
||||
j ra
|
||||
|
||||
print_number__ten_powers:
|
||||
.data 10000000
|
||||
.data 1000000
|
||||
.data 100000
|
||||
.data 10000
|
||||
.data 1000
|
||||
.data 100
|
||||
.data 10
|
||||
.data 0
|
||||
|
||||
print_number__ten_divisors:
|
||||
.data 0xad7f2a 23 # 10000000
|
||||
.data 0x0c6f7b 19 # 1000000
|
||||
.data 0x4f8b59 16 # 100000
|
||||
.data 0xa36e2f 13 # 10000
|
||||
.data 0x0624de 9 # 1000
|
||||
.data 0x47ae15 6 # 100
|
||||
.data 0x99999a 3 # 10
|
||||
|
||||
print_number__char_pixels:
|
||||
.data 0b111000_101000_101000_101000 # 0
|
||||
.data 0b111000_000000_000000_000000
|
||||
|
||||
.data 0b001000_001000_001000_001000 # 1
|
||||
.data 0b001000_000000_000000_000000
|
||||
|
||||
.data 0b111000_001000_111000_100000 # 2
|
||||
.data 0b111000_000000_000000_000000
|
||||
|
||||
.data 0b111000_001000_111000_001000 # 3
|
||||
.data 0b111000_000000_000000_000000
|
||||
|
||||
.data 0b101000_101000_111000_001000 # 4
|
||||
.data 0b001000_000000_000000_000000
|
||||
|
||||
.data 0b111000_100000_111000_001000 # 5
|
||||
.data 0b111000_000000_000000_000000
|
||||
|
||||
.data 0b111000_100000_111000_101000 # 6
|
||||
.data 0b111000_000000_000000_000000
|
||||
|
||||
.data 0b111000_001000_001000_010000 # 7
|
||||
.data 0b010000_000000_000000_000000
|
||||
|
||||
.data 0b111000_101000_111000_101000 # 8
|
||||
.data 0b111000_000000_000000_000000
|
||||
|
||||
.data 0b111000_101000_111000_001000 # 9
|
||||
.data 0b001000_000000_000000_000000
|
||||
print_number__result_string:
|
||||
.repeat 0 8
|
||||
.data -1
|
||||
# end print_number()
|
||||
|
||||
.align 2
|
||||
stack:
|
||||
.data 0
|
197
programs/parva/tetris_1.lbpasm
Normal file
197
programs/parva/tetris_1.lbpasm
Normal file
|
@ -0,0 +1,197 @@
|
|||
.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: .cstring "tet_hiscr.dat"
|
||||
hi_score_file_error_message: .cstring .line_break 10 "could not open or create hi score file"
|
||||
score_string: .cstring "score"
|
||||
game_over_string: .cstring "game over"
|
||||
.scores_button_string: .cstring "scores"
|
||||
.start_button_string: .cstring "start"
|
||||
.next_string: .cstring "next"
|
||||
|
||||
.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
|
||||
|
||||
beqz, x0, wait
|
||||
li x1, const.char.left_arrow
|
||||
beq x0, x1, move_left
|
||||
li x1, const.char.right_arrow
|
||||
beq x0, x1, move_right
|
||||
li x1, const.char.up_arrow
|
||||
|
||||
beq x0, x1, rotate
|
||||
li x1, const.char.down_arrow
|
||||
beq x0, x1, slow_drop
|
||||
li x1, const.char.space
|
||||
beq x0, x1, hard_drop
|
||||
li x1, const.char.backspace
|
||||
|
||||
beq x0, x1, 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
|
||||
ll x01 block_table(x2)
|
||||
|
||||
.align 2
|
||||
move_left:
|
||||
|
||||
slli x0, x4, 1
|
||||
and x0, x0, x6
|
||||
bneqz x0, fail
|
||||
slli x0, x5, 1
|
||||
and x0, x0, x7
|
||||
bneqz x0, fail
|
||||
|
||||
slli x4, x4, 1
|
||||
slli x5, x5, 1
|
||||
b move_successful
|
||||
|
||||
.align 2
|
||||
move_right:
|
||||
|
||||
srli x0, x4, 1
|
||||
and x0, x0, x6
|
||||
bneqz x0, fail
|
||||
srli x0, x5, 1
|
||||
and x0, x0, x7
|
||||
bneqz 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
|
||||
and x2, x0, 0o77
|
||||
blt x2, x3, end_score_change
|
||||
add x0, x0, x1
|
||||
|
||||
slli x1, x1, 6
|
||||
srli x2, x0, 6
|
||||
and x2, x0, 0o77
|
||||
blt x2, x3, end_score_change
|
||||
add x0, x0, x1
|
||||
slli x1, x1, 6
|
||||
|
||||
srli x2 x0, 6
|
||||
and x2, x0, 0o77
|
||||
blt x2, x3, end_score_change
|
||||
add x0, x0, x1
|
||||
|
||||
.align 2
|
||||
end_score_change:
|
||||
|
||||
sw x0, score
|
||||
|
||||
|
||||
|
||||
|
||||
quit:
|
||||
|
||||
|
||||
|
||||
pop ra
|
30
programs/v8/test
Normal file
30
programs/v8/test
Normal file
|
@ -0,0 +1,30 @@
|
|||
LDB #$F0
|
||||
JNC bankNoCarry
|
||||
NOT B
|
||||
bankNoCarry:
|
||||
LDA $00
|
||||
AND B,A
|
||||
OR D,A
|
||||
STA $00
|
||||
RET
|
||||
|
||||
; Memory copy: A=start, B=offset, length=C, destroys D
|
||||
copyLoop:
|
||||
LDD $00,A
|
||||
ADC B,A
|
||||
STD $00,A
|
||||
DEC C
|
||||
JNZ copyLoop
|
||||
RET
|
||||
|
||||
; Memory copy to screen: A=start, destroys C, D, screen address register
|
||||
LDD #$80
|
||||
LDC D
|
||||
STD $03
|
||||
screenCopyLoop:
|
||||
|
||||
LDD $00,A
|
||||
STD $02
|
||||
DEC C
|
||||
JNZ screenCopyLoop
|
||||
RET
|
Loading…
Add table
Add a link
Reference in a new issue