├── G2_BLANK.SSD ├── Galaforce2.code-workspace ├── Galaforce2BBC.ssd ├── LoadGam ├── Master.mak ├── Prebuild.mak ├── README.md ├── bas_extra ├── L.bas ├── L.bas.txt ├── MASTER.bas └── MASTER.bas.txt ├── bas_src ├── AbsWork.bas ├── CONST.bas ├── DataFiles.bas ├── Flags.bas ├── High.bas ├── MODULE.bas ├── Main.bas ├── MainB.bas ├── ObjPro.bas ├── ObjPro2.bas ├── Object1.bas ├── Object2.bas ├── Object3.bas ├── PatDat1.bas ├── PatDat2.bas ├── PatDat3.bas ├── PatIn1.bas ├── Rout1.bas ├── Rout2.bas ├── SUBR1.bas ├── SceLGam.bas ├── Sect1.bas ├── Sect2.bas ├── SpGra.bas ├── Sprites.bas ├── Sprites2.bas ├── StartUp.bas ├── Subr1B.bas ├── Subr1C.bas ├── Subr2.bas ├── Vectors1.bas ├── Vectors2.bas └── ZpWork.bas ├── make.bat ├── object ├── MOBJ.o └── Section │ ├── Bomb.o │ ├── CHARDAT.o │ ├── Digits.o │ ├── Grub.o │ ├── ObAliens.o │ ├── ObArrow.o │ ├── ObBigAl.o │ ├── ObExpl.o │ ├── ObFlag.o │ ├── ObMiniShip.o │ ├── ObMyShip.o │ ├── OtSpr1.o │ └── SpFont.o ├── original_image ├── $.!ainfo ├── $.!boot ├── $.Clearam ├── $.HIbasic ├── $.Mod ├── $.Obj ├── $.ObjTubeIO ├── $.RndTest └── $.TransIO ├── screenshot.png └── src ├── AbsWork.asm ├── CONST.asm ├── DataFiles.asm ├── Flags.asm ├── High.asm ├── MODULE.asm ├── Main.asm ├── MainB.asm ├── ObjPro.asm ├── ObjPro2.asm ├── Object1.asm ├── Object2.asm ├── Object3.asm ├── PatDat1.asm ├── PatDat2.asm ├── PatDat3.asm ├── PatIn1.asm ├── Rout1.asm ├── Rout2.asm ├── SUBR1.asm ├── SceLGam.asm ├── Sect1.asm ├── Sect2.asm ├── SpGra.asm ├── Sprites.asm ├── Sprites2.asm ├── StartUp.asm ├── Subr1B.asm ├── Subr1C.asm ├── Subr2.asm ├── Vectors1.asm ├── Vectors2.asm └── ZpWork.asm /G2_BLANK.SSD: -------------------------------------------------------------------------------- 1 | Galaforc!Boot $e2 3 CH."L" 2 | 3 | Not found 4 | >*. 5 | >*TYPE !BOOT 6 | 7 | Open 8 | >CLOSE*SPOOL 9 | -------------------------------------------------------------------------------- /Galaforce2.code-workspace: -------------------------------------------------------------------------------- 1 | { 2 | "folders": [ 3 | { 4 | "path": "." 5 | } 6 | ] 7 | } -------------------------------------------------------------------------------- /Galaforce2BBC.ssd: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/KevEdwards/Galaforce2BBC/31d18999f05a854f773cb87a2773c76afcb52f0c/Galaforce2BBC.ssd -------------------------------------------------------------------------------- /LoadGam: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/KevEdwards/Galaforce2BBC/31d18999f05a854f773cb87a2773c76afcb52f0c/LoadGam -------------------------------------------------------------------------------- /Master.mak: -------------------------------------------------------------------------------- 1 | \\ 2 | \\ Galaforce 2 3 | \\ 4 | \\ (C) Kevin Edwards 1988-2018 5 | \\ 6 | 7 | objstrt%=&E00 8 | objend%=&5800 9 | modu%=&400 10 | dowsize%=&B00 11 | sceaddr%=&800+modu%+(objend%-objstrt%)+dowsize% 12 | 13 | INCLUDE "src\CONST.asm" 14 | INCLUDE "src\ZPWORK.asm" 15 | INCLUDE "src\ABSWORK.asm" 16 | 17 | \\ Module Code block ( &900 - &CFF ) 18 | ORG &900 19 | INCLUDE "src\Module.asm" 20 | 21 | \\ Main Code block - source files assembled in the same order as the original 22 | ORG objstrt% 23 | INCLUDE "src\Sprites.asm" 24 | INCLUDE "src\Sprites2.asm" 25 | INCLUDE "src\Main.asm" 26 | INCLUDE "src\MainB.asm" 27 | INCLUDE "src\Rout1.asm" 28 | INCLUDE "src\Rout2.asm" 29 | INCLUDE "src\High.asm" 30 | INCLUDE "src\Subr1.asm" 31 | INCLUDE "src\Subr1B.asm" 32 | INCLUDE "src\Subr1C.asm" 33 | INCLUDE "src\Subr2.asm" 34 | INCLUDE "src\DataFiles.asm" 35 | INCLUDE "src\Flags.asm" 36 | INCLUDE "src\ObjPro.asm" 37 | INCLUDE "src\ObjPro2.asm" 38 | INCLUDE "src\Object1.asm" 39 | INCLUDE "src\Object2.asm" 40 | INCLUDE "src\Object3.asm" 41 | INCLUDE "src\SpGra.asm" 42 | INCLUDE "src\PatIn1.asm" 43 | INCLUDE "src\PatDat1.asm" 44 | INCLUDE "src\PatDat2.asm" 45 | INCLUDE "src\PatDat3.asm" 46 | INCLUDE "src\Sect1.asm" 47 | INCLUDE "src\Sect2.asm" 48 | INCLUDE "src\Vectors1.asm" 49 | INCLUDE "src\Vectors2.asm" 50 | INCLUDE "src\StartUp.asm" ; Must be the last file! 51 | 52 | objcodeend = P% 53 | PRINT"Code start = ",~objstrt% 54 | PRINT"End of code = ",~last-1 55 | PRINT"Length = ",~last-objstrt%," (",last-objstrt%,") bytes" 56 | PRINT"Bytes left = ",~objend%-last," (",objend%-last,") bytes" 57 | 58 | 59 | \\ Load Music driver binary file 60 | \\ OSCLI" LOAD MOBJ "+STR$~(&800+modu%+(&4400-objstrt%)) 61 | ORG &4400 62 | INCBIN "object\MOBJ.o" 63 | 64 | 65 | \\ Output Object code binaries to the image 66 | SAVE "Mod", &900, &900 + modu%, &900, &900 67 | 68 | PRINT "Saving Obj ", ~objstrt%, ~objcodeend, ~gogo, ~objstrt% 69 | SAVE "Obj", objstrt%, objcodeend, gogo, objstrt% 70 | 71 | \\ Save Main Basic Loader ( gets tokenised forst ) 72 | PUTBASIC "bas_extra\L.bas.txt" ,"$.L" 73 | 74 | \\ Copy the Loader into the disk image - generated by the pre-build step 75 | PUTFILE "LoadGam", "$.LoadGam", &700, &700 76 | 77 | \\ Loading screen 78 | \\ PUTFILE "src\GALASCR.IMG", "$.GALASCR", &5800 79 | -------------------------------------------------------------------------------- /Prebuild.mak: -------------------------------------------------------------------------------- 1 | 2 | \\ Galaforce 2 Prebuild process 3 | 4 | \\ Build LoadGam - this is the code responsible for loading the main game code 5 | INCLUDE "src\SceLGam.asm" 6 | 7 | \\ Save to final disk Image 8 | PRINT"Saving LoadGam", ~loadaddr, ~P% 9 | SAVE "LoadGam", loadaddr, P% 10 | 11 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # Galaforce 2 ( BBC Micro ) 2 | 3 | **Version V1.00** 4 | 5 | (c) Kevin Edwards 1987-2021 6 | 7 | ![Screenshot](screenshot.png) 8 | 9 | 40 years ago, on the 1st December 1981, the BBC Micro was launched. Demand was very high and Acorn struggled to make enough machines, however, by early 1982 things started to improve. For many school-children, the BBC Micro made a long lasting impression, and for many of us it also shaped our future careers. Mine was making video games, something that I was still doing until recently when I decided to retire. 10 | 11 | I have decided to mark this occasion by releasing the entire buildable source code for 'Galaforce 2 ( Aliens' Revenge )' to preserve it for the future. 12 | 13 | In 1987 I began writing this sequel to the successful 'Galaforce' shoot-em-up game for the BBC Micro and Electron home computers. Galaforce 2 was published by Superior Software in 1988 on a compilation tape/disc with three other titles ( Play It Again Sam 6 ). Sadly, many people didn't know of this games existence as it didn't get the publicity that the first one was fortunate enough to have. Also, the BBC Micro was in decline and very few full price games were around as compilation titles dominated the charts. As a consequence sales were much lower. 14 | 15 | The game is written entirely in 6502 assembly language. The BBC Micro had only 32K Bytes of RAM so software had to be carefully crafted to fit into memory. 16 | 17 | The original BBC Micro Galaforce was missing important game-play elements that I was unable to add due to lack of memory. It used screen MODE 2 which took away 20K of the 32K RAM available - and the OS took a bit more away too! So to implement these important features I changed the game to use MODE 5 which had the same screen resolution as MODE 2, but had only 4 colours available compared with 16. This allowed me to make the following improvements:- 18 | 19 | * Pick-Up Capsules ( Good and bad ones ) 20 | * Two-player mode ( Not at the same time! ) 21 | * Level / Stage 'Boss' battles 22 | * More Active sprites being rendered 23 | * More Sprites Graphics 24 | * More Levels/Patterns 25 | * Narrow / Widescreen display mode support 26 | * Level Select / Continue mode 27 | * New Music tracks ( By Martin Galway ) 28 | 29 | Originally, the BBC BASIC in-line assembler was used to build the code. However, I decided to make the codebase assemble using 'BeebAsm' on a PC. The source code needed to be re-worked a bit to achieve this. I had to de-tokenizing all of the BBC BASIC files and adapt the code to use BeebAsm friendly directives / commands. This now allows Visual Code or other IDEs to be used to build the code in a nice development environment. 30 | 31 | The source present here is for the BBC Micro version of the game. I had slightly different code for the Acorn Electron. I hope to make the Electron version available in the future when I get more time. 32 | 33 | I have changed the game's title page to reflect the Beeb's 40th Anniversary, but apart from that it's the original game as released. 34 | 35 | I hope it is useful to people who have an interest in 6502 assembly language programming and to those who would like to know how games were made in the 1980s. 36 | 37 | Happy Birthday, BBC Micro, and thank you to Martin Galway and all the people at Acorn Computers and Superior Software for making this game possible! 38 | 39 | An even bigger thank you to Pete Davidson, my Computer Studies teacher, who encouraged and taught me so much about programming, especially 6502 machine code. 40 | 41 | If you find any of my retro work interesting or useful please support me with a hot, fresh Ko-fi (https://ko-fi.com/kevedwardsretro) 42 | 43 | 44 | # Build Tools required ( PC ) 45 | 46 | To build the game you first need to install the following tools:- 47 | 48 | * [beebasm](https://github.com/stardot/beebasm) 49 | 50 | 51 | # Build Steps ( PC ) 52 | 53 | Run 'make.bat' from a command prompt whilst in the project's root folder. This will assemble the code and output 'Galaforce2BBC.ssd' in the same folder. This disk image file can be loaded by many different BBC Micro Emulators, including B-em and BeebEm. 54 | 55 | Alternatively, you could use 'Visual Studio Code' with the 'Beeb VSC' extension. I have also included the required workspace and .json files required to do this. 56 | 57 | * [beeb-vsc](https://marketplace.visualstudio.com/items?itemName=simondotm.beeb-vsc) 58 | 59 | 60 | # Additional Notes 61 | 62 | You can find me on Twitter @KevEdwardsRetro where I ramble on about all kinds of retro computer and video game things. Please drop by and say hello. 63 | 64 | Galaforce is pronounced 'Ga-luh-faws' 65 | 66 | Many thanks to Rich Talbot-Watkins for his great work on BeebAsm and Simon M for the wonderful Beeb VSC. 67 | 68 | Thank you for reading this far. 69 | -------------------------------------------------------------------------------- /bas_extra/L.bas: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/KevEdwards/Galaforce2BBC/31d18999f05a854f773cb87a2773c76afcb52f0c/bas_extra/L.bas -------------------------------------------------------------------------------- /bas_extra/L.bas.txt: -------------------------------------------------------------------------------- 1 | 0REM SAVE"$.Galaforce2.L" 2 | 10REM BBC Loader 3 | 20REM (c) Kevin Edwards 1988 4 | 30*TV 255 1 5 | 40MODE5 6 | 50VDU23,1,0;0;0;0;28,0,31,19,26 7 | 60*RUN LoadGam 8 | -------------------------------------------------------------------------------- /bas_extra/MASTER.bas: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/KevEdwards/Galaforce2BBC/31d18999f05a854f773cb87a2773c76afcb52f0c/bas_extra/MASTER.bas -------------------------------------------------------------------------------- /bas_extra/MASTER.bas.txt: -------------------------------------------------------------------------------- 1 | 0REM SAVE"$.Galaforce2.Master" 2 | 10REM 6502 Tube version 3 | 20REM (c) Kevin Edwards, 28th July 1987 4 | 30REM Galaforce 3 Master, created on 2nd July 2018 5 | 40MODE7 6 | 50*FX 12 2 7 | 60 8 | 70PG%=PAGE:TIME=0 9 | 80objstrt%=&E00 10 | 90objend%=&5800 11 | 100modu%=&400 12 | 110dowsize%=&B00 13 | 120sceaddr%=&800+modu%+(objend%-objstrt%)+dowsize% 14 | 130IF(sceaddr% AND &FF)<>0 sceaddr%=(sceaddr% AND &FF00)+&100 15 | 140 16 | 150PRINTCHR$(134)"Galaforce 3 Ver 1.00 /";CHR$(131)"BBC version" 17 | 160A%=234:X%=0:Y%=&FF:Z%=(USR(&FFF4) AND &FF00)/&100 18 | 170IF Z%=0 OR HIMEM<>&B800 PRINT'"Re-boot with 6502 2nd processor running"'"Hi-Basic !":VDU7:END 19 | 180 20 | 190REM Link 'one pass' source files 21 | 200 22 | 210OSCLI"LOAD Const "+STR$~(sceaddr%) 23 | 220PAGE=sceaddr%:GOSUB 0 24 | 230OSCLI"LOAD ZpWork "+STR$~(sceaddr%) 25 | 240PAGE=sceaddr%:GOSUB 0 26 | 250OSCLI"LOAD AbsWork "+STR$~(sceaddr%) 27 | 260PAGE=sceaddr%:GOSUB 0 28 | 270PRINT:VDU133:PRINTSTRING$(33,CHR$(255)) 29 | 280VDU28,0,24,39,6 30 | 290 31 | 300REM Link 'two pass' source files 32 | 310 33 | 320FOR pass=4 TO 6 STEP 2 34 | 330P%=&900:O%=&800 35 | 340PRINT:FORL=1TO2:VDU141,129:PRINT"Pass = ";pass:NEXT 36 | 350READfile$ 37 | 360IF file$="THE-END" RESTORE:GOTO 400 38 | 370OSCLI"LOAD "+file$+" "+STR$~(sceaddr%) 39 | 380PAGE=sceaddr%:GOSUB 0 40 | 390GOTO 350 41 | 400NEXT pass 42 | 410 43 | 420REM Display info and save 'Obj' 44 | 430 45 | 440IF Y%<>Z% VDU7:PRINT'"Phase error!":END 46 | 450PRINT'"Assembly time = ";TIME/100;" seconds" 47 | 460PRINT"Symbol space free = &";~HIMEM-!2 AND &FFFF;" (";HIMEM-!2 AND &FFFF;") bytes" 48 | 470IF (HIMEM-(!2 AND &FFFF))<&1000 PRINTCHR$130"Symbol space low!" 49 | 480PRINT"Code start = &";~objstrt% 50 | 490PRINT"End of code = &";~last-1 51 | 500PRINT"Length = &";~last-objstrt%;" (";last-objstrt%;") bytes" 52 | 510PRINT"Bytes left = &";~objend%-last;" (";objend%-last;") bytes" 53 | 520 54 | 530OSCLI"LOAD MOBJ "+STR$~(&800+modu%+(&4400-objstrt%)) 55 | 540PROCsave 56 | 550IFINKEY(-1)PRINTCHR$7"Variables retained":END 57 | 570END 58 | 580 59 | 590DEFPROCsave 60 | 600PRINT"Saving 'Obj' and 'Mod'" 61 | 610OSCLI"SAVE Mod 800+"+STR$~(modu%)+" FFFF0900 FFFF0900" 62 | 620OSCLI"SAVE Obj "+STR$~(&800+modu%)+" "+STR$~(O%)+" "+STR$~(gogo)+" "+STR$~(objstrt%) 63 | 630ENDPROC 64 | 640 65 | 650DATA Module,Sprites,Sprites2,Main,MainB 66 | 660DATA Rout1,Rout2,High 67 | 670DATA Subr1,Subr1B,Subr1C,Subr2,DataFiles,Flags 68 | 680DATA ObjPro,ObjPro2,Object1,Object2,Object3 69 | 690DATA SpGra,PatIn1,PatDat1,PatDat2,PatDat3,Sect1,Sect2,Vectors1,Vectors2 70 | 700DATA StartUp,"THE-END" 71 | 710DATA FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF 72 | -------------------------------------------------------------------------------- /bas_src/AbsWork.bas: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/KevEdwards/Galaforce2BBC/31d18999f05a854f773cb87a2773c76afcb52f0c/bas_src/AbsWork.bas -------------------------------------------------------------------------------- /bas_src/CONST.bas: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/KevEdwards/Galaforce2BBC/31d18999f05a854f773cb87a2773c76afcb52f0c/bas_src/CONST.bas -------------------------------------------------------------------------------- /bas_src/DataFiles.bas: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/KevEdwards/Galaforce2BBC/31d18999f05a854f773cb87a2773c76afcb52f0c/bas_src/DataFiles.bas -------------------------------------------------------------------------------- /bas_src/Flags.bas: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/KevEdwards/Galaforce2BBC/31d18999f05a854f773cb87a2773c76afcb52f0c/bas_src/Flags.bas -------------------------------------------------------------------------------- /bas_src/High.bas: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/KevEdwards/Galaforce2BBC/31d18999f05a854f773cb87a2773c76afcb52f0c/bas_src/High.bas -------------------------------------------------------------------------------- /bas_src/MODULE.bas: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/KevEdwards/Galaforce2BBC/31d18999f05a854f773cb87a2773c76afcb52f0c/bas_src/MODULE.bas -------------------------------------------------------------------------------- /bas_src/Main.bas: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/KevEdwards/Galaforce2BBC/31d18999f05a854f773cb87a2773c76afcb52f0c/bas_src/Main.bas -------------------------------------------------------------------------------- /bas_src/MainB.bas: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/KevEdwards/Galaforce2BBC/31d18999f05a854f773cb87a2773c76afcb52f0c/bas_src/MainB.bas -------------------------------------------------------------------------------- /bas_src/ObjPro.bas: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/KevEdwards/Galaforce2BBC/31d18999f05a854f773cb87a2773c76afcb52f0c/bas_src/ObjPro.bas -------------------------------------------------------------------------------- /bas_src/ObjPro2.bas: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/KevEdwards/Galaforce2BBC/31d18999f05a854f773cb87a2773c76afcb52f0c/bas_src/ObjPro2.bas -------------------------------------------------------------------------------- /bas_src/Object1.bas: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/KevEdwards/Galaforce2BBC/31d18999f05a854f773cb87a2773c76afcb52f0c/bas_src/Object1.bas -------------------------------------------------------------------------------- /bas_src/Object2.bas: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/KevEdwards/Galaforce2BBC/31d18999f05a854f773cb87a2773c76afcb52f0c/bas_src/Object2.bas -------------------------------------------------------------------------------- /bas_src/Object3.bas: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/KevEdwards/Galaforce2BBC/31d18999f05a854f773cb87a2773c76afcb52f0c/bas_src/Object3.bas -------------------------------------------------------------------------------- /bas_src/PatDat1.bas: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/KevEdwards/Galaforce2BBC/31d18999f05a854f773cb87a2773c76afcb52f0c/bas_src/PatDat1.bas -------------------------------------------------------------------------------- /bas_src/PatDat2.bas: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/KevEdwards/Galaforce2BBC/31d18999f05a854f773cb87a2773c76afcb52f0c/bas_src/PatDat2.bas -------------------------------------------------------------------------------- /bas_src/PatDat3.bas: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/KevEdwards/Galaforce2BBC/31d18999f05a854f773cb87a2773c76afcb52f0c/bas_src/PatDat3.bas -------------------------------------------------------------------------------- /bas_src/PatIn1.bas: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/KevEdwards/Galaforce2BBC/31d18999f05a854f773cb87a2773c76afcb52f0c/bas_src/PatIn1.bas -------------------------------------------------------------------------------- /bas_src/Rout1.bas: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/KevEdwards/Galaforce2BBC/31d18999f05a854f773cb87a2773c76afcb52f0c/bas_src/Rout1.bas -------------------------------------------------------------------------------- /bas_src/Rout2.bas: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/KevEdwards/Galaforce2BBC/31d18999f05a854f773cb87a2773c76afcb52f0c/bas_src/Rout2.bas -------------------------------------------------------------------------------- /bas_src/SUBR1.bas: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/KevEdwards/Galaforce2BBC/31d18999f05a854f773cb87a2773c76afcb52f0c/bas_src/SUBR1.bas -------------------------------------------------------------------------------- /bas_src/SceLGam.bas: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/KevEdwards/Galaforce2BBC/31d18999f05a854f773cb87a2773c76afcb52f0c/bas_src/SceLGam.bas -------------------------------------------------------------------------------- /bas_src/Sect1.bas: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/KevEdwards/Galaforce2BBC/31d18999f05a854f773cb87a2773c76afcb52f0c/bas_src/Sect1.bas -------------------------------------------------------------------------------- /bas_src/Sect2.bas: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/KevEdwards/Galaforce2BBC/31d18999f05a854f773cb87a2773c76afcb52f0c/bas_src/Sect2.bas -------------------------------------------------------------------------------- /bas_src/SpGra.bas: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/KevEdwards/Galaforce2BBC/31d18999f05a854f773cb87a2773c76afcb52f0c/bas_src/SpGra.bas -------------------------------------------------------------------------------- /bas_src/Sprites.bas: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/KevEdwards/Galaforce2BBC/31d18999f05a854f773cb87a2773c76afcb52f0c/bas_src/Sprites.bas -------------------------------------------------------------------------------- /bas_src/Sprites2.bas: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/KevEdwards/Galaforce2BBC/31d18999f05a854f773cb87a2773c76afcb52f0c/bas_src/Sprites2.bas -------------------------------------------------------------------------------- /bas_src/StartUp.bas: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/KevEdwards/Galaforce2BBC/31d18999f05a854f773cb87a2773c76afcb52f0c/bas_src/StartUp.bas -------------------------------------------------------------------------------- /bas_src/Subr1B.bas: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/KevEdwards/Galaforce2BBC/31d18999f05a854f773cb87a2773c76afcb52f0c/bas_src/Subr1B.bas -------------------------------------------------------------------------------- /bas_src/Subr1C.bas: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/KevEdwards/Galaforce2BBC/31d18999f05a854f773cb87a2773c76afcb52f0c/bas_src/Subr1C.bas -------------------------------------------------------------------------------- /bas_src/Subr2.bas: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/KevEdwards/Galaforce2BBC/31d18999f05a854f773cb87a2773c76afcb52f0c/bas_src/Subr2.bas -------------------------------------------------------------------------------- /bas_src/Vectors1.bas: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/KevEdwards/Galaforce2BBC/31d18999f05a854f773cb87a2773c76afcb52f0c/bas_src/Vectors1.bas -------------------------------------------------------------------------------- /bas_src/Vectors2.bas: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/KevEdwards/Galaforce2BBC/31d18999f05a854f773cb87a2773c76afcb52f0c/bas_src/Vectors2.bas -------------------------------------------------------------------------------- /bas_src/ZpWork.bas: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/KevEdwards/Galaforce2BBC/31d18999f05a854f773cb87a2773c76afcb52f0c/bas_src/ZpWork.bas -------------------------------------------------------------------------------- /make.bat: -------------------------------------------------------------------------------- 1 | 2 | beebasm -i Prebuild.mak 3 | 4 | beebasm -i Master.mak -di G2_BLANK.ssd -do Galaforce2BBC.ssd 5 | @Echo. Done! .ssd image has been built 6 | dir *.ssd 7 | -------------------------------------------------------------------------------- /object/MOBJ.o: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/KevEdwards/Galaforce2BBC/31d18999f05a854f773cb87a2773c76afcb52f0c/object/MOBJ.o -------------------------------------------------------------------------------- /object/Section/Bomb.o: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/KevEdwards/Galaforce2BBC/31d18999f05a854f773cb87a2773c76afcb52f0c/object/Section/Bomb.o -------------------------------------------------------------------------------- /object/Section/CHARDAT.o: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/KevEdwards/Galaforce2BBC/31d18999f05a854f773cb87a2773c76afcb52f0c/object/Section/CHARDAT.o -------------------------------------------------------------------------------- /object/Section/Digits.o: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/KevEdwards/Galaforce2BBC/31d18999f05a854f773cb87a2773c76afcb52f0c/object/Section/Digits.o -------------------------------------------------------------------------------- /object/Section/Grub.o: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/KevEdwards/Galaforce2BBC/31d18999f05a854f773cb87a2773c76afcb52f0c/object/Section/Grub.o -------------------------------------------------------------------------------- /object/Section/ObAliens.o: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/KevEdwards/Galaforce2BBC/31d18999f05a854f773cb87a2773c76afcb52f0c/object/Section/ObAliens.o -------------------------------------------------------------------------------- /object/Section/ObArrow.o: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/KevEdwards/Galaforce2BBC/31d18999f05a854f773cb87a2773c76afcb52f0c/object/Section/ObArrow.o -------------------------------------------------------------------------------- /object/Section/ObBigAl.o: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/KevEdwards/Galaforce2BBC/31d18999f05a854f773cb87a2773c76afcb52f0c/object/Section/ObBigAl.o -------------------------------------------------------------------------------- /object/Section/ObExpl.o: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/KevEdwards/Galaforce2BBC/31d18999f05a854f773cb87a2773c76afcb52f0c/object/Section/ObExpl.o -------------------------------------------------------------------------------- /object/Section/ObFlag.o: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/KevEdwards/Galaforce2BBC/31d18999f05a854f773cb87a2773c76afcb52f0c/object/Section/ObFlag.o -------------------------------------------------------------------------------- /object/Section/ObMiniShip.o: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/KevEdwards/Galaforce2BBC/31d18999f05a854f773cb87a2773c76afcb52f0c/object/Section/ObMiniShip.o -------------------------------------------------------------------------------- /object/Section/ObMyShip.o: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/KevEdwards/Galaforce2BBC/31d18999f05a854f773cb87a2773c76afcb52f0c/object/Section/ObMyShip.o -------------------------------------------------------------------------------- /object/Section/OtSpr1.o: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/KevEdwards/Galaforce2BBC/31d18999f05a854f773cb87a2773c76afcb52f0c/object/Section/OtSpr1.o -------------------------------------------------------------------------------- /object/Section/SpFont.o: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/KevEdwards/Galaforce2BBC/31d18999f05a854f773cb87a2773c76afcb52f0c/object/Section/SpFont.o -------------------------------------------------------------------------------- /original_image/$.!ainfo: -------------------------------------------------------------------------------- 1 | The BBC Galaforce 2 source was closed on 3rd October 1988. Time = 9.30pm All additional changes to the source MUST be logged below with time and date of change. Phhheeeww!! 8/10/88 1.40pm Start galaxy key controls to cursor up/down and altered text message. When cheat key (C+Return) is pressed the StrtLev variable is set to 1. Altered Loader file L (window size) and removed ENVELOPE commands. 25/10/88 8.45pm Start with three lives rather than five. Maximum number of lives=5 ver$="1.0000" in const to show it's final version *FX 15,0 in 'STARTUP' to flush all buffers -------------------------------------------------------------------------------- /original_image/$.!boot: -------------------------------------------------------------------------------- 1 | *RUN Clearam PA.=&7600 CH."Master" -------------------------------------------------------------------------------- /original_image/$.Clearam: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/KevEdwards/Galaforce2BBC/31d18999f05a854f773cb87a2773c76afcb52f0c/original_image/$.Clearam -------------------------------------------------------------------------------- /original_image/$.HIbasic: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/KevEdwards/Galaforce2BBC/31d18999f05a854f773cb87a2773c76afcb52f0c/original_image/$.HIbasic -------------------------------------------------------------------------------- /original_image/$.Mod: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/KevEdwards/Galaforce2BBC/31d18999f05a854f773cb87a2773c76afcb52f0c/original_image/$.Mod -------------------------------------------------------------------------------- /original_image/$.Obj: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/KevEdwards/Galaforce2BBC/31d18999f05a854f773cb87a2773c76afcb52f0c/original_image/$.Obj -------------------------------------------------------------------------------- /original_image/$.ObjTubeIO: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/KevEdwards/Galaforce2BBC/31d18999f05a854f773cb87a2773c76afcb52f0c/original_image/$.ObjTubeIO -------------------------------------------------------------------------------- /original_image/$.RndTest: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/KevEdwards/Galaforce2BBC/31d18999f05a854f773cb87a2773c76afcb52f0c/original_image/$.RndTest -------------------------------------------------------------------------------- /original_image/$.TransIO: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/KevEdwards/Galaforce2BBC/31d18999f05a854f773cb87a2773c76afcb52f0c/original_image/$.TransIO -------------------------------------------------------------------------------- /screenshot.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/KevEdwards/Galaforce2BBC/31d18999f05a854f773cb87a2773c76afcb52f0c/screenshot.png -------------------------------------------------------------------------------- /src/AbsWork.asm: -------------------------------------------------------------------------------- 1 | \\ 2 | \\ Galaforce 2 ( BBC Micro ) from the original 6502 source code, adapted to assemble using beebasm 3 | \\ 4 | \\ (c) Kevin Edwards 1987-2021 5 | \\ 6 | \\ Twitter @KevEdwardsRetro 7 | \\ 8 | 9 | \\ REM SAVE"$.Galaforce2.AbsWork" 10 | 11 | \\ P%=&400:B%=P%:O%=&800 12 | \\ [OPT 6 13 | 14 | \ Event routine variables, beware! 15 | 16 | ORG &400 17 | 18 | .AbsStartDummy 19 | 20 | .VSyncMast EQUB 0 21 | .VSyncCnt EQUB 0 22 | .VSyncCn2 EQUB 0 23 | 24 | \ Non-Player relevant variables 25 | 26 | .counter EQUB 0 \ INC by 1 each game loop 27 | .Player EQUB 0 28 | .XIndex EQUB 0 29 | .YIndex EQUB 0 30 | .WhichStar EQUB 0 31 | .FireDel EQUB 0 32 | .SectAddr EQUW 0 33 | .SectOff EQUB 0 34 | .MaxAlID EQUB 0 35 | .UptoID EQUB 0 36 | .Escape EQUB 0 37 | .ActAliens EQUB 0 38 | .ActBullets EQUB 0 39 | .ActInits EQUB 0 40 | .ActAlBombs EQUB 0 41 | .DieDelay EQUB 0 42 | .VInFCnt EQUB 0 43 | .VInFOff EQUB 0 44 | .Demo EQUB 0 45 | .DemoDir EQUB 0 46 | .DemoCnt EQUB 0 47 | .TimeOut EQUB 0 48 | .NewAlID EQUB 0 49 | .RetPress EQUB 0 50 | .Feature EQUB 0 51 | .AlCounter EQUB 0 52 | .SmartFlg EQUB 0 53 | .ShipInfo EQUB 0 54 | .NoFx EQUB 0 55 | 56 | .ObjX SKIP TotObj 57 | .ObjY SKIP TotObj 58 | .ObjWid SKIP TotObj 59 | .ObjXWid SKIP TotObj 60 | .ObjHei SKIP TotObj 61 | .ObjGTyp SKIP TotObj 62 | .ObjGra SKIP TotObj 63 | .ObjFrm SKIP TotObj 64 | .ObjNumFrm SKIP TotObj 65 | .ObjPat SKIP TotObj 66 | .ObjPOff SKIP TotObj 67 | .ObjPFlip SKIP TotObj 68 | .ObjDirCnt SKIP TotObj 69 | .ObjRelX SKIP TotObj 70 | .ObjRelY SKIP TotObj 71 | .ObjFOff SKIP TotObj 72 | .ObjFCnt SKIP TotObj 73 | .ObjHits SKIP TotObj 74 | .ObjDestr SKIP TotObj 75 | .ObjInfo SKIP TotObj 76 | .ObjFeat SKIP TotObj 77 | 78 | .InitSt SKIP MaxInit 79 | .InitX SKIP MaxInit 80 | .InitY SKIP MaxInit 81 | .InitGTyp SKIP MaxInit 82 | .InitNum SKIP MaxInit 83 | .InitPat SKIP MaxInit 84 | .InitPFlip SKIP MaxInit 85 | .InitDelay SKIP MaxInit 86 | .InitRDelay SKIP MaxInit 87 | .InitRelX SKIP MaxInit 88 | .InitRelY SKIP MaxInit 89 | .InitFeat SKIP MaxInit 90 | 91 | .MyBmbSt SKIP MaxMyBmb 92 | .MyBmbX SKIP MaxMyBmb 93 | .MyBmbY SKIP MaxMyBmb 94 | 95 | .AlBmbSt SKIP MaxAlBmb 96 | .AlBmbX SKIP MaxAlBmb 97 | .AlBmbY SKIP MaxAlBmb 98 | .AlBmbTyp SKIP MaxAlBmb 99 | 100 | \ Player specific variables 101 | 102 | .PlyrInf 103 | .smarts EQUB 0 104 | .level EQUB 0 105 | .lives EQUB 0 106 | .score EQUS "1234567" 107 | .PlyrEnd \ See below 108 | 109 | .Plyr1Inf 110 | .P1smarts EQUB 0 111 | .P1level EQUB 0 112 | .P1lives EQUB 0 113 | .P1score EQUS "1234567" 114 | 115 | .Plyr2Inf 116 | .P2smarts EQUB 0 117 | .P2level EQUB 0 118 | .P2lives EQUB 0 119 | .P2score EQUS "1234567" 120 | 121 | \\ ] 122 | PRINT"General workspace from ",~AbsStartDummy," to ",~P%-1 123 | 124 | \\ IFP%>&7FF VDU7:PRINT'"Absolute workspace overflow!" 125 | 126 | PlyrSize=PlyrEnd-PlyrInf \\ REM Size (in bytes) of players specfic variables 127 | 128 | \\ PAGE=PG% 129 | \\ RETURN 130 | 131 | \\ DEFFNres1(gap%) 132 | \\ P%=P%+gap%:O%=O%+gap% 133 | \\ =6 134 | -------------------------------------------------------------------------------- /src/CONST.asm: -------------------------------------------------------------------------------- 1 | \\ 2 | \\ Galaforce 2 ( BBC Micro ) from the original 6502 source code, adapted to assemble using beebasm 3 | \\ 4 | \\ (c) Kevin Edwards 1987-2021 5 | \\ 6 | \\ Twitter @KevEdwardsRetro 7 | \\ 8 | 9 | \\ REM SAVE"$.Galaforce2.Const" 10 | 11 | \\ REM frequently used OS calls 12 | \\ REM first 13 | 14 | osbyte=&FFF4 15 | oswrch=&FFEE 16 | osword=&FFF1 17 | osnewl=&FFE7 18 | oscli =&FFF7 19 | osrdch=&FFE0 20 | osasci=&FFE3 21 | 22 | osrdrm=&FFB9 23 | oseven=&FFBF 24 | osfind=&FFCE 25 | osgbpb=&FFD1 26 | osbput=&FFD4 27 | osbget=&FFD7 28 | osargs=&FFDA 29 | osfile=&FFDD 30 | 31 | \\ ver$="1.0000" 32 | 33 | \\ cop$="*"+LEFT$(TIME$,15)+"*" 34 | \\ FORL%=1TOLENcop$ 35 | \\ A$=MID$(cop$,L%,1) 36 | \\ IFA$>="a" AND A$<="z" CopyName$=CopyName$+CHR$(ASC(A$)AND&5F) ELSE CopyName$=CopyName$+A$ 37 | \\ NEXT 38 | 39 | ScrBase=&5800 \\ REM Star code will need changing if ScrBase is altered! 40 | NumStars=31 \\ REM Alter this at your peril, see star processing code! 41 | XExcess=40 \\ REM Must always be EVEN! 42 | MaxLev=16 \\ REM Number of levels defined 43 | process=8 \\ REM number of aliens to be processed each game loop 44 | 45 | WindMinY=8 46 | WindMinX=XExcess 47 | WindMaxX=WindMinX+80 48 | XKill=WindMaxX+XExcess 49 | 50 | MaxInit=4 \\ REM Max number of simultaneous 'Init..' patterns 51 | 52 | MaxAlien=38 \\ REM Maximum number of aliens/alien bombs allowed 53 | TotObj=MaxAlien+1 \\ REM Total number of objects (+1 to include me) 54 | 55 | MaxMyBmb=3 \\ REM Maximum number of bombs I'm allowed 56 | MaxAlBmb=7 \\ REM Maximum number of alien bombs 57 | 58 | AlGraBase=4 \\ REM Offset into graphic types of 1st alien graphic 59 | 60 | DigGra=&D00 \\ REM Start address of digits graphics 61 | DDVal=5 \\ REM Delay in game cycles after my ship has been erased 62 | 63 | INITSOUND=&4400 64 | TUNE=&4403 65 | REFRESH=&4406 66 | 67 | \\ PAGE=PG% 68 | \\ RETURN 69 | -------------------------------------------------------------------------------- /src/DataFiles.asm: -------------------------------------------------------------------------------- 1 | \\ 2 | \\ Galaforce 2 ( BBC Micro ) from the original 6502 source code, adapted to assemble using beebasm 3 | \\ 4 | \\ (c) Kevin Edwards 1987-2021 5 | \\ 6 | \\ Twitter @KevEdwardsRetro 7 | \\ 8 | 9 | \\ REM SAVE"$.Galaforce2.DataFiles" 10 | \\ B%=P% 11 | \\ [OPT pass 12 | 13 | .CharSet 14 | \\ OPT FNLoadFil2("Section.CHARDAT",&127) 15 | INCBIN "object\Section\CHARDAT.o" 16 | 17 | .SpCharSet 18 | \\ OPT FNLoadFil2("Section.SpFont",&CD) 19 | INCBIN "object\Section\SpFont.o" 20 | 21 | .ArrowGra 22 | \\ OPT FNLoadFil2("Section.ObArrow",&20) 23 | INCBIN "object\Section\ObArrow.o" 24 | 25 | \\ ] 26 | 27 | \\ PRINT"Data Files from &";~B%;" to &";~P%-1;" (";P%-B%;")" 28 | \\ PAGE=PG%:RETURN 29 | 30 | \\ DEFFNLoadFil2(fsp$,size%) 31 | \\ IF pass>=6 OSCLI"LOAD "+fsp$+" "+STR$~(O%) 32 | \\ O%=O%+size%:P%=P%+size% 33 | \\ =pass 34 | -------------------------------------------------------------------------------- /src/Flags.asm: -------------------------------------------------------------------------------- 1 | \\ 2 | \\ Galaforce 2 ( BBC Micro ) from the original 6502 source code, adapted to assemble using beebasm 3 | \\ 4 | \\ (c) Kevin Edwards 1987-2021 5 | \\ 6 | \\ Twitter @KevEdwardsRetro 7 | \\ 8 | 9 | \\ REM SAVE"$.Galaforce2.Flags" 10 | \\ B%=P% 11 | \\ [OPT pass 12 | 13 | .LdFlagGra 14 | \\ OPT FNLoadDat1("Section.ObFlag",&40) 15 | INCBIN "object\Section\ObFlag.o" 16 | 17 | .LdMiniGra 18 | \\ OPT FNLoadDat1("Section.ObMiniShip",&10) 19 | INCBIN "object\Section\ObMiniShip.o" 20 | 21 | .FlPoleGra 22 | EQUB 0:EQUB &88:EQUB 0:EQUB &88:EQUB 0:EQUB &88:EQUB 0:EQUB &88 23 | 24 | .ShowFlags 25 | LDA level:LDX #0:LDY #30*8 26 | 27 | .ShowFlagsB 28 | PHA \ Save 'level' value 29 | JSR xycalc:STA temp1+1:STX temp1 30 | TAY:TXA:CLC:ADC #&40:STA temp2:BCC ShFl4 31 | INY 32 | .ShFl4 33 | INY:STY temp2+1 34 | 35 | PLA:BEQ ShFl0 \ RTS if 'level' = 0 36 | 37 | LDY #0 38 | .ShFl6 39 | CMP #50:BCC ShFl7 40 | SBC #50:INY:BCS ShFl6 \ Always 41 | 42 | .ShFl7 43 | PHA:TYA:BEQ ShFl8 44 | LDX #&3F:JSR ShFlGra \ Show 'fifties' 45 | 46 | .ShFl8 47 | PLA:LDY #0 48 | .ShFl1 49 | CMP #10:BCC ShFl2 50 | SBC #10:INY:BCS ShFl1 \ Always 51 | 52 | .ShFl2 53 | PHA 54 | TYA:BEQ ShFl3 55 | LDX #&2F:JSR ShFlGra \ Show 'tens' 56 | 57 | .ShFl3 58 | PLA:CMP #5:BCC ShFl5 59 | SBC #5:PHA 60 | LDX #&1F:LDY #1:JSR ShFlGra \ Show 'fives' 61 | PLA 62 | 63 | .ShFl5 64 | TAY:BEQ ShFl0 \ RTS if no 'units' 65 | LDX #&F \ drop through and display 'unit' flags 66 | 67 | .ShFlGra 68 | STX temp4:STY temp3+1 69 | .ShFlGr1 70 | LDY #&F:LDX temp4 71 | .ShFlGr0 72 | LDA LdFlagGra,X:EOR (temp1),Y:STA (temp1),Y 73 | DEX:DEY:BPL ShFlGr0 74 | 75 | LDY #7 76 | .ShFlGr2 77 | LDA FlPoleGra,Y:EOR (temp2),Y:STA (temp2),Y 78 | DEY:BPL ShFlGr2 79 | 80 | LDA temp1:CLC:ADC #&10:STA temp1:BCC ShFlGr3 81 | INC temp1+1 82 | .ShFlGr3 83 | LDA temp2:CLC:ADC #&10:STA temp2:BCC ShFlGr4 84 | INC temp2+1 85 | .ShFlGr4 86 | DEC temp3+1:BNE ShFlGr1 87 | 88 | .ShFl0 89 | RTS 90 | 91 | .ShowLives 92 | LDX #80-4:LDY #30*8:JSR xycalc 93 | STA temp1+1:STX temp1 94 | 95 | LDX lives:BEQ ShLi0 96 | DEX:BEQ ShLi0 97 | .ShLi3 98 | LDY #&F 99 | .ShLi1 100 | LDA LdMiniGra,Y:EOR (temp1),Y:STA (temp1),Y 101 | DEY:BPL ShLi1 102 | 103 | LDA temp1:SEC:SBC #&10:STA temp1:BCS ShLi2 104 | DEC temp1+1 105 | .ShLi2 106 | DEX:BNE ShLi3 107 | 108 | .ShLi0 109 | LDX smarts:BEQ ShSm0 110 | 111 | .ShSm1 112 | LDY #&F 113 | .ShSm2 114 | LDA SmBmbGra,Y:EOR (temp1),Y:STA (temp1),Y 115 | DEY:BPL ShSm2 116 | LDA temp1:SEC:SBC #&10:STA temp1:BCS ShSm3 117 | DEC temp1+1 118 | .ShSm3 119 | DEX:BNE ShSm1 120 | 121 | .ShSm0 122 | RTS 123 | 124 | .SmBmbGra 125 | EQUB 3:EQUB &17:EQUB &3C:EQUB &7E:EQUB &7C:EQUB &3C:EQUB &17:EQUB 3 126 | EQUB 8:EQUB &C:EQUB &86:EQUB &C6:EQUB &CE:EQUB &86:EQUB &C:EQUB 8 127 | 128 | \\ ] 129 | 130 | \\ PRINT"Flags Etc. from &";~B%;" to &";~P%-1;" (";P%-B%;")" 131 | \\ PAGE=PG% 132 | \\ RETURN 133 | 134 | \\ DEFFNLoadDat1(file$,size%) 135 | \\ IFpass>=6 OSCLI"LOAD "+file$+" "+STR$~(O%) 136 | \\ O%=O%+size%:P%=P%+size% 137 | \\ =pass 138 | -------------------------------------------------------------------------------- /src/High.asm: -------------------------------------------------------------------------------- 1 | \\ 2 | \\ Galaforce 2 ( BBC Micro ) from the original 6502 source code, adapted to assemble using beebasm 3 | \\ 4 | \\ (c) Kevin Edwards 1987-2021 5 | \\ 6 | \\ Twitter @KevEdwardsRetro 7 | \\ 8 | 9 | \\ REM SAVE"$.Galaforce2.High" 10 | \\ B%=P% 11 | \\ [OPT pass 12 | 13 | \ This routine handles a 6 entry high score where the names are 16 chars. 14 | \ long and the score is 7 chars. 15 | \ Format is 0000000ABCDEFGHIJKLMNOP for each entry 16 | 17 | .ti23 18 | EQUB 0:EQUB 23:EQUB 46:EQUB 69:EQUB 92:EQUB 115 19 | 20 | \ See if score if good enough for a new high score 21 | 22 | .hig 23 | BIT Demo:BMI higex \ Ignore high score check in demo mode 24 | LDX #0:STX temp2 \ Entry counter 25 | .hig0 26 | LDY ti23,X:STY temp2+1 \ Offset start for current entry 0,23,46.. 27 | DEY:LDX #&FF 28 | .hig1 29 | INY:INX:CPX #7:BEQ hig3 30 | LDA score,X:CLC:ADC #'0'-32 \ Convert to my ascii 31 | CMP HSBase,Y 32 | BEQ hig1 33 | BCC hig2 34 | BNE hig3 35 | .hig2 36 | INC temp2:LDX temp2 \ Next entry 37 | CPX #6:BCC hig0 38 | .higex 39 | RTS \ score not in high score table, so exit 40 | 41 | \ Shuffle names down from the new entry position so that the new 42 | \ entry can be inserted 43 | 44 | .hig3 45 | LDA temp2:PHA \ Save entry number (0-5) on stack for input routine 46 | CMP #5:BEQ hig5 \ Don't shuffle down if last entry in table 47 | LDY #5*23 \ point to 1st byte of last entry, the DEY will then adjust ok! 48 | .hig4 49 | DEY 50 | LDA HSBase,Y:STA HSBase+23,Y \ Copy names up memory 1 entry 51 | CPY temp2+1 \ Has start of source offset been copied and reached yet? 52 | BNE hig4 53 | 54 | \ Copy the new score into the table at the correct position and then 55 | \ fill the name field with space characters 56 | 57 | .hig5 58 | LDY temp2+1 \ Read start offset for current entry 59 | TYA:PHA \ Save start offset for current entry (used by input routine) 60 | LDX #0 61 | .hig6 62 | LDA #' '-32 \ My ascii for space 63 | CPX #7:BCS hig7 \ Branch if accesing the name field 64 | LDA score,X:CLC:ADC #'0'-32 \ Convert score value into my ascii digits 65 | .hig7 66 | STA HSBase,Y 67 | INY:INX 68 | CPX #23:BCC hig6 69 | 70 | LDY #12:JSR pstring \ 'A NEW HIGH SCORE!' 71 | JSR phi \ Display the high score table 72 | LDY #25:JSR frame_delay \ Short delay after tune/time to release space 73 | 74 | PLA:STA LoopA \ Save start offset for new entry 75 | PLA:ASL A:ASL A:ASL A:ASL A \ entry value (0-5) times 16 76 | ADC #10*8 \ Add offset to Y position for input 77 | STA TxEntry+1:STA TxEnt0+1:STA TxEnt1+1 78 | STA TxChar+1:LDX #28:STX TxChar \ Set up position of input char! 79 | 80 | LDX #&FF:JSR kbdonof \ Turn kbd irqs on again 81 | LDA #21:LDX #0:JSR osbyte \ Flush kbd buffer only! 82 | LDY #28:JSR PlayTune 83 | JSR pitcur \ Put on cursor 84 | LDA #0:STA LoopB \ Next free name counter 85 | BEQ gtn0 \ Always 86 | 87 | .gtn1 88 | \ LDA #7 JSR oswrch 89 | .gtn2 90 | STX LoopA:STY LoopB 91 | .gtn0 92 | JSR TryStars 93 | LDA #202:LDX #&20:LDY #0:JSR osbyte \ Caps Lock on/Shift Lock off 94 | LDA #&7E:JSR osbyte \ Clear escape condition 95 | LDA #&81:LDX #1:LDY #0:JSR osbyte \ Get character 96 | BCS gtn0 \ If time-out or escape detected 97 | TXA \ Put ascii value of key into A 98 | LDX LoopA \ Offset from 'HSBase' for next input character 99 | LDY LoopB \ Next free name counter (0-15) if 16 can only delete/return 100 | 101 | CMP #&D:BEQ gtnex \ Return has ended input 102 | CMP #&7F:BEQ gtn3 \ If delete pressed 103 | 104 | CPY #16:BEQ gtn1 \ Name 'full', can only press delete or return 105 | CMP #'Z'+1:BCS gtn1 \ Beep, invalid char 106 | SBC #' '-1 \ Subtract ASC " " for my ascii, with fudge because c=0 107 | BCC gtn1 \ Beep, invalid char 108 | STA HSBase+7,X \ Save in table in the name field, NOT in the score part! 109 | JSR pitcur \ Erase cursor 110 | LDA HSBase+7,X \ Restore input character 111 | STA TxChar+3 \ Save in 'pstring' character position 112 | JSR pit \ Print new character 113 | 114 | LDA TxChar:CLC:ADC #3:STA TxChar \ Move right 6 (3*2) pixels 115 | LDA TxChar+1:EOR #2:STA TxChar+1 116 | JSR pitcur \ Put cursor on 117 | INX:INY \ Increase pointer and counter 118 | BPL gtn2 \ always 119 | 120 | .gtn3 121 | CPY #0:BEQ gtn1 \ Can't delete when no characters entered 122 | JSR pitcur \ Erase cursor 123 | LDA TxChar:SEC:SBC #3:STA TxChar \ Move left 6 (3*2) pixels 124 | LDA TxChar+1:EOR #2:STA TxChar+1 125 | DEX \ 'HSBase' offset back to last character 126 | LDA HSBase+7,X:STA TxChar+3 \ Read last char and put in 'pstring' block 127 | JSR pit \ Erase last character 128 | LDA #' '-32:STA HSBase+7,X \ Put space into erased character place 129 | JSR pitcur \ Put cursor on 130 | DEY:JMP gtn2 \ Branch won't reach! 131 | 132 | .pitcur 133 | LDA #'-'-32:STA TxChar+3 \ Put on cursor 134 | .pit 135 | TXA:PHA:TYA:PHA 136 | LDY #10:JSR pstring 137 | PLA:TAY:PLA:TAX 138 | RTS 139 | 140 | .gtnex 141 | LDY #20:JSR frame_delay 142 | JSR pitcur \ Erase cursor 143 | LDY #12:JSR pstring \ Erase 'A NEW HIGH SCORE!' 144 | JSR phi \ Erase high score table 145 | LDX #0 \ Value to disable kbd 146 | 147 | .kbdonof 148 | LDA #178:LDY #0:JMP osbyte \ FX 178 disables KBD irqs 149 | 150 | .phi 151 | LDY #10*8:STY TxEntry+1:STY TxEnt0+1:STY TxEnt1+1 152 | LDX #0:STX LoopA \ Entry counter 153 | 154 | .phi0 155 | TXA:CLC:ADC #'1'-32 \ Make 0,1,2.. into my ascii chars 1,2,3 156 | STA TxEntry+3 157 | LDY ti23,X 158 | LDX #0 159 | .phi1 160 | LDA HSBase,Y:STA TxEnt0+3,X 161 | INY:INX:CPX #7:BCC phi1 162 | LDX #0 163 | .phi2 164 | LDA HSBase,Y:STA TxEnt1+3,X 165 | INY:INX:CPX #16:BCC phi2 166 | LDY #8:JSR pstring 167 | LDA TxEntry+1:CLC:ADC #16 \ Down two character rows 168 | STA TxEntry+1:STA TxEnt0+1:STA TxEnt1+1 169 | INC LoopA:LDX LoopA:CPX #6:BCC phi0 170 | RTS 171 | 172 | \\ ] 173 | 174 | \\ PRINT"High from &";~B%;" to &";~P%-1;" (";P%-B%;")" 175 | \\ PAGE=PG% 176 | \\ RETURN 177 | -------------------------------------------------------------------------------- /src/MODULE.asm: -------------------------------------------------------------------------------- 1 | \\ 2 | \\ Galaforce 2 ( BBC Micro ) from the original 6502 source code, adapted to assemble using beebasm 3 | \\ 4 | \\ (c) Kevin Edwards 1987-2021 5 | \\ 6 | \\ Twitter @KevEdwardsRetro 7 | \\ 8 | 9 | \\ REM SAVE"$.Galaforce2.Module" 10 | 11 | \\ P%=&900:O%=&800:B%=P% 12 | \\ [OPT pass 13 | 14 | \\ Re-map EQUS strings for this file - reset below! 15 | MAPCHAR ' ','Z', 0 16 | 17 | .pstring 18 | LDA strptab,Y:STA temp3 19 | LDA strptab+1,Y:STA temp3+1 20 | 21 | .pst6 22 | LDY #0 23 | LDA (temp3),Y 24 | .pst8 25 | CMP #&FF:BNE pst7 26 | RTS \ Exit if X coord=&FF, end of string list 27 | 28 | .pst7 29 | AND #&7F:TAX \ Remove B7 'new item' flag 30 | INY:LDA (temp3),Y:TAY \ Y coord 31 | AND #3:STA temp5+2:\ pix.off. 32 | TYA:AND #&F8:TAY:JSR xycalc 33 | STA temp2+1:STX temp2 34 | 35 | LDY #2:LDA (temp3),Y \ Colour byte 36 | AND #&88:STA temp4+1:STA temp5 37 | LDX temp5+2:BEQ pst5 38 | .pst0 39 | LSR temp5 40 | DEX:BNE pst0 41 | 42 | .pst5 43 | LDA temp3:CLC:ADC #3:STA temp3 \ Skip over X,Y,colour fields 44 | BCC charloc 45 | INC temp3+1 46 | 47 | .charloc 48 | JSR TryStars 49 | LDY #0:LDA (temp3),Y:BMI pst8 \ Note Y=0 when taken! 50 | STA temp4 51 | LDX #CharSet DIV 256 52 | ASL A:ASL A:\ I assume A<64! 53 | ADC temp4:BCC pst1 54 | INX:CLC 55 | .pst1 56 | ADC #CharSet MOD 256 57 | BCC pst2 58 | INX 59 | .pst2 60 | STA charbase+1:STX charbase+2 61 | LDX #0 62 | .charbase 63 | LDA &FFFF,X 64 | STA temp5+1:\ char. def. byte 65 | LDY #7 66 | .pst3 67 | ASL temp5+1:\ test 1 in char.def. 68 | BCC pst4:\ Skip if pixel unset! 69 | LDA temp5:\ colour shift byte 70 | EOR (temp2),Y 71 | STA (temp2),Y 72 | .pst4 73 | DEY:BPL pst3 74 | JSR pst_pixright 75 | INX:CPX #5:BNE charbase 76 | JSR pst_pixright 77 | INC temp3:BNE charloc 78 | INC temp3+1:JMP charloc 79 | 80 | .pst_pixright 81 | LSR temp5 82 | INC temp5+2:LDA temp5+2 83 | CMP #4:BCC pst_pr0 84 | 85 | LDA #0:STA temp5+2 86 | LDA temp4+1:STA temp5 87 | LDA temp2:ADC #7:\ c=1 here! 88 | STA temp2 89 | BCC pst_pr0 90 | INC temp2+1 91 | .pst_pr0 92 | RTS 93 | 94 | .strptab 95 | EQUW TxMainTit 96 | EQUW TxGetRdy 97 | EQUW TxPlayer 98 | EQUW TxGamOvr 99 | EQUW TxEntry 100 | EQUW TxChar 101 | EQUW TxNewHigh 102 | EQUW TxBestScr 103 | EQUW TxOptChr 104 | EQUW TxStrtLev 105 | 106 | .TxMainTit 107 | EQUB 1:EQUB 7*8+1:EQUB &88 108 | EQUS "BBC MICRO 40TH ANNIVERSARY" 109 | 110 | EQUB &80+16:EQUB 10*8+0:EQUB &80 111 | EQUS "BY KEVIN EDWARDS" 112 | 113 | EQUB &80+24:EQUB 23*8+0:EQUB &08 114 | EQUS "(C) MMXXI" 115 | 116 | EQUB &80+11:EQUB 25*8+2:EQUB &08 117 | EQUS "DEVELOPMENT VERSION" \ CopyName$ 118 | 119 | .TxPresSpc 120 | EQUB &80+10:EQUB 28*8+1:EQUB &88 121 | EQUS "PRESS SPACE TO START" 122 | EQUB &FF 123 | 124 | .TxGetRdy 125 | EQUB 26:EQUB 6*8+1:EQUB &88 126 | EQUS "GET READY" 127 | 128 | EQUB &80+12:EQUB 14*8+0:EQUB &08 129 | EQUS "ENTERING GALAXY " 130 | .TxGalax 131 | EQUS "000" 132 | 133 | .TxPlayer 134 | EQUB &80+28:EQUB 8*8+1:EQUB &80 135 | EQUS "PLAYER " 136 | .TxPlyr 137 | EQUB 0 138 | EQUB &FF 139 | 140 | .TxGamOvr 141 | EQUB 26:EQUB 6*8+1:EQUB &88 142 | EQUS "GAME OVER" 143 | EQUB &FF 144 | 145 | .TxEntry 146 | EQUB 0:EQUB 6*8+0:EQUB &88 147 | EQUS "1":EQUB '.'-32 148 | .TxEnt0 149 | EQUB &80+6:EQUB 6*8+0:EQUB &80 150 | EQUS "1234567" 151 | .TxEnt1 152 | EQUB &80+28:EQUB 6*8+0:EQUB &08 153 | EQUS "1234567890123456" 154 | EQUB &FF 155 | 156 | .TxChar 157 | EQUB 28:EQUB 6*8+0:EQUB &08 158 | EQUB 0 159 | EQUB &FF 160 | 161 | .TxNewHigh 162 | EQUB 14:EQUB 5*8+2:EQUB &88 163 | EQUS "A NEW HIGH SCORE!" 164 | 165 | EQUB &80+14:EQUB 6*8+1:EQUB &08 166 | EQUS "-=-=-=-=-=-=-=-=-" 167 | 168 | EQUB &80+14:EQUB 26*8+0:EQUB &08 169 | EQUS "(ENTER YOUR NAME)" 170 | EQUB &FF 171 | 172 | .TxBestScr 173 | EQUB 8:EQUB 5*8+1:EQUB &80 174 | EQUS "TODAY'S BEST FIGHTERS" 175 | 176 | EQUB &80+8:EQUB 6*8+1:EQUB &88 177 | EQUS "-=-=-=-=-=-=-=-=-=-=-" 178 | 179 | EQUB &80+4:EQUB 26*8+0:EQUB &88 180 | EQUS "(MORE TRAINEES REQUIRED)" 181 | EQUB &FF 182 | 183 | .TxOptChr 184 | EQUB 0:EQUB 31*8+0:EQUB &88 185 | EQUS "A" 186 | EQUB &FF 187 | 188 | .TxStrtLev 189 | EQUB 6:EQUB 5*8+0:EQUB &80 190 | EQUS "PRESS CURSOR UP/DOWN TO" 191 | 192 | EQUB &80+12:EQUB 7*8+3:EQUB &80 193 | EQUS "ALTER START GALAXY" 194 | 195 | EQUB &80+0:EQUB 11*8+0:EQUB &88 196 | EQUS "FURTHEST" 197 | EQUB &80+0:EQUB 13*8+0:EQUB &88 198 | EQUS "GALAXY" 199 | EQUB &80+0:EQUB 15*8+0:EQUB &88 200 | EQUS "REACHED" 201 | 202 | EQUB &80+0:EQUB 18*8+0:EQUB &88 203 | EQUS "START" 204 | EQUB &80+0:EQUB 20*8+0:EQUB &88 205 | EQUS "GALAXY" 206 | 207 | EQUB &80+16:EQUB 26*8+0:EQUB &08 208 | EQUS "(RETURN TO EXIT)" 209 | EQUB &FF 210 | 211 | .HSBase 212 | EQUS "0075000ADVANCED TRAINER" 213 | EQUS "0050000NOVICE TRAINER " 214 | EQUS "0040000ADVANCED PILOT " 215 | EQUS "0030000COMPETENT PILOT " 216 | EQUS "0020000NOVICE PILOT " 217 | EQUS "0010000TRAINEE " 218 | 219 | .SoundFx 220 | BIT Demo:BMI Soun0 221 | BIT NoFx:BMI Soun0 222 | BIT FSound:BPL Soun0 223 | LDA #7:JMP osword 224 | .Soun0 225 | RTS 226 | 227 | .PlayTune 228 | BIT Demo:BMI PlTu0 229 | TYA:PHA 230 | JSR flush 231 | PLA:TAY 232 | JMP TUNE 233 | .PlTu0 234 | RTS 235 | 236 | 237 | \\ Re-map Back to normal ASCII 238 | MAPCHAR ' ','Z', 32 239 | 240 | \\ ] 241 | \\ PRINT"Module from &";~B%;" to &";~P%-1;" (";P%-B%;")" 242 | \\ IFP%>=(&900+modu%) PRINT'"Module overlow!":VDU7,7:END 243 | \\ P%=objstrt%:O%=&800+modu% 244 | \\ PAGE=PG% 245 | \\ RETURN 246 | 247 | \\ DEF FNmyascii(oldasc$) 248 | \\ IF pass>4 O%=O%+LEN(oldasc$):P%=P%+LEN(oldasc$):=pass 249 | \\ FORL%=1TOLEN(oldasc$) 250 | \\ ?(O%+L%-1)=ASC(MID$(oldasc$,L%,1))-32 251 | \\ NEXT 252 | \\ O%=O%+LEN(oldasc$) 253 | \\ P%=P%+LEN(oldasc$) 254 | \\ =pass 255 | 256 | -------------------------------------------------------------------------------- /src/Main.asm: -------------------------------------------------------------------------------- 1 | \\ 2 | \\ Galaforce 2 ( BBC Micro ) from the original 6502 source code, adapted to assemble using beebasm 3 | \\ 4 | \\ (c) Kevin Edwards 1987-2021 5 | \\ 6 | \\ Twitter @KevEdwardsRetro 7 | \\ 8 | 9 | \\ REM SAVE"$.Galaforce2.Main" 10 | \\ B%=P% 11 | \\ [OPT pass 12 | 13 | EQUS "Galaforce 2 ver 1.0000 " 14 | \\ EQUS TIME$ \ Date/time stamp the object code 15 | EQUS " Fri,03 Jul 1998.12:48:01" 16 | EQUS " (c) Kevin Edwards" 17 | 18 | \ ------------------------------------------------------------ 19 | 20 | \\ Re-map EQUS strings for the rest of the source, DO NOT re-map the EQUS strings above! 21 | MAPCHAR ' ','Z', 0 22 | 23 | .start 24 | LDA #26:JSR oswrch \ Restore default windows 25 | LDA #12:JSR oswrch \ CLS 26 | JSR InitStars 27 | SEI 28 | LDA #Event MOD &100:STA &220 29 | LDA #Event DIV &100:STA &221 30 | CLI 31 | JSR INITSOUND 32 | LDA #14:LDX #4:JSR osbyte \ Enable 'vsync' event 33 | CLC:ROR Demo \ Flag that we're not in demo mode 34 | CLC:ROR NoFx 35 | JSR HardReset \ Show 0 for both scores,lives=4,level=1 etc 36 | JSR ShowLives:JSR ShowFlags \ Show 'reset' lives/flags 37 | LDY #0:JSR PlotOptB \ Show P 38 | LDY #1:JSR PlotOptB \ Show S 39 | LDY #2:JSR PlotOptB \ Show K 40 | LDY #3:JSR PlotOptB \ Show 1 41 | 42 | \ ------------------------------------------------------------ 43 | 44 | .Header 45 | LDY #4:JSR PlayTune 46 | .Heade0 47 | LDA #20:JSR oswrch \ Reset palette 48 | LDX #2:LDY #5:JSR vdu19 \ colour 2 to magenta 49 | 50 | JSR DispHead:JSR WtLoop:JSR DispHead \ Main header page 51 | BIT RetPress:BMI IntoOpt \ Into options if Return pressed 52 | BIT TimeOut:BPL NewGame 53 | LDX #2:LDY #2:JSR vdu19 \ colour 2 to green 54 | LDY #14:JSR pstring \ Today's best fighters 55 | JSR phi:JSR WtLoop:JSR phi \ High score table 56 | LDY #14:JSR pstring 57 | BIT RetPress:BMI IntoOpt \ Into options if Return pressed 58 | BIT TimeOut:BPL NewGame 59 | 60 | .IntoDemo 61 | LDX #&80:BMI NeGam0 \ Always, force demo mode 62 | .NewGame 63 | LDX #0 \ Select non-demo mode 64 | .NeGam0 65 | STX Demo 66 | JSR PlayGame 67 | JMP Header 68 | 69 | .IntoOpt 70 | JSR Options \ Cheat option/skip level etc.. 71 | JMP Heade0 72 | 73 | \ ------------------------------------------------------------ 74 | 75 | .WtLoop 76 | CLC:ROR TimeOut \ Clear time out flag 77 | CLC:ROR RetPress \ Clear 'Return pressed' flag 78 | LDA #250:STA LoopA \ Delay in frames before time out 79 | .WtLo0 80 | DEC LoopA:BEQ WtLo2 \ Time-out has occured 81 | JSR testspc:BEQ WtLo3 \ If space pressed, use selected num of players 82 | LDX #&B6:JSR check_key:BEQ WtLo1 83 | JSR fx19 84 | JSR TryStars 85 | JSR Extras 86 | LDX #3:JSR OpKeysB \ Check P S K and CTRL! 87 | JMP WtLo0 88 | 89 | .WtLo2 90 | SEC:ROR TimeOut \ Timed out, space wasn't pressed 91 | RTS 92 | 93 | .WtLo3 94 | JSR TryStars 95 | JSR testspc:BEQ WtLo3 \ Wait until space released! 96 | RTS 97 | 98 | .WtLo1 99 | SEC:ROR RetPress \ Flag 'Return' pressed 100 | RTS 101 | 102 | \\ ] 103 | 104 | \\ PRINT"Main loop from &";~B%;" to &";~P%-1;" (";P%-B%;")" 105 | \\ PAGE=PG% 106 | \\ RETURN 107 | -------------------------------------------------------------------------------- /src/MainB.asm: -------------------------------------------------------------------------------- 1 | \\ 2 | \\ Galaforce 2 ( BBC Micro ) from the original 6502 source code, adapted to assemble using beebasm 3 | \\ 4 | \\ (c) Kevin Edwards 1987-2021 5 | \\ 6 | \\ Twitter @KevEdwardsRetro 7 | \\ 8 | 9 | \\ REM SAVE"$.Galaforce2.MainB" 10 | \\ B%=P% 11 | \\ [OPT pass 12 | 13 | .PlayGame 14 | JSR TryStars 15 | LDX #2:LDY #4:JSR vdu19 \ colour 2 to blue 16 | JSR ShowLives:JSR ShowFlags \ Remove 'last game' flags/lives left! 17 | 18 | JSR HardReset \ Init player 1/2 variables, 0 scores etc. 19 | LDA #0:STA Player \ Make player 1 the first to start 20 | JSR ReadPlyr 21 | JSR TryStars 22 | 23 | .NextLife 24 | JSR TryStars 25 | JSR ClrArrows \ Erase both arrows 26 | JSR PutArrow \ Show next player's arrow 27 | JSR ShowLives:JSR ShowFlags \ Show next player's lives/level 28 | JSR reset 29 | JSR InitLev 30 | JSR TryStars 31 | JSR InitMe 32 | 33 | LDA Player:CLC:ADC #'1'-32:STA TxPlyr 34 | LDA level:JSR HunTenUn 35 | ORA #'0'-32:STA TxGalax+2 36 | TYA:ORA #'0'-32:STA TxGalax+1 37 | TXA:ORA #'0'-32:STA TxGalax+0 38 | 39 | LDY #2:JSR pstring 40 | SEC:ROR NoFx \ Disable FXs so tune can be played! 41 | LDY #10:JSR PlayTune 42 | LDY #3:JSR frame_delay 43 | LDA #220:JSR MoveMeDelay \ 220 frame delay or spc and allow me move/fire 44 | LDY #2:JSR pstring 45 | CLC:ROR NoFx \ Enable FXs, tune is over! 46 | 47 | \ ------------------------------------------------------------ 48 | 49 | .main_loop 50 | BIT Escape:BMI Main2 \ Don't check Esc if already handling Escape 51 | LDA ObjSt+0:BPL Main2 \ Or if dead/exploding 52 | LSR A:BCS Main2 53 | 54 | BIT Demo:BPL Main4 \ If not demo mode 55 | JSR testspc:BEQ Main5 \ space bar has same effect as Escape in demo mode 56 | 57 | .Main4 58 | LDX #&8F:JSR check_key:BNE Main2 \ If Escape not pressed 59 | .Main5 60 | LDA #&80:STA Escape \ We are now in the 'Escape' phase 61 | JSR ExplNoB 62 | JSR DestrAll \ Tell processing code to explode ALL objects 63 | 64 | .Main2 65 | LDA counter:AND #&F:BNE Main6 66 | JSR EorArrow \ Flash arrow on/off 67 | 68 | .Main6 69 | CLI 70 | INC counter 71 | JSR TryStars:JSR TryMe 72 | JSR BullAlienCol 73 | JSR MeAlienCol 74 | JSR TryStars:JSR TryMe 75 | JSR MeAlBmbCol 76 | JSR DoSmart 77 | JSR ProcessAliens 78 | JSR InitInit 79 | JSR ProcessMyBombs 80 | JSR TryStars:JSR TryMe 81 | JSR ProcessAlBombs 82 | JSR OpKeys 83 | 84 | LDA ObjSt+0:BMI main_loop \ If my ID hasn't been killed off 85 | LDA ActAliens:ORA ActBullets:ORA ActAlBombs:BNE main_loop 86 | 87 | BIT Demo:BMI Main0 88 | LDA level:CMP HighestLev:BCC Main0 \ Not >= to highest level reached 89 | .Main1 90 | STA HighestLev 91 | 92 | .Main0 93 | BIT Escape:BPL Main3 \ If 'Escape' wasn't the cause of my death 94 | RTS 95 | 96 | .Main3 97 | DEC DieDelay:BEQ HasDied 98 | JMP main_loop 99 | 100 | \ ------------------------------------------------------------ 101 | 102 | .HasDied 103 | JSR PutArrow \ Show player's arrow 104 | JSR ShowLives \ Erase current player's lives 105 | DEC lives 106 | JSR ShwLiv \ Show lives as digit 107 | JSR SavePlyr \ Save player's info in their private w/space 108 | LDA lives:BNE HasDi2 109 | JSR pgamovr 110 | LDY #22:JSR PlayTune 111 | LDY #250:JSR frame_delay:LDY #50:JSR frame_delay 112 | JSR pgamovr 113 | JSR hig \ See if score is a new high 114 | JMP SkpTun 115 | 116 | .HasDi2 117 | LDY #16:JSR PlayTune 118 | LDY #100:JSR frame_delay 119 | .SkpTun 120 | JSR ShowFlags \ Erase current player's level 121 | BIT FnumPlyr:BPL HasDi0 122 | 123 | \ Process if 2 players 124 | 125 | LDA P1lives:ORA P2lives:BEQ HasDi1 \ Both players are now dead 126 | LDA Player:EOR #1:STA Player 127 | JSR ReadPlyr \ Get other player's info 128 | LDA lives:BNE HasDi3 \ Let him play if he's still got lives left 129 | LDA Player:EOR #1:STA Player \ Otherwise re-select last player again 130 | JSR ReadPlyr 131 | .HasDi3 132 | JMP NextLife 133 | 134 | \ Process if 1 player 135 | 136 | .HasDi0 137 | LDA lives:BEQ HasDi1 138 | JMP NextLife 139 | 140 | .HasDi1 141 | JSR ShowLives:JSR ShowFlags \ Re-show lives/level flags for last player 142 | RTS \ Back to 'Main' routine 143 | 144 | \\ ] 145 | 146 | \\ PRINT"Main loopB from &";~B%;" to &";~P%-1;" (";P%-B%;")" 147 | \\ PAGE=PG% 148 | \\ RETURN 149 | -------------------------------------------------------------------------------- /src/ObjPro.asm: -------------------------------------------------------------------------------- 1 | \\ 2 | \\ Galaforce 2 ( BBC Micro ) from the original 6502 source code, adapted to assemble using beebasm 3 | \\ 4 | \\ (c) Kevin Edwards 1987-2021 5 | \\ 6 | \\ Twitter @KevEdwardsRetro 7 | \\ 8 | 9 | \\ REM SAVE"$.Galaforce2.ObjPro" 10 | \\ B%=P% 11 | \\ [OPT pass 12 | 13 | .TryMe 14 | LDA VSyncCn2:BEQ TryMe0 15 | 16 | .TryMe1 17 | RTS 18 | 19 | .TryMe0 20 | JSR controls 21 | LDA Feature:CMP #2:BNE TryMe2 22 | LDA VSyncMast:AND #3:BEQ TryMe2 23 | LDA #0:STA XIndex:STA YIndex 24 | 25 | .TryMe2 26 | LDX #1:STX VSyncCn2 27 | DEX:STX CurrId 28 | LDA ObjSt+0:BPL TryMe1 \ Not if I don't exist 29 | 30 | \ Drop through and process me (ID=0) 31 | 32 | 33 | \ 'ObjectProcess' erases, processes and re-displays a given object 34 | \ On Entry CurrId = ID of object to be processed 35 | 36 | \ If the object processing wishes to init another alien it must 37 | \ set the object's info up and place the corresponding ID in the 38 | \ variable 'NewAlID'. If non-zero after 'JSR ActObjPro' then a 39 | \ 'put sprite' will be performed using that ID to display the object 40 | 41 | .ObjectProcess 42 | LDA #0:STA NewAlID \ 0 to indicate that no new object is to be init 43 | JSR ActObjPro \ The necessary erase/move/re-plot code 44 | LDY NewAlID:BEQ ObjPrEx \ If no new object is to be init 45 | 46 | LDX #0:JSR CalcSpInfo \ Calc info for 'put' routine 47 | JMP SusRightRout \ Actually 'put' the new object on the screen 48 | 49 | .ObjPrEx 50 | RTS 51 | 52 | \ This part actually erases, processes and re-displays an object 53 | 54 | .ActObjPro 55 | LDY CurrId:LDX #0:JSR CalcSpInfo \ Calc source info 56 | 57 | LDX CurrId:JSR Animate \ Animate graphic 58 | LDA ObjSt,X:BPL SusRightRout \ If alien ID has been killed (erase it) 59 | 60 | LDA ObjDestr,X:BPL ObPro1 \ If collision hasn't caused death! 61 | JSR KillObj \ Change object into exploding graphic 62 | JMP ObPro0 63 | 64 | .ObPro1 65 | JSR MoveObject \ Move object according to pattern data 66 | LDA ObjSt,X:BPL SusRightRout \ If ID has been killed by pattern prog. 67 | 68 | .ObPro0 69 | LDY CurrId:LDX #8:JSR CalcSpInfo \ Calc desti. info 70 | 71 | LDA SpInf+7:BNE SusPlot0 \ Do separate if source is 'clipped' 72 | LDA SpInf2+7:BNE SusPlot0 \ Do separate if dest. is 'clipped' 73 | LDA SpInf+4:BMI SusPlot1 \ Source width, take if off screen (if -ve) 74 | CMP SpInf2+4:BNE SusPlot0 \ Do separate if different widths 75 | 76 | LDA SpInf+5:BEQ SusPlot0 \ Do separate if source height=0 77 | LDA SpInf2+5:BEQ SusPlot0 \ Do separate if dest. height=0 78 | CMP SpInf+5:BNE SusPlot0 \ Do separate if different heights 79 | LDA SpInf+6:CMP SpInf2+6:BNE SusPlot0 \ Do separate if diff. gra index 80 | 81 | DEC SpInf+4 \ Width-1 for sprite tables 82 | JMP NormSprite \ Erase and plot sprite at same time 83 | 84 | \ Source and destination are to be plotted separately 85 | 86 | .SusPlot0 87 | JSR SusRightRout 88 | 89 | .SusPlot1 90 | LDA SpInf2+0:STA SpInf+0 \ Copy 'dest' info into 'source' w/space 91 | LDA SpInf2+1:STA SpInf+1 92 | LDA SpInf2+2:STA SpInf+2 93 | LDA SpInf2+3:STA SpInf+3 94 | LDA SpInf2+4:STA SpInf+4 95 | LDA SpInf2+5:STA SpInf+5 96 | LDA SpInf2+6:STA SpInf+6 97 | LDA SpInf2+7:STA SpInf+7 98 | 99 | .SusRightRout 100 | LDA SpInf+4:BMI SuRiR1 \ If sprite is off screen left/right (delay req'd) 101 | LDA SpInf+5:BEQ SuRiR1 \ If sprite height is 0 (off TOP of screen) 102 | DEC SpInf+4 \ Width-1 for sprite tables 103 | LDA SpInf+7:BNE SuRiR0 \ If clipped sprite 104 | JMP PutSprite 105 | 106 | .SuRiR0 107 | JMP ClipSprite 108 | 109 | .SuRiR1 110 | JMP SpCompB \ Delay equivalent to 'putting' a sprite 4*16 bytes 111 | 112 | .Animate 113 | LDA ObjSt,X:BPL Anim0 114 | LDA ObjInfo,X:AND #8:BNE Anim0 115 | DEC ObjFrm,X:BPL Anim0 116 | LDA ObjSt,X:LSR A:BCC Anim1 \ If not dying 117 | LDA ObjGTyp,X:BNE Anim1 \ If not exploding graphic 118 | 119 | .Anim2 120 | LDA #0:STA ObjSt,X \ Remove use of ID 121 | TXA:BEQ Anim0 \ If my ID 122 | DEC ActAliens 123 | RTS 124 | 125 | .Anim1 126 | LDA ObjNumFrm,X:STA ObjFrm,X 127 | .Anim0 128 | RTS 129 | 130 | \\ ] 131 | 132 | \\ PRINT"Obj.Proc. from &";~B%;" to &";~P%-1;" (";P%-B%;")" 133 | \\ PAGE=PG% 134 | \\ RETURN 135 | -------------------------------------------------------------------------------- /src/ObjPro2.asm: -------------------------------------------------------------------------------- 1 | \\ 2 | \\ Galaforce 2 ( BBC Micro ) from the original 6502 source code, adapted to assemble using beebasm 3 | \\ 4 | \\ (c) Kevin Edwards 1987-2021 5 | \\ 6 | \\ Twitter @KevEdwardsRetro 7 | \\ 8 | 9 | \\ REM SAVE"$.Galaforce2.ObjPro2" 10 | \\ B%=P% 11 | \\ [OPT pass 12 | 13 | \ 'MoveObject' processes the movement of an object using its pattern 14 | \ data, or in the case of my ship, the contents of 'XIndex' and 'YIndex' 15 | \ are used. 16 | 17 | \ On Entry 'CurrId' = Valid ID of object being moved 18 | 19 | .MoveObject 20 | LDX CurrId:BNE MvObj0 \ If not my ID 21 | 22 | LDA ObjSt+0:LSR A:BCS MvObj2 \ Don't move me if I'm exploding 23 | 24 | LDA ShipInfo:AND #3:CLC:ADC #1 25 | CMP ObjGTyp+0:BEQ MveNewG \ No graphic change 26 | TAY:LDX #0:JSR InitObj 27 | 28 | .MveNewG 29 | LDA ObjX+0:CLC:ADC XIndex 30 | CMP #WindMinX:BCC FlpDemDir 31 | CMP #WindMaxX-6:BCS FlpDemDir 32 | STA ObjX+0:JMP MvObj1 33 | 34 | .FlpDemDir 35 | LDA DemoDir:EOR #&80:STA DemoDir \ Done even if not in demo mode 36 | 37 | .MvObj1 38 | LDA ObjY+0:CLC:ADC YIndex 39 | CMP #&98:BCC MvObj2 40 | CMP #&F0:BCS MvObj2 41 | STA ObjY+0 42 | .MvObj2 43 | RTS 44 | 45 | .MvObj0 46 | LDA ObjSt,X:LSR A:BCS MvObj2 \ RTS, Don't move an exploding object 47 | LDA ObjDirCnt,X:BNE MvObj3 48 | .MvObj7 49 | LDA ObjSt,X:LSR A:BCS MvObj2 \ RTS if it has been killed 50 | LDY ObjPat,X 51 | LDA TPatDatLo,Y:STA temp1 52 | LDA TPatDatHi,Y:STA temp1+1 53 | LDY ObjPOff,X 54 | LDA (temp1),Y:STA ObjDirCnt,X 55 | INY:LDA (temp1),Y:STA ObjRelY,X \ Temp hold of Packed RelX/Y! OR Param 56 | INY:TYA:STA ObjPOff,X 57 | 58 | LDA ObjDirCnt,X:BPL MvObj5 59 | AND #&7F:TAY 60 | LDA TPatComLo,Y:STA temp2 61 | LDA TPatComHi,Y:STA temp2+1 62 | JMP (temp2) 63 | 64 | .MvObj5 65 | LDA ObjRelY,X:AND #&F 66 | LDY ObjPFlip,X:BPL MvObj6 67 | EOR #8 68 | .MvObj6 69 | TAY:LDA TRelXCon,Y:STA ObjRelX,X 70 | LDA ObjRelY,X 71 | LSR A:LSR A:LSR A:LSR A:TAY 72 | LDA TRelYCon,Y:STA ObjRelY,X 73 | 74 | .MvObj3 75 | DEC ObjDirCnt,X 76 | LDA ObjX,X:CLC:ADC ObjRelX,X 77 | CMP #XKill:BCC MvObj4 78 | JMP KillObj \ Explode object and RTS 79 | 80 | .MvObj4 81 | STA ObjX,X 82 | LDA ObjY,X:CLC:ADC ObjRelY,X 83 | STA ObjY,X 84 | RTS 85 | 86 | .TRelXCon 87 | EQUB 0:EQUB +1:EQUB +2:EQUB +3:EQUB +4:EQUB +5:EQUB +6:EQUB +7 88 | EQUB 0:EQUB -1:EQUB -2:EQUB -3:EQUB -4:EQUB -5:EQUB -6:EQUB -7 89 | 90 | .TRelYCon 91 | EQUB 0:EQUB +2:EQUB +4:EQUB +6:EQUB +8:EQUB +10:EQUB +12:EQUB +14 92 | EQUB 0:EQUB -2:EQUB -4:EQUB -6:EQUB -8:EQUB -10:EQUB -12:EQUB -14 93 | 94 | .TPatComLo 95 | EQUB MvNewInd MOD &100 96 | EQUB MvFor MOD &100 97 | EQUB MvNext MOD &100 98 | EQUB MvDie MOD &100 99 | EQUB MvInAl MOD &100 100 | EQUB MvRndPat MOD &100 101 | EQUB MvBotSeg MOD &100 102 | EQUB MvNewGra MOD &100 103 | EQUB MvHomeIn MOD &100 104 | EQUB MvRndInAl MOD &100 105 | EQUB MvNewPat MOD &100 106 | EQUB MvTopSeg MOD &100 107 | 108 | .TPatComHi 109 | EQUB MvNewInd DIV &100 110 | EQUB MvFor DIV &100 111 | EQUB MvNext DIV &100 112 | EQUB MvDie DIV &100 113 | EQUB MvInAl DIV &100 114 | EQUB MvRndPat DIV &100 115 | EQUB MvBotSeg DIV &100 116 | EQUB MvNewGra DIV &100 117 | EQUB MvHomeIn DIV &100 118 | EQUB MvRndInAl DIV &100 119 | EQUB MvNewPat DIV &100 120 | EQUB MvTopSeg DIV &100 121 | 122 | .MvNewInd 123 | LDA ObjRelY,X:STA ObjPOff,X 124 | JMP MvObj7 125 | 126 | .MvFor 127 | LDA ObjRelY,X:STA ObjFCnt,X 128 | LDA ObjPOff,X:STA ObjFOff,X 129 | JMP MvObj7 130 | 131 | .MvNext 132 | DEC ObjFCnt,X:BEQ MvNex0 133 | LDA ObjFOff,X:STA ObjPOff,X 134 | JMP MvObj7 135 | 136 | .MvNex0 137 | DEC ObjPOff,X 138 | JMP MvObj7 139 | 140 | .MvDie 141 | JSR KillObj 142 | JMP MvObj7 143 | 144 | .MvRndInAl 145 | JSR rand:AND #7:BNE MvInA2 146 | 147 | .MvInAl 148 | LDA ObjSt+0:BPL MvInA2 \ No alien init if I'm dead or exploding 149 | LSR A:BCS MvInA2 150 | 151 | LDY MaxAlID 152 | .MvInA0 153 | LDA ObjSt,Y:BPL MvInA1 154 | DEY:BNE MvInA0 155 | 156 | .MvInA2 157 | INC ObjPOff,X \ Make sure pointer skips over the two param bytes 158 | JMP MvObj7 159 | 160 | .MvInA1 161 | LDA NewAlID:BNE MvInA2 \ No new init if another is waiting to be init 162 | \ shouldn't occur, but just in case! 163 | INC ActAliens 164 | STY NewAlID \ Save new alien ID 'flag' for plotting in 'ObjPro' 165 | LDA ObjX,X:STA ObjX,Y 166 | LDA ObjY,X:STA ObjY,Y 167 | LDA ObjPFlip,X:STA ObjPFlip,Y 168 | LDA ObjRelY,X:STA ObjPat,Y \ 1st param is new alien's pattern 169 | 170 | LDY ObjPOff,X:INC ObjPOff,X \ Adjust for param byte 2 171 | LDA (temp1),Y:CLC:ADC #AlGraBase:TAY \ 2nd param is graphic type of alien 172 | LDX NewAlID:JSR InitObj \ Set up variables for new object 173 | LDA ObjY,X:CLC:ADC ObjHei,X:STA ObjY,X 174 | LDA ObjXWid,X:LSR A:CLC:ADC ObjX,X:STA ObjX,X 175 | LDX CurrId:JMP MvObj7 \ Restore ID of object originally being processed 176 | 177 | .MvRndPat 178 | JSR rand:BMI MvRnP0 \ 50/50 chance of new pattern being taken 179 | .MvNewPat 180 | LDA ObjRelY,X:STA ObjPat,X 181 | LDA #0:STA ObjPOff,X 182 | 183 | .MvRnP0 184 | JMP MvObj7 185 | 186 | .MvBotSeg 187 | LDA ObjY,X:CMP #&D8:BCS MvBot0 188 | LDA ObjRelY,X:STA ObjPOff,X 189 | .MvBot0 190 | JMP MvObj7 191 | 192 | .MvNewGra 193 | LDA ObjPOff,X:PHA \ InitObj 0s pattern offset, so must be saved 194 | LDA ObjRelY,X:CLC:ADC #AlGraBase:TAY:JSR InitObj 195 | PLA:STA ObjPOff,X 196 | JMP MvObj7 197 | 198 | .MvHomeIn 199 | LDA ObjX,X:CMP ObjX+0:BCC MvHo0 200 | LDA #&80:BMI MvHo1 201 | .MvHo0 202 | LDA #0 203 | .MvHo1 204 | STA ObjPFlip,X 205 | DEC ObjPOff,X 206 | JMP MvObj7 207 | 208 | .MvTopSeg 209 | LDA ObjY,X:CMP #&40:BCC MvTop0 210 | LDA ObjRelY,X:STA ObjPOff,X 211 | .MvTop0 212 | JMP MvObj7 213 | 214 | \\ ] 215 | 216 | \\ PRINT"Obj.Pro. 2 from &";~B%;" to &";~P%-1;" (";P%-B%;")" 217 | \\ PAGE=PG% 218 | \\ RETURN 219 | -------------------------------------------------------------------------------- /src/Object1.asm: -------------------------------------------------------------------------------- 1 | \\ 2 | \\ Galaforce 2 ( BBC Micro ) from the original 6502 source code, adapted to assemble using beebasm 3 | \\ 4 | \\ (c) Kevin Edwards 1987-2021 5 | \\ 6 | \\ Twitter @KevEdwardsRetro 7 | \\ 8 | 9 | \\ REM SAVE"$.Galaforce2.Object1" 10 | \\ B%=P% 11 | \\ [OPT pass 12 | 13 | .InitObj 14 | LDA #&80 15 | STA ObjSt,X 16 | LDA #0 17 | STA ObjPOff,X 18 | STA ObjDestr,X 19 | STA ObjDirCnt,X 20 | 21 | .InitObjB 22 | TYA:STA ObjGTyp,X 23 | LDA TGTypConv,Y:STA ObjGra,X 24 | LDA TSpWid,Y:STA ObjWid,X 25 | LDA TSpXWid,Y:STA ObjXWid,X 26 | LDA TSpHei,Y:STA ObjHei,X 27 | LDA TSpNFrm,Y:STA ObjNumFrm,X:STA ObjFrm,X 28 | LDA TSpHits,Y:STA ObjHits,X 29 | LDA TSpInfo,Y:STA ObjInfo,X 30 | RTS 31 | 32 | .TSpWid 33 | EQUB 4:EQUB 4:EQUB 4:EQUB 4 34 | EQUB 4:EQUB 4:EQUB 4:EQUB 4:EQUB 4:EQUB 4 35 | EQUB 4:EQUB 4:EQUB 4:EQUB 4:EQUB 4:EQUB 4 36 | EQUB 3:EQUB 2 37 | EQUB 4:EQUB 4:EQUB 4:EQUB 4 38 | 39 | .TSpXWid 40 | EQUB 7:EQUB 7:EQUB 7:EQUB 7 41 | EQUB 7:EQUB 7:EQUB 7:EQUB 7:EQUB 7:EQUB 7 42 | EQUB 7:EQUB 7:EQUB 7:EQUB 7:EQUB 7:EQUB 7 43 | EQUB 5:EQUB 3 44 | EQUB 7:EQUB 7:EQUB 7:EQUB 7 45 | 46 | .TSpHei 47 | EQUB 16:EQUB 16:EQUB 16:EQUB 16 48 | EQUB 16:EQUB 16:EQUB 16:EQUB 16:EQUB 16:EQUB 16 49 | EQUB 16:EQUB 16:EQUB 16:EQUB 16:EQUB 16:EQUB 7 50 | EQUB 8:EQUB 8 51 | EQUB 32:EQUB 32:EQUB 32:EQUB 32 52 | 53 | .TSpNFrm 54 | EQUB 6-1:EQUB 1-1:EQUB 1-1:EQUB 1-1 55 | EQUB 1-1:EQUB 1-1:EQUB 1-1:EQUB 1-1:EQUB 1-1:EQUB 1-1 56 | EQUB 1-1:EQUB 1-1:EQUB 1-1:EQUB 1-1:EQUB 2-1:EQUB 1-1 57 | EQUB 1-1:EQUB 2-1 58 | EQUB 1-1:EQUB 1-1:EQUB 1-1:EQUB 1-1 59 | 60 | .TSpHits 61 | EQUB 1:EQUB 1:EQUB 1:EQUB 1 62 | EQUB 1:EQUB 1:EQUB 1:EQUB 1:EQUB 1:EQUB 2 63 | EQUB 2:EQUB 2:EQUB 12:EQUB 1:EQUB 2:EQUB 1 64 | EQUB 1:EQUB 1 65 | EQUB 32:EQUB 32:EQUB 36:EQUB 36 66 | 67 | .TSpInfo 68 | EQUB 0:EQUB 0:EQUB &80:EQUB 0 69 | EQUB 0:EQUB 0:EQUB 0:EQUB 0:EQUB 0:EQUB 0 70 | EQUB 0:EQUB 0:EQUB &82:EQUB 0:EQUB &48:EQUB &61 71 | EQUB &61:EQUB 1 72 | EQUB 6:EQUB 6:EQUB 6:EQUB 6 73 | 74 | .TGTypScore 75 | EQUB 0:EQUB 0:EQUB 0:EQUB 0 76 | EQUB 6:EQUB 4:EQUB 5:EQUB 10:EQUB 8:EQUB 10 77 | EQUB 12:EQUB 9:EQUB 20:EQUB 5:EQUB 20:EQUB 0 78 | EQUB 0:EQUB 0 79 | EQUB 150:EQUB 150:EQUB 200:EQUB 200 80 | 81 | .KillObj 82 | LDY #0:JSR InitObj 83 | LDA #&81:STA ObjSt,X 84 | RTS 85 | 86 | .InitMe 87 | LDX #0:LDA ShipInfo:AND #3:TAY:INY:JSR InitObj 88 | LDA #XExcess+36:STA ObjX+0 89 | LDA #&E8+3:STA ObjY+0 90 | LDX #0:LDY #0:JSR CalcSpInfo 91 | JMP SusRightRout 92 | 93 | \ 'CalcSpInfo' calcs all the necessary data required by the sprite 94 | \ routine for a given ID. 95 | 96 | \ On entry X=0 or 8 for the two different 'banks' of sprite workspace 97 | \ for source and destination images. 98 | \ Y=ID of object being calculated. 99 | 100 | \ On Exit SpInf+0/+1,X = Screen address of bottom left of sprite 101 | \ SpInf+2/+3,X = Address of graphics base 102 | \ SpInf+4,X = Width-1 of sprite in bytes (-ve if off sceeen) 103 | \ SpInf+5,X = Height of sprite 104 | \ SpInf+6,X = Start offset into graphic data 105 | \ SpInf+7,X = Clip 'skip' value (non-zero means clip) 106 | 107 | \ If SpInf+4,X is -ve then all 'Exit' variables are INVALID! as the sprite 108 | \ is totally off the screen. True also if SpInf+5,X (height) = 0. 109 | 110 | 111 | .CalcSpInfo 112 | LDA ObjWid,Y:STA SpInf+4,X \ Default width (in bytes) to plot 113 | LDA ObjHei,Y:STA SpInf+5,X \ Height to plot 114 | LDA #0:STA SpInf+6,X \ Default start index into graphics 115 | STA SpInf+7,X \ Default clip flag (no clip) 116 | 117 | STY temp1 \ Save Y 118 | LDA ObjX,Y:LSR A:LDA #0 119 | BCC ClcSpI2 120 | LDA ObjNumFrm,Y:ADC #0 \ +1 to fudge for correct frame number, C=0 after 121 | .ClcSpI2 122 | ADC ObjGra,Y:ADC ObjFrm,Y:TAY 123 | LDA TSpGraLo,Y:STA SpInf+2,X 124 | LDA TSpGraHi,Y:STA SpInf+3,X 125 | LDY temp1 \ Restore Y 126 | 127 | \ Do some Y clipping with the TOP only! 128 | 129 | LDA ObjY,Y:SEC:SBC #WindMinY-1 130 | BCC ClcSpI4 \ Off top of window 131 | BEQ ClcSpI4 \ ditto 132 | 133 | CMP ObjHei,Y:BCS ClcSpI5 \ No Y clip 134 | BCC ClcSpI6 \ Always 135 | 136 | .ClcSpI4 137 | LDA #0 138 | .ClcSpI6 139 | STA SpInf+5,X \ New height to plot 140 | 141 | \ Do some X clipping 142 | 143 | .ClcSpI5 144 | LDA ObjX,Y:CMP #WindMaxX:BCS ClcSpI1 \ Totally off to right 145 | SEC:SBC #XExcess:BCC ClcSpI0 \ To left of screen 146 | LSR A:STA temp2+1 \ Byte offset 0,1,2...39 of sprite 147 | 148 | \ Test for Possible right edge clip 149 | 150 | CLC:ADC ObjWid,Y 151 | SEC:SBC #40:BCC ClcSpI3 \ If no clip at all 152 | 153 | STA SpInf+6,X:STA SpInf+7,X \ New gra offset & 'skip' value 154 | LDA ObjWid,Y:SEC:SBC SpInf+7,X:STA SpInf+4,X \ new width to plot 155 | JMP ClcSpI3 156 | 157 | \ Possible left edge clip 158 | 159 | .ClcSpI0 160 | LDA #WindMinX-1:SEC:SBC ObjX,Y 161 | LSR A:CLC:ADC #1 162 | CMP ObjWid,Y:BCS ClcSpI1 \ Totally off to left 163 | 164 | STA SpInf+7,X \ clip 'skip' value 165 | LDA ObjWid,Y:SEC:SBC SpInf+7,X:STA SpInf+4,X \ new width to plot 166 | 167 | STX temp2+1 168 | LDX #0:LDA ObjY,Y:TAY:JSR xycalc 169 | LDY temp2+1:STA SpInf+1,Y:TXA:STA SpInf,Y 170 | RTS 171 | 172 | .ClcSpI3 173 | STX temp2+1 174 | LDA ObjX,Y:SEC:SBC #XExcess:TAX:LDA ObjY,Y:TAY:JSR xycalc 175 | LDY temp2+1:STA SpInf+1,Y:TXA:STA SpInf,Y 176 | RTS 177 | 178 | .ClcSpI1 179 | LDA #&FF:STA SpInf+4,X \ All sprite is off screen 180 | RTS 181 | 182 | \\ ] 183 | 184 | \\ PRINT"Object 1 from &";~B%;" to &";~P%-1;" (";P%-B%;")" 185 | \\ PAGE=PG% 186 | \\ RETURN 187 | -------------------------------------------------------------------------------- /src/Object2.asm: -------------------------------------------------------------------------------- 1 | \\ 2 | \\ Galaforce 2 ( BBC Micro ) from the original 6502 source code, adapted to assemble using beebasm 3 | \\ 4 | \\ (c) Kevin Edwards 1987-2021 5 | \\ 6 | \\ Twitter @KevEdwardsRetro 7 | \\ 8 | 9 | \\ REM SAVE"$.Galaforce2.Object2" 10 | 11 | InAllDead = &00 12 | InInExh = &01 13 | WtAllDead = &02 14 | WtInExh = &03 15 | InAlways = &80+4 16 | CtrlFor = &80+5 17 | CtrlNext = &80+6 18 | CtrlGoto = &80+7 19 | ChMaxAlID = &08 20 | CtrlZonEnd = &09 21 | InAlDeFlp = &0A 22 | CtrlDummy = &0B 23 | InAlwFeat = &80+&C 24 | InExhFeat = &0D 25 | 26 | \\ B%=P% 27 | \\ [OPT pass 28 | 29 | .CallInd 30 | JMP (temp1) 31 | 32 | .InitInit 33 | LDA ObjSt+0:BPL InIn2 34 | LSR A:BCS InIn2 35 | 36 | LDA SectAddr:STA temp5 37 | LDA SectAddr+1:STA temp5+1 38 | 39 | .InIn0 40 | LDY SectOff 41 | LDA (temp5),Y:INY 42 | STA temp5+2:AND #&7F:TAX 43 | LDA TInCommLo,X:STA temp1 44 | LDA TInCommHi,X:STA temp1+1 45 | JSR CallInd \ Jump to action address in 'temp1' 46 | 47 | .InIn1 48 | BIT temp5+2:BMI InIn0 \ Continue interpretation 49 | 50 | .InIn2 51 | RTS 52 | 53 | .TInCommLo 54 | EQUB InCom0 MOD &100 55 | EQUB InCom1 MOD &100 56 | EQUB InCom2 MOD &100 57 | EQUB InCom3 MOD &100 58 | EQUB InCom4 MOD &100 59 | EQUB InCom5 MOD &100 60 | EQUB InCom6 MOD &100 61 | EQUB InCom7 MOD &100 62 | EQUB InCom8 MOD &100 63 | EQUB InCom9 MOD &100 64 | EQUB InCom10 MOD &100 65 | EQUB InCom11 MOD &100 66 | EQUB InCom12 MOD &100 67 | EQUB InCom13 MOD &100 68 | 69 | .TInCommHi 70 | EQUB InCom0 DIV &100 71 | EQUB InCom1 DIV &100 72 | EQUB InCom2 DIV &100 73 | EQUB InCom3 DIV &100 74 | EQUB InCom4 DIV &100 75 | EQUB InCom5 DIV &100 76 | EQUB InCom6 DIV &100 77 | EQUB InCom7 DIV &100 78 | EQUB InCom8 DIV &100 79 | EQUB InCom9 DIV &100 80 | EQUB InCom10 DIV &100 81 | EQUB InCom11 DIV &100 82 | EQUB InCom12 DIV &100 83 | EQUB InCom13 DIV &100 84 | 85 | .InCom0 86 | LDA ActAliens:ORA ActInits:BNE InCEx 87 | JMP InitInVarB 88 | 89 | .InCom1 90 | LDA ActInits:BNE InCEx 91 | JMP InitInVarB 92 | 93 | .InCom2 94 | LDA ActAliens:ORA ActInits:BNE InCEx 95 | STY SectOff:RTS 96 | 97 | .InCom3 98 | LDA ActInits:BNE InCEx 99 | STY SectOff:RTS 100 | 101 | .InCom4 102 | JMP InitInVarB 103 | 104 | .InCom5 105 | LDA (temp5),Y:INY:STY SectOff 106 | STA VInFCnt:STY VInFOff 107 | RTS 108 | 109 | .InCom6 110 | DEC VInFCnt:BEQ InC60 111 | LDA VInFOff:STA SectOff 112 | RTS 113 | 114 | .InC60 115 | STY SectOff:RTS 116 | 117 | .InCom7 118 | LDA (temp5),Y:STA SectOff 119 | RTS 120 | 121 | .InCom8 122 | LDA ActAliens:ORA ActInits:BNE InCEx 123 | LDA (temp5),Y:INY:STY SectOff 124 | STA MaxAlID:STA UptoID 125 | 126 | .InCEx 127 | RTS 128 | 129 | .InCom9 130 | LDA ActAliens:ORA ActInits:BNE InCEx 131 | JSR ShowFlags 132 | INC level 133 | JSR ShowFlags 134 | JSR InitLev 135 | LDA SectAddr:STA temp5 136 | LDA SectAddr+1:STA temp5+1 137 | RTS 138 | 139 | .InCom10 140 | LDA ActAliens:ORA ActInits:BNE InCEx 141 | LDA (temp5),Y:INY:STY SectOff 142 | PHA 143 | JSR InitInVar 144 | PLA:EOR #&80 \ Toggle reverse flag bit 145 | JMP InitInVar 146 | 147 | .InCom11 148 | RTS 149 | 150 | .InCom13 151 | LDA ActInits:BNE InCEx 152 | 153 | .InCom12 154 | JSR InitInVarB:LDY SectOff:BCS InCom12F \ Allocation fail! 155 | LDA (temp5),Y:STA InitFeat,X 156 | LDA #AlGraBase+10:STA InitGTyp,X 157 | LDA #1:STA InitNum,X 158 | .InCom12F 159 | INY:STY SectOff 160 | RTS 161 | 162 | .InitInVarB 163 | LDA (temp5),Y:INY:STY SectOff 164 | 165 | .InitInVar 166 | TAY:LDX #MaxInit-1 167 | .InInVa2 168 | LDA InitSt,X:BPL InInVa3 169 | DEX:BPL InInVa2 170 | SEC:RTS \ Failed to allocate to 'Init' var. C=1 171 | 172 | .InInVa3 173 | INC ActInits 174 | LDA #&80:STA InitSt,X 175 | TYA:STA temp2:STA InitPFlip,X 176 | AND #&7F:TAY 177 | LDA TPatInLo,Y:STA temp1 178 | LDA TPatInHi,Y:STA temp1+1 179 | LDY #0 180 | LDA (temp1),Y:STA InitPat,X 181 | INY:LDA (temp1),Y 182 | CMP #&F0:BCS InInVa0 \ If an X coordinate ctrl value, don't 'flip' it 183 | BIT temp2:BPL InInVa0 184 | STA temp2+1:LDA #XKill:SEC:SBC temp2+1 185 | 186 | .InInVa0 187 | STA InitX,X 188 | INY:LDA (temp1),Y:STA InitY,X 189 | INY:LDA (temp1),Y 190 | BIT temp2:BPL InInVa1 191 | EOR #&FF:CLC:ADC #1 192 | 193 | .InInVa1 194 | STA InitRelX,X 195 | INY:LDA (temp1),Y:STA InitRelY,X 196 | INY:LDA (temp1),Y:CLC:ADC #AlGraBase:STA InitGTyp,X 197 | INY:LDA (temp1),Y:STA InitNum,X 198 | INY:LDA (temp1),Y:STA InitDelay,X:STA InitRDelay,X 199 | CLC 200 | 201 | .PrIni6 202 | RTS 203 | 204 | .ProcessInit 205 | LDA ObjSt+0:BPL PrIni6 \ I'm dead/exploding 206 | LSR A:BCS PrIni6 \ RTS in both cases 207 | 208 | LDX #MaxInit-1 209 | .PrIni0 210 | LDA InitSt,X:BPL PrIni1 211 | LDA InitDelay,X:BEQ PrIni2 212 | DEC InitDelay,X 213 | .PrIni1 214 | DEX:BPL PrIni0 215 | RTS 216 | 217 | .PrIni2 218 | LDA InitRDelay,X:STA InitDelay,X 219 | LDY MaxAlID 220 | .PrIni3 221 | LDA ObjSt,Y:BPL PrIni4 222 | DEY:BNE PrIni3 223 | BEQ PrIni1 \ Always 224 | 225 | .PrIni4 226 | DEC InitNum,X:BNE PrIni5 227 | LDA #0:STA InitSt,X 228 | DEC ActInits 229 | 230 | .PrIni5 231 | INC ActAliens 232 | STX LoopA:STY LoopB \ Save IDs and juggle them about 233 | LDY InitGTyp,X:LDX LoopB:JSR InitObj 234 | LDX LoopA:LDY LoopB 235 | LDA InitFeat,X:STA ObjFeat,Y 236 | LDA InitX,X:STA ObjX,Y 237 | CLC:ADC InitRelX,X:STA InitX,X 238 | LDA InitY,X:STA ObjY,Y 239 | CLC:ADC InitRelY,X:STA InitY,X 240 | LDA InitPat,X:STA ObjPat,Y 241 | LDA InitPFlip,X:STA ObjPFlip,Y 242 | 243 | LDA ObjX,Y:CMP #&F0:BCC PrIni8 \ If not a ctrl 'X' value 244 | JSR rand:AND #&1F 245 | LDX ObjPFlip,Y:BMI PrIni9 246 | CLC:ADC #WindMinX 247 | JMP PrIni10 248 | 249 | .PrIni9 250 | STA temp1 251 | LDA #WindMaxX:SEC:SBC temp1 252 | 253 | .PrIni10 254 | STA ObjX,Y 255 | 256 | .PrIni8 257 | LDA ObjPFlip,Y:BPL PrIni7 258 | LDA ObjX,Y:SEC:SBC ObjXWid,Y \ Do additional X adjustment for reverse pat 259 | STA ObjX,Y \ now that 'XWid' and final 'X' are known 260 | 261 | .PrIni7 262 | LDX #0:JSR CalcSpInfo 263 | JSR SusRightRout 264 | LDX LoopA:JMP PrIni1 265 | 266 | \\ ] 267 | 268 | \\ PRINT"Object 2 from &";~B%;" to &";~P%-1;" (";P%-B%;")" 269 | \\ PAGE=PG% 270 | \\ RETURN 271 | -------------------------------------------------------------------------------- /src/Object3.asm: -------------------------------------------------------------------------------- 1 | \\ 2 | \\ Galaforce 2 ( BBC Micro ) from the original 6502 source code, adapted to assemble using beebasm 3 | \\ 4 | \\ (c) Kevin Edwards 1987-2021 5 | \\ 6 | \\ Twitter @KevEdwardsRetro 7 | \\ 8 | 9 | \\ REM SAVE"$.Galaforce2.Object3" 10 | \\ B%=P% 11 | \\ [OPT pass 12 | 13 | .ProcessAliens 14 | LDA #process:STA LoopC 15 | LDX UptoID 16 | 17 | .PrAli0 18 | STX CurrId:STX UptoID 19 | LDA ObjSt,X:BPL PrAli3 20 | 21 | JSR ObjectProcess \ Move/Animate object 22 | JMP PrAli1 23 | 24 | .PrAli3 25 | JSR SpCompensate \ Delay loop = time to plot/unplot 1 sprite 26 | 27 | .PrAli1 28 | JSR TryMe \ See if vsync has occured, process me if true 29 | JSR TryStars \ See if vsync has occured, process stars if so 30 | 31 | LDX UptoID 32 | LDA ObjSt,X:BPL PrAli4 33 | LDA ObjInfo,X:AND #2:BEQ PrAli7 \ If normal firepowered alien 34 | JSR rand:AND #7:BNE PrAli4 35 | BEQ PrAli5 36 | 37 | .PrAli7 38 | LDA level:CMP #40:BCC PrAli6 39 | CMP #52:BCC PrAli8 40 | 41 | JSR rand:AND #&3F:BNE PrAli4 \ 1 in 64 chance (levels 52+) 42 | BEQ PrAli5 43 | 44 | .PrAli8 45 | JSR rand:AND #&7F:BNE PrAli4 \ 1 in 128 chance (levels 40+) 46 | BEQ PrAli5 47 | 48 | .PrAli6 49 | JSR rand:BNE PrAli4 \ 1 in 256 chance 50 | .PrAli5 51 | JSR InitAlBomb \ Try to init bomb (must be alive ID and on screen etc) 52 | LDX UptoID \ Restore ID 53 | 54 | .PrAli4 55 | INX:CPX MaxAlID:BCC PrAli2:BEQ PrAli2 56 | JSR ProcessInit \ Vital to keep everything in sync! 57 | LDX #1 58 | INC AlCounter \ INC every time ALL the aliens are processed 59 | 60 | .PrAli2 61 | DEC LoopC:BNE PrAli0 62 | STX UptoID 63 | RTS 64 | 65 | \ Approx. delay for 'putting' a 4 by 16 byte sprite 66 | 67 | .SpCompB 68 | LDY #16:BNE SpCom0 69 | 70 | \ Approx. delay for 'erasing and re-plotting' a 4 by 16 byte sprite 71 | 72 | .SpCompensate 73 | LDY #32 74 | 75 | .SpCom0 76 | LDX #19 77 | .SpCom1 78 | DEX:BNE SpCom1 79 | DEY:BNE SpCom0 80 | RTS 81 | 82 | \\ ] 83 | 84 | \\ PRINT"Object 3 from &";~B%;" to &";~P%-1;" (";P%-B%;")" 85 | \\ PAGE=PG% 86 | \\ RETURN 87 | -------------------------------------------------------------------------------- /src/PatDat1.asm: -------------------------------------------------------------------------------- 1 | \\ 2 | \\ Galaforce 2 ( BBC Micro ) from the original 6502 source code, adapted to assemble using beebasm 3 | \\ 4 | \\ (c) Kevin Edwards 1987-2021 5 | \\ 6 | \\ Twitter @KevEdwardsRetro 7 | \\ 8 | 9 | \\ REM SAVE"$.Galaforce2.PatDat1" 10 | \\ B%=P% 11 | 12 | ToNewInd=&80 13 | ToFor=&81:ToNext=&82 14 | ToDie=&83 15 | ToInitA=&84 16 | ToRndPat=&85 17 | ToBotSeg=&86 18 | ToNewGra=&87 19 | ToHomeIn=&88 20 | ToRInitA=&89 21 | ToNewPat=&8A 22 | ToTopSeg=&8B 23 | 24 | \\ [OPT pass 25 | 26 | .PtD0 27 | EQUB 22:EQUB &3 28 | EQUB 8:EQUB &22 29 | EQUB 10:EQUB &30 30 | EQUB 8:EQUB &2A 31 | EQUB 24:EQUB &B 32 | EQUB ToDie 33 | 34 | .PtD1 35 | EQUB 10:EQUB &B3 36 | EQUB 2:EQUB &C2 37 | EQUB 2:EQUB &C0 38 | EQUB 2:EQUB &CA 39 | EQUB 2:EQUB &C 40 | EQUB 2:EQUB &4A 41 | EQUB 2:EQUB &40 42 | EQUB 2:EQUB &42 43 | EQUB 2:EQUB &2 44 | EQUB 2:EQUB &4 45 | EQUB 4:EQUB &B3 46 | EQUB 10:EQUB &D5 47 | EQUB ToDie 48 | 49 | .PtD2 50 | EQUB 13:EQUB &3 51 | EQUB ToFor:EQUB 4 52 | EQUB 6:EQUB &30 53 | EQUB 3:EQUB &0 54 | EQUB 6:EQUB &A 55 | EQUB ToNext 56 | EQUB 28:EQUB &94 57 | EQUB ToDie 58 | 59 | .PtD3 60 | EQUB 17:EQUB &43 61 | EQUB 5:EQUB 3 62 | EQUB 12:EQUB &CB 63 | EQUB 12:EQUB &C 64 | EQUB ToDie 65 | 66 | .PtD4 67 | EQUB 6:EQUB &40 68 | EQUB 6:EQUB &3A 69 | EQUB 5:EQUB &B 70 | EQUB 3:EQUB &39 71 | EQUB 2:EQUB &40 72 | EQUB 3:EQUB &31 73 | EQUB 20:EQUB &24 74 | EQUB ToDie 75 | 76 | .PtD5 77 | EQUB 4:EQUB 3 78 | EQUB 14:EQUB &51 79 | EQUB 4:EQUB &43 80 | EQUB 3:EQUB &22 81 | EQUB 2:EQUB &2 82 | EQUB 3:EQUB &A2 83 | EQUB 4:EQUB &C3 84 | EQUB 14:EQUB &D1 85 | EQUB 4:EQUB 3 86 | EQUB ToDie 87 | 88 | .PtD6 89 | EQUB 3:EQUB 3 90 | EQUB 14:EQUB &D0 91 | EQUB 6:EQUB &B0 92 | EQUB 2:EQUB &A0 93 | EQUB 5:EQUB &21 94 | EQUB 8:EQUB &43 95 | EQUB 2:EQUB 4 96 | EQUB 8:EQUB &C3 97 | EQUB 5:EQUB &A1 98 | EQUB 2:EQUB &20 99 | EQUB 6:EQUB &30 100 | EQUB 14:EQUB &50 101 | EQUB 3:EQUB 3 102 | EQUB ToDie 103 | 104 | .PtD7 105 | EQUB 26:EQUB &14 106 | EQUB 26:EQUB &1C 107 | EQUB ToNewInd:EQUB 0 108 | 109 | .PtD8 110 | EQUB 18:EQUB &30 111 | EQUB 1:EQUB &4 112 | EQUB 24:EQUB &20 113 | EQUB 20:EQUB &D4 114 | EQUB ToDie 115 | 116 | .PtD9 117 | EQUB 3:EQUB &4 118 | EQUB ToFor:EQUB 5 119 | EQUB 3:EQUB &4 120 | EQUB ToInitA:EQUB 10:EQUB 2 121 | EQUB ToNext 122 | EQUB 7:EQUB &4 123 | EQUB ToDie 124 | 125 | .PtD10 126 | EQUB 3:EQUB &1 127 | EQUB 2:EQUB &10 128 | EQUB 3:EQUB &9 129 | EQUB 2:EQUB &90 130 | EQUB ToNewInd:EQUB 0 131 | 132 | .PtD11 133 | EQUB 10:EQUB &C1 134 | EQUB 4:EQUB &B2 135 | EQUB 2:EQUB &93 136 | EQUB 2:EQUB &13 137 | EQUB 2:EQUB &33 138 | EQUB 4:EQUB &51 139 | EQUB 10:EQUB &60 140 | EQUB 5:EQUB &50 141 | EQUB 8:EQUB &DA 142 | EQUB 12:EQUB &CB 143 | EQUB ToDie 144 | 145 | .PtD12 146 | EQUB 8:EQUB &D3 147 | EQUB 3:EQUB &C2 148 | EQUB 2:EQUB &B0 149 | EQUB 2:EQUB &A9 150 | EQUB 2:EQUB &AA 151 | EQUB 2:EQUB &A 152 | EQUB 2:EQUB &1A 153 | EQUB 2:EQUB &3A 154 | EQUB 2:EQUB &39 155 | EQUB 2:EQUB &30 156 | EQUB 3:EQUB &31 157 | EQUB 3:EQUB &42 158 | EQUB 4:EQUB &54 159 | EQUB 8:EQUB &45 160 | EQUB 4:EQUB &35 161 | EQUB ToDie 162 | 163 | .PtD13 164 | EQUB 2:EQUB &30 165 | EQUB 12:EQUB &13 166 | EQUB 3:EQUB &23 167 | EQUB 2:EQUB &32 168 | EQUB 2:EQUB &30 169 | EQUB 2:EQUB &3A 170 | EQUB 3:EQUB &2B 171 | EQUB 19:EQUB &1C 172 | EQUB ToDie 173 | 174 | .PtD14 175 | EQUB 5:EQUB &C1 176 | EQUB 2:EQUB &C2 177 | EQUB 1:EQUB &B3 178 | EQUB 1:EQUB &A4 179 | EQUB 1:EQUB &4 180 | EQUB 1:EQUB &24 181 | EQUB 1:EQUB &33 182 | EQUB 18:EQUB &42 183 | EQUB 1:EQUB &33 184 | EQUB 1:EQUB &24 185 | EQUB 1:EQUB &4 186 | EQUB 1:EQUB &A4 187 | EQUB 1:EQUB &B3 188 | EQUB 2:EQUB &C2 189 | EQUB 5:EQUB &C1 190 | EQUB ToDie 191 | 192 | .PtD15 193 | EQUB 4:EQUB 3 194 | EQUB ToFor:EQUB 5 195 | EQUB 4:EQUB 3 196 | EQUB ToInitA:EQUB 16:EQUB 1 197 | EQUB ToNext 198 | EQUB ToFor:EQUB 5 199 | EQUB 4:EQUB &B 200 | EQUB ToInitA:EQUB 16:EQUB 2 201 | EQUB ToNext 202 | EQUB ToNewInd:EQUB 2 203 | 204 | .PtD16 205 | EQUB 3:EQUB &30 206 | EQUB 3:EQUB 3 207 | EQUB 3:EQUB &30 208 | EQUB 3:EQUB &B 209 | EQUB ToNewInd:EQUB 0 210 | 211 | .PtD17 212 | EQUB 7:EQUB &53 213 | EQUB ToFor:EQUB 2 214 | EQUB 1:EQUB &24 215 | EQUB 1:EQUB &4 216 | EQUB 1:EQUB &A4 217 | EQUB 1:EQUB &C3 218 | EQUB 1:EQUB &D2 219 | EQUB 2:EQUB &D0 220 | EQUB 1:EQUB &DA 221 | EQUB 1:EQUB &CB 222 | EQUB 1:EQUB &AC 223 | EQUB 1:EQUB &C 224 | EQUB 1:EQUB &2C 225 | EQUB 1:EQUB &4C 226 | EQUB 1:EQUB &5A 227 | EQUB 2:EQUB &50 228 | EQUB 1:EQUB &52 229 | EQUB 1:EQUB &44 230 | EQUB 6:EQUB &53 231 | EQUB ToNext 232 | EQUB 1:EQUB &34 233 | EQUB 4:EQUB &14 234 | EQUB 4:EQUB 4 235 | EQUB ToDie 236 | 237 | .PtD18 238 | EQUB 10:EQUB &40 239 | EQUB 2:EQUB &49 240 | EQUB 2:EQUB &3A 241 | EQUB 2:EQUB &1B 242 | EQUB 2:EQUB &9B 243 | EQUB 2:EQUB &BA 244 | EQUB 2:EQUB &C9 245 | EQUB 2:EQUB &C1 246 | EQUB 2:EQUB &B2 247 | EQUB 2:EQUB &A3 248 | EQUB 2:EQUB &3 249 | EQUB 2:EQUB &23 250 | EQUB 18:EQUB &43 251 | EQUB ToDie 252 | 253 | .PtD19 254 | EQUB 21:EQUB &D1 255 | EQUB 1:EQUB &C2 256 | EQUB 1:EQUB &A3 257 | EQUB 1:EQUB &3 258 | EQUB 1:EQUB &23 259 | EQUB 1:EQUB &42 260 | EQUB 10:EQUB &51 261 | EQUB 10:EQUB &D1 262 | EQUB 1:EQUB &C2 263 | EQUB 1:EQUB &A3 264 | EQUB 1:EQUB &3 265 | EQUB 1:EQUB &23 266 | EQUB 1:EQUB &42 267 | EQUB 21:EQUB &51 268 | EQUB ToDie 269 | 270 | .PtD20 271 | EQUB 6:EQUB &4B 272 | EQUB 2:EQUB &5A 273 | EQUB 1:EQUB &59 274 | EQUB 1:EQUB &50 275 | EQUB 1:EQUB &51 276 | EQUB 1:EQUB &52 277 | EQUB 3:EQUB &53 278 | EQUB 3:EQUB &44 279 | EQUB 8:EQUB &34 280 | EQUB 8:EQUB &15 281 | EQUB ToDie 282 | 283 | 284 | \\ ] 285 | 286 | \\ PRINT"Pat Data 1 from &";~B%;" to &";~P%-1;" (";P%-B%;")" 287 | \\ PAGE=PG% 288 | \\ RETURN 289 | -------------------------------------------------------------------------------- /src/PatDat2.asm: -------------------------------------------------------------------------------- 1 | \\ 2 | \\ Galaforce 2 ( BBC Micro ) from the original 6502 source code, adapted to assemble using beebasm 3 | \\ 4 | \\ (c) Kevin Edwards 1987-2021 5 | \\ 6 | \\ Twitter @KevEdwardsRetro 7 | \\ 8 | 9 | \\ REM SAVE"$.Galaforce2.PatDat2" 10 | \\ B%=P% 11 | \\ [OPT pass 12 | 13 | .PtD21 14 | EQUB 14:EQUB &50 15 | EQUB 2:EQUB &31 16 | EQUB 2:EQUB &22 17 | EQUB 2:EQUB &2 18 | EQUB 2:EQUB &A2 19 | EQUB 2:EQUB &B1 20 | EQUB 14:EQUB &D0 21 | EQUB ToDie 22 | 23 | .PtD22 24 | EQUB 7:EQUB &14 25 | EQUB 2:EQUB &23 26 | EQUB 2:EQUB &32 27 | EQUB 2:EQUB &31 28 | EQUB 1:EQUB &30 29 | EQUB 2:EQUB &40 30 | EQUB 2:EQUB &49 31 | EQUB 2:EQUB &3A 32 | EQUB 11:EQUB &2B 33 | EQUB ToDie 34 | 35 | .PtD23 36 | EQUB ToFor:EQUB 3 37 | EQUB 5:EQUB &C1 38 | EQUB 4:EQUB &B1 39 | EQUB 3:EQUB &A1 40 | EQUB 2:EQUB &91 41 | EQUB 2:EQUB &1 42 | EQUB 2:EQUB &11 43 | EQUB 3:EQUB &21 44 | EQUB 4:EQUB &31 45 | EQUB 5:EQUB &41 46 | EQUB ToNext 47 | EQUB ToDie 48 | 49 | .PtD24 50 | EQUB 18:EQUB &C2 51 | EQUB 1:EQUB &C0 52 | EQUB 1:EQUB &C9 53 | EQUB 4:EQUB &CA 54 | EQUB ToFor:EQUB 40 55 | EQUB 4:EQUB 0 56 | EQUB ToInitA:EQUB 25:EQUB 4 57 | EQUB 4:EQUB &B 58 | EQUB 4:EQUB 0 59 | EQUB ToInitA:EQUB 25:EQUB 4 60 | EQUB 4:EQUB 3 61 | EQUB ToNext 62 | EQUB ToDie 63 | 64 | .PtD25 65 | EQUB 12:EQUB &23 66 | EQUB 1:EQUB &32 67 | EQUB 1:EQUB &31 68 | EQUB 1:EQUB &30 69 | EQUB 1:EQUB &39 70 | EQUB 1:EQUB &3A 71 | EQUB 10:EQUB &2B 72 | EQUB 8:EQUB &1C 73 | EQUB ToDie 74 | 75 | .PtD26 76 | EQUB 4:EQUB 4 77 | EQUB ToFor:EQUB 8 78 | EQUB 16:EQUB 3 79 | EQUB 5:EQUB 2 80 | EQUB 4:EQUB 1 81 | EQUB 2:EQUB 0 82 | EQUB 16:EQUB &B 83 | EQUB 5:EQUB &A 84 | EQUB 4:EQUB &9 85 | EQUB 2:EQUB 0 86 | EQUB ToNext 87 | EQUB 4:EQUB &C 88 | EQUB ToDie 89 | 90 | .PtD27 91 | EQUB 8:EQUB &4 92 | EQUB 1:EQUB &23 93 | EQUB 1:EQUB &32 94 | EQUB 1:EQUB &41 95 | EQUB 20:EQUB &40 96 | EQUB 14:EQUB &CB 97 | EQUB ToDie 98 | 99 | .PtD28 100 | EQUB 14:EQUB &A4 101 | EQUB 2:EQUB 4 102 | EQUB 1:EQUB &24 103 | EQUB 1:EQUB &33 104 | EQUB 1:EQUB &42 105 | EQUB 1:EQUB &40 106 | EQUB 1:EQUB &49 107 | EQUB 1:EQUB &4B 108 | EQUB 4:EQUB &2C 109 | EQUB 1:EQUB &4B 110 | EQUB 1:EQUB &59 111 | EQUB 9:EQUB &50 112 | EQUB 10:EQUB &D4 113 | EQUB ToDie 114 | 115 | .PtD29 116 | EQUB 3:EQUB &3 117 | EQUB ToFor:EQUB 3 118 | EQUB 3:EQUB &14 119 | EQUB 3:EQUB &13 120 | EQUB 3:EQUB &12 121 | EQUB 3:EQUB &11 122 | EQUB 2:EQUB &10 123 | EQUB 3:EQUB &1C 124 | EQUB 3:EQUB &1B 125 | EQUB 3:EQUB &1A 126 | EQUB 3:EQUB &19 127 | EQUB ToNext 128 | EQUB 4:EQUB &B 129 | EQUB ToDie 130 | 131 | .PtD30 132 | EQUB 9:EQUB &40 133 | EQUB 4:EQUB &49 134 | EQUB 4:EQUB &4A 135 | EQUB 3:EQUB &4B 136 | EQUB 3:EQUB &3C 137 | EQUB 3:EQUB &2C 138 | EQUB ToDie 139 | 140 | .PtD31 141 | EQUB 16:EQUB &D2 142 | EQUB 4:EQUB &B2 143 | EQUB 3:EQUB &91 144 | EQUB 1:EQUB &2 145 | EQUB 3:EQUB &11 146 | EQUB 4:EQUB &32 147 | EQUB 16:EQUB &52 148 | EQUB ToDie 149 | 150 | .PtD32 151 | EQUB 17:EQUB &34 152 | EQUB ToFor:EQUB 5 153 | EQUB 3:EQUB &39 154 | EQUB 2:EQUB &29 155 | EQUB 1:EQUB &19 156 | EQUB 1:EQUB &9 157 | EQUB 1:EQUB &99 158 | EQUB 2:EQUB &A9 159 | EQUB 3:EQUB &B9 160 | EQUB ToNext 161 | EQUB ToDie 162 | 163 | .PtD33 164 | EQUB 12:EQUB &24 165 | EQUB 1:EQUB &13 166 | EQUB 1:EQUB 3 167 | EQUB 1:EQUB &93 168 | EQUB 1:EQUB &A3 169 | EQUB 1:EQUB &B2 170 | EQUB 1:EQUB &B1 171 | EQUB 1:EQUB &B0 172 | EQUB 1:EQUB &B9 173 | EQUB 1:EQUB &CA 174 | EQUB 1:EQUB &CB 175 | EQUB 18:EQUB &BB 176 | EQUB ToDie 177 | 178 | .PtD34 179 | EQUB 5:EQUB &C3 180 | EQUB 1:EQUB &A3 181 | EQUB 1:EQUB &2 182 | EQUB 1:EQUB &23 183 | EQUB 1:EQUB &43 184 | EQUB 1:EQUB &52 185 | EQUB 10:EQUB &51 186 | EQUB 1:EQUB &52 187 | EQUB 1:EQUB &43 188 | EQUB 1:EQUB &23 189 | EQUB 1:EQUB &2 190 | EQUB 1:EQUB &A3 191 | EQUB 1:EQUB &C3 192 | EQUB 1:EQUB &D2 193 | EQUB 10:EQUB &D1 194 | EQUB 1:EQUB &D2 195 | EQUB 1:EQUB &C3 196 | EQUB 1:EQUB &A3 197 | EQUB 1:EQUB &2 198 | EQUB 1:EQUB &23 199 | EQUB 6:EQUB &43 200 | EQUB ToDie 201 | 202 | .PtD35 203 | EQUB ToFor:EQUB 4 204 | EQUB 33:EQUB &3 205 | EQUB 3:EQUB &30 206 | EQUB 33:EQUB &B 207 | EQUB 3:EQUB &30 208 | EQUB ToNext 209 | EQUB ToDie 210 | 211 | .PtD36 212 | EQUB 16:EQUB &D1 213 | EQUB 3:EQUB &C1 214 | EQUB 1:EQUB &B1 215 | EQUB 1:EQUB &A1 216 | EQUB 1:EQUB &1 217 | EQUB 1:EQUB &21 218 | EQUB 1:EQUB &31 219 | EQUB 3:EQUB &41 220 | EQUB 16:EQUB &51 221 | EQUB ToFor:EQUB 2 222 | EQUB 5:EQUB &C1 223 | EQUB 4:EQUB &B1 224 | EQUB 3:EQUB &A1 225 | EQUB 2:EQUB &91 226 | EQUB 1:EQUB 1 227 | EQUB 2:EQUB &11 228 | EQUB 3:EQUB &21 229 | EQUB 4:EQUB &31 230 | EQUB 5:EQUB &41 231 | EQUB ToNext 232 | EQUB ToDie 233 | 234 | .PtD37 235 | EQUB 8:EQUB &40 236 | EQUB 2:EQUB &39 237 | EQUB 2:EQUB &2A 238 | EQUB 2:EQUB &1B 239 | EQUB 6:EQUB &B 240 | EQUB 2:EQUB &1B 241 | EQUB 2:EQUB &2A 242 | EQUB 2:EQUB &39 243 | EQUB 1:EQUB &40 244 | EQUB 2:EQUB &32 245 | EQUB 2:EQUB &23 246 | EQUB 6:EQUB &13 247 | EQUB ToRndPat:EQUB 38 248 | EQUB 3:EQUB &3 249 | EQUB 8:EQUB &93 250 | EQUB 8:EQUB &A4 251 | EQUB ToDie 252 | 253 | .PtD38 254 | EQUB 6:EQUB &24 255 | EQUB 10:EQUB &34 256 | EQUB ToDie 257 | 258 | .PtD39 259 | EQUB 11:EQUB &E0 260 | EQUB 6:EQUB &D1 261 | EQUB 2:EQUB &C2 262 | EQUB 2:EQUB &B3 263 | EQUB 2:EQUB &4 264 | EQUB 2:EQUB &33 265 | EQUB 2:EQUB &42 266 | EQUB 6:EQUB &51 267 | EQUB 11:EQUB &60 268 | EQUB ToDie 269 | 270 | .PtD40 271 | EQUB 10:EQUB &E1 272 | EQUB 6:EQUB &D1 273 | EQUB 4:EQUB &C1 274 | EQUB 3:EQUB &B1 275 | EQUB 3:EQUB &A1 276 | EQUB 2:EQUB &91 277 | EQUB 2:EQUB 1 278 | EQUB 8:EQUB &21 279 | EQUB 6:EQUB &31 280 | EQUB 3:EQUB &41 281 | EQUB 3:EQUB &42 282 | EQUB 3:EQUB &43 283 | EQUB 3:EQUB &44 284 | EQUB 9:EQUB &45 285 | EQUB ToDie 286 | 287 | \\ ] 288 | 289 | \\ PRINT"Pat Data 2 from &";~B%;" to &";~P%-1;" (";P%-B%;")" 290 | \\ PAGE=PG% 291 | \\ RETURN 292 | -------------------------------------------------------------------------------- /src/PatDat3.asm: -------------------------------------------------------------------------------- 1 | \\ 2 | \\ Galaforce 2 ( BBC Micro ) from the original 6502 source code, adapted to assemble using beebasm 3 | \\ 4 | \\ (c) Kevin Edwards 1987-2021 5 | \\ 6 | \\ Twitter @KevEdwardsRetro 7 | \\ 8 | 9 | \\ REM SAVE"$.Galaforce2.PatDat3" 10 | \\ B%=P% 11 | \\ [OPT pass 12 | 13 | .PtD41 14 | EQUB 6:EQUB &54 15 | EQUB 2:EQUB &44 16 | EQUB 2:EQUB &34 17 | EQUB 2:EQUB &24 18 | EQUB 2:EQUB &14 19 | EQUB 2:EQUB &4 20 | EQUB 2:EQUB &A4 21 | EQUB 2:EQUB &B3 22 | EQUB 2:EQUB &C2 23 | EQUB 2:EQUB &C0 24 | EQUB 2:EQUB &CA 25 | EQUB 2:EQUB &BB 26 | EQUB 2:EQUB &AC 27 | EQUB 2:EQUB &C 28 | EQUB 2:EQUB &1C 29 | EQUB 2:EQUB &2C 30 | EQUB 2:EQUB &3C 31 | EQUB 2:EQUB &4C 32 | EQUB 8:EQUB &5C 33 | EQUB ToDie 34 | 35 | .PtD42 36 | EQUB 7:EQUB &40 37 | EQUB 3:EQUB &43 38 | EQUB 4:EQUB &40 39 | EQUB ToRndPat:EQUB 43 40 | EQUB 17:EQUB &4A 41 | EQUB ToDie 42 | 43 | .PtD43 44 | EQUB 17:EQUB &42 45 | EQUB ToDie 46 | 47 | .PtD44 48 | EQUB 14:EQUB &53 49 | EQUB 2:EQUB &33 50 | EQUB 2:EQUB &13 51 | EQUB 2:EQUB &93 52 | EQUB 2:EQUB &94 53 | EQUB 2:EQUB &A5 54 | EQUB 10:EQUB &B5 55 | EQUB ToDie 56 | 57 | .PtD45 58 | EQUB 14:EQUB &24 59 | EQUB 2:EQUB &33 60 | EQUB 2:EQUB &42 61 | EQUB 2:EQUB &40 62 | EQUB 2:EQUB &4A 63 | EQUB 2:EQUB &3B 64 | EQUB 2:EQUB &2C 65 | EQUB 1:EQUB &C 66 | EQUB 2:EQUB &AC 67 | EQUB 2:EQUB &BB 68 | EQUB 2:EQUB &CA 69 | EQUB 2:EQUB &C0 70 | EQUB 2:EQUB &C2 71 | EQUB 2:EQUB &B3 72 | EQUB 14:EQUB &A4 73 | EQUB ToDie 74 | 75 | .PtD46 76 | EQUB 18:EQUB &14 77 | EQUB ToFor:EQUB 3 78 | EQUB 4:EQUB 0 79 | EQUB 3:EQUB &40 80 | EQUB 6:EQUB &B 81 | EQUB 4:EQUB 0 82 | EQUB 3:EQUB &40 83 | EQUB 6:EQUB 3 84 | EQUB ToNext 85 | EQUB 6:EQUB 4 86 | EQUB ToDie 87 | 88 | .PtD47 89 | EQUB 2:EQUB &20 90 | EQUB ToBotSeg:EQUB 0 91 | EQUB ToFor:EQUB 8 92 | EQUB 2:EQUB &1 93 | EQUB 2:EQUB &10 94 | EQUB 2:EQUB &9 95 | EQUB 2:EQUB &90 96 | EQUB ToNext 97 | EQUB ToDie 98 | 99 | .PtD48 100 | EQUB ToNewGra:EQUB 11 \ Bonus 1000 graphic 101 | EQUB 2:EQUB &A0 102 | EQUB ToTopSeg:EQUB 2 103 | EQUB 10:EQUB 0 104 | EQUB ToDie 105 | 106 | .PtD49 107 | EQUB ToNewGra:EQUB 12 \ Small ship graphic 108 | EQUB 2:EQUB &A0 109 | EQUB ToTopSeg:EQUB 2 110 | EQUB 10:EQUB 0 111 | EQUB ToDie 112 | 113 | .PtD50 114 | EQUB 36:EQUB &10 115 | 116 | EQUB ToFor:EQUB 8 117 | EQUB 1:EQUB &90 118 | EQUB ToRInitA:EQUB 51:EQUB 13 119 | EQUB 4:EQUB 0 120 | EQUB ToNext 121 | 122 | EQUB ToFor:EQUB 8 123 | EQUB 1:EQUB &10 124 | EQUB ToRInitA:EQUB 51:EQUB 13 125 | EQUB 4:EQUB 0 126 | EQUB ToNext 127 | 128 | EQUB ToNewInd:EQUB 2 129 | 130 | .PtD51 131 | EQUB ToHomeIn 132 | EQUB ToRndPat:EQUB 52 133 | EQUB ToRndPat:EQUB 55 134 | EQUB ToFor:EQUB 8 135 | EQUB 4:EQUB &20 136 | EQUB 1:EQUB &21 137 | EQUB ToNext 138 | EQUB ToDie 139 | 140 | .PtD52 141 | EQUB ToRndPat:EQUB 53 142 | EQUB ToFor:EQUB 10 143 | EQUB 3:EQUB &20 144 | EQUB 1:EQUB &21 145 | EQUB ToNext 146 | EQUB ToDie 147 | 148 | .PtD53 149 | EQUB ToRndPat:EQUB 54 150 | EQUB ToFor:EQUB 13 151 | EQUB 2:EQUB &20 152 | EQUB 1:EQUB &21 153 | EQUB ToNext 154 | EQUB ToDie 155 | 156 | .PtD54 157 | EQUB ToFor:EQUB 17 158 | EQUB 1:EQUB &20 159 | EQUB 1:EQUB &21 160 | EQUB ToNext 161 | EQUB ToDie 162 | 163 | .PtD55 164 | EQUB 84:EQUB &10 165 | EQUB ToDie 166 | 167 | .PtD56 168 | EQUB 36:EQUB &10 169 | 170 | EQUB ToFor:EQUB 15 171 | EQUB 1:EQUB &90 172 | EQUB ToRInitA:EQUB 57:EQUB 13 173 | EQUB 3:EQUB 0 174 | EQUB ToNext 175 | 176 | EQUB ToFor:EQUB 15 177 | EQUB 1:EQUB &10 178 | EQUB ToRInitA:EQUB 57:EQUB 13 179 | EQUB 3:EQUB 0 180 | EQUB ToNext 181 | 182 | EQUB ToNewInd:EQUB 2 183 | 184 | .PtD57 185 | EQUB ToFor:EQUB 21 186 | EQUB ToHomeIn 187 | EQUB 1:EQUB &11 188 | EQUB 3:EQUB &10 189 | EQUB ToNext 190 | EQUB ToDie 191 | 192 | .PtD58 193 | EQUB 36:EQUB &10 194 | 195 | EQUB ToFor:EQUB 15 196 | EQUB 1:EQUB &90 197 | EQUB ToRInitA:EQUB 57:EQUB 13 198 | EQUB 2:EQUB 0 199 | EQUB ToNext 200 | 201 | EQUB ToFor:EQUB 15 202 | EQUB 1:EQUB &10 203 | EQUB ToRInitA:EQUB 57:EQUB 13 204 | EQUB 2:EQUB 0 205 | EQUB ToNext 206 | 207 | EQUB ToNewInd:EQUB 2 208 | 209 | .PtD59 210 | EQUB 16:EQUB &10 211 | 212 | EQUB ToFor:EQUB 30 213 | EQUB 14:EQUB 1 214 | EQUB 3:EQUB &19 215 | EQUB 8:EQUB &9 216 | EQUB 3:EQUB &99 217 | EQUB ToNext 218 | 219 | EQUB ToFor:EQUB 55 220 | EQUB ToHomeIn 221 | EQUB 1:EQUB &11 222 | EQUB 2:EQUB 0 223 | EQUB 1:EQUB &10 224 | EQUB 2:EQUB 0 225 | EQUB ToNext 226 | EQUB ToDie 227 | 228 | .PtD60 229 | EQUB 60:EQUB &20 230 | EQUB 100:EQUB 0 231 | EQUB ToDie 232 | 233 | 234 | \\ ] 235 | 236 | \\ PRINT"Pat Data 3 from &";~B%;" to &";~P%-1;" (";P%-B%;")" 237 | \\ PAGE=PG% 238 | \\ RETURN 239 | -------------------------------------------------------------------------------- /src/PatIn1.asm: -------------------------------------------------------------------------------- 1 | \\ 2 | \\ Galaforce 2 ( BBC Micro ) from the original 6502 source code, adapted to assemble using beebasm 3 | \\ 4 | \\ (c) Kevin Edwards 1987-2021 5 | \\ 6 | \\ Twitter @KevEdwardsRetro 7 | \\ 8 | 9 | \\ REM SAVE"$.Galaforce2.PatIn1" 10 | \\ B%=P% 11 | \\ [OPT pass 12 | 13 | \ Order - Pattern number 14 | \ Start X,Y position & Rel X,Y start change 15 | \ Graphic type to use 16 | \ Number of aliens to init 17 | \ Delay (in 'all alien moved' cycles) between each alien init 18 | 19 | .PtI0 20 | EQUB 0 21 | EQUB 30:EQUB 45:EQUB 0:EQUB 4 22 | EQUB 1 23 | EQUB 12 24 | EQUB 3 25 | 26 | .PtI1 27 | EQUB 1 28 | EQUB 30:EQUB 220:EQUB 0:EQUB 0 29 | EQUB 2 30 | EQUB 11 31 | EQUB 2 32 | 33 | .PtI2 34 | EQUB 2 35 | EQUB 30:EQUB 30:EQUB 0:EQUB 0 36 | EQUB 3 37 | EQUB 10 38 | EQUB 5 39 | 40 | .PtI3 41 | EQUB 3 42 | EQUB 30:EQUB 30:EQUB 0:EQUB 0 43 | EQUB 4 44 | EQUB 10 45 | EQUB 3 46 | 47 | .PtI4 48 | EQUB 4 49 | EQUB 70:EQUB 0:EQUB 0:EQUB 0 50 | EQUB 0 51 | EQUB 10 52 | EQUB 2 53 | 54 | .PtI5 55 | EQUB 5 56 | EQUB 30:EQUB 30:EQUB 0:EQUB 0 57 | EQUB 1 58 | EQUB 9 59 | EQUB 3 60 | 61 | .PtI6 62 | EQUB 6 63 | EQUB 35:EQUB &FF:EQUB 0:EQUB 0 64 | EQUB 3 65 | EQUB 8 66 | EQUB 3 67 | 68 | .PtI7 69 | EQUB 7 70 | EQUB 24:EQUB 30:EQUB 0:EQUB 0 71 | EQUB 2 72 | EQUB 10 73 | EQUB 2 74 | 75 | .PtI8 76 | EQUB 8 77 | EQUB &F0:EQUB 24:EQUB 0:EQUB 0 78 | EQUB 5 79 | EQUB 18 80 | EQUB 3 81 | 82 | .PtI9 83 | EQUB 9 84 | EQUB 28:EQUB 30:EQUB 0:EQUB &20 85 | EQUB 3 86 | EQUB 6 87 | EQUB 50 88 | 89 | .PtI10 90 | EQUB 11 91 | EQUB 30:EQUB &80:EQUB 0:EQUB 0 92 | EQUB 4 93 | EQUB 7 94 | EQUB 2 95 | 96 | 97 | .PtI11 98 | EQUB 12 99 | EQUB 30:EQUB &A0:EQUB 0:EQUB 0 100 | EQUB 2 101 | EQUB 12 102 | EQUB 2 103 | 104 | .PtI12 105 | EQUB 13 106 | EQUB &F0:EQUB 24:EQUB 0:EQUB 0 107 | EQUB 1 108 | EQUB 26 109 | EQUB 3 110 | 111 | .PtI13 112 | EQUB 14 113 | EQUB 30:EQUB &70:EQUB 0:EQUB 0 114 | EQUB 2 115 | EQUB 14 116 | EQUB 2 117 | 118 | .PtI14 119 | EQUB 15 120 | EQUB 32:EQUB &20:EQUB 0:EQUB &28 121 | EQUB 3 122 | EQUB 4 123 | EQUB 50 124 | 125 | .PtI15 126 | EQUB 17 127 | EQUB 30:EQUB &20:EQUB 0:EQUB 0 128 | EQUB 2 129 | EQUB 18 130 | EQUB 2 131 | 132 | .PtI16 133 | EQUB 18 134 | EQUB 70:EQUB 0:EQUB 0:EQUB 0 135 | EQUB 1 136 | EQUB 16 137 | EQUB 2 138 | 139 | .PtI17 140 | EQUB 19 141 | EQUB 33:EQUB &FF:EQUB 0:EQUB 0 142 | EQUB 6 143 | EQUB 18 144 | EQUB 2 145 | 146 | .PtI18 147 | EQUB 20 148 | EQUB 60:EQUB 0:EQUB 1:EQUB 0 149 | EQUB 7 150 | EQUB 20 151 | EQUB 2 152 | 153 | .PtI19 154 | EQUB 21 155 | EQUB &F0:EQUB 0:EQUB 0:EQUB 0 156 | EQUB 3 157 | EQUB 30 158 | EQUB 3 159 | 160 | .PtI20 161 | EQUB 22 162 | EQUB 30:EQUB &48:EQUB 0:EQUB 0 163 | EQUB 6 164 | EQUB 16 165 | EQUB 3 166 | 167 | .PtI21 168 | EQUB 23 169 | EQUB 32:EQUB &90:EQUB 0:EQUB 0 170 | EQUB 4 171 | EQUB 24 172 | EQUB 4 173 | 174 | .PtI22 175 | EQUB 24 176 | EQUB 30:EQUB &FF:EQUB 0:EQUB -32 177 | EQUB 5 178 | EQUB 2 179 | EQUB 4 180 | 181 | .PtI23 182 | EQUB 26 183 | EQUB 30:EQUB &28:EQUB 0:EQUB 0 184 | EQUB 8 185 | EQUB 1 186 | EQUB 4 187 | 188 | .PtI24 189 | EQUB 27 190 | EQUB 30:EQUB &38:EQUB 0:EQUB 0 191 | EQUB 1 192 | EQUB 18 193 | EQUB 3 194 | 195 | .PtI25 196 | EQUB 28 197 | EQUB 30:EQUB &60:EQUB 0:EQUB 0 198 | EQUB 5 199 | EQUB 8 200 | EQUB 3 201 | 202 | .PtI26 203 | EQUB 29 204 | EQUB 31:EQUB &30:EQUB 0:EQUB 0 205 | EQUB 9 206 | EQUB 14 207 | EQUB 4 208 | 209 | .PtI27 210 | EQUB 30 211 | EQUB 72:EQUB 0:EQUB 0:EQUB 0 212 | EQUB 0 213 | EQUB 18 214 | EQUB 2 215 | 216 | .PtI28 217 | EQUB 31 218 | EQUB 32:EQUB &F8:EQUB 0:EQUB 0 219 | EQUB 7 220 | EQUB 20 221 | EQUB 3 222 | 223 | .PtI29 224 | EQUB 32 225 | EQUB 30:EQUB &10:EQUB 0:EQUB 0 226 | EQUB 6 227 | EQUB 22 228 | EQUB 4 229 | 230 | .PtI30 231 | EQUB 33 232 | EQUB 30:EQUB &80:EQUB 0:EQUB 0 233 | EQUB 2 234 | EQUB 18 235 | EQUB 3 236 | 237 | .PtI31 238 | EQUB 34 239 | EQUB 30:EQUB &50:EQUB 0:EQUB 0 240 | EQUB 5 241 | EQUB 24 242 | EQUB 3 243 | 244 | .PtI32 245 | EQUB 35 246 | EQUB 30:EQUB &40:EQUB 0:EQUB 0 247 | EQUB 6 248 | EQUB 70 249 | EQUB 3 250 | 251 | .PtI33 252 | EQUB 36 253 | EQUB 30:EQUB &FF:EQUB 0:EQUB 0 254 | EQUB 9 255 | EQUB 20 256 | EQUB 3 257 | 258 | .PtI34 259 | EQUB 37 260 | EQUB 70:EQUB 0:EQUB 0:EQUB 0 261 | EQUB 5 262 | EQUB 22 263 | EQUB 4 264 | 265 | .PtI35 266 | EQUB 39 267 | EQUB 40:EQUB &FF:EQUB 0:EQUB 0 268 | EQUB 4 269 | EQUB 20 270 | EQUB 3 271 | 272 | .PtI36 273 | EQUB 40 274 | EQUB 30:EQUB &FF:EQUB 0:EQUB 0 275 | EQUB 7 276 | EQUB 20 277 | EQUB 3 278 | 279 | .PtI37 280 | EQUB 41 281 | EQUB 30:EQUB &20:EQUB 0:EQUB 0 282 | EQUB 1 283 | EQUB 24 284 | EQUB 2 285 | 286 | .PtI38 287 | EQUB 42 288 | EQUB 70:EQUB 0:EQUB 0:EQUB 0 289 | EQUB 6 290 | EQUB 22 291 | EQUB 3 292 | 293 | .PtI39 294 | EQUB 44 295 | EQUB 30:EQUB &20:EQUB 0:EQUB 0 296 | EQUB 3 297 | EQUB 24 298 | EQUB 2 299 | 300 | .PtI40 301 | EQUB 45 302 | EQUB 30:EQUB &20:EQUB 0:EQUB 0 303 | EQUB 6 304 | EQUB 24 305 | EQUB 2 306 | 307 | .PtI41 308 | EQUB 46 309 | EQUB 30:EQUB &20:EQUB 0:EQUB 0 310 | EQUB 2 311 | EQUB 20 312 | EQUB 6 313 | 314 | .PtI42 315 | EQUB 50 316 | EQUB 73:EQUB 0:EQUB 0:EQUB 0 317 | EQUB 14 318 | EQUB 1 319 | EQUB 1 320 | 321 | .PtI43 322 | EQUB 50 323 | EQUB 80:EQUB 0:EQUB 0:EQUB 0 324 | EQUB 15 325 | EQUB 1 326 | EQUB 1 327 | 328 | .PtI44 329 | EQUB 50 330 | EQUB 55:EQUB 0:EQUB 36:EQUB 0 331 | EQUB 16 332 | EQUB 2 333 | EQUB 1 334 | 335 | .PtI45 336 | EQUB 50 337 | EQUB 62:EQUB 0:EQUB 36:EQUB 0 338 | EQUB 17 339 | EQUB 2 340 | EQUB 1 341 | 342 | .PtI46 343 | EQUB 56 344 | EQUB 55:EQUB 0:EQUB 36:EQUB 0 345 | EQUB 14 346 | EQUB 2 347 | EQUB 40 348 | 349 | .PtI47 350 | EQUB 56 351 | EQUB 62:EQUB 0:EQUB 36:EQUB 0 352 | EQUB 15 353 | EQUB 2 354 | EQUB 40 355 | 356 | .PtI48 357 | EQUB 58 358 | EQUB 73:EQUB 0:EQUB 36:EQUB 0 359 | EQUB 16 360 | EQUB 1 361 | EQUB 1 362 | 363 | .PtI49 364 | EQUB 58 365 | EQUB 80:EQUB 0:EQUB 36:EQUB 0 366 | EQUB 17 367 | EQUB 1 368 | EQUB 1 369 | 370 | .PtI50 371 | EQUB 59 372 | EQUB 42:EQUB 0:EQUB 0:EQUB 0 373 | EQUB 8 374 | EQUB 1 375 | EQUB 1 376 | 377 | .PtI51 378 | EQUB 60 379 | EQUB 80:EQUB 0:EQUB 0:EQUB 0 380 | EQUB 10 381 | EQUB 1 382 | EQUB 1 383 | 384 | \\ ] 385 | 386 | \\ PRINT"Pat Init 1 from &";~B%;" to &";~P%-1;" (";P%-B%;")" 387 | \\ PAGE=PG% 388 | \\ RETURN 389 | -------------------------------------------------------------------------------- /src/Rout1.asm: -------------------------------------------------------------------------------- 1 | \\ 2 | \\ Galaforce 2 ( BBC Micro ) from the original 6502 source code, adapted to assemble using beebasm 3 | \\ 4 | \\ (c) Kevin Edwards 1987-2021 5 | \\ 6 | \\ Twitter @KevEdwardsRetro 7 | \\ 8 | 9 | \\ REM SAVE"$.Galaforce2.Rout1" 10 | \\ B%=P% 11 | \\ [OPT pass 12 | 13 | .flush 14 | LDA #15:LDX #0:JMP osbyte 15 | 16 | .fx19 17 | LDA #19:JMP osbyte 18 | 19 | .chkp 20 | LDX #&C8:\ P key 21 | 22 | .check_key 23 | LDA #&81:LDY #&FF 24 | JSR osbyte 25 | CPY #&FF:RTS 26 | 27 | .xycalc 28 | LDA #0:STA temp1+1 29 | TYA:AND #7:STA temp1 30 | TYA:LSR A:LSR A:LSR A:TAY 31 | TXA:AND #&FE 32 | ASL A \ No ROL temp1+1 as X should always be between 0 and 79 on entry 33 | ASL A:ROL temp1+1 34 | ORA temp1:ADC rowlow,Y:TAX 35 | LDA temp1+1:ADC rowhi,Y 36 | .xycal0 37 | RTS 38 | 39 | .rowlow 40 | \\ OPT FNmkscrlo 41 | FOR n, 0, 31, 1 42 | EQUB LO( ScrBase + ( n * &140 ) ) 43 | NEXT 44 | 45 | .rowhi 46 | \\OPT FNmkscrhi 47 | FOR n, 0, 31, 1 48 | EQUB HI( ScrBase + ( n * &140 ) ) 49 | NEXT 50 | 51 | 52 | .reset 53 | LDX #&FF 54 | STX Feature 55 | 56 | INX:\ to 0 57 | STX FireDel 58 | STX SectOff 59 | STX VSyncCn2 60 | STX Escape 61 | STX ActAliens 62 | STX ActBullets 63 | STX ActInits 64 | STX ActAlBombs 65 | STX DemoCnt 66 | STX SmartFlg 67 | STX ShipInfo 68 | 69 | INX:\ to 1 70 | STX UptoID 71 | STX MaxAlID 72 | STX DieDelay 73 | 74 | LDA #0 75 | LDX #TotObj-1 76 | .rese0 77 | STA ObjSt,X:DEX:BPL rese0 78 | 79 | LDX #MaxInit-1 80 | .rese1 81 | STA InitSt,X:DEX:BPL rese1 82 | 83 | LDX #MaxMyBmb-1 84 | .rese2 85 | STA MyBmbSt,X:DEX:BPL rese2 86 | 87 | LDX #MaxAlBmb-1 88 | .rese3 89 | STA AlBmbSt,X:DEX:BPL rese3 90 | 91 | LDA &FC:STA seed 92 | EOR #&FD:STA seed+1 93 | EOR #&63:STA seed+2 94 | RTS 95 | 96 | .StrtLev EQUB 1 \ Default start level 97 | .HighestLev EQUB 1 \ Default highest level reached (nromally 1) 98 | 99 | .HardReset 100 | 101 | LDX StrtLev:BIT Demo:BPL HrdR0 \ If not in demo mode 102 | 103 | JSR rand:AND #7:TAX:INX \ Fudge so between 1 and 8 104 | 105 | .HrdR0 106 | STX level 107 | 108 | \ Drop through to reset score/lives 109 | 110 | .ResetInfo 111 | LDX #6:LDA #0 112 | .ResIn0 113 | STA score,X:DEX:BPL ResIn0 114 | LDA #1:STA smarts 115 | LDA #3:STA lives 116 | LDA #0:JSR SavePlyrB \ Copy info into player 1 & 2 variable area 117 | LDA #1:JSR SavePlyrB 118 | LDA #0:JSR ShwLivB \ Show 'lives' variable in both Player live positions 119 | LDA #1:JSR ShwLivB 120 | JMP ZeroInf \ Display 0000000 in both score areas 121 | 122 | .controls 123 | LDX #0 124 | LDA Feature:BNE contr5 125 | INX 126 | .contr5 127 | STX XIndex:STX YIndex 128 | BIT Demo:BPL contr2 129 | 130 | DEC DemoCnt:BPL contr4 131 | JSR rand:STA DemoDir 132 | AND #&1F:STA DemoCnt 133 | 134 | .contr4 135 | LDX #2:LDA DemoDir:BPL contr3 136 | DEX 137 | .contr3 138 | STX XIndex:LDA #0:STA YIndex:JMP contr0 139 | 140 | .contr2 141 | BIT FKeyJoy:BPL rxjoy 142 | 143 | LDX #&9E:JSR check_key:\ Z 144 | ROL XIndex 145 | LDX #&BD:JSR check_key:\ X 146 | ROL XIndex 147 | LDX #&B7:JSR check_key:\ colon 148 | ROL YIndex 149 | LDX #&97:JSR check_key:\ ? 150 | ROL YIndex 151 | BPL contr0 \ Always 152 | 153 | .rxjoy 154 | LDX #1:JSR chkjoy:ROL XIndex 155 | LDX #1:JSR chkjoy2:ROL XIndex 156 | LDX #2:JSR chkjoy:ROL YIndex 157 | LDX #2:JSR chkjoy2:ROL YIndex 158 | 159 | .contr0 160 | LDY Feature 161 | LDX YIndex:CPY #3:BNE contr6 162 | LDX #0 \ Always gets 0 from table 163 | .contr6 164 | LDA TRelY,X:STA YIndex 165 | 166 | LDX XIndex:CPY #4:BNE contr7 167 | LDX #0 168 | .contr7 169 | LDA TRelX,X:STA XIndex 170 | RTS 171 | 172 | .TRelX 173 | EQUB 0:EQUB 1:EQUB -1:EQUB 0 174 | EQUB 0:EQUB -1:EQUB 1:EQUB 0 175 | 176 | .TRelY 177 | EQUB 0:EQUB 4:EQUB -4:EQUB 0 178 | EQUB 0:EQUB -4:EQUB 4:EQUB 0 179 | 180 | .chkjoy 181 | LDA #&80:JSR osbyte 182 | CPY #&C0 183 | RTS 184 | 185 | .chkjoy2 186 | LDA #&80:JSR osbyte 187 | CPY #&40:ROR A:EOR #&80:ROL A 188 | RTS 189 | 190 | .frame_delay 191 | STY temp3 192 | .framdel 193 | JSR TryStars 194 | JSR fx19 195 | DEC temp3:BNE framdel 196 | RTS 197 | 198 | .frame_spc 199 | STY temp3 200 | .framspc 201 | JSR testspc:BEQ framsp0 202 | JSR TryStars 203 | JSR fx19 204 | DEC temp3:BNE framspc 205 | .framsp0 206 | RTS 207 | 208 | .testspc 209 | LDX #&9D:\ Space key 210 | JMP check_key 211 | 212 | \ New RND routine with EOR &FC for 'extra randomness' 213 | 214 | .rand 215 | LDA seed:EOR &FC 216 | ROR seed:ROR seed+1 217 | ADC seed+2:EOR seed+1 218 | STA seed:EOR seed+2 219 | CMP seed+1:INC seed+1 220 | STA seed+2 221 | RTS 222 | 223 | .vdu19 224 | LDA #19:JSR oswrch 225 | TXA:JSR oswrch 226 | TYA:JSR oswrch 227 | LDA #0:JSR oswrch 228 | JSR oswrch 229 | JMP oswrch 230 | 231 | .RxJoyBut 232 | LDA #&80:LDX #0:JSR osbyte 233 | TXA:LSR A \ C=1 if pressed 234 | RTS 235 | 236 | \\ ] 237 | 238 | \\ PRINT"Routine 1 from &";~B%;" to &";~P%-1;" (";P%-B%;")" 239 | \\ PAGE=PG% 240 | \\ RETURN 241 | 242 | \\ DEFFNmkscrlo 243 | \\ IFpass<6 O%=O%+32:P%=P%+32:=pass 244 | \\ FORL%=ScrBase TO(ScrBase+31*&140)STEP&140 245 | \\ [OPT pass 246 | \\ EQUB L% MOD 256 247 | \\ ]NEXT 248 | \\ =pass 249 | 250 | \\ DEFFNmkscrhi 251 | \\ IFpass<6 O%=O%+32:P%=P%+32:=pass 252 | \\ FORL%=ScrBase TO(ScrBase+31*&140)STEP&140 253 | \\ [OPT pass 254 | \\ EQUB L% DIV 256 255 | \\ ]NEXT 256 | \\ =pass 257 | -------------------------------------------------------------------------------- /src/Rout2.asm: -------------------------------------------------------------------------------- 1 | \\ 2 | \\ Galaforce 2 ( BBC Micro ) from the original 6502 source code, adapted to assemble using beebasm 3 | \\ 4 | \\ (c) Kevin Edwards 1987-2021 5 | \\ 6 | \\ Twitter @KevEdwardsRetro 7 | \\ 8 | 9 | \\ REM SAVE"$.Galaforce2.Rout2" 10 | \\ B%=P% 11 | \\ [OPT pass 12 | 13 | .InitLev 14 | LDY level:DEY:TYA:LDY #0 15 | .InLev0 16 | CMP #MaxLev:BCC InLev1 17 | INY:SBC #MaxLev:BCS InLev0 \ Always 18 | 19 | .InLev1 20 | TAX 21 | LDA TSecLo,X:STA SectAddr 22 | LDA TSecHi,X:STA SectAddr+1 23 | LDA #0:STA SectOff 24 | RTS 25 | 26 | .AddScr 27 | STA temp4 28 | LDA #5:STA temp4+1 \ Index to 'tens' column 29 | .AddSc0 30 | LDX temp4+1 31 | LDA temp4:BEQ AddSc1 32 | CLC:ADC score,X 33 | LDY #0 34 | .AddSc2 35 | CMP #10:BCC AddSc3 36 | INY:SBC #10:BCS AddSc2 \ Always 37 | .AddSc3 38 | STA score,X:STY temp4 39 | CPX #5:BNE AddSc4 40 | LDY Player:LDX TPlyrX,Y 41 | DEX:DEX:DEX:DEX \ -4 from X to move to 'tens' position on screen 42 | LDY #0:JSR PDigit 43 | JMP AddSc5 44 | 45 | .TPlyrX 46 | EQUB 24:EQUB 76 47 | 48 | .AddSc4 49 | TAY:JSR PDig0 50 | .AddSc5 51 | DEC temp4+1:BPL AddSc0 52 | .AddSc1 53 | RTS 54 | 55 | .PDigit 56 | STA temp3 57 | JSR xycalc 58 | STA temp2+1:STX temp2 59 | LDY temp3 60 | .PDig0 61 | LDX TStIndx,Y 62 | LDY #15 63 | .PDig1 64 | LDA DigGra,X:STA (temp2),Y 65 | DEX:DEY:BPL PDig1 66 | LDA temp2:SEC:SBC #16:STA temp2 67 | BCS PDig2 68 | DEC temp2+1 69 | .PDig2 70 | RTS 71 | 72 | .TStIndx 73 | EQUB &0F:EQUB &1F:EQUB &2F:EQUB &3F:EQUB &4F 74 | EQUB &5F:EQUB &6F:EQUB &7F:EQUB &8F:EQUB &9F 75 | 76 | .ZeroInf 77 | LDA #0 78 | .ZeroI1 79 | STA temp4+1:TAY 80 | LDA #0:LDX TPlyrX,Y:LDY #0:JSR PDigit 81 | LDX #6:STX temp4 \ 6 (+1 above) zeros, Units is always 0! 82 | .ZeroI0 83 | LDY #0:JSR PDig0 84 | DEC temp4:BNE ZeroI0 85 | LDA temp4+1:EOR #1:BNE ZeroI1 86 | RTS 87 | 88 | .ReadPlyr 89 | LDX #PlyrSize-1 90 | .RePly1 91 | LDA Player:BNE RePly0 92 | LDA Plyr1Inf,X:JMP RePly2 93 | .RePly0 94 | LDA Plyr2Inf,X 95 | .RePly2 96 | STA PlyrInf,X 97 | DEX:BPL RePly1 98 | RTS 99 | 100 | .SavePlyrB \ Second entry point to force a new 'Player' value 101 | STA Player 102 | 103 | .SavePlyr 104 | LDX #PlyrSize-1 105 | .SaPly1 106 | LDA PlyrInf,X 107 | LDY Player:BNE SaPly0 108 | STA Plyr1Inf,X:JMP SaPly2 109 | .SaPly0 110 | STA Plyr2Inf,X 111 | .SaPly2 112 | DEX:BPL SaPly1 113 | RTS 114 | 115 | .TLivX 116 | EQUB 34:EQUB 42 117 | 118 | .ShwLivB \ Second entry point to force a new 'Player' value 119 | STA Player 120 | JSR ReadPlyr 121 | 122 | .ShwLiv 123 | LDY Player:LDX TLivX,Y 124 | LDA lives:JSR TenUnit 125 | LDY #0:JMP PDigit 126 | 127 | .HunTenUn 128 | LDX #0 129 | .HuTeU0 130 | CMP #100:BCC TenUnit 131 | INX:SBC #100:BCS HuTeU0 \ Always 132 | 133 | .TenUnit 134 | LDY #0 135 | .TenUn0 136 | CMP #10:BCC TenUn1 137 | INY:SBC #10:BCS TenUn0 \ Always 138 | .TenUn1 139 | RTS 140 | 141 | .Event 142 | CMP #4:BNE EvExt \ If not 'vsync' event 143 | 144 | TXA:PHA:TYA:PHA 145 | INC VSyncMast \ Global, continuous frame counter 146 | 147 | BIT FPause:BMI Even2 148 | LDA FSound:LDX #&F:LDY #&F0:JSR REFRESH 149 | 150 | .Even2 151 | LDA VSyncCnt:BEQ Even0 152 | DEC VSyncCnt 153 | 154 | .Even0 155 | LDA VSyncCn2:BEQ Even1 156 | DEC VSyncCn2 157 | 158 | .Even1 159 | PLA:TAY:PLA:TAX 160 | LDA #4 161 | .EvExt 162 | RTS 163 | 164 | .TryStars 165 | LDA VSyncCnt:BNE EvExt \ RTS 166 | LDA #1:STA VSyncCnt 167 | 168 | .MoveStars 169 | LDY #16:LDX WhichStar:BEQ MveSta0 170 | DEY 171 | .MveSta0 172 | LDA StarInfo+2,X:EOR (StarInfo,X):STA (StarInfo,X) 173 | LDA StarInfo,X:AND #7:CMP #6:BCC MveSta1 174 | LDA StarInfo,X:ADC #&39:EOR #&80:STA StarInfo,X 175 | LDA StarInfo+1,X:ADC #1:STA StarInfo+1,X 176 | BPL MveSta2 177 | 178 | JSR AtTop:JMP MveSta2 179 | 180 | .MveSta1 181 | INC StarInfo,X:INC StarInfo,X 182 | .MveSta2 183 | LDA StarInfo+2,X:EOR (StarInfo,X):STA (StarInfo,X) 184 | INX:INX:INX:DEY:BNE MveSta0 185 | 186 | LDX #16*3:LDA WhichStar:BEQ MveSta3 187 | LDX #0 188 | .MveSta3 189 | STX WhichStar 190 | RTS 191 | 192 | .TStarByte 193 | EQUB 8:EQUB 4:EQUB 2:EQUB 1 194 | EQUB &80:EQUB &40:EQUB &20:EQUB &10 195 | EQUB &88:EQUB &44:EQUB &22:EQUB &11 196 | EQUB &80:EQUB 4:EQUB &40:EQUB &11 197 | 198 | .InitStars 199 | LDA #0:TAX 200 | STA WhichStar:STA VSyncCnt \ Reset important star & Event related vars. 201 | STA temp1:STA temp1+1 202 | LDA #NumStars:STA temp2 203 | .InSta0 204 | JSR AtTop 205 | LDA temp1:CLC:ADC StarInfo,X:STA StarInfo,X 206 | LDA temp1+1:ADC StarInfo+1,X:STA StarInfo+1,X 207 | JSR rand:AND #7:EOR temp1:CLC:ADC #&40:STA temp1 208 | LDA temp1+1:ADC #1:STA temp1+1 209 | JSR rand:AND #&F:TAY 210 | LDA TStarByte,Y:STA StarInfo+2,X 211 | EOR (StarInfo,X):STA (StarInfo,X) 212 | INX:INX:INX 213 | DEC temp2:BNE InSta0 214 | RTS 215 | 216 | .AtTop 217 | JSR rand:AND #1 218 | CLC:ADC #&59:STA StarInfo+1,X 219 | CMP #&5A:BEQ AtTop0 220 | JSR rand:AND #&F8:ORA #&40:BNE AtTop1 221 | .AtTop0 222 | JSR rand:AND #&78 223 | .AtTop1 224 | STA StarInfo,X 225 | RTS 226 | 227 | .MoveMeDelay 228 | STA LoopA 229 | .MoMeD0 230 | JSR ProcessMyBombs 231 | JSR TryStars 232 | JSR TryMe 233 | JSR OpKeys 234 | JSR fx19 235 | LDX #&8F:JSR check_key:BEQ MoMeD1 \ Escape 236 | BIT Demo:BPL MoMeD2 237 | JSR testspc:BEQ MoMeD1 238 | .MoMeD2 239 | DEC LoopA:BNE MoMeD0 240 | .MoMeD1 241 | RTS 242 | 243 | \\ ] 244 | 245 | \\ PRINT"Routine 2 from &";~B%;" to &";~P%-1;" (";P%-B%;")" 246 | \\ PAGE=PG% 247 | \\ RETURN 248 | -------------------------------------------------------------------------------- /src/SUBR1.asm: -------------------------------------------------------------------------------- 1 | \\ 2 | \\ Galaforce 2 ( BBC Micro ) from the original 6502 source code, adapted to assemble using beebasm 3 | \\ 4 | \\ (c) Kevin Edwards 1987-2021 5 | \\ 6 | \\ Twitter @KevEdwardsRetro 7 | \\ 8 | 9 | \\ REM SAVE"$.Galaforce2.Subr1" 10 | \\ B%=P% 11 | \\ [OPT pass 12 | 13 | .DispHead 14 | JSR title 15 | LDY #0:JMP pstring 16 | 17 | .pgamovr 18 | LDY #6:JSR pstring 19 | LDY #4:JMP pstring 20 | 21 | .title 22 | LDA #0:STA temp4+1 23 | LDA #&30:STA temp5 24 | LDX #6:LDY #32:JSR xycalc:STA temp2+1:STX temp2 25 | LDX #6:LDY #40:JSR xycalc:STA temp3+1:STX temp3 26 | 27 | .tit0 28 | LDX temp4+1:LDA BigName,X:BMI tit6 29 | STA temp1 30 | ASL A:ASL A:CLC:ADC temp1:TAX 31 | LDA #5:STA temp4 32 | 33 | .tit1 34 | LDA SpCharSet,X:STA temp1 35 | LDA #4:STA temp1+1 36 | LDY #0 37 | 38 | .tit2 39 | LSR temp1:BCC tit3 40 | LDA temp5:EOR (temp2),Y:STA (temp2),Y:INY 41 | LDA temp5:EOR (temp2),Y:STA (temp2),Y:DEY 42 | .tit3 43 | LDA #8:AND temp1:BEQ tit4 44 | LDA temp5:EOR (temp3),Y:STA (temp3),Y:INY 45 | LDA temp5:EOR (temp3),Y:STA (temp3),Y:DEY 46 | .tit4 47 | INY:INY 48 | DEC temp1+1:BNE tit2 49 | JSR titrig:INX 50 | DEC temp4:BNE tit1 51 | JSR titrig 52 | INC temp4+1:BNE tit0:\ Always 53 | 54 | .titrig 55 | LDA temp5:EOR #(&C0 EOR &30):STA temp5 56 | CMP #&C0:BNE tit6 57 | LDA temp2:ADC #7:STA temp2:BCC tit5 \ C=1 58 | INC temp2+1 59 | .tit5 60 | LDA temp3:CLC:ADC #8:STA temp3:BCC tit6 61 | INC temp3+1 62 | .tit6 63 | RTS 64 | 65 | .BigName 66 | \\ OPT FNmyascii2("GALAFORCE") 67 | base = 55; 68 | EQUB 'G'- base,'A'- base,'L'- base,'A'- base,'F'- base,'O'- base,'R'- base,'C'- base,'E'- base 69 | EQUB 38:EQUB '2' - '0' 70 | EQUB &FF 71 | 72 | .ProcessMyBombs 73 | LDX #MaxMyBmb-1 74 | .PrMyB0 75 | LDA MyBmbSt,X:BMI PrMyB1 76 | .PrMyB2 77 | DEX:BPL PrMyB0 78 | BMI PrMyB4 79 | 80 | .PrMyB1 81 | JSR PlotBull 82 | LDA MyBmbY,X:SEC:SBC #8 83 | CMP #8:BCC PrMyB3 84 | LDY Feature:CPY #7:BNE PrFasFir \ If not fast fire 85 | SEC:SBC #8 86 | CMP #8:BCC PrMyB3 87 | 88 | .PrFasFir 89 | STA MyBmbY,X 90 | JSR PlotBull 91 | JMP PrMyB2 92 | 93 | .PrMyB3 94 | DEC ActBullets 95 | LDA #0:STA MyBmbSt,X:BEQ PrMyB2 96 | 97 | .PlotBull 98 | STX temp2 \ Save X 99 | LDY MyBmbY,X:LDA MyBmbX,X:SEC:SBC #XExcess:TAX 100 | JSR xycalc:STA temp1+1:STX temp1 101 | LDX temp2:LDA MyBmbX,X:LSR A 102 | BCS PlBul0 103 | 104 | LDY #7 105 | .PlBul1 106 | LDA (temp1),Y:EOR BullGra,Y:STA (temp1),Y 107 | DEY:BPL PlBul1 108 | RTS 109 | 110 | .PlBul0 111 | LDY #&F:LDX #7 112 | .PlBul00 113 | LDA (temp1),Y:EOR BullGra0,X:STA (temp1),Y 114 | DEY:DEX:BPL PlBul00 115 | LDY #6:LDA #1:EOR (temp1),Y:STA (temp1),Y 116 | LDX temp2 \ Restore original ID 117 | RTS 118 | 119 | .PrMyB4 120 | LDA ObjSt+0:BPL PrMyBEx 121 | LSR A:BCS PrMyBEx 122 | LDX Feature:DEX:BEQ PrMyBEx \ No fire 123 | 124 | BIT Demo:BMI PrMyBDem \ Always fire 125 | BIT FKeyJoy:BMI DoKy 126 | JSR RxJoyBut:BCS PrMyBDem 127 | BCC PrMyB5 128 | 129 | .DoKy 130 | LDX #&B6:JSR check_key \ Return 131 | BNE PrMyB5 132 | 133 | .PrMyBDem 134 | LDA FireDel:BEQ PrMyB6 135 | DEC FireDel 136 | 137 | .PrMyBEx 138 | RTS 139 | 140 | .PrMyB5 141 | LDA #0:BEQ PrMyB9 \ Always 142 | 143 | .PrMyB6 144 | LDA ShipInfo:CMP #1:BCS PrMyB10 145 | LDA Feature:CMP #6:BEQ PrMyB10 \ Lots of fire 146 | LDA ActBullets:CMP #9:BCS PrMyBEx \ Was 3! 147 | 148 | .PrMyB10 149 | LDX #MaxMyBmb-1 150 | .PrMyB7 151 | LDA MyBmbSt,X:BPL PrMyB8 152 | DEX:BPL PrMyB7 153 | RTS 154 | 155 | .PrMyB8 156 | INC ActBullets 157 | LDA #&80:STA MyBmbSt,X 158 | LDA ObjX+0:CLC:ADC #2:STA MyBmbX,X 159 | LDA ObjY+0:SBC #22:AND #&F8:STA MyBmbY,X 160 | JSR PlotBull 161 | LDX #FxFire MOD &100:LDY #FxFire DIV &100:JSR SoundFx 162 | LDA #2 163 | 164 | .PrMyB9 165 | STA FireDel 166 | RTS 167 | 168 | .FxFire 169 | EQUW &12:EQUW 2:EQUW 60:EQUW 4 170 | 171 | .BullGra 172 | EQUB &22:EQUB &22:EQUB &22:EQUB &22:EQUB &22:EQUB &22:EQUB &07:EQUB &22 173 | .BullGra0 174 | EQUB &88:EQUB &88:EQUB &88:EQUB &88:EQUB &88:EQUB &88:EQUB &0C:EQUB &88 175 | 176 | .BullAlienCol 177 | LDX #MaxMyBmb-1 178 | .BuAlCo0 179 | LDA MyBmbSt,X:BMI BuAlCB 180 | JMP BuAlCo2 181 | 182 | .BuAlCB 183 | LDY MaxAlID 184 | .BuAlCo1 185 | LDA ObjSt,Y:BPL BuFud1 186 | LSR A:BCS BuFud1 187 | LDA ObjDestr,Y:BMI BuFud1 188 | LDA ObjInfo,Y:LSR A:BCC BuFud0 189 | 190 | .BuFud1 191 | JMP BuAlCo3 192 | 193 | .BuFud0 194 | LDA ObjX,Y:CLC:SBC MyBmbX,X 195 | BCC BuAlCo4 \ ObjX < BmbX 196 | BNE BuAlCo3 \ No X collision 197 | BEQ BuAlCo6 198 | 199 | .BuAlCo4 200 | EOR #&FF:ADC #1 201 | CMP ObjXWid,Y:BCS BuAlCo3 \ No X collision 202 | 203 | .BuAlCo6 204 | LDA ObjY,Y:SEC:SBC MyBmbY,X 205 | BCS BuAlCo5 \ ObjY >= BmbY 206 | 207 | EOR #&FF:ADC #1 208 | CMP #8:BCS BuAlCo3 \ No Y collision 209 | BCC BuAlCo7 \ collision 210 | 211 | .BuAlCo5 212 | CMP ObjHei,Y:BCS BuAlCo3 \ No Y collision 213 | 214 | .BuAlCo7 215 | DEC ActBullets 216 | LDA #0:STA MyBmbSt,X 217 | STX temp5:STY temp5+1 \ Save X,Y 218 | JSR PlotBull \ Erase bull 219 | LDX temp5+1 \ X = 'Obj..' ID (no DEC abs,Y) 220 | LDA ObjInfo,X:AND #&F7:STA ObjInfo,X 221 | DEC ObjHits,X:BEQ BuAlCoA \ Alien dead 222 | JSR ExplNoC:JMP BuAlCo8 223 | 224 | .BuAlCoA 225 | LDY temp5+1 226 | LDA ObjInfo,Y:BPL BuAlCo9 \ Not a special feature alien 227 | LDX #1:STX ShipInfo \ Tell processing to change my ship 228 | 229 | .BuAlCo9 230 | ASL A:BPL BuAlCoB 231 | LDX temp5+1:JSR FeatPro:LDX temp5:LDY temp5+1 232 | JMP BuAlCoC 233 | 234 | .BuAlCoB 235 | LDA #&80:STA ObjDestr,Y \ kill ID 236 | LDA #&81:STA ObjSt,Y \ Change status to 'exploding' immediately! 237 | 238 | .BuAlCoC 239 | LDX ObjGTyp,Y 240 | LDA TGTypScore,X:JSR AddScr 241 | JSR ExplNoise 242 | 243 | .BuAlCo8 244 | LDX temp5 \ Restore X with Bullet ID (Y no longer req'd) 245 | BPL BuAlCo2 \ Goes to outer loop as X bomb ID is dead! 246 | 247 | .BuAlCo3 248 | DEY:BEQ BuAlCo2 249 | JMP BuAlCo1 250 | .BuAlCo2 251 | DEX:BMI BuAlCo10 \ branch 252 | JMP BuAlCo0 253 | .BuAlCo10 254 | RTS 255 | 256 | \\ ] 257 | 258 | \\ PRINT"Subr. 1 from &";~B%;" to &";~P%-1;" (";P%-B%;")" 259 | \\ PAGE=PG%:RETURN 260 | 261 | \\ DEF FNmyascii2(oldasc$) 262 | \\ IF pass>4 O%=O%+LEN(oldasc$):P%=P%+LEN(oldasc$):=pass 263 | \\ FORL%=1TOLEN(oldasc$) 264 | \\ ?(O%+L%-1)=ASC(MID$(oldasc$,L%,1))-55 265 | \\ NEXT 266 | \\ O%=O%+LEN(oldasc$):P%=P%+LEN(oldasc$) 267 | \\ =pass 268 | -------------------------------------------------------------------------------- /src/SceLGam.asm: -------------------------------------------------------------------------------- 1 | \\ 2 | \\ Galaforce 2 ( BBC Micro ) from the original 6502 source code, adapted to assemble using beebasm 3 | \\ 4 | \\ (c) Kevin Edwards 1987-2021 5 | \\ 6 | \\ Twitter @KevEdwardsRetro 7 | \\ 8 | 9 | \\ REM SAVE"$.Galaforce2.SceLGam" 10 | \\ MODE7:HIMEM=&6000 11 | 12 | HIMEM=&6000 13 | oscli=&FFF7 14 | 15 | loadaddr=&700 \ REM Where this loader loads and executes at 16 | mainexec=&5800 \ REM Execution address of main program just loaded 17 | size=&58-&E+8 \ REM Size of main file (in pages) to be downloaded 18 | 19 | \\ FORpass=4TO6STEP2 20 | \\ P%=loadaddr:O%=HIMEM 21 | \\ [OPT pass 22 | 23 | ORG loadaddr 24 | 25 | .start 26 | LDX #loadmod MOD 256 27 | LDY #loadmod DIV 256 28 | JSR oscli 29 | LDX #loadobj MOD 256 30 | LDY #loadobj DIV 256 31 | JSR oscli 32 | 33 | LDA #&8C:LDX #&C:JSR &FFF4 \ *TAPE 34 | 35 | SEI 36 | LDX #&F:LDA #0 37 | .killroms 38 | STA &2A1,X 39 | DEX:BPL killroms 40 | CLI 41 | 42 | LDX #size 43 | LDY #0 44 | .download 45 | LDA &1900,Y:STA &E00,Y 46 | INY:BNE download 47 | INC download+2:INC download+5 48 | DEX:BNE download 49 | 50 | JMP mainexec 51 | 52 | .loadmod 53 | EQUS "LOAD Mod 900", &D 54 | 55 | .loadobj 56 | EQUS "LOAD Obj 1900", &D 57 | 58 | \\ ]NEXT 59 | \\ PRINT'" *SAVE LoadGam "+STR$~(HIMEM)+" "+STR$~(O%)+" "+STR$~(start)+" "+STR$~(loadaddr) 60 | 61 | -------------------------------------------------------------------------------- /src/Sect1.asm: -------------------------------------------------------------------------------- 1 | \\ 2 | \\ Galaforce 2 ( BBC Micro ) from the original 6502 source code, adapted to assemble using beebasm 3 | \\ 4 | \\ (c) Kevin Edwards 1987-2021 5 | \\ 6 | \\ Twitter @KevEdwardsRetro 7 | \\ 8 | 9 | \\ REM SAVE"$.Galaforce2.Sect1" 10 | \\ B%=P% 11 | \\ [OPT pass 12 | 13 | .Sect0 14 | EQUB ChMaxAlID:EQUB 14 15 | 16 | EQUB InAllDead:EQUB 6 17 | EQUB InAllDead:EQUB &80+6 18 | EQUB InAllDead:EQUB &80+13 19 | EQUB InAllDead:EQUB 13 20 | EQUB InAllDead:EQUB 12 21 | EQUB InAllDead:EQUB &80+12 22 | EQUB InAlDeFlp:EQUB 11 23 | 24 | EQUB ChMaxAlID:EQUB 10 25 | EQUB InAllDead:EQUB &80+1 26 | EQUB InAllDead:EQUB 1 27 | EQUB InAlDeFlp:EQUB 1 28 | 29 | EQUB ChMaxAlID:EQUB 18 30 | EQUB InExhFeat:EQUB 4:EQUB 6 \ Xtra firepower 31 | 32 | EQUB CtrlZonEnd 33 | 34 | .Sect1 35 | EQUB ChMaxAlID:EQUB 16 36 | 37 | EQUB InAllDead:EQUB &80+0 38 | EQUB InAllDead:EQUB 0 39 | EQUB InExhFeat:EQUB 0:EQUB 3 \ No vertical 40 | EQUB InAllDead:EQUB &80+8 41 | EQUB InAllDead:EQUB 8 42 | EQUB InExhFeat:EQUB 8:EQUB 8 \ Smart bomb 43 | EQUB InAllDead:EQUB 2 44 | EQUB InAllDead:EQUB &80+2 45 | EQUB InAlDeFlp:EQUB 2 46 | EQUB InAllDead:EQUB 23 47 | 48 | EQUB CtrlZonEnd 49 | 50 | .Sect2 51 | EQUB ChMaxAlID:EQUB 14 52 | 53 | EQUB CtrlFor :EQUB 2 54 | EQUB InAlDeFlp:EQUB 3 55 | EQUB InAllDead:EQUB &80+3 56 | EQUB InAllDead:EQUB 3 57 | EQUB InAllDead:EQUB 1 58 | EQUB InAllDead:EQUB &80+1 59 | 60 | EQUB ChMaxAlID:EQUB 8 61 | EQUB CtrlNext 62 | 63 | EQUB CtrlZonEnd 64 | 65 | .Sect3 66 | EQUB ChMaxAlID:EQUB 24 67 | 68 | EQUB InExhFeat:EQUB 13:EQUB 10 \ 1000 pts 69 | 70 | EQUB ChMaxAlID:EQUB 16 71 | EQUB InAllDead:EQUB &80+4 72 | EQUB InAllDead:EQUB 4 73 | EQUB InAllDead:EQUB 5 74 | EQUB InAllDead:EQUB &80+5 75 | EQUB InAllDead:EQUB 7 76 | EQUB InAllDead:EQUB 23 77 | 78 | EQUB ChMaxAlID:EQUB 6 79 | 80 | EQUB WtAllDead 81 | EQUB InAlDeFlp:EQUB 16 82 | EQUB InAlways :EQUB 42 \ Big ship 1 83 | EQUB InAlways :EQUB 43 84 | 85 | EQUB ChMaxAlID:EQUB 17 86 | EQUB WtAllDead:EQUB InExhFeat:EQUB 6:EQUB 8 \ Smart bomb 87 | EQUB CtrlZonEnd 88 | 89 | .Sect4 90 | EQUB ChMaxAlID:EQUB 16 91 | 92 | EQUB CtrlFor :EQUB 2 93 | EQUB InAllDead:EQUB 10 94 | EQUB InAllDead:EQUB 15 95 | EQUB WtAllDead:EQUB InExhFeat:EQUB 38:EQUB 7 \ Rapid fire 96 | EQUB InAllDead:EQUB &80+15 97 | EQUB InAllDead:EQUB &80+10 98 | EQUB InAllDead:EQUB 17 99 | EQUB WtAllDead:EQUB InExhFeat:EQUB 38:EQUB 2 \ Slow ship 100 | EQUB InAllDead:EQUB &80+17 101 | 102 | EQUB ChMaxAlID:EQUB 12 103 | EQUB CtrlNext 104 | 105 | EQUB CtrlZonEnd 106 | 107 | .Sect5 108 | EQUB ChMaxAlID:EQUB 16 109 | 110 | EQUB InAllDead:EQUB 16 111 | EQUB InExhFeat:EQUB &80+18:EQUB 10 \ 1000 pts 112 | EQUB InAllDead:EQUB &80+16 113 | EQUB InExhFeat:EQUB 18:EQUB 10 \ 1000 pts 114 | EQUB InAllDead:EQUB &80+41 115 | EQUB WtAllDead:EQUB InExhFeat:EQUB 31:EQUB 0 \ Reverse controls 116 | EQUB InAllDead:EQUB 41 117 | EQUB InAlDeFlp:EQUB 10 118 | EQUB InAllDead:EQUB &80+18 119 | EQUB InAllDead:EQUB 18 120 | EQUB InAlDeFlp:EQUB 3 121 | 122 | EQUB CtrlZonEnd 123 | 124 | .Sect6 125 | EQUB ChMaxAlID:EQUB 14 126 | 127 | EQUB InExhFeat:EQUB 21:EQUB 6 \ Xtra firepower 128 | EQUB InAllDead:EQUB 19 129 | EQUB InAllDead:EQUB &80+19 130 | EQUB InAllDead:EQUB &80+20 131 | EQUB InAllDead:EQUB 20 132 | EQUB InAllDead:EQUB &80+13 133 | EQUB InAllDead:EQUB 13 134 | 135 | EQUB CtrlFor :EQUB 2 136 | EQUB InAllDead:EQUB 21 137 | EQUB InAllDead:EQUB &80+21 138 | EQUB InAllDead:EQUB 23 139 | 140 | EQUB CtrlNext 141 | 142 | EQUB WtAllDead:EQUB InAlwFeat:EQUB 29:EQUB 9 \ Xtra life 143 | 144 | EQUB CtrlZonEnd 145 | 146 | .Sect7 147 | EQUB ChMaxAlID:EQUB 12 148 | 149 | EQUB InAllDead:EQUB &80+22 150 | EQUB InAllDead:EQUB 22 151 | EQUB InAllDead:EQUB 6 152 | EQUB InAllDead:EQUB &80+6 153 | EQUB InAllDead:EQUB 24 154 | EQUB InAllDead:EQUB 0 155 | EQUB InAllDead:EQUB &80+0 156 | EQUB InAllDead:EQUB &80+24 157 | 158 | EQUB ChMaxAlID:EQUB 9 159 | 160 | EQUB WtAllDead 161 | EQUB InAlways :EQUB 44 \ 2 * Big ship 1 162 | EQUB InAlways :EQUB 45 163 | 164 | EQUB CtrlZonEnd 165 | 166 | \\ ] 167 | 168 | \\ PRINT"Section 1 from &";~B%;" to &";~P%-1;" (";P%-B%;")" 169 | \\ PAGE=PG% 170 | \\ RETURN 171 | -------------------------------------------------------------------------------- /src/Sect2.asm: -------------------------------------------------------------------------------- 1 | \\ 2 | \\ Galaforce 2 ( BBC Micro ) from the original 6502 source code, adapted to assemble using beebasm 3 | \\ 4 | \\ (c) Kevin Edwards 1987-2021 5 | \\ 6 | \\ Twitter @KevEdwardsRetro 7 | \\ 8 | 9 | \\ REM SAVE"$.Galaforce2.Sect2" 10 | \\ B%=P% 11 | \\ [OPT pass 12 | 13 | .Sect8 14 | EQUB ChMaxAlID:EQUB 14 15 | 16 | EQUB InAllDead:EQUB 25 17 | EQUB InAllDead:EQUB &80+25 18 | EQUB InAlDeFlp:EQUB 8 19 | EQUB InAllDead:EQUB 26 20 | EQUB InAllDead:EQUB &80+26 21 | EQUB WtAllDead:EQUB InExhFeat:EQUB 28:EQUB 5 \ Explosive container! 22 | EQUB InAllDead:EQUB 2 23 | EQUB InAllDead:EQUB &80+2 24 | EQUB InAllDead:EQUB 27 25 | EQUB WtAllDead:EQUB InExhFeat:EQUB 16:EQUB 10 \ 1000 pts 26 | EQUB InAllDead:EQUB &80+27 27 | 28 | EQUB CtrlZonEnd 29 | 30 | .Sect9 31 | EQUB ChMaxAlID:EQUB 16 32 | 33 | EQUB InAllDead:EQUB 28 34 | EQUB InAllDead:EQUB &80+28 35 | EQUB InAllDead:EQUB &80+29 36 | EQUB InAllDead:EQUB 19 37 | EQUB InAllDead:EQUB &80+19 38 | EQUB InAllDead:EQUB 29 39 | EQUB InAllDead:EQUB 12 40 | EQUB InAllDead:EQUB &80+12 41 | EQUB InAllDead:EQUB 21 42 | EQUB WtAllDead:EQUB InExhFeat:EQUB 27:EQUB 9 \ Xtra life 43 | EQUB WtAllDead:EQUB InExhFeat:EQUB &80+27:EQUB 1 \ No Firepower 44 | 45 | EQUB CtrlZonEnd 46 | 47 | .Sect10 48 | EQUB ChMaxAlID:EQUB 14 49 | 50 | EQUB InAllDead:EQUB 30 51 | EQUB InAllDead:EQUB &80+30 52 | EQUB WtAllDead:EQUB InExhFeat:EQUB 29:EQUB 6 \ Xtra firepower 53 | EQUB InAllDead:EQUB 9 54 | EQUB InAllDead:EQUB &80+9 55 | EQUB InAllDead:EQUB &80+31 56 | EQUB InAllDead:EQUB 31 57 | EQUB WtAllDead:EQUB InExhFeat:EQUB 33:EQUB 4 \ No horizontal 58 | EQUB InAllDead:EQUB &80+11 59 | EQUB InAllDead:EQUB 11 60 | 61 | EQUB CtrlZonEnd 62 | 63 | .Sect11 64 | EQUB ChMaxAlID:EQUB 14 65 | 66 | EQUB InAlDeFlp:EQUB 11 67 | EQUB InAllDead:EQUB &80+15 68 | EQUB InAllDead:EQUB 15 69 | EQUB InAllDead:EQUB 33 70 | EQUB InAllDead:EQUB &80+33 71 | 72 | EQUB ChMaxAlID:EQUB 7 73 | 74 | EQUB WtAllDead 75 | EQUB InAlways :EQUB 46 \ 2 * Big ship 1 76 | EQUB InAlways :EQUB 47 77 | 78 | EQUB ChMaxAlID:EQUB 20 79 | EQUB WtAllDead:EQUB InExhFeat:EQUB 30:EQUB 10 \ 1000 pts 80 | EQUB InExhFeat:EQUB &80+30:EQUB 8 \ Smart bomb 81 | 82 | EQUB CtrlZonEnd 83 | 84 | .Sect12 85 | EQUB ChMaxAlID:EQUB 16 86 | 87 | EQUB InAllDead:EQUB 14 88 | EQUB WtAllDead:EQUB InExhFeat:EQUB 5:EQUB 2 \ Slow ship 89 | EQUB InAllDead:EQUB 34 90 | EQUB InAllDead:EQUB &80+34 91 | EQUB InAllDead:EQUB &80+22 92 | EQUB InAllDead:EQUB 22 93 | EQUB InAllDead:EQUB &80+35 94 | EQUB InAllDead:EQUB 35 95 | EQUB InAllDead:EQUB 25 96 | EQUB InAllDead:EQUB &80+25 97 | 98 | EQUB CtrlZonEnd 99 | 100 | .Sect13 101 | EQUB ChMaxAlID:EQUB 32 102 | 103 | EQUB WtAllDead:EQUB InExhFeat:EQUB 3:EQUB 10 \ 1000 pts 104 | EQUB WtAllDead:EQUB InExhFeat:EQUB &80+3:EQUB 10 \ 1000 pts 105 | 106 | EQUB WtAllDead 107 | EQUB InAlways :EQUB 23 108 | EQUB InAlways :EQUB 32 109 | 110 | EQUB ChMaxAlID:EQUB 12 111 | 112 | EQUB InAllDead:EQUB 37 113 | EQUB InAllDead:EQUB &80+37 114 | EQUB InAllDead:EQUB 17 115 | EQUB InAllDead:EQUB &80+17 116 | EQUB InAllDead:EQUB &80+36 117 | EQUB InAllDead:EQUB 36 118 | EQUB InAlDeFlp:EQUB 20 119 | 120 | EQUB WtAllDead:EQUB InExhFeat:EQUB 25:EQUB 1 \ No fire 121 | EQUB WtAllDead:EQUB InExhFeat:EQUB &80+25:EQUB 8 \ Smart bomb 122 | EQUB CtrlZonEnd 123 | 124 | .Sect14 125 | EQUB ChMaxAlID:EQUB 16 126 | 127 | EQUB InAllDead:EQUB 38 128 | EQUB InAllDead:EQUB &80+38 129 | EQUB InAlDeFlp:EQUB 26 130 | EQUB InAllDead:EQUB &80+18 131 | EQUB InAllDead:EQUB 18 132 | EQUB InAllDead:EQUB 39 133 | EQUB InAllDead:EQUB &80+39 134 | EQUB InAlDeFlp:EQUB 16 135 | 136 | EQUB WtAllDead:EQUB InExhFeat:EQUB 35:EQUB 8 \ Smart bomb 137 | EQUB WtAllDead:EQUB InExhFeat:EQUB &80+35:EQUB 6 \ Xtra firepower 138 | 139 | EQUB CtrlZonEnd 140 | 141 | .Sect15 142 | EQUB ChMaxAlID:EQUB 16 143 | 144 | EQUB InAlDeFlp:EQUB 24 145 | EQUB InAllDead:EQUB 40 146 | EQUB InAllDead:EQUB &80+40 147 | EQUB InAlDeFlp:EQUB 27 148 | EQUB InAlDeFlp:EQUB 29 149 | 150 | EQUB ChMaxAlID:EQUB 8 151 | 152 | EQUB WtAllDead 153 | EQUB InAlDeFlp:EQUB 50 154 | EQUB InAlways :EQUB 48 \ 1 * Big ship 2 155 | EQUB InAlways :EQUB 49 156 | 157 | EQUB ChMaxAlID:EQUB 16 158 | EQUB WtAllDead:EQUB InExhFeat:EQUB 37:EQUB 11 \ Protective shield 159 | 160 | EQUB CtrlZonEnd 161 | 162 | \\ ] 163 | 164 | \\ PRINT"Section 2 from &";~B%;" to &";~P%-1;" (";P%-B%;")" 165 | \\ PAGE=PG% 166 | \\ RETURN 167 | -------------------------------------------------------------------------------- /src/SpGra.asm: -------------------------------------------------------------------------------- 1 | \\ 2 | \\ Galaforce 2 ( BBC Micro ) from the original 6502 source code, adapted to assemble using beebasm 3 | \\ 4 | \\ (c) Kevin Edwards 1987-2021 5 | \\ 6 | \\ Twitter @KevEdwardsRetro 7 | \\ 8 | 9 | \\ REM SAVE"$.Galaforce2.SpGra" 10 | \\ B%=P% 11 | \\ [OPT pass 12 | 13 | 14 | MACRO MkGraVecLo start, size, num 15 | FOR l, num-1, 0, -1 16 | EQUB LO(start+l*size) 17 | NEXT 18 | FOR l, num-1, 0, -1 19 | EQUB LO(start+(l+num)*size) 20 | NEXT 21 | ENDMACRO 22 | 23 | MACRO MkGraVecHi start, size, num 24 | FOR l, num-1, 0, -1 25 | EQUB HI(start+l*size) 26 | NEXT 27 | FOR l, num-1, 0, -1 28 | EQUB HI(start+(l+num)*size) 29 | NEXT 30 | ENDMACRO 31 | 32 | .TSpGraLo 33 | \\ OPT FNMkGraVecLo(Expl,4*16,6) \ 0 to 11 Explosion 34 | 35 | \\ OPT FNMkGraVecLo(MyShip,4*16,1) \ 12 to 17 My ship(s) 36 | \\ OPT FNMkGraVecLo(0,4*16,1) 37 | \\ OPT FNMkGraVecLo(0,4*16,1) 38 | 39 | \\ OPT FNMkGraVecLo(Aliens,4*16,1) \ 18 to 19 Jelly mon 40 | \\ OPT FNMkGraVecLo(0,4*16,1) \ 20 to 21 41 | \\ OPT FNMkGraVecLo(0,4*16,1) \ 22 to 23 42 | \\ OPT FNMkGraVecLo(0,4*16,1) \ 24 to 25 43 | \\ OPT FNMkGraVecLo(0,4*16,1) \ 26 to 27 44 | \\ OPT FNMkGraVecLo(0,4*16,1) \ 28 to 29 45 | \\ OPT FNMkGraVecLo(0,4*16,1) \ 30 to 31 46 | \\ OPT FNMkGraVecLo(0,4*16,1) \ 32 to 33 47 | \\ OPT FNMkGraVecLo(0,4*16,1) \ 34 to 35 48 | \\ OPT FNMkGraVecLo(0,4*16,1) \ 36 to 37 49 | \\ OPT FNMkGraVecLo(0,4*16,2) \ 38 to 41 Feature object 50 | \\ OPT FNMkGraVecLo(0,4*7,1) \ 42 to 43 1000pts 51 | \\ OPT FNMkGraVecLo(0,3*8,1) \ 44 to 45 Xtra Life 52 | \\ OPT FNMkGraVecLo(0,2*8,2) \ 46 to 49 Flash bomb 53 | 54 | \\ OPT FNMkGraVecLo(BigAl,4*32,1) \ 50 to 51 Big Alien 1 Part 1 55 | \\ OPT FNMkGraVecLo(0,4*32,1) \ 52 to 53 Big Alien 1 Part 2 56 | \\ OPT FNMkGraVecLo(0,4*32,1) \ 54 to 55 Big Alien 2 Part 1 57 | \\ OPT FNMkGraVecLo(0,4*32,1) \ 56 to 57 Big Alien 2 Part 2 58 | 59 | MkGraVecLo Expl, 4*16, 6 ; 0 to 11 Explosion 60 | 61 | MkGraVecLo MyShip, 4*16, 1 ; 12 to 17 My ship(s) 62 | MkGraVecLo MyShip +2*4*16, 4*16, 1 63 | MkGraVecLo MyShip +4*4*16, 4*16, 1 64 | 65 | MkGraVecLo Aliens, 4*16, 1 ; 18 to 19 Jelly mon 66 | MkGraVecLo Aliens +2*4*16, 4*16, 1 ; 20 to 21 67 | MkGraVecLo Aliens +4*4*16, 4*16, 1 ; 22 to 23 68 | MkGraVecLo Aliens +6*4*16, 4*16, 1 ; 24 to 25 69 | MkGraVecLo Aliens +8*4*16, 4*16, 1 ; 26 to 27 70 | MkGraVecLo Aliens +10*4*16, 4*16, 1 ; 28 to 29 71 | MkGraVecLo Aliens +12*4*16, 4*16, 1 ; 30 to 31 72 | MkGraVecLo Aliens +14*4*16, 4*16, 1 ; 32 to 33 73 | MkGraVecLo Aliens +16*4*16, 4*16, 1 ; 34 to 35 74 | MkGraVecLo Aliens +18*4*16, 4*16, 1 ; 36 to 37 75 | MkGraVecLo Aliens +20*4*16, 4*16, 2 ; 38 to 41 Feature object 76 | MkGraVecLo Aliens +24*4*16, 4*7, 1 ; 42 to 43 1000pts 77 | MkGraVecLo Aliens +24*4*16 +2*4*7, 3*8, 1 ; 44 to 45 Xtra Life 78 | MkGraVecLo Aliens +24*4*16 +2*4*7 +2*3*8, 2*8, 2 ; 46 to 49 Flash bomb 79 | 80 | MkGraVecLo BigAl, 4*32, 1 ; 50 to 51 Big Alien 1 Part 1 81 | MkGraVecLo BigAl +2*4*32, 4*32, 1 ; 52 to 53 Big Alien 1 Part 2 82 | MkGraVecLo BigAl +4*4*32, 4*32, 1 ; 54 to 55 Big Alien 2 Part 1 83 | MkGraVecLo BigAl +6*4*32, 4*32, 1 ; 56 to 57 Big Alien 2 Part 2 84 | 85 | 86 | .TSpGraHi 87 | \\ OPT FNMkGraVecHi(Expl,4*16,6) 88 | 89 | \\ OPT FNMkGraVecHi(MyShip,4*16,1) 90 | \\ OPT FNMkGraVecHi(0,4*16,1) 91 | \\ OPT FNMkGraVecHi(0,4*16,1) 92 | 93 | \\ OPT FNMkGraVecHi(Aliens,4*16,1) \ Jelly mon 94 | \\ OPT FNMkGraVecHi(0,4*16,1) 95 | \\ OPT FNMkGraVecHi(0,4*16,1) 96 | \\ OPT FNMkGraVecHi(0,4*16,1) 97 | \\ OPT FNMkGraVecHi(0,4*16,1) 98 | \\ OPT FNMkGraVecHi(0,4*16,1) 99 | \\ OPT FNMkGraVecHi(0,4*16,1) 100 | \\ OPT FNMkGraVecHi(0,4*16,1) 101 | \\ OPT FNMkGraVecHi(0,4*16,1) 102 | \\ OPT FNMkGraVecHi(0,4*16,1) 103 | \\ OPT FNMkGraVecHi(0,4*16,2) \ Feature object 104 | \\ OPT FNMkGraVecHi(0,4*7,1) 105 | \\ OPT FNMkGraVecHi(0,3*8,1) 106 | \\ OPT FNMkGraVecHi(0,2*8,2) \ Flash bomb 107 | 108 | \\ OPT FNMkGraVecHi(BigAl,4*32,1) \ Big Alien 1 Part 1 109 | \\ OPT FNMkGraVecHi(0,4*32,1) \ Big Alien 1 Part 2 110 | \\ OPT FNMkGraVecHi(0,4*32,1) \ Big Alien 2 Part 1 111 | \\ OPT FNMkGraVecHi(0,4*32,1) \ Big Alien 2 Part 2 112 | 113 | MkGraVecHi Expl, 4*16, 6 ; 0 to 11 Explosion 114 | 115 | MkGraVecHi MyShip, 4*16, 1 ; 12 to 17 My ship(s) 116 | MkGraVecHi MyShip +2*4*16, 4*16, 1 117 | MkGraVecHi MyShip +4*4*16, 4*16, 1 118 | 119 | MkGraVecHi Aliens, 4*16, 1 ; 18 to 19 Jelly mon 120 | MkGraVecHi Aliens +2*4*16, 4*16, 1 ; 20 to 21 121 | MkGraVecHi Aliens +4*4*16, 4*16, 1 ; 22 to 23 122 | MkGraVecHi Aliens +6*4*16, 4*16, 1 ; 24 to 25 123 | MkGraVecHi Aliens +8*4*16, 4*16, 1 ; 26 to 27 124 | MkGraVecHi Aliens +10*4*16, 4*16, 1 ; 28 to 29 125 | MkGraVecHi Aliens +12*4*16, 4*16, 1 ; 30 to 31 126 | MkGraVecHi Aliens +14*4*16, 4*16, 1 ; 32 to 33 127 | MkGraVecHi Aliens +16*4*16, 4*16, 1 ; 34 to 35 128 | MkGraVecHi Aliens +18*4*16, 4*16, 1 ; 36 to 37 129 | MkGraVecHi Aliens +20*4*16, 4*16, 2 ; 38 to 41 Feature object 130 | MkGraVecHi Aliens +24*4*16, 4*7, 1 ; 42 to 43 1000pts 131 | MkGraVecHi Aliens +24*4*16 +2*4*7, 3*8, 1 ; 44 to 45 Xtra Life 132 | MkGraVecHi Aliens +24*4*16 +2*4*7 +2*3*8, 2*8, 2 ; 46 to 49 Flash bomb 133 | 134 | MkGraVecHi BigAl, 4*32, 1 ; 50 to 51 Big Alien 1 Part 1 135 | MkGraVecHi BigAl +2*4*32, 4*32, 1 ; 52 to 53 Big Alien 1 Part 2 136 | MkGraVecHi BigAl +4*4*32, 4*32, 1 ; 54 to 55 Big Alien 2 Part 1 137 | MkGraVecHi BigAl +6*4*32, 4*32, 1 ; 56 to 57 Big Alien 2 Part 2 138 | 139 | 140 | 141 | \ This table converts 'Graphic Type' values into 'ObjGra' offsets for 142 | \ the base graphic of their frames 143 | 144 | .TGTypConv 145 | EQUB 0:EQUB 12:EQUB 14:EQUB 16 146 | EQUB 18:EQUB 20:EQUB 22:EQUB 24:EQUB 26 147 | EQUB 28:EQUB 30:EQUB 32:EQUB 34:EQUB 36 148 | EQUB 38:EQUB 42:EQUB 44:EQUB 46:EQUB 50 149 | EQUB 52:EQUB 54:EQUB 56 150 | 151 | \ ------------------------------------- 152 | 153 | .Expl 154 | \\ OPT FNLoadDat0("Section.ObExpl",&300) 155 | INCBIN "object\Section\ObExpl.o" 156 | 157 | .MyShip 158 | \\ OPT FNLoadDat0("Section.ObMyShip",&180) 159 | INCBIN "object\Section\ObMyShip.o" 160 | 161 | .Aliens 162 | \\ OPT FNLoadDat0("Section.ObAliens",&6A8) 163 | INCBIN "object\Section\ObAliens.o" 164 | 165 | .BigAl 166 | \\ OPT FNLoadDat0("Section.ObBigAl",&400) 167 | INCBIN "object\Section\ObBigAl.o" 168 | 169 | \\ ] 170 | 171 | \\ PRINT"Sp Graphic from &";~B%;" to &";~P%-1;" (";P%-B%;")" 172 | \\ PAGE=PG% 173 | \\ RETURN 174 | 175 | \\ DEFFNLoadDat0(file$,size%) 176 | \\ IFpass>=6 OSCLI"LOAD "+file$+" "+STR$~(O%) 177 | \\ O%=O%+size%:P%=P%+size% 178 | \\ =pass 179 | 180 | \\ DEFFNMkGraVecLo(Strt%,Size%,Num%) 181 | \\ IFStrt%<>0 N%=Strt% 182 | \\ FORL%=Num%-1TO0STEP-1 183 | \\ [OPT pass 184 | \\ EQUB (N%+L%*Size%) MOD 256 185 | \\ ]NEXT 186 | \\ M%=Num%*Size% 187 | \\ FORL%=Num%-1TO0STEP-1 188 | \\ [OPT pass 189 | \\ EQUB (N%+M%+L%*Size%) MOD 256 190 | \\ ]NEXT 191 | \\ N%=N%+2*M% 192 | \\ =pass 193 | 194 | \\ DEFFNMkGraVecHi(Strt%,Size%,Num%) 195 | \\ IFStrt%<>0 N%=Strt% 196 | \\ FORL%=Num%-1TO0STEP-1 197 | \\ [OPT pass 198 | \\ EQUB (N%+L%*Size%) DIV 256 199 | \\ ]NEXT 200 | \\ M%=Num%*Size% 201 | \\ FORL%=Num%-1TO0STEP-1 202 | \\ [OPT pass 203 | \\ EQUB (N%+M%+L%*Size%) DIV 256 204 | \\ ]NEXT 205 | \\ N%=N%+2*M% 206 | \\ =pass 207 | -------------------------------------------------------------------------------- /src/Sprites.asm: -------------------------------------------------------------------------------- 1 | \\ 2 | \\ Galaforce 2 ( BBC Micro ) from the original 6502 source code, adapted to assemble using beebasm 3 | \\ 4 | \\ (c) Kevin Edwards 1987-2021 5 | \\ 6 | \\ Twitter @KevEdwardsRetro 7 | \\ 8 | 9 | \\ REM SAVE"$.Galaforce2.Sprites" 10 | \\ B%=P% 11 | \\ [OPT pass 12 | 13 | \ Entry SpInf+0,SpInf+1 = low,high of source screen address 14 | \ SpInf+2,SpInf+3 = low,high of source graphic 15 | \ SpInf+4 = Width minus 1 of sprite(s) 16 | \ SpInf+5 = Height of sprite(s) being plotted 17 | \ SpInf+6 = Start graphic offset value 18 | 19 | \ SpInf2+0,SpInf2+1 = low,high of desti. screen address * 20 | \ SpInf2+2,SpInf2+3 = low,high of desti. graphic * 21 | 22 | 23 | \ * indicates that the variable is not required if only plotting a 24 | \ single sprite. 25 | 26 | \ Exit A,X,Y corrupted 27 | 28 | \ ---------------------------------------- 29 | 30 | \ 'NormSprite' erases and plots a non-clipped sprite 31 | 32 | .NormSprite 33 | LDA SpInf+2:STA NorGra1+1:STA NorGra2+1:STA NorGra3+1:STA NorGra4+1 34 | LDA SpInf+3:STA NorGra1+2:STA NorGra2+2:STA NorGra3+2:STA NorGra4+2 35 | 36 | LDA SpInf2+2:STA NorGraD1+1:STA NorGraD2+1:STA NorGraD3+1:STA NorGraD4+1 37 | LDA SpInf2+3:STA NorGraD1+2:STA NorGraD2+2:STA NorGraD3+2:STA NorGraD4+2 38 | 39 | LDY SpInf+4:LDA NorBraTab,Y:STA NorBra+1:LDX SpInf+6 40 | 41 | CPY #2:BEQ NorSp3 \ Y=Sprite width minus 1 42 | CPY #1:BEQ NorSp2 43 | TYA:BEQ NorSp1 44 | 45 | .NorSp4 46 | LDY #&18 47 | .NorGra4 48 | LDA &FFFF,X:EOR (SpInf),Y:STA (SpInf),Y 49 | .NorGraD4 50 | LDA &FFFF,X:EOR (SpInf2),Y:STA (SpInf2),Y:INX 51 | 52 | .NorSp3 53 | LDY #&10 54 | .NorGra3 55 | LDA &FFFF,X:EOR (SpInf),Y:STA (SpInf),Y 56 | .NorGraD3 57 | LDA &FFFF,X:EOR (SpInf2),Y:STA (SpInf2),Y:INX 58 | 59 | .NorSp2 60 | LDY #8 61 | .NorGra2 62 | LDA &FFFF,X:EOR (SpInf),Y:STA (SpInf),Y 63 | .NorGraD2 64 | LDA &FFFF,X:EOR (SpInf2),Y:STA (SpInf2),Y:INX 65 | 66 | .NorSp1 67 | LDY #0 68 | .NorGra1 69 | LDA &FFFF,X:EOR (SpInf),Y:STA (SpInf),Y 70 | .NorGraD1 71 | LDA &FFFF,X:EOR (SpInf2),Y:STA (SpInf2),Y:INX 72 | 73 | LDA SpInf:AND #7:BEQ Norm0 74 | DEC SpInf 75 | .Norm1 76 | LDA SpInf2:AND #7:BEQ Norm2 77 | DEC SpInf2 78 | .Norm3 79 | DEC SpInf+5 80 | .NorBra 81 | BNE NorSp1 \ Self modified 82 | RTS 83 | 84 | .Norm0 85 | LDA SpInf:SEC:SBC #&39:STA SpInf:LDA SpInf+1:SBC #1:STA SpInf+1:JMP Norm1 86 | 87 | .Norm2 88 | LDA SpInf2:SEC:SBC #&39:STA SpInf2:LDA SpInf2+1:SBC #1:STA SpInf2+1:JMP Norm3 89 | 90 | .NorBraTab 91 | EQUB NorSp1-NorBra-2 92 | EQUB NorSp2-NorBra-2 93 | EQUB NorSp3-NorBra-2 94 | EQUB NorSp4-NorBra-2 95 | 96 | \ ---------------------------------------- 97 | 98 | \ 'PutSprite' plots a single non-clipped sprite 99 | 100 | .PutSprite 101 | LDA SpInf+2:STA PutGra1+1:STA PutGra2+1:STA PutGra3+1:STA PutGra4+1 102 | LDA SpInf+3:STA PutGra1+2:STA PutGra2+2:STA PutGra3+2:STA PutGra4+2 103 | 104 | LDY SpInf+4:LDA PutBraTab,Y:STA PutBra+1:LDX SpInf+6 105 | 106 | CPY #2:BEQ PutSp3 \ Y=Sprite width minus 1 107 | CPY #1:BEQ PutSp2 108 | TYA:BEQ PutSp1 109 | 110 | .PutSp4 111 | LDY #&18 112 | .PutGra4 113 | LDA &FFFF,X:EOR (SpInf),Y:STA (SpInf),Y:INX 114 | 115 | .PutSp3 116 | LDY #&10 117 | .PutGra3 118 | LDA &FFFF,X:EOR (SpInf),Y:STA (SpInf),Y:INX 119 | 120 | .PutSp2 121 | LDY #8 122 | .PutGra2 123 | LDA &FFFF,X:EOR (SpInf),Y:STA (SpInf),Y:INX 124 | 125 | .PutSp1 126 | LDY #0 127 | .PutGra1 128 | LDA &FFFF,X:EOR (SpInf),Y:STA (SpInf),Y:INX 129 | 130 | LDA SpInf:AND #7:BEQ Put0 131 | DEC SpInf 132 | .Put1 133 | DEC SpInf+5 134 | .PutBra 135 | BNE PutSp1 \ Self modified 136 | RTS 137 | 138 | .Put0 139 | LDA SpInf:SEC:SBC #&39:STA SpInf:LDA SpInf+1:SBC #1:STA SpInf+1:JMP Put1 140 | 141 | .PutBraTab 142 | EQUB PutSp1-PutBra-2 143 | EQUB PutSp2-PutBra-2 144 | EQUB PutSp3-PutBra-2 145 | EQUB PutSp4-PutBra-2 146 | 147 | \\ ] 148 | 149 | \\ PRINT"Sprites from &";~B%;" to &";~P%-1;" (";P%-B%;")" 150 | \\ PAGE=PG% 151 | \\ RETURN 152 | -------------------------------------------------------------------------------- /src/Sprites2.asm: -------------------------------------------------------------------------------- 1 | \\ 2 | \\ Galaforce 2 ( BBC Micro ) from the original 6502 source code, adapted to assemble using beebasm 3 | \\ 4 | \\ (c) Kevin Edwards 1987-2021 5 | \\ 6 | \\ Twitter @KevEdwardsRetro 7 | \\ 8 | 9 | \\ REM SAVE"$.Galaforce2.Sprites2" 10 | \\ B%=P% 11 | \\ [OPT pass 12 | 13 | \ Entry SpInf+0,SpInf+1 = low,high of source screen address 14 | \ SpInf+2,SpInf+3 = low,high of source graphic 15 | \ SpInf+4 = Width minus 1 of sprite(s) 16 | \ SpInf+5 = Height of sprite(s) being plotted 17 | \ SpInf+6 = Start graphic offset value 18 | \ SpInf+7 = Clip 'skip' value 19 | 20 | \ SpInf2+0,SpInf2+1 = low,high of desti. screen address * 21 | \ SpInf2+2,SpInf2+3 = low,high of desti. graphic * 22 | 23 | 24 | \ * indicates that the variable is not required if only plotting a 25 | \ single sprite. 26 | 27 | \ Exit A,X,Y corrupted 28 | 29 | \ ---------------------------------------- 30 | 31 | \ 'ClipSprite' plots a clipped sprite 32 | 33 | .ClipSprite 34 | LDA SpInf+7:STA ClpCAdd+1 35 | LDA SpInf+2:STA ClpGra1+1:STA ClpGra2+1:STA ClpGra3+1:STA ClpGra4+1 36 | LDA SpInf+3:STA ClpGra1+2:STA ClpGra2+2:STA ClpGra3+2:STA ClpGra4+2 37 | 38 | LDY SpInf+4:LDA ClpBraTab,Y:STA ClpBra+1:LDX SpInf+6 39 | 40 | CPY #2:BEQ ClpSp3 41 | CPY #1:BEQ ClpSp2 42 | TYA:BEQ ClpSp1 43 | 44 | .ClpSp4 45 | LDY #&18 46 | .ClpGra4 47 | LDA &FFFF,X:EOR (SpInf),Y:STA (SpInf),Y:INX 48 | 49 | .ClpSp3 50 | LDY #&10 51 | .ClpGra3 52 | LDA &FFFF,X:EOR (SpInf),Y:STA (SpInf),Y:INX 53 | 54 | .ClpSp2 55 | LDY #8 56 | .ClpGra2 57 | LDA &FFFF,X:EOR (SpInf),Y:STA (SpInf),Y:INX 58 | 59 | .ClpSp1 60 | LDY #0 61 | .ClpGra1 62 | LDA &FFFF,X:EOR (SpInf),Y:STA (SpInf),Y:INX 63 | 64 | TXA 65 | CLC 66 | .ClpCAdd 67 | ADC #&FF \ Self modified 68 | TAX 69 | 70 | LDA SpInf:AND #7:BEQ Clip0 71 | DEC SpInf 72 | .Clip1 73 | DEC SpInf+5 74 | .ClpBra 75 | BNE ClpSp1 \ Self modified 76 | RTS 77 | 78 | .Clip0 79 | LDA SpInf:SEC:SBC #&39:STA SpInf:LDA SpInf+1:SBC #1:STA SpInf+1:JMP Clip1 80 | 81 | .ClpBraTab 82 | EQUB ClpSp1-ClpBra-2 83 | EQUB ClpSp2-ClpBra-2 84 | EQUB ClpSp3-ClpBra-2 85 | EQUB ClpSp4-ClpBra-2 86 | 87 | \\ ] 88 | 89 | \\ PRINT"Sprites 2 from ",~B%," to ",~P%-1," (",P%-B%,")" 90 | 91 | \\ PAGE=PG% 92 | \\ RETURN 93 | -------------------------------------------------------------------------------- /src/StartUp.asm: -------------------------------------------------------------------------------- 1 | \\ 2 | \\ Galaforce 2 ( BBC Micro ) from the original 6502 source code, adapted to assemble using beebasm 3 | \\ 4 | \\ (c) Kevin Edwards 1987-2021 5 | \\ 6 | \\ Twitter @KevEdwardsRetro 7 | \\ 8 | 9 | \\ REM SAVE"$.Galaforce2.StartUp" 10 | 11 | \\ [OPT pass 12 | .last 13 | \\ ] 14 | 15 | \\ IF last>&4400 VDU7:PRINT''"Obj code has just zapped music driver!":END 16 | \\ IF pass=4 Y%=P% ELSE Z%=P%:REM For phase error checking 17 | 18 | \\ Code has just zapped music driver! 19 | \\ ?????? GUARD &4400 20 | 21 | \\ P%=objend%:O%=&800+modu%+(objend%-objstrt%) 22 | \\ B%=P% 23 | \\ [OPT pass 24 | ORG objend% 25 | 26 | .gogo 27 | LDA #15:LDX #0:JSR osbyte 28 | LDA #&8C:LDX #&C:JSR osbyte \ *TAPE 12 29 | LDA #3:STA &258 30 | 31 | SEI 32 | LDX #&F:LDA #0 33 | .romoff 34 | STA &2A1,X:DEX:BPL romoff \ Unplug all sideways ROMs 35 | CLI 36 | 37 | LDA #4:LDX #1:JSR osbyte \ Disable cursor edit keys 38 | LDA #&E1:LDX #0:LDY #0:JSR osbyte \ Make soft keys create ascii values 39 | 40 | LDX #0:TXA 41 | .clrabs 42 | STA &400,X 43 | STA &500,X 44 | STA &600,X 45 | STA &700,X 46 | INX:BNE clrabs 47 | 48 | LDX #&A0-1 49 | .DowDig 50 | LDA LdDigGra,X:STA DigGra,X 51 | DEX:CPX #&FF:BNE DowDig 52 | 53 | LDX #0 54 | .DowChrs 55 | LDA Ldcharset,X:STA CharSet,X 56 | INX:BNE DowChrs 57 | LDX #&26 58 | .DowChr0 59 | LDA Ldcharset+&100,X:STA CharSet+&100,X 60 | DEX:BPL DowChr0 61 | 62 | LDX #&CD 63 | .DowChr1 64 | LDA Ldcharset2-1,X:STA SpCharSet-1,X 65 | DEX:BNE DowChr1 66 | 67 | LDA #4:STA temp1 68 | LDA #EnvDat MOD &100:STA temp2 69 | LDA #EnvDat DIV &100:STA temp2+1 70 | 71 | .EnvDown 72 | LDX temp2:LDY temp2+1:LDA #8:JSR osword 73 | LDA temp2:CLC:ADC #14:STA temp2 74 | BCC EnDo0 75 | INC temp2+1 76 | .EnDo0 77 | DEC temp1:BNE EnvDown 78 | 79 | \ Ensure 6502 is set up correctly 80 | 81 | CLD:CLI 82 | LDX #&FF:TXS 83 | JMP start 84 | 85 | \ Exploding alien, Firing, Xtra man, last man 86 | 87 | .EnvDat 88 | EQUB 1:EQUB 1:EQUB -1:EQUB 0:EQUB 0:EQUB 255:EQUB 0:EQUB 0 89 | EQUB 0:EQUB 0:EQUB 0:EQUB -10:EQUB 0:EQUB 0 90 | 91 | EQUB 2:EQUB 1:EQUB -2:EQUB 2:EQUB 0:EQUB 20:EQUB 10:EQUB 0 92 | EQUB &3C:EQUB -1:EQUB -0:EQUB -10:EQUB 100:EQUB 20 93 | 94 | EQUB 3:EQUB 1:EQUB 10:EQUB 5:EQUB -20:EQUB 9:EQUB 7:EQUB 7 95 | EQUB +126:EQUB -1:EQUB 0:EQUB -2:EQUB 106:EQUB 20 96 | 97 | EQUB 4:EQUB 3:EQUB +12:EQUB +16:EQUB -28:EQUB 1:EQUB 1:EQUB 1 98 | EQUB +126:EQUB -3:EQUB -3:EQUB -10:EQUB 106:EQUB 90 99 | 100 | 101 | .LdDigGra 102 | \\ OPT FNLoadFil("Section.Digits",&A0) 103 | INCBIN "object\Section\Digits.o" 104 | 105 | .Ldcharset 106 | \\ OPT FNLoadFil("Section.CHARDAT",&127) 107 | INCBIN "object\Section\CHARDAT.o" 108 | 109 | .Ldcharset2 110 | \\ OPT FNLoadFil("Section.SpFont",&CD) 111 | INCBIN "object\Section\SpFont.o" 112 | 113 | \\] 114 | 115 | \\ PRINT"Start Up from &";~B%;" to &";~P%-1;" (";P%-B%;")" 116 | \\ PAGE=PG%:RETURN 117 | 118 | \\ DEFFNLoadFil(fsp$,size%) 119 | \\ IF pass>=6 OSCLI"LOAD "+fsp$+" "+STR$~(O%) 120 | \\ O%=O%+size%:P%=P%+size% 121 | \\ =pass 122 | -------------------------------------------------------------------------------- /src/Subr1B.asm: -------------------------------------------------------------------------------- 1 | \\ 2 | \\ Galaforce 2 ( BBC Micro ) from the original 6502 source code, adapted to assemble using beebasm 3 | \\ 4 | \\ (c) Kevin Edwards 1987-2021 5 | \\ 6 | \\ Twitter @KevEdwardsRetro 7 | \\ 8 | 9 | \\ REM SAVE"$.Galaforce2.Subr1B" 10 | \\ B%=P% 11 | \\ [OPT pass 12 | 13 | \ Smart bomb 14 | 15 | .ExplNoD 16 | LDX #FxEx6 MOD &100:LDY #FxEx6 DIV &100:JSR SoundFx 17 | LDX #FxEx7 MOD &100:LDY #FxEx7 DIV &100:JMP SoundFx 18 | 19 | \ Alien 'injured' FX (needs to be shot more) 20 | 21 | .ExplNoC 22 | LDX #FxEx4 MOD &100:LDY #FxEx4 DIV &100:JSR SoundFx 23 | LDX #FxEx5 MOD &100:LDY #FxEx5 DIV &100:JMP SoundFx 24 | 25 | \ My ship exploding (Also when Escape pressed) 26 | 27 | .ExplNoB 28 | LDX #FxEx3 MOD &100:LDY #FxEx3 DIV &100:JSR SoundFx 29 | LDX #FxEx5 MOD &100:LDY #FxEx5 DIV &100:JMP SoundFx 30 | 31 | \ Alien exploding FX 32 | 33 | .ExplNoise 34 | LDX #FxEx1 MOD &100:LDY #FxEx1 DIV &100 35 | .ExNo0 36 | JSR SoundFx 37 | LDX #FxEx2 MOD &100:LDY #FxEx2 DIV &100:JMP SoundFx 38 | 39 | .FxEx1 40 | EQUW &10:EQUW -13:EQUW 7:EQUW 4 41 | .FxEx2 42 | EQUW &11:EQUW 1:EQUW 170:EQUW 4 43 | 44 | .FxEx3 45 | EQUW &10:EQUW -13:EQUW 7:EQUW 10 46 | 47 | .FxEx4 48 | EQUW &10:EQUW -9:EQUW 7:EQUW 10 49 | .FxEx5 50 | EQUW &11:EQUW 1:EQUW 200:EQUW 10 51 | 52 | .FxEx6 53 | EQUW &10:EQUW -13:EQUW 7:EQUW 14 54 | .FxEx7 55 | EQUW &11:EQUW 1:EQUW 240:EQUW 14 56 | 57 | .MeAlienCol 58 | LDA ObjSt+0:BPL MeAlCol5 \ I'm dead 59 | LSR A:BCC NoFePro \ I'm not exploding 60 | .MeAlCol5 61 | JMP MeAlColEx 62 | 63 | .NoFePro 64 | LDX MaxAlID 65 | .MeAlCol0 66 | LDA ObjSt,X:BPL MeAlColNo 67 | LSR A:BCS MeAlColNo 68 | LDA ObjDestr,X:BMI MeAlColNo 69 | LDA ObjX,X:SEC:SBC ObjX+0 70 | BCS MeAlCol1 71 | 72 | EOR #&FF:ADC #1 73 | CMP ObjXWid,X:BCS MeAlColNo 74 | BCC MeAlCol2 75 | 76 | .MeAlCol1 77 | CMP ObjXWid+0:BCS MeAlColNo 78 | 79 | .MeAlCol2 80 | LDA ObjY,X:SEC:SBC ObjY+0 81 | BCS MeAlCol3 82 | 83 | EOR #&FF:ADC #1 84 | CMP ObjHei+0:BCS MeAlColNo 85 | 86 | .MeAlColYes 87 | LDA ObjInfo,X:ASL A:BMI MeAlFeat \ If non-alien object 88 | LDA Feature:CMP #11:BEQ MeAlCol4 89 | LDA #DDVal:STA DieDelay \ Del in game cycles AFTER my ship has been era. 90 | JSR ExplNoB 91 | JMP DestrAll \ Make process.code kill all objs 92 | 93 | .MeAlCol4 94 | SEC:ROR ObjDestr,X 95 | TXA:PHA 96 | LDY ObjGTyp,X:LDA TGTypScore,Y:JSR AddScr:JSR ExplNoise 97 | PLA:TAX 98 | JMP MeAlColNo 99 | 100 | .MeAlFeat 101 | JSR FeatPro:JMP MeAlColNo 102 | 103 | .MeAlCol3 104 | CMP ObjHei,X:BCC MeAlColYes 105 | 106 | .MeAlColNo 107 | DEX:BNE MeAlCol0 108 | 109 | .MeAlColEx 110 | RTS 111 | 112 | .DoSmart 113 | BIT Demo:BMI MeAlColEx 114 | LDA ObjSt+0:BPL MeAlColEx 115 | LSR A:BCS MeAlColEx 116 | 117 | LDX #&FF:JSR check_key:BNE DoSm0 118 | 119 | BIT SmartFlg:BMI MeAlColEx 120 | LDA smarts:BEQ MeAlColEx 121 | 122 | LDX #TotObj-1 123 | .DoSm2 124 | LDA ObjSt,X:BPL DoSm3 125 | LSR A:BCS DoSm3 126 | LDA ObjHits,X:SBC #9:BCS DoSm4 127 | LDA #0 128 | .DoSm4 129 | STA ObjHits,X 130 | BNE DoSm3 131 | LDA #&80:STA ObjDestr,X 132 | .DoSm3 133 | DEX:BNE DoSm2 134 | 135 | JSR ShowLives:DEC smarts:JSR ShowLives 136 | JSR ExplNoD 137 | LDA #&FF:BMI DoSm1 138 | 139 | .DoSm0 140 | LDA #0 141 | .DoSm1 142 | STA SmartFlg 143 | RTS 144 | 145 | \ 'FeatPro' A=ObjInfo,X << 1 146 | 147 | .FeatPro 148 | ASL A:BMI MeAlFe2 \ If B5=1, object has been collected already 149 | LDA ObjInfo,X:ORA #&20:STA ObjInfo,X \ Set 'collected' bit 150 | LDY ObjFeat,X 151 | CPY #8:BEQ MeAlFe6 \ If smart bomb 152 | 153 | LDA Feature 154 | STY Feature 155 | CMP #11:BNE NoCh \ If not protective shield 156 | LDA #1:STA ShipInfo \ Change to 2nd ship! 157 | 158 | .NoCh 159 | CPY #11:BEQ MeAlFe5 \ Protective shield 160 | CPY #10:BEQ MeAlFe1 \ 1000pts 161 | CPY #9:BEQ MeAlFe3 \ Xtra life 162 | CPY #5:BEQ MeAlFe8 \ Explosive container 163 | BNE MeAlFe4 164 | 165 | .MeAlFe6 166 | TXA:PHA 167 | LDA smarts:CMP #3:BCS MeAlFe7 168 | JSR ShowLives:INC smarts:JSR ShowLives 169 | LDX #FxXtra MOD &100:LDY #FxXtra DIV &100:JSR SoundFx 170 | .MeAlFe7 171 | PLA:TAX 172 | 173 | .MeAlFe4 174 | SEC:ROR ObjDestr,X \ Kill obj 175 | .MeAlFe2 176 | RTS 177 | 178 | .MeAlFe1 179 | LDA #&80:STA ObjSt,X 180 | LDA #48:STA ObjPat,X \ 1000 gra init patt 181 | LDA #0:STA ObjPOff,X:STA ObjDirCnt,X 182 | TXA:PHA:LDA #100:JSR AddScr:PLA:TAX 183 | RTS 184 | 185 | .MeAlFe3 186 | LDA lives:CMP #5:BCS MeAlFe4 187 | LDA #&80:STA ObjSt,X 188 | TXA:PHA 189 | JSR ShowLives 190 | INC lives 191 | JSR ShowLives:JSR ShwLiv 192 | LDX #FxXtra MOD &100:LDY #FxXtra DIV &100:JSR SoundFx 193 | PLA:TAX 194 | LDA #49:STA ObjPat,X 195 | LDA #0:STA ObjPOff,X:STA ObjDirCnt,X 196 | RTS 197 | 198 | .MeAlFe5 199 | LDA #2:STA ShipInfo 200 | BNE MeAlFe4 \ Always 201 | 202 | .MeAlFe8 203 | TXA:PHA 204 | JSR ExplNoB 205 | JSR DestrAll 206 | LDA #DDVal:STA DieDelay 207 | PLA:TAX 208 | RTS 209 | 210 | .FxXtra 211 | EQUW &13:EQUW 3:EQUW 60:EQUW 25 212 | 213 | .DestrAll 214 | LDX #TotObj-1:LDA #&80 215 | .DesAl0 216 | STA ObjDestr,X 217 | DEX:BPL DesAl0 218 | 219 | LDA #&81:STA ObjSt+0 \ IMMEDIATELY halt Alien init/processing 220 | RTS 221 | 222 | \\ ] 223 | 224 | \\ PRINT"Subr. 1B from &";~B%;" to &";~P%-1;" (";P%-B%;")" 225 | \\ PAGE=PG%:RETURN 226 | -------------------------------------------------------------------------------- /src/Subr1C.asm: -------------------------------------------------------------------------------- 1 | \\ 2 | \\ Galaforce 2 ( BBC Micro ) from the original 6502 source code, adapted to assemble using beebasm 3 | \\ 4 | \\ (c) Kevin Edwards 1987-2021 5 | \\ 6 | \\ Twitter @KevEdwardsRetro 7 | \\ 8 | 9 | \\ REM SAVE"$.Galaforce2.Subr1C" 10 | \\ B%=P% 11 | \\ [OPT pass 12 | 13 | .ClrArrows 14 | LDY #0:JSR ClrArrowB 15 | LDY #1 16 | 17 | .ClrArrowB 18 | JSR CalArrInf 19 | LDA #0 20 | .ClAr0 21 | STA (temp1),Y:DEY:BPL ClAr0 22 | RTS 23 | 24 | .EorArrow 25 | LDY Player 26 | .EorArrowB 27 | JSR CalArrInf 28 | .EoAr0 29 | LDA ArrowGra,X:EOR (temp1),Y:STA (temp1),Y 30 | DEX:DEY:BPL EoAr0 31 | RTS 32 | 33 | .PutArrow 34 | LDY Player 35 | JSR CalArrInf 36 | .PuAr0 37 | LDA ArrowGra,X:STA (temp1),Y 38 | DEX:DEY:BPL PuAr0 39 | RTS 40 | 41 | .TArrwX 42 | EQUB 28:EQUB 48 43 | 44 | .CalArrInf 45 | STY temp2 46 | LDX TArrwX,Y:LDY #0:JSR xycalc 47 | STA temp1+1:STX temp1 48 | LDX #&F:LDA temp2:BEQ ClArIn0 49 | LDX #&1F 50 | .ClArIn0 51 | LDY #&F 52 | RTS 53 | 54 | .TNegKey 55 | EQUB &C8:EQUB &AE:EQUB &B9:EQUB &FE \ P S K CTRL 56 | 57 | .OpKeys 58 | LDX #2 \ Default key check, P S K (not 1/2 players) 59 | 60 | .OpKeysB 61 | LDA VSyncMast:AND #&F:BNE OpKeEx 62 | 63 | STX LoopB 64 | .OpKe0 65 | LDY LoopB:LDX TNegKey,Y:JSR check_key 66 | BNE OpKe1 67 | JSR ProcOp 68 | .OpKe1 69 | DEC LoopB:BPL OpKe0 70 | .OpKeEx 71 | RTS 72 | 73 | .ProcOp 74 | JSR PlotTog \ Plot last letter then toggle flag & char 75 | LDA LoopB:CMP #2:BCS NoFlh 76 | JSR flush \ FX 15,0 clear all buffers 77 | .NoFlh 78 | LDY LoopB:BNE PlotOpt \ If not pause option 79 | 80 | .ProcO0 81 | JSR chkp:BEQ ProcO0 \ Wait until released 82 | JSR PlotOpt \ Show P 83 | .ProcO1 84 | JSR chkp:BNE ProcO1 \ Wait until pressed 85 | .ProcO2 86 | JSR chkp:BEQ ProcO2 \ Wait until released 87 | 88 | .PlotTog 89 | JSR PlotOpt 90 | LDY LoopB 91 | LDA TCurChr,Y:EOR TEorChr,Y:STA TCurChr,Y 92 | LDA FlagBase,Y:EOR #&80:STA FlagBase,Y 93 | RTS 94 | 95 | .PlotOpt 96 | LDY LoopB 97 | .PlotOptB 98 | LDA TChrX,Y:STA TxOptChr+0 99 | LDA TChrY,Y:STA TxOptChr+1 100 | LDA TChrCol,Y:STA TxOptChr+2 101 | LDA TCurChr,Y:STA TxOptChr+3 102 | LDY #16:JMP pstring \ Erase/Display option letter 103 | 104 | .TChrX 105 | EQUB 76:EQUB 74:EQUB 70:EQUB 68 \ P S K CTRL 106 | 107 | .TChrY 108 | EQUB &F8+2:EQUB &F8+0:EQUB &F8+2:EQUB &F8+0 \ P S K CTRL 109 | 110 | .TChrCol 111 | EQUB &08:EQUB &88:EQUB &08:EQUB &88 \ P S K CTRL 112 | 113 | .TCurChr 114 | EQUB ' '-32:EQUB 'S'-32:EQUB 'K'-32:EQUB '1'-32 115 | 116 | .FlagBase 117 | .FPause EQUB &00 \ Default pause off 118 | .FSound EQUB &80 \ sound on 119 | .FKeyJoy EQUB &80 \ keyboard 120 | .FnumPlyr EQUB &00 \ 1 player 121 | 122 | .TEorChr 123 | EQUB ' '-32 EOR 'P'-32 124 | EQUB 'S'-32 EOR 'Q'-32 125 | EQUB 'K'-32 EOR 'J'-32 126 | EQUB '1'-32 EOR '2'-32 127 | 128 | \\ ] 129 | 130 | \\ PRINT"Subr. 1C from &";~B%;" to &";~P%-1;" (";P%-B%;")" 131 | \\ PAGE=PG%:RETURN 132 | -------------------------------------------------------------------------------- /src/Subr2.asm: -------------------------------------------------------------------------------- 1 | \\ 2 | \\ Galaforce 2 ( BBC Micro ) from the original 6502 source code, adapted to assemble using beebasm 3 | \\ 4 | \\ (c) Kevin Edwards 1987-2021 5 | \\ 6 | \\ Twitter @KevEdwardsRetro 7 | \\ 8 | 9 | \\ REM SAVE"$.Galaforce2.Subr2" 10 | \\ B%=P% 11 | \\ [OPT pass 12 | 13 | .ProcessAlBombs 14 | LDX #MaxAlBmb-1 15 | .PrAlB0 16 | LDA AlBmbSt,X:BMI PrAlB1 17 | .PrAlB2 18 | DEX:BPL PrAlB0 19 | RTS 20 | 21 | .PrAlB1 22 | LDA AlBmbTyp,X:BMI PrAlB4 \ If a fast bomb! 23 | LDA counter:LSR A:BCS PrAlB2 \ Slow every other game loop 24 | 25 | .PrAlB4 26 | JSR PlotBomb 27 | LDA AlBmbY,X:CLC:ADC #8:BEQ PrAlB3 28 | STA AlBmbY,X 29 | JSR PlotBomb 30 | JMP PrAlB2 31 | 32 | .PrAlB3 33 | DEC ActAlBombs 34 | LDA #0:STA AlBmbSt,X:BEQ PrAlB2 35 | 36 | .PlotBomb 37 | STX temp2 \ Save X 38 | LDY AlBmbY,X:LDA AlBmbX,X:SEC:SBC #XExcess:TAX 39 | JSR xycalc:STA temp1+1:STX temp1 40 | LDX temp2:LDA AlBmbX,X:LSR A 41 | BCS PlBmb0 42 | 43 | LDY #7 44 | .PlBmb1 45 | LDA (temp1),Y:EOR BombGra,Y:STA (temp1),Y 46 | DEY:BPL PlBmb1 47 | RTS 48 | 49 | .PlBmb0 50 | LDY #7 51 | .PlBmb00 52 | LDA (temp1),Y:EOR BombGra0,Y:STA (temp1),Y 53 | DEY:BPL PlBmb00 54 | LDY #9:LDA #8:EOR (temp1),Y:STA (temp1),Y 55 | RTS 56 | 57 | .InitAlBomb 58 | LDA ObjSt+0:BPL InABEx 59 | LSR A:BCS InABEx 60 | LDA ObjSt,X:BPL InABEx \ No bomb if alien ... 61 | LSR A:BCS InABEx 62 | LDA ObjInfo,X:ASL A:BMI InABEx \ Non-alien obj can't drop bombs 63 | AND #8:BNE InABEx \ If big alien, AND #8 not 4 (ASL A) 64 | 65 | LDA level:CMP #6:BCS InABm4 66 | JSR rand:BMI InABEx \ Additional 50/50 chance of bomb for levels<6 67 | 68 | .InABm4 69 | LDA ObjX,X:CMP #WindMinX:BCC InABEx \ Approx. boundary checks 70 | CLC:ADC ObjXWid,X:CMP #WindMaxX:BCS InABEx 71 | LDA ObjY,X:CMP #&90:BCS InABEx \ No bombs if too far down screen 72 | CMP #8:BCC InABEx \ No bombs 'behind' score area 73 | 74 | LDY #MaxAlBmb-1 75 | .InABm0 76 | LDA AlBmbSt,Y:BPL InABm1 77 | DEY:BPL InABm0 78 | 79 | .InABEx 80 | RTS 81 | 82 | .InABm1 83 | INC ActAlBombs 84 | LDA level:CMP #11:BCC InABm3 \ Slow bombs only, levels<11 85 | LDA ObjY,X:CMP #&48:BCS InABm3 \ Slow bombs only if too far down screen 86 | JSR rand:AND #&F:BNE InABm3 \ For slow bomb 15 out of 16 times 87 | LDA #&80:BNE InABm2 \ Always 88 | 89 | .InABm3 90 | LDA #0 \ Slow bomb value 91 | 92 | .InABm2 93 | STA AlBmbTyp,Y \ Bomb speed flag 94 | 95 | LDA #&80:STA AlBmbSt,Y 96 | LDA ObjXWid,X:LSR A:CLC:ADC ObjX,X:STA AlBmbX,Y 97 | LDA ObjY,X:CLC:ADC #7:AND #&F8:STA AlBmbY,Y 98 | TYA:TAX 99 | JMP PlotBomb 100 | 101 | .BombGra 102 | EQUB &44:EQUB &0E:EQUB &44:EQUB &44:EQUB &44:EQUB &44:EQUB &44:EQUB &44 103 | 104 | .BombGra0 105 | EQUB &11:EQUB &03:EQUB &11:EQUB &11:EQUB &11:EQUB &11:EQUB &11:EQUB &11 106 | 107 | .MeAlBmbCol 108 | LDA ObjSt+0:BPL InABEx \ RTS if I'm dead 109 | LSR A:BCS InABEx 110 | LDX #MaxAlBmb-1 111 | 112 | .MeABmC0 113 | LDA AlBmbSt,X:BPL MeABmC2 114 | 115 | LDA ObjX+0:SEC:SBC AlBmbX,X 116 | BCC MeABmC1 \ My X < BmbX 117 | BNE MeABmC2 \ No X collision 118 | BEQ MeABmC4 \ Now see if Y is in collision 119 | 120 | .MeABmC1 121 | EOR #&FF:ADC #1 122 | CMP ObjXWid+0:BCS MeABmC2 \ No X collision 123 | 124 | .MeABmC4 125 | LDA ObjY+0:SEC:SBC AlBmbY,X 126 | BCS MeABmC3 \ My Y >= BmbY 127 | 128 | EOR #&FF:ADC #1 129 | CMP #8:BCS MeABmC2 \ No Y collision 130 | BCC MeABmC5 \ Always, has collided 131 | 132 | .MeABmC3 133 | CMP ObjHei+0:BCS MeABmC2 \ No Y collision 134 | 135 | .MeABmC5 136 | JSR PlotBomb \ Remove bomb that hit me 137 | DEC ActAlBombs 138 | LDA #0:STA AlBmbSt,X 139 | LDA #DDVal:STA DieDelay 140 | JSR ExplNoB 141 | JMP DestrAll \ Kill ALL objs 142 | 143 | .MeABmC2 144 | DEX:BPL MeABmC0 145 | RTS 146 | 147 | .Extras 148 | LDX #&8E:JSR check_key:BEQ ToM1 \ f1 149 | LDX #&8B:JSR check_key:BNE ExtEx \ f5 150 | 151 | \ Mode 5 152 | 153 | LDX #&C4:LDY #7:BNE To6845r 154 | 155 | .ToM1 156 | LDX #&D8:LDY #3 157 | 158 | .To6845r 159 | SEI 160 | LDA #154:JSR osbyte \ Write video ULA control reg. & OS copy 161 | LDX #3 162 | .To6845r0 163 | STX &FE00:LDA T6845val,Y:STA &FE01 164 | DEY:DEX:BPL To6845r0 165 | CLI 166 | 167 | .ExtEx 168 | RTS 169 | 170 | .T6845val 171 | EQUB &7F:EQUB &28:EQUB &4F:EQUB &28 \ Mode 1 reg 0 to 3 172 | 173 | EQUB &3F:EQUB &28:EQUB &31:EQUB &24 \ Mode 5 reg 0 to 3 174 | 175 | .Options 176 | LDX #2:LDY #2:JSR vdu19 \ Colour 2 to green 177 | LDX #&AD:JSR check_key:BNE Opti3 \ If C not pressed (Cheat key!) 178 | LDA #49:STA HighestLev \ Allow access to levels upto 49! 179 | LDA #1:STA StrtLev 180 | 181 | .Opti3 182 | JSR TryStars 183 | LDX #&B6:JSR check_key:BEQ Opti3 \ Wait until Return released 184 | 185 | LDY #18:JSR pstring \ Display 'options' information 186 | JSR OpShoFB \ Show highest level 187 | JSR OpShoF \ Show curr start level 188 | .Opti0 189 | JSR fx19 190 | JSR TryStars 191 | LDX #3:JSR OpKeysB \ Check P S K and CTRL! 192 | LDX #&B6:JSR check_key:BEQ Opti1 \ Exit when Return pressed 193 | LDA VSyncMast:AND #7:BNE Opti0 \ Drop through every 8th frame 194 | 195 | LDX #&C6:JSR check_key:BNE Opti5 \ Cur Up 196 | JSR OpShoF \ Erase last level 197 | JSR TryStars 198 | LDX StrtLev:INX 199 | CPX HighestLev:BCC Opti2:BEQ Opti2 200 | .Opti4 201 | LDX #1 202 | .Opti2 203 | STX StrtLev 204 | JSR OpShoF \ Show new level 205 | JMP Opti0 206 | 207 | .Opti5 208 | LDX #&D6:JSR check_key:BNE Opti0 \ Cur Down 209 | JSR OpShoF 210 | JSR TryStars 211 | LDX StrtLev:DEX:BNE Opti2 212 | LDX HighestLev:BNE Opti2 213 | 214 | .Opti1 215 | JSR TryStars 216 | LDX #&B6:JSR check_key:BEQ Opti1 \ Return release 217 | 218 | LDY #18:JSR pstring \ Erase 'options' information 219 | JSR OpShoFB \ Erase highest level reached flags 220 | 221 | \ Drop through and erase start level flags 222 | 223 | .OpShoF 224 | LDA StrtLev 225 | LDX #28:LDY #19*8:JMP ShowFlagsB \ start level 226 | 227 | .OpShoFB 228 | LDA HighestLev 229 | LDX #28:LDY #13*8:JMP ShowFlagsB \ highest lev reached 230 | 231 | \\ ] 232 | 233 | \\ PRINT"Subr. 2 from &";~B%;" to &";~P%-1;" (";P%-B%;")" 234 | \\ PAGE=PG%:RETURN 235 | -------------------------------------------------------------------------------- /src/Vectors1.asm: -------------------------------------------------------------------------------- 1 | \\ 2 | \\ Galaforce 2 ( BBC Micro ) from the original 6502 source code, adapted to assemble using beebasm 3 | \\ 4 | \\ (c) Kevin Edwards 1987-2021 5 | \\ 6 | \\ Twitter @KevEdwardsRetro 7 | \\ 8 | 9 | \\ REM SAVE"$.Galaforce2.Vectors1" 10 | \\ B%=P% 11 | \\ [OPT pass 12 | 13 | .TSecLo 14 | EQUB Sect0 MOD &100 15 | EQUB Sect1 MOD &100 16 | EQUB Sect2 MOD &100 17 | EQUB Sect3 MOD &100 18 | EQUB Sect4 MOD &100 19 | EQUB Sect5 MOD &100 20 | EQUB Sect6 MOD &100 21 | EQUB Sect7 MOD &100 22 | EQUB Sect8 MOD &100 23 | EQUB Sect9 MOD &100 24 | EQUB Sect10 MOD &100 25 | EQUB Sect11 MOD &100 26 | EQUB Sect12 MOD &100 27 | EQUB Sect13 MOD &100 28 | EQUB Sect14 MOD &100 29 | EQUB Sect15 MOD &100 30 | 31 | .TSecHi 32 | EQUB Sect0 DIV &100 33 | EQUB Sect1 DIV &100 34 | EQUB Sect2 DIV &100 35 | EQUB Sect3 DIV &100 36 | EQUB Sect4 DIV &100 37 | EQUB Sect5 DIV &100 38 | EQUB Sect6 DIV &100 39 | EQUB Sect7 DIV &100 40 | EQUB Sect8 DIV &100 41 | EQUB Sect9 DIV &100 42 | EQUB Sect10 DIV &100 43 | EQUB Sect11 DIV &100 44 | EQUB Sect12 DIV &100 45 | EQUB Sect13 DIV &100 46 | EQUB Sect14 DIV &100 47 | EQUB Sect15 DIV &100 48 | 49 | .TPatInLo 50 | EQUB PtI0 MOD &100 51 | EQUB PtI1 MOD &100 52 | EQUB PtI2 MOD &100 53 | EQUB PtI3 MOD &100 54 | EQUB PtI4 MOD &100 55 | EQUB PtI5 MOD &100 56 | EQUB PtI6 MOD &100 57 | EQUB PtI7 MOD &100 58 | EQUB PtI8 MOD &100 59 | EQUB PtI9 MOD &100 60 | EQUB PtI10 MOD &100 61 | EQUB PtI11 MOD &100 62 | EQUB PtI12 MOD &100 63 | EQUB PtI13 MOD &100 64 | EQUB PtI14 MOD &100 65 | EQUB PtI15 MOD &100 66 | EQUB PtI16 MOD &100 67 | EQUB PtI17 MOD &100 68 | EQUB PtI18 MOD &100 69 | EQUB PtI19 MOD &100 70 | EQUB PtI20 MOD &100 71 | EQUB PtI21 MOD &100 72 | EQUB PtI22 MOD &100 73 | EQUB PtI23 MOD &100 74 | EQUB PtI24 MOD &100 75 | EQUB PtI25 MOD &100 76 | EQUB PtI26 MOD &100 77 | EQUB PtI27 MOD &100 78 | EQUB PtI28 MOD &100 79 | EQUB PtI29 MOD &100 80 | EQUB PtI30 MOD &100 81 | EQUB PtI31 MOD &100 82 | EQUB PtI32 MOD &100 83 | EQUB PtI33 MOD &100 84 | EQUB PtI34 MOD &100 85 | EQUB PtI35 MOD &100 86 | EQUB PtI36 MOD &100 87 | EQUB PtI37 MOD &100 88 | EQUB PtI38 MOD &100 89 | EQUB PtI39 MOD &100 90 | EQUB PtI40 MOD &100 91 | EQUB PtI41 MOD &100 92 | EQUB PtI42 MOD &100 93 | EQUB PtI43 MOD &100 94 | EQUB PtI44 MOD &100 95 | EQUB PtI45 MOD &100 96 | EQUB PtI46 MOD &100 97 | EQUB PtI47 MOD &100 98 | EQUB PtI48 MOD &100 99 | EQUB PtI49 MOD &100 100 | EQUB PtI50 MOD &100 101 | EQUB PtI51 MOD &100 102 | 103 | .TPatInHi 104 | EQUB PtI0 DIV &100 105 | EQUB PtI1 DIV &100 106 | EQUB PtI2 DIV &100 107 | EQUB PtI3 DIV &100 108 | EQUB PtI4 DIV &100 109 | EQUB PtI5 DIV &100 110 | EQUB PtI6 DIV &100 111 | EQUB PtI7 DIV &100 112 | EQUB PtI8 DIV &100 113 | EQUB PtI9 DIV &100 114 | EQUB PtI10 DIV &100 115 | EQUB PtI11 DIV &100 116 | EQUB PtI12 DIV &100 117 | EQUB PtI13 DIV &100 118 | EQUB PtI14 DIV &100 119 | EQUB PtI15 DIV &100 120 | EQUB PtI16 DIV &100 121 | EQUB PtI17 DIV &100 122 | EQUB PtI18 DIV &100 123 | EQUB PtI19 DIV &100 124 | EQUB PtI20 DIV &100 125 | EQUB PtI21 DIV &100 126 | EQUB PtI22 DIV &100 127 | EQUB PtI23 DIV &100 128 | EQUB PtI24 DIV &100 129 | EQUB PtI25 DIV &100 130 | EQUB PtI26 DIV &100 131 | EQUB PtI27 DIV &100 132 | EQUB PtI28 DIV &100 133 | EQUB PtI29 DIV &100 134 | EQUB PtI30 DIV &100 135 | EQUB PtI31 DIV &100 136 | EQUB PtI32 DIV &100 137 | EQUB PtI33 DIV &100 138 | EQUB PtI34 DIV &100 139 | EQUB PtI35 DIV &100 140 | EQUB PtI36 DIV &100 141 | EQUB PtI37 DIV &100 142 | EQUB PtI38 DIV &100 143 | EQUB PtI39 DIV &100 144 | EQUB PtI40 DIV &100 145 | EQUB PtI41 DIV &100 146 | EQUB PtI42 DIV &100 147 | EQUB PtI43 DIV &100 148 | EQUB PtI44 DIV &100 149 | EQUB PtI45 DIV &100 150 | EQUB PtI46 DIV &100 151 | EQUB PtI47 DIV &100 152 | EQUB PtI48 DIV &100 153 | EQUB PtI49 DIV &100 154 | EQUB PtI50 DIV &100 155 | EQUB PtI51 DIV &100 156 | 157 | 158 | \\ ] 159 | 160 | \\ PRINT"Vectors 1 from &";~B%;" to &";~P%-1;" (";P%-B%;")" 161 | \\ PAGE=PG% 162 | \\ RETURN 163 | -------------------------------------------------------------------------------- /src/Vectors2.asm: -------------------------------------------------------------------------------- 1 | \\ 2 | \\ Galaforce 2 ( BBC Micro ) from the original 6502 source code, adapted to assemble using beebasm 3 | \\ 4 | \\ (c) Kevin Edwards 1987-2021 5 | \\ 6 | \\ Twitter @KevEdwardsRetro 7 | \\ 8 | 9 | \\ REM SAVE"$.Galaforce2.Vectors2" 10 | \\ B%=P% 11 | \\ [OPT pass 12 | 13 | .TPatDatLo 14 | EQUB PtD0 MOD &100 15 | EQUB PtD1 MOD &100 16 | EQUB PtD2 MOD &100 17 | EQUB PtD3 MOD &100 18 | EQUB PtD4 MOD &100 19 | EQUB PtD5 MOD &100 20 | EQUB PtD6 MOD &100 21 | EQUB PtD7 MOD &100 22 | EQUB PtD8 MOD &100 23 | EQUB PtD9 MOD &100 24 | EQUB PtD10 MOD &100 25 | EQUB PtD11 MOD &100 26 | EQUB PtD12 MOD &100 27 | EQUB PtD13 MOD &100 28 | EQUB PtD14 MOD &100 29 | EQUB PtD15 MOD &100 30 | EQUB PtD16 MOD &100 31 | EQUB PtD17 MOD &100 32 | EQUB PtD18 MOD &100 33 | EQUB PtD19 MOD &100 34 | EQUB PtD20 MOD &100 35 | EQUB PtD21 MOD &100 36 | EQUB PtD22 MOD &100 37 | EQUB PtD23 MOD &100 38 | EQUB PtD24 MOD &100 39 | EQUB PtD25 MOD &100 40 | EQUB PtD26 MOD &100 41 | EQUB PtD27 MOD &100 42 | EQUB PtD28 MOD &100 43 | EQUB PtD29 MOD &100 44 | EQUB PtD30 MOD &100 45 | EQUB PtD31 MOD &100 46 | EQUB PtD32 MOD &100 47 | EQUB PtD33 MOD &100 48 | EQUB PtD34 MOD &100 49 | EQUB PtD35 MOD &100 50 | EQUB PtD36 MOD &100 51 | EQUB PtD37 MOD &100 52 | EQUB PtD38 MOD &100 53 | EQUB PtD39 MOD &100 54 | EQUB PtD40 MOD &100 55 | EQUB PtD41 MOD &100 56 | EQUB PtD42 MOD &100 57 | EQUB PtD43 MOD &100 58 | EQUB PtD44 MOD &100 59 | EQUB PtD45 MOD &100 60 | EQUB PtD46 MOD &100 61 | EQUB PtD47 MOD &100 62 | EQUB PtD48 MOD &100 63 | EQUB PtD49 MOD &100 64 | EQUB PtD50 MOD &100 65 | EQUB PtD51 MOD &100 66 | EQUB PtD52 MOD &100 67 | EQUB PtD53 MOD &100 68 | EQUB PtD54 MOD &100 69 | EQUB PtD55 MOD &100 70 | EQUB PtD56 MOD &100 71 | EQUB PtD57 MOD &100 72 | EQUB PtD58 MOD &100 73 | EQUB PtD59 MOD &100 74 | EQUB PtD60 MOD &100 75 | 76 | .TPatDatHi 77 | EQUB PtD0 DIV &100 78 | EQUB PtD1 DIV &100 79 | EQUB PtD2 DIV &100 80 | EQUB PtD3 DIV &100 81 | EQUB PtD4 DIV &100 82 | EQUB PtD5 DIV &100 83 | EQUB PtD6 DIV &100 84 | EQUB PtD7 DIV &100 85 | EQUB PtD8 DIV &100 86 | EQUB PtD9 DIV &100 87 | EQUB PtD10 DIV &100 88 | EQUB PtD11 DIV &100 89 | EQUB PtD12 DIV &100 90 | EQUB PtD13 DIV &100 91 | EQUB PtD14 DIV &100 92 | EQUB PtD15 DIV &100 93 | EQUB PtD16 DIV &100 94 | EQUB PtD17 DIV &100 95 | EQUB PtD18 DIV &100 96 | EQUB PtD19 DIV &100 97 | EQUB PtD20 DIV &100 98 | EQUB PtD21 DIV &100 99 | EQUB PtD22 DIV &100 100 | EQUB PtD23 DIV &100 101 | EQUB PtD24 DIV &100 102 | EQUB PtD25 DIV &100 103 | EQUB PtD26 DIV &100 104 | EQUB PtD27 DIV &100 105 | EQUB PtD28 DIV &100 106 | EQUB PtD29 DIV &100 107 | EQUB PtD30 DIV &100 108 | EQUB PtD31 DIV &100 109 | EQUB PtD32 DIV &100 110 | EQUB PtD33 DIV &100 111 | EQUB PtD34 DIV &100 112 | EQUB PtD35 DIV &100 113 | EQUB PtD36 DIV &100 114 | EQUB PtD37 DIV &100 115 | EQUB PtD38 DIV &100 116 | EQUB PtD39 DIV &100 117 | EQUB PtD40 DIV &100 118 | EQUB PtD41 DIV &100 119 | EQUB PtD42 DIV &100 120 | EQUB PtD43 DIV &100 121 | EQUB PtD44 DIV &100 122 | EQUB PtD45 DIV &100 123 | EQUB PtD46 DIV &100 124 | EQUB PtD47 DIV &100 125 | EQUB PtD48 DIV &100 126 | EQUB PtD49 DIV &100 127 | EQUB PtD50 DIV &100 128 | EQUB PtD51 DIV &100 129 | EQUB PtD52 DIV &100 130 | EQUB PtD53 DIV &100 131 | EQUB PtD54 DIV &100 132 | EQUB PtD55 DIV &100 133 | EQUB PtD56 DIV &100 134 | EQUB PtD57 DIV &100 135 | EQUB PtD58 DIV &100 136 | EQUB PtD59 DIV &100 137 | EQUB PtD60 DIV &100 138 | 139 | \\ ] 140 | 141 | \\ PRINT"Vectors 2 from &";~B%;" to &";~P%-1;" (";P%-B%;")" 142 | \\ PAGE=PG% 143 | \\ RETURN 144 | -------------------------------------------------------------------------------- /src/ZpWork.asm: -------------------------------------------------------------------------------- 1 | \\ 2 | \\ Galaforce 2 ( BBC Micro ) from the original 6502 source code, adapted to assemble using beebasm 3 | \\ 4 | \\ (c) Kevin Edwards 1987-2021 5 | \\ 6 | \\ Twitter @KevEdwardsRetro 7 | \\ 8 | 9 | \\ REM SAVE"$.Galaforce2.ZpWork" 10 | \\ P%=0:O%=&800 11 | \\ [OPT 6 12 | 13 | ORG &0 14 | 15 | .temp1 EQUW 0 16 | .temp2 EQUW 0 17 | 18 | .SpInf \ Warning! Shared variable area for source sprite info 19 | .temp3 EQUW 0 20 | .temp4 EQUW 0 21 | .temp5 EQUD 0 \ Double! 22 | 23 | .SpInf2 EQUD 0:EQUD 0 \ Variable area for destination sprite info 24 | 25 | .seed EQUW 0:EQUB 0 26 | 27 | .CurrId EQUB 0 28 | .LoopA EQUB 0 29 | .LoopB EQUB 0 30 | .LoopC EQUB 0 31 | 32 | .StarInfo SKIP NumStars*3 33 | 34 | .ObjSt SKIP TotObj 35 | 36 | \\ ] 37 | 38 | \\ PRINT"Zero page from 0 to &" ~P%-1 39 | PRINT"Zero page from 0 to ", ~P%-1 40 | 41 | \\ IFP%>&9F VDU7:PRINT'"Warning, ZP w/space! &";~P%' 42 | \\ PAGE=PG% 43 | \\ RETURN 44 | 45 | \\ DEFFNres0(gap%) 46 | \\ P%=P%+gap%:O%=O%+gap% 47 | \\ =6 48 | --------------------------------------------------------------------------------