Bacterion! Assembly Listing


The article describing this program appears on a separate page.

Listing 2: Assembly Listing

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

Previous | Contents | Next

Original text copyright 1984 by ANALOG Computing. Reprinted with permission by the Digital ANALOG Archive.