From 335c4d2c9682ae9a4fbc25951c273ab1703d074a Mon Sep 17 00:00:00 2001
From: Brion Vibber <brion@pobox.com>
Date: Sun, 22 Jan 2023 07:36:08 -0800
Subject: [PATCH] and use display list copy in aligned memory

---
 mandel.s | 37 +++++++++++++++++++++++++------------
 1 file changed, 25 insertions(+), 12 deletions(-)

diff --git a/mandel.s b/mandel.s
index a2db742..6880e8b 100644
--- a/mandel.s
+++ b/mandel.s
@@ -24,10 +24,11 @@ FR1 = $e0
 FR2 = $e6
 
 ; High data
-framebuffer_top = $8000
+framebuffer_top    = $8000
+textbuffer         = $8f00
 framebuffer_bottom = $9000
-textbuffer = $9f00
-framebuffer_end = $a000
+display_list       = $9f00
+framebuffer_end    = $a000
 
 height = 184
 half_height = height >> 1
@@ -104,7 +105,7 @@ bit_masks:
     .byte 3 << 4
     .byte 3 << 6
 
-display_list:
+display_list_start:
     ; 48 lines overscan
     .repeat 5
         .byte $70 ; 8 blank lines
@@ -129,6 +130,8 @@ display_list:
 
     .byte $41 ; jump and blank
     .addr display_list
+display_list_end:
+display_list_len = display_list_end - display_list_start
 
 .code
 
@@ -528,14 +531,6 @@ done:
     ; Disable display DMA
     sta DMACTL
 
-    ; Set up the display list
-    lda #.lobyte(display_list)
-    sta DLISTL ; actual register
-    sta SDLSTL ; shadow register the OS will copy in
-    lda #.hibyte(display_list)
-    sta DLISTH ; actual register
-    sta SDLSTH ; shadow register the OS will copy in
-
     ; zero the range from framebuffer_top to framebuffer_end
     lda #.lobyte(framebuffer_top)
     sta temp
@@ -555,6 +550,24 @@ zero_byte_loop:
     cmp #.hibyte(framebuffer_end)
     bne zero_page_loop
 
+    ; Copy the display list into properly aligned memory
+    ; Can't cross 1024-byte boundaries :D
+    ldx #0
+copy_byte_loop:
+    lda display_list_start,x
+    sta display_list,x
+    inx
+    cpx #display_list_len
+    bne copy_byte_loop
+
+    ; Set up the display list
+    lda #.lobyte(display_list)
+    sta DLISTL ; actual register
+    sta SDLSTL ; shadow register the OS will copy in
+    lda #.hibyte(display_list)
+    sta DLISTH ; actual register
+    sta SDLSTH ; shadow register the OS will copy in
+
     ; Status bar
     draw_text 0, str_self_len, str_self
     draw_text 40 - str_run_len, str_run_len, str_run