org $1000 ; defs 4 ; Vector to begin bra Start ; Init maze etc bra Cls ; Clear screen bra Scan_Kbd ; Get ptr bra IM_Fill ; Fill area bra Random ; Random no bra Rand_Less_D0 ; 0 .. d0 bra Out_It ; Write to screen bra Show_Window ; Page display bra Set_Display ; Assert display bra Set_Display_0 ; Assert display bra Set_Display_1 ; Assert display VDU equ $40001000 ; Key_Data equ $40002000 ; SM_Start equ $10000 ; Below BM BM_Start equ $11000+BM_Max_X ; Big_Maze TL BM_Max_X equ 512 ; No. cells BM_Max_Y equ 401 ; No. cells BM_Start_TLM equ BM_Start+7*BM_Max_X+7 ; BM_Start_TRM equ BM_Start_TLM+47*7 ; BM_Start_BLM equ BM_Start+48*7*BM_Max_X+7 ; BM_Start_BRM equ BM_Start_BLM+47*7 ; BM_Start_Maze equ BM_Start+8*7*BM_Max_X+8*7 ; Mess_Box equ BM_Start+190+34*BM_Max_X ; pLink equ $80 ; Openness of maze pOpen equ $C000 pAjar equ $E000 Start move #$4242,Seed ; Set seed value bsr Cls ; Clear screen bsr Init_Maze ; Draw Big_Maze rts ; Scan_Kbd move.l #Key_Data,a0 ; Point at key data rts ; Done Init_Maze move.l #BM_Start,a0 ; Clear BM move #BM_Max_X*BM_Max_Y/4-1,d0 ; Count move.l #$20202020,d1 ; Spaces IM_lp1 move.l d1,[a0]+ ; dbf d0,IM_lp1 ; move.l #BM_Start-BM_Max_X,a0 bsr IM_Guard_Band ; move.l #BM_Start+BM_Max_Y*BM_Max_X,a0 bsr IM_Guard_Band ; move.l #Wall_Table,a0 ; pList bsr IM_Draw_Walls ; move.b #$FF,d0 ; Fill moat move.l #BM_Start+100,a0; bsr IM_Fill ; move.l #BM_Start+BM_Max_X-1,a0; bsr IM_Fill ; move.l #Mess_1,a0 ; Add message move.l #Mess_Box,a1 ; move #Mess_1_E-Mess_1-1,d0 IM_M_Lp move.b [a0]+,[a1]+ dbf d0,IM_M_Lp move.b #$00,d0 ; Fill box move.l #Mess_Box-1,a0 ; bsr IM_Fill ; move.l #BM_Start_TLM,a6; Draw mazes moveq #9,d6 ; X moveq #9,d7 ; Y bsr Draw_Maze ; move.l #BM_Start_TRM,a6; moveq #9,d6 ; moveq #9,d7 ; bsr Draw_Maze ; move.l #BM_Start_BLM,a6; moveq #9,d6 ; moveq #9,d7 ; bsr Draw_Maze ; move.l #BM_Start_BRM,a6; moveq #9,d6 ; moveq #9,d7 ; bsr Draw_Maze ; move.l #BM_Start_Maze,a6; moveq #42,d6 ; moveq #42,d7 ; bsr Draw_Maze ; move.l #Bomb_List,a1 ; Cells to clear bsr Bomb_Cells ; Clear cell bsr Correct_Chars ; Draw in all corners rts Bomb_Cells move.l [a1]+,d0 ; Get ptr move.l d0,a0 ; Setting Z flag beq.s BC_X ; Done bsr.s Bomb_Cell ; Clear it bra.s Bomb_Cells ; lp Bomb_Cell move #7,d1 ; Y cnt BC_Lp_Y move #7,d0 ; X cnt BC_Lp_X move.b #" ",0[a0,d0.w] ; Bomb char dbf d0,BC_Lp_X ; lp add.l #BM_Max_X,a0 ; Step Y dbf d1,BC_Lp_Y ; lp BC_X rts ; Done Display_Maze movem.l d0-a6,-[sp] ; Save all move d6,d3 ; X cnt move d7,d5 ; Y cnt move.l #SM_Start,a0 ; pMaze clr.l d7 ; Clr Y DSM_lpY clr.l d6 ; Clr X move d3,d4 ; X Cnt DSM_lpX move.b [a0]+,d0 ; Get Cell DD UU RR LL move.b d0,d1 ; ror #1,d1 ; or.b d0,d1 ; XD XU XR XL roxr #1,d1 ; L roxl #1,d0 ; XXXX XXXL ror #1,d1 ; X roxr #1,d1 ; R roxl #1,d0 ; XXXX XXLR ror #1,d1 ; X roxr #1,d1 ; U roxl #1,d0 ; XXXX XLRU ror #1,d1 ; X roxr #1,d1 ; D roxl #1,d0 ; XXXX LRUD roxr #1,d0 ; roxl #1,d1 ; roxr #1,d0 ; roxl #1,d1 ; roxr #1,d0 ; roxl #1,d1 ; roxr #1,d0 ; roxl #1,d1 ; move.b d1,d0 ; not.b d0 ; Negate it and.b #$0F,d0 ; Char 0..F bsr Out_It ; Show it addq #1,d6 ; StepX dbf d4,DSM_lpX ; Lp addq #1,d7 ; Step Y dbf d5,DSM_lpY ; movem.l [sp]+,d0-a6 ; Restore all rts Draw_Maze movem.l d6/d7/a6,-[sp] ; Save defn move d6,d0 ; Xsize addq #1,d0 ; Inc X addq #1,d7 ; Inc Y mulu d7,d0 ; X*Y subq #1,d7 ; Restore Y move.l #SM_Start,a0 ; Clear to 0 move.l a0,a1 ; pStart DM_Init clr.b [a0]+ ; dbf d0,DM_Init ; move #6,d0 ; Get rand X bsr Rand_Less_D0 ; 0 .. X move d0,d4 ; Save it move d7,d0 ; Get rand Y bsr Rand_Less_D0 ; 0 .. Y move d0,d5 ; Save it ;DM_Loop bsr Display_Maze ; Show it on t'screen DM_Loop bsr.s DM_Draw ; Draw one path ; bsr Random ; Get R1 ; cmp.b #pLink,d1 ; Openness ? ; bgt DM_Next ; Don't link ; bsr DM_FindLinks ; Get links ; cmp #0,d1 ; No. of possible ; beq.s DM_Next ; None ; bsr DM_Link ; Link to one ; bra DM_Done DM_Next move d4,d2 ; Save X move d5,d3 ; Save Y bra.s DM_N_1 ; Find next DM_Next1 bsr DM_GetCell ; Find a virgin one tst.b d0 ; Virgin ? beq.s DM_Next2 ; Ok cmp d4,d2 ; Same X ? bne.s DM_N_1 ; No cmp d5,d3 ; Same Y beq DM_Done ; Finished DM_N_1 addq #1,d4 ; Step X cmp d4,d6 ; In range ? bge.s DM_Next1 ; Loop moveq #0,d4 ; Reset X addq #1,d5 ; Step Y cmp d5,d7 ; In range ? bge.s DM_Next1 ; Loop moveq #0,d5 ; Reset Y bra.s DM_Next1 ; Loop DM_Next2 bsr DM_FindLinks ; Get links tst.b d1 ; None ? beq.s DM_N_1 ; Find another bsr DM_Link ; Link it bra DM_Loop ; Do another path DM_Done movem.l [sp]+,d6/d7/a6 ; Restore defn bra Show_Maze ; Display it DM_Draw bsr.s DM_FindMoves ; Get a list of possibles cmp #0,d1 ; No. of possible beq.s DM_D_X ; None bsr DM_Move ; Draw one of them bra.s DM_Draw ; Loop DM_D_X rts ; Can't, done DM_FindMoves move.l #MoveList,a0 ; pPossible list clr.w d1 ; No. of possibles cmp #0,d4 ; Try left beq.s DM_FM_1 ; No subq #1,d4 ; Move left bsr.s DM_GetCell ; Read it cmp.b #0,d0 ; Virgin cell ? bne.s DM_FM_1d ; No addq #1,d1 ; Inc no. poss move.b #0,[a0]+ ; Flag left DM_FM_1d addq #1,d4 ; Move back DM_FM_1 cmp d6,d4 ; Try right beq.s DM_FM_2 ; No addq #1,d4 ; Move right bsr.s DM_GetCell ; Read it cmp.b #0,d0 ; Virgin cell ? bne.s DM_FM_2d ; No addq #1,d1 ; Inc no. poss move.b #1,[a0]+ ; Flag right DM_FM_2d subq #1,d4 ; Move back DM_FM_2 cmp #0,d5 ; Try up beq.s DM_FM_3 ; No subq #1,d5 ; Move up bsr.s DM_GetCell ; Read it cmp.b #0,d0 ; Virgin cell ? bne.s DM_FM_3d ; No addq #1,d1 ; Inc no. poss move.b #2,[a0]+ ; Flag up DM_FM_3d addq #1,d5 ; Move back DM_FM_3 cmp d7,d5 ; Try down beq.s DM_FM_4 ; No addq #1,d5 ; Move up bsr.s DM_GetCell ; Read it cmp.b #0,d0 ; Virgin cell ? bne.s DM_FM_4d ; No addq #1,d1 ; Inc no. poss move.b #3,[a0]+ ; Flag down DM_FM_4d subq #1,d5 ; Move back DM_FM_4 rts ; All found DM_GetCell move d6,d0 ; X width -1 addq #1,d0 ; width mulu d5,d0 ; Y * Xwidth add d4,d0 ; + X move.l #SM_Start,a2 ; Base ptr lea 0[a2,d0.w],a2 ; Calc addr move.b [a2],d0 ; Get value rts ; Done DM_FindLinks move.l #MoveList,a0 ; pPossible list clr.w d1 ; No. of possibles tst d4 ; Try left beq.s DM_FL_1 ; No subq #1,d4 ; Step left bsr.s DM_GetCell ; Read it addq #1,d4 ; Step back tst.b d0 ; Empty ? beq.s DM_FL_1 ; Yes, can't link addq #1,d1 ; Inc no. poss move.b #0,[a0]+ ; Flag left DM_FL_1 cmp d6,d4 ; Try right beq.s DM_FL_2 ; No addq #1,d4 ; Step right bsr.s DM_GetCell ; Read it subq #1,d4 ; Step back tst.b d0 ; Empty ? beq.s DM_FL_2 ; Yes, can't link addq #1,d1 ; Inc no. poss move.b #1,[a0]+ ; Flag right DM_FL_2 cmp #0,d5 ; Try up beq.s DM_FL_3 ; No subq #1,d5 ; bsr.s DM_GetCell ; Read it addq #1,d5 ; tst.b d0 ; Empty ? beq.s DM_FL_3 ; Yes, can't link addq #1,d1 ; Inc no. poss move.b #2,[a0]+ ; Flag up DM_FL_3 cmp d7,d5 ; Try down beq.s DM_FL_4 ; No addq #1,d5 ; bsr.s DM_GetCell ; Read it subq #1,d5 ; tst.b d0 ; Empty ? beq.s DM_FL_4 ; Yes, can't link addq #1,d1 ; Inc no. poss move.b #3,[a0]+ ; Flag down DM_FL_4 rts ; All found DM_Link movem.w d4/d5,-[sp] ; Save posn bsr.s DM_Move ; Link it ; bsr DM_GetCell ; move.b #$AA,[a2] movem.w [sp]+,d4/d5 ; Restore pos rts ; DM_Move move.w d1,d0 ; Get a random dirn bsr Random ; Calc Conn move.b #%11 11 11 11,d2; All open cmp.w #pOpen,d1 ; bls.s DM_M_1 ; move.b #%10 10 10 10,d2; All doors cmp.w #pAjar,d1 ; Open doors bls.s DM_M_1 ; move.b #%01 01 01 01,d2; All closed doors DM_M_1 bsr Rand_Less_D0 ; ext.w d0 ; Make 16 bit move.l #MoveList,a0 ; Base ptr move.b 0[a0,d0.w],d0 ; Get ptr beq.s DM_M_Left ; Move left subq.b #1,d0 ; beq.s DM_M_Right ; Right subq.b #1,d0 ; beq.s DM_M_Up ; Up DM_M_Down bsr DM_GetCell ; Read it move.b d2,d1 ; Get Conn and.b #%11 00 00 00,d1 ; Mask or.b d1,d0 ; move.b d0,[a2] ; Write back addq #1,d5 ; Step down bsr DM_GetCell ; Read it move.b d2,d1 ; Get Conn and.b #%00 11 00 00,d1 ; Mask or.b d1,d0 ; move.b d0,[a2] ; rts ; Done DM_M_Up bsr DM_GetCell ; Read it move.b d2,d1 ; Get Conn and.b #%00 11 00 00,d1 ; Mask or.b d1,d0 ; move.b d0,[a2] ; Write back subq #1,d5 ; Step bsr DM_GetCell ; Read it move.b d2,d1 ; Get Conn and.b #%11 00 00 00,d1 ; Mask or.b d1,d0 ; move.b d0,[a2] ; rts ; Done DM_M_Left bsr DM_GetCell ; Read it move.b d2,d1 ; Get Conn and.b #%00 00 00 11,d1 ; Mask or.b d1,d0 ; move.b d0,[a2] ; Write back subq #1,d4 ; Step bsr DM_GetCell ; Read it move.b d2,d1 ; Get Conn and.b #%00 00 11 00,d1 ; Mask or.b d1,d0 ; move.b d0,[a2] ; rts ; Done DM_M_Right bsr DM_GetCell ; Read it move.b d2,d1 ; Get Conn and.b #%00 00 11 00,d1 ; Mask or.b d1,d0 ; move.b d0,[a2] ; Write back addq #1,d4 ; Step bsr DM_GetCell ; Read it move.b d2,d1 ; Get Conn and.b #%00 00 00 11,d1 ; Mask or.b d1,d0 ; move.b d0,[a2] ; rts ; Done Show_Maze clr.w d0 ; cX clr.w d1 ; cY move.l a6,a5 ; Preserve ptr move.l #SM_Start,a0 ; pMaze SM_Lp move.l #H_Tab,a1 ; Horizontal data move.l #-1,a2 ; Dirn moveq #6,d2 ; %DD UU RR LL use DD bsr.s SM_Show ; Draw left move.l #V_Tab,a1 ; Vertical data move.l #-BM_Max_X,a2 ; Dirn moveq #2,d2 ; %DD UU RR LL use RR bsr.s SM_Show ; Draw up addq.l #1,a0 ; Next cell addq.w #1,d0 ; Step X addq.l #7,a6 ; Step ptr cmp.w d0,d6 ; Done X ? bge.s SM_Lp ; No add.l #BM_Max_X*7,a5 ; Step Y move.l a5,a6 ; Next row moveq #0,d0 ; Zero X addq.w #1,d1 ; Step Y cmp.w d1,d7 ; Done Y ? bge.s SM_Lp ; No rts ; Done SM_Show move.b [a0],d3 ; Get cell ror.b d2,d3 ; Shift bits to bottom and.w #%11,d3 ; Kill rest of bits mulu #6,d3 ; Calc offset into table move #5,d2 ; Loop count move.l a6,a3 ; Copy ptr SM_S_Lp add.l a2,a3 ; Step ptr move.b 0[a1,d3.w],[a3] ; Write it addq.l #1,d3 ; Step ptr dbf d2,SM_S_Lp ; Repeat rts ; Done V_Tab defb $90,$90,$90,$90,$90,$90 defb $90,$DD,$DD,$DD,$DD,$90 defb $90,$20,$20,$20,$20,$90 defb $20,$20,$20,$20,$20,$20 H_Tab defb $90,$90,$90,$90,$90,$90 defb $90,$DC,$DC,$DC,$DC,$90 defb $90,$20,$20,$20,$20,$90 defb $20,$20,$20,$20,$20,$20 ;V_Tab defb $9C,$9C,$9C,$9C,$9C,$9C ; defb $94,$DD,$DD,$DD,$DD,$98 ; defb $94,$20,$20,$20,$20,$98 ; defb $20,$20,$20,$20,$20,$20 ;H_Tab defb $93,$93,$93,$93,$93,$93 ; defb $91,$DC,$DC,$DC,$DC,$92 ; defb $91,$20,$20,$20,$20,$92 ; defb $20,$20,$20,$20,$20,$20 AC_TestWall and.b #$F0,d0 ; Wall char ? cmp.b #$90,d0 ; rts ; Correct_Chars move.l #BM_Start,a0 ; pCorner move #57,d7 ; Y cnt AC_Lp_Y move.l a0,a2 ; Save ptr move #57,d6 ; X cnt AC_Lp_X move.b [a2],d0 ; Get char cmp.b #$20,d0 ; Space ? bne.s AC_Next ; No, Leave clr.b d1 ; Clear acc move.b -1[a2],d0 ; Wall char ? bsr.s AC_TestWall ; beq.s AC_Add ; Yes move.b 1[a2],d0 ; Wall char ? bsr.s AC_TestWall ; beq.s AC_Add ; Yes move.b -512[a2],d0 ; Wall char ? bsr.s AC_TestWall ; beq.s AC_Add ; Yes move.b 512[a2],d0 ; Wall char ? bsr.s AC_TestWall ; bne.s AC_Next ; No AC_Add move.b #$90,[a2] ; Put in wall char AC_Next addq.l #7,a2 ; Step to next dbf d6,AC_Lp_X ; Next X add.l #7*BM_Max_X,a0 ; Offset to next line dbf d7,AC_Lp_Y ; Next Y move.l #BM_Start,a0 ; pCorner move #57*7,d7 ; Y cnt CC_Lp_Y move.l a0,a2 ; Save ptr move #57*7,d6 ; X cnt CC_Lp_X move.b [a2],d0 ; Get char cmp.b #$90,d0 ; bne.s CC_Next ; No, Leave CC_Lp_Do clr.b d1 ; Clear acc move.b -BM_Max_X[a2],d0; Up bsr.s CC_Test ; move.b BM_Max_X[a2],d0 ; Down bsr.s CC_Test ; move.b -1[a2],d0 ; Left bsr.s CC_Test ; move.b 1[a2],d0 ; Right bsr.s CC_Test ; and #%1111,d1 ; Mask it beq.s CC_Next ; None or.b #$90,d1 ; Make char move.b d1,[a2] ; Place it CC_Next addq.l #1,a2 ; Step to next dbf d6,CC_Lp_X ; Next X add.l #1*BM_Max_X,a0 ; Offset to next line dbf d7,CC_Lp_Y ; Next Y CC_Exit rts CC_Test rol.b #1,d1 ; Shift acc and.b #$F0,d0 ; Wall char ? cmp.b #$90,d0 ; bne.s CC_Exit ; or.b #%0000 000 1,d1 ; Add bit rts ; Done Mess_1 defb "Bored of the Things " Mess_1_E equ * IM_Draw_Walls move.l [a0]+,a1 ; Get start address IM_DW_lp move.b [a0]+,d0 ; Corner cmp.b #0,d0 ; beq IM_DW_X ; Done move.b #$90,[a1] ; Draw it move.b [a0]+,d0 ; Direction move [a0]+,d1 ; Count subq.w #1,d1 ; Pre dec cnt bsr.s IM_DW_Step ; Move off corner cmp.w #-1,d1 ; Only one ? beq.s IM_DW_lp ; Yes, done IM_DW_lp1 move.b #$90,[a1] ; Assume L-R ;IM_DW_lp1 move.b #$93,[a1] ; Assume L-R cmp.b #1,d0 ; L or R ? bls.s IM_DW_1 ; Yes move.b #$90,[a1] ; U-D ; move.b #$9C,[a1] ; U-D IM_DW_1 bsr.s IM_DW_Step ; Move dbf d1,IM_DW_lp1 ; Loop bra.s IM_DW_lp ; Next section IM_DW_Step cmp.b #1,d0 ; L or R ? beq.s IM_DW_L ; Left bhi.s IM_DW_UD ; Right addq.w #1,a1 ; Left rts IM_DW_L subq.w #1,a1 ; Right rts IM_DW_UD cmp.b #2,d0 ; U or D ? beq.s IM_DW_D ; Down add.l #BM_Max_X,a1 ; Up rts IM_DW_D sub.l #BM_Max_X,a1 ; Down rts IM_DW_X move.b [a0]+,d0 ; New start ? bne IM_Draw_Walls ; Yes rts ; Rand_Less_D0 move.l d1,-[sp] ; Save d1 bsr.s Random ; Get no. in d1 and.l #$0000FFFF,d1 ; Lose top word divu d0,d1 ; Get remainder swap d1 ; move.w d1,d0 ; move.l [sp]+,d1 ; Restore d1 rts ; Done Random movem.l d0/d2/d3,-[sp] move.l Seed,d0 move.l d0,d1 swap d1 roxl #2,d1 and #$FF00,d1 move d0,d2 roxl #1,d2 and #$00FF,d2 or d2,d1 rol #8,d1 move.l d0,d3 ror.l #8,d3 roxl #1,d3 and #$7FFF,d3 swap d1 move d3,d1 swap d1 add.l d1,d0 and.l #$7FFFFFFF,d0 addq.l #1,d0 bne.s Random_1 moveq #1,d0 Random_1 move.l d0,Seed move.l d0,d1 movem.l [sp]+,d0/d2/d3 rts Set_Display clr.b cVDU ; 0 tst.b d0 ; display 0 ? beq.s SD_X ; Yes, done Set_Display_1 move.b #1,cVDU ; 1 SD_X rts ; Done Set_Display_0 clr.b cVDU ; 0 rts ; Done Out_It tst.b cVDU ; 0 ? bne.s OI_ret ; No, ignore it movem.l a0-a1/d7,-[sp] ; Save regs cmp.w #40,d6 ; Check X bcc Out_It_X ; cmp.w #25,d7 ; Check Y bcc Out_It_X ; move d6,a0 ; Ptr mulu #40,d7 ; Calc offset add d7,a0 ; Y to ptr add.l #VDU,a0 ; Add base move.b d0,[a0] ; Char Out_It_X movem.l [sp]+,a0-a1/d7 ; Restore OI_ret rts ; Show_Window tst.b cVDU ; 0 ? bne.s OI_ret ; No, ignore movem.l d0-a1,-[sp] ; move d6,d1 ; X move d7,d2 ; Y bsr.s Draw_Window ; Show it movem.l [sp]+,d0-a1 ; rts ; Draw_Window move.l #VDU,a1 ; pScreen move d2,d3 ; Now calc pMaze asl.l #8,d3 ; asl.l #1,d3 ; * 512 move.l #BM_Start,a0 ; add.l d3,a0 ; pMaze move #BM_Max_X-1,d3 ; X max move #BM_Max_Y-1,d4 ; Y max move #24-1,d6 ; Y cnt -1 DW_Y_lp move #40-1,d5 ; X cnt -1 DW_X_lp move.l #$FF,d0 ; Moat char cmp.w #0,d1 ; X clip blt.s DW_Moat ; Fail cmp.w d3,d1 ; bhi.s DW_Moat ; cmp.w #0,d2 ; Y clip blt.s DW_Moat ; Fail cmp.w d4,d2 ; bhi.s DW_Moat ; move.b 0[a0,d1.w],d0 ; Get char from maze DW_Moat move.b d0,[a1]+ ; Char addq.w #1,d1 ; Inc X dbf d5,DW_X_lp ; Do rest of line add.l #BM_Max_X,a0 ; Step pMaze down sub.l #40,d1 ; Reset X addq.w #1,d2 ; Inc Y dbf d6,DW_Y_lp ; Do next line rts ; Finished Cls move.l #VDU,a0 ; move.w #(40*25)/4-1,d1 ; Count-1 clr.l d0 ; Zero Cls_Lp move.l d0,[a0]+ ; Long is faster dbf d1,Cls_Lp ; loop rts ; Done IM_Guard_Band move.w #BM_Max_X,d0 ; +1 IMGB_Lp move.b #$FF,[a0]+ ; Moat dbf d0,IMGB_Lp ; rts ; IM_Fill move.l #0,-[sp] ; End flag move.l a0,-[sp] ; Save ptr move.b [a0],d2 ; Empty state Fill_Lp move.l [sp]+,d1 ; Get ptr move.l d1,a0 ; beq Fill_X ; Done clr.b d3 ; Up flag clr.b d4 ; Down flag Fill_MoveLeft cmp.b [a0],d2 ; Empty ? bne Fill_Next ; subq.l #1,a0 ; Step left bra.s Fill_MoveLeft ; Fill_Next addq.l #1,a0 ; Step right cmp.b [a0],d2 ; Empty ? bne Fill_Lp ; Try next one move.b d0,[a0] ; Fill it move.b d3,d5 ; Save up flag move.b -BM_Max_X[a0],d3; Get Up cmp.b d2,d3 ; Empty ? bne.s FN_Not_Up ; No. cmp.b d2,d5 ; Was empty ? beq.s FN_Not_Up ; Yes pea -BM_Max_X[a0] ; Stack address FN_Not_Up move.b d4,d5 ; Save down flag move.b BM_Max_X[a0],d4 ; Get Down cmp.b d2,d4 ; Empty ? bne.s FN_Not_Down ; No. cmp.b d2,d5 ; Was empty ? beq.s FN_Not_Down ; Yes pea BM_Max_X[a0] ; Stack address FN_Not_Down bra.s Fill_Next addq.l #1,a0 ; Step right cmp.b [a0],d2 ; Empty ? bne.s Fill_Lp ; No move.b d0,[a0] ; Fill it, step bra.s Fill_Next ; Fill_X rts ; Done org (* or 1)+1 ; Word align WU equ 2 WD equ 3 WL equ 1 WR equ 0 Wall_Table defl BM_Start ; defb $95,WR:defw 69 ; - defb $96,WD:defw 48 ; | defb $99,WR:defw 258 ; - defb $9A,WU:defw 48 ; | defb $95,WR:defw 69 ; - defb $96,WD:defw 69 ; | defb $9A,WL:defw 48 ; - defb $95,WD:defw 258 ; | defb $99,WR:defw 48 ; - defb $96,WD:defw 69 ; | defb $9A,WL:defw 69 ; - defb $99,WU:defw 48 ; | defb $96,WL:defw 258 ; - defb $95,WD:defw 48 ; | defb $9A,WL:defw 69 ; - defb $99,WU:defw 69 ; | defb $95,WR:defw 48 ; - defb $9A,WU:defw 258 ; | defb $96,WL:defw 48 ; - defb $99,WU:defw 69 ; | defb $00,1 defl BM_Start+48*BM_Max_X+198 defb $9A,WU:defw 7 ; | defb $96,WL:defw 16 ; - defb $99,WU:defw 7 ; | defb $95,WR:defw 36 ; - defb $96,WD:defw 7 ; | defb $9A,WL:defw 16 ; - defb $95,WD:defw 7 ; | defb $99,WR:defw 0 ; - ; defb $9B,WU:defw 7 ; | ; defb $97,WR:defw 0 ; - defb $00,1 defl BM_Start+49*BM_Max_X+197 defb $9B,WU:defw 0 defb $95,WR:defw 0 defb $00,1 defl BM_Start+49*BM_Max_X+202 defb $9B,WU:defw 0 defb $96,WR:defw 0 defw 0 Bomb_List defl BM_Start_TLM+56+42*BM_Max_X defl BM_Start_TLM+49+49*BM_Max_X defl BM_Start_TLM+42+56*BM_Max_X defl BM_Start_BLM+42-7*BM_Max_X defl BM_Start_BLM+49+0*BM_Max_X defl BM_Start_BLM+56+7*BM_Max_X defl BM_Start_TRM-7+42*BM_Max_X defl BM_Start_TRM+0+49*BM_Max_X defl BM_Start_TRM+7+56*BM_Max_X defl BM_Start_BRM-7+7*BM_Max_X defl BM_Start_BRM+0+0*BM_Max_X defl BM_Start_BRM+7-7*BM_Max_X defl 0 cVDU defs 1 org (* or 3)+1 ; Long aligned Seed defs 4 MoveList defs 4