ROMW 16 ; 16-bit RAM from $BE00-$BFFF (512 words) ;_CARTRAM ORG $8040, $8040, "+RW" _CARTRAM ORG $2000, $2000, "+RW" CartRAM RMB 512 ; Global Symbols (credit to Joe Zbiciak): EC_LOC EQU $CF00 EC_MAG EQU $69 EC_POLL EQU $CF01 ; Boolean values FALSE EQU 0 TRUE EQU 1 ; Colors COLOR_BLK EQU 0 COLOR_BLU EQU 1 COLOR_RED EQU 2 COLOR_TAN EQU 3 COLOR_DKG EQU 4 COLOR_GRN EQU 5 COLOR_YEL EQU 6 COLOR_WHT EQU 7 COLOR_GRY EQU 8 COLOR_CYN EQU 9 COLOR_ORG EQU 10 COLOR_BRN EQU 11 COLOR_PNK EQU 12 COLOR_VIO EQU 13 COLOR_YLG EQU 14 COLOR_MAG EQU 15 ; Macro direction enums DIR_EAST EQU 0 DIR_WEST EQU 1 DIR_NORTH EQU 2 DIR_SOUTH EQU 3 ; Macro ray direction enums DIR_HORZ EQU 0 DIR_VERT EQU 1 ; Memory locations STIC EQU $0000 STICInteraction EQU $0018 STICHandshake EQU $0020 STICCardMode EQU $0021 IntVecLo EQU $0100 IntVecHi EQU $0101 TaskQueueHead EQU $0102 TaskQueueTail EQU $0103 TaskQueue EQU $0104 DiscValue EQU $0114 LeftCtrlData EQU $0115 RightCtrlData EQU $0118 DrawHeights EQU $011B RightController EQU $01FE LeftController EQU $01FF BACKTAB EQU $0200 SYSTEM ORG $2F0, $2F0, "-RWBN" STACK RMB 30 ; Reserve words for the stack STICSH RMB 32 ; STIC Shadow TaskList RMB 8 ; EQU $032E YPosInt RMB 1 ; EQU $0336 XPosFracLeft RMB 1 ; EQU $0337 YPosFracLeft RMB 1 ; EQU $0338 XPos RMB 1 ; EQU $0339 YPos RMB 1 ; EQU $033A Angle RMB 1 ; EQU $033B NoTestVertWalls RMB 1 ; EQU $033C NoTestHorzWalls RMB 1 ; EQU $033D XBack RMB 1 ; EQU $033E YBack RMB 1 ; EQU $033F XNext RMB 1 ; EQU $0340 YNext RMB 1 ; EQU $0341 XInc RMB 1 ; EQU $0342 YInc RMB 1 ; EQU $0343 DrawX RMB 1 ; EQU $0344 XPosFrac RMB 1 ; EQU $0345 DrawTop RMB 1 ; EQU $0346 DrawBot RMB 1 ; EQU $0347 OldDX RMB 1 ; EQU $0348 OldDY RMB 1 ; EQU $0349 XEdge RMB 1 ; EQU $034A YEdge RMB 1 ; EQU $034B VertWallDist RMB 1 ; EQU $034C HorzWallDist RMB 1 ; EQU $034D Mode RMB 1 ; EQU $034E CurAng RMB 1 ; EQU $034F XStep RMB 1 ; EQU $0350 YStep RMB 1 ; EQU $0351 RotSp RMB 1 ; EQU $0352 UpdateAllowed RMB 1 ; EQU $0353 CardCopyCount RMB 1 ; EQU $0354 DoneRendering RMB 1 ; EQU $0355 FacingHorz RMB 1 ; EQU $0356 MaxDist RMB 1 ; EQU $0357 MaxDistNext RMB 1 ; EQU $0358 YPosFrac RMB 1 ; EQU $0359 CurDist RMB 1 ; EQU $035A OldDR RMB 1 ; EQU $035B OldAngle RMB 1 ; EQU $035C YPosIntOpp RMB 1 ; EQU $035D WallColor RMB 1 ; EQU $035E DrawHeightOfs RMB 1 ; EQU $035F GRAM EQU $3800 ; Constants MOBDataSize EQU 24 BmpWidth EQU 80 BmpHeight EQU 48 HalfBmpHeight EQU 24 BmpWidthCS EQU 40 HalfBmpWidthCS EQU 20 CSPitch EQU 20 SecondCardRow EQU $214 ElevenRows EQU 220 BmpHeightCS EQU 24 HalfBmpHeightCS EQU 12 InitialX EQU $028D ; Initial X position in 8.8 fixed-point format InitialY EQU $01C1 ; Initial Y position in 8.8 fixed-point format InitialA EQU 0 ; Initial heading InitialMaxDist EQU $1800 ; 24.0 CardCopyRun EQU 14 CardCopyRuns EQU 4 FarthestDist EQU $1800 ; 24.0 MinWallDist EQU $0020 MAZE_HEIGHT EQU 16 ; Handler types HT_KEYPAD EQU 0 HT_SIDEBUTTON EQU 1 HT_DISC EQU 2 ; Controller status bits CS_DISC EQU 1 CS_SIDEBUTTON EQU 2 CS_KEYPAD EQU 4 CS_MASK EQU CS_DISC + CS_SIDEBUTTON + CS_KEYPAD ; Controller event bits EV_RELEASED EQU $0080 EV_RTCONTROLLER EQU $0100 ; Scaled angle values ; Angle values are scaled from 0-479, so 360 degrees translates to 480. We ; use this scaling so that one pixel equals one unit when rendering with a ; 60-degree field of view. Scaled30 EQU 40 Scaled45 EQU 60 Scaled60 EQU 80 Scaled90 EQU 120 Scaled120 EQU 160 Scaled135 EQU 180 Scaled180 EQU 240 Scaled225 EQU 300 Scaled240 EQU 320 Scaled270 EQU 360 Scaled300 EQU 400 Scaled315 EQU 420 Scaled360 EQU 480 ; -- angle value is in units of 0.75 degrees ; Unit wall height in colored-squares mode CS_WALL_HEIGHT EQU 32 ; Distance at which the wall is always the maximum height CS_MAX_HT_DIST EQU $0180 ; Colored-squares color constants CSQ_MODE EQU $1000 CSQ_CEILING1 EQU COLOR_BLU CSQ_CEILING2 EQU COLOR_BLK CSQ_FLOOR1 EQU COLOR_TAN CSQ_FLOOR2 EQU COLOR_TAN CSQ_BLK_L1_CEIL EQU COLOR_BLK XOR CSQ_CEILING1 CSQ_BLK_R1_CEIL EQU (COLOR_BLK XOR CSQ_CEILING2) * 8 CSQ_BLK_L2_CEIL EQU (COLOR_BLK XOR CSQ_CEILING2) * 64 CSQ_BLK_R2_CEIL EQU (((COLOR_BLK XOR CSQ_CEILING1) AND 3) * 512) + (((COLOR_BLK XOR CSQ_CEILING1) AND 4) * 2048) CSQ_BLU_L1_CEIL EQU COLOR_BLU XOR CSQ_CEILING1 CSQ_BLU_R1_CEIL EQU (COLOR_BLU XOR CSQ_CEILING2) * 8 CSQ_BLU_L2_CEIL EQU (COLOR_BLU XOR CSQ_CEILING2) * 64 CSQ_BLU_R2_CEIL EQU (((COLOR_BLU XOR CSQ_CEILING1) AND 3) * 512) + (((COLOR_BLU XOR CSQ_CEILING1) AND 4) * 2048) CSQ_RED_L1_CEIL EQU COLOR_RED XOR CSQ_CEILING1 CSQ_RED_R1_CEIL EQU (COLOR_RED XOR CSQ_CEILING2) * 8 CSQ_RED_L2_CEIL EQU (COLOR_RED XOR CSQ_CEILING2) * 64 CSQ_RED_R2_CEIL EQU (((COLOR_RED XOR CSQ_CEILING1) AND 3) * 512) + (((COLOR_RED XOR CSQ_CEILING1) AND 4) * 2048) CSQ_TAN_L1_CEIL EQU COLOR_TAN XOR CSQ_CEILING1 CSQ_TAN_R1_CEIL EQU (COLOR_TAN XOR CSQ_CEILING2) * 8 CSQ_TAN_L2_CEIL EQU (COLOR_TAN XOR CSQ_CEILING2) * 64 CSQ_TAN_R2_CEIL EQU (((COLOR_TAN XOR CSQ_CEILING1) AND 3) * 512) + (((COLOR_TAN XOR CSQ_CEILING1) AND 4) * 2048) CSQ_DKG_L1_CEIL EQU COLOR_DKG XOR CSQ_CEILING1 CSQ_DKG_R1_CEIL EQU (COLOR_DKG XOR CSQ_CEILING2) * 8 CSQ_DKG_L2_CEIL EQU (COLOR_DKG XOR CSQ_CEILING2) * 64 CSQ_DKG_R2_CEIL EQU (((COLOR_DKG XOR CSQ_CEILING1) AND 3) * 512) + (((COLOR_DKG XOR CSQ_CEILING1) AND 4) * 2048) CSQ_GRN_L1_CEIL EQU COLOR_GRN XOR CSQ_CEILING1 CSQ_GRN_R1_CEIL EQU (COLOR_GRN XOR CSQ_CEILING2) * 8 CSQ_GRN_L2_CEIL EQU (COLOR_GRN XOR CSQ_CEILING2) * 64 CSQ_GRN_R2_CEIL EQU (((COLOR_GRN XOR CSQ_CEILING1) AND 3) * 512) + (((COLOR_GRN XOR CSQ_CEILING1) AND 4) * 2048) CSQ_YEL_L1_CEIL EQU COLOR_YEL XOR CSQ_CEILING1 CSQ_YEL_R1_CEIL EQU (COLOR_YEL XOR CSQ_CEILING2) * 8 CSQ_YEL_L2_CEIL EQU (COLOR_YEL XOR CSQ_CEILING2) * 64 CSQ_YEL_R2_CEIL EQU (((COLOR_YEL XOR CSQ_CEILING1) AND 3) * 512) + (((COLOR_YEL XOR CSQ_CEILING1) AND 4) * 2048) CSQ_WHT_L1_CEIL EQU COLOR_WHT XOR CSQ_CEILING1 CSQ_WHT_R1_CEIL EQU (COLOR_WHT XOR CSQ_CEILING2) * 8 CSQ_WHT_L2_CEIL EQU (COLOR_WHT XOR CSQ_CEILING2) * 64 CSQ_WHT_R2_CEIL EQU (((COLOR_WHT XOR CSQ_CEILING1) AND 3) * 512) + (((COLOR_WHT XOR CSQ_CEILING1) AND 4) * 2048) CSQ_TO_FLOOR EQU (CSQ_FLOOR1 XOR CSQ_CEILING1) + ((CSQ_FLOOR2 XOR CSQ_CEILING2) * 8) + ((CSQ_FLOOR2 XOR CSQ_CEILING2) * 64) + (((CSQ_FLOOR1 XOR CSQ_CEILING1) AND 3) * 512) + (((CSQ_FLOOR1 XOR CSQ_CEILING1) AND 4) * 2048) CSCeiling EQU CSQ_CEILING1 + (CSQ_CEILING2 * 8) + (CSQ_CEILING2 * 64) + ((CSQ_CEILING1 AND 3) * 512) + ((CSQ_CEILING1 AND 4) * 2048) CSFloor EQU CSQ_FLOOR1 + (CSQ_FLOOR2 * 8) + (CSQ_FLOOR2 * 64) + ((CSQ_FLOOR1 AND 3) * 512) + ((CSQ_FLOOR1 AND 4) * 2048) WallsLNLN EQU $11C7 ; 0001 0001 1100 0111 00 0 10 00 111 000 111 WallsNRNR EQU $3638 ; 0011 0110 0011 1000 00 1 10 11 000 111 000 WallsLRLR EQU $37FF ; 0011 0111 1111 1111 00 1 10 11 111 111 111 WallsNNNN EQU $1000 ; 0001 0000 0000 0000 00 0 10 00 000 000 000 WallsLNLR EQU $37C7 ; 0011 0111 1100 0111 00 1 10 11 111 000 111 WallsLRLN EQU $11FF ; 0001 0001 1111 1111 00 0 10 00 111 111 111 WallsNRLR EQU $37F8 ; 0011 0111 1111 1000 00 1 10 11 111 111 000 WallsLRNR EQU $363F ; 0011 0110 0011 1111 00 1 10 11 000 111 111 WallsNNLN EQU $11C0 ; 0001 0001 1100 0000 00 0 10 00 111 000 000 WallsNNNR EQU $3600 ; 0011 0110 0000 0000 00 1 10 11 000 000 000 WallsLNNN EQU $1007 ; 0001 0000 0000 0111 00 0 10 00 000 000 111 WallsNRNN EQU $1038 ; 0001 0000 0011 1000 00 0 10 00 000 111 000 WallsNNLR EQU $37C0 ; 0011 0111 1100 0000 00 1 10 11 111 000 000 WallsLRNN EQU $103F ; 0001 0000 0011 1111 00 0 10 00 000 111 111 ; ------------------------------------------------------------- ; EXEC-ROM HEADER ; ------------------------------------------------------------- ORG $5000 BIDECLE InitTable ; MOB picture base BIDECLE InitTable ; Process table BIDECLE Start ; ^ start program address BIDECLE InitTable ; Background picture base BIDECLE InitTable2 ; GRAM pictures BIDECLE Title ; ^ date / title string DCW $03C0 ; No ECS title, run code after title, no clicks InitTable: BIDECLE $0000 InitTable2: DCW $0003, $0005 DCW $0000, $0000 DCW $0000 ; ------------------------------------------------------------- Title PROC DCW 119, 'Raycasting Demo', $0 ; 'code after title' here (patches to the title screen, etc). PSHR R5 JSR R5, PrintStr DCW COLOR_WHT, $23D, '= JD = Productions', 0 ; Color, position, string, null terminator JSR R5, PrintStr DCW COLOR_WHT, $2D0, '2020 = JD =', 0 ; Color, position, string, null terminator PULR R7 ENDP ; ------------------------------------------------------------- Start PROC DIS MVII #STACK, R6 SUBR R0, R0 MVO R0, TaskQueueHead MVO R0, TaskQueueTail MVO R0, UpdateAllowed MVII #STICSH, R4 MVII #$0020, R1 JSR R5, ZeroMemory ; Start with GRAM mode SUBR R0, R0 MVO R0, Mode JSR R5, SetGRAMMode ; Set the previous movement variables SUBR R0, R0 MVO R0, OldDX MVO R0, OldDY MVO R0, OldDR MVO R0, OldAngle ; Set the initial X position MVII #InitialX, R0 MVO R0, XPos ANDI #$00FF, R0 MVO R0, XPosFrac NEGR R0 ADDI #$0100, R0 MVO R0, XPosFracLeft ; Set the initial Y position MVII #InitialY, R0 MVO R0, YPos ANDI #$00FF, R0 MVO R0, YPosFrac NEGR R0 ADDI #$0100, R0 MVO R0, YPosFracLeft MVII #InitialY, R0 ANDI #$FF00, R0 SWAP R0 MVO R0, YPosInt NEGR R0 ADDI #(MAZE_HEIGHT - 1), R0 MVO R0, YPosIntOpp ; Set the initial heading MVII #InitialA, R0 MVO R0, Angle ; Set the initial rotation speed index (0-15, EV_RELEASED = no movement) MVII #EV_RELEASED, R0 MVO R0, RotSp ; Set the initial maximum rendering distance MVII #InitialMaxDist, R0 MVO R0, MaxDist MVO R0, MaxDistNext ; Zero the card copy count SUBR R0, R0 MVO R0, CardCopyCount ; Set the interrupt vector MVII #InterruptProc, R0 MVO R0, IntVecLo SWAP R0 MVO R0, IntVecHi EIS JSR R5, Render MVO R7, UpdateAllowed JSR R5, Scheduler ; Execute the main loop ; If we get here, the main loop was exited somehow JSR R5, PrintStr DCW COLOR_RED, $2DC, 'SCHEDEXIT WAS CALLED', 0 ; Color, position, string, null terminator ; Halt here DECR R7 ENDP ; ------------------------------------------------------------- ; Fills the screen with cards for GRAM mode SetGRAMMode PROC PSHR R5 ; Clear the screen (zero out BACKTAB) JSR R5, ClearScreen ; Fill the cards in the raycasting rectangle MVII #$0E05, R0 MVII #$000A, R1 MVII #BACKTAB, R4 @@FillRectLoop: MVO@ R0, R4 ADDI #$0008, R0 SUBI #$0001, R1 BNEQ @@FillRectLoop MVII #$000A, R1 ADDI #$000A, R4 CMPI #$0278, R4 BNEQ @@FillRectLoop ; Print the labels JSR R5, PrintStr DCW COLOR_RED, $20C, 'X:', 0 ; Color, position, string, null terminator JSR R5, PrintStr DCW COLOR_RED, $220, 'Y:', 0 ; Color, position, string, null terminator JSR R5, PrintStr DCW COLOR_TAN, $248, 'A:', 0 ; Color, position, string, null terminator ; Print usage JSR R5, PrintStr DCW COLOR_BLU, $2B5, 'SIDE - CHANGE MODE', 0 ; Color, position, string, null terminator JSR R5, PrintStr DCW COLOR_BLU, $2C9, 'KEYS - VIEW DIST.', 0 ; Color, position, string, null terminator MVO R7, DoneRendering PULR R7 ENDP ; ------------------------------------------------------------- ; Fills the screen with cards for colored squares mode SetCSMode PROC PSHR R5 MVII #$00F0, R1 MVII #BACKTAB, R4 MVII #$1000, R0 JSR R5, FillMemory JSR R5, RenderCS PULR R7 ENDP ; ------------------------------------------------------------- ; Signed fixed-point multiply using Quarter-Square Multiplication ; where the multiplicands are always either both positive or both ; negative (the result will always be positive). Also, where |R0| ; is always greater than or equal to 1 but less than 2. ; ; Inputs ; ; R0 = Multiplicand 1 (in 8.8 fixed-point format) ; R1 = Multiplicand 2 (in 8.8 fixed-point format) ; ; Outputs ; ; R1 = Result (in 8.8 fixed-point format) ; Destroys R0, R2, and R3 ; R5 must contain $00FF MACRO QS_SameSignOneTwoNegate_Mult_Kernel TSTR R0 BPL PosR0.%% NEGR R0 NEGR R1 PosR0.%%: ; Version that doesn't negate the result ; Only multiply by R0.lo since R0.hi is always 1 ANDR R5, R0 ; R0 <-- R0.lo MOVR R1, R3 ; R3 <-- R0.hi * R1 = R1 MOVR R1, R2 ANDR R5, R1 XORR R1, R2 ; R1 <-- R1.lo SWAP R2 ; R2 <-- R1.hi SUBR R2, R1 ; R1 <-- R1.lo - R1.hi ADDI #qs_mpy8.mid, R2 ; R2 <-- R1.hi + qs_mpy8.mid ADDR R0, R2 ; 6 a + b ADDR R0, R0 ; 6 ADD@ R2, R3 ; 8 SUBR R0, R2 ; 6 a - b SUB@ R2, R3 ; 8 ADDR R0, R2 ; 6 a + b ; Switch from R1.hi to R1.lo ADDR R1, R2 ; 6 a + b MVI@ R2, R1 ; 8 SUBR R0, R2 ; 6 a - b SUB@ R2, R1 ; 8 ADDI #$0080, R1 ; 8 round the result SWAP R1 ANDR R5, R1 ADDR R3, R1 ENDM ; ------------------------------------------------------------- ; TASK ; ; Renders the bitmap via raycasting Render PROC PSHR R5 SUBR R0, R0 MVI MaxDistNext, R1 MVO R1, MaxDist ; NoTestVertWalls = false MVO R0, NoTestVertWalls ; NoTestHorzWalls = false MVO R0, NoTestHorzWalls ; Draw with a 60-degree field of view, so set the starting heading for ; the leftmost pixel as the current heading minus 30 degrees MVI Angle, R3 ; Angle values are scaled from 0-479, so 30 degrees translates to 40 SUBI #Scaled30, R3 BC @@PositiveAng0 ; If the starting angle went negative, wrap it around ADDI #Scaled360, R3 @@PositiveAng0: MVO R3, CurAng ; Start at pixel 0 SUBR R1, R1 MVO R1, DrawX @@XLoop: ; Are we finished? MVI DrawX, R0 CMPI #BmpWidth, R0 BEQ @@DoneRender ; Have we finished a card? ANDI #$0007, R0 BNEQ @@NotNewCard JSR R5, ClearColumn @@NotNewCard: ; Get the heading currently being rendered MVI CurAng, R4 ; Is the heading greater than 180 degrees? CMPI #Scaled180, R4 BC @@FacingNorthward ; ; Angle less than 180 degrees (facing southward) ; ; Determine if we're facing more horizontally or vertically. We need to ; do this for rendering accuracy. XORR R1, R1 ; YBack = 0 MVO R1, YBack DECR R1 CMPI #Scaled135, R4 ; Checking Scaled135 - R4 BC @@MoreHorzS CMPI #Scaled45, R4 ; Checking Scaled45 - R4 ADCR R1 @@MoreHorzS: MVO R1, FacingHorz ; YNext = trunc(YPos + 1.0) (in 8.8 fixed-point format) MVI YPos, R1 ANDI #$FF00, R1 MVII #$0100, R0 ADDR R0, R1 MVO R1, YNext ; YInc = $0100 (1.0 in 8.8 fixed-point format) MVO R0, YInc ; R0 = cot(CurAng) (in 8.8 fixed-point format) MVII #Cot, R3 ADDR R4, R3 MVI@ R3, R0 ; XEdge = XPos + (trunc(YPos + 1.0) - YPos) * cot(CurAng) ; = XPos + (trunc(YPos + 1.0) - YPos) / tan(CurAng) ; = XPos + (1 - frac(YPos)) / tan(CurAng) SUB YPos, R1 JSR R5, FracFixedPtMultiplyPosNonZero ADD XPos, R3 MVO R3, XEdge B @@CheckEastWest @@FacingNorthward: ; ; Angle ranges from 180-360 degrees (facing northward) ; ; Determine if we're facing more horizontally or vertically. We need to ; do this for rendering accuracy. XORR R1, R1 DECR R1 CMPI #Scaled315, R4 ; Checking Scaled315 - R4 BC @@MoreHorzN CMPI #Scaled225, R4 ; Checking Scaled225 - R4 ADCR R1 @@MoreHorzN: MVO R1, FacingHorz ; YBack = $FF00 (-1.0 in 8.8 fixed-point format) MVI YPos, R1 MVII #$FF00, R0 MVO R0, YBack ; YNext = trunc(YPos) (in 8.8 fixed-point format) ANDR R0, R1 MVO R1, YNext ; YInc = $FF00 (-1.0 in 8.8 fixed-point format) MVO R0, YInc ; R0 = cot(CurAng) (in 8.8 fixed-point format) MVII #Cot, R3 ADDR R4, R3 MVI@ R3, R0 ; XEdge = XPos + (trunc(YPos) - YPos) * cot(CurAng) ; = XPos + (trunc(YPos) - YPos) / tan(CurAng) ; = XPos - frac(YPos) / tan(CurAng) SUB YPos, R1 JSR R5, FracFixedPtMultiplyNegNotNegOne ADD XPos, R3 MVO R3, XEdge @@CheckEastWest: ; Compare the angle with 90 degrees CMPI #Scaled90, R4 BNC @@FacingEastward ; Compare the angle with 270 degrees CMPI #Scaled270, R4 BNC @@FacingWestward @@FacingEastward: ; ; Angle is in the range 0..90 or 270..360 (facing eastward) ; ; XNext = trunc(XPos + 1.0) (in 8.8 fixed-point format) MVI XPos, R1 ANDI #$FF00, R1 MVII #$0100, R0 ADDR R0, R1 MVO R1, XNext ; XInc = $0100 (1.0 in 8.8 fixed-point format) MVO R0, XInc ; R0 = tan(CurAng) (in 8.8 fixed-point format) MVII #Tan, R3 ADDR R4, R3 MVI@ R3, R0 ; YEdge = YPos + (trunc(XPos + 1.0) - XPos) * tan(CurAng) ; = YPos + (1 - frac(XPos)) * tan(CurAng) SUB XPos, R1 JSR R5, FracFixedPtMultiplyPosNonZero ADD YPos, R3 MVO R3, YEdge ; XBack = 0 SUBR R0, R0 MVO R0, XBack B @@TestForWalls @@FacingWestward: ; ; Angle ranges from 90-270 degrees (facing westward) ; ; XNext = trunc(XPos) (in 8.8 fixed-point format) MVI XPos, R1 ; XBack = $FF00 (-1.0 in 8.8 fixed-point format) MVII #$FF00, R0 MVO R0, XBack ANDR R0, R1 MVO R1, XNext ; XInc = $FF00 (-1.0 in 8.8 fixed-point format) MVO R0, XInc ; R0 = tan(CurAng) (in 8.8 fixed-point format) MVII #Tan, R3 ADDR R4, R3 MVI@ R3, R0 ; YEdge = YPos + (trunc(XPos) - XPos) * tan(CurAng) ; = YPos - frac(XPos) * tan(CurAng) SUB XPos, R1 JSR R5, FracFixedPtMultiplyNegNotNegOne ADD YPos, R3 MVO R3, YEdge ; Begin testing for walls @@TestForWalls: SUBR R0, R0 ; NoTestVertWalls = false MVO R0, NoTestVertWalls ; NoTestHorzWalls = false MVO R0, NoTestHorzWalls ; CurDist = -1 MVII #$FF00, R0 MVO R0, CurDist ; Initialize the wall distances to 128.0 - epsilon (maximum positive value in 8.8 fixed-point format) MVII #$7FFF, R0 MVO R0, VertWallDist MVO R0, HorzWallDist ; XStep = XStepPerY(CurAng) ; YStep = YStepPerX(CurAng) MOVR R4, R1 MOVR R4, R2 ADDI #XStepPerY, R1 ADDI #YStepPerX, R2 MVI@ R1, R1 MVI@ R2, R2 MVO R1, XStep MVO R2, YStep ; R3 = 16.0 - epsilon (in 8.8 fixed-point format) MVII #$0FFF, R3 MVII #$00FF, R5 ; Check whether the ray is facing horizontally (east-west) or vertically (north-south) MVI FacingHorz, R0 TSTR R0 BNEQ @@PreRayLoopFacingHorz ADDI #Csc, R4 MVI@ R4, R4 MVI XNext, R0 ; XNext += XBack ADD XBack, R0 MVO R0, XNext ; ------------------------------------------------------------- ; Ray is facing vertically (north-south) ; ------------------------------------------------------------- @@RayLoopFacingVert: ; Stop if we reach the maximum distance or if we exceed the distance of a wall we found MVI CurDist, R0 ADDI #$0100, R0 CMP MaxDist, R0 BC @@DoneWallTests MVO R0, CurDist ; ; Test for vertical walls (walls facing east or west) ; ; R2 = XNext + XBack (in 8.8 fixed-point format) MVI XNext, R2 ; Has the X value gone outside the maze? CMPR R3, R2 BC @@PreRayLoopHorzOnlyFacingVert ; Has the Y value gone outside the maze? MVI YEdge, R1 CMPR R3, R1 BC @@PreRayLoopHorzOnlyFacingVert ; Get the maze column (drop the fractional part) SWAP R2 ANDR R5, R2 ; Get the maze row (drop the fractional part) SWAP R1 ANDR R5, R1 ; Check for a wall ADDI #Maze, R1 MVI@ R1, R1 ADDI #MazeBitMask, R2 AND@ R2, R1 BEQ @@NoVertWallHitFacingVert ; The ray hit a solid block: calculate the distance to a vertical wall ; VertWallDist = (YEdge - YPos) * csc(CurAng) ; = (YEdge - YPos) / sin(CurAng) MVI YEdge, R1 SUB YPos, R1 MOVR R4, R0 QS_SameSignOneTwoNegate_Mult_Kernel MVII #$0FFF, R3 MVO R1, VertWallDist B @@PreRayLoopHorzOnlyFacingVert @@NoVertWallHitFacingVert: ; YEdge += YStep MVI YEdge, R0 ADD YStep, R0 MVO R0, YEdge ; XNext += XInc MVI XInc, R0 ADD XNext, R0 MVO R0, XNext ; ; Test for horizontal walls (walls facing north or south) ; ; Has the X value gone outside the maze? MVI XEdge, R2 CMPR R3, R2 BC @@PreRayLoopVertOnlyFacingVert ; R1 = YNext + YBack (in 8.8 fixed-point format) MVI YNext, R1 ADD YBack, R1 ; Has the Y value gone outside the maze? CMPR R3, R1 BC @@PreRayLoopVertOnlyFacingVert ; Get the maze column (drop the fractional part) SWAP R2 ANDR R5, R2 ; Get the maze row (drop the fractional part) SWAP R1 ANDR R5, R1 ; Check for a wall ADDI #Maze, R1 MVI@ R1, R1 ADDI #MazeBitMask, R2 AND@ R2, R1 BEQ @@NoHorzWallHitFacingVert ; The ray hit a solid block: calculate the distance to a horizontal wall ; HorzWallDist = (YNext - YPos) * csc(CurAng) ; = (YNext - YPos) / sin(CurAng) MVI YNext, R1 SUB YPos, R1 MOVR R4, R0 QS_SameSignOneTwoNegate_Mult_Kernel MVII #$0FFF, R3 MVO R1, HorzWallDist B @@PreRayLoopVertOnlyFacingVert @@NoHorzWallHitFacingVert: ; XEdge += XStep MVI XEdge, R0 ADD XStep, R0 MVO R0, XEdge ; YNext += YInc MVI YInc, R0 ADD YNext, R0 MVO R0, YNext B @@RayLoopFacingVert ; ; Only check for vertical walls ; @@PreRayLoopVertOnlyFacingVert: MVI XNext, R2 MVI YEdge, R1 @@RayLoopVertOnlyFacingVert: ; Stop if we reach the maximum distance or if we exceed the distance of a wall we found MVI CurDist, R0 ADDI #$0100, R0 CMP HorzWallDist, R0 BC @@DoneWallTests CMP MaxDist, R0 BC @@DoneWallTests MVO R0, CurDist ; ; Test for vertical walls (walls facing east or west) ; ; R2 = XNext + XBack (in 8.8 fixed-point format) ; Has the X value gone outside the maze? CMPR R3, R2 BC @@DoneWallTests ; Has the Y value gone outside the maze? CMPR R3, R1 BC @@DoneWallTests ; Get the maze column (drop the fractional part) SWAP R2 ANDR R5, R2 ; Get the maze row (drop the fractional part) SWAP R1 ANDR R5, R1 ; Check for a wall ADDI #Maze, R1 MVI@ R1, R1 ADDI #MazeBitMask, R2 AND@ R2, R1 BEQ @@NoVertWallHitVertOnlyFacingVert ; The ray hit a solid block: calculate the distance to a vertical wall ; VertWallDist = (YEdge - YPos) * csc(CurAng) ; = (YEdge - YPos) / sin(CurAng) MVI YEdge, R1 SUB YPos, R1 MOVR R4, R0 QS_SameSignOneTwoNegate_Mult_Kernel MVO R1, VertWallDist B @@DoneWallTests @@NoVertWallHitVertOnlyFacingVert: ; YEdge += YStep MVI YEdge, R1 ADD YStep, R1 MVO R1, YEdge ; XNext += XInc MVI XInc, R2 ADD XNext, R2 MVO R2, XNext B @@RayLoopVertOnlyFacingVert ; ; Only check for horizontal walls ; @@PreRayLoopHorzOnlyFacingVert: MVI XEdge, R2 MVI YNext, R1 @@RayLoopHorzOnlyFacingVert: ; ; Test for horizontal walls (walls facing north or south) ; ; R1 = YNext + YBack (in 8.8 fixed-point format) ADD YBack, R1 ; Has the X value gone outside the maze? CMPR R3, R2 BC @@DoneWallTests ; Has the Y value gone outside the maze? CMPR R3, R1 BC @@DoneWallTests ; Get the maze column (drop the fractional part) SWAP R2 ANDR R5, R2 ; Get the maze row (drop the fractional part) SWAP R1 ANDR R5, R1 ; Check for a wall ADDI #Maze, R1 MVI@ R1, R1 ADDI #MazeBitMask, R2 AND@ R2, R1 BEQ @@NoHorzWallHitHorzOnlyFacingVert ; The ray hit a solid block: calculate the distance to a horizontal wall ; HorzWallDist = (YNext - YPos) * csc(CurAng) ; = (YNext - YPos) / sin(CurAng) MVI YNext, R1 SUB YPos, R1 MOVR R4, R0 QS_SameSignOneTwoNegate_Mult_Kernel MVO R1, HorzWallDist B @@DoneWallTests @@NoHorzWallHitHorzOnlyFacingVert: ; XEdge += XStep MVI XEdge, R2 ADD XStep, R2 MVO R2, XEdge ; YNext += YInc MVI YInc, R1 ADD YNext, R1 MVO R1, YNext ; Stop if we reach the maximum distance or if we exceed the distance of a wall we found MVI CurDist, R0 ADDI #$0100, R0 CMP VertWallDist, R0 BC @@DoneWallTests CMP MaxDist, R0 BC @@DoneWallTests MVO R0, CurDist B @@RayLoopHorzOnlyFacingVert ; ------------------------------------------------------------- ; Ray is facing horizontally (east-west) ; ------------------------------------------------------------- @@PreRayLoopFacingHorz: ADDI #Sec, R4 MVI@ R4, R4 MVI YNext, R0 ; YNext += YBack ADD YBack, R0 MVO R0, YNext @@RayLoopFacingHorz: ; Stop if we reach the maximum distance or if we exceed the distance of a wall we found MVI CurDist, R0 ADDI #$0100, R0 CMP MaxDist, R0 BC @@DoneWallTests MVO R0, CurDist ; ; Test for vertical walls (walls facing east or west) ; ; R2 = XNext + XBack (in 8.8 fixed-point format) MVI XNext, R2 ADD XBack, R2 ; Has the X value gone outside the maze? CMPR R3, R2 BC @@PreRayLoopHorzOnlyFacingHorz ; Has the Y value gone outside the maze? MVI YEdge, R1 CMPR R3, R1 BC @@PreRayLoopHorzOnlyFacingHorz ; Get the maze column (drop the fractional part) SWAP R2 ANDR R5, R2 ; Get the maze row (drop the fractional part) SWAP R1 ANDR R5, R1 ; Check for a wall ADDI #Maze, R1 MVI@ R1, R1 ADDI #MazeBitMask, R2 AND@ R2, R1 BEQ @@NoVertWallHitFacingHorz ; The ray hit a solid block: calculate the distance to a vertical wall ; VertWallDist = (XNext - XPos) * sec(CurAng) ; = (XNext - XPos) / cos(CurAng) MVI XNext, R1 SUB XPos, R1 MOVR R4, R0 QS_SameSignOneTwoNegate_Mult_Kernel MVII #$0FFF, R3 MVO R1, VertWallDist B @@PreRayLoopHorzOnlyFacingHorz @@NoVertWallHitFacingHorz: ; YEdge += YStep MVI YEdge, R0 ADD YStep, R0 MVO R0, YEdge ; XNext += XInc MVI XInc, R0 ADD XNext, R0 MVO R0, XNext @@DoneVertTestFacingHorz: ; ; Test for horizontal walls (walls facing north or south) ; ; Has the X value gone outside the maze? MVI XEdge, R2 CMPR R3, R2 BC @@PreRayLoopVertOnlyFacingHorz ; R1 = YNext + YBack (in 8.8 fixed-point format) MVI YNext, R1 ; Has the Y value gone outside the maze? CMPR R3, R1 BC @@PreRayLoopVertOnlyFacingHorz ; Get the maze column (drop the fractional part) SWAP R2 ANDR R5, R2 ; Get the maze row (drop the fractional part) SWAP R1 ANDR R5, R1 ; Check for a wall ADDI #Maze, R1 MVI@ R1, R1 ADDI #MazeBitMask, R2 AND@ R2, R1 BEQ @@NoHorzWallHitFacingHorz ; The ray hit a solid block: calculate the distance to a horizontal wall ; HorzWallDist = (XEdge - XPos) * sec(CurAng) ; = (XEdge - XPos) / cos(CurAng) MVI XEdge, R1 SUB XPos, R1 MOVR R4, R0 QS_SameSignOneTwoNegate_Mult_Kernel MVII #$0FFF, R3 MVO R1, HorzWallDist B @@PreRayLoopVertOnlyFacingHorz @@NoHorzWallHitFacingHorz: ; XEdge += XStep MVI XEdge, R0 ADD XStep, R0 MVO R0, XEdge ; YNext += YInc MVI YInc, R0 ADD YNext, R0 MVO R0, YNext B @@RayLoopFacingHorz ; ; Only check for vertical walls ; @@PreRayLoopVertOnlyFacingHorz: MVI XNext, R2 MVI YEdge, R1 @@RayLoopVertOnlyFacingHorz: ; Stop if we reach the maximum distance or if we exceed the distance of a wall we found MVI CurDist, R0 ADDI #$0100, R0 CMP HorzWallDist, R0 BC @@DoneWallTests CMP MaxDist, R0 BC @@DoneWallTests MVO R0, CurDist ; ; Test for vertical walls (walls facing east or west) ; ; R2 = XNext + XBack (in 8.8 fixed-point format) ADD XBack, R2 ; Has the X value gone outside the maze? CMPR R3, R2 BC @@DoneWallTests ; Has the Y value gone outside the maze? CMPR R3, R1 BC @@DoneWallTests ; Get the maze column (drop the fractional part) SWAP R2 ANDR R5, R2 ; Get the maze row (drop the fractional part) SWAP R1 ANDR R5, R1 ; Check for a wall ADDI #Maze, R1 MVI@ R1, R1 ADDI #MazeBitMask, R2 AND@ R2, R1 BEQ @@NoVertWallHitVertOnlyFacingHorz ; The ray hit a solid block: calculate the distance to a vertical wall ; VertWallDist = (XNext - XPos) * sec(CurAng) ; = (XNext - XPos) / cos(CurAng) MVI XNext, R1 SUB XPos, R1 MOVR R4, R0 QS_SameSignOneTwoNegate_Mult_Kernel MVO R1, VertWallDist B @@DoneWallTests @@NoVertWallHitVertOnlyFacingHorz: ; YEdge += YStep MVI YEdge, R1 ADD YStep, R1 MVO R1, YEdge ; XNext += XInc MVI XInc, R2 ADD XNext, R2 MVO R2, XNext B @@RayLoopVertOnlyFacingHorz ; ; Only check for horizontal walls ; @@PreRayLoopHorzOnlyFacingHorz: MVI XEdge, R2 MVI YNext, R1 ; ; Test for horizontal walls (walls facing north or south) ; @@RayLoopHorzOnlyFacingHorz: ; Has the X value gone outside the maze? CMPR R3, R2 BC @@DoneWallTests ; R1 = YNext + YBack (in 8.8 fixed-point format) ; Has the Y value gone outside the maze? CMPR R3, R1 BC @@DoneWallTests ; Get the maze column (drop the fractional part) SWAP R2 ANDR R5, R2 ; Get the maze row (drop the fractional part) SWAP R1 ANDR R5, R1 ; Check for a wall ADDI #Maze, R1 MVI@ R1, R1 ADDI #MazeBitMask, R2 AND@ R2, R1 BEQ @@NoHorzWallHitHorzOnlyFacingHorz ; The ray hit a solid block: calculate the distance to a horizontal wall ; HorzWallDist = (XEdge - XPos) * sec(CurAng) ; = (XEdge - XPos) / cos(CurAng) MVI XEdge, R1 SUB XPos, R1 MOVR R4, R0 QS_SameSignOneTwoNegate_Mult_Kernel MVO R1, HorzWallDist B @@DoneWallTests @@NoHorzWallHitHorzOnlyFacingHorz: ; XEdge += XStep MVI XEdge, R2 ADD XStep, R2 MVO R2, XEdge ; YNext += YInc MVI YInc, R1 ADD YNext, R1 MVO R1, YNext ; Stop if we reach the maximum distance or if we exceed the distance of a wall we found MVI CurDist, R0 ADDI #$0100, R0 CMP VertWallDist, R0 BC @@DoneWallTests CMP MaxDist, R0 BC @@DoneWallTests MVO R0, CurDist B @@RayLoopHorzOnlyFacingHorz ; ------------------------------------------------------------- ; Finished checking for walls ; ------------------------------------------------------------- @@DoneWallTests: ; Use whichever distance is shorter to determine which wall to draw. MVI VertWallDist, R1 CMP HorzWallDist, R1 BGE @@DrawHorzWall CMP MaxDist, R1 BC @@NextPixel ; If there was no wall intersection, skip this ray CMPI #$7FFF, R1 BEQ @@NextPixel ; ; Drawing a vertical wall (a wall facing east or west) ; ; R0 = 16 * sec(ray angle) (in 8.8 fixed-point format, ray angle ranges from -30 degrees to +30 degrees) ; = 16 / cos(ray angle) MVI DrawX, R2 ADDI #SecPixel, R2 MVI@ R2, R0 SLL R0, 2 SLL R0, 2 INCR R1 ; Want the quotient in 8.8 fixed-point format MVII #$0008, R2 ; R3 = R0 / (VertWallDist + epsilon) (done to prevent division by 0) ; = 16 / cos(ray angle) * (VertWallDist + epsilon) JSR R5, UnsafeDivide ; R3 = abs(R3) TSTR R3 BPL @@R3AbsH NEGR R3 @@R3AbsH: ; Drop the fractional bits: R3 = trunc(R3) SWAP R3 ANDI #$00FF, R3 BEQ @@NextPixel ; Don't exceed the bitmap height CMPI #BmpHeight, R3 BLT @@ClampHeightH MVII #BmpHeight, R3 @@ClampHeightH: MOVR R3, R1 ; Center the ray vertically in the bitmap SAR R3 MVII #HalfBmpHeight, R0 SUBR R3, R0 MVO R0, DrawTop ADDR R1, R0 MVO R0, DrawBot ; Leave gaps near the wall edges so we can see them MVI YEdge, R0 MOVR R0, R1 COMR R1 ; If the fractional part of the Y value is less than 8, skip drawing ANDI #$00F8, R0 BEQ @@NextPixel ; If the fractional part of the Y value is greater than 248, skip drawing ANDI #$00F8, R1 BEQ @@NextPixel ; Draw the ray @@DrawVertWallRay: JSR R5, DrawRay B @@NextPixel @@DrawHorzWall: MVI HorzWallDist, R1 CMP MaxDist, R1 BC @@NextPixel ; If there was no wall intersection, skip this ray CMPI #$7FFF, R1 BEQ @@NextPixel ; ; Drawing a horizontal wall (a wall facing north or south) ; ; R0 = 16 * sec(ray angle) (in 8.8 fixed-point format, ray angle ranges from -30 degrees to +30 degrees) ; = 16 / cos(ray angle) MVI DrawX, R2 ADDI #SecPixel, R2 MVI@ R2, R0 SLL R0, 2 SLL R0, 2 INCR R1 ; Want the quotient in 8.8 fixed-point format MVII #$0008, R2 ; R3 = R0 / (HorzWallDist + epsilon) (done to prevent division by 0) ; = 16 / cos(ray angle) * (HorzWallDist + epsilon) JSR R5, UnsafeDivide ; R3 = abs(R3) TSTR R3 BPL @@R3AbsV NEGR R3 @@R3AbsV: ; Drop the fractional bits: R3 = trunc(R3) SWAP R3 ANDI #$00FF, R3 BEQ @@NextPixel ; Don't exceed the bitmap height CMPI #BmpHeight, R3 BLT @@ClampHeightV MVII #BmpHeight, R3 @@ClampHeightV: MOVR R3, R1 ; Center the ray vertically in the bitmap SAR R3 MVII #HalfBmpHeight, R0 SUBR R3, R0 MVO R0, DrawTop ADDR R1, R0 MVO R0, DrawBot ; Leave gaps near the wall edges so we can see them MVI XEdge, R0 MOVR R0, R1 COMR R1 ; If the fractional part of the X value is less than 8, skip drawing ANDI #$00F8, R0 BEQ @@NextPixel ; If the fractional part of the X value is greater than 248, skip drawing ANDI #$00F8, R1 BEQ @@NextPixel ; Draw the ray @@DrawHorzWallRay: JSR R5, DrawRay @@NextPixel: ; Increment the angle by one unit, or 0.75 degrees. This works because ; our bitmap is 80 pixels wide and our FOV is 60 degrees. MVI CurAng, R0 INCR R0 CMPI #Scaled360, R0 BLT @@NextNoWrap SUBR R0, R0 @@NextNoWrap: MVO R0, CurAng ; Move right one pixel MVI DrawX, R0 INCR R0 MVO R0, DrawX B @@XLoop @@DoneRender: ; Set a flag to tell the interrupt routine that it can copy cards to GRAM MVO R7, DoneRendering MVO R7, UpdateAllowed PULR R7 ENDP ; ------------------------------------------------------------- ; Kernel for fractional multiplication (0 <= i1 and 0 <= i2 < 1) ; ; i1 can be any register ; i2 must be R1..R3 ; temp must be R0..R3 ; result must be R0..R3 MACRO QS_Frac_Mult_Kernel(i1, i2, temp, result) MOVR %i1%, %temp% ; 6 ANDI #$00FF, %i1% ; 8 XORR %i1%, %temp% ; 6 SWAP %temp% ; 6 ADDI #qs_mpy8.mid, %i2% ; 8 ; i1.lo * i2 ADDR %i1%, %i2% ; 6 a + b MVI@ %i2%, %result% ; 8 SUBR %i1%, %i2% ; 6 a SUBR %i1%, %i2% ; 6 a - b SUB@ %i2%, %result% ; 8 ADDR %i1%, %i2% ; 6 a ADDI #$0080, %result% ; 8 round the result SWAP %result% ; 6 ANDI #$00FF, %result% ; 8 ; i1.hi * i2 ADDR %temp%, %i2% ; 6 a + b ADD@ %i2%, %result% ; 8 SUBR %temp%, %i2% ; 6 a SUBR %temp%, %i2% ; 6 a - b SUB@ %i2%, %result% ; 8 ENDM ; ------------------------------------------------------------- ; Kernel for fractional multiplication (0 <= i1 and 0 <= i2 < 1) ; ; i1 can be any register ; i2 must be R1..R3 ; temp must be R0..R3 ; result must be R0..R3 ; R5 must contain $FF00 MACRO QS_Frac_Mult_Kernel_Mask0(i1, i2, temp, result) MOVR %i1%, %temp% ; 6 ANDR R5, %temp% ; 6 XORR %temp%, %i1% ; 6 SWAP %temp% ; 6 ADDI #qs_mpy8.mid, %i2% ; 8 ; i1.lo * i2 ADDR %i1%, %i2% ; 6 a + b MVI@ %i2%, %result% ; 8 SUBR %i1%, %i2% ; 6 a SUBR %i1%, %i2% ; 6 a - b SUB@ %i2%, %result% ; 8 ADDR %i1%, %i2% ; 6 a ADDI #$0080, %result% ; 8 round the result ANDR R5, %result% ; 6 SWAP %result% ; 6 ; i1.hi * i2 ADDR %temp%, %i2% ; 6 a + b ADD@ %i2%, %result% ; 8 SUBR %temp%, %i2% ; 6 a SUBR %temp%, %i2% ; 6 a - b SUB@ %i2%, %result% ; 8 ENDM ; ------------------------------------------------------------- ; Kernel for fractional multiplication (0 <= i1 and 0 <= i2 < 1) ; ; i1 must be R1..R3 ; i2 can be any register ; temp must be R0..R3 ; result must be R0..R3 ; R5 must contain $FF00 MACRO QS_Frac_Mult_Kernel_Mask(i1, i2, temp, result) MOVR %i1%, %temp% ; 6 ANDR R5, %temp% ; 6 XORR %temp%, %i1% ; 6 i1.lo SWAP %temp% ; 6 i1.hi SUBR %i1%, %temp% ; 6 i1.hi - i1.lo ADDI #qs_mpy8.mid, %i1% ; 8 i1.lo + qs_mpy8.mid ; i1.lo * i2 ADDR %i2%, %i1% ; 6 a + b ADDR %i2%, %i2% ; 6 MVI@ %i1%, %result% ; 8 SUBR %i2%, %i1% ; 6 a - b SUB@ %i1%, %result% ; 8 ADDI #$0080, %result% ; 8 round the result ANDR R5, %result% ; 6 SWAP %result% ; 6 ; i1.hi * i2 ADDR %temp%, %i1% ; 6 a - b SUB@ %i1%, %result% ; 8 ADDR %i2%, %i1% ; 6 a + b ADD@ %i1%, %result% ; 8 ENDM ; ------------------------------------------------------------- ; Kernel for fractional multiplication (1 <= i1 < 2 and 0 <= i2 < 1) ; ; i1 must be R1..R3 ; i2 can be any register ; result must be R0..R3 ; R5 must contain $FF00 MACRO QS_Frac_Mult_Kernel_Mask_LT2(i1, i2, result) ADDI #(qs_mpy8.mid-$0100), %i1% ; 8 i1.lo + qs_mpy8.mid ; i1.lo * i2 ADDR %i2%, %i1% ; 6 a + b MVI@ %i1%, %result% ; 8 SUBR %i2%, %i1% ; 6 a SUBR %i2%, %i1% ; 6 a - b SUB@ %i1%, %result% ; 8 ADDI #$0080, %result% ; 8 round the result ANDR R5, %result% ; 6 SWAP %result% ; 6 ; Add i2 ADDR %i2%, %result% ; 6 ENDM ; ------------------------------------------------------------- ; Kernel for fractional multiplication (2 <= i1 < 3 and 0 <= i2 < 1) ; ; i1 must be R1..R3 ; i2 can be any register ; result must be R0..R3 ; R5 must contain $FF00 MACRO QS_Frac_Mult_Kernel_Mask_LT3(i1, i2, result) ADDI #(qs_mpy8.mid-$0200), %i1% ; 8 i1.lo + qs_mpy8.mid ; i1.lo * i2 ADDR %i2%, %i1% ; 6 a + b MVI@ %i1%, %result% ; 8 SUBR %i2%, %i1% ; 6 a SUBR %i2%, %i1% ; 6 a - b SUB@ %i1%, %result% ; 8 ADDI #$0080, %result% ; 8 round the result ANDR R5, %result% ; 6 SWAP %result% ; 6 ; Add i2 twice ADDR %i2%, %result% ; 6 ADDR %i2%, %result% ; 6 ENDM ; ------------------------------------------------------------- ; Kernel for fractional multiplication where either: ; 0 <= i2 < 1 and 0 <= i1 < 1 ; or -1 < i2 <= 0 and -1 < i1 <= 0 ; ; i1 can be any register ; i2 must be R1..R3 ; result must be R2..R3 ; R5 must contain $FF00 MACRO QS_Frac_Mult_Kernel_LT1(i1, i2, result) ; i1.lo * i2 ADDI #qs_mpy8.mid, %i2% ; 8 ADDR %i1%, %i2% ; 6 a + b MVI@ %i2%, %result% ; 8 SUBR %i1%, %i2% ; 6 a SUBR %i1%, %i2% ; 6 a - b SUB@ %i2%, %result% ; 8 ADDI #$0080, %result% ; 8 round the result ANDR R5, %result% ; 6 SWAP %result% ; 6 ENDM ; ------------------------------------------------------------- ; Kernel for fractional multiplication where either: ; 0 <= i2 < 1 and -1 < i1 <= 0 ; or -1 < i2 <= 0 and 0 <= i1 < 1 ; ; i1 can be any register ; i2 must be R1..R3 ; result must be R0..R3 ; R5 must contain $FF00 MACRO QS_Frac_Mult_Kernel_GTN1(i1, i2, result) ; -i1.lo * i2 ADDI #qs_mpy8.mid, %i2% ; 8 SUBR %i1%, %i2% ; 6 a - b MVI@ %i2%, %result% ; 8 ADDR %i1%, %i2% ; 6 a ADDR %i1%, %i2% ; 6 a + b SUB@ %i2%, %result% ; 8 ADDI #$0080, %result% ; 8 round the result ANDR R5, %result% ; 6 SWAP %result% ; 6 ENDM ; ------------------------------------------------------------- ; Signed fixed-point multiply using Quarter-Square Multiplication ; where the multiplicands are always either both positive or both ; negative (the result will always be positive). Also, where |R0| ; is always greater than or equal to 1 but less than 2. ; ; Inputs ; ; R0 = Multiplicand 1 (in 8.8 fixed-point format) ; R1 = Multiplicand 2 (in 8.8 fixed-point format) ; ; Outputs ; ; reg1 = Result (in 8.8 fixed-point format) ; Destroys reg0, temp1, and temp2 ; mask must contain $FF00 ; temp1 cannot be R0 MACRO QS_SameSignOneTwo_Mult_Kernel(negate, reg0, reg1, temp1, temp2, mask) IF %negate% NEGR %reg0% NEGR %reg1% ENDI ; Only multiply by R0.lo since R0.hi is always 1 ANDI #$00FF, %reg0% ; R0 <-- R0.lo MOVR %reg1%, %temp2% ; R3 <-- R0.hi * R1 = R1 MOVR %reg1%, %temp1% ANDR %mask%, %temp1% XORR %temp1%, %reg1% ; R1 <-- R1.lo SWAP %temp1% ; R2 <-- R1.hi SUBR %temp1%, %reg1% ; R1 <-- R1.lo - R1.hi ADDI #qs_mpy8.mid, %temp1% ; R2 <-- R1.hi + qs_mpy8.mid ADDR %reg0%, %temp1% ; 6 a + b ADDR %reg0%, %reg0% ; 6 ADD@ %temp1%, %temp2% ; 8 SUBR %reg0%, %temp1% ; 6 a - b SUB@ %temp1%, %temp2% ; 8 ADDR %reg0%, %temp1% ; 6 a + b ; Switch from R1.hi to R1.lo ADDR %reg1%, %temp1% ; 6 a + b MVI@ %temp1%, %reg1% ; 8 SUBR %reg0%, %temp1% ; 6 a - b SUB@ %temp1%, %reg1% ; 8 ADDI #$0080, %reg1% ; 8 round the result ANDR %mask%, %reg1% SWAP %reg1% ADDR %temp2%, %reg1% ENDM MACRO DDATest(dir, if_hit) MOVR R0, R2 ADDR R3, R2 IF %dir% = DIR_EAST ADDI #MazeRight2, R2 ELSE IF %dir% = DIR_WEST ADDI #MazeLeft, R2 ELSE IF %dir% = DIR_NORTH ADDI #MazeTop, R2 ELSE IF %dir% = DIR_SOUTH ADDI #MazeBottom2, R2 ENDI ENDI ENDI ENDI SUB@ R2, R2 BNEQ %if_hit% IF %dir% = DIR_EAST INCR R3 CMPI #$0010, R3 BC @@BlankRay ADD XStep, R1 ELSE IF %dir% = DIR_WEST DECR R3 BMI @@BlankRay ADD XStep, R1 ELSE IF %dir% = DIR_NORTH SUBI #$0010, R0 BMI @@BlankRay ADD YStep, R4 ELSE IF %dir% = DIR_SOUTH ADDI #$0010, R0 CMPI #$0100, R0 BC @@BlankRay ADD YStep, R4 ENDI ENDI ENDI ENDI ENDM MACRO GetXPosInt(dest) MVI XPos, %dest% ANDI #$FF00, %dest% SWAP %dest% ENDM MACRO GetYPosIntTimes16(dest) MVI YPosInt, %dest% SLL %dest%, 2 SLL %dest%, 2 ENDM MACRO VertWallHitEastNorth(x) @@VertWallHitEN%x%: CMP MaxDist, R1 BC @@BlankRay ADDI #@@Times16, R3 MVI@ R3, R2 ADDI #(MazeRight2 + %x%), R2 SUB@ R2, R2 MVO R2, WallColor B @@DrawWall ENDM MACRO VertWallHitEastSouth(x) @@VertWallHitES%x%: CMP MaxDist, R1 BC @@BlankRay ADDI #@@Times16Opp, R3 MVI@ R3, R2 ADDI #(MazeRight2 + %x%), R2 SUB@ R2, R2 MVO R2, WallColor B @@DrawWall ENDM MACRO VertWallHitWestNorth(x) @@VertWallHitWN%x%: CMP MaxDist, R1 BC @@BlankRay ADDI #@@Times16, R3 MVI@ R3, R2 ADDI #(MazeLeft + 15 - %x%), R2 SUB@ R2, R2 MVO R2, WallColor B @@DrawWall ENDM MACRO VertWallHitWestSouth(x) @@VertWallHitWS%x%: CMP MaxDist, R1 BC @@BlankRay ADDI #@@Times16Opp, R3 MVI@ R3, R2 ADDI #(MazeLeft + 15 - %x%), R2 SUB@ R2, R2 MVO R2, WallColor B @@DrawWall ENDM MACRO HorzWallHitNorthWest(x) @@HorzWallHitNW%x%: CMP MaxDist, R4 BC @@BlankRay MOVR R4, R1 ADDI #(MazeTop + (15 - %x%) * 16), R3 SUB@ R3, R3 MVO R3, WallColor B @@DrawWall ENDM MACRO HorzWallHitNorthEast(x) @@HorzWallHitNE%x%: CMP MaxDist, R4 BC @@BlankRay MOVR R4, R1 MVII #$000F, R2 SUBR R3, R2 ADDI #(MazeTop + (15 - %x%) * 16), R2 SUB@ R2, R2 MVO R2, WallColor B @@DrawWall ENDM MACRO HorzWallHitSouthWest(x) @@HorzWallHitSW%x%: CMP MaxDist, R4 BC @@BlankRay MOVR R4, R1 ADDI #(MazeBottom2 + %x% * 16), R3 SUB@ R3, R3 MVO R3, WallColor B @@DrawWall ENDM MACRO HorzWallHitSouthEast(x) @@HorzWallHitSE%x%: CMP MaxDist, R4 BC @@BlankRay MOVR R4, R1 MVII #$000F, R2 SUBR R3, R2 ADDI #(MazeBottom2 + %x% * 16), R2 SUB@ R2, R2 MVO R2, WallColor B @@DrawWall ENDM MACRO HorzWallHitNorth(x) @@HorzWallHitN%x%: CMP MaxDist, R4 BC @@BlankRay MOVR R4, R1 ADDI #(@@Times16 + 1), R3 MVI@ R3, R2 ADDI #(MazeTop + %x%), R2 SUB@ R2, R2 MVO R2, WallColor B @@DrawWall ENDM MACRO HorzWallHitSouth(x) @@HorzWallHitS%x%: CMP MaxDist, R4 BC @@BlankRay MOVR R4, R1 ADDI #(@@Times16Opp + 1), R3 MVI@ R3, R2 ADDI #(MazeBottom2 + %x%), R2 SUB@ R2, R2 MVO R2, WallColor B @@DrawWall ENDM MACRO VertWallHitWest(x) @@VertWallHitW%x%: CMP MaxDist, R1 BC @@BlankRay INCR R3 ADDI #(MazeLeft + %x% * 16), R3 SUB@ R3, R3 MVO R3, WallColor B @@DrawWall ENDM MACRO VertWallHitEast(x) @@VertWallHitE%x%: CMP MaxDist, R1 BC @@BlankRay MVII #$000E, R2 SUBR R3, R2 ADDI #(MazeRight2 + %x% * 16), R2 SUB@ R2, R2 MVO R2, WallColor B @@DrawWall ENDM MACRO NTest(dir, h, v, x) @@%dir%_%x%: CMPR R1, R4 BC @@%dir%_EW_%x% @@%dir%_Skip_%x%: IF %x% < 15 MOVR R0, R5 ANDI #(1 SHL (14 - %x%)), R5 BNEQ @@HorzWallHit%h%%v%%x% ADD YStep, R4 ELSE B @@BlankRay ENDI ENDM MACRO STest(dir, h, v, x) @@%dir%_%x%: CMPR R1, R4 BC @@%dir%_EW_%x% @@%dir%_Skip_%x%: IF %x% < 15 MOVR R0, R5 ANDI #(1 SHL (1 + %x%)), R5 BNEQ @@HorzWallHit%h%%v%%x% ADD YStep, R4 ELSE B @@BlankRay ENDI ENDM MACRO ETest(dir, h, v, x) @@%dir%_%x%: CMPR R4, R1 BC @@%dir%_NS_%x% @@%dir%_Skip_%x%: IF %x% < 15 MOVR R0, R5 ANDI #(1 SHL (14 - %x%)), R5 BNEQ @@VertWallHit%h%%v%%x% ADD XStep, R1 ELSE B @@BlankRay ENDI ENDM MACRO WTest(dir, h, v, x) @@%dir%_%x%: CMPR R4, R1 BC @@%dir%_NS_%x% @@%dir%_Skip_%x%: IF %x% < 15 MOVR R0, R5 ANDI #(1 SHL (1 + %x%)), R5 BNEQ @@VertWallHit%h%%v%%x% ADD XStep, R1 ELSE B @@BlankRay ENDI ENDM MACRO NorthTestE(dir, h, x, y) @@%dir%_NS_%x%: DECR R3 BMI @@BlankRay DECR R2 MVI@ R2, R0 MOVR R0, R5 ANDI #(1 SHL (15 - %x%)), R5 BNEQ @@HorzWallHitN%y% IF %x% < 15 ADD YStep, R4 B @@%dir%_Skip_%x% ELSE B @@BlankRay ENDI ENDM MACRO SouthTestE(dir, h, x, y) @@%dir%_NS_%x%: DECR R3 BMI @@BlankRay INCR R2 MVI@ R2, R0 MOVR R0, R5 ANDI #(1 SHL (15 - %x%)), R5 BNEQ @@HorzWallHitS%y% IF %x% < 15 ADD YStep, R4 B @@%dir%_Skip_%x% ELSE B @@BlankRay ENDI ENDM MACRO NorthTestW(dir, h, x, y) @@%dir%_NS_%x%: DECR R3 BMI @@BlankRay DECR R2 MVI@ R2, R0 MOVR R0, R5 ANDI #(1 SHL %x%), R5 BNEQ @@HorzWallHitN%y% IF %x% < 15 ADD YStep, R4 B @@%dir%_Skip_%x% ELSE B @@BlankRay ENDI ENDM MACRO SouthTestW(dir, h, x, y) @@%dir%_NS_%x%: DECR R3 BMI @@BlankRay INCR R2 MVI@ R2, R0 MOVR R0, R5 ANDI #(1 SHL %x%), R5 BNEQ @@HorzWallHitS%y% IF %x% < 15 ADD YStep, R4 B @@%dir%_Skip_%x% ELSE B @@BlankRay ENDI ENDM MACRO WestTestN(dir, h, x, y) @@%dir%_EW_%x%: DECR R3 BMI @@BlankRay DECR R2 MVI@ R2, R0 MOVR R0, R5 ANDI #(1 SHL (15 - %x%)), R5 BNEQ @@VertWallHitW%y% IF %x% < 15 ADD XStep, R1 B @@%dir%_Skip_%x% ELSE B @@BlankRay ENDI ENDM MACRO EastTestN(dir, h, x, y) @@%dir%_EW_%x%: DECR R3 BMI @@BlankRay INCR R2 MVI@ R2, R0 MOVR R0, R5 ANDI #(1 SHL (15 - %x%)), R5 BNEQ @@VertWallHitE%y% IF %x% < 15 ADD XStep, R1 B @@%dir%_Skip_%x% ELSE B @@BlankRay ENDI ENDM MACRO WestTestS(dir, h, x, y) @@%dir%_EW_%x%: DECR R3 BMI @@BlankRay DECR R2 MVI@ R2, R0 MOVR R0, R5 ANDI #(1 SHL %x%), R5 BNEQ @@VertWallHitW%y% IF %x% < 15 ADD XStep, R1 B @@%dir%_Skip_%x% ELSE B @@BlankRay ENDI ENDM MACRO EastTestS(dir, h, x, y) @@%dir%_EW_%x%: DECR R3 BMI @@BlankRay INCR R2 MVI@ R2, R0 MOVR R0, R5 ANDI #(1 SHL %x%), R5 BNEQ @@VertWallHitE%y% IF %x% < 15 ADD XStep, R1 B @@%dir%_Skip_%x% ELSE B @@BlankRay ENDI ENDM ; ------------------------------------------------------------- ; TASK ; ; Renders the bitmap via raycasting (colored-squares mode) RenderCS PROC PSHR R5 MVI MaxDistNext, R1 MVO R1, MaxDist ; Draw with a 60-degree field of view, so set the starting heading for ; the leftmost pixel as the current heading minus 30 degrees MVI Angle, R4 ; Angle values are scaled from 0-479, so 30 degrees translates to 40 SUBI #(Scaled30 - 1), R4 BC @@PositiveAng0 ; If the starting angle went negative, wrap it around ADDI #Scaled360, R4 @@PositiveAng0: MVO R4, CurAng GetYPosIntTimes16(R0) GetXPosInt(R3) MVO R0, YInc ; YInc = int(YPos) * 16 MVO R3, XInc ; XInc = int(XPos) NEGR R3 ADDI #$000F, R3 MVO R3, FacingHorz ; FacingHorz = 15 - int(XPos) MVI XPosFracLeft, R1 MOVR R1, R0 MOVR R1, R2 ADDI #$0080, R2 ADDR R2, R0 ANDI #$FF00, R0 ANDI #$FF00, R2 SWAP R0 SWAP R2 ADDR R1, R0 ADDR R1, R2 MVO R0, XBack ; XBack = XPosFracLeft * $01.02 MVO R2, XEdge ; XEdge = XPosFracLeft * $01.01 MVI XPosFrac, R1 MOVR R1, R0 MOVR R1, R2 ADDI #$0080, R2 ADDR R2, R0 ANDI #$FF00, R0 ANDI #$FF00, R2 SWAP R0 SWAP R2 ADDR R1, R0 ADDR R1, R2 MVO R0, DrawTop ; DrawTop = XPosFrac * $01.02 MVO R2, DrawBot ; DrawBot = XPosFrac * $01.01 MVI YPosFracLeft, R1 MOVR R1, R0 MOVR R1, R2 ADDI #$0080, R2 ADDR R2, R0 ANDI #$FF00, R0 ANDI #$FF00, R2 SWAP R0 SWAP R2 ADDR R1, R0 ADDR R1, R2 MVO R0, YBack ; YBack = YPosFracLeft * $01.02 MVO R2, YEdge ; YEdge = YPosFracLeft * $01.01 MVI YPosFrac, R1 MOVR R1, R0 MOVR R1, R2 ADDI #$0080, R2 ADDR R2, R0 ANDI #$FF00, R0 ANDI #$FF00, R2 SWAP R0 SWAP R2 ADDR R1, R0 ADDR R1, R2 MVO R0, NoTestVertWalls ; NoTestVertWalls = YPosFrac * $01.02 MVO R2, NoTestHorzWalls ; NoTestHorzWalls = YPosFrac * $01.01 ; Start at pixel 0 SUBR R0, R0 @@XLoop: MVO R0, DrawX ; Get the heading currently being rendered ; ; East - 0 degrees ; South - 90 degrees ; West - 180 degrees ; North - 270 degrees ; Initialize R5 as a mask MVII #$FF00, R5 ; Determine which way we're facing. We need to do this for rendering accuracy. ADDI #AngleJumpTable, R4 MVI@ R4, R7 ; --------------------------------------------------------------------- ; Begin testing for walls ; --------------------------------------------------------------------- @@AngENE1xx1xx: ADDI #(AbsCsc - AngleJumpTable - 1), R4 MVI@ R4, R1 ; R1 = abs(csc(CurAng)) MVO R1, YStep ; YStep = abs(csc(CurAng)) MVI YPosFrac, R0 QS_Frac_Mult_Kernel_Mask_LT2(R1, R0, R3) ; R3 = -(XNext - XPos) * csc(CurAng) ADDI #(AbsSec - AbsCsc - 1), R4 MVI@ R4, R2 ; R2 = abs(sec(CurAng)) MVO R2, XStep MOVR R3, R4 MVI XPosFracLeft, R0 QS_Frac_Mult_Kernel_Mask_LT2(R2, R0, R1) ; R1 = (YNext - YPos) * sec(CurAng) MVI YPosInt, R2 MOVR R2, R3 ADDI #Maze, R2 MVI@ R2, R0 MVI XInc, R5 ; XInc = int(XPos) ADDI #@@ENETable, R5 MVI@ R5, R7 @@AngENE2xx1xx: ADDI #(AbsCsc - AngleJumpTable - 1), R4 MVI@ R4, R1 ; R1 = abs(csc(CurAng)) MVO R1, YStep ; YStep = abs(csc(CurAng)) MVI YPosFrac, R0 QS_Frac_Mult_Kernel_Mask_LT3(R1, R0, R3) ; R3 = -(XNext - XPos) * csc(CurAng) ADDI #(AbsSec - AbsCsc - 1), R4 MVI@ R4, R2 ; R2 = abs(sec(CurAng)) MVO R2, XStep MOVR R3, R4 MVI XPosFracLeft, R0 QS_Frac_Mult_Kernel_Mask_LT2(R2, R0, R1) ; R1 = (YNext - YPos) * sec(CurAng) MVI YPosInt, R2 MOVR R2, R3 ADDI #Maze, R2 MVI@ R2, R0 MVI XInc, R5 ; XInc = int(XPos) ADDI #@@ENETable, R5 MVI@ R5, R7 @@AngENEx102: ADDI #(AbsCsc - AngleJumpTable - 1), R4 MVI@ R4, R1 ; R1 = abs(csc(CurAng)) MVO R1, YStep ; YStep = abs(csc(CurAng)) MVI YPosFrac, R0 QS_Frac_Mult_Kernel_Mask(R1, R0, R2, R3) ; R3 = -(XNext - XPos) * csc(CurAng) MOVR R3, R4 MVII #$0102, R2 MVO R2, XStep MVI XBack, R1 ; XBack = XPosFracLeft * $01.02 MVI YPosInt, R2 MOVR R2, R3 ADDI #Maze, R2 MVI@ R2, R0 MVI XInc, R5 ; XInc = int(XPos) ADDI #@@ENETable, R5 MVI@ R5, R7 @@AngENEx101: ADDI #(AbsCsc - AngleJumpTable - 1), R4 MVI@ R4, R1 ; R1 = abs(csc(CurAng)) MVO R1, YStep ; YStep = abs(csc(CurAng)) MVI YPosFrac, R0 QS_Frac_Mult_Kernel_Mask(R1, R0, R2, R3) ; R3 = -(XNext - XPos) * csc(CurAng) MOVR R3, R4 MVII #$0101, R2 MVO R2, XStep MVI XEdge, R1 ; XEdge = XPosFracLeft * $01.01 MVI YPosInt, R2 MOVR R2, R3 ADDI #Maze, R2 MVI@ R2, R0 MVI XInc, R5 ; XInc = int(XPos) ADDI #@@ENETable, R5 MVI@ R5, R7 @@AngENEx100: ADDI #(AbsCsc - AngleJumpTable - 1), R4 MVI@ R4, R1 ; R1 = abs(csc(CurAng)) MVO R1, YStep ; YStep = abs(csc(CurAng)) MVI YPosFrac, R0 QS_Frac_Mult_Kernel_Mask(R1, R0, R2, R3) ; R3 = -(XNext - XPos) * csc(CurAng) MOVR R3, R4 MVII #$0100, R2 MVO R2, XStep MVI XPosFracLeft, R1 MVI YPosInt, R2 MOVR R2, R3 ADDI #Maze, R2 MVI@ R2, R0 MVI XInc, R5 ; XInc = int(XPos) ADDI #@@ENETable, R5 MVI@ R5, R7 @@AngENEx1xx: ADDI #(AbsCsc - AngleJumpTable - 1), R4 MVI@ R4, R1 ; R1 = abs(csc(CurAng)) MVO R1, YStep ; YStep = abs(csc(CurAng)) MVI YPosFrac, R0 QS_Frac_Mult_Kernel_Mask(R1, R0, R2, R3) ; R3 = -(XNext - XPos) * csc(CurAng) ADDI #(AbsSec - AbsCsc - 1), R4 MVI@ R4, R2 ; R2 = abs(sec(CurAng)) MVO R2, XStep MOVR R3, R4 MVI XPosFracLeft, R0 QS_Frac_Mult_Kernel_Mask_LT2(R2, R0, R1) ; R1 = (YNext - YPos) * sec(CurAng) MVI YPosInt, R2 MOVR R2, R3 ADDI #Maze, R2 MVI@ R2, R0 MVI XInc, R5 ; XInc = int(XPos) ADDI #@@ENETable, R5 MVI@ R5, R7 ETest(ENE, E, N, 0) ETest(ENE, E, N, 1) ETest(ENE, E, N, 2) ETest(ENE, E, N, 3) ETest(ENE, E, N, 4) ETest(ENE, E, N, 5) ETest(ENE, E, N, 6) ETest(ENE, E, N, 7) ETest(ENE, E, N, 8) ETest(ENE, E, N, 9) ETest(ENE, E, N, 10) ETest(ENE, E, N, 11) ETest(ENE, E, N, 12) ETest(ENE, E, N, 13) ETest(ENE, E, N, 14) ETest(ENE, E, N, 15) NorthTestE(ENE, E, 0, 0) NorthTestE(ENE, E, 1, 1) NorthTestE(ENE, E, 2, 2) NorthTestE(ENE, E, 3, 3) NorthTestE(ENE, E, 4, 4) NorthTestE(ENE, E, 5, 5) NorthTestE(ENE, E, 6, 6) NorthTestE(ENE, E, 7, 7) NorthTestE(ENE, E, 8, 8) NorthTestE(ENE, E, 9, 9) NorthTestE(ENE, E, 10, 10) NorthTestE(ENE, E, 11, 11) NorthTestE(ENE, E, 12, 12) NorthTestE(ENE, E, 13, 13) NorthTestE(ENE, E, 14, 14) NorthTestE(ENE, E, 15, 15) @@ENETable: DCW @@ENE_0, @@ENE_1, @@ENE_2, @@ENE_3, @@ENE_4, @@ENE_5, @@ENE_6, @@ENE_7 DCW @@ENE_8, @@ENE_9, @@ENE_10, @@ENE_11, @@ENE_12, @@ENE_13, @@ENE_14, @@ENE_15 @@AngESE1xx1xx: ADDI #(Csc - AngleJumpTable - 1), R4 MVI@ R4, R1 ; R1 = csc(CurAng) MVO R1, YStep MVI YPosFracLeft, R0 QS_Frac_Mult_Kernel_Mask_LT2(R1, R0, R3) ; R3 = -(XNext - XPos) * csc(CurAng) ADDI #(Sec - Csc - 1), R4 MVI@ R4, R2 ; R2 = sec(CurAng) MVO R2, XStep MOVR R3, R4 MVI XPosFracLeft, R0 QS_Frac_Mult_Kernel_Mask_LT2(R2, R0, R1) MVI YPosIntOpp, R3 MVI YPosInt, R2 ADDI #Maze, R2 MVI@ R2, R0 MVI XInc, R5 ; XInc = int(XPos) ADDI #@@ESETable, R5 MVI@ R5, R7 @@AngESE2xx1xx: ADDI #(Csc - AngleJumpTable - 1), R4 MVI@ R4, R1 ; R1 = csc(CurAng) MVO R1, YStep MVI YPosFracLeft, R0 QS_Frac_Mult_Kernel_Mask_LT3(R1, R0, R3) ; R3 = -(XNext - XPos) * csc(CurAng) ADDI #(Sec - Csc - 1), R4 MVI@ R4, R2 ; R2 = sec(CurAng) MVO R2, XStep MOVR R3, R4 MVI XPosFracLeft, R0 QS_Frac_Mult_Kernel_Mask_LT2(R2, R0, R1) MVI YPosIntOpp, R3 MVI YPosInt, R2 ADDI #Maze, R2 MVI@ R2, R0 MVI XInc, R5 ; XInc = int(XPos) ADDI #@@ESETable, R5 MVI@ R5, R7 @@AngESEx102: ADDI #(Csc - AngleJumpTable - 1), R4 MVI@ R4, R1 ; R1 = csc(CurAng) MVO R1, YStep MVI YPosFracLeft, R0 QS_Frac_Mult_Kernel_Mask(R1, R0, R2, R3) ; R3 = -(XNext - XPos) * csc(CurAng) MOVR R3, R4 MVII #$0102, R2 MVO R2, XStep MVI XBack, R1 ; XBack = XPosFracLeft * $01.02 MVI YPosIntOpp, R3 MVI YPosInt, R2 ADDI #Maze, R2 MVI@ R2, R0 MVI XInc, R5 ; XInc = int(XPos) ADDI #@@ESETable, R5 MVI@ R5, R7 @@AngESEx101: ADDI #(Csc - AngleJumpTable - 1), R4 MVI@ R4, R1 ; R1 = csc(CurAng) MVO R1, YStep MVI YPosFracLeft, R0 QS_Frac_Mult_Kernel_Mask(R1, R0, R2, R3) ; R3 = -(XNext - XPos) * csc(CurAng) MOVR R3, R4 MVII #$0101, R2 MVO R2, XStep MVI XEdge, R1 ; XEdge = XPosFracLeft * $01.01 MVI YPosIntOpp, R3 MVI YPosInt, R2 ADDI #Maze, R2 MVI@ R2, R0 MVI XInc, R5 ; XInc = int(XPos) ADDI #@@ESETable, R5 MVI@ R5, R7 @@AngESEx100: ADDI #(Csc - AngleJumpTable - 1), R4 MVI@ R4, R1 ; R1 = csc(CurAng) MVO R1, YStep MVI YPosFracLeft, R0 QS_Frac_Mult_Kernel_Mask(R1, R0, R2, R3) ; R3 = -(XNext - XPos) * csc(CurAng) MOVR R3, R4 MVII #$0100, R2 MVO R2, XStep MVI XPosFracLeft, R1 MVI YPosIntOpp, R3 MVI YPosInt, R2 ADDI #Maze, R2 MVI@ R2, R0 MVI XInc, R5 ; XInc = int(XPos) ADDI #@@ESETable, R5 MVI@ R5, R7 @@AngESEx1xx: ADDI #(Csc - AngleJumpTable - 1), R4 MVI@ R4, R1 ; R1 = csc(CurAng) MVO R1, YStep MVI YPosFracLeft, R0 QS_Frac_Mult_Kernel_Mask(R1, R0, R2, R3) ; R3 = -(XNext - XPos) * csc(CurAng) ADDI #(Sec - Csc - 1), R4 MVI@ R4, R2 ; R2 = sec(CurAng) MVO R2, XStep MOVR R3, R4 MVI XPosFracLeft, R0 QS_Frac_Mult_Kernel_Mask_LT2(R2, R0, R1) MVI YPosIntOpp, R3 MVI YPosInt, R2 ADDI #Maze, R2 MVI@ R2, R0 MVI XInc, R5 ; XInc = int(XPos) ADDI #@@ESETable, R5 MVI@ R5, R7 ETest(ESE, E, S, 0) ETest(ESE, E, S, 1) ETest(ESE, E, S, 2) ETest(ESE, E, S, 3) ETest(ESE, E, S, 4) ETest(ESE, E, S, 5) ETest(ESE, E, S, 6) ETest(ESE, E, S, 7) ETest(ESE, E, S, 8) ETest(ESE, E, S, 9) ETest(ESE, E, S, 10) ETest(ESE, E, S, 11) ETest(ESE, E, S, 12) ETest(ESE, E, S, 13) ETest(ESE, E, S, 14) ETest(ESE, E, S, 15) SouthTestE(ESE, E, 0, 0) SouthTestE(ESE, E, 1, 1) SouthTestE(ESE, E, 2, 2) SouthTestE(ESE, E, 3, 3) SouthTestE(ESE, E, 4, 4) SouthTestE(ESE, E, 5, 5) SouthTestE(ESE, E, 6, 6) SouthTestE(ESE, E, 7, 7) SouthTestE(ESE, E, 8, 8) SouthTestE(ESE, E, 9, 9) SouthTestE(ESE, E, 10, 10) SouthTestE(ESE, E, 11, 11) SouthTestE(ESE, E, 12, 12) SouthTestE(ESE, E, 13, 13) SouthTestE(ESE, E, 14, 14) SouthTestE(ESE, E, 15, 15) @@ESETable: DCW @@ESE_0, @@ESE_1, @@ESE_2, @@ESE_3, @@ESE_4, @@ESE_5, @@ESE_6, @@ESE_7 DCW @@ESE_8, @@ESE_9, @@ESE_10, @@ESE_11, @@ESE_12, @@ESE_13, @@ESE_14, @@ESE_15 @@AngWSW1xx1xx: ADDI #(Csc - AngleJumpTable - 1), R4 MVI@ R4, R1 ; R1 = csc(CurAng) MVO R1, YStep MVI YPosFracLeft, R0 QS_Frac_Mult_Kernel_Mask_LT2(R1, R0, R3) ; R3 = -(XNext - XPos) * csc(CurAng) ADDI #(AbsSec - Csc - 1), R4 MVI@ R4, R2 ; R2 = abs(sec(CurAng)) MVO R2, XStep MOVR R3, R4 MVI XPosFrac, R0 QS_Frac_Mult_Kernel_Mask_LT2(R2, R0, R1) ; R1 = (YNext - YPos) * sec(CurAng) MVI YPosIntOpp, R3 MVI YPosInt, R2 ADDI #Maze, R2 MVI@ R2, R0 MVI XInc, R5 ; XInc = int(XPos) ADDI #@@WSWTable, R5 MVI@ R5, R7 @@AngWSW2xx1xx: ADDI #(Csc - AngleJumpTable - 1), R4 MVI@ R4, R1 ; R1 = csc(CurAng) MVO R1, YStep MVI YPosFracLeft, R0 QS_Frac_Mult_Kernel_Mask_LT3(R1, R0, R3) ; R3 = -(XNext - XPos) * csc(CurAng) ADDI #(AbsSec - Csc - 1), R4 MVI@ R4, R2 ; R2 = abs(sec(CurAng)) MVO R2, XStep MOVR R3, R4 MVI XPosFrac, R0 QS_Frac_Mult_Kernel_Mask_LT2(R2, R0, R1) ; R1 = (YNext - YPos) * sec(CurAng) MVI YPosIntOpp, R3 MVI YPosInt, R2 ADDI #Maze, R2 MVI@ R2, R0 MVI XInc, R5 ; XInc = int(XPos) ADDI #@@WSWTable, R5 MVI@ R5, R7 @@AngWSWx102: ADDI #(Csc - AngleJumpTable - 1), R4 MVI@ R4, R1 ; R1 = csc(CurAng) MVO R1, YStep MVI YPosFracLeft, R0 QS_Frac_Mult_Kernel_Mask(R1, R0, R2, R3) ; R3 = -(XNext - XPos) * csc(CurAng) MOVR R3, R4 MVII #$0102, R2 MVO R2, XStep MVI DrawTop, R1 ; DrawTop = XPosFrac * $01.02 MVI YPosIntOpp, R3 MVI YPosInt, R2 ADDI #Maze, R2 MVI@ R2, R0 MVI XInc, R5 ; XInc = int(XPos) ADDI #@@WSWTable, R5 MVI@ R5, R7 @@AngWSWx101: ADDI #(Csc - AngleJumpTable - 1), R4 MVI@ R4, R1 ; R1 = csc(CurAng) MVO R1, YStep MVI YPosFracLeft, R0 QS_Frac_Mult_Kernel_Mask(R1, R0, R2, R3) ; R3 = -(XNext - XPos) * csc(CurAng) MOVR R3, R4 MVII #$0101, R2 MVO R2, XStep MVI DrawBot, R1 ; DrawBot = XPosFrac * $01.01 MVI YPosIntOpp, R3 MVI YPosInt, R2 ADDI #Maze, R2 MVI@ R2, R0 MVI XInc, R5 ; XInc = int(XPos) ADDI #@@WSWTable, R5 MVI@ R5, R7 @@AngWSWx100: ADDI #(Csc - AngleJumpTable - 1), R4 MVI@ R4, R1 ; R1 = csc(CurAng) MVO R1, YStep MVI YPosFracLeft, R0 QS_Frac_Mult_Kernel_Mask(R1, R0, R2, R3) ; R3 = -(XNext - XPos) * csc(CurAng) MOVR R3, R4 MVII #$0100, R2 MVO R2, XStep MVI XPosFrac, R1 MVI YPosIntOpp, R3 MVI YPosInt, R2 ADDI #Maze, R2 MVI@ R2, R0 MVI XInc, R5 ; XInc = int(XPos) ADDI #@@WSWTable, R5 MVI@ R5, R7 @@AngWSWx1xx: ADDI #(Csc - AngleJumpTable - 1), R4 MVI@ R4, R1 ; R1 = csc(CurAng) MVO R1, YStep MVI YPosFracLeft, R0 QS_Frac_Mult_Kernel_Mask(R1, R0, R2, R3) ; R3 = -(XNext - XPos) * csc(CurAng) ADDI #(AbsSec - Csc - 1), R4 MVI@ R4, R2 ; R2 = abs(sec(CurAng)) MVO R2, XStep MOVR R3, R4 MVI XPosFrac, R0 QS_Frac_Mult_Kernel_Mask_LT2(R2, R0, R1) ; R1 = (YNext - YPos) * sec(CurAng) MVI YPosIntOpp, R3 MVI YPosInt, R2 ADDI #Maze, R2 MVI@ R2, R0 MVI XInc, R5 ; XInc = int(XPos) ADDI #@@WSWTable, R5 MVI@ R5, R7 WTest(WSW, W, S, 0) WTest(WSW, W, S, 1) WTest(WSW, W, S, 2) WTest(WSW, W, S, 3) WTest(WSW, W, S, 4) WTest(WSW, W, S, 5) WTest(WSW, W, S, 6) WTest(WSW, W, S, 7) WTest(WSW, W, S, 8) WTest(WSW, W, S, 9) WTest(WSW, W, S, 10) WTest(WSW, W, S, 11) WTest(WSW, W, S, 12) WTest(WSW, W, S, 13) WTest(WSW, W, S, 14) WTest(WSW, W, S, 15) SouthTestW(WSW, W, 0, 15) SouthTestW(WSW, W, 1, 14) SouthTestW(WSW, W, 2, 13) SouthTestW(WSW, W, 3, 12) SouthTestW(WSW, W, 4, 11) SouthTestW(WSW, W, 5, 10) SouthTestW(WSW, W, 6, 9) SouthTestW(WSW, W, 7, 8) SouthTestW(WSW, W, 8, 7) SouthTestW(WSW, W, 9, 6) SouthTestW(WSW, W, 10, 5) SouthTestW(WSW, W, 11, 4) SouthTestW(WSW, W, 12, 3) SouthTestW(WSW, W, 13, 2) SouthTestW(WSW, W, 14, 1) SouthTestW(WSW, W, 15, 0) @@WSWTable: DCW @@WSW_15, @@WSW_14, @@WSW_13, @@WSW_12, @@WSW_11, @@WSW_10, @@WSW_9, @@WSW_8 DCW @@WSW_7, @@WSW_6, @@WSW_5, @@WSW_4, @@WSW_3, @@WSW_2, @@WSW_1, @@WSW_0 @@AngWNW1xx1xx: ADDI #(AbsCsc - AngleJumpTable - 1), R4 MVI@ R4, R1 ; R1 = abs(csc(CurAng)) MVO R1, YStep MVI YPosFrac, R0 QS_Frac_Mult_Kernel_Mask_LT2(R1, R0, R3) ADDI #(AbsSec - AbsCsc - 1), R4 MVI@ R4, R2 ; R2 = abs(sec(CurAng)) MVO R2, XStep MOVR R3, R4 MVI XPosFrac, R0 QS_Frac_Mult_Kernel_Mask_LT2(R2, R0, R1) ; R1 = (YNext - YPos) * sec(CurAng) MVI YPosInt, R2 MOVR R2, R3 ADDI #Maze, R2 MVI@ R2, R0 MVI XInc, R5 ; XInc = int(XPos) ADDI #@@WNWTable, R5 MVI@ R5, R7 @@AngWNW2xx1xx: ADDI #(AbsCsc - AngleJumpTable - 1), R4 MVI@ R4, R1 ; R1 = abs(csc(CurAng)) MVO R1, YStep MVI YPosFrac, R0 QS_Frac_Mult_Kernel_Mask_LT3(R1, R0, R3) ADDI #(AbsSec - AbsCsc - 1), R4 MVI@ R4, R2 ; R2 = abs(sec(CurAng)) MVO R2, XStep MOVR R3, R4 MVI XPosFrac, R0 QS_Frac_Mult_Kernel_Mask_LT2(R2, R0, R1) ; R1 = (YNext - YPos) * sec(CurAng) MVI YPosInt, R2 MOVR R2, R3 ADDI #Maze, R2 MVI@ R2, R0 MVI XInc, R5 ; XInc = int(XPos) ADDI #@@WNWTable, R5 MVI@ R5, R7 @@AngWNWx102: ADDI #(AbsCsc - AngleJumpTable - 1), R4 MVI@ R4, R1 ; R1 = abs(csc(CurAng)) MVO R1, YStep MVI YPosFrac, R0 QS_Frac_Mult_Kernel_Mask(R1, R0, R2, R3) MOVR R3, R4 MVII #$0102, R2 MVO R2, XStep MVI DrawTop, R1 ; DrawTop = XPosFrac * $01.02 MVI YPosInt, R2 MOVR R2, R3 ADDI #Maze, R2 MVI@ R2, R0 MVI XInc, R5 ; XInc = int(XPos) ADDI #@@WNWTable, R5 MVI@ R5, R7 @@AngWNWx101: ADDI #(AbsCsc - AngleJumpTable - 1), R4 MVI@ R4, R1 ; R1 = abs(csc(CurAng)) MVO R1, YStep MVI YPosFrac, R0 QS_Frac_Mult_Kernel_Mask(R1, R0, R2, R3) MOVR R3, R4 MVII #$0101, R2 MVO R2, XStep MVI DrawBot, R1 ; DrawBot = XPosFrac * $01.01 MVI YPosInt, R2 MOVR R2, R3 ADDI #Maze, R2 MVI@ R2, R0 MVI XInc, R5 ; XInc = int(XPos) ADDI #@@WNWTable, R5 MVI@ R5, R7 @@AngWNWx100: ADDI #(AbsCsc - AngleJumpTable - 1), R4 MVI@ R4, R1 ; R1 = abs(csc(CurAng)) MVO R1, YStep MVI YPosFrac, R0 QS_Frac_Mult_Kernel_Mask(R1, R0, R2, R3) MOVR R3, R4 MVII #$0100, R2 MVO R2, XStep MVI XPosFrac, R1 MVI YPosInt, R2 MOVR R2, R3 ADDI #Maze, R2 MVI@ R2, R0 MVI XInc, R5 ; XInc = int(XPos) ADDI #@@WNWTable, R5 MVI@ R5, R7 @@AngWNWx1xx: ADDI #(AbsCsc - AngleJumpTable - 1), R4 MVI@ R4, R1 ; R1 = abs(csc(CurAng)) MVO R1, YStep MVI YPosFrac, R0 QS_Frac_Mult_Kernel_Mask(R1, R0, R2, R3) ADDI #(AbsSec - AbsCsc - 1), R4 MVI@ R4, R2 ; R2 = abs(sec(CurAng)) MVO R2, XStep MOVR R3, R4 MVI XPosFrac, R0 QS_Frac_Mult_Kernel_Mask_LT2(R2, R0, R1) ; R1 = (YNext - YPos) * sec(CurAng) MVI YPosInt, R2 MOVR R2, R3 ADDI #Maze, R2 MVI@ R2, R0 MVI XInc, R5 ; XInc = int(XPos) ADDI #@@WNWTable, R5 MVI@ R5, R7 WTest(WNW, W, N, 0) WTest(WNW, W, N, 1) WTest(WNW, W, N, 2) WTest(WNW, W, N, 3) WTest(WNW, W, N, 4) WTest(WNW, W, N, 5) WTest(WNW, W, N, 6) WTest(WNW, W, N, 7) WTest(WNW, W, N, 8) WTest(WNW, W, N, 9) WTest(WNW, W, N, 10) WTest(WNW, W, N, 11) WTest(WNW, W, N, 12) WTest(WNW, W, N, 13) WTest(WNW, W, N, 14) WTest(WNW, W, N, 15) NorthTestW(WNW, W, 0, 15) NorthTestW(WNW, W, 1, 14) NorthTestW(WNW, W, 2, 13) NorthTestW(WNW, W, 3, 12) NorthTestW(WNW, W, 4, 11) NorthTestW(WNW, W, 5, 10) NorthTestW(WNW, W, 6, 9) NorthTestW(WNW, W, 7, 8) NorthTestW(WNW, W, 8, 7) NorthTestW(WNW, W, 9, 6) NorthTestW(WNW, W, 10, 5) NorthTestW(WNW, W, 11, 4) NorthTestW(WNW, W, 12, 3) NorthTestW(WNW, W, 13, 2) NorthTestW(WNW, W, 14, 1) NorthTestW(WNW, W, 15, 0) @@WNWTable: DCW @@WNW_15, @@WNW_14, @@WNW_13, @@WNW_12, @@WNW_11, @@WNW_10, @@WNW_9, @@WNW_8 DCW @@WNW_7, @@WNW_6, @@WNW_5, @@WNW_4, @@WNW_3, @@WNW_2, @@WNW_1, @@WNW_0 VertWallHitEastNorth(0) VertWallHitEastNorth(1) VertWallHitEastNorth(2) VertWallHitEastNorth(3) VertWallHitEastNorth(4) VertWallHitEastNorth(5) VertWallHitEastNorth(6) VertWallHitEastNorth(7) VertWallHitEastNorth(8) VertWallHitEastNorth(9) VertWallHitEastNorth(10) VertWallHitEastNorth(11) VertWallHitEastNorth(12) VertWallHitEastNorth(13) VertWallHitEastNorth(14) VertWallHitEastNorth(15) VertWallHitEastSouth(0) VertWallHitEastSouth(1) VertWallHitEastSouth(2) VertWallHitEastSouth(3) VertWallHitEastSouth(4) VertWallHitEastSouth(5) VertWallHitEastSouth(6) VertWallHitEastSouth(7) VertWallHitEastSouth(8) VertWallHitEastSouth(9) VertWallHitEastSouth(10) VertWallHitEastSouth(11) VertWallHitEastSouth(12) VertWallHitEastSouth(13) VertWallHitEastSouth(14) VertWallHitEastSouth(15) VertWallHitWestNorth(0) VertWallHitWestNorth(1) VertWallHitWestNorth(2) VertWallHitWestNorth(3) VertWallHitWestNorth(4) VertWallHitWestNorth(5) VertWallHitWestNorth(6) VertWallHitWestNorth(7) VertWallHitWestNorth(8) VertWallHitWestNorth(9) VertWallHitWestNorth(10) VertWallHitWestNorth(11) VertWallHitWestNorth(12) VertWallHitWestNorth(13) VertWallHitWestNorth(14) VertWallHitWestNorth(15) VertWallHitWestSouth(0) VertWallHitWestSouth(1) VertWallHitWestSouth(2) VertWallHitWestSouth(3) VertWallHitWestSouth(4) VertWallHitWestSouth(5) VertWallHitWestSouth(6) VertWallHitWestSouth(7) VertWallHitWestSouth(8) VertWallHitWestSouth(9) VertWallHitWestSouth(10) VertWallHitWestSouth(11) VertWallHitWestSouth(12) VertWallHitWestSouth(13) VertWallHitWestSouth(14) VertWallHitWestSouth(15) HorzWallHitNorth(0) HorzWallHitNorth(1) HorzWallHitNorth(2) HorzWallHitNorth(3) HorzWallHitNorth(4) HorzWallHitNorth(5) HorzWallHitNorth(6) HorzWallHitNorth(7) HorzWallHitNorth(8) HorzWallHitNorth(9) HorzWallHitNorth(10) HorzWallHitNorth(11) HorzWallHitNorth(12) HorzWallHitNorth(13) HorzWallHitNorth(14) HorzWallHitNorth(15) HorzWallHitSouth(0) HorzWallHitSouth(1) HorzWallHitSouth(2) HorzWallHitSouth(3) HorzWallHitSouth(4) HorzWallHitSouth(5) HorzWallHitSouth(6) HorzWallHitSouth(7) HorzWallHitSouth(8) HorzWallHitSouth(9) HorzWallHitSouth(10) HorzWallHitSouth(11) HorzWallHitSouth(12) HorzWallHitSouth(13) HorzWallHitSouth(14) HorzWallHitSouth(15) @@AngNNE1xx1xx: ADDI #(AbsCsc - AngleJumpTable - 1), R4 MVI@ R4, R1 ; R1 = abs(csc(CurAng)) MVO R1, YStep ; YStep = abs(csc(CurAng)) MVI YPosFrac, R0 QS_Frac_Mult_Kernel_Mask_LT2(R1, R0, R3) ; R3 = -(YNext - YPos) * csc(CurAng) ADDI #(AbsSec - AbsCsc - 1), R4 MVI@ R4, R2 ; R2 = abs(sec(CurAng)) MVO R2, XStep MOVR R3, R4 MVI XPosFracLeft, R0 QS_Frac_Mult_Kernel_Mask_LT2(R2, R0, R1) ; R1 = (XNext - XPos) * sec(CurAng) MVI FacingHorz, R3 ; FacingHorz = 15 - int(XPos) MVI XInc, R2 ; XInc = int(XPos) ADDI #MazeVert, R2 MVI@ R2, R0 MVI YPosInt, R5 ADDI #@@NNETable, R5 MVI@ R5, R7 @@AngNNE1xx2xx: ADDI #(AbsCsc - AngleJumpTable - 1), R4 MVI@ R4, R1 ; R1 = abs(csc(CurAng)) MVO R1, YStep ; YStep = abs(csc(CurAng)) MVI YPosFrac, R0 QS_Frac_Mult_Kernel_Mask_LT2(R1, R0, R3) ; R3 = -(YNext - YPos) * csc(CurAng) ADDI #(AbsSec - AbsCsc - 1), R4 MVI@ R4, R2 ; R2 = abs(sec(CurAng)) MVO R2, XStep MOVR R3, R4 MVI XPosFracLeft, R0 QS_Frac_Mult_Kernel_Mask_LT3(R2, R0, R1) ; R1 = (XNext - XPos) * sec(CurAng) MVI FacingHorz, R3 ; FacingHorz = 15 - int(XPos) MVI XInc, R2 ; XInc = int(XPos) ADDI #MazeVert, R2 MVI@ R2, R0 MVI YPosInt, R5 ADDI #@@NNETable, R5 MVI@ R5, R7 @@AngNNE102x: ADDI #(AbsSec - AngleJumpTable - 1), R4 MVI@ R4, R2 ; R2 = abs(sec(CurAng)) MVO R2, XStep MVI XPosFracLeft, R0 QS_Frac_Mult_Kernel_Mask(R2, R0, R3, R1) ; R1 = (XNext - XPos) * sec(CurAng) MVII #$0102, R2 MVO R2, YStep ; YStep = abs(csc(CurAng)) MVI NoTestVertWalls, R4 ; NoTestVertWalls = YPosFrac * $01.02 MVI FacingHorz, R3 ; FacingHorz = 15 - int(XPos) MVI XInc, R2 ; XInc = int(XPos) ADDI #MazeVert, R2 MVI@ R2, R0 MVI YPosInt, R5 ADDI #@@NNETable, R5 MVI@ R5, R7 @@AngNNE101x: ADDI #(AbsSec - AngleJumpTable - 1), R4 MVI@ R4, R2 ; R2 = abs(sec(CurAng)) MVO R2, XStep MVI XPosFracLeft, R0 QS_Frac_Mult_Kernel_Mask(R2, R0, R3, R1) ; R1 = (XNext - XPos) * sec(CurAng) MVII #$0101, R2 MVO R2, YStep ; YStep = abs(csc(CurAng)) MVI NoTestHorzWalls, R4 ; NoTestHorzWalls = YPosFrac * $01.01 MVI FacingHorz, R3 ; FacingHorz = 15 - int(XPos) MVI XInc, R2 ; XInc = int(XPos) ADDI #MazeVert, R2 MVI@ R2, R0 MVI YPosInt, R5 ADDI #@@NNETable, R5 MVI@ R5, R7 @@AngNNE100x: ADDI #(AbsSec - AngleJumpTable - 1), R4 MVI@ R4, R2 ; R2 = abs(sec(CurAng)) MVO R2, XStep MVI XPosFracLeft, R0 QS_Frac_Mult_Kernel_Mask(R2, R0, R3, R1) ; R1 = (XNext - XPos) * sec(CurAng) MVII #$0100, R2 MVO R2, YStep ; YStep = abs(csc(CurAng)) MVI YPosFrac, R4 MVI FacingHorz, R3 ; FacingHorz = 15 - int(XPos) MVI XInc, R2 ; XInc = int(XPos) ADDI #MazeVert, R2 MVI@ R2, R0 MVI YPosInt, R5 ADDI #@@NNETable, R5 MVI@ R5, R7 @@AngNNE1xxx: ADDI #(AbsCsc - AngleJumpTable - 1), R4 MVI@ R4, R1 ; R1 = abs(csc(CurAng)) MVO R1, YStep ; YStep = abs(csc(CurAng)) MVI YPosFrac, R0 QS_Frac_Mult_Kernel_Mask_LT2(R1, R0, R3) ; R3 = -(YNext - YPos) * csc(CurAng) ADDI #(AbsSec - AbsCsc - 1), R4 MVI@ R4, R2 ; R2 = abs(sec(CurAng)) MVO R2, XStep MOVR R3, R4 MVI XPosFracLeft, R0 QS_Frac_Mult_Kernel_Mask(R2, R0, R3, R1) ; R1 = (XNext - XPos) * sec(CurAng) MVI FacingHorz, R3 ; FacingHorz = 15 - int(XPos) MVI XInc, R2 ; XInc = int(XPos) ADDI #MazeVert, R2 MVI@ R2, R0 MVI YPosInt, R5 ADDI #@@NNETable, R5 MVI@ R5, R7 NTest(NNE, N, E, 0) NTest(NNE, N, E, 1) NTest(NNE, N, E, 2) NTest(NNE, N, E, 3) NTest(NNE, N, E, 4) NTest(NNE, N, E, 5) NTest(NNE, N, E, 6) NTest(NNE, N, E, 7) NTest(NNE, N, E, 8) NTest(NNE, N, E, 9) NTest(NNE, N, E, 10) NTest(NNE, N, E, 11) NTest(NNE, N, E, 12) NTest(NNE, N, E, 13) NTest(NNE, N, E, 14) NTest(NNE, N, E, 15) EastTestN(NNE, N, 0, 15) EastTestN(NNE, N, 1, 14) EastTestN(NNE, N, 2, 13) EastTestN(NNE, N, 3, 12) EastTestN(NNE, N, 4, 11) EastTestN(NNE, N, 5, 10) EastTestN(NNE, N, 6, 9) EastTestN(NNE, N, 7, 8) EastTestN(NNE, N, 8, 7) EastTestN(NNE, N, 9, 6) EastTestN(NNE, N, 10, 5) EastTestN(NNE, N, 11, 4) EastTestN(NNE, N, 12, 3) EastTestN(NNE, N, 13, 2) EastTestN(NNE, N, 14, 1) EastTestN(NNE, N, 15, 0) @@NNETable: DCW @@NNE_15, @@NNE_14, @@NNE_13, @@NNE_12, @@NNE_11, @@NNE_10, @@NNE_9, @@NNE_8 DCW @@NNE_7, @@NNE_6, @@NNE_5, @@NNE_4, @@NNE_3, @@NNE_2, @@NNE_1, @@NNE_0 @@AngNNW1xx1xx: ADDI #(AbsCsc - AngleJumpTable - 1), R4 MVI@ R4, R1 ; R1 = csc(CurAng) MVO R1, YStep MVI YPosFrac, R0 QS_Frac_Mult_Kernel_Mask_LT2(R1, R0, R3) ADDI #(AbsSec - AbsCsc - 1), R4 MVI@ R4, R2 ; R2 = sec(CurAng) MVO R2, XStep MOVR R3, R4 MVI XPosFrac, R0 QS_Frac_Mult_Kernel_Mask_LT2(R2, R0, R1) ; R1 = (YNext - YPos) * sec(CurAng) MVI XInc, R2 ; XInc = int(XPos) MOVR R2, R3 ADDI #MazeVert, R2 MVI@ R2, R0 MVI YPosInt, R5 ADDI #@@NNWTable, R5 MVI@ R5, R7 @@AngNNW1xx2xx: ADDI #(AbsCsc - AngleJumpTable - 1), R4 MVI@ R4, R1 ; R1 = csc(CurAng) MVO R1, YStep MVI YPosFrac, R0 QS_Frac_Mult_Kernel_Mask_LT2(R1, R0, R3) ADDI #(AbsSec - AbsCsc - 1), R4 MVI@ R4, R2 ; R2 = sec(CurAng) MVO R2, XStep MOVR R3, R4 MVI XPosFrac, R0 QS_Frac_Mult_Kernel_Mask_LT3(R2, R0, R1) ; R1 = (YNext - YPos) * sec(CurAng) MVI XInc, R2 ; XInc = int(XPos) MOVR R2, R3 ADDI #MazeVert, R2 MVI@ R2, R0 MVI YPosInt, R5 ADDI #@@NNWTable, R5 MVI@ R5, R7 @@AngNNW102x: ADDI #(AbsSec - AngleJumpTable - 1), R4 MVI@ R4, R2 ; R2 = sec(CurAng) MVO R2, XStep MVI XPosFrac, R0 QS_Frac_Mult_Kernel_Mask(R2, R0, R3, R1) ; R1 = (YNext - YPos) * sec(CurAng) MVII #$0102, R2 MVO R2, YStep ; YStep = abs(csc(CurAng)) MVI NoTestVertWalls, R4 ; NoTestVertWalls = YPosFrac * $01.02 MVI XInc, R2 ; XInc = int(XPos) MOVR R2, R3 ADDI #MazeVert, R2 MVI@ R2, R0 MVI YPosInt, R5 ADDI #@@NNWTable, R5 MVI@ R5, R7 @@AngNNW101x: ADDI #(AbsSec - AngleJumpTable - 1), R4 MVI@ R4, R2 ; R2 = sec(CurAng) MVO R2, XStep MVI XPosFrac, R0 QS_Frac_Mult_Kernel_Mask(R2, R0, R3, R1) ; R1 = (YNext - YPos) * sec(CurAng) MVII #$0101, R2 MVO R2, YStep ; YStep = abs(csc(CurAng)) MVI NoTestHorzWalls, R4 ; NoTestHorzWalls = YPosFrac * $01.01 MVI XInc, R2 ; XInc = int(XPos) MOVR R2, R3 ADDI #MazeVert, R2 MVI@ R2, R0 MVI YPosInt, R5 ADDI #@@NNWTable, R5 MVI@ R5, R7 @@AngNNW100x: ADDI #(AbsSec - AngleJumpTable - 1), R4 MVI@ R4, R2 ; R2 = sec(CurAng) MVO R2, XStep MVI XPosFrac, R0 QS_Frac_Mult_Kernel_Mask(R2, R0, R3, R1) ; R1 = (YNext - YPos) * sec(CurAng) MVII #$0100, R2 MVO R2, YStep ; YStep = abs(csc(CurAng)) MVI YPosFrac, R4 MVI XInc, R2 ; XInc = int(XPos) MOVR R2, R3 ADDI #MazeVert, R2 MVI@ R2, R0 MVI YPosInt, R5 ADDI #@@NNWTable, R5 MVI@ R5, R7 @@AngNNW1xxx: ADDI #(AbsCsc - AngleJumpTable - 1), R4 MVI@ R4, R1 ; R1 = csc(CurAng) MVO R1, YStep MVI YPosFrac, R0 QS_Frac_Mult_Kernel_Mask_LT2(R1, R0, R3) ADDI #(AbsSec - AbsCsc - 1), R4 MVI@ R4, R2 ; R2 = sec(CurAng) MVO R2, XStep MOVR R3, R4 MVI XPosFrac, R0 QS_Frac_Mult_Kernel_Mask(R2, R0, R3, R1) ; R1 = (YNext - YPos) * sec(CurAng) MVI XInc, R2 ; XInc = int(XPos) MOVR R2, R3 ADDI #MazeVert, R2 MVI@ R2, R0 MVI YPosInt, R5 ADDI #@@NNWTable, R5 MVI@ R5, R7 NTest(NNW, N, W, 0) NTest(NNW, N, W, 1) NTest(NNW, N, W, 2) NTest(NNW, N, W, 3) NTest(NNW, N, W, 4) NTest(NNW, N, W, 5) NTest(NNW, N, W, 6) NTest(NNW, N, W, 7) NTest(NNW, N, W, 8) NTest(NNW, N, W, 9) NTest(NNW, N, W, 10) NTest(NNW, N, W, 11) NTest(NNW, N, W, 12) NTest(NNW, N, W, 13) NTest(NNW, N, W, 14) NTest(NNW, N, W, 15) WestTestN(NNW, N, 0, 15) WestTestN(NNW, N, 1, 14) WestTestN(NNW, N, 2, 13) WestTestN(NNW, N, 3, 12) WestTestN(NNW, N, 4, 11) WestTestN(NNW, N, 5, 10) WestTestN(NNW, N, 6, 9) WestTestN(NNW, N, 7, 8) WestTestN(NNW, N, 8, 7) WestTestN(NNW, N, 9, 6) WestTestN(NNW, N, 10, 5) WestTestN(NNW, N, 11, 4) WestTestN(NNW, N, 12, 3) WestTestN(NNW, N, 13, 2) WestTestN(NNW, N, 14, 1) WestTestN(NNW, N, 15, 0) @@NNWTable: DCW @@NNW_15, @@NNW_14, @@NNW_13, @@NNW_12, @@NNW_11, @@NNW_10, @@NNW_9, @@NNW_8 DCW @@NNW_7, @@NNW_6, @@NNW_5, @@NNW_4, @@NNW_3, @@NNW_2, @@NNW_1, @@NNW_0 @@AngSSE1xx1xx: ADDI #(AbsCsc - AngleJumpTable - 1), R4 MVI@ R4, R1 ; R1 = csc(CurAng) MVO R1, YStep MVI YPosFracLeft, R0 QS_Frac_Mult_Kernel_Mask_LT2(R1, R0, R3) ; R3 = -(XNext - XPos) * csc(CurAng) ADDI #(AbsSec - AbsCsc - 1), R4 MVI@ R4, R2 ; R2 = sec(CurAng) MVO R2, XStep MOVR R3, R4 MVI XPosFracLeft, R0 QS_Frac_Mult_Kernel_Mask_LT2(R2, R0, R1) MVI FacingHorz, R3 ; FacingHorz = 15 - int(XPos) MVI XInc, R2 ; XInc = int(XPos) ADDI #MazeVert, R2 MVI@ R2, R0 MVI YPosInt, R5 ADDI #@@SSETable, R5 MVI@ R5, R7 @@AngSSE1xx2xx: ADDI #(AbsCsc - AngleJumpTable - 1), R4 MVI@ R4, R1 ; R1 = csc(CurAng) MVO R1, YStep MVI YPosFracLeft, R0 QS_Frac_Mult_Kernel_Mask_LT2(R1, R0, R3) ; R3 = -(XNext - XPos) * csc(CurAng) ADDI #(AbsSec - AbsCsc - 1), R4 MVI@ R4, R2 ; R2 = sec(CurAng) MVO R2, XStep MOVR R3, R4 MVI XPosFracLeft, R0 QS_Frac_Mult_Kernel_Mask_LT3(R2, R0, R1) MVI FacingHorz, R3 ; FacingHorz = 15 - int(XPos) MVI XInc, R2 ; XInc = int(XPos) ADDI #MazeVert, R2 MVI@ R2, R0 MVI YPosInt, R5 ADDI #@@SSETable, R5 MVI@ R5, R7 @@AngSSE102x: ADDI #(AbsSec - AngleJumpTable - 1), R4 MVI@ R4, R2 ; R2 = sec(CurAng) MVO R2, XStep MVI XPosFracLeft, R0 QS_Frac_Mult_Kernel_Mask(R2, R0, R3, R1) MVII #$0102, R2 MVO R2, YStep ; YStep = abs(csc(CurAng)) MVI YBack, R4 ; YBack = YPosFracLeft * $01.02 MVI FacingHorz, R3 ; FacingHorz = 15 - int(XPos) MVI XInc, R2 ; XInc = int(XPos) ADDI #MazeVert, R2 MVI@ R2, R0 MVI YPosInt, R5 ADDI #@@SSETable, R5 MVI@ R5, R7 @@AngSSE101x: ADDI #(AbsSec - AngleJumpTable - 1), R4 MVI@ R4, R2 ; R2 = sec(CurAng) MVO R2, XStep MVI XPosFracLeft, R0 QS_Frac_Mult_Kernel_Mask(R2, R0, R3, R1) MVII #$0101, R2 MVO R2, YStep ; YStep = abs(csc(CurAng)) MVI YEdge, R4 ; YEdge = YPosFracLeft * $01.01 MVI FacingHorz, R3 ; FacingHorz = 15 - int(XPos) MVI XInc, R2 ; XInc = int(XPos) ADDI #MazeVert, R2 MVI@ R2, R0 MVI YPosInt, R5 ADDI #@@SSETable, R5 MVI@ R5, R7 @@AngSSE100x: ADDI #(AbsSec - AngleJumpTable - 1), R4 MVI@ R4, R2 ; R2 = sec(CurAng) MVO R2, XStep MVI XPosFracLeft, R0 QS_Frac_Mult_Kernel_Mask(R2, R0, R3, R1) MVII #$0100, R2 MVO R2, YStep ; YStep = abs(csc(CurAng)) MVI YPosFracLeft, R4 MVI FacingHorz, R3 ; FacingHorz = 15 - int(XPos) MVI XInc, R2 ; XInc = int(XPos) ADDI #MazeVert, R2 MVI@ R2, R0 MVI YPosInt, R5 ADDI #@@SSETable, R5 MVI@ R5, R7 @@AngSSE1xxx: ADDI #(AbsCsc - AngleJumpTable - 1), R4 MVI@ R4, R1 ; R1 = csc(CurAng) MVO R1, YStep MVI YPosFracLeft, R0 QS_Frac_Mult_Kernel_Mask_LT2(R1, R0, R3) ; R3 = -(XNext - XPos) * csc(CurAng) ADDI #(AbsSec - AbsCsc - 1), R4 MVI@ R4, R2 ; R2 = sec(CurAng) MVO R2, XStep MOVR R3, R4 MVI XPosFracLeft, R0 QS_Frac_Mult_Kernel_Mask(R2, R0, R3, R1) MVI FacingHorz, R3 ; FacingHorz = 15 - int(XPos) MVI XInc, R2 ; XInc = int(XPos) ADDI #MazeVert, R2 MVI@ R2, R0 MVI YPosInt, R5 ADDI #@@SSETable, R5 MVI@ R5, R7 STest(SSE, S, E, 0) STest(SSE, S, E, 1) STest(SSE, S, E, 2) STest(SSE, S, E, 3) STest(SSE, S, E, 4) STest(SSE, S, E, 5) STest(SSE, S, E, 6) STest(SSE, S, E, 7) STest(SSE, S, E, 8) STest(SSE, S, E, 9) STest(SSE, S, E, 10) STest(SSE, S, E, 11) STest(SSE, S, E, 12) STest(SSE, S, E, 13) STest(SSE, S, E, 14) STest(SSE, S, E, 15) EastTestS(SSE, S, 0, 0) EastTestS(SSE, S, 1, 1) EastTestS(SSE, S, 2, 2) EastTestS(SSE, S, 3, 3) EastTestS(SSE, S, 4, 4) EastTestS(SSE, S, 5, 5) EastTestS(SSE, S, 6, 6) EastTestS(SSE, S, 7, 7) EastTestS(SSE, S, 8, 8) EastTestS(SSE, S, 9, 9) EastTestS(SSE, S, 10, 10) EastTestS(SSE, S, 11, 11) EastTestS(SSE, S, 12, 12) EastTestS(SSE, S, 13, 13) EastTestS(SSE, S, 14, 14) EastTestS(SSE, S, 15, 15) @@SSETable: DCW @@SSE_0, @@SSE_1, @@SSE_2, @@SSE_3, @@SSE_4, @@SSE_5, @@SSE_6, @@SSE_7 DCW @@SSE_8, @@SSE_9, @@SSE_10, @@SSE_11, @@SSE_12, @@SSE_13, @@SSE_14, @@SSE_15 @@AngSSW1xx1xx: ADDI #(AbsCsc - AngleJumpTable - 1), R4 MVI@ R4, R1 ; R1 = csc(CurAng) MVO R1, YStep MVI YPosFracLeft, R0 QS_Frac_Mult_Kernel_Mask_LT2(R1, R0, R3) ; R3 = -(XNext - XPos) * csc(CurAng) ADDI #(AbsSec - AbsCsc - 1), R4 MVI@ R4, R2 ; R2 = sec(CurAng) MVO R2, XStep MOVR R3, R4 MVI XPosFrac, R0 QS_Frac_Mult_Kernel_Mask_LT2(R2, R0, R1) MVI XInc, R2 ; XInc = int(XPos) MOVR R2, R3 ADDI #MazeVert, R2 MVI@ R2, R0 MVI YPosInt, R5 ADDI #@@SSWTable, R5 MVI@ R5, R7 @@AngSSW1xx2xx: ADDI #(AbsCsc - AngleJumpTable - 1), R4 MVI@ R4, R1 ; R1 = csc(CurAng) MVO R1, YStep MVI YPosFracLeft, R0 QS_Frac_Mult_Kernel_Mask_LT2(R1, R0, R3) ; R3 = -(XNext - XPos) * csc(CurAng) ADDI #(AbsSec - AbsCsc - 1), R4 MVI@ R4, R2 ; R2 = sec(CurAng) MVO R2, XStep MOVR R3, R4 MVI XPosFrac, R0 QS_Frac_Mult_Kernel_Mask_LT3(R2, R0, R1) MVI XInc, R2 ; XInc = int(XPos) MOVR R2, R3 ADDI #MazeVert, R2 MVI@ R2, R0 MVI YPosInt, R5 ADDI #@@SSWTable, R5 MVI@ R5, R7 @@AngSSW102x: ADDI #(AbsSec - AngleJumpTable - 1), R4 MVI@ R4, R2 ; R2 = sec(CurAng) MVO R2, XStep MVI XPosFrac, R0 QS_Frac_Mult_Kernel_Mask(R2, R0, R3, R1) MVII #$0102, R2 MVO R2, YStep ; YStep = abs(csc(CurAng)) MVI YBack, R4 ; YBack = YPosFracLeft * $01.02 MVI XInc, R2 ; XInc = int(XPos) MOVR R2, R3 ADDI #MazeVert, R2 MVI@ R2, R0 MVI YPosInt, R5 ADDI #@@SSWTable, R5 MVI@ R5, R7 @@AngSSW101x: ADDI #(AbsSec - AngleJumpTable - 1), R4 MVI@ R4, R2 ; R2 = sec(CurAng) MVO R2, XStep MVI XPosFrac, R0 QS_Frac_Mult_Kernel_Mask(R2, R0, R3, R1) MVII #$0101, R2 MVO R2, YStep ; YStep = abs(csc(CurAng)) MVI YEdge, R4 ; YEdge = YPosFracLeft * $01.01 MVI XInc, R2 ; XInc = int(XPos) MOVR R2, R3 ADDI #MazeVert, R2 MVI@ R2, R0 MVI YPosInt, R5 ADDI #@@SSWTable, R5 MVI@ R5, R7 @@AngSSW100x: ADDI #(AbsSec - AngleJumpTable - 1), R4 MVI@ R4, R2 ; R2 = sec(CurAng) MVO R2, XStep MVI XPosFrac, R0 QS_Frac_Mult_Kernel_Mask(R2, R0, R3, R1) MVII #$0100, R2 MVO R2, YStep ; YStep = abs(csc(CurAng)) MVI YPosFracLeft, R4 MVI XInc, R2 ; XInc = int(XPos) MOVR R2, R3 ADDI #MazeVert, R2 MVI@ R2, R0 MVI YPosInt, R5 ADDI #@@SSWTable, R5 MVI@ R5, R7 @@AngSSW1xxx: ADDI #(AbsCsc - AngleJumpTable - 1), R4 MVI@ R4, R1 ; R1 = csc(CurAng) MVO R1, YStep MVI YPosFracLeft, R0 QS_Frac_Mult_Kernel_Mask_LT2(R1, R0, R3) ; R3 = -(XNext - XPos) * csc(CurAng) ADDI #(AbsSec - AbsCsc - 1), R4 MVI@ R4, R2 ; R2 = sec(CurAng) MVO R2, XStep MOVR R3, R4 MVI XPosFrac, R0 QS_Frac_Mult_Kernel_Mask(R2, R0, R3, R1) MVI XInc, R2 ; XInc = int(XPos) MOVR R2, R3 ADDI #MazeVert, R2 MVI@ R2, R0 MVI YPosInt, R5 ADDI #@@SSWTable, R5 MVI@ R5, R7 STest(SSW, S, W, 0) STest(SSW, S, W, 1) STest(SSW, S, W, 2) STest(SSW, S, W, 3) STest(SSW, S, W, 4) STest(SSW, S, W, 5) STest(SSW, S, W, 6) STest(SSW, S, W, 7) STest(SSW, S, W, 8) STest(SSW, S, W, 9) STest(SSW, S, W, 10) STest(SSW, S, W, 11) STest(SSW, S, W, 12) STest(SSW, S, W, 13) STest(SSW, S, W, 14) STest(SSW, S, W, 15) ORG $8040 WestTestS(SSW, S, 0, 0) WestTestS(SSW, S, 1, 1) WestTestS(SSW, S, 2, 2) WestTestS(SSW, S, 3, 3) WestTestS(SSW, S, 4, 4) WestTestS(SSW, S, 5, 5) WestTestS(SSW, S, 6, 6) WestTestS(SSW, S, 7, 7) WestTestS(SSW, S, 8, 8) WestTestS(SSW, S, 9, 9) WestTestS(SSW, S, 10, 10) WestTestS(SSW, S, 11, 11) WestTestS(SSW, S, 12, 12) WestTestS(SSW, S, 13, 13) WestTestS(SSW, S, 14, 14) WestTestS(SSW, S, 15, 15) @@SSWTable: DCW @@SSW_0, @@SSW_1, @@SSW_2, @@SSW_3, @@SSW_4, @@SSW_5, @@SSW_6, @@SSW_7 DCW @@SSW_8, @@SSW_9, @@SSW_10, @@SSW_11, @@SSW_12, @@SSW_13, @@SSW_14, @@SSW_15 HorzWallHitNorthEast(0) HorzWallHitNorthEast(1) HorzWallHitNorthEast(2) HorzWallHitNorthEast(3) HorzWallHitNorthEast(4) HorzWallHitNorthEast(5) HorzWallHitNorthEast(6) HorzWallHitNorthEast(7) HorzWallHitNorthEast(8) HorzWallHitNorthEast(9) HorzWallHitNorthEast(10) HorzWallHitNorthEast(11) HorzWallHitNorthEast(12) HorzWallHitNorthEast(13) HorzWallHitNorthEast(14) HorzWallHitNorthEast(15) HorzWallHitNorthWest(0) HorzWallHitNorthWest(1) HorzWallHitNorthWest(2) HorzWallHitNorthWest(3) HorzWallHitNorthWest(4) HorzWallHitNorthWest(5) HorzWallHitNorthWest(6) HorzWallHitNorthWest(7) HorzWallHitNorthWest(8) HorzWallHitNorthWest(9) HorzWallHitNorthWest(10) HorzWallHitNorthWest(11) HorzWallHitNorthWest(12) HorzWallHitNorthWest(13) HorzWallHitNorthWest(14) HorzWallHitNorthWest(15) HorzWallHitSouthEast(0) HorzWallHitSouthEast(1) HorzWallHitSouthEast(2) HorzWallHitSouthEast(3) HorzWallHitSouthEast(4) HorzWallHitSouthEast(5) HorzWallHitSouthEast(6) HorzWallHitSouthEast(7) HorzWallHitSouthEast(8) HorzWallHitSouthEast(9) HorzWallHitSouthEast(10) HorzWallHitSouthEast(11) HorzWallHitSouthEast(12) HorzWallHitSouthEast(13) HorzWallHitSouthEast(14) HorzWallHitSouthEast(15) HorzWallHitSouthWest(0) HorzWallHitSouthWest(1) HorzWallHitSouthWest(2) HorzWallHitSouthWest(3) HorzWallHitSouthWest(4) HorzWallHitSouthWest(5) HorzWallHitSouthWest(6) HorzWallHitSouthWest(7) HorzWallHitSouthWest(8) HorzWallHitSouthWest(9) HorzWallHitSouthWest(10) HorzWallHitSouthWest(11) HorzWallHitSouthWest(12) HorzWallHitSouthWest(13) HorzWallHitSouthWest(14) HorzWallHitSouthWest(15) VertWallHitEast(0) VertWallHitEast(1) VertWallHitEast(2) VertWallHitEast(3) VertWallHitEast(4) VertWallHitEast(5) VertWallHitEast(6) VertWallHitEast(7) VertWallHitEast(8) VertWallHitEast(9) VertWallHitEast(10) VertWallHitEast(11) VertWallHitEast(12) VertWallHitEast(13) VertWallHitEast(14) VertWallHitEast(15) VertWallHitWest(0) VertWallHitWest(1) VertWallHitWest(2) VertWallHitWest(3) VertWallHitWest(4) VertWallHitWest(5) VertWallHitWest(6) VertWallHitWest(7) VertWallHitWest(8) VertWallHitWest(9) VertWallHitWest(10) VertWallHitWest(11) VertWallHitWest(12) VertWallHitWest(13) VertWallHitWest(14) VertWallHitWest(15) @@Times16: DCW $0000, $0010, $0020, $0030, $0040, $0050, $0060, $0070, $0080, $0090, $00A0, $00B0, $00C0, $00D0, $00E0, $00F0 @@Times16Opp: DCW $00F0, $00E0, $00D0, $00C0, $00B0, $00A0, $0090, $0080, $0070, $0060, $0050, $0040, $0030, $0020, $0010, $0000 ; --------------------------------------------------------------------- ; At least one wall was found (though it could be beyond MaxDist) ; As long as this is the case, divides by 0 cannot happen. ; --------------------------------------------------------------------- @@DrawWall: ; If we're closer than a certain distance, the height is always the maximum CMPI #CS_MAX_HT_DIST, R1 BNC @@MaxHeight ; With the above check the maximum height we can possibly get from the division ; for a wall with unit height of 8 is 9.25 * 2.666... = 24.666... ; ; Drawing a vertical wall (a wall facing east or west) ; ; R0 = 8 * sec(ray angle) (in 8.8 fixed-point format, ray angle ranges from -30 degrees to +30 degrees) ; = 8 / cos(ray angle) MVI DrawX, R2 MOVR R2, R4 ; Save DrawX ADDI #SecPixelCS, R2 MVI@ R2, R0 ; R3 = R0 / (VertWallDist + epsilon) (done to prevent division by 0) ; = 8 / (cos(ray angle) * (VertWallDist + epsilon)) JSR R5, FastDivide ; The quotient will always be positive ; Drop the fractional bits: R3 = round(R3) ADDI #(ClampedHeights + 4), R3 ; Round and clamp the result MVI@ R3, R3 MVI WallColor, R1 MOVR R4, R0 ; Save DrawX ADDR R4, R4 ADDI #DrawHeights, R4 MVO@ R3, R4 ; Save the height MVO@ R1, R4 ; Save the color ; Increment the angle by two units, or 1.5 degrees. This works because ; our bitmap is 40 pixels wide and our FOV is 60 degrees. MVI CurAng, R1 ADDI #ClampedAngle, R1 MVI@ R1, R4 MVO R4, CurAng ; Move right one pixel. Must do this last so that R0 contains DrawX. INCR R0 ; Are we finished? CMPI #BmpWidthCS, R0 BNEQ @@XLoop B @@DoneRender ; ---------------------------------------- @@MaxHeight: MVII #(BmpHeightCS * 2), R3 MVI WallColor, R1 MVI DrawX, R4 MOVR R4, R0 ADDR R4, R4 ADDI #DrawHeights, R4 MVO@ R3, R4 ; Save the height MVO@ R1, R4 ; Save the color ; Increment the angle by two units, or 1.5 degrees. This works because ; our bitmap is 40 pixels wide and our FOV is 60 degrees. MVI CurAng, R1 ADDI #ClampedAngle, R1 MVI@ R1, R4 MVO R4, CurAng ; Move right one pixel. Must do this last so that R0 contains DrawX. INCR R0 ; Are we finished? CMPI #BmpWidthCS, R0 BNEQ @@XLoop B @@DoneRender ; ---------------------------------------- @@BlankRay: MVI MaxDist, R3 SWAP R3 ADDI #DistHeights, R3 MVI@ R3, R3 CLRR R1 ; Black MVI DrawX, R5 MOVR R5, R0 ADDR R5, R5 ADDI #DrawHeights, R5 MVO@ R3, R5 ; Save the height MVO@ R1, R5 ; Save the color ; Increment the angle by two units, or 1.5 degrees. This works because ; our bitmap is 40 pixels wide and our FOV is 60 degrees. MVI CurAng, R1 ADDI #ClampedAngle, R1 MVI@ R1, R4 MVO R4, CurAng ; Move right one pixel. Must do this last so that R0 contains DrawX. INCR R0 ; Are we finished? CMPI #BmpWidthCS, R0 BNEQ @@XLoop @@DoneRender: JSR R5, DrawRayCS2 ; MVI HorzWallDist, R0 ; MVII #COLOR_RED, R1 ; MVII #$020E, R4 ; JSR R5, PrintHex ; MVI VertWallDist, R0 ; MVII #COLOR_RED, R1 ; MVII #$0222, R4 ; JSR R5, PrintHex ; MVI XStep, R0 ; MVII #COLOR_BLU, R1 ; MVII #$0236, R4 ; JSR R5, PrintHex ; MVI YStep, R0 ; MVII #COLOR_BLU, R1 ; MVII #$024A, R4 ; JSR R5, PrintHex ; MVI CurAng, R0 ; MVII #COLOR_TAN, R1 ; MVII #$025E, R4 ; JSR R5, PrintHex ; MVI XInc, R0 ; MVII #COLOR_GRN, R1 ; MVII #$0272, R4 ; JSR R5, PrintHex ; MVI YInc, R0 ; MVII #COLOR_GRN, R1 ; MVII #$0286, R4 ; JSR R5, PrintHex ; MVI XPos, R0 ; MVII #COLOR_YEL, R1 ; MVII #$029A, R4 ; JSR R5, PrintHex ; MVI YPos, R0 ; MVII #COLOR_YEL, R1 ; MVII #$02AE, R4 ; JSR R5, PrintHex ; MVI XNext, R0 ; MVII #COLOR_WHT, R1 ; MVII #$02C2, R4 ; JSR R5, PrintHex ; MVI YNext, R0 ; MVII #COLOR_WHT, R1 ; MVII #$02D6, R4 ; JSR R5, PrintHex ; MVI WallColor, R0 ; MVII #COLOR_RED, R1 ; MVII #$02EA, R4 ; JSR R5, PrintHex ; Print the X position ; MVI XPos, R0 ; MVII #COLOR_RED, R1 ; MVII #$020E, R4 ; JSR R5, PrintHex ; Print the Y position ; MVI YPos, R0 ; MVII #COLOR_RED, R1 ; MVII #$0222, R4 ; JSR R5, PrintHex ; Print the heading ; MVI Angle, R0 ; MVII #COLOR_TAN, R1 ; MVII #$024A, R4 ; JSR R5, PrintHex ; Print the X delta ; MVI OldDX, R0 ; MVII #COLOR_WHT, R1 ; MVII #$0272, R4 ; JSR R5, PrintHex ; Print the Y delta ; MVI OldDY, R0 ; MVII #COLOR_WHT, R1 ; MVII #$0286, R4 ; JSR R5, PrintHex MVO R7, DoneRendering ; Set a flag to tell the interrupt routine that it can allow another position update MVO R7, UpdateAllowed PULR R7 ClampedAngle: DCW 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13 DCW 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25 DCW 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37 DCW 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49 DCW 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61 DCW 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73 DCW 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85 DCW 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, 97 DCW 98, 99, 100, 101, 102, 103, 104, 105, 106, 107, 108, 109 DCW 110, 111, 112, 113, 114, 115, 116, 117, 118, 119, 120, 121 DCW 122, 123, 124, 125, 126, 127, 128, 129, 130, 131, 132, 133 DCW 134, 135, 136, 137, 138, 139, 140, 141, 142, 143, 144, 145 DCW 146, 147, 148, 149, 150, 151, 152, 153, 154, 155, 156, 157 DCW 158, 159, 160, 161, 162, 163, 164, 165, 166, 167, 168, 169 DCW 170, 171, 172, 173, 174, 175, 176, 177, 178, 179, 180, 181 DCW 182, 183, 184, 185, 186, 187, 188, 189, 190, 191, 192, 193 DCW 194, 195, 196, 197, 198, 199, 200, 201, 202, 203, 204, 205 DCW 206, 207, 208, 209, 210, 211, 212, 213, 214, 215, 216, 217 DCW 218, 219, 220, 221, 222, 223, 224, 225, 226, 227, 228, 229 DCW 230, 231, 232, 233, 234, 235, 236, 237, 238, 239, 240, 241 DCW 242, 243, 244, 245, 246, 247, 248, 249, 250, 251, 252, 253 DCW 254, 255, 256, 257, 258, 259, 260, 261, 262, 263, 264, 265 DCW 266, 267, 268, 269, 270, 271, 272, 273, 274, 275, 276, 277 DCW 278, 279, 280, 281, 282, 283, 284, 285, 286, 287, 288, 289 DCW 290, 291, 292, 293, 294, 295, 296, 297, 298, 299, 300, 301 DCW 302, 303, 304, 305, 306, 307, 308, 309, 310, 311, 312, 313 DCW 314, 315, 316, 317, 318, 319, 320, 321, 322, 323, 324, 325 DCW 326, 327, 328, 329, 330, 331, 332, 333, 334, 335, 336, 337 DCW 338, 339, 340, 341, 342, 343, 344, 345, 346, 347, 348, 349 DCW 350, 351, 352, 353, 354, 355, 356, 357, 358, 359, 360, 361 DCW 362, 363, 364, 365, 366, 367, 368, 369, 370, 371, 372, 373 DCW 374, 375, 376, 377, 378, 379, 380, 381, 382, 383, 384, 385 DCW 386, 387, 388, 389, 390, 391, 392, 393, 394, 395, 396, 397 DCW 398, 399, 400, 401, 402, 403, 404, 405, 406, 407, 408, 409 DCW 410, 411, 412, 413, 414, 415, 416, 417, 418, 419, 420, 421 DCW 422, 423, 424, 425, 426, 427, 428, 429, 430, 431, 432, 433 DCW 434, 435, 436, 437, 438, 439, 440, 441, 442, 443, 444, 445 DCW 446, 447, 448, 449, 450, 451, 452, 453, 454, 455, 456, 457 DCW 458, 459, 460, 461, 462, 463, 464, 465, 466, 467, 468, 469 DCW 470, 471, 472, 473, 474, 475, 476, 477, 478, 479, 0, 1 ClampedHeights: DCW 0, 0 DCW 2, 2 DCW 4, 4 DCW 6, 6 DCW 8, 8 DCW 10, 10 DCW 12, 12 DCW 14, 14 DCW 16, 16 DCW 18, 18 DCW 20, 20 DCW 22, 22 DCW 24, 24 DCW 26, 26 DCW 28, 28 DCW 30, 30 DCW 32, 32 DCW 34, 34 DCW 36, 36 DCW 38, 38 DCW 40, 40 DCW 42, 42 DCW 44, 44 DCW 46, 46 DCW 48, 48 DCW 48, 48 DCW 48, 48 DCW 48, 48 DCW 48, 48 DCW 48, 48 DCW 48, 48 DCW 48, 48 AngleJumpTable: DCW @@AngESEx100, @@AngESEx100, @@AngESEx100, @@AngESEx100, @@AngESEx100, @@AngESEx101 DCW @@AngESEx101, @@AngESEx101, @@AngESEx101, @@AngESEx102, @@AngESEx102, @@AngESEx1xx DCW @@AngESEx1xx, @@AngESEx1xx, @@AngESEx1xx, @@AngESEx1xx, @@AngESEx1xx, @@AngESEx1xx DCW @@AngESEx1xx, @@AngESEx1xx, @@AngESEx1xx, @@AngESEx1xx, @@AngESEx1xx, @@AngESEx1xx DCW @@AngESEx1xx, @@AngESEx1xx, @@AngESE2xx1xx, @@AngESE2xx1xx, @@AngESE2xx1xx, @@AngESE2xx1xx DCW @@AngESE2xx1xx, @@AngESE2xx1xx, @@AngESE2xx1xx, @@AngESE2xx1xx, @@AngESE2xx1xx, @@AngESE2xx1xx DCW @@AngESE2xx1xx, @@AngESE2xx1xx, @@AngESE2xx1xx, @@AngESE2xx1xx, @@AngESE2xx1xx, @@AngESE1xx1xx DCW @@AngESE1xx1xx, @@AngESE1xx1xx, @@AngESE1xx1xx, @@AngESE1xx1xx, @@AngESE1xx1xx, @@AngESE1xx1xx DCW @@AngESE1xx1xx, @@AngESE1xx1xx, @@AngESE1xx1xx, @@AngESE1xx1xx, @@AngESE1xx1xx, @@AngESE1xx1xx DCW @@AngESE1xx1xx, @@AngESE1xx1xx, @@AngESE1xx1xx, @@AngESE1xx1xx, @@AngESE1xx1xx, @@AngESE1xx1xx DCW @@AngSSE1xx1xx, @@AngSSE1xx1xx, @@AngSSE1xx1xx, @@AngSSE1xx1xx, @@AngSSE1xx1xx, @@AngSSE1xx1xx DCW @@AngSSE1xx1xx, @@AngSSE1xx1xx, @@AngSSE1xx1xx, @@AngSSE1xx1xx, @@AngSSE1xx1xx, @@AngSSE1xx1xx DCW @@AngSSE1xx1xx, @@AngSSE1xx1xx, @@AngSSE1xx1xx, @@AngSSE1xx1xx, @@AngSSE1xx1xx, @@AngSSE1xx1xx DCW @@AngSSE1xx1xx, @@AngSSE1xx1xx, @@AngSSE1xx2xx, @@AngSSE1xx2xx, @@AngSSE1xx2xx, @@AngSSE1xx2xx DCW @@AngSSE1xx2xx, @@AngSSE1xx2xx, @@AngSSE1xx2xx, @@AngSSE1xx2xx, @@AngSSE1xx2xx, @@AngSSE1xx2xx DCW @@AngSSE1xx2xx, @@AngSSE1xx2xx, @@AngSSE1xx2xx, @@AngSSE1xx2xx, @@AngSSE1xx2xx, @@AngSSE1xxx DCW @@AngSSE1xxx, @@AngSSE1xxx, @@AngSSE1xxx, @@AngSSE1xxx, @@AngSSE1xxx, @@AngSSE1xxx DCW @@AngSSE1xxx, @@AngSSE1xxx, @@AngSSE1xxx, @@AngSSE1xxx, @@AngSSE1xxx, @@AngSSE1xxx DCW @@AngSSE1xxx, @@AngSSE1xxx, @@AngSSE102x, @@AngSSE102x, @@AngSSE101x, @@AngSSE101x DCW @@AngSSE101x, @@AngSSE101x, @@AngSSE100x, @@AngSSE100x, @@AngSSE100x, @@AngSSE100x DCW @@AngSSW100x, @@AngSSW100x, @@AngSSW100x, @@AngSSW100x, @@AngSSW100x, @@AngSSW101x DCW @@AngSSW101x, @@AngSSW101x, @@AngSSW101x, @@AngSSW102x, @@AngSSW102x, @@AngSSW1xxx DCW @@AngSSW1xxx, @@AngSSW1xxx, @@AngSSW1xxx, @@AngSSW1xxx, @@AngSSW1xxx, @@AngSSW1xxx DCW @@AngSSW1xxx, @@AngSSW1xxx, @@AngSSW1xxx, @@AngSSW1xxx, @@AngSSW1xxx, @@AngSSW1xxx DCW @@AngSSW1xxx, @@AngSSW1xxx, @@AngSSW1xx2xx, @@AngSSW1xx2xx, @@AngSSW1xx2xx, @@AngSSW1xx2xx DCW @@AngSSW1xx2xx, @@AngSSW1xx2xx, @@AngSSW1xx2xx, @@AngSSW1xx2xx, @@AngSSW1xx2xx, @@AngSSW1xx2xx DCW @@AngSSW1xx2xx, @@AngSSW1xx2xx, @@AngSSW1xx2xx, @@AngSSW1xx2xx, @@AngSSW1xx2xx, @@AngSSW1xx1xx DCW @@AngSSW1xx1xx, @@AngSSW1xx1xx, @@AngSSW1xx1xx, @@AngSSW1xx1xx, @@AngSSW1xx1xx, @@AngSSW1xx1xx DCW @@AngSSW1xx1xx, @@AngSSW1xx1xx, @@AngSSW1xx1xx, @@AngSSW1xx1xx, @@AngSSW1xx1xx, @@AngSSW1xx1xx DCW @@AngSSW1xx1xx, @@AngSSW1xx1xx, @@AngSSW1xx1xx, @@AngSSW1xx1xx, @@AngSSW1xx1xx, @@AngSSW1xx1xx DCW @@AngWSW1xx1xx, @@AngWSW1xx1xx, @@AngWSW1xx1xx, @@AngWSW1xx1xx, @@AngWSW1xx1xx, @@AngWSW1xx1xx DCW @@AngWSW1xx1xx, @@AngWSW1xx1xx, @@AngWSW1xx1xx, @@AngWSW1xx1xx, @@AngWSW1xx1xx, @@AngWSW1xx1xx DCW @@AngWSW1xx1xx, @@AngWSW1xx1xx, @@AngWSW1xx1xx, @@AngWSW1xx1xx, @@AngWSW1xx1xx, @@AngWSW1xx1xx DCW @@AngWSW1xx1xx, @@AngWSW1xx1xx, @@AngWSW2xx1xx, @@AngWSW2xx1xx, @@AngWSW2xx1xx, @@AngWSW2xx1xx DCW @@AngWSW2xx1xx, @@AngWSW2xx1xx, @@AngWSW2xx1xx, @@AngWSW2xx1xx, @@AngWSW2xx1xx, @@AngWSW2xx1xx DCW @@AngWSW2xx1xx, @@AngWSW2xx1xx, @@AngWSW2xx1xx, @@AngWSW2xx1xx, @@AngWSW2xx1xx, @@AngWSWx1xx DCW @@AngWSWx1xx, @@AngWSWx1xx, @@AngWSWx1xx, @@AngWSWx1xx, @@AngWSWx1xx, @@AngWSWx1xx DCW @@AngWSWx1xx, @@AngWSWx1xx, @@AngWSWx1xx, @@AngWSWx1xx, @@AngWSWx1xx, @@AngWSWx1xx DCW @@AngWSWx1xx, @@AngWSWx1xx, @@AngWSWx102, @@AngWSWx102, @@AngWSWx101, @@AngWSWx101 DCW @@AngWSWx101, @@AngWSWx101, @@AngWSWx100, @@AngWSWx100, @@AngWSWx100, @@AngWSWx100 DCW @@AngWNWx100, @@AngWNWx100, @@AngWNWx100, @@AngWNWx100, @@AngWNWx100, @@AngWNWx101 DCW @@AngWNWx101, @@AngWNWx101, @@AngWNWx101, @@AngWNWx102, @@AngWNWx102, @@AngWNWx1xx DCW @@AngWNWx1xx, @@AngWNWx1xx, @@AngWNWx1xx, @@AngWNWx1xx, @@AngWNWx1xx, @@AngWNWx1xx DCW @@AngWNWx1xx, @@AngWNWx1xx, @@AngWNWx1xx, @@AngWNWx1xx, @@AngWNWx1xx, @@AngWNWx1xx DCW @@AngWNWx1xx, @@AngWNWx1xx, @@AngWNW2xx1xx, @@AngWNW2xx1xx, @@AngWNW2xx1xx, @@AngWNW2xx1xx DCW @@AngWNW2xx1xx, @@AngWNW2xx1xx, @@AngWNW2xx1xx, @@AngWNW2xx1xx, @@AngWNW2xx1xx, @@AngWNW2xx1xx DCW @@AngWNW2xx1xx, @@AngWNW2xx1xx, @@AngWNW2xx1xx, @@AngWNW2xx1xx, @@AngWNW1xx1xx, @@AngWNW1xx1xx DCW @@AngWNW1xx1xx, @@AngWNW1xx1xx, @@AngWNW1xx1xx, @@AngWNW1xx1xx, @@AngWNW1xx1xx, @@AngWNW1xx1xx DCW @@AngWNW1xx1xx, @@AngWNW1xx1xx, @@AngWNW1xx1xx, @@AngWNW1xx1xx, @@AngWNW1xx1xx, @@AngWNW1xx1xx DCW @@AngWNW1xx1xx, @@AngWNW1xx1xx, @@AngWNW1xx1xx, @@AngWNW1xx1xx, @@AngWNW1xx1xx, @@AngWNW1xx1xx DCW @@AngNNW1xx1xx, @@AngNNW1xx1xx, @@AngNNW1xx1xx, @@AngNNW1xx1xx, @@AngNNW1xx1xx, @@AngNNW1xx1xx DCW @@AngNNW1xx1xx, @@AngNNW1xx1xx, @@AngNNW1xx1xx, @@AngNNW1xx1xx, @@AngNNW1xx1xx, @@AngNNW1xx1xx DCW @@AngNNW1xx1xx, @@AngNNW1xx1xx, @@AngNNW1xx1xx, @@AngNNW1xx1xx, @@AngNNW1xx1xx, @@AngNNW1xx1xx DCW @@AngNNW1xx1xx, @@AngNNW1xx1xx, @@AngNNW1xx1xx, @@AngNNW1xx2xx, @@AngNNW1xx2xx, @@AngNNW1xx2xx DCW @@AngNNW1xx2xx, @@AngNNW1xx2xx, @@AngNNW1xx2xx, @@AngNNW1xx2xx, @@AngNNW1xx2xx, @@AngNNW1xx2xx DCW @@AngNNW1xx2xx, @@AngNNW1xx2xx, @@AngNNW1xx2xx, @@AngNNW1xx2xx, @@AngNNW1xx2xx, @@AngNNW1xxx DCW @@AngNNW1xxx, @@AngNNW1xxx, @@AngNNW1xxx, @@AngNNW1xxx, @@AngNNW1xxx, @@AngNNW1xxx DCW @@AngNNW1xxx, @@AngNNW1xxx, @@AngNNW1xxx, @@AngNNW1xxx, @@AngNNW1xxx, @@AngNNW1xxx DCW @@AngNNW1xxx, @@AngNNW1xxx, @@AngNNW102x, @@AngNNW102x, @@AngNNW101x, @@AngNNW101x DCW @@AngNNW101x, @@AngNNW101x, @@AngNNW100x, @@AngNNW100x, @@AngNNW100x, @@AngNNW100x DCW @@AngNNE100x, @@AngNNE100x, @@AngNNE100x, @@AngNNE100x, @@AngNNE100x, @@AngNNE101x DCW @@AngNNE101x, @@AngNNE101x, @@AngNNE101x, @@AngNNE102x, @@AngNNE102x, @@AngNNE1xxx DCW @@AngNNE1xxx, @@AngNNE1xxx, @@AngNNE1xxx, @@AngNNE1xxx, @@AngNNE1xxx, @@AngNNE1xxx DCW @@AngNNE1xxx, @@AngNNE1xxx, @@AngNNE1xxx, @@AngNNE1xxx, @@AngNNE1xxx, @@AngNNE1xxx DCW @@AngNNE1xxx, @@AngNNE1xxx, @@AngNNE1xx2xx, @@AngNNE1xx2xx, @@AngNNE1xx2xx, @@AngNNE1xx2xx DCW @@AngNNE1xx2xx, @@AngNNE1xx2xx, @@AngNNE1xx2xx, @@AngNNE1xx2xx, @@AngNNE1xx2xx, @@AngNNE1xx2xx DCW @@AngNNE1xx2xx, @@AngNNE1xx2xx, @@AngNNE1xx2xx, @@AngNNE1xx2xx, @@AngNNE1xx2xx, @@AngNNE1xx1xx DCW @@AngNNE1xx1xx, @@AngNNE1xx1xx, @@AngNNE1xx1xx, @@AngNNE1xx1xx, @@AngNNE1xx1xx, @@AngNNE1xx1xx DCW @@AngNNE1xx1xx, @@AngNNE1xx1xx, @@AngNNE1xx1xx, @@AngNNE1xx1xx, @@AngNNE1xx1xx, @@AngNNE1xx1xx DCW @@AngNNE1xx1xx, @@AngNNE1xx1xx, @@AngNNE1xx1xx, @@AngNNE1xx1xx, @@AngNNE1xx1xx, @@AngNNE1xx1xx DCW @@AngENE1xx1xx, @@AngENE1xx1xx, @@AngENE1xx1xx, @@AngENE1xx1xx, @@AngENE1xx1xx, @@AngENE1xx1xx DCW @@AngENE1xx1xx, @@AngENE1xx1xx, @@AngENE1xx1xx, @@AngENE1xx1xx, @@AngENE1xx1xx, @@AngENE1xx1xx DCW @@AngENE1xx1xx, @@AngENE1xx1xx, @@AngENE1xx1xx, @@AngENE1xx1xx, @@AngENE1xx1xx, @@AngENE1xx1xx DCW @@AngENE1xx1xx, @@AngENE1xx1xx, @@AngENE1xx1xx, @@AngENE2xx1xx, @@AngENE2xx1xx, @@AngENE2xx1xx DCW @@AngENE2xx1xx, @@AngENE2xx1xx, @@AngENE2xx1xx, @@AngENE2xx1xx, @@AngENE2xx1xx, @@AngENE2xx1xx DCW @@AngENE2xx1xx, @@AngENE2xx1xx, @@AngENE2xx1xx, @@AngENE2xx1xx, @@AngENE2xx1xx, @@AngENEx1xx DCW @@AngENEx1xx, @@AngENEx1xx, @@AngENEx1xx, @@AngENEx1xx, @@AngENEx1xx, @@AngENEx1xx DCW @@AngENEx1xx, @@AngENEx1xx, @@AngENEx1xx, @@AngENEx1xx, @@AngENEx1xx, @@AngENEx1xx DCW @@AngENEx1xx, @@AngENEx1xx, @@AngENEx102, @@AngENEx102, @@AngENEx101, @@AngENEx101 DCW @@AngENEx101, @@AngENEx101, @@AngENEx100, @@AngENEx100, @@AngENEx100, @@AngENEx100 DistHeights: ; DCW 8, 8, 4, 2, 2, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0 ; DCW 16, 16, 8, 4, 4, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 0 DCW CS_WALL_HEIGHT * 2 DCW CS_WALL_HEIGHT * 2 DCW CS_WALL_HEIGHT DCW (((CS_WALL_HEIGHT / 2) < 1) + (((CS_WALL_HEIGHT / 2) > 0) * (CS_WALL_HEIGHT / 2))) * 2 DCW (((CS_WALL_HEIGHT / 3) < 1) + (((CS_WALL_HEIGHT / 3) > 0) * (CS_WALL_HEIGHT / 3))) * 2 DCW (((CS_WALL_HEIGHT / 4) < 1) + (((CS_WALL_HEIGHT / 4) > 0) * (CS_WALL_HEIGHT / 4))) * 2 DCW (((CS_WALL_HEIGHT / 5) < 1) + (((CS_WALL_HEIGHT / 5) > 0) * (CS_WALL_HEIGHT / 5))) * 2 DCW (((CS_WALL_HEIGHT / 6) < 1) + (((CS_WALL_HEIGHT / 6) > 0) * (CS_WALL_HEIGHT / 6))) * 2 DCW (((CS_WALL_HEIGHT / 7) < 1) + (((CS_WALL_HEIGHT / 7) > 0) * (CS_WALL_HEIGHT / 7))) * 2 DCW (((CS_WALL_HEIGHT / 8) < 1) + (((CS_WALL_HEIGHT / 8) > 0) * (CS_WALL_HEIGHT / 8))) * 2 DCW (((CS_WALL_HEIGHT / 9) < 1) + (((CS_WALL_HEIGHT / 9) > 0) * (CS_WALL_HEIGHT / 9))) * 2 DCW (((CS_WALL_HEIGHT / 10) < 1) + (((CS_WALL_HEIGHT / 10) > 0) * (CS_WALL_HEIGHT / 10))) * 2 DCW (((CS_WALL_HEIGHT / 11) < 1) + (((CS_WALL_HEIGHT / 11) > 0) * (CS_WALL_HEIGHT / 11))) * 2 DCW (((CS_WALL_HEIGHT / 12) < 1) + (((CS_WALL_HEIGHT / 12) > 0) * (CS_WALL_HEIGHT / 12))) * 2 DCW (((CS_WALL_HEIGHT / 13) < 1) + (((CS_WALL_HEIGHT / 13) > 0) * (CS_WALL_HEIGHT / 13))) * 2 DCW (((CS_WALL_HEIGHT / 14) < 1) + (((CS_WALL_HEIGHT / 14) > 0) * (CS_WALL_HEIGHT / 14))) * 2 DCW (((CS_WALL_HEIGHT / 15) < 1) + (((CS_WALL_HEIGHT / 15) > 0) * (CS_WALL_HEIGHT / 15))) * 2 DCW (((CS_WALL_HEIGHT / 16) < 1) + (((CS_WALL_HEIGHT / 16) > 0) * (CS_WALL_HEIGHT / 16))) * 2 DCW (((CS_WALL_HEIGHT / 17) < 1) + (((CS_WALL_HEIGHT / 17) > 0) * (CS_WALL_HEIGHT / 17))) * 2 DCW (((CS_WALL_HEIGHT / 18) < 1) + (((CS_WALL_HEIGHT / 18) > 0) * (CS_WALL_HEIGHT / 18))) * 2 DCW (((CS_WALL_HEIGHT / 19) < 1) + (((CS_WALL_HEIGHT / 19) > 0) * (CS_WALL_HEIGHT / 19))) * 2 DCW (((CS_WALL_HEIGHT / 20) < 1) + (((CS_WALL_HEIGHT / 20) > 0) * (CS_WALL_HEIGHT / 20))) * 2 DCW (((CS_WALL_HEIGHT / 21) < 1) + (((CS_WALL_HEIGHT / 21) > 0) * (CS_WALL_HEIGHT / 21))) * 2 DCW (((CS_WALL_HEIGHT / 22) < 1) + (((CS_WALL_HEIGHT / 22) > 0) * (CS_WALL_HEIGHT / 22))) * 2 DCW (((CS_WALL_HEIGHT / 23) < 1) + (((CS_WALL_HEIGHT / 23) > 0) * (CS_WALL_HEIGHT / 23))) * 2 DCW 0 ; DCW 16, 16, 8, 4, 4, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 0 ENDP ; ------------------------------------------------------------- ; Clears a column of 6 cards in the rendering bitmap ClearColumn PROC MVI DrawX, R4 ; $52D5 0284 0344 [.. ] ANDI #$FFF8, R4 ; $52D7 03BC FFF8 [.. ] ADDI #CartRAM, R4 ; $52D9 02FC C000 [.. ] SUBR R0, R0 ; $52DB 0100 [. ] ; Load the increment to the next row (80 - 8) MVII #$0048, R1 ; $52DC 02B9 0048 [.H ] MVO@ R0, R4 ; $52DE 0260 [. ] MVO@ R0, R4 ; $52DF 0260 [. ] MVO@ R0, R4 ; $52E0 0260 [. ] MVO@ R0, R4 ; $52E1 0260 [. ] MVO@ R0, R4 ; $52E2 0260 [. ] MVO@ R0, R4 ; $52E3 0260 [. ] MVO@ R0, R4 ; $52E4 0260 [. ] MVO@ R0, R4 ; $52E5 0260 [. ] ADDR R1, R4 ; $52E6 00CC [. ] MVO@ R0, R4 ; $52E7 0260 [. ] MVO@ R0, R4 ; $52E8 0260 [. ] MVO@ R0, R4 ; $52E9 0260 [. ] MVO@ R0, R4 ; $52EA 0260 [. ] MVO@ R0, R4 ; $52EB 0260 [. ] MVO@ R0, R4 ; $52EC 0260 [. ] MVO@ R0, R4 ; $52ED 0260 [. ] MVO@ R0, R4 ; $52EE 0260 [. ] ADDR R1, R4 ; $52EF 00CC [. ] MVO@ R0, R4 ; $52F0 0260 [. ] MVO@ R0, R4 ; $52F1 0260 [. ] MVO@ R0, R4 ; $52F2 0260 [. ] MVO@ R0, R4 ; $52F3 0260 [. ] MVO@ R0, R4 ; $52F4 0260 [. ] MVO@ R0, R4 ; $52F5 0260 [. ] MVO@ R0, R4 ; $52F6 0260 [. ] MVO@ R0, R4 ; $52F7 0260 [. ] ADDR R1, R4 ; $52F8 00CC [. ] MVO@ R0, R4 ; $52F9 0260 [. ] MVO@ R0, R4 ; $52FA 0260 [. ] MVO@ R0, R4 ; $52FB 0260 [. ] MVO@ R0, R4 ; $52FC 0260 [. ] MVO@ R0, R4 ; $52FD 0260 [. ] MVO@ R0, R4 ; $52FE 0260 [. ] MVO@ R0, R4 ; $52FF 0260 [. ] MVO@ R0, R4 ; $5300 0260 [. ] ADDR R1, R4 ; $5301 00CC [. ] MVO@ R0, R4 ; $5302 0260 [. ] MVO@ R0, R4 ; $5303 0260 [. ] MVO@ R0, R4 ; $5304 0260 [. ] MVO@ R0, R4 ; $5305 0260 [. ] MVO@ R0, R4 ; $5306 0260 [. ] MVO@ R0, R4 ; $5307 0260 [. ] MVO@ R0, R4 ; $5308 0260 [. ] MVO@ R0, R4 ; $5309 0260 [. ] ADDR R1, R4 ; $530A 00CC [. ] MVO@ R0, R4 ; $531D 0260 [. ] MVO@ R0, R4 ; $531E 0260 [. ] MVO@ R0, R4 ; $531F 0260 [. ] MVO@ R0, R4 ; $5320 0260 [. ] MVO@ R0, R4 ; $5321 0260 [. ] MVO@ R0, R4 ; $5322 0260 [. ] MVO@ R0, R4 ; $5323 0260 [. ] MVO@ R0, R4 ; $5324 0260 [. ] MOVR R5, R7 ; $5325 00AF [. ] ENDP ; ------------------------------------------------------------- ; Draws a vertical run of pixels in an 80-pixel-wide bitmap consisting of GRAM cards DrawRayFirst PROC ; R2 = 0x80 >> ([DrawX] & 7) ; Pixel to change ; R1 = 0xC000 + ([DrawX] & 0xFFF8) ; Dest address ; R4 = [DrawBot] - [DrawTop] ; Count = DrawBot - DrawTop ; if (R4 != 0) ; { ; R1 += 80 * ([DrawTop] / 8) + ([DrawTop] & 7) ; Advance to the starting position ; R3 = [DrawTop] & 7 ; Starting offset in the card ; while (R4) ; { ; switch (R3) ; { ; case 0: ; [R1++] ^= R2 ; if (--R4) break; ; case 1: ; [R1++] ^= R2 ; if (--R4) break; ; case 2: ; [R1++] ^= R2 ; if (--R4) break; ; case 3: ; [R1++] ^= R2 ; if (--R4) break; ; case 4: ; [R1++] ^= R2 ; if (--R4) break; ; case 5: ; [R1++] ^= R2 ; if (--R4) break; ; case 6: ; [R1++] ^= R2 ; if (--R4) break; ; case 7: ; [R1] ^= R2 ; R1 += 73; ; Advance to the next card row ; R3 = 0; ; Fill the next card if required (accomplished with a jump instead of clearing R3) ; --R4; ; } ; } ; } MVI DrawX, R3 ; $5326 0283 0344 [.. ] MOVR R3, R2 ; $5328 009A [. ] ANDI #$0007, R2 ; $5329 03BA 0007 [.. ] DrawRayFirst2: MVII #CartRAM, R1 ; $532E 02B9 C000 [.. ] ANDI #$FFF8, R3 ; $5330 03BB FFF8 [.. ] ADDR R3, R1 ; $5332 00D9 [. ] SUBR R2, R2 ; Blank down to DrawTop MVI DrawTop, R3 TSTR R3 BEQ @@BlankTopDone MOVR R1, R4 SLR R3, 2 SLR R3 BEQ @@BlankTopCardDone @@BlankTopCardLoop: MVO@ R2, R4 MVO@ R2, R4 MVO@ R2, R4 MVO@ R2, R4 MVO@ R2, R4 MVO@ R2, R4 MVO@ R2, R4 MVO@ R2, R4 ADDI #$0048, R4 DECR R3 BNEQ @@BlankTopCardLoop @@BlankTopCardDone: MVI DrawTop, R3 ANDI #$0007, R3 BEQ @@BlankTopDone @@BlankTopLoop: MVO@ R2, R4 DECR R3 BNEQ @@BlankTopLoop @@BlankTopDone: ; Blank from DrawBot MVI DrawBot, R3 CMPI #BmpHeight, R3 BEQ @@BlankBotCardDone MOVR R1, R4 SLR R3, 2 SLR R3 ADDI #@@Mult80F, R3 MVI@ R3, R3 ADDR R3, R4 MVI DrawBot, R3 ANDI #$0007, R3 BEQ @@BlankBotDone ADDR R3, R4 SUBI #$0008, R3 NEGR R3 @@BlankBotLoop: MVO@ R2, R4 DECR R3 BNEQ @@BlankBotLoop ADDI #$0048, R4 @@BlankBotDone: MVII #BmpHeight, R3 SUB DrawBot, R3 SLR R3, 2 SLR R3 BEQ @@BlankBotCardDone @@BlankBotCardLoop: MVO@ R2, R4 MVO@ R2, R4 MVO@ R2, R4 MVO@ R2, R4 MVO@ R2, R4 MVO@ R2, R4 MVO@ R2, R4 MVO@ R2, R4 ADDI #$0048, R4 DECR R3 BNEQ @@BlankBotCardLoop @@BlankBotCardDone: DrawRayFirst3: MVII #CartRAM, R1 ; $532E 02B9 C000 [.. ] ANDI #$FFF8, R3 ; $5330 03BB FFF8 [.. ] ADDR R3, R1 ; $5332 00D9 [. ] ; Draw the ray MVI DrawTop, R3 ; $5333 0283 0346 [.. ] MVI DrawBot, R4 ; $5335 0284 0347 [.. ] SUBR R3, R4 ; $5337 011C [. ] BEQ @@DoneRay5F ; $5338 0204 0055 [.U ] SLR R3, 2 ; $533A 0067 [g ] SLR R3 ; $533B 0063 [c ] ADDI #@@Mult80F, R3 ; $533C 02FB 5350 [.. ] MVI@ R3, R3 ; $533E 029B [. ] ADDR R3, R1 ; $533F 00D9 [. ] MVI DrawTop, R3 ; $5340 0283 0346 [.. ] ANDI #$0007, R3 ; $5342 03BB 0007 [.. ] ADDR R3, R1 ; $5344 00D9 [. ] SUBI #$0008, R3 NEGR R3 CMPR R4, R3 BLT @@MultipleCardsF MOVR R4, R3 @@MultipleCardsF: ADDI #@@RayJumpTableFStart, R3 MVII #$0080, R2 PSHR R5 MOVR R1, R5 MOVR R4, R1 MVI@ R3, R7 ; $5347 029F [. ] ; Jump table (requires 16-bit ROM) @@RayJumpTableFStart: DCW @@CardRows0FStart, @@CardRows1FStart, @@CardRows2FStart, @@CardRows3FStart, @@CardRows4FStart, @@CardRows5FStart, @@CardRows6FStart, @@CardRows7FStart, @@CardRows8FStart @@RayJumpTableFEnd: DCW @@DoneRayF, @@CardRows1FEnd, @@CardRows2FEnd, @@CardRows3FEnd, @@CardRows4FEnd, @@CardRows5FEnd, @@CardRows6FEnd, @@CardRows7FEnd, @@CardRows8F @@Mult80F: DCW $0000, $0050, $00A0, $00F0, $0140, $0190 ; 0, 80, 160, 240, 320, 400 @@CardRows7FEnd: MVO@ R2, R5 @@CardRows6FEnd: MVO@ R2, R5 @@CardRows5FEnd: MVO@ R2, R5 @@CardRows4FEnd: MVO@ R2, R5 @@CardRows3FEnd: MVO@ R2, R5 @@CardRows2FEnd: MVO@ R2, R5 @@CardRows1FEnd: MVO@ R2, R5 B @@DoneRayF @@CardRows0FStart: PULR R3 B @@DoneRayF @@CardRows1FStart: PULR R3 MVO@ R2, R5 DECR R1 BEQ @@DoneRayF ADDI #$0048, R5 B @@CardRows8F @@CardRows2FStart: PULR R3 MVO@ R2, R5 MVO@ R2, R5 SUBI #$0002, R1 BEQ @@DoneRayF ADDI #$0048, R5 B @@CardRows8F @@CardRows3FStart: PULR R3 MVO@ R2, R5 MVO@ R2, R5 MVO@ R2, R5 SUBI #$0003, R1 BEQ @@DoneRayF ADDI #$0048, R5 B @@CardRows8F @@CardRows4FStart: PULR R3 MVO@ R2, R5 MVO@ R2, R5 MVO@ R2, R5 MVO@ R2, R5 SUBI #$0004, R1 BEQ @@DoneRayF ADDI #$0048, R5 B @@CardRows8F @@CardRows5FStart: PULR R3 MVO@ R2, R5 MVO@ R2, R5 MVO@ R2, R5 MVO@ R2, R5 MVO@ R2, R5 SUBI #$0005, R1 BEQ @@DoneRayF ADDI #$0048, R5 B @@CardRows8F @@CardRows6FStart: PULR R3 MVO@ R2, R5 MVO@ R2, R5 MVO@ R2, R5 MVO@ R2, R5 MVO@ R2, R5 MVO@ R2, R5 SUBI #$0006, R1 BEQ @@DoneRayF ADDI #$0048, R5 B @@CardRows8F @@CardRows7FStart: PULR R3 MVO@ R2, R5 MVO@ R2, R5 MVO@ R2, R5 MVO@ R2, R5 MVO@ R2, R5 MVO@ R2, R5 MVO@ R2, R5 SUBI #$0007, R1 BEQ @@DoneRayF ADDI #$0048, R5 B @@CardRows8F @@CardRows8FStart: PULR R3 @@CardRows8F: CMPI #$0008, R1 BGE @@CardRows8F2 ADDI #@@RayJumpTableFEnd, R1 MVI@ R1, R7 @@CardRows8F2: ; The ray spans an entire card MVO@ R2, R5 MVO@ R2, R5 MVO@ R2, R5 MVO@ R2, R5 MVO@ R2, R5 MVO@ R2, R5 MVO@ R2, R5 MVO@ R2, R5 ADDI #$0048, R5 SUBI #$0008, R1 BNEQ @@CardRows8F @@DoneRayF: MOVR R3, R7 @@DoneRay5F: MOVR R5, R7 ENDP ; ------------------------------------------------------------- ; Draws a vertical run of pixels in an 80-pixel-wide bitmap consisting of GRAM cards DrawRay PROC ; R2 = 0x80 >> ([DrawX] & 7) ; Pixel to change ; R1 = 0xC000 + ([DrawX] & 0xFFF8) ; Dest address ; R4 = [DrawBot] - [DrawTop] ; Count = DrawBot - DrawTop ; if (R4 != 0) ; { ; R1 += 80 * ([DrawTop] / 8) + ([DrawTop] & 7) ; Advance to the starting position ; R3 = [DrawTop] & 7 ; Starting offset in the card ; while (R4) ; { ; switch (R3) ; { ; case 0: ; [R1++] ^= R2 ; if (--R4) break; ; case 1: ; [R1++] ^= R2 ; if (--R4) break; ; case 2: ; [R1++] ^= R2 ; if (--R4) break; ; case 3: ; [R1++] ^= R2 ; if (--R4) break; ; case 4: ; [R1++] ^= R2 ; if (--R4) break; ; case 5: ; [R1++] ^= R2 ; if (--R4) break; ; case 6: ; [R1++] ^= R2 ; if (--R4) break; ; case 7: ; [R1] ^= R2 ; R1 += 73; ; Advance to the next card row ; R3 = 0; ; Fill the next card if required (accomplished with a jump instead of clearing R3) ; --R4; ; } ; } ; } MVI DrawX, R3 ; $5326 0283 0344 [.. ] MOVR R3, R2 ; $5328 009A [. ] ANDI #$0007, R2 ; $5329 03BA 0007 [.. ] BEQ DrawRayFirst3 ADDI #RayBitMask, R2 ; $532B 02FA 53FF [.. ] MVI@ R2, R2 ; $532D 0292 [. ] MVII #CartRAM, R1 ; $532E 02B9 C000 [.. ] ANDI #$FFF8, R3 ; $5330 03BB FFF8 [.. ] ADDR R3, R1 ; $5332 00D9 [. ] MVI DrawTop, R3 ; $5333 0283 0346 [.. ] MVI DrawBot, R4 ; $5335 0284 0347 [.. ] SUBR R3, R4 ; $5337 011C [. ] BEQ @@DoneRay5 ; $5338 0204 0055 [.U ] SLR R3, 2 ; $533A 0067 [g ] SLR R3 ; $533B 0063 [c ] ADDI #@@Mult80, R3 ; $533C 02FB 5350 [.. ] MVI@ R3, R3 ; $533E 029B [. ] ADDR R3, R1 ; $533F 00D9 [. ] MVI DrawTop, R3 ; $5340 0283 0346 [.. ] ANDI #$0007, R3 ; $5342 03BB 0007 [.. ] ADDR R3, R1 ; $5344 00D9 [. ] SUBI #$0008, R3 NEGR R3 CMPR R4, R3 BLT @@MultipleCards MOVR R4, R3 @@MultipleCards: ADDI #@@RayJumpTableStart, R3 PSHR R5 PSHR R4 MOVR R1, R4 MOVR R1, R5 PULR R1 MVI@ R3, R7 ; $5347 029F [. ] ; Jump table (requires 16-bit ROM) @@RayJumpTableStart: DCW @@CardRows0Start, @@CardRows1Start, @@CardRows2Start, @@CardRows3Start, @@CardRows4Start, @@CardRows5Start, @@CardRows6Start, @@CardRows7Start, @@CardRows8Start @@RayJumpTableEnd: DCW @@DoneRay, @@CardRows1End, @@CardRows2End, @@CardRows3End, @@CardRows4End, @@CardRows5End, @@CardRows6End, @@CardRows7End, @@CardRows8 @@Mult80: DCW $0000, $0050, $00A0, $00F0, $0140, $0190 ; 0, 80, 160, 240, 320, 400 @@CardRows7End: MVI@ R4, R0 XORR R2, R0 MVO@ R0, R5 @@CardRows6End: MVI@ R4, R0 XORR R2, R0 MVO@ R0, R5 @@CardRows5End: MVI@ R4, R0 XORR R2, R0 MVO@ R0, R5 @@CardRows4End: MVI@ R4, R0 XORR R2, R0 MVO@ R0, R5 @@CardRows3End: MVI@ R4, R0 XORR R2, R0 MVO@ R0, R5 @@CardRows2End: MVI@ R4, R0 XORR R2, R0 MVO@ R0, R5 @@CardRows1End: MVI@ R4, R0 XORR R2, R0 MVO@ R0, R5 B @@DoneRay @@CardRows0Start: PULR R3 B @@DoneRay @@CardRows1Start: PULR R3 MVI@ R4, R0 XORR R2, R0 MVO@ R0, R5 DECR R1 BEQ @@DoneRay ADDI #$0048, R4 ADDI #$0048, R5 B @@CardRows8 @@CardRows2Start: PULR R3 MVI@ R4, R0 XORR R2, R0 MVO@ R0, R5 MVI@ R4, R0 XORR R2, R0 MVO@ R0, R5 SUBI #$0002, R1 BEQ @@DoneRay ADDI #$0048, R4 ADDI #$0048, R5 B @@CardRows8 @@CardRows3Start: PULR R3 MVI@ R4, R0 XORR R2, R0 MVO@ R0, R5 MVI@ R4, R0 XORR R2, R0 MVO@ R0, R5 MVI@ R4, R0 XORR R2, R0 MVO@ R0, R5 SUBI #$0003, R1 BEQ @@DoneRay ADDI #$0048, R4 ADDI #$0048, R5 B @@CardRows8 @@CardRows4Start: PULR R3 MVI@ R4, R0 XORR R2, R0 MVO@ R0, R5 MVI@ R4, R0 XORR R2, R0 MVO@ R0, R5 MVI@ R4, R0 XORR R2, R0 MVO@ R0, R5 MVI@ R4, R0 XORR R2, R0 MVO@ R0, R5 SUBI #$0004, R1 BEQ @@DoneRay ADDI #$0048, R4 ADDI #$0048, R5 B @@CardRows8 @@CardRows5Start: PULR R3 MVI@ R4, R0 XORR R2, R0 MVO@ R0, R5 MVI@ R4, R0 XORR R2, R0 MVO@ R0, R5 MVI@ R4, R0 XORR R2, R0 MVO@ R0, R5 MVI@ R4, R0 XORR R2, R0 MVO@ R0, R5 MVI@ R4, R0 XORR R2, R0 MVO@ R0, R5 SUBI #$0005, R1 BEQ @@DoneRay ADDI #$0048, R4 ADDI #$0048, R5 B @@CardRows8 @@CardRows6Start: PULR R3 MVI@ R4, R0 XORR R2, R0 MVO@ R0, R5 MVI@ R4, R0 XORR R2, R0 MVO@ R0, R5 MVI@ R4, R0 XORR R2, R0 MVO@ R0, R5 MVI@ R4, R0 XORR R2, R0 MVO@ R0, R5 MVI@ R4, R0 XORR R2, R0 MVO@ R0, R5 MVI@ R4, R0 XORR R2, R0 MVO@ R0, R5 SUBI #$0006, R1 BEQ @@DoneRay ADDI #$0048, R4 ADDI #$0048, R5 B @@CardRows8 @@CardRows7Start: PULR R3 MVI@ R4, R0 XORR R2, R0 MVO@ R0, R5 MVI@ R4, R0 XORR R2, R0 MVO@ R0, R5 MVI@ R4, R0 XORR R2, R0 MVO@ R0, R5 MVI@ R4, R0 XORR R2, R0 MVO@ R0, R5 MVI@ R4, R0 XORR R2, R0 MVO@ R0, R5 MVI@ R4, R0 XORR R2, R0 MVO@ R0, R5 MVI@ R4, R0 XORR R2, R0 MVO@ R0, R5 SUBI #$0007, R1 BEQ @@DoneRay ADDI #$0048, R4 ADDI #$0048, R5 B @@CardRows8 @@CardRows8Start: PULR R3 @@CardRows8: CMPI #$0008, R1 BGE @@CardRows82 ADDI #@@RayJumpTableEnd, R1 MVI@ R1, R7 @@CardRows82: ; The ray spans an entire card MVI@ R4, R0 XORR R2, R0 MVO@ R0, R5 MVI@ R4, R0 XORR R2, R0 MVO@ R0, R5 MVI@ R4, R0 XORR R2, R0 MVO@ R0, R5 MVI@ R4, R0 XORR R2, R0 MVO@ R0, R5 MVI@ R4, R0 XORR R2, R0 MVO@ R0, R5 MVI@ R4, R0 XORR R2, R0 MVO@ R0, R5 MVI@ R4, R0 XORR R2, R0 MVO@ R0, R5 MVI@ R4, R0 XORR R2, R0 MVO@ R0, R5 ADDI #$0048, R4 ADDI #$0048, R5 SUBI #$8, R1 BNEQ @@CardRows8 @@DoneRay: MOVR R3, R7 @@DoneRay5: MOVR R5, R7 ENDP ; ------------------------------------------------------------- ; Draws vertical runs of pixels in a 40-pixel-wide bitmap consisting of colored squares. ; Draws both halves of a card at a time to eliminate the need for blanking a card or for ; a read-modify-write cycle. DrawRayCS2 PROC PSHR R5 MVII #BACKTAB, R1 MVII #DrawHeights, R4 MVII #CSPitch, R0 ; Save the position in the column-height array. Faster than using the stack. MVO R4, DrawHeightOfs @ColumnLoop: ; Restore the position in the column-height array MVI DrawHeightOfs, R4 ; Get the column heights MVI@ R4, R5 ; Left column height * 2 ADDI #@@LookupOfs, R5 MVI@ R5, R5 MVI@ R4, R2 ; Left colors ADD@ R4, R5 ; Add in right column height * 2 MVI@ R4, R3 ; Right colors MVO R4, DrawHeightOfs ; Save the position in the column-height array ADDI #@@ColorSplitL, R2 ADDI #@@ColorSplitR, R3 MVI@ R3, R4 ; Right color 1 INCR R3 MVI@ R3, R3 ; Right color 2 ADD@ R2, R3 ; Left color 1 and right color 2 INCR R2 ADD@ R2, R4 ; Left color 2 and right color 1 MVI@ R3, R3 ADD@ R4, R3 ; Retrieve the table offsets for the top and bottom halves MVI@ R5, R4 ; Draw the top half of the screen MVI@ R4, R2 ; Rows 1-2 ANDR R3, R2 XORI #CSCeiling, R2 MVO@ R2, R1 ADDR R0, R1 MVI@ R4, R2 ; Rows 3-4 ANDR R3, R2 XORI #CSCeiling, R2 MVO@ R2, R1 ADDR R0, R1 MVI@ R4, R2 ; Rows 5-6 ANDR R3, R2 XORI #CSCeiling, R2 MVO@ R2, R1 ADDR R0, R1 MVI@ R4, R2 ; Rows 7-8 ANDR R3, R2 XORI #CSCeiling, R2 MVO@ R2, R1 ADDR R0, R1 MVI@ R4, R2 ; Rows 9-10 ANDR R3, R2 XORI #CSCeiling, R2 MVO@ R2, R1 ADDR R0, R1 MVI@ R4, R2 ; Rows 11-12 ANDR R3, R2 XORI #CSCeiling, R2 MVO@ R2, R1 ADDR R0, R1 ; Draw the bottom half of the screen MVI@ R5, R4 XORI #CSQ_TO_FLOOR, R3 MVI@ R4, R2 ; Rows 13-14 ANDR R3, R2 XORI #CSFloor, R2 MVO@ R2, R1 ADDR R0, R1 MVI@ R4, R2 ; Rows 15-16 ANDR R3, R2 XORI #CSFloor, R2 MVO@ R2, R1 ADDR R0, R1 MVI@ R4, R2 ; Rows 17-18 ANDR R3, R2 XORI #CSFloor, R2 MVO@ R2, R1 ADDR R0, R1 MVI@ R4, R2 ; Rows 19-20 ANDR R3, R2 XORI #CSFloor, R2 MVO@ R2, R1 ADDR R0, R1 MVI@ R4, R2 ; Rows 21-22 ANDR R3, R2 XORI #CSFloor, R2 MVO@ R2, R1 ADDR R0, R1 MVI@ R4, R2 ; Rows 23-24 ANDR R3, R2 XORI #CSFloor, R2 MVO@ R2, R1 SUBI #(ElevenRows - 1), R1 CMPI #SecondCardRow, R1 BNEQ @ColumnLoop ; Finished PULR R5 MOVR R5, R7 @@ColorSplitL: DCW COLOR_BLK*8, COLOR_BLK*8 DCW COLOR_BLU*8, COLOR_BLK*8 DCW COLOR_RED*8, COLOR_BLK*8 DCW COLOR_TAN*8, COLOR_BLK*8 DCW COLOR_DKG*8, COLOR_BLK*8 DCW COLOR_GRN*8, COLOR_BLK*8 DCW COLOR_YEL*8, COLOR_BLK*8 DCW COLOR_WHT*8, COLOR_BLK*8 DCW COLOR_BLK*8, COLOR_BLU*8 DCW COLOR_BLU*8, COLOR_BLU*8 DCW COLOR_RED*8, COLOR_BLU*8 DCW COLOR_TAN*8, COLOR_BLU*8 DCW COLOR_DKG*8, COLOR_BLU*8 DCW COLOR_GRN*8, COLOR_BLU*8 DCW COLOR_YEL*8, COLOR_BLU*8 DCW COLOR_WHT*8, COLOR_BLU*8 DCW COLOR_BLK*8, COLOR_RED*8 DCW COLOR_BLU*8, COLOR_RED*8 DCW COLOR_RED*8, COLOR_RED*8 DCW COLOR_TAN*8, COLOR_RED*8 DCW COLOR_DKG*8, COLOR_RED*8 DCW COLOR_GRN*8, COLOR_RED*8 DCW COLOR_YEL*8, COLOR_RED*8 DCW COLOR_WHT*8, COLOR_RED*8 DCW COLOR_BLK*8, COLOR_TAN*8 DCW COLOR_BLU*8, COLOR_TAN*8 DCW COLOR_RED*8, COLOR_TAN*8 DCW COLOR_TAN*8, COLOR_TAN*8 DCW COLOR_DKG*8, COLOR_TAN*8 DCW COLOR_GRN*8, COLOR_TAN*8 DCW COLOR_YEL*8, COLOR_TAN*8 DCW COLOR_WHT*8, COLOR_TAN*8 DCW COLOR_BLK*8, COLOR_DKG*8 DCW COLOR_BLU*8, COLOR_DKG*8 DCW COLOR_RED*8, COLOR_DKG*8 DCW COLOR_TAN*8, COLOR_DKG*8 DCW COLOR_DKG*8, COLOR_DKG*8 DCW COLOR_GRN*8, COLOR_DKG*8 DCW COLOR_YEL*8, COLOR_DKG*8 DCW COLOR_WHT*8, COLOR_DKG*8 DCW COLOR_BLK*8, COLOR_GRN*8 DCW COLOR_BLU*8, COLOR_GRN*8 DCW COLOR_RED*8, COLOR_GRN*8 DCW COLOR_TAN*8, COLOR_GRN*8 DCW COLOR_DKG*8, COLOR_GRN*8 DCW COLOR_GRN*8, COLOR_GRN*8 DCW COLOR_YEL*8, COLOR_GRN*8 DCW COLOR_WHT*8, COLOR_GRN*8 DCW COLOR_BLK*8, COLOR_YEL*8 DCW COLOR_BLU*8, COLOR_YEL*8 DCW COLOR_RED*8, COLOR_YEL*8 DCW COLOR_TAN*8, COLOR_YEL*8 DCW COLOR_DKG*8, COLOR_YEL*8 DCW COLOR_GRN*8, COLOR_YEL*8 DCW COLOR_YEL*8, COLOR_YEL*8 DCW COLOR_WHT*8, COLOR_YEL*8 DCW COLOR_BLK*8, COLOR_WHT*8 DCW COLOR_BLU*8, COLOR_WHT*8 DCW COLOR_RED*8, COLOR_WHT*8 DCW COLOR_TAN*8, COLOR_WHT*8 DCW COLOR_DKG*8, COLOR_WHT*8 DCW COLOR_GRN*8, COLOR_WHT*8 DCW COLOR_YEL*8, COLOR_WHT*8 DCW COLOR_WHT*8, COLOR_WHT*8 @@ColorSplitR: DCW COLOR_BLK+@@WallColorTableBot, COLOR_BLK+@@WallColorTableTop DCW COLOR_BLU+@@WallColorTableBot, COLOR_BLK+@@WallColorTableTop DCW COLOR_RED+@@WallColorTableBot, COLOR_BLK+@@WallColorTableTop DCW COLOR_TAN+@@WallColorTableBot, COLOR_BLK+@@WallColorTableTop DCW COLOR_DKG+@@WallColorTableBot, COLOR_BLK+@@WallColorTableTop DCW COLOR_GRN+@@WallColorTableBot, COLOR_BLK+@@WallColorTableTop DCW COLOR_YEL+@@WallColorTableBot, COLOR_BLK+@@WallColorTableTop DCW COLOR_WHT+@@WallColorTableBot, COLOR_BLK+@@WallColorTableTop DCW COLOR_BLK+@@WallColorTableBot, COLOR_BLU+@@WallColorTableTop DCW COLOR_BLU+@@WallColorTableBot, COLOR_BLU+@@WallColorTableTop DCW COLOR_RED+@@WallColorTableBot, COLOR_BLU+@@WallColorTableTop DCW COLOR_TAN+@@WallColorTableBot, COLOR_BLU+@@WallColorTableTop DCW COLOR_DKG+@@WallColorTableBot, COLOR_BLU+@@WallColorTableTop DCW COLOR_GRN+@@WallColorTableBot, COLOR_BLU+@@WallColorTableTop DCW COLOR_YEL+@@WallColorTableBot, COLOR_BLU+@@WallColorTableTop DCW COLOR_WHT+@@WallColorTableBot, COLOR_BLU+@@WallColorTableTop DCW COLOR_BLK+@@WallColorTableBot, COLOR_RED+@@WallColorTableTop DCW COLOR_BLU+@@WallColorTableBot, COLOR_RED+@@WallColorTableTop DCW COLOR_RED+@@WallColorTableBot, COLOR_RED+@@WallColorTableTop DCW COLOR_TAN+@@WallColorTableBot, COLOR_RED+@@WallColorTableTop DCW COLOR_DKG+@@WallColorTableBot, COLOR_RED+@@WallColorTableTop DCW COLOR_GRN+@@WallColorTableBot, COLOR_RED+@@WallColorTableTop DCW COLOR_YEL+@@WallColorTableBot, COLOR_RED+@@WallColorTableTop DCW COLOR_WHT+@@WallColorTableBot, COLOR_RED+@@WallColorTableTop DCW COLOR_BLK+@@WallColorTableBot, COLOR_TAN+@@WallColorTableTop DCW COLOR_BLU+@@WallColorTableBot, COLOR_TAN+@@WallColorTableTop DCW COLOR_RED+@@WallColorTableBot, COLOR_TAN+@@WallColorTableTop DCW COLOR_TAN+@@WallColorTableBot, COLOR_TAN+@@WallColorTableTop DCW COLOR_DKG+@@WallColorTableBot, COLOR_TAN+@@WallColorTableTop DCW COLOR_GRN+@@WallColorTableBot, COLOR_TAN+@@WallColorTableTop DCW COLOR_YEL+@@WallColorTableBot, COLOR_TAN+@@WallColorTableTop DCW COLOR_WHT+@@WallColorTableBot, COLOR_TAN+@@WallColorTableTop DCW COLOR_BLK+@@WallColorTableBot, COLOR_DKG+@@WallColorTableTop DCW COLOR_BLU+@@WallColorTableBot, COLOR_DKG+@@WallColorTableTop DCW COLOR_RED+@@WallColorTableBot, COLOR_DKG+@@WallColorTableTop DCW COLOR_TAN+@@WallColorTableBot, COLOR_DKG+@@WallColorTableTop DCW COLOR_DKG+@@WallColorTableBot, COLOR_DKG+@@WallColorTableTop DCW COLOR_GRN+@@WallColorTableBot, COLOR_DKG+@@WallColorTableTop DCW COLOR_YEL+@@WallColorTableBot, COLOR_DKG+@@WallColorTableTop DCW COLOR_WHT+@@WallColorTableBot, COLOR_DKG+@@WallColorTableTop DCW COLOR_BLK+@@WallColorTableBot, COLOR_GRN+@@WallColorTableTop DCW COLOR_BLU+@@WallColorTableBot, COLOR_GRN+@@WallColorTableTop DCW COLOR_RED+@@WallColorTableBot, COLOR_GRN+@@WallColorTableTop DCW COLOR_TAN+@@WallColorTableBot, COLOR_GRN+@@WallColorTableTop DCW COLOR_DKG+@@WallColorTableBot, COLOR_GRN+@@WallColorTableTop DCW COLOR_GRN+@@WallColorTableBot, COLOR_GRN+@@WallColorTableTop DCW COLOR_YEL+@@WallColorTableBot, COLOR_GRN+@@WallColorTableTop DCW COLOR_WHT+@@WallColorTableBot, COLOR_GRN+@@WallColorTableTop DCW COLOR_BLK+@@WallColorTableBot, COLOR_YEL+@@WallColorTableTop DCW COLOR_BLU+@@WallColorTableBot, COLOR_YEL+@@WallColorTableTop DCW COLOR_RED+@@WallColorTableBot, COLOR_YEL+@@WallColorTableTop DCW COLOR_TAN+@@WallColorTableBot, COLOR_YEL+@@WallColorTableTop DCW COLOR_DKG+@@WallColorTableBot, COLOR_YEL+@@WallColorTableTop DCW COLOR_GRN+@@WallColorTableBot, COLOR_YEL+@@WallColorTableTop DCW COLOR_YEL+@@WallColorTableBot, COLOR_YEL+@@WallColorTableTop DCW COLOR_WHT+@@WallColorTableBot, COLOR_YEL+@@WallColorTableTop DCW COLOR_BLK+@@WallColorTableBot, COLOR_WHT+@@WallColorTableTop DCW COLOR_BLU+@@WallColorTableBot, COLOR_WHT+@@WallColorTableTop DCW COLOR_RED+@@WallColorTableBot, COLOR_WHT+@@WallColorTableTop DCW COLOR_TAN+@@WallColorTableBot, COLOR_WHT+@@WallColorTableTop DCW COLOR_DKG+@@WallColorTableBot, COLOR_WHT+@@WallColorTableTop DCW COLOR_GRN+@@WallColorTableBot, COLOR_WHT+@@WallColorTableTop DCW COLOR_YEL+@@WallColorTableBot, COLOR_WHT+@@WallColorTableTop DCW COLOR_WHT+@@WallColorTableBot, COLOR_WHT+@@WallColorTableTop ;@@WallColorTable: ; Table of colored-squares values sorted by left color and right color. ; The two squares on each side will have the same color, for a total of ; 64 entries. Each entry is then XORed by the ceiling/floor color. ; Assumes that the ceiling and floor are the same color. ; DCW CSQ_BLK_L1_CEIL + CSQ_BLK_R1_CEIL + CSQ_BLK_L2_CEIL + CSQ_BLK_R2_CEIL + CSQ_MODE ; DCW CSQ_BLK_L1_CEIL + CSQ_BLU_R1_CEIL + CSQ_BLK_L2_CEIL + CSQ_BLU_R2_CEIL + CSQ_MODE ; DCW CSQ_BLK_L1_CEIL + CSQ_RED_R1_CEIL + CSQ_BLK_L2_CEIL + CSQ_RED_R2_CEIL + CSQ_MODE ; DCW CSQ_BLK_L1_CEIL + CSQ_TAN_R1_CEIL + CSQ_BLK_L2_CEIL + CSQ_TAN_R2_CEIL + CSQ_MODE ; DCW CSQ_BLK_L1_CEIL + CSQ_DKG_R1_CEIL + CSQ_BLK_L2_CEIL + CSQ_DKG_R2_CEIL + CSQ_MODE ; DCW CSQ_BLK_L1_CEIL + CSQ_GRN_R1_CEIL + CSQ_BLK_L2_CEIL + CSQ_GRN_R2_CEIL + CSQ_MODE ; DCW CSQ_BLK_L1_CEIL + CSQ_YEL_R1_CEIL + CSQ_BLK_L2_CEIL + CSQ_YEL_R2_CEIL + CSQ_MODE ; DCW CSQ_BLK_L1_CEIL + CSQ_WHT_R1_CEIL + CSQ_BLK_L2_CEIL + CSQ_WHT_R2_CEIL + CSQ_MODE ; DCW CSQ_BLU_L1_CEIL + CSQ_BLK_R1_CEIL + CSQ_BLU_L2_CEIL + CSQ_BLK_R2_CEIL + CSQ_MODE ; DCW CSQ_BLU_L1_CEIL + CSQ_BLU_R1_CEIL + CSQ_BLU_L2_CEIL + CSQ_BLU_R2_CEIL + CSQ_MODE ; DCW CSQ_BLU_L1_CEIL + CSQ_RED_R1_CEIL + CSQ_BLU_L2_CEIL + CSQ_RED_R2_CEIL + CSQ_MODE ; DCW CSQ_BLU_L1_CEIL + CSQ_TAN_R1_CEIL + CSQ_BLU_L2_CEIL + CSQ_TAN_R2_CEIL + CSQ_MODE ; DCW CSQ_BLU_L1_CEIL + CSQ_DKG_R1_CEIL + CSQ_BLU_L2_CEIL + CSQ_DKG_R2_CEIL + CSQ_MODE ; DCW CSQ_BLU_L1_CEIL + CSQ_GRN_R1_CEIL + CSQ_BLU_L2_CEIL + CSQ_GRN_R2_CEIL + CSQ_MODE ; DCW CSQ_BLU_L1_CEIL + CSQ_YEL_R1_CEIL + CSQ_BLU_L2_CEIL + CSQ_YEL_R2_CEIL + CSQ_MODE ; DCW CSQ_BLU_L1_CEIL + CSQ_WHT_R1_CEIL + CSQ_BLU_L2_CEIL + CSQ_WHT_R2_CEIL + CSQ_MODE ; DCW CSQ_RED_L1_CEIL + CSQ_BLK_R1_CEIL + CSQ_RED_L2_CEIL + CSQ_BLK_R2_CEIL + CSQ_MODE ; DCW CSQ_RED_L1_CEIL + CSQ_BLU_R1_CEIL + CSQ_RED_L2_CEIL + CSQ_BLU_R2_CEIL + CSQ_MODE ; DCW CSQ_RED_L1_CEIL + CSQ_RED_R1_CEIL + CSQ_RED_L2_CEIL + CSQ_RED_R2_CEIL + CSQ_MODE ; DCW CSQ_RED_L1_CEIL + CSQ_TAN_R1_CEIL + CSQ_RED_L2_CEIL + CSQ_TAN_R2_CEIL + CSQ_MODE ; DCW CSQ_RED_L1_CEIL + CSQ_DKG_R1_CEIL + CSQ_RED_L2_CEIL + CSQ_DKG_R2_CEIL + CSQ_MODE ; DCW CSQ_RED_L1_CEIL + CSQ_GRN_R1_CEIL + CSQ_RED_L2_CEIL + CSQ_GRN_R2_CEIL + CSQ_MODE ; DCW CSQ_RED_L1_CEIL + CSQ_YEL_R1_CEIL + CSQ_RED_L2_CEIL + CSQ_YEL_R2_CEIL + CSQ_MODE ; DCW CSQ_RED_L1_CEIL + CSQ_WHT_R1_CEIL + CSQ_RED_L2_CEIL + CSQ_WHT_R2_CEIL + CSQ_MODE ; DCW CSQ_TAN_L1_CEIL + CSQ_BLK_R1_CEIL + CSQ_TAN_L2_CEIL + CSQ_BLK_R2_CEIL + CSQ_MODE ; DCW CSQ_TAN_L1_CEIL + CSQ_BLU_R1_CEIL + CSQ_TAN_L2_CEIL + CSQ_BLU_R2_CEIL + CSQ_MODE ; DCW CSQ_TAN_L1_CEIL + CSQ_RED_R1_CEIL + CSQ_TAN_L2_CEIL + CSQ_RED_R2_CEIL + CSQ_MODE ; DCW CSQ_TAN_L1_CEIL + CSQ_TAN_R1_CEIL + CSQ_TAN_L2_CEIL + CSQ_TAN_R2_CEIL + CSQ_MODE ; DCW CSQ_TAN_L1_CEIL + CSQ_DKG_R1_CEIL + CSQ_TAN_L2_CEIL + CSQ_DKG_R2_CEIL + CSQ_MODE ; DCW CSQ_TAN_L1_CEIL + CSQ_GRN_R1_CEIL + CSQ_TAN_L2_CEIL + CSQ_GRN_R2_CEIL + CSQ_MODE ; DCW CSQ_TAN_L1_CEIL + CSQ_YEL_R1_CEIL + CSQ_TAN_L2_CEIL + CSQ_YEL_R2_CEIL + CSQ_MODE ; DCW CSQ_TAN_L1_CEIL + CSQ_WHT_R1_CEIL + CSQ_TAN_L2_CEIL + CSQ_WHT_R2_CEIL + CSQ_MODE ; DCW CSQ_DKG_L1_CEIL + CSQ_BLK_R1_CEIL + CSQ_DKG_L2_CEIL + CSQ_BLK_R2_CEIL + CSQ_MODE ; DCW CSQ_DKG_L1_CEIL + CSQ_BLU_R1_CEIL + CSQ_DKG_L2_CEIL + CSQ_BLU_R2_CEIL + CSQ_MODE ; DCW CSQ_DKG_L1_CEIL + CSQ_RED_R1_CEIL + CSQ_DKG_L2_CEIL + CSQ_RED_R2_CEIL + CSQ_MODE ; DCW CSQ_DKG_L1_CEIL + CSQ_TAN_R1_CEIL + CSQ_DKG_L2_CEIL + CSQ_TAN_R2_CEIL + CSQ_MODE ; DCW CSQ_DKG_L1_CEIL + CSQ_DKG_R1_CEIL + CSQ_DKG_L2_CEIL + CSQ_DKG_R2_CEIL + CSQ_MODE ; DCW CSQ_DKG_L1_CEIL + CSQ_GRN_R1_CEIL + CSQ_DKG_L2_CEIL + CSQ_GRN_R2_CEIL + CSQ_MODE ; DCW CSQ_DKG_L1_CEIL + CSQ_YEL_R1_CEIL + CSQ_DKG_L2_CEIL + CSQ_YEL_R2_CEIL + CSQ_MODE ; DCW CSQ_DKG_L1_CEIL + CSQ_WHT_R1_CEIL + CSQ_DKG_L2_CEIL + CSQ_WHT_R2_CEIL + CSQ_MODE ; DCW CSQ_GRN_L1_CEIL + CSQ_BLK_R1_CEIL + CSQ_GRN_L2_CEIL + CSQ_BLK_R2_CEIL + CSQ_MODE ; DCW CSQ_GRN_L1_CEIL + CSQ_BLU_R1_CEIL + CSQ_GRN_L2_CEIL + CSQ_BLU_R2_CEIL + CSQ_MODE ; DCW CSQ_GRN_L1_CEIL + CSQ_RED_R1_CEIL + CSQ_GRN_L2_CEIL + CSQ_RED_R2_CEIL + CSQ_MODE ; DCW CSQ_GRN_L1_CEIL + CSQ_TAN_R1_CEIL + CSQ_GRN_L2_CEIL + CSQ_TAN_R2_CEIL + CSQ_MODE ; DCW CSQ_GRN_L1_CEIL + CSQ_DKG_R1_CEIL + CSQ_GRN_L2_CEIL + CSQ_DKG_R2_CEIL + CSQ_MODE ; DCW CSQ_GRN_L1_CEIL + CSQ_GRN_R1_CEIL + CSQ_GRN_L2_CEIL + CSQ_GRN_R2_CEIL + CSQ_MODE ; DCW CSQ_GRN_L1_CEIL + CSQ_YEL_R1_CEIL + CSQ_GRN_L2_CEIL + CSQ_YEL_R2_CEIL + CSQ_MODE ; DCW CSQ_GRN_L1_CEIL + CSQ_WHT_R1_CEIL + CSQ_GRN_L2_CEIL + CSQ_WHT_R2_CEIL + CSQ_MODE ; DCW CSQ_YEL_L1_CEIL + CSQ_BLK_R1_CEIL + CSQ_YEL_L2_CEIL + CSQ_BLK_R2_CEIL + CSQ_MODE ; DCW CSQ_YEL_L1_CEIL + CSQ_BLU_R1_CEIL + CSQ_YEL_L2_CEIL + CSQ_BLU_R2_CEIL + CSQ_MODE ; DCW CSQ_YEL_L1_CEIL + CSQ_RED_R1_CEIL + CSQ_YEL_L2_CEIL + CSQ_RED_R2_CEIL + CSQ_MODE ; DCW CSQ_YEL_L1_CEIL + CSQ_TAN_R1_CEIL + CSQ_YEL_L2_CEIL + CSQ_TAN_R2_CEIL + CSQ_MODE ; DCW CSQ_YEL_L1_CEIL + CSQ_DKG_R1_CEIL + CSQ_YEL_L2_CEIL + CSQ_DKG_R2_CEIL + CSQ_MODE ; DCW CSQ_YEL_L1_CEIL + CSQ_GRN_R1_CEIL + CSQ_YEL_L2_CEIL + CSQ_GRN_R2_CEIL + CSQ_MODE ; DCW CSQ_YEL_L1_CEIL + CSQ_YEL_R1_CEIL + CSQ_YEL_L2_CEIL + CSQ_YEL_R2_CEIL + CSQ_MODE ; DCW CSQ_YEL_L1_CEIL + CSQ_WHT_R1_CEIL + CSQ_YEL_L2_CEIL + CSQ_WHT_R2_CEIL + CSQ_MODE ; DCW CSQ_WHT_L1_CEIL + CSQ_BLK_R1_CEIL + CSQ_WHT_L2_CEIL + CSQ_BLK_R2_CEIL + CSQ_MODE ; DCW CSQ_WHT_L1_CEIL + CSQ_BLU_R1_CEIL + CSQ_WHT_L2_CEIL + CSQ_BLU_R2_CEIL + CSQ_MODE ; DCW CSQ_WHT_L1_CEIL + CSQ_RED_R1_CEIL + CSQ_WHT_L2_CEIL + CSQ_RED_R2_CEIL + CSQ_MODE ; DCW CSQ_WHT_L1_CEIL + CSQ_TAN_R1_CEIL + CSQ_WHT_L2_CEIL + CSQ_TAN_R2_CEIL + CSQ_MODE ; DCW CSQ_WHT_L1_CEIL + CSQ_DKG_R1_CEIL + CSQ_WHT_L2_CEIL + CSQ_DKG_R2_CEIL + CSQ_MODE ; DCW CSQ_WHT_L1_CEIL + CSQ_GRN_R1_CEIL + CSQ_WHT_L2_CEIL + CSQ_GRN_R2_CEIL + CSQ_MODE ; DCW CSQ_WHT_L1_CEIL + CSQ_YEL_R1_CEIL + CSQ_WHT_L2_CEIL + CSQ_YEL_R2_CEIL + CSQ_MODE ; DCW CSQ_WHT_L1_CEIL + CSQ_WHT_R1_CEIL + CSQ_WHT_L2_CEIL + CSQ_WHT_R2_CEIL + CSQ_MODE @@WallColorTableTop: ; Table of colored-squares values sorted by left color and right color. ; The two squares on each side will have the same color, for a total of ; 64 entries. Each entry is then XORed by the ceiling/floor color. ; Assumes that the ceiling and floor are the same color. DCW CSQ_BLK_L1_CEIL + CSQ_BLK_R1_CEIL + CSQ_MODE DCW CSQ_BLK_L1_CEIL + CSQ_BLU_R1_CEIL + CSQ_MODE DCW CSQ_BLK_L1_CEIL + CSQ_RED_R1_CEIL + CSQ_MODE DCW CSQ_BLK_L1_CEIL + CSQ_TAN_R1_CEIL + CSQ_MODE DCW CSQ_BLK_L1_CEIL + CSQ_DKG_R1_CEIL + CSQ_MODE DCW CSQ_BLK_L1_CEIL + CSQ_GRN_R1_CEIL + CSQ_MODE DCW CSQ_BLK_L1_CEIL + CSQ_YEL_R1_CEIL + CSQ_MODE DCW CSQ_BLK_L1_CEIL + CSQ_WHT_R1_CEIL + CSQ_MODE DCW CSQ_BLU_L1_CEIL + CSQ_BLK_R1_CEIL + CSQ_MODE DCW CSQ_BLU_L1_CEIL + CSQ_BLU_R1_CEIL + CSQ_MODE DCW CSQ_BLU_L1_CEIL + CSQ_RED_R1_CEIL + CSQ_MODE DCW CSQ_BLU_L1_CEIL + CSQ_TAN_R1_CEIL + CSQ_MODE DCW CSQ_BLU_L1_CEIL + CSQ_DKG_R1_CEIL + CSQ_MODE DCW CSQ_BLU_L1_CEIL + CSQ_GRN_R1_CEIL + CSQ_MODE DCW CSQ_BLU_L1_CEIL + CSQ_YEL_R1_CEIL + CSQ_MODE DCW CSQ_BLU_L1_CEIL + CSQ_WHT_R1_CEIL + CSQ_MODE DCW CSQ_RED_L1_CEIL + CSQ_BLK_R1_CEIL + CSQ_MODE DCW CSQ_RED_L1_CEIL + CSQ_BLU_R1_CEIL + CSQ_MODE DCW CSQ_RED_L1_CEIL + CSQ_RED_R1_CEIL + CSQ_MODE DCW CSQ_RED_L1_CEIL + CSQ_TAN_R1_CEIL + CSQ_MODE DCW CSQ_RED_L1_CEIL + CSQ_DKG_R1_CEIL + CSQ_MODE DCW CSQ_RED_L1_CEIL + CSQ_GRN_R1_CEIL + CSQ_MODE DCW CSQ_RED_L1_CEIL + CSQ_YEL_R1_CEIL + CSQ_MODE DCW CSQ_RED_L1_CEIL + CSQ_WHT_R1_CEIL + CSQ_MODE DCW CSQ_TAN_L1_CEIL + CSQ_BLK_R1_CEIL + CSQ_MODE DCW CSQ_TAN_L1_CEIL + CSQ_BLU_R1_CEIL + CSQ_MODE DCW CSQ_TAN_L1_CEIL + CSQ_RED_R1_CEIL + CSQ_MODE DCW CSQ_TAN_L1_CEIL + CSQ_TAN_R1_CEIL + CSQ_MODE DCW CSQ_TAN_L1_CEIL + CSQ_DKG_R1_CEIL + CSQ_MODE DCW CSQ_TAN_L1_CEIL + CSQ_GRN_R1_CEIL + CSQ_MODE DCW CSQ_TAN_L1_CEIL + CSQ_YEL_R1_CEIL + CSQ_MODE DCW CSQ_TAN_L1_CEIL + CSQ_WHT_R1_CEIL + CSQ_MODE DCW CSQ_DKG_L1_CEIL + CSQ_BLK_R1_CEIL + CSQ_MODE DCW CSQ_DKG_L1_CEIL + CSQ_BLU_R1_CEIL + CSQ_MODE DCW CSQ_DKG_L1_CEIL + CSQ_RED_R1_CEIL + CSQ_MODE DCW CSQ_DKG_L1_CEIL + CSQ_TAN_R1_CEIL + CSQ_MODE DCW CSQ_DKG_L1_CEIL + CSQ_DKG_R1_CEIL + CSQ_MODE DCW CSQ_DKG_L1_CEIL + CSQ_GRN_R1_CEIL + CSQ_MODE DCW CSQ_DKG_L1_CEIL + CSQ_YEL_R1_CEIL + CSQ_MODE DCW CSQ_DKG_L1_CEIL + CSQ_WHT_R1_CEIL + CSQ_MODE DCW CSQ_GRN_L1_CEIL + CSQ_BLK_R1_CEIL + CSQ_MODE DCW CSQ_GRN_L1_CEIL + CSQ_BLU_R1_CEIL + CSQ_MODE DCW CSQ_GRN_L1_CEIL + CSQ_RED_R1_CEIL + CSQ_MODE DCW CSQ_GRN_L1_CEIL + CSQ_TAN_R1_CEIL + CSQ_MODE DCW CSQ_GRN_L1_CEIL + CSQ_DKG_R1_CEIL + CSQ_MODE DCW CSQ_GRN_L1_CEIL + CSQ_GRN_R1_CEIL + CSQ_MODE DCW CSQ_GRN_L1_CEIL + CSQ_YEL_R1_CEIL + CSQ_MODE DCW CSQ_GRN_L1_CEIL + CSQ_WHT_R1_CEIL + CSQ_MODE DCW CSQ_YEL_L1_CEIL + CSQ_BLK_R1_CEIL + CSQ_MODE DCW CSQ_YEL_L1_CEIL + CSQ_BLU_R1_CEIL + CSQ_MODE DCW CSQ_YEL_L1_CEIL + CSQ_RED_R1_CEIL + CSQ_MODE DCW CSQ_YEL_L1_CEIL + CSQ_TAN_R1_CEIL + CSQ_MODE DCW CSQ_YEL_L1_CEIL + CSQ_DKG_R1_CEIL + CSQ_MODE DCW CSQ_YEL_L1_CEIL + CSQ_GRN_R1_CEIL + CSQ_MODE DCW CSQ_YEL_L1_CEIL + CSQ_YEL_R1_CEIL + CSQ_MODE DCW CSQ_YEL_L1_CEIL + CSQ_WHT_R1_CEIL + CSQ_MODE DCW CSQ_WHT_L1_CEIL + CSQ_BLK_R1_CEIL + CSQ_MODE DCW CSQ_WHT_L1_CEIL + CSQ_BLU_R1_CEIL + CSQ_MODE DCW CSQ_WHT_L1_CEIL + CSQ_RED_R1_CEIL + CSQ_MODE DCW CSQ_WHT_L1_CEIL + CSQ_TAN_R1_CEIL + CSQ_MODE DCW CSQ_WHT_L1_CEIL + CSQ_DKG_R1_CEIL + CSQ_MODE DCW CSQ_WHT_L1_CEIL + CSQ_GRN_R1_CEIL + CSQ_MODE DCW CSQ_WHT_L1_CEIL + CSQ_YEL_R1_CEIL + CSQ_MODE DCW CSQ_WHT_L1_CEIL + CSQ_WHT_R1_CEIL + CSQ_MODE @@WallColorTableBot: ; Table of colored-squares values sorted by left color and right color. ; The two squares on each side will have the same color, for a total of ; 64 entries. Each entry is then XORed by the ceiling/floor color. ; Assumes that the ceiling and floor are the same color. DCW CSQ_BLK_L2_CEIL + CSQ_BLK_R2_CEIL DCW CSQ_BLK_L2_CEIL + CSQ_BLU_R2_CEIL DCW CSQ_BLK_L2_CEIL + CSQ_RED_R2_CEIL DCW CSQ_BLK_L2_CEIL + CSQ_TAN_R2_CEIL DCW CSQ_BLK_L2_CEIL + CSQ_DKG_R2_CEIL DCW CSQ_BLK_L2_CEIL + CSQ_GRN_R2_CEIL DCW CSQ_BLK_L2_CEIL + CSQ_YEL_R2_CEIL DCW CSQ_BLK_L2_CEIL + CSQ_WHT_R2_CEIL DCW CSQ_BLU_L2_CEIL + CSQ_BLK_R2_CEIL DCW CSQ_BLU_L2_CEIL + CSQ_BLU_R2_CEIL DCW CSQ_BLU_L2_CEIL + CSQ_RED_R2_CEIL DCW CSQ_BLU_L2_CEIL + CSQ_TAN_R2_CEIL DCW CSQ_BLU_L2_CEIL + CSQ_DKG_R2_CEIL DCW CSQ_BLU_L2_CEIL + CSQ_GRN_R2_CEIL DCW CSQ_BLU_L2_CEIL + CSQ_YEL_R2_CEIL DCW CSQ_BLU_L2_CEIL + CSQ_WHT_R2_CEIL DCW CSQ_RED_L2_CEIL + CSQ_BLK_R2_CEIL DCW CSQ_RED_L2_CEIL + CSQ_BLU_R2_CEIL DCW CSQ_RED_L2_CEIL + CSQ_RED_R2_CEIL DCW CSQ_RED_L2_CEIL + CSQ_TAN_R2_CEIL DCW CSQ_RED_L2_CEIL + CSQ_DKG_R2_CEIL DCW CSQ_RED_L2_CEIL + CSQ_GRN_R2_CEIL DCW CSQ_RED_L2_CEIL + CSQ_YEL_R2_CEIL DCW CSQ_RED_L2_CEIL + CSQ_WHT_R2_CEIL DCW CSQ_TAN_L2_CEIL + CSQ_BLK_R2_CEIL DCW CSQ_TAN_L2_CEIL + CSQ_BLU_R2_CEIL DCW CSQ_TAN_L2_CEIL + CSQ_RED_R2_CEIL DCW CSQ_TAN_L2_CEIL + CSQ_TAN_R2_CEIL DCW CSQ_TAN_L2_CEIL + CSQ_DKG_R2_CEIL DCW CSQ_TAN_L2_CEIL + CSQ_GRN_R2_CEIL DCW CSQ_TAN_L2_CEIL + CSQ_YEL_R2_CEIL DCW CSQ_TAN_L2_CEIL + CSQ_WHT_R2_CEIL DCW CSQ_DKG_L2_CEIL + CSQ_BLK_R2_CEIL DCW CSQ_DKG_L2_CEIL + CSQ_BLU_R2_CEIL DCW CSQ_DKG_L2_CEIL + CSQ_RED_R2_CEIL DCW CSQ_DKG_L2_CEIL + CSQ_TAN_R2_CEIL DCW CSQ_DKG_L2_CEIL + CSQ_DKG_R2_CEIL DCW CSQ_DKG_L2_CEIL + CSQ_GRN_R2_CEIL DCW CSQ_DKG_L2_CEIL + CSQ_YEL_R2_CEIL DCW CSQ_DKG_L2_CEIL + CSQ_WHT_R2_CEIL DCW CSQ_GRN_L2_CEIL + CSQ_BLK_R2_CEIL DCW CSQ_GRN_L2_CEIL + CSQ_BLU_R2_CEIL DCW CSQ_GRN_L2_CEIL + CSQ_RED_R2_CEIL DCW CSQ_GRN_L2_CEIL + CSQ_TAN_R2_CEIL DCW CSQ_GRN_L2_CEIL + CSQ_DKG_R2_CEIL DCW CSQ_GRN_L2_CEIL + CSQ_GRN_R2_CEIL DCW CSQ_GRN_L2_CEIL + CSQ_YEL_R2_CEIL DCW CSQ_GRN_L2_CEIL + CSQ_WHT_R2_CEIL DCW CSQ_YEL_L2_CEIL + CSQ_BLK_R2_CEIL DCW CSQ_YEL_L2_CEIL + CSQ_BLU_R2_CEIL DCW CSQ_YEL_L2_CEIL + CSQ_RED_R2_CEIL DCW CSQ_YEL_L2_CEIL + CSQ_TAN_R2_CEIL DCW CSQ_YEL_L2_CEIL + CSQ_DKG_R2_CEIL DCW CSQ_YEL_L2_CEIL + CSQ_GRN_R2_CEIL DCW CSQ_YEL_L2_CEIL + CSQ_YEL_R2_CEIL DCW CSQ_YEL_L2_CEIL + CSQ_WHT_R2_CEIL DCW CSQ_WHT_L2_CEIL + CSQ_BLK_R2_CEIL DCW CSQ_WHT_L2_CEIL + CSQ_BLU_R2_CEIL DCW CSQ_WHT_L2_CEIL + CSQ_RED_R2_CEIL DCW CSQ_WHT_L2_CEIL + CSQ_TAN_R2_CEIL DCW CSQ_WHT_L2_CEIL + CSQ_DKG_R2_CEIL DCW CSQ_WHT_L2_CEIL + CSQ_GRN_R2_CEIL DCW CSQ_WHT_L2_CEIL + CSQ_YEL_R2_CEIL DCW CSQ_WHT_L2_CEIL + CSQ_WHT_R2_CEIL @@LookupOfs: ; Offsets into @@WallTableLookup DCW @@WallTableLookup + $0000, 0 DCW @@WallTableLookup + $0040, 0 DCW @@WallTableLookup + $0080, 0 DCW @@WallTableLookup + $00C0, 0 DCW @@WallTableLookup + $0100, 0 DCW @@WallTableLookup + $0140, 0 DCW @@WallTableLookup + $0180, 0 DCW @@WallTableLookup + $01C0, 0 DCW @@WallTableLookup + $0200, 0 DCW @@WallTableLookup + $0240, 0 DCW @@WallTableLookup + $0280, 0 DCW @@WallTableLookup + $02C0, 0 DCW @@WallTableLookup + $0300, 0 DCW @@WallTableLookup + $0340, 0 DCW @@WallTableLookup + $0380, 0 DCW @@WallTableLookup + $03C0, 0 DCW @@WallTableLookup + $0400, 0 DCW @@WallTableLookup + $0440, 0 DCW @@WallTableLookup + $0480, 0 DCW @@WallTableLookup + $04C0, 0 DCW @@WallTableLookup + $0500, 0 DCW @@WallTableLookup + $0540, 0 DCW @@WallTableLookup + $0580, 0 DCW @@WallTableLookup + $05C0, 0 DCW @@WallTableLookup + $0600, 0 ; Tables of colored-squares values to write to BACKTAB. Each row describes what to write for the ; first 12 rows of colored squares (6 values, with each value covering one BACKTAB card or 2 rows ; of squares). Each row also has 2 dummy values at the end to facilitate fast lookup. ; ; Each table is sorted first by left column starting position and then by right column starting ; position. A value of 0,0 means that a ray starts at the top of both columns, whereas a value ; of 0,1 means that the ray for the left column starts at the topmost square but the ray for the ; right column starts at the square that is second from the top. @@CSTableTop: ; 0,0 .. 0,C DCW WallsLRLR, WallsLRLR, WallsLRLR, WallsLRLR, WallsLRLR, WallsLRLR, 0, 0 ; 0,0 DCW WallsLNLR, WallsLRLR, WallsLRLR, WallsLRLR, WallsLRLR, WallsLRLR, 0, 0 ; 0,1 DCW WallsLNLN, WallsLRLR, WallsLRLR, WallsLRLR, WallsLRLR, WallsLRLR, 0, 0 ; 0,2 DCW WallsLNLN, WallsLNLR, WallsLRLR, WallsLRLR, WallsLRLR, WallsLRLR, 0, 0 ; 0,3 DCW WallsLNLN, WallsLNLN, WallsLRLR, WallsLRLR, WallsLRLR, WallsLRLR, 0, 0 ; 0,4 DCW WallsLNLN, WallsLNLN, WallsLNLR, WallsLRLR, WallsLRLR, WallsLRLR, 0, 0 ; 0,5 DCW WallsLNLN, WallsLNLN, WallsLNLN, WallsLRLR, WallsLRLR, WallsLRLR, 0, 0 ; 0,6 DCW WallsLNLN, WallsLNLN, WallsLNLN, WallsLNLR, WallsLRLR, WallsLRLR, 0, 0 ; 0,7 DCW WallsLNLN, WallsLNLN, WallsLNLN, WallsLNLN, WallsLRLR, WallsLRLR, 0, 0 ; 0,8 DCW WallsLNLN, WallsLNLN, WallsLNLN, WallsLNLN, WallsLNLR, WallsLRLR, 0, 0 ; 0,9 DCW WallsLNLN, WallsLNLN, WallsLNLN, WallsLNLN, WallsLNLN, WallsLRLR, 0, 0 ; 0,10 DCW WallsLNLN, WallsLNLN, WallsLNLN, WallsLNLN, WallsLNLN, WallsLNLR, 0, 0 ; 0,11 DCW WallsLNLN, WallsLNLN, WallsLNLN, WallsLNLN, WallsLNLN, WallsLNLN, 0, 0 ; 0,12 ; 1,0 .. 1,C DCW WallsNRLR, WallsLRLR, WallsLRLR, WallsLRLR, WallsLRLR, WallsLRLR, 0, 0 DCW WallsNNLR, WallsLRLR, WallsLRLR, WallsLRLR, WallsLRLR, WallsLRLR, 0, 0 DCW WallsNNLN, WallsLRLR, WallsLRLR, WallsLRLR, WallsLRLR, WallsLRLR, 0, 0 DCW WallsNNLN, WallsLNLR, WallsLRLR, WallsLRLR, WallsLRLR, WallsLRLR, 0, 0 DCW WallsNNLN, WallsLNLN, WallsLRLR, WallsLRLR, WallsLRLR, WallsLRLR, 0, 0 DCW WallsNNLN, WallsLNLN, WallsLNLR, WallsLRLR, WallsLRLR, WallsLRLR, 0, 0 DCW WallsNNLN, WallsLNLN, WallsLNLN, WallsLRLR, WallsLRLR, WallsLRLR, 0, 0 DCW WallsNNLN, WallsLNLN, WallsLNLN, WallsLNLR, WallsLRLR, WallsLRLR, 0, 0 DCW WallsNNLN, WallsLNLN, WallsLNLN, WallsLNLN, WallsLRLR, WallsLRLR, 0, 0 DCW WallsNNLN, WallsLNLN, WallsLNLN, WallsLNLN, WallsLNLR, WallsLRLR, 0, 0 DCW WallsNNLN, WallsLNLN, WallsLNLN, WallsLNLN, WallsLNLN, WallsLRLR, 0, 0 DCW WallsNNLN, WallsLNLN, WallsLNLN, WallsLNLN, WallsLNLN, WallsLNLR, 0, 0 DCW WallsNNLN, WallsLNLN, WallsLNLN, WallsLNLN, WallsLNLN, WallsLNLN, 0, 0 ; 2,0 .. 2,C DCW WallsNRNR, WallsLRLR, WallsLRLR, WallsLRLR, WallsLRLR, WallsLRLR, 0, 0 DCW WallsNNNR, WallsLRLR, WallsLRLR, WallsLRLR, WallsLRLR, WallsLRLR, 0, 0 DCW WallsNNNN, WallsLRLR, WallsLRLR, WallsLRLR, WallsLRLR, WallsLRLR, 0, 0 DCW WallsNNNN, WallsLNLR, WallsLRLR, WallsLRLR, WallsLRLR, WallsLRLR, 0, 0 DCW WallsNNNN, WallsLNLN, WallsLRLR, WallsLRLR, WallsLRLR, WallsLRLR, 0, 0 DCW WallsNNNN, WallsLNLN, WallsLNLR, WallsLRLR, WallsLRLR, WallsLRLR, 0, 0 DCW WallsNNNN, WallsLNLN, WallsLNLN, WallsLRLR, WallsLRLR, WallsLRLR, 0, 0 DCW WallsNNNN, WallsLNLN, WallsLNLN, WallsLNLR, WallsLRLR, WallsLRLR, 0, 0 DCW WallsNNNN, WallsLNLN, WallsLNLN, WallsLNLN, WallsLRLR, WallsLRLR, 0, 0 DCW WallsNNNN, WallsLNLN, WallsLNLN, WallsLNLN, WallsLNLR, WallsLRLR, 0, 0 DCW WallsNNNN, WallsLNLN, WallsLNLN, WallsLNLN, WallsLNLN, WallsLRLR, 0, 0 DCW WallsNNNN, WallsLNLN, WallsLNLN, WallsLNLN, WallsLNLN, WallsLNLR, 0, 0 DCW WallsNNNN, WallsLNLN, WallsLNLN, WallsLNLN, WallsLNLN, WallsLNLN, 0, 0 ; 3,0 .. 3,C DCW WallsNRNR, WallsNRLR, WallsLRLR, WallsLRLR, WallsLRLR, WallsLRLR, 0, 0 DCW WallsNNNR, WallsNRLR, WallsLRLR, WallsLRLR, WallsLRLR, WallsLRLR, 0, 0 DCW WallsNNNN, WallsNRLR, WallsLRLR, WallsLRLR, WallsLRLR, WallsLRLR, 0, 0 DCW WallsNNNN, WallsNNLR, WallsLRLR, WallsLRLR, WallsLRLR, WallsLRLR, 0, 0 DCW WallsNNNN, WallsNNLN, WallsLRLR, WallsLRLR, WallsLRLR, WallsLRLR, 0, 0 DCW WallsNNNN, WallsNNLN, WallsLNLR, WallsLRLR, WallsLRLR, WallsLRLR, 0, 0 DCW WallsNNNN, WallsNNLN, WallsLNLN, WallsLRLR, WallsLRLR, WallsLRLR, 0, 0 DCW WallsNNNN, WallsNNLN, WallsLNLN, WallsLNLR, WallsLRLR, WallsLRLR, 0, 0 DCW WallsNNNN, WallsNNLN, WallsLNLN, WallsLNLN, WallsLRLR, WallsLRLR, 0, 0 DCW WallsNNNN, WallsNNLN, WallsLNLN, WallsLNLN, WallsLNLR, WallsLRLR, 0, 0 DCW WallsNNNN, WallsNNLN, WallsLNLN, WallsLNLN, WallsLNLN, WallsLRLR, 0, 0 DCW WallsNNNN, WallsNNLN, WallsLNLN, WallsLNLN, WallsLNLN, WallsLNLR, 0, 0 DCW WallsNNNN, WallsNNLN, WallsLNLN, WallsLNLN, WallsLNLN, WallsLNLN, 0, 0 ; 4,0 .. 4,C DCW WallsNRNR, WallsNRNR, WallsLRLR, WallsLRLR, WallsLRLR, WallsLRLR, 0, 0 DCW WallsNNNR, WallsNRNR, WallsLRLR, WallsLRLR, WallsLRLR, WallsLRLR, 0, 0 DCW WallsNNNN, WallsNRNR, WallsLRLR, WallsLRLR, WallsLRLR, WallsLRLR, 0, 0 DCW WallsNNNN, WallsNNNR, WallsLRLR, WallsLRLR, WallsLRLR, WallsLRLR, 0, 0 DCW WallsNNNN, WallsNNNN, WallsLRLR, WallsLRLR, WallsLRLR, WallsLRLR, 0, 0 DCW WallsNNNN, WallsNNNN, WallsLNLR, WallsLRLR, WallsLRLR, WallsLRLR, 0, 0 DCW WallsNNNN, WallsNNNN, WallsLNLN, WallsLRLR, WallsLRLR, WallsLRLR, 0, 0 DCW WallsNNNN, WallsNNNN, WallsLNLN, WallsLNLR, WallsLRLR, WallsLRLR, 0, 0 DCW WallsNNNN, WallsNNNN, WallsLNLN, WallsLNLN, WallsLRLR, WallsLRLR, 0, 0 DCW WallsNNNN, WallsNNNN, WallsLNLN, WallsLNLN, WallsLNLR, WallsLRLR, 0, 0 DCW WallsNNNN, WallsNNNN, WallsLNLN, WallsLNLN, WallsLNLN, WallsLRLR, 0, 0 DCW WallsNNNN, WallsNNNN, WallsLNLN, WallsLNLN, WallsLNLN, WallsLNLR, 0, 0 DCW WallsNNNN, WallsNNNN, WallsLNLN, WallsLNLN, WallsLNLN, WallsLNLN, 0, 0 ; 5,0 .. 5,C DCW WallsNRNR, WallsNRNR, WallsNRLR, WallsLRLR, WallsLRLR, WallsLRLR, 0, 0 DCW WallsNNNR, WallsNRNR, WallsNRLR, WallsLRLR, WallsLRLR, WallsLRLR, 0, 0 DCW WallsNNNN, WallsNRNR, WallsNRLR, WallsLRLR, WallsLRLR, WallsLRLR, 0, 0 DCW WallsNNNN, WallsNNNR, WallsNRLR, WallsLRLR, WallsLRLR, WallsLRLR, 0, 0 DCW WallsNNNN, WallsNNNN, WallsNRLR, WallsLRLR, WallsLRLR, WallsLRLR, 0, 0 DCW WallsNNNN, WallsNNNN, WallsNNLR, WallsLRLR, WallsLRLR, WallsLRLR, 0, 0 DCW WallsNNNN, WallsNNNN, WallsNNLN, WallsLRLR, WallsLRLR, WallsLRLR, 0, 0 DCW WallsNNNN, WallsNNNN, WallsNNLN, WallsLNLR, WallsLRLR, WallsLRLR, 0, 0 DCW WallsNNNN, WallsNNNN, WallsNNLN, WallsLNLN, WallsLRLR, WallsLRLR, 0, 0 DCW WallsNNNN, WallsNNNN, WallsNNLN, WallsLNLN, WallsLNLR, WallsLRLR, 0, 0 DCW WallsNNNN, WallsNNNN, WallsNNLN, WallsLNLN, WallsLNLN, WallsLRLR, 0, 0 DCW WallsNNNN, WallsNNNN, WallsNNLN, WallsLNLN, WallsLNLN, WallsLNLR, 0, 0 DCW WallsNNNN, WallsNNNN, WallsNNLN, WallsLNLN, WallsLNLN, WallsLNLN, 0, 0 ; 6,0 .. 6,C DCW WallsNRNR, WallsNRNR, WallsNRNR, WallsLRLR, WallsLRLR, WallsLRLR, 0, 0 DCW WallsNNNR, WallsNRNR, WallsNRNR, WallsLRLR, WallsLRLR, WallsLRLR, 0, 0 DCW WallsNNNN, WallsNRNR, WallsNRNR, WallsLRLR, WallsLRLR, WallsLRLR, 0, 0 DCW WallsNNNN, WallsNNNR, WallsNRNR, WallsLRLR, WallsLRLR, WallsLRLR, 0, 0 DCW WallsNNNN, WallsNNNN, WallsNRNR, WallsLRLR, WallsLRLR, WallsLRLR, 0, 0 DCW WallsNNNN, WallsNNNN, WallsNNNR, WallsLRLR, WallsLRLR, WallsLRLR, 0, 0 DCW WallsNNNN, WallsNNNN, WallsNNNN, WallsLRLR, WallsLRLR, WallsLRLR, 0, 0 DCW WallsNNNN, WallsNNNN, WallsNNNN, WallsLNLR, WallsLRLR, WallsLRLR, 0, 0 DCW WallsNNNN, WallsNNNN, WallsNNNN, WallsLNLN, WallsLRLR, WallsLRLR, 0, 0 DCW WallsNNNN, WallsNNNN, WallsNNNN, WallsLNLN, WallsLNLR, WallsLRLR, 0, 0 DCW WallsNNNN, WallsNNNN, WallsNNNN, WallsLNLN, WallsLNLN, WallsLRLR, 0, 0 DCW WallsNNNN, WallsNNNN, WallsNNNN, WallsLNLN, WallsLNLN, WallsLNLR, 0, 0 DCW WallsNNNN, WallsNNNN, WallsNNNN, WallsLNLN, WallsLNLN, WallsLNLN, 0, 0 ; 7,0 .. 7,C DCW WallsNRNR, WallsNRNR, WallsNRNR, WallsNRLR, WallsLRLR, WallsLRLR, 0, 0 DCW WallsNNNR, WallsNRNR, WallsNRNR, WallsNRLR, WallsLRLR, WallsLRLR, 0, 0 DCW WallsNNNN, WallsNRNR, WallsNRNR, WallsNRLR, WallsLRLR, WallsLRLR, 0, 0 DCW WallsNNNN, WallsNNNR, WallsNRNR, WallsNRLR, WallsLRLR, WallsLRLR, 0, 0 DCW WallsNNNN, WallsNNNN, WallsNRNR, WallsNRLR, WallsLRLR, WallsLRLR, 0, 0 DCW WallsNNNN, WallsNNNN, WallsNNNR, WallsNRLR, WallsLRLR, WallsLRLR, 0, 0 DCW WallsNNNN, WallsNNNN, WallsNNNN, WallsNRLR, WallsLRLR, WallsLRLR, 0, 0 DCW WallsNNNN, WallsNNNN, WallsNNNN, WallsNNLR, WallsLRLR, WallsLRLR, 0, 0 DCW WallsNNNN, WallsNNNN, WallsNNNN, WallsNNLN, WallsLRLR, WallsLRLR, 0, 0 DCW WallsNNNN, WallsNNNN, WallsNNNN, WallsNNLN, WallsLNLR, WallsLRLR, 0, 0 DCW WallsNNNN, WallsNNNN, WallsNNNN, WallsNNLN, WallsLNLN, WallsLRLR, 0, 0 DCW WallsNNNN, WallsNNNN, WallsNNNN, WallsNNLN, WallsLNLN, WallsLNLR, 0, 0 DCW WallsNNNN, WallsNNNN, WallsNNNN, WallsNNLN, WallsLNLN, WallsLNLN, 0, 0 ; 8,0 .. 8,C DCW WallsNRNR, WallsNRNR, WallsNRNR, WallsNRNR, WallsLRLR, WallsLRLR, 0, 0 DCW WallsNNNR, WallsNRNR, WallsNRNR, WallsNRNR, WallsLRLR, WallsLRLR, 0, 0 DCW WallsNNNN, WallsNRNR, WallsNRNR, WallsNRNR, WallsLRLR, WallsLRLR, 0, 0 DCW WallsNNNN, WallsNNNR, WallsNRNR, WallsNRNR, WallsLRLR, WallsLRLR, 0, 0 DCW WallsNNNN, WallsNNNN, WallsNRNR, WallsNRNR, WallsLRLR, WallsLRLR, 0, 0 DCW WallsNNNN, WallsNNNN, WallsNNNR, WallsNRNR, WallsLRLR, WallsLRLR, 0, 0 DCW WallsNNNN, WallsNNNN, WallsNNNN, WallsNRNR, WallsLRLR, WallsLRLR, 0, 0 DCW WallsNNNN, WallsNNNN, WallsNNNN, WallsNNNR, WallsLRLR, WallsLRLR, 0, 0 DCW WallsNNNN, WallsNNNN, WallsNNNN, WallsNNNN, WallsLRLR, WallsLRLR, 0, 0 DCW WallsNNNN, WallsNNNN, WallsNNNN, WallsNNNN, WallsLNLR, WallsLRLR, 0, 0 DCW WallsNNNN, WallsNNNN, WallsNNNN, WallsNNNN, WallsLNLN, WallsLRLR, 0, 0 DCW WallsNNNN, WallsNNNN, WallsNNNN, WallsNNNN, WallsLNLN, WallsLNLR, 0, 0 DCW WallsNNNN, WallsNNNN, WallsNNNN, WallsNNNN, WallsLNLN, WallsLNLN, 0, 0 ; 9,0 .. 9,C DCW WallsNRNR, WallsNRNR, WallsNRNR, WallsNRNR, WallsNRLR, WallsLRLR, 0, 0 DCW WallsNNNR, WallsNRNR, WallsNRNR, WallsNRNR, WallsNRLR, WallsLRLR, 0, 0 DCW WallsNNNN, WallsNRNR, WallsNRNR, WallsNRNR, WallsNRLR, WallsLRLR, 0, 0 DCW WallsNNNN, WallsNNNR, WallsNRNR, WallsNRNR, WallsNRLR, WallsLRLR, 0, 0 DCW WallsNNNN, WallsNNNN, WallsNRNR, WallsNRNR, WallsNRLR, WallsLRLR, 0, 0 DCW WallsNNNN, WallsNNNN, WallsNNNR, WallsNRNR, WallsNRLR, WallsLRLR, 0, 0 DCW WallsNNNN, WallsNNNN, WallsNNNN, WallsNRNR, WallsNRLR, WallsLRLR, 0, 0 DCW WallsNNNN, WallsNNNN, WallsNNNN, WallsNNNR, WallsNRLR, WallsLRLR, 0, 0 DCW WallsNNNN, WallsNNNN, WallsNNNN, WallsNNNN, WallsNRLR, WallsLRLR, 0, 0 DCW WallsNNNN, WallsNNNN, WallsNNNN, WallsNNNN, WallsNNLR, WallsLRLR, 0, 0 DCW WallsNNNN, WallsNNNN, WallsNNNN, WallsNNNN, WallsNNLN, WallsLRLR, 0, 0 DCW WallsNNNN, WallsNNNN, WallsNNNN, WallsNNNN, WallsNNLN, WallsLNLR, 0, 0 DCW WallsNNNN, WallsNNNN, WallsNNNN, WallsNNNN, WallsNNLN, WallsLNLN, 0, 0 ; A,0 .. A,C DCW WallsNRNR, WallsNRNR, WallsNRNR, WallsNRNR, WallsNRNR, WallsLRLR, 0, 0 DCW WallsNNNR, WallsNRNR, WallsNRNR, WallsNRNR, WallsNRNR, WallsLRLR, 0, 0 DCW WallsNNNN, WallsNRNR, WallsNRNR, WallsNRNR, WallsNRNR, WallsLRLR, 0, 0 DCW WallsNNNN, WallsNNNR, WallsNRNR, WallsNRNR, WallsNRNR, WallsLRLR, 0, 0 DCW WallsNNNN, WallsNNNN, WallsNRNR, WallsNRNR, WallsNRNR, WallsLRLR, 0, 0 DCW WallsNNNN, WallsNNNN, WallsNNNR, WallsNRNR, WallsNRNR, WallsLRLR, 0, 0 DCW WallsNNNN, WallsNNNN, WallsNNNN, WallsNRNR, WallsNRNR, WallsLRLR, 0, 0 DCW WallsNNNN, WallsNNNN, WallsNNNN, WallsNNNR, WallsNRNR, WallsLRLR, 0, 0 DCW WallsNNNN, WallsNNNN, WallsNNNN, WallsNNNN, WallsNRNR, WallsLRLR, 0, 0 DCW WallsNNNN, WallsNNNN, WallsNNNN, WallsNNNN, WallsNNNR, WallsLRLR, 0, 0 DCW WallsNNNN, WallsNNNN, WallsNNNN, WallsNNNN, WallsNNNN, WallsLRLR, 0, 0 DCW WallsNNNN, WallsNNNN, WallsNNNN, WallsNNNN, WallsNNNN, WallsLNLR, 0, 0 DCW WallsNNNN, WallsNNNN, WallsNNNN, WallsNNNN, WallsNNNN, WallsLNLN, 0, 0 ; B,0 .. B,C DCW WallsNRNR, WallsNRNR, WallsNRNR, WallsNRNR, WallsNRNR, WallsNRLR, 0, 0 DCW WallsNNNR, WallsNRNR, WallsNRNR, WallsNRNR, WallsNRNR, WallsNRLR, 0, 0 DCW WallsNNNN, WallsNRNR, WallsNRNR, WallsNRNR, WallsNRNR, WallsNRLR, 0, 0 DCW WallsNNNN, WallsNNNR, WallsNRNR, WallsNRNR, WallsNRNR, WallsNRLR, 0, 0 DCW WallsNNNN, WallsNNNN, WallsNRNR, WallsNRNR, WallsNRNR, WallsNRLR, 0, 0 DCW WallsNNNN, WallsNNNN, WallsNNNR, WallsNRNR, WallsNRNR, WallsNRLR, 0, 0 DCW WallsNNNN, WallsNNNN, WallsNNNN, WallsNRNR, WallsNRNR, WallsNRLR, 0, 0 DCW WallsNNNN, WallsNNNN, WallsNNNN, WallsNNNR, WallsNRNR, WallsNRLR, 0, 0 DCW WallsNNNN, WallsNNNN, WallsNNNN, WallsNNNN, WallsNRNR, WallsNRLR, 0, 0 DCW WallsNNNN, WallsNNNN, WallsNNNN, WallsNNNN, WallsNNNR, WallsNRLR, 0, 0 DCW WallsNNNN, WallsNNNN, WallsNNNN, WallsNNNN, WallsNNNN, WallsNRLR, 0, 0 DCW WallsNNNN, WallsNNNN, WallsNNNN, WallsNNNN, WallsNNNN, WallsNNLR, 0, 0 DCW WallsNNNN, WallsNNNN, WallsNNNN, WallsNNNN, WallsNNNN, WallsNNLN, 0, 0 ; C,0 .. C,C DCW WallsNRNR, WallsNRNR, WallsNRNR, WallsNRNR, WallsNRNR, WallsNRNR, 0, 0 DCW WallsNNNR, WallsNRNR, WallsNRNR, WallsNRNR, WallsNRNR, WallsNRNR, 0, 0 DCW WallsNNNN, WallsNRNR, WallsNRNR, WallsNRNR, WallsNRNR, WallsNRNR, 0, 0 DCW WallsNNNN, WallsNNNR, WallsNRNR, WallsNRNR, WallsNRNR, WallsNRNR, 0, 0 DCW WallsNNNN, WallsNNNN, WallsNRNR, WallsNRNR, WallsNRNR, WallsNRNR, 0, 0 DCW WallsNNNN, WallsNNNN, WallsNNNR, WallsNRNR, WallsNRNR, WallsNRNR, 0, 0 DCW WallsNNNN, WallsNNNN, WallsNNNN, WallsNRNR, WallsNRNR, WallsNRNR, 0, 0 DCW WallsNNNN, WallsNNNN, WallsNNNN, WallsNNNR, WallsNRNR, WallsNRNR, 0, 0 DCW WallsNNNN, WallsNNNN, WallsNNNN, WallsNNNN, WallsNRNR, WallsNRNR, 0, 0 DCW WallsNNNN, WallsNNNN, WallsNNNN, WallsNNNN, WallsNNNR, WallsNRNR, 0, 0 DCW WallsNNNN, WallsNNNN, WallsNNNN, WallsNNNN, WallsNNNN, WallsNRNR, 0, 0 DCW WallsNNNN, WallsNNNN, WallsNNNN, WallsNNNN, WallsNNNN, WallsNNNR, 0, 0 DCW WallsNNNN, WallsNNNN, WallsNNNN, WallsNNNN, WallsNNNN, WallsNNNN, 0, 0 @@CSTableBot: ; 0,0 .. 0,C DCW WallsNNNN, WallsNNNN, WallsNNNN, WallsNNNN, WallsNNNN, WallsNNNN, 0, 0 DCW WallsNRNN, WallsNNNN, WallsNNNN, WallsNNNN, WallsNNNN, WallsNNNN, 0, 0 DCW WallsNRNR, WallsNNNN, WallsNNNN, WallsNNNN, WallsNNNN, WallsNNNN, 0, 0 DCW WallsNRNR, WallsNRNN, WallsNNNN, WallsNNNN, WallsNNNN, WallsNNNN, 0, 0 DCW WallsNRNR, WallsNRNR, WallsNNNN, WallsNNNN, WallsNNNN, WallsNNNN, 0, 0 DCW WallsNRNR, WallsNRNR, WallsNRNN, WallsNNNN, WallsNNNN, WallsNNNN, 0, 0 DCW WallsNRNR, WallsNRNR, WallsNRNR, WallsNNNN, WallsNNNN, WallsNNNN, 0, 0 DCW WallsNRNR, WallsNRNR, WallsNRNR, WallsNRNN, WallsNNNN, WallsNNNN, 0, 0 DCW WallsNRNR, WallsNRNR, WallsNRNR, WallsNRNR, WallsNNNN, WallsNNNN, 0, 0 DCW WallsNRNR, WallsNRNR, WallsNRNR, WallsNRNR, WallsNRNN, WallsNNNN, 0, 0 DCW WallsNRNR, WallsNRNR, WallsNRNR, WallsNRNR, WallsNRNR, WallsNNNN, 0, 0 DCW WallsNRNR, WallsNRNR, WallsNRNR, WallsNRNR, WallsNRNR, WallsNRNN, 0, 0 DCW WallsNRNR, WallsNRNR, WallsNRNR, WallsNRNR, WallsNRNR, WallsNRNR, 0, 0 ; 1,0 .. 1,C DCW WallsLNNN, WallsNNNN, WallsNNNN, WallsNNNN, WallsNNNN, WallsNNNN, 0, 0 DCW WallsLRNN, WallsNNNN, WallsNNNN, WallsNNNN, WallsNNNN, WallsNNNN, 0, 0 DCW WallsLRNR, WallsNNNN, WallsNNNN, WallsNNNN, WallsNNNN, WallsNNNN, 0, 0 DCW WallsLRNR, WallsNRNN, WallsNNNN, WallsNNNN, WallsNNNN, WallsNNNN, 0, 0 DCW WallsLRNR, WallsNRNR, WallsNNNN, WallsNNNN, WallsNNNN, WallsNNNN, 0, 0 DCW WallsLRNR, WallsNRNR, WallsNRNN, WallsNNNN, WallsNNNN, WallsNNNN, 0, 0 DCW WallsLRNR, WallsNRNR, WallsNRNR, WallsNNNN, WallsNNNN, WallsNNNN, 0, 0 DCW WallsLRNR, WallsNRNR, WallsNRNR, WallsNRNN, WallsNNNN, WallsNNNN, 0, 0 DCW WallsLRNR, WallsNRNR, WallsNRNR, WallsNRNR, WallsNNNN, WallsNNNN, 0, 0 DCW WallsLRNR, WallsNRNR, WallsNRNR, WallsNRNR, WallsNRNN, WallsNNNN, 0, 0 DCW WallsLRNR, WallsNRNR, WallsNRNR, WallsNRNR, WallsNRNR, WallsNNNN, 0, 0 DCW WallsLRNR, WallsNRNR, WallsNRNR, WallsNRNR, WallsNRNR, WallsNRNN, 0, 0 DCW WallsLRNR, WallsNRNR, WallsNRNR, WallsNRNR, WallsNRNR, WallsNRNR, 0, 0 ; 2,0 .. 2,C DCW WallsLNLN, WallsNNNN, WallsNNNN, WallsNNNN, WallsNNNN, WallsNNNN, 0, 0 DCW WallsLRLN, WallsNNNN, WallsNNNN, WallsNNNN, WallsNNNN, WallsNNNN, 0, 0 DCW WallsLRLR, WallsNNNN, WallsNNNN, WallsNNNN, WallsNNNN, WallsNNNN, 0, 0 DCW WallsLRLR, WallsNRNN, WallsNNNN, WallsNNNN, WallsNNNN, WallsNNNN, 0, 0 DCW WallsLRLR, WallsNRNR, WallsNNNN, WallsNNNN, WallsNNNN, WallsNNNN, 0, 0 DCW WallsLRLR, WallsNRNR, WallsNRNN, WallsNNNN, WallsNNNN, WallsNNNN, 0, 0 DCW WallsLRLR, WallsNRNR, WallsNRNR, WallsNNNN, WallsNNNN, WallsNNNN, 0, 0 DCW WallsLRLR, WallsNRNR, WallsNRNR, WallsNRNN, WallsNNNN, WallsNNNN, 0, 0 DCW WallsLRLR, WallsNRNR, WallsNRNR, WallsNRNR, WallsNNNN, WallsNNNN, 0, 0 DCW WallsLRLR, WallsNRNR, WallsNRNR, WallsNRNR, WallsNRNN, WallsNNNN, 0, 0 DCW WallsLRLR, WallsNRNR, WallsNRNR, WallsNRNR, WallsNRNR, WallsNNNN, 0, 0 DCW WallsLRLR, WallsNRNR, WallsNRNR, WallsNRNR, WallsNRNR, WallsNRNN, 0, 0 DCW WallsLRLR, WallsNRNR, WallsNRNR, WallsNRNR, WallsNRNR, WallsNRNR, 0, 0 ; 3,0 .. 3,C DCW WallsLNLN, WallsLNNN, WallsNNNN, WallsNNNN, WallsNNNN, WallsNNNN, 0, 0 DCW WallsLRLN, WallsLNNN, WallsNNNN, WallsNNNN, WallsNNNN, WallsNNNN, 0, 0 DCW WallsLRLR, WallsLNNN, WallsNNNN, WallsNNNN, WallsNNNN, WallsNNNN, 0, 0 DCW WallsLRLR, WallsLRNN, WallsNNNN, WallsNNNN, WallsNNNN, WallsNNNN, 0, 0 DCW WallsLRLR, WallsLRNR, WallsNNNN, WallsNNNN, WallsNNNN, WallsNNNN, 0, 0 DCW WallsLRLR, WallsLRNR, WallsNRNN, WallsNNNN, WallsNNNN, WallsNNNN, 0, 0 DCW WallsLRLR, WallsLRNR, WallsNRNR, WallsNNNN, WallsNNNN, WallsNNNN, 0, 0 DCW WallsLRLR, WallsLRNR, WallsNRNR, WallsNRNN, WallsNNNN, WallsNNNN, 0, 0 DCW WallsLRLR, WallsLRNR, WallsNRNR, WallsNRNR, WallsNNNN, WallsNNNN, 0, 0 DCW WallsLRLR, WallsLRNR, WallsNRNR, WallsNRNR, WallsNRNN, WallsNNNN, 0, 0 DCW WallsLRLR, WallsLRNR, WallsNRNR, WallsNRNR, WallsNRNR, WallsNNNN, 0, 0 DCW WallsLRLR, WallsLRNR, WallsNRNR, WallsNRNR, WallsNRNR, WallsNRNN, 0, 0 DCW WallsLRLR, WallsLRNR, WallsNRNR, WallsNRNR, WallsNRNR, WallsNRNR, 0, 0 ; 4,0 .. 4,C DCW WallsLNLN, WallsLNLN, WallsNNNN, WallsNNNN, WallsNNNN, WallsNNNN, 0, 0 DCW WallsLRLN, WallsLNLN, WallsNNNN, WallsNNNN, WallsNNNN, WallsNNNN, 0, 0 DCW WallsLRLR, WallsLNLN, WallsNNNN, WallsNNNN, WallsNNNN, WallsNNNN, 0, 0 DCW WallsLRLR, WallsLRLN, WallsNNNN, WallsNNNN, WallsNNNN, WallsNNNN, 0, 0 DCW WallsLRLR, WallsLRLR, WallsNNNN, WallsNNNN, WallsNNNN, WallsNNNN, 0, 0 DCW WallsLRLR, WallsLRLR, WallsNRNN, WallsNNNN, WallsNNNN, WallsNNNN, 0, 0 DCW WallsLRLR, WallsLRLR, WallsNRNR, WallsNNNN, WallsNNNN, WallsNNNN, 0, 0 DCW WallsLRLR, WallsLRLR, WallsNRNR, WallsNRNN, WallsNNNN, WallsNNNN, 0, 0 DCW WallsLRLR, WallsLRLR, WallsNRNR, WallsNRNR, WallsNNNN, WallsNNNN, 0, 0 DCW WallsLRLR, WallsLRLR, WallsNRNR, WallsNRNR, WallsNRNN, WallsNNNN, 0, 0 DCW WallsLRLR, WallsLRLR, WallsNRNR, WallsNRNR, WallsNRNR, WallsNNNN, 0, 0 DCW WallsLRLR, WallsLRLR, WallsNRNR, WallsNRNR, WallsNRNR, WallsNRNN, 0, 0 DCW WallsLRLR, WallsLRLR, WallsNRNR, WallsNRNR, WallsNRNR, WallsNRNR, 0, 0 ; 5,0 .. 5,C DCW WallsLNLN, WallsLNLN, WallsLNNN, WallsNNNN, WallsNNNN, WallsNNNN, 0, 0 DCW WallsLRLN, WallsLNLN, WallsLNNN, WallsNNNN, WallsNNNN, WallsNNNN, 0, 0 DCW WallsLRLR, WallsLNLN, WallsLNNN, WallsNNNN, WallsNNNN, WallsNNNN, 0, 0 DCW WallsLRLR, WallsLRLN, WallsLNNN, WallsNNNN, WallsNNNN, WallsNNNN, 0, 0 DCW WallsLRLR, WallsLRLR, WallsLNNN, WallsNNNN, WallsNNNN, WallsNNNN, 0, 0 DCW WallsLRLR, WallsLRLR, WallsLRNN, WallsNNNN, WallsNNNN, WallsNNNN, 0, 0 DCW WallsLRLR, WallsLRLR, WallsLRNR, WallsNNNN, WallsNNNN, WallsNNNN, 0, 0 DCW WallsLRLR, WallsLRLR, WallsLRNR, WallsNRNN, WallsNNNN, WallsNNNN, 0, 0 DCW WallsLRLR, WallsLRLR, WallsLRNR, WallsNRNR, WallsNNNN, WallsNNNN, 0, 0 DCW WallsLRLR, WallsLRLR, WallsLRNR, WallsNRNR, WallsNRNN, WallsNNNN, 0, 0 DCW WallsLRLR, WallsLRLR, WallsLRNR, WallsNRNR, WallsNRNR, WallsNNNN, 0, 0 DCW WallsLRLR, WallsLRLR, WallsLRNR, WallsNRNR, WallsNRNR, WallsNRNN, 0, 0 DCW WallsLRLR, WallsLRLR, WallsLRNR, WallsNRNR, WallsNRNR, WallsNRNR, 0, 0 ; 6,0 .. 6,C DCW WallsLNLN, WallsLNLN, WallsLNLN, WallsNNNN, WallsNNNN, WallsNNNN, 0, 0 DCW WallsLRLN, WallsLNLN, WallsLNLN, WallsNNNN, WallsNNNN, WallsNNNN, 0, 0 DCW WallsLRLR, WallsLNLN, WallsLNLN, WallsNNNN, WallsNNNN, WallsNNNN, 0, 0 DCW WallsLRLR, WallsLRLN, WallsLNLN, WallsNNNN, WallsNNNN, WallsNNNN, 0, 0 DCW WallsLRLR, WallsLRLR, WallsLNLN, WallsNNNN, WallsNNNN, WallsNNNN, 0, 0 DCW WallsLRLR, WallsLRLR, WallsLRLN, WallsNNNN, WallsNNNN, WallsNNNN, 0, 0 DCW WallsLRLR, WallsLRLR, WallsLRLR, WallsNNNN, WallsNNNN, WallsNNNN, 0, 0 DCW WallsLRLR, WallsLRLR, WallsLRLR, WallsNRNN, WallsNNNN, WallsNNNN, 0, 0 DCW WallsLRLR, WallsLRLR, WallsLRLR, WallsNRNR, WallsNNNN, WallsNNNN, 0, 0 DCW WallsLRLR, WallsLRLR, WallsLRLR, WallsNRNR, WallsNRNN, WallsNNNN, 0, 0 DCW WallsLRLR, WallsLRLR, WallsLRLR, WallsNRNR, WallsNRNR, WallsNNNN, 0, 0 DCW WallsLRLR, WallsLRLR, WallsLRLR, WallsNRNR, WallsNRNR, WallsNRNN, 0, 0 DCW WallsLRLR, WallsLRLR, WallsLRLR, WallsNRNR, WallsNRNR, WallsNRNR, 0, 0 ; 7,0 .. 7,C DCW WallsLNLN, WallsLNLN, WallsLNLN, WallsLNNN, WallsNNNN, WallsNNNN, 0, 0 DCW WallsLRLN, WallsLNLN, WallsLNLN, WallsLNNN, WallsNNNN, WallsNNNN, 0, 0 DCW WallsLRLR, WallsLNLN, WallsLNLN, WallsLNNN, WallsNNNN, WallsNNNN, 0, 0 DCW WallsLRLR, WallsLRLN, WallsLNLN, WallsLNNN, WallsNNNN, WallsNNNN, 0, 0 DCW WallsLRLR, WallsLRLR, WallsLNLN, WallsLNNN, WallsNNNN, WallsNNNN, 0, 0 DCW WallsLRLR, WallsLRLR, WallsLRLN, WallsLNNN, WallsNNNN, WallsNNNN, 0, 0 DCW WallsLRLR, WallsLRLR, WallsLRLR, WallsLNNN, WallsNNNN, WallsNNNN, 0, 0 DCW WallsLRLR, WallsLRLR, WallsLRLR, WallsLRNN, WallsNNNN, WallsNNNN, 0, 0 DCW WallsLRLR, WallsLRLR, WallsLRLR, WallsLRNR, WallsNNNN, WallsNNNN, 0, 0 DCW WallsLRLR, WallsLRLR, WallsLRLR, WallsLRNR, WallsNRNN, WallsNNNN, 0, 0 DCW WallsLRLR, WallsLRLR, WallsLRLR, WallsLRNR, WallsNRNR, WallsNNNN, 0, 0 DCW WallsLRLR, WallsLRLR, WallsLRLR, WallsLRNR, WallsNRNR, WallsNRNN, 0, 0 DCW WallsLRLR, WallsLRLR, WallsLRLR, WallsLRNR, WallsNRNR, WallsNRNR, 0, 0 ; 8,0 .. 8,C DCW WallsLNLN, WallsLNLN, WallsLNLN, WallsLNLN, WallsNNNN, WallsNNNN, 0, 0 DCW WallsLRLN, WallsLNLN, WallsLNLN, WallsLNLN, WallsNNNN, WallsNNNN, 0, 0 DCW WallsLRLR, WallsLNLN, WallsLNLN, WallsLNLN, WallsNNNN, WallsNNNN, 0, 0 DCW WallsLRLR, WallsLRLN, WallsLNLN, WallsLNLN, WallsNNNN, WallsNNNN, 0, 0 DCW WallsLRLR, WallsLRLR, WallsLNLN, WallsLNLN, WallsNNNN, WallsNNNN, 0, 0 DCW WallsLRLR, WallsLRLR, WallsLRLN, WallsLNLN, WallsNNNN, WallsNNNN, 0, 0 DCW WallsLRLR, WallsLRLR, WallsLRLR, WallsLNLN, WallsNNNN, WallsNNNN, 0, 0 DCW WallsLRLR, WallsLRLR, WallsLRLR, WallsLRLN, WallsNNNN, WallsNNNN, 0, 0 DCW WallsLRLR, WallsLRLR, WallsLRLR, WallsLRLR, WallsNNNN, WallsNNNN, 0, 0 DCW WallsLRLR, WallsLRLR, WallsLRLR, WallsLRLR, WallsNRNN, WallsNNNN, 0, 0 DCW WallsLRLR, WallsLRLR, WallsLRLR, WallsLRLR, WallsNRNR, WallsNNNN, 0, 0 DCW WallsLRLR, WallsLRLR, WallsLRLR, WallsLRLR, WallsNRNR, WallsNRNN, 0, 0 DCW WallsLRLR, WallsLRLR, WallsLRLR, WallsLRLR, WallsNRNR, WallsNRNR, 0, 0 ; 9,0 .. 9,C DCW WallsLNLN, WallsLNLN, WallsLNLN, WallsLNLN, WallsLNNN, WallsNNNN, 0, 0 DCW WallsLRLN, WallsLNLN, WallsLNLN, WallsLNLN, WallsLNNN, WallsNNNN, 0, 0 DCW WallsLRLR, WallsLNLN, WallsLNLN, WallsLNLN, WallsLNNN, WallsNNNN, 0, 0 DCW WallsLRLR, WallsLRLN, WallsLNLN, WallsLNLN, WallsLNNN, WallsNNNN, 0, 0 DCW WallsLRLR, WallsLRLR, WallsLNLN, WallsLNLN, WallsLNNN, WallsNNNN, 0, 0 DCW WallsLRLR, WallsLRLR, WallsLRLN, WallsLNLN, WallsLNNN, WallsNNNN, 0, 0 DCW WallsLRLR, WallsLRLR, WallsLRLR, WallsLNLN, WallsLNNN, WallsNNNN, 0, 0 DCW WallsLRLR, WallsLRLR, WallsLRLR, WallsLRLN, WallsLNNN, WallsNNNN, 0, 0 DCW WallsLRLR, WallsLRLR, WallsLRLR, WallsLRLR, WallsLNNN, WallsNNNN, 0, 0 DCW WallsLRLR, WallsLRLR, WallsLRLR, WallsLRLR, WallsLRNN, WallsNNNN, 0, 0 DCW WallsLRLR, WallsLRLR, WallsLRLR, WallsLRLR, WallsLRNR, WallsNNNN, 0, 0 DCW WallsLRLR, WallsLRLR, WallsLRLR, WallsLRLR, WallsLRNR, WallsNRNN, 0, 0 DCW WallsLRLR, WallsLRLR, WallsLRLR, WallsLRLR, WallsLRNR, WallsNRNR, 0, 0 ; A,0 .. A,C DCW WallsLNLN, WallsLNLN, WallsLNLN, WallsLNLN, WallsLNLN, WallsNNNN, 0, 0 DCW WallsLRLN, WallsLNLN, WallsLNLN, WallsLNLN, WallsLNLN, WallsNNNN, 0, 0 DCW WallsLRLR, WallsLNLN, WallsLNLN, WallsLNLN, WallsLNLN, WallsNNNN, 0, 0 DCW WallsLRLR, WallsLRLN, WallsLNLN, WallsLNLN, WallsLNLN, WallsNNNN, 0, 0 DCW WallsLRLR, WallsLRLR, WallsLNLN, WallsLNLN, WallsLNLN, WallsNNNN, 0, 0 DCW WallsLRLR, WallsLRLR, WallsLRLN, WallsLNLN, WallsLNLN, WallsNNNN, 0, 0 DCW WallsLRLR, WallsLRLR, WallsLRLR, WallsLNLN, WallsLNLN, WallsNNNN, 0, 0 DCW WallsLRLR, WallsLRLR, WallsLRLR, WallsLRLN, WallsLNLN, WallsNNNN, 0, 0 DCW WallsLRLR, WallsLRLR, WallsLRLR, WallsLRLR, WallsLNLN, WallsNNNN, 0, 0 DCW WallsLRLR, WallsLRLR, WallsLRLR, WallsLRLR, WallsLRLN, WallsNNNN, 0, 0 DCW WallsLRLR, WallsLRLR, WallsLRLR, WallsLRLR, WallsLRLR, WallsNNNN, 0, 0 DCW WallsLRLR, WallsLRLR, WallsLRLR, WallsLRLR, WallsLRLR, WallsNRNN, 0, 0 DCW WallsLRLR, WallsLRLR, WallsLRLR, WallsLRLR, WallsLRLR, WallsNRNR, 0, 0 ; B,0 .. B,C DCW WallsLNLN, WallsLNLN, WallsLNLN, WallsLNLN, WallsLNLN, WallsLNNN, 0, 0 DCW WallsLRLN, WallsLNLN, WallsLNLN, WallsLNLN, WallsLNLN, WallsLNNN, 0, 0 DCW WallsLRLR, WallsLNLN, WallsLNLN, WallsLNLN, WallsLNLN, WallsLNNN, 0, 0 DCW WallsLRLR, WallsLRLN, WallsLNLN, WallsLNLN, WallsLNLN, WallsLNNN, 0, 0 DCW WallsLRLR, WallsLRLR, WallsLNLN, WallsLNLN, WallsLNLN, WallsLNNN, 0, 0 DCW WallsLRLR, WallsLRLR, WallsLRLN, WallsLNLN, WallsLNLN, WallsLNNN, 0, 0 DCW WallsLRLR, WallsLRLR, WallsLRLR, WallsLNLN, WallsLNLN, WallsLNNN, 0, 0 DCW WallsLRLR, WallsLRLR, WallsLRLR, WallsLRLN, WallsLNLN, WallsLNNN, 0, 0 DCW WallsLRLR, WallsLRLR, WallsLRLR, WallsLRLR, WallsLNLN, WallsLNNN, 0, 0 DCW WallsLRLR, WallsLRLR, WallsLRLR, WallsLRLR, WallsLRLN, WallsLNNN, 0, 0 DCW WallsLRLR, WallsLRLR, WallsLRLR, WallsLRLR, WallsLRLR, WallsLNNN, 0, 0 DCW WallsLRLR, WallsLRLR, WallsLRLR, WallsLRLR, WallsLRLR, WallsLRNN, 0, 0 DCW WallsLRLR, WallsLRLR, WallsLRLR, WallsLRLR, WallsLRLR, WallsLRNR, 0, 0 ; C,0 .. C,C DCW WallsLNLN, WallsLNLN, WallsLNLN, WallsLNLN, WallsLNLN, WallsLNLN, 0, 0 DCW WallsLRLN, WallsLNLN, WallsLNLN, WallsLNLN, WallsLNLN, WallsLNLN, 0, 0 DCW WallsLRLR, WallsLNLN, WallsLNLN, WallsLNLN, WallsLNLN, WallsLNLN, 0, 0 DCW WallsLRLR, WallsLRLN, WallsLNLN, WallsLNLN, WallsLNLN, WallsLNLN, 0, 0 DCW WallsLRLR, WallsLRLR, WallsLNLN, WallsLNLN, WallsLNLN, WallsLNLN, 0, 0 DCW WallsLRLR, WallsLRLR, WallsLRLN, WallsLNLN, WallsLNLN, WallsLNLN, 0, 0 DCW WallsLRLR, WallsLRLR, WallsLRLR, WallsLNLN, WallsLNLN, WallsLNLN, 0, 0 DCW WallsLRLR, WallsLRLR, WallsLRLR, WallsLRLN, WallsLNLN, WallsLNLN, 0, 0 DCW WallsLRLR, WallsLRLR, WallsLRLR, WallsLRLR, WallsLNLN, WallsLNLN, 0, 0 DCW WallsLRLR, WallsLRLR, WallsLRLR, WallsLRLR, WallsLRLN, WallsLNLN, 0, 0 DCW WallsLRLR, WallsLRLR, WallsLRLR, WallsLRLR, WallsLRLR, WallsLNLN, 0, 0 DCW WallsLRLR, WallsLRLR, WallsLRLR, WallsLRLR, WallsLRLR, WallsLRLN, 0, 0 DCW WallsLRLR, WallsLRLR, WallsLRLR, WallsLRLR, WallsLRLR, WallsLRLR, 0, 0 @@WallTableLookup: ; 0 DCW @@CSTableTop + $0540, @@CSTableBot + $0000 ; 0, 0 DCW @@CSTableTop + $0540, @@CSTableBot + $0008 ; 0, 1 DCW @@CSTableTop + $0538, @@CSTableBot + $0008 ; 0, 2 DCW @@CSTableTop + $0538, @@CSTableBot + $0010 ; 0, 3 DCW @@CSTableTop + $0530, @@CSTableBot + $0010 ; 0, 4 DCW @@CSTableTop + $0530, @@CSTableBot + $0018 ; 0, 5 DCW @@CSTableTop + $0528, @@CSTableBot + $0018 ; 0, 6 DCW @@CSTableTop + $0528, @@CSTableBot + $0020 ; 0, 7 DCW @@CSTableTop + $0520, @@CSTableBot + $0020 ; 0, 8 DCW @@CSTableTop + $0520, @@CSTableBot + $0028 ; 0, 9 DCW @@CSTableTop + $0518, @@CSTableBot + $0028 ; 0, 10 DCW @@CSTableTop + $0518, @@CSTableBot + $0030 ; 0, 11 DCW @@CSTableTop + $0510, @@CSTableBot + $0030 ; 0, 12 DCW @@CSTableTop + $0510, @@CSTableBot + $0038 ; 0, 13 DCW @@CSTableTop + $0508, @@CSTableBot + $0038 ; 0, 14 DCW @@CSTableTop + $0508, @@CSTableBot + $0040 ; 0, 15 DCW @@CSTableTop + $0500, @@CSTableBot + $0040 ; 0, 16 DCW @@CSTableTop + $0500, @@CSTableBot + $0048 ; 0, 17 DCW @@CSTableTop + $04F8, @@CSTableBot + $0048 ; 0, 18 DCW @@CSTableTop + $04F8, @@CSTableBot + $0050 ; 0, 19 DCW @@CSTableTop + $04F0, @@CSTableBot + $0050 ; 0, 20 DCW @@CSTableTop + $04F0, @@CSTableBot + $0058 ; 0, 21 DCW @@CSTableTop + $04E8, @@CSTableBot + $0058 ; 0, 22 DCW @@CSTableTop + $04E8, @@CSTableBot + $0060 ; 0, 23 DCW @@CSTableTop + $04E0, @@CSTableBot + $0060 ; 0, 24 DCW 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 ; 1 DCW @@CSTableTop + $0540, @@CSTableBot + $0068 ; 1, 0 DCW @@CSTableTop + $0540, @@CSTableBot + $0070 ; 1, 1 DCW @@CSTableTop + $0538, @@CSTableBot + $0070 ; 1, 2 DCW @@CSTableTop + $0538, @@CSTableBot + $0078 ; 1, 3 DCW @@CSTableTop + $0530, @@CSTableBot + $0078 ; 1, 4 DCW @@CSTableTop + $0530, @@CSTableBot + $0080 ; 1, 5 DCW @@CSTableTop + $0528, @@CSTableBot + $0080 ; 1, 6 DCW @@CSTableTop + $0528, @@CSTableBot + $0088 ; 1, 7 DCW @@CSTableTop + $0520, @@CSTableBot + $0088 ; 1, 8 DCW @@CSTableTop + $0520, @@CSTableBot + $0090 ; 1, 9 DCW @@CSTableTop + $0518, @@CSTableBot + $0090 ; 1, 10 DCW @@CSTableTop + $0518, @@CSTableBot + $0098 ; 1, 11 DCW @@CSTableTop + $0510, @@CSTableBot + $0098 ; 1, 12 DCW @@CSTableTop + $0510, @@CSTableBot + $00A0 ; 1, 13 DCW @@CSTableTop + $0508, @@CSTableBot + $00A0 ; 1, 14 DCW @@CSTableTop + $0508, @@CSTableBot + $00A8 ; 1, 15 DCW @@CSTableTop + $0500, @@CSTableBot + $00A8 ; 1, 16 DCW @@CSTableTop + $0500, @@CSTableBot + $00B0 ; 1, 17 DCW @@CSTableTop + $04F8, @@CSTableBot + $00B0 ; 1, 18 DCW @@CSTableTop + $04F8, @@CSTableBot + $00B8 ; 1, 19 DCW @@CSTableTop + $04F0, @@CSTableBot + $00B8 ; 1, 20 DCW @@CSTableTop + $04F0, @@CSTableBot + $00C0 ; 1, 21 DCW @@CSTableTop + $04E8, @@CSTableBot + $00C0 ; 1, 22 DCW @@CSTableTop + $04E8, @@CSTableBot + $00C8 ; 1, 23 DCW @@CSTableTop + $04E0, @@CSTableBot + $00C8 ; 1, 24 DCW 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 ; 2 DCW @@CSTableTop + $04D8, @@CSTableBot + $0068 ; 2, 0 DCW @@CSTableTop + $04D8, @@CSTableBot + $0070 ; 2, 1 DCW @@CSTableTop + $04D0, @@CSTableBot + $0070 ; 2, 2 DCW @@CSTableTop + $04D0, @@CSTableBot + $0078 ; 2, 3 DCW @@CSTableTop + $04C8, @@CSTableBot + $0078 ; 2, 4 DCW @@CSTableTop + $04C8, @@CSTableBot + $0080 ; 2, 5 DCW @@CSTableTop + $04C0, @@CSTableBot + $0080 ; 2, 6 DCW @@CSTableTop + $04C0, @@CSTableBot + $0088 ; 2, 7 DCW @@CSTableTop + $04B8, @@CSTableBot + $0088 ; 2, 8 DCW @@CSTableTop + $04B8, @@CSTableBot + $0090 ; 2, 9 DCW @@CSTableTop + $04B0, @@CSTableBot + $0090 ; 2, 10 DCW @@CSTableTop + $04B0, @@CSTableBot + $0098 ; 2, 11 DCW @@CSTableTop + $04A8, @@CSTableBot + $0098 ; 2, 12 DCW @@CSTableTop + $04A8, @@CSTableBot + $00A0 ; 2, 13 DCW @@CSTableTop + $04A0, @@CSTableBot + $00A0 ; 2, 14 DCW @@CSTableTop + $04A0, @@CSTableBot + $00A8 ; 2, 15 DCW @@CSTableTop + $0498, @@CSTableBot + $00A8 ; 2, 16 DCW @@CSTableTop + $0498, @@CSTableBot + $00B0 ; 2, 17 DCW @@CSTableTop + $0490, @@CSTableBot + $00B0 ; 2, 18 DCW @@CSTableTop + $0490, @@CSTableBot + $00B8 ; 2, 19 DCW @@CSTableTop + $0488, @@CSTableBot + $00B8 ; 2, 20 DCW @@CSTableTop + $0488, @@CSTableBot + $00C0 ; 2, 21 DCW @@CSTableTop + $0480, @@CSTableBot + $00C0 ; 2, 22 DCW @@CSTableTop + $0480, @@CSTableBot + $00C8 ; 2, 23 DCW @@CSTableTop + $0478, @@CSTableBot + $00C8 ; 2, 24 DCW 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 ; 3 DCW @@CSTableTop + $04D8, @@CSTableBot + $00D0 ; 3, 0 DCW @@CSTableTop + $04D8, @@CSTableBot + $00D8 ; 3, 1 DCW @@CSTableTop + $04D0, @@CSTableBot + $00D8 ; 3, 2 DCW @@CSTableTop + $04D0, @@CSTableBot + $00E0 ; 3, 3 DCW @@CSTableTop + $04C8, @@CSTableBot + $00E0 ; 3, 4 DCW @@CSTableTop + $04C8, @@CSTableBot + $00E8 ; 3, 5 DCW @@CSTableTop + $04C0, @@CSTableBot + $00E8 ; 3, 6 DCW @@CSTableTop + $04C0, @@CSTableBot + $00F0 ; 3, 7 DCW @@CSTableTop + $04B8, @@CSTableBot + $00F0 ; 3, 8 DCW @@CSTableTop + $04B8, @@CSTableBot + $00F8 ; 3, 9 DCW @@CSTableTop + $04B0, @@CSTableBot + $00F8 ; 3, 10 DCW @@CSTableTop + $04B0, @@CSTableBot + $0100 ; 3, 11 DCW @@CSTableTop + $04A8, @@CSTableBot + $0100 ; 3, 12 DCW @@CSTableTop + $04A8, @@CSTableBot + $0108 ; 3, 13 DCW @@CSTableTop + $04A0, @@CSTableBot + $0108 ; 3, 14 DCW @@CSTableTop + $04A0, @@CSTableBot + $0110 ; 3, 15 DCW @@CSTableTop + $0498, @@CSTableBot + $0110 ; 3, 16 DCW @@CSTableTop + $0498, @@CSTableBot + $0118 ; 3, 17 DCW @@CSTableTop + $0490, @@CSTableBot + $0118 ; 3, 18 DCW @@CSTableTop + $0490, @@CSTableBot + $0120 ; 3, 19 DCW @@CSTableTop + $0488, @@CSTableBot + $0120 ; 3, 20 DCW @@CSTableTop + $0488, @@CSTableBot + $0128 ; 3, 21 DCW @@CSTableTop + $0480, @@CSTableBot + $0128 ; 3, 22 DCW @@CSTableTop + $0480, @@CSTableBot + $0130 ; 3, 23 DCW @@CSTableTop + $0478, @@CSTableBot + $0130 ; 3, 24 DCW 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 ; 4 DCW @@CSTableTop + $0470, @@CSTableBot + $00D0 ; 4, 0 DCW @@CSTableTop + $0470, @@CSTableBot + $00D8 ; 4, 1 DCW @@CSTableTop + $0468, @@CSTableBot + $00D8 ; 4, 2 DCW @@CSTableTop + $0468, @@CSTableBot + $00E0 ; 4, 3 DCW @@CSTableTop + $0460, @@CSTableBot + $00E0 ; 4, 4 DCW @@CSTableTop + $0460, @@CSTableBot + $00E8 ; 4, 5 DCW @@CSTableTop + $0458, @@CSTableBot + $00E8 ; 4, 6 DCW @@CSTableTop + $0458, @@CSTableBot + $00F0 ; 4, 7 DCW @@CSTableTop + $0450, @@CSTableBot + $00F0 ; 4, 8 DCW @@CSTableTop + $0450, @@CSTableBot + $00F8 ; 4, 9 DCW @@CSTableTop + $0448, @@CSTableBot + $00F8 ; 4, 10 DCW @@CSTableTop + $0448, @@CSTableBot + $0100 ; 4, 11 DCW @@CSTableTop + $0440, @@CSTableBot + $0100 ; 4, 12 DCW @@CSTableTop + $0440, @@CSTableBot + $0108 ; 4, 13 DCW @@CSTableTop + $0438, @@CSTableBot + $0108 ; 4, 14 DCW @@CSTableTop + $0438, @@CSTableBot + $0110 ; 4, 15 DCW @@CSTableTop + $0430, @@CSTableBot + $0110 ; 4, 16 DCW @@CSTableTop + $0430, @@CSTableBot + $0118 ; 4, 17 DCW @@CSTableTop + $0428, @@CSTableBot + $0118 ; 4, 18 DCW @@CSTableTop + $0428, @@CSTableBot + $0120 ; 4, 19 DCW @@CSTableTop + $0420, @@CSTableBot + $0120 ; 4, 20 DCW @@CSTableTop + $0420, @@CSTableBot + $0128 ; 4, 21 DCW @@CSTableTop + $0418, @@CSTableBot + $0128 ; 4, 22 DCW @@CSTableTop + $0418, @@CSTableBot + $0130 ; 4, 23 DCW @@CSTableTop + $0410, @@CSTableBot + $0130 ; 4, 24 DCW 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 ; 5 DCW @@CSTableTop + $0470, @@CSTableBot + $0138 ; 5, 0 DCW @@CSTableTop + $0470, @@CSTableBot + $0140 ; 5, 1 DCW @@CSTableTop + $0468, @@CSTableBot + $0140 ; 5, 2 DCW @@CSTableTop + $0468, @@CSTableBot + $0148 ; 5, 3 DCW @@CSTableTop + $0460, @@CSTableBot + $0148 ; 5, 4 DCW @@CSTableTop + $0460, @@CSTableBot + $0150 ; 5, 5 DCW @@CSTableTop + $0458, @@CSTableBot + $0150 ; 5, 6 DCW @@CSTableTop + $0458, @@CSTableBot + $0158 ; 5, 7 DCW @@CSTableTop + $0450, @@CSTableBot + $0158 ; 5, 8 DCW @@CSTableTop + $0450, @@CSTableBot + $0160 ; 5, 9 DCW @@CSTableTop + $0448, @@CSTableBot + $0160 ; 5, 10 DCW @@CSTableTop + $0448, @@CSTableBot + $0168 ; 5, 11 DCW @@CSTableTop + $0440, @@CSTableBot + $0168 ; 5, 12 DCW @@CSTableTop + $0440, @@CSTableBot + $0170 ; 5, 13 DCW @@CSTableTop + $0438, @@CSTableBot + $0170 ; 5, 14 DCW @@CSTableTop + $0438, @@CSTableBot + $0178 ; 5, 15 DCW @@CSTableTop + $0430, @@CSTableBot + $0178 ; 5, 16 DCW @@CSTableTop + $0430, @@CSTableBot + $0180 ; 5, 17 DCW @@CSTableTop + $0428, @@CSTableBot + $0180 ; 5, 18 DCW @@CSTableTop + $0428, @@CSTableBot + $0188 ; 5, 19 DCW @@CSTableTop + $0420, @@CSTableBot + $0188 ; 5, 20 DCW @@CSTableTop + $0420, @@CSTableBot + $0190 ; 5, 21 DCW @@CSTableTop + $0418, @@CSTableBot + $0190 ; 5, 22 DCW @@CSTableTop + $0418, @@CSTableBot + $0198 ; 5, 23 DCW @@CSTableTop + $0410, @@CSTableBot + $0198 ; 5, 24 DCW 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 ; 6 DCW @@CSTableTop + $0408, @@CSTableBot + $0138 ; 6, 0 DCW @@CSTableTop + $0408, @@CSTableBot + $0140 ; 6, 1 DCW @@CSTableTop + $0400, @@CSTableBot + $0140 ; 6, 2 DCW @@CSTableTop + $0400, @@CSTableBot + $0148 ; 6, 3 DCW @@CSTableTop + $03F8, @@CSTableBot + $0148 ; 6, 4 DCW @@CSTableTop + $03F8, @@CSTableBot + $0150 ; 6, 5 DCW @@CSTableTop + $03F0, @@CSTableBot + $0150 ; 6, 6 DCW @@CSTableTop + $03F0, @@CSTableBot + $0158 ; 6, 7 DCW @@CSTableTop + $03E8, @@CSTableBot + $0158 ; 6, 8 DCW @@CSTableTop + $03E8, @@CSTableBot + $0160 ; 6, 9 DCW @@CSTableTop + $03E0, @@CSTableBot + $0160 ; 6, 10 DCW @@CSTableTop + $03E0, @@CSTableBot + $0168 ; 6, 11 DCW @@CSTableTop + $03D8, @@CSTableBot + $0168 ; 6, 12 DCW @@CSTableTop + $03D8, @@CSTableBot + $0170 ; 6, 13 DCW @@CSTableTop + $03D0, @@CSTableBot + $0170 ; 6, 14 DCW @@CSTableTop + $03D0, @@CSTableBot + $0178 ; 6, 15 DCW @@CSTableTop + $03C8, @@CSTableBot + $0178 ; 6, 16 DCW @@CSTableTop + $03C8, @@CSTableBot + $0180 ; 6, 17 DCW @@CSTableTop + $03C0, @@CSTableBot + $0180 ; 6, 18 DCW @@CSTableTop + $03C0, @@CSTableBot + $0188 ; 6, 19 DCW @@CSTableTop + $03B8, @@CSTableBot + $0188 ; 6, 20 DCW @@CSTableTop + $03B8, @@CSTableBot + $0190 ; 6, 21 DCW @@CSTableTop + $03B0, @@CSTableBot + $0190 ; 6, 22 DCW @@CSTableTop + $03B0, @@CSTableBot + $0198 ; 6, 23 DCW @@CSTableTop + $03A8, @@CSTableBot + $0198 ; 6, 24 DCW 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 ; 7 DCW @@CSTableTop + $0408, @@CSTableBot + $01A0 ; 7, 0 DCW @@CSTableTop + $0408, @@CSTableBot + $01A8 ; 7, 1 DCW @@CSTableTop + $0400, @@CSTableBot + $01A8 ; 7, 2 DCW @@CSTableTop + $0400, @@CSTableBot + $01B0 ; 7, 3 DCW @@CSTableTop + $03F8, @@CSTableBot + $01B0 ; 7, 4 DCW @@CSTableTop + $03F8, @@CSTableBot + $01B8 ; 7, 5 DCW @@CSTableTop + $03F0, @@CSTableBot + $01B8 ; 7, 6 DCW @@CSTableTop + $03F0, @@CSTableBot + $01C0 ; 7, 7 DCW @@CSTableTop + $03E8, @@CSTableBot + $01C0 ; 7, 8 DCW @@CSTableTop + $03E8, @@CSTableBot + $01C8 ; 7, 9 DCW @@CSTableTop + $03E0, @@CSTableBot + $01C8 ; 7, 10 DCW @@CSTableTop + $03E0, @@CSTableBot + $01D0 ; 7, 11 DCW @@CSTableTop + $03D8, @@CSTableBot + $01D0 ; 7, 12 DCW @@CSTableTop + $03D8, @@CSTableBot + $01D8 ; 7, 13 DCW @@CSTableTop + $03D0, @@CSTableBot + $01D8 ; 7, 14 DCW @@CSTableTop + $03D0, @@CSTableBot + $01E0 ; 7, 15 DCW @@CSTableTop + $03C8, @@CSTableBot + $01E0 ; 7, 16 DCW @@CSTableTop + $03C8, @@CSTableBot + $01E8 ; 7, 17 DCW @@CSTableTop + $03C0, @@CSTableBot + $01E8 ; 7, 18 DCW @@CSTableTop + $03C0, @@CSTableBot + $01F0 ; 7, 19 DCW @@CSTableTop + $03B8, @@CSTableBot + $01F0 ; 7, 20 DCW @@CSTableTop + $03B8, @@CSTableBot + $01F8 ; 7, 21 DCW @@CSTableTop + $03B0, @@CSTableBot + $01F8 ; 7, 22 DCW @@CSTableTop + $03B0, @@CSTableBot + $0200 ; 7, 23 DCW @@CSTableTop + $03A8, @@CSTableBot + $0200 ; 7, 24 DCW 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 ; 8 DCW @@CSTableTop + $03A0, @@CSTableBot + $01A0 ; 8, 0 DCW @@CSTableTop + $03A0, @@CSTableBot + $01A8 ; 8, 1 DCW @@CSTableTop + $0398, @@CSTableBot + $01A8 ; 8, 2 DCW @@CSTableTop + $0398, @@CSTableBot + $01B0 ; 8, 3 DCW @@CSTableTop + $0390, @@CSTableBot + $01B0 ; 8, 4 DCW @@CSTableTop + $0390, @@CSTableBot + $01B8 ; 8, 5 DCW @@CSTableTop + $0388, @@CSTableBot + $01B8 ; 8, 6 DCW @@CSTableTop + $0388, @@CSTableBot + $01C0 ; 8, 7 DCW @@CSTableTop + $0380, @@CSTableBot + $01C0 ; 8, 8 DCW @@CSTableTop + $0380, @@CSTableBot + $01C8 ; 8, 9 DCW @@CSTableTop + $0378, @@CSTableBot + $01C8 ; 8, 10 DCW @@CSTableTop + $0378, @@CSTableBot + $01D0 ; 8, 11 DCW @@CSTableTop + $0370, @@CSTableBot + $01D0 ; 8, 12 DCW @@CSTableTop + $0370, @@CSTableBot + $01D8 ; 8, 13 DCW @@CSTableTop + $0368, @@CSTableBot + $01D8 ; 8, 14 DCW @@CSTableTop + $0368, @@CSTableBot + $01E0 ; 8, 15 DCW @@CSTableTop + $0360, @@CSTableBot + $01E0 ; 8, 16 DCW @@CSTableTop + $0360, @@CSTableBot + $01E8 ; 8, 17 DCW @@CSTableTop + $0358, @@CSTableBot + $01E8 ; 8, 18 DCW @@CSTableTop + $0358, @@CSTableBot + $01F0 ; 8, 19 DCW @@CSTableTop + $0350, @@CSTableBot + $01F0 ; 8, 20 DCW @@CSTableTop + $0350, @@CSTableBot + $01F8 ; 8, 21 DCW @@CSTableTop + $0348, @@CSTableBot + $01F8 ; 8, 22 DCW @@CSTableTop + $0348, @@CSTableBot + $0200 ; 8, 23 DCW @@CSTableTop + $0340, @@CSTableBot + $0200 ; 8, 24 DCW 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 ; 9 DCW @@CSTableTop + $03A0, @@CSTableBot + $0208 ; 9, 0 DCW @@CSTableTop + $03A0, @@CSTableBot + $0210 ; 9, 1 DCW @@CSTableTop + $0398, @@CSTableBot + $0210 ; 9, 2 DCW @@CSTableTop + $0398, @@CSTableBot + $0218 ; 9, 3 DCW @@CSTableTop + $0390, @@CSTableBot + $0218 ; 9, 4 DCW @@CSTableTop + $0390, @@CSTableBot + $0220 ; 9, 5 DCW @@CSTableTop + $0388, @@CSTableBot + $0220 ; 9, 6 DCW @@CSTableTop + $0388, @@CSTableBot + $0228 ; 9, 7 DCW @@CSTableTop + $0380, @@CSTableBot + $0228 ; 9, 8 DCW @@CSTableTop + $0380, @@CSTableBot + $0230 ; 9, 9 DCW @@CSTableTop + $0378, @@CSTableBot + $0230 ; 9, 10 DCW @@CSTableTop + $0378, @@CSTableBot + $0238 ; 9, 11 DCW @@CSTableTop + $0370, @@CSTableBot + $0238 ; 9, 12 DCW @@CSTableTop + $0370, @@CSTableBot + $0240 ; 9, 13 DCW @@CSTableTop + $0368, @@CSTableBot + $0240 ; 9, 14 DCW @@CSTableTop + $0368, @@CSTableBot + $0248 ; 9, 15 DCW @@CSTableTop + $0360, @@CSTableBot + $0248 ; 9, 16 DCW @@CSTableTop + $0360, @@CSTableBot + $0250 ; 9, 17 DCW @@CSTableTop + $0358, @@CSTableBot + $0250 ; 9, 18 DCW @@CSTableTop + $0358, @@CSTableBot + $0258 ; 9, 19 DCW @@CSTableTop + $0350, @@CSTableBot + $0258 ; 9, 20 DCW @@CSTableTop + $0350, @@CSTableBot + $0260 ; 9, 21 DCW @@CSTableTop + $0348, @@CSTableBot + $0260 ; 9, 22 DCW @@CSTableTop + $0348, @@CSTableBot + $0268 ; 9, 23 DCW @@CSTableTop + $0340, @@CSTableBot + $0268 ; 9, 24 DCW 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 ; 10 DCW @@CSTableTop + $0338, @@CSTableBot + $0208 ; 10, 0 DCW @@CSTableTop + $0338, @@CSTableBot + $0210 ; 10, 1 DCW @@CSTableTop + $0330, @@CSTableBot + $0210 ; 10, 2 DCW @@CSTableTop + $0330, @@CSTableBot + $0218 ; 10, 3 DCW @@CSTableTop + $0328, @@CSTableBot + $0218 ; 10, 4 DCW @@CSTableTop + $0328, @@CSTableBot + $0220 ; 10, 5 DCW @@CSTableTop + $0320, @@CSTableBot + $0220 ; 10, 6 DCW @@CSTableTop + $0320, @@CSTableBot + $0228 ; 10, 7 DCW @@CSTableTop + $0318, @@CSTableBot + $0228 ; 10, 8 DCW @@CSTableTop + $0318, @@CSTableBot + $0230 ; 10, 9 DCW @@CSTableTop + $0310, @@CSTableBot + $0230 ; 10, 10 DCW @@CSTableTop + $0310, @@CSTableBot + $0238 ; 10, 11 DCW @@CSTableTop + $0308, @@CSTableBot + $0238 ; 10, 12 DCW @@CSTableTop + $0308, @@CSTableBot + $0240 ; 10, 13 DCW @@CSTableTop + $0300, @@CSTableBot + $0240 ; 10, 14 DCW @@CSTableTop + $0300, @@CSTableBot + $0248 ; 10, 15 DCW @@CSTableTop + $02F8, @@CSTableBot + $0248 ; 10, 16 DCW @@CSTableTop + $02F8, @@CSTableBot + $0250 ; 10, 17 DCW @@CSTableTop + $02F0, @@CSTableBot + $0250 ; 10, 18 DCW @@CSTableTop + $02F0, @@CSTableBot + $0258 ; 10, 19 DCW @@CSTableTop + $02E8, @@CSTableBot + $0258 ; 10, 20 DCW @@CSTableTop + $02E8, @@CSTableBot + $0260 ; 10, 21 DCW @@CSTableTop + $02E0, @@CSTableBot + $0260 ; 10, 22 DCW @@CSTableTop + $02E0, @@CSTableBot + $0268 ; 10, 23 DCW @@CSTableTop + $02D8, @@CSTableBot + $0268 ; 10, 24 DCW 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 ; 11 DCW @@CSTableTop + $0338, @@CSTableBot + $0270 ; 11, 0 DCW @@CSTableTop + $0338, @@CSTableBot + $0278 ; 11, 1 DCW @@CSTableTop + $0330, @@CSTableBot + $0278 ; 11, 2 DCW @@CSTableTop + $0330, @@CSTableBot + $0280 ; 11, 3 DCW @@CSTableTop + $0328, @@CSTableBot + $0280 ; 11, 4 DCW @@CSTableTop + $0328, @@CSTableBot + $0288 ; 11, 5 DCW @@CSTableTop + $0320, @@CSTableBot + $0288 ; 11, 6 DCW @@CSTableTop + $0320, @@CSTableBot + $0290 ; 11, 7 DCW @@CSTableTop + $0318, @@CSTableBot + $0290 ; 11, 8 DCW @@CSTableTop + $0318, @@CSTableBot + $0298 ; 11, 9 DCW @@CSTableTop + $0310, @@CSTableBot + $0298 ; 11, 10 DCW @@CSTableTop + $0310, @@CSTableBot + $02A0 ; 11, 11 DCW @@CSTableTop + $0308, @@CSTableBot + $02A0 ; 11, 12 DCW @@CSTableTop + $0308, @@CSTableBot + $02A8 ; 11, 13 DCW @@CSTableTop + $0300, @@CSTableBot + $02A8 ; 11, 14 DCW @@CSTableTop + $0300, @@CSTableBot + $02B0 ; 11, 15 DCW @@CSTableTop + $02F8, @@CSTableBot + $02B0 ; 11, 16 DCW @@CSTableTop + $02F8, @@CSTableBot + $02B8 ; 11, 17 DCW @@CSTableTop + $02F0, @@CSTableBot + $02B8 ; 11, 18 DCW @@CSTableTop + $02F0, @@CSTableBot + $02C0 ; 11, 19 DCW @@CSTableTop + $02E8, @@CSTableBot + $02C0 ; 11, 20 DCW @@CSTableTop + $02E8, @@CSTableBot + $02C8 ; 11, 21 DCW @@CSTableTop + $02E0, @@CSTableBot + $02C8 ; 11, 22 DCW @@CSTableTop + $02E0, @@CSTableBot + $02D0 ; 11, 23 DCW @@CSTableTop + $02D8, @@CSTableBot + $02D0 ; 11, 24 DCW 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 ; 12 DCW @@CSTableTop + $02D0, @@CSTableBot + $0270 ; 12, 0 DCW @@CSTableTop + $02D0, @@CSTableBot + $0278 ; 12, 1 DCW @@CSTableTop + $02C8, @@CSTableBot + $0278 ; 12, 2 DCW @@CSTableTop + $02C8, @@CSTableBot + $0280 ; 12, 3 DCW @@CSTableTop + $02C0, @@CSTableBot + $0280 ; 12, 4 DCW @@CSTableTop + $02C0, @@CSTableBot + $0288 ; 12, 5 DCW @@CSTableTop + $02B8, @@CSTableBot + $0288 ; 12, 6 DCW @@CSTableTop + $02B8, @@CSTableBot + $0290 ; 12, 7 DCW @@CSTableTop + $02B0, @@CSTableBot + $0290 ; 12, 8 DCW @@CSTableTop + $02B0, @@CSTableBot + $0298 ; 12, 9 DCW @@CSTableTop + $02A8, @@CSTableBot + $0298 ; 12, 10 DCW @@CSTableTop + $02A8, @@CSTableBot + $02A0 ; 12, 11 DCW @@CSTableTop + $02A0, @@CSTableBot + $02A0 ; 12, 12 DCW @@CSTableTop + $02A0, @@CSTableBot + $02A8 ; 12, 13 DCW @@CSTableTop + $0298, @@CSTableBot + $02A8 ; 12, 14 DCW @@CSTableTop + $0298, @@CSTableBot + $02B0 ; 12, 15 DCW @@CSTableTop + $0290, @@CSTableBot + $02B0 ; 12, 16 DCW @@CSTableTop + $0290, @@CSTableBot + $02B8 ; 12, 17 DCW @@CSTableTop + $0288, @@CSTableBot + $02B8 ; 12, 18 DCW @@CSTableTop + $0288, @@CSTableBot + $02C0 ; 12, 19 DCW @@CSTableTop + $0280, @@CSTableBot + $02C0 ; 12, 20 DCW @@CSTableTop + $0280, @@CSTableBot + $02C8 ; 12, 21 DCW @@CSTableTop + $0278, @@CSTableBot + $02C8 ; 12, 22 DCW @@CSTableTop + $0278, @@CSTableBot + $02D0 ; 12, 23 DCW @@CSTableTop + $0270, @@CSTableBot + $02D0 ; 12, 24 DCW 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 ; 13 DCW @@CSTableTop + $02D0, @@CSTableBot + $02D8 ; 13, 0 DCW @@CSTableTop + $02D0, @@CSTableBot + $02E0 ; 13, 1 DCW @@CSTableTop + $02C8, @@CSTableBot + $02E0 ; 13, 2 DCW @@CSTableTop + $02C8, @@CSTableBot + $02E8 ; 13, 3 DCW @@CSTableTop + $02C0, @@CSTableBot + $02E8 ; 13, 4 DCW @@CSTableTop + $02C0, @@CSTableBot + $02F0 ; 13, 5 DCW @@CSTableTop + $02B8, @@CSTableBot + $02F0 ; 13, 6 DCW @@CSTableTop + $02B8, @@CSTableBot + $02F8 ; 13, 7 DCW @@CSTableTop + $02B0, @@CSTableBot + $02F8 ; 13, 8 DCW @@CSTableTop + $02B0, @@CSTableBot + $0300 ; 13, 9 DCW @@CSTableTop + $02A8, @@CSTableBot + $0300 ; 13, 10 DCW @@CSTableTop + $02A8, @@CSTableBot + $0308 ; 13, 11 DCW @@CSTableTop + $02A0, @@CSTableBot + $0308 ; 13, 12 DCW @@CSTableTop + $02A0, @@CSTableBot + $0310 ; 13, 13 DCW @@CSTableTop + $0298, @@CSTableBot + $0310 ; 13, 14 DCW @@CSTableTop + $0298, @@CSTableBot + $0318 ; 13, 15 DCW @@CSTableTop + $0290, @@CSTableBot + $0318 ; 13, 16 DCW @@CSTableTop + $0290, @@CSTableBot + $0320 ; 13, 17 DCW @@CSTableTop + $0288, @@CSTableBot + $0320 ; 13, 18 DCW @@CSTableTop + $0288, @@CSTableBot + $0328 ; 13, 19 DCW @@CSTableTop + $0280, @@CSTableBot + $0328 ; 13, 20 DCW @@CSTableTop + $0280, @@CSTableBot + $0330 ; 13, 21 DCW @@CSTableTop + $0278, @@CSTableBot + $0330 ; 13, 22 DCW @@CSTableTop + $0278, @@CSTableBot + $0338 ; 13, 23 DCW @@CSTableTop + $0270, @@CSTableBot + $0338 ; 13, 24 DCW 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 ; 14 DCW @@CSTableTop + $0268, @@CSTableBot + $02D8 ; 14, 0 DCW @@CSTableTop + $0268, @@CSTableBot + $02E0 ; 14, 1 DCW @@CSTableTop + $0260, @@CSTableBot + $02E0 ; 14, 2 DCW @@CSTableTop + $0260, @@CSTableBot + $02E8 ; 14, 3 DCW @@CSTableTop + $0258, @@CSTableBot + $02E8 ; 14, 4 DCW @@CSTableTop + $0258, @@CSTableBot + $02F0 ; 14, 5 DCW @@CSTableTop + $0250, @@CSTableBot + $02F0 ; 14, 6 DCW @@CSTableTop + $0250, @@CSTableBot + $02F8 ; 14, 7 DCW @@CSTableTop + $0248, @@CSTableBot + $02F8 ; 14, 8 DCW @@CSTableTop + $0248, @@CSTableBot + $0300 ; 14, 9 DCW @@CSTableTop + $0240, @@CSTableBot + $0300 ; 14, 10 DCW @@CSTableTop + $0240, @@CSTableBot + $0308 ; 14, 11 DCW @@CSTableTop + $0238, @@CSTableBot + $0308 ; 14, 12 DCW @@CSTableTop + $0238, @@CSTableBot + $0310 ; 14, 13 DCW @@CSTableTop + $0230, @@CSTableBot + $0310 ; 14, 14 DCW @@CSTableTop + $0230, @@CSTableBot + $0318 ; 14, 15 DCW @@CSTableTop + $0228, @@CSTableBot + $0318 ; 14, 16 DCW @@CSTableTop + $0228, @@CSTableBot + $0320 ; 14, 17 DCW @@CSTableTop + $0220, @@CSTableBot + $0320 ; 14, 18 DCW @@CSTableTop + $0220, @@CSTableBot + $0328 ; 14, 19 DCW @@CSTableTop + $0218, @@CSTableBot + $0328 ; 14, 20 DCW @@CSTableTop + $0218, @@CSTableBot + $0330 ; 14, 21 DCW @@CSTableTop + $0210, @@CSTableBot + $0330 ; 14, 22 DCW @@CSTableTop + $0210, @@CSTableBot + $0338 ; 14, 23 DCW @@CSTableTop + $0208, @@CSTableBot + $0338 ; 14, 24 DCW 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 ; 15 DCW @@CSTableTop + $0268, @@CSTableBot + $0340 ; 15, 0 DCW @@CSTableTop + $0268, @@CSTableBot + $0348 ; 15, 1 DCW @@CSTableTop + $0260, @@CSTableBot + $0348 ; 15, 2 DCW @@CSTableTop + $0260, @@CSTableBot + $0350 ; 15, 3 DCW @@CSTableTop + $0258, @@CSTableBot + $0350 ; 15, 4 DCW @@CSTableTop + $0258, @@CSTableBot + $0358 ; 15, 5 DCW @@CSTableTop + $0250, @@CSTableBot + $0358 ; 15, 6 DCW @@CSTableTop + $0250, @@CSTableBot + $0360 ; 15, 7 DCW @@CSTableTop + $0248, @@CSTableBot + $0360 ; 15, 8 DCW @@CSTableTop + $0248, @@CSTableBot + $0368 ; 15, 9 DCW @@CSTableTop + $0240, @@CSTableBot + $0368 ; 15, 10 DCW @@CSTableTop + $0240, @@CSTableBot + $0370 ; 15, 11 DCW @@CSTableTop + $0238, @@CSTableBot + $0370 ; 15, 12 DCW @@CSTableTop + $0238, @@CSTableBot + $0378 ; 15, 13 DCW @@CSTableTop + $0230, @@CSTableBot + $0378 ; 15, 14 DCW @@CSTableTop + $0230, @@CSTableBot + $0380 ; 15, 15 DCW @@CSTableTop + $0228, @@CSTableBot + $0380 ; 15, 16 DCW @@CSTableTop + $0228, @@CSTableBot + $0388 ; 15, 17 DCW @@CSTableTop + $0220, @@CSTableBot + $0388 ; 15, 18 DCW @@CSTableTop + $0220, @@CSTableBot + $0390 ; 15, 19 DCW @@CSTableTop + $0218, @@CSTableBot + $0390 ; 15, 20 DCW @@CSTableTop + $0218, @@CSTableBot + $0398 ; 15, 21 DCW @@CSTableTop + $0210, @@CSTableBot + $0398 ; 15, 22 DCW @@CSTableTop + $0210, @@CSTableBot + $03A0 ; 15, 23 DCW @@CSTableTop + $0208, @@CSTableBot + $03A0 ; 15, 24 DCW 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 ; 16 DCW @@CSTableTop + $0200, @@CSTableBot + $0340 ; 16, 0 DCW @@CSTableTop + $0200, @@CSTableBot + $0348 ; 16, 1 DCW @@CSTableTop + $01F8, @@CSTableBot + $0348 ; 16, 2 DCW @@CSTableTop + $01F8, @@CSTableBot + $0350 ; 16, 3 DCW @@CSTableTop + $01F0, @@CSTableBot + $0350 ; 16, 4 DCW @@CSTableTop + $01F0, @@CSTableBot + $0358 ; 16, 5 DCW @@CSTableTop + $01E8, @@CSTableBot + $0358 ; 16, 6 DCW @@CSTableTop + $01E8, @@CSTableBot + $0360 ; 16, 7 DCW @@CSTableTop + $01E0, @@CSTableBot + $0360 ; 16, 8 DCW @@CSTableTop + $01E0, @@CSTableBot + $0368 ; 16, 9 DCW @@CSTableTop + $01D8, @@CSTableBot + $0368 ; 16, 10 DCW @@CSTableTop + $01D8, @@CSTableBot + $0370 ; 16, 11 DCW @@CSTableTop + $01D0, @@CSTableBot + $0370 ; 16, 12 DCW @@CSTableTop + $01D0, @@CSTableBot + $0378 ; 16, 13 DCW @@CSTableTop + $01C8, @@CSTableBot + $0378 ; 16, 14 DCW @@CSTableTop + $01C8, @@CSTableBot + $0380 ; 16, 15 DCW @@CSTableTop + $01C0, @@CSTableBot + $0380 ; 16, 16 DCW @@CSTableTop + $01C0, @@CSTableBot + $0388 ; 16, 17 DCW @@CSTableTop + $01B8, @@CSTableBot + $0388 ; 16, 18 DCW @@CSTableTop + $01B8, @@CSTableBot + $0390 ; 16, 19 DCW @@CSTableTop + $01B0, @@CSTableBot + $0390 ; 16, 20 DCW @@CSTableTop + $01B0, @@CSTableBot + $0398 ; 16, 21 DCW @@CSTableTop + $01A8, @@CSTableBot + $0398 ; 16, 22 DCW @@CSTableTop + $01A8, @@CSTableBot + $03A0 ; 16, 23 DCW @@CSTableTop + $01A0, @@CSTableBot + $03A0 ; 16, 24 DCW 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 ; 17 DCW @@CSTableTop + $0200, @@CSTableBot + $03A8 ; 17, 0 DCW @@CSTableTop + $0200, @@CSTableBot + $03B0 ; 17, 1 DCW @@CSTableTop + $01F8, @@CSTableBot + $03B0 ; 17, 2 DCW @@CSTableTop + $01F8, @@CSTableBot + $03B8 ; 17, 3 DCW @@CSTableTop + $01F0, @@CSTableBot + $03B8 ; 17, 4 DCW @@CSTableTop + $01F0, @@CSTableBot + $03C0 ; 17, 5 DCW @@CSTableTop + $01E8, @@CSTableBot + $03C0 ; 17, 6 DCW @@CSTableTop + $01E8, @@CSTableBot + $03C8 ; 17, 7 DCW @@CSTableTop + $01E0, @@CSTableBot + $03C8 ; 17, 8 DCW @@CSTableTop + $01E0, @@CSTableBot + $03D0 ; 17, 9 DCW @@CSTableTop + $01D8, @@CSTableBot + $03D0 ; 17, 10 DCW @@CSTableTop + $01D8, @@CSTableBot + $03D8 ; 17, 11 DCW @@CSTableTop + $01D0, @@CSTableBot + $03D8 ; 17, 12 DCW @@CSTableTop + $01D0, @@CSTableBot + $03E0 ; 17, 13 DCW @@CSTableTop + $01C8, @@CSTableBot + $03E0 ; 17, 14 DCW @@CSTableTop + $01C8, @@CSTableBot + $03E8 ; 17, 15 DCW @@CSTableTop + $01C0, @@CSTableBot + $03E8 ; 17, 16 DCW @@CSTableTop + $01C0, @@CSTableBot + $03F0 ; 17, 17 DCW @@CSTableTop + $01B8, @@CSTableBot + $03F0 ; 17, 18 DCW @@CSTableTop + $01B8, @@CSTableBot + $03F8 ; 17, 19 DCW @@CSTableTop + $01B0, @@CSTableBot + $03F8 ; 17, 20 DCW @@CSTableTop + $01B0, @@CSTableBot + $0400 ; 17, 21 DCW @@CSTableTop + $01A8, @@CSTableBot + $0400 ; 17, 22 DCW @@CSTableTop + $01A8, @@CSTableBot + $0408 ; 17, 23 DCW @@CSTableTop + $01A0, @@CSTableBot + $0408 ; 17, 24 DCW 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 ; 18 DCW @@CSTableTop + $0198, @@CSTableBot + $03A8 ; 18, 0 DCW @@CSTableTop + $0198, @@CSTableBot + $03B0 ; 18, 1 DCW @@CSTableTop + $0190, @@CSTableBot + $03B0 ; 18, 2 DCW @@CSTableTop + $0190, @@CSTableBot + $03B8 ; 18, 3 DCW @@CSTableTop + $0188, @@CSTableBot + $03B8 ; 18, 4 DCW @@CSTableTop + $0188, @@CSTableBot + $03C0 ; 18, 5 DCW @@CSTableTop + $0180, @@CSTableBot + $03C0 ; 18, 6 DCW @@CSTableTop + $0180, @@CSTableBot + $03C8 ; 18, 7 DCW @@CSTableTop + $0178, @@CSTableBot + $03C8 ; 18, 8 DCW @@CSTableTop + $0178, @@CSTableBot + $03D0 ; 18, 9 DCW @@CSTableTop + $0170, @@CSTableBot + $03D0 ; 18, 10 DCW @@CSTableTop + $0170, @@CSTableBot + $03D8 ; 18, 11 DCW @@CSTableTop + $0168, @@CSTableBot + $03D8 ; 18, 12 DCW @@CSTableTop + $0168, @@CSTableBot + $03E0 ; 18, 13 DCW @@CSTableTop + $0160, @@CSTableBot + $03E0 ; 18, 14 DCW @@CSTableTop + $0160, @@CSTableBot + $03E8 ; 18, 15 DCW @@CSTableTop + $0158, @@CSTableBot + $03E8 ; 18, 16 DCW @@CSTableTop + $0158, @@CSTableBot + $03F0 ; 18, 17 DCW @@CSTableTop + $0150, @@CSTableBot + $03F0 ; 18, 18 DCW @@CSTableTop + $0150, @@CSTableBot + $03F8 ; 18, 19 DCW @@CSTableTop + $0148, @@CSTableBot + $03F8 ; 18, 20 DCW @@CSTableTop + $0148, @@CSTableBot + $0400 ; 18, 21 DCW @@CSTableTop + $0140, @@CSTableBot + $0400 ; 18, 22 DCW @@CSTableTop + $0140, @@CSTableBot + $0408 ; 18, 23 DCW @@CSTableTop + $0138, @@CSTableBot + $0408 ; 18, 24 DCW 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 ; 19 DCW @@CSTableTop + $0198, @@CSTableBot + $0410 ; 19, 0 DCW @@CSTableTop + $0198, @@CSTableBot + $0418 ; 19, 1 DCW @@CSTableTop + $0190, @@CSTableBot + $0418 ; 19, 2 DCW @@CSTableTop + $0190, @@CSTableBot + $0420 ; 19, 3 DCW @@CSTableTop + $0188, @@CSTableBot + $0420 ; 19, 4 DCW @@CSTableTop + $0188, @@CSTableBot + $0428 ; 19, 5 DCW @@CSTableTop + $0180, @@CSTableBot + $0428 ; 19, 6 DCW @@CSTableTop + $0180, @@CSTableBot + $0430 ; 19, 7 DCW @@CSTableTop + $0178, @@CSTableBot + $0430 ; 19, 8 DCW @@CSTableTop + $0178, @@CSTableBot + $0438 ; 19, 9 DCW @@CSTableTop + $0170, @@CSTableBot + $0438 ; 19, 10 DCW @@CSTableTop + $0170, @@CSTableBot + $0440 ; 19, 11 DCW @@CSTableTop + $0168, @@CSTableBot + $0440 ; 19, 12 DCW @@CSTableTop + $0168, @@CSTableBot + $0448 ; 19, 13 DCW @@CSTableTop + $0160, @@CSTableBot + $0448 ; 19, 14 DCW @@CSTableTop + $0160, @@CSTableBot + $0450 ; 19, 15 DCW @@CSTableTop + $0158, @@CSTableBot + $0450 ; 19, 16 DCW @@CSTableTop + $0158, @@CSTableBot + $0458 ; 19, 17 DCW @@CSTableTop + $0150, @@CSTableBot + $0458 ; 19, 18 DCW @@CSTableTop + $0150, @@CSTableBot + $0460 ; 19, 19 DCW @@CSTableTop + $0148, @@CSTableBot + $0460 ; 19, 20 DCW @@CSTableTop + $0148, @@CSTableBot + $0468 ; 19, 21 DCW @@CSTableTop + $0140, @@CSTableBot + $0468 ; 19, 22 DCW @@CSTableTop + $0140, @@CSTableBot + $0470 ; 19, 23 DCW @@CSTableTop + $0138, @@CSTableBot + $0470 ; 19, 24 DCW 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 ; 20 DCW @@CSTableTop + $0130, @@CSTableBot + $0410 ; 20, 0 DCW @@CSTableTop + $0130, @@CSTableBot + $0418 ; 20, 1 DCW @@CSTableTop + $0128, @@CSTableBot + $0418 ; 20, 2 DCW @@CSTableTop + $0128, @@CSTableBot + $0420 ; 20, 3 DCW @@CSTableTop + $0120, @@CSTableBot + $0420 ; 20, 4 DCW @@CSTableTop + $0120, @@CSTableBot + $0428 ; 20, 5 DCW @@CSTableTop + $0118, @@CSTableBot + $0428 ; 20, 6 DCW @@CSTableTop + $0118, @@CSTableBot + $0430 ; 20, 7 DCW @@CSTableTop + $0110, @@CSTableBot + $0430 ; 20, 8 DCW @@CSTableTop + $0110, @@CSTableBot + $0438 ; 20, 9 DCW @@CSTableTop + $0108, @@CSTableBot + $0438 ; 20, 10 DCW @@CSTableTop + $0108, @@CSTableBot + $0440 ; 20, 11 DCW @@CSTableTop + $0100, @@CSTableBot + $0440 ; 20, 12 DCW @@CSTableTop + $0100, @@CSTableBot + $0448 ; 20, 13 DCW @@CSTableTop + $00F8, @@CSTableBot + $0448 ; 20, 14 DCW @@CSTableTop + $00F8, @@CSTableBot + $0450 ; 20, 15 DCW @@CSTableTop + $00F0, @@CSTableBot + $0450 ; 20, 16 DCW @@CSTableTop + $00F0, @@CSTableBot + $0458 ; 20, 17 DCW @@CSTableTop + $00E8, @@CSTableBot + $0458 ; 20, 18 DCW @@CSTableTop + $00E8, @@CSTableBot + $0460 ; 20, 19 DCW @@CSTableTop + $00E0, @@CSTableBot + $0460 ; 20, 20 DCW @@CSTableTop + $00E0, @@CSTableBot + $0468 ; 20, 21 DCW @@CSTableTop + $00D8, @@CSTableBot + $0468 ; 20, 22 DCW @@CSTableTop + $00D8, @@CSTableBot + $0470 ; 20, 23 DCW @@CSTableTop + $00D0, @@CSTableBot + $0470 ; 20, 24 DCW 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 ; 21 DCW @@CSTableTop + $0130, @@CSTableBot + $0478 ; 21, 0 DCW @@CSTableTop + $0130, @@CSTableBot + $0480 ; 21, 1 DCW @@CSTableTop + $0128, @@CSTableBot + $0480 ; 21, 2 DCW @@CSTableTop + $0128, @@CSTableBot + $0488 ; 21, 3 DCW @@CSTableTop + $0120, @@CSTableBot + $0488 ; 21, 4 DCW @@CSTableTop + $0120, @@CSTableBot + $0490 ; 21, 5 DCW @@CSTableTop + $0118, @@CSTableBot + $0490 ; 21, 6 DCW @@CSTableTop + $0118, @@CSTableBot + $0498 ; 21, 7 DCW @@CSTableTop + $0110, @@CSTableBot + $0498 ; 21, 8 DCW @@CSTableTop + $0110, @@CSTableBot + $04A0 ; 21, 9 DCW @@CSTableTop + $0108, @@CSTableBot + $04A0 ; 21, 10 DCW @@CSTableTop + $0108, @@CSTableBot + $04A8 ; 21, 11 DCW @@CSTableTop + $0100, @@CSTableBot + $04A8 ; 21, 12 DCW @@CSTableTop + $0100, @@CSTableBot + $04B0 ; 21, 13 DCW @@CSTableTop + $00F8, @@CSTableBot + $04B0 ; 21, 14 DCW @@CSTableTop + $00F8, @@CSTableBot + $04B8 ; 21, 15 DCW @@CSTableTop + $00F0, @@CSTableBot + $04B8 ; 21, 16 DCW @@CSTableTop + $00F0, @@CSTableBot + $04C0 ; 21, 17 DCW @@CSTableTop + $00E8, @@CSTableBot + $04C0 ; 21, 18 DCW @@CSTableTop + $00E8, @@CSTableBot + $04C8 ; 21, 19 DCW @@CSTableTop + $00E0, @@CSTableBot + $04C8 ; 21, 20 DCW @@CSTableTop + $00E0, @@CSTableBot + $04D0 ; 21, 21 DCW @@CSTableTop + $00D8, @@CSTableBot + $04D0 ; 21, 22 DCW @@CSTableTop + $00D8, @@CSTableBot + $04D8 ; 21, 23 DCW @@CSTableTop + $00D0, @@CSTableBot + $04D8 ; 21, 24 DCW 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 ; 22 DCW @@CSTableTop + $00C8, @@CSTableBot + $0478 ; 22, 0 DCW @@CSTableTop + $00C8, @@CSTableBot + $0480 ; 22, 1 DCW @@CSTableTop + $00C0, @@CSTableBot + $0480 ; 22, 2 DCW @@CSTableTop + $00C0, @@CSTableBot + $0488 ; 22, 3 DCW @@CSTableTop + $00B8, @@CSTableBot + $0488 ; 22, 4 DCW @@CSTableTop + $00B8, @@CSTableBot + $0490 ; 22, 5 DCW @@CSTableTop + $00B0, @@CSTableBot + $0490 ; 22, 6 DCW @@CSTableTop + $00B0, @@CSTableBot + $0498 ; 22, 7 DCW @@CSTableTop + $00A8, @@CSTableBot + $0498 ; 22, 8 DCW @@CSTableTop + $00A8, @@CSTableBot + $04A0 ; 22, 9 DCW @@CSTableTop + $00A0, @@CSTableBot + $04A0 ; 22, 10 DCW @@CSTableTop + $00A0, @@CSTableBot + $04A8 ; 22, 11 DCW @@CSTableTop + $0098, @@CSTableBot + $04A8 ; 22, 12 DCW @@CSTableTop + $0098, @@CSTableBot + $04B0 ; 22, 13 DCW @@CSTableTop + $0090, @@CSTableBot + $04B0 ; 22, 14 DCW @@CSTableTop + $0090, @@CSTableBot + $04B8 ; 22, 15 DCW @@CSTableTop + $0088, @@CSTableBot + $04B8 ; 22, 16 DCW @@CSTableTop + $0088, @@CSTableBot + $04C0 ; 22, 17 DCW @@CSTableTop + $0080, @@CSTableBot + $04C0 ; 22, 18 DCW @@CSTableTop + $0080, @@CSTableBot + $04C8 ; 22, 19 DCW @@CSTableTop + $0078, @@CSTableBot + $04C8 ; 22, 20 DCW @@CSTableTop + $0078, @@CSTableBot + $04D0 ; 22, 21 DCW @@CSTableTop + $0070, @@CSTableBot + $04D0 ; 22, 22 DCW @@CSTableTop + $0070, @@CSTableBot + $04D8 ; 22, 23 DCW @@CSTableTop + $0068, @@CSTableBot + $04D8 ; 22, 24 DCW 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 ; 23 DCW @@CSTableTop + $00C8, @@CSTableBot + $04E0 ; 23, 0 DCW @@CSTableTop + $00C8, @@CSTableBot + $04E8 ; 23, 1 DCW @@CSTableTop + $00C0, @@CSTableBot + $04E8 ; 23, 2 DCW @@CSTableTop + $00C0, @@CSTableBot + $04F0 ; 23, 3 DCW @@CSTableTop + $00B8, @@CSTableBot + $04F0 ; 23, 4 DCW @@CSTableTop + $00B8, @@CSTableBot + $04F8 ; 23, 5 DCW @@CSTableTop + $00B0, @@CSTableBot + $04F8 ; 23, 6 DCW @@CSTableTop + $00B0, @@CSTableBot + $0500 ; 23, 7 DCW @@CSTableTop + $00A8, @@CSTableBot + $0500 ; 23, 8 DCW @@CSTableTop + $00A8, @@CSTableBot + $0508 ; 23, 9 DCW @@CSTableTop + $00A0, @@CSTableBot + $0508 ; 23, 10 DCW @@CSTableTop + $00A0, @@CSTableBot + $0510 ; 23, 11 DCW @@CSTableTop + $0098, @@CSTableBot + $0510 ; 23, 12 DCW @@CSTableTop + $0098, @@CSTableBot + $0518 ; 23, 13 DCW @@CSTableTop + $0090, @@CSTableBot + $0518 ; 23, 14 DCW @@CSTableTop + $0090, @@CSTableBot + $0520 ; 23, 15 DCW @@CSTableTop + $0088, @@CSTableBot + $0520 ; 23, 16 DCW @@CSTableTop + $0088, @@CSTableBot + $0528 ; 23, 17 DCW @@CSTableTop + $0080, @@CSTableBot + $0528 ; 23, 18 DCW @@CSTableTop + $0080, @@CSTableBot + $0530 ; 23, 19 DCW @@CSTableTop + $0078, @@CSTableBot + $0530 ; 23, 20 DCW @@CSTableTop + $0078, @@CSTableBot + $0538 ; 23, 21 DCW @@CSTableTop + $0070, @@CSTableBot + $0538 ; 23, 22 DCW @@CSTableTop + $0070, @@CSTableBot + $0540 ; 23, 23 DCW @@CSTableTop + $0068, @@CSTableBot + $0540 ; 23, 24 DCW 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 ; 24 DCW @@CSTableTop + $0060, @@CSTableBot + $04E0 ; 24, 0 DCW @@CSTableTop + $0060, @@CSTableBot + $04E8 ; 24, 1 DCW @@CSTableTop + $0058, @@CSTableBot + $04E8 ; 24, 2 DCW @@CSTableTop + $0058, @@CSTableBot + $04F0 ; 24, 3 DCW @@CSTableTop + $0050, @@CSTableBot + $04F0 ; 24, 4 DCW @@CSTableTop + $0050, @@CSTableBot + $04F8 ; 24, 5 DCW @@CSTableTop + $0048, @@CSTableBot + $04F8 ; 24, 6 DCW @@CSTableTop + $0048, @@CSTableBot + $0500 ; 24, 7 DCW @@CSTableTop + $0040, @@CSTableBot + $0500 ; 24, 8 DCW @@CSTableTop + $0040, @@CSTableBot + $0508 ; 24, 9 DCW @@CSTableTop + $0038, @@CSTableBot + $0508 ; 24, 10 DCW @@CSTableTop + $0038, @@CSTableBot + $0510 ; 24, 11 DCW @@CSTableTop + $0030, @@CSTableBot + $0510 ; 24, 12 DCW @@CSTableTop + $0030, @@CSTableBot + $0518 ; 24, 13 DCW @@CSTableTop + $0028, @@CSTableBot + $0518 ; 24, 14 DCW @@CSTableTop + $0028, @@CSTableBot + $0520 ; 24, 15 DCW @@CSTableTop + $0020, @@CSTableBot + $0520 ; 24, 16 DCW @@CSTableTop + $0020, @@CSTableBot + $0528 ; 24, 17 DCW @@CSTableTop + $0018, @@CSTableBot + $0528 ; 24, 18 DCW @@CSTableTop + $0018, @@CSTableBot + $0530 ; 24, 19 DCW @@CSTableTop + $0010, @@CSTableBot + $0530 ; 24, 20 DCW @@CSTableTop + $0010, @@CSTableBot + $0538 ; 24, 21 DCW @@CSTableTop + $0008, @@CSTableBot + $0538 ; 24, 22 DCW @@CSTableTop + $0008, @@CSTableBot + $0540 ; 24, 23 DCW @@CSTableTop + $0000, @@CSTableBot + $0540 ; 24, 24 DCW 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 ENDP ; ------------------------------------------------------------- ; Interrupt routine called during VBLANK InterruptProc PROC PSHR R5 ; Write to the CPU/STIC handshake register. ; Must be done EVERY frame to keep the display enabled. MVO R0, STICHandshake ; Copy the sprite registers from our STIC shadow to the STIC ; MVII #STICSH, R4 ; MVII #STIC, R5 ; Copy 24 words ; MVI@ R4, R0 ; MVO@ R0, R5 ; MVI@ R4, R0 ; MVO@ R0, R5 ; MVI@ R4, R0 ; MVO@ R0, R5 ; MVI@ R4, R0 ; MVO@ R0, R5 ; MVI@ R4, R0 ; MVO@ R0, R5 ; MVI@ R4, R0 ; MVO@ R0, R5 ; MVI@ R4, R0 ; MVO@ R0, R5 ; MVI@ R4, R0 ; MVO@ R0, R5 ; MVI@ R4, R0 ; MVO@ R0, R5 ; MVI@ R4, R0 ; MVO@ R0, R5 ; MVI@ R4, R0 ; MVO@ R0, R5 ; MVI@ R4, R0 ; MVO@ R0, R5 ; MVI@ R4, R0 ; MVO@ R0, R5 ; MVI@ R4, R0 ; MVO@ R0, R5 ; MVI@ R4, R0 ; MVO@ R0, R5 ; MVI@ R4, R0 ; MVO@ R0, R5 ; MVI@ R4, R0 ; MVO@ R0, R5 ; MVI@ R4, R0 ; MVO@ R0, R5 ; MVI@ R4, R0 ; MVO@ R0, R5 ; MVI@ R4, R0 ; MVO@ R0, R5 ; MVI@ R4, R0 ; MVO@ R0, R5 ; MVI@ R4, R0 ; MVO@ R0, R5 ; MVI@ R4, R0 ; MVO@ R0, R5 ; MVI@ R4, R0 ; MVO@ R0, R5 ; JSR R5, CopyMemory ; DCW STIC ; DCW STICSH ; DCW MOBDataSize ; Zero out the STIC interaction table ; CLRR R0 ; MVII #STICInteraction, R4 ; MVO@ R0, R4 ; MVO@ R0, R4 ; MVO@ R0, R4 ; MVO@ R0, R4 ; MVO@ R0, R4 ; MVO@ R0, R4 ; MVO@ R0, R4 ; MVO@ R0, R4 ; Set the appropriate mode MVI Mode, R0 TSTR R0 BNEQ @@CSMode ; Set foreground/background mode MVO R0, STICCardMode ; Copy 15 cards (1/4 of the rendered window) to GRAM MVI CardCopyCount, R2 TSTR R2 BNEQ @@CopyCards MVI DoneRendering, R0 TSTR R0 BEQ @@ProcessControllers @@CopyCards: ; Increment the copy counter and roll it over when it reaches 4 MOVR R2, R0 INCR R0 CMPI #CardCopyRuns, R0 BLT @@CopyCountRollover SUBR R0, R0 @@CopyCountRollover: MVO R0, CardCopyCount ADDI #CardCopyOfs, R2 MVI@ R2, R2 MVII #GRAM, R4 MVII #CartRAM, R5 ADDR R2, R4 ADDR R2, R5 ; Copy 15 cards (14 + 1) MVII #CardCopyRun, R0 @@CopyCard: MVI@ R5, R1 MVO@ R1, R4 MVI@ R5, R1 MVO@ R1, R4 MVI@ R5, R1 MVO@ R1, R4 MVI@ R5, R1 MVO@ R1, R4 MVI@ R5, R1 MVO@ R1, R4 MVI@ R5, R1 MVO@ R1, R4 MVI@ R5, R1 MVO@ R1, R4 MVI@ R5, R1 MVO@ R1, R4 DECR R0 BPL @@CopyCard @@DoneCopyingCards: ; Clear the done rendering flag SUBR R0, R0 MVO R0, DoneRendering @@ProcessControllers: ; Process the controller inputs JSR R5, ReadControllers MVI UpdateAllowed, R0 TSTR R0 BEQ @@IntProcEnd MVII #UpdatePosAndRender, R0 SUBR R1, R1 MVO R1, UpdateAllowed JSRD R5, ScheduleTaskFromISR @@IntProcEnd: PULR R7 @@CSMode: ; Set color stack mode MVI STICCardMode, R0 ; Process the controller inputs ; JSR R5, ReadControllers ; MVI UpdateAllowed, R0 ; TSTR R0 ; BEQ @@IntProcEndCS ; MVI DoneRendering, R0 ; TSTR R0 ; BEQ @@IntProcEndCS ; MVII #UpdatePosAndRender, R0 ; SUBR R1, R1 ; MVO R1, UpdateAllowed ; JSRD R5, ScheduleTaskFromISR @@IntProcEndCS: PULR R7 ENDP ; ------------------------------------------------------------- CardCopyOfs: ; DCW 0, 240 ; 30x2 DCW $0000, $0078, $00F0, $0168 ; 0, 120, 240, 360 ; 15x4 ; DCW 0, 80, 160, 240, 320, 400 ; 10x6 ; DCW 0, 48, 96, 144, 192, 240, 288, 336, 384, 432 ; 6x10 ; DCW 0, 32, 64, 96, 128, 160, 192, 224, 256, 288, 320, 352, 384, 416, 448 ; 4x15 MazeBitMask: DCW $8000, $4000, $2000, $1000 DCW $0800, $0400, $0200, $0100 DCW $0080, $0040, $0020, $0010 DCW $0008, $0004, $0002, $0001 RayBitMask: DCW $0080, $0040, $0020, $0010, $0008, $0004, $0002, $0001 Handlers: DCW KeyHandler, ButtonHandler, DiscHandler ; ------------------------------------------------------------- ; TASK KeyHandler PROC PSHR R5 MOVR R2, R1 SWAP R1 ANDI #$0003, R1 ANDI #$00FF, R2 TSTR R1 BNEQ @@KeyHandlerDone CMPI #$80, R2 BEQ @@KeyHandlerDone CMPI #0, R2 BEQ @@KeyFull CMPI #10, R2 BC @@KeyFull SWAP R2 MVO R2, MaxDistNext B @@KeyHandlerDone @@KeyFull: MVII #FarthestDist, R2 MVO R2, MaxDistNext @@KeyHandlerDone: PULR R7 ENDP ; ------------------------------------------------------------- ; TASK ButtonHandler PROC PSHR R5 MOVR R2, R1 SWAP R1 ANDI #$0003, R1 ANDI #$00FF, R2 TSTR R1 BNEQ @@ButtonHandlerDone CMPI #$80, R2 BEQ @@ButtonHandlerDone MVI Mode, R1 XORI #$0001, R1 MVO R1, Mode TSTR R1 BEQ @@UseGRAM JSR R5, SetCSMode B @@ButtonHandlerDone @@UseGRAM: JSR R5, SetGRAMMode @@ButtonHandlerDone: PULR R7 ENDP ; ------------------------------------------------------------- ; TASK DiscHandler PROC PSHR R5 ; MOVR R2, R1 ; SWAP R1 ; ANDI #$0003, R1 ANDI #$00FF, R2 ; TSTR R1 ; BNEQ @@DiscHandlerDone MVO R2, RotSp @@DiscHandlerDone: PULR R7 ENDP MACRO RestrictMotion(dir, up, right) ; Check if we are crossing the minimum distance threshold vertically and save the result in R4 SUBR R4, R4 MVI YPos, R0 MOVR R0, R3 ANDI #$FF00, R0 IF %up% XORI #MinWallDist, R0 CMPR R0, R3 ; Are we starting past the threshold? BLT @@%dir%_PastVertThreshold CMPR R0, R2 ; Are we ending before the threshold? BGE @@%dir%_NotVert ELSE XORI #($0100 - MinWallDist), R0 CMPR R0, R3 ; Are we starting past the threshold? BGT @@%dir%_PastVertThreshold CMPR R0, R2 ; Are we ending before the threshold? BLE @@%dir%_NotVert ENDI INCR R4 B @@%dir%_NotVert @@%dir%_PastVertThreshold: DECR R4 @@%dir%_NotVert: ; Check if we are crossing the minimum distance threshold horizontally MVI XPos, R0 MOVR R0, R3 ANDI #$FF00, R0 IF %right% XORI #($0100 - MinWallDist), R0 CMPR R0, R3 ; Are we starting past the threshold? BGT @@%dir%_Check_Vert CMPR R0, R1 ; Are we ending before the threshold? BLE @@%dir%_NotHorz ELSE XORI #MinWallDist, R0 CMPR R0, R3 ; Are we starting past the threshold? BLT @@%dir%_Check_Vert CMPR R0, R1 ; Are we ending before the threshold? BGE @@%dir%_NotHorz ENDI ; We are crossing the minimum distance threshold horizontally ; Check for a wall to the right ANDI #$FF00, R3 SWAP R3 IF %right% INCR R3 ELSE DECR R3 ENDI ADDI #@@XMasks, R3 MVI@ R3, R0 ; Get the bit mask ; Get the maze bit mask for this row MVI YPos, R3 ANDI #$FF00, R3 SWAP R3 ADDI #Maze, R3 MVI@ R3, R3 ANDR R0, R3 BNEQ @@%dir%_HitVertWall ; See if we're starting past the vertical threshold TSTR R4 BPL @@%dir%_Check_Vert ; Get the maze bit mask for the row above/below us MVI YPos, R3 ANDI #$FF00, R3 SWAP R3 IF %up% DECR R3 ELSE INCR R3 ENDI ADDI #Maze, R3 MVI@ R3, R3 ANDR R0, R3 BEQ @@%dir%_Check_Vert @@%dir%_HitVertWall: ; We hit a vertical wall MVI XPos, R1 ANDI #$FF00, R1 IF %right% XORI #($0100 - MinWallDist), R1 ELSE XORI #MinWallDist, R1 ENDI B @@%dir%_NotHorz @@%dir%_Check_Vert: ; Check if we are crossing the minimum distance threshold vertically TSTR R4 BEQ @@%dir%_Done ; Get the maze bit mask for the row above/below us MVI YPos, R3 ANDI #$FF00, R3 SWAP R3 IF %up% DECR R3 ELSE INCR R3 ENDI ADDI #Maze, R3 MVI@ R3, R0 ; Check for a wall diagonally MVI XPos, R3 ANDI #$FF00, R3 SWAP R3 IF %right% INCR R3 ELSE DECR R3 ENDI ADDI #@@XMasks, R3 MVI@ R3, R3 ANDR R0, R3 BNEQ @@%dir%_HitHorzWall ; Check for a wall directly above/below MVI XPos, R3 ANDI #$FF00, R3 SWAP R3 ADDI #@@XMasks, R3 MVI@ R3, R3 ANDR R0, R3 BNEQ @@%dir%_HitHorzWall B @@%dir%_Done @@%dir%_NotHorz: ; Check if we are crossing the minimum distance threshold vertically TSTR R4 BEQ @@%dir%_Done ; Get the maze bit mask for the row above/below us MVI YPos, R3 ANDI #$FF00, R3 SWAP R3 IF %up% DECR R3 ELSE INCR R3 ENDI ADDI #Maze, R3 MVI@ R3, R0 ; Check for a wall directly above/below MVI XPos, R3 ANDI #$FF00, R3 SWAP R3 ADDI #@@XMasks, R3 MVI@ R3, R3 ANDR R0, R3 BEQ @@%dir%_Done @@%dir%_HitHorzWall: ; We hit a horizontal wall MVI YPos, R2 ANDI #$FF00, R2 IF %up% XORI #MinWallDist, R2 ELSE XORI #($0100 - MinWallDist), R2 ENDI @@%dir%_Done: MVO R1, XPos ANDI #$00FF, R1 MVO R1, XPosFrac NEGR R1 ADDI #$0100, R1 MVO R1, XPosFracLeft MOVR R2, R0 ANDI #$FF00, R0 SWAP R0 MVO R0, YPosInt NEGR R0 ADDI #(MAZE_HEIGHT - 1), R0 MVO R0, YPosIntOpp MVO R2, YPos ANDI #$00FF, R2 MVO R2, YPosFrac NEGR R2 ADDI #$0100, R2 MVO R2, YPosFracLeft B @@PreventMovement ENDM ; ------------------------------------------------------------- ; TASK UpdatePosAndRender PROC PSHR R5 ; Get the rotation speed index MVI RotSp, R2 ; Check for releases CMPI #EV_RELEASED, R2 BGE @@InvalidRotSpeed ; The index is valid: get the increment value from the table MOVR R2, R3 ADDI #AInc, R3 MVI@ R3, R3 ; Calculate the new heading, accounting for wraparound ADD Angle, R3 BPL @@NoAngleUnderflow ADDI #Scaled360, R3 B @@NoAngleOverflow @@NoAngleUnderflow: CMPI #Scaled360, R3 BLT @@NoAngleOverflow SUBI #Scaled360, R3 @@NoAngleOverflow: ; Set the new heading MVO R3, Angle ; Get the forward motion coefficient ADDI #FInc, R2 MVI@ R2, R4 ; If motion is 0, take a shortcut TSTR R4 BEQ @@PreventMovement ; If heading and speed are unchanged then use the coefficients from last time CMP OldDR, R4 BNEQ @@DifferentMotion CMP OldAngle, R3 BNEQ @@DifferentMotion ; We already have the movement coefficients from last time MVI OldDX, R1 MVI OldDY, R2 B @@CheckMovementBounds @@DifferentMotion: ; Save heading and speed MVO R4, OldDR MVO R3, OldAngle ; Get cos and sin MOVR R3, R1 ADDI #Cos, R3 ADDI #Sin, R1 ; Get cos(angle) in 8.8 fixed-point format MVI@ R3, R3 ; Get sin(angle) in 8.8 fixed-point format MVI@ R1, R1 ; Divide both by 4 SAR R3, 2 SAR R1, 2 ; Calculate where moving will put us MOVR R4, R0 JSR R5, FixedPtMultiplyQS MOVR R4, R0 MOVR R1, R4 MOVR R3, R1 JSR R5, FixedPtMultiplyQS ; r1 = dr * cos(angle) ; r2 = dr * sin(angle) MOVR R4, R2 @@SaveCoefficients: ; Save the calculated values for next time MVO R1, OldDX MVO R2, OldDY @@CheckMovementBounds: ; Will moving in the X direction put us outside the maze? ADD XPos, R1 CMPI #$0FFF, R1 BC @@PreventMovement ; Will moving in the Y direction put us outside the maze? ADD YPos, R2 CMPI #$0FFF, R2 BC @@PreventMovement ; Determine the true movement angle based on whether we're moving forward or backward MVI OldAngle, R3 MVI OldDR, R4 TSTR R4 BPL @@Forward ADDI #Scaled180, R3 CMPI #Scaled360, R3 BLT @@Forward SUBI #Scaled360, R3 @@Forward: ; Check for wall collisions based on movement direction. ; The test allows sliding along a wall if a collision is found. TSTR R3 CMPI #Scaled90, R3 BLE @@MoveSE CMPI #Scaled180, R3 BLE @@MoveSW CMPI #Scaled270, R3 BLE @@MoveNW RestrictMotion(NE, TRUE, TRUE) @@MoveSE: RestrictMotion(SE, FALSE, TRUE) @@MoveSW: RestrictMotion(SW, FALSE, FALSE) @@MoveNW: RestrictMotion(NW, TRUE, FALSE) @@PreventMovement: MVI Mode, R0 TSTR R0 BEQ @@UpdateCards SUBR R0, R0 MVO R0, DoneRendering ; MVII #RenderCS, R0 ; SUBR R1, R1 ; JSRD R5, ScheduleTask JSR R5, RenderCS PULR R7 ; --------------------------------------- @@UpdateCards: MVII #Render, R0 SUBR R1, R1 JSRD R5, ScheduleTask ; Print the X position MVI XPos, R0 MVII #COLOR_RED, R1 MVII #$020E, R4 JSR R5, PrintHex ; Print the Y position MVI YPos, R0 MVII #COLOR_RED, R1 MVII #$0222, R4 JSR R5, PrintHex ; Print the heading MVI Angle, R0 MVII #COLOR_TAN, R1 MVII #$024A, R4 JSR R5, PrintHex PULR R7 ; --------------------------------------- @@InvalidRotSpeed: MVI MaxDistNext, R2 CMP MaxDist, R2 BEQ @@NoKeyPressed MVI Mode, R0 TSTR R0 BEQ @@RenderCards MVII #RenderCS, R0 B @@ScheduleRender @@RenderCards: MVII #Render, R0 @@ScheduleRender: SUBR R1, R1 JSRD R5, ScheduleTask PULR R7 @@NoKeyPressed: MVO R7, UpdateAllowed @@UpdateEnd: PULR R7 @@XMasks: DCW $8000, $4000, $2000, $1000, $0800, $0400, $0200, $0100, $0080, $0040, $0020, $0010, $0008, $0004, $0002, $0001 ENDP ; ------------------------------------------------------------- ; Forward increment table -- one value per disc position FInc: DCW $0000, $0062, $00B5, $00ED, $0100, $00ED, $00B5, $0062 ; E, ENE, NE, NNE, N, NNW, NW, WNW DCW $0000, $FF9E, $FF4B, $FF13, $FF00, $FF13, $FF4B, $FF9E ; W, WSW, SW, SSW, S, SSE, SE, ESE ; ------------------------------------------------------------- ; Heading increment table -- one value per disc position AInc: DCW $0014 ; Turn right max DCW $0012, $000E, $0008, $0000, $FFF8, $FFF2, $FFEE DCW $FFEC ; Turn left max DCW $FFEE, $FFF2, $FFF8, $0000, $0008, $000E, $0012 ; ------------------------------------------------------------- ; Prints a null-terminated string at a particular position and with a particular color PrintStr PROC ; Get the color MVI@ R5, R1 ; $5571 02A9 [. ] ; Get the position MVI@ R5, R4 ; $5572 02AC [. ] B @@PrintStrJsr ; $5573 0200 0007 [.. ] MVI@ R5, R1 ; $5575 02A9 [. ] MVI@ R5, R4 ; $5576 02AC [. ] MVI@ R5, R0 ; $5577 02A8 [. ] PSHR R5 ; $5578 0275 [. ] MOVR R0, R5 ; $5579 0085 [. ] SETC ; $557A 0007 [. ] ; Skip the next instruction INCR R7 ; $557B 000F [. ] @@PrintStrJsr: ; Clear the high bit in the color word to signal our calling convention as JSR R5, ... CLRC ; $557C 0006 [. ] SLL R1 ; $557D 0049 [I ] RRC R1 ; $557E 0071 [q ] B @@PrintStrLoop ; $557F 0200 0006 [.. ] @@OutputChar: ; Output a character SUBI #$0020, R0 ; $5581 0338 0020 [. ] SLL R0, 2 ; $5583 004C [L ] SLL R0 ; $5584 0048 [H ] ADDR R1, R0 ; $5585 00C8 [. ] MVO@ R0, R4 ; $5586 0260 [. ] @@PrintStrLoop: ; Get the string MVI@ R5, R0 ; $5587 02A8 [. ] TSTR R0 ; $5588 0080 [. ] BNEQ @@OutputChar ; $5589 022C 0009 [.. ] ; Found a null terminator ; If the color MSB is 0, return by copying R5 to R7. ; Otherwise, pull R7 off the stack. SLLC R1 ; $558B 0059 [Y ] ADCR R0 ; $558C 0028 [( ] SLR R1 ; $558D 0061 [a ] ; Skip the next instruction if the color MSB was 1 ADDR R0, R7 ; $558E 00C7 [. ] MOVR R5, R7 ; $558F 00AF [. ] @@DonePrintStr: PULR R7 ; $5590 02B7 [. ] ENDP ; ------------------------------------------------------------- ; Clears the screen ClearScreen: MVII #$00F0, R1 ; $5591 02B9 00F0 [.. ] MVII #BACKTAB, R4 ; $5593 02BC 0200 [.. ] ; ------------------------------------------------------------- ; Zeroes memory ; R1 = number of words to clear ; R4 = starting location ZeroMemory: CLRR R0 ; $5595 01C0 [. ] ; ------------------------------------------------------------- ; Fills memory ; R0 = fill value ; R1 = number of words to fill ; R4 = starting location FillMemory PROC MVO@ R0, R4 ; $5596 0260 [. ] DECR R1 ; $5597 0011 [. ] BNEQ FillMemory ; $5598 022C 0003 [.. ] MOVR R5, R7 ; $559A 00AF [. ] ENDP ; ------------------------------------------------------------- ; Copies words from one memory location to another CopyMemory PROC ; Get the destination address MVI@ R5, R4 ; $559B 02AC [. ] ; Get the source address MVI@ R5, R1 ; $559C 02A9 [. ] ; Get the number of words to copy MVI@ R5, R0 ; $559D 02A8 [. ] ; Push the return address on the stack PSHR R5 ; $559E 0275 [. ] ; Copy the source address to R5 MOVR R1, R5 ; $559F 008D [. ] MOVR R0, R1 ; $55A0 0081 [. ] ; R0 = Count / 8 SLR R0, 2 ; $55A1 0064 [d ] SLR R0 ; $55A2 0060 [` ] ; R1 = Count & 7 ANDI #$0007, R1 ; $55A3 03B9 0007 [.. ] ; Use the low three bits of the count to jump to the middle of the copy code block ADDR R1, R1 ; $55A5 00C9 [. ] SUBI #@@CopyLoop, R1 ; $55A6 0339 55BA [.. ] NEGR R1 ; $55A8 0021 [! ] MOVR R1, R7 ; $55A9 008F [. ] @@CopyEightWords: MVI@ R5, R1 ; $55AA 02A9 [. ] MVO@ R1, R4 ; $55AB 0261 [. ] MVI@ R5, R1 ; $55AC 02A9 [. ] MVO@ R1, R4 ; $55AD 0261 [. ] MVI@ R5, R1 ; $55AE 02A9 [. ] MVO@ R1, R4 ; $55AF 0261 [. ] MVI@ R5, R1 ; $55B0 02A9 [. ] MVO@ R1, R4 ; $55B1 0261 [. ] MVI@ R5, R1 ; $55B2 02A9 [. ] MVO@ R1, R4 ; $55B3 0261 [. ] MVI@ R5, R1 ; $55B4 02A9 [. ] MVO@ R1, R4 ; $55B5 0261 [. ] MVI@ R5, R1 ; $55B6 02A9 [. ] MVO@ R1, R4 ; $55B7 0261 [. ] MVI@ R5, R1 ; $55B8 02A9 [. ] MVO@ R1, R4 ; $55B9 0261 [. ] @@CopyLoop: DECR R0 ; $55BA 0010 [. ] BPL @@CopyEightWords ; $55BB 0223 0012 [.. ] PULR R7 ; $55BD 02B7 [. ] ENDP ; ------------------------------------------------------------- ; Signed 16-bit divide -- assumes both terms are positive and the divisor is nonzero UnsafeDivide0 PROC MVII #$0002, R4 CLRR R3 XORR R1, R0 PSHR R0 XORR R1, R0 BNEQ DivBothPos PULR R1 MOVR R5, R7 ENDP ; ------------------------------------------------------------- L55BE: MVI@ R5, R1 ; $55BE 02A9 [. ] MVI@ R5, R2 ; $55BF 02AA [. ] CLRR R3 ; $55C0 01DB [. ] PSHR R3 ; $55C1 0273 [. ] B DivAbsR1 ; $55C2 0200 0012 [.. ] ; ------------------------------------------------------------- L55C4: MVI@ R5, R1 ; $55C4 02A9 [. ] MVI@ R5, R2 ; $55C5 02AA [. ] ; ------------------------------------------------------------- ; Signed 16-bit divide ; ; R0 - Dividend ; R1 - Divisor ; R2 - Precision in result (number of fixed-point bits) ; R3 - Quotient (output) Divide PROC MVII #$0002, R4 CLRR R3 ; $55C6 01DB [. ] XORR R1, R0 ; $55C7 01C8 [. ] PSHR R0 ; $55C8 0270 [. ] XORR R1, R0 ; $55C9 01C8 [. ] BEQ @@DoneDivision ; $55CB 0204 0033 [.3 ] ; R0 != 0 BPL @@DivAbsR0 ; $55CD 0203 0001 [.. ] ; R0 = abs(R0) NEGR R0 ; $55CF 0020 [ ] @@DivAbsR0: TSTR R1 ; $55D0 0089 [. ] BEQ @@DoneDivision ; $55D1 0204 002D [.- ] ; R1 != 0 BPL DivAbsR1 ; $55D3 0203 0001 [.. ] ; R1 = abs(R1) NEGR R1 ; $55D5 0021 [! ] DivAbsR1: TSTR R1 ; $55D6 0089 [. ] BMI @@NegR1 ; $55D7 020B 0010 [.. ] TSTR R0 ; $55D9 0080 [. ] BPL DivBothPos ; $55DA 0203 0006 [.. ] @@NegR0: ; Only get here if R0 < 0 INCR R2 ; $55DC 000A [. ] SLLC R1 ; $55DD 0059 [Y ] BNC @@NegR0 ; $55DE 0229 0003 [.. ] B @@BothNeg ; $55E0 0200 0005 [.. ] DivBothPos: ; R0 > 0 and R1 > 0 INCR R2 ; Increment shift counter SLL R1 ; Double denominator CMPR R1, R0 ; Test R0 - R1 BC DivBothPos ; Loop if not borrow, i.e. if R0 >= R1 @@BothNeg: RRC R1 ; Halve denominator ; At this point d <= n ; Skip the INCR R2 INCR R7 ; $55E8 000F [. ] @@NegR1: INCR R2 ; $55E9 000A [. ] CMPR R3, R2 ; $55EA 015A [. ] BLE @@DoneDivision ; $55EB 0206 0013 [.. ] CMPI #$0008, R2 BLT @@DivideLoopStart ; At least 8 bits to process ; if d < n ; n -= d ; q <<< 1 ; else ; q <<< 0 CMPR R0, R1 ; Test R1 - R0 ADCR R7 ; Only subtract R1 if a CMPR R0, R1 would not set a carry (if R1 < R0) SUBR R1, R0 ; Get here if no carry (if borrow), if R0 > R1, if R1 < R0 RLC R3 ; Rotate in a 1 if R1 <= R0 ; ADDR R4, R7 @@SetQuotientBit1: ; RLC R3 ; Dead code ; SUBR R1, R0 @@DivBit2: ; n could be less than, equal to, or greater than d at this point ; b <<< n, n *= 2 ; if b ; q <<< b ; n -= d ; elseif if d < n ; n -= d ; q <<< 1 ; else ; q <<< 0 SLLC R0 ; If the high bit of R0 is set, automatically rotate it to the quotient and subtract R1 BC @@SetQuotientBit2 CMPR R0, R1 ADCR R7 ; Only subtract R1 if a CMPR R0, R1 would not set a carry (if R1 < R0) SUBR R1, R0 RLC R3 ; Rotate in a 1 if R1 <= R0 ADDR R4, R7 @@SetQuotientBit2: RLC R3 SUBR R1, R0 @@DivBit3: SLLC R0 BC @@SetQuotientBit3 CMPR R0, R1 ADCR R7 ; Only subtract if a CMPR R0, R1 would not set a carry SUBR R1, R0 RLC R3 ADDR R4, R7 @@SetQuotientBit3: RLC R3 SUBR R1, R0 @@DivBit4: SLLC R0 BC @@SetQuotientBit4 CMPR R0, R1 ADCR R7 ; Only subtract if a CMPR R0, R1 would not set a carry SUBR R1, R0 RLC R3 ADDR R4, R7 @@SetQuotientBit4: RLC R3 SUBR R1, R0 @@DivBit5: SLLC R0 BC @@SetQuotientBit5 CMPR R0, R1 ADCR R7 ; Only subtract if a CMPR R0, R1 would not set a carry SUBR R1, R0 RLC R3 ADDR R4, R7 @@SetQuotientBit5: RLC R3 SUBR R1, R0 @@DivBit6: SLLC R0 BC @@SetQuotientBit6 CMPR R0, R1 ADCR R7 ; Only subtract if a CMPR R0, R1 would not set a carry SUBR R1, R0 RLC R3 ADDR R4, R7 @@SetQuotientBit6: RLC R3 SUBR R1, R0 @@DivBit7: SLLC R0 BC @@SetQuotientBit7 CMPR R0, R1 ADCR R7 ; Only subtract if a CMPR R0, R1 would not set a carry SUBR R1, R0 RLC R3 ADDR R4, R7 @@SetQuotientBit7: RLC R3 SUBR R1, R0 @@DivBit8: SLLC R0 BC @@SetQuotientBit8 CMPR R0, R1 ADCR R7 ; Only subtract if a CMPR R0, R1 would not set a carry SUBR R1, R0 RLC R3 ADDR R4, R7 @@SetQuotientBit8: RLC R3 SUBR R1, R0 @@DivBit9: SUBI #$0008, R2 BEQ @@DoneDivision B @@DivideLoopStart ; R2 is a bit counter @@DivideLoop: SLLC R0 ; $55EF 0058 [X ] BC @@SetQuotientBit ; $55F0 0201 0003 [.. ] @@DivideLoopStart: CMPR R0, R1 ADCR R7 ; Only subtract if a CMPR R0, R1 would not set a carry SUBR R1, R0 RLC R3 DECR R2 BNEQ @@DivideLoop B @@DoneDivision @@SetQuotientBit: RLC R3 ; $55F5 0053 [S ] SUBR R1, R0 ; $55F6 0108 [. ] DECR R2 ; $55F7 0012 [. ] BNEQ @@DivideLoop ; $55F8 022C 000A [.. ] @@DoneDivision: PULR R1 ; $5600 02B1 [. ] TSTR R1 ; $5601 0089 [. ] BPL @@DontNegateQuotient ; $5602 0203 0001 [.. ] NEGR R3 ; $5604 0023 [# ] @@DontNegateQuotient: MOVR R5, R7 ; $5605 00AF [. ] ENDP ; ------------------------------------------------------------- ; Signed 16-bit divide -- assumes both terms are positive and the divisor and dividend are nonzero ; ; R0 - Dividend ; R1 - Divisor ; R2 - Precision in result (number of fixed-point bits) ; R3 - Quotient (output) ; ; Does not change R4 UnsafeDivide PROC CLRR R3 @@ShiftLoop: INCR R2 SLL R1 CMPR R1, R0 ; Is the numerator >= denominator? (test n - d) BC @@ShiftLoop ; Carry = not borrow (1 if YES, 2 if NO) RRC R1 ; The MSB of R1 will always be 0 (new carry will be 0) ADDI #@@DivTable, R2 MVI@ R2, R7 @@DivBit31: CMPR R1, R0 ; Is the numerator >= denominator? (test n - d) ADCR R7 ; Carry = not borrow (1 if YES, 2 if NO) INCR R7 ; NO: (carry is 0) SUBR R1, R0 ; YES: subtract the denominator from the numerator (carry will be 1) RLC R3 SLLC R0 ; Double the remainder @@DivBit30: CMPR R1, R0 ADCR R7 INCR R7 SUBR R1, R0 RLC R3 SLLC R0 @@DivBit29: CMPR R1, R0 ADCR R7 INCR R7 SUBR R1, R0 RLC R3 SLLC R0 @@DivBit28: CMPR R1, R0 ADCR R7 INCR R7 SUBR R1, R0 RLC R3 SLLC R0 @@DivBit27: CMPR R1, R0 ADCR R7 INCR R7 SUBR R1, R0 RLC R3 SLLC R0 @@DivBit26: CMPR R1, R0 ADCR R7 INCR R7 SUBR R1, R0 RLC R3 SLLC R0 @@DivBit25: CMPR R1, R0 ADCR R7 INCR R7 SUBR R1, R0 RLC R3 SLLC R0 @@DivBit24: CMPR R1, R0 ADCR R7 INCR R7 SUBR R1, R0 RLC R3 SLLC R0 @@DivBit23: CMPR R1, R0 ADCR R7 INCR R7 SUBR R1, R0 RLC R3 SLLC R0 @@DivBit22: CMPR R1, R0 ADCR R7 INCR R7 SUBR R1, R0 RLC R3 SLLC R0 @@DivBit21: CMPR R1, R0 ADCR R7 INCR R7 SUBR R1, R0 RLC R3 SLLC R0 @@DivBit20: CMPR R1, R0 ADCR R7 INCR R7 SUBR R1, R0 RLC R3 SLLC R0 @@DivBit19: CMPR R1, R0 ADCR R7 INCR R7 SUBR R1, R0 RLC R3 SLLC R0 @@DivBit18: CMPR R1, R0 ADCR R7 INCR R7 SUBR R1, R0 RLC R3 SLLC R0 @@DivBit17: CMPR R1, R0 ADCR R7 INCR R7 SUBR R1, R0 RLC R3 SLLC R0 @@DivBit16: CMPR R1, R0 ADCR R7 INCR R7 SUBR R1, R0 RLC R3 SLLC R0 @@DivBit15: CMPR R1, R0 ADCR R7 INCR R7 SUBR R1, R0 RLC R3 SLLC R0 @@DivBit14: CMPR R1, R0 ADCR R7 INCR R7 SUBR R1, R0 RLC R3 SLLC R0 @@DivBit13: CMPR R1, R0 ADCR R7 INCR R7 SUBR R1, R0 RLC R3 SLLC R0 @@DivBit12: CMPR R1, R0 ADCR R7 INCR R7 SUBR R1, R0 RLC R3 SLLC R0 @@DivBit11: CMPR R1, R0 ADCR R7 INCR R7 SUBR R1, R0 RLC R3 SLLC R0 @@DivBit10: CMPR R1, R0 ADCR R7 INCR R7 SUBR R1, R0 RLC R3 SLLC R0 @@DivBit9: CMPR R1, R0 ADCR R7 INCR R7 SUBR R1, R0 RLC R3 SLLC R0 @@DivBit8: CMPR R1, R0 ADCR R7 INCR R7 SUBR R1, R0 RLC R3 SLLC R0 @@DivBit7: CMPR R1, R0 ADCR R7 INCR R7 SUBR R1, R0 RLC R3 SLLC R0 @@DivBit6: CMPR R1, R0 ADCR R7 INCR R7 SUBR R1, R0 RLC R3 SLLC R0 @@DivBit5: CMPR R1, R0 ADCR R7 INCR R7 SUBR R1, R0 RLC R3 SLLC R0 @@DivBit4: CMPR R1, R0 ADCR R7 INCR R7 SUBR R1, R0 RLC R3 SLLC R0 @@DivBit3: CMPR R1, R0 ADCR R7 INCR R7 SUBR R1, R0 RLC R3 SLLC R0 @@DivBit2: CMPR R1, R0 ADCR R7 INCR R7 SUBR R1, R0 RLC R3 SLLC R0 @@DivBit1: CMPR R1, R0 ADCR R7 INCR R7 SUBR R1, R0 RLC R3 @@DoneDivision: MOVR R5, R7 @@DivTable: DCW @@DoneDivision, @@DivBit1, @@DivBit2, @@DivBit3, @@DivBit4, @@DivBit5, @@DivBit6, @@DivBit7 DCW @@DivBit8, @@DivBit9, @@DivBit10, @@DivBit11, @@DivBit12, @@DivBit13, @@DivBit14, @@DivBit15 DCW @@DivBit16, @@DivBit17, @@DivBit18, @@DivBit19, @@DivBit20, @@DivBit21, @@DivBit22, @@DivBit23 DCW @@DivBit24, @@DivBit25, @@DivBit26, @@DivBit27, @@DivBit28, @@DivBit29, @@DivBit30, @@DivBit31 ENDP MACRO FastDivTest(s, n, last) CMPR R1, R0 BNC @@S%s%_%n% SUBR R1, R0 @@S%s%_%n%: RLC R3 IF %last% = FALSE SLLC R0 ENDI ENDM ; ------------------------------------------------------------- ; Signed 16-bit divide ; Assumes: ; - both terms are positive ; - the divisor and dividend are nonzero ; - the desired precision is three bits ; - 32 <= dividend < 64 ; ; R0 - Dividend ; R1 - Divisor ; R3 - Quotient (output) ; ; Destroys R2 FastDivide PROC MOVR R1, R2 ANDI #$FF00, R2 SWAP R2 ADDI #@@SixMinusLog2Plus1Shift, R2 MVI@ R2, R7 @@SHL0: ; 32 <= Divisor CLRR R3 FastDivTest(0, 1, FALSE) FastDivTest(0, 2, TRUE) MOVR R5, R7 @@SHL1: ; 16 <= Divisor < 32 SUBR R1, R0 ADDR R0, R0 MVII #1, R3 FastDivTest(1, 3, TRUE) MOVR R5, R7 @@SHL2: ; 8 <= Divisor < 16 SLL R1 SUBR R1, R0 ADDR R0, R0 MVII #1, R3 FastDivTest(2, 3, FALSE) FastDivTest(2, 4, TRUE) MOVR R5, R7 @@SHL3: ; 4 <= Divisor < 8 SLL R1, 2 SUBR R1, R0 ADDR R0, R0 MVII #1, R3 FastDivTest(3, 3, FALSE) FastDivTest(3, 4, FALSE) FastDivTest(3, 5, TRUE) MOVR R5, R7 @@SHL4: ; 2 <= Divisor < 4 SLL R1 SLL R1, 2 SUBR R1, R0 ADDR R0, R0 MVII #1, R3 FastDivTest(4, 3, FALSE) FastDivTest(4, 4, FALSE) FastDivTest(4, 5, FALSE) FastDivTest(4, 6, TRUE) MOVR R5, R7 @@SHL5: ; 1 <= Divisor < 2 SLL R1, 2 SLL R1, 2 SUBR R1, R0 ADDR R0, R0 MVII #1, R3 FastDivTest(5, 3, FALSE) FastDivTest(5, 4, FALSE) FastDivTest(5, 5, FALSE) FastDivTest(5, 6, FALSE) FastDivTest(5, 7, TRUE) MOVR R5, R7 @@SHL6: ; Divisor < 1 SLL R1 SLL R1, 2 SLL R1, 2 SUBR R1, R0 ADDR R0, R0 MVII #1, R3 FastDivTest(6, 3, FALSE) FastDivTest(6, 4, FALSE) FastDivTest(6, 5, FALSE) FastDivTest(6, 6, FALSE) FastDivTest(6, 7, FALSE) FastDivTest(6, 8, TRUE) MOVR R5, R7 @@SixMinusLog2Plus1Shift: DCW @@SHL6, @@SHL5, @@SHL4, @@SHL4, @@SHL3, @@SHL3, @@SHL3, @@SHL3, @@SHL2, @@SHL2, @@SHL2, @@SHL2, @@SHL2, @@SHL2, @@SHL2, @@SHL2 DCW @@SHL1, @@SHL1, @@SHL1, @@SHL1, @@SHL1, @@SHL1, @@SHL1, @@SHL1, @@SHL1, @@SHL1, @@SHL1, @@SHL1, @@SHL1, @@SHL1, @@SHL1, @@SHL1 DCW @@SHL0, @@SHL0, @@SHL0, @@SHL0, @@SHL0, @@SHL0, @@SHL0, @@SHL0, @@SHL0, @@SHL0, @@SHL0, @@SHL0, @@SHL0, @@SHL0, @@SHL0, @@SHL0 DCW @@SHL0, @@SHL0, @@SHL0, @@SHL0, @@SHL0, @@SHL0, @@SHL0, @@SHL0, @@SHL0, @@SHL0, @@SHL0, @@SHL0, @@SHL0, @@SHL0, @@SHL0, @@SHL0 DCW @@SHL0, @@SHL0, @@SHL0, @@SHL0, @@SHL0, @@SHL0, @@SHL0, @@SHL0, @@SHL0, @@SHL0, @@SHL0, @@SHL0, @@SHL0, @@SHL0, @@SHL0, @@SHL0 DCW @@SHL0, @@SHL0, @@SHL0, @@SHL0, @@SHL0, @@SHL0, @@SHL0, @@SHL0, @@SHL0, @@SHL0, @@SHL0, @@SHL0, @@SHL0, @@SHL0, @@SHL0, @@SHL0 DCW @@SHL0, @@SHL0, @@SHL0, @@SHL0, @@SHL0, @@SHL0, @@SHL0, @@SHL0, @@SHL0, @@SHL0, @@SHL0, @@SHL0, @@SHL0, @@SHL0, @@SHL0, @@SHL0 DCW @@SHL0, @@SHL0, @@SHL0, @@SHL0, @@SHL0, @@SHL0, @@SHL0, @@SHL0, @@SHL0, @@SHL0, @@SHL0, @@SHL0, @@SHL0, @@SHL0, @@SHL0, @@SHL0 ENDP ; ------------------------------------------------------------- ; Prints a number as a four-digit hexadecimal string ; R0 - the value to print ; R1 - the color to use ; R4 - the destination address PrintHex PROC ; Rotate R0 left by three bits to make initial room for the foreground color MOVR R0, R3 ; $5606 0083 [. ] SLLC R3, 2 ; $5607 005F [_ ] RLC R0, 2 ; $5608 0054 [T ] SLLC R3 ; $5609 005B [[ ] RLC R0 ; $560A 0050 [P ] ; Set the total number of digits to print MVII #$0004, R3 ; $560B 02BB 0004 [.. ] @@HexLoop: ; Rotate R0 left by 4 bits to extract the most-significant digit and store it in R2 MOVR R0, R2 ; $560D 0082 [. ] SLLC R2, 2 ; $560E 005E [^ ] RLC R0, 2 ; $560F 0054 [T ] SLLC R2, 2 ; $5610 005E [^ ] RLC R0, 2 ; $5611 0054 [T ] MOVR R0, R2 ; $5612 0082 [. ] ; Mask out all but the digit we want to print ANDI #$0078, R2 ; $5613 03BA 0078 [.x ] ; See if the digit is 10-15 (A..F) CMPI #$0050, R2 ; $5615 037A 0050 [.P ] BLT @@NotLetter ; $5617 0205 0002 [.. ] ; Convert it from 10-15 (::<=>?@) to A-F ADDI #$0038, R2 ; $5619 02FA 0038 [.8 ] @@NotLetter: ; Convert the adjusted number to a card value ADDI #$0080, R2 ; $561B 02FA 0080 [.. ] ; OR in the color XORR R1, R2 ; $561D 01CA [. ] ; Write the digit MVO@ R2, R4 ; $561E 0262 [. ] ; Loop until finished DECR R3 ; $561F 0013 [. ] BNEQ @@HexLoop ; $5620 022C 0014 [.. ] MOVR R5, R7 ; $5622 00AF [. ] ENDP ; ------------------------------------------------------------- ; Reads the controller inputs ReadControllers PROC PSHR R5 ; Read the right controller MVII #RightController, R1 MVII #RightCtrlData, R2 JSR R5, ReadOneController ; Read the left controller MVII #LeftController, R1 MVII #LeftCtrlData, R2 INCR R7 ; ------------------------------------------------------------- ; Read inputs for a single controller ; ; R1 - Pointer to controller registers ; R2 - Pointer to controller info where information will be stored ReadOneController: PSHR R5 MVI@ R1, R0 MVO@ R0, R2 INCR R2 MVII #CS_MASK, R3 AND@ R2, R3 XORI #$0018, R3 MVO@ R3, R2 ; Read the controller inputs and see if it has changed ; MVI@ R1, R0 ; CMP@ R2, R0 ; BEQ SameInputs ; The inputs have changed ; MVO@ R0, R2 ; Save the raw input value ; INCR R2 ; Point to the timer and status bits ; MVII #CS_MASK, R3 ; AND@ R2, R3 ; XORI #$0018, R3 ; Reset the frame counter to 3 ; MVO@ R3, R2 ; PULR R7 ; ---------------------------------------- SameInputs: ; INCR R2 ; Point to the timer and status bits ; MVI@ R2, R3 ; SUBI #$0008, R3 ; BMI StillTheSame ; MVO@ R3, R2 ; CMPI #$0008, R3 ; BLE Debounced StillTheSame: ; PULR R7 ; ---------------------------------------- ;Debounced: ; The value has been static for 3 frames INCR R2 ; Point to the inverted previous raw input value MOVR R0, R4 XORI #$00FF, R4 ; Invert the raw value CMP@ R2, R4 BEQ DoneReadingController ; If the inverted value is the same, then we're done PSHR R0 ; Save the raw value ANDI #CS_MASK, R3 ; Get the three change-status bits MOVR R3, R4 ANDI #CS_DISC, R4 ; Was the disc status bit set last time around? BEQ CheckSideButtons ; The disc was pressed last time around MVII #$001F, R4 ANDR R0, R4 CMPI #$001F, R4 ; Is a keypad key or the disc depressed? BNEQ KeyOrDiscIsDown QueueDiscReleasedEvent: XORI #CS_DISC, R3 ; Flip the disc status bit JSR R5, QueueReleasedEvent DCW HT_DISC ; Handler type: disc B CheckSideButtons ; ---------------------------------------- KeyOrDiscIsDown: MOVR R0, R4 AND@ R2, R4 ; AND the raw value with the previous inverted raw value BNEQ CheckSideButtons ; Has anything changed? MOVR R3, R4 ; Get the three change-status bits ANDI #CS_SIDEBUTTON, R4 ; Was the side button status bit set last time around? BNEQ CheckSideButtons MOVR R0, R4 XORI #$00FF, R4 ; Invert the raw value MVII #KeypadMasks, R5 CheckKeyMask: CMP@ R5, R4 ; Get the mask BEQ QueueDiscReleasedEvent ; The keys and the disc are mutually exclusive CMPI #SideBtnMasks, R5 ; Loop until we run out of masks BNEQ CheckKeyMask CheckSideButtons: MOVR R3, R4 ANDI #CS_SIDEBUTTON, R4 ; Was the side button status bit set last time around? BEQ CheckKeypad MOVR R0, R4 ; Copy the raw value AND@ R2, R4 ; AND it with byte #3 (the previous inverted raw value) ANDI #$00E0, R4 ; Mask out everything except the side buttons BEQ DoneCheckingForReleases ; Has anything changed? XORI #CS_SIDEBUTTON, R3 ; Flip the side button status bit JSR R5, QueueReleasedEvent DCW HT_SIDEBUTTON ; Handler type: side button B DoneCheckingForReleases ; ---------------------------------------- CheckKeypad: MOVR R3, R4 ; Copy the status bits ANDI #CS_KEYPAD, R4 ; Was the keypad status bit set? BEQ DoneCheckingForReleases XORI #CS_KEYPAD, R3 ; Flip the keypad status bit JSR R5, QueueReleasedEvent DCW HT_KEYPAD ; Handler type: keypad DoneCheckingForReleases: PULR R0 ; Restore the raw input value MVI@ R2, R4 MVO R4, DiscValue ; Save byte #3 (the previous inverted value) to DiscValue XORI #$00FF, R0 ; Invert the raw value MVO@ R0, R2 ; Save the inverted raw value to byte #3 BNEQ SomethingIsPressed ; Nothing is pressed: the raw value was 0xFF DECR R2 ; Point to the timer and status bits MVO@ R0, R2 ; Clear the timer and status bits B DoneReadingController ; ---------------------------------------- SomethingIsPressed: DECR R2 ; Point to the timer and status bits MVO@ R3, R2 ; Save the timer and status bits to byte #2 ANDI #CS_MASK, R3 ; Isolate the three status bits BEQ TestKeypad ; Are any status bits set? ANDI #CS_KEYPAD, R3 ; Is the keypad status bit set? BEQ TestButtons DoneReadingController: PULR R7 ; ---------------------------------------- KeypadMasks: DCW $0028, $0088, $0024, $0044 ; E, C, 9, 8 DCW $0084, $0022, $0042, $0082 ; 7, 6, 5, 4 DCW $0021, $0041, $0081, $0048 ; 3, 2, 1, 0 SideBtnMasks: DCW $00C0, $0060, $00A0 ; Bottom right, bottom left, top DiscMasks: DCW $0012, $0013, $0003, $0001 ; ESE, SE, SSE, S DCW $0011, $0019, $0009, $0008 ; SSW, SW, WSW, W DCW $0018, $001C, $000C, $0004 ; WNW, NW, NNW, N DCW $0014, $0016, $0006, $0002 ; NNE, NE, ENE, E ; ---------------------------------------- TestKeypad: MOVR R0, R4 ; Get the inverted raw input value ANDI #$0010, R4 BNEQ TestButtons ; If this bit is set, something else was pressed MVII #KeypadMasks, R4 MVII #$000B, R5 ; Check all 12 keys TestKeyLoop: CMP@ R4, R0 BEQ KeyPressed DECR R5 BPL TestKeyLoop TestButtons: MVI@ R2, R3 ; Get the three status bits ANDI #CS_SIDEBUTTON, R3 ; Is the side button status bit set? BNEQ TestDisc MVII #SideBtnMasks, R4 MOVR R0, R3 ; Get the inverted raw input value ANDI #$00E0, R3 ; Mask out everything except the side buttons MVII #$0002, R5 ; Test all three side buttons (right, left, top) TestSideButtonLoop: CMP@ R4, R3 BEQ SideButtonPressed DECR R5 BPL TestSideButtonLoop TestDisc: MVI@ R2, R3 ; Get the three status bits ANDI #CS_DISC, R3 ; Is the disc status bit set? BEQ CheckDisc MVI DiscValue, R3 ; See if the disc value has changed XORR R0, R3 ANDI #$001F, R3 BEQ TestPressedDone CheckDisc: MVII #DiscMasks, R4 MOVR R0, R3 ANDI #$001F, R3 MVII #$000F, R5 ; Test all 16 disc positions TestDiscPosLoop: CMP@ R4, R3 BEQ DiscPressed DECR R5 BPL TestDiscPosLoop TestPressedDone: PULR R7 ; ---------------------------------------- KeyPressed: MVI@ R2, R0 ANDI #$00FB, R0 XORI #$0004, R0 MVO@ R0, R2 MVII #HT_KEYPAD, R4 ; Handler type: keypad B QueueControllerEvent ; ---------------------------------------- SideButtonPressed: MVII #TestDisc, R4 PSHR R4 ; Return to TestDisc when done PSHR R0 PSHR R1 PSHR R2 MVII #RestoreState, R0 ; Set our return address PSHR R0 ; Put the return address on the stack MVI@ R2, R0 ANDI #$00FD, R0 XORI #$0002, R0 MVO@ R0, R2 MVII #HT_SIDEBUTTON, R4 ; Handler type: side button B QueueControllerEvent ; ---------------------------------------- DiscPressed: MVI@ R2, R0 ; Get the three status bits ANDI #$00FE, R0 XORI #$0001, R0 MVO@ R0, R2 MVII #HT_DISC, R4 ; Handler type: disc ; ---------------------------------------- QueueControllerEvent: SARC R1 ; Which controller is being checked? BC CheckingLeftController XORI #EV_RTCONTROLLER, R5 CheckingLeftController: MVII #Handlers, R2 ; Get the pointer to the list of handlers ADDR R4, R2 ; Determine which handler type to use (key, button, disc) MVI@ R2, R0 ; Get the pointer to the handler routine TSTR R0 BEQ DoneReadingController ; Skip if there is none MOVR R5, R1 ; Set the parameter to pass to the handler PULR R5 ; Retrieve the return address MVI Mode, R2 TSTR R2 BEQ @@NotCS MOVR R1, R2 MOVR R0, R7 @@NotCS: JD ScheduleTask ; Schedule the handler to run ; ---------------------------------------- QueueReleasedEvent: MVI@ R5, R4 ; Get the handler type (0, 1, or 2) PSHR R5 ; Save the return address (R5 auto-increments) PSHR R0 ; Save the raw input value MVII #EV_RELEASED, R5 PSHR R1 ; Save the pointer to the controller register PSHR R2 ; Save the pointer to the controller info MVII #RestoreState, R0 ; Set our return address PSHR R0 ; Put the return address on the stack B QueueControllerEvent ; ---------------------------------------- RestoreState: PULR R2 ; Restore the pointer to the controller info PULR R1 ; Restore the pointer to the controller register PULR R0 ; Restore the raw input value PULR R7 ENDP ; ------------------------------------------------------------- ; Main program loop. Retrieves tasks from a circular queue ; and executes them. Scheduler PROC PSHR R5 @@ExecuteTaskLoop: MOVR R7, R5 DECR R5 ; Prevent interrupts while we fetch the next task from the queue DIS MVI TaskQueueTail, R1 CMP TaskQueueHead, R1 BEQ @@TaskQueueIsEmpty INCR R1 ANDI #$0007, R1 ; We allow up to 8 tasks MVO R1, TaskQueueTail ; Advance the tail of the circularly linked list MOVR R1, R4 ADDR R4, R4 ADDI #TaskQueue, R4 SDBD MVI@ R4, R2 ADDI #TaskList, R1 MVI@ R1, R0 ; Get the ponter to the routine to run EIS ; Enable interrupts! ; Execute the task MOVR R0, R7 @@TaskQueueIsEmpty: EIS ; MVI EC_LOC, R0 ; CMPI #EC_MAG, R0 ; BNEQ @@ExecuteTaskLoop ; JSR R5, EC_POLL ; Poll the ECS? MVI Mode, R0 TSTR R0 BEQ @@IntProcEndCS JSR R5, ReadControllers MVI UpdateAllowed, R0 TSTR R0 BEQ @@IntProcEndCS SUBR R1, R1 MVO R1, UpdateAllowed JSR R5, UpdatePosAndRender @@IntProcEndCS: B @@ExecuteTaskLoop ENDP ; ------------------------------------------------------------- ; Schedules a task to run ; ; R0 - Pointer to the routine to be scheduled ; R1 - Parameter to pass to the routine ScheduleTaskFromISR PROC MVI TaskQueueHead, R2 ; Check if the task queue is already full INCR R2 ANDI #$0007, R2 ; We allow up to 8 tasks CMP TaskQueueTail, R2 BEQ @@TaskQueueIsFull MVO R2, TaskQueueHead ; Advance the head of the circularly linked list MOVR R2, R4 ADDR R2, R4 ADDI #TaskList, R2 MVO@ R0, R2 ; Insert the routine in the task list ADDI #TaskQueue, R4 MVO@ R1, R4 ; Save the parameter low byte SWAP R1 MVO@ R1, R4 ; Save the parameter high byte @@TaskQueueIsFull: PULR R7 ENDP ; ------------------------------------------------------------- ; Schedules a task to run ; ; R0 - Pointer to the routine to be scheduled ; R1 - Parameter to pass to the routine ScheduleTask PROC MVI TaskQueueHead, R2 ; Check if the task queue is already full INCR R2 ANDI #$0007, R2 ; We allow up to 8 tasks CMP TaskQueueTail, R2 BEQ @@TaskQueueIsFull MVO R2, TaskQueueHead ; Advance the head of the circularly linked list MOVR R2, R4 ADDR R2, R4 ADDI #TaskList, R2 MVO@ R0, R2 ; Insert the routine in the task list ADDI #TaskQueue, R4 MVO@ R1, R4 ; Save the parameter low byte SWAP R1 MVO@ R1, R4 ; Save the parameter high byte @@TaskQueueIsFull: EIS ; Enable interrupts and return MOVR R5, R7 ; If we ever get here, clear the task queue and exit the main loop PSHR R5 JSRD R5, EmptyTaskQueue MVII #@@SchedExit, R0 PULR R5 B ScheduleTask @@SchedExit: PULR R7 ENDP ; ------------------------------------------------------------- EmptyTaskQueue PROC CLRR R1 MVO R1, TaskQueueHead MVO R1, TaskQueueTail MOVR R5, R7 ENDP ; ============================================================= ; NEW MULTIPLICATION ROUTINES (use quarter-square) ; ============================================================= ; ------------------------------------------------------------- ; R2 = R0 * R1, where R0 and R1 are unsigned 8-bit values ; Destroys R1 qs_mpy8 PROC MOVR R0, R2 ; 6 ADDI #@@mid, R1 ; 8 ADDR R1, R2 ; 6 a + b SUBR R0, R1 ; 6 a - b MVI@ R2, R2 ; 8 SUB@ R1, R2 ; 8 JR R5 ; 7 ;---- ; 49 ; Multiplication table ; [T] = (a^2)/4, a = -510..510 (allows multiplying negative numbers) DECLE $FE01, $FD02, $FC04, $FB06, $FA09, $F90C, $F810, $F714 DECLE $F619, $F51E, $F424, $F32A, $F231, $F138, $F040, $EF48 DECLE $EE51, $ED5A, $EC64, $EB6E, $EA79, $E984, $E890, $E79C DECLE $E6A9, $E5B6, $E4C4, $E3D2, $E2E1, $E1F0, $E100, $E010 DECLE $DF21, $DE32, $DD44, $DC56, $DB69, $DA7C, $D990, $D8A4 DECLE $D7B9, $D6CE, $D5E4, $D4FA, $D411, $D328, $D240, $D158 DECLE $D071, $CF8A, $CEA4, $CDBE, $CCD9, $CBF4, $CB10, $CA2C DECLE $C949, $C866, $C784, $C6A2, $C5C1, $C4E0, $C400, $C320 DECLE $C241, $C162, $C084, $BFA6, $BEC9, $BDEC, $BD10, $BC34 DECLE $BB59, $BA7E, $B9A4, $B8CA, $B7F1, $B718, $B640, $B568 DECLE $B491, $B3BA, $B2E4, $B20E, $B139, $B064, $AF90, $AEBC DECLE $ADE9, $AD16, $AC44, $AB72, $AAA1, $A9D0, $A900, $A830 DECLE $A761, $A692, $A5C4, $A4F6, $A429, $A35C, $A290, $A1C4 DECLE $A0F9, $A02E, $9F64, $9E9A, $9DD1, $9D08, $9C40, $9B78 DECLE $9AB1, $99EA, $9924, $985E, $9799, $96D4, $9610, $954C DECLE $9489, $93C6, $9304, $9242, $9181, $90C0, $9000, $8F40 DECLE $8E81, $8DC2, $8D04, $8C46, $8B89, $8ACC, $8A10, $8954 DECLE $8899, $87DE, $8724, $866A, $85B1, $84F8, $8440, $8388 DECLE $82D1, $821A, $8164, $80AE, $7FF9, $7F44, $7E90, $7DDC DECLE $7D29, $7C76, $7BC4, $7B12, $7A61, $79B0, $7900, $7850 DECLE $77A1, $76F2, $7644, $7596, $74E9, $743C, $7390, $72E4 DECLE $7239, $718E, $70E4, $703A, $6F91, $6EE8, $6E40, $6D98 DECLE $6CF1, $6C4A, $6BA4, $6AFE, $6A59, $69B4, $6910, $686C DECLE $67C9, $6726, $6684, $65E2, $6541, $64A0, $6400, $6360 DECLE $62C1, $6222, $6184, $60E6, $6049, $5FAC, $5F10, $5E74 DECLE $5DD9, $5D3E, $5CA4, $5C0A, $5B71, $5AD8, $5A40, $59A8 DECLE $5911, $587A, $57E4, $574E, $56B9, $5624, $5590, $54FC DECLE $5469, $53D6, $5344, $52B2, $5221, $5190, $5100, $5070 DECLE $4FE1, $4F52, $4EC4, $4E36, $4DA9, $4D1C, $4C90, $4C04 DECLE $4B79, $4AEE, $4A64, $49DA, $4951, $48C8, $4840, $47B8 DECLE $4731, $46AA, $4624, $459E, $4519, $4494, $4410, $438C DECLE $4309, $4286, $4204, $4182, $4101, $4080, $4000, $3F80 DECLE $3F01, $3E82, $3E04, $3D86, $3D09, $3C8C, $3C10, $3B94 DECLE $3B19, $3A9E, $3A24, $39AA, $3931, $38B8, $3840, $37C8 DECLE $3751, $36DA, $3664, $35EE, $3579, $3504, $3490, $341C DECLE $33A9, $3336, $32C4, $3252, $31E1, $3170, $3100, $3090 DECLE $3021, $2FB2, $2F44, $2ED6, $2E69, $2DFC, $2D90, $2D24 DECLE $2CB9, $2C4E, $2BE4, $2B7A, $2B11, $2AA8, $2A40, $29D8 DECLE $2971, $290A, $28A4, $283E, $27D9, $2774, $2710, $26AC DECLE $2649, $25E6, $2584, $2522, $24C1, $2460, $2400, $23A0 DECLE $2341, $22E2, $2284, $2226, $21C9, $216C, $2110, $20B4 DECLE $2059, $1FFE, $1FA4, $1F4A, $1EF1, $1E98, $1E40, $1DE8 DECLE $1D91, $1D3A, $1CE4, $1C8E, $1C39, $1BE4, $1B90, $1B3C DECLE $1AE9, $1A96, $1A44, $19F2, $19A1, $1950, $1900, $18B0 DECLE $1861, $1812, $17C4, $1776, $1729, $16DC, $1690, $1644 DECLE $15F9, $15AE, $1564, $151A, $14D1, $1488, $1440, $13F8 DECLE $13B1, $136A, $1324, $12DE, $1299, $1254, $1210, $11CC DECLE $1189, $1146, $1104, $10C2, $1081, $1040, $1000, $0FC0 DECLE $0F81, $0F42, $0F04, $0EC6, $0E89, $0E4C, $0E10, $0DD4 DECLE $0D99, $0D5E, $0D24, $0CEA, $0CB1, $0C78, $0C40, $0C08 DECLE $0BD1, $0B9A, $0B64, $0B2E, $0AF9, $0AC4, $0A90, $0A5C DECLE $0A29, $09F6, $09C4, $0992, $0961, $0930, $0900, $08D0 DECLE $08A1, $0872, $0844, $0816, $07E9, $07BC, $0790, $0764 DECLE $0739, $070E, $06E4, $06BA, $0691, $0668, $0640, $0618 DECLE $05F1, $05CA, $05A4, $057E, $0559, $0534, $0510, $04EC DECLE $04C9, $04A6, $0484, $0462, $0441, $0420, $0400, $03E0 DECLE $03C1, $03A2, $0384, $0366, $0349, $032C, $0310, $02F4 DECLE $02D9, $02BE, $02A4, $028A, $0271, $0258, $0240, $0228 DECLE $0211, $01FA, $01E4, $01CE, $01B9, $01A4, $0190, $017C DECLE $0169, $0156, $0144, $0132, $0121, $0110, $0100, $00F0 DECLE $00E1, $00D2, $00C4, $00B6, $00A9, $009C, $0090, $0084 DECLE $0079, $006E, $0064, $005A, $0051, $0048, $0040, $0038 DECLE $0031, $002A, $0024, $001E, $0019, $0014, $0010, $000C DECLE $0009, $0006, $0004, $0002, $0001, $0000 @@mid: DECLE $0000, $0000, $0001, $0002, $0004, $0006, $0009, $000C ; 00 DECLE $0010, $0014, $0019, $001E, $0024, $002A, $0031, $0038 DECLE $0040, $0048, $0051, $005A, $0064, $006E, $0079, $0084 ; 10 DECLE $0090, $009C, $00A9, $00B6, $00C4, $00D2, $00E1, $00F0 DECLE $0100, $0110, $0121, $0132, $0144, $0156, $0169, $017C ; 20 DECLE $0190, $01A4, $01B9, $01CE, $01E4, $01FA, $0211, $0228 DECLE $0240, $0258, $0271, $028A, $02A4, $02BE, $02D9, $02F4 ; 30 DECLE $0310, $032C, $0349, $0366, $0384, $03A2, $03C1, $03E0 DECLE $0400, $0420, $0441, $0462, $0484, $04A6, $04C9, $04EC ; 40 DECLE $0510, $0534, $0559, $057E, $05A4, $05CA, $05F1, $0618 DECLE $0640, $0668, $0691, $06BA, $06E4, $070E, $0739, $0764 ; 50 DECLE $0790, $07BC, $07E9, $0816, $0844, $0872, $08A1, $08D0 DECLE $0900, $0930, $0961, $0992, $09C4, $09F6, $0A29, $0A5C ; 60 DECLE $0A90, $0AC4, $0AF9, $0B2E, $0B64, $0B9A, $0BD1, $0C08 DECLE $0C40, $0C78, $0CB1, $0CEA, $0D24, $0D5E, $0D99, $0DD4 ; 70 DECLE $0E10, $0E4C, $0E89, $0EC6, $0F04, $0F42, $0F81, $0FC0 DECLE $1000, $1040, $1081, $10C2, $1104, $1146, $1189, $11CC ; 80 DECLE $1210, $1254, $1299, $12DE, $1324, $136A, $13B1, $13F8 DECLE $1440, $1488, $14D1, $151A, $1564, $15AE, $15F9, $1644 ; 90 DECLE $1690, $16DC, $1729, $1776, $17C4, $1812, $1861, $18B0 DECLE $1900, $1950, $19A1, $19F2, $1A44, $1A96, $1AE9, $1B3C ; A0 DECLE $1B90, $1BE4, $1C39, $1C8E, $1CE4, $1D3A, $1D91, $1DE8 DECLE $1E40, $1E98, $1EF1, $1F4A, $1FA4, $1FFE, $2059, $20B4 ; B0 DECLE $2110, $216C, $21C9, $2226, $2284, $22E2, $2341, $23A0 DECLE $2400, $2460, $24C1, $2522, $2584, $25E6, $2649, $26AC ; C0 DECLE $2710, $2774, $27D9, $283E, $28A4, $290A, $2971, $29D8 DECLE $2A40, $2AA8, $2B11, $2B7A, $2BE4, $2C4E, $2CB9, $2D24 ; D0 DECLE $2D90, $2DFC, $2E69, $2ED6, $2F44, $2FB2, $3021, $3090 DECLE $3100, $3170, $31E1, $3252, $32C4, $3336, $33A9, $341C ; E0 DECLE $3490, $3504, $3579, $35EE, $3664, $36DA, $3751, $37C8 DECLE $3840, $38B8, $3931, $39AA, $3A24, $3A9E, $3B19, $3B94 ; F0 DECLE $3C10, $3C8C, $3D09, $3D86, $3E04, $3E82, $3F01, $3F80 DECLE $4000, $4080, $4101, $4182, $4204, $4286, $4309, $438C ; 100 DECLE $4410, $4494, $4519, $459E, $4624, $46AA, $4731, $47B8 DECLE $4840, $48C8, $4951, $49DA, $4A64, $4AEE, $4B79, $4C04 ; 110 DECLE $4C90, $4D1C, $4DA9, $4E36, $4EC4, $4F52, $4FE1, $5070 DECLE $5100, $5190, $5221, $52B2, $5344, $53D6, $5469, $54FC ; 120 DECLE $5590, $5624, $56B9, $574E, $57E4, $587A, $5911, $59A8 DECLE $5A40, $5AD8, $5B71, $5C0A, $5CA4, $5D3E, $5DD9, $5E74 ; 130 DECLE $5F10, $5FAC, $6049, $60E6, $6184, $6222, $62C1, $6360 DECLE $6400, $64A0, $6541, $65E2, $6684, $6726, $67C9, $686C ; 140 DECLE $6910, $69B4, $6A59, $6AFE, $6BA4, $6C4A, $6CF1, $6D98 DECLE $6E40, $6EE8, $6F91, $703A, $70E4, $718E, $7239, $72E4 ; 150 DECLE $7390, $743C, $74E9, $7596, $7644, $76F2, $77A1, $7850 DECLE $7900, $79B0, $7A61, $7B12, $7BC4, $7C76, $7D29, $7DDC ; 160 DECLE $7E90, $7F44, $7FF9, $80AE, $8164, $821A, $82D1, $8388 DECLE $8440, $84F8, $85B1, $866A, $8724, $87DE, $8899, $8954 ; 170 DECLE $8A10, $8ACC, $8B89, $8C46, $8D04, $8DC2, $8E81, $8F40 DECLE $9000, $90C0, $9181, $9242, $9304, $93C6, $9489, $954C ; 180 DECLE $9610, $96D4, $9799, $985E, $9924, $99EA, $9AB1, $9B78 DECLE $9C40, $9D08, $9DD1, $9E9A, $9F64, $A02E, $A0F9, $A1C4 ; 190 DECLE $A290, $A35C, $A429, $A4F6, $A5C4, $A692, $A761, $A830 DECLE $A900, $A9D0, $AAA1, $AB72, $AC44, $AD16, $ADE9, $AEBC ; 1A0 DECLE $AF90, $B064, $B139, $B20E, $B2E4, $B3BA, $B491, $B568 DECLE $B640, $B718, $B7F1, $B8CA, $B9A4, $BA7E, $BB59, $BC34 ; 1B0 DECLE $BD10, $BDEC, $BEC9, $BFA6, $C084, $C162, $C241, $C320 DECLE $C400, $C4E0, $C5C1, $C6A2, $C784, $C866, $C949, $CA2C ; 1C0 DECLE $CB10, $CBF4, $CCD9, $CDBE, $CEA4, $CF8A, $D071, $D158 DECLE $D240, $D328, $D411, $D4FA, $D5E4, $D6CE, $D7B9, $D8A4 ; 1D0 DECLE $D990, $DA7C, $DB69, $DC56, $DD44, $DE32, $DF21, $E010 DECLE $E100, $E1F0, $E2E1, $E3D2, $E4C4, $E5B6, $E6A9, $E79C ; 1E0 DECLE $E890, $E984, $EA79, $EB6E, $EC64, $ED5A, $EE51, $EF48 DECLE $F040, $F138, $F231, $F32A, $F424, $F51E, $F619, $F714 ; 1F0 DECLE $F810, $F90C, $FA09, $FB06, $FC04, $FD02, $FE01 ; Multiplication table 2 ; [T2] = [T] << 8 DECLE $8000, $0100, $8200, $0400, $8600, $0900, $8C00, $1000 DECLE $9400, $1900, $9E00, $2400, $AA00, $3100, $B800, $4000 DECLE $C800, $5100, $DA00, $6400, $EE00, $7900, $0400, $9000 DECLE $1C00, $A900, $3600, $C400, $5200, $E100, $7000, $0000 DECLE $9000, $2100, $B200, $4400, $D600, $6900, $FC00, $9000 DECLE $2400, $B900, $4E00, $E400, $7A00, $1100, $A800, $4000 DECLE $D800, $7100, $0A00, $A400, $3E00, $D900, $7400, $1000 DECLE $AC00, $4900, $E600, $8400, $2200, $C100, $6000, $0000 DECLE $A000, $4100, $E200, $8400, $2600, $C900, $6C00, $1000 DECLE $B400, $5900, $FE00, $A400, $4A00, $F100, $9800, $4000 DECLE $E800, $9100, $3A00, $E400, $8E00, $3900, $E400, $9000 DECLE $3C00, $E900, $9600, $4400, $F200, $A100, $5000, $0000 DECLE $B000, $6100, $1200, $C400, $7600, $2900, $DC00, $9000 DECLE $4400, $F900, $AE00, $6400, $1A00, $D100, $8800, $4000 DECLE $F800, $B100, $6A00, $2400, $DE00, $9900, $5400, $1000 DECLE $CC00, $8900, $4600, $0400, $C200, $8100, $4000, $0000 DECLE $C000, $8100, $4200, $0400, $C600, $8900, $4C00, $1000 DECLE $D400, $9900, $5E00, $2400, $EA00, $B100, $7800, $4000 DECLE $0800, $D100, $9A00, $6400, $2E00, $F900, $C400, $9000 DECLE $5C00, $2900, $F600, $C400, $9200, $6100, $3000, $0000 DECLE $D000, $A100, $7200, $4400, $1600, $E900, $BC00, $9000 DECLE $6400, $3900, $0E00, $E400, $BA00, $9100, $6800, $4000 DECLE $1800, $F100, $CA00, $A400, $7E00, $5900, $3400, $1000 DECLE $EC00, $C900, $A600, $8400, $6200, $4100, $2000, $0000 DECLE $E000, $C100, $A200, $8400, $6600, $4900, $2C00, $1000 DECLE $F400, $D900, $BE00, $A400, $8A00, $7100, $5800, $4000 DECLE $2800, $1100, $FA00, $E400, $CE00, $B900, $A400, $9000 DECLE $7C00, $6900, $5600, $4400, $3200, $2100, $1000, $0000 DECLE $F000, $E100, $D200, $C400, $B600, $A900, $9C00, $9000 DECLE $8400, $7900, $6E00, $6400, $5A00, $5100, $4800, $4000 DECLE $3800, $3100, $2A00, $2400, $1E00, $1900, $1400, $1000 DECLE $0C00, $0900, $0600, $0400, $0200, $0100, $0000 @@mid2: DECLE $0000, $0000, $0100, $0200, $0400, $0600, $0900, $0C00 ; 00 DECLE $1000, $1400, $1900, $1E00, $2400, $2A00, $3100, $3800 DECLE $4000, $4800, $5100, $5A00, $6400, $6E00, $7900, $8400 ; 10 DECLE $9000, $9C00, $A900, $B600, $C400, $D200, $E100, $F000 DECLE $0000, $1000, $2100, $3200, $4400, $5600, $6900, $7C00 ; 20 DECLE $9000, $A400, $B900, $CE00, $E400, $FA00, $1100, $2800 DECLE $4000, $5800, $7100, $8A00, $A400, $BE00, $D900, $F400 ; 30 DECLE $1000, $2C00, $4900, $6600, $8400, $A200, $C100, $E000 DECLE $0000, $2000, $4100, $6200, $8400, $A600, $C900, $EC00 ; 40 DECLE $1000, $3400, $5900, $7E00, $A400, $CA00, $F100, $1800 DECLE $4000, $6800, $9100, $BA00, $E400, $0E00, $3900, $6400 ; 50 DECLE $9000, $BC00, $E900, $1600, $4400, $7200, $A100, $D000 DECLE $0000, $3000, $6100, $9200, $C400, $F600, $2900, $5C00 ; 60 DECLE $9000, $C400, $F900, $2E00, $6400, $9A00, $D100, $0800 DECLE $4000, $7800, $B100, $EA00, $2400, $5E00, $9900, $D400 ; 70 DECLE $1000, $4C00, $8900, $C600, $0400, $4200, $8100, $C000 DECLE $0000, $4000, $8100, $C200, $0400, $4600, $8900, $CC00 ; 80 DECLE $1000, $5400, $9900, $DE00, $2400, $6A00, $B100, $F800 DECLE $4000, $8800, $D100, $1A00, $6400, $AE00, $F900, $4400 ; 90 DECLE $9000, $DC00, $2900, $7600, $C400, $1200, $6100, $B000 DECLE $0000, $5000, $A100, $F200, $4400, $9600, $E900, $3C00 ; A0 DECLE $9000, $E400, $3900, $8E00, $E400, $3A00, $9100, $E800 DECLE $4000, $9800, $F100, $4A00, $A400, $FE00, $5900, $B400 ; B0 DECLE $1000, $6C00, $C900, $2600, $8400, $E200, $4100, $A000 DECLE $0000, $6000, $C100, $2200, $8400, $E600, $4900, $AC00 ; C0 DECLE $1000, $7400, $D900, $3E00, $A400, $0A00, $7100, $D800 DECLE $4000, $A800, $1100, $7A00, $E400, $4E00, $B900, $2400 ; D0 DECLE $9000, $FC00, $6900, $D600, $4400, $B200, $2100, $9000 DECLE $0000, $7000, $E100, $5200, $C400, $3600, $A900, $1C00 ; E0 DECLE $9000, $0400, $7900, $EE00, $6400, $DA00, $5100, $C800 DECLE $4000, $B800, $3100, $AA00, $2400, $9E00, $1900, $9400 ; F0 DECLE $1000, $8C00, $0900, $8600, $0400, $8200, $0100, $8000 DECLE $0000, $8000, $0100, $8200, $0400, $8600, $0900, $8C00 ; 100 DECLE $1000, $9400, $1900, $9E00, $2400, $AA00, $3100, $B800 DECLE $4000, $C800, $5100, $DA00, $6400, $EE00, $7900, $0400 ; 110 DECLE $9000, $1C00, $A900, $3600, $C400, $5200, $E100, $7000 DECLE $0000, $9000, $2100, $B200, $4400, $D600, $6900, $FC00 ; 120 DECLE $9000, $2400, $B900, $4E00, $E400, $7A00, $1100, $A800 DECLE $4000, $D800, $7100, $0A00, $A400, $3E00, $D900, $7400 ; 130 DECLE $1000, $AC00, $4900, $E600, $8400, $2200, $C100, $6000 DECLE $0000, $A000, $4100, $E200, $8400, $2600, $C900, $6C00 ; 140 DECLE $1000, $B400, $5900, $FE00, $A400, $4A00, $F100, $9800 DECLE $4000, $E800, $9100, $3A00, $E400, $8E00, $3900, $E400 ; 150 DECLE $9000, $3C00, $E900, $9600, $4400, $F200, $A100, $5000 DECLE $0000, $B000, $6100, $1200, $C400, $7600, $2900, $DC00 ; 160 DECLE $9000, $4400, $F900, $AE00, $6400, $1A00, $D100, $8800 DECLE $4000, $F800, $B100, $6A00, $2400, $DE00, $9900, $5400 ; 170 DECLE $1000, $CC00, $8900, $4600, $0400, $C200, $8100, $4000 DECLE $0000, $C000, $8100, $4200, $0400, $C600, $8900, $4C00 ; 180 DECLE $1000, $D400, $9900, $5E00, $2400, $EA00, $B100, $7800 DECLE $4000, $0800, $D100, $9A00, $6400, $2E00, $F900, $C400 ; 190 DECLE $9000, $5C00, $2900, $F600, $C400, $9200, $6100, $3000 DECLE $0000, $D000, $A100, $7200, $4400, $1600, $E900, $BC00 ; 1A0 DECLE $9000, $6400, $3900, $0E00, $E400, $BA00, $9100, $6800 DECLE $4000, $1800, $F100, $CA00, $A400, $7E00, $5900, $3400 ; 1B0 DECLE $1000, $EC00, $C900, $A600, $8400, $6200, $4100, $2000 DECLE $0000, $E000, $C100, $A200, $8400, $6600, $4900, $2C00 ; 1C0 DECLE $1000, $F400, $D900, $BE00, $A400, $8A00, $7100, $5800 DECLE $4000, $2800, $1100, $FA00, $E400, $CE00, $B900, $A400 ; 1D0 DECLE $9000, $7C00, $6900, $5600, $4400, $3200, $2100, $1000 DECLE $0000, $F000, $E100, $D200, $C400, $B600, $A900, $9C00 ; 1E0 DECLE $9000, $8400, $7900, $6E00, $6400, $5A00, $5100, $4800 DECLE $4000, $3800, $3100, $2A00, $2400, $1E00, $1900, $1400 ; 1F0 DECLE $1000, $0C00, $0900, $0600, $0400, $0200, $0100 ENDP ; ------------------------------------------------------------- ; Kernel for full multiplication MACRO QS_Mult_Kernel MOVR R0, R4 ANDI #$00FF, R4 ; R4 <-- R0.lo XORR R4, R0 SWAP R0 ; R0 <-- R0.hi >> 8 MOVR R1, R3 ANDI #$00FF, R1 ; R1 <-- R1.lo XORR R1, R3 SWAP R3 ; R3 <-- R1.hi >> 8 ADDI #qs_mpy8.mid, R1 ; 8 ADDI #qs_mpy8.mid, R3 ; 8 ; (R0.lo * R1.lo) >> 8 ADDR R4, R1 ; 6 a + b MVI@ R1, R2 ; 8 SUBR R4, R1 ; 6 a SUBR R4, R1 ; 6 a - b SUB@ R1, R2 ; 8 ADDR R4, R1 ; 6 a SWAP R2 ; 6 ANDI #$00FF, R2 ; 8 ; R0.hi * R1.lo ADDR R0, R1 ; 6 a + b ADD@ R1, R2 ; 8 SUBR R0, R1 ; 6 a SUBR R0, R1 ; 6 a - b SUB@ R1, R2 ; 8 ; R0.lo * R1.hi ADDR R4, R3 ; 6 a + b ADD@ R3, R2 ; 8 SUBR R4, R3 ; 6 a SUBR R4, R3 ; 6 a - b SUB@ R3, R2 ; 8 ADDR R4, R3 ; 6 a ; (R0.hi * R1.hi) << 8 ADDI #(qs_mpy8.mid2-qs_mpy8.mid), R3 ; 8 ADDR R0, R3 ; 6 a + b ADD@ R3, R2 ; 8 SUBR R0, R3 ; 6 a SUBR R0, R3 ; 6 a - b SUB@ R3, R2 ; 8 MOVR R2, R1 ; 6 ENDM ; ------------------------------------------------------------- ; Signed fixed-point multiply using Quarter-Square Multiplication ; where the multiplicands are always either both positive or both ; negative (the result will always be positive) ; ; Inputs ; ; R0 = Multiplicand 1 (in 8.8 fixed-point format) ; R1 = Multiplicand 2 (in 8.8 fixed-point format) ; ; Outputs ; ; R1 = Result (in 8.8 fixed-point format) ; Destroys R2 FixedPtMultiplyQSSameSign PROC ; Save work registers PSHR R3 PSHR R4 TSTR R0 BPL @@PosR0 NEGR R0 NEGR R1 @@PosR0: ; Version that doesn't negate the result QS_Mult_Kernel ; Restore work registers PULR R4 PULR R3 MOVR R5, R7 ENDP ; ------------------------------------------------------------- ; Signed fixed-point multiply using Quarter-Square Multiplication ; where the multiplicands are always either both positive or both ; negative (the result will always be positive). Also, where |R0| ; is always greater than or equal to 1 but less than 2. ; ; Inputs ; ; R0 = Multiplicand 1 (in 8.8 fixed-point format) ; R1 = Multiplicand 2 (in 8.8 fixed-point format) ; ; Outputs ; ; R1 = Result (in 8.8 fixed-point format) ; Destroys R0, R2, and R3 FixedPtMultiplyQSSameSignOneTwo PROC TSTR R0 BPL @@PosR0 NEGR R0 NEGR R1 @@PosR0: ; Version that doesn't negate the result ; Only multiply by R0.lo since R0.hi is always 1 ANDI #$00FF, R0 ; R0 <-- R0.lo MOVR R1, R3 ; R3 <-- R0.hi * R1 = R1 MOVR R1, R2 ANDI #$FF00, R2 XORR R2, R1 ; R1 <-- R1.lo SWAP R2 ; R2 <-- R1.hi SUBR R2, R1 ; 6 ADDI #qs_mpy8.mid, R2 ; 8 ADDR R0, R2 ; 6 a + b ADDR R0, R0 ; 6 ADD@ R2, R3 ; 8 SUBR R0, R2 ; 6 a - b SUB@ R2, R3 ; 8 ADDR R0, R2 ; 6 a + b ; Switch from R1.hi to R1.lo ADDR R1, R2 ; 6 a + b MVI@ R2, R1 ; 8 SUBR R0, R2 ; 6 a - b SUB@ R2, R1 ; 8 SWAP R1 ANDI #$00FF, R1 ADDR R3, R1 MOVR R5, R7 ENDP ; ------------------------------------------------------------- ; Signed fixed-point multiply using Quarter-Square Multiplication ; ; Inputs ; ; R0 = Multiplicand 1 (in 8.8 fixed-point format) ; R1 = Multiplicand 2 (in 8.8 fixed-point format) ; ; Outputs ; ; R1 = Result (in 8.8 fixed-point format) ; Destroys R2 FixedPtMultiplyQS PROC ; Save work registers PSHR R3 PSHR R4 ; Make the multiplicands positive, remembering whether we need to negate the result TSTR R0 BPL @@PosR0 NEGR R0 TSTR R1 BPL @@Neg0Pos1 NEGR R1 @@Neg0Neg1: QS_Mult_Kernel ; Restore work registers PULR R4 PULR R3 MOVR R5, R7 @@Neg0Pos1: QS_Mult_Kernel ; Negate the result NEGR R1 ; Restore work registers PULR R4 PULR R3 MOVR R5, R7 @@PosR0: TSTR R1 BPL @@Pos0Pos1 NEGR R1 @@Pos0Neg1: QS_Mult_Kernel ; Negate the result NEGR R1 ; Restore work registers PULR R4 PULR R3 MOVR R5, R7 @@Pos0Pos1: QS_Mult_Kernel ; Restore work registers PULR R4 PULR R3 MOVR R5, R7 ENDP ; ------------------------------------------------------------- ; Signed fixed-point multiply where R1 is always in the range 0..1 but never exactly 0 ; ; Inputs ; ; R0 = Multiplicand 1 (in 8.8 fixed-point format) ; R1 = Multiplicand 2 (in 8.8 fixed-point format) ; ; Outputs ; ; R3 = Result (in 8.8 fixed-point format) FracFixedPtMultiplyPosNonZero PROC CMPI #$0100, R1 ; Compare to 256 (1.0) BC @@MultByOne ; Branch if above or equal (unsigned compare) TSTR R0 BEQ @@ReturnZero BPL @@FPMulPos0 ; R0 < 0 NEGR R0 QS_Frac_Mult_Kernel(R0, R1, R2, R3) NEGR R3 MOVR R5, R7 ; --------------------- @@FPMulPos0: ; R0 >= 0 QS_Frac_Mult_Kernel(R0, R1, R2, R3) MOVR R5, R7 @@ReturnZero: CLRR R3 MOVR R5, R7 @@MultByOne: MOVR R0, R3 MOVR R5, R7 ENDP ; ------------------------------------------------------------- ; Signed fixed-point multiply where R1 is always in the range -1..0 but never exactly -1 ; ; Inputs ; ; R0 = Multiplicand 1 (in 8.8 fixed-point format) ; R1 = Multiplicand 2 (in 8.8 fixed-point format) ; ; Outputs ; ; R3 = Result (in 8.8 fixed-point format) FracFixedPtMultiplyNegNotNegOne PROC TSTR R1 BEQ @@ReturnZero NEGR R1 TSTR R0 BEQ @@ReturnZero BPL @@FPMulPos0 ; R0 < 0 NEGR R0 QS_Frac_Mult_Kernel(R0, R1, R2, R3) MOVR R5, R7 ; --------------------- @@FPMulPos0: ; R0 >= 0 QS_Frac_Mult_Kernel(R0, R1, R2, R3) NEGR R3 MOVR R5, R7 @@ReturnZero: CLRR R3 MOVR R5, R7 ENDP ; ------------------------------------------------------------- ; Trig tables Tan: ; tan(x), 8.8 fixed-point format, x in 0.750000-degree units DCW $0000, $0003, $0007, $000A, $000D, $0011 ; 0 degrees DCW $0014, $0018, $001B, $001E, $0022, $0025 DCW $0029, $002C, $002F, $0033, $0036, $003A DCW $003D, $0041, $0045, $0048, $004C, $004F DCW $0053, $0057, $005B, $005E, $0062, $0066 DCW $006A, $006E, $0072, $0076, $007A, $007E DCW $0082, $0087, $008B, $008F, $0094, $0098 DCW $009D, $00A2, $00A6, $00AB, $00B0, $00B5 DCW $00BA, $00BF, $00C4, $00CA, $00CF, $00D5 DCW $00DB, $00E1, $00E7, $00ED, $00F3, $00F9 DCW $0100, $0107, $010E, $0115, $011C, $0124 ; 45 degrees DCW $012C, $0134, $013C, $0145, $014E, $0157 DCW $0160, $016A, $0174, $017F, $018A, $0196 DCW $01A2, $01AE, $01BB, $01C9, $01D7, $01E7 DCW $01F6, $0207, $0219, $022B, $023F, $0254 DCW $026A, $0282, $029B, $02B6, $02D3, $02F2 DCW $0314, $0338, $0360, $038C, $03BB, $03F0 DCW $042A, $046B, $04B4, $0507, $0565, $05D2 DCW $0650, $06E6, $0799, $0873, $0984, $0AE2 DCW $0CB5, $0F42, $1315, $1974, $2630, $4C64 DCW $8000, $B39C, $D9D0, $E68C, $ECEB, $F0BE ; 90 degrees DCW $F34B, $F51E, $F67C, $F78D, $F867, $F91A DCW $F9B0, $FA2E, $FA9B, $FAF9, $FB4C, $FB95 DCW $FBD6, $FC10, $FC45, $FC74, $FCA0, $FCC8 DCW $FCEC, $FD0E, $FD2D, $FD4A, $FD65, $FD7E DCW $FD96, $FDAC, $FDC1, $FDD5, $FDE7, $FDF9 DCW $FE0A, $FE19, $FE29, $FE37, $FE45, $FE52 DCW $FE5E, $FE6A, $FE76, $FE81, $FE8C, $FE96 DCW $FEA0, $FEA9, $FEB2, $FEBB, $FEC4, $FECC DCW $FED4, $FEDC, $FEE4, $FEEB, $FEF2, $FEF9 DCW $FF00, $FF07, $FF0D, $FF13, $FF19, $FF1F ; 135 degrees DCW $FF25, $FF2B, $FF31, $FF36, $FF3C, $FF41 DCW $FF46, $FF4B, $FF50, $FF55, $FF5A, $FF5E DCW $FF63, $FF68, $FF6C, $FF71, $FF75, $FF79 DCW $FF7E, $FF82, $FF86, $FF8A, $FF8E, $FF92 DCW $FF96, $FF9A, $FF9E, $FFA2, $FFA5, $FFA9 DCW $FFAD, $FFB1, $FFB4, $FFB8, $FFBB, $FFBF DCW $FFC3, $FFC6, $FFCA, $FFCD, $FFD1, $FFD4 DCW $FFD7, $FFDB, $FFDE, $FFE2, $FFE5, $FFE8 DCW $FFEC, $FFEF, $FFF3, $FFF6, $FFF9, $FFFD DCW $0000, $0003, $0007, $000A, $000D, $0011 ; 180 degrees DCW $0014, $0018, $001B, $001E, $0022, $0025 DCW $0029, $002C, $002F, $0033, $0036, $003A DCW $003D, $0041, $0045, $0048, $004C, $004F DCW $0053, $0057, $005B, $005E, $0062, $0066 DCW $006A, $006E, $0072, $0076, $007A, $007E DCW $0082, $0087, $008B, $008F, $0094, $0098 DCW $009D, $00A2, $00A6, $00AB, $00B0, $00B5 DCW $00BA, $00BF, $00C4, $00CA, $00CF, $00D5 DCW $00DB, $00E1, $00E7, $00ED, $00F3, $00F9 DCW $0100, $0107, $010E, $0115, $011C, $0124 ; 225 degrees DCW $012C, $0134, $013C, $0145, $014E, $0157 DCW $0160, $016A, $0174, $017F, $018A, $0196 DCW $01A2, $01AE, $01BB, $01C9, $01D7, $01E7 DCW $01F6, $0207, $0219, $022B, $023F, $0254 DCW $026A, $0282, $029B, $02B6, $02D3, $02F2 DCW $0314, $0338, $0360, $038C, $03BB, $03F0 DCW $042A, $046B, $04B4, $0507, $0565, $05D2 DCW $0650, $06E6, $0799, $0873, $0984, $0AE2 DCW $0CB5, $0F42, $1315, $1974, $2630, $4C64 DCW $8000, $B39C, $D9D0, $E68C, $ECEB, $F0BE ; 270 degrees DCW $F34B, $F51E, $F67C, $F78D, $F867, $F91A DCW $F9B0, $FA2E, $FA9B, $FAF9, $FB4C, $FB95 DCW $FBD6, $FC10, $FC45, $FC74, $FCA0, $FCC8 DCW $FCEC, $FD0E, $FD2D, $FD4A, $FD65, $FD7E DCW $FD96, $FDAC, $FDC1, $FDD5, $FDE7, $FDF9 DCW $FE0A, $FE19, $FE29, $FE37, $FE45, $FE52 DCW $FE5E, $FE6A, $FE76, $FE81, $FE8C, $FE96 DCW $FEA0, $FEA9, $FEB2, $FEBB, $FEC4, $FECC DCW $FED4, $FEDC, $FEE4, $FEEB, $FEF2, $FEF9 DCW $FF00, $FF07, $FF0D, $FF13, $FF19, $FF1F ; 315 degrees DCW $FF25, $FF2B, $FF31, $FF36, $FF3C, $FF41 DCW $FF46, $FF4B, $FF50, $FF55, $FF5A, $FF5E DCW $FF63, $FF68, $FF6C, $FF71, $FF75, $FF79 DCW $FF7E, $FF82, $FF86, $FF8A, $FF8E, $FF92 DCW $FF96, $FF9A, $FF9E, $FFA2, $FFA5, $FFA9 DCW $FFAD, $FFB1, $FFB4, $FFB8, $FFBB, $FFBF DCW $FFC3, $FFC6, $FFCA, $FFCD, $FFD1, $FFD4 DCW $FFD7, $FFDB, $FFDE, $FFE2, $FFE5, $FFE8 DCW $FFEC, $FFEF, $FFF3, $FFF6, $FFF9, $FFFD Cot: ; cot(x), 8.8 fixed-point format, x in 0.750000-degree units DCW $7FFF, $4C64, $2630, $1974, $1315, $0F42 ; 0 degrees DCW $0CB5, $0AE2, $0984, $0873, $0799, $06E6 DCW $0650, $05D2, $0565, $0507, $04B4, $046B DCW $042A, $03F0, $03BB, $038C, $0360, $0338 DCW $0314, $02F2, $02D3, $02B6, $029B, $0282 DCW $026A, $0254, $023F, $022B, $0219, $0207 DCW $01F6, $01E7, $01D7, $01C9, $01BB, $01AE DCW $01A2, $0196, $018A, $017F, $0174, $016A DCW $0160, $0157, $014E, $0145, $013C, $0134 DCW $012C, $0124, $011C, $0115, $010E, $0107 DCW $0100, $00F9, $00F3, $00ED, $00E7, $00E1 ; 45 degrees DCW $00DB, $00D5, $00CF, $00CA, $00C4, $00BF DCW $00BA, $00B5, $00B0, $00AB, $00A6, $00A2 DCW $009D, $0098, $0094, $008F, $008B, $0087 DCW $0082, $007E, $007A, $0076, $0072, $006E DCW $006A, $0066, $0062, $005E, $005B, $0057 DCW $0053, $004F, $004C, $0048, $0045, $0041 DCW $003D, $003A, $0036, $0033, $002F, $002C DCW $0029, $0025, $0022, $001E, $001B, $0018 DCW $0014, $0011, $000D, $000A, $0007, $0003 DCW $0000, $FFFD, $FFF9, $FFF6, $FFF3, $FFEF ; 90 degrees DCW $FFEC, $FFE8, $FFE5, $FFE2, $FFDE, $FFDB DCW $FFD7, $FFD4, $FFD1, $FFCD, $FFCA, $FFC6 DCW $FFC3, $FFBF, $FFBB, $FFB8, $FFB4, $FFB1 DCW $FFAD, $FFA9, $FFA5, $FFA2, $FF9E, $FF9A DCW $FF96, $FF92, $FF8E, $FF8A, $FF86, $FF82 DCW $FF7E, $FF79, $FF75, $FF71, $FF6C, $FF68 DCW $FF63, $FF5E, $FF5A, $FF55, $FF50, $FF4B DCW $FF46, $FF41, $FF3C, $FF36, $FF31, $FF2B DCW $FF25, $FF1F, $FF19, $FF13, $FF0D, $FF07 DCW $FF00, $FEF9, $FEF2, $FEEB, $FEE4, $FEDC ; 135 degrees DCW $FED4, $FECC, $FEC4, $FEBB, $FEB2, $FEA9 DCW $FEA0, $FE96, $FE8C, $FE81, $FE76, $FE6A DCW $FE5E, $FE52, $FE45, $FE37, $FE29, $FE19 DCW $FE0A, $FDF9, $FDE7, $FDD5, $FDC1, $FDAC DCW $FD96, $FD7E, $FD65, $FD4A, $FD2D, $FD0E DCW $FCEC, $FCC8, $FCA0, $FC74, $FC45, $FC10 DCW $FBD6, $FB95, $FB4C, $FAF9, $FA9B, $FA2E DCW $F9B0, $F91A, $F867, $F78D, $F67C, $F51E DCW $F34B, $F0BE, $ECEB, $E68C, $D9D0, $B39C DCW $7FFF, $4C64, $2630, $1974, $1315, $0F42 ; 180 degrees DCW $0CB5, $0AE2, $0984, $0873, $0799, $06E6 DCW $0650, $05D2, $0565, $0507, $04B4, $046B DCW $042A, $03F0, $03BB, $038C, $0360, $0338 DCW $0314, $02F2, $02D3, $02B6, $029B, $0282 DCW $026A, $0254, $023F, $022B, $0219, $0207 DCW $01F6, $01E7, $01D7, $01C9, $01BB, $01AE DCW $01A2, $0196, $018A, $017F, $0174, $016A DCW $0160, $0157, $014E, $0145, $013C, $0134 DCW $012C, $0124, $011C, $0115, $010E, $0107 DCW $0100, $00F9, $00F3, $00ED, $00E7, $00E1 ; 225 degrees DCW $00DB, $00D5, $00CF, $00CA, $00C4, $00BF DCW $00BA, $00B5, $00B0, $00AB, $00A6, $00A2 DCW $009D, $0098, $0094, $008F, $008B, $0087 DCW $0082, $007E, $007A, $0076, $0072, $006E DCW $006A, $0066, $0062, $005E, $005B, $0057 DCW $0053, $004F, $004C, $0048, $0045, $0041 DCW $003D, $003A, $0036, $0033, $002F, $002C DCW $0029, $0025, $0022, $001E, $001B, $0018 DCW $0014, $0011, $000D, $000A, $0007, $0003 DCW $0000, $FFFD, $FFF9, $FFF6, $FFF3, $FFEF ; 270 degrees DCW $FFEC, $FFE8, $FFE5, $FFE2, $FFDE, $FFDB DCW $FFD7, $FFD4, $FFD1, $FFCD, $FFCA, $FFC6 DCW $FFC3, $FFBF, $FFBB, $FFB8, $FFB4, $FFB1 DCW $FFAD, $FFA9, $FFA5, $FFA2, $FF9E, $FF9A DCW $FF96, $FF92, $FF8E, $FF8A, $FF86, $FF82 DCW $FF7E, $FF79, $FF75, $FF71, $FF6C, $FF68 DCW $FF63, $FF5E, $FF5A, $FF55, $FF50, $FF4B DCW $FF46, $FF41, $FF3C, $FF36, $FF31, $FF2B DCW $FF25, $FF1F, $FF19, $FF13, $FF0D, $FF07 DCW $FF00, $FEF9, $FEF2, $FEEB, $FEE4, $FEDC ; 315 degrees DCW $FED4, $FECC, $FEC4, $FEBB, $FEB2, $FEA9 DCW $FEA0, $FE96, $FE8C, $FE81, $FE76, $FE6A DCW $FE5E, $FE52, $FE45, $FE37, $FE29, $FE19 DCW $FE0A, $FDF9, $FDE7, $FDD5, $FDC1, $FDAC DCW $FD96, $FD7E, $FD65, $FD4A, $FD2D, $FD0E DCW $FCEC, $FCC8, $FCA0, $FC74, $FC45, $FC10 DCW $FBD6, $FB95, $FB4C, $FAF9, $FA9B, $FA2E DCW $F9B0, $F91A, $F867, $F78D, $F67C, $F51E DCW $F34B, $F0BE, $ECEB, $E68C, $D9D0, $B39C XStepPerY: ; cot(x), 8.8 fixed-point format, x in 0.750000-degree units DCW $7FFF, $4C64, $2630, $1974, $1315, $0F42 ; 0 degrees DCW $0CB5, $0AE2, $0984, $0873, $0799, $06E6 DCW $0650, $05D2, $0565, $0507, $04B4, $046B DCW $042A, $03F0, $03BB, $038C, $0360, $0338 DCW $0314, $02F2, $02D3, $02B6, $029B, $0282 DCW $026A, $0254, $023F, $022B, $0219, $0207 DCW $01F6, $01E7, $01D7, $01C9, $01BB, $01AE DCW $01A2, $0196, $018A, $017F, $0174, $016A DCW $0160, $0157, $014E, $0145, $013C, $0134 DCW $012C, $0124, $011C, $0115, $010E, $0107 DCW $0100, $00F9, $00F3, $00ED, $00E7, $00E1 ; 45 degrees DCW $00DB, $00D5, $00CF, $00CA, $00C4, $00BF DCW $00BA, $00B5, $00B0, $00AB, $00A6, $00A2 DCW $009D, $0098, $0094, $008F, $008B, $0087 DCW $0082, $007E, $007A, $0076, $0072, $006E DCW $006A, $0066, $0062, $005E, $005B, $0057 DCW $0053, $004F, $004C, $0048, $0045, $0041 DCW $003D, $003A, $0036, $0033, $002F, $002C DCW $0029, $0025, $0022, $001E, $001B, $0018 DCW $0014, $0011, $000D, $000A, $0007, $0003 DCW $0000, $FFFD, $FFF9, $FFF6, $FFF3, $FFEF ; 90 degrees DCW $FFEC, $FFE8, $FFE5, $FFE2, $FFDE, $FFDB DCW $FFD7, $FFD4, $FFD1, $FFCD, $FFCA, $FFC6 DCW $FFC3, $FFBF, $FFBB, $FFB8, $FFB4, $FFB1 DCW $FFAD, $FFA9, $FFA5, $FFA2, $FF9E, $FF9A DCW $FF96, $FF92, $FF8E, $FF8A, $FF86, $FF82 DCW $FF7E, $FF79, $FF75, $FF71, $FF6C, $FF68 DCW $FF63, $FF5E, $FF5A, $FF55, $FF50, $FF4B DCW $FF46, $FF41, $FF3C, $FF36, $FF31, $FF2B DCW $FF25, $FF1F, $FF19, $FF13, $FF0D, $FF07 DCW $FF00, $FEF9, $FEF2, $FEEB, $FEE4, $FEDC ; 135 degrees DCW $FED4, $FECC, $FEC4, $FEBB, $FEB2, $FEA9 DCW $FEA0, $FE96, $FE8C, $FE81, $FE76, $FE6A DCW $FE5E, $FE52, $FE45, $FE37, $FE29, $FE19 DCW $FE0A, $FDF9, $FDE7, $FDD5, $FDC1, $FDAC DCW $FD96, $FD7E, $FD65, $FD4A, $FD2D, $FD0E DCW $FCEC, $FCC8, $FCA0, $FC74, $FC45, $FC10 DCW $FBD6, $FB95, $FB4C, $FAF9, $FA9B, $FA2E DCW $F9B0, $F91A, $F867, $F78D, $F67C, $F51E DCW $F34B, $F0BE, $ECEB, $E68C, $D9D0, $B39C ; -cot(x), 8.8 fixed-point format, x in 0.750000-degree units DCW $8000, $B39C, $D9D0, $E68C, $ECEB, $F0BE ; 180 degrees DCW $F34B, $F51E, $F67C, $F78D, $F867, $F91A DCW $F9B0, $FA2E, $FA9B, $FAF9, $FB4C, $FB95 DCW $FBD6, $FC10, $FC45, $FC74, $FCA0, $FCC8 DCW $FCEC, $FD0E, $FD2D, $FD4A, $FD65, $FD7E DCW $FD96, $FDAC, $FDC1, $FDD5, $FDE7, $FDF9 DCW $FE0A, $FE19, $FE29, $FE37, $FE45, $FE52 DCW $FE5E, $FE6A, $FE76, $FE81, $FE8C, $FE96 DCW $FEA0, $FEA9, $FEB2, $FEBB, $FEC4, $FECC DCW $FED4, $FEDC, $FEE4, $FEEB, $FEF2, $FEF9 DCW $FF00, $FF07, $FF0D, $FF13, $FF19, $FF1F ; 225 degrees DCW $FF25, $FF2B, $FF31, $FF36, $FF3C, $FF41 DCW $FF46, $FF4B, $FF50, $FF55, $FF5A, $FF5E DCW $FF63, $FF68, $FF6C, $FF71, $FF75, $FF79 DCW $FF7E, $FF82, $FF86, $FF8A, $FF8E, $FF92 DCW $FF96, $FF9A, $FF9E, $FFA2, $FFA5, $FFA9 DCW $FFAD, $FFB1, $FFB4, $FFB8, $FFBB, $FFBF DCW $FFC3, $FFC6, $FFCA, $FFCD, $FFD1, $FFD4 DCW $FFD7, $FFDB, $FFDE, $FFE2, $FFE5, $FFE8 DCW $FFEC, $FFEF, $FFF3, $FFF6, $FFF9, $FFFD DCW $0000, $0003, $0007, $000A, $000D, $0011 ; 270 degrees DCW $0014, $0018, $001B, $001E, $0022, $0025 DCW $0029, $002C, $002F, $0033, $0036, $003A DCW $003D, $0041, $0045, $0048, $004C, $004F DCW $0053, $0057, $005B, $005E, $0062, $0066 DCW $006A, $006E, $0072, $0076, $007A, $007E DCW $0082, $0087, $008B, $008F, $0094, $0098 DCW $009D, $00A2, $00A6, $00AB, $00B0, $00B5 DCW $00BA, $00BF, $00C4, $00CA, $00CF, $00D5 DCW $00DB, $00E1, $00E7, $00ED, $00F3, $00F9 DCW $0100, $0107, $010E, $0115, $011C, $0124 ; 315 degrees DCW $012C, $0134, $013C, $0145, $014E, $0157 DCW $0160, $016A, $0174, $017F, $018A, $0196 DCW $01A2, $01AE, $01BB, $01C9, $01D7, $01E7 DCW $01F6, $0207, $0219, $022B, $023F, $0254 DCW $026A, $0282, $029B, $02B6, $02D3, $02F2 DCW $0314, $0338, $0360, $038C, $03BB, $03F0 DCW $042A, $046B, $04B4, $0507, $0565, $05D2 DCW $0650, $06E6, $0799, $0873, $0984, $0AE2 DCW $0CB5, $0F42, $1315, $1974, $2630, $4C64 YStepPerX: ; tan(x), 8.8 fixed-point format, x in 0.750000-degree units DCW $0000, $0003, $0007, $000A, $000D, $0011 ; 0 degrees DCW $0014, $0018, $001B, $001E, $0022, $0025 DCW $0029, $002C, $002F, $0033, $0036, $003A DCW $003D, $0041, $0045, $0048, $004C, $004F DCW $0053, $0057, $005B, $005E, $0062, $0066 DCW $006A, $006E, $0072, $0076, $007A, $007E DCW $0082, $0087, $008B, $008F, $0094, $0098 DCW $009D, $00A2, $00A6, $00AB, $00B0, $00B5 DCW $00BA, $00BF, $00C4, $00CA, $00CF, $00D5 DCW $00DB, $00E1, $00E7, $00ED, $00F3, $00F9 DCW $0100, $0107, $010E, $0115, $011C, $0124 ; 45 degrees DCW $012C, $0134, $013C, $0145, $014E, $0157 DCW $0160, $016A, $0174, $017F, $018A, $0196 DCW $01A2, $01AE, $01BB, $01C9, $01D7, $01E7 DCW $01F6, $0207, $0219, $022B, $023F, $0254 DCW $026A, $0282, $029B, $02B6, $02D3, $02F2 DCW $0314, $0338, $0360, $038C, $03BB, $03F0 DCW $042A, $046B, $04B4, $0507, $0565, $05D2 DCW $0650, $06E6, $0799, $0873, $0984, $0AE2 DCW $0CB5, $0F42, $1315, $1974, $2630, $4C64 ; -tan(x), 8.8 fixed-point format, x in 0.750000-degree units DCW $7FFF, $4C64, $2630, $1974, $1315, $0F42 ; 90 degrees DCW $0CB5, $0AE2, $0984, $0873, $0799, $06E6 DCW $0650, $05D2, $0565, $0507, $04B4, $046B DCW $042A, $03F0, $03BB, $038C, $0360, $0338 DCW $0314, $02F2, $02D3, $02B6, $029B, $0282 DCW $026A, $0254, $023F, $022B, $0219, $0207 DCW $01F6, $01E7, $01D7, $01C9, $01BB, $01AE DCW $01A2, $0196, $018A, $017F, $0174, $016A DCW $0160, $0157, $014E, $0145, $013C, $0134 DCW $012C, $0124, $011C, $0115, $010E, $0107 DCW $0100, $00F9, $00F3, $00ED, $00E7, $00E1 ; 135 degrees DCW $00DB, $00D5, $00CF, $00CA, $00C4, $00BF DCW $00BA, $00B5, $00B0, $00AB, $00A6, $00A2 DCW $009D, $0098, $0094, $008F, $008B, $0087 DCW $0082, $007E, $007A, $0076, $0072, $006E DCW $006A, $0066, $0062, $005E, $005B, $0057 DCW $0053, $004F, $004C, $0048, $0045, $0041 DCW $003D, $003A, $0036, $0033, $002F, $002C DCW $0029, $0025, $0022, $001E, $001B, $0018 DCW $0014, $0011, $000D, $000A, $0007, $0003 DCW $0000, $FFFD, $FFF9, $FFF6, $FFF3, $FFEF ; 180 degrees DCW $FFEC, $FFE8, $FFE5, $FFE2, $FFDE, $FFDB DCW $FFD7, $FFD4, $FFD1, $FFCD, $FFCA, $FFC6 DCW $FFC3, $FFBF, $FFBB, $FFB8, $FFB4, $FFB1 DCW $FFAD, $FFA9, $FFA5, $FFA2, $FF9E, $FF9A DCW $FF96, $FF92, $FF8E, $FF8A, $FF86, $FF82 DCW $FF7E, $FF79, $FF75, $FF71, $FF6C, $FF68 DCW $FF63, $FF5E, $FF5A, $FF55, $FF50, $FF4B DCW $FF46, $FF41, $FF3C, $FF36, $FF31, $FF2B DCW $FF25, $FF1F, $FF19, $FF13, $FF0D, $FF07 DCW $FF00, $FEF9, $FEF2, $FEEB, $FEE4, $FEDC ; 225 degrees DCW $FED4, $FECC, $FEC4, $FEBB, $FEB2, $FEA9 DCW $FEA0, $FE96, $FE8C, $FE81, $FE76, $FE6A DCW $FE5E, $FE52, $FE45, $FE37, $FE29, $FE19 DCW $FE0A, $FDF9, $FDE7, $FDD5, $FDC1, $FDAC DCW $FD96, $FD7E, $FD65, $FD4A, $FD2D, $FD0E DCW $FCEC, $FCC8, $FCA0, $FC74, $FC45, $FC10 DCW $FBD6, $FB95, $FB4C, $FAF9, $FA9B, $FA2E DCW $F9B0, $F91A, $F867, $F78D, $F67C, $F51E DCW $F34B, $F0BE, $ECEB, $E68C, $D9D0, $B39C ; tan(x), 8.8 fixed-point format, x in 0.750000-degree units DCW $8000, $B39C, $D9D0, $E68C, $ECEB, $F0BE ; 270 degrees DCW $F34B, $F51E, $F67C, $F78D, $F867, $F91A DCW $F9B0, $FA2E, $FA9B, $FAF9, $FB4C, $FB95 DCW $FBD6, $FC10, $FC45, $FC74, $FCA0, $FCC8 DCW $FCEC, $FD0E, $FD2D, $FD4A, $FD65, $FD7E DCW $FD96, $FDAC, $FDC1, $FDD5, $FDE7, $FDF9 DCW $FE0A, $FE19, $FE29, $FE37, $FE45, $FE52 DCW $FE5E, $FE6A, $FE76, $FE81, $FE8C, $FE96 DCW $FEA0, $FEA9, $FEB2, $FEBB, $FEC4, $FECC DCW $FED4, $FEDC, $FEE4, $FEEB, $FEF2, $FEF9 DCW $FF00, $FF07, $FF0D, $FF13, $FF19, $FF1F ; 315 degrees DCW $FF25, $FF2B, $FF31, $FF36, $FF3C, $FF41 DCW $FF46, $FF4B, $FF50, $FF55, $FF5A, $FF5E DCW $FF63, $FF68, $FF6C, $FF71, $FF75, $FF79 DCW $FF7E, $FF82, $FF86, $FF8A, $FF8E, $FF92 DCW $FF96, $FF9A, $FF9E, $FFA2, $FFA5, $FFA9 DCW $FFAD, $FFB1, $FFB4, $FFB8, $FFBB, $FFBF DCW $FFC3, $FFC6, $FFCA, $FFCD, $FFD1, $FFD4 DCW $FFD7, $FFDB, $FFDE, $FFE2, $FFE5, $FFE8 DCW $FFEC, $FFEF, $FFF3, $FFF6, $FFF9, $FFFD SecPixel: ; sec(30 - x), x = 0..60 ; ; 80-element table, used when rendering an 80-pixel-wide bitmap with a ; 60-degree field of view DCW $0128, $0125 ; $A800 0128 0125 [.. ] DCW $0123, $0121 ; $A802 0123 0121 [.. ] DCW $011F, $011D ; $A804 011F 011D [.. ] DCW $011C, $011A ; $A806 011C 011A [.. ] DCW $0118, $0117 ; $A808 0118 0117 [.. ] DCW $0115, $0114 ; $A80A 0115 0114 [.. ] DCW $0112, $0111 ; $A80C 0112 0111 [.. ] DCW $0110, $010E ; $A80E 0110 010E [.. ] DCW $010D, $010C ; $A810 010D 010C [.. ] DCW $010B, $010A ; $A812 010B 010A [.. ] DCW $0109, $0108 ; $A814 0109 0108 [.. ] DCW $0107, $0106 ; $A816 0107 0106 [.. ] DCW $0106, $0105 ; $A818 0106 0105 [.. ] DCW $0104, $0104 ; $A81A 0104 0104 [.. ] DCW $0103, $0103 ; $A81C 0103 0103 [.. ] DCW $0102, $0102 ; $A81E 0102 0102 [.. ] DCW $0101, $0101 ; $A820 0101 0101 [.. ] DCW $0101, $0101 ; $A822 0101 0101 [.. ] DCW $0100, $0100 ; $A824 0100 0100 [.. ] DCW $0100, $0100 ; $A826 0100 0100 [.. ] DCW $0100, $0100 ; $A828 0100 0100 [.. ] DCW $0100, $0100 ; $A82A 0100 0100 [.. ] DCW $0100, $0101 ; $A82C 0100 0101 [.. ] DCW $0101, $0101 ; $A82E 0101 0101 [.. ] DCW $0101, $0102 ; $A830 0101 0102 [.. ] DCW $0102, $0103 ; $A832 0102 0103 [.. ] DCW $0103, $0104 ; $A834 0103 0104 [.. ] DCW $0104, $0105 ; $A836 0104 0105 [.. ] DCW $0106, $0106 ; $A838 0106 0106 [.. ] DCW $0107, $0108 ; $A83A 0107 0108 [.. ] DCW $0109, $010A ; $A83C 0109 010A [.. ] DCW $010B, $010C ; $A83E 010B 010C [.. ] DCW $010D, $010E ; $A840 010D 010E [.. ] DCW $0110, $0111 ; $A842 0110 0111 [.. ] DCW $0112, $0114 ; $A844 0112 0114 [.. ] DCW $0115, $0117 ; $A846 0115 0117 [.. ] DCW $0118, $011A ; $A848 0118 011A [.. ] DCW $011C, $011D ; $A84A 011C 011D [.. ] DCW $011F, $0121 ; $A84C 011F 0121 [.. ] DCW $0123, $0125 ; $A84E 0123 0125 [.. ] SecPixelCS: ; CS_WALL_HEIGHT*sec(x - 29.25), x = 0..59 ; ; 40-element table, used when rendering an 40-pixel-wide bitmap with a ; 60-degree field of view. Precalculated for a unit wall height of 32. DCW $24AD DCW $2429 DCW $23AE DCW $233D DCW $22D4 DCW $2274 DCW $221C DCW $21CB DCW $2182 DCW $2140 DCW $2104 DCW $20CF DCW $20A0 DCW $2078 DCW $2056 DCW $2039 DCW $2023 DCW $2012 DCW $2006 DCW $2001 DCW $2001 DCW $2006 DCW $2012 DCW $2023 DCW $2039 DCW $2056 DCW $2078 DCW $20A0 DCW $20CF DCW $2104 DCW $2140 DCW $2182 DCW $21CB DCW $221C DCW $2274 DCW $22D4 DCW $233D DCW $23AE DCW $2429 DCW $24AD Sec: ; sec(x) = 1 / cos(x), 8.8 fixed-point format, x in 0.750000-degree units DCW $0100, $0100, $0100, $0100, $0100, $0101 ; 0 degrees DCW $0101, $0101, $0101, $0102, $0102, $0103 DCW $0103, $0104, $0104, $0105, $0106, $0106 DCW $0107, $0108, $0109, $010A, $010B, $010C DCW $010D, $010E, $0110, $0111, $0112, $0114 DCW $0115, $0117, $0118, $011A, $011C, $011D DCW $011F, $0121, $0123, $0125, $0128, $012A DCW $012C, $012F, $0131, $0134, $0137, $0139 DCW $013C, $013F, $0143, $0146, $0149, $014D DCW $0151, $0154, $0158, $015D, $0161, $0165 DCW $016A, $016F, $0174, $0179, $017F, $0184 ; 45 degrees DCW $018A, $0190, $0197, $019E, $01A5, $01AC DCW $01B4, $01BC, $01C4, $01CD, $01D6, $01E0 DCW $01EA, $01F5, $0200, $020C, $0219, $0226 DCW $0234, $0243, $0253, $0263, $0275, $0289 DCW $029D, $02B3, $02CA, $02E4, $02FF, $031C DCW $033C, $035F, $0385, $03AF, $03DD, $0410 DCW $0449, $0488, $04CF, $0520, $057D, $05E8 DCW $0664, $06F8, $07A9, $0882, $0991, $0AEE DCW $0CBF, $0F4A, $131B, $1979, $2634, $4C66 DCW $7FFF, $B39A, $D9CC, $E687, $ECE5, $F0B6 ; 90 degrees DCW $F341, $F512, $F66F, $F77E, $F857, $F908 DCW $F99C, $FA18, $FA83, $FAE0, $FB31, $FB78 DCW $FBB7, $FBF0, $FC23, $FC51, $FC7B, $FCA1 DCW $FCC4, $FCE4, $FD01, $FD1C, $FD36, $FD4D DCW $FD63, $FD77, $FD8B, $FD9D, $FDAD, $FDBD DCW $FDCC, $FDDA, $FDE7, $FDF4, $FE00, $FE0B DCW $FE16, $FE20, $FE2A, $FE33, $FE3C, $FE44 DCW $FE4C, $FE54, $FE5B, $FE62, $FE69, $FE70 DCW $FE76, $FE7C, $FE81, $FE87, $FE8C, $FE91 DCW $FE96, $FE9B, $FE9F, $FEA3, $FEA8, $FEAC ; 135 degrees DCW $FEAF, $FEB3, $FEB7, $FEBA, $FEBD, $FEC1 DCW $FEC4, $FEC7, $FEC9, $FECC, $FECF, $FED1 DCW $FED4, $FED6, $FED8, $FEDB, $FEDD, $FEDF DCW $FEE1, $FEE3, $FEE4, $FEE6, $FEE8, $FEE9 DCW $FEEB, $FEEC, $FEEE, $FEEF, $FEF0, $FEF2 DCW $FEF3, $FEF4, $FEF5, $FEF6, $FEF7, $FEF8 DCW $FEF9, $FEFA, $FEFA, $FEFB, $FEFC, $FEFC DCW $FEFD, $FEFD, $FEFE, $FEFE, $FEFF, $FEFF DCW $FEFF, $FEFF, $FF00, $FF00, $FF00, $FF00 DCW $FF00, $FF00, $FF00, $FF00, $FF00, $FEFF ; 180 degrees DCW $FEFF, $FEFF, $FEFF, $FEFE, $FEFE, $FEFD DCW $FEFD, $FEFC, $FEFC, $FEFB, $FEFA, $FEFA DCW $FEF9, $FEF8, $FEF7, $FEF6, $FEF5, $FEF4 DCW $FEF3, $FEF2, $FEF0, $FEEF, $FEEE, $FEEC DCW $FEEB, $FEE9, $FEE8, $FEE6, $FEE4, $FEE3 DCW $FEE1, $FEDF, $FEDD, $FEDB, $FED8, $FED6 DCW $FED4, $FED1, $FECF, $FECC, $FEC9, $FEC7 DCW $FEC4, $FEC1, $FEBD, $FEBA, $FEB7, $FEB3 DCW $FEAF, $FEAC, $FEA8, $FEA3, $FE9F, $FE9B DCW $FE96, $FE91, $FE8C, $FE87, $FE81, $FE7C ; 225 degrees DCW $FE76, $FE70, $FE69, $FE62, $FE5B, $FE54 DCW $FE4C, $FE44, $FE3C, $FE33, $FE2A, $FE20 DCW $FE16, $FE0B, $FE00, $FDF4, $FDE7, $FDDA DCW $FDCC, $FDBD, $FDAD, $FD9D, $FD8B, $FD77 DCW $FD63, $FD4D, $FD36, $FD1C, $FD01, $FCE4 DCW $FCC4, $FCA1, $FC7B, $FC51, $FC23, $FBF0 DCW $FBB7, $FB78, $FB31, $FAE0, $FA83, $FA18 DCW $F99C, $F908, $F857, $F77E, $F66F, $F512 DCW $F341, $F0B6, $ECE5, $E687, $D9CC, $B39A DCW $7FFF, $4C66, $2634, $1979, $131B, $0F4A ; 270 degrees DCW $0CBF, $0AEE, $0991, $0882, $07A9, $06F8 DCW $0664, $05E8, $057D, $0520, $04CF, $0488 DCW $0449, $0410, $03DD, $03AF, $0385, $035F DCW $033C, $031C, $02FF, $02E4, $02CA, $02B3 DCW $029D, $0289, $0275, $0263, $0253, $0243 DCW $0234, $0226, $0219, $020C, $0200, $01F5 DCW $01EA, $01E0, $01D6, $01CD, $01C4, $01BC DCW $01B4, $01AC, $01A5, $019E, $0197, $0190 DCW $018A, $0184, $017F, $0179, $0174, $016F DCW $016A, $0165, $0161, $015D, $0158, $0154 ; 315 degrees DCW $0151, $014D, $0149, $0146, $0143, $013F DCW $013C, $0139, $0137, $0134, $0131, $012F DCW $012C, $012A, $0128, $0125, $0123, $0121 DCW $011F, $011D, $011C, $011A, $0118, $0117 DCW $0115, $0114, $0112, $0111, $0110, $010E DCW $010D, $010C, $010B, $010A, $0109, $0108 DCW $0107, $0106, $0106, $0105, $0104, $0104 DCW $0103, $0103, $0102, $0102, $0101, $0101 DCW $0101, $0101, $0100, $0100, $0100, $0100 Csc: ; csc(x) = 1 / sin(x), 8.8 fixed-point format, x in 0.750000-degree units DCW $7FFF, $4C66, $2634, $1979, $131B, $0F4A ; 0 degrees DCW $0CBF, $0AEE, $0991, $0882, $07A9, $06F8 DCW $0664, $05E8, $057D, $0520, $04CF, $0488 DCW $0449, $0410, $03DD, $03AF, $0385, $035F DCW $033C, $031C, $02FF, $02E4, $02CA, $02B3 DCW $029D, $0289, $0275, $0263, $0253, $0243 DCW $0234, $0226, $0219, $020C, $0200, $01F5 DCW $01EA, $01E0, $01D6, $01CD, $01C4, $01BC DCW $01B4, $01AC, $01A5, $019E, $0197, $0190 DCW $018A, $0184, $017F, $0179, $0174, $016F DCW $016A, $0165, $0161, $015D, $0158, $0154 ; 45 degrees DCW $0151, $014D, $0149, $0146, $0143, $013F DCW $013C, $0139, $0137, $0134, $0131, $012F DCW $012C, $012A, $0128, $0125, $0123, $0121 DCW $011F, $011D, $011C, $011A, $0118, $0117 DCW $0115, $0114, $0112, $0111, $0110, $010E DCW $010D, $010C, $010B, $010A, $0109, $0108 DCW $0107, $0106, $0106, $0105, $0104, $0104 DCW $0103, $0103, $0102, $0102, $0101, $0101 DCW $0101, $0101, $0100, $0100, $0100, $0100 DCW $0100, $0100, $0100, $0100, $0100, $0101 ; 90 degrees DCW $0101, $0101, $0101, $0102, $0102, $0103 DCW $0103, $0104, $0104, $0105, $0106, $0106 DCW $0107, $0108, $0109, $010A, $010B, $010C DCW $010D, $010E, $0110, $0111, $0112, $0114 DCW $0115, $0117, $0118, $011A, $011C, $011D DCW $011F, $0121, $0123, $0125, $0128, $012A DCW $012C, $012F, $0131, $0134, $0137, $0139 DCW $013C, $013F, $0143, $0146, $0149, $014D DCW $0151, $0154, $0158, $015D, $0161, $0165 DCW $016A, $016F, $0174, $0179, $017F, $0184 ; 135 degrees DCW $018A, $0190, $0197, $019E, $01A5, $01AC DCW $01B4, $01BC, $01C4, $01CD, $01D6, $01E0 DCW $01EA, $01F5, $0200, $020C, $0219, $0226 DCW $0234, $0243, $0253, $0263, $0275, $0289 DCW $029D, $02B3, $02CA, $02E4, $02FF, $031C DCW $033C, $035F, $0385, $03AF, $03DD, $0410 DCW $0449, $0488, $04CF, $0520, $057D, $05E8 DCW $0664, $06F8, $07A9, $0882, $0991, $0AEE DCW $0CBF, $0F4A, $131B, $1979, $2634, $4C66 DCW $7FFF, $B39A, $D9CC, $E687, $ECE5, $F0B6 ; 180 degrees DCW $F341, $F512, $F66F, $F77E, $F857, $F908 DCW $F99C, $FA18, $FA83, $FAE0, $FB31, $FB78 DCW $FBB7, $FBF0, $FC23, $FC51, $FC7B, $FCA1 DCW $FCC4, $FCE4, $FD01, $FD1C, $FD36, $FD4D DCW $FD63, $FD77, $FD8B, $FD9D, $FDAD, $FDBD DCW $FDCC, $FDDA, $FDE7, $FDF4, $FE00, $FE0B DCW $FE16, $FE20, $FE2A, $FE33, $FE3C, $FE44 DCW $FE4C, $FE54, $FE5B, $FE62, $FE69, $FE70 DCW $FE76, $FE7C, $FE81, $FE87, $FE8C, $FE91 DCW $FE96, $FE9B, $FE9F, $FEA3, $FEA8, $FEAC ; 225 degrees DCW $FEAF, $FEB3, $FEB7, $FEBA, $FEBD, $FEC1 DCW $FEC4, $FEC7, $FEC9, $FECC, $FECF, $FED1 DCW $FED4, $FED6, $FED8, $FEDB, $FEDD, $FEDF DCW $FEE1, $FEE3, $FEE4, $FEE6, $FEE8, $FEE9 DCW $FEEB, $FEEC, $FEEE, $FEEF, $FEF0, $FEF2 DCW $FEF3, $FEF4, $FEF5, $FEF6, $FEF7, $FEF8 DCW $FEF9, $FEFA, $FEFA, $FEFB, $FEFC, $FEFC DCW $FEFD, $FEFD, $FEFE, $FEFE, $FEFF, $FEFF DCW $FEFF, $FEFF, $FF00, $FF00, $FF00, $FF00 DCW $FF00, $FF00, $FF00, $FF00, $FF00, $FEFF ; 270 degrees DCW $FEFF, $FEFF, $FEFF, $FEFE, $FEFE, $FEFD DCW $FEFD, $FEFC, $FEFC, $FEFB, $FEFA, $FEFA DCW $FEF9, $FEF8, $FEF7, $FEF6, $FEF5, $FEF4 DCW $FEF3, $FEF2, $FEF0, $FEEF, $FEEE, $FEEC DCW $FEEB, $FEE9, $FEE8, $FEE6, $FEE4, $FEE3 DCW $FEE1, $FEDF, $FEDD, $FEDB, $FED8, $FED6 DCW $FED4, $FED1, $FECF, $FECC, $FEC9, $FEC7 DCW $FEC4, $FEC1, $FEBD, $FEBA, $FEB7, $FEB3 DCW $FEAF, $FEAC, $FEA8, $FEA3, $FE9F, $FE9B DCW $FE96, $FE91, $FE8C, $FE87, $FE81, $FE7C ; 315 degrees DCW $FE76, $FE70, $FE69, $FE62, $FE5B, $FE54 DCW $FE4C, $FE44, $FE3C, $FE33, $FE2A, $FE20 DCW $FE16, $FE0B, $FE00, $FDF4, $FDE7, $FDDA DCW $FDCC, $FDBD, $FDAD, $FD9D, $FD8B, $FD77 DCW $FD63, $FD4D, $FD36, $FD1C, $FD01, $FCE4 DCW $FCC4, $FCA1, $FC7B, $FC51, $FC23, $FBF0 DCW $FBB7, $FB78, $FB31, $FAE0, $FA83, $FA18 DCW $F99C, $F908, $F857, $F77E, $F66F, $F512 DCW $F341, $F0B6, $ECE5, $E687, $D9CC, $B39A ORG $C040 AbsSec: ; abs(sec(x)) = abs(1 / cos(x)), 8.8 fixed-point format, x in 0.750000-degree units DCW $0100, $0100, $0100, $0100, $0100, $0101 ; 0 degrees DCW $0101, $0101, $0101, $0102, $0102, $0103 DCW $0103, $0104, $0104, $0105, $0106, $0106 DCW $0107, $0108, $0109, $010A, $010B, $010C DCW $010D, $010E, $0110, $0111, $0112, $0114 DCW $0115, $0117, $0118, $011A, $011C, $011D DCW $011F, $0121, $0123, $0125, $0128, $012A DCW $012C, $012F, $0131, $0134, $0137, $0139 DCW $013C, $013F, $0143, $0146, $0149, $014D DCW $0151, $0154, $0158, $015D, $0161, $0165 DCW $016A, $016F, $0174, $0179, $017F, $0184 ; 45 degrees DCW $018A, $0190, $0197, $019E, $01A5, $01AC DCW $01B4, $01BC, $01C4, $01CD, $01D6, $01E0 DCW $01EA, $01F5, $0200, $020C, $0219, $0226 DCW $0234, $0243, $0253, $0263, $0275, $0289 DCW $029D, $02B3, $02CA, $02E4, $02FF, $031C DCW $033C, $035F, $0385, $03AF, $03DD, $0410 DCW $0449, $0488, $04CF, $0520, $057D, $05E8 DCW $0664, $06F8, $07A9, $0882, $0991, $0AEE DCW $0CBF, $0F4A, $131B, $1979, $2634, $4C66 DCW $7FFF, $4C66, $2634, $1979, $131B, $0F4A ; 90 degrees DCW $0CBF, $0AEE, $0991, $0882, $07A9, $06F8 DCW $0664, $05E8, $057D, $0520, $04CF, $0488 DCW $0449, $0410, $03DD, $03AF, $0385, $035F DCW $033C, $031C, $02FF, $02E4, $02CA, $02B3 DCW $029D, $0289, $0275, $0263, $0253, $0243 DCW $0234, $0226, $0219, $020C, $0200, $01F5 DCW $01EA, $01E0, $01D6, $01CD, $01C4, $01BC DCW $01B4, $01AC, $01A5, $019E, $0197, $0190 DCW $018A, $0184, $017F, $0179, $0174, $016F DCW $016A, $0165, $0161, $015D, $0158, $0154 ; 135 degrees DCW $0151, $014D, $0149, $0146, $0143, $013F DCW $013C, $0139, $0137, $0134, $0131, $012F DCW $012C, $012A, $0128, $0125, $0123, $0121 DCW $011F, $011D, $011C, $011A, $0118, $0117 DCW $0115, $0114, $0112, $0111, $0110, $010E DCW $010D, $010C, $010B, $010A, $0109, $0108 DCW $0107, $0106, $0106, $0105, $0104, $0104 DCW $0103, $0103, $0102, $0102, $0101, $0101 DCW $0101, $0101, $0100, $0100, $0100, $0100 DCW $0100, $0100, $0100, $0100, $0100, $0101 ; 180 degrees DCW $0101, $0101, $0101, $0102, $0102, $0103 DCW $0103, $0104, $0104, $0105, $0106, $0106 DCW $0107, $0108, $0109, $010A, $010B, $010C DCW $010D, $010E, $0110, $0111, $0112, $0114 DCW $0115, $0117, $0118, $011A, $011C, $011D DCW $011F, $0121, $0123, $0125, $0128, $012A DCW $012C, $012F, $0131, $0134, $0137, $0139 DCW $013C, $013F, $0143, $0146, $0149, $014D DCW $0151, $0154, $0158, $015D, $0161, $0165 DCW $016A, $016F, $0174, $0179, $017F, $0184 ; 225 degrees DCW $018A, $0190, $0197, $019E, $01A5, $01AC DCW $01B4, $01BC, $01C4, $01CD, $01D6, $01E0 DCW $01EA, $01F5, $0200, $020C, $0219, $0226 DCW $0234, $0243, $0253, $0263, $0275, $0289 DCW $029D, $02B3, $02CA, $02E4, $02FF, $031C DCW $033C, $035F, $0385, $03AF, $03DD, $0410 DCW $0449, $0488, $04CF, $0520, $057D, $05E8 DCW $0664, $06F8, $07A9, $0882, $0991, $0AEE DCW $0CBF, $0F4A, $131B, $1979, $2634, $4C66 DCW $7FFF, $4C66, $2634, $1979, $131B, $0F4A ; 270 degrees DCW $0CBF, $0AEE, $0991, $0882, $07A9, $06F8 DCW $0664, $05E8, $057D, $0520, $04CF, $0488 DCW $0449, $0410, $03DD, $03AF, $0385, $035F DCW $033C, $031C, $02FF, $02E4, $02CA, $02B3 DCW $029D, $0289, $0275, $0263, $0253, $0243 DCW $0234, $0226, $0219, $020C, $0200, $01F5 DCW $01EA, $01E0, $01D6, $01CD, $01C4, $01BC DCW $01B4, $01AC, $01A5, $019E, $0197, $0190 DCW $018A, $0184, $017F, $0179, $0174, $016F DCW $016A, $0165, $0161, $015D, $0158, $0154 ; 315 degrees DCW $0151, $014D, $0149, $0146, $0143, $013F DCW $013C, $0139, $0137, $0134, $0131, $012F DCW $012C, $012A, $0128, $0125, $0123, $0121 DCW $011F, $011D, $011C, $011A, $0118, $0117 DCW $0115, $0114, $0112, $0111, $0110, $010E DCW $010D, $010C, $010B, $010A, $0109, $0108 DCW $0107, $0106, $0106, $0105, $0104, $0104 DCW $0103, $0103, $0102, $0102, $0101, $0101 DCW $0101, $0101, $0100, $0100, $0100, $0100 AbsCsc: ; abs(csc(x)) = abs(1 / sin(x)), 8.8 fixed-point format, x in 0.750000-degree units DCW $7FFF, $4C66, $2634, $1979, $131B, $0F4A ; 0 degrees DCW $0CBF, $0AEE, $0991, $0882, $07A9, $06F8 DCW $0664, $05E8, $057D, $0520, $04CF, $0488 DCW $0449, $0410, $03DD, $03AF, $0385, $035F DCW $033C, $031C, $02FF, $02E4, $02CA, $02B3 DCW $029D, $0289, $0275, $0263, $0253, $0243 DCW $0234, $0226, $0219, $020C, $0200, $01F5 DCW $01EA, $01E0, $01D6, $01CD, $01C4, $01BC DCW $01B4, $01AC, $01A5, $019E, $0197, $0190 DCW $018A, $0184, $017F, $0179, $0174, $016F DCW $016A, $0165, $0161, $015D, $0158, $0154 ; 45 degrees DCW $0151, $014D, $0149, $0146, $0143, $013F DCW $013C, $0139, $0137, $0134, $0131, $012F DCW $012C, $012A, $0128, $0125, $0123, $0121 DCW $011F, $011D, $011C, $011A, $0118, $0117 DCW $0115, $0114, $0112, $0111, $0110, $010E DCW $010D, $010C, $010B, $010A, $0109, $0108 DCW $0107, $0106, $0106, $0105, $0104, $0104 DCW $0103, $0103, $0102, $0102, $0101, $0101 DCW $0101, $0101, $0100, $0100, $0100, $0100 DCW $0100, $0100, $0100, $0100, $0100, $0101 ; 90 degrees DCW $0101, $0101, $0101, $0102, $0102, $0103 DCW $0103, $0104, $0104, $0105, $0106, $0106 DCW $0107, $0108, $0109, $010A, $010B, $010C DCW $010D, $010E, $0110, $0111, $0112, $0114 DCW $0115, $0117, $0118, $011A, $011C, $011D DCW $011F, $0121, $0123, $0125, $0128, $012A DCW $012C, $012F, $0131, $0134, $0137, $0139 DCW $013C, $013F, $0143, $0146, $0149, $014D DCW $0151, $0154, $0158, $015D, $0161, $0165 DCW $016A, $016F, $0174, $0179, $017F, $0184 ; 135 degrees DCW $018A, $0190, $0197, $019E, $01A5, $01AC DCW $01B4, $01BC, $01C4, $01CD, $01D6, $01E0 DCW $01EA, $01F5, $0200, $020C, $0219, $0226 DCW $0234, $0243, $0253, $0263, $0275, $0289 DCW $029D, $02B3, $02CA, $02E4, $02FF, $031C DCW $033C, $035F, $0385, $03AF, $03DD, $0410 DCW $0449, $0488, $04CF, $0520, $057D, $05E8 DCW $0664, $06F8, $07A9, $0882, $0991, $0AEE DCW $0CBF, $0F4A, $131B, $1979, $2634, $4C66 DCW $7FFF, $4C66, $2634, $1979, $131B, $0F4A ; 180 degrees DCW $0CBF, $0AEE, $0991, $0882, $07A9, $06F8 DCW $0664, $05E8, $057D, $0520, $04CF, $0488 DCW $0449, $0410, $03DD, $03AF, $0385, $035F DCW $033C, $031C, $02FF, $02E4, $02CA, $02B3 DCW $029D, $0289, $0275, $0263, $0253, $0243 DCW $0234, $0226, $0219, $020C, $0200, $01F5 DCW $01EA, $01E0, $01D6, $01CD, $01C4, $01BC DCW $01B4, $01AC, $01A5, $019E, $0197, $0190 DCW $018A, $0184, $017F, $0179, $0174, $016F DCW $016A, $0165, $0161, $015D, $0158, $0154 ; 225 degrees DCW $0151, $014D, $0149, $0146, $0143, $013F DCW $013C, $0139, $0137, $0134, $0131, $012F DCW $012C, $012A, $0128, $0125, $0123, $0121 DCW $011F, $011D, $011C, $011A, $0118, $0117 DCW $0115, $0114, $0112, $0111, $0110, $010E DCW $010D, $010C, $010B, $010A, $0109, $0108 DCW $0107, $0106, $0106, $0105, $0104, $0104 DCW $0103, $0103, $0102, $0102, $0101, $0101 DCW $0101, $0101, $0100, $0100, $0100, $0100 DCW $0100, $0100, $0100, $0100, $0100, $0101 ; 270 degrees DCW $0101, $0101, $0101, $0102, $0102, $0103 DCW $0103, $0104, $0104, $0105, $0106, $0106 DCW $0107, $0108, $0109, $010A, $010B, $010C DCW $010D, $010E, $0110, $0111, $0112, $0114 DCW $0115, $0117, $0118, $011A, $011C, $011D DCW $011F, $0121, $0123, $0125, $0128, $012A DCW $012C, $012F, $0131, $0134, $0137, $0139 DCW $013C, $013F, $0143, $0146, $0149, $014D DCW $0151, $0154, $0158, $015D, $0161, $0165 DCW $016A, $016F, $0174, $0179, $017F, $0184 ; 315 degrees DCW $018A, $0190, $0197, $019E, $01A5, $01AC DCW $01B4, $01BC, $01C4, $01CD, $01D6, $01E0 DCW $01EA, $01F5, $0200, $020C, $0219, $0226 DCW $0234, $0243, $0253, $0263, $0275, $0289 DCW $029D, $02B3, $02CA, $02E4, $02FF, $031C DCW $033C, $035F, $0385, $03AF, $03DD, $0410 DCW $0449, $0488, $04CF, $0520, $057D, $05E8 DCW $0664, $06F8, $07A9, $0882, $0991, $0AEE DCW $0CBF, $0F4A, $131B, $1979, $2634, $4C66 Cos: ; cos(x), 8.8 fixed-point format, x in 0.750000-degree units DCW $0100, $0100, $0100, $0100, $0100, $00FF ; 0 degrees DCW $00FF, $00FF, $00FF, $00FE, $00FE, $00FD DCW $00FD, $00FC, $00FC, $00FB, $00FA, $00FA DCW $00F9, $00F8, $00F7, $00F6, $00F5, $00F4 DCW $00F3, $00F2, $00F1, $00F0, $00EF, $00EE DCW $00ED, $00EB, $00EA, $00E8, $00E7, $00E6 DCW $00E4, $00E3, $00E1, $00DF, $00DE, $00DC DCW $00DA, $00D9, $00D7, $00D5, $00D3, $00D1 DCW $00CF, $00CD, $00CB, $00C9, $00C7, $00C5 DCW $00C3, $00C0, $00BE, $00BC, $00BA, $00B7 DCW $00B5, $00B3, $00B0, $00AE, $00AB, $00A9 ; 45 degrees DCW $00A6, $00A4, $00A1, $009E, $009C, $0099 DCW $0096, $0094, $0091, $008E, $008B, $0089 DCW $0086, $0083, $0080, $007D, $007A, $0077 DCW $0074, $0071, $006E, $006B, $0068, $0065 DCW $0062, $005F, $005C, $0059, $0055, $0052 DCW $004F, $004C, $0049, $0045, $0042, $003F DCW $003C, $0038, $0035, $0032, $002F, $002B DCW $0028, $0025, $0021, $001E, $001B, $0017 DCW $0014, $0011, $000D, $000A, $0007, $0003 DCW $0000, $FFFD, $FFF9, $FFF6, $FFF3, $FFEF ; 90 degrees DCW $FFEC, $FFE9, $FFE5, $FFE2, $FFDF, $FFDB DCW $FFD8, $FFD5, $FFD1, $FFCE, $FFCB, $FFC8 DCW $FFC4, $FFC1, $FFBE, $FFBB, $FFB7, $FFB4 DCW $FFB1, $FFAE, $FFAB, $FFA7, $FFA4, $FFA1 DCW $FF9E, $FF9B, $FF98, $FF95, $FF92, $FF8F DCW $FF8C, $FF89, $FF86, $FF83, $FF80, $FF7D DCW $FF7A, $FF77, $FF75, $FF72, $FF6F, $FF6C DCW $FF6A, $FF67, $FF64, $FF62, $FF5F, $FF5C DCW $FF5A, $FF57, $FF55, $FF52, $FF50, $FF4D DCW $FF4B, $FF49, $FF46, $FF44, $FF42, $FF40 ; 135 degrees DCW $FF3D, $FF3B, $FF39, $FF37, $FF35, $FF33 DCW $FF31, $FF2F, $FF2D, $FF2B, $FF29, $FF27 DCW $FF26, $FF24, $FF22, $FF21, $FF1F, $FF1D DCW $FF1C, $FF1A, $FF19, $FF18, $FF16, $FF15 DCW $FF13, $FF12, $FF11, $FF10, $FF0F, $FF0E DCW $FF0D, $FF0C, $FF0B, $FF0A, $FF09, $FF08 DCW $FF07, $FF06, $FF06, $FF05, $FF04, $FF04 DCW $FF03, $FF03, $FF02, $FF02, $FF01, $FF01 DCW $FF01, $FF01, $FF00, $FF00, $FF00, $FF00 DCW $FF00, $FF00, $FF00, $FF00, $FF00, $FF01 ; 180 degrees DCW $FF01, $FF01, $FF01, $FF02, $FF02, $FF03 DCW $FF03, $FF04, $FF04, $FF05, $FF06, $FF06 DCW $FF07, $FF08, $FF09, $FF0A, $FF0B, $FF0C DCW $FF0D, $FF0E, $FF0F, $FF10, $FF11, $FF12 DCW $FF13, $FF15, $FF16, $FF18, $FF19, $FF1A DCW $FF1C, $FF1D, $FF1F, $FF21, $FF22, $FF24 DCW $FF26, $FF27, $FF29, $FF2B, $FF2D, $FF2F DCW $FF31, $FF33, $FF35, $FF37, $FF39, $FF3B DCW $FF3D, $FF40, $FF42, $FF44, $FF46, $FF49 DCW $FF4B, $FF4D, $FF50, $FF52, $FF55, $FF57 ; 225 degrees DCW $FF5A, $FF5C, $FF5F, $FF62, $FF64, $FF67 DCW $FF6A, $FF6C, $FF6F, $FF72, $FF75, $FF77 DCW $FF7A, $FF7D, $FF80, $FF83, $FF86, $FF89 DCW $FF8C, $FF8F, $FF92, $FF95, $FF98, $FF9B DCW $FF9E, $FFA1, $FFA4, $FFA7, $FFAB, $FFAE DCW $FFB1, $FFB4, $FFB7, $FFBB, $FFBE, $FFC1 DCW $FFC4, $FFC8, $FFCB, $FFCE, $FFD1, $FFD5 DCW $FFD8, $FFDB, $FFDF, $FFE2, $FFE5, $FFE9 DCW $FFEC, $FFEF, $FFF3, $FFF6, $FFF9, $FFFD DCW $0000, $0003, $0007, $000A, $000D, $0011 ; 270 degrees DCW $0014, $0017, $001B, $001E, $0021, $0025 DCW $0028, $002B, $002F, $0032, $0035, $0038 DCW $003C, $003F, $0042, $0045, $0049, $004C DCW $004F, $0052, $0055, $0059, $005C, $005F DCW $0062, $0065, $0068, $006B, $006E, $0071 DCW $0074, $0077, $007A, $007D, $0080, $0083 DCW $0086, $0089, $008B, $008E, $0091, $0094 DCW $0096, $0099, $009C, $009E, $00A1, $00A4 DCW $00A6, $00A9, $00AB, $00AE, $00B0, $00B3 DCW $00B5, $00B7, $00BA, $00BC, $00BE, $00C0 ; 315 degrees DCW $00C3, $00C5, $00C7, $00C9, $00CB, $00CD DCW $00CF, $00D1, $00D3, $00D5, $00D7, $00D9 DCW $00DA, $00DC, $00DE, $00DF, $00E1, $00E3 DCW $00E4, $00E6, $00E7, $00E8, $00EA, $00EB DCW $00ED, $00EE, $00EF, $00F0, $00F1, $00F2 DCW $00F3, $00F4, $00F5, $00F6, $00F7, $00F8 DCW $00F9, $00FA, $00FA, $00FB, $00FC, $00FC DCW $00FD, $00FD, $00FE, $00FE, $00FF, $00FF DCW $00FF, $00FF, $0100, $0100, $0100, $0100 Sin: ;sin(x), 8.8 fixed-point format, x in 0.750000-degree units DCW $0000, $0003, $0007, $000A, $000D, $0011 ; 0 degrees DCW $0014, $0017, $001B, $001E, $0021, $0025 DCW $0028, $002B, $002F, $0032, $0035, $0038 DCW $003C, $003F, $0042, $0045, $0049, $004C DCW $004F, $0052, $0055, $0059, $005C, $005F DCW $0062, $0065, $0068, $006B, $006E, $0071 DCW $0074, $0077, $007A, $007D, $0080, $0083 DCW $0086, $0089, $008B, $008E, $0091, $0094 DCW $0096, $0099, $009C, $009E, $00A1, $00A4 DCW $00A6, $00A9, $00AB, $00AE, $00B0, $00B3 DCW $00B5, $00B7, $00BA, $00BC, $00BE, $00C0 ; 45 degrees DCW $00C3, $00C5, $00C7, $00C9, $00CB, $00CD DCW $00CF, $00D1, $00D3, $00D5, $00D7, $00D9 DCW $00DA, $00DC, $00DE, $00DF, $00E1, $00E3 DCW $00E4, $00E6, $00E7, $00E8, $00EA, $00EB DCW $00ED, $00EE, $00EF, $00F0, $00F1, $00F2 DCW $00F3, $00F4, $00F5, $00F6, $00F7, $00F8 DCW $00F9, $00FA, $00FA, $00FB, $00FC, $00FC DCW $00FD, $00FD, $00FE, $00FE, $00FF, $00FF DCW $00FF, $00FF, $0100, $0100, $0100, $0100 DCW $0100, $0100, $0100, $0100, $0100, $00FF ; 90 degrees DCW $00FF, $00FF, $00FF, $00FE, $00FE, $00FD DCW $00FD, $00FC, $00FC, $00FB, $00FA, $00FA DCW $00F9, $00F8, $00F7, $00F6, $00F5, $00F4 DCW $00F3, $00F2, $00F1, $00F0, $00EF, $00EE DCW $00ED, $00EB, $00EA, $00E8, $00E7, $00E6 DCW $00E4, $00E3, $00E1, $00DF, $00DE, $00DC DCW $00DA, $00D9, $00D7, $00D5, $00D3, $00D1 DCW $00CF, $00CD, $00CB, $00C9, $00C7, $00C5 DCW $00C3, $00C0, $00BE, $00BC, $00BA, $00B7 DCW $00B5, $00B3, $00B0, $00AE, $00AB, $00A9 ; 135 degrees DCW $00A6, $00A4, $00A1, $009E, $009C, $0099 DCW $0096, $0094, $0091, $008E, $008B, $0089 DCW $0086, $0083, $0080, $007D, $007A, $0077 DCW $0074, $0071, $006E, $006B, $0068, $0065 DCW $0062, $005F, $005C, $0059, $0055, $0052 DCW $004F, $004C, $0049, $0045, $0042, $003F DCW $003C, $0038, $0035, $0032, $002F, $002B DCW $0028, $0025, $0021, $001E, $001B, $0017 DCW $0014, $0011, $000D, $000A, $0007, $0003 DCW $0000, $FFFD, $FFF9, $FFF6, $FFF3, $FFEF ; 180 degrees DCW $FFEC, $FFE9, $FFE5, $FFE2, $FFDF, $FFDB DCW $FFD8, $FFD5, $FFD1, $FFCE, $FFCB, $FFC8 DCW $FFC4, $FFC1, $FFBE, $FFBB, $FFB7, $FFB4 DCW $FFB1, $FFAE, $FFAB, $FFA7, $FFA4, $FFA1 DCW $FF9E, $FF9B, $FF98, $FF95, $FF92, $FF8F DCW $FF8C, $FF89, $FF86, $FF83, $FF80, $FF7D DCW $FF7A, $FF77, $FF75, $FF72, $FF6F, $FF6C DCW $FF6A, $FF67, $FF64, $FF62, $FF5F, $FF5C DCW $FF5A, $FF57, $FF55, $FF52, $FF50, $FF4D DCW $FF4B, $FF49, $FF46, $FF44, $FF42, $FF40 ; 225 degrees DCW $FF3D, $FF3B, $FF39, $FF37, $FF35, $FF33 DCW $FF31, $FF2F, $FF2D, $FF2B, $FF29, $FF27 DCW $FF26, $FF24, $FF22, $FF21, $FF1F, $FF1D DCW $FF1C, $FF1A, $FF19, $FF18, $FF16, $FF15 DCW $FF13, $FF12, $FF11, $FF10, $FF0F, $FF0E DCW $FF0D, $FF0C, $FF0B, $FF0A, $FF09, $FF08 DCW $FF07, $FF06, $FF06, $FF05, $FF04, $FF04 DCW $FF03, $FF03, $FF02, $FF02, $FF01, $FF01 DCW $FF01, $FF01, $FF00, $FF00, $FF00, $FF00 DCW $FF00, $FF00, $FF00, $FF00, $FF00, $FF01 ; 270 degrees DCW $FF01, $FF01, $FF01, $FF02, $FF02, $FF03 DCW $FF03, $FF04, $FF04, $FF05, $FF06, $FF06 DCW $FF07, $FF08, $FF09, $FF0A, $FF0B, $FF0C DCW $FF0D, $FF0E, $FF0F, $FF10, $FF11, $FF12 DCW $FF13, $FF15, $FF16, $FF18, $FF19, $FF1A DCW $FF1C, $FF1D, $FF1F, $FF21, $FF22, $FF24 DCW $FF26, $FF27, $FF29, $FF2B, $FF2D, $FF2F DCW $FF31, $FF33, $FF35, $FF37, $FF39, $FF3B DCW $FF3D, $FF40, $FF42, $FF44, $FF46, $FF49 DCW $FF4B, $FF4D, $FF50, $FF52, $FF55, $FF57 ; 315 degrees DCW $FF5A, $FF5C, $FF5F, $FF62, $FF64, $FF67 DCW $FF6A, $FF6C, $FF6F, $FF72, $FF75, $FF77 DCW $FF7A, $FF7D, $FF80, $FF83, $FF86, $FF89 DCW $FF8C, $FF8F, $FF92, $FF95, $FF98, $FF9B DCW $FF9E, $FFA1, $FFA4, $FFA7, $FFAB, $FFAE DCW $FFB1, $FFB4, $FFB7, $FFBB, $FFBE, $FFC1 DCW $FFC4, $FFC8, $FFCB, $FFCE, $FFD1, $FFD5 DCW $FFD8, $FFDB, $FFDF, $FFE2, $FFE5, $FFE9 DCW $FFEC, $FFEF, $FFF3, $FFF6, $FFF9, $FFFD Maze: ; Maze definition (16x16 bitmap, 1 = solid, 0 = empty) DCW $FFFF ; XXXXXXXXXXXXXXXX DCW $8001 ; X X DCW $9F00 ; X XXXXX <--maze exit DCW $9155 ; X X X X X X X DCW $9101 ; X X X X DCW $9301 ; X X XX X DCW $8001 ; X X DCW $8001 ; X X DCW $8001 ; X X DCW $99F9 ; X XX XXXXXX X DCW $9009 ; X X X X DCW $9C09 ; X XXX X X DCW $9009 ; X X X X DCW $9FE9 ; X XXXXXXXX X X DCW $8001 ; X X DCW $FFFF ; XXXXXXXXXXXXXXXX MazeVert: DCW $FFFF DCW $8001 DCW $8001 DCW $BE3D DCW $AA05 DCW $A805 DCW $A025 DCW $A23D DCW $A201 DCW $A209 DCW $A201 DCW $8209 DCW $BE01 DCW $8009 DCW $8001 DCW $FFFB ; 0 1 2 3 4 5 6 7 8 9 a b c d e f ; 0 _ _ _ _ _ _ _ _ _ _ _ _ _ _ ; 1 | _ _ _ _ _ |_ ; 2 | | _ _ _ | _ _ _ _ ; 3 | | | | | |_| |_| |_| | ; 4 | | | _| | | ; 5 | |_| |_ _| | ; 6 | | ; 7 | | ; 8 | _ _ _ _ _ _ _ _ | ; 9 | | _| |_ _ _ _ _ | | ; a | | |_ _ | | | ; b | | _ _| | | | ; c | | |_ _ _ _ _ _ _ | | | ; d | |_ _ _ _ _ _ _ _| |_| | ; e |_ _ _ _ _ _ _ _ _ _ _ _ _ _| ; f ; 0 1 2 3 4 5 6 7 8 9 a b c d e f ; 0 . _ _ _ _ _ _ _ _ _ _ _ _ _ _ . ; 1 .|. . _ _ _ _ _ . . . . . . .|_ ; 2 .|. .|. _ _ _ .|. _ . _ . _ . _ ; 3 .|. .|.|. . .|.|.|_|.|_|.|_|.|. ; 4 .|. .|.|. . _|.|. . . . . . .|. ; 5 .|. .|_|. .|_ _|. . . . . . .|. ; 6 .|. . . . . . . . . . . . . .|. ; 7 .|. . . . . . . . . . . . . .|. ; 8 .|. . _ _ . . _ _ _ _ _ _ . .|. ; 9 .|. .|. _|. .|_ _ _ _ _ .|. .|. ; a .|. .|.|_ _ . . . . . .|.|. .|. ; b .|. .|. _ _|. . . . . .|.|. .|. ; c .|. .|.|_ _ _ _ _ _ _ .|.|. .|. ; d .|. .|_ _ _ _ _ _ _ _|.|_|. .|. ; e .|_ _ _ _ _ _ _ _ _ _ _ _ _ _|. ; f . . . . . . . . . . . . . . . . ; 0 1 2 3 4 5 6 7 8 9 a b c d e f ; 0. ._._._._._._._._._._._._._._. . ; 1. | . ._._._._._. . . . . . . |_. ; 2. | . | ._._._. | ._. ._. ._. ._. ; 3. | . | | . . | | |_| |_| |_| | . ; 4. | . | | . ._| | . . . . . . | . ; 5. | . |_| . |_._| . . . . . . | . ; 6. | . . . . . . . . . . . . . | . ; 7. | . . . . . . . . . . . . . | . ; 8. | . ._._. . ._._._._._._. . | . ; 9. | . | ._| . |_._._._._. | . | . ; a. | . | |_._. . . . . . | | . | . ; b. | . | ._._| . . . . . | | . | . ; c. | . | |_._._._._._._. | | . | . ; d. | . |_._._._._._._._| |_| . | . ; e. |_._._._._._._._._._._._._._| . ; f. . . . . . . . . . . . . . . . . ; Bottom edge ; 0 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 ; 0 0 0 1 1 1 1 1 0 0 0 0 0 0 0 1 ; 0 0 0 0 1 1 1 0 0 1 0 1 0 1 0 1 ; 0 0 0 0 0 0 0 0 0 1 0 1 0 1 0 0 ; 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 ; 0 0 0 1 0 0 1 1 0 0 0 0 0 0 0 0 ; 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ; 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ; 0 0 0 1 1 0 0 1 1 1 1 1 1 0 0 0 ; 0 0 0 0 1 0 0 1 1 1 1 1 0 0 0 0 ; 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 ; 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 ; 0 0 0 0 1 1 1 1 1 1 1 0 0 0 0 0 ; 0 0 0 1 1 1 1 1 1 1 1 0 1 0 0 0 ; 0 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 ; 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ; Top edge ; 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ; 0 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 ; 0 0 0 1 1 1 1 1 0 0 0 0 0 0 0 1 ; 0 0 0 0 1 1 1 0 0 1 0 1 0 1 0 1 ; 0 0 0 0 0 0 0 0 0 1 0 1 0 1 0 0 ; 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 ; 0 0 0 1 0 0 1 1 0 0 0 0 0 0 0 0 ; 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ; 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ; 0 0 0 1 1 0 0 1 1 1 1 1 1 0 0 0 ; 0 0 0 0 1 0 0 1 1 1 1 1 0 0 0 0 ; 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 ; 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 ; 0 0 0 0 1 1 1 1 1 1 1 0 0 0 0 0 ; 0 0 0 1 1 1 1 1 1 1 1 0 1 0 0 0 ; 0 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 ; Right edge ; 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ; 1 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 ; 1 0 1 0 0 0 0 1 0 0 0 0 0 0 0 0 ; 1 0 1 1 0 0 1 1 1 1 1 1 1 1 1 0 ; 1 0 1 1 0 0 1 1 0 0 0 0 0 0 1 0 ; 1 0 1 1 0 1 0 1 0 0 0 0 0 0 1 0 ; 1 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 ; 1 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 ; 1 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 ; 1 0 1 0 1 0 1 0 0 0 0 0 1 0 1 0 ; 1 0 1 1 0 0 0 0 0 0 0 1 1 0 1 0 ; 1 0 1 0 0 1 0 0 0 0 0 1 1 0 1 0 ; 1 0 1 1 0 0 0 0 0 0 0 1 1 0 1 0 ; 1 0 1 0 0 0 0 0 0 0 1 1 1 0 1 0 ; 1 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 ; 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ; Left edge ; 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ; 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 1 ; 0 1 0 1 0 0 0 0 1 0 0 0 0 0 0 0 ; 0 1 0 1 1 0 0 1 1 1 1 1 1 1 1 1 ; 0 1 0 1 1 0 0 1 1 0 0 0 0 0 0 1 ; 0 1 0 1 1 0 1 0 1 0 0 0 0 0 0 1 ; 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 1 ; 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 1 ; 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 1 ; 0 1 0 1 0 1 0 1 0 0 0 0 0 1 0 1 ; 0 1 0 1 1 0 0 0 0 0 0 0 1 1 0 1 ; 0 1 0 1 0 0 1 0 0 0 0 0 1 1 0 1 ; 0 1 0 1 1 0 0 0 0 0 0 0 1 1 0 1 ; 0 1 0 1 0 0 0 0 0 0 0 1 1 1 0 1 ; 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 1 ; 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 WALL_BLK_BLK EQU (COLOR_BLK + (COLOR_BLK * 8))*2 WALL_BLK_BLU EQU (COLOR_BLK + (COLOR_BLU * 8))*2 WALL_BLK_RED EQU (COLOR_BLK + (COLOR_RED * 8))*2 WALL_BLK_TAN EQU (COLOR_BLK + (COLOR_TAN * 8))*2 WALL_BLK_DKG EQU (COLOR_BLK + (COLOR_DKG * 8))*2 WALL_BLK_GRN EQU (COLOR_BLK + (COLOR_GRN * 8))*2 WALL_BLK_YEL EQU (COLOR_BLK + (COLOR_YEL * 8))*2 WALL_BLK_WHT EQU (COLOR_BLK + (COLOR_WHT * 8))*2 WALL_BLU_BLK EQU (COLOR_BLU + (COLOR_BLK * 8))*2 WALL_BLU_BLU EQU (COLOR_BLU + (COLOR_BLU * 8))*2 WALL_BLU_RED EQU (COLOR_BLU + (COLOR_RED * 8))*2 WALL_BLU_TAN EQU (COLOR_BLU + (COLOR_TAN * 8))*2 WALL_BLU_DKG EQU (COLOR_BLU + (COLOR_DKG * 8))*2 WALL_BLU_GRN EQU (COLOR_BLU + (COLOR_GRN * 8))*2 WALL_BLU_YEL EQU (COLOR_BLU + (COLOR_YEL * 8))*2 WALL_BLU_WHT EQU (COLOR_BLU + (COLOR_WHT * 8))*2 WALL_RED_BLK EQU (COLOR_RED + (COLOR_BLK * 8))*2 WALL_RED_BLU EQU (COLOR_RED + (COLOR_BLU * 8))*2 WALL_RED_RED EQU (COLOR_RED + (COLOR_RED * 8))*2 WALL_RED_TAN EQU (COLOR_RED + (COLOR_TAN * 8))*2 WALL_RED_DKG EQU (COLOR_RED + (COLOR_DKG * 8))*2 WALL_RED_GRN EQU (COLOR_RED + (COLOR_GRN * 8))*2 WALL_RED_YEL EQU (COLOR_RED + (COLOR_YEL * 8))*2 WALL_RED_WHT EQU (COLOR_RED + (COLOR_WHT * 8))*2 WALL_TAN_BLK EQU (COLOR_TAN + (COLOR_BLK * 8))*2 WALL_TAN_BLU EQU (COLOR_TAN + (COLOR_BLU * 8))*2 WALL_TAN_RED EQU (COLOR_TAN + (COLOR_RED * 8))*2 WALL_TAN_TAN EQU (COLOR_TAN + (COLOR_TAN * 8))*2 WALL_TAN_DKG EQU (COLOR_TAN + (COLOR_DKG * 8))*2 WALL_TAN_GRN EQU (COLOR_TAN + (COLOR_GRN * 8))*2 WALL_TAN_YEL EQU (COLOR_TAN + (COLOR_YEL * 8))*2 WALL_TAN_WHT EQU (COLOR_TAN + (COLOR_WHT * 8))*2 WALL_DKG_BLK EQU (COLOR_DKG + (COLOR_BLK * 8))*2 WALL_DKG_BLU EQU (COLOR_DKG + (COLOR_BLU * 8))*2 WALL_DKG_RED EQU (COLOR_DKG + (COLOR_RED * 8))*2 WALL_DKG_TAN EQU (COLOR_DKG + (COLOR_TAN * 8))*2 WALL_DKG_DKG EQU (COLOR_DKG + (COLOR_DKG * 8))*2 WALL_DKG_GRN EQU (COLOR_DKG + (COLOR_GRN * 8))*2 WALL_DKG_YEL EQU (COLOR_DKG + (COLOR_YEL * 8))*2 WALL_DKG_WHT EQU (COLOR_DKG + (COLOR_WHT * 8))*2 WALL_GRN_BLK EQU (COLOR_GRN + (COLOR_BLK * 8))*2 WALL_GRN_BLU EQU (COLOR_GRN + (COLOR_BLU * 8))*2 WALL_GRN_RED EQU (COLOR_GRN + (COLOR_RED * 8))*2 WALL_GRN_TAN EQU (COLOR_GRN + (COLOR_TAN * 8))*2 WALL_GRN_DKG EQU (COLOR_GRN + (COLOR_DKG * 8))*2 WALL_GRN_GRN EQU (COLOR_GRN + (COLOR_GRN * 8))*2 WALL_GRN_YEL EQU (COLOR_GRN + (COLOR_YEL * 8))*2 WALL_GRN_WHT EQU (COLOR_GRN + (COLOR_WHT * 8))*2 WALL_YEL_BLK EQU (COLOR_YEL + (COLOR_BLK * 8))*2 WALL_YEL_BLU EQU (COLOR_YEL + (COLOR_BLU * 8))*2 WALL_YEL_RED EQU (COLOR_YEL + (COLOR_RED * 8))*2 WALL_YEL_TAN EQU (COLOR_YEL + (COLOR_TAN * 8))*2 WALL_YEL_DKG EQU (COLOR_YEL + (COLOR_DKG * 8))*2 WALL_YEL_GRN EQU (COLOR_YEL + (COLOR_GRN * 8))*2 WALL_YEL_YEL EQU (COLOR_YEL + (COLOR_YEL * 8))*2 WALL_YEL_WHT EQU (COLOR_YEL + (COLOR_WHT * 8))*2 WALL_WHT_BLK EQU (COLOR_WHT + (COLOR_BLK * 8))*2 WALL_WHT_BLU EQU (COLOR_WHT + (COLOR_BLU * 8))*2 WALL_WHT_RED EQU (COLOR_WHT + (COLOR_RED * 8))*2 WALL_WHT_TAN EQU (COLOR_WHT + (COLOR_TAN * 8))*2 WALL_WHT_DKG EQU (COLOR_WHT + (COLOR_DKG * 8))*2 WALL_WHT_GRN EQU (COLOR_WHT + (COLOR_GRN * 8))*2 WALL_WHT_YEL EQU (COLOR_WHT + (COLOR_YEL * 8))*2 WALL_WHT_WHT EQU (COLOR_WHT + (COLOR_WHT * 8))*2 MazeBottom: ; Dummy line so we can shift the table by a row DCW $, $, $, $, $, $, $, $, $, $, $, $, $, $, $, $ MazeBottom2: ; Northward-facing walls only (bottom edge of each square) DCW $, $, $, $, $, $, $, $, $, $, $, $, $, $, $, $ DCW $, $, $, $ - WALL_DKG_DKG, $ - WALL_GRN_GRN, $ - WALL_DKG_DKG, $ - WALL_GRN_GRN, $ - WALL_DKG_DKG, $, $, $, $, $, $, $, $ DCW $, $, $, $, $, $, $, $, $, $ - WALL_GRN_GRN, $, $ - WALL_GRN_GRN, $, $ - WALL_GRN_GRN, $, $ - WALL_RED_RED DCW $, $, $, $, $, $, $, $, $, $, $, $, $, $, $, $ DCW $, $, $, $, $, $, $ - WALL_DKG_DKG, $, $, $, $, $, $, $, $, $ DCW $, $, $, $, $, $, $, $, $, $, $, $, $, $, $, $ DCW $, $, $, $, $, $, $, $, $, $, $, $, $, $, $, $ DCW $, $, $, $, $, $, $, $, $, $, $, $, $, $, $, $ DCW $, $, $, $ - WALL_GRN_GRN, $ - WALL_DKG_DKG, $, $, $ - WALL_GRN_GRN, $ - WALL_DKG_DKG, $ - WALL_GRN_GRN, $ - WALL_DKG_DKG, $ - WALL_GRN_GRN, $ - WALL_DKG_DKG, $, $, $ DCW $, $, $, $, $, $, $, $, $, $, $, $, $, $, $, $ DCW $, $, $, $, $ - WALL_DKG_DKG, $ - WALL_GRN_GRN, $, $, $, $, $, $, $, $, $, $ DCW $, $, $, $, $, $, $, $, $, $, $, $, $, $, $, $ DCW $, $, $, $, $ - WALL_DKG_DKG, $ - WALL_GRN_GRN, $ - WALL_DKG_DKG, $ - WALL_GRN_GRN, $ - WALL_DKG_DKG, $ - WALL_GRN_GRN, $ - WALL_DKG_DKG, $, $, $, $, $ DCW $, $, $, $, $, $, $, $, $, $, $, $, $, $, $, $ DCW $, $ - WALL_RED_RED, $ - WALL_YEL_RED, $ - WALL_RED_RED, $ - WALL_YEL_RED, $ - WALL_RED_RED, $ - WALL_YEL_RED, $ - WALL_RED_RED, $ - WALL_YEL_RED, $ - WALL_RED_RED, $ - WALL_YEL_RED, $ - WALL_RED_RED, $ - WALL_YEL_RED, $ - WALL_RED_RED, $ - WALL_YEL_RED, $ DCW $, $, $, $, $, $, $, $, $, $, $, $, $, $, $, $ MazeTop: ; Southward-facing walls only (top edge of each square) DCW $, $, $, $, $, $, $, $, $, $, $, $, $, $, $, $ DCW $, $ - WALL_YEL_RED, $ - WALL_RED_RED, $ - WALL_YEL_RED, $ - WALL_RED_RED, $ - WALL_YEL_RED, $ - WALL_RED_RED, $ - WALL_YEL_RED, $ - WALL_RED_RED, $ - WALL_YEL_RED, $ - WALL_RED_RED, $ - WALL_YEL_RED, $ - WALL_RED_RED, $ - WALL_YEL_RED, $ - WALL_RED_RED, $ DCW $, $, $, $, $, $, $, $, $, $, $, $, $, $, $, $ - WALL_RED_RED DCW $, $, $, $, $ - WALL_GRN_GRN, $ - WALL_DKG_DKG, $ - WALL_GRN_GRN, $, $, $, $, $, $, $, $, $ DCW $, $, $, $, $, $, $, $, $, $ - WALL_GRN_GRN, $, $ - WALL_GRN_GRN, $, $ - WALL_GRN_GRN, $, $ DCW $, $, $, $, $, $, $, $, $, $, $, $, $, $, $, $ DCW $, $, $, $ - WALL_GRN_GRN, $, $, $ - WALL_DKG_DKG, $ - WALL_GRN_GRN, $, $, $, $, $, $, $, $ DCW $, $, $, $, $, $, $, $, $, $, $, $, $, $, $, $ DCW $, $, $, $, $, $, $, $, $, $, $, $, $, $, $, $ DCW $, $, $, $, $, $, $, $, $, $, $, $, $, $, $, $ DCW $, $, $, $, $ - WALL_DKG_DKG, $, $, $ - WALL_GRN_GRN, $ - WALL_DKG_DKG, $ - WALL_GRN_GRN, $ - WALL_DKG_DKG, $ - WALL_GRN_GRN, $, $, $, $ DCW $, $, $, $, $, $, $, $, $, $, $, $, $, $, $, $ DCW $, $, $, $, $ - WALL_DKG_DKG, $ - WALL_GRN_GRN, $, $, $, $, $, $, $, $, $, $ DCW $, $, $, $, $, $, $, $, $, $, $, $, $, $, $, $ DCW $, $, $, $ - WALL_GRN_GRN, $ - WALL_DKG_DKG, $ - WALL_GRN_GRN, $ - WALL_DKG_DKG, $ - WALL_GRN_GRN, $ - WALL_DKG_DKG, $ - WALL_GRN_GRN, $ - WALL_DKG_DKG, $, $ - WALL_DKG_DKG, $, $, $ DCW $, $, $, $, $, $, $, $, $, $, $, $, $, $, $, $ MazeRight: ; Dummy entry so we can shift the table by a column DCW $ MazeRight2: ; Westward-facing walls only (right edge of each square) DCW $, $, $, $, $, $, $, $, $, $, $, $, $, $, $, $ DCW $, $, $, $, $, $, $, $, $, $, $, $, $, $, $ - WALL_YEL_RED, $ DCW $, $, $ - WALL_GRN_GRN, $, $, $, $, $, $, $, $, $, $, $, $, $ DCW $, $, $ - WALL_DKG_DKG, $, $, $, $ - WALL_DKG_DKG, $, $ - WALL_DKG_DKG, $, $ - WALL_DKG_DKG, $, $ - WALL_DKG_DKG, $, $ - WALL_YEL_RED, $ DCW $, $, $ - WALL_GRN_GRN, $, $, $, $ - WALL_GRN_GRN, $, $, $, $, $, $, $, $ - WALL_RED_RED, $ DCW $, $, $ - WALL_DKG_DKG, $, $, $ - WALL_GRN_GRN, $, $, $, $, $, $, $, $, $ - WALL_YEL_RED, $ DCW $, $, $, $, $, $, $, $, $, $, $, $, $, $, $ - WALL_RED_RED, $ DCW $, $, $, $, $, $, $, $, $, $, $, $, $, $, $ - WALL_YEL_RED, $ DCW $, $, $, $, $, $, $, $, $, $, $, $, $, $, $ - WALL_RED_RED, $ DCW $, $, $ - WALL_DKG_DKG, $, $, $, $ - WALL_DKG_DKG, $, $, $, $, $, $, $, $ - WALL_YEL_RED, $ DCW $, $, $ - WALL_GRN_GRN, $, $, $, $, $, $, $, $, $ - WALL_DKG_DKG, $, $, $ - WALL_RED_RED, $ DCW $, $, $ - WALL_DKG_DKG, $, $, $, $, $, $, $, $, $ - WALL_GRN_GRN, $, $, $ - WALL_YEL_RED, $ DCW $, $, $ - WALL_GRN_GRN, $, $, $, $, $, $, $, $, $ - WALL_DKG_DKG, $, $, $ - WALL_RED_RED, $ DCW $, $, $ - WALL_DKG_DKG, $, $, $, $, $, $, $, $, $ - WALL_GRN_GRN, $, $, $ - WALL_YEL_RED, $ DCW $, $, $, $, $, $, $, $, $, $, $, $, $, $, $ - WALL_RED_RED, $ DCW $, $, $, $, $, $, $, $, $, $, $, $, $, $, $, $ MazeLeft: ; Eastward-facing walls only (left edge of each square) DCW $, $, $, $, $, $, $, $, $, $, $, $, $, $, $, $ DCW $, $ - WALL_RED_RED, $, $, $, $, $, $, $, $, $, $, $, $, $, $ DCW $, $ - WALL_YEL_RED, $, $, $, $, $, $, $ - WALL_GRN_GRN, $, $, $, $, $, $, $ DCW $, $ - WALL_RED_RED, $, $, $ - WALL_DKG_DKG, $, $, $, $ - WALL_DKG_DKG, $, $ - WALL_DKG_DKG, $, $ - WALL_DKG_DKG, $, $ - WALL_DKG_DKG, $ DCW $, $ - WALL_YEL_RED, $, $, $ - WALL_GRN_GRN, $, $, $, $ - WALL_GRN_GRN, $, $, $, $, $, $, $ DCW $, $ - WALL_RED_RED, $, $, $ - WALL_DKG_DKG, $, $, $, $ - WALL_DKG_DKG, $, $, $, $, $, $, $ DCW $, $ - WALL_YEL_RED, $, $, $, $, $, $, $, $, $, $, $, $, $, $ DCW $, $ - WALL_RED_RED, $, $, $, $, $, $, $, $, $, $, $, $, $, $ DCW $, $ - WALL_YEL_RED, $, $, $, $, $, $, $, $, $, $, $, $, $, $ DCW $, $ - WALL_RED_RED, $, $, $, $ - WALL_GRN_GRN, $, $ - WALL_GRN_GRN, $, $, $, $, $, $ - WALL_GRN_GRN, $, $ DCW $, $ - WALL_YEL_RED, $, $, $ - WALL_GRN_GRN, $, $, $, $, $, $, $, $, $ - WALL_DKG_DKG, $, $ DCW $, $ - WALL_RED_RED, $, $, $, $, $ - WALL_DKG_DKG, $, $, $, $, $, $, $ - WALL_GRN_GRN, $, $ DCW $, $ - WALL_YEL_RED, $, $, $ - WALL_GRN_GRN, $, $, $, $, $, $, $, $, $ - WALL_DKG_DKG, $, $ DCW $, $ - WALL_RED_RED, $, $, $, $, $, $, $, $, $, $ - WALL_GRN_GRN, $, $ - WALL_GRN_GRN, $, $ DCW $, $ - WALL_YEL_RED, $, $, $, $, $, $, $, $, $, $, $, $, $, $ DCW $, $, $, $, $, $, $, $, $, $, $, $, $, $, $, $