›;SET VERTICAL BLANK VECTOR›SETVBV EQU $E45C›;VERTICAL BLANK TEXT VECTOR›XITVBV EQU $E462›;›; --------------------------------›; ZERO PAGE REGISTERS VARIABLES›; --------------------------------›;› ORG $CB›VAR1 DB 0›VAR2 DB 0›VAR3 DB 0›ADD1 DS 2›ADD2 DS 2›;›;›;›; --------------------------------›; PROGRAM STORAGE LOCATIONS›; --------------------------------›;› ORG $600›PVERT DB 0,0,0,0›MVERT DB 0,0,0,0›POLDVERT DB 0,0,0,0›MOLDVERT DB 0,0,0,0›;›;›;PLAYER TABLE ADDRESS TABLE›PLAYER› DB 0,0› DB 0,0› DB 0,0› DB 0,0›;›;MISSILE TABLE ADDRESS TABLE›MISSILE› DB 0,0›;›;ON/OFF SWITCH›SWITCH DB 0›;›;PLAYER IMAGE ADDRESS TABLE›IMAGE› DW IMAGES0› DW IMAGE1› DW IMAGE2› DW IMAGE3›;›;IMAGE DEFINITION TABLE›;›; IMAGES›IMAGE0 DB 0,0,0,0,0› DB 0,0,0,0,0›IMAGE1 DB 0,0,0,0,0› DB 0,0,0,0,0›IMAGE2 DB 0,0,0,0,0› DB 0,0,0,0,0›IMAGE3 DB 0,0,0,0,0› DB 0,0,0,0,0›;›;PLAYER SIZE TABLE›PSIZE DB 0,0,0,0›; -------------------------------›; INITIALIZE THE PM ROUTINE›; -------------------------------›;›; THIS IS THE BASIC ENTRY POINT› PLA›;›; SETUP THE VERTICAL BLANK INTERUPT›; JUMP VECTOR› LDX #HIGH VB› LDY #LOW VB› LDA #7› JSR SETVBV› RTS›;›; -------------------------------›; VERTICAL BLANK ROUTINE (PM)›; -------------------------------›;›VB› LDA SWITCH ;CHECK IF THE SWITCH IS ON› BNE VB1 ;IF NOT THEN JUST RETURN› JSR MPLOT ;CALL THE MISSILE PLOT ROUTINE› JSR PPLOT ;CALL THE PLAYER PLOT ROUTINE›VB1 JMP XITVBV›;›;›; THIS IS THE ROUTINE TO PLOT THE›; PLAYERS›PPLOT:› LDA #3 ;SET THE PLAYER COUNT› STA VAR1 ; AND SAVE IT IN VAR1›PPLOT0:› LDX VAR1 ;GET THE CURRENT PLAYER NUMBER› LDA PVERT,X ;GET THE NEW Y› COOR› STA VAR3 ; AND SAVE IT IN VAR3› LDY POLDVERT,X ;GET THE OLD Y COOR› STA POLDVERT,X ;STORE THE NEW Y COOR AS THE OLD› LDA PSIZE,X ;GET THE SIZE OF THE CURRENT PLAYER› STA VAR2 ; AND STORE IT IN VAR2› TXA ;MULTIPLY THE PLAYER NUMBER› ASL A ; BY 2› TAX› LDA PLAYER,X ;MOVE THE ADDRESS OF THE PLAYER› STA ADD1 ; TO THE TEMPORARY REGISTER (ADD1)› LDA PLAYER+1,X› STA ADD1+1› LDA IMAGE,X ;MOVE THE ADDRESS OF THE IMAGE› STA ADD2 ; TO THE TEMPORARY REGISTER (ADD2)› LDA IMAGE+1,X› STA ADD2+1›; THIS SECTION OF CODE IS USED›;TO ERASE THE PLAYER FROM HIS›;OLD POSITION› LDX VAR2 ;LOAD X WITH THE SIZE OF THE PLAYER› LDA #0›PPLOT1› STA (ADD1),Y ;STORE ZERO› DEY ;DECREMENT THE BYTE POSITION COUNTER› CPY #$FF› BEQ PPLOT2 ;IF EQUAL WE'VE HIT THE TOP OF THE PLAYER› DEX ;DECREMENT THE SIZE COUNTER› BPL PPLOT1 ;IF STILL POSITIVE ZERO THE NEXT BYTE›;›;THIS PART OF THE CODE IS USED TO›;PLOT THE PLAYER 'N HIS NEW LOCATION›PPLOT2› LDY VAR2 ;GET THE IMAGE OFF› SET› LDA (ADD2),Y ;GET THE NEXT IMAGE BYTE› LDY VAR3 ;GET THE PLAYER TABLE OFFSET› STA (ADD1),Y ;PUT THE IMAGE BYTE IN THE PLAYER TABLE› DEY ;DECREMENT THE PLAYER TABLE OFFSET› STY VAR3 ;STORE THE NEW PLAYER TABLE OFFSET› CPY #$FF ;IF THE NEXT BYTE WOULD BE OFF THE END› ;OF THE PLAYER THEN EXIT THE PLOT LOOP› BEQ PPLOT3› DEC VAR2 ;DECREMENT THE IMAGE OFFSET› BPL PPLOT2 ;IF WE HAVE NOT REACHED THE END THEN› ;LOOP AGAIN TO PLOT ANOTHER IMAGE BYTE›PPLOT3› DEC VAR1 ;DECREMENT THE PLAYER COUNT› BPL PPLOT0 ;IF THERE IS STILL ANOTHER PLAYER THEN› ;LOOP AGAIN TO PLOT THE NEXT PLAYER› RTS›;›;›MPLOT› LDX #3 ;LOAD X WITH THE MISSILE COUNT› LDA MISSILE ;PLACE THE ADDRESS OF THE MISSILE TABLE› ;IN THE TEMPORARY ADDRESS REGISTER› STA ADD1› LDA MISSILE+1› STA ADD1+1›MPLOT0› LDY MOLDVERT,X ;GET THE OLD MISSILE LOCATION› LDA OFFTABLE,X ;TURN THE OLD IMAGE OFF› AND (ADD1),Y› STA (ADD1),Y› LDY MVERT,X ;GET THE NEW MISSILE LOCATION› LDA ONTABLE,X ;TURN THE NEW MISSILE IMAGE ON› ORA (ADD1),Y› STA (ADD1),Y› TYA ;MOVE THE NEW LOCATION TO THE OLD› ;MISSILE LOCATION TABLE FOR NEXT TIME› STA MOLDVERT,X› DEX ;DECREMENT THE MISSILE COUNTER› BPL MPLOT0 ;IF THERE IS STILL ANOTHER MISSILE› ;THEN LOOP TO PLOT THE NEXT MISSILE› RTS›;›ONTABLE DB $01,$0C,$20,$C0›OFFTABLE DB $FC,$F2,$CF,$2F›;›;›; --------------------------------›; DUMMY ROUTINE (IGNORE)›; --------------------------------›;›START› JMP ($0A)› END START›