.PAGE 'WES001' ;+++++++++++++++++++++++++++++++++ ; MAIN ROUTINE ;+++++++++++++++++++++++++++++++++ *=$E000 ; ;---------- POWER ON START -------------- SSTART SEI ;IRQ DISABLE CLD LDX #$FF TXS ;STACK INITIALIZE IOINIT ; ;-------- VIC INITIALIZE LDX #46 SETVIC LDA VICTBL,X STA VIC,X DEX BPL SETVIC ; ;-------- SID INITIALIZE LDX #24 SETSID LDA SIDTBL,X STA SID,X DEX BPL SETSID ; ;-------- ZERO ,2 ,3 PAGE INITIALIZE LDX #0 TXA RAMINI STA $0002,X STA $0200,X STA $0300,X INX BNE RAMINI ;------------------------------------------------------- ; GAME START ;------------------------------------------------------- MAIN JSR TITCRT ;PROGRAM START SETTING SUB CALL JSR SETIN1 ;PROGRAM START SETTING SUB CALL LOOPST JSR SETIN2 ;FLAG SETTING DIEST JSR SCRSET ;SCREEN SETTING JSR SET06 LDA #$1F STA SIGVOL LDA #01 JSR SOUND LDA SPSPCL ;--------------- PROGRAM LOOP START --------------- CICLE ;CICLE DECREMENT LDA SCROLY ;SYNC WITH RASTER BPL CICLE JSR SET7F8 ;USED DBG LDA SPSPCL ;GET COLLISION STA COLLSS ;SP -- SP LDA SPBGCL ;SP -- BAK STA COLLSC ; ;======= TIMER LOADING ======= TIMER INC TIMSL ;GAME START TO 20 SET OF SLOW LDA TIMSL BNE TIM2 INC TIMER1 LDA #5 CMP TIMER1 BNE TIM2 LDA #02 JSR SOUND DEC SPUP ;SPEED UP FLAG SET ACTIVE 'FF' TIM2 LDA TIMER1 CMP #$10 BCC TIM3 JSR WOLMS TIM3 JSR PLBUL ;PLAYER BEEM JSR PLAYER JSR WOLMS ;ENEMYS MOVE ROUTINE JSR ENEMM ;ENEMYS SET JSR COLLCH ;COLLISION CHECK ROUTINE JSR EXPLO ;EXPLO SUB JSR SOUNDM ;MUSIC SUB ;======= PLAYER DIE AND SCREEN CLEAR PROCESS ========= DIE LDA DIW0 ;PLAYER OF DIE TO GAME END TEST CMP #DIES BEQ DIE2 LDA CLW ;WOR ALL KILL CHECK BNE CICLE LDA DIW0 BMI DIE2 JMP BONOUT DIE2 DEC PLRST ;GAME END TEST BNE DIEST JMP REPLAY ;PLAYER NO REMAIND TO REPLAY ROUTINE ;---------------------------------------------------- ; KEYBOARD DATA (F1) READ ROUTINE ;---------------------------------------------------- RDFKEY LDX #$FF STX CIDDRA ;SET DATA DIRECTION A INX ;X=0 STX CIDDRB ;SET DATA DIRECTION B LDY #00 LDX #$FE ;COLUMN 0 JSR RDROW CPX #$EF ;ROW 4 F1 ? BNE RDF090 ;YES INY ;PUSH F1 KEY RDF090 RTS ;---------------------------------------------------- ; KEYBOARD DATA (A,L,;,.,P)READ ;---------------------------------------------------- RDKEY LDX #$FF STX CIDDRA ;SET DATA DIRECTION A INX ;X=0 STX CIDDRB ;SET DATA DIRECTION B RDK010 LDA #$1F ;MAKE BIT SAME JOY. LDX #$DF ;COLUMN 5 JSR RDROW CPX #$FB ;ROW 2 L ? BNE RDK020 ;NO AND #$FB ;LEFT SET BNE RDK080 RDK020 CPX #$FD ;ROW 1 P ? BNE RDK030 ;NO AND #$FE ;UP SET BNE RDK080 RDK030 CPX #$EF ;ROW 4 . ? BNE RDK040 ;NO AND #$FD ;DOWN SET BNE RDK080 RDK040 LDX #$FD ;COLUMN 1 JSR RDROW CPX #$FB ;ROW 2 A ? BNE RDK050 ;NO AND #$EF ;FIRE BIT ON! BNE RDK080 RDK050 LDX #$BF ;COLUMN 6 JSR RDROW CPX #$FB ;ROW 2 ;? BNE RDK080 ;NO AND #$F7 ;RIGHT SET RDK080 STA SCANFL RDK090 JMP RDJOY ;---------------------------------------------------- ; KEYBOARD ROW READ TO (X-REG) ;---------------------------------------------------- RDROW STX CIAPRA ;COLUMN OUT RDR010 LDX CIAPRB ;ROW INPUT CPX CIAPRB BNE RDR010 RTS ;---------------------------------------------------- ; JOYSTICK DATA READ ROUTINE ;---------------------------------------------------- RDJOY LDX #00 STX FIRE STX CIDDRA STX CIDDRB ;SET DATA DIRECTION RDJOY0 LDA CIAPRB CMP CIAPRB BNE RDJOY0 AND SCANFL RDJ010 TAY ;SAVE BIT DATA AND #$10 ;FIRE PRESSED? BNE RDJ020 ;NO LDA #$80 STA FIRE ;YES FIRE BIT ON BNE RDJ060 ;JMP RDJ020 TYA AND #%00000010 ;DOWN ? BNE RDJ030 ;NO LDX #DOWN BNE RDJ060 ;JMP RDJ030 TYA AND #%00000001 ;UP ? BNE RDJ040 ;NO LDX #UP BNE RDJ060 ;JMP RDJ040 TYA AND #%00000100 ;LEFT ? BNE RDJ050 ;NO LDX #LEFT BNE RDJ060 ;JMP RDJ050 TYA AND #SP3SET ;RIGHT? BNE RDJ060 ;NO LDX #RIGHT RDJ060 STX INDRCF RTS ;*--------------------------------------------------* ;* WAIT A FEW SEC. (16MS * X) * ;*--------------------------------------------------* WAIT LDA SCROLY ;GET SYNC BPL WAIT TYA PHA TXA PHA JSR SOUNDM PLA TAX PLA TAY WAIT10 LDA SCROLY ; BMI WAIT10 DEX BNE WAIT RTS ;*--------------------------------------------------* ;* CLEAR SCREEN & COLOR * ;*--------------------------------------------------* CLRCRT LDX #0 CLR010 LDA KOLOR ;CHRACTER COLOR SET STA COLRAM,X STA COLRAM+$100,X STA COLRAM+$200,X STA COLRAM+$300-24,X LDA #$00 ;SPACE STA SCREEN,X STA SCREEN+$100,X STA SCREEN+$200,X STA SCREEN+$300-24,X INX BNE CLR010 CLR020 CLR030 RTS SET7F8 LDX #8 S7F010 LDA SV07F8-1,X STA $07F8-1,X DEX BNE S7F010 LDX #8 S7F020 LDA SV07F8-1,X CMP $07F8-1,X BNE SET7F8 DEX BNE S7F020 RTS ;*--------------------------------------------------* ;* CHROUT : CHRACTER OUT .X(LOW) .Y(HIGH) * ;*--------------------------------------------------* CHROUT STX WK0 STY WK0+1 CHR010 LDY #00 STY WK5 ;OUT CHR. INDEX LDA (WK0),Y STA WK2 ;OUT ADDRESS LOW INY LDA (WK0),Y STA WK3 ;OUT ADDRESS HIGH CHR020 INY LDA (WK0),Y CMP #$FF BEQ CHR090 ;EXIT CMP #$FE BEQ CHR030 ;CHANGE OUT ADDRESS CMP #$FD BEQ CHR040 ;SELECT NEXT LINE STY WK4 ;Y SAVE LDY WK5 ;CHR. OUT INDEX STA (WK2),Y ;CHR. OUT INC WK5 LDY WK4 ;Y GET LDA WATCHR ;DISPLAY WAIT? BEQ CHR020 ;NO LDX #10 JSR WAIT JMP CHR020 CHR030 INY CLC ;(WK0,WK0+1)=Y+(WK0,WK0+1) TYA ADC WK0 STA WK0 LDA WK0+1 ADC #0 STA WK0+1 JMP CHR010 CHR040 CLC LDA WK2 ADC #40 STA WK2 LDA WK3 ADC #00 STA WK3 LDA #00 STA WK5 BEQ CHR020 ;JMP CHR090 LDA #00 STA WATCHR RTS ;------------------------- ; SCREEN MEIRO SETING ; (NAME : SCRSET) ;------------------------- ; ; MEMORY NAME YAKUWARI ; POINX ...............CENTER X LINE OF BIC 1CHR ; POINY ...............CENTER Y LINE OF BIC 1CHR ; COUNT ...............TATE OR YOKO COUNT OF 1CHR ; ADLS ................SCREEN NO (2 BYTE) LOW (+1 = HIGH) ; SCRSET LDA #CYAN STA KOLOR JSR CLRCRT ;CLEAR SCREEN LDX #TITLE ; HIGH JSR CHROUT ;TITLE SCREEN OUT LDA PATURN ;SCREEN SET AND #03 ;SCREEN1 ? ASL A TAX LDA SCRTBL,X ;SCREEN TABLE ADDRESS TO 'X,Y INDEC' TABLE STA XINDEC LDA SCRTBL+1,X STA XINDEC+1 SCR010 LDA #0 STA WK9 STA POINY STA POINX SCR011 LDY WK9 LDA (XINDEC),Y CMP #$19 ;YOKO CHR ? BNE *+5 JSR SCRYOK ;YES CMP #$18 ;TATE CHR ? BNE *+5 JSR SCRTAT ;YES CMP #$1A ;KADO CHR ? BNE *+5 JSR SCRKAD ;YES INC WK9 ;CHENG POINTER LDA #3 CLC ;X ADDRESS CHENG ADC POINX STA POINX CMP #39 ;X LIMIT ? BNE SCR011 LDA #0 STA POINX LDA #3 CLC ;Y ADDRESS CHENG ADC POINY STA POINY CMP #$15 ;Y LIMIT ? BNE SCR011 LDA #0 JSR POIOUT LDX PLRST STX DISCHR LDA #30 STA DISX LDA #24 STA DISY JSR DISPL LDX #<SCRN2 LDY #>SCRN2 STX WK0 STY WK1 LDX #3 JSR SC000 RTS SCRTBL .WORD SCREN1,SCREN2,SCREN3,SCREN4 ;- SCRYOK LDX #0 LDA POINY CLC ADC #2 STA DISY TXA CLC ADC POINX STA DISX LDA #$2B STA DISCHR JSR DISPL INX CPX #3 BNE SCRYOK+2 LDA #5 RTS SCRTAT LDX #0 LDA POINX STA DISX TXA CLC ADC POINY STA DISY LDA #$2A STA DISCHR JSR DISPL INX CPX #3 BNE SCRTAT+2 LDA #5 RTS SCRKAD JSR SCRYOK JSR SCRTAT LDA #2 CLC ADC POINY STA DISY LDA POINX STA DISX LDA #$2C STA DISCHR JSR DISPL RTS ; ;----------------- SETIN 1 ,2 ---------------- SETIN1 LDY #0 STY SCORE STY SCORE+1 STY SCORE+2 STY PATURN STA XTRA LDA #3 STA PLRST LDA #BLUE LDX #7 STA SP0COL,X DEX BPL *-4 RTS ;:::::::::: SETIN 2 SETIN2 LDX #0 STX SPENA SET21 LDA #$FF STA DIW0,X INX CPX #8 BNE SET21 LDY #0 STY TIMER1 STY TIMSL STY SPUP INC PATURN LDX PATURN CPX #04 BCC *+4 LDX #04 LDA EN1TBL-1,X STA DIWS LDA EN2TBL-1,X STA KABAS LDA EN3TBL-1,X STA THFTS LDA EN4TBL-1,X STA GANOS LDA EN5TBL-1,X STA BASAS LDA ENATBL-1,X STA CLW RTS EN1TBL .BYTE 4,5,6,6 EN2TBL .BYTE 3,4,5,6 EN3TBL .BYTE 2,4,6,6 EN4TBL .BYTE 1,2,3,4 EN5TBL .BYTE 0,1,0,2 ENATBL .BYTE 10,16,20,24 SET06 LDA #$E6 ;PLAYER ADDRESS AND CHR SET STA SV07F8 STA $07F8 LDA #LEFT STA PLDRF LDA #SP0SET STA MSIGX LDA #55 STA SP0X LDA #171 STA SP0Y LDA #$FD STA SV07F8+7 LDX #$FF ;PLAYER BEEM RESET STX DIW7 INX STX DIW0 ;PLAYER ALIVE SET STX PLDRCF LDA SPENA ORA #SP0SET AND #SP7RES STA SPENA RTS ONETBX .BYTE 53,77,101,125,149,173,197,245 ONETBY .BYTE 75,99,123,147,171,195,123,171 BONOUT LDA #00 STA SPENA LDX #<BONMSG LDY #>BONMSG JSR CHROUT LDA #07 JSR SOUND LDA #$30 JSR POIOUT LDX #$00 JSR WAIT JMP LOOPST BONMSG .WORD SCREEN+280+12 .BYTE $0C,$19,$18,$1F,$1D .BYTE $00 .BYTE $04,$01,$01,$01,$FF REPLAY LDX #02 REP010 LDA HSCORE,X CMP SCORE,X BCC REP020 BNE REP030 DEX BPL REP010 REP020 LDA SCORE STA HSCORE LDA SCORE+1 STA HSCORE+1 LDA SCORE+2 STA HSCORE+2 LDX #<SCRN2 LDY #>SCRN2 STX WK0 STY WK1 LDX #3 JSR SC000 REP030 LDA #00 STA SIGVOL INC WATCHR LDX #<RPMSG LDY #>RPMSG JSR CHROUT LDX #$50 JSR WAIT JMP MAIN RPMSG .WORD SCREEN+292 .BYTE $11,$00,$0B,$00,$17,$00,$0F,$00,$00 .BYTE $19,$00,$20,$00,$0F,$00,$1C,$FF ;----------------------------------------- ; SCORE UP ROUTINE ;----------------------------------------- POIOUT CLC SED ADC SCORE+1 STA SCORE+1 LDA SCORE+2 ADC #$00 STA SCORE+2 CLD LDX #<SCRN1 ;SCORE DISPLAY LDY #>SCRN1 STX WK0 STY WK1 LDX #0 SC000 LDY #5 SC010 LDA SCORE,X AND #$0F CLC ADC #1 STA (WK0),Y DEY LDA SCORE,X LSR A LSR A LSR A LSR A CLC ADC #1 STA (WK0),Y ;SCORE DISPLAY INX DEY BPL SC010 LDA SCORE+2 CMP #$02 BCC POI999 LDA XTRA BNE POI999 INC XTRA INC PLRST LDX PLRST STX SCREEN+960+30 LDA #07 JSR SOUND POI999 RTS TITCRT LDA #0 STA SPENA LDA #BLUE STA KOLOR JSR CLRCRT ;TITLE DISPLAY LDA #WHITE STA BGCOL0 STA EXTCOL LDY #>TITBL LDX #<TITBL JSR CHROUT LDX #04 TIC000 TXA ASL A TAY LDA #215 STA DIW1,X STA SP1X,Y LDA TICTBL,X STA SP1Y,Y LDA TIPTBL,X STA $7F9,X LDA SHCTBL,X STA SP1COL,X DEX BPL TIC000 LDA #00 STA MSIGX LDA #%00111110 STA SPENA TIC010 LDA SCROLY BPL TIC010 TIC020 LDA SCROLY BMI TIC020 INC TIMER1 LDA TIMER1 AND #$1F BNE TIC060 LDY #04 TIC030 TYA ASL A TAX LDA DIW1,Y BEQ TIC040 INC SP1X,X LDA SP1X,X CMP TICMAX,Y BCC TIC050 LDA #$00 STA DIW1,Y CPY #03 BEQ TIC050 TYA TAX INC $07F9,X BNE TIC050 ;JMP TIC040 DEC SP1X,X LDA SP1X,X CMP #215 BCS TIC050 STA DIW1,Y CPY #03 BEQ TIC050 TYA TAX DEC $07F9,X TIC050 DEY BPL TIC030 TIC060 JSR RDFKEY CPY #0 BEQ TIC010 LDA #0 STA BGCOL0 LDA #BLUE STA EXTCOL RTS TICTBL .BYTE 82,106,130,154,178 TIPTBL .BYTE $E9,$ED,$F1,$F5,$F9 TICMAX .BYTE 215+4,215+5,215+4,215+5,215+4 .END