*****************************›*         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›