mirror of
https://github.com/option8/dropblocks.git
synced 2024-06-07 22:29:27 +00:00
1894 lines
46 KiB
ArmAsm
1894 lines
46 KiB
ArmAsm
DSK BLOCKCHAIN
|
|
|
|
|
|
**************************************************
|
|
* To Do:
|
|
*
|
|
**************************************************
|
|
* Variables
|
|
**************************************************
|
|
|
|
ROW EQU $FA ; row/col in text screen
|
|
COLUMN EQU $FB
|
|
CHAR EQU $FC ; char/pixel to plot
|
|
PLOTROW EQU $FE ; row/col in text page
|
|
PLOTCOLUMN EQU $FF
|
|
RNDSEED EQU $EA ; +eb +ec
|
|
BLOCKCHAR EQU $CE ; color of current dropping block
|
|
NEXTBLOCK EQU $CD ; color of next block to drop
|
|
BLOCKROW EQU $1D ; dropping block row
|
|
BLOCKCOLUMN EQU $1E ; dropping block column
|
|
ATTRACTING EQU $40 ; in attract mode?
|
|
PROCESSING EQU $41 ; do we need to loop again?
|
|
|
|
BORDERCOLOR EQU $09 ; border color changes to indicate level up
|
|
PROGRESS EQU $FD ; cleared blocks
|
|
|
|
PROGRESSBARL EQU $1F ; length of the progress bar
|
|
FIELDORIGIN EQU $1C ; where to draw the playfield
|
|
FIELDLEFT EQU $ED
|
|
FIELDRIGHT EQU $EF
|
|
|
|
BUMPFLAG EQU $0A ; whether to bump up opponent's pixels
|
|
LOSEFLAG EQU $CF ; lose the game
|
|
|
|
CHAINPROGRESS EQU $CC
|
|
|
|
SPRITELO EQU $07 ; address of sprite pixel table
|
|
SPRITEHI EQU $08
|
|
SPRITEOFFSET EQU $0A
|
|
|
|
**************************************************
|
|
* 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
|
|
WAIT EQU $FCA8
|
|
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
|
|
|
|
ALTTEXT EQU $C055
|
|
ALTTEXTOFF EQU $C054
|
|
|
|
ROMINIT EQU $FB2F
|
|
ROMSETKBD EQU $FE89
|
|
ROMSETVID EQU $FE93
|
|
|
|
ALTCHAR EQU $C00F ; enables alternative character set - mousetext
|
|
|
|
BLINK EQU $F3
|
|
SPEED EQU $F1
|
|
|
|
**************************************************
|
|
* START - sets up various fiddly zero page bits
|
|
**************************************************
|
|
|
|
ORG $2000 ; PROGRAM DATA STARTS AT $2000
|
|
|
|
|
|
|
|
**************************************************
|
|
* Thanks to Craig Bower for the splash screen!
|
|
**************************************************
|
|
|
|
JSR SPLASHSCREEN ; Interrupt Game right at the start
|
|
|
|
|
|
JSR ROMSETVID ; Init char output hook at $36/$37
|
|
JSR ROMSETKBD ; Init key input hook at $38/$39
|
|
JSR ROMINIT ; GR/HGR off, Text page 1
|
|
|
|
LDA #$00
|
|
STA BLINK ; blinking text? no thanks.
|
|
STA LORES ; low res graphics mode
|
|
STA MIXCLR
|
|
STA PLAYERSCORE
|
|
STA PLAYERSCORE+1
|
|
STA BORDERCOLOR ; border starts pink (BB) from BORDERCOLORS LUT
|
|
STA LOSEFLAG
|
|
STA BUMPFLAG
|
|
|
|
LDA #$0A ; all the way to the left side = 0
|
|
STA FIELDORIGIN
|
|
STA FIELDLEFT
|
|
CLC
|
|
;ADC #$14 ; 20 columns wide to start
|
|
ADC #$12 ; 18 columns wide to start
|
|
STA FIELDRIGHT
|
|
|
|
|
|
JSR CLRLORES ; clear screen
|
|
|
|
|
|
JSR DRAWBOARD
|
|
LDA #$01
|
|
STA ATTRACTING ; in ATTRACT mode
|
|
|
|
JSR RANDOMBLOCK ; get a block color
|
|
STA NEXTBLOCK ; get initial block color
|
|
|
|
LDA #$0 ; row to start the chain
|
|
STA ROW
|
|
STA CHAINPROGRESS
|
|
STA PROGRESS
|
|
JSR DISPLAYCHAIN ; show the chain graphic
|
|
|
|
**************************************************
|
|
* MAIN LOOP
|
|
* waits for keyboard input, moves cursor, etc
|
|
**************************************************
|
|
|
|
ATTRACT
|
|
|
|
* attract loop animation? instructions?
|
|
JSR NEXTSCREEN
|
|
|
|
LDA LOSEFLAG ; did the game end?
|
|
BNE LOSEGAME
|
|
|
|
LDA KEY ; check for keydown
|
|
CMP #$A0 ; space bar
|
|
BEQ STARTGAME ; advance to game on SPACE
|
|
|
|
CMP #$9B ; ESC
|
|
BEQ END ; exit on ESC?
|
|
|
|
LDA SPEED ; let's do an interframe delay
|
|
JSR WAIT
|
|
|
|
JMP ATTRACT
|
|
|
|
STARTGAME STA STROBE
|
|
JMP PLAYBALL
|
|
|
|
|
|
RESTART LDA #$00
|
|
STA STROBE
|
|
STA BORDERCOLOR
|
|
STA LOSEFLAG
|
|
|
|
LDA FIELDORIGIN ; all the way to the left side
|
|
STA FIELDLEFT
|
|
CLC
|
|
;ADC #$14 ; 20 columns to start
|
|
ADC #$12 ; 20 columns to start
|
|
STA FIELDRIGHT
|
|
|
|
JSR DRAWBOARD
|
|
JSR RESETSCORE
|
|
|
|
LDA #$0 ; row to start the chain
|
|
STA ROW
|
|
STA CHAINPROGRESS
|
|
STA PROGRESS
|
|
JSR DISPLAYCHAIN ; show the chain graphic
|
|
|
|
LDA #$01
|
|
STA PLOTROW ; stop the current block from polluting the new game
|
|
STA BLOCKROW
|
|
JSR RANDOMBLOCK ; get a new block color to start off with.
|
|
STA BLOCKCHAR
|
|
STA NEXTBLOCK
|
|
|
|
RTS
|
|
|
|
|
|
|
|
**************************************************
|
|
* keyboard input handling
|
|
**************************************************
|
|
|
|
GOTLEFT STA STROBE
|
|
JSR MOVEBLOCKLEFT
|
|
JMP MAINLOOP
|
|
|
|
GOTRIGHT STA STROBE
|
|
JSR MOVEBLOCKRIGHT
|
|
JMP MAINLOOP
|
|
|
|
PLAYBALL LDA #$00
|
|
STA ATTRACTING ; leave ATTRACT mode
|
|
JSR RESTART
|
|
JMP MAINLOOP
|
|
|
|
GOTRESET LDA #$01
|
|
STA ATTRACTING ; ATTRACT mode
|
|
JSR RESTART
|
|
JMP ATTRACT ; otherwise, attract loop.
|
|
|
|
|
|
END STA STROBE
|
|
STA ALTTEXTOFF
|
|
STA TXTSET
|
|
JSR HOME
|
|
RTS ; END
|
|
|
|
|
|
|
|
*** LOSE FLAG
|
|
|
|
LOSEGAME JSR BONK
|
|
LDA #$17
|
|
STA BLOCKROW
|
|
|
|
LOSELOOP LDA #$1
|
|
STA BUMPFLAG ; just do this once (for now)
|
|
JSR BUMPPIXELS
|
|
JSR CLICK ; bump playfield up and CLICK?
|
|
|
|
DEC BLOCKROW
|
|
BNE LOSELOOP
|
|
|
|
LDA ATTRACTING ; in attract mode or not?
|
|
BEQ STARTOVER ; start at level 1
|
|
JMP GOTRESET ; reset in attract mode
|
|
|
|
STARTOVER JMP PLAYBALL ;
|
|
|
|
*** LOSE FLAG
|
|
|
|
|
|
**************************************************
|
|
* MAIN LOOP
|
|
* waits for keyboard input, moves cursor, etc
|
|
**************************************************
|
|
|
|
MAIN
|
|
MAINLOOP
|
|
|
|
LDA KEY ; check for keydown
|
|
|
|
CMP #$CA ; J
|
|
BEQ GOTLEFT
|
|
|
|
CMP #$CC ; L
|
|
BEQ GOTRIGHT
|
|
|
|
CMP #$D2 ; R to reset
|
|
BEQ PLAYBALL
|
|
|
|
; lower case
|
|
CMP #$EA ; j
|
|
BEQ GOTLEFT
|
|
|
|
CMP #$EC ; l
|
|
BEQ GOTRIGHT
|
|
|
|
; drop down
|
|
CMP #$CB ; K
|
|
BEQ NODELAY
|
|
CMP #$EB ; K
|
|
BEQ NODELAY
|
|
|
|
|
|
|
|
|
|
CMP #$F2 ; r to reset
|
|
BEQ PLAYBALL
|
|
|
|
CMP #$9B ; ESC
|
|
BEQ END ; exit on ESC?
|
|
|
|
|
|
LOADDELAY LDA SPEED ; let's do an interframe delay
|
|
CMP #$40
|
|
BCC GOFAST ; #$40 is plenty fast
|
|
JSR WAIT
|
|
JMP NODELAY
|
|
|
|
GOFAST LDA #$40 ; if it's gone below #$40, then reset to 40 (#01 is no delay)
|
|
STA SPEED
|
|
JSR WAIT
|
|
|
|
NODELAY
|
|
JSR NEXTSCREEN ; animate one frame per loop
|
|
|
|
LDA LOSEFLAG ; did the game end?
|
|
BNE LOSEGAME
|
|
|
|
GOLOOP JMP MAINLOOP ; loop until a key
|
|
|
|
|
|
|
|
|
|
**************************************************
|
|
* subroutines
|
|
**************************************************
|
|
|
|
|
|
|
|
|
|
**************************************************
|
|
* move the falling block left/right on keystroke
|
|
**************************************************
|
|
|
|
MOVEBLOCKLEFT ; got left
|
|
;LDA PROCESSING ; is PROCESSING == 0?
|
|
;BEQ DONEMOVING
|
|
LDA FIELDLEFT
|
|
CLC
|
|
ADC #$02 ; if BLOCKCOLUMN = #02, can't move left
|
|
CMP BLOCKCOLUMN
|
|
BEQ DONEMOVING
|
|
|
|
JSR GETBLOCKPOS ; if pixel-2 color != black, can't move left.
|
|
DEC PLOTCOLUMN
|
|
DEC PLOTCOLUMN
|
|
JSR GETCHAR
|
|
BNE DONEMOVING
|
|
|
|
JSR GETBLOCKCOLOR ; get the current block's color
|
|
|
|
JSR CLEARBLOCKL ; set current block to black
|
|
|
|
DEC PLOTCOLUMN ; move left 2 px
|
|
DEC PLOTCOLUMN
|
|
DEC BLOCKCOLUMN
|
|
DEC BLOCKCOLUMN
|
|
LDA BLOCKCHAR
|
|
STA CHAR ; set pixel color
|
|
JSR PLOTQUICK ; color new pixel position
|
|
DEC PLOTCOLUMN
|
|
JSR PLOTQUICK
|
|
JMP DONEMOVING
|
|
|
|
MOVEBLOCKRIGHT ; got left
|
|
;LDA PROCESSING ; is PROCESSING == 0?
|
|
;BEQ DONEMOVING
|
|
LDA FIELDRIGHT
|
|
SEC
|
|
SBC #$04 ; if BLOCKCOLUMN = #12, can't move right
|
|
CMP BLOCKCOLUMN
|
|
BEQ DONEMOVING
|
|
|
|
JSR GETBLOCKPOS ; if pixel+2 color != black, can't move left.
|
|
INC PLOTCOLUMN
|
|
INC PLOTCOLUMN
|
|
JSR GETCHAR
|
|
BNE DONEMOVING
|
|
|
|
JSR GETBLOCKCOLOR ; get the current block's color
|
|
|
|
JSR CLEARBLOCKL ; set current block to black
|
|
|
|
;INC PLOTCOLUMN ; move right 2 px (1 done in clearblock)
|
|
INC PLOTCOLUMN
|
|
INC BLOCKCOLUMN
|
|
INC BLOCKCOLUMN
|
|
LDA BLOCKCHAR
|
|
STA CHAR ; set pixel color
|
|
JSR PLOTQUICK ; color new pixel position
|
|
INC PLOTCOLUMN
|
|
JSR PLOTQUICK
|
|
|
|
DONEMOVING RTS
|
|
|
|
**************************************************
|
|
* where is the dropping block now, what color is it?
|
|
**************************************************
|
|
GETBLOCKPOS LDX BLOCKCOLUMN ; get current block position
|
|
STX PLOTCOLUMN
|
|
LDX BLOCKROW
|
|
STX PLOTROW
|
|
RTS
|
|
;/GETBLOCKPOS
|
|
GETBLOCKCOLOR JSR GETBLOCKPOS ; get current block color
|
|
JSR GETCHAR
|
|
STA BLOCKCHAR ; store it in BLOCKCHAR
|
|
RTS
|
|
;/GETBLOCKCOLOR
|
|
|
|
**************************************************
|
|
* main animation loop
|
|
*
|
|
* if not processing/compacting,
|
|
* drops the active block
|
|
* otherwise, processes the existing
|
|
* blocks to compact them
|
|
* then adds new active block
|
|
**************************************************
|
|
|
|
NEXTSCREEN
|
|
|
|
RESETPROCESSING LDA #$00 ; PROCESSING = 0
|
|
STA PROCESSING
|
|
DROPBLOCK
|
|
* shortcut to drop just the next block, instead of having to search each pixel
|
|
JSR GETBLOCKPOS
|
|
INC PLOTROW
|
|
JSR GETCHAR ; pixel below value to A
|
|
BNE PROCESSPIXELS ; not black, done dropping the block. go on to check for others to drop
|
|
|
|
FALLBLOCK LDA BLOCKCHAR ; store block color to CHAR
|
|
STA CHAR
|
|
JSR PLOTQUICK
|
|
INC PLOTCOLUMN
|
|
JSR PLOTQUICK
|
|
DEC PLOTCOLUMN
|
|
DEC PLOTROW
|
|
JSR CLEARBLOCKL
|
|
INC BLOCKROW ; drop down to do it again
|
|
RTS ; shortcut.
|
|
|
|
PROCESSPIXELS
|
|
JSR COMBINEPIXELS ; combines neighbors
|
|
JSR COLLAPSE ; drops into blank spaces
|
|
|
|
LDA PROCESSING ; PROCESSING updated with each combine action
|
|
BNE PROCESSPIXELS ; keep combining until done.
|
|
|
|
DRAWNEXTBLOCK ; all done PROCESSING/combining, add new block at top of screen
|
|
; draw upcoming block at 0, move previous upcoming down to 1
|
|
STA STROBE ; clear out the keyboard buffer from fast drop
|
|
LDA #$0
|
|
STA PLOTROW
|
|
STA BLOCKROW
|
|
|
|
LDA ATTRACTING ; if ATTRACTING, do random column.
|
|
BEQ MIDDLETOP ; 0=done attracting, now playing with block in middle
|
|
JSR RANDOMCOLUMN ; gets random column from 2-18 for attract mode
|
|
JMP RANDOMTOP
|
|
|
|
MIDDLETOP JSR CENTERCOLUMN
|
|
|
|
RANDOMTOP STA PLOTCOLUMN
|
|
STA BLOCKCOLUMN
|
|
|
|
LDA NEXTBLOCK
|
|
STA BLOCKCHAR ; transfer upcoming block to current
|
|
|
|
JSR RANDOMBLOCK ; get a block color
|
|
STA CHAR
|
|
STA NEXTBLOCK ; color of upcoming block
|
|
JSR PLOTQUICK
|
|
INC PLOTCOLUMN
|
|
JSR PLOTQUICK
|
|
|
|
INC PLOTROW ; down to row 1
|
|
INC BLOCKROW ; set falling block position
|
|
DEC PLOTCOLUMN
|
|
|
|
GETNEXTBLOCK LDA BLOCKCHAR ; take current block color and draw the dropping block
|
|
STA CHAR
|
|
JSR PLOTQUICK
|
|
INC PLOTCOLUMN
|
|
JSR PLOTQUICK
|
|
|
|
|
|
INC CHAINPROGRESS
|
|
JSR DISPLAYCHAIN
|
|
|
|
JSR UPDATESCORE
|
|
|
|
|
|
NEXTSCREENDONE RTS
|
|
|
|
;/NEXTSCREEN
|
|
|
|
|
|
**************************************************
|
|
* blanks the screen
|
|
**************************************************
|
|
|
|
DRAWBOARD JSR HOME
|
|
|
|
LDA #$A0
|
|
STA SPEED ; re-using the applesoft variable. fun.
|
|
|
|
STA ALTTEXTOFF ; display main text page
|
|
JSR RNDINIT ; *should* cycle the random seed.
|
|
LDA #$00
|
|
|
|
STA PROCESSING
|
|
|
|
|
|
|
|
; FOR EACH ROW/COLUMN
|
|
|
|
LDA #$18 ; X = 24
|
|
STA PLOTROW
|
|
ROWLOOP2 ; (ROW 24 to 0)
|
|
DEC PLOTROW ; start columnloop (COLUMN 0 to 20)
|
|
; LDA FIELDRIGHT
|
|
LDA #$28 ; clear all 40 cols.
|
|
STA PLOTCOLUMN
|
|
COLUMNLOOP2 DEC PLOTCOLUMN
|
|
|
|
LDA PLOTROW
|
|
PLOTZERO LDA #$00 ; set all pixels to 00
|
|
PLOTLINE STA CHAR
|
|
JSR PLOTQUICK ; plot 00
|
|
|
|
LDA PLOTCOLUMN ; last COLUMN?
|
|
BNE COLUMNLOOP2 ; loop
|
|
|
|
; /columnloop2
|
|
|
|
LDA PLOTROW ; last ROW?
|
|
BNE ROWLOOP2 ; loop
|
|
|
|
; /rowloop2
|
|
|
|
|
|
JSR DRAWBORDER
|
|
RTS
|
|
;/DRAWBOARD
|
|
|
|
**************************************************
|
|
* Draws the pink border, clears score
|
|
**************************************************
|
|
|
|
DRAWBORDER ; draws the pink border line
|
|
|
|
LEFTLINE LDA FIELDLEFT ; column 0
|
|
STA PLOTCOLUMN
|
|
LDX BORDERCOLOR ; which color to use
|
|
LDA BORDERCOLORS,X ; lookup table of colors
|
|
STA CHAR
|
|
LDA #$18 ; row 23 to 0
|
|
STA PLOTROW
|
|
LEFTLINELOOP DEC PLOTROW
|
|
JSR PLOTQUICK ; plot CHAR
|
|
|
|
INC PLOTCOLUMN ; black sub-border
|
|
LDA #$0
|
|
STA CHAR
|
|
JSR PLOTQUICK ; plot CHAR
|
|
DEC PLOTCOLUMN
|
|
LDX BORDERCOLOR ; which color to use
|
|
LDA BORDERCOLORS,X ; lookup table of colors
|
|
STA CHAR
|
|
|
|
LDA PLOTROW ; last ROW?
|
|
BNE LEFTLINELOOP ; draw next row of line
|
|
|
|
RIGHTLINE LDX FIELDRIGHT
|
|
DEX ; column 20 to 0
|
|
STX PLOTCOLUMN
|
|
LDX BORDERCOLOR ; which color to use
|
|
LDA BORDERCOLORS,X ; lookup table of colors
|
|
STA CHAR
|
|
LDA #$18 ; row 23 to 0
|
|
STA PLOTROW
|
|
RIGHTLINELOOP DEC PLOTROW
|
|
JSR PLOTQUICK ; plot CHAR
|
|
|
|
DEC PLOTCOLUMN ; black sub-border
|
|
LDA #$0
|
|
STA CHAR
|
|
JSR PLOTQUICK ; plot CHAR
|
|
INC PLOTCOLUMN
|
|
|
|
LDX BORDERCOLOR ; which color to use
|
|
LDA BORDERCOLORS,X ; lookup table of colors
|
|
STA CHAR
|
|
|
|
LDA PLOTROW ; last ROW?
|
|
BNE RIGHTLINELOOP ; draw next row of line
|
|
|
|
TOPLINE LDA #$0 ; row 0
|
|
STA PLOTROW
|
|
|
|
LDX BORDERCOLOR ; which color to use
|
|
LDA BORDERCOLORS,X ; lookup table of colors
|
|
AND #$0F ; clear top nibble
|
|
STA CHAR
|
|
|
|
LDX FIELDRIGHT
|
|
DEX ; column 20 to 0
|
|
STX PLOTCOLUMN
|
|
TOPLINELOOP DEC PLOTCOLUMN
|
|
JSR PLOTQUICK ; PLOT CHAR
|
|
LDA PLOTCOLUMN ; last COLUMN?
|
|
SEC
|
|
SBC #$01
|
|
CMP FIELDLEFT
|
|
BNE TOPLINELOOP ; draw next column of line
|
|
|
|
BASELINE LDA #$17 ; row 24
|
|
STA PLOTROW
|
|
LDX BORDERCOLOR ; which color to use
|
|
LDA BORDERCOLORS,X ; lookup table of colors
|
|
AND #$0F ; clear bottom nibble
|
|
ORA #$50 ; adds dark grey to bottom
|
|
STA CHAR
|
|
|
|
LDA FIELDORIGIN
|
|
CLC
|
|
; ADC #$14 ; baseline is 20px wide
|
|
ADC #$12 ; baseline is 20px wide
|
|
STA PLOTCOLUMN
|
|
BASELINELOOP DEC PLOTCOLUMN
|
|
JSR PLOTQUICK ; PLOT CHAR
|
|
LDA PLOTCOLUMN ; last COLUMN?
|
|
CMP FIELDORIGIN
|
|
BNE BASELINELOOP ; draw next column of line
|
|
|
|
RTS
|
|
;/DRAWBORDER
|
|
|
|
|
|
RESETSCORE
|
|
LDA #$00
|
|
STA PLAYERSCORE
|
|
STA PLAYERSCORE+1
|
|
RTS
|
|
;/RESETSCORE
|
|
|
|
|
|
**************************************************
|
|
* creates a progress indicator at the bottom of the screen
|
|
**************************************************
|
|
|
|
PROGRESSBAR
|
|
LDA PLAYERSCORE+1 ; score+1 = 0 to #99, divide by 8 to get 1-#14
|
|
CLC
|
|
ROR ; divide by 2
|
|
CLC
|
|
ROR ; 4
|
|
CLC
|
|
ROR ; 8
|
|
STA PROGRESSBARL ; new length for progress bar
|
|
|
|
; draw baseline from border with *color*
|
|
; instead of grey from column 0 to score/8
|
|
DRAWBAR LDA #$17 ; row 24
|
|
STA PLOTROW
|
|
LDX BORDERCOLOR ; which color to use
|
|
LDA BORDERCOLORS,X ; lookup table of colors
|
|
AND #$0F ; clear bottom nibble
|
|
ORA #$F0 ; adds white to bottom
|
|
STA CHAR
|
|
LDA PROGRESSBARL
|
|
BEQ NOBAR
|
|
CLC
|
|
ADC FIELDORIGIN
|
|
CMP FIELDRIGHT
|
|
BCS NOBAR ; longer than field width. skip drawing for now
|
|
STA PLOTCOLUMN
|
|
DRAWBARLOOP DEC PLOTCOLUMN
|
|
JSR PLOTQUICK ; PLOT CHAR
|
|
LDA PLOTCOLUMN ; last COLUMN?
|
|
CMP FIELDORIGIN
|
|
BNE DRAWBARLOOP ; draw next column of line
|
|
NOBAR RTS
|
|
;/PROGRESSBAR
|
|
|
|
**************************************************
|
|
* blanks a 2px block - LEFT TO RIGHT
|
|
**************************************************
|
|
CLEARBLOCKL
|
|
LDA #$00 ; set block to black
|
|
STA CHAR
|
|
JSR PLOTQUICK
|
|
INC PLOTCOLUMN
|
|
JSR PLOTQUICK
|
|
RTS
|
|
;CLEARBLOCKL
|
|
|
|
|
|
**************************************************
|
|
* blanks a 2px block - RIGHT TO LEFT
|
|
**************************************************
|
|
CLEARBLOCKR
|
|
LDA #$00 ; set block to black
|
|
STA CHAR
|
|
JSR PLOTQUICK
|
|
DEC PLOTCOLUMN
|
|
JSR PLOTQUICK
|
|
RTS
|
|
;CLEARBLOCKR
|
|
|
|
**************************************************
|
|
* matches plot position to pixel getting processed
|
|
**************************************************
|
|
|
|
;RESETPIXEL LDX COLUMN ; transfer checkpixel to plotpixel
|
|
; STX PLOTCOLUMN
|
|
; LDX ROW
|
|
; STX PLOTROW
|
|
; RTS
|
|
;;/RESETPIXEL
|
|
|
|
RESETPIXEL LDA COLUMN ; transfer checkpixel to plotpixel
|
|
STA PLOTCOLUMN
|
|
LDA ROW
|
|
STA PLOTROW
|
|
RTS
|
|
;/RESETPIXEL
|
|
|
|
**************************************************
|
|
* returns with "middle" column in accumulator
|
|
**************************************************
|
|
|
|
CENTERCOLUMN LDA FIELDRIGHT ; move drop location to between left/right borders
|
|
SEC
|
|
SBC FIELDLEFT ; get width as right-LEFT
|
|
CLC
|
|
LSR ; divide by 2
|
|
AND #$FE ; divisible by 2
|
|
; ORA #$01 ;
|
|
CLC
|
|
ADC FIELDLEFT ; add left offset.
|
|
RTS
|
|
;/CENTERCOLUMN
|
|
|
|
**************************************************
|
|
* loops through columns/rows to find neighboring
|
|
* pixels that match. Shortcut stops processing
|
|
* column when reaching a blank space
|
|
**************************************************
|
|
|
|
COMBINEPIXELS
|
|
LDA #$0 ; reset PROCESSING
|
|
STA PROCESSING
|
|
|
|
CHECKCOLUMN LDX FIELDRIGHT
|
|
DEX ; column 20 to 0
|
|
DEX
|
|
STX COLUMN
|
|
CHECKCOLUMNLOOP DEC COLUMN
|
|
DEC COLUMN ; every other column???
|
|
CHECKROW LDA #$17 ; start at row 23
|
|
STA ROW
|
|
CHECKROWLOOP DEC ROW
|
|
|
|
|
|
|
|
RESETPROGRESS LDA #$00 ; reset progress
|
|
STA PROGRESS ; how many blocks to delete?
|
|
JSR CHECKPIXEL ; check neighboring pixels to combine
|
|
|
|
LDA BLOCKCHAR ; if the pixel checked was blank,
|
|
BEQ COLUMNSHORT ; done with the column
|
|
|
|
DONECHECKING
|
|
|
|
LDA #$01 ; at row 1?
|
|
CMP ROW
|
|
BNE CHECKROWLOOP ; loopty rows
|
|
|
|
STA LOSEFLAG ; made it to ROW 1 - LOSE GAME
|
|
|
|
|
|
;/CHECKROWLOOP
|
|
|
|
COLUMNSHORT LDA FIELDLEFT
|
|
CLC
|
|
ADC #$02 ; at COLUMN 2?
|
|
CMP COLUMN
|
|
BNE CHECKCOLUMNLOOP ; loopty columns
|
|
;/CHECKCOLUMNLOOP
|
|
|
|
|
|
RTS
|
|
;/COMBINEPIXELS
|
|
|
|
|
|
|
|
|
|
**************************************************
|
|
* for each pixel position, checks neighbors for matches.
|
|
* Progression from Red, Orange, Yellow, White, Blank
|
|
* 11,99,DD,FF,00
|
|
**************************************************
|
|
CHECKPIXEL ; get pixel color
|
|
JSR RESETPIXEL
|
|
|
|
JSR GETCHAR ; current pixel value to A
|
|
STA BLOCKCHAR ; store current color
|
|
CMP #$55
|
|
BEQ CHECKSHORT ; skip grey pixels.
|
|
LDA BLOCKCHAR
|
|
BNE CHECKINGPX ; not blank, check on.
|
|
CHECKSHORT RTS ; ==0, DONE CHECKING
|
|
|
|
|
|
;CHECKPIXEL ; get pixel color
|
|
; JSR RESETPIXEL
|
|
;
|
|
; JSR GETCHAR ; current pixel value to A
|
|
; STA BLOCKCHAR ; store current color
|
|
; BNE CHECKINGPX ; not blank, check on.
|
|
; RTS ; ==0, DONE CHECKING
|
|
|
|
CHECKINGPX
|
|
CHECKABOVE DEC PLOTROW ; check above
|
|
JSR GETCHAR
|
|
CMP BLOCKCHAR
|
|
BNE CHECKLEFT ; not equal, move on to check left side
|
|
CLEARABOVE
|
|
JSR CLEARBLOCKL
|
|
INC PROGRESS
|
|
;DEC SPEED
|
|
|
|
CHECKUPLEFT JSR RESETPIXEL ; if the above pixel is a match, check diagonal
|
|
DEC PLOTCOLUMN
|
|
DEC PLOTCOLUMN
|
|
DEC PLOTROW
|
|
JSR GETCHAR
|
|
CMP BLOCKCHAR
|
|
BNE CHECKLEFT
|
|
CLEARUPLEFT JSR CLEARBLOCKL
|
|
INC PROGRESS
|
|
;DEC SPEED
|
|
|
|
|
|
CHECKLEFT JSR RESETPIXEL
|
|
DEC PLOTCOLUMN
|
|
DEC PLOTCOLUMN
|
|
JSR GETCHAR
|
|
CMP BLOCKCHAR
|
|
BNE CHECKPROGRESS ; not equal, skip checking left+1
|
|
CLEARLEFT JSR CLEARBLOCKL
|
|
INC PROGRESS
|
|
;DEC SPEED
|
|
|
|
CHECKLEFT2 JSR RESETPIXEL
|
|
DEC PLOTCOLUMN
|
|
DEC PLOTCOLUMN
|
|
DEC PLOTCOLUMN
|
|
DEC PLOTCOLUMN
|
|
JSR GETCHAR
|
|
CMP BLOCKCHAR
|
|
BNE CHECKLEFTDOWN ; not equal, check diagonal
|
|
CLEARLEFT2 JSR CLEARBLOCKL
|
|
INC PROGRESS
|
|
;DEC SPEED
|
|
|
|
CHECKLEFTDOWN JSR RESETPIXEL
|
|
DEC PLOTCOLUMN
|
|
DEC PLOTCOLUMN
|
|
INC PLOTROW
|
|
JSR GETCHAR
|
|
CMP BLOCKCHAR
|
|
BNE CHECKPROGRESS
|
|
CLEARLEFTDOWN JSR CLEARBLOCKL
|
|
INC PROGRESS
|
|
;DEC SPEED
|
|
|
|
CHECKPROGRESS LDA PROGRESS ; if PROGRESS then set the check block to the next color in Progression
|
|
BEQ DONECHECKINGPX
|
|
|
|
LDX #$99
|
|
LDA BLOCKCHAR
|
|
CMP #$11 ; is red, set to orange
|
|
BEQ CLEARBLOCK
|
|
LDX #$DD
|
|
CMP #$99 ; is orange set to yellow
|
|
BEQ CLEARBLOCK
|
|
LDX #$FF
|
|
CMP #$DD ; is yellow set to white
|
|
BEQ CLEARBLOCK
|
|
; LDX #$00
|
|
; CMP #$FF ; is white set to blank
|
|
; BEQ CLEARBLOCK
|
|
|
|
|
|
LDX #$CC
|
|
LDA BLOCKCHAR
|
|
CMP #$44 ; is red, set to orange
|
|
BEQ CLEARBLOCK
|
|
LDX #$EE
|
|
CMP #$CC ; is orange set to yellow
|
|
BEQ CLEARBLOCK
|
|
LDX #$FF
|
|
CMP #$EE ; is yellow set to white
|
|
BEQ CLEARBLOCK
|
|
; LDX #$00
|
|
; CMP #$FF ; is white set to blank
|
|
; BEQ CLEARBLOCK
|
|
|
|
|
|
LDX #$66
|
|
LDA BLOCKCHAR
|
|
CMP #$22 ; is red, set to orange
|
|
BEQ CLEARBLOCK
|
|
LDX #$77
|
|
CMP #$66 ; is orange set to yellow
|
|
BEQ CLEARBLOCK
|
|
LDX #$FF
|
|
CMP #$77 ; is yellow set to white
|
|
BEQ CLEARBLOCK
|
|
LDX #$00
|
|
; CMP #$FF ; is white set to blank
|
|
; BEQ CLEARBLOCK
|
|
|
|
LDA PROGRESS
|
|
CMP #$03 ; if progress == 3, then clear both lines?
|
|
BNE CLEARBLOCK
|
|
|
|
JSR CLEAR2LINES
|
|
JSR INCSCORE10 ; bump up score by 10
|
|
JSR PROGRESSBAR
|
|
JSR BONK
|
|
|
|
CLEARBLOCK STX CHAR
|
|
JSR RESETPIXEL
|
|
JSR PLOTQUICK ; new color for dropped block
|
|
INC PLOTCOLUMN
|
|
JSR PLOTQUICK
|
|
INC PLOTCOLUMN ; ???
|
|
|
|
;DEC SPEED ; speed up with every successful cleared block?
|
|
INC PROCESSING ; set the PROCESSING so we loop again
|
|
JSR CLICK
|
|
JSR INCSCORE
|
|
JSR PROGRESSBAR
|
|
|
|
DONECHECKINGPX RTS
|
|
|
|
|
|
**************************************************
|
|
* for each column, clear the pixels in 2 rows.
|
|
* reward for clearing 4 blocks at once
|
|
**************************************************
|
|
|
|
|
|
CLEAR2LINES JSR RESETPIXEL ; go to row/column to clear
|
|
|
|
LDX FIELDRIGHT ; column 19 - 3
|
|
DEX
|
|
DEX
|
|
STX PLOTCOLUMN
|
|
CLEARCOLUMN1 DEC PLOTCOLUMN
|
|
|
|
JSR CLEARBLOCKR ; clear the block
|
|
|
|
LDA FIELDLEFT
|
|
CLC
|
|
ADC #$02 ; at COLUMN 2?
|
|
CMP PLOTCOLUMN
|
|
BNE CLEARCOLUMN1 ; loopty columns
|
|
;/CLEARCOLUMN1
|
|
|
|
JSR RESETPIXEL ; second line...
|
|
INC PLOTROW
|
|
|
|
LDX FIELDRIGHT ; column 19 - 3
|
|
DEX
|
|
DEX
|
|
STX PLOTCOLUMN
|
|
CLEARCOLUMN2 DEC PLOTCOLUMN
|
|
|
|
JSR CLEARBLOCKR ; clear the block
|
|
|
|
LDA FIELDLEFT
|
|
CLC
|
|
ADC #$02 ; at COLUMN 2?
|
|
CMP PLOTCOLUMN
|
|
BNE CLEARCOLUMN2 ; loopty columns
|
|
;/CLEARCOLUMN2
|
|
|
|
RTS
|
|
|
|
;/CLEAR2LINES
|
|
|
|
|
|
|
|
|
|
|
|
|
|
**************************************************
|
|
* Traverse each column up from the bottom,
|
|
* removing blanks between colors.
|
|
*
|
|
* Shortcut to column complete when two blanks in a row.
|
|
**************************************************
|
|
|
|
COLLAPSE
|
|
|
|
EACHCOLUMN LDX FIELDRIGHT ; column 19 - 3
|
|
DEX
|
|
DEX
|
|
STX COLUMN
|
|
EACHCOLUMNLOOP DEC COLUMN
|
|
|
|
EACHROW LDA #$17 ; start at row 23
|
|
STA ROW
|
|
EACHROWLOOP DEC ROW
|
|
|
|
|
|
|
|
* check pixel *above* to see if it's black.
|
|
|
|
EACHPIXEL JSR RESETPIXEL ; transfer checkpixel to plotpixel
|
|
|
|
JSR GETCHAR ; current pixel value to A
|
|
BNE DONEDROPPING ; NONZERO=DONE CHECKING
|
|
; BLANK. check if pixel above is NONZERO
|
|
DEC PLOTROW
|
|
JSR GETCHAR ; (pixel above) value to A
|
|
BEQ DONEDROPPING ; ZERO, DONE CHECKING
|
|
|
|
STA BLOCKCHAR ; store pixel above color
|
|
|
|
|
|
DROPPIXEL ; COLOR ABOVE BLANK, drop pixel down
|
|
INC PROCESSING ; PROCESSING++
|
|
|
|
;LDA BLOCKCHAR ; block char in A
|
|
STA CHAR ; store block color to CHAR
|
|
INC PLOTROW ; back down to blank space
|
|
JSR PLOTQUICK ; draw new block 1 row down
|
|
|
|
LDA #$00 ; set color to black
|
|
STA CHAR
|
|
DEC PLOTROW ; erase block
|
|
JSR PLOTQUICK
|
|
; JSR CLICK
|
|
|
|
DONEDROPPING
|
|
|
|
LDA #$02 ; at row 2?
|
|
CMP ROW
|
|
BNE EACHROWLOOP ; loopty rows
|
|
;/EACHROWLOOP
|
|
|
|
COLLAPSESHORT
|
|
LDA FIELDLEFT
|
|
CLC
|
|
ADC #$02 ; at COLUMN 2?
|
|
CMP COLUMN
|
|
BNE EACHCOLUMNLOOP ; loopty columns
|
|
;/EACHCOLUMNLOOP
|
|
|
|
COLLAPSEDONE RTS
|
|
;/COLLAPSE
|
|
|
|
**************************************************
|
|
* loops through columns/rows
|
|
* bumps each pixel up by one - clobbers X, A
|
|
**************************************************
|
|
|
|
BUMPPIXELS
|
|
LDA #$0
|
|
STA BUMPFLAG ; just do this once (for now)
|
|
|
|
BUMPCOLUMN LDX FIELDRIGHT
|
|
DEX
|
|
DEX ; column 20 to 0
|
|
STX COLUMN
|
|
BUMPCOLUMNLOOP DEC COLUMN
|
|
|
|
BUMPROW LDA #$0 ; start at row 0
|
|
STA ROW
|
|
BUMPROWLOOP INC ROW
|
|
|
|
JSR BUMPPIXEL ; move pixels up by one
|
|
|
|
DONEBUMPING
|
|
|
|
LDA #$16 ; at row 22?
|
|
CMP ROW
|
|
BNE BUMPROWLOOP ; loopty rows
|
|
;/BUMPROWLOOP
|
|
|
|
BUMPSHORT DEC COLUMN ; every other column
|
|
LDA FIELDLEFT
|
|
CLC
|
|
ADC #$02 ; at COLUMN 2?
|
|
CMP COLUMN
|
|
BNE BUMPCOLUMNLOOP ; loopty columns
|
|
;/BUMPCOLUMNLOOP
|
|
|
|
LDA #$16 ; row 23 needs random blocks
|
|
STA ROW
|
|
RANDCOLUMN LDX FIELDRIGHT
|
|
DEX
|
|
DEX ; column 20 to 0
|
|
STX COLUMN
|
|
RANDCOLUMNLOOP DEC COLUMN
|
|
JSR RESETPIXEL
|
|
LDA #$55 ; shorten the playfield
|
|
STA CHAR ; store px color
|
|
JSR PLOTQUICK ; plot over pixel.
|
|
DEC PLOTCOLUMN
|
|
JSR PLOTQUICK ; plot over pixel.
|
|
DEC COLUMN
|
|
|
|
LDA COLUMN
|
|
SEC
|
|
SBC #$02
|
|
CMP FIELDLEFT
|
|
BNE RANDCOLUMNLOOP
|
|
|
|
RTS
|
|
;/BUMPPIXELS
|
|
|
|
|
|
|
|
|
|
BUMPPIXEL JSR RESETPIXEL
|
|
|
|
JSR GETCHAR ; current pixel value to A
|
|
STA BLOCKCHAR ; store current color
|
|
BNE BUMPINGPX ; not blank, check on.
|
|
RTS ; ==0, DONE CHECKING
|
|
|
|
BUMPINGPX DEC PLOTROW ; go up 1 ROW
|
|
LDA BLOCKCHAR ; get pixel color
|
|
STA CHAR ; store px color
|
|
JSR PLOTQUICK ; plot over pixel above.
|
|
DEC PLOTCOLUMN
|
|
JSR PLOTQUICK ; plot over pixel-1 above.
|
|
|
|
RTS
|
|
|
|
|
|
|
|
|
|
|
|
**************************************************
|
|
* prints one CHAR at PLOTROW,PLOTCOLUMN - clobbers A,Y
|
|
* used for plotting background elements that don't need collision detection
|
|
**************************************************
|
|
PLOTQUICK
|
|
LDY PLOTROW
|
|
TYA
|
|
CMP #$18
|
|
BCS OUTOFBOUNDS2 ; stop plotting if dimensions are outside screen
|
|
|
|
LDA LoLineTableL,Y
|
|
STA $0
|
|
LDA LoLineTableH,Y
|
|
STA $1 ; now word/pointer at $0+$1 points to line
|
|
;JMP LOADQUICK
|
|
|
|
LOADQUICK
|
|
LDY PLOTCOLUMN
|
|
TYA
|
|
CMP #$28
|
|
BCS OUTOFBOUNDS2 ; stop plotting if dimensions are outside screen
|
|
|
|
STY $06 ; hang onto Y for a sec...
|
|
|
|
LDA CHAR
|
|
LDY $06
|
|
STA ($0),Y
|
|
|
|
OUTOFBOUNDS2 RTS
|
|
;/PLOTQUICK
|
|
|
|
|
|
**************************************************
|
|
* GETS one CHAR at PLOTROW,PLOTCOLUMN - value returns in Accumulator - clobbers Y
|
|
**************************************************
|
|
GETCHAR
|
|
LDY PLOTROW
|
|
CLC
|
|
|
|
LDA LoLineTableL,Y
|
|
STA $0
|
|
LDA LoLineTableH,Y
|
|
;JMP STORECHAR
|
|
|
|
STORECHAR STA $1 ; now word/pointer at $0+$1 points to line
|
|
LDY PLOTCOLUMN
|
|
LDA ($0),Y ; byte at row,col is now in accumulator
|
|
RTS
|
|
;/GETCHAR
|
|
|
|
**************************************************
|
|
* Increase player score by 1
|
|
**************************************************
|
|
INCSCORE SED ; set decimal mode
|
|
CLC
|
|
LDA PLAYERSCORE+1
|
|
ADC #$01
|
|
STA PLAYERSCORE+1
|
|
|
|
BNE SCOREDONE ; if not rolled over, skip
|
|
CLC
|
|
LDA PLAYERSCORE ; if rolled over to zero, add one to 100s byte
|
|
ADC #$01
|
|
STA PLAYERSCORE
|
|
CLD
|
|
|
|
LEVELUP INC BORDERCOLOR ; change border to indicate level up
|
|
|
|
; make play field shorter, narrower with each levelup?
|
|
; add to difficulty?
|
|
LDA #$1
|
|
STA BUMPFLAG ; just do this once (for now)
|
|
JSR BUMPPIXELS
|
|
|
|
JSR DRAWBORDER
|
|
|
|
LDA SPEED ; Increase speed?
|
|
SEC
|
|
SBC #$10
|
|
STA SPEED
|
|
|
|
|
|
SCOREDONE CLD ; clear decimal mode
|
|
|
|
RTS
|
|
|
|
**************************************************
|
|
* Increase player score by 10
|
|
**************************************************
|
|
INCSCORE10 LDX #$0A
|
|
LOOP10 JSR INCSCORE
|
|
DEX
|
|
BNE LOOP10
|
|
RTS
|
|
;/INCSCORE10
|
|
|
|
**************************************************
|
|
* Gets a random color byte from BLOCKCOLORS
|
|
**************************************************
|
|
|
|
RANDOMBLOCK LDY BORDERCOLOR ; 0-15 for each level
|
|
INY
|
|
LDA #$00
|
|
STA NEXTBLOCK ; set BLOCKCHAR to 0 to hold our temp value
|
|
|
|
ADD16 JSR RND16 ; gets 0-F
|
|
CLC
|
|
ADC NEXTBLOCK ; adds random16 to BLOCKCHAR
|
|
STA NEXTBLOCK
|
|
DEY
|
|
BNE ADD16 ; loop for each level of difficulty
|
|
|
|
LDX NEXTBLOCK ; puts accumulated random # to X
|
|
LDA BLOCKCOLORS,X ; gets byte from table
|
|
RTS
|
|
|
|
|
|
;/RANDOMBLOCK
|
|
|
|
**************************************************
|
|
* Gets a random BLOCK POSITION for attract mode
|
|
**************************************************
|
|
|
|
RANDOMCOLUMN JSR RND16 ; gets 0-F into accumulator
|
|
CLC
|
|
ADC FIELDLEFT ; adjust for left side of play field (0)
|
|
|
|
ADC #$02 ; column 2-18
|
|
|
|
LDX FIELDRIGHT ; decrement right border for black space
|
|
DEX
|
|
DEX
|
|
;DEX
|
|
STX $06 ; store this temporarily
|
|
|
|
CMP $06 ; compare to right border
|
|
BCS RANDOMCOLUMN ; if too high, run again
|
|
|
|
LSR ; divide by 2, remainder in Carry
|
|
CLC ; clear remainder
|
|
ROL ; multiply by 2, should result in an even number 2-18
|
|
;ORA #$01 ; ODD NUMBER
|
|
|
|
RTS
|
|
;/RANDOMCOLUMN
|
|
|
|
|
|
**************************************************
|
|
* CLICKS and BEEPS - clobbers X,Y,A
|
|
**************************************************
|
|
CLICK LDX #$06
|
|
CLICKLOOP LDA #$10 ; SLIGHT DELAY
|
|
JSR WAIT
|
|
STA SPEAKER
|
|
DEX
|
|
BNE CLICKLOOP
|
|
RTS
|
|
;/CLICK
|
|
|
|
BEEP LDX #$30
|
|
BEEPLOOP LDA #$08 ; short DELAY
|
|
JSR WAIT
|
|
STA SPEAKER
|
|
DEX
|
|
BNE BEEPLOOP
|
|
RTS
|
|
;/BEEP
|
|
|
|
|
|
BONK LDX #$50
|
|
BONKLOOP LDA #$20 ; longer DELAY
|
|
JSR WAIT
|
|
STA SPEAKER
|
|
DEX
|
|
BNE BONKLOOP
|
|
RTS
|
|
;/BONK
|
|
|
|
|
|
|
|
**************************************************
|
|
* DATASOFT RND 6502
|
|
* BY JAMES GARON
|
|
* 10/02/86
|
|
* Thanks to John Brooks for this. I modified it slightly.
|
|
*
|
|
* returns a randomish number in Accumulator.
|
|
**************************************************
|
|
RNDINIT
|
|
LDA $C030 ; #$AB
|
|
STA RNDSEED
|
|
LDA $4E ; #$55
|
|
STA RNDSEED+1
|
|
LDA PROCESSING ; #$7E
|
|
STA RNDSEED+2
|
|
RTS
|
|
|
|
* RESULT IN ACC
|
|
RND LDA RNDSEED
|
|
ROL RNDSEED
|
|
EOR RNDSEED
|
|
ROR RNDSEED
|
|
INC RNDSEED+1
|
|
BNE RND10
|
|
LDA RNDSEED+2
|
|
INC RNDSEED+2
|
|
RND10 ADC RNDSEED+1
|
|
BVC RND20
|
|
INC RNDSEED+1
|
|
BNE RND20
|
|
LDA RNDSEED+2
|
|
INC RNDSEED+2
|
|
RND20 STA RNDSEED
|
|
RTS
|
|
|
|
RND16 JSR RND ; limits RND output to 0-F
|
|
AND #$0F ; strips high nibble
|
|
RTS
|
|
|
|
|
|
**************************************************
|
|
* Display the chain graphic
|
|
* 9px by 24 = 216 bytes.
|
|
**************************************************
|
|
|
|
DISPLAYCHAIN LDA CHAINPROGRESS ; how far down to start the chain display
|
|
CMP #$1B ; is it the last row?
|
|
BNE RESETCHAIN
|
|
LDA #$0
|
|
STA CHAINPROGRESS
|
|
RESETCHAIN STA ROW
|
|
LDA #$0 ; COLUMN=0, X=0, ROW=0
|
|
STA COLUMN
|
|
STA PROGRESS ; reusing this as iteration counter
|
|
TAX ; start at beginning of CHAIN
|
|
|
|
; loop over 9 columns
|
|
CHAINLOOP LDA COLUMN ; add 22 to COLUMN
|
|
; CLC
|
|
; ADC #$14 ; CHAIN ON FAR LEFT NOW
|
|
STA PLOTCOLUMN ; set PLOTCOLUMN
|
|
LDA ROW
|
|
STA PLOTROW ; set PLOTROW
|
|
|
|
LDA CHAIN,X ; get CHAIN,X
|
|
STA CHAR ; set CHAR
|
|
JSR PLOTQUICK ; plot the pixel
|
|
|
|
INX ; next pixel
|
|
INC COLUMN ; next column
|
|
LDA COLUMN
|
|
CMP #$09 ; on last column?
|
|
BNE CHAINLOOP
|
|
LDA #$0
|
|
STA COLUMN ; reset column to 0
|
|
|
|
INC ROW ; next ROW
|
|
INC PROGRESS
|
|
LDA ROW
|
|
CMP #$1B ; on row 24? *** loop here back to row 0
|
|
BNE CHAINLOOP2
|
|
|
|
LDA #$0
|
|
STA ROW
|
|
|
|
CHAINLOOP2 LDA PROGRESS ; how many iterations?
|
|
CMP #$1B ; 28 iterations is a full chain
|
|
BNE CHAINLOOP
|
|
|
|
RTS
|
|
;/DISPLAYCHAIN
|
|
|
|
|
|
|
|
|
|
**************************************************
|
|
* process two digit score (decimal) into two
|
|
* numeral sprites - clobbers A, X
|
|
**************************************************
|
|
|
|
UPDATESCORE
|
|
|
|
* DIGIT 1s
|
|
LDA PLAYERSCORE+1
|
|
* get low nibble of score
|
|
* AND score with 0F
|
|
AND #$0F
|
|
* load sprite for that digit
|
|
TAX
|
|
|
|
LDA DIGITSLO,X
|
|
STA SPRITELO
|
|
LDA DIGITSHI,X
|
|
STA SPRITEHI
|
|
|
|
* plotrow = 0
|
|
LDA #$0
|
|
STA PLOTROW
|
|
* plotcolumn = #$25
|
|
LDA #$25
|
|
STA PLOTCOLUMN
|
|
JSR PLOTSPRITE
|
|
|
|
|
|
* DIGIT 10s
|
|
LDA PLAYERSCORE+1
|
|
* get HI nibble of score
|
|
* AND score with F0
|
|
AND #$F0
|
|
LSR
|
|
LSR
|
|
LSR
|
|
LSR
|
|
* load sprite for that digit
|
|
TAX
|
|
|
|
LDA DIGITSLO,X
|
|
STA SPRITELO
|
|
LDA DIGITSHI,X
|
|
STA SPRITEHI
|
|
|
|
* plotrow = 0
|
|
LDA #$0
|
|
STA PLOTROW
|
|
* plotcolumn = #$25
|
|
LDA #$21
|
|
STA PLOTCOLUMN
|
|
JSR PLOTSPRITE
|
|
|
|
* DIGIT 100s
|
|
LDA PLAYERSCORE
|
|
BEQ SKIPHUNDREDS
|
|
* get low nibble of score
|
|
* AND score with 0F
|
|
AND #$0F
|
|
* load sprite for that digit
|
|
TAX
|
|
|
|
LDA DIGITSLO,X
|
|
STA SPRITELO
|
|
LDA DIGITSHI,X
|
|
STA SPRITEHI
|
|
|
|
* plotrow = 0
|
|
LDA #$0
|
|
STA PLOTROW
|
|
* plotcolumn = #$25
|
|
LDA #$1D
|
|
STA PLOTCOLUMN
|
|
JSR PLOTSPRITE
|
|
|
|
|
|
|
|
SKIPHUNDREDS
|
|
RTS
|
|
|
|
|
|
**************************************************
|
|
* Draw a sprite at PLOTROW, PLOTCOLUMN - clobbers A, Y
|
|
**************************************************
|
|
|
|
PLOTSPRITE
|
|
LDA #$0
|
|
STA SPRITEOFFSET ; set offset to 0
|
|
|
|
LDA #$0
|
|
STA ROW ; for each ROW in X
|
|
|
|
SPRITEROWS LDA #$0
|
|
STA COLUMN ; for each COLUMN in Y
|
|
LDA PLOTCOLUMN
|
|
CLC
|
|
ADC COLUMN
|
|
STA PLOTCOLUMN
|
|
SPRITECOLUMNS LDY SPRITEOFFSET
|
|
LDA (SPRITELO),Y ; LDA Sprite Origin,OFFSET
|
|
STA CHAR ; store character
|
|
JSR PLOTQUICK ; PLOT
|
|
|
|
INC SPRITEOFFSET
|
|
INC PLOTCOLUMN
|
|
INC COLUMN
|
|
LDA #$02 ; number sprites are 4 px wide
|
|
CMP COLUMN
|
|
BCS SPRITECOLUMNS ; do next column
|
|
|
|
INC PLOTROW
|
|
INC ROW
|
|
DEC PLOTCOLUMN
|
|
LDA PLOTCOLUMN ; PLOTCOLUMN back to sprite's origin
|
|
SEC
|
|
SBC #$02
|
|
STA PLOTCOLUMN
|
|
|
|
LDA #$02 ; number sprites are 3px tall
|
|
CMP ROW
|
|
BCS SPRITEROWS ; do next row
|
|
|
|
SPRITEDONE RTS
|
|
|
|
|
|
|
|
|
|
|
|
**************************************************
|
|
* Thanks to Craig Bower for the splash screen
|
|
* and this code (I modified it slightly)
|
|
**************************************************
|
|
|
|
SPLASHSCREEN
|
|
; move graphic data to $3000
|
|
|
|
LDA SPLASHLO ; Setup pointers to move memory
|
|
STA $3C ; $3C and $3D for source start
|
|
LDA SPLASHHI
|
|
STA $3D
|
|
|
|
LDA SPLASHLO
|
|
STA $3E ; $3E and $3F for source end
|
|
LDA SPLASHHI
|
|
CLC
|
|
ADC #$04 ; add $400 to start == end of graphic
|
|
STA $3F ;
|
|
|
|
LDA #$00
|
|
STA $42 ; $42 and $43 for destination
|
|
LDA #$30
|
|
STA $43
|
|
LDA #$00 ; Clear ACC, X,Y for smooth operation
|
|
TAX
|
|
TAY
|
|
JSR $FE2C ; F8ROM:MOVE ; Do the memory move
|
|
|
|
|
|
|
|
LDA #$15 ; Kill 80-Column mode whether active or not
|
|
JSR $FDED ; F8ROM:COUT
|
|
|
|
STA $C050 ; rw:TXTCLR ; Set Lo-res page 1, mixed graphics + text
|
|
STA $C053 ; rw:MIXSET
|
|
STA $C054 ; rw:TXTPAGE1
|
|
STA $C056 ; rw:LORES
|
|
|
|
; display the data from $3000 at $400
|
|
RESETVPTR LDA #$00 ; Move titlepage from $3000 to $400 (screen)
|
|
STA $FE ; pointer for where we are at vertically on screen
|
|
TAY ; Y-Reg used for indexing across (horiz) screen
|
|
VERTICALPTR LDA $FE ; pointer for where we are at vertically on screen
|
|
JSR $F847 ; F8ROM:GBASCALC
|
|
|
|
LDA $26
|
|
STA $FA ; $FA is our offset GBASL Byte (Source data titlepage)
|
|
|
|
LDA $27 ; Add 04 w/ Carry to get to $3000 where graphic data is
|
|
ADC #$2C
|
|
STA $FB ; $FB is our offset GBASH Byte (Source data titlepage)
|
|
|
|
GRABSTORAGE LDA ($FA),Y ; Grab from storage
|
|
STA ($26),Y ; Put to screen
|
|
INY
|
|
CPY #$28 ; #$28 past the width of screen?
|
|
BNE GRABSTORAGE ; No? Back for another round
|
|
LDA #$00
|
|
TAX
|
|
TAY
|
|
|
|
|
|
INC $FE ; Next line down vertically
|
|
LDA #$00
|
|
TAX
|
|
TAY
|
|
LDA $FE
|
|
CMP #$18 ; #$18 bottom of screen?
|
|
BNE VERTICALPTR ; No? Go back and do next line down
|
|
|
|
|
|
LDA #$00
|
|
STA $C010 ; r:KBDSTRB ; Clear keyboard strobe
|
|
|
|
; LOOP HERE TO WAIT FOR KEYPRESS
|
|
SPLASHLOOP LDA KEY ; check for keydown
|
|
CMP #$80
|
|
BCC SPLASHLOOP ; got a key?
|
|
|
|
LDA #$00 ; Clear keyboard strobe again, electric duet doesn't
|
|
STA $C010 ; r:KBDSTRB
|
|
|
|
RTS ; We now return you to your regular programming
|
|
|
|
;/SPLASHSCREEN
|
|
|
|
|
|
|
|
|
|
|
|
|
|
**************************************************
|
|
* Data Tables
|
|
*
|
|
**************************************************
|
|
; add color chains per level, instead of narrowing field.
|
|
BLOCKCOLORS HEX 99,11,11,11,11,11,11,11,11,11,11,11,11,22,22,22
|
|
HEX 66,22,22,22,22,22,22,22,22,22,22,22,22,CC,CC,CC
|
|
HEX 44,CC,CC,CC,CC,CC,CC,CC,CC,CC,CC,CC,CC,CC,CC,CC
|
|
HEX 99,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11
|
|
HEX 66,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22
|
|
HEX 44,CC,CC,CC,CC,CC,CC,CC,CC,CC,CC,CC,CC,CC,CC,CC
|
|
|
|
***
|
|
|
|
; Player score, two bytes to go up to 9999
|
|
PLAYERSCORE HEX 00,00
|
|
|
|
|
|
BORDERCOLORS HEX BB,33,AA,55,88,55,88,55,88
|
|
|
|
|
|
CHAIN HEX 11,11,00,00,00,00,00,11,11
|
|
HEX 11,11,00,90,99,99,90,11,11
|
|
HEX 11,11,90,99,99,88,89,11,11
|
|
HEX 01,11,99,99,11,11,11,11,01
|
|
HEX 00,00,99,99,01,01,81,88,00
|
|
HEX 00,00,99,99,d0,d0,d8,88,00
|
|
HEX d0,dd,99,99,dd,dd,dd,dd,d0
|
|
HEX dd,dd,09,99,99,88,98,dd,dd
|
|
HEX dd,dd,00,09,99,99,09,dd,dd
|
|
HEX DD,DD,00,00,00,00,00,DD,DD
|
|
HEX DD,DD,00,C0,CC,CC,C0,DD,DD
|
|
HEX DD,DD,C0,CC,CC,44,4C,DD,DD
|
|
HEX 0D,DD,CC,CC,DD,DD,DD,DD,0D
|
|
HEX 00,00,CC,CC,0D,0D,4D,44,00
|
|
HEX 00,00,CC,CC,20,20,24,44,00
|
|
HEX 20,22,CC,CC,22,22,22,22,20
|
|
HEX 22,22,0C,CC,CC,44,C4,22,22
|
|
HEX 22,22,00,0C,CC,CC,0C,22,22
|
|
HEX 22,22,00,00,00,00,00,22,22
|
|
HEX 22,22,00,70,77,77,70,22,22
|
|
HEX 22,22,70,77,77,33,37,22,22
|
|
HEX 02,22,77,77,22,22,22,22,02
|
|
HEX 00,00,77,77,02,02,32,33,00
|
|
HEX 00,00,77,77,10,10,13,33,00
|
|
HEX 10,11,77,77,11,11,11,11,10
|
|
HEX 11,11,07,77,77,33,73,11,11
|
|
HEX 11,11,00,07,77,77,07,11,11
|
|
|
|
|
|
ZERO HEX f0,f0,f0,ff,00,ff,ff,f0,FF
|
|
ONE HEX f0,f0,00,00,ff,00,00,ff,00
|
|
TWO HEX f0,f0,f0,F0,F0,FF,FF,F0,F0
|
|
THREE HEX f0,f0,f0,00,F0,FF,F0,F0,FF
|
|
FOUR HEX F0,00,F0,FF,F0,FF,00,00,FF
|
|
FIVE HEX f0,f0,f0,FF,F0,F0,F0,F0,FF
|
|
SIX HEX f0,f0,f0,FF,F0,F0,FF,F0,ff
|
|
SEVEN HEX f0,f0,f0,00,00,FF,00,00,FF
|
|
EIGHT HEX f0,f0,f0,FF,F0,FF,FF,F0,ff
|
|
NINE HEX f0,f0,f0,FF,F0,FF,F0,F0,FF
|
|
|
|
DIGITSLO db <ZERO,<ONE,<TWO,<THREE,<FOUR,<FIVE,<SIX,<SEVEN,<EIGHT,<NINE
|
|
DIGITSHI db >ZERO,>ONE,>TWO,>THREE,>FOUR,>FIVE,>SIX,>SEVEN,>EIGHT,>NINE
|
|
|
|
|
|
|
|
**************************************************
|
|
* Lores/Text lines
|
|
* Thanks to Dagen Brock for this.
|
|
**************************************************
|
|
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
|
|
|
|
; alt text page lines
|
|
Alt01 equ $800
|
|
Alt02 equ $880
|
|
Alt03 equ $900
|
|
Alt04 equ $980
|
|
Alt05 equ $A00
|
|
Alt06 equ $A80
|
|
Alt07 equ $B00
|
|
Alt08 equ $B80
|
|
Alt09 equ $828
|
|
Alt10 equ $8a8
|
|
Alt11 equ $928
|
|
Alt12 equ $9a8
|
|
Alt13 equ $A28
|
|
Alt14 equ $Aa8
|
|
Alt15 equ $B28
|
|
Alt16 equ $Ba8
|
|
Alt17 equ $850
|
|
Alt18 equ $8d0
|
|
Alt19 equ $950
|
|
Alt20 equ $9d0
|
|
* the "plus four" lines
|
|
Alt21 equ $A50
|
|
Alt22 equ $Ad0
|
|
Alt23 equ $B50
|
|
Alt24 equ $Bd0
|
|
|
|
|
|
|
|
|
|
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
|
|
|
|
; alt text page
|
|
AltLineTable da Alt01,Alt02,Alt03,Alt04
|
|
da Alt05,Alt06,Alt07,Alt08
|
|
da Alt09,Alt10,Alt11,Alt12
|
|
da Alt13,Alt14,Alt15,Alt16
|
|
da Alt17,Alt18,Alt19,Alt20
|
|
da Alt21,Alt22,Alt23,Alt24
|
|
|
|
|
|
** 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
|
|
|
|
; alt text page
|
|
AltLineTableH db >Alt01,>Alt02,>Alt03
|
|
db >Alt04,>Alt05,>Alt06
|
|
db >Alt07,>Alt08,>Alt09
|
|
db >Alt10,>Alt11,>Alt12
|
|
db >Alt13,>Alt14,>Alt15
|
|
db >Alt16,>Alt17,>Alt18
|
|
db >Alt19,>Alt20,>Alt21
|
|
db >Alt22,>Alt23,>Alt24
|
|
AltLineTableL db <Alt01,<Alt02,<Alt03
|
|
db <Alt04,<Alt05,<Alt06
|
|
db <Alt07,<Alt08,<Alt09
|
|
db <Alt10,<Alt11,<Alt12
|
|
db <Alt13,<Alt14,<Alt15
|
|
db <Alt16,<Alt17,<Alt18
|
|
db <Alt19,<Alt20,<Alt21
|
|
db <Alt22,<Alt23,<Alt24
|
|
|
|
|
|
|
|
|
|
SPLASHLO db <SPLASHSCREENDATA
|
|
SPLASHHI db >SPLASHSCREENDATA
|
|
|
|
SPLASHTABLE da SPLASHLO,SPLASHHI
|
|
|
|
SPLASHSCREENDATA HEX 11,11,00,07,77,77,07,11,11,00,00,00,00,00,00,00
|
|
HEX 00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00
|
|
HEX 00,00,00,00,00,00,00,00,DD,DD,09,99,99,88,98,DD
|
|
HEX DD,00,00,07,07,0D,0D,00,00,02,02,09,09,00,02,02
|
|
HEX 08,08,00,00,00,02,0D,0D,02,00,0F,0F,00,00,07,07
|
|
HEX 20,22,CC,CC,22,22,22,22,20,00,00,99,99,00,00,00
|
|
HEX 00,99,99,00,93,99,00,99,99,00,00,99,99,00,99,99
|
|
HEX 00,99,99,00,00,99,99,00,FF,FF,FF,FF,FF,FF,FF,FF
|
|
HEX 11,11,00,00,00,00,00,11,11,00,00,C2,C2,44,44,00
|
|
HEX 00,DD,DD,00,00,00,EE,EE,92,92,00,00,00,22,22,33
|
|
HEX 33,00,66,66,00,00,88,88,DD,DD,00,09,99,99,09,DD
|
|
HEX DD,00,00,00,00,30,30,00,00,30,00,00,00,00,00,00
|
|
HEX 00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00
|
|
HEX 22,22,0C,CC,CC,44,C4,22,22,00,00,99,99,93,00,30
|
|
HEX 00,09,99,00,99,99,00,99,99,00,30,99,99,00,09,99
|
|
HEX 00,09,99,00,00,09,99,00,FF,FF,FF,FF,FF,FF,FF,FF
|
|
HEX 11,11,00,90,99,99,90,11,11,00,00,6C,6C,00,11,11
|
|
HEX 00,22,22,00,00,C2,C2,00,09,B9,B2,00,44,44,02,00
|
|
HEX 00,00,72,72,00,22,22,00,DD,DD,00,00,00,00,00,DD
|
|
HEX DD,00,00,00,93,99,99,93,00,99,93,00,00,00,00,00
|
|
HEX 00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00
|
|
HEX 22,22,00,0C,CC,CC,0C,22,22,00,00,00,99,99,93,99
|
|
HEX 00,93,99,00,99,99,00,00,99,93,99,99,99,00,93,99
|
|
HEX 00,93,99,00,00,93,99,00,FF,FF,FF,FF,FF,FF,FF,FF
|
|
HEX 11,11,90,99,99,88,89,11,11,00,00,F6,F6,00,BB,BB
|
|
HEX 00,EE,EE,00,00,9C,9C,00,00,3B,3B,00,99,99,00,00
|
|
HEX 00,00,97,97,00,44,44,00,DD,DD,00,C0,CC,CC,C0,DD
|
|
HEX DD,00,00,93,99,99,00,09,00,99,99,00,00,00,00,00
|
|
HEX 00,00,00,00,00,00,93,93,00,00,00,00,00,00,00,00
|
|
HEX 22,22,00,00,00,00,00,22,22,00,00,00,00,09,09,00
|
|
HEX 00,09,09,00,09,09,00,00,00,09,09,00,09,00,09,09
|
|
HEX 00,09,09,00,00,09,09,00,FF,FF,FF,FF,FF,FF,FF,FF
|
|
HEX 01,11,99,99,11,11,11,11,01,00,00,EF,EF,77,77,00
|
|
HEX 00,BB,BB,00,00,29,29,00,00,23,23,00,12,12,00,00
|
|
HEX 00,00,29,29,66,66,00,00,DD,DD,C0,CC,CC,44,4C,DD
|
|
HEX DD,00,00,99,99,09,00,00,00,99,99,00,00,00,00,00
|
|
HEX 00,00,00,00,00,00,09,09,00,00,00,00,00,00,00,00
|
|
HEX A0,A0,A0,A0,A0,A0,A0,A0,A0,A0,A0,A0,A0,A0,A0,A0
|
|
HEX A0,A0,A0,A0,A0,A0,A0,A0,A0,A0,A0,A0,A0,A0,A0,A0
|
|
HEX A0,A0,A0,A0,A0,A0,A0,A0,FF,FF,FF,FF,FF,FF,FF,FF
|
|
HEX 00,00,99,99,01,01,81,88,00,00,00,2E,2E,00,99,99
|
|
HEX 00,C2,C2,00,00,66,66,00,00,44,44,00,21,21,00,00
|
|
HEX 00,00,DD,DD,00,32,32,00,0D,DD,CC,CC,DD,DD,DD,DD
|
|
HEX 0D,00,00,99,99,00,00,00,00,99,99,93,93,30,00,00
|
|
HEX 30,93,93,30,00,00,93,93,00,93,93,30,30,30,00,00
|
|
HEX A0,A0,A0,A0,BA,BA,C2,EC,EF,E3,EB,E3,E8,E1,E9,EE
|
|
HEX A0,C2,F9,A0,C3,E8,E1,F2,EC,E5,F3,A0,CD,E1,EE,E7
|
|
HEX E9,EE,BA,BA,A0,A0,A0,A0,FF,FF,FF,FF,FF,FF,FF,FF
|
|
HEX 00,00,99,99,D0,D0,D8,88,00,00,00,B2,B2,00,F2,F2
|
|
HEX 00,4C,4C,00,00,11,11,00,00,62,62,00,EE,EE,00,00
|
|
HEX 00,00,82,82,00,13,13,00,00,00,CC,CC,0D,0D,4D,44
|
|
HEX 00,00,00,99,99,00,00,00,00,99,99,99,99,99,00,30
|
|
HEX 99,99,09,99,93,00,99,99,00,99,99,99,99,99,93,00
|
|
HEX A0,A0,A0,A0,A0,A0,A0,A0,A0,A0,A0,A0,A0,A0,A0,A0
|
|
HEX A0,A0,A0,A0,A0,A0,A0,A0,A0,A0,A0,A0,A0,A0,A0,A0
|
|
HEX A0,A0,A0,A0,A0,A0,A0,A0,FF,FF,FF,FF,FF,FF,FF,FF
|
|
HEX D0,DD,99,99,DD,DD,DD,DD,D0,00,00,7B,7B,D0,DF,0F
|
|
HEX 00,24,24,90,90,00,44,44,80,86,06,00,02,22,D2,D0
|
|
HEX 20,00,F8,F8,00,01,71,70,00,00,CC,CC,20,20,24,44
|
|
HEX 00,00,00,99,99,00,00,00,00,99,99,09,00,99,00,99
|
|
HEX 99,00,00,99,99,00,99,99,00,99,99,00,09,99,99,00
|
|
HEX A0,A0,A0,A0,A0,A0,A0,A0,AF,D0,F2,E5,F3,F3,A0,E1
|
|
HEX EE,F9,A0,EB,E5,F9,A0,F4,EF,A0,E2,E5,E7,E9,EE,AF
|
|
HEX A0,A0,A0,A0,A0,A0,A0,A0,C7,FF,FF,FF,FF,FF,FF,FF
|
|
|
|
|
|
|