Updated flicker-free code with new BBC Master labels

This commit is contained in:
Mark Moxon 2023-04-14 13:39:56 +01:00
commit d4aca52380
2 changed files with 106 additions and 102 deletions

View file

@ -31,9 +31,10 @@
\ from the BBC Micro version (which is very similar, if you ignore any different \ from the BBC Micro version (which is very similar, if you ignore any different
\ addresses). \ addresses).
\ \
\ XX14 is an unused variable in BBC Micro Elite, and the corresponding address \ LSNUM is an unused variable in BBC Micro Elite, and the corresponding address
\ in Commodore 64 Elite is used by something else. Luckily locations $FB to $FE \ in Commodore 64 Elite is used by something else. Luckily locations $FB to $FE
\ are unused by Elite and the OS, so we can sneak XX14 in there instead. \ are unused by Elite and the OS, so we can sneak LSNUM and LSNUM2 in there
\ instead.
\ \
\ Also, the Y variable contains the height of the space view in pixels, divided \ Also, the Y variable contains the height of the space view in pixels, divided
\ by 2. This is 96 on the BBC Micro, but the space view is 144 pixels on the \ by 2. This is 96 on the BBC Micro, but the space view is 144 pixels on the
@ -58,7 +59,8 @@
CNT = $00AA CNT = $00AA
XX4 = $00AD XX4 = $00AD
XX20 = $00AE XX20 = $00AE
XX14 = $00FB LSNUM = $00FB
LSNUM2 = $00FC
PROJ = $7D1F + $08F0 PROJ = $7D1F + $08F0
LL75 = $9FB8 + $0900 LL75 = $9FB8 + $0900
LL30 = $AB91 + $090C LL30 = $AB91 + $090C
@ -162,7 +164,7 @@
STA X2 \ Store the x-coordinate of the ship dot in X1, as this STA X2 \ Store the x-coordinate of the ship dot in X1, as this
\ is where the dash starts \ is where the dash starts
JMP LLX30 \ Draw this edge using flicker-free animation, by first JMP LSPUT \ Draw this edge using flicker-free animation, by first
\ drawing the ship's new line and then erasing the \ drawing the ship's new line and then erasing the
\ corresponding old line from the screen, and return \ corresponding old line from the screen, and return
\ from the subroutine using a tail call \ from the subroutine using a tail call
@ -183,11 +185,11 @@
.LL78 .LL78
LDA XX14 \ If XX14 >= CNT, skip to LL81 so we don't loop back for LDA LSNUM \ If LSNUM >= CNT, skip to LL81 so we don't loop back
CMP CNT \ the next edge (CNT was set to the maximum heap size CMP CNT \ for the next edge (CNT was set to the maximum heap
BCS LL81 \ for this ship in part 10, so this checks whether we BCS LL81 \ size for this ship in part 10, so this checks whether
\ have just run out of space in the ship line heap, and \ we have just run out of space in the ship line heap,
\ stops drawing edges if we have) \ and stops drawing edges if we have)
LDA V \ Increment V by 4 so V(1 0) points to the data for the LDA V \ Increment V by 4 so V(1 0) points to the data for the
CLC \ next edge CLC \ next edge
@ -231,17 +233,17 @@
.LL155 .LL155
LDY XX14 \ Set Y to the offset in the line heap XX14 LDY LSNUM \ Set Y to the offset in the line heap LSNUM
.LL27 .LL27
CPY XX14+1 \ If Y >= XX14+1, jump to LLEX to return from the ship CPY LSNUM2 \ If Y >= LSNUM2, jump to LLEX to return from the ship
BCS LLEX \ drawing routine, because the index in Y is greater BCS LLEX \ drawing routine, because the index in Y is greater
\ than the size of the existing ship line heap, which \ than the size of the existing ship line heap, which
\ means we have alrady erased all the old ships lines \ means we have alrady erased all the old ships lines
\ when drawing the new ship \ when drawing the new ship
\ If we get here then Y < XX14+1, which means Y is \ If we get here then Y < LSNUM2, which means Y is
\ pointing to an on-screen line from the old ship that \ pointing to an on-screen line from the old ship that
\ we need to erase \ we need to erase
@ -273,7 +275,7 @@
.LLEX .LLEX
LDA XX14 \ Store XX14 in the first byte of the ship line heap LDA LSNUM \ Store LSNUM in the first byte of the ship line heap
LDY #0 LDY #0
STA (XX19),Y STA (XX19),Y
@ -522,12 +524,12 @@
BNE WP1 \ heap is empty), jump to WP1 to reset the line heap BNE WP1 \ heap is empty), jump to WP1 to reset the line heap
\ without redrawing the planet \ without redrawing the planet
STY XX14 \ Reset XX14 to the start of the ball line heap (we can STY LSNUM \ Reset LSNUM to the start of the ball line heap (we can
\ set this to 0 rather than 1 to take advantage of the \ set this to 0 rather than 1 to take advantage of the
\ fact that Y is 0 - the effect is the same) \ fact that Y is 0 - the effect is the same)
LDA LSP \ Set XX14+1 to the end of the ball line heap LDA LSP \ Set LSNUM2 to the end of the ball line heap
STA XX14+1 STA LSNUM2
JSR EraseRestOfPlanet \ Draw the contents of the ball line heap to erase the JSR EraseRestOfPlanet \ Draw the contents of the ball line heap to erase the
\ old planet \ old planet
@ -547,11 +549,11 @@
.EraseRestOfPlanet .EraseRestOfPlanet
LDY XX14 \ Set Y to the offset in XX14, which points to the part LDY LSNUM \ Set Y to the offset in LSNUM, which points to the part
\ of the heap that we are overwriting with new points \ of the heap that we are overwriting with new points
CPY XX14+1 \ If XX14 >= XX14+1, then we have already redrawn all of CPY LSNUM2 \ If LSNUM >= LSNUM2, then we have already redrawn all
BCS eras1 \ the lines from the old circle's ball line heap, so BCS eras1 \ of the lines from the old circle's ball line heap, so
\ skip the following \ skip the following
JSR DrawPlanetLine \ Erase the next planet line from the ball line heap JSR DrawPlanetLine \ Erase the next planet line from the ball line heap
@ -614,7 +616,7 @@
\ ****************************************************************************** \ ******************************************************************************
\ \
\ Name: LLX30 \ Name: LSPUT
\ Type: Subroutine \ Type: Subroutine
\ Category: Drawing lines \ Category: Drawing lines
\ Summary: Draw a ship line using flicker-free animation \ Summary: Draw a ship line using flicker-free animation
@ -625,12 +627,12 @@
GUARD $7300 GUARD $7300
.LLX30 .LSPUT
LDY XX14 \ Set Y = XX14, to get the offset within the ship line LDY LSNUM \ Set Y = LSNUM, to get the offset within the ship line
\ heap where we want to insert our new line \ heap where we want to insert our new line
CPY XX14+1 \ Compare XX14 and XX14+1 and store the flags on the CPY LSNUM2 \ Compare LSNUM and LSNUM2 and store the flags on the
PHP \ stack so we can retrieve them later PHP \ stack so we can retrieve them later
LDX #3 \ We now want to copy the line coordinates (X1, Y1) and LDX #3 \ We now want to copy the line coordinates (X1, Y1) and
@ -679,13 +681,13 @@
STA (XX19),Y STA (XX19),Y
INY \ Increment the index to point to the next coordinate INY \ Increment the index to point to the next coordinate
STY XX14 \ and store the updated index in XX14 STY LSNUM \ and store the updated index in LSNUM
PLP \ Restore the result of the comparison above, so if the PLP \ Restore the result of the comparison above, so if the
BCS LL82a \ original value of XX14 >= XX14+1, then we have already BCS LL82a \ original value of LSNUM >= LSNUM2, then we have
\ redrawn all the lines from the old ship's line heap, \ alreadyredrawn all the lines from the old ship's line
\ so return from the subroutine (as LL82 contains an \ heap, so return from the subroutine (as LL82 contains
\ RTS) \ an RTS)
JMP LL30 \ Otherwise there are still more lines to erase from the JMP LL30 \ Otherwise there are still more lines to erase from the
\ old ship on-screen, so the coordinates in (X1, Y1) and \ old ship on-screen, so the coordinates in (X1, Y1) and
@ -722,15 +724,15 @@
\ We now set things up for flicker-free ship plotting, \ We now set things up for flicker-free ship plotting,
\ by setting the following: \ by setting the following:
\ \
\ XX14 = offset to the first coordinate in the ship's \ LSNUM = offset to the first coordinate in the ship's
\ line heap \ line heap
\ \
\ XX14+1 = the number of bytes in the heap for the \ LSNUM2 = the number of bytes in the heap for the
\ ship that's currently on-screen (or 0 if \ ship that's currently on-screen (or 0 if
\ there is no ship currently on-screen) \ there is no ship currently on-screen)
LDY #1 \ Set XX14 = 1, the offset of the first set of line LDY #1 \ Set LSNUM = 1, the offset of the first set of line
STY XX14 \ coordinates in the ship line heap STY LSNUM \ coordinates in the ship line heap
DEY \ Decrement Y to 0 DEY \ Decrement Y to 0
@ -739,7 +741,7 @@
BNE P%+5 \ following two instructions BNE P%+5 \ following two instructions
LDA #0 \ The ship is not being drawn on screen, so set A = 0 LDA #0 \ The ship is not being drawn on screen, so set A = 0
\ so that XX14+1 gets set to 0 below (as there are no \ so that LSNUM2 gets set to 0 below (as there are no
\ existing coordinates on the ship line heap for this \ existing coordinates on the ship line heap for this
\ ship) \ ship)
@ -747,8 +749,8 @@
\ $2C $B1 $BD, or BIT $BDB1 which does nothing apart \ $2C $B1 $BD, or BIT $BDB1 which does nothing apart
\ from affect the flags \ from affect the flags
LDA (XX19),Y \ Set XX14+1 to the first byte of the ship's line heap, LDA (XX19),Y \ Set LSNUM2 to the first byte of the ship's line heap,
STA XX14+1 \ which contains the number of bytes in the heap STA LSNUM2 \ which contains the number of bytes in the heap
RTS RTS
@ -766,9 +768,9 @@
\ We replace the JMP LL78 instruction at the end of part \ We replace the JMP LL78 instruction at the end of part
\ 10 of LL9 with JSR PATCH2, so this effectively inserts \ 10 of LL9 with JSR PATCH2, so this effectively inserts
\ the call to LLX30 at the end of part 10, as required \ the call to LSPUT at the end of part 10, as required
JSR LLX30 \ Draw the laser line using flicker-free animation, by JSR LSPUT \ Draw the laser line using flicker-free animation, by
\ first drawing the new laser line and then erasing the \ first drawing the new laser line and then erasing the
\ corresponding old line from the screen \ corresponding old line from the screen
@ -798,7 +800,7 @@
LDA #0 \ Clear bit 7 of K3+9 to indicate that there is no line LDA #0 \ Clear bit 7 of K3+9 to indicate that there is no line
STA K3+9 \ to draw (we may change this below) STA K3+9 \ to draw (we may change this below)
LDA XX14 \ If XX14 = 1, then this is the first point from the LDA LSNUM \ If LSNUM = 1, then this is the first point from the
CMP #2 \ heap, so jump to plin3 to set the previous coordinate CMP #2 \ heap, so jump to plin3 to set the previous coordinate
BCC plin3 \ and return from the subroutine BCC plin3 \ and return from the subroutine
@ -813,11 +815,11 @@
TYA TYA
PHA PHA
LDY XX14 \ Set Y to the offset in XX14, which points to the part LDY LSNUM \ Set Y to the offset in LSNUM, which points to the part
\ of the heap that we are overwriting with new points \ of the heap that we are overwriting with new points
CPY XX14+1 \ If XX14 >= XX14+1, then we have already redrawn all of CPY LSNUM2 \ If LSNUM >= LSNUM2, then we have already redrawn all
BCS plin1 \ the lines from the old circle's ball line heap, so BCS plin1 \ of the lines from the old circle's ball line heap, so
\ jump to plin1 to return from the subroutine \ jump to plin1 to return from the subroutine
\ Otherwise we need to draw the line from the heap, to \ Otherwise we need to draw the line from the heap, to
@ -829,19 +831,19 @@
LDA K3+3 \ Set Y1 = K3+3 = screen y-coordinate of previous point LDA K3+3 \ Set Y1 = K3+3 = screen y-coordinate of previous point
STA Y1 \ from the old heap STA Y1 \ from the old heap
LDA LSX2,Y \ Set X2 to the y-coordinate from the XX14-th point in LDA LSX2,Y \ Set X2 to the y-coordinate from the LSNUM-th point in
STA X2 \ the heap STA X2 \ the heap
STA K3+2 \ Store the x-coordinate of the point we are overwriting STA K3+2 \ Store the x-coordinate of the point we are overwriting
\ in K3+2, so we can use it on the next iteration \ in K3+2, so we can use it on the next iteration
LDA LSY2,Y \ Set Y2 to the y-coordinate from the XX14-th point in LDA LSY2,Y \ Set Y2 to the y-coordinate from the LSNUM-th point in
STA Y2 \ the heap STA Y2 \ the heap
STA K3+3 \ Store the y-coordinate of the point we are overwriting STA K3+3 \ Store the y-coordinate of the point we are overwriting
\ in K3+3, so we can use it on the next iteration \ in K3+3, so we can use it on the next iteration
INC XX14 \ Increment XX14 to point to the next coordinate, so we INC LSNUM \ Increment LSNUM to point to the next coordinate, so we
\ work our way through the current heap \ work our way through the current heap
LDA Y1 \ If Y1 or Y2 = &FF then this indicates a break in the LDA Y1 \ If Y1 or Y2 = &FF then this indicates a break in the
@ -897,12 +899,12 @@
LDA LSY2+1 LDA LSY2+1
STA K3+3 STA K3+3
INC XX14 \ Increment XX14 to point to the next coordinate, so we INC LSNUM \ Increment LSNUM to point to the next coordinate, so we
\ work our way through the current heap \ work our way through the current heap
RTS \ Return from the subroutine RTS \ Return from the subroutine
SAVE "extra-plus4.bin", LLX30, P% SAVE "extra-plus4.bin", LSPUT, P%
\ ****************************************************************************** \ ******************************************************************************
\ \
@ -1012,11 +1014,11 @@
.PATCH5 .PATCH5
LDX #0 \ Set XX14 = 0, to point to the offset before the first LDX #0 \ Set LSNUM = 0, to point to the offset before the first
STX XX14 \ set of circle coordinates in the ball line heap STX LSNUM \ set of circle coordinates in the ball line heap
LDX LSP \ Set XX14+1 to the last byte of the ball line heap LDX LSP \ Set LSNUM2 to the last byte of the ball line heap
STX XX14+1 STX LSNUM2
LDX #1 \ Set LSP = 1 to reset the ball line heap pointer LDX #1 \ Set LSP = 1 to reset the ball line heap pointer
STX LSP STX LSP

View file

@ -31,9 +31,10 @@
\ from the BBC Micro version (which is very similar, if you ignore any different \ from the BBC Micro version (which is very similar, if you ignore any different
\ addresses). \ addresses).
\ \
\ XX14 is an unused variable in BBC Micro Elite, and the corresponding address \ LSNUM is an unused variable in BBC Micro Elite, and the corresponding address
\ in Commodore 64 Elite is used by something else. Luckily locations $FB to $FE \ in Commodore 64 Elite is used by something else. Luckily locations $FB to $FE
\ are unused by Elite and the OS, so we can sneak XX14 in there instead. \ are unused by Elite and the OS, so we can sneak LSNUM and LSNUM2 in there
\ instead.
\ \
\ Also, the Y variable contains the height of the space view in pixels, divided \ Also, the Y variable contains the height of the space view in pixels, divided
\ by 2. This is 96 on the BBC Micro, but the space view is 144 pixels on the \ by 2. This is 96 on the BBC Micro, but the space view is 144 pixels on the
@ -58,7 +59,8 @@
CNT = $00AA CNT = $00AA
XX4 = $00AD XX4 = $00AD
XX20 = $00AE XX20 = $00AE
XX14 = $00FB LSNUM = $00FB
LSNUM2 = $00FC
PROJ = $7D1F PROJ = $7D1F
LL75 = $9FB8 LL75 = $9FB8
LL30 = $AB91 LL30 = $AB91
@ -162,7 +164,7 @@
STA X2 \ Store the x-coordinate of the ship dot in X1, as this STA X2 \ Store the x-coordinate of the ship dot in X1, as this
\ is where the dash starts \ is where the dash starts
JMP LLX30 \ Draw this edge using flicker-free animation, by first JMP LSPUT \ Draw this edge using flicker-free animation, by first
\ drawing the ship's new line and then erasing the \ drawing the ship's new line and then erasing the
\ corresponding old line from the screen, and return \ corresponding old line from the screen, and return
\ from the subroutine using a tail call \ from the subroutine using a tail call
@ -183,11 +185,11 @@
.LL78 .LL78
LDA XX14 \ If XX14 >= CNT, skip to LL81 so we don't loop back for LDA LSNUM \ If LSNUM >= CNT, skip to LL81 so we don't loop back
CMP CNT \ the next edge (CNT was set to the maximum heap size CMP CNT \ for the next edge (CNT was set to the maximum heap
BCS LL81 \ for this ship in part 10, so this checks whether we BCS LL81 \ size for this ship in part 10, so this checks whether
\ have just run out of space in the ship line heap, and \ we have just run out of space in the ship line heap,
\ stops drawing edges if we have) \ and stops drawing edges if we have)
LDA V \ Increment V by 4 so V(1 0) points to the data for the LDA V \ Increment V by 4 so V(1 0) points to the data for the
CLC \ next edge CLC \ next edge
@ -231,17 +233,17 @@
.LL155 .LL155
LDY XX14 \ Set Y to the offset in the line heap XX14 LDY LSNUM \ Set Y to the offset in the line heap LSNUM
.LL27 .LL27
CPY XX14+1 \ If Y >= XX14+1, jump to LLEX to return from the ship CPY LSNUM2 \ If Y >= LSNUM2, jump to LLEX to return from the ship
BCS LLEX \ drawing routine, because the index in Y is greater BCS LLEX \ drawing routine, because the index in Y is greater
\ than the size of the existing ship line heap, which \ than the size of the existing ship line heap, which
\ means we have alrady erased all the old ships lines \ means we have alrady erased all the old ships lines
\ when drawing the new ship \ when drawing the new ship
\ If we get here then Y < XX14+1, which means Y is \ If we get here then Y < LSNUM2, which means Y is
\ pointing to an on-screen line from the old ship that \ pointing to an on-screen line from the old ship that
\ we need to erase \ we need to erase
@ -273,7 +275,7 @@
.LLEX .LLEX
LDA XX14 \ Store XX14 in the first byte of the ship line heap LDA LSNUM \ Store LSNUM in the first byte of the ship line heap
LDY #0 LDY #0
STA (XX19),Y STA (XX19),Y
@ -522,12 +524,12 @@
BNE WP1 \ heap is empty), jump to WP1 to reset the line heap BNE WP1 \ heap is empty), jump to WP1 to reset the line heap
\ without redrawing the planet \ without redrawing the planet
STY XX14 \ Reset XX14 to the start of the ball line heap (we can STY LSNUM \ Reset LSNUM to the start of the ball line heap (we can
\ set this to 0 rather than 1 to take advantage of the \ set this to 0 rather than 1 to take advantage of the
\ fact that Y is 0 - the effect is the same) \ fact that Y is 0 - the effect is the same)
LDA LSP \ Set XX14+1 to the end of the ball line heap LDA LSP \ Set LSNUM2 to the end of the ball line heap
STA XX14+1 STA LSNUM2
JSR EraseRestOfPlanet \ Draw the contents of the ball line heap to erase the JSR EraseRestOfPlanet \ Draw the contents of the ball line heap to erase the
\ old planet \ old planet
@ -539,7 +541,7 @@
\ ****************************************************************************** \ ******************************************************************************
\ \
\ Name: LLX30 \ Name: LSPUT
\ Type: Subroutine \ Type: Subroutine
\ Category: Drawing lines \ Category: Drawing lines
\ Summary: Draw a ship line using flicker-free animation \ Summary: Draw a ship line using flicker-free animation
@ -550,12 +552,12 @@
GUARD $CE00 GUARD $CE00
.LLX30 .LSPUT
LDY XX14 \ Set Y = XX14, to get the offset within the ship line LDY LSNUM \ Set Y = LSNUM, to get the offset within the ship line
\ heap where we want to insert our new line \ heap where we want to insert our new line
CPY XX14+1 \ Compare XX14 and XX14+1 and store the flags on the CPY LSNUM2 \ Compare LSNUM and LSNUM2 and store the flags on the
PHP \ stack so we can retrieve them later PHP \ stack so we can retrieve them later
LDX #3 \ We now want to copy the line coordinates (X1, Y1) and LDX #3 \ We now want to copy the line coordinates (X1, Y1) and
@ -604,13 +606,13 @@
STA (XX19),Y STA (XX19),Y
INY \ Increment the index to point to the next coordinate INY \ Increment the index to point to the next coordinate
STY XX14 \ and store the updated index in XX14 STY LSNUM \ and store the updated index in LSNUM
PLP \ Restore the result of the comparison above, so if the PLP \ Restore the result of the comparison above, so if the
BCS LL82a \ original value of XX14 >= XX14+1, then we have already BCS LL82a \ original value of LSNUM >= LSNUM2, then we have
\ redrawn all the lines from the old ship's line heap, \ alreadyredrawn all the lines from the old ship's line
\ so return from the subroutine (as LL82 contains an \ heap, so return from the subroutine (as LL82 contains
\ RTS) \ an RTS)
JMP LL30 \ Otherwise there are still more lines to erase from the JMP LL30 \ Otherwise there are still more lines to erase from the
\ old ship on-screen, so the coordinates in (X1, Y1) and \ old ship on-screen, so the coordinates in (X1, Y1) and
@ -647,15 +649,15 @@
\ We now set things up for flicker-free ship plotting, \ We now set things up for flicker-free ship plotting,
\ by setting the following: \ by setting the following:
\ \
\ XX14 = offset to the first coordinate in the ship's \ LSNUM = offset to the first coordinate in the ship's
\ line heap \ line heap
\ \
\ XX14+1 = the number of bytes in the heap for the \ LSNUM2 = the number of bytes in the heap for the
\ ship that's currently on-screen (or 0 if \ ship that's currently on-screen (or 0 if
\ there is no ship currently on-screen) \ there is no ship currently on-screen)
LDY #1 \ Set XX14 = 1, the offset of the first set of line LDY #1 \ Set LSNUM = 1, the offset of the first set of line
STY XX14 \ coordinates in the ship line heap STY LSNUM \ coordinates in the ship line heap
DEY \ Decrement Y to 0 DEY \ Decrement Y to 0
@ -664,7 +666,7 @@
BNE P%+5 \ following two instructions BNE P%+5 \ following two instructions
LDA #0 \ The ship is not being drawn on screen, so set A = 0 LDA #0 \ The ship is not being drawn on screen, so set A = 0
\ so that XX14+1 gets set to 0 below (as there are no \ so that LSNUM2 gets set to 0 below (as there are no
\ existing coordinates on the ship line heap for this \ existing coordinates on the ship line heap for this
\ ship) \ ship)
@ -672,8 +674,8 @@
\ $2C $B1 $BD, or BIT $BDB1 which does nothing apart \ $2C $B1 $BD, or BIT $BDB1 which does nothing apart
\ from affect the flags \ from affect the flags
LDA (XX19),Y \ Set XX14+1 to the first byte of the ship's line heap, LDA (XX19),Y \ Set LSNUM2 to the first byte of the ship's line heap,
STA XX14+1 \ which contains the number of bytes in the heap STA LSNUM2 \ which contains the number of bytes in the heap
RTS RTS
@ -691,9 +693,9 @@
\ We replace the JMP LL78 instruction at the end of part \ We replace the JMP LL78 instruction at the end of part
\ 10 of LL9 with JSR PATCH2, so this effectively inserts \ 10 of LL9 with JSR PATCH2, so this effectively inserts
\ the call to LLX30 at the end of part 10, as required \ the call to LSPUT at the end of part 10, as required
JSR LLX30 \ Draw the laser line using flicker-free animation, by JSR LSPUT \ Draw the laser line using flicker-free animation, by
\ first drawing the new laser line and then erasing the \ first drawing the new laser line and then erasing the
\ corresponding old line from the screen \ corresponding old line from the screen
@ -711,11 +713,11 @@
.EraseRestOfPlanet .EraseRestOfPlanet
LDY XX14 \ Set Y to the offset in XX14, which points to the part LDY LSNUM \ Set Y to the offset in LSNUM, which points to the part
\ of the heap that we are overwriting with new points \ of the heap that we are overwriting with new points
CPY XX14+1 \ If XX14 >= XX14+1, then we have already redrawn all of CPY LSNUM2 \ If LSNUM >= LSNUM2, then we have already redrawn all
BCS eras1 \ the lines from the old circle's ball line heap, so BCS eras1 \ of the lines from the old circle's ball line heap, so
\ skip the following \ skip the following
JSR DrawPlanetLine \ Erase the next planet line from the ball line heap JSR DrawPlanetLine \ Erase the next planet line from the ball line heap
@ -750,7 +752,7 @@
LDA #0 \ Clear bit 7 of K3+9 to indicate that there is no line LDA #0 \ Clear bit 7 of K3+9 to indicate that there is no line
STA K3+9 \ to draw (we may change this below) STA K3+9 \ to draw (we may change this below)
LDA XX14 \ If XX14 = 1, then this is the first point from the LDA LSNUM \ If LSNUM = 1, then this is the first point from the
CMP #2 \ heap, so jump to plin3 to set the previous coordinate CMP #2 \ heap, so jump to plin3 to set the previous coordinate
BCC plin3 \ and return from the subroutine BCC plin3 \ and return from the subroutine
@ -765,11 +767,11 @@
TYA TYA
PHA PHA
LDY XX14 \ Set Y to the offset in XX14, which points to the part LDY LSNUM \ Set Y to the offset in LSNUM, which points to the part
\ of the heap that we are overwriting with new points \ of the heap that we are overwriting with new points
CPY XX14+1 \ If XX14 >= XX14+1, then we have already redrawn all of CPY LSNUM2 \ If LSNUM >= LSNUM2, then we have already redrawn all
BCS plin1 \ the lines from the old circle's ball line heap, so BCS plin1 \ of the lines from the old circle's ball line heap, so
\ jump to plin1 to return from the subroutine \ jump to plin1 to return from the subroutine
\ Otherwise we need to draw the line from the heap, to \ Otherwise we need to draw the line from the heap, to
@ -781,19 +783,19 @@
LDA K3+3 \ Set Y1 = K3+3 = screen y-coordinate of previous point LDA K3+3 \ Set Y1 = K3+3 = screen y-coordinate of previous point
STA Y1 \ from the old heap STA Y1 \ from the old heap
LDA LSX2,Y \ Set X2 to the y-coordinate from the XX14-th point in LDA LSX2,Y \ Set X2 to the y-coordinate from the LSNUM-th point in
STA X2 \ the heap STA X2 \ the heap
STA K3+2 \ Store the x-coordinate of the point we are overwriting STA K3+2 \ Store the x-coordinate of the point we are overwriting
\ in K3+2, so we can use it on the next iteration \ in K3+2, so we can use it on the next iteration
LDA LSY2,Y \ Set Y2 to the y-coordinate from the XX14-th point in LDA LSY2,Y \ Set Y2 to the y-coordinate from the LSNUM-th point in
STA Y2 \ the heap STA Y2 \ the heap
STA K3+3 \ Store the y-coordinate of the point we are overwriting STA K3+3 \ Store the y-coordinate of the point we are overwriting
\ in K3+3, so we can use it on the next iteration \ in K3+3, so we can use it on the next iteration
INC XX14 \ Increment XX14 to point to the next coordinate, so we INC LSNUM \ Increment LSNUM to point to the next coordinate, so we
\ work our way through the current heap \ work our way through the current heap
LDA Y1 \ If Y1 or Y2 = &FF then this indicates a break in the LDA Y1 \ If Y1 or Y2 = &FF then this indicates a break in the
@ -849,7 +851,7 @@
LDA LSY2+1 LDA LSY2+1
STA K3+3 STA K3+3
INC XX14 \ Increment XX14 to point to the next coordinate, so we INC LSNUM \ Increment LSNUM to point to the next coordinate, so we
\ work our way through the current heap \ work our way through the current heap
RTS \ Return from the subroutine RTS \ Return from the subroutine
@ -911,7 +913,7 @@
RTS \ Return from the subroutine RTS \ Return from the subroutine
SAVE "extra.bin", LLX30, P% SAVE "extra.bin", LSPUT, P%
\ ****************************************************************************** \ ******************************************************************************
\ \
@ -974,11 +976,11 @@
.PATCH5 .PATCH5
LDX #0 \ Set XX14 = 0, to point to the offset before the first LDX #0 \ Set LSNUM = 0, to point to the offset before the first
STX XX14 \ set of circle coordinates in the ball line heap STX LSNUM \ set of circle coordinates in the ball line heap
LDX LSP \ Set XX14+1 to the last byte of the ball line heap LDX LSP \ Set LSNUM2 to the last byte of the ball line heap
STX XX14+1 STX LSNUM2
LDX #1 \ Set LSP = 1 to reset the ball line heap pointer LDX #1 \ Set LSP = 1 to reset the ball line heap pointer
STX LSP STX LSP