The article describing this program appears on a separate page.
BACTRION.ASM is available in ATASCII format.
*****************************
* BACTERION! *
* THE PLAGUE OF 2369 *
* BY *
* KYLE PEACOCK *
* WITH *
* TOM HUDSON *
* *
* ANALOG COMPUTING MAGAZINE *
* ALL RIGHTS RESERVED *
*****************************
* ATARI MEMORY USAGE
CASINI EQU $0002 ;RESTART VECTOR
DOSVEC EQU $000A ;RESTART VECTOR
DOSINI EQU $000C ;RESTART VECTOR
SDMCTL EQU $022F ;DMA ENABLE SHADOW
PMBASE EQU $D407 ;PM BASE REG.
GRACTL EQU $D01D ;GRAPHICS CONTROL
GPRIOR EQU $026F ;PRIORITY CONTROL
AUDC1 EQU $D201 ;AUDIO CHANNELS
AUDC2 EQU $D203
AUDC3 EQU $D205
AUDC4 EQU $D207
AUDF1 EQU $D200 ;AUDIO FREQUENCIES
AUDF2 EQU $D202
AUDF3 EQU $D204
AUDF4 EQU $D206
AUDCTL EQU $D208 ;AUDIO CONTROL
HITCLR EQU $D01E ;CLEAR COLLISIONS
WSYNC EQU $D40A ;WAIT FOR HOR SYNC.
RANDOM EQU $D20A ;RANDOM #s
PCOLR0 EQU $02C0 ;COLOR OF PLR/MIS
COLPF0 EQU $D016 ;PLAYFIELD COLOR #0
COLOR0 EQU $02C4 ;COLOR REGISTERS
COLOR4 EQU $02C8 ;BACKGROUND COLOR
NMIEN EQU $D40E ;NMI INTER. ENABLE
CH EQU $02FC ;LAST KEY PRESSED
SKSTAT EQU $D20F ;KEYBOARD STATUS
RTCLOK EQU $12 ;INTERNAL CLOCK
VDSLST EQU $0200 ;DLI VECTOR
SDLSTL EQU $0230 ;DLIST VECTOR
HPOSP0 EQU $D000 ;HOR. POS. PLR 0
HPOSP1 EQU $D001 ;HOR. POS. PLR 1
HPOSP2 EQU $D002 ;HOR. POS. PLR 2
HPOSP3 EQU $D003 ;HOR. POS. PLR 3
HPOSM0 EQU $D004 ;HOR. POS. MISS 0
HPOSM1 EQU $D005 ;HOR. POS. MISS 1
HPOSM2 EQU $D006 ;HOR. POS. MISS 2
HPOSM3 EQU $D007 ;HOR. POS. MISS 3
ATRACT EQU $4D ;ATTRACT MODE FLAG
CONSOL EQU $D01F ;CONSOLE BUTTONS
STICK0 EQU $0278 ;JOYSTICK PORT 0
P0PL EQU $D00C ;PLR/PLR COLLISIONS
M0PL EQU $D008 ;MIS/PLR COLLISIONS
P0PF EQU $D004 ;PLR/PLF COLLISIONS
TRIG0 EQU $D010 ;JOYSTICK BUTTON 0
* ATARI HARDWARE REGISTERS
SETVBV EQU $E45C ;SET SYS. TIMERS
SYSVBV EQU $E45F ;1st STAGE VBLANK
XITVBV EQU $E462 ;X-IT VBLANK
SIOINV EQU $E465 ;SIO INIT
* PLAYER/MISSILE DATA AREA
PLAYBS EQU $0000
MISS EQU PLAYBS+0768
PLAY0 EQU PLAYBS+1024
PLAY1 EQU PLAYBS+1280
PLAY2 EQU PLAYBS+1536
PLAY3 EQU PLAYBS+1792
* DISPLAY DATA AREA
DLIST EQU $1F00
DISP EQU $2010
DISP2 EQU $3000
* ZERO PAGE VARIABLES
ORG $80
LO DS 1
HI DS 1
BALO DS 1
BAHI DS 1
DRWLO DS 1
DRWHI DS 1
PLLO DS 1
PLHI DS 1
* VARIABLES
* PRIMARY USE IN 'PLOTTER' ROUTINE.
PLOTX DS 1 ;PLOT X-COORD.
PLOTY DS 1 ;PLOT Y-COORD.
COLOR DS 1 ;POINT COLOR.
DRAWX DS 1 ;DRAWTO X-COORD.
DRAWY DS 1 ;DRAWTO Y-COORD.
ACCX DS 1 ;X ACCUM.
ACCY DS 1 ;Y ACCUM.
DELTAX DS 1 ;DRAW WORK AREA.
DELTAY DS 1 ;DRAW WORK AREA.
INCX DS 1 ;DRAW X INCREMENT.
INCY DS 1 ;DRAW Y INCREMENT.
COUNTR DS 1 ;DRAWTO COUNTER.
ENDPT DS 1 ;DRAWTO ENDPOINT.
HOLD DS 1 ;WORK AREA.
XWORK DS 1
YWORK DS 1
YOFSET DS 1 ;PLOT Y OFFSET.
SHAPIX DS 1 ;OBJECT #.
SHAPCT DS 1 ;OBJECT SHAPE COUNTER.
XI DS 1 ;OBJECT X INCREMENT.
YI DS 1 ;OBJECT Y INCREMENT.
LENGTH DS 1 ;OBJECT (TAKE A GUESS!)
* PRIMARY USE IN 'TEST' ROUTINE.
VSTOP DS 1 ;STOP VBLANK FLAG.
LSOUND DS 1 ;LASER SOUND FLAG.
XSOUND DS 1 ;DETONATION SOUND FLAG.
CSOUND DS 1 ;CANNON SOUND FLAG.
FREQ DS 1 ;PULSE SOUND FREQUENCY.
DEMO DS 1 ;GAME UNDERWAY FLAG.
STRUCT DS 1 ;CELL STRUCTURE #.
NOPLAY DS 1 ;# OF PLAYERS.
SDELAY DS 2 ;PULSE SOUND DELAY.
LISTPT DS 1 ;DISPLAY LIST POINTER.
SCORE1 DS 2 ;LO-BYTE OF SCORES.
SCORE2 DS 2 ;MD-BYTE OF SCORES.
SCORE3 DS 2 ;HI-BYTE OF SCORES.
TSCR1 DS 3 ;TOTAL SCORE BYTES.
CELNUM DS 1 ;CELL # BEING DRAWN.
CELREF DS 1 ;CELL # BEING REFRESHED
* PRIMARY USE IN 'STRAT' ROUTINE.
GEVNUM DS 1 ;ATTACKING BACTERION! #
FRANGE DS 1 ;ATTACK PLAYER RADIUS.
GEVESC DS 1 ;# OF ESCAPED VESSELS.
TOTCEL DS 1 ;# OF CELLS REMAINING.
TURNT DS 1 ;BACTERION! TURN TIMERS
FIRETM DS 1 ;RAM COPY OF 'GEVFRE'
* PRIMARY USE IN 'SHOOT' ROUTINE
FDELAY DS 2 ;DELAY BETWEEN SHOTS.
NOBULL DS 2 ;# OF BULLETS FIRED.
NOKILL DS 2 ;# OF VESSELS KILLED.
* PRIMARY USE IN 'TEST' ROUTINE
CELLMV DS 20 ;CELL MOVING FLAGs.
CELLNX DS 20 ;CELL NEW X-COORD.
CELLOX DS 20 ;CELL OLD X-COORD.
ORG $1CB5
CELLNY DS 20 ;CELL NEW Y-COORD.
CELLOY DS 20 ;CELL OLD Y-COORD.
GEVCEL DS 20 ;CELL # BEING HEISTED.
* PRIMARY USE IN 'STRAT' ROUTINE
GEVFRE DS 20 ;BACTERION! FIRE TIMERS
MOVET DS 20 ;BACTERION! MOVE TIMERS
GEVDES DS 20 ;DESIRED DIRECTION.
GEVDIR DS 20 ;ACTUAL DIRECTION.
ATTACK DS 20 ;ATTACKING PLAYER FLAG.
ESCAPE DS 20 ;Y-COORD FOR ESCAPING.
STOP DS 20 ;BACTERION! ICED FLAG.
GEVX DS 20 ;BACTERION! X-COORD.
GEVY DS 20 ;BACTERION! Y-COORD.
TARX DS 20 ;BACTERION! TARGET-X.
TARY DS 20 ;BACTERION! TARGET-Y.
LSRDIR DS 20 ;LASER FIRING DIRECTION
LSRTME DS 20 ;LASER LIFE TIMER.
LASERX DS 20 ;LASER X-COORD.
LASERY DS 20 ;LASER Y-COORD.
* PRIMARY USE IN 'DRAW' ROUTINE.
TYPE DS 20 ;VESSEL TYPE.
PHASE DS 20 ;VESSEL PHASE.
TYPES DS 1 ;ATTACKING TYPE.
* PRIMARY USE IN 'SHOOT' ROUTINE.
SPEED DS 20 ;SPEED A PLAYER MOVES.
CSPEED DS 20 ;RAM COPY OF 'SPEED'
BULLET DS 20 ;BULLET OWNER (0 OR 1)
TITLE 'BACTERION! MASTER ASSEMBLY'
INCLUDE D:GEV.TXT
ORG $2800
LOC $0800
TITLE 'ONE SHOT INITIALIZER'
PROC
* RELOCATE CODE
MOVEIT JSR SIOINV ;INIT SOUNDS.
LDA #$22 ;INITIALIZE
STA SDMCTL ;DMA CONTROL.
LDA #HIGH $2800 ;SET ORIGIN
STA HI ;ADDR. IN
LDA #LOW $2800 ;2-BYTE
STA LO ;POINTER.
LDA #HIGH $0800 ;SET DESTIN-
STA BAHI ;ATION IN 2-
LDA #LOW $0800 ;BYTE
STA BALO ;POINTER.
LDY #$00 ;RESET Y-REG.
MOVELP LDA (LO),Y ;MOVE A 256
STA (BALO),Y ;BYTE BLOCK
INY ;USING Y-REG.
BNE MOVELP ;
INC HI ;NEXT 256-
INC BAHI ;BYTE BLOCK.
LDA HI ;
CMP #$40 ;DONE YET?
BNE MOVELP ;NO-KEEPITUP.
LDA #HIGH TEST ;SNAG ALL
STA DOSINI+1 ;RESET
STA CASINI+1 ;VECTORS
STA DOSVEC+1 ;SO AS TO
LDA #LOW TEST ;GAIN
STA DOSINI ;COMPLETE
STA CASINI ;CONTROL OF
STA DOSVEC ;THE SYSTEM.
JMP TEST ;ALL DONE. START!
* BUILD GAME BOARD DISPLAY LIST
INIT LDX #$00 ;RESET X-REG.
LDA #$0E ;DLIST OPCODE.
BDLOOP STA DLIST,X ;STORE IT.
DEX ;DONE YET?
BNE BDLOOP ;NO! GO BACK!
LDA #$70 ;
STA DLIST+0 ;INSTALL
STA DLIST+1 ;REMAINDER OF
LDA #$F0 ;SPECIAL
STA DLIST+2 ;DISPLAY
LDA #$4E ;LIST OP-
STA DLIST+3 ;CODES & OP-
STA DLIST+107 ;ERANDS INTO
LDA #HIGH DISP ;DISPLAY
STA DLIST+5 ;LIST
LDA #LOW DISP ;
STA DLIST+4 ;
LDA #HIGH DISP2 ;
STA DLIST+109 ;
LDA #LOW DISP2 ;
STA DLIST+108 ;
LDA #$41 ;
STA DLIST+200 ;
LDA #$8E ;
STA DLIST+199 ;
LDA #HIGH DLIST ;
STA DLIST+202 ;
LDA #LOW DLIST ;
STA DLIST+201 ;
* PLAYER/MISSILE INITIALIZATION
LDA #$3E ;
STA SDMCTL ;DMA ENABLE.
LDA #HIGH PLAYBS ;PM BASE
STA PMBASE ;ADDRESS.
LDA #$03 ;GRAPHICS
STA GRACTL ;CONTROL.
LDA #$10 ;PRIORITY
STA GPRIOR ;REGISTERS.
LDA #$00 ;CLEAR OUT
TAX ;PLAYER 0
:PMSET STA PLAY0,X ;& PLAYER 1
STA PLAY1,X ;
DEX ;ALL DONE?
BNE :PMSET ;NO! CONT.
* CLEAR OUT PLAYERS' SCOREs
LDX #$02
LDA #$00 ;FILL WITH 0
:CLRS2 STA SCORE1,X
STA SCORE2+1,X
STA TSCR1,X
DEX ;ALL DONE?
BPL :CLRS2 ;NO! CONTINUE
* CLEAR PLAYFIELD AREA
LDA #LOW DISP ;I'LL LET
STA LO ;YOU GUYS
LDA #HIGH DISP ;FIGURE OUT
STA HI ;WHAT'S GOING
LDX #0 ;ON HERE!
CDLP LDA LO
STA LOTBL,X ;I'M SO LAZY!
LDA HI
STA HITBL,X
LDA #0
LDY #39
CDLP2 STA (LO),Y
DEY
BPL CDLP2
INX
CPX #192
BEQ DOIT
LDA LO
CLC
ADC #40
STA LO
LDA HI
ADC #0
STA HI
JMP CDLP
* SET UP ATOMIC PILE CELLS
DOIT LDX STRUCT
LDY STRBSE,X
LDX #9
STX TOTCEL
SETCEL LDA :ICELX,Y ;X-COORDS
STA CELLOX,X
STA CELLNX,X
LDA :ICELY,Y ;Y-COORDS
STA CELLOY,X
STA CELLNY,X
LDA #$00
STA CELLMV,X ;CELLS NOT MOV-
INY ;ING STAGUS.
DEX
BPL SETCEL
* SET UP PLAYERS PROBEs
LDX #$00 ;FLIP TO GAME
STX LISTPT ;BOARD SCREEN
STX GEVX+0 ;X-COORD.
STX GEVX+1 ;X-COORD.
JSR SETPLR ;SET IT UP NOW.
LDA NOPLAY ;1 PLAYER GAME?
BEQ SETTYP ;YES! SKIP #2
INX ;NO! SET UP PLR 2.
JSR SETPLR ;SET IT UP NOW.
* ATTACKING BACTERION! TYPE
SETTYP LDA #$01 ;SLOWEST TYPE
STA TYPES ;ATTACKS FIRST.
STA TYPE+2
STA TYPE+3
STA TYPE+4
* BACTERION! INITIAL A.I. SPEEDS
LDX #$05
SETMDB LDA IMOVDB,X ;MOVEMENT SPEED
STA MOVEDB,X
LDA ITURDB,X ;TURN SPEED
STA TURNDB,X
LDA IFIRDB,X ;FIRE SPEED
STA FREBSE,X
DEX
BPL SETMDB
JMP INIT2
* INITIALIZE GIVEN PLAYER
SETPLR LDA #$00 ;PLAYER NO LONG-
STA STOP,X ;ER DEAD OR EXP-
STA TYPE,X ;LODING.
LDA #$01 ;SET UP FOR
STA SPEED,X ;COASTING SPEED.
STA CSPEED,X ;
LDA PLRPHS,X ;CORRECT TYPE
STA PHASE,X ;OF VESSEL
STA GEVDIR,X ;PHASE
LDA PLRX,X ;PROPER X-COORD.
STA GEVX,X ;
LDA #128 ;PROPER Y-COORD.
STA GEVY,X ;
RTS ;ALL DONE...
PLRX DB 44,195 ;INITIAL X-COORDS
PLRPHS DB 12,4 ;INITIAL DIRECTIONS
* BACTERION! INITIAL TURNING DATABASE
ITURDB DB 52,44,36,28,20,12
* BACTERION! INITIAL MOVING DATABASE
IMOVDB DB 13,11,09,07,05,03
* BACTERION! INITIAL FIRING TIMES
IFIRDB DB 70,65,60,55,50,45
* OFFSET DATABASE TO CELL FORMATIONS
STRBSE DB 0,10,20
* CELLS INITIAL X-COORDS
:ICELX DB 68,80,92,62,74
DB 86,98,68,80,92
DB 79,79,79,79,73
DB 85,67,91,61,97
DB 79,71,87,79,79
DB 79,79,71,87,79
* CELLS INITIAL Y-COORDS
:ICELY DB 93,93,93,96,96
DB 96,96,99,99,99
DB 76,82,88,94,98
DB 98,102,102,106,106
DB 86,90,90,94,94
DB 94,94,98,98,102
TITLE 'BACTERION! MULTI-INITIALIZER'
INIT2 PROC
* ALLOW THINGS TO SETTLE DOWN
LDX #$01 ;STOP VERTICAL
STX VSTOP ;BLANK ROUTINE
* INITIALIZE SOUNDS
DEX ;
TXA ;
STA AUDC3 ;TURN OFF SOUND
STA AUDC4 ;REGISTERS & INIT
STA AUDCTL ;SOUND CHANNELS.
* CLEAR PLAYER MISSILE AREA
:ER1 STA MISS,X ;BACTERION! #1.
STA PLAY2,X ;BACTERION! #2.
STA PLAY3,X ;BACTERION! #3.
STA HITCLR ;CLEAR COLLISIONS
DEX
BNE :ER1
* ENEMY BACTERION!s X, Y, & DIRECTION
LDX #$04 ;HANDLE ALL.
SETGEV LDA TYPES ;GET TYPE OF ATT-
STA TYPE,X ;ACKING BACTERION.
JSR PICKX ;RANDOM X-COORD.
STA GEVX,X ;STORE IT.
LDA RANDOM ;RANDOM NUMBER.
BPL :PLUS1 ;BRANCH IF > 0.
LDA #21 ;INITIAL Y-COORD.
BNE :PLUS2 ;BRANCH!
:PLUS1 LDA #228 ;INITIAL Y-COORD.
:PLUS2 STA GEVY,X ;STORE IT.
JSR PICKDR ;RANDOM DIRECTION.
* ENEMY BACTERION!Rs TARGET CELL
SEL LDA #$00 ;CLEAR
STA TRY ;COUNTERS,
STA GEVESC ;# OF ESCAPEES,
STA STOP,X ;DEATH STATUS,
STA GEVCEL,X ;TARGET CELL,
STA LSRDIR,X ;LASER FLAG,
STA GEVFRE,X ;FIRE TIME FLAG,
STA ESCAPE,X ;ESCAPE Y-COORD.
LDA RAND0 ;GET RANDOM #
CMP #$D8 ;GREATER THAN $D8
BCS SELIT ;YES, BRANCH!
SEL0 LDA #$0A ;RANDOM # SEED
JSR RAND0 ;GET RANDOM CELL #
TAY ;STORE IN Y-REG.
STX :XHOLD ;SAVE X-REG.
CPICK0 LDA ESCAPE,X ;ESCAPE Y-COORD
BEQ CPICK1 ;EQUAL 0?
TYA ;NO! MOVE Y TO A
CMP GEVCEL,X ;IS THIS CELL
BEQ SEL1 ;SPOKEN FOR?
CPICK1 INX ;NO! MOVE ON
CPX #$05 ;TO NEXT
BNE CPICK0 ;BACTERION!
LDX :XHOLD ;RESTORE X-REG.
* HEIST THIS CELL (IN Y-REG.)
LDA CELLNY,Y ;CELL Y-COORD.
CMP #194 ;OFF SCREEN?
BCS SEL1 ;YES! TRY AGAIN.
LDA #$02 ;RANDOM # SEED.
JSR RAND0 ;GET RANDOM #.
STY :YHOLD ;SAVE Y-REG.
TAY ;MOVE # TO ACC.
LDA ESCDT,Y ;GET PROPER ES-
STA ESCAPE,X ;CAPE Y-COORD.
LDA CELDT,Y ;GET OFFSET FOR
LDY :YHOLD ;LOCKING ON TO
CLC ;TOP OR BOTTOM
ADC CELLNY,Y ;OF CELL & STORE
STA TARY,X ;IN TARGET-Y.
LDA CELLNX,Y ;GET X-COORD OF
CLC ;CELL & STORE
ADC #44 ;IN TARGET-X.
STA TARX,X ;
TYA ;MAKE THIS CELL
STA GEVCEL,X ;SPOKEN FOR.
JMP SEL2 ;HANDLE NEXT.
SEL1 LDX :XHOLD ;RESTORE X-REG.
DEC TRY ;DEC. COUNTERS
BNE SEL0 ;& BRANCH!
* CAN'T FIND A CELL, ATTACK PLAYERs
SELIT LDY NOPLAY ;# OF PLAYERS.
INY ;ADD ONE.
TYA ;RANDOM # SEED.
JSR RAND0 ;GET RANDOM #.
TAY ;MOVE TO Y-REG.
LDA GEVX,Y ;PLAYER'S X-COORD.
STA TARX,X ;USE AS TARGET-X.
LDA GEVY,Y ;PLAYER'S Y-COORD.
STA TARY,X ;USE AS TARGET-Y.
SEL2 DEX ;HANDLE NEXT
CPX #$01 ;BACTERION! (IF
BEQ :NEXT ;WE AREN'T DONE.)
JMP SETGEV ;JUMP TO IT!
* SET UP RANGE OF ATTACK
:NEXT LDA #40
STA FRANGE
* SET UP FIRING TIME
LDX TYPES ;ATTACK TYPE.
LDA FREBSE-1,X ;GET DATA FROM
STA FIRETM ;FIRING DB.
CMP #$05 ;IS IT < 5?
BCC PROJT1 ;NO! BRANCH!
SEC ;YES! SUBTRACT
SBC #$03 ;3 & STORE
STA FREBSE-1,X ;IT IN DB.
* CLEAR PROJECTILE WORK AREA
PROJT1 LDX #12 ;HANDLE ALL.
LDA #$FF ;INACTIVE STATUS.
CLRPRO STA BULLET,X ;OWNER.
STA CELLNX+5,X ;X-COORD.
STA CELLNY+5,X ;Y-COORD.
STA CELLMV+5,X ;MOVING.
DEX ;HANDLE NEXT
CPX #$04 ;(IF ANY).
BNE CLRPRO ;
* SET UP COLOR DATABASES
LDX #$03 ;COUNTER.
:SET1 LDA RANDOM ;RANDOM #.
AND #$F0 ;ZAP LO-NIBBLE.
ORA #$0A ;& W/DECIMAL 10.
STA PCOLR0,X ;STORE IT.
LDA RANDOM ;RANDOM #.
AND #$F0 ;ZAP LO-NIBBLE.
ORA :FIELD,X ;OR W/PLAYFIELD.
STA COLOR0,X ;STORE IT.
DEX ;HANDLE NEXT.
BPL :SET1 ;BRANCH!
LDA #$00 ;CLEAR.
STA NOBULL+0 ;# OF BULLETS
STA NOKILL+0 ;FIRED & # OF
STA NOBULL+1 ;BACTERIONS!
STA NOKILL+1 ;VAPORIZED.
STA VSTOP ;START VBLANK.
RTS ;BUG OFF!!!
* BACTERION! FIRE TIME DATABASE
FREBSE DB 0,0,0,0,0,0
* OFFSETS TO TOP & BOTTOM OF CELL
CELDT DB 21,36
* Y-COORDS FOR ESCAPING BACTERION!
ESCDT DB 10,245
* COLOR LUM. FOR PLAYERS PLAYFIELDS
:PLAYC DB $0C,$0C,$0A,$0A
:FIELD DB $0C,$08,$08,$0A
* PICK A RANDOM X-COORD.
PICKX LDA #100
JSR RAND0
CLC
ADC #75
RTS
* PICK A RANDOM DIRECTION (0-15)
PICKDR LDA #16
JSR RAND0
STA GEVDIR,X
RTS
* PICK A RANDOM # (0 UP TO ACC.)
RAND0 STA HOLDME
LDA RANDOM
RAND01 CMP HOLDME
BCC RANOUT
LSR A
LSR A
JMP RAND01
RANOUT RTS
HOLDME DB 0 ;TEMP STORAGE.
TRY DB 0 ;COUNTER.
:XHOLD DB 0 ;X-REG TEMP STORAGE.
:YHOLD DB 0 ;Y-REG TEMP STORAGE.
TITLE 'GET THE GAME GOING...'
TEST PROC
LDA #$00 ;TURN OFF
STA AUDC1 ;SOUND
STA AUDC2 ;REGISTERS.
JSR :SETP0 ;SET UP TITLE
JSR ADITUP ;SCREEN SCORES
LDA #$01 ;& SHOW TITLE
STA LISTPT ;SCREEN.
STA VSTOP ;
LDA #$06 ;SET UP VERT-
LDX #HIGH VBL ;ICAL BLANK
LDY #LOW VBL ;ROUTINES.
JSR SETVBV ;
LDA #$07 ;SET UP DEF.
LDX #HIGH DBL ;VERTICAL
LDY #LOW DBL ;BLANK
JSR SETVBV ;ROUTINES.
LDA #$C0 ;SET UP DLI
STA NMIEN ;ROUTINES.
:DEMOX JSR SHUTUP
LDA DEMO ;WAIT FOR PUSH
CMP #$01 ;OF START KEY.
BNE :DEMOX ;
INC DEMO ;
JSR INIT ;INITIALIZE...
* START OF NEW GAME
SAVE0 LDA DEMO ;CHANGE STATUS
CMP #$02 ;OF 'DEMO'
BNE TEST ;VARIABLE
* GAME PAUSED?
LDA CH ;IS SPACEBAR
CMP #$21 ;PRESSED?
BNE :REFCL ;YES. IS BAR
LDA SKSTAT ;STILL BEING
AND #$04 ;PRESSED?
BEQ :REFCL ;YES-CONTINUE.
JSR ADITUP ;ADD UP SCORES
LDA TOTCEL ;HOLD # OF
PHA ;CELLS LEFT.
LDA #$0A ;MAKE WEIRD
STA TOTCEL ;SOUND.
LDA #$01 ;SWITCH TO
STA LISTPT ;TITLE SCREEN.
STA VSTOP
STA CH ;WAIT FOR
JSR SHUTUP ;SPACEBAR.
:WAIT1 LDA CH ;IS SPACEBAR
CMP #$21 ;PRESSED? NO,
BNE :WAIT1 ;SO WAIT.
:WAIT2 LDA SKSTAT ;YES. IS BAR
AND #$04 ;STILL BEING
BEQ :WAIT2 ;PRESSED?
PLA ;RESTORE # OF
STA TOTCEL ;CELLS LEFT.
LDA #$00 ;SWITCH BACK
STA LISTPT ;TO PLAYFIELD
STA VSTOP ;& CONTINUE...
STA CH
* REFRESH CELLS (ONE PER PASS)
:REFCL DEC CELREF ;OUT OF CELLS
BPL GETCEL ;TO REFRESH?
LDA #$09 ;YES. START
STA CELREF ;AGAIN...
GETCEL LDX CELREF ;GET CELL # TO
LDA CELLMV,X ;REFRESH & SEE
BNE GOTCEL ;IF IT MOVES.
LDA CELLOX,X ;CELL X-COORD
STA PLOTX ;
LDA CELLOY,X ;CELL Y-COORD
STA PLOTY ;
LDA #1 ;SPEC. COLOR
STA COLOR ;
LDA #0 ;SPEC. OBJECT
JSR OBJECT ;DRAW IT...
* DRAW MOVING CELLS (ALL AT ONCE)
GOTCEL LDA #$09 ;SET UP CELL #
STA CELNUM ;TO DRAW.
SAVE1 LDX CELNUM ;GET CELL #.
LDA CELLMV,X ;IS IT BEING
BEQ SAVE2 ;CARRIED OFF?
JSR SHOCEL ;YES. DRAW IT.
SAVE2 DEC CELNUM ;MOVE ON TO
BPL SAVE1 ;NEXT CELL.
* DRAW & ERASE BACTERION! LASERS
LDA #$04 ;CHECK ALL
STA LSRCNT ;VESSELS.
LASER3 LDX LSRCNT ;IS THIS VES-
LDA LSRDIR,X ;SEL FIRING?
BEQ NXTLSR ;NO. CONTINUE.
BMI LASER5 ;YES. ERASE?
ORA #$80 ;SET UP LASER
STA LSRDIR,X ;TO BE ERASED.
LDA #$02 ;SPECIFY COLOR
STA COLOR ;OF LASER.
LDA GEVX,X ;GET X-COORD
SEC ;OF FIRING
SBC #44 ;VESSEL & USE
STA LASERX,X ;AS LASER
STA PLOTX ;X-COORD.
LDA GEVY,X ;GET Y-COORD
SEC ;OF FIRING
SBC #$1C ;VESSEL & USE
CMP #192 ;AS LASER
BCS LASER6 ;Y-COORD. DO
STA LASERY,X ;NOT FIRE IF
STA PLOTY ;NOT ON-SCREEN
LDA LSRDIR,X ;ELSE, DRAW
AND #$7F ;FIRING LASER
JSR OBJECT ;(DEATH RAY).
JMP NXTLSR ;HANDLE NEXT.
LASER5 DEC LSRTME,X ;TIME TO
BPL NXTLSR ;ERASE LASER?
LDA LASERX,X ;YES. GET X
STA PLOTX ;COORD & Y
LDA LASERY,X ;COORD FOR
STA PLOTY ;ERASING.
LDA #$00 ;SPECIFY COLOR
STA COLOR ;AS BACKGROUND.
LDA LSRDIR,X ;NOW ERASE
AND #$7F ;LASER.
JSR OBJECT ;
LDX LSRCNT ;TURN OFF
LASER6 LDA #$00 ;LASER FOR
STA LSRDIR,X ;THIS VESSEL.
NXTLSR DEC LSRCNT ;HANDLED ALL
LDA LSRCNT ;LASERS? IF
CMP #$01 ;SO, QUIT.
BNE LASER3 ;ELSE GO BACK.
* DRAW & ERASE PROJECTILES
LDX #17 ;HANDLE ALL.
PROJ5 LDA CELLMV,X ;IS THIS BULLET
BEQ PROJ6 ;ACTIVE?
LDA CELLOX,X ;YES. GET X
STA PLOTX ;COORD.
LDA CELLOY,X ;GET Y-COORD.
STA PLOTY ;OF BULLET.
LDA #$00 ;SET UP TO ERASE
STA CELLMV,X ;THIS BULLET.
STA COLOR ;SPECIFY COLOR.
STX :XHOLD ;SAVE X-REG.
JSR PLOTPT ;ERASE IT NOW!
LDX :XHOLD ;RESTORE X-REG.
LDA CELLNX,X ;GET NEW BULLET
STA CELLOX,X ;X-COORD & PRE-
STA PLOTX ;PARE TO PLOT.
LDA CELLNY,X ;GET NEW BULLET
STA CELLOY,X ;Y-COORD & PRE-
STA PLOTY ;PARE TO PLOT.
LDA #$03 ;SPECIFY COLOR
STA COLOR ;OF NEW BULLET.
STX :XHOLD ;SAVE X-REG.
JSR PLOTPT ;DRAW NEW BULLET
LDX :XHOLD ;RESTORE X-REG.
PROJ6 DEX ;MOVE ON TO NEXT
CPX #$09 ;BULLET. IF NONE
BNE PROJ5 ;LEFT, QUIT.
* ALL CELLS GONE?
GAME3 LDA TOTCEL ;TOTAL # OF
BPL GAME1 ;CELLS < 0?
JSR SHUTUP ;YES. SOUND OFF.
LDA #$01 ;STOP ALL SCREEN
STA VSTOP ;ACTION.
STA RTCLOK+2 ;SET UP TO
LDX RTCLOK+1 ;PAUSE FOR
INX ;SOME TIME.
HALT CPX RTCLOK+1 ;IS PAUSE DONE?
BNE HALT ;NO. WAIT.
JMP TEST ;YES. RESTART.
*BACTERION!s DESTROYED OR OFF SCREEN?
GAME1 LDA GEVESC ;IS NUMBER OF
CMP #$03 ;ESCAPED VESSELS
BEQ GAMEE ;EQUAL TO THREE?
JMP SAVE0 ;NO, GO BACK.
GAMEE JSR ADITUP ;ADD UP SCORES.
INC TYPES ;SET UP NEXT TYPE
LDA TYPES ;OF ATTACKING
CMP #$07 ;BACTERION.
BCC GAME2 ;
LDA RANDOM ;GET RANDOM
AND #$F0 ;BACKGROUND
STA COLOR4 ;COLOR.
* FLIP TO TITLE SCREEN
LDA #$01 ;STOP ALL SCREEN
STA VSTOP ;ACTION & FLIP
STA LISTPT ;TO TITLE SCREEN
JSR SHUTUP ;SOUNDS OFF.
LDA TOTCEL ;SAVE TOTAL #
PHA ;OF CELLS LEFT.
LDA #$0A ;MAKE WEIRD
STA TOTCEL ;TITLE SOUND.
STA RTCLOK+2 ;PAUSE FOR A
LDX RTCLOK+1 ;WHILE.
INX ;
:PAUSE CPX RTCLOK+1 ;PAUSE TIME UP?
BNE :PAUSE ;NO. WAIT.
PLA ;RESTORE TOTAL #
STA TOTCEL ;OF CELLS LEFT.
LDA #$00 ;FLIP TO GAME
STA LISTPT ;SCREEN & BEGIN
STA VSTOP ;SCREEN ACTION.
STA CH
STA XSOUND
STA CSOUND
STA LSOUND
* SPEED UP BACTERION! MOVE/TURN RATES
LDX #$05 ;UPDATE ALL.
FAST1 LDA MOVEDB,X ;IS MOVE RATE AT
CMP #$02 ;LOWEST LEVEL?
BCC FAST2 ;YES, CONTINUE.
DEC MOVEDB,X ;NO. DECREMENT.
FAST2 LDA TURNDB,X ;IS TURN RATE AT
CMP #$08 ;LOWEST LEVEL?
BCC FAST3 ;YES, CONTINUE.
SEC ;NO. DECREMENT.
SBC #$04 ;
STA TURNDB,X ;
FAST3 DEX ;UPDATE NEXT.
BPL FAST1 ;
LDA #$01 ;MAKE ATTACKING
GAME2 STA TYPES ;BACTERION! THE
STA TYPE+2 ;SLOWEST TYPE
STA TYPE+3 ;FOR BEGINNING
STA TYPE+4 ;OF NEW WAVE.
* SET UP FOR NEXT ATTACK
JSR INIT2 ;INITIALIZE...
JMP SAVE0 ;BEGIN AGAIN.
* VERTICAL BLANK ROUTINE
VBL CLD ;CLEAR DECIMAL
LDA LISTPT ;RESEED
ASL A ;DISPLAY LIST
TAX ;VECTORS ACC-
LDA :LSTDB+0,X ;ORDING TO
STA SDLSTL+0 ;'LISTPT'
LDA :LSTDB+1,X ;VARIABLE.
STA SDLSTL+1 ;DO THE SAME
LDA :DLIDB+0,X ;THING FOR
STA VDSLST+0 ;DLI VECTORS.
LDA :DLIDB+1,X ;
STA VDSLST+1 ;
LDA #$00 ;MAKE ALL PLAYER/
STA HPOSP0 ;MISSILE X-COORDS
STA HPOSP1 ;EQUAL TO ZERO.
STA HPOSP2 ;THIS PROVIDES A
STA HPOSP3 ;NICE BORDER AT
STA HPOSM0 ;THE SCREEN TOP.
STA HPOSM1 ;THE DLIs HANDLE
STA HPOSM2 ;PROPER PLACEMENT
STA HPOSM3 ;OF X-COORDS.
LDA VSTOP ;IS SCREEN ACTION
BNE XITVBL ;HALTED?
* KILL ATTRACT MODE
STA ATRACT
* FLASH CELLS
LDA COLOR0 ;KEEP SAME LUM.
CLC ;BUT UPDATE
ADC #$10 ;COLOR.
STA COLOR0 ;
* BACTERION! ATTACK STRATEGY
LDA #$04 ;ALL VESSELS
STA GEVNUM ;ATTACK!
VBL2 JSR STRAT ;NASTY ROUTINE!
DEC GEVNUM ;NEXT VESSEL
LDA GEVNUM ;ATTACKS!
CMP #$01 ;ALL DONE?
BNE VBL2 ;IF NOT, CONT.
* TURN ENEMY BACTERION!s
JSR TURN
* MOVE ENEMY BACTERION!s
JSR MOVE
XITVBL JMP SYSVBV
* DEF. VERTICAL BLANK
DBL CLD ;CLEAR DECIMAL
* READ CONSOLE BUTTONS
JSR BUTTON
* PULSE SOUND
JSR PULSE
LDA VSTOP ;ALL SCREEN
BNE XITDBL ;ACTION HALTED?
* READ JOYSTICKS & MOVE PLAYERS
JSR STICKS ;PLAYERS MOVING
JSR SHOOT ;PLAYERS FIRING
* DON'T LET ANYONE GO OFF SCREEN
JSR BOUNDS
* DID ANYBODY RUN INTO ANYBODY?
JSR COLLIDE
* KEEP TRACK OF HEISTED CELLS
JSR TRACK
* BACTERION! LASER SOUND
JSR ZAP
* PLAYER'S CANNON SOUND
JSR CANNON
* DETONATION SOUND
JSR BOOM
* DRAW PLAYERS & BACTERION!s
JSR DRAW
XITDBL JMP XITVBV ;ALL DONE.
* PULSE SOUND ROUTINE
PULSE LDX TOTCEL ;GET TOTAL # OF
BMI PULRTS ;CELLS LEFT.
LDA FREQS,X ;GET ASSOCIATED
STA FREQ ;PULSE FREQUENCY
LDA DELS,X ;& SOUND DELAY
STA SDELAY+1 ;TIME. STORE IT.
LDX FREQ ;STORE PROPER
STX AUDF1 ;FREQ. INTO
INX ;SOUND REGS. 1
STX AUDF2 ;AND 2.
LDA SDELAY ;DECREMENT DELAY
BEQ SOUND5 ;TIMER IF NON
DEC SDELAY ;ZERO.
PULRTS RTS ;RETURN.
SOUND5 LDA SDELAY+1 ;RESTORE DELAY
STA SDELAY ;TIME IF ZERO.
INC FLIP ;TOGGLE PULSE
LDA FLIP ;SOUND GENERATOR
AND #$01 ;(IF OFF, TURN
TAX ;ON. IF ON, TURN
LDA REG,X ;OFF.) & STORE
STA AUDC1 ;INTO PROPER
STA AUDC2 ;AUDIO CHANNEL
RTS ;REGISTERS.
REG DB $00,$A4 ;AUDIO OFF/ON
FLIP DB 0 ;FLIP/FLOP VAR.
LSRCNT DB 0 ;LASER COUNTER.
* PULSE SOUND FREQUENCIES
FREQS DB 160,170,180,190,200
DB 210,220,230,240,250,140
* PULSE SOUND DELAYS
DELS DB 02,04,06,08,10,12,14
DB 16,18,20,01
* BACTERION! LASER SOUND
ZAP LDX LSOUND ;IS SOUND ON?
BEQ ZAPOFF ;NO. QUIT!
DEX ;YES.
DEC LSOUND ;GET PROPER
LDA LFTBL,X ;FREQ. AND STORE
STA AUDF3 ;INTO REGISTER.
LDA LCTBL,X ;GET PROPER CHAN.
STA AUDC3 ;AND STORE.
ZAPOFF RTS ;ALL DONE...
* BACTERION! LASER FREQUENCIES
LFTBL DB 0,236,216,197,177,157
DB 138,118,99,79,59,40,20,1
* BACTERION! LASER CHANNELS
LCTBL DB $00,$A2,$A2,$A2,$A2,$A4
DB $A4,$A4,$A4,$A4,$A4,$A6
DB $A6,$A6
* PLAYER'S CANNON SOUND
CANNON LDX CSOUND ;IS SOUND ON?
BEQ CANOFF ;NO. QUIT.
DEX ;YES. GET PROPER
DEC CSOUND ;FREQUENCY &
LDA CFTBL,X ;STORE INTO REG.
STA AUDF4 ;GET PROPER
LDA CCTBL,X ;CHANNEL & STORE
STA AUDC4 ;INTO REG.
CANOFF RTS ;ALL DONE...
* CANNON FREQUENCIES
CFTBL DB 0,254,212,170,127,85,43,1
* CANNON CHANNELS
CCTBL DB $00,$A8,$A8,$A8,$A8,$A8
DB $A8,$A8
* DETONATION SOUND
BOOM LDX XSOUND ;IS SOUND ON?
BEQ BOMOFF ;NO. CONTINUE.
DEX ;YES. GET PROPER
DEC XSOUND ;FREQ. AND STORE
LDA XFTBL,X ;INTO SOUND
STA AUDF3 ;REGISTER.
LDA XCTBL,X ;GET PROPER
STA AUDC3 ;CHANNEL & STORE.
BOMOFF RTS ;ALL DONE...
* DETONATION FREQUENCIES
XFTBL DB 0,253,249,245,241,237,234
DB 230,226,222,218,214,211
DB 207,203,199,195,191,188
DB 184,180,176,172,168,165
DB 161,157,153,149,145,142
DB 138,134,130,126,123,119
DB 115,111,107,103,100,96,92
DB 88,84,80,77,73,69,65,61,57
DB 54,50,46,42,38,34,31,27,23
DB 19,15,11,08,04
* DETONATION CHANNELS
XCTBL DB $00,$8A,$8A,$8A,$8A,$8A
DB $8A,$8A,$8A,$8A,$8A,$8A
DB $8A,$8A,$8A,$8A,$8A,$8A
DB $8A,$8A,$8A,$8A,$8A,$8A
DB $8A,$8A,$8A,$8A,$8A,$8A
DB $8A,$8A,$8A,$8A,$8A,$8A
DB $8A,$8A,$8A,$8A,$8A,$8A
DB $8A,$8A,$8A,$8A,$8A,$8A
DB $8A,$8A,$8A,$8A,$8A,$8A
DB $8A,$8A,$8A,$8A,$8A,$8A
DB $8A,$8A,$8A,$8A,$8A,$8A
* READ CONSOLE BUTTONS
BUTTON LDA CONSOL ;CONSOLE SWITCH.
CMP #$07 ;IS IT PRESSED?
BEQ :ACTVE ;YES, CONTINUE.
STA :PREV ;NO. SAVE IT.
RTS ;RETURN.
:ACTVE LDA :PREV ;GET CONSOLE VALUE
CMP #$06 ;START BUTTON ON.
BEQ :START ;
CMP #$05 ;SELECT BUTTON ON.
BEQ :SELCT ;
CMP #$03 ;OPTION BUTTON ON.
BEQ :OPTON ;
RTS ;CONFUSED! RETURN.
* START KEY PRESSED!!!
:START LDX #$01 ;GAME START. UP-
JMP :ENDBT ;DATE STATUS.
* SELECT KEY PRESSED!!!
:SELCT INC NOPLAY ;UPDATE # OF PLAY-
LDA NOPLAY ;ERS. (1 OR 2)
AND #$01 ;SAVE IN 'NOPLAY'
STA NOPLAY ;VARIABLE.
:SETP0 LDX #19 ;CLEAR PLAYERS'
LDA #$00 ;SCORE LINES
:SETP1 STA PLAYR1,X ;BY PLACING
STA PLAYR2,X ;BLANKS IN ALL
DEX ;POSITIONS.
BPL :SETP1 ;
LDX NOPLAY ;GET # PLAYERS.
LDA :PLINE,X ;DECIDE HOW MANY
TAX ;CHARACTERS TO
:SETP2 LDA :LINE1,X ;USE FOR PLAYER
STA PLAYR1,X ;SCORE LINE &
LDA :LINE2,X ;INSTALL INTO
STA PLAYR2,X ;PLAYER SCORE
DEX ;LINE. CONTINUE
BPL :SETP2 ;UNTIL DONE.
JMP :ENDBT
:OPTON INC STRUCT ;CHANGE STRUCT-
LDA STRUCT ;URE OF INITIAL
CMP #$03 ;CELL PATTERN.
BCS :OPTON ;RANGE: 0-2.
LDX #$00
:ENDBT STX DEMO ;UPDATE 'DEMO'
STX :PREV ;UPDATE PREVIOUS
RTS ;ALL DONE...
:PREV DB 0 ;OLD CONSOLE VALUE.
:PLINE DB 10,19 ;SCORE LINE CHARA-
;CTERS PER PLAYER.
* PLAYER 1/PLAYER 2 SCORE LINE
:LINE1 DB 176,172,161,185,165,178
DB 00,$D1,00,00,00,00,176
DB 172,161,185,165,178,00,$D2
* 000000/000000 SCORE LINE
:LINE2 DB 00,$50,$50,$50,$50,$50,$50
DB 00,00,00,00,00,00
DB $50,$50,$50,$50,$50,$50,00
* ADD UP SCORES
ADITUP SED ;SET DECIMAL.
LDX NOPLAY ;# OF PLAYERS.
CALC4 LDY NOKILL,X ;# OF KILLS FOR
BEQ CALCX ;THIS PLAYER.
CALC5 LDA TYPES ;BACTERION! TYPE
ASL A ;(1 TO 6) IS
ASL A ;MULTIPLIED BY
ASL A ;10 & ADDED TO
ASL A ;PLAYERS' SCORE
CLC ;
ADC SCORE3,X ;
STA SCORE3,X ;
LDA #$00 ;OVERFLOW
ADC SCORE2,X ;CORRECTION.
STA SCORE2,X ;
LDA #$00 ;OVERFLOW
ADC SCORE1,X ;CORRECTION.
STA SCORE1,X ;
DEY ;HANDLED ALL
BNE CALC5 ;KILLS?
CALCX DEX ;HANDLED ALL
BPL CALC4 ;PLAYERS?
* DISPLAY SCORES
LDX #$05 ;SIX DIGITS.
CALC6 LDY NOPLAY ;# OF PLAYERS.
TXA ;
AND SCMASK,Y ;AND IN SCORE
TAX ;MASK & GET
LDA SCORE1,X ;SCORE DIGIT.
PHA ;HOLD IT.
AND #$0F ;PLACE '5' IN
ORA #$50 ;HIGH NIBBLE.
LDY PUTSCR,X ;FIND WHERE TO
STA PLAYR2+1,Y ;PUT & DO SO.
PLA ;RESTORE DIGIT
LSR A ;& SHIFT INTO
LSR A ;LOW-NIBBLE.
LSR A ;
LSR A ;PLACE '5' IN
ORA #$50 ;HIGH-NIBBLE
STA PLAYR2,Y ;& STORE.
DEX ;IF NOT DONE,
BPL CALC6 ;CONTINUE.
* ADD UP TEAM SCORE
CLC ;CLEAR CARRY
LDX #$04 ;LOOP VAR.
LDY #$02 ;LOOP VAR.
CALC7 LDA SCORE1,X ;ADD UP CON-
ADC SCORE1+1,X ;SECUTIVE
STA TSCR1,Y ;SCORES &
DEX ;STORE INTO
DEX ;TEAM SCORE
DEY ;VARIABLES.
BPL CALC7 ;CONTINUE.
* DISPLAY TEAM SCORE
LDX #$02 ;THREE BYTES.
CALC8 LDY PUTTME,X ;WHERE TO PUT.
LDA TSCR1,X ;TEAM SCORE.
PHA ;HOLD IT.
AND #$0F ;PUT '5' IN
ORA #$50 ;HI-NIBBLE.
STA TEAM2+1,Y ;STORE DIGIT.
PLA ;RESTORE IT.
LSR A ;SHIFT HI-
LSR A ;NIBBLE TO LO-
LSR A ;NIBBLE.
LSR A ;PUT '5' IN
ORA #$50 ;HI-NIBBLE.
STA TEAM2,Y ;STORE IT.
DEX ;IF NOT DONE,
BPL CALC8 ;CONTINUE.
CLD ;CLEAR DECIMAL.
RTS ;ALL DONE...
* TURN OFF SOUND
SHUTUP LDA #$00 ;DEACTIVATE
STA AUDC3 ;SOUND REGISTERS
STA AUDC4 ;3 & 4.
STA LSOUND ;DEACTIVATE
STA XSOUND ;EXPLOSIONS
STA CSOUND ;CANNON & LASERS.
RTS ;ALL DONE...
* DLI ROUTINES
* GAME BOARD DLIs
DLI CLD ;CLEAR DEC.
PHA ;SAVE ACC.
LDA GEVX+0 ;GET X-COORDS
STA HPOSP0 ;OF ALL ACTIVE
LDA GEVX+1 ;VESSELS &
STA HPOSP1 ;STORE INTO PM
LDA GEVX+2 ;HORIZONTAL
STA HPOSP2 ;REGISTERS.
LDA GEVX+3 ;
STA HPOSP3 ;
LDA GEVX+4 ;
STA HPOSM3 ;
CLC ;
ADC #$02 ;
STA HPOSM2 ;
CLC ;
ADC #$02 ;
STA HPOSM1 ;
CLC ;
ADC #$02 ;
STA HPOSM0 ;
LDA #LOW DLI2 ;SET UP FOR
STA VDSLST ;NEXT DISPLAY
LDA #HIGH DLI2 ;LIST INTER-
STA VDSLST+1 ;RUPT REQUEST.
PLA ;RESTORE ACC.
RTI ;ALL DONE...
DLI2 PHA ;SAVE ACC.
LDA #$00 ;MAKE X-COORDS
STA HPOSP0 ;OF ALL ACTIVE
STA HPOSP1 ;VESSELS EQUAL
STA HPOSP2 ;TO ZERO. THIS
STA HPOSP3 ;PROVIDES A
STA P0PF ;NICE BORDER
STA HPOSM1 ;AT THE
STA HPOSM2 ;BOTTOM.
STA HPOSM3 ;
PLA ;RESTORE ACC.
RTI ;ALL DONE...
* TITLE SCREEN DLIs
DLIDLI PHA ;SAVE ACC.
TXA ;SAVE THE
PHA ;X-REG.
LDX #$07 ;LOAD X-REG.
LDA DSHIFT ;OKAY, NOW
STA CSHIFT ;I'LL LET
DLIXX LDA CSHIFT ;YOU GUYS
STA WSYNC ;FIGURE OUT
STA COLPF0+1 ;HOW I GOT
LDA CSHIFT ;THAT SUPER
CLC ;DUPER STU-
ADC #$02 ;PENDOUS
STA CSHIFT ;FANCY
DEX ;COLOR CHANGE
BPL DLIXX ;(SO THERE!)
LDA #LOW DLIXY ;SET UP FOR
STA VDSLST ;NEXT DLI
LDA #HIGH DLIXY ;(IF YOU
STA VDSLST+1 ;DON'T MIND).
DEC BLAH ;DEC TIMER.
BPL DLIZZ ;BRANCH!
LDA STRUCT ;RESET
STA BLAH ;TIMERS.
INC BLAH ;INCREMENT
ASL BLAH ;& SHIFT
INC DSHIFT ;REGISTERS.
DLIZZ PLA ;RESTORE
TAX ;X-REG.
PLA ;RESTORE ACC.
RTI ;LATER Y'ALL!
DLIXY PHA ;SAVE ACC.
LDA COLOR0+1 ;RESTORE OLD
STA COLPF0+1 ;COLOR REG.
PLA ;RESTORE ACC.
RTI ;LATER Y'ALL!
:XHOLD DB 0 ;X-REG TEMP.
CSHIFT DB 0 ;COLOR SHIFT.
DSHIFT DB 0 ;COLOR SHIFT.
BLAH DB 0 ;DUM TIMER.
:LSTDB DW DLIST ;LO/HI DISPLAY
DW DLIST2 ;LIST BYTES.
:DLIDB DW DLI ;LO/HI DLI
DW DLIDLI ;BYTES.
* PLAYER SCORE PLACEMENT BYTES
PUTSCR DB 1,13,3,15,5,17
* TEAM SCORE PLACEMENT BYTES
PUTTME DB 7,9,11
* SCORE PLACEMENT MASKS
SCMASK DB $0E,$0F
TITLE 'OUT OF BOUNDS CHECK'
BOUNDS PROC
LDX #$04 ;CHECK EVERYBODY
* CHECK Y-COORDS
BOUND3 CPX #$02 ;A BACTERION?
BCS CHECKX ;IF SO LEAVE IT.
LDA GEVY,X ;IS PLAYER OUT
CMP LOWY ;OF BOUNDS?
BCS BOUND5 ;NO, CONTINUE.
BOUND4 LDY GEVDIR,X ;OUT OF BOUNDS!
LDA REFLEY,Y ;GET REFLEX
STA GEVDIR,X ;ANGLE & STORE.
JSR MOVSUB ;MOVE ONCE MORE
JMP CHECKX ;& CHECK X-COORD
BOUND5 CMP HIGHY ;BOUNDARY.
BCS BOUND4 ;
* CHECK X-COORDS
CHECKX LDA GEVX,X ;OUT OF BOUNDS
CMP LOWX ;ON X-COORDS?
BCS BOUND7 ;NO, CONTINUE.
BOUND6 LDY GEVDIR,X ;OUT OF BOUNDS!
LDA REFLEX,Y ;GET REFLEX
STA GEVDIR,X ;ANGLE & STORE.
JSR MOVSUB ;MOVE ONCE MORE
JMP CHECKY ;& CHECK NEXT.
BOUND7 CMP HIGHX ;
BCS BOUND6 ;
CHECKY DEX ;CHECK NEXT
BPL BOUND3 ;VESSEL.
RTS ;ALL DONE.
LOWX DB 44 ;LOWEST X-COORD
LOWY DB 32 ;LOWEST Y-COORD
HIGHX DB 200 ;HIGHEST X-COORD
HIGHY DB 215 ;HIGHEST Y-COORD
* REFLEX DIRECTIONS FOR Y-COORDS
REFLEY DB 08,07,06,05,04,03,02,01
DB 00,15,14,13,12,11,10,09
* REFLEX DIRECTIONS FOR X-COORDS
REFLEX DB 00,15,14,13,12,11,10,09
DB 08,07,06,05,04,03,02,01
TITLE 'TITLE SCREEN DISPLAY LIST'
DLIST2 DB $70,$70,$70,$70,$46
DW PLAYR1
DB $46
DW PLAYR2
DB $70,$70,$70,$F0,$46
DW TITLE
DB $B0,$46
DW TITLE2
DB $50,$46
DW NAME1
DB $20,$46
DW NAME2
DB $20,$46
DW NAME3
DB $20,$46
DW NAME4
DB $70,$70,$46
DW NAME5
DB $70,$70,$46
DW TEAM1
DB $46
DW TEAM2
DB $41
DW DLIST2
TITLE 'BACTERION! STRATEGY ROUTINE'
STRAT PROC
LDX GEVNUM ;BACTERION #
* SHOULD BACTERION! ATTACK PLAYER?
LDA STOP,X ;IS BACTERION
BEQ :CONT ;IN A COMA?
RTS ;YES! QUIT!
:CONT LDA GEVCEL,X ;CELL IN TOW?
BMI :CONT2 ;YES! QUIT!
LDY NOPLAY ;# OF PLAYERS.
:CONT0 LDA STOP,Y ;THIS PLR ICED?
BNE :CONT1 ;YES! CONTINUE!
LDA GEVX,X ;IS X-COORD OF
SEC ;PLAYER WITHIN
SBC GEVX,Y ;ATTACKING
JSR ABS ;RANGE?
CMP FRANGE ;
BCS :CONT1 ;NO! QUIT!
LDA GEVY,X ;IS Y-COORD OF
SEC ;PLAYER WITHIN
SBC GEVY,Y ;ATTACKING
JSR ABS ;RANGE?
CMP FRANGE ;
BCS :CONT1 ;NO! QUIT!
LDA GEVX,Y ;PLR X-COORD IS
STA :TARX ;TARGET X-COORD
LDA GEVY,Y ;PLR Y-COORD IS
STA :TARY ;TARGET Y-COORD
JSR LASERS ;SCRAP PLAYER!
LDA #$01 ;KABOOM!!!
BNE STRAT2 ;
:CONT1 DEY ;CHECK NEXT
BPL :CONT0 ;PLAYER, IF ANY.
:CONT2 LDA TARX,X ;SAVE TARGET
STA :TARX ;X-COORD.
LDA TARY,X ;SAVE TARGET
STA :TARY ;Y-COORD.
LDA #$00 ;
STRAT2 STA ATTACK,X ;ATTACK STATUS
* FIND THE MARK
* AXIS TESTs
STRAT3 LDA :TARX ;IS THE TARGET
CMP GEVX,X ;(RELATIVE TO
BEQ AXIS5 ;ATTACKING
BCS AXIS7 ;BACTERION)
LDA :TARY ;ON THE X
CMP GEVY,X ;OR Y AXIS? THAT
BNE AXIS4 ;IS THE QUESTION!
LDA #$04 ;WHO EVER HEARD
BNE QUIT ;OF CENSORING
AXIS4 BCS QUAD3 ;ASSEMBLY LAN-
BCC QUAD2 ;GUAGE LISTINGS?
AXIS5 LDA :TARY ;BACTERION! IS
CMP GEVY,X ;DEDICATED TO MY
BEQ EXIT ;FRIENDS IN GOOD
BCS AXIS6 ;OLD TEANECK...
LDA #$00 ;IN CASE YOU
BEQ QUIT ;PEOPLE DON'T
AXIS6 LDA #$08 ;KNOW WHO YOU ARE,
BNE QUIT ;HERE'S A LIST
AXIS7 LDA :TARY ;OF CODE-NAMES...
CMP GEVY,X ;SIR HEX
BNE AXIS8 ;THE QUAB RUNNER
LDA #12 ;THE SILICON
BNE QUIT ;PIRATE
AXIS8 BCS QUAD4 ;TAI-FIGHTER &
BCC QUAD1 ;HOME BOY ROGER D.
* FIRST QUADRANT
QUAD1 JSR DELTAS ;
BEQ QUAD12 ;
BCC QUAD13 ;WE KNOW THE TAR-
LDA #13 ;GET IS IN THE
BNE QUIT ;1st QUAD. DECIDE
QUAD12 LDA #14 ;ON A DIRECTION.
BNE QUIT ;(13,14,15)
QUAD13 LDA #15 ;
BNE QUIT ;BRANCH!
* SECOND QUADRANT
QUAD2 JSR DELTAS ;
BEQ QUAD22 ;
BCC QUAD23 ;WE KNOW THE TAR-
LDA #03 ;GET IS IN THE
BNE QUIT ;2nd QUAD. DECIDE
QUAD22 LDA #02 ;ON A DIRECTION.
BNE QUIT ;(1,2,3)
QUAD23 LDA #01 ;
BNE QUIT ;BRANCH!
* THIRD QUADRANT
QUAD3 JSR DELTAS ;
BEQ QUAD32 ;
BCC QUAD33 ;WE KNOW THE TAR-
LDA #05 ;GET IS IN THE
BNE QUIT ;3rd QUAD. DECIDE
QUAD32 LDA #06 ;ON A DIRECTION.
BNE QUIT ;(5,6,7)
QUAD33 LDA #07 ;
BNE QUIT ;BRANCH!
* FOURTH QUADRANT
QUAD4 JSR DELTAS ;
BEQ QUAD42 ;
BCC QUAD43 ;WE KNOW THE TAR-
LDA #11 ;GET IS IN THE
BNE QUIT ;4th QUAD. DECIDE
QUAD42 LDA #10 ;ON A DIRECTION.
BNE QUIT ;(9,10,11)
QUAD43 LDA #09 ;
BNE QUIT ;BRANCH!
EXIT LDA #$FF ;TARGET REACHED
QUIT STA GEVDES,X ;SAVE DESIRED
RTS ;DIRECTION. BYE!
* CALCULATE COORDINATE DELTAS
DELTAS LDA :TARY ;TARGET Y-COORD.
SEC ;SUBTRACT FROM
SBC GEVY,X ;BACTERION Y-CORD.
JSR ABS ;ABSOLUTE VALUE.
STA :DELTA ;SAVE IT.
LDA :TARX ;TARGET X-COORD.
SEC ;SUBTRACT FROM
SBC GEVX,X ;BACTERION X-COORD.
JSR ABS ;ABSOLUTE VALUE.
CMP :DELTA ;COMPARE TO Y
RTS ;DELTA & RETURN.
* TURN ENEMY BACTERION!s
TURN DEC TURNT ;TIME TO TURN?
BPL TRTS ;NO! LATER!
LDX TYPES ;RESTORE TURN
LDA TURNDB-1,X ;TIME FROM
STA TURNT ;TURN DATABASE.
LDX #$04 ;HANDLE ALL.
TURN0 LDA STOP,X ;VESSEL ICED?
BNE PL4 ;YES! LATER!
LDA #$03 ;GET RANDOM AMOUNT
JSR RAND0 ;FOR DIRECTIONAL
TAY ;TURN.
INY ;
LDA GEVDES,X ;DISIRED DIRECTION.
CMP GEVDIR,X ;ACTUAL DIRECTION.
BEQ PL4 ;IF = QUIT!
BCS TURNG5 ;ACT. > DES.
JSR SUBDIR ;SUB. THE TWO.
CMP #$08 ;IS DIFF. > 8?
BCS TURNG6 ;YES! BRANCH!
TURNG4 TYA ;INVERT AMOUNT
EOR #$FF ;OF TURN (MAKE
TAY ;IT NEGATIVE)
INY ;
BMI TURNG6 ;BRANCH!
TURNG5 JSR SUBDIR ;SUB. THE TWO.
CMP #$08 ;IS DIFF. > 8?
BEQ TURNG6 ;DIFF = 8!
BCS TURNG4 ;DIFF > 8!
TURNG6 TYA ;ADD AMOUNT OF
CLC ;TURN TO BAC-
ADC GEVDIR,X ;TERION'S DIR-
JSR WRAP ;ECTION & SAVE.
STA GEVDIR,X ;
PL4 DEX ;TURN NEXT
CPX #$01 ;BACTERION!
BNE TURN0 ;IF ANY.
TRTS RTS ;BOOGIE OUTTA HERE!
SUBDIR LDA GEVDES,X ;DESIRED
SEC ;SUBTRACTED FROM
SBC GEVDIR,X ;ACTUAL
JMP ABS ;ABSOLUTE VALUE.
* MOVE ENEMY BACTERION!s
MOVE LDX #$04 ;HANDLE ALL.
MOVE0 DEC MOVET,X ;TIME TO MOVE?
BPL MOVENX ;NO! LATER!
LDY TYPES ;RESTORE MOVE
LDA MOVEDB-1,Y ;TIMER.
LDY GEVCEL,X ;CELL IN TOW?
BPL MOVE1 ;NO! MOVEFAST!
ASL A ;YES! MOVE 4
ASL A ;TIMES AS SLOW!
MOVE1 STA MOVET,X ;SAVE MOVE
JSR MOVSUB ;TIMER & MOVE!
MOVENX DEX ;HANDLE NEXT
CPX #$01 ;BACTERION!
BNE MOVE0 ;IF ANY.
RTS ;OUTTA HERE!
* TRACK HEISTED CELLS
TRACK LDX #$04 ;HANDLE ALL.
TRK0 LDA STOP,X ;VESSEL ON ICE?
BNE TRK1 ;YES! BYPASS!
LDA GEVCEL,X ;CELL IN TOW?
BPL TRKTRK ;NO! QUIT!
LDA GEVY,X ;IF VESSEL ALL
CMP #15 ;THE WAY OFF-
BCC OFFSCR ;SCREEN?
CMP #235 ;
BCC TRKTRK ;NO! QUIT!
* SUCCESSFUL HEISTING OF A CELL
OFFSCR INC GEVESC ;INC. ESCAPEES
DEC TOTCEL ;DEC. # OF CELLS
LDA #$01 ;HALT THIS
STA STOP,X ;BACTERION.
BNE TRK1 ;BRANCH!
TRKTRK LDA ATTACK,X ;ATTCKING?
BNE TRK1 ;YES! SKIP!
LDA GEVDES,X ;AT TARGET?
BPL TRK1 ;YES! SKIP!
LDA ESCAPE,X ;ATTACKING PLR?
BEQ TRK1 ;YES! BRANCH!
STA TARY,X ;NO! SET Y-TARGET
JSR PICKX ;PICK RANDOM X-TARGET.
STA TARX,X ;SAVE IT.
JSR PICKDR ;GET A DIRECTION
LDA GEVCEL,X ;GIVE CELL A
ORA #$80 ;HEISTED STATUS.
STA GEVCEL,X ;
TRK1 DEX ;HANDLE NEXT
CPX #$01 ;BACTERION!
BNE TRK0 ;IF ANY.
RTS ;GET LOST LOSER!
* ACCUMULATOR ABSOLUTE VALUE FUNCTION
ABS BPL RABS
EOR #$FF
CLC
ADC #$01
RABS RTS
* DIRECTIONAL WRAP AROUND
WRAP BPL PWRAP ;DIRECTION > 0?
CLC ;NO! ADD 16 TO IT.
ADC #16 ;
RTS ;GET LOST LOSER!
PWRAP CMP #16 ;DIRECTION > 16?
BCC WRTS ;NO! SUBTRACT 16
SEC ;FROM IT.
SBC #16 ;
WRTS RTS ;GET LOST LOSER!
* GENERAL MOVEMENT ANALYSIS
MOVSUB LDA STOP,X ;COMATOSE?
BNE MOV1 ;YES! QUIT!
LDA GEVDES,X ;TARGET REACHED?
BMI MOV1 ;YES! QUIT!
LDY GEVDIR,X ;GET DIRECTION.
LDA DELX,Y ;ADD X-COORD ADD
STA :ADDX ;ON FOR GIVEN
CLC ;DIRECTION.
ADC GEVX,X ;
STA GEVX,X ;SAVE IT.
LDA DELY,Y ;ADD Y-COORD ADD
STA :ADDY ;ON FOR GIVEN
CLC ;DIRECTION.
ADC GEVY,X ;
STA GEVY,X ;SAVE IT.
LDA GEVCEL,X ;CELL IN TOW?
BPL MOV1 ;NO! QUIT!
AND #$7F ;YES!
TAY ;
LDA :ADDX ;ADD X-COORD ADD
CLC ;ON FOR GIVEN
ADC CELLNX,Y ;DIRECTION TO
STA CELLNX,Y ;CELL'S X-COORD.
LDA :ADDY ;ADD Y-COORD ADD
CLC ;ON FOR GIVEN
ADC CELLNY,Y ;DIRECTION TO
STA CELLNY,Y ;CELLS' Y-COORD.
LDA #$01 ;CELL MOVEMENT
STA CELLMV,Y ;STATUS SET.
MOV1 RTS ;SEE YA LATER...
* VAPORIZE PLAYERS WITH DEADLY LASERS
LASERS DEC GEVFRE,X ;FIRE TIMER = 0?
BPL XITLSR ;NO! QUIT!
LDA FIRETM ;RESTORE FIRE
STA GEVFRE,X ;TIMER.
LDA LSRDIR,X ;ALREADY FIRING?
BNE XITLSR ;YES! QUIT!
LDA GEVDES,X ;SAVE DESIRED
PHA ;DIRECTION.
JSR STRAT3 ;GET LASER DIRECTON.
TAY ;PUT IN Y-REG.
PLA ;RESTORE DESIRED
STA GEVDES,X ;DIRECTION.
CPY #$FF ;LASER AT TARGET?
BEQ XITLSR ;YES! QUIT!
LDA LSRBSE,Y ;FINE TUNE LASER
STA LSRDIR,X ;DIRECTION.
LDA #$0A ;LASER BOLT
STA LSRTME,X ;LIFETIME.
LDA #14 ;SET UP LASER
STA LSOUND ;SOUND.
XITLSR RTS ;JUMP IN A LAKE!
* LASER DIRECTIONAL FINE TUNING
LSRBSE DB 1,8,8,8,4,6,6,6,2
DB 7,7,7,3,5,5,5
:TARX DB 0 ;X-COORD TARGET
:TARY DB 0 ;Y-COORD TARGET
:ADDX DB 0 ;X-COORD ADD ON
:ADDY DB 0 ;Y-COORD ADD ON
:DELTA DB 0 ;TAR. Y - ACT. Y
* X-COORD DIRECTIONAL ADD ONs
DELX DB +0,-1,-2,-2,-2,-2,-2,-1
DB +0,+1,+2,+2,+2,+2,+2,+1
* Y-COORD DIRECTIONAL ADD ONs
DELY DB -2,-2,-2,-1,+0,+1,+2,+2
DB +2,+2,+2,+1,+0,-1,-2,-2
* TURN DATABASE
TURNDB DB 0,0,0,0,0,0,0
* MOVEMENT DATABASE
MOVEDB DB 0,0,0,0,0,0,0
TITLE 'BACTERION! PM DRAW ROUTINE'
DRAW PROC
LDA #$04 ;HANDLE ALL.
STA COUNT ;VESSELS (0-4)
DRAW1 LDX COUNT ;VESSEL #.
LDY TYPE,X ;TYPE (0-7).
LDA PHASE,X ;SHAPE PHASE.
CMP INDEX+1,Y ;PHASE EXCEE-
BCC DRAW3 ;DED?
DRAW2 LDA INDEX,Y ;YES! CORRECT
STA PHASE,X ;PHASE.
DRAW3 CMP INDEX,Y ;PHASE EXCEE-
BCC DRAW2 ;DED?
ASL A ;NO! GET OFF-
TAY ;SET TO DATA
LDA OFFSET,Y ;FOR THIS
STA DRWLO ;PHASE.
LDA OFFSET+1,Y ;
STA DRWLO+1 ;
LDA COUNT ;FIND WHERE TO
ASL A ;PLACE PHASE
TAY ;DATA. (DEP-
LDA PLBSE,Y ;ENDS ON WHICH
STA PLLO ;VESSEL # WE
LDA PLBSE+1,Y ;ARE DRAWING).
STA PLLO+1 ;
LDA #$07 ;PREPARE TO
STA PTR1 ;READ 8 BYTES.
CLC ;FIND OUT
ADC GEVY,X ;WHERE TO PUT
STA PTR2 ;DATA.
DRAW4 LDY PTR1 ;GET PHASE
LDA (DRWLO),Y ;DATA.
LDY PTR2 ;PUT INTO PM
STA (PLLO),Y ;LOCATIONS.
DEC PTR2 ;RESET
DEC PTR1 ;POINTERS.
BPL DRAW4 ;ALL DONE?
LDA #$07 ;YES! SET UP
STA COUNT2 ;FOR 8 BYTES.
DRAW5 LDX COUNT ;BEGIN ERASING
LDA GEVY,X ;DATA AT TOP
LDX COUNT2 ;& BOTTOM OF
CLC ;VESSEL. THIS
ADC ERADD,X ;ACCOUNTS FOR
TAY ;WHEN A VESSEL
LDA #$00 ;MOVES VERTI-
STA (PLLO),Y ;CALLY AS WE
DEC COUNT2 ;MUST PRE-
BPL DRAW5 ;VENT DATA
DEC COUNT ;OVERLAP.
BPL DRAW1 ;YEAH SO WHAT!
DRAW6 DEC PHTIME ;DEC PHASE TIMER.
BPL DRAW7 ;QUIT IF NOT 0.
LDA #$04 ;RESET PHASE TIMER
STA PHTIME ;& STORE.
TAX ;HANDLE ALL (0-4)
PHS4 CPX #$02 ;A BACTERION?
BCS PHS5 ;YES! SKIP IT!
LDA TYPE,X ;IS IT EXPLODING?
CMP #$07 ;
BNE PHS7 ;NO! SKIP IT!
PHS5 LDA PHASE,X ;
CMP #47 ;(INDEX+8)-1
BEQ PHS7 ;
INC PHASE,X ;INC VESSEL PHASE
CMP #46 ;(INDEX+8)-2
BNE PHS7 ;
CPX #$02 ;IS VESSEL A
BCC PHS7 ;PLAYER?
INC GEVESC ;NO! INC # OF ESCAPES
PHS7 DEX ;MOVE ON TO
BPL PHS4 ;NEXT...
DRAW7 RTS ;TIME TO BOOGIE...
COUNT DB 0 ;BYTE DRAW COUNTER
COUNT2 DB 0 ;BYTE DRAW COUNTER
PTR1 DB 0 ;POINTER PHASE DATA
PTR2 DB 0 ;POINTER TO PM AREA
PHTIME DB 3 ;VESSEL PHASE TIMER
* TOP/BOTTOM ERASURE OFFSETS
ERADD DB -4,-3,-2,-1,+8,+9,+10,+11
* INDEX TO VESSEL PHASE DATA
INDEX DB 0,16,20,24,28,31,35,39,48
* LO/HI BYTES TO PM AREA
PLBSE DW PLAY0
DW PLAY1
DW PLAY2
DW PLAY3
DW MISS
* OFFSET TO VESSEL PHASE DATA
OFFSET DW :ROT00 ;0
DW :ROT01
DW :ROT02
DW :ROT03
DW :ROT04
DW :ROT05
DW :ROT06
DW :ROT07
DW :ROT08
DW :ROT09
DW :ROT10
DW :ROT11
DW :ROT12
DW :ROT13
DW :ROT14
DW :ROT15
DW :GEV10 ;16
DW :GEV11
DW :GEV12
DW :GEV11
DW :GEV20 ;20
DW :GEV21
DW :GEV22
DW :GEV21
DW :GEV30 ;24
DW :GEV31
DW :GEV32
DW :GEV31
DW :GEV40 ;28
DW :GEV41
DW :GEV42
DW :GEV50 ;31
DW :GEV51
DW :GEV52
DW :GEV51
DW :GEV60 ;35
DW :GEV61
DW :GEV62
DW :GEV63
DW :EXP0 ;39
DW :EXP1
DW :EXP2
DW :EXP3
DW :EXP4
DW :EXP5
DW :EXP6
DW :EXP7
DW :EXP8
;48
* TANK ROTATION 0
:ROT00 DB $10,$10,$10,$38
DB $54,$82,$44,$44
* TANK ROTATION 1
:ROT01 DB $20,$20,$10,$1E
DB $19,$21,$20,$10
* TANK ROTATION 2
:ROT02 DB $80,$40,$20,$1F
DB $19,$10,$10,$18
* TANK ROTATION 3
:ROT03 DB $00,$00,$C6,$39
DB $18,$10,$10,$0C
* TANK ROTATION 4
:ROT04 DB $04,$0B,$10,$F0
DB $10,$0B,$04,$00
* TANK ROTATION 5
:ROT05 DB $0C,$10,$10,$18
DB $39,$C6,$00,$00
* TANK ROTATION 6
:ROT06 DB $18,$10,$10,$19
DB $1F,$20,$40,$80
* TANK ROTATION 7
:ROT07 DB $10,$20,$21,$19
DB $1E,$10,$20,$20
* TANK ROTATION 8
:ROT08 DB $44,$44,$82,$44
DB $38,$10,$10,$10
* TANK ROTATION 9
:ROT09 DB $08,$04,$84,$98
DB $78,$08,$04,$04
* TANK ROTATION 10
:ROT10 DB $18,$08,$08,$98
DB $F8,$04,$02,$01
* TANK ROTATION 11
:ROT11 DB $30,$08,$08,$18
DB $9C,$63,$00,$00
* TANK ROTATION 12
:ROT12 DB $20,$D0,$08,$0F
DB $08,$D0,$20,$00
* TANK ROTATION 13
:ROT13 DB $00,$00,$63,$1C
DB $18,$08,$08,$30
* TANK ROTATION 14
:ROT14 DB $01,$02,$04,$F8
DB $98,$08,$08,$18
* TANK ROTATION 15
:ROT15 DB $04,$04,$08,$78
DB $98,$84,$04,$08
* BACTERION! #1
:GEV10 DB $18,$00,$24,$81
DB $81,$24,$00,$18
:GEV11 DB $18,$42,$24,$81
DB $81,$24,$42,$18
:GEV12 DB $99,$42,$24,$81
DB $81,$24,$42,$99
* BACTERION! #2
:GEV20 DB $00,$00,$3C,$24
DB $24,$3C,$00,$00
:GEV21 DB $00,$66,$42,$18
DB $18,$42,$66,$00
:GEV22 DB $C3,$81,$00,$18
DB $18,$00,$81,$C3
* BACTERION! #3
:GEV30 DB $3C,$42,$A5,$81
DB $81,$A5,$42,$3C
:GEV31 DB $00,$18,$24,$42
DB $42,$24,$18,$00
:GEV32 DB $00,$00,$18,$3C
DB $3C,$18,$00,$00
* BACTERION! #4
:GEV40 DB $00,$00,$18,$24
DB $24,$18,$00,$00
:GEV41 DB $00,$18,$00,$5A
DB $5A,$00,$18,$00
:GEV42 DB $18,$00,$18,$A5
DB $A5,$18,$00,$18
* BACTERION! #5
:GEV50 DB $20,$20,$E4,$18
DB $18,$27,$04,$04
:GEV51 DB $00,$24,$66,$18
DB $18,$66,$24,$00
:GEV52 DB $04,$04,$27,$18
DB $18,$E4,$20,$20
* BACTERION! #6
:GEV60 DB $0C,$40,$90,$25
DB $25,$88,$40,$0C
:GEV61 DB $18,$00,$99,$A1
DB $04,$18,$42,$24
:GEV62 DB $30,$02,$19,$84
DB $A0,$19,$02,$30
:GEV63 DB $24,$42,$08,$24
DB $A5,$91,$00,$18
* DETONATION
:EXP0 DB $00,$00,$00,$18
DB $18,$00,$00,$00
:EXP1 DB $00,$00,$08,$38
DB $1C,$10,$00,$00
:EXP2 DB $00,$08,$08,$78
DB $1E,$10,$10,$00
:EXP3 DB $08,$08,$2C,$E0
DB $07,$34,$10,$10
:EXP4 DB $08,$4A,$24,$C0
DB $03,$24,$52,$10
:EXP5 DB $89,$42,$24,$80
DB $01,$24,$42,$91
:EXP6 DB $81,$42,$00,$00
DB $00,$00,$42,$81
:EXP7 DB $81,$00,$00,$00
DB $00,$00,$00,$81
:EXP8 DB $00,$00,$00,$00
DB $00,$00,$00,$00
*TYPE - TYPE OF TANK BEING DRAWN
* 0 - PLAYERS # 1 & 2
* 1-6 - DEVs 1,2,3,4,5,6
* 7 - DETONATION SEQUENCE
*PHASE - PHASE # OF BACTERION!s
* 0-15 - PLAYERS # 1 & 2
* 16-19 - BACTERION! # 1
* 20-23 - BACTERION! # 2
* 24-27 - BACTERION! # 3
* 28-30 - BACTERION! # 4
* 31-34 - BACTERION! # 5
* 35-38 - BACTERION! # 6
* 39-48 - EXPLOSION SEQUENCE
TITLE 'BACTERION TITLE SCREEN'
PROC
* BACTERION!
TITLE DB 0,0,0,0,0
DB 098,097,099,116,101
DB 114,105,111,110,065
DB 0,0,0,0,0
* THE PLAGUE OF 2369
TITLE2 DB 000,180,168,165,00,176,172
DB 161,167,181,165,00,175,166
DB 00,210,211,214,217,00
* TEAM SCORE
TEAM1 DB 0,0,0,0,0
DB 180,165,161,173,000
DB 179,163,175,178,165
DB 0,0,0,0,0
TEAM2 DB 0,0,0,0,0
DB 0,0,0,0,0
DB 0,0,0,0,0
DB 0,0,0,0,0
PLAYR1 DB 0,0,0,0,0
DB 0,0,0,0,0
DB 0,0,0,0,0
DB 0,0,0,0,0
PLAYR2 DB 0,0,0,0,0
DB 0,0,0,0,0
DB 0,0,0,0,0
DB 0,0,0,0,0
* BY
NAME1 DB 00,00,00,00,00
DB 00,00,00,00,34
DB 57,00,00,00,00
DB 00,00,00,00,00
* KYLE PEACOCK
NAME2 DB 0,0,0,0
DB 235,249,236,229,000,240
DB 229,225,227,239,227,235
DB 0,0,0,0
* WITH
NAME3 DB 0,0,0,0,0,0,0,0
DB 55,41,52,40
DB 0,0,0,0,0,0,0,0
* TOM HUDSON
NAME4 DB 0,0,0,0,0
DB 244,239,237,000,232
DB 245,228,243,239,238
DB 0,0,0,0,0
* ANALOG COMPUTING
NAME5 DB $00,$00,$A1,$AE,$A1
DB $AC,$AF,$A7,$00,$A3
DB $AF,$AD,$B0,$B5,$B4
DB $A9,$AE,$A7,$00,$00
TITLE 'JOYSTICK READING'
STICKS PROC
LDX NOPLAY ;# OF PLAYERS
ACT4 LDA STOP,X ;IS PLAYER DEAD?
BEQ ACT5 ;NO, CONTINUE.
DEC STOP,X ;DEC. DEATH TIME
BNE NXTACT ;& CONTINUE
JSR SETPLR ;IF DEATH TIME=0
JMP NXTACT ;REINCARNATE
ACT5 JSR MOVPLR ;MOVE PLAYER
DEC TURNIT,X ;DEC. TURN TIME
BPL NXTACT ;IF <> 0 CONT.
LDA #$03 ;RESET TURN
STA TURNIT,X ;TIME & STORE.
LDY STICK0,X ;READ JOYSTICK.
LDA GEVDIR,X ;UPDATE DIRECT-
CLC ;ION ACCORDING
ADC DRHASH,Y ;TO JOYSTICK.
JSR WRAP ;TEST FOR WRAP
STA GEVDIR,X ;AROUND &
STA PHASE,X ;SAVE.
NXTACT DEX ;HANDLE NEXT
BPL ACT4 ;PLAYER.
RTS ;ALL DONE...
* GENERAL MOVEMENT ROUTINE
MOVPLR DEC SPEED,X ;TIME TO MOVE?
BPL RTSMOV ;NO, CONTINUE.
LDA STICK0,X ;YES-READ STICK.
CMP #14 ;FORWARD MOTION.
BEQ :MOV4 ;
CMP #10 ;FORWARD MOTION.
BEQ :MOV4 ;
CMP #06 ;FORWARD MOTION.
BNE :MOV5 ;
:MOV4 DEC CSPEED,X ;DEC. MOTION
JMP :MOV6 ;TIMER.
:MOV5 INC CSPEED,X ;INC. MOTION
:MOV6 LDY CSPEED,X ;TIMER.
LDA REHASH,Y ;DETECT OVERFLOW
STA CSPEED,X ;& CORRECT (IF
STA SPEED,X ;ANY.) THEN SAVE
LDA SPEED,X ;MOTION TIMER.
CMP DRHASH-1 ;
BEQ RTSMOV ;
JSR MOVSUB ;MOVE TO CORRECT
RTSMOV RTS ;ALL DONE...
TURNIT DB 0,0 ;PLAYERS' TURN TIMER.
* SPEED LIMITATION DATABASE
REHASH DB 2,2,2,3,4,5,6,7,8,8,8
* JOYSTICK/DIRECTION ADD ONS
DRHASH DB 0,0,0,0,0,-1,-1,-1
DB 0,+1,+1,+1,0,0,0,0
TITLE 'COLLISION DETECTION'
COLLIDE PROC
* SHIP COLLISION
LDX NOPLAY ;# OF PLAYERS
COL5 LDA STOP,X ;IS THIS PLR ICED?
BNE COLXX ;YES! MOVE ALONG.
LDA #$01 ;NO! CHECK FOR
STA IDIE ;COLLISION...
LDA P0PL,X ;
AND #$02 ;PLR/PLR
BEQ COL7 ;NO COLLISION.
JSR KILLME ;SMASH! BANG!
COL7 INC IDIE ;CHECK FOR ANOTHER
LDA P0PL,X ;COLLISION...
AND #$04 ;PLR/BACTERION 1
BEQ COL8 ;NO COLLISION.
JSR KILLME ;OUCH! CRASH!
COL8 INC IDIE ;CHECK FOR ANOTHER
LDA P0PL,X ;COLLISION...
AND #$08 ;PLR/BACTERION 2
BEQ COL9 ;NO COLLISION.
JSR KILLME ;DING! DONG!
COL9 INC IDIE ;CHECK FOR ANOTHER
LDY #$03 ;COLLISION
COL10 TXA ;W/MISSILES...
CLC ;
ADC #$01 ;
AND M0PL,Y ;PLR/BACTERION 3
BEQ COL11 ;NO COLLISION...
JSR KILLME ;BING! ZAP!
COL11 DEY ;CONTINUE CHECKING
BPL COL10 ;
* PLAYERS TOUCHING PODS?
DEC PODTME ;TIME TO CHECK?
BPL COL13 ;NO! GO AWAY!
LDA #$03 ;RESET POD TIMER
STA PODTME ;TO GO AGAIN.
LDA P0PF,X ;SMASHED INTO
AND #$01 ;POD PLAYFIELD?
BEQ COL13 ;NO! GO AWAY!
LDA #$02 ;YES! ROTATE
JSR RAND0 ;RANDOMLY.
LDY RANDOM ;ROTATE RIGHT
BPL COL12 ;OR LEFT?
EOR #$FF ;ROTATE RIGHT.
CLC ;(CLOCKWISE)
ADC #$01 ;
COL12 CLC ;ROTATE LEFT.
ADC GEVDIR,X ;(COUNTERCLOCK)
JSR WRAP ;CHECK FOR WRAP
STA GEVDIR,X ;AROUND & SAVE
STA PHASE,X ;NEW ROTATION.
* PLAYER HIT BY LASER?
COL13 LDA P0PF,X ;HAS PLAYER
AND #$02 ;COLLIDED WITH
BEQ COLXX ;LASER PLAYFIELD?
STX IDIE ;YES! YES! YES!
JSR KILLME ;VAPORIZE HIM!!!
COLXX DEX ;CHECK NEXT
BPL COL5 ;PLAYER...
STA HITCLR ;CLEAR COLLISIONS.
RTS ;GO TO DARK SIDE OF MOON.
* INSERT DEATH VALUE
KILLME STY YHOLD ;SAVE Y-REG.
LDY IDIE ;GET WHO DIES!
LDA STOP,Y ;ARE THEY AL-
BNE :KILLX ;READY DEAD?
TXA ;NO! PREPARE
TAY ;TO VAPORIZE!
JSR ZAPIT ;ASHES TO ASHES!
LDY IDIE ;VAPORIZE OTHER
JSR ZAPIT ;VESSEL AS WELL!
INC NOKILL,X ;INC # OF KILLS!
:KILLX LDY YHOLD ;RESTORE Y-REG.
RTS ;GET LOST!!!
* CHANGE TO DEATH STATUS
ZAPIT LDA STOP,Y ;IS THIS VESSEL
BNE ZAPRTS ;ALREADY ICED?
LDA #07 ;NO! START VESSEL
STA TYPE,Y ;DETONATION!!!
LDA #120 ;GIVE THEM A
STA STOP,Y ;DEATH STATUS.
LDA #00 ;TURN OFF BACTER-
STA LSOUND ;ION! LASER SOUND.
LDA #66 ;START UP DETONAT-
STA XSOUND ;ION SOUND.
RTS ;BEAT IT!
ZAPRTS PLA ;PREMATURE
PLA ;RETURN. (PACK
LDY YHOLD ;YOUR BAGS AND
RTS ;HIT THE ROAD!)
IDIE DB 0 ;VESSEL # TO DIE.
YHOLD DB 0 ;Y-REG. STORAGE.
PODTME DB 0 ;ROTATION TIMER.
TITLE 'FIRE PLAYER PROJECTILES'
SHOOT PROC
JSR FIRST ;DO THIS FIRST.
JMP SECOND ;DO THIS SECOND.
* INITIALIZE PROJECTILES
FIRST LDX NOPLAY ;# OF PLAYERS
SHOOT5 LDA STOP,X ;IS PLAYER ICED?
BNE XSHOOT ;YES! SKIP HIM!
LDA FDELAY,X ;OK TO FIRE?
BEQ SHOOT6 ;YES! CONTINUE.
DEC FDELAY,X ;NO! DEC TIMER.
JMP XSHOOT ;SKIP TO NEXT.
SHOOT6 LDA NOBULL,X ;ALL BULLETS
CMP #$04 ;FIRED ALREADY?
BCS XSHOOT ;YES! SKIP HIM.
LDA TRIG0,X ;BUTTON PRESSED?
BNE XSHOOT ;NO! SKIP HIM.
INC NOBULL,X ;INC # BULLETS.
LDA #$07 ;MAKE CANNON
STA CSOUND ;FIRING SOUND.
LDA #$03 ;SET UP FIRING
STA FDELAY,X ;DELAY.
LDY #12 ;FIND AN UNUSED
SHOOT7 LDA BULLET,Y ;ARRAY SLOT FOR
BMI SHOOT8 ;A PROJECTILE.
DEY ;DON'T STOP
BNE SHOOT7 ;UNTIL YOU DO!!!
SHOOT8 STY BSLOT ;ARRAY SLOT #.
TXA ;SAVE WHICH PLR
STA BULLET,Y ;# WHO FIRED.
LDY GEVDIR,X ;GET STARTING
TYA ;POINT OF PRO-
PHA ;JECTILE ACCORD-
LDA DELX,Y ;ING TO PLAYER'S
ASL A ;ANGLE OF ROT-
CLC ;ATION & (OF
ADC GEVX,X ;COURSE)
SEC ;PLAYSER'S
SBC #44 ;X & Y COORDS.
LDY BSLOT ;
STA GEVX,Y ;YUP!
PLA ;
STA GEVDIR,Y ;THAT'S WHAT ALL
TAY ;THIS CODE DOES.
LDA DELY,Y ;
ASL A ;I DARE ANYONE
CLC ;TO COME UP WITH
ADC GEVY,X ;A BETTER PUBLIC
SEC ;DOMAIN PROGRAM.
SBC #$1C ;(EXCEPT TOM
LDY BSLOT ;HUDSON...)
STA GEVY,Y ;SO THERE!!!
XSHOOT DEX ;MOVE ALONG TO
BPL SHOOT5 ;NEXT PLAYER.
RTS ;BEGONE!!!
* MOVE PROJECTILES
SECOND LDX #12 ;HANDLE ALL.
TRAV5 LDA BULLET,X ;ANYBODY OWN
BMI XTRAV ;THIS BULLET?
JSR MOVSUB ;YES! MOVE IT!
LDA GEVX,X ;OUT OF
CMP #162 ;BOUNDS?
BCS :DEACT ;YES! BYE!
STA CELLNX+5,X ;
LDA GEVY,X ;OUT OF
CMP #192 ;BOUNDS?
BCS :DEACT ;YES! LATER!
STA CELLNY+5,X ;
LDY #$04 ;IS THIS BULLET
TRAV6 LDA STOP,Y ;WITHIN RANGE OF
BNE TRAV7 ;ANY OF THE
LDA GEVX,X ;BACTERIONS!
CLC ;
ADC #48 ;LETHAL RANGE
SEC ;IS WITHIN
SBC GEVX,Y ;8 UNITS ON
CMP #$09 ;EITHER X OR Y
BCS TRAV7 ;AXIS.
LDA GEVY,X ;
CLC ;
ADC #$20 ;
SEC ;
SBC GEVY,Y ;
CMP #$09 ;
BCS TRAV7 ;
JSR ZAPIT ;EXTERMINATE!!!
STX :XHOLD ;SAVE X-REG.
LDA BULLET,X ;FIND BULLET
TAX ;OWNER & INC.
INC NOKILL,X ;# OF KILLS.
LDX :XHOLD ;RES. X-REG.
:DEACT STX :XHOLD ;SAVE X-REG.
LDA BULLET,X ;GET BULLET
TAX ;OWNER & DEC.
DEC NOBULL,X ;# OF BULLETS.
LDX :XHOLD ;RES. X-REG.
LDA #$FF ;DEACTIVATE
STA BULLET,X ;BULLET. (NO
STA CELLNX+5,X ;OWNER OR X,
STA CELLNY+5,X ;Y COORDS)
BNE TRAV8 ;GET OUT!
TRAV7 DEY ;CHECK FOR COLL-
CPY #$01 ;ISION WITH NEXT
BNE TRAV6 ;BACTERION!
TRAV8 LDA #$01 ;BULLET LIVES.
STA CELLMV+5,X ;MOVE IT.
XTRAV DEX ;MOVE NEXT BULLET.
CPX #$04 ;OUT OF BULLETS TO
BNE TRAV5 ;MOVE?
RTS ;YES! LATER Y'ALL!
BSLOT DB 0 ;UNUSED ARRAY SLOT.
:XHOLD DB 0 ;X-REG. TEMP STORE.
TITLE 'BACTERION! GRAPHICS PLOTTER'
* ----------------------
* GR. 7+ PLOTTER ROUTINE
* COURTESY OF TOM HUDSON
* ----------------------
PLOTTER PROC
* POINT PLOTTER ROUTINE
PLOTPT LDX PLOTY ;Y-COORD.
CPX #193 ;OFFSCREEN?
BCS :PBYE ;YES! QUIT!
LDA LOTBL,X ;NO! GET LO
STA LO ;& HI BYTE
LDA HITBL,X ;OF SCREEN
STA HI ;RAM AREA.
LDA PLOTX ;X-COORD.
CMP #160 ;OFFSCREEN?
BCS :PBYE ;YES! QUIT!
AND #3 ;PLOT INDEX
TAX ;PLACE IN X
LDA PLOTX ;GET PLOTX &
LSR A ;DIVIDE
LSR A ;BY 4.
STA YOFSET ;
LDY COLOR ;GET COLOR &
LDA :BMSK2,X ;MASK OFF
AND :COLRS,Y ;PIXEL POS.
STA HOLD ;SAVE IT.
LDA :BMSK1,X ;MASK OFF PIXEL
LDY YOFSET ;OF ADDR TO BE
AND (LO),Y ;ALTERED.
ORA HOLD ;SET PLOT BITS
STA (LO),Y ;& STORE.
:PBYE RTS ;ALL DONE...
* DRAW FROM/TO ROUTINE
DRAWTO LDA DRAWY ; IS DRAWY
CMP PLOTY ;> PLOTY?
BCC :YMNUS ;NO!
SEC ;SUB. PLOTY
SBC PLOTY ;DROM DRAWY &
STA DELTAY ;SAVE DIFF.
LDA #1 ;Y INC. = 1.
STA INCY ;(DOWN)
BNE :XVEC ;BRANCH!
:YMNUS LDA PLOTY ;SUB. DRAWY
SEC ;FROM PLOTY &
SBC DRAWY ;SAVE DIFF.
STA DELTAY ;
LDA #255 ;Y INC. = -1.
STA INCY ;(UP)
:XVEC LDA DRAWX ;IS DRAWX
CMP PLOTX ;> PLOTX?
BCC :XMNUS ;NO!
SEC ;SUB. DRAWX
SBC PLOTX ;FROM PLOTX
STA DELTAX ;& SAVE DIFF.
LDA #1 ;X INC. IS 1
STA INCX ;(RIGHT)
BNE :VCSET ;BRANCH!
:XMNUS LDA PLOTX ;SUB. DRAWX
SEC ;FROM PLOTX
SBC DRAWX ;& SAVE DIFF.
STA DELTAX ;
LDA #255 ;X INC IS -1
STA INCX ;(LEFT)
:VCSET LDA #0 ;ZERO OUT
STA ACCY ;Y-ACC.
STA ACCX ;X-ACC.
LDA DELTAX ;IS DELTAX >
CMP DELTAY ;DELTAY?
BCC :YMAX ;NO!
STA COUNTR ;SAVE DELTAX
STA ENDPT ;IN COUNTR. ENDPT.
LSR A ;DIV. BY 2 &
STA ACCY ;STORE IN Y-ACC.
JMP :DRAWG ;START DRAW
:YMAX LDA DELTAY ;DELTAY LARGER.
STA COUNTR ;STORE IT IN
STA ENDPT ;COUNTR, ENDPT.
LSR A ;DIV BY 2 &
STA ACCX ;STORE IN X-ACC.
* BEGIN DRAWING TO DESTINATION
:DRAWG LDA COUNTR ;IF COUNTR=0...
BEQ :DRAWE ;NO DRAW!
:BEGIN LDA ACCY ;ADD DELTAY
CLC ;TO Y-ACC.
ADC DELTAY ;
BCS :OVER1 ;
STA ACCY ;
CMP ENDPT ;AT ENDPNT YET?
BCC :BEGN2 ;NO, GO DO X.
LDA ACCY ;SUB. ENDPT
SEC ;FROM Y-ACC.
:OVER1 SBC ENDPT ;
STA ACCY ;
LDA PLOTY ;AND INC. THE
CLC ;Y. POSITION.
ADC INCY ;
STA PLOTY ;
:BEGN2 LDA ACCX ;ADD DELTAX TO
CLC ;X-ACC.
ADC DELTAX ;
BCS :OVER2 ;
STA ACCX ;
CMP ENDPT ;AT ENDPT. YET?
BCC :PLOTT ;NO, GO PLOT.
LDA ACCX ;SUB. ENDPT
SEC ;FROM X-ACC.
:OVER2 SBC ENDPT ;
STA ACCX ;
LDA PLOTX ;AND INC.
CLC ;PLOT X
ADC INCX ;
STA PLOTX ;
:PLOTT JSR PLOTPT ;PLOT POINT.
DEC COUNTR ;MORE TO DRAW?
BNE :BEGIN ;YES!
:DRAWE RTS ;NO, ALL DONE...
* DRAW AN INDIVIDUAL CELL
SHOCEL LDX CELNUM ;CELL # TO DRAW
LDA #$00 ;SPECIFY COLOR
STA CELLMV,X ;& DON'T UPDATE
STA COLOR ;AGAIN.
LDA CELLOX,X ;GET OLD X-COORD
STA PLOTX ;& STORE
LDA CELLOY,X ;GET OLD Y-COORD
STA PLOTY ;& STORE
LDA #$00 ;SPECIFY OBJECT
JSR OBJECT ;& DRAW IT...
LDX CELNUM ;CELL # TO DRAW
LDA CELLNX,X ;GET NEW X-COORD
STA PLOTX ;& STORE
STA CELLOX,X ;
LDA CELLNY,X ;GET NEW Y-COORD
STA PLOTY ;& STORE
STA CELLOY,X ;
LDA #1 ;SPECIFY COLOR
STA COLOR ;OF CELL
LDA #0 ;SPECIFY OBJECT
JSR OBJECT ;& DRAW IT...
RTS ;ALL DONE...
* CELL MOVER
OBJECT ASL A ;MULT OBJECT
ASL A ;INDEX BY 0
ASL A ;TO POINT INTO
STA SHAPIX ;SHAPE TABLE
LDA #8 ;8 LINES MAX
STA SHAPCT ;IN SHAPE
DOBLP LDX SHAPIX ;GET LINE #
LDY OBJDIR,X ;& ITS DIRECTION
BMI ENDOBJ ;IF $FF ALL DONE
LDA PXINC,Y ;GET X INCREMENT
STA XI
LDA PYINC,Y ;AND Y INCREMENT
STA YI
LDA OBJLEN,X ;AND LINE LENGTH
STA LENGTH
PLOTOB LDA PLOTX ;INCREMENT
CLC ;THE X
ADC XI ;COORDINATE
STA PLOTX ;AND SAVE
LDA PLOTY ;INCREMENT
CLC ;THE Y
ADC YI ;COORDINATE
STA PLOTY ;AND SAVE
LDA SHAPCT ;FIRST LINE?
CMP #$08
BEQ NOPLT1 ;DON'T PLOT IT!
JSR PLOTPT ;PLOT POINT
NOPLT1 LDA LENGTH ;MORE LENGTH?
BEQ NOOBJ
DEC LENGTH ;DECREASE LENGTH
BNE PLOTOB ;YUP!
NOOBJ INC SHAPIX ;NEXT LINE
DEC SHAPCT ;DONE 8 LINES?
BNE DOBLP ;NOPE!
ENDOBJ RTS ;FINIS!!!
* SHAPE DATA
PXINC DB 0,0,1,$FF,1,$FF,1,$FF
PYINC DB $FF,1,0,0,$FF,1,1,$FF
* OBJECT SIDE LENGTHS
OBJLEN DB 3,2,2,2,2,2,2,0
DB 0,40,0,0,0,0,0,0
DB 0,40,0,0,0,0,0,0
DB 0,40,0,0,0,0,0,0
DB 0,40,0,0,0,0,0,0
DB 0,40,0,0,0,0,0,0
DB 0,40,0,0,0,0,0,0
DB 0,40,0,0,0,0,0,0
DB 0,40,0,0,0,0,0,0
* OBJECT SIDE DIRECTIONS
OBJDIR DB 2,5,3,7,4,2,6,$FF
DB 0,0,$FF,0,0,0,0,0
DB 0,1,$FF,0,0,0,0,0
DB 0,2,$FF,0,0,0,0,0
DB 0,3,$FF,0,0,0,0,0
DB 0,4,$FF,0,0,0,0,0
DB 0,5,$FF,0,0,0,0,0
DB 0,6,$FF,0,0,0,0,0
DB 0,7,$FF,0,0,0,0,0
:COLRS DB $00,$55,$AA,$FF
:BMSK1 DB $3F,$CF,$F3,$FC
:BMSK2 DB $C0,$30,$0C,$03
:COLR1 DB $40,$10,$04,$01
LOTBL DS 192
HITBL DS 192
END $2800