From bd4fc31f7658e3f186898468e0438c72b2a94fd5 Mon Sep 17 00:00:00 2001 From: JJFlash Date: Mon, 23 May 2022 22:14:02 +0200 Subject: [PATCH] One "Poke 198, 0" too many... --- MazeGenerator/MazeGenerator.xcbbas | 213 ++++++++++++++--------------- 1 file changed, 106 insertions(+), 107 deletions(-) diff --git a/MazeGenerator/MazeGenerator.xcbbas b/MazeGenerator/MazeGenerator.xcbbas index df004fe..4a80c8a 100644 --- a/MazeGenerator/MazeGenerator.xcbbas +++ b/MazeGenerator/MazeGenerator.xcbbas @@ -1,107 +1,106 @@ -'MEMCPY 2, $C000, $8D - -Const HIGHEST_Y = 24 : Const HIGHEST_X = 39 -Const SCREEN_ADDR = 1024 -Const WALL = 160 : Const SPACE = 32 : Const MOUSE = 81 - -Dim ScreenPosition as WORD fast : Dim NEWScreenPosition as WORD fast - -Dim NextDirection as BYTE fast: Dim FirstNextDirection as BYTE fast -Dim Steps as WORD fast: Dim MaxSteps as WORD fast - -Dim FinalScrPosition as WORD fast - -Dim scrAddrCache(25) as WORD @loc_scrAddrCache -loc_scrAddrCache: -DATA AS WORD 1024, 1064, 1104, 1144, 1184, 1224, 1264, 1304, 1344, 1384 -DATA AS WORD 1424, 1464, 1504, 1544, 1584, 1624, 1664, 1704, 1744, 1784 -DATA AS WORD 1824, 1864, 1904, 1944, 1984 - -Dim DirArray(4) as INT @loc_DirArray -loc_DirArray: -DATA AS INT 2, -80, -2, 80 - -function random as byte (a as byte, b as byte) static - poke $2A7, a - poke $2A8, b -asm - lda #$ff - sta $d40e - sta $d40f - lda #$80 - sta $d412 -rand: - lda $d41b - cmp $2A8 - bcs rand - adc $2A7 - sta $2A9 -end asm - random = peek($2A9) -end function - -print "press a key (i need randomness)" -poke 198, 0: wait 198, 1 - -poke 53280,0 : poke 53281,0 - -restart: -memset SCREEN_ADDR, 1000, WALL -memset SCREEN_ADDR, 40, SPACE -memset scrAddrCache(24), 40, SPACE - -FOR RowIndex As BYTE = 1 to 23 - 'No SPACEing at the column 0! - Poke scrAddrCache(RowIndex) + HIGHEST_X, SPACE -Next RowIndex - -Steps = 0 : MaxSteps = 0 : FinalScrPosition = 0 - -'REM ScreenPosition = SCREEN_ADDR + 81 + 80 * CINT(10 * RND() ) + 2 * CINT(10 * RND() ) -ScreenPosition = SCREEN_ADDR + 81 + (80 * cint(Random (0, 10))) + 2 * Random (0, 10) 'CINT *** VERY IMPORTANT *** - -poke ScreenPosition, 4 ' "D" - -DigAnotherLocation: - NextDirection = Random (0, 4) : FirstNextDirection = NextDirection - if Steps > MaxSteps then MaxSteps = Steps: FinalScrPosition = NEWScreenPosition - -TryDiggingAgain: - NEWScreenPosition = ScreenPosition + DirArray(NextDirection) - If Peek(NEWScreenPosition) = WALL Then - Poke NEWScreenPosition, NextDirection - Poke ScreenPosition + SHR(DirArray(NextDirection), 1), SPACE - ScreenPosition = NEWScreenPosition - Steps = Steps + 1 - Goto DigAnotherLocation - End If - - NextDirection = (NextDirection + 1) AND 3 'Keep NextDirection between 0 and 3 - If NextDirection <> FirstNextDirection then Goto TryDiggingAgain - - NextDirection = Peek(ScreenPosition) : Poke ScreenPosition, SPACE - Steps = Steps - 1 - If NextDirection < 4 then - ScreenPosition = ScreenPosition - DirArray(NextDirection) 'Backtrack! - Goto DigAnotherLocation - end If - - Poke ScreenPosition, 1 : Poke FinalScrPosition, 2 - Print "{HOME} max steps: " ; MaxSteps ; " - final loc: " ; FinalScrPosition - Poke 198, 0 - -' ****MOUSE**** - Poke ScreenPosition, MOUSE : NextDirection = 2 -Mouse: - wait $d011, 128 : wait $d011, 128, 128 : wait $d011, 128 - NEWScreenPosition = ScreenPosition + SHR(DirArray(NextDirection), 1) - if NEWScreenPosition = FinalScrPosition then goto restart - If Peek(NEWScreenPosition) = SPACE then - Poke NEWScreenPosition, MOUSE : Poke ScreenPosition, SPACE - ScreenPosition = NEWScreenPosition - NextDirection = (NextDirection - 2) AND 3 - End If - NextDirection = (NextDirection - 1) AND 3 - goto Mouse - -'MEMCPY $C000, 2, $8D +'MEMCPY 2, $C000, $8D + +Const HIGHEST_Y = 24 : Const HIGHEST_X = 39 +Const SCREEN_ADDR = 1024 +Const WALL = 160 : Const SPACE = 32 : Const MOUSE = 81 + +Dim ScreenPosition as WORD fast : Dim NEWScreenPosition as WORD fast + +Dim NextDirection as BYTE fast: Dim FirstNextDirection as BYTE fast +Dim Steps as WORD fast: Dim MaxSteps as WORD fast + +Dim FinalScrPosition as WORD fast + +Dim scrAddrCache(25) as WORD @loc_scrAddrCache +loc_scrAddrCache: +DATA AS WORD 1024, 1064, 1104, 1144, 1184, 1224, 1264, 1304, 1344, 1384 +DATA AS WORD 1424, 1464, 1504, 1544, 1584, 1624, 1664, 1704, 1744, 1784 +DATA AS WORD 1824, 1864, 1904, 1944, 1984 + +Dim DirArray(4) as INT @loc_DirArray +loc_DirArray: +DATA AS INT 2, -80, -2, 80 + +function random as byte (a as byte, b as byte) static + poke $2A7, a + poke $2A8, b +asm + lda #$ff + sta $d40e + sta $d40f + lda #$80 + sta $d412 +rand: + lda $d41b + cmp $2A8 + bcs rand + adc $2A7 + sta $2A9 +end asm + random = peek($2A9) +end function + +print "press a key (i need randomness)" +poke 198, 0: wait 198, 1 + +poke 53280,0 : poke 53281,0 + +restart: +memset SCREEN_ADDR, 1000, WALL +memset SCREEN_ADDR, 40, SPACE +memset scrAddrCache(24), 40, SPACE + +FOR RowIndex As BYTE = 1 to 23 + 'No SPACEing at the column 0! + Poke scrAddrCache(RowIndex) + HIGHEST_X, SPACE +Next RowIndex + +Steps = 0 : MaxSteps = 0 : FinalScrPosition = 0 + +'REM ScreenPosition = SCREEN_ADDR + 81 + 80 * CINT(10 * RND() ) + 2 * CINT(10 * RND() ) +ScreenPosition = SCREEN_ADDR + 81 + (80 * cint(Random (0, 10))) + 2 * Random (0, 10) 'CINT *** VERY IMPORTANT *** + +poke ScreenPosition, 4 ' "D" + +DigAnotherLocation: + NextDirection = Random (0, 4) : FirstNextDirection = NextDirection + if Steps > MaxSteps then MaxSteps = Steps: FinalScrPosition = NEWScreenPosition + +TryDiggingAgain: + NEWScreenPosition = ScreenPosition + DirArray(NextDirection) + If Peek(NEWScreenPosition) = WALL Then + Poke NEWScreenPosition, NextDirection + Poke ScreenPosition + SHR(DirArray(NextDirection), 1), SPACE + ScreenPosition = NEWScreenPosition + Steps = Steps + 1 + Goto DigAnotherLocation + End If + + NextDirection = (NextDirection + 1) AND 3 'Keep NextDirection between 0 and 3 + If NextDirection <> FirstNextDirection then Goto TryDiggingAgain + + NextDirection = Peek(ScreenPosition) : Poke ScreenPosition, SPACE + Steps = Steps - 1 + If NextDirection < 4 then + ScreenPosition = ScreenPosition - DirArray(NextDirection) 'Backtrack! + Goto DigAnotherLocation + end If + + Poke ScreenPosition, 1 : Poke FinalScrPosition, 2 + Print "{HOME} max steps: " ; MaxSteps ; " - final loc: " ; FinalScrPosition + +' ****MOUSE**** + Poke ScreenPosition, MOUSE : NextDirection = 2 +Mouse: + wait $d011, 128 : wait $d011, 128, 128 : wait $d011, 128 + NEWScreenPosition = ScreenPosition + SHR(DirArray(NextDirection), 1) + if NEWScreenPosition = FinalScrPosition then goto restart + If Peek(NEWScreenPosition) = SPACE then + Poke NEWScreenPosition, MOUSE : Poke ScreenPosition, SPACE + ScreenPosition = NEWScreenPosition + NextDirection = (NextDirection - 2) AND 3 + End If + NextDirection = (NextDirection - 1) AND 3 + goto Mouse + +'MEMCPY $C000, 2, $8D