home *** CD-ROM | disk | FTP | other *** search
- ;================================
- ;COMMIE UFO ATTACK V1.0
- ;(C) 1986 STEVE GOLDSMITH
- ;ALL RIGHTS RESERVED
- ;
- ;USE COMMODORE'S MACRO ASSEMBLER
- ;ASSEMBLE
- ;================================
- ;
- *=$8000
- SETLFS = $FFBA ;SET LOGICAL FILE #, DEVICE, COMMAND
- SETNAM = $FFBD ;SET FILE NAME
- LOAD = $FFD5 ;LOAD RAM FROM DEVICE
- PRINT = $FFD2 ;KERNAL CHAR PRINT ROUTINE
- PLOT = $FFF0 ;SET CURSOR LOCATION
- GETIN = $FFE4 ;GET CHAR FROM KEYBOARD
- CCOLOR = $0286 ;CURSOR COLOR
- VICII = $D000 ;VIDEO CHIP
- CIA1 = $DC00 ;COMPLEX INTERFACE ADAPTER #1
- CIA2 = $DD00 ;COMPLEX INTERFACE ADAPTER #2
- KSCRN = $288 ;KERNAL START OF SCREEN
- IRQVEC = $0314 ;IRQ HARDWARE VECTOR
- NRMIRQ =$EA31 ;NORMAL IRQ VECTOR
- SCREEN = $C800 ;START OF SCREEN MEMORY
- COLMEM = $D800 ;CHARACTER COLOR MEM
- SPRPTR = SCREEN+$3F8 ;SPRITE POINTERS
- SID = $D400 ;START OF SOUND CHIP
- INDEX = $FB ;ZERO PAGE INDEXER
- ;
- ;INITILIZE PROGRAM
- ;
- JSR LOADCS ;LOAD CHARS AND SPRITES
- JSR SETBNK ;SET GRAPHICS BANK
- JSR TITLE ;DISPLAY TITLE SCREEN
- JSR SETIRQ ;CRANK UP NEW IRQ
- REPLAY JSR INITSP ;INIT PLAYFIELD
- ;
- ;MAIN LOOP
- ;
- MAIN DEC MLOOP ;MISSLE MOVES TWICE AS FAST
- BNE LOOP89
- LDA #$02
- STA MLOOP
- LDA VICII+$1E ;GET COLLISION REG
- STA COLREG ;SAVE COLLISION REG
- JSR TANK ;MOVE TANK AND FIRE MISSLE
- LDA NUMTNK ;GET NUMBER OF TANKS
- BNE LOOP78 ;ANY TANKS LEFT?
- JMP ENDGAM ;END GAME
- LOOP78 JSR UFO1 ;MOVE UFO1 AND DROP BOMBS
- JSR UFO2 ;MOVE UFO2 AND DROP BOMBS
- JSR SCROLL ;SCROLL BOTTOM LINE ON SCREEN
- LDA VICII+$1E ;GET COLLISION REG
- STA COLREG ;SAVE COLLISION REG
- LOOP89 JSR MISSLE ;MOVE MISSLE
- SEC ;TIME DELAY
- LDA #$0A
- SBC LEVEL ;HIGHER LEVEL = FASTER DELAY
- TAY
- LOOP79 LDX #$40 ;SECONDARY DELAY
- LOOP80 DEX
- BNE LOOP80
- DEY
- BNE LOOP79
- JMP MAIN
- ;
- ;LOAD CHARACTER AND SPRITE DATA
- ;
- LOADCS LDA #$01 ;FILE #
- LDX #$08 ;DEVICE #
- LDY #$01 ;COMMAND
- JSR SETLFS ;SET UP FILE
- LDA #$0A ;# OF CHARS IN NAME
- LDX #<NAME ;GET ADDR OF FILE NAME
- LDY #>NAME
- JSR SETNAM ;SET UP NAME
- LDA #$00 ;SET FOR LOAD
- JSR LOAD ;LOAD FILE
- RTS
- ;
- ;SET BANK + GRAPHICS MODE
- ;
- SETBNK LDA CIA2+2
- ORA #$03 ;SET BITS 0 & 1 TO OUTPUTS
- STA CIA2+2
- LDA CIA2
- AND #$FC ;SELECT BANK 3 FOR GRAPHICS
- STA CIA2
- LDA #$20
- STA VICII+$18 ;CHARACTERS @ $C000 AND SCREEN @ $C800
- LDA #$C8
- STA KSCRN ;TELL KERNAL WHERE SCREEN IS
- RTS
- ;
- ;SET IRQ TO NEW LOCATION
- ;
- SETIRQ SEI
- LDA #<NEWIRQ
- STA IRQVEC
- LDA #>NEWIRQ
- STA IRQVEC+1
- CLI
- RTS
- ;
- ;NEW IRQ ROUTINE
- ;
- NEWIRQ LDX RTSCN
- LDA RTNUM,X ;GET ROUTINE #
- BEQ LOOP4 ;SKIP TO NEXT READ POSITION
- CMP #$01
- BNE LOOP1
- JSR RT1
- JMP LOOP4
- LOOP1 CMP #$02
- BNE LOOP2
- JSR RT2
- JMP LOOP4
- LOOP2 CMP #$03
- BNE LOOP3
- JSR RT3
- JMP LOOP4
- LOOP3 JSR RT4
- LOOP4 LDX RTSCN
- INX
- CPX #$04 ;SCAN FOR 4 ROUTINES
- BNE LOOP5
- LDX #$00
- LOOP5 STX RTSCN
- JMP NRMIRQ
- RT4 RTS ;ROUTINE 4 NOT USED
- ;
- ;INITILIZE SPRITES, PLAY FIELD, SCORE, # OF TANKS, AND LEVEL
- ;
- INITSP LDX #$00 ;CLEAR SID CHIP
- TXA
- LOOP76 STA SID,X
- INX
- CPX #$18
- BNE LOOP76
- LDA #$00 ;ZERO SCORE
- STA SC
- STA SC+1
- STA SC+2
- LDA #$02
- STA MLOOP ;# OF TIMES MISSLE MOVES VS TANK AND UFOS
- LDA #$03
- STA NUMTNK ; # OF TANKS
- LDA #$01
- STA LEVEL ;SET LEVEL TO 1
- LDX #$00 ;SET SPRITE 0-6 POINTER AND COLOR
- LOOP8 LDA SPRTBL,X
- STA SPRPTR,X ;SET SPRITE POINTER
- LDA SPCOLR,X
- STA VICII+$27,X ;SET SPRITE COLOR
- INX
- CPX #$08
- BNE LOOP8
- LDX #$AB ;PUT TANK ON SCREEN
- LDY #$DD
- STX VICII ;SET X POS
- STY VICII+1 ;SET Y POS
- LDA #%00000001
- STA VICII+$15 ;TURN TANK ON
- LDX #$00
- LOOP6 LDA SDATA,X ;CLEAR SCREEN AND PRINT TOP LINE
- JSR PRINT ;PRINT CHARS
- INX
- CPX #$22
- BNE LOOP6
- LDX #$00 ;SET COLOR FOR BOTTOM LINE ON SCREEN
- LDA #$03 ;CYAN
- LOOP77 STA COLMEM+$03C0,X
- INX
- CPX #$28
- BNE LOOP77
- LDA #$47 ;SET UP BOTTOM LINE FOR SCROLL
- STA SCREEN+$03E7
- LDA VICII+$1E ;CLEAR COLLISION REG
- LDA #$0F
- STA SID+$18 ;TURN VOLUME ON
- RTS
- ;
- ;READ COLLISION REG, JOYSTICK, AND MOVE TANK OR FIRE MISSLE
- ;
- TANK LDA TNKEXP ;SEE IF TANK EXPLODING
- BEQ LOOP67
- RTS
- LOOP67 LDA COLREG ;SEE IF TANK HIT
- AND #%00000001 ;SEE IF TANK HIT
- BEQ LOOP66
- DEC NUMTNK ;DECREASE # OF TANKS
- LDA #$0F
- STA TIMER3 9/15 TH SECOND
- LDA #$09
- STA SID+$05 ;SET ATTACK/DECAY
- LDA #$70
- STA SID+$06 ;SET SUSTAIN/RELEASE
- LDA #$80
- STA SID ;LO FREQ
- LDA #$01
- STA SID+1 ;HI FREQ
- STA TNKSND
- LDA #%10000001
- STA SID+$04 ;SET RANDOM NOISE + GATE BIT
- LDA #$03
- STA TNKEXP ;SKIP JOYSTICK INPUT
- STA RTNUM+2 ;START IRQ PROCESSING
- LDA #$01
- STA VICII+$17 ;EXPAND Y
- LDA #$D5
- STA VICII+1 ;EXPLOSION Y
- RTS
- LOOP66 LDA CIA1
- AND #%00011111 ;GET DIRECTIONS
- CMP #%00001111 ;CHECK FOR FIRE
- BEQ FIRE ;FIRE MISSLE
- CMP #%00011011 ;CHECK FOR LEFT
- BEQ LEFT
- CMP #%00010111 ;CHECK FOR RIGHT
- BEQ RIGHT
- CMP #%00001011 ;CHECK FOR LEFT + FIRE
- BNE LOOP20
- JSR FIRE
- JMP LEFT
- LOOP20 CMP #%00000111 ;CHECK FOR RIGHT + FIRE
- BNE LOOP56
- JSR FIRE
- JMP RIGHT
- LOOP56 RTS
- LEFT LDA VICII+$10 ;MOVE TANK LEFT
- AND #%00000001 ;SEE IF MSB OF X IS SET
- BEQ LOOP9
- LDA VICII ;SEE IF TANK IS @ $100
- BNE LOOP11
- LDA VICII+$10
- AND #%11111110 ;TANK REACHED $FF
- STA VICII+$10
- LOOP9 LDA VICII
- CMP #$18 ;LEFT EDGE OF SCREEN
- BEQ LOOP10
- LOOP11 DEC VICII ;MOVE TANK 1 LEFT
- LOOP10 RTS
- RIGHT LDA VICII+$10 ;MOVE TANK RIGHT
- AND #%00000001 ;SEE IF MSB OF X IS SET
- BNE LOOP12
- LDA VICII ;SEE IF TANK IS @ $FF
- CMP #$FF
- BNE LOOP13
- LDA VICII+$10
- ORA #%00000001 ;TANK REACHED $100
- STA VICII+$10
- LOOP12 LDA VICII
- CMP #$40 ;RIGHT EDGE OF SCREEN
- BEQ LOOP14
- LOOP13 INC VICII ;MOVE TANK 1 RIGHT
- LOOP14 RTS
- FIRE LDA FIRTGL ;SEE IF MISSLE ALL READY SHOT
- BEQ LOOP15 ;SHOOT MISSLE
- RTS
- LOOP15 LDA #$01
- STA FIRTGL
- LDA VICII+$10
- AND #%00000001 ;SEE IF MSB OF TANK X POS SET
- BNE LOOP18 ;MSB OF TANK X SET
- LDA VICII+$10
- AND #%11111101 ;MSB OF TANK X NOT SET
- JMP LOOP19
- LOOP18 LDA VICII+$10
- ORA #%00000010
- LOOP19 STA VICII+$10
- LDA VICII ;GET TANKS X POS
- STA VICII+2 ;MISSLE X
- LDA #$D9
- STA VICII+3 ;MISSLE Y
- LDA VICII+$15
- ORA #%00000010 ;TURN MISSLE ON
- STA VICII+$15
- LDA #$11 ;SET ATTACK/DECAY V1
- STA SID+$05
- LDA #$F6 ;SET SUSTAIN/RELEASE V1
- STA SID+$06
- LDA #$80 ;STORE MISSLE FREQ.
- STA SID
- LDA #$03
- STA SID+1
- LDA #%10000001 ;SET RANDOM NOISE + GATE BIT
- STA SID+$04
- LDA #%10000000
- STA SID+$04 ;START RELEASE CYCLE
- RTS
- ;
- ;MISSLE MOVEMENT
- ;
- MISSLE LDA FIRTGL ;SEE IF MISSLE IS IN FLIGHT
- BNE LOOP16
- RTS
- LOOP16 LDA VICII+3 ;GET MISSLE Y POS
- CMP #$32 ;SEE IF @ TOP OF SCREEN
- BEQ LOOP17
- DEC VICII+3 ;MOVE MISSLE UP 1
- RTS
- LOOP17 LDA VICII+$15
- AND #%11111101 ;TURN MISSLE OFF
- STA VICII+$15
- LDA #$00 ;CAN NOW FIRE ANOTHER MISSLE
- STA FIRTGL
- STA COLREG ;CLEAR C-REG SAVE
- LDA VICII+$1E ;CLEAR SS C-REG
- RTS
- ;
- ;INIT UFOS
- ;
- INUFOS LDA VICII+$12
- AND #%01111111
- CLC
- ADC #$38
- STA YPOS ;SAVE Y POS
- LDA VICII+$12
- BMI LOOP21
- LDA #$01 ;RIGHT TO LEFT
- STA UFODIR
- LDA #$57
- STA XPOS
- RTS
- LOOP21 LDA #$00 ;LEFT TO RIGHT
- STA UFODIR
- LDA #$01
- STA XPOS
- RTS
- ;
- ;MOVE UFO 1
- ;
- UFO1 LDA INITU1 ;SEE IF INIT YET
- BNE LOOP22
- LDA #$01
- STA INITU1
- JSR INUFOS ;GET X,Y, AND DIRECTION
- LDA VICII+$10 ;GET MSB OF UFO
- LDX UFODIR
- STX U1DIR ;SAVE DIRECTION
- BNE LOOP23 ;SET MSB OF UFO
- AND #%11111011 ;LEFT TO RIGHT
- JMP LOOP24
- LOOP23 ORA #%00000100 ;RIGHT TO LEFT
- LOOP24 STA VICII+$10
- LDA XPOS ;SET X AND Y POS
- STA VICII+4
- LDA YPOS
- STA VICII+5
- LDA VICII+$15
- ORA #%00000100 ;TURN UFO ON
- STA VICII+$15
- LOOP22 LDA BD1 ;SEE IF BOMB HAS BEEN DROPED
- BNE LOOP45
- LDA VICII+$12 ;DROP BOMB?
- CMP #$01
- BNE LOOP46
- LDA #$01
- STA BD1
- LOOP45 JSR BOMB1
- LOOP46 LDA COLREG ;GET COLLISION REG
- AND #%00000110
- CMP #%00000110 ;SEE IF MISSLE HIT UFO
- BNE LOOP60 ;NO
- JSR LOOP17 ;KILL MISSLE
- JSR LOOP28 ;KILL UFO
- LDX #$00
- LDY LEVEL ;SCORE = LEVEL*100
- JSR SCORE ;SCORE POINTS
- LDX VICII+4 ;UFO X LSB
- LDY VICII+5 ;UFO Y
- LDA VICII+$10 ;UFO X MSB
- AND #%00000100
- CLC
- BEQ LOOP61
- SEC
- LOOP61 JMP EXP2 ;INIT EXPLOSION
- LOOP60 LDA U1DIR ;GET UFO DIRECTION
- BEQ LOOP25
- LDA VICII+$10 ;MOVE RIGHT TO LEFT
- AND #%00000100 ;SEE IF MSB OF X SET
- BEQ LOOP26
- LDA VICII+4 ;SEE IF UFO IS @ $100
- BNE LOOP27
- LDA VICII+$10
- AND #%11111011 ;UFO REACHED $FF
- STA VICII+$10
- LOOP26 LDA VICII+4
- CMP #$01 ;LEFT EDGE OF SCREEN
- BEQ LOOP28
- LOOP27 DEC VICII+4
- RTS
- LOOP25 LDA VICII+$10 ;MOVE LEFT TO RIGHT
- AND #%00000100 ;SEE IF MSB OF X IS SET
- BNE LOOP29
- LDA VICII+4 ;SEE IF UFO IS @ $FF
- CMP #$FF
- BNE LOOP30
- LDA VICII+$10
- ORA #%00000100 ;UFO REACHED $100
- STA VICII+$10
- LOOP29 LDA VICII+4
- CMP #$57 ;RIGHT EDGE OF SCREEN
- BEQ LOOP28
- LOOP30 INC VICII+4
- RTS
- LOOP28 LDA VICII+$15
- AND #%11111011 ;TURN UFO OFF
- STA VICII+$15
- LDA #$00
- STA INITU1
- RTS
- ;
- ;MOVE UFO 2
- ;
- UFO2 LDA INITU2 ;SEE IF INIT YET
- BNE LOOP31
- LDA #$01
- STA INITU2
- JSR INUFOS ;GET X,Y, AND DIRECTION
- LDA VICII+$10 ;GET MSB OF UFO
- LDX UFODIR
- STX U2DIR ;SAVE DIRECTION
- BNE LOOP32 ;SET MSB OF UFO
- AND #%11110111 ;LEFT TO RIGHT
- JMP LOOP33
- LOOP32 ORA #%00001000 ;RIGHT TO LEFT
- LOOP33 STA VICII+$10
- LDA XPOS ;SET X AND Y POS
- STA VICII+6
- LDA YPOS
- STA VICII+7
- LDA VICII+$15
- ORA #%00001000 ;TURN UFO ON
- STA VICII+$15
- LOOP31 LDA VICII+7
- CMP #$D0
- BEQ LOOP40
- LDA VICII+$12
- AND #$0F
- BNE LOOP40
- INC VICII+7
- LOOP40 LDA BD2 ;SEE IF BOMB HAS BEEN DROPED
- BNE LOOP47
- LDA VICII+$12 ;DROP BOMB?
- CMP #$01
- BNE LOOP48
- LDA #$01
- STA BD2
- LOOP47 JSR BOMB2
- LOOP48 LDA COLREG ;GET COLLISION REG
- AND #%00001010
- CMP #%00001010 ;SEE IF MISSLE HIT UFO
- BNE LOOP64 ;NO
- JSR LOOP17 ;KILL MISSLE
- JSR LOOP37 ;KILL UFO
- LDX #$00
- LDY LEVEL ;SCORE = LEVEL*100
- JSR SCORE ;SCORE POINTS
- LDX VICII+6 ;UFO X LSB
- LDY VICII+7 ;UFO Y
- LDA VICII+$10 ;UFO X MSB
- AND #%00001000
- CLC
- BEQ LOOP65
- SEC
- LOOP65 JMP EXP2 ;INIT EXPLOSION
- LOOP64 LDA U2DIR
- BEQ LOOP34
- LDA VICII+$10 ;MOVE RIGHT TO LEFT
- AND #%00001000 ;SEE IF MSB OF X SET
- BEQ LOOP35
- LDA VICII+6 ;SEE IF UFO IS @ $100
- BNE LOOP36
- LDA VICII+$10
- AND #%11110111 ;UFO REACHED $FF
- STA VICII+$10
- LOOP35 LDA VICII+6
- CMP #$01 ;LEFT EDGE OF SCREEN
- BEQ LOOP37
- LOOP36 DEC VICII+6
- RTS
- LOOP34 LDA VICII+$10 ;MOVE LEFT TO RIGHT
- AND #%00001000 ;SEE IF MSB OF X IS SET
- BNE LOOP38
- LDA VICII+6 ;SEE IF UFO IS @ $FF
- CMP #$FF
- BNE LOOP39
- LDA VICII+$10
- ORA #%00001000 ;UFO REACHED $100
- STA VICII+$10
- LOOP38 LDA VICII+6
- CMP #$57 ;RIGHT EDGE OF SCREEN
- BEQ LOOP37
- LOOP39 INC VICII+6
- RTS
- LOOP37 LDA VICII+$15
- AND #%11110111 ;TURN UFO OFF
- STA VICII+$15
- LDA #$00
- STA INITU2
- RTS
- ;
- ;BOMB 1 MOVEMENT
- ;
- BOMB1 LDA INITB1 ;SEE IF BOMB INIT YET
- BNE LOOP41
- LDA #$01
- STA INITB1
- LDA VICII+4 ;GET UFO 1 X POS
- STA VICII+8
- LDA VICII+$10
- AND #%00000100 ;SEE IF MSB OF UFO IS SET
- BNE LOOP42
- LDA VICII+$10
- AND #%11101111
- JMP LOOP43
- LOOP42 LDA VICII+$10
- ORA #%00010000
- LOOP43 STA VICII+$10
- LDA VICII+5 ;GET UFO 1 Y POS
- STA VICII+9
- LDA VICII+$15
- ORA #%00010000 ;TURN BOMB ON
- STA VICII+$15
- LDA #$D0
- STA SID+$0C ;SET ATTACK/DECAY V2
- LDA #$00
- STA SID+$0D ;SET SUSTAIN/RELEASE V2
- LDA #$00
- STA SID+$07 ;SET FREQ LO
- LDA #$E0
- STA SID+$08 ;SET FREQ HI
- STA B1FREQ ;SAVE HI FREQ
- LDA #%00100001 ;SELECT SAWTOOTH WAVEFORM AND GATE BIT
- STA SID+$0B
- LOOP41 LDA VICII+9
- CMP #$DD
- BNE LOOP74
- LDX #%00100000
- STX SID+$0B ;START RELEASE CYCLE
- LOOP74 CMP #$E5 ;SEE IF BOMB IS @ BOTTOM OF SCREEN
- BEQ LOOP44
- INC VICII+9 ;MOVE BOMB 1 DOWN
- LDA COLREG ;GET COLLISION REG
- AND #%00010010 ;SEE IF BOMB AND MISSLE HIT
- CMP #%00010010
- BNE LOOP58 ;NO
- LDA #%00100000
- STA SID+$0B ;START RELEASE CYCLE
- LDX #$00
- LDY #$01
- JSR SCORE ;ADD 100 TO SCORE
- JSR LOOP17 ;KILL MISSLE
- JMP LOOP44 ;KILL BOMB
- LOOP58 DEC B1FREQ
- LDA B1FREQ
- STA SID+$08 ;LOWER FREQ
- RTS
- LOOP44 LDA #$00
- STA INITB1
- STA BD1
- LDA VICII+$15
- AND #%11101111 ;TURN OFF
- STA VICII+$15
- LDX VICII+8 ;BOMB X LO
- LDY VICII+9 ;BOMB Y
- CLC
- LDA VICII+$10 ;GET X HI
- AND #%00010000
- BEQ LOOP53
- SEC
- LOOP53 JMP EXP1 ;INIT EXPLOSION
- ;
- ;BOMB 2 MOVEMENT
- ;
- BOMB2 LDA INITB2 ;SEE IF BOMB INIT YET
- BNE LOOP49
- LDA #$01
- STA INITB2
- LDA VICII+6 ;GET UFO 2 X POS
- STA VICII+10
- LDA VICII+$10
- AND #%00001000 ;SEE IF MSB OF UFO IS SET
- BNE LOOP50
- LDA VICII+$10
- AND #%11011111
- JMP LOOP51
- LOOP50 LDA VICII+$10
- ORA #%00100000
- LOOP51 STA VICII+$10
- LDA VICII+7 ;GET UFO 2 Y POS
- STA VICII+11
- LDA VICII+$15
- ORA #%00100000 ;TURN BOMB ON
- STA VICII+$15
- LDA #$D0
- STA SID+$13 ;SET ATTACK/DECAY V3
- LDA #$00
- STA SID+$14 ;SET SUSTAIN/RELEASE V3
- LDA #$00
- STA SID+$0E ;SET FREQ LO
- LDA #$E0
- STA SID+$0F ;SET FREQ HI
- STA B2FREQ ;SAVE HI FREQ
- LDA #%00100001 ;SELECT SAWTOOTH WAVEFORM AND GATE BIT
- STA SID+$12
- LOOP49 LDA VICII+11
- CMP #$DD
- BNE LOOP75
- LDX #%00100000 ;START RELEASE CYCLE
- STX SID+$12
- LOOP75 CMP #$E5 ;SEE IF BOMB IS @ BOTTOM OF SCREEN
- BEQ LOOP52
- INC VICII+11 ;MOVE BOMB 2 DOWN
- LDA COLREG ;GET COLLISION REG
- AND #%00100010 ;SEE IF BOMB AND MISSLE HIT
- CMP #%00100010
- BNE LOOP59 ;NO
- LDA #%00100000
- STA SID+$12 ;START RELEASE CYCLE
- LDX #$00
- LDY #$01
- JSR SCORE ;ADD 100 TO SCORE
- JSR LOOP17 ;KILL MISSLE
- JMP LOOP52 ;KILL BOMB
- LOOP59 DEC B2FREQ ;LOWER FREQ
- LDA B2FREQ
- STA SID+$0F
- RTS
- LOOP52 LDA #$00
- STA INITB2
- STA BD2
- LDA VICII+$15
- AND #%11011111
- STA VICII+$15
- LDX VICII+10 ;BOMB X LO
- LDY VICII+11 ;BOMB Y
- CLC
- LDA VICII+$10 ;GET X HI
- AND #%00100000
- BEQ LOOP57
- SEC
- LOOP57 JMP EXP1 ;INIT EXPLOSION
- ;
- ;BOMB EXPLOSION
- ;
- EXP1 STX VICII+12 ;EXP X LO
- STY VICII+13 ;EXP Y
- LDA VICII+$10 ;GET X HI
- AND #%10111111
- BCC LOOP54 ;X HI NOT SET
- ORA #%01000000
- LOOP54 STA VICII+$10
- LDA VICII+$15
- ORA #%01000000 ;TURN ON
- STA VICII+$15
- LDA #$08 ;8/15 TH OF A SEC
- STA TIMER1
- LDA #$01
- STA RTNUM+3 ;START IRQ PROCESSING
- RTS
- ;
- ;BOMB EXPLOSION IRQ PROCESSING
- ;
- RT1 LDX TIMER1
- LDA TIMER1,X
- STA VICII+$2D ;CHANGE COLOR
- DEC TIMER1
- BNE LOOP55
- LDA VICII+$15
- AND #%10111111 ;TURN OFF
- STA VICII+$15
- LDA #$00
- STA RTNUM+3 ;STOP IRQ PROCESSING
- LOOP55 RTS
- ;
- ;UFO EXPLOSION INITILIZE
- ;
- EXP2 STX VICII+14 ;EXP X LO
- STY VICII+15 ;EXP Y
- LDA VICII+$10 ;GET X HI
- AND #%01111111
- BCC LOOP62 ;X HI NOT SET
- ORA #%10000000
- LOOP62 STA VICII+$10
- LDA #$80 ;SET ATTACK/DECAY V1
- STA SID+$05
- LDA #$F8 ;SET SUSTAIN/RELEASE V1
- STA SID+$06
- LDA #$FF ;STORE MISSLE FREQ.
- STA SID ;LO FREQ
- LDA #$81
- STA SID+1 ;HI FREQ
- STA EXPFRQ
- LDA #%10000001 ;SET RANDOM NOISE + GATE BIT
- STA SID+$04
- LDA #%10000000
- STA SID+$04 ;START RELEASE CYCLE
- LDA #$06 ; 6/15 TH SECOND
- STA TIMER2
- LDA #$02
- STA RTNUM+1 ;START IRQ PROCESSING
- LDA VICII+$15
- ORA #%10000000 ;TURN ON
- STA VICII+$15
- RTS
- ;
- ;UFO EXPLOSION IRQ PROCESSING
- ;
- RT2 LDX TIMER2
- LDA TIMER2,X
- STA SPRPTR+7 ;CHANGE SPRITE POINTER
- ROL EXPFRQ
- LDA EXPFRQ
- STA SID+1 ;CHANGE SOUND
- DEC TIMER2
- BNE LOOP63
- LDA VICII+$15
- AND #%01111111 ;TURN OFF
- STA VICII+$15
- LDA #$00
- STA RTNUM+1 ;STOP IRQ PROCESSING
- LOOP63 RTS
- ;
- ;TANK EXPLOSION IRQ PROCESSING
- ;
- RT3 LDX TIMER3
- LDA EXPCLR,X
- STA VICII+$27 ;CHANGE COLOR
- LDA TIMER3,X
- STA SPRPTR ;CHANGE SPRITE POINTER
- ROR TNKSND
- LDA TNKSND
- STA SID+$01 ;CHANGE SOUND
- DEC TIMER3
- BNE LOOP68
- LDA #$00
- STA VICII+$17 ;UNEXPAND Y
- LDA #$05
- STA VICII+$27 ;RESTORE COLOR
- LDA #$AB
- STA VICII ;SET TANK X LO
- LDA #$DD
- STA VICII+1 ;TANK Y
- LDA VICII+$10
- AND #%11111110
- STA VICII+$10 ;SET MSB X
- LDA #$10
- STA SPRPTR ;RESTORE TANK
- LDA #$00
- STA SID+$04
- STA RTNUM+2 ;STOP IRQ PROCESSING
- STA TNKEXP ;RESTART JOYSTICK READ
- LDA VICII+$1E ;CLEAR COLLISION REG
- LDX NUMTNK ;GET # LEFT
- LDA #$20 ;SPACE
- STA SCREEN+$1B,X ;ERASE 1 TANK
- LOOP68 RTS
- ;
- ;SCROLL BOTTOM LINE OF SCREEN
- ;
- SCROLL LDA SCREEN+$03E7
- PHA ;SAVE RIGHT MOST CHAR
- LDX #$00
- LOOP69 LDA SCREEN+$3C1,X ;GET CHAR 1 SPACE TO THE RIGHT
- STA SCREEN+$03C0,X ;STORE 1 TO THE LEFT
- INX
- CPX #$27 ;MOVE 39 CHARS
- BNE LOOP69
- PLA ;GET MOST RIGHT CHAR
- LDX VICII+$12 ;GET RANDOM #
- BMI LOOP70
- CMP #$47 ;MAX LINE LEVEL
- BEQ LOOP71
- INC SCREEN+$03E7 ;LOWER LINE
- RTS
- LOOP70 CMP #$40 ;MIN LINE LEVEL
- BEQ LOOP71
- DEC SCREEN+$03E7 ;RAISE LINE
- RTS
- LOOP71 STA SCREEN+$03E7
- RTS
- ;
- ;UPDATE AND DISPLAY SCORE
- ;SET X FOR LOW 2 DIGITS AND Y FOR MIDDLE 2 DIGITS
- ;
- SCORE SED ;ADDITION IN DECIMAL
- CLC
- TXA
- ADC SC ;ADD DIGITS 0&1
- STA SC
- LDA #$00
- ADC SC+1 ;ADD CARRY
- STA SC+1
- TYA
- ADC SC+1 ;ADD DIGITS 2&3
- STA SC+1
- LDA #$00
- ADC SC+2 ;ADD CARRY
- STA SC+2
- CLD ;BACK TO BINARY
- LDX #$00
- LDY #$06
- LOOP72 LDA SC,X
- PHA ;SAVE DIGITS
- AND #$0F ;GET RIGHT DIGIT
- CLC
- ADC #$30 ;ADD SCREEN CODE FOR '0'
- STA SCREEN+$05,Y
- DEY
- PLA
- LSR A ;
- LSR A ; GET LEFT DIGIT
- LSR A ;
- LSR A ;
- CLC
- ADC #$30 ;ADD '0' SCREEN CODE
- STA SCREEN+$05,Y
- DEY
- INX
- CPX #$03 ;3 DIGIT PAIRS
- BNE LOOP72
- LDA SC+2
- CMP LEVEL
- BNE LOOP73
- INC LEVEL ;INCREASE LEVEL
- INC SCREEN+$13 ;DISPLAY NEW LEVEL
- INC NUMTNK ;BONUS TANK
- LDX NUMTNK
- LDA #$48 ;TANK CHAR
- STA SCREEN+$1A,X ;DISPLAY TANKS
- LDA #$05 ;GREEN
- STA COLMEM+$1A,X ;SET COLOR
- LOOP73 RTS
- ;
- ;END GAME
- ;
- ENDGAM LDA #%01000001
- STA VICII+$15 ;TURN ALL SPRITES OFF, BUT EXPLOSIONS
- JSR LOOP17 ;KILL MISSLE
- JSR LOOP28 ;KILL UFO1
- JSR LOOP37 ;KILL UFO2
- JSR LOOP44 ;KILL BOMB1
- JSR LOOP52 ;KILL BOMB2
- LDA #$17
- STA SPRPTR+1 ;SET SPRITE POINTER FOR GAME OVER SPRITE
- LDA VICII+$10 ;GET X MSB
- AND #%11111101 ;CLEAR
- STA VICII+$10
- LDA #$A1
- STA VICII+2 ;SET X
- LDA #$22
- STA VICII+3 ;SET Y
- LDA #%00000010
- STA VICII+$1D ;EXPAND X
- LDA #%00000010
- ORA VICII+$15
- STA VICII+$15 ;TURN ON SPRITE
- LDA #$00
- PHA ;SET UP COLOR READ
- LOOP86 LDX #$0B ;CURSOR Y POS
- LDY #$0C ;CURSOR X POS
- CLC ;SET FOR PLOT
- JSR PLOT ;PLOT CURSOR
- PLA
- TAX
- LDA EGCOLR,X
- STA CCOLOR ;SET CURSOR COLOR
- STA VICII+$28 ;SET SPRITE COLOR
- INX
- CPX #$10 ;16 COLORS
- BNE LOOP85
- LDX #$00
- LOOP85 TXA
- PHA ;SAVE COLOR READ POSITION
- LDX #$00
- LOOP81 LDA EGTEXT,X ;GET LETTER
- JSR PRINT ;DISPLAY
- INX
- CPX #$10
- BNE LOOP81
- LDA #$0C ;MASTER TIME DELAY
- LOOP87 PHA
- LDA #$00 ;SECONDARY TIME DELAY
- LOOP84 PHA
- JSR GETIN ;GET CHAR FROM KEYBOARD
- CMP #$85 ;F1 KEY
- BNE LOOP83
- PLA ;GET MASTER TIME DELAY
- PLA ;GET TIME DELAY
- PLA ;GET COLOR READ
- LDA #$00
- STA VICII+$1D
- JMP REPLAY ;RE-START GAME
- LOOP83 PLA ;GET TIME DELAY
- TAX
- DEX ;COUNT DOWN TO 0
- TXA
- BNE LOOP84
- INC VICII+3 ;MOVE DOWN SCREEN
- LDA VICII+3 ;GET G/O SPRITE Y POS
- CMP #$F5 ;BOTTOM OF SCREEN?
- BNE LOOP88
- LDA #$22 ;TOP OF SCREEN
- LOOP88 STA VICII+3
- PLA
- TAX
- DEX ;COUNT DOWN TO 0
- TXA
- BNE LOOP87
- JMP LOOP86
- ;
- ;TITLE SCREEN
- ;
- TITLE LDA #$00 ;BORDER COLOR
- STA VICII+$20
- STA VICII+$21
- LDA #$0E ;LT. BLUE
- STA CCOLOR ;SET CURSOR COLOR
- LDA #$93 ;CLEAR SCREEN
- JSR PRINT
- LDA #$57 ;TOP LEFT CORNER
- STA SCREEN
- LDA #$58 ;TOP RIGHT CORNER
- STA SCREEN+$27
- LDA #$59 ;BOTTOM LEFT CORNER
- STA SCREEN+$3C0
- LDA #$5A ;BOTTOM RIGHT CORNER
- STA SCREEN+$3E7
- LDX #$00 ;DRAW TOP AND BOTTOM LINES
- LOOP90 LDA #$5D ;TOP LINE
- STA SCREEN+$01,X
- LDA #$5E ;BOTTOM LINE
- STA SCREEN+$3C1,X
- INX
- CPX #$26 ;38 CHARS
- BNE LOOP90
- LDA #>SCREEN ;GET MSB OF SCREEN MEM
- STA INDEX+1
- LDA #$28
- STA INDEX ;SECOND LINE FROM TOP
- LDX #$17 ;24 LINES
- LOOP91 LDY #$00
- LDA #$5B ;LEFT LINE
- STA (INDEX),Y
- LDY #$27
- LDA #$5C ;RIGHT LINE
- STA (INDEX),Y
- CLC
- LDA INDEX
- ADC #$28
- STA INDEX
- LDA INDEX+1
- ADC #$00 ;ADD CARRY
- STA INDEX+1
- DEX
- BNE LOOP91
- LDX #$00 ;PRINT TITLE INFO
- LOOP93 LDA TTEXT,X
- BNE LOOP92 ;PRINT OR PLOT? 0=PLOT
- INX
- LDA TTEXT,X
- PHA
- INX
- LDA TTEXT,X
- STX INDEX
- TAY
- PLA
- TAX
- CLC
- JSR PLOT ;PLOT CURSOR
- LDX INDEX
- INX
- JMP LOOP93
- LOOP92 JSR PRINT
- INX
- CPX #$C9
- BNE LOOP93
- LOOP94 JSR GETIN ;CHECK FOR F1 KEY
- CMP #$85
- BNE LOOP94
- RTS
- ;
- ;VARIABLES AND DATA USED BY SUBROUTINES
- ;
- RTSCN .BYTE 0 ;IRQ ROUTINE SCANER
- RTNUM .BYTE 0,0,0,0 ;ZERO ALL 4 REGS
- COLREG .BYTE 0 ;STORAGE FOR SPRITE TO SPRITE COLLISION REG
- MLOOP .BYTE 0 ;MISSLE LOOP
- TNKEXP .BYTE 0 ;TANK EXPLODING?
- FIRTGL .BYTE 0 ;MISSLE FIERED? 0=NO 1=YES
- NUMTNK .BYTE 0 ;# OF TANKS LEFT
- LEVEL .BYTE 0
- UFODIR .BYTE 0 ;DIRECTION OF UFO USED IN INITILIZATION
- XPOS .BYTE 0 ;X POSITION OF UFO USED IN INITILIZATION
- YPOS .BYTE 0 ;Y POSITION OF UFO USED IN INITILIZATION
- INITU1 .BYTE 0 ;UFO1 INITILIZED? 0=NO 1=YES
- U1DIR .BYTE 0 ;DIRECTION OF UFO1
- BD1 .BYTE 0 ;BOMB1 DROPED?
- INITU2 .BYTE 0 ;UFO2 INITILIZED?
- U2DIR .BYTE 0 ;UFO2 DIRECTION
- BD2 .BYTE 0 ;BOMB2 DROPED?
- INITB1 .BYTE 0 ;BOMB1 INITILIZED?
- B1FREQ .BYTE 0 ;BOMB1 FREQ
- INITB2 .BYTE 0 ;BOMB2 INITILIZED?
- B2FREQ .BYTE 0 ;BOMB2 FREQ
- EXPFRQ .BYTE 0 ;UFO EXPLOSION FREQ
- TNKSND .BYTE 0 ;TANK EXPLOSION FREQ
- SC .BYTE 0,0,0 ;6 DIGIT SCORE
- TIMER1 .BYTE 0,11,12,11,12,15,12,15,1
- TIMER2 .BYTE 0,$16,$16,$15,$15,$14,$14
- TIMER3 .BYTE 0,$16,$16,$16,$16,$16,$15,$15,$15,$15,$15,$14,$14,$14,$14,$14
- EXPCLR .BYTE 0,$11,$11,$12,$12,$15,$15,$01,$01,$0A,$0A,$02,$0A,$02,$0A,$02
- NAME .BYTE 'CHRSPR.DAT'
- SDATA .BYTE $93,$05,'SCORE:000000',$9F,' LEVEL:1',$1E,' TANKS:',$C8,$C8,$C8
- SPRTBL .BYTE $10,$11,$12,$12,$13,$13,$14,$14
- SPCOLR .BYTE $05,$01,$04,$0E,$01,$01,$01,$01
- EGTEXT .BYTE 'PRESS F1 TO PLAY'
- EGCOLR .BYTE $09,$02,$08,$0A,$01,$05,$0D,$01,$06,$0E,$03,$01,$0B,$0C,$0F
- .BYTE $01
- TTEXT .BYTE 0,3,12,96,97,98,99,100,101,102,103,103,103,102,101,100,99,98
- .BYTE 97,96,0,4,12,105,106,107,107,117,109,32,110,109,106,32,106,108,108
- .BYTE 106,105,111,0,5,12,112,113,110,110,117,114,32,113,115,113,32
- .BYTE 116,117,117,116,112,118,0,6,12,103,102,101,100,99,98,97,96,96,96
- .BYTE 97,98,99,100,101,102,103,0,9,15,150,'V1.0/100186'
- .BYTE 0,12,11,5,172,' 1986 '
- .BYTE 127,160,161,162,163,164,165,166,167,168,169,170,171
- .BYTE 0,15,2,159,'YOU ARE BEING INVADED BY THE COMMIES'
- .BYTE 0,18,11,'CAN YOU STOP THEM?',0,21,11,05,'PRESS F1 TO START'
- .END
-