hello gp routines

This commit is contained in:
2025-08-03 22:01:36 -04:00
parent 0a47b03dfa
commit 6e7809848b
6 changed files with 135 additions and 91 deletions
+9
View File
@@ -32,6 +32,15 @@ rtmp_1 equ $t1
rtmp_2 equ $t2 rtmp_2 equ $t2
rtmp_3 equ $t3 rtmp_3 equ $t3
rtmp_4 equ $t4 rtmp_4 equ $t4
; Static Variables
rstatic_0 equ $s0
rstatic_1 equ $s1
rstatic_2 equ $s2
rstatic_3 equ $s3
rstatic_4 equ $s4
rstatic_5 equ $s5
rstatic_6 equ $s6
rstatic_7 equ $s7
; Subroutine arguments ; Subroutine arguments
rarg_0 equ $a0 rarg_0 equ $a0
rarg_1 equ $a1 rarg_1 equ $a1
+40
View File
@@ -127,3 +127,43 @@ gp_b16_Y equ 16
load_imm reg_scratch, cmd load_imm reg_scratch, cmd
store_word reg_scratch, port store_word reg_scratch, port
.endmacro .endmacro
.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
;)
@@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)
jump_reg rret_addr :: nop
.endfunc
.func gp_draw_tri_grouand ;(
@@io_offset equ rarg_0
@@color equ rarg_1
@@color_2 equ rstatic_1
@@color_3 equ rstatic_2
@@vert_1 equ rarg_2
@@vert_2 equ rarg_3
@@vert_3 equ rstatic_0
;)
@@cmd equ rtmp_2
load_imm @@cmd, gp_Polygon | gp_Poly_ShadeGourand
or @@cmd, @@cmd, @@color
store_word @@cmd, gpio_port0(@@io_offset)
store_word @@vert_1, gpio_port0(@@io_offset)
store_word @@color_2, gpio_port0(@@io_offset)
store_word @@vert_2, gpio_port0(@@io_offset)
store_word @@color_3, gpio_port0(@@io_offset)
store_word @@vert_3, gpio_port0(@@io_offset)
jump_reg rret_addr :: nop
.endfunc
+5 -6
View File
@@ -27,11 +27,11 @@ main:
gp1 equ gpio_port1(reg_io_offset) gp1 equ gpio_port1(reg_io_offset)
; Setup Display Control ; Setup Display Control
gcmd_push gp0, rtmp_1, gp_Reset gcmd_push gp1, rtmp_1, gp_Reset
gcmd_push gp0, rtmp_1, gp_DisplayEnabled gcmd_push gp1, rtmp_1, gp_DisplayEnabled
gcmd_push gp0, rtmp_1, gp_DisplayMode_320x240_15bit_NTSC gcmd_push gp1, rtmp_1, gp_DisplayMode_320x240_15bit_NTSC
gcmd_push gp0, rtmp_1, gp_HorizontalDisplayRange_3168_608 gcmd_push gp1, rtmp_1, gp_HorizontalDisplayRange_3168_608
gcmd_push gp0, rtmp_1, gp_VerticalDisplayRange_264_24 gcmd_push gp1, rtmp_1, gp_VerticalDisplayRange_264_24
gcmd_push gp0, rtmp_1, gp_ModeSetting_DipArea gcmd_push gp0, rtmp_1, gp_ModeSetting_DipArea
gcmd_push gp0, rtmp_1, gp_SetArea_TopLeft | 0 << gp_b10_Y | 0 << gp_b10_X gcmd_push gp0, rtmp_1, gp_SetArea_TopLeft | 0 << gp_b10_Y | 0 << gp_b10_X
gcmd_push gp0, rtmp_1, gp_SetArea_BottomRight | Display_Height << gp_b10_Y | Display_Width << gp_b10_X gcmd_push gp0, rtmp_1, gp_SetArea_BottomRight | Display_Height << gp_b10_Y | Display_Width << gp_b10_X
@@ -67,4 +67,3 @@ idle:
jump idle :: nop jump idle :: nop
.close .close
+73
View File
@@ -0,0 +1,73 @@
.psx
.create "./build/hello_gp_routines.bin", 0x80010000
.include "./code/graphics_system/dsl.s"
.include "./code/graphics_system/gp.s"
; Entry Point of Code
.org 0x80010000
Color_RedFF equ 0x0000FF
Color_22 equ 0x222222
Color_PS_CadmiumRed equ 0x2400DF
Color_PS_CelticBlue equ 0x723F00
Color_PS_GoldenPoppy equ 0x00C3F3
Color_PS_PersianGreen equ 0x9FAC00
Display_Width equ 320
Display_Height equ 239
Display_HalfWidth equ 320 / 2
Display_HalfHeight equ 240 / 2
main:
reg_io_offset equ rtmp_0
load_uimm rtmp_0, IO_BASE_ADDR
gp0 equ gpio_port0(reg_io_offset)
gp1 equ gpio_port1(reg_io_offset)
; Setup Display Control
gcmd_push gp1, rtmp_1, gp_Reset
gcmd_push gp1, rtmp_1, gp_DisplayEnabled
gcmd_push gp1, rtmp_1, gp_DisplayMode_320x240_15bit_NTSC
gcmd_push gp1, rtmp_1, gp_HorizontalDisplayRange_3168_608
gcmd_push gp1, rtmp_1, gp_VerticalDisplayRange_264_24
gcmd_push gp0, rtmp_1, gp_ModeSetting_DipArea
gcmd_push gp0, rtmp_1, gp_SetArea_TopLeft | 0 << gp_b10_Y | 0 << gp_b10_X
gcmd_push gp0, rtmp_1, gp_SetArea_BottomRight | Display_Height << gp_b10_Y | Display_Width << gp_b10_X
gcmd_push gp0, rtmp_1, gp_SetOffset | 0 << gp_b10_Y | 0 << gp_b10_X
gcmd_push gp0, rtmp_1, gp_RectFillVM | Color_22
gcmd_push gp0, rtmp_1, 0 << gp_b16_Y | 0 << gp_b16_X
gcmd_push gp0, rtmp_1, Display_Height << gp_b16_Y | Display_Width << gp_b16_X
; Draw a flat-shaded quad
gcmd_push gp0, rtmp_1, gp_Quad | Color_PS_CelticBlue
gcmd_push gp0, rtmp_1, 15 * -1 + Display_HalfHeight << gp_b16_Y | 0 + Display_HalfWidth << gp_b16_X
gcmd_push gp0, rtmp_1, 24 * -1 + Display_HalfHeight << gp_b16_Y | 100 + Display_HalfWidth << gp_b16_X
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
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
jump_nlink gp_draw_tri_flat :: nop
; 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
idle:
jump idle :: nop
.close
@@ -1,78 +0,0 @@
.psx
.create "./build/hellogpu_instructors.bin", 0x80010000
.org 0x80010000
; ---------------------
; IO Port
; ---------------------
IO_BASE_ADDR equ 0x1F80 ; IO Ports Memory map base address
; ---------------------
; GPU Registers
; ---------------------
GP0 equ 0x1810 ; GP0 @ $1F801810: Rendering data & VRAM Access
GP1 equ 0x1814 ; GP1 @ $1F801814: Display Control & Environment setup
Main:
lui $t0, IO_BASE_ADDR ; t0 = I/O Port Base Address (mapped at 0x1F80****)
; ---------------------------------------------------------------------------
; Send commands to GP1 (mapped at 0x1F801814)
; These GP1 is for display control and environment setup
; (Command = 8-Bit MSB, Parameter = 24-Bit LSB)
; CCPPPPPP: CC=Command PPPPPP=Parameter
; ---------------------------------------------------------------------------
li $t1, 0x00000000 ; 00 = Reset GPU
sw $t1, GP1($t0) ; Write to GP1
li $t1, 0x03000000 ; 03 = Display enable
sw $t1, GP1($t0) ; Write to GP1
li $t1, 0x08000001 ; 08 = Display mode (320x240, 15-bit, NTSC)
sw $t1, GP1($t0) ; Write to GP1
li $t1, 0x06C60260 ; 06 = Horz Display Range - 0bxxxxxxxxxxXXXXXXXXXX (3168..608)
sw $t1, GP1($t0) ; Write to GP1
li $t1, 0x07042018 ; 07 = Vert Display Range - 0byyyyyyyyyyYYYYYYYYYY (264..24)
sw $t1, GP1($t0) ; Write to GP1
; ---------------------------------------------------------------------------
; Send commands to GP0 (mapped at 0x1F801810)
; These GP0 commands are to setup the drawing area
; (Command = 8-Bit MSB, Parameter = 24-Bit LSB)
; CCPPPPPP CC=Command PPPPPP=Parameter
; ---------------------------------------------------------------------------
li $t1, 0xE1000400 ; E1 = Draw Mode Settings
sw $t1, GP0($t0) ; Write to GP0
li $t1, 0xE3000000 ; E3 = Drawing Area TopLeft - 0bYYYYYYYYYYXXXXXXXXXX (10 bits for Y and X)
sw $t1, GP0($t0) ; Write to GP0
li $t1, 0xE403BD3F ; E4 = Drawing area BottomRight - 0bYYYYYYYYYYXXXXXXXXXX (10 bits for X=319 and Y=239)
sw $t1, GP0($t0) ; Write to GP0
li $t1, 0xE5000000 ; E5 = Drawing Offset - 0bYYYYYYYYYYYXXXXXXXXXXXX (X=0, Y=0)
sw $t1, GP0($t0) ; Write to GP0
; ---------------------------------------------------------------------------
; Clear the screen (draw a rectangle on VRAM).
; ---------------------------------------------------------------------------
li $t1, 0x020000FF ; 02 = Fill Rectancle in VRAM (Parameter Color: 0xBBGGRR)
sw $t1, GP0($t0) ; Write GP0 Command
li $t1, 0x00000000 ; Fill Area, Parameter: 0xYYYYXXXX - Topleft (0,0)
sw $t1, GP0($t0) ; Write to GP0
li $t1, 0x00EF013F ; Fill Area, 0xHHHHWWWW (Height=239, Width=319)
sw $t1, GP0($t0) ; Write to GP0
; ---------------------------------------------------------------------------
; TODO: Draw a flat-shaded triangle
; ---------------------------------------------------------------------------
LoopForever:
j LoopForever ; Continuous loop
nop
.close
+8 -7
View File
@@ -32,10 +32,11 @@ function build-program { param(
write-host 'Done!' write-host 'Done!'
pop-location pop-location
} }
build-program 'fillmem' 'fillmem' # build-program 'fillmem' 'fillmem'
build-program 'warmup' 'exercise_1' # build-program 'warmup' 'exercise_1'
build-program 'warmup' 'exercise_2' # build-program 'warmup' 'exercise_2'
build-program 'warmup' 'exercise_3' # build-program 'warmup' 'exercise_3'
build-program 'factorial' 'factorial' # build-program 'factorial' 'factorial'
build-program 'graphics_system' 'hellogpu' # build-program 'graphics_system' 'hellogpu'
build-program 'graphics_system' 'hello_gouraud' # build-program 'graphics_system' 'hello_gouraud'
build-program 'graphics_system' 'hello_gp_routines'