-
Notifications
You must be signed in to change notification settings - Fork 0
some old code
Alex edited this page Aug 15, 2026
·
2 revisions
USING SIMPLIFIED SYNTAX, ONLY PSEUDO-ASSEMBLY. SOMETIMES THE EAM.SET IS IMPLICIT. THERE'S A LOT OF BANK SWITCHING AND I CAN'T BE ARSED TO MAKE THEM ALL EXPLICIT. THIS IS THE ROUTINE I WILL GET A SIZE ESTIMATE ON:
; mapX = static_cast<int>(posX);
LDM R0 M$[PosXHi]
LDM R1 M$[PosXLo]
STM R0 M$[Arg0]
STM R1 M$[Arg1]
CAL CAST(f32, i32)
LDM R0 M$[CastReturnHI]
LDM R1 M$[CastReturnLO]
STM R0 M$[mapXHi]
STM R1 M$[mapXLo]
;mapY = static_cast<int>(posY);
LDM R0 M$[posYHi]
LDM R1 M$[posYLo]
STM R0 M$[Arg0]
STM R1 M$[Arg1]
CAL CAST(f32,i32)
LDM R0 M$[CastReturnHi]
LDM R1 M$[CastReturnLo]
STM R0 M$[MapYHi]
STM R1 M$[MapYLo]
;if(rayDirX == 0)
;{
;deltaX = infinity;
;}else{
;deltaX = abs(1/rayDirX);
;}
LDM R0 M$[rayDirXLo]
LDM R1 M$[rayDirXHi]
OR R0 R0 R1
AND R0 R0 0x7FFF
STJ NZA
JNE R0 0x0000
STM 0x7F80 M$[deltaXLo]
STM 0x0000 M$[deltaXHi]
STJ cont0
JMP
NZA:
LDM R0 M$[rayDirXLo]
EAM.SET 0x07FF
STM R0 M$[FP32.B_LOW]
STM R1 M$[FP32.B_HIGH]
STM 0x3F80 M$[FP32.A_HIGH]
STM 0x0000 M$[FP32.A_LOW]
STM CMD_DIVIDE M$[FP32_CMD]
LDM R0 M$[FP32_outLOW]
LDM R1 M$[FP32_outHIGH]
STM R0 M$[deltaXLo]
STM R1 M$[deltaXHigh]
LDM R0 M$[deltaXlow]
LDM R1 M$[deltaXHigh]
STM R0 M$[Arg0]
STM R1 M$[Arg1]
CAL absFP32
LDM R0 M$[Ret0]
LDM R1 M$[Ret1]
STM R0 M$[deltaXLow]
STM R1 M$[deltaXHi]
cont0:
EAM.SET 0x0000
;if(rayDirY == 0)
;{
;deltaY = infinity;
;}else{
;deltaY = abs(1/rayDirY);
;}
LDM R0 M$[rayDirYLo]
LDM R1 M$[rayDirYHi]
OR R0 R0 R1
AND R0 R0 0x7FFF
STJ NZB
JNE R0 0x0000
STM 0x7F80 M$[deltaYLo]
STM 0x0000 M$[deltaYHi]
STJ cont1
JMP NZB:
LDM R0 M$[rayDirYLo]
EAM.SET 0x07FF
STM R0 M$[FP32.B_LOW]
STM R1 M$[FP32.B_HIGH]
STM 0x3F80 M$[FP32.A_HIGH]
STM 0x0000 M$[FP32.A_LOW]
STM CMD_DIVIDE M$[FP32_CMD]
LDM R0 M$[FP32_outLOW]
LDM R1 M$[FP32_outHIGH]
STM R0 M$[deltaYLo]
STM R1 M$[deltaYHigh]
STM R0 M$[Arg0]
STM R1 M$[Arg1]
CAL absFP32
LDM R0 M$[Ret0]
LDM R1 M$[Ret1]
STM R0 M$[deltaXLow]
STM R1 M$[deltaXHi]
cont1: EAM.SET 0x0000
;if(rayDirX < 0)
;{ ;stepX = -1;
; sideDistX = (posX - mapX) * deltaX;
;}else{
;stepX = 1;
;sideDistX = (mapX + (1 - posX)) * deltaX;
;}
LDM R0 M$[rayDirXHI]
LDM R1 M$[rayDirXLO]
AND R0 R0 0x8000
STM R0 M$[Buffer0]
STM R1 M$[Buffer1]
STJ NX
JNE R0 0x0000
STM $FFFF
M$[StepXlo]
STM $FFFF M$[StepXHi]
STJ cont2
JMP
NX:
LDM R0 M$[posXLo]
LDM R1 M$[posXHi]
STM R0 M$[FP32_BLOW]
STM R1 M$[FP32_BHIGH]
STM 0x3F80 M$[FP32_AHIGH]
STM 0x0000 M$[FP32_ALOW]
STM CMD_SUB M$[FP32_CMD]
LDM R0 M$[FP32_OUTLOW]
LDM R1 M$[FP32_OUTHIGH]
LDM R2 M$[MapXHi]
LDM R3 M$[MapXLo]
STM R2 M$[PosXLo]
STM R3 M$[PosXHi]
STM R0 M$[MapXLo]
STM R1 M$[MapXHi]
LDM R0 M$[posXLo]
LDM R1 M$[posXHi]
STM 0x0000 M$[stepXLo]
STM 0x0001 M$[stepXHi]
LDM R0 M$[Buffer0]
LDM R1 M$[Buffer1]
cont2:
STM R0 M$[FP32_ALOW]
STM R1 M$[FP32_AHIGH]
LDM R0 M$[MapXlow]
LDM R1 M$[MapXHigh]
STM R0 M$[FP32_BLOW]
STM R1 M$[FP32_BHIGH]
STM CMD_SUB M$[FP32_CMD]
LDM R0 M$[FP32_OUTLOW]
LDM R1 M$[FP32_OUTHIGH]
STM R0 M$[FP32_ALOW]
STM R1 M${FP32_AHIGH]
LDM R0 M$[deltaXLo]
LDM R1 M$[deltaXHi]
STM R0 M$[FP32_BLOW]
STM R1 M$[FP32_BHIGH] STM
CMD_MUL M$[FP32_CMD]
LDM R0 M$[FP32_OUTLOW]
LDM R1 M$[FP32_OUTHIGH]
STM R0 M$[sideDistXLo]
STM R1 M$[sideDistXHi]
;if( rayDirY < 0 )
;{
;stepY = -1;
;sideDistY = (posY - mapY) * deltaY);
;}else{ ;stepY = 1;
;sideDistY = (mapY +1 - posY ) * deltaY);
;}
LDM R0 M$[rayDirYHI]
LDM R1 M$[rayDirYLO]
AND R0 R0 0x8000
STM R0 M$[Buffer0]
STM R1 M$[Buffer1]
STJ NY JNE R0 0x0000
STM $FFFF M$[StepYlo]
STM $FFFF M$[StepYHi]
STJ cont3
JMP
NY:
LDM R0 M$[posYLo]
LDM R1 M$[posYHi]
STM R0 M$[FP32_BLOW]
STM R1 M$[FP32_BHIGH]
STM 0x3F80 M$[FP32_AHIGH]
STM 0x0000 M$[FP32_ALOW]
STM CMD_SUB M$[FP32_CMD]
LDM R0 M$[FP32_OUTLOW]
LDM R1 M$[FP32_OUTHIGH]
LDM R2 M$[MapYHi]
LDM R3 M$[MapYLo]
STM R2 M$[PosYLo]
STM R3 M$[PosYHi]
STM R0 M$[MapYLo]
STM R1 M$[MapYHi]
LDM R0 M$[posYLo]
LDM R1 M$[posYHi]
STM 0x0000 M$[stepYLo]
STM 0x0001 M$[stepYHi]
LDM R0 M$[Buffer0]
LDM R1 M$[Buffer1]
cont3:
STM R0 M$[FP32_ALOW]
STM R1 M$[FP32_AHIGH]
LDM R0 M$[MapYlow]
LDM R1 M$[MapYHigh]
STM R0 M$[FP32_BLOW]
STM R1 M$[FP32_BHIGH]
STM CMD_SUB M$[FP32_CMD]
LDM R0 M$[FP32_OUTLOW]
LDM R1 M$[FP32_OUTHIGH]
STM R0 M$[FP32_ALOW]
STM R1 M${FP32_AHIGH]
LDM R0 M$[deltaYLo]
LDM R1 M$[deltaYHi]
STM R0 M$[FP32_BLOW]
STM R1 M$[FP32_BHIGH]
STM CMD_MUL M$[FP32_CMD]
LDM R0 M$[FP32_OUTLOW]
LDM R1 M$[FP32_OUTHIGH]
STM R0 M$[sideDistYLo]
STM R1 M$[sideDistYHi]
;hit = false;
STM 0x0000 M$[hit]
;while( !hit)
;{
;if(sideDistX < sideDistY)
;{ ;sideDistX += deltaX; ;mapX += stepX; ;side = 0;
;}else{ ;sideDistY += deltaY; ;mapY += stepY; ;side = 1; ;} ;if(map.getTile(mapX,mapY).isCollidable) ;{ ;hit = true; ;} ;}
cont4:
STJ
whileExit
LDM R0 M$[hit]
JEQ R0 0x0001
LDM R0 M$[sideXDistLo]
LDM R1 M$[sideXDistHi]
STM R0 M$[FP32_ALOW]
STM R1 M$[FP32_AHIGH]
LDM R0 M$[sideYDistLo] LDM R1 M$[sideYDistHi] STM R0 M$[FP32_BLOW] STM R1 M$[FP32_BHIGH] STM CMD_SUB M$[FP32_CMD] LDM R0 M$[FP32_OUTHIGH] STJ doY JLT R0 0x0000 LDM R0 M$[deltaXlo] LDM R1 M$[deltaXHi] STM R0 M$[Arg0] STM R1 M$[Arg1] LDM R0 M$[sideDistXLo] LDM R1 M$[sideDistXHi] STM R0 M$[Arg2] STM R1 M$[Arg3] CAL AddF32 EAM.SET 0x07FF LDM R0 M$[FP32_OUTLOW] LDM R1 M$[FP32_OUTHIGH] EAM.SET 0x07FF STM R0 M$[sideDistXlo] STM R1 M$[sideDistXHi] LDM R0 M$[MapXLO] LDM R1 M$[MapXHI] STM R0 M$[Arg0] STM R1 M$[Arg1] LDM R0 M$[stepXLo] LDM R0 M$[stepXHi] STM R0 M$[Arg2] STM R1 M$[Arg3] CAL AddI32 EAM.SET 0x07FF LDM R0 M$[int32_Outlo] LDM R1 M$[int32_OutHi] EAM.SET 0x0000 STM R0 M$[mapXlo] STM R1 M$[mapXhi] STM 0x0000 M$[sideLo] STM 0x0000 M$[sideHi] STJ cont5 JMP doY: LDM R0 M$[deltaYlo] LDM R1 M$[deltaYHi] STM R0 M$[Arg0] STM R1 M$[Arg1] LDM R0 M$[sideDistYLo] LDM R1 M$[sideDistYHi] STM R0 M$[Arg2] STM R1 M$[Arg3] CAL AddF32 EAM.SET 0x07FFF LDM R0 M$[FP32_OUTLOW] LDM R1 M$[FP32_OUTHIGH] EAM.SET 0x0000 STM R0 M$[sideDistYlo] STM R1 M$[sideDistYHi] LDM R0 M$[MapYLO] LDM R1 M$[MapYHI] STM R0 M$[Arg0] STM R1 M$[Arg1] LDM R0 M$[stepYLo] LDM R0 M$[stepYHi] STM R0 M$[Arg2] STM R1 M$[Arg3] CAL AddI32 EAM.SET 0x07FF LDM R0 M$[int32_Outlo] LDM R1 M$[int32_OutHi] STM R0 M$[mapYlo] STM R1 M$[mapYhi] STM 0x0000 M$[sideLo] STM 0x0001 M$[sideHi] cont5: LDM R0 M$[mapXlo] LDM R1 M$[mapXhi] LDM R2 M$[mapYlo] LDM R3 M$[mapYhi] STM R0 M$[Arg0] STM R1 M$[Arg1] STM R2 M$[Arg2] STM R3 M$[Arg3] CAL map.getTile.getCollidable LDM R0 M$[Ret0] STJ NotHit JNE R0 0x0001 STM 0x0001 M$[hit] NotHit: STJ cont4 JMP whileExit: ;if(side == 0) ;{ ;pwalldist = (mapX - posX + (1 - stepX) / 2) / rayDirX; ;}else{ ;pwallDist = (mapY - posY +( 1 - stepY) / 2) / rayDirY; ;} LDM R0 M$[sideLo] STJ sideNZ JNE R0 0x0000 LDM R0 M$[mapXLo] LDM R1 M$[mapXHi] STM R0 M$[Arg0] STM R1 M$[Arg1] LDM R0 M$[posXLo] LDM R1 M$[posXHi] STM R0 M$[Arg2] STM R1 M$[Arg3] CAL CAST(I32, F32) CAL SubF32 LDM R0 M$[Ret0] LDM R1 M$[Ret1] STM R0 M$[Buffer0] STM R1 M$[Buffer1] LDM R0 M$[stepXlo] LDM R1 M$[stepXhi] STM R0 M$[Arg2] STM R1 M$[Arg3] STM 0x3F80 M$[Arg0] STM 0x0000 M$[Arg1] CAL CAST(i32, f32,arg2,arg3) CAL SubF32 LDM R0 M$[Buffer0] LDM R1 M$[Buffer1] LDM R2 M$[Ret0] LDM R3 M$[Ret1] STM R0 M$[Arg0] STM R1 M$[Arg1] STM R2 M$[Arg2] STM R3 M$[Arg3] CAL AddF32 LDM R0 M$[Ret0] LDM R1 M$[Ret1] STM R0 M$[Arg0] STM R1 M$[Arg1] STM 0x4000 M$[Arg2] STM 0x0000 M$[Arg3] CAL DivF32 LDM R0 M$[Ret0] LDM R1 M$[Ret1] STM R0 M$[Arg0] STM R0 M$[Arg1] LDM R0 M$[rayDirXlo] LDM R1 M$[rayDirXhi] STM R0 M$[Arg2] STM R1 M$[Arg3] CAL DivF32 LDM R0 M$[Ret0] LDM R1 M$[Ret1] STJ cont6 JMP sideNZ: LDM R0 M$[mapYLo] LDM R1 M$[mapYHi] STM R0 M$[Arg0] STM R1 M$[Arg1] LDM R0 M$[posYLo] LDM R1 M$[posYHi] STM R0 M$[Arg2] STM R1 M$[Arg3] CAL CAST(I32, F32) CAL SubF32 LDM R0 M$[Ret0] LDM R1 M$[Ret1] STM R0 M$[Buffer0] STM R1 M$[Buffer1] LDM R0 M$[stepYlo] LDM R1 M$[stepYhi] STM R0 M$[Arg2] STM R1 M$[Arg3] STM 0x3F80 M$[Arg0] STM 0x0000 M$[Arg1] CAL CAST(i32, f32,arg2,arg3) CAL SubF32 LDM R0 M$[Buffer0] LDM R1 M$[Buffer1] LDM R2 M$[Ret0] LDM R3 M$[Ret1] STM R0 M$[Arg0] STM R1 M$[Arg1] STM R2 M$[Arg2] STM R3 M$[Arg3] CAL AddF32 LDM R0 M$[Ret0] LDM R1 M$[Ret1] STM R0 M$[Arg0] STM R1 M$[Arg1] STM 0x4000 M$[Arg2] STM 0x0000 M$[Arg3] CAL DivF32 LDM R0 M$[Ret0] LDM R1 M$[Ret1] STM R0 M$[Arg0] STM R0 M$[Arg1] LDM R0 M$[rayDirYlo] LDM R1 M$[rayDirYhi] STM R0 M$[Arg2] STM R1 M$[Arg3] CAL DivF32 LDM R0 M$[Ret0] LDM R1 M$[Ret1] cont6: STM R0 M$[PWalldistLo] STM R1 M$[PWallDistHi] ;lineHeight = screenHeight / pwallDist; LDM R0 M$[screenHeightLo] LDM R1 M$[screemHeightHi] LDM R2 M$[pwallDistLo] LDM R3 M$[pwallDistHi] STM R0 M$[Arg0] STM R1 M$[Arg1] STM R2 M$[Arg2] STM R3 M$[Arg3] CAL DivF32 LDM R0 M$[Ret0] LDM R1 M$[Ret1] STM R0 M$[Arg0] STM R1 M$[Arg1] CAL CAST(f32, i32) LDM R0 M$[Ret0] LDM R1 M$[Ret1] STM R0 M$[screenHeightLo] STM R1 M$[screenHeightHi]