uploaded initial source

Still a work in progress, only tested in Virtual II. Does not tell you if you've won or lost.

Built with Merlin32, no additional libraries required.
This commit is contained in:
Charles Mangin 2018-06-13 10:30:02 -04:00 committed by GitHub
parent e3c145126d
commit 3e58bff2aa
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
1 changed files with 978 additions and 0 deletions

978
MINESWEEPER.s Normal file
View File

@ -0,0 +1,978 @@
DSK MS
**************************************************
* minesweeper
*
* test board
*
* 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 0 0 0 0 = 0x10
* 0 0 0 0 1 0 0 0 = 0x08
* 0 0 0 0 0 0 0 0
* 0 0 0 0 0 0 0 0
* 0 0 0 0 0 0 0 0
*
* solve result:
*
* 0 0 0 0 0 0 0 0
* 0 0 0 0 0 0 0 0
* 0 0 1 1 1 0 0 0
* 0 0 1 X 2 1 0 0
* 0 0 1 2 X 1 0 0
* 0 0 0 1 1 1 0 0
* 0 0 0 0 0 0 0 0
* 0 0 0 0 0 0 0 0
*
**************************************************
**************************************************
*
* TO DO: win message when progress = 64 and all bombs marked
* lose message when clearing a cell with bomb
* sounds?
*
**************************************************
**************************************************
* Variables
**************************************************
SOLVEORIGIN EQU $9100 ; 'solved' board to reveal
PROGRESSORIGIN EQU $9200 ; revealed squares
BOMBLOC EQU $FC
ROWBYTE EQU $FD
ROW EQU $FA ; row/col in board
COLUMN EQU $FB
PLOTROW EQU $FE ; row/col in text page
PLOTCOLUMN EQU $FF
]ROWS = #$8
]COLUMNS = #$8
CHAR EQU $FC ; char to plot
STRLO EQU $EB ; string lo/hi for printing
STRHI EQU $EC
SCORE EQU $ED ; bombs found
PROGRESS EQU $EE ; cells cleared
BOMBS EQU $EF ; total bombs
**************************************************
* Apple Standard Memory Locations
**************************************************
CLRLORES EQU $F832
LORES EQU $C050
TXTSET EQU $C051
MIXCLR EQU $C052
MIXSET EQU $C053
TXTPAGE1 EQU $C054
TXTPAGE2 EQU $C055
KEY EQU $C000
C80STOREOFF EQU $C000
C80STOREON EQU $C001
STROBE EQU $C010
SPEAKER EQU $C030
VBL EQU $C02E
RDVBLBAR EQU $C019 ;not VBL (VBL signal low
RAMWRTAUX EQU $C005
RAMWRTMAIN EQU $C004
SETAN3 EQU $C05E ;Set annunciator-3 output to 0
SET80VID EQU $C00D ;enable 80-column display mode (WR-only)
HOME EQU $FC58 ; clear the text screen
CH EQU $24 ; cursor Horiz
CV EQU $25 ; cursor Vert
VTAB EQU $FC22 ; Sets the cursor vertical position (from CV)
COUT EQU $FDED ; Calls the output routine whose address is stored in CSW,
; normally COUTI
STROUT EQU $DB3A ;Y=String ptr high, A=String ptr low
**************************************************
* START
**************************************************
ORG $1000 ; PROGRAM DATA STARTS AT $1000
**************************************************
* Draws the blank board borders, corners, borders
**************************************************
DRAWBOARD JSR HOME
CORNERS LDA #$01
STA PLOTROW
STA PLOTCOLUMN
LDA #$2E ; .
STA CHAR
JSR PLOTCHAR
LDA #$11
STA PLOTCOLUMN
JSR PLOTCHAR
LDA #$27
STA CHAR ; '
LDA #$11
STA PLOTROW
STA PLOTCOLUMN
JSR PLOTCHAR
LDA #$01
STA PLOTCOLUMN
JSR PLOTCHAR
;/CORNERS
HLINES LDA #$02 ; start at column 2
STA PLOTCOLUMN
LDA #$2D ; -
STA CHAR
HLINESLOOP LDA #$01 ; row 1
STA PLOTROW
JSR PLOTCHAR
HROWSLOOP INC PLOTROW
INC PLOTROW ; row 3, 5, ...
JSR PLOTCHAR
LDA PLOTROW
CMP #$10 ; goes to 17
BMI HROWSLOOP
;/HROWSLOOP
INC PLOTCOLUMN
LDA PLOTCOLUMN
CMP #$11 ; goes to 16
BMI HLINESLOOP
;/HLINES
VLINES LDA #$02 ; start at column 2
STA PLOTROW
LDA #$3A ; :
STA CHAR
VLINESLOOP LDA #$01 ; row 1
STA PLOTCOLUMN
JSR PLOTCHAR
VCOLUMNSLOOP INC PLOTCOLUMN ; row 2, 4, ...
INC PLOTCOLUMN ; row 3, 5, ...
JSR PLOTCHAR
LDA PLOTCOLUMN
CMP #$11 ; goes to 16
BMI VCOLUMNSLOOP
;/VCOLUMNSLOOP
INC PLOTROW
LDA PLOTROW
CMP #$11 ; goes to 16
BMI VLINESLOOP
;/VLINES
* + ROW*2 + 1, COLUMN*2 + 1
PLUSES
LDA #$03 ; starts at 3,3
STA PLOTROW
LDA #$2B ; +
STA CHAR
PLUSLOOP
LDA #$03 ; starts at 3,3
STA PLOTCOLUMN
PLUSCOLS
JSR PLOTCHAR
INC PLOTCOLUMN
INC PLOTCOLUMN
LDA PLOTCOLUMN
CMP #$10
BMI PLUSCOLS
;/PLUSCOLS
INC PLOTROW
INC PLOTROW
LDA PLOTROW
CMP #$10
BMI PLUSLOOP
;/PLUSLOOP
**************************************************
* sets up solving matrix, resets scoreboard
* each cell = 1 byte
**************************************************
SETUP LDX #$0
STX BOMBS
STX PROGRESS
STX SCORE
SETUPLOOP LDA #$0
STA SOLVEORIGIN,X ; set byte at origin + x = 0
LDA #$FF
STA PROGRESSORIGIN,X ; progress reset - FF = unsolved
INX
CPX ]ROWS*]COLUMNS ; $#40 = hex 64 = 8x8
BNE SETUPLOOP
;/setuploop
SETUPBOARD
LDX #$8 ; X = 8
ROWLOOP3 ; (ROW 7 to 0)
DEX
STX ROW
LDA #$0
STA BOARDORIGIN,X ; set byte at BOARDORIGIN,x 0
LDY #$8 ; start columnloop (COLUMN 0 to 7)
COLUMNLOOP3 CLC ; clear CARRY to 0
DEY
STY COLUMN ; store column for later retrieval
LDA $C030 ; get byte, pseudorandom source?
ROL ; random bit into Carry
ROL ; random bit into Carry
ROL BOARDORIGIN,X ; random bit into row byte
TYA ; last COLUMN?
BNE COLUMNLOOP3 ; loop
; /columnloop3
TXA ; current row into Accumulator
; last ROW?
BNE ROWLOOP3 ; loop
;/rowloop3
;/SETUPBOARD
**************************************************
* solves the board
**************************************************
SOLVEBOARD
LDX #$8 ; X = 8
ROWLOOP ; (ROW 8 to 0)
DEX
STX ROW
LDA BOARDORIGIN,X ; puts byte at ROW into accumulator
STA ROWBYTE ; byte is in ROWBYTE
; start columnloop (COLUMN 0 to 7)
LDY #$8
COLUMNLOOP CLC ; clear CARRY to 0
DEY
STY COLUMN ; store column for later retrieval
ROL ROWBYTE ; rotate accumulator bit into CARRY
BCC NOBOMB ; if CARRY = 0
JSR FOUNDBOMB ; if CARRY > 0
NOBOMB ; do nothing.
TYA ; last COLUMN?
BNE COLUMNLOOP ; loop
; /columnloop
TXA ; current row into Accumulator
; last ROW?
BNE ROWLOOP ; loop
;/rowloop
**************************************************
* draws the blank squares to be solved
*
**************************************************
; FOR EACH ROW/COLUMN
LDA #$8 ; X = 8
STA ROW
ROWLOOP2 ; (ROW 8 to 0)
DEC ROW
; start columnloop (COLUMN 0 to 7)
LDA #$8
STA COLUMN
COLUMNLOOP2 DEC COLUMN
JSR DRAWSQUARE
LDA COLUMN ; last COLUMN?
BNE COLUMNLOOP2 ; loop
; /columnloop2
LDA ROW ; last ROW?
BNE ROWLOOP2 ; loop
;/rowloop2
**************************************************
* writes instructions, scoreboard
**************************************************
JSR INSTRUCTIONS
JSR PRINTSCORE
JSR PRINTBOMBS
JSR PRINTPROGRESS
**************************************************
* MAIN LOOP
* waits for keyboard input, moves cursor, etc
**************************************************
MAIN LDA #$0 ; highlight 0,0 to start with
STA ROW
STA COLUMN ; set row/column
JSR HILITESQUARE ;
MAINLOOP LDA KEY ; check for keydown
CMP #$A0 ; space bar
BEQ GOTSPACE
CMP #$C9 ; I
BEQ GOTUP
CMP #$CB ; K
BEQ GOTDOWN
CMP #$CA ; J
BEQ GOTLEFT
CMP #$CC ; L
BEQ GOTRIGHT
CMP #$CD ; M
BEQ GOTMINE
CMP #$D2 ; R
BEQ GOTRESET
CMP #$9B ; ESC
BEQ END ; exit on ESC?
BNE MAINLOOP ; loop until a key
GOTSPACE JSR SPACE
JMP MAINLOOP ; back to waiting for a key
GOTUP JSR UP
JMP MAINLOOP ; back to waiting for a key
GOTDOWN JSR DOWN
JMP MAINLOOP ; back to waiting for a key
GOTLEFT JSR LEFT
JMP MAINLOOP ; back to waiting for a key
GOTRIGHT JSR RIGHT
JMP MAINLOOP ; back to waiting for a key
GOTMINE JSR MARKMINE
JMP MAINLOOP
GOTRESET STA STROBE
JSR RESET
JMP MAINLOOP
END JSR HOME
RTS ; END
MARKMINE STA STROBE ; solve current square and move to next space
JSR DRAWMINE ; solve square
JMP NEXTSQUARE
;/MARKMINE
SPACE STA STROBE ; solve current square and move to next space
JSR DRAWSOLVEDSQUARE ; solve square if not already solved
; highlight next square
NEXTSQUARE INC COLUMN ; increment column
LDA COLUMN
CMP #$8
BMI HILITENEXTSQUARE
INC ROW ; if column = 8, column = 0, row ++
LDA #$0
STA COLUMN
LDA ROW ; if row = 8, row = 0
CMP #$8
BMI HILITENEXTSQUARE
LDA #$0
STA ROW
HILITENEXTSQUARE
JSR HILITESQUARE ;
RTS
;/GOTSPACE
UP STA STROBE ;
JSR DESELECTSQUARE ; resolve current square from progress
LDA ROW ; if row = 0, then row = 7
BNE GOTUPROW
LDA #$08
STA ROW
GOTUPROW DEC ROW ; else, DEC ROW
; highlight current square
JSR HILITESQUARE ;
RTS
;/GOTUP
DOWN STA STROBE ;
JSR DESELECTSQUARE ; resolve current square from progress
LDA ROW ; if row = 7, then row = 0
CMP #$07
BMI GOTDOWNROW
LDA #$FF
STA ROW
GOTDOWNROW INC ROW ; else, INC ROW
; highlight current square
JSR HILITESQUARE ;
RTS
;/GOTDOWN
LEFT STA STROBE ; solve current square and move to previous space
JSR DESELECTSQUARE ; resolve current square from progress
; highlight prev square
DEC COLUMN ; decrement column
LDA COLUMN
CMP #$FF
BNE LEFTNEXTSQUARE
DEC ROW ; if column = 0, column = 7, row ++
LDA #$7
STA COLUMN
LDA ROW ; if row = 0, row = 8
CMP #$FF
BNE LEFTNEXTSQUARE
LDA #$7
STA ROW
LEFTNEXTSQUARE
JSR HILITESQUARE ;
RTS
;/GOTLEFT
RIGHT STA STROBE ; solve current square and move to next space
JSR DESELECTSQUARE ; resolve current square from progress
; highlight next square
INC COLUMN ; increment column
LDA COLUMN
CMP #$8
BMI RIGHTNEXTSQUARE
INC ROW ; if column = 8, column = 0, row ++
LDA #$0
STA COLUMN
LDA ROW ; if row = 8, row = 0
CMP #$8
BMI RIGHTNEXTSQUARE
LDA #$0
STA ROW
RIGHTNEXTSQUARE
JSR HILITESQUARE ;
RTS
;/GOTRIGHT
**************************************************
* subroutines
*
**************************************************
**************************************************
* writes number of bombs to find, etc
**************************************************
PRINTBOMBS ; move cursor to 0x14,0x15, VTAB, LDA BOMBS, JSR FDDA
LDA #$14
STA CV
LDA #$15
STA CH
JSR VTAB
LDA BOMBS
JSR $FDDA ; prints HEX of Accumulator
RTS
PRINTSCORE ; prints number of bombs marked
LDA #$14
STA CV
LDA #$0F
STA CH
JSR VTAB
LDA SCORE
JSR $FDDA ; prints HEX of Accumulator
RTS
PRINTPROGRESS ; prints number of bombs marked
LDA #$15
STA CV
LDA #$11
STA CH
JSR VTAB
LDA PROGRESS
JSR $FDDA ; prints HEX of Accumulator
RTS
**************************************************
* writes instructions and scoreboard
**************************************************
HELLOWORLD ASC "MINESWEEPER",00 ; set to ascii for message
LINE1 ASC "By Charles Mangin", 00
LINE2 ASC "I, J, K, L to move",00
LINE3 ASC "SPC to clear cell",00
LINE4 ASC "M to mark a mine",00
LINE5 ASC "ESC=QUIT R=RESET",00
LINE6 ASC "Mines found: 0 of",00
LINE7 ASC "Cells cleared: 0 of 64",00
INSTRUCTIONS LDA #$1
STA CV ; get screen address at row 2, column 20
JSR RIGHTCOLUMN
LDY #>HELLOWORLD
LDA #<HELLOWORLD
JSR STROUT ;Y=String ptr high, A=String ptr low
JSR RIGHTCOLUMN
LDY #>LINE1
LDA #<LINE1
JSR STROUT ;Y=String ptr high, A=String ptr low
INC CV
JSR RIGHTCOLUMN
LDY #>LINE2
LDA #<LINE2
JSR STROUT ;Y=String ptr high, A=String ptr low
JSR RIGHTCOLUMN
LDY #>LINE3
LDA #<LINE3
JSR STROUT ;Y=String ptr high, A=String ptr low
JSR RIGHTCOLUMN
LDY #>LINE4
LDA #<LINE4
JSR STROUT ;Y=String ptr high, A=String ptr low
JSR RIGHTCOLUMN
LDY #>LINE5
LDA #<LINE5
JSR STROUT ;Y=String ptr high, A=String ptr low
LDA #$13
STA CV ; jump down
JSR LEFTCOLUMN
LDY #>LINE6
LDA #<LINE6
JSR STROUT ;Y=String ptr high, A=String ptr low
JSR LEFTCOLUMN
LDY #>LINE7
LDA #<LINE7
JSR STROUT ;Y=String ptr high, A=String ptr low
RTS
;/INSTRUCTIONS
RIGHTCOLUMN INC CV
JSR VTAB
LDA #$14
STA CH
RTS
LEFTCOLUMN INC CV
JSR VTAB
LDA #$02
STA CH
RTS
**************************************************
* puts ? in unsolved square by ROW, COLUMN
**************************************************
DRAWSQUARE ; puts ? in unsolved square
LDA #$BF ; "?"
STA CHAR ; store as CHAR
LDA ROW
CLC
ADC #$01 ; zero-based to 1-based
ROL ; ROW * 2, COLUMN * 2
STA PLOTROW
LDA COLUMN
CLC
ADC #$01 ; zero-based to 1-based
ROL ; ROW * 2, COLUMN * 2
STA PLOTCOLUMN
JSR PLOTCHAR
RTS
;/DRAWSQUARE
**************************************************
* puts _ in selected square by ROW, COLUMN
**************************************************
HILITESQUARE ; puts _ in selected square
LDA #$5F ; "_"
STA CHAR ; store as CHAR
LDA ROW
CLC
ADC #$01 ; zero-based to 1-based
ROL ; ROW * 2, COLUMN * 2
STA PLOTROW
LDA COLUMN
CLC
ADC #$01 ; zero-based to 1-based
ROL ; ROW * 2, COLUMN * 2
STA PLOTCOLUMN
JSR PLOTCHAR
RTS
;/HILITESQUARE
**************************************************
* restores progress or ? to selected square by ROW, COLUMN
**************************************************
DESELECTSQUARE ; puts number/? in deselected square
LDA ROW ; get ROW and COLUMN
CLC
ROL
ROL
ROL
CLC
ADC COLUMN ; offset = ROW * 8 + COLUMN
TAX
LDA PROGRESSORIGIN,X ; get SOLVEORIGIN + offset
CMP #$FF
BNE SHOWSOLVED ; if == FF , not yet solved. CHAR = ?
LDA #$8F
STA CHAR ; store as CHAR
SHOWSOLVED CLC
ADC #$30 ; add #$30 (becomes #)
STA CHAR ; store as CHAR
LDA ROW
CLC
ADC #$01 ; zero-based to 1-based
ROL ; ROW * 2, COLUMN * 2
STA PLOTROW
LDA COLUMN
CLC
ADC #$01 ; zero-based to 1-based
ROL ; ROW * 2, COLUMN * 2
STA PLOTCOLUMN
JSR PLOTCHAR
RTS
;/DESELECTSQUARE
**************************************************
* puts * in selected square by ROW, COLUMN, increments score
**************************************************
DRAWMINE ; puts * in selected square
LDA ROW ; get ROW and COLUMN
CLC
ROL
ROL ; offset = ROW * 8 + COLUMN
ROL
CLC
ADC COLUMN
TAX
LDA #$7A ; * for mine
STA PROGRESSORIGIN,X ; store marker in progress
CLC
ADC #$30 ; add #$30 (becomes *)
STA CHAR ; store as CHAR
LDA ROW
CLC
ADC #$01 ; zero-based to 1-based
ROL ; ROW * 2, COLUMN * 2
STA PLOTROW
LDA COLUMN
CLC
ADC #$01 ; zero-based to 1-based
ROL ; ROW * 2, COLUMN * 2
STA PLOTCOLUMN
JSR PLOTCHAR
; update score
LDA SCORE ; inc as decimal for printy printy.
SED
CLC
ADC #1
CLD
STA SCORE
JSR PRINTSCORE
; mark a mine, increment "cleared" as well
LDA PROGRESS ; inc as decimal for printy printy.
SED
CLC
ADC #1
CLD
STA PROGRESS
JSR PRINTPROGRESS
RTS
;/DRAWMINE
**************************************************
* puts # of adjacent bombs in selected square by ROW, COLUMN, increments progress
**************************************************
DRAWSOLVEDSQUARE ; puts number in selected/solved square
LDA ROW ; get ROW and COLUMN
CLC
ROL
ROL ; offset = ROW * 8 + COLUMN
ROL
CLC
ADC COLUMN
TAX
LDA PROGRESSORIGIN,X ; check if it hasn't been solved yet,
CMP #$7A ; if it's already been marked as a mine
BEQ SOLVEBOMB ; mark it unsolved
CLC
CMP #$FF ; put the solution in the square,
BNE SOLVENOBOMB ; increment the progress
LDA PROGRESS ; inc as decimal for printy printy.
SED
CLC
ADC #1
CLD
STA PROGRESS
JSR PRINTPROGRESS
LDA SOLVEORIGIN,X ; get SOLVEORIGIN + offset
STA PROGRESSORIGIN,X ; store progress
CMP #$08 ; IF >= F0, found a bomb
BMI SOLVENOBOMB
LDA #$52 ; FOUND BOMB. YOU LOSE.
SOLVENOBOMB CLC
ADC #$30 ; add #$30 (becomes #)
STA CHAR ; store as CHAR
LDA ROW
CLC
ADC #$01 ; zero-based to 1-based
ROL ; ROW * 2, COLUMN * 2
STA PLOTROW
LDA COLUMN
CLC
ADC #$01 ; zero-based to 1-based
ROL ; ROW * 2, COLUMN * 2
STA PLOTCOLUMN
JSR PLOTCHAR
RTS
SOLVEBOMB LDA #$FF ; unmark as bomb
STA PROGRESSORIGIN,X ;
; decrement bombs found
LDA SCORE ; inc as decimal for printy printy.
SED
SEC
SBC #1
CLD
STA SCORE
JSR PRINTSCORE
JMP DRAWSOLVEDSQUARE ; go back and solve it as normal
;/DRAWSOLVEDSQUARE
**************************************************
* solves squares for adjacent bombs, updates solved map, increments bomb count
**************************************************
FOUNDBOMB ; how many have we found?
LDA BOMBS ; inc as decimal for printy printy.
SED
CLC
ADC #1
CLD
STA BOMBS
CLC ; clear the carry in case we found a bomb
TXA ; accum = ROW
ROL ;
ROL ;
ROL ; accum = ROW * 8
CLC
STY BOMBLOC ; BOMBLOC = COLUMN
ADC BOMBLOC ; accum += COLUMN
STA BOMBLOC ; BOMBLOC = (row*8) + column = offset from origin
LDA #$0F ; F0 doesn't want to work?
LDX BOMBLOC ; X = bomb offset
STA SOLVEORIGIN,X ;
DEX
TYA ; Does Y = 0
CLC
BEQ MINUSSONE ; if == 0, then skip the - 1
INC SOLVEORIGIN,X ; INC (byte at BOMBBYTE - 1)
MINUSSONE INX
INX
SEC
SBC #$7 ; does y = 8
BEQ PLUSONE
INC SOLVEORIGIN,X ; INC (byte at BOMBBYTE + 1)
PLUSONE TXA ; accumulator holds offset + 1
SEC
SBC #$A ; subtract 10 from offset
TAX ; back to X
TYA ; Does Y = 0
CLC
BEQ MINUSNINE ; if == 0, then skip the - 9
INC SOLVEORIGIN,X ; INC (byte at BOMBBYTE - 9)
MINUSNINE INX
INC SOLVEORIGIN,X ; INC (byte at BOMBBYTE - 8)
INX
SEC
SBC #$7 ; does y = 8
BEQ MINUSSEVEN
INC SOLVEORIGIN,X ; INC (byte at BOMBBYTE - 7)
MINUSSEVEN TXA ; accumulator holds offset - 7
CLC
ADC #$E ; add 15
TAX ; back to X
TYA ; Does Y = 0
CLC
BEQ PLUSSEVEN ; if == 0, then skip the + 7
INC SOLVEORIGIN,X ; INC (byte at BOMBBYTE + 7)
PLUSSEVEN INX
INC SOLVEORIGIN,X ; INC (byte at BOMBBYTE + 8)
TYA
SEC
SBC #$7 ; does y = 8
BEQ PLUSNINE
INX
INC SOLVEORIGIN,X ; INC (byte at BOMBBYTE + 9)
PLUSNINE LDY COLUMN
LDX ROW
RTS
;/FOUNDBOMB
**************************************************
* prints one CHAR at PLOTROW,PLOTCOLUMN
**************************************************
PLOTCHAR
LDY PLOTROW
LDA LoLineTableL,Y
STA $0
LDA LoLineTableH,Y
STA $1 ; now word/pointer at $0+$1 points to line
LDY PLOTCOLUMN
LDA CHAR ; this would be a byte with two pixels
STA ($0),Y
RTS
;/PLOTCHAR
RESET JMP DRAWBOARD
**************************************************
* Data Tables
*
**************************************************
BOARDORIGIN HEX 80,00,00,10,08,00,00,01 ; sets up the board
**************************************************
* Lores/Text lines
**************************************************
Lo01 equ $400
Lo02 equ $480
Lo03 equ $500
Lo04 equ $580
Lo05 equ $600
Lo06 equ $680
Lo07 equ $700
Lo08 equ $780
Lo09 equ $428
Lo10 equ $4a8
Lo11 equ $528
Lo12 equ $5a8
Lo13 equ $628
Lo14 equ $6a8
Lo15 equ $728
Lo16 equ $7a8
Lo17 equ $450
Lo18 equ $4d0
Lo19 equ $550
Lo20 equ $5d0
* the "plus four" lines
Lo21 equ $650
Lo22 equ $6d0
Lo23 equ $750
Lo24 equ $7d0
LoLineTable da Lo01,Lo02,Lo03,Lo04
da Lo05,Lo06,Lo07,Lo08
da Lo09,Lo10,Lo11,Lo12
da Lo13,Lo14,Lo15,Lo16
da Lo17,Lo18,Lo19,Lo20
da Lo21,Lo22,Lo23,Lo24
** Here we split the table for an optimization
** We can directly get our line numbers now
** Without using ASL
LoLineTableH db >Lo01,>Lo02,>Lo03
db >Lo04,>Lo05,>Lo06
db >Lo07,>Lo08,>Lo09
db >Lo10,>Lo11,>Lo12
db >Lo13,>Lo14,>Lo15
db >Lo16,>Lo17,>Lo18
db >Lo19,>Lo20,>Lo21
db >Lo22,>Lo23,>Lo24
LoLineTableL db <Lo01,<Lo02,<Lo03
db <Lo04,<Lo05,<Lo06
db <Lo07,<Lo08,<Lo09
db <Lo10,<Lo11,<Lo12
db <Lo13,<Lo14,<Lo15
db <Lo16,<Lo17,<Lo18
db <Lo19,<Lo20,<Lo21
db <Lo22,<Lo23,<Lo24
* ROW, COLUMN
* . at 1,1 #$2E
* . at 1,17
* ' at 17,1 #$27
* ' at 17,17
* - 1,2 to 1,16 #$2D
* - 17,2 to 17,16
* : 2,1 to 16,1 #$3A
* : ROW*2,COLUMN*2 + 1
* - ROW*2 + 1, COLUMN*2
* + ROW*2 + 1, COLUMN*2 + 1
* .---------------.
* :1:2:3:4:5:6:7:8:
* :-+-+-+-+-+-+-+-:
* :2:2:3:4:5:6:7:8:
* :-+-+-+-+-+-+-+-:
* :3:2:3:4:5:6:7:8:
* :-+-+-+-+-+-+-+-:
* :4:2:3:4:5:6:7:8:
* :-+-+-+-+-+-+-+-:
* :5:2:3:4:5:6:7:8:
* :-+-+-+-+-+-+-+-:
* :6:2:3:4:5:6:7:8:
* :-+-+-+-+-+-+-+-:
* :7:2:3:4:5:6:7:8:
* :-+-+-+-+-+-+-+-:
* :8:2:3:4:5:6:7:8:
* '---------------'