diff --git a/code/graphics_system/dsl.s b/code/graphics_system/dsl.s index d132308..a369934 100644 --- a/code/graphics_system/dsl.s +++ b/code/graphics_system/dsl.s @@ -4,6 +4,7 @@ ; Load load_imm equ li ; dst_reg, immeidate value (signed) load_uimm equ lui ; dst_reg, immediate value (unsigned) +load_word equ lw ; dst_reg, offset(src_reg0) (offset is immediate value) ; Store store_word equ sw ; src_reg, dst_address ; Addition @@ -26,6 +27,8 @@ jump_reg equ jr ; address: register jump_nreg equ jrl ; subroutine: register ; Registers +; Stack +rstack_ptr equ $sp ; I have this but won't really use the alias.. ; Temporaries, may be changed by subroutines rtmp_0 equ $t0 rtmp_1 equ $t1 @@ -51,3 +54,15 @@ rret_0 equ $v0 rret_1 equ $v1 ; Subroutine return address when doing a sub rret_addr equ $ra + +; Data Widths +byte equ 1 +word equ 4 + +.macro stack_alloc, amount + add_ui $sp, - amount +.endmacro + +.macro stack_release, amount + add_ui $sp, amount +.endmacro diff --git a/code/graphics_system/gp.s b/code/graphics_system/gp.s index 669f931..88c3e1d 100644 --- a/code/graphics_system/gp.s +++ b/code/graphics_system/gp.s @@ -119,6 +119,8 @@ gp_b10_Y equ 10 gp_b16_X equ 0 gp_b16_Y equ 16 +gp_vec2 equ word + .macro gp_push_pak, port, reg_scratch, packet load_imm reg_scratch, packet store_word reg_scratch, port @@ -131,23 +133,23 @@ gp_b16_Y equ 16 .org 0x80010000 + 2000 .func gp_draw_tri_flat ;( - @@io_offset equ rarg_0 - @@color equ rarg_1 - @@vert_1 equ rarg_2 - @@vert_2 equ rarg_3 - @@vert_3 equ rstatic_0 + gp_draw_tri_flat__sp_size equ (3 * gp_vec2) + @@io_offset equ rarg_0 ; io_offset: word + @@color equ rarg_1 ; color: word + @@verts equ $sp ; verts: [3]gp_vec2 ;) - @@cmd equ rtmp_2 - load_imm @@cmd, gp_Polygon - or @@cmd, @@cmd, @@color - store_word @@cmd, gpio_port0(@@io_offset) - store_word @@vert_1, gpio_port0(@@io_offset) - store_word @@vert_2, gpio_port0(@@io_offset) - store_word @@vert_3, gpio_port0(@@io_offset) + @@vert_id equ rtmp_1 + @@cmd equ rtmp_2 + load_imm @@cmd, gp_Polygon + or @@cmd, @@cmd, @@color + store_word @@cmd, gpio_port0(@@io_offset) + load_word @@vert_id, 0 * gp_vec2(@@verts) :: nop :: store_word @@vert_id, gpio_port0(@@io_offset) + load_word @@vert_id, 1 * gp_vec2(@@verts) :: nop :: store_word @@vert_id, gpio_port0(@@io_offset) + load_word @@vert_id, 2 * gp_vec2(@@verts) :: nop :: store_word @@vert_id, gpio_port0(@@io_offset) jump_reg rret_addr :: nop .endfunc -.func gp_draw_tri_grouand ;( +.func gp_draw_tri_gouraud ;( @@io_offset equ rarg_0 @@color equ rarg_1 @@color_2 equ rstatic_1 diff --git a/code/graphics_system/hello_gp_routines.s b/code/graphics_system/hello_gp_routines.s index f8ea47a..74e1fa4 100644 --- a/code/graphics_system/hello_gp_routines.s +++ b/code/graphics_system/hello_gp_routines.s @@ -46,26 +46,28 @@ main: gcmd_push gp0, rtmp_1, -30 * -1 + Display_HalfHeight << gp_b16_Y | -100 + Display_HalfWidth << gp_b16_X gcmd_push gp0, rtmp_1, -50 * -1 + Display_HalfHeight << gp_b16_Y | 55 + Display_HalfWidth << gp_b16_X ; Draw a flat-shaded triangle - move rarg_0, reg_io_offset ; arg 1 for gp_draw_tri_flat - load_imm rarg_1, Color_PS_GoldenPoppy - load_imm rarg_2, 100 * -1 + Display_HalfHeight << gp_b16_Y | -100 + Display_HalfWidth << gp_b16_X - load_imm rarg_3, 20 * -1 + Display_HalfHeight << gp_b16_Y | 20 + Display_HalfWidth << gp_b16_X - load_imm rstatic_0, 50 * -1 + Display_HalfHeight << gp_b16_Y | 30 + Display_HalfWidth << gp_b16_X + stack_alloc gp_draw_tri_flat__sp_size ; (used for following call) + move rarg_0, reg_io_offset ; (used for following call) + load_imm rarg_1, Color_PS_GoldenPoppy + load_imm rarg_2, 100 * -1 + Display_HalfHeight << gp_b16_Y | -100 + Display_HalfWidth << gp_b16_X :: sw rarg_2, 0 * gp_vec2($sp) + load_imm rarg_2, 20 * -1 + Display_HalfHeight << gp_b16_Y | 20 + Display_HalfWidth << gp_b16_X :: sw rarg_2, 1 * gp_vec2($sp) + load_imm rarg_2, 50 * -1 + Display_HalfHeight << gp_b16_Y | 30 + Display_HalfWidth << gp_b16_X :: sw rarg_2, 2 * gp_vec2($sp) jump_nlink gp_draw_tri_flat :: nop ; Bonus traingle - load_imm rarg_1, Color_PS_CadmiumRed - load_imm rarg_2, 50 * -1 + Display_HalfHeight << gp_b16_Y | -100 + Display_HalfWidth << gp_b16_X - load_imm rarg_3, 0 * -1 + Display_HalfHeight << gp_b16_Y | 20 + Display_HalfWidth << gp_b16_X - load_imm rstatic_0, -100 * -1 + Display_HalfHeight << gp_b16_Y | 30 + Display_HalfWidth << gp_b16_X + load_imm rarg_1, Color_PS_CadmiumRed + load_imm rarg_2, 50 * -1 + Display_HalfHeight << gp_b16_Y | -100 + Display_HalfWidth << gp_b16_X :: sw rarg_2, 0 * gp_vec2($sp) + load_imm rarg_2, 0 * -1 + Display_HalfHeight << gp_b16_Y | 20 + Display_HalfWidth << gp_b16_X :: sw rarg_2, 1 * gp_vec2($sp) + load_imm rarg_2, -100 * -1 + Display_HalfHeight << gp_b16_Y | 30 + Display_HalfWidth << gp_b16_X :: sw rarg_2, 2 * gp_vec2($sp) jump_nlink gp_draw_tri_flat :: nop + stack_release gp_draw_tri_flat__sp_size ; Gourand shaded triangle load_imm rarg_1, Color_PS_PersianGreen load_imm rstatic_1, Color_PS_GoldenPoppy load_imm rstatic_2, Color_PS_CadmiumRed - load_imm rarg_2, -35 * -1 + Display_HalfHeight << gp_b16_Y | 145 + Display_HalfWidth << gp_b16_X - load_imm rarg_3, 0 * -1 + Display_HalfHeight << gp_b16_Y | 50 + Display_HalfWidth << gp_b16_X - load_imm rstatic_0, 40 * -1 + Display_HalfHeight << gp_b16_Y | 60 + Display_HalfWidth << gp_b16_X - jump_nlink gp_draw_tri_grouand :: nop + load_imm rarg_2, -35 * -1 + Display_HalfHeight << gp_b16_Y | 145 + Display_HalfWidth << gp_b16_X + load_imm rarg_3, 0 * -1 + Display_HalfHeight << gp_b16_Y | 50 + Display_HalfWidth << gp_b16_X + load_imm rstatic_0, 40 * -1 + Display_HalfHeight << gp_b16_Y | 60 + Display_HalfWidth << gp_b16_X + jump_nlink gp_draw_tri_gouraud :: nop idle: jump idle :: nop