Skip to content

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]

Clone this wiki locally