Init commit

This commit is contained in:
Asraelite 2023-10-30 16:41:48 +01:00
commit c45ad79440
48 changed files with 6786 additions and 0 deletions

View file

@ -0,0 +1 @@
.asm_version 0.1

View 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

View 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

View 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

View 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:

View 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:

View 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

View 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

View 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

View 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

View 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

View 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

View 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

View 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:

View 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:

View 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

View 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

View 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

View 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
View 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