mirror of
https://gitlab.com/octtspacc/OcttBitsOfFun
synced 2025-02-19 21:10:36 +01:00
271 lines
8.3 KiB
NASM
271 lines
8.3 KiB
NASM
; PSX 'Bare Metal' Cube CPU Demo by krom (Peter Lemon):
|
|
; Joypad Control:
|
|
; Up, Down: -Y, +Y Translation
|
|
; Left, Right: -X, +X Translation
|
|
; L1, L2: -Z, +Z Translation
|
|
; Triangle, X: -X, +X Rotation
|
|
; Circle, Square: -Y, +Y Rotation
|
|
; R1, R2: -Z, +Z Rotation
|
|
.psx
|
|
.create "Cube.ps1.bin", 0x80010000
|
|
|
|
.include "LIB/PSX.INC" ; Include PSX Definitions
|
|
.include "LIB/PSX_GPU.INC" ; Include PSX GPU Definitions & Macros
|
|
.include "LIB/PSX_INPUT.INC" ; Include PSX Input Definitions & Macros
|
|
.include "LIB/3D.INC" ; Include 3D Definitions & Macros
|
|
|
|
.org 0x80010000 ; Entry Point Of Code
|
|
|
|
InitJoy PadBuffer ; Initialise Joypads & Setup VSync Wait Routine Using BIOS: Buffer Address
|
|
|
|
la a0,IO_BASE ; A0 = I/O Port Base Address ($1F80XXXX)
|
|
|
|
; Setup Screen Mode
|
|
WRGP1 GPURESET,0 ; Write GP1 Command Word (Reset GPU)
|
|
WRGP1 GPUDISPEN,0 ; Write GP1 Command Word (Enable Display)
|
|
WRGP1 GPUDISPM,HRES320+VRES240+BPP15+VNTSC ; Write GP1 Command Word (Set Display Mode: 320x240, 15BPP, NTSC)
|
|
WRGP1 GPUDISPH,0xC60260 ; Write GP1 Command Word (Horizontal Display Range 608..3168)
|
|
WRGP1 GPUDISPV,0x042018 ; Write GP1 Command Word (Vertical Display Range 24..264)
|
|
|
|
; Setup Drawing Area
|
|
WRGP0 GPUDRAWM,0x000508 ; Write GP0 Command Word (Drawing To Display Area Allowed Bit 10, Texture Page Colors = 15BPP Bit 7..8, Texture Page Y Base = 0 Bit 4, Texture Page X Base = 512 Bit 0..3)
|
|
WRGP0 GPUDRAWATL,0x000000 ; Write GP0 Command Word (Set Drawing Area Top Left X1=0, Y1=0)
|
|
WRGP0 GPUDRAWABR,0x03BD3F ; Write GP0 Command Word (Set Drawing Area Bottom Right X2=319, Y2=239)
|
|
WRGP0 GPUDRAWOFS,0x000000 ; Write GP0 Command Word (Set Drawing Offset X=0, Y=0)
|
|
|
|
.macro CopyTextureVram, TEXTURE, X,Y
|
|
CopyRectCPU X,Y, 256,256 ; Copy Rectangle (CPU To VRAM): X,Y, Width,Height
|
|
li t0,32767 ; T0 = Data Copy Word Count
|
|
la a1,TEXTURE ; A1 = Texture RAM Offset
|
|
CopyTextureThis:
|
|
lw t1,0(a1) ; T1 = DATA Word
|
|
addiu a1,4 ; A1 += 4 (Delay Slot)
|
|
sw t1,GP0(a0) ; Write GP0 Packet Word
|
|
bnez t0,CopyTextureThis ; IF (T0 != 0) Copy Texture A
|
|
subiu t0,1 ; T0-- (Delay Slot)
|
|
.endmacro
|
|
|
|
.macro CubePositionMoveCheck, joykey,position,branch
|
|
IsJoyDown joykey,PadData ; Is Joypad Digital Button Pressed Down: Input, Input Data Address
|
|
beqz t0,branch
|
|
nop ; Delay Slot
|
|
la a1,position
|
|
lw t0,0(a1)
|
|
nop ; Delay Slot
|
|
.endmacro
|
|
|
|
CopyTextureVram TextureA, 512,0
|
|
CopyTextureVram TextureB, 768,0
|
|
;CopyTextureVram TextureC, 0,256
|
|
CopyTextureVram TextureD, 256,256
|
|
CopyTextureVram TextureE, 512,256
|
|
CopyTextureVram TextureF, 768,256
|
|
|
|
ReverseCubeAccelY:
|
|
la a2,YAccel ; Load cube acceleration
|
|
lw t1,0(a2) ; in t1
|
|
|
|
nop
|
|
subu t1,$0,t1 ; Reverse acceleration
|
|
sw t1,0(a2) ; ...
|
|
|
|
la a1,YPos ; Load cube Y position
|
|
lw t0,0(a1) ; ...
|
|
|
|
nop
|
|
add t0,t1 ; Accelerate cube
|
|
sw t0,0(a1) ; Commit cube Y position
|
|
|
|
b PRESSEND
|
|
;ReverseCubeAccelY
|
|
|
|
Refresh:
|
|
WaitVSync PadBuffer,PadData ; Wait For Vertical Retrace Period & Store XOR Pad Data: Buffer Address, Data Address
|
|
FillRectVRAM 0xEEDDFF, 0,0, 320,240 ; Fill Rectangle In VRAM: Color, X,Y, Width,Height
|
|
XYZPos XPos,YPos,ZPos ; Object X,Y,Z Translation: X,Y,Z
|
|
XYZRotCalc XRot,YRot,ZRot,SinCos256 ; XYZ Rotation Calculation: X Rotation, Y Rotation, Z Rotation, Matrix Sin & Cos Pre-Calculated Table
|
|
|
|
; Move cube towards the left
|
|
la a1,XPos ; Load cube X position
|
|
lw t0,0(a1) ;
|
|
nop ; Chill
|
|
subiu t0,32 ; Move cube left
|
|
sw t0,0(a1) ; Store position
|
|
|
|
; Gravity pulling cube down, its force remaking it jump
|
|
la a1,YPos ; Load cube Y position
|
|
lw t0,0(a1) ; ...
|
|
|
|
li t2,+8192-1024 ; Set compare value of ... floor Y
|
|
li t3,-8192-1024 ; ... roof Y
|
|
|
|
;beq t0,t2,ReverseCubeAccelY ; [If cube touches ... floor
|
|
;nop
|
|
;beq t0,t3,ReverseCubeAccelY ; reverse direction] ... roof
|
|
|
|
slt t4,t0,t2 ; if cubeY >= floorY
|
|
beq t4,$0,ReverseCubeAccelY ; then reverse it
|
|
|
|
la a2,YAccel ; Load cube acceleration
|
|
lw t1,0(a2) ; ...
|
|
|
|
nop
|
|
addi t1,16 ; Get acceleration stronger
|
|
sw t1,0(a2) ; Then store it
|
|
|
|
nop
|
|
add t0,t1 ; Accelerate cube
|
|
sw t0,0(a1) ; Commit cube Y position
|
|
|
|
; PRESSUP:
|
|
; CubePositionMoveCheck JOY_UP,YPos,PRESSDOWN
|
|
; subiu t0,256 ; Y Position--
|
|
; sw t0,0(a1)
|
|
; PRESSDOWN:
|
|
; CubePositionMoveCheck JOY_DOWN,YPos,PRESSLEFT
|
|
; addiu t0,256 ; Y Position++
|
|
; sw t0,0(a1)
|
|
; PRESSLEFT:
|
|
; CubePositionMoveCheck JOY_LEFT,XPos,PRESSRIGHT
|
|
; subiu t0,256 ; X Position--
|
|
; sw t0,0(a1)
|
|
; PRESSRIGHT:
|
|
; CubePositionMoveCheck JOY_RIGHT,XPos,PRESSL1
|
|
; addiu t0,256 ; X Position++
|
|
; sw t0,0(a1)
|
|
; PRESSL1:
|
|
; IsJoyDown JOY_L1,PadData ; Is Joypad Digital Button Pressed Down: Input, Input Data Address
|
|
; beqz t0,PRESSL2
|
|
; nop ; Delay Slot
|
|
; la a1,ZPos ; Z Position--
|
|
; lw t0,0(a1)
|
|
; li t1,10240
|
|
; beq t0,t1,PRESSL2
|
|
; nop ; Delay Slot
|
|
; subiu t0,256
|
|
; sw t0,0(a1)
|
|
; PRESSL2:
|
|
; IsJoyDown JOY_L2,PadData ; Is Joypad Digital Button Pressed Down: Input, Input Data Address
|
|
; beqz t0,PRESST
|
|
; nop ; Delay Slot
|
|
; la a1,ZPos ; Z Position++
|
|
; lw t0,0(a1)
|
|
; li t1,25600
|
|
; beq t0,t1,PRESST
|
|
; nop ; Delay Slot
|
|
; addiu t0,256
|
|
; sw t0,0(a1)
|
|
; PRESST:
|
|
; IsJoyDown JOY_T,PadData ; Is Joypad Digital Button Pressed Down: Input, Input Data Address
|
|
; beqz t0,PRESSX
|
|
; nop ; Delay Slot
|
|
; la a1,XRot ; X Rotation--
|
|
; lw t0,0(a1)
|
|
; nop ; Delay Slot
|
|
; subiu t0,1
|
|
; andi t0,0xFF
|
|
; sw t0,0(a1)
|
|
; PRESSX:
|
|
; IsJoyDown JOY_X,PadData ; Is Joypad Digital Button Pressed Down: Input, Input Data Address
|
|
; beqz t0,PRESSC
|
|
; nop ; Delay Slot
|
|
; la a1,XRot ; X Rotation++
|
|
; lw t0,0(a1)
|
|
; nop ; Delay Slot
|
|
; addiu t0,1
|
|
; andi t0,0xFF
|
|
; sw t0,0(a1)
|
|
; PRESSC:
|
|
; IsJoyDown JOY_C,PadData ; Is Joypad Digital Button Pressed Down: Input, Input Data Address
|
|
; beqz t0,PRESSS
|
|
; nop ; Delay Slot
|
|
; la a1,YRot ; Y Rotation--
|
|
; lw t0,0(a1)
|
|
; nop ; Delay Slot
|
|
; subiu t0,1
|
|
; andi t0,0xFF
|
|
; sw t0,0(a1)
|
|
; PRESSS:
|
|
; IsJoyDown JOY_S,PadData ; Is Joypad Digital Button Pressed Down: Input, Input Data Address
|
|
; beqz t0,PRESSR1
|
|
; nop ; Delay Slot
|
|
; la a1,YRot ; Y Rotation++
|
|
; lw t0,0(a1)
|
|
; nop ; Delay Slot
|
|
; addiu t0,1
|
|
; andi t0,0xFF
|
|
; sw t0,0(a1)
|
|
; PRESSR1:
|
|
; IsJoyDown JOY_R1,PadData ; Is Joypad Digital Button Pressed Down: Input, Input Data Address
|
|
; beqz t0,PRESSR2
|
|
; nop ; Delay Slot
|
|
; la a1,ZRot ; Z Rotation--
|
|
; lw t0,0(a1)
|
|
; nop ; Delay Slot
|
|
; subiu t0,1
|
|
; andi t0,0xFF
|
|
; sw t0,0(a1)
|
|
; PRESSR2:
|
|
; IsJoyDown JOY_R2,PadData ; Is Joypad Digital Button Pressed Down: Input, Input Data Address
|
|
; beqz t0,PRESSEND
|
|
; nop ; Delay Slot
|
|
; la a1,ZRot ; Z Rotation++
|
|
; lw t0,0(a1)
|
|
; nop ; Delay Slot
|
|
; addiu t0,1
|
|
; andi t0,0xFF
|
|
; sw t0,0(a1)
|
|
PRESSEND:
|
|
ShadeTexQuadCullBackZSort ShadeTexCubeQuad,ShadeTexCubeQuadEnd,PolySort ; Shaded Texture Quad Back Face Cull Z Sort: Object Start Address, Object End Address, Sort Address
|
|
b Refresh
|
|
nop ; Delay Slot
|
|
|
|
PadBuffer:
|
|
dw 0 ; Pad Buffer (Automatically Stored Every Frame)
|
|
PadData:
|
|
dw 0 ; Pad Data (Read From VSync Routine)
|
|
|
|
XPos:
|
|
dw 16384 ; X Position Word
|
|
YPos:
|
|
dw 512 ; Y Position Word
|
|
ZPos:
|
|
dw 25600 ; Z Position Word
|
|
|
|
YAccel:
|
|
dw -64
|
|
|
|
XRot:
|
|
dw 0 ; X Rotate Word (0..255)
|
|
YRot:
|
|
dw 0 ; Y Rotate Word (0..255)
|
|
ZRot:
|
|
dw 0 ; Z Rotate Word (0..255)
|
|
|
|
Matrix3D: ; 3D Matrix: Set To Default Identity Matrix (All Numbers Multiplied By 256 For 24.8 Fixed Point Format)
|
|
dw 256, 0, 0, 0 ; X = 1.0, 0.0, 0.0, X Translation = 0.0
|
|
dw 0, 256, 0, 0 ; 0.0, Y = 1.0, 0.0, Y Translation = 0.0
|
|
dw 0, 0, 256, 0 ; 0.0, 0.0, Z = 1.0, Z Translation = 0.0
|
|
|
|
; Matrix Sin & Cos Pre-Calculated Table
|
|
.include "sincos256.asm" ; Matrix Sin & Cos Pre-Calculated Table (256 Rotations)
|
|
|
|
; Object Data
|
|
.include "objects.asm" ; Object Data
|
|
|
|
TextureA:
|
|
.incbin "GFX/A.bin" ; Include 256x256 15BPP Texture Data (131072 Bytes)
|
|
TextureB:
|
|
.incbin "GFX/B.bin" ; Include 256x256 15BPP Texture Data (131072 Bytes)
|
|
;TextureC:
|
|
; .incbin "GFX/C.bin" ; Include 256x256 15BPP Texture Data (131072 Bytes)
|
|
TextureD:
|
|
.incbin "GFX/D.bin" ; Include 256x256 15BPP Texture Data (131072 Bytes)
|
|
TextureE:
|
|
.incbin "GFX/E.bin" ; Include 256x256 15BPP Texture Data (131072 Bytes)
|
|
TextureF:
|
|
.incbin "GFX/F.bin" ; Include 256x256 15BPP Texture Data (131072 Bytes)
|
|
|
|
PolySort: ; Polygon Sorting Area
|
|
|
|
.close |