Here’s source code to my old experiment in Amiga game coding. The source I found, doesn’t seem to be exactly the same used in the code of the video showing below. There are more than one pieces of music in the unfinished game, but in the source there isn’t “incbin” for any Amiga music module.
The project started in 1992, when I was at high school (lukio), when I was experimenting in multiplexing Amiga’s hardware sprites. Much later I continued the project in order to see, if I could still do some Amiga coding in assembly.
The musics are not made by me, I used some nice music modules, I found from the Aminet.
There should be color stripes in the energy bar made with Copper, but for some reason the colors were lost in the emulation.
The source is a bit messy and labels and comments are partly in English and partly in Finnish.
As a reminder old Amigas have Motorola’s processors and the assembly is Motorola’s 68000 processor’s assembly code.
As you can see from the source, the ProTracker replay routine is not coded by me.
Some words about the vertical scrolling… This “game” 🙂 works on an A500 with only 512kb of CHIP memory, if my memory serves my right. The reason why this little project uses quite a lot of CHIP memory is because of the way the vertical scrolling is made: The game uses in fact three (3) screens in CHIP memory in total, two for double buffering and in addition there is one screen that only scrolls vertically. The latter is “ClearScreen”, it is used for clearing the drawing buffer from earlier bob (blitter object) movement (of course for sake of limited speed, the whole ClearScreen is not copied, but only the needed 16 x 16 pixel areas). As a reminder, the movement of sprites doesn’t need the clearing of earlier position, the sprites are drawn in a special way to the screen. Bobs (blitter objects) represent “normal” graphical objects, that require clearing of earlier position.
The smartest idea for fast (that is: takes only little raster time) vertical scrolling on an Amiga 500 I’ve ever seen, was on one book written in Finnish. In that idea if the area to be scrolled vertically is for example 320 x 256 pixels, again a lot of CHIP memory is used: For only scrolling the screen vertically 3 * (320 x 256) pixels area is used for scrolling and this area is used in a very smart manner in order to achieve vertical scrolling that takes on only few raster lines. Probably this idea also requires little extra CHIP memory for blitting new graphics to area… Over 20 years ago I implemented and tested this idea and this really is a fast way to implement vertical scrolling on an Amiga!
The game isn’t any state of the art assembly code, just an experiment… See below:
incdir "ADCD_2.1:NDK/NDK_3.5/Include/include_i" include "exec/types.i" include "libraries/dosextens.i" include "graphics/gfxbase.i" include "exec/libraries.i" include "exec/execbase.i" include "Hardware/intbits.i" ;------------------------------------------------------------------------------ ; Makroja ;------------------------------------------------------------------------------ WaitForBlitter MACRO W\@ btst #14,$2(a5) bne.s W\@ ENDM ;------------------------------------------------------------------------------ ; Vakioita ;------------------------------------------------------------------------------ Forbid equ -$0084 Permit equ -$008a Disable equ -$0078 Enable equ -$007e Write equ -$0030 Output equ -$003c OpenLibrary equ -$0228 CloseLibrary equ -$019e Execbase equ 4 Screen_X_Size equ 320 Screen_Y_Size equ 256 Height_OBullet equ 8 ; Oman laakin korkeus Frames equ 3 OwnSpeed equ 3 ; Oman aluksen nopeus BSpeed equ 4 ; Oman laakin nopeus AmountBullets equ (Screen_Y_Size/(Height_OBullet*BSpeed))-1 AmountEBullets equ 10-1 ; Vihollisten laakien määrä Dest equ (256+16+16)*4*32 ; Palikka sinne alapuolelle max_bobs equ 32 max_asteroids_on_screen equ 20 NOCHIPREV equ 0 ;------------------------------------------------------------------------------ ; Startup-koodi ;------------------------------------------------------------------------------ SECTION CODE,code startup: movem.l d0/a0,-(sp) ; Tallennetaan d0 ja a0 move.l 4,a6 ; SysBase move.l #0,a1 jsr -$0126(a6) ; Haetaan oma prosessi, FindTask() move.l d0,a4 move.l d0,process tst.l pr_CLI(a4) ; CLI? ; tst.l $ac(a4) bne.s check_aga ; jos CLI niin check_aga wb: lea pr_MsgPort(a4),a0 ; Haetaan prosessin viestiportti ; lea $5c(a4),a0 jsr -$0180(a6) ; Odotetaan viestiä, WaitPort() lea pr_MsgPort(a4),a0 jsr -$0174(a6) ; Haetaan viesti ; GetMsg() move.l d0,wbenchmsg ; tallennetaan ohjelman tarvetta ; varten check_aga: ; Tämä toimii OCS ja ECS koneissa, moveq #0,d0 ; joten AGA-checkiä ei tarvita... lea gfxname,a1 jsr -$0228(a6) ; OpenLibrary() move.l d0,gfxbase beq.w reply_to_wb ; jostain syystä ei saatu avattua move.l d0,a4 moveq #0,d0 lea intuiname,a1 jsr -$0228(a6) move.l d0,intuibase beq Sulje ; move.l 4,a6 ; jsr -$0078(a6) ; keskeytykset pois, Disable() cmp.w #39,LIB_VERSION(a4) ; onko ChipRevBits0 määritelty ; cmp.w #39,$14(a4) bne.s no_chiprev move.b gb_ChipRevBits0(a4),chiprev ; move.b $ec(a4),chiprev bra.s check_proc no_chiprev: move.b #NOCHIPREV,chiprev ; Ei pystyta hakemaan ChipRevBits:ia check_proc: move.w AttnFlags(a6),processor ; CPU ja FPU ; move.w $128(a6),processor clear_view: move.l gfxbase,a6 move.l gb_ActiView(a6),oldview ; nykyinen View talteen ; move.l $22(a6),oldview move.l #0,a1 ; NULL View tilalle jsr -$00de(a6) ; LoadView() jsr -$010e(a6) jsr -$010e(a6) ; WaitTOF() move.l 4,a6 ; SysBase valmiiksi movem.l (sp)+,d0/a0 ; d0/a0 pois pinosta bsr.s _start ; hypätään pääohjelmaan move.l d0,-(sp) ; palautuskoodi turvaan old_view: move.l gfxbase,a0 move.l $26(a0),$dff080 ; Copperlistan palautus move.l gfxbase,a6 move.l oldview,a1 ; vanha View jsr -$00de(a6) ; LoadView() ; move.l 4,a6 ; jsr -$007e(a6) ; keskeytykset päälle, Enable() move.l intuibase,a6 jsr -$0186(a6) ; RethinkDisplay() move.l 4,a6 move.l intuibase,a1 jsr -$019e(a6) ; CloseLibrary() Sulje move.l 4,a6 move.l gfxbase,a1 ; suljetaan graphics.library jsr -$019e(a6) ; CloseLibrary() reply_to_wb: tst.l wbenchmsg ; onko workbench beq.s exit ; jos ei niin exit jsr -$0084(a6) ; huomaa ettei tarvitse Permit() ; Forbid() move.l wbenchmsg,a1 jsr -$017a(a6) ; ReplyMsg() exit: move.l (sp)+,d0 rts ; poistutaan ohjelmasta _start ;------------------------------------------------------------------------------ ; Itse ohjelma! ;------------------------------------------------------------------------------ movem.l d2-d7/a2-a6,-(sp) ; move.l 4,a6 ; lea dosname,a1 ; moveq #0,d0 ; jsr OpenLibrary(a6) ; move.l d0,dosbase ; move.l dosbase,a6 ; jsr Output(a6) ; For printing... ; move.l d0,outfile ; move.l 4,a6 jsr Forbid(a6) move.l 4,a6 move.l #((256+16)*2+16)*32*4,d0 move.l #65538,d1 jsr -$00c6(a6) move.l d0,ClearScreen beq Pois move.l #((256+16)*2+16)*32*4,d0 move.l #65538,d1 jsr -$00c6(a6) move.l d0,BitMap1 beq Vap1 move.l #((256+16)*2+16)*32*4,d0 move.l #65538,d1 jsr -$00c6(a6) move.l d0,BitMap2 beq Vap2 move.l #32768,d0 ; 256 x 256 pixeliä move.l #65538,d1 jsr -$00c6(a6) move.l d0,bitmap beq Vap3 lea Gamefield,a6 ; Lisätään blockien osoite valmiiksi lea Coolfield,a4 move.l #5120-1,d7 GBSil: move.l #Blocks,a1 moveq #0,d0 move.w (a6)+,d0 lsl.l #1,d0 ; add.l d0,d0 add.l d0,a1 move.l a1,(a4)+ dbf d7,GBSil lea Gamefield2,a6 lea Coolfield2,a4 move.l #5120-1,d7 GBSil2 move.l #Blocks,a1 moveq #0,d0 move.w (a6)+,d0 lsl.l #1,d0 add.l d0,a1 move.l a1,(a4)+ dbf d7,GBSil2 lea Gamefield3,a6 lea Coolfield3,a4 move.l #5120-1,d7 GBSil3 move.l #Blocks,a1 moveq #0,d0 move.w (a6)+,d0 lsl.l #1,d0 add.l d0,a1 move.l a1,(a4)+ dbf d7,GBSil3 ; move.l 4,a6 ; move.l #0,d0 ; lea gfxname,a1 ; jsr -$228(a6) ; move.l d0,gfxbase ; cmp.l #0,d0 ; beq CleanUp ; bsr mt_init ; st mt_Enable ; move.l #INTB_VERTB,d0 ; move.l #Vert_str,a1 ; VBI -keskeytysstrukture ; move.l 4,a6 ; jsr -$00a8(a6) ; AddIntServer move.l #Laakit,LaakiPT move.l #$dff000,a5 move.l #CopperLista,$080(a5) tst.w $088(a5) move.w #$87f0,$096(a5) ; move.w #$0400,$096(a5) ; move.w #$0020,$096(a5) move.l #$ffffffff,$044(a5) ; move.l #$0,$044(a5) move.w #$cce,$01a2(a5) move.w #$789,$01a4(a5) move.w #$446,$01a6(a5) ; move.w #$0fff,$01aa(a5) ; move.w #0,$106(a5) ; Spritet lo-res -tilaan (ECS default) and.w #%1111111100111111,$106(a5) bsr AlkuRoskat JumpToAlkuScreen bra AlkuScreen JumpToAlustus bsr Alustus ; Nollataan "muuttujat" bsr FillTheScreen bsr SwapScreens MainProgram cmp.b #1,gameOver beq GameOver cmp.b #4,level beq LoppuScreen bsr SwapScreens bsr Show bsr Scroll bsr ClearScore bsr HandlePlayer bsr Joystick bsr PalautaExpTausta bsr ReadAttackWaves bsr CheckUnits bsr CheckCoordBobs ; Tsekataan koordinaattivalmiit enemyt bsr CheckAsteroids bsr CheckMonster bsr HandleExplosions bsr BlitScore ; move.w #$0f0,$180(a5) bsr BlitNumbers ; move.w #$000f,$180(a5) bsr HandleEnergySprite move.w #$000,$180(a5) bsr WaitForBeam ; move.w #$333,$180(a5) ; move.w #$779,$1a4(a5) bsr RMB btst #6,$bfe001 bne.s MainProgram CleanUp ;move.l 4,a6 ;move.l #0,d0 ; lea gfxnimi,a1 ; jsr -$228(a6) ; move.l d0,gfxbase ; move.l #0,d0 ; lea intuinimi,a1 ; jsr -$228(a6) ; move.l d0,intuibase ; move.l gfxbase,a0 ; move.l $26(a0),$dff080 ; move.l intuibase,a6 ; jsr -$186(a6) ; move.l 4,a6 ; move.l intuibase,a1 ; jsr -$19e(a6) ; move.l gfxbase,a1 ; jsr -$19e(a6) ; move.l 4,a6 ; move.l dosbase,d0 ; beq.s Vap3 ; move.l d0,a1 ; jsr CloseLibrary(a6) ; bsr mt_end ; move.l #INTB_VERTB,d0 ; lea Vert_str,a1 ; move.l 4,a6 ; jsr -$00ae(a6) ; RemIntServer move.l 4,a6 move.l #32768,d0 move.l bitmap,a1 jsr -$00d2(a6) Vap3: move.l 4,a6 move.l #((256+16)*2+16)*32*4,d0 move.l BitMap2,a1 jsr -$00d2(a6) Vap2: move.l 4,a6 move.l #((256+16)*2+16)*32*4,d0 move.l BitMap1,a1 jsr -$00d2(a6) Vap1: move.l 4,a6 move.l #((256+16)*2+16)*32*4,d0 move.l ClearScreen,a1 jsr -$00d2(a6) Pois move.l 4,a6 jsr Permit(a6) movem.l (sp)+,d2-d7/a2-a6 moveq #0,d0 rts CheckUnits bsr HandleUnit rts CheckAsteroids cmp.b #1,AsteroidsRunning bne.s ExitCA cmp.b #1,LastAsteroidFrames beq.s LastFrames cmp.w #0,Nr_of_asteroids ble.s IsThereOnScreen bra.s Mene IsThereOnScreen cmp.b #0,Asteroids_on_screen bne.s Mene move.b #1,LastAsteroidFrames rts Mene bsr PalautaAsteroidienTausta bsr PutAsteroid bsr MoveAsteroids bsr AsteroidCollisions ExitCA rts LastFrames bsr PalautaAsteroidienTausta subq.b #1,LastAsteroidFrames Okay move.b #0,AsteroidsRunning rts ;----------------------------------------------------------------------------- ; Käsitellään unit. Pointteri tietueeseen annetaan A1:ssä. ;----------------------------------------------------------------------------- HandleUnit bsr PalautaUnitinTausta bsr PalautaUnitBulletinTausta move.l UnitsVanhaSij,a6 lea Units,a1 moveq #5-1,d7 WaitForBlitter move.w #0000,$062(a5) ; BLTBMOD move.w #0028,$060(a5) ; BLTCMOD move.w #0000,$064(a5) ; BLTAMOD move.w #0028,$066(a5) ; BLTDMOD HUSil cmp.w #0,(a1) ; Onko liikkeellä? beq.s NextUnit move.l 2(a1),d0 ; X move.l 6(a1),d1 ; Y move.l 28(a1),a2 ; Bob-data move.l 32(a1),a3 ; Mask-data bsr BlitBob cmp.w #1,46(a1) beq.s liikutetaan cmp.w #0,6(a1) bge.s NextUnit addq.l #1,6(a1) bra.s NextUnit liikutetaan addq.l #1,6(a1) cmp.l #256,6(a1) bge.s RemoveUnit NextUnit add.l #48,a1 add.l #10,a6 dbf d7,HUSil bra.s HandleUnitBullet RemoveUnit move.w #0,(a1) add.l #48,a1 add.l #10,a6 dbf d7,HUSil ; Käsitellään unitin laaki HandleUnitBullet moveq #5-1,d7 move.l UnitsVBSij,a6 lea Units,a1 HUBSil cmp.w #1,10(a1) beq.s BlitAndMoveUnitBullet ; Jos ei ole liikkeellä, niin katsotaan, onko unit kehissä; jos on, niin ; laitetaan laaki liikkeelle ehkä. cmp.l #ExplodedUnit,28(a1) beq.s Eilaakia cmp.w #1,(a1) ; Onko unit kehissä? beq.s Ampuukho Eilaakia add.l #48,a1 add.l #10,a6 dbf d7,HUBSil bra.s HandleUnitCollisions Ampuukho move.w $6(a5),d0 ; Jos ei ollut, niin arvotaan, add.w Random,d0 ; laitetaanko liikkeelle and.l #7,d0 cmp.w #7,d0 beq.s Ampuu add.l #48,a1 add.l #10,a6 dbf d7,HUBSil bra.s HandleUnitCollisions Ampuu move.l 2(a1),d0 ; Asetetaan laakille alkukoordinaatit move.l 6(a1),d1 addq.l #7,d0 add.l #16,d1 lsl.l #7,d0 lsl.l #7,d1 move.l d0,12(a1) ; Talletetaan move.l d1,16(a1) lsr.l #7,d0 lsr.l #7,d1 moveq #0,d2 ; Tähdätyt laukauset uniteille moveq #0,d3 move.w x,d2 move.w y,d3 sub.l d0,d2 sub.l d1,d3 lsl.l #7,d2 ; "desimaaliluvuksi" lsl.l #7,d3 lsr.l #6,d2 lsr.l #6,d3 move.l d2,20(a1) ; AddX move.l d3,24(a1) ; AddY move.w #1,10(a1) ; Laaki liikkeellä -merkki add.l #48,a1 add.l #10,a6 dbf d7,HUBSil rts bra.s HandleUnitCollisions BlitAndMoveUnitBullet move.l 12(a1),d0 ; x move.l 16(a1),d1 ; y lsr.l #7,d0 ; Kokonaisluvuksi lsr.l #7,d1 bsr BlitBullet move.l 20(a1),d2 ; AddX move.l 24(a1),d3 ; AddY add.l d2,12(a1) ; Liikutetaan laakia add.l d3,16(a1) move.l 12(a1),d0 move.l 16(a1),d1 lsr.l #7,d0 lsr.l #7,d1 cmp.w #255-4,d0 bgt.s RemoveUnitBullet cmp.w #4,d0 ble.s RemoveUnitBullet cmp.w #256,d1 bge.s RemoveUnitBullet cmp.w #4,d1 ble.s RemoveUnitBullet add.l #48,a1 add.l #10,a6 dbf d7,HUBSil rts bra.s HandleUnitCollisions RemoveUnitBullet move.w #0,10(a1) add.l #48,a1 add.l #10,a6 dbf d7,HUBSil rts ; Käsitellään unittien törmäykset HandleUnitCollisions lea Units,a1 moveq #5-1,d6 HUCSil cmp.w #1,(a1) ; Unit kehissä? beq.s Proceed cmp.w #1,10(a1) ; Laaki kehissä? beq.s Proceed add.l #48,a1 dbf d6,HUCSil rts Proceed move.l 2(a1),d0 move.l 6(a1),d1 move.l 12(a1),d4 move.l 16(a1),d5 asr.l #7,d4 asr.l #7,d5 bsr UnitCollisions add.l #48,a1 dbf d6,HUCSil rts ;----------------------------------------------------------------------------- ; Unit törmäykset ; Idea: Verrataan pelaajan koordinaatteja unitiin ja sen bullettiin ;----------------------------------------------------------------------------- UnitCollisions ; Vihollisien x,y on D0,D1:ssä ; Player to enemies ; cmp.l #ExplodedUnit,28(a1) ; Jos unit on ammuttu, niin ; beq.s NoCollisionToEnemy ; törmäystä ei tsekata ; moveq #0,d2 ; moveq #0,d3 ; move.w x,d2 ; move.w y,d3 ; x-test ; sub.w d0,d2 ; cmp.w #-15,d2 ; blt.s NoCollisionToEnemy ; cmp.w #15,d2 ; bge.s NoCollisionToEnemy ; y-test ; sub.w d1,d3 ; cmp.w #-15,d3 ; blt.s NoCollisionToEnemy ; cmp.w #15,d3 ; bge.s NoCollisionToEnemy ; move.w #$0f00,$01a4(a5) NoCollisionToEnemy ; Player bullets to enemies cmp.l #ExplodedUnit,28(a1) beq.s PlayerToUnitBullet lea Laakit,a0 move.w #AmountBullets,d7 OnkoLaakiLiikkeella cmp.w #0,(a0) bne.s LaakiLiikkeellä addq.l #6,a0 dbf d7,OnkoLaakiLiikkeella bra.s PlayerToUnitBullet LaakiLiikkeellä move.l d0,d2 move.l d1,d3 sub.w 2(a0),d2 cmp.w #-16,d2 blt.s NextBullet cmp.w #4,d2 bge.s NextBullet sub.w 4(a0),d3 cmp.w #16,d3 bge.s NextBullet cmp.w #-16,d3 blt.s NextBullet move.l #ExplodedUnit,28(a1) move.l #ExplodedUnitM,32(a1) move.w #0,(a0) ; Laaki pois kehistä ; subq.b #1,OwnBulletsOnScreen addq.w #5,Pisteet ; Jos osuttu niin listään pelaajan ; pisteitä move.l Exp_PT,a4 ; Piirretään räjähdys move.w #1,(a4) move.w d0,2(a4) move.w d1,4(a4) move.w #4,6(a4) add.l #12,a4 cmp.w #-1,(a4) bne.s Jatkuu move.l #Explosions,Exp_PT bra.s NextBullet Jatkuu move.l a4,Exp_PT NextBullet addq.l #6,a0 dbf d7,OnkoLaakiLiikkeella ; Vihollisen laakin x,y on d4,d5 PlayerToUnitBullet moveq #0,d2 moveq #0,d3 move.w x,d2 move.w y,d3 sub.w d2,d4 cmp.w #-3,d4 blt.s ExitUnitCollisions cmp.w #14,d4 bge.s ExitUnitCollisions sub.w d3,d5 cmp.w #-3,d5 ble.s ExitUnitCollisions cmp.w #14,d5 bge.s ExitUnitCollisions move.w #$0ff0,$01a4(a5) ; move.b #1,gameOver subq.b #1,energia ExitUnitCollisions rts ;----------------------------------------------------------------------------- ; Palautetaan unitin alta tausta ;----------------------------------------------------------------------------- PalautaUnitinTausta move.l UnitsVanhaSij,a6 moveq #5-1,d7 PalUniTau cmp.l #0,(a6) beq.s NextYksi WaitForBlitter move.w #$9f0,$040(a5) ; BLTCON0 move.w #$0000,$042(a5) ; BLTCON1 move.w #0028,$064(a5) ; BLTAMOD move.w #0028,$066(a5) ; BLTDMOD move.l (a6),$050(a5) ; BLTAPTR move.l 4(a6),$054(a5) ; BLTDPTR kohde move.w 8(a6),$058(a5) ; BLTSIZE move.l #0,(a6) NextYksi add.l #10,a6 dbf d7,PalUniTau rts PalautaUnitBulletinTausta: move.l UnitsVBSij,a6 moveq #5-1,d7 PalUniBul cmp.l #0,(a6) beq.s NextUnitBullet WaitForBlitter move.w #$9f0,$040(a5) ; BLTCON0 move.w #$0000,$042(a5) ; BLTCON1 move.w #0028,$064(a5) ; BLTAMOD move.w #0028,$066(a5) ; BLTDMOD move.l (a6),$050(a5) ; BLTAPTR move.l 4(a6),$054(a5) ; BLTDPTR kohde move.w 8(a6),$058(a5) ; BLTSIZE move.l #0,(a6) NextUnitBullet add.l #10,a6 dbf d7,PalUniBul rts ;----------------------------------------------------------------------------- ; Blitataan unit-bob ;----------------------------------------------------------------------------- BlitBob move.w #4098,d6 ; BLTSIZE asl.l #2,d1 ; Kerrotaan y-koord. 4:llä cmp.l #256*4,d1 bge.s ExitBlitBob cmp.l #-16*4,d1 ; -(Bobin korkeus) ble.s ExitBlitBob ; move.l 28(a1),a2 ; move.l 32(a1),a3 cmp.l #(255-16)*4,d1 ; Alalaita ble.s NxtTest move.l #256*4,d6 ; Screenin lainien määrä (eli korkeus) sub.l d1,d6 ; Kuinka monta pixelia näkyvissä lsl.l #6,d6 ; Lasketaan BLTSIZE addq.l #2,d6 ; X lisätään suoraan tässä versiossa.. bra.s Ready NxtTest cmp.l #0,d1 ; Ylälaita (käsitellään negatiiviset bge.s Ready ; koordinaatit) moveq #0,d6 move.l #16*4,d6 ; Bobin korkeus (siis y-pituus) add.l d1,d6 ; Nyt d6:ssa bobin korkeus! lsl.l #6,d6 ; Lasketaan BLTSIZE add.l #2,d6 ; X lisätään suoraan tässä versiossa.. neg.l d1 ; Lasketaan kohta, mistä bobbi-dataa lsl.l #2,d1 ; aletaan blittaamaan add.l d1,a2 add.l d1,a3 moveq #0,d1 ; Y-koordinaatti on tietysti nolla.. ;------------------------------------------------------------------------------ ;-- Lasketaan osoite ;------------------------------------------------------------------------------ Ready lsl.l #5,d1 move.b d0,d2 lsr.l #3,d0 add.l d1,d0 ext.l d0 add.l ScrollOffset,d0 ; ScrollOffset and.l #$000f,d2 mulu #$1000,d2 move.l DrawScreen,a4 add.l d0,a4 move.l ClearScreen,a0 add.l d0,a0 move.l a0,(a6) ; Vastaava paikka ClearScreenissä move.l a4,4(a6) ; Vanha Sijainti move.w d6,8(a6) ; Talletetaan BLTSIZE ; WaitForBlitter ; move.w #0000,$062(a5) ; BLTBMOD ; move.w #0028,$060(a5) ; BLTCMOD ; move.w #0000,$064(a5) ; BLTAMOD ; move.w #0028,$066(a5) ; BLTDMOD move.w d2,$042(a5) ; BLTCON1 or.w #$0fce,d2 ; ynnätään minterm+use shift valueen move.w d2,$040(a5) ; BLTCON0 move.l a4,$048(a5) ; BLTCPTR kohde move.l a2,$04c(a5) ; BLTBPTR bob-data move.l a3,$050(a5) ; BLTAPTR mask move.l a4,$054(a5) ; BLTDPTR kohde move.w d6,$058(a5) ; BLTSIZE ExitBlitBob rts BlitBullet move.w #1026,d6 ; BLTSIZE asl.l #2,d1 ; Kerrotaan y-koord. 4:llä cmp.l #256*4,d1 bge.s ExitBlitBullet cmp.l #-4*4,d1 ; -(Bobin korkeus) ble.s ExitBlitBullet move.l #EnBulletBob,a2 move.l #EnBulletMask,a3 cmp.l #(255-4)*4,d1 ; Alalaita ble.s NxTest move.l #256*4,d6 ; Screenin lainien määrä (eli korkeus) sub.l d1,d6 ; Kuinka monta pixelia näkyvissä lsl.l #6,d6 ; Lasketaan BLTSIZE addq.l #2,d6 ; X lisätään suoraan tässä versiossa.. bra.s Ready NxTest cmp.l #0,d1 ; Ylälaita (käsitellään negatiiviset bge.s Readyjoo ; koordinaatit) moveq #0,d6 move.l #4*4,d6 ; Bobin korkeus (siis y-pituus) add.l d1,d6 ; Nyt d6:ssa bobin korkeus! lsl.l #6,d6 ; Lasketaan BLTSIZE add.l #2,d6 ; X lisätään suoraan tässä versiossa.. neg.l d1 ; Lasketaan kohta, mistä bobbi-dataa lsl.l #2,d1 ; aletaan blittaamaan add.l d1,a2 add.l d1,a3 moveq #0,d1 ; Y-koordinaatti on tietysti nolla.. ;------------------------------------------------------------------------------ ;-- Lasketaan osoite ;------------------------------------------------------------------------------ Readyjoo lsl.l #5,d1 move.b d0,d2 lsr.l #3,d0 add.l d1,d0 ext.l d0 add.l ScrollOffset,d0 ; ScrollOffset and.l #$000f,d2 mulu #$1000,d2 move.l DrawScreen,a4 add.l d0,a4 move.l ClearScreen,a0 add.l d0,a0 move.l a0,(a6) ; Vastaava paikka ClearScreenissä move.l a4,4(a6) ; Vanha Sijainti move.w d6,8(a6) ; Talletetaan BLTSIZE WaitForBlitter move.w #0000,$062(a5) ; BLTBMOD move.w #0028,$060(a5) ; BLTCMOD move.w #0000,$064(a5) ; BLTAMOD move.w #0028,$066(a5) ; BLTDMOD move.w d2,$042(a5) ; BLTCON1 or.w #$0fce,d2 ; ynnätään minterm+use shift valueen move.w d2,$040(a5) ; BLTCON0 move.l a4,$048(a5) ; BLTCPTR kohde move.l a2,$04c(a5) ; BLTBPTR bob-data move.l a3,$050(a5) ; BLTAPTR mask move.l a4,$054(a5) ; BLTDPTR kohde move.w d6,$058(a5) ; BLTSIZE ExitBlitBullet rts ;------------------------------------------------------------------------------ ; ;------------------------------------------------------------------------------ ReadAttackWaves move.l pt_toCoolF,d0 moveq #0,d1 move.b level,d1 cmp.b #2,d1 beq Level2 cmp.b #3,d1 beq Level3 ; LEVEL 1 cmp.l #1280,d0 beq.s Kla ; beq.s LM ; HUOM! cmp.l #2904,d0 beq.s Yep cmp.l #6400,d0 beq.s AsteroiditKehiin cmp.l #13480,d0 beq.s LM rts Level2 cmp.l #1216,d0 beq.s putunits cmp.l #2904,d0 beq.s putships cmp.l #6400,d0 beq.s AsteroiditKehiin cmp.l #13408,d0 beq.s PutLoppuUnits cmp.l #13440,d0 beq LM rts Level3 cmp.l #320,d0 beq.s l3_aw1 cmp.l #6400,d0 beq.s AsteroiditKehiin cmp.l #13480,d0 beq LM rts ; 3. hyökkäysaalto Yep move.b #1,CoordBobsRunning move.l #Coords1,Coords move.l #RengasBob,a3 move.l #RengasMask,a4 move.b #16,nr_of_bobs lea PTRsAndONOFF,a0 moveq #0,d7 move.b nr_of_bobs,d7 subq.l #1,d7 moveq #0,d0 DefSil move.l d0,(a0)+ ; Pointteri koordinaatteihin move.w #1,(a0)+ ; "Enemy kehissä" -merkki move.w #1,(a0)+ ; Kestävyys move.l a3,(a0)+ ; Bob-data move.l a4,(a0)+ ; Maski add.l #32,d0 ; dbf d7,DefSil move.b nr_of_bobs,AmEnemies rts ; 2. Hyökkäysaalto Kla lea Units,a1 move.w #1,(a1) move.l #96,2(a1) move.l #-16,6(a1) move.l #Unit,28(a1) move.l #UnitMask,32(a1) move.l #ExplodedUnit,36(a1) move.l #ExplodedUnitM,40(a1) move.w #1,46(a1) add.l #48,a1 move.w #1,(a1) move.l #112,2(a1) move.l #-16,6(a1) move.l #Unit,28(a1) move.l #UnitMask,32(a1) move.l #ExplodedUnit,36(a1) move.l #ExplodedUnitM,40(a1) move.w #1,46(a1) add.l #48,a1 move.w #1,(a1) move.l #128,2(a1) move.l #-16,6(a1) move.l #Unit,28(a1) move.l #UnitMask,32(a1) move.l #ExplodedUnit,36(a1) move.l #ExplodedUnitM,40(a1) move.w #1,46(a1) add.l #48,a1 move.w #1,(a1) move.l #144,2(a1) move.l #-16,6(a1) move.l #Unit,28(a1) move.l #UnitMask,32(a1) move.l #ExplodedUnit,36(a1) move.l #ExplodedUnitM,40(a1) move.w #1,46(a1) rts ; 3. Hyökkäysaalto ;Yea move.b #1,CoordBobsRunning ; ; move.l #Coords2,Coords ; ; move.l #UfoBob,a1 ; move.l #UfoMask,a4 ; move.b #16,nr_of_bobs ; lea PTRsAndONOFF,a0 ; moveq #0,d7 ; move.b nr_of_bobs,d7 ; subq.l #1,d7 ; moveq #0,d0 ;DSil move.l d0,(a0)+ ; Pointteri koordinaatteihin ; move.w #1,(a0)+ ; Kehissä ; move.w #3,(a0)+ ; Kestävyys ; move.l a1,(a0)+ ; Bob-data ; move.l a4,(a0)+ ; Mask-data ; add.l #32,d0 ; dbf d7,DSil ; move.b nr_of_bobs,AmEnemies ; rts ; 4. Hyökkäysaalto AsteroiditKehiin move.b #1,AsteroidsRunning move.w #164,Nr_of_asteroids rts LM move.b #1,MonsterKehissa rts ; Level 2 PutLoppuUnits lea Units,a1 move.w #1,(a1) move.l #112,2(a1) move.l #-16,6(a1) move.l #Unit,28(a1) move.l #UnitMask,32(a1) move.l #ExplodedUnit,36(a1) move.l #ExplodedUnitM,40(a1) move.w #0,46(a1) add.l #48,a1 move.w #1,(a1) move.l #128,2(a1) move.l #-16,6(a1) move.l #Unit,28(a1) move.l #UnitMask,32(a1) move.l #ExplodedUnit,36(a1) move.l #ExplodedUnitM,40(a1) move.w #0,46(a1) rts putunits lea Units,a1 move.w #1,(a1) move.l #112,2(a1) move.l #-16,6(a1) move.l #Unit,28(a1) move.l #UnitMask,32(a1) move.l #ExplodedUnit,36(a1) move.l #ExplodedUnitM,40(a1) move.w #1,46(a1) add.l #48,a1 move.w #1,(a1) move.l #128,2(a1) move.l #-16,6(a1) move.l #Unit,28(a1) move.l #UnitMask,32(a1) move.l #ExplodedUnit,36(a1) move.l #ExplodedUnitM,40(a1) move.w #1,46(a1) rts putships move.b #1,CoordBobsRunning move.l #Coords2,Coords move.l #ShipBob,a3 move.l #ShipMask,a4 move.b #16,nr_of_bobs lea PTRsAndONOFF,a0 moveq #0,d7 move.b nr_of_bobs,d7 subq.l #1,d7 moveq #0,d0 initSil move.l d0,(a0)+ ; Pointteri koordinaatteihin move.w #1,(a0)+ ; "Enemy kehissä" -merkki move.w #3,(a0)+ ; Kestävyys move.l a3,(a0)+ ; Bob-data move.l a4,(a0)+ ; Maski add.l #32,d0 ; dbf d7,initSil move.b nr_of_bobs,AmEnemies rts l3_aw1 move.b #1,CoordBobsRunning move.l #Coords3,Coords move.l #WBob,a3 move.l #WMask,a4 move.b #16,nr_of_bobs lea PTRsAndONOFF,a0 moveq #0,d7 move.b nr_of_bobs,d7 subq.l #1,d7 moveq #0,d0 init_l3_aw1 move.l d0,(a0)+ ; Pointteri koordinaatteihin move.w #1,(a0)+ ; "Enemy kehissä" -merkki move.w #3,(a0)+ ; Kestävyys move.l a3,(a0)+ ; Bob-data move.l a4,(a0)+ ; Maski add.l #32,d0 ; dbf d7,init_l3_aw1 move.b nr_of_bobs,AmEnemies rts ;------------------------------------------------------------------------------ ; Katsotaan pitääkö koordinaativalmiita bobbjea liikuttaa ;------------------------------------------------------------------------------ CheckCoordBobs cmp.b #1,CoordBobsRunning beq.s Yes rts Yes cmp.b #0,AmEnemies beq.s Ye bra.s CCBR Ye cmp.b #0,MovingEBullets beq.s Chess CCBR bsr PalautetaanTaustat bsr HandleBob bsr HandleEBullets bsr Collisions ExitCheck rts Chess cmp.b #1,DoLastCoordBobFrames beq.s Yeah move.b #1,DoLastCoordBobFrames move.b #1,LastCBFrames Yeah bsr PalautetaanTaustat subq.b #1,LastCBFrames cmp.b #0,LastCBFrames beq.s OliNolla rts OliNolla move.b #0,LastCBFrames move.b #0,CoordBobsRunning move.b #0,DoLastCoordBobFrames rts ;------------------------------------------------------------------------------ Collisions ; 1° Ovatko pelaajan laakit osuneet vihollisiin? ; Periaate: Otetaan laaki 1. Verrataan sitä kaikkiin enemyihin. ; Otetaan laaki 2. Verrataan sitä kaikkiin enemyihin. JNE. ;------------------------------------------------------------------------------ ; move.w #$0779,$01a4(a5) lea Laakit,a0 move.w #AmountBullets,d7 ; Omien laakien määrä CSil1: lea PTRsAndONOFF,a1 moveq #0,d6 move.b nr_of_bobs,d6 ; Vihollisten määrä -1 subq.l #1,d6 CSil2: cmp.w #0,(a0) bne.s CSil3 addq.l #6,a0 dbf d7,CSil2 bra.s EnemiesToPlayer CSil3: cmp.w #0,4(a1) ; Katsotaan onko ko. enemy kehissä; beq.s Nxt ; ei -> seuraava enemy move.w 4(a0),d0 ; y-test ; Otetaan laakin (Ply) y-koord. move.l Coords,a2 ; Pointteri enemyn add.l (a1),a2 ; liikerataan! move.w (a2),d2 ; Enemyn x-koord. move.w 2(a2),d1 ; Enemyn y-koord. sub.w d1,d0 ; cmp.w #0,d0 blt.s Nxt cmp.w #8+8,d0 bgt.s Nxt move.w 2(a0),d0 ; x-test ; Laakin (Ply) x-koord. sub.w d2,d0 ; Pelaajan x miinus enemyn x cmp.w #-5,d0 blt.s Nxt cmp.w #13,d0 bgt.s Nxt move.w #0,(a0) ; Laaki pois kehistä -merkki ; subq.b #1,OwnBulletsOnScreen subq.w #1,6(a1) cmp.w #0,6(a1) ; Onko hajalla? bne.s Nxt move.w #0,4(a1) ; Enemy pois kehistä -merkki subq.b #1,AmEnemies addq.w #5,Pisteet ; Lisätään pelaajan pisteitä move.l Exp_PT,a4 move.w #1,(a4) move.w (a2),2(a4) move.w 2(a2),4(a4) move.w #4,6(a4) add.l #12,a4 cmp.w #-1,(a4) bne.s ptr_ok move.l #Explosions,Exp_PT ; move.w #$fff,$dff180 bra.s Nxt ptr_ok move.l a4,Exp_PT Nxt add.l #16,a1 ; Seuraava enemy dbf d6,CSil3 addq.l #6,a0 ; Seuraava laaki (Ply) dbf d7,CSil1 ;------------------------------------------------------------------------------ ; 2° Onko joku vihulainen onnistunut krunssaamaan pelaajan aluksen? ; Periaate: Verrataan kaikkien vihollisten koordinaatteja pelaajan x,y:hyn ;------------------------------------------------------------------------------ EnemiesToPlayer moveq #0,d7 move.b nr_of_bobs,d7 ; Tässä oli bugi ennen! subq.l #1,d7 lea PTRsAndONOFF,a0 ; Vihollisten pointterit koordinaatteihin move.w x,d0 ; Pelaajan x ja move.w y,d1 ; y EToPly: cmp.w #0,4(a0) ; Jos vihulainen ei oo kehissä, niin next! beq.s Nekst move.l Coords,a1 add.l (a0),a1 move.w (a1)+,d2 ; Vihollisen x move.w (a1),d3 ; Vihollisen y sub.w d0,d2 ; VihX-PelX cmp.w #-16,d2 ; Vasemmanpuoleinen raja blt.s Nekst cmp.w #13,d2 ; Oikeanpuolinen raja bgt.s Nekst sub.w d1,d3 ; VihY-PelY cmp.w #-15,d3 ; Yläraja blt.s Nekst cmp.w #14,d3 ; Alaraja bgt.s Nekst move.w #$0ff0,$01a4(a5) ; CRASH!!!!!!!!!!!!!! ; move.b #1,gameOver subq.b #1,energia ; bra.s EBulletsToPlayer ; ??? Nekst: add.l #16,a0 dbf d7,EToPly ;------------------------------------------------------------------------------ ; 3° Onko vihulaisen laaki ehkä jopa osunut? ; Periaate: Verrataan kaikkien enemylaakien koordinaatteja pelaajan x,y:hyn ;------------------------------------------------------------------------------ ; Tähän tultaessa pelaajan x on D0:ssa ja y D1:ssä EBulletsToPlayer move.w #AmountEBullets,d7 lea EnemyLaakit,a0 ; Vihollisten laakien koordinaatit BToPly move.w (a0)+,d2 ; Laakin x bmi.s Seuraava ; Jos x=-1, niin seuraava laaki! move.w (a0)+,d3 ; Laakin y sub.w d0,d2 ; LaakiX-PelaX cmp.w #-3,d2 ; Vasemmanpuoleinen raja blt.s Nekzt cmp.w #14,d2 ; Oikeanpuolinen raja bgt.s Nekzt sub.w d1,d3 ; LaakiY-PelaY cmp.w #-3,d3 ; Yläraja blt.s Nekzt cmp.w #14,d3 ; Alaraja bgt.s Nekzt move.w #$0ff0,$01a4(a5) ; CRASH!!!!!!!!!!!!!!!! ; move.b #1,gameOver subq.b #1,energia bra.s Ex_BTP ; (Future: Lives/Energy -1) Nekzt dbf d7,BToPly Ex_BTP rts Seuraava addq.l #2,a0 ; Seuraava laaki dbf d7,BToPly rts ;------------------------------------------------------------------------------ PalautetaanTaustat ;------------------------------------------------------------------------------ ; Enemyiden alla olevat taustat move.l VanhaSij,a2 ; ClearScreen,VanhaSij,BLTSIZE moveq #0,d7 move.b nr_of_bobs,d7 subq.l #1,d7 move.l VanhaESij,a1 ; ClearScreen,VanhaESij move.w #AmountEBullets,d6 move.w #1026,d0 WaitForBlitter move.w #$09f0,$040(a5) ; BLTCON0 move.w #$0000,$042(a5) ; BLTCON0 move.w #0028,$064(a5) ; BLTAMOD move.w #0028,$066(a5) ; BLTDMOD PalautaTausta cmp.l #0,(a2) bne.s NoSkip add.l #4+4+2,a2 dbf d7,PalautaTausta bra.s PalautaTausta2 NoSkip WaitForBlitter move.l (a2)+,$050(a5) ; BLTAPTR move.l (a2)+,$054(a5) ; BLTDPTR kohde move.w (a2)+,$058(a5) ; BLTSIZE dbf d7,PalautaTausta ; Vihollisten laakien alla olevat taustat PalautaTausta2 cmp.l #0,(a1) bne.s NoSkip2 addq.l #4+4,a1 dbf d6,PalautaTausta2 bra.s ExitPal NoSkip2 WaitForBlitter move.l (a1)+,$050(a5) ; BLTAPTR move.l (a1)+,$054(a5) ; BLTDPTR kohde move.w d0,$058(a5) ; BLTSIZE dbf d6,PalautaTausta2 ExitPal move.w $6(a5),Random ; Avitetaan satunnaislukugeneraattoria rts ;------------------------------------------------------------------------------ ; Palautetaan asteroidien alta tausta ;------------------------------------------------------------------------------ PalautaAsteroidienTausta moveq #max_asteroids_on_screen-1,d7 ; lea Asteroids,a0 move.l VanhaAstSij,a6 WaitForBlitter move.w #$09f0,$040(a5) ; BLTCON0 move.w #$0000,$042(a5) ; BLTCON0 move.w #0028,$064(a5) ; BLTAMOD move.w #0028,$066(a5) ; BLTDMOD PalAstTausta cmp.l #0,(a6) ; Onko liikkeellä? beq.s SkipAst WaitForBlitter move.l (a6)+,$050(a5) ; BLTAPTR move.l (a6)+,$054(a5) ; BLTDPTR move.w (a6)+,$058(a5) ; BLTSIZE ; move.l #0,-10(a6) SkipAst ; add.l #10,a0 ; Oli 20 dbf d7,PalAstTausta rts ;------------------------------------------------------------------------------ ;------------------------------------------------------------------------------ HandlePlayer: ;------------------------------------------------------------------------------ ;------------------------------------------------------------------------------ ; Put the player's ship lea SPR1,a1 ; Oma alus move.w x,d0 ; x move.w y,d1 ; y move.w #15,d2 ; korkeus bsr SpriteKondikseen ;------------------------------------------------------------------------------ ; Tässä liikutetaan ja pistetään kehiin omat spritelaakit. ; Laakimuuttujille täytyy ; siis varata kiinteästi muistia kuvaruudulle mahtuvien laakien määrä kertaa 3! ;------------------------------------------------------------------------------ moveq #AmountBullets,d7 move.l LaakiPT,a0 lea SPR0,a1 ; Laakisprite BSil: cmp.w #0,(a0) ; Onko laaki liikenteessä = kehiinkö? beq.s NextB subq.w #BSpeed,4(a0) ; Laakin liikutus! move.w 2(a0),d0 ; Laakin x move.w 4(a0),d1 ; Laakin y cmp.w #-8,d1 bgt.s Continue move.w #0,(a0) ; Laaki ei kehissä -merkki ; subq.b #1,OwnBulletsOnScreen bra.s NextB Continue: moveq #8,d2 ; Laakispriten korkeus bsr SpriteKondikseen add.l #36,a1 ; Seuraava sprite NextB: addq.l #6,a0 cmp.w #-1,(a0) bne.s NoEi lea Laakit,a0 NoEi: dbf d7,BSil move.l #0,(a1) ; Stop usage of LaakiSprite (SPR 0 tai 1) Ex: rts ;------------------------------------------------------------------------------ Joystick: ;------------------------------------------------------------------------------ move.w $c(a5),d6 ; Joikkis rekisteri btst #1,d6 ; Ohjataanko oikealle? beq.s jskip ; Jos ei niin ... cmp.b #1,phase beq.s rdec1 cmp.b #2,phase beq.s rdec2 cmp.b #3,phase beq.s rdec3 move.b #1,phase move.b #10,delay rdec1 subq.b #1,delay addq.w #1,x cmp.b #0,delay bne.s ei1 addq.b #1,phase move.b #5,delay ei1 bra.s ROnkoRajoissa rdec2 subq.b #1,delay addq.w #2,x cmp.b #0,delay bne.s ei2 addq.b #1,phase ei2 bra.s ROnkoRajoissa rdec3 addq.w #3,x ROnkoRajoissa cmp.w #255-16,x ble.s Nappi move.w #255-16,x bra.s EsiNappi jskip: btst #9,d6 ; Ohjataanko vasemalle? beq.s EsiNappi ; Jos ei niin ... cmp.b #1,phase beq.s ldec1 cmp.b #2,phase beq.s ldec2 cmp.b #3,phase beq.s ldec3 move.b #1,phase move.b #10,delay ldec1 subq.b #1,delay subq.w #1,x cmp.b #0,delay bne.s ei3 addq.b #1,phase move.b #5,delay ei3 bra.s LOnkoRajoissa ldec2 subq.b #1,delay subq.w #2,x cmp.b #0,delay bne.s ei4 addq.b #1,phase ei4 bra.s LOnkoRajoissa ldec3 subq.w #3,x LOnkoRajoissa cmp.w #0,x bge.s Nappi move.w #0,x EsiNappi move.b #0,phase Nappi cmp.b #0,Laskuri beq.s Test subq.b #1,Laskuri rts Test: btst #7,$bfe001 ; Katsotaan painetaanko joikkiksen nappia ja bne.s ExitJoystick ; jos kyllä, niin laaki kehiin jos ei niin ei cmp.b #1,NPohjassa bne.s EiOo Here: rts EiOo: ; cmp.b #3,OwnBulletsOnScreen ; beq.s Here ; addq.b #1,OwnBulletsOnScreen move.b #1,NPohjassa move.b #Frames,Laskuri move.l LaakiPT,a0 move.w x,d0 ; Laakille koordinaatit move.w y,d1 addq.w #5,d0 subq.w #8,d1 move.w #1,(a0) ; Laaki liikkellä merkki move.w d0,2(a0) ; Laakille alku-x move.w d1,4(a0) ; Laakille alky-y addq.l #6,a0 cmp.w #-1,(a0) bne.s Tedve lea Laakit,a0 Tedve: move.l a0,LaakiPT rts ExitJoystick cmp.b #1,NPohjassa bne.s Eij move.b #0,NPohjassa Eij: rts ;------------------------------------------------------------------------------ ; Sprite Kondikseen ; Usage: a1=sprite,d0=x,d1=y,d2=korkeus ; Kantsii ehkä kehitellä semmoinen sprite-macro, niin koodi lyhenee vähän SpriteKondikseen X_kuntoon and.b #%10000000,3(a1) add.w #32,d0 add.w #128,d0 ; Koodia kannattanee optimoida niin, että add.w #44,d1 ; nämä on jo lisätty valmiiksi.. add.w d1,d2 ; VSTART+Korkeus=VSTOP ror.w #1,d0 ; 8 ylintä x:n bittiä move.b d0,1(a1) ; HSTARTiin. btst #15,d0 ; Katsotaan pitääkö beq.s Y_kuntoon ; "the HSTART low bit" bset #0,3(a1) ; asettaa. Y_kuntoon move.b d1,(a1) ; 8 alinta y:n bittiä VSTARTiin btst #8,d1 ; Katsotaan pitääkö beq.s VSTOP_kuntoon ; "the VSTART high bit" bset #2,3(a1) ; asettaa. VSTOP_kuntoon move.b d2,2(a1) ; 8 alinta vstop:in bittiä VSTOPpiin btst #8,d2 ; Katsotaan pitääkö beq.s SprOut ; "the VSTOP high bit" bset #1,3(a1) ; asettaa. SprOut rts ;------------------------------------------------------------------------------ ; Käsitellään energiasprite ;------------------------------------------------------------------------------ HandleEnergySprite moveq #0,d2 move.b energia,d2 ; Korkeus cmp.b #0,d2 bgt.s energiaa moveq #0,d2 move.b #1,gameOver energiaa moveq #16,d3 sub.l d2,d3 move.l #235,d0 moveq #5,d1 add.l d3,d1 move.l #SPR2,a1 bsr SpriteKondikseen rts ;------------------------------------------------------------------------------ Scroll cmp.b #1,MonsterKehissa beq.s GoOn ; lea Coolfield,a6 move.l coolfield,a6 cmp.l #5120*4,pt_toCoolF bne.s Neij move.l #0,pt_toCoolF Neij add.l pt_toCoolF,a6 bsr DrawBlocks ; Piirrettän 1 blocki kaikkiin (3) screeneihin sub.l #32*4,ScrollOffset ; Scrollataan 1 pixeli addq.b #1,Frame cmp.b #16,Frame bne.s GoOn move.l #0,Bl_paikka move.b #0,Frame cmp.b #1,LameFrame bne.s EiLameFrame move.b #0,LameFrame move.l #(256+16+16)*4*32,ScrollOffset EiLameFrame sub.l #16,LineN cmp.l #-16,LineN bne.s GoOn move.l #0,Bl_paikka move.b #1,LameFrame move.l #256+16,LineN GoOn rts ;------------------------------------------------------------------------------ Show: move.l ShowScreen,d1 add.l ScrollOffset,d1 move.w d1,low1 swap d1 move.w d1,high1 swap d1 add.l #32,d1 move.w d1,low2 swap d1 move.w d1,high2 swap d1 add.l #32,d1 move.w d1,low3 swap d1 move.w d1,high3 swap d1 add.l #32,d1 move.w d1,low4 swap d1 move.w d1,high4 rts ;------------------------------------------------------------------------------ DrawBlocks: move.w #4097,d6 ; BLTSIZE (16*(16*4)) move.l LineN,d1 ; Rivinumero, mihin blocki blitataan lsl.l #7,d1 ; Kerrotaan 32*4:llä = screen's width * nr. bpls cmp.b #1,LameFrame beq Lame ; Kopsataan aluksi sama pala kahteen eri paikkaan ClearScreeniin move.l ClearScreen,a2 add.l d1,a2 add.l Bl_paikka,a2 WaitForBlitter move.w #$09f0,$040(a5) ; BLTCON0 move.w #$0000,$042(a5) ; BLTCON0 move.w #0038,$064(a5) ; BLTAMOD move.w #0030,$066(a5) ; BLTDMOD move.l (a6),$050(a5) ; BLTAPTR source move.l a2,$054(a5) ; BLTDPTR kohde move.w d6,$058(a5) ; BLTSIZE add.l #Dest,a2 ; Dest-osoite WaitForBlitter move.l (a6),$050(a5) ; BLTAPTR source move.l a2,$054(a5) ; BLTDPTR kohde move.w d6,$058(a5) ; BLTSIZE (16*(16*4)) ; ..sitten BitMap1:een move.l BitMap1,a2 add.l d1,a2 add.l Bl_paikka,a2 WaitForBlitter move.l (a6),$050(a5) ; BLTAPTR source move.l a2,$054(a5) ; BLTDPTR kohde move.w d6,$058(a5) ; BLTSIZE add.l #Dest,a2 ; Dest-osoite WaitForBlitter move.l (a6),$050(a5) ; BLTAPTR source move.l a2,$054(a5) ; BLTDPTR kohde move.w d6,$058(a5) ; BLTSIZE (16*(16*4)) ; ..sitten BitMap2:een move.l BitMap2,a2 add.l d1,a2 add.l Bl_paikka,a2 WaitForBlitter move.l (a6),$050(a5) ; BLTAPTR source move.l a2,$054(a5) ; BLTDPTR kohde move.w d6,$058(a5) ; BLTSIZE add.l #Dest,a2 ; Dest-osoite WaitForBlitter move.l (a6),$050(a5) ; BLTAPTR source move.l a2,$054(a5) ; BLTDPTR kohde move.w d6,$058(a5) ; BLTSIZE (16*(16*4)) addq.l #2,Bl_paikka addq.l #4,pt_toCoolF rts ; Blitataan ensin ClearScreeniin Lame: move.l ClearScreen,a2 add.l d1,a2 add.l Bl_paikka,a2 WaitForBlitter move.w #$09f0,$040(a5) ; BLTCON0 move.w #$0000,$042(a5) ; BLTCON0 move.w #0038,$064(a5) ; BLTAMOD move.w #0030,$066(a5) ; BLTDMOD move.l (a6),$050(a5) ; BLTAPTR source move.l a2,$054(a5) ; BLTDPTR kohde move.w d6,$058(a5) ; BLTSIZE (16*(16*4)) ; Sitten BitMap1:een move.l BitMap1,a2 add.l d1,a2 add.l Bl_paikka,a2 WaitForBlitter move.l (a6),$050(a5) ; BLTAPTR source move.l a2,$054(a5) ; BLTDPTR kohde move.w d6,$058(a5) ; BLTSIZE (16*(16*4)) ; Sitten BitMap2:een move.l BitMap2,a2 add.l d1,a2 add.l Bl_paikka,a2 WaitForBlitter move.l (a6),$050(a5) ; BLTAPTR source move.l a2,$054(a5) ; BLTDPTR kohde move.w d6,$058(a5) ; BLTSIZE (16*(16*4)) addq.l #2,Bl_paikka addq.l #4,pt_toCoolF rts ;------------------------------------------------------------------------------ SwapScreens: cmp.b #1,Kumpainen beq LetItBeOneThen move.l BitMap2,DrawScreen move.l BitMap1,ShowScreen ; cmp.b #1,CoordBobsRunning ; bne.s Ej move.l #VanhaSij1,VanhaSij move.l #VanhaESij1,VanhaESij ; lea Asteroids,a0 ; move.l #AstVanhaSij0,10(a0) cmp.b #1,AsteroidsRunning bne.s Eii move.l #VanhaAstSij0,VanhaAstSij Eii move.l #UnitsVanhaSij0,UnitsVanhaSij move.l #UnitsVBSij0,UnitsVBSij move.l #ExpVanhaSij0,VanhaExpSij move.l #MonstVanhaSij0,MonsterVanhaSij move.l #MonstBVanhaSij0,MonstBVanhaSij move.l #MExp_VanhaSij0,MExp_vanhasij move.b #1,Kumpainen rts LetItBeOneThen: move.l BitMap1,DrawScreen move.l BitMap2,ShowScreen ; lea Asteroids,a0 ; move.l #AstVanhaSij1,10(a0) cmp.b #1,AsteroidsRunning bne.s Eiii move.l #VanhaAstSij1,VanhaAstSij Eiii move.l #VanhaSij2,VanhaSij move.l #VanhaESij2,VanhaESij move.l #UnitsVanhaSij1,UnitsVanhaSij move.l #UnitsVBSij1,UnitsVBSij move.l #ExpVanhaSij1,VanhaExpSij move.l #MonstVanhaSij1,MonsterVanhaSij move.l #MonstBVanhaSij1,MonstBVanhaSij move.l #MExp_VanhaSij1,MExp_vanhasij move.b #0,Kumpainen rts ;------------------------------------------------------------------------------ ; Tsekataan ovatko pelaajan laakit osuneet asteroideihin tai asteroidit pelaajaan ;------------------------------------------------------------------------------ AsteroidCollisions ; Ovatko pelaajan laakit osuneet asteroideihin ; Idea: Otetaan järjestyksessä pelaajan laakeja ja verrataan niitä liikkeellä ; oleviin asteroideihin. moveq #0,d4 moveq #0,d5 move.w x,d4 ; Pelaajan X move.w y,d5 ; Pelaajan Y lea Laakit,a0 moveq #AmountBullets,d7 LaakiKehissa cmp.w #0,(a0) ; Onko laaki liikkeellä beq.s NextLaaki ; Jos ei ole, niin otetaan seuraava laaki ; moveq #0,d0 ; moveq #0,d1 move.w 2(a0),d0 ; Laakin X move.w 4(a0),d1 ; Laakin Y bra.s CompareToAsteroids NextLaaki addq.l #6,a0 dbf d7,LaakiKehissa bra.s PlayerToAsteroids CompareToAsteroids moveq #max_asteroids_on_screen-1,d6 lea Asteroids,a1 AstCollSil cmp.w #0,(a1) ; Onko liikkeellä beq.s NextAster ; Jos ei ole niin seuraava asteroidi ; moveq #0,d2 ; moveq #0,d3 move.w 2(a1),d2 ; Asteroidin X move.w 4(a1),d3 ; Asteroidin Y sub.w d0,d2 ; AstX - PelX cmp.w #-15,d2 ; -15 blt.s NextAster cmp.w #2,d2 ; 2 bgt.s NextAster sub.w d1,d3 cmp.w #-15,d3 ; -15 blt.s NextAster cmp.w #16,d3 ; 16 bgt.s NextAster move.w #0,(a0) ; Jos osuttu asteroidiin, niin laaki pois ; subq.b #1,OwnBulletsOnScreen subq.w #1,8(a1) ; Vähennetään asteroidin kestävyyttä cmp.w #0,8(a1) ; Jos tuhoutunut, niin laitetaan bne.s NextAster ; pois kehistä ja lisätään move.w #0,(a1) ; pelaajan pisteitä add.w #10,Pisteet subq.b #1,Asteroids_on_screen ; Vähennetään ruudulla olevien ; asteroidien määrää move.l Exp_PT,a4 move.w #1,(a4) move.w 2(a1),2(a4) move.w 4(a1),4(a4) move.w #4,6(a4) add.l #12,a4 move.l a4,Exp_PT cmp.w #-1,(a4) bne.s NextAster move.l #Explosions,Exp_PT NextAster add.l #10,a1 dbf d6,AstCollSil ; Kun kaikki asteroidit on katsottu addq.l #6,a0 ; otetaan seuraava laaki dbf d7,LaakiKehissa ; Katsotaan onko pelaaja törmännyt asteroidiin PlayerToAsteroids moveq #max_asteroids_on_screen-1,d7 lea Asteroids,a1 AsterSil cmp.w #0,(a1) ; Jos asteroidi ei ole liikkeellä, niin beq.s NxtAster ; seuraava asteroidi moveq #0,d2 moveq #0,d3 move.w 2(a1),d2 ; Asteroidin X move.w 4(a1),d3 ; Asteroidin Y sub.w d4,d2 cmp.w #-15,d2 blt.s NxtAster cmp.w #13,d2 bgt.s NxtAster sub.w d5,d3 cmp.w #-15,d3 blt.s NxtAster cmp.w #14,d3 bgt.s NxtAster move.w #$0ff0,$1a4(a5) ; move.b #1,gameOver subq.b #1,energia NxtAster add.l #10,a1 dbf d7,AsterSil rts ;------------------------------------------------------------------------------ ; Laitetaan uusi asteroidi näytölle ;------------------------------------------------------------------------------ PutAsteroid cmp.w #0,Nr_of_asteroids ; Paljonko asteroideja jäljellä ble.s ExitPA ; (yo. on kokonaismäärä) cmp.b #max_asteroids_on_screen,Asteroids_on_screen bge.s ExitPA move.w Random,d5 lea Asteroids,a0 moveq #max_asteroids_on_screen-1,d7 PASil cmp.w #0,Nr_of_asteroids ; Onko kaikki asteroidit käytetty? ble.s ExitPA cmp.b #max_asteroids_on_screen,Asteroids_on_screen ; Onko ruudulla max määrä beq.s ExitPA ; asteroideja cmp.w #1,(a0) ; Onko jo kehissä? beq.s NextAsteroid ; Jos on niin seuraava asteroidi move.w $6(a5),d0 ; Arvotaan uudelle asteroidille add.w Random,d0 ; X-koordinaatti and.l #255,d0 cmp.w #239,d0 blt.s Ookoo sub.l #16,d0 Ookoo move.w d0,2(a0) move.w #-16,4(a0) ; Y-koordinaatti add.w d5,d0 ; Arvotaan nopeus, D5:ssä random and.l #3,d0 cmp.l #0,d0 ; Nolllaa ei kelpuuteta nopeudeksi bne.s EiNolla moveq #1,d0 EiNolla move.w d0,6(a0) ; Speed move.w #9,8(a0) ; Kestävyys, asteroidit kestävät 3 laakia move.w #1,(a0) ; Asteroidi kehissä merkki addq.b #1,Asteroids_on_screen subq.w #1,Nr_of_asteroids NextAsteroid add.l #10,a0 dbf d7,PASil ExitPA rts OutOfAsteroidField cmp.b #0,Asteroids_on_screen beq.s Out rts Out move.b #1,LastAsteroidFrames rts ;------------------------------------------------------------------------------ ; Liikutetaan ja piirretään asteroidit ;------------------------------------------------------------------------------ MoveAsteroids lea Asteroids,a1 ; move.l a1,a6 ; add.l #10,a6 move.l VanhaAstSij,a6 moveq #max_asteroids_on_screen-1,d7 move.l ScrollOffset,d5 WaitForBlitter move.w #0000,$062(a5) ; BLTBMOD move.w #0028,$060(a5) ; BLTCMOD move.w #0000,$064(a5) ; BLTAMOD move.w #0028,$066(a5) ; BLTDMOD AstSil cmp.w #0,(a1) ; Onko liikkeellä? Jos ei ole, niin mennään beq.s NextAst ; seuraavan asteroidin kohdalle moveq #0,d0 moveq #0,d1 move.w 2(a1),d0 ; Asteroidin X move.w 4(a1),d1 ; Asteroidin Y ; move.l a1,a6 ; PutBob-rutiinia varten pointteri ; add.l #10,a6 ; kohdalleen move.l #AsteroidBob,a2 ; A2:ssa bob-data move.l #AsteroidMask,a3 ; A3:ssa mask-data bsr PutBob add.l #10,a6 ; HUOM !!! moveq #0,d0 move.w 6(a1),d0 ; Speed add.w d0,4(a1) ; Liikutetaan asteroidia cmp.w #256+4,4(a1) ; Onko poissa näkyvistä? blt.s NextAst move.w #0,(a1) ; Jos on, niin pois kehistä merkki päälle subq.b #1,Asteroids_on_screen NextAst add.l #10,a1 dbf d7,AstSil rts Jooo cmp.b #0,Asteroids_on_screen beq.s Out ;------------------------------------------------------------------------------ ;------------------------------------------------------------------------------ HandleBob: ;------------------------------------------------------------------------------ ;------------------------------------------------------------------------------ cmp.b #0,AmEnemies ; Jos ei ole yhtään enemyä kehissä, niin bne.s SumLeft ; poistutaan rts SumLeft lea PTRsAndONOFF,a1 ; Pointterit koordinaatteihin + ON/OFF merkki move.l VanhaSij,a6 moveq #0,d7 move.b nr_of_bobs,d7 subq.l #1,d7 move.l ScrollOffset,d5 WaitForBlitter move.w #0000,$062(a5) ; BLTBMOD move.w #0028,$060(a5) ; BLTCMOD move.w #0000,$064(a5) ; BLTAMOD move.w #0028,$066(a5) ; BLTDMOD ;------------------------------------------------------------------------------ BobbyLoop: ;------------------------------------------------------------------------------ cmp.w #0,4(a1) ; Jos "Pois päältä" -merkki on päällä, bne.s Cont ; mennään seuraavaan bobbiin add.l #16,a1 ; Seuraava bob add.l #4+4+2,a6 ; Seuraava vanhasijainti stuff dbf d7,BobbyLoop rts Cont: move.l Coords,a0 ; Täällä on koordinaatit add.l (a1),a0 ; Pointteri koordinaatteihin cmp.w #999,(a0) ; Jos A0:ssa on loppumerkki, niin bne.s GoMan ; pistetään "pois päältä"-merkki päälle move.w #0,4(a1) add.l #16,a1 ; subq.l #4,(a1)+ ; Pointteri pois 999:n kohdalta ; move.w #0,(a1)+ ; "Pois päältä" -merkki päälle ; move.l #0,(a6)+ addq.l #4+2,a6 subq.b #1,AmEnemies dbf d7,BobbyLoop rts GoMan: moveq #0,d1 addq.l #4,(a1) ; Pointteri seuraaviin koordinaatteihin move.w (a0)+,d0 ; x move.w (a0),d1 ; y move.l 8(a1),a2 move.l 12(a1),a3 bsr PutBob add.l #10,a6 ; HUOM !!! add.l #16,a1 ; Mennään seuraavan bobin tietojen kohdalle dbf d7,BobbyLoop rts ;------------------------------------------------------------------------------ ; Blitataan 16 x 16 pixelin bob. ; D5:ssä on oltava ScrollOffsett ja A6:ssa pointteri rakenteeseen, missä on ; LONG, LONG, WORD, mitkä tarkoittavat ClearScreen sijainti, vanha sijainti ja ; BLTSIZE. Modulorekisterit asetettava alussa. ;------------------------------------------------------------------------------ PutBob move.w #4098,d6 ; BLTSIZE ;------------------------------------------------------------------------------ asl.w #2,d1 ; 4 bittitasoa cmp.w #256*4,d1 bge.w ExitPutBob cmp.w #-16*4,d1 ; -(Bobin korkeus) ble.w ExitPutBob cmp.w #(255-16)*4,d1 ; Alalaita ble.s NextTest move.w #256*4,d6 ; Screenin lainien määrä (eli korkeus) sub.w d1,d6 ; Kuinka monta pixelia näkyvissä lsl.l #6,d6 ; Lasketaan BLTSIZE addq.w #2,d6 ; X lisätään suoraan tässä versiossa.. bra.s ReadyToBeBlitted NextTest cmp.w #0,d1 ; Ylälaita (käsitellään negatiiviset bge.s ReadyToBeBlitted ; koordinaatit) moveq #0,d6 move.w #16*4,d6 ; Bobin korkeus (siis y-pituus) add.w d1,d6 ; Nyt d6:ssa bobin korkeus! lsl.w #6,d6 ; Lasketaan BLTSIZE add.w #2,d6 ; X lisätään suoraan tässä versiossa.. neg.w d1 ; Lasketaan kohta, mistä bobbi-dataa GMan lsl.w #2,d1 ; aletaan blittaamaan add.l d1,a2 add.l d1,a3 moveq #0,d1 ; Y-koordinaatti on tietysti nolla.. ;------------------------------------------------------------------------------ ;-- Lasketaan osoite ;------------------------------------------------------------------------------ ReadyToBeBlitted: lsl.w #5,d1 moveq #0,d2 move.b d0,d2 lsr.w #3,d0 add.w d1,d0 ext.l d0 add.l d5,d0 ; ScrollOffset and.w #$000f,d2 mulu #$1000,d2 move.l DrawScreen,a4 add.l d0,a4 move.l ClearScreen,a0 add.l d0,a0 move.l a0,(a6) ; Vastaava paikka ClearScreenissä move.l a4,4(a6) ; Vanha Sijainti move.w d6,8(a6) ; Talletetaan BLTSIZE WaitForBlitter move.w d2,$042(a5) ; BLTCON1 or.w #$0fce,d2 ; ynnätään minterm+use shift valueen move.w d2,$040(a5) ; BLTCON0 move.l a4,$048(a5) ; BLTCPTR kohde move.l a2,$04c(a5) ; BLTBPTR bob-data move.l a3,$050(a5) ; BLTAPTR mask move.l a4,$054(a5) ; BLTDPTR kohde move.w d6,$058(a5) ; BLTSIZE ExitPutBob rts ;------------------------------------------------------------------------------ ;------------------------------------------------------------------------------ HandleEBullets: ;------------------------------------------------------------------------------ ;------------------------------------------------------------------------------ NewEBullets: ;------------------------------------------------------------------------------ cmp.b #AmountEBullets+1,MovingEBullets bge.s MoveEBullets moveq #0,d5 move.w #AmountEBullets,d7 moveq #0,d6 move.b nr_of_bobs,d6 subq.l #1,d6 lea PTRsAndONOFF,a0 ; Enemyiden koordinaatit ja ON/OFF lea EnemyLaakit,a2 ; x,y HEBSil: cmp.w #0,4(a0) ; Onko enmy kehissä? Jos ei, niin seuraava beq.s NextE Hee: cmp.w #-1,(a2) ; Onko laaki jo liikkeellä? (-1=EI , >-1=ON) beq.s Ok addq.l #4,a2 dbf d7,Hee bra.s MoveEBullets Ok: move.w $6(a5),d0 ; Katsotaan "satunnaisluvun" perusteella add.w Random,d0 ; pistetäänkö sittenkään laakia kehiin and.w #%0000000000000111,d0 cmp.w #7,d0 bne.s NextE move.l Coords,a1 move.l (a0),d0 ; Kas näin se bugi-laaki eliminoidaan!! subq.l #4,d0 ; ..näin.. add.l d0,a1 ; ..ja näin!! ; move.w (a1)+,(a2)+ ; Enemyn x laakin alku-x:ksi ; move.w (a1),(a2)+ ; Enemyn y laakin alku-y:ksi moveq #0,d5 ; Jos y-koordinaatti subq.l #1,d5 cmp.l #-1,d5 beq.s dsil ; add.l d5,a2 ; Nyt numerot alkavat oikeasta kohdasta nolla move.b #0,(a2)+ dbf d5,nolla subq.l #1,d7 ; DBF-käskyn vuoksi dsil move.l d0,d1 ; Working copy of D0 moveq #1,d3 ; Määritetään 10 potensiin move.l d7,d2 ; digitin järjestysnumero - 1 potsil subq.l #1,d2 ; cmp.l #-1,d2 ; ble.s Jatka ; mulu.w #10,d3 ; bra.s potsil ; Jatka move.l d3,d2 ; Jaetaan muutettava luku divu.w d2,d1 ; yllä määritetyllä luvulla and.l #$0000ffff,d1 ; Nollataan jakojäännös divu.w #10,d1 ; Jaetaan vielä 10:llä swap d1 ; Otetaan jakojäännös ja nollataan and.l #$0000ffff,d1 ; muu osa luvusta; jäljellä on ; on haettu digit! move.b d1,(a2)+ ; ja kirjoitetaan digit talteen dbf d7,dsil ; Tulostetaan Number "muuttujassa" oleva numerosarja Blit lea Number,a1 moveq #5-1,d7 move.l #192,d5 ; x-koordinaatti WaitForBlitter move.w #0000,$062(a5) ; BLTBMOD move.w #0028,$060(a5) ; BLTCMOD move.w #0000,$064(a5) ; BLTAMOD move.w #0028,$066(a5) ; BLTDMOD BNSil lea Numbers,a2 lea NumbersMask,a3 moveq #0,d4 move.b (a1)+,d4 lsl.l #7,d4 add.l d4,a2 add.l d4,a3 move.l d5,d0 moveq #13,d1 ; y-koordinaatti lsl.l #2,d1 ; 4 bittitasoa bsr BlitNumber add.l #8,d5 dbf d7,BNSil ExitBlitNumbers rts ;------------------------------------------------------------------------------ ; Tulostetaan numero ;------------------------------------------------------------------------------ BlitNumber ;------------------------------------------------------------------------------ ;-- Lasketaan osoite ;------------------------------------------------------------------------------ lsl.l #5,d1 move.b d0,d2 lsr.l #3,d0 add.l d1,d0 ext.l d0 add.l ScrollOffset,d0 ; ScrollOffset and.l #$000f,d2 mulu #$1000,d2 move.l DrawScreen,a4 add.l d0,a4 WaitForBlitter move.w d2,$042(a5) ; BLTCON1 or.w #$0fce,d2 ; ynnätään minterm+use shift valueen move.w d2,$040(a5) ; BLTCON0 move.l a4,$048(a5) ; BLTCPTR kohde move.l a2,$04c(a5) ; BLTBPTR bob-data move.l a3,$050(a5) ; BLTAPTR mask move.l a4,$054(a5) ; BLTDPTR kohde move.w #2050,$058(a5) ; BLTSIZE rts ;------------------------------------------------------------------------------ ; Palautetaan räjähdysten tausta ;------------------------------------------------------------------------------ PalautaExpTausta move.l VanhaExpSij,a1 moveq #20-1,d7 WaitForBlitter move.w #$09f0,$040(a5) ; BLTCON0 move.w #$0000,$042(a5) ; BLTCON0 move.w #0028,$064(a5) ; BLTAMOD move.w #0028,$066(a5) ; BLTDMOD Pal cmp.l #0,(a1) bne.s Palauta add.l #10,a1 dbf d7,Pal rts Palauta WaitForBlitter move.l (a1)+,$050(a5) ; BLTAPTR move.l (a1)+,$054(a5) ; BLTDPTR kohde move.w (a1)+,$058(a5) ; BLTSIZE move.l #0,-10(a1) dbf d7,Pal rts ;------------------------------------------------------------------------------ ; Hoidellaan räjähdykset ;------------------------------------------------------------------------------ HandleExplosions lea Explosions,a1 moveq #20-1,d7 move.l ScrollOffset,d5 move.l VanhaExpSij,a6 WaitForBlitter move.w #0000,$062(a5) ; BLTBMOD move.w #0028,$060(a5) ; BLTCMOD move.w #0000,$064(a5) ; BLTAMOD move.w #0028,$066(a5) ; BLTDMOD ExpSil cmp.w #0,(a1) ; Onko kehissä beq.s NextExp move.l #Explosion,a2 add.l 8(a1),a2 move.l #ExplosionMask,a3 add.l 8(a1),a3 moveq #0,d0 moveq #0,d1 move.w 2(a1),d0 move.w 4(a1),d1 cmp.b #1,MonsterKehissa beq.s blit addq.w #1,4(a1) cmp.w #256,4(a1) blt.s blit move.w #0,(a1) bra.s NextExp blit bsr PutBob cmp.w #0,6(a1) ; Onko viive nolla beq.s NextExpFrame ; Jos on, niin mennään seuraavaan frameen subq.w #1,6(a1) ; Jos ei ollut, niin vähennetään viivettä bra.s NextExp NextExpFrame add.l #256,8(a1) ; Seuraava frame move.w #4,6(a1) ; Laitetaan viive ennalleen cmp.l #256*8,8(a1) ; Ollaanko käyty kaikissa? bne.s NextExp ; Jos ei olla, niin mennään seuraavaan move.l #0,8(a1) ; Jos oltiin, niin nollataan framepointteri move.w #0,(a1) ; ja laitetaan pois kehistä-merkki NextExp add.l #12,a1 add.l #10,a6 dbf d7,ExpSil exithe rts ;------------------------------------------------------------------------------ ; Katsotaan, onko monsteri liikkeellä ;------------------------------------------------------------------------------ CheckMonster cmp.b #1,MonsterKehissa beq.s HandleMonster rts ;------------------------------------------------------------------------------ ; Käsitellään monsteri ;------------------------------------------------------------------------------ HandleMonster lea Monster,a1 cmp.w #32,2(a1) bge.s LiikutaHorisontaalisesti addq.w #1,2(a1) moveq #0,d0 moveq #0,d1 moveq #0,d2 move.w (a1),d0 move.w 2(a1),d1 bsr PyyhiMonster moveq #0,d0 moveq #0,d1 lea Monster,a1 move.w (a1),d0 move.w 2(a1),d1 move.l 60(a1),a2 ; Bob-data move.l 64(a1),a3 ; Mask-data move.l MonsterVanhaSij,a6 bsr BlitMonster bsr CheckMColl rts LiikutaHorisontaalisesti cmp.b #1,Monster_destroyed beq.s ME move.w DX,d0 add.w d0,(a1) cmp.w #96,(a1) bne.s Tst neg.w DX Tst cmp.w #0,(a1) bne.s Blittaa neg.w DX Blittaa bsr PyyhiMonster moveq #0,d0 moveq #0,d1 bsr AmpuukoMonster bsr HandleMonsterBullet moveq #0,d0 moveq #0,d1 lea Monster,a1 move.w (a1),d0 move.w 2(a1),d1 move.l 60(a1),a2 move.l 64(a1),a3 move.l MonsterVanhaSij,a6 bsr BlitMonster ME lea Monster_explosion,a0 ; cmp.w #0,(a0) ; beq.s CheckMColl cmp.b #0,Monster_destroyed beq.s CheckMColl bsr HandleMonstExplosion CheckMColl lea Monster,a1 bsr MCollisions rts ;------------------------------------------------------------------------------ ; Hoidellaan hirviön räjähdys ;------------------------------------------------------------------------------ HandleMonstExplosion cmp.b #3,MExpFinished ; Peli on pelattu, kun MExpFinished = 3 beq.s NextLevel cmp.b #1,MExpFinished bne.s jatkuu bsr PM ; Huom! bsr PyyhiMonstExplosion subq.b #1,LastMExpFrames cmp.b #0,LastMExpFrames bne.s erteees move.b #3,MExpFinished rts jatkuu ;bsr PM bsr PyyhiMonstExplosion bsr PyyhiMonster bsr HandleMonsterBullet move.l #Monster,a1 bsr MCollisions move.l #Monster_explosion,a0 moveq #0,d0 moveq #0,d1 move.w 2(a0),d0 move.w 4(a0),d1 subq.w #1,6(a0) ; Vähennetään viivettä yhdellä cmp.w #0,6(a0) bgt.s MonstExp add.l #3840,8(a0) move.w #4,6(a0) ; Viive cmp.l #3840*2,8(a0) bne.s MonstExp addq.b #1,kierros move.l #0,8(a0) ; Mennään räjähdysframen alkuun cmp.b #9,kierros bne.s MonstExp move.b #1,MExpFinished move.b #3,LastMExpFrames ; 3 move.l #0,8(a0) rts NextLevel addq.b #1,level cmp.b #3,level beq putlevel3 cmp.b #4,level beq.s erteees move.l #Coolfield2,coolfield bsr Alustus bsr FillTheScreen erteees rts putlevel3 move.l #Coolfield3,coolfield bsr Alustus bsr FillTheScreen rts MonstExp move.l 8(a0),d4 move.l #MonsterExplosionBob,a2 add.l d4,a2 move.l #MonsterExplosionMask,a3 move.l MExp_vanhasij,a6 add.l d4,a3 bsr BlitMonster rts HandleMonsterBullet moveq #3-1,d7 lea Monster,a1 addq.l #6,a1 move.l ScrollOffset,d5 move.l MonstBVanhaSij,a6 WaitForBlitter move.w #0000,$062(a5) ; BLTBMOD move.w #0028,$060(a5) ; BLTCMOD move.w #0000,$064(a5) ; BLTAMOD move.w #0028,$066(a5) ; BLTDMOD HMBSil cmp.w #0,(a1) beq.s NextMonsterBullet move.l 2(a1),d0 ; Bullet X move.l 6(a1),d1 ; Bullet Y lsr.l #7,d0 lsr.l #7,d1 ; move.l #MonsterBullet,a2 ; move.l #MonsterBulMask,a3 bsr BlitBullet ; Tulostetaan monsterin laaki move.l 10(a1),d0 move.l 14(a1),d1 add.l d0,2(a1) ; Lisätään bulletin X:ään addX add.l d1,6(a1) ; Sama addY:lle move.l 2(a1),d0 move.l 6(a1),d1 asr.l #7,d0 asr.l #7,d1 ; Katsotaan pysyykö laaki rajoissa cmp.w #256+4,d1 blt.s ookoo move.w #0,(a1) bra.s NextMonsterBullet ookoo cmp.w #0,d0 bge.s AllRight move.w #0,(a1) bra.s NextMonsterBullet AllRight cmp.w #255-4,d0 blt.s NextMonsterBullet move.w #0,(a1) NextMonsterBullet add.l #18,a1 add.l #10,a6 dbf d7,HMBSil rts AmpuukoMonster cmp.b #1,Monster_destroyed beq.s xit moveq #3-1,d7 moveq #0,d0 moveq #0,d1 move.w (a1),d0 move.w 2(a1),d1 move.l d0,d4 ; Monsterin X move.l d1,d5 ; Monsterin Y addq.l #6,a1 AMPSil cmp.w #0,(a1) ; Onko laaki vapaa? beq.s Ampuuko ; Jos on, niin arvotaan, ammutaanko add.l #18,a1 dbf d7,AMPSil xit rts Ampuuko move.w $6(a5),d0 add.w Random,d0 and.l #7,d0 cmp.w #7,d0 beq.s MAmpuu add.l #18,a1 dbf d7,AMPSil rts MAmpuu move.w #1,(a1) moveq #0,d2 moveq #0,d3 move.w x,d2 ; Pelaajan X move.w y,d3 ; Pelaajan Y move.l d4,d0 ; Otetaan monsterin X ja Y move.l d5,d1 ; tallesta add.l #72,d0 ; Keskitetään add.l #48,d1 sub.l d0,d2 ; Lasketaan X-etäisyys sub.l d1,d3 ; Lasketaan Y-etäisyys lsl.l #7,d2 lsl.l #7,d3 lsr.l #6,d2 lsr.l #6,d3 move.l d2,10(a1) ; Talletetaan addX move.l d3,14(a1) ; Talletetaan addY lsl.l #7,d0 lsl.l #7,d1 move.l d0,2(a1) ; Talletetaan bullet X move.l d1,6(a1) ; Talletataan bullet Y add.l #18,a1 dbf d7,AMPSil ExitAmpuuko rts MCollisions ; Ovatko pelaajan laakit osuneet monsteriin lea Monster_explosion,a0 ; Jos monsteri räjähtänyt, cmp.w #1,(a0) ; niin ei tsekata törmäyksiä beq.s OMLOP lea Laakit,a0 lea Monster,a4 moveq #AmountBullets,d7 MCSil cmp.w #1,(a0) beq.s OnkoOsunut addq.l #6,a0 dbf d7,MCSil bra.s OMLOP OnkoOsunut move.w 2(a0),d0 ; Laakin X move.w 4(a0),d1 ; Laakin Y sub.w (a1),d0 cmp.w #0,d0 blt.s Seur cmp.w #144,d0 ; 192 bge.s Seur sub.w 2(a1),d1 cmp.w #48,d1 ; 64 bgt.s Seur cmp.w #0,d1 blt.s Seur ; move.w #$fff,$1a4(a5) move.w #0,(a0) subq.w #1,4(a4) ; Vähennetään monsterin kestävyyttä addq.w #5,Pisteet ; Lisätään pelaajan pisteitä cmp.w #0,4(a4) ; Onko tuhoutunut? bne.s Seur move.b #1,Monster_destroyed lea Monster_explosion,a2 move.w #1,(a2) move.w (a4),2(a2) move.w 2(a4),4(a2) Seur addq.l #6,a0 dbf d7,MCSil ; Onko monsterin laakit osuuneet pelaajaan OMLOP lea Monster,a1 moveq #3-1,d7 addq.l #6,a1 OMLOPSil cmp.w #0,(a1) ; Onko laaki liikkeellä? beq.s nextbullet moveq #0,d0 moveq #0,d1 move.w x,d0 move.w y,d1 move.l 2(a1),d2 ; Monst bullet X move.l 6(a1),d3 ; Monst bullet Y asr.l #7,d2 asr.l #7,d3 sub.w d0,d2 cmp.w #-3,d2 blt.s nextbullet cmp.w #14,d2 bge.s nextbullet sub.w d1,d3 cmp.w #-3,d3 blt.s nextbullet cmp.w #14,d3 blt.s nextbullet move.w #$fff,$1a4(a5) subq.b #1,energia nextbullet add.l #18,a1 dbf d7,OMLOPSil rts ;------------------------------------------------------------------------------ ; Piirretään monsteri ;------------------------------------------------------------------------------ BlitMonster move.l #12298,d6 asl.w #2,d1 ; 4 bittitasoa cmp.w #-4*48,d1 ble.s ExitBM cmp.w #0,d1 ; Ylälaita (käsitellään negatiiviset bge.s Valmis ; koordinaatit) moveq #0,d6 move.w #4*48,d6 ; Bobin korkeus (siis y-pituus) add.w d1,d6 ; Nyt d6:ssa bobin korkeus! lsl.w #6,d6 ; Lasketaan BLTSIZE add.w #10,d6 ; X lisätään suoraan tässä versiossa.. neg.w d1 ; Lasketaan kohta, mistä bobbi-dataa mulu #20,d1 ; aletaan blittaamaan. add.l d1,a2 add.l d1,a3 moveq #0,d1 ; Y-koordinaatti on tietysti nolla.. Valmis moveq #0,d2 lsl.l #5,d1 move.b d0,d2 lsr.l #3,d0 add.l d1,d0 ext.l d0 add.l ScrollOffset,d0 ; ScrollOffset and.l #$000f,d2 mulu #$1000,d2 move.l DrawScreen,a4 add.l d0,a4 move.l ClearScreen,a0 add.l d0,a0 move.l a0,(a6)+ move.l a4,(a6)+ move.w d6,(a6)+ WaitForBlitter move.w #0000,$062(a5) ; BLTBMOD move.w #0012,$060(a5) ; BLTCMOD move.w #0000,$064(a5) ; BLTAMOD move.w #0012,$066(a5) ; BLTDMOD move.w d2,$042(a5) ; BLTCON1 or.w #$0fce,d2 ; ynnätään minterm+use shift valueen move.w d2,$040(a5) ; BLTCON0 move.l a4,$048(a5) ; BLTCPTR kohde move.l a2,$04c(a5) ; BLTBPTR bob-data move.l a3,$050(a5) ; BLTAPTR mask move.l a4,$054(a5) ; BLTDPTR kohde move.w d6,$058(a5) ; BLTSIZE ExitBM rts PyyhiMonstExplosion move.l MExp_vanhasij,a6 cmp.l #0,(a6) beq.s ExitPME WaitForBlitter move.w #$9f0,$040(a5) ; BLTCON0 move.w #$0000,$042(a5) ; BLTCON0 move.w #0012,$064(a5) ; BLTAMOD move.w #0012,$066(a5) ; BLTDMOD move.l (a6)+,$050(a5) ; BLTAPTR move.l (a6)+,$054(a5) ; BLTDPTR kohde move.w (a6)+,$058(a5) ; BLTSIZE ExitPME rts PyyhiMonster ; Pyyhitään ensin mahdollinen monsterin bullet move.l MonstBVanhaSij,a4 moveq #3-1,d7 PML cmp.l #0,(a4) beq.s NextMonstBullet WaitForBlitter move.w #$9f0,$040(a5) ; BLTCON0 move.w #0000,$042(a5) ; BLTCON0 move.w #0028,$064(a5) ; BLTAMOD move.w #0028,$066(a5) ; BLTDMOD move.l (a4)+,$050(a5) ; BLTAPTR move.l (a4)+,$054(a5) ; BLTDPTR move.w (a4)+,$058(a5) ; BLTSIZE dbf d7,PML bra.s PM NextMonstBullet add.l #10,a4 dbf d7,PML PM move.l MonsterVanhaSij,a4 cmp.l #0,(a4) beq.s ExitPM WaitForBlitter move.w #$9f0,$040(a5) ; BLTCON0 move.w #$000,$042(a5) ; BLTCON0 move.w #0012,$064(a5) ; BLTAMOD move.w #0012,$066(a5) ; BLTDMOD move.l (a4)+,$050(a5) ; BLTAPTR move.l (a4)+,$054(a5) ; BLTDPTR kohde move.w (a4)+,$058(a5) ; BLTSIZE ExitPM rts ;------------------------------------------------------------------------------ ; ;------------------------------------------------------------------------------ GameOver move.l #Dummy,d0 ; Spritet pois päältä move.w d0,s0_low swap d0 move.w d0,s0_high move.w d0,s1_low swap d0 move.w d0,s1_high move.w d0,s2_low swap d0 move.w d0,s2_high move.b #0,gameOver move.b #0,letterstyped move.b #1,level move.l #Coolfield,coolfield ; move.w #0,Pisteet move.l #0,$180(a5) bsr pyyhi_bitmap move.l bitmap,d1 move.w d1,low1 swap d1 move.w d1,high1 swap d1 add.l #32,d1 move.w d1,low2 swap d1 move.w d1,high2 swap d1 add.l #32,d1 move.w d1,low3 swap d1 move.w d1,high3 swap d1 add.l #32,d1 move.w d1,low4 swap d1 move.w d1,high4 lea gameover,a2 move.l bitmap,a1 add.l #14090,a1 bsr TulostaTeksti moveq #5-1,d7 lea hiscoretable,a1 vertailu move.w 4(a1),d1 cmp.w Pisteet,d1 add.l #6,a1 blt.s typeinname dbf d7,vertailu bra.s waitforjoybutton typeinname move.l bitmap,a1 add.l #1664,a1 lea usejoy,a2 bsr TulostaTeksti move.l bitmap,a1 add.l #4864,a1 lea type,a2 bsr TulostaTeksti move.l bitmap,a1 add.l #25738,a1 move.b #1,NPohjassa bsr PrintLetter gosil bsr JoystickForLetters bsr WaitForBeam cmp.b #3,letterstyped beq.s JumpToAlkuScreen btst #6,$bfe001 beq CleanUp bra.s gosil ; bra.s JumpToAlkuScreen waitforjoybutton lea pressjoy,a2 move.l bitmap,a1 add.l #29445,a1 bsr TulostaTeksti loop btst #6,$bfe001 beq CleanUp bsr WaitForBeam cmp.b #1,NPohjassa bne.s checkjoybutton move.b #0,NPohjassa bra.s loop checkjoybutton btst #7,$bfe001 ; Katsotaanko painetaanko joikkiksen nappia bne.s loop move.b #1,NPohjassa bra JumpToAlkuScreen ;------------------------------------------------------------------------------ ; ;------------------------------------------------------------------------------ LoppuScreen move.l #Dummy,d0 move.w d0,s0_low swap d0 move.w d0,s0_high move.w d0,s1_low swap d0 move.w d0,s1_high move.w d0,s2_low swap d0 move.w d0,s2_high bsr WaitForBeam bsr pyyhi_bitmap move.l bitmap,d1 move.w d1,low1 swap d1 move.w d1,high1 swap d1 add.l #32,d1 move.w d1,low2 swap d1 move.w d1,high2 swap d1 add.l #32,d1 move.w d1,low3 swap d1 move.w d1,high3 swap d1 add.l #32,d1 move.w d1,low4 swap d1 move.w d1,high4 move.w #0,$180(a5) lea udidit,a2 move.l bitmap,a1 add.l #13060,a1 bsr TulostaTeksti checkbut btst #6,$bfe001 beq CleanUp btst #7,$bfe001 ; Katsotaanko painetaanko joikkiksen nappia bne.s exitcbut cmp.b #1,NPohjassa bne.s eio bra.s checkbut eio bra GameOver exitcbut cmp.b #1,NPohjassa bne.s eiole move.b #0,NPohjassa eiole bra.s checkbut ;------------------------------------------------------------------------------ ; Level-Screen. Tämä tulostuu ennen alkavaa tasoa. Tänne hypätään alustuksesta. ;------------------------------------------------------------------------------ LevelScreen move.l #Dummy,d0 move.w d0,s0_low swap d0 move.w d0,s0_high move.w d0,s1_low swap d0 move.w d0,s1_high move.w d0,s2_low swap d0 move.w d0,s2_high bsr pyyhi_bitmap move.l bitmap,d1 move.w d1,low1 swap d1 move.w d1,high1 swap d1 add.l #32,d1 move.w d1,low2 swap d1 move.w d1,high2 swap d1 add.l #32,d1 move.w d1,low3 swap d1 move.w d1,high3 swap d1 add.l #32,d1 move.w d1,low4 swap d1 move.w d1,high4 moveq #0,d0 move.b level,d0 add.b #'0',d0 lea LevelTXT,a2 move.b d0,7(a2) move.l bitmap,a1 add.l #13067,a1 bsr TulostaTeksti move.l #150,d7 Wait bsr WaitForBeam dbf d7,Wait rts ;------------------------------------------------------------------------------ ; Alkuscreen-rutiineita ;------------------------------------------------------------------------------ AlkuScreen move.w #0,Pisteet bsr pyyhi_bitmap move.l bitmap,d1 move.w d1,low1 swap d1 move.w d1,high1 swap d1 add.l #32,d1 move.w d1,low2 swap d1 move.w d1,high2 swap d1 add.l #32,d1 move.w d1,low3 swap d1 move.w d1,high3 swap d1 add.l #32,d1 move.w d1,low4 swap d1 move.w d1,high4 move.w #$0,$180(a5) bsr WaitForBeam lea xwars,a2 move.l bitmap,a1 add.l #7,a1 bsr TulostaTeksti move.b #1,small_font lea press,a2 move.l bitmap,a1 add.l #30080,a1 bsr TulostaTeksti lea leftmouse,a2 move.l bitmap,a1 add.l #31488,a1 bsr TulostaTeksti lea codingby,a2 move.l bitmap,a1 add.l #2435,a1 ; 19 bsr TulostaTeksti lea musicby,a2 move.l bitmap,a1 add.l #3715,a1 bsr TulostaTeksti move.b #0,small_font bsr PrintHiScoreList AlkuMP btst #6,$bfe001 beq CleanUp bsr WaitForBeam checkbutton btst #7,$bfe001 ; Katsotaanko painetaanko joikkiksen nappia bne.s exitcb cmp.b #1,NPohjassa bne.s eioo bra.s AlkuMP eioo bra JumpToAlustus exitcb cmp.b #1,NPohjassa bne.s eij move.b #0,NPohjassa eij bra.s AlkuMP ;------------------------------------------------------------------------------ ; Pyyhitään bitmap ;------------------------------------------------------------------------------ pyyhi_bitmap move.l #4*2048-1,d7 move.l bitmap,a1 pyyhi move.l #0,(a1)+ dbf d7,pyyhi rts ;------------------------------------------------------------------------------ ; Tulostetaan tekstiä kunnes törmätään nollaan ;------------------------------------------------------------------------------ TulostaTeksti lea Fontti,a0 moveq #0,d0 move.b (a2)+,d0 cmp.b #0,d0 beq.s ExitPrintLetter sub.b #'0',d0 lsl.l #6,d0 add.l d0,a0 cmp.b #1,small_font beq.s printsmallletter moveq #64-1,d7 ; 64 - 1 lettersil move.b (a0)+,(a1) add.l #32,a1 ; 16 dbf d7,lettersil addq.l #1,a1 sub.l #2048,a1 ; 1024 bra.s TulostaTeksti ExitPrintLetter rts printsmallletter move.l #4*8-1,d7 smalllettersil move.b (a0)+,(a1) addq.l #1,a0 add.l #32,a1 dbf d7,smalllettersil sub.l #1024,a1 addq.l #1,a1 bra.s TulostaTeksti ;------------------------------------------------------------------------------ ; Tulostetaan yksi merkki fontista. ; A0:ssa osoitin fonttiin. A1:ssä osoitin kohteeseen. ;------------------------------------------------------------------------------ PrintLetter lea Fontti+17*64,a0 add.l pt_Font,a0 moveq #64-1,d7 letsil move.b (a0)+,(a1) add.l #32,a1 ; 16 dbf d7,letsil sub.l #2048,a1 ; 1024 ; Kirjoitetaan merkki myös merkki-bufferiin merkkibufferiin lea Nimi,a2 moveq #0,d0 move.b letterstyped,d0 add.l d0,a2 move.b currentchar,(a2) rts ;------------------------------------------------------------------------------ ; Tulostetaan HiScore-lista ;------------------------------------------------------------------------------ PrintHiScoreList move.l bitmap,a1 add.l #10250,a1 lea hiscoretable,a4 moveq #5-1,d6 hiscoresil move.l (a4)+,a2 bsr TulostaTeksti moveq #0,d0 move.w (a4)+,d0 addq.l #1,a1 ; 1 välilyönti nimien jälkeen lea Luku,a2 bsr ConvertToASCII lea Luku,a2 bsr TulostaTeksti sub.l #9,a1 add.l #2176,a1 ; 1280 dbf d6,hiscoresil rts ;------------------------------------------------------------------------------ JoystickForLetters ; A0:ssa on fontin osoite ;------------------------------------------------------------------------------ move.w $c(a5),d6 ; Joikkis rekisteri cmp.b #0,viive beq.s oikealle subq.b #1,viive bra.s JNappi oikealle btst #1,d6 ; Ohjataanko oikealle? beq.s vasemmalle ; Jos ei niin ... move.b #10,viive add.l #64,pt_Font addq.b #1,currentchar cmp.b #'[',currentchar blt.s pri move.b #'Z',currentchar sub.l #64,pt_Font pri bsr PrintLetter bra.s JNappi vasemmalle btst #9,d6 ; Ohjataanko vasemalle? beq.s JNappi ; Jos ei niin ... move.b #10,viive sub.l #64,pt_Font subq.b #1,currentchar cmp.b #'@',currentchar bgt.s prin move.b #'A',currentchar add.l #64,pt_Font prin bsr PrintLetter JNappi cmp.b #0,Laskuri beq.s TestN subq.b #1,Laskuri rts TestN btst #7,$bfe001 ; Katsotaanko painetaanko joikkiksen nappia bne.s ExtJoystick ; cmp.b #1,NPohjassa bne.s EiO rts EiO move.b #1,NPohjassa move.b #Frames,Laskuri bsr PrintLetter addq.l #1,a1 addq.b #1,letterstyped cmp.b #3,letterstyped ; Nollas on ensimmäinen kirjain bne.s ei bsr NewEntry ; bsr PrintHiScoreList rts ExtJoystick cmp.b #1,NPohjassa bne.s ei move.b #0,NPohjassa ei rts NewEntry moveq #5-1,d7 lea hiscoretable,a1 nesil moveq #0,d0 move.w 4(a1),d0 cmp.w Pisteet,d0 ; Jos tietuessa oleva arvo on pienempi, on blt.s yeah ; Pisteet suurempi... addq.l #6,a1 dbf d7,nesil rts yeah lea hiscoretable,a4 subq.l #1,d7 cmp.l #-1,d7 ; Jos kyseessä alimmainen, niin vain beq.s JustPutNewEntry ; laitetaan entry... move.l d7,d6 mulu #6,d6 ; Siirretään listaa yhdellä pykälällä alaspäin ; moveq #4-1,d7 ; add.l d6,a4 add.l #3*6,a4 sil moveq #4-1,d5 move.l (a4),a1 move.l 6(a4),a2 move.l (a2),a2 csil move.b (a1)+,(a2)+ dbf d5,csil move.w 4(a4),10(a4) subq.l #6,a4 dbf d7,sil addq.l #6,a4 move.l a4,a1 move.l (a4),a4 lea Nimi,a3 moveq #4-1,d7 nimisil move.b (a3)+,(a4)+ dbf d7,nimisil move.w Pisteet,4(a1) rts JustPutNewEntry add.l #4*6,a4 move.l a4,a1 move.l (a4),a4 lea Nimi,a3 moveq #4-1,d7 anothernimisil move.b (a3)+,(a4)+ dbf d7,anothernimisil move.w Pisteet,4(a1) rts ;------------------------------------------------------------------------------ ; Muutetaan kokonaisluku ASCII:ksi ;------------------------------------------------------------------------------ ConvertToASCII ; Muutettava luku D0:aan, tulos tulee A2:een. moveq #0,d2 ; Lasketaan digittien määrä move.l d0,d1 ; Lasketaan digittien määrä nrdigits addq.l #1,d2 divu.w #10,d1 and.l #$0000ffff,d1 cmp.w #0,d1 bgt.s nrdigits move.l d2,d7 ; Digittien määrä-1 D7:ään moveq #5,d5 ; Hoidellaan eteen tarpeellinen sub.l d7,d5 ; määrä nollia --> subq.l #1,d5 cmp.l #0,d5 blt.s skipnolla zerosil move.b #'0',(a2)+ dbf d5,zerosil ; add.l d5,a2 ; Nyt numerot alkavat oikeasta kohdasta skipnolla subq.l #1,d7 ; DBF-käskyn vuoksi digitsil move.l d0,d1 ; Working copy of D0 moveq #1,d3 ; Määritetään 10 potensiin move.l d7,d2 ; digitin järjestysnumero - 1 posil subq.l #1,d2 ; cmp.l #-1,d2 ; ble.s Jaa ; mulu.w #10,d3 ; bra.s posil ; Jaa move.l d3,d2 ; Jaetaan muutettava luku divu.w d2,d1 ; yllä määritetyllä luvulla and.l #$0000ffff,d1 ; Nollataan jakojäännös divu.w #10,d1 ; Jaetaan vielä 10:llä swap d1 ; Otetaan jakojäännös ja nollataan and.l #$0000ffff,d1 ; muu osa luvusta; jäljellä on add.b #'0',d1 ; on haettu digit! move.b d1,(a2)+ ; ja kirjoitetaan digit talteen move.b #0,(a2) dbf d7,digitsil rts ;------------------------------------------------------------------------------ FillTheScreen: ; Fillataan 16*17 suuruinen alue blo(c)keisssa(16*16,what else?) ; (..ja tietysti kaikkissa (3) screeneissä!!) move.l #(256+16)*4*32,d1 move.l BitMap1,a1 move.l BitMap2,a2 move.l ClearScreen,a3 add.l d1,a1 add.l d1,a2 add.l d1,a3 move.l coolfield,a6 ; lea Coolfield,a6 move.w #16/16+(16*4*64),d6 WaitForBlitter move.w #$09f0,$040(a5) ; BLTCON0 move.w #$0000,$042(a5) ; BLTCON0 move.w #0038,$064(a5) ; BLTAMOD move.w #0030,$066(a5) ; BLTDMOD moveq #17-1,d7 YSil: moveq #16-1,d5 XSil: WaitForBlitter move.l (a6),$050(a5) ; BLTAPTR source move.l a1,$054(a5) ; BLTDPTR kohde move.w d6,$058(a5) ; BLTSIZE 16*(16*4) addq.l #2,a1 WaitForBlitter move.l (a6),$050(a5) ; BLTAPTR source move.l a2,$054(a5) ; BLTDPTR kohde move.w d6,$058(a5) ; BLTSIZE 16*(16*4) addq.l #2,a2 WaitForBlitter move.l (a6)+,$050(a5) ; BLTAPTR source move.l a3,$054(a5) ; BLTDPTR kohde move.w d6,$058(a5) ; BLTSIZE 16*(16*4) addq.l #2,a3 dbf d5,XSil add.l #(4*32*16)-32,a1 add.l #(4*32*16)-32,a2 add.l #(4*32*16)-32,a3 dbf d7,YSil rts WaitForBeam cmp.b #$ff,$006(a5) bne.s WaitForBeam WFBeam cmp.b #$2c,$006(a5) bne.s WFBeam rts RMB btst #10,$016(a5) beq.s changecol rts changecol move.w #$333,$180(a5) rts ;------------------------------------------------------------------------------ ; Asetetaan tarvittavt alkuarvot, jotta uusi peli voi alkaa ;------------------------------------------------------------------------------ Alustus bsr LevelScreen ; Tulostetaan tason numero move.l #(256+16+16)*4*32,ScrollOffset ; move.w #0,Pisteet move.l #256,LineN ; Blo(c)kin y-paikka move.l #0,Bl_paikka ; Blo(c)kin x-paikka move.l #0,pt_toCoolF move.l #0,pt_toClear move.b #0,Frame ; Scrollaukseen liittyvä move.b #0,LameFrame ; move.b #16,energia lea Explosions,a0 lea ExpVanhaSij0,a1 lea ExpVanhaSij1,a4 moveq #20-1,d7 Exps move.w #0,(a0)+ ; Kehissä move.w #0,(a0)+ ; x move.w #0,(a0)+ ; y move.w #4,(a0)+ ; viive move.l #0,(a0)+ ; Pointteri grafiikkadataan move.l #0,(a1)+ ; ClearScreen-osoite move.l #0,(a1)+ ; VanhaSijainti-osoite move.w #0,(a1)+ ; BLTSIZE move.l #0,(a4)+ move.l #0,(a4)+ move.w #0,(a4)+ dbf d7,Exps move.l #0,Exp_PT move.l #0,VanhaExpSij move.l #Explosions,Exp_PT ; lea MExp_VanhaSij0,a1 lea MExp_VanhaSij1,a4 move.l #0,(a1)+ ; ClearScreen-sijainti move.l #0,(a1)+ ; VanhaSijainti move.w #0,(a1)+ ; BLTSIZE move.l #0,(a4)+ ; ClearScreen-sijainti move.l #0,(a4)+ ; VanhaSijainti move.w #0,(a4)+ ; BLTSIZE move.l #0,MExp_vanhasij moveq #3-1,d7 lea MonstBVanhaSij0,a0 lea MonstBVanhaSij1,a1 MBalustus move.l #0,(a0)+ move.l #0,(a0)+ move.w #0,(a0)+ move.l #0,(a1)+ move.l #0,(a1)+ move.w #0,(a1)+ dbf d7,MBalustus ; Coordbob-stuff lea VanhaSij1,a0 lea VanhaSij2,a1 lea PTRsAndONOFF,a4 moveq #max_bobs-1,d7 CoordBobAlustus move.l #0,(a0)+ ; ClearScreen move.l #0,(a0)+ ; VanhaSijainti move.w #0,(a0)+ ; BLTSIZE move.l #0,(a1)+ ; ClearScreen move.l #0,(a1)+ ; VanhaSijainti move.w #0,(a1)+ ; BLTSIZE move.l #0,(a4)+ ; Pointteri koordinaatteihin move.w #0,(a4)+ ; ON/OFF move.w #0,(a4)+ ; Kestävyys move.l #0,(a4)+ ; Pointteri bob-dataan move.l #0,(a4)+ ; Pointteri mask-dataan dbf d7,CoordBobAlustus move.b #0,DoLastCoordBobFrames move.b #0,CoordBobsRunning move.b #0,nr_of_bobs move.b #0,AmEnemies move.l #0,VanhaSij ; Enemylaakit coordbobeille lea VanhaESij1,a0 lea VanhaESij2,a1 lea EnemyLaakit,a2 moveq #AmountEBullets,d7 enbullet move.l #0,(a0)+ move.l #0,(a0)+ move.l #0,(a1)+ move.l #0,(a1)+ move.w #-1,(a2)+ ; x HUOM!!! move.w #0,(a2)+ ; y dbf d7,enbullet ; Omat laakit lea Laakit,a0 moveq #AmountBullets,d7 omatlaakitalustus move.w #0,(a0)+ ; Kehissä move.w #0,(a0)+ ; x move.w #0,(a0)+ ; y dbf d7,omatlaakitalustus move.l #0,LaakiPT move.l #Laakit,LaakiPT ; Unittien alkuarvot kuntoon lea Units,a0 lea UnitsVanhaSij0,a1 lea UnitsVanhaSij1,a2 lea UnitsVBSij0,a3 lea UnitsVBSij1,a4 moveq #5-1,d7 UnitInit move.w #0,(a0)+ ; Liikkeellä move.l #0,(a0)+ ; UnitX move.l #0,(a0)+ ; UnitY move.w #0,(a0)+ ; Laaki liikkeellä move.l #0,(a0)+ ; BulletX move.l #0,(a0)+ ; BulletY move.l #0,(a0)+ ; Bullet add X move.l #0,(a0)+ ; Bullet add Y move.l #0,(a0)+ ; UnitBob move.l #0,(a0)+ ; UnitBobMask move.l #0,(a0)+ ; ExplodedUnit move.l #0,(a0)+ ; ExplodedUnitMask move.w #0,(a0)+ ; Kestävyys move.w #0,(a0)+ ; Liikkuvako move.l #0,(a1)+ move.l #0,(a1)+ move.w #0,(a1)+ move.l #0,(a2)+ move.l #0,(a2)+ move.w #0,(a2)+ move.l #0,(a3)+ move.l #0,(a3)+ move.w #0,(a3)+ move.l #0,(a4)+ move.l #0,(a4)+ move.w #0,(a4)+ dbf d7,UnitInit ; Asteroidien alkuarvot kuntoon lea Asteroids,a0 moveq #28-1,d7 AsterInit move.w #0,(a0)+ ; Liikkeellä merkki move.w #0,(a0)+ ; X move.w #0,(a0)+ ; Y move.w #0,(a0)+ ; Speed move.w #0,(a0)+ ; Kestävyys dbf d7,AsterInit moveq #28-1,d7 lea VanhaAstSij0,a0 lea VanhaAstSij1,a1 AsterVSijInit move.l #0,(a0)+ ; ClearScreen move.l #0,(a0)+ ; VanhaSijainti move.w #0,(a0)+ ; BLTSIZE move.l #0,(a1)+ move.l #0,(a1)+ move.w #0,(a1)+ dbf d7,AsterVSijInit move.b #0,Asteroids_on_screen move.b #0,AsteroidsRunning move.b #3,LastAsteroidFrames ; Monsterin alkuarvot kuntoon move.b #0,MExpFinished move.b #0,Monster_destroyed move.b #0,MonsterKehissa lea Monster,a0 move.w #32,(a0)+ ; X-koordinaatti move.w #-64,(a0)+ ; Y move.w #60,(a0)+ ; Kestävyys move.w #0,(a0)+ ; Laaki liikkeellä move.l #0,(a0)+ move.l #0,(a0)+ move.l #0,(a0)+ move.l #0,(a0)+ move.w #0,(a0)+ move.l #0,(a0)+ move.l #0,(a0)+ move.l #0,(a0)+ move.l #0,(a0)+ move.w #0,(a0)+ move.l #0,(a0)+ move.l #0,(a0)+ move.l #0,(a0)+ move.l #0,(a0)+ cmp.b #2,level beq.s level2monsterbob cmp.b #3,level beq.s level3monsterbob move.l #MonsterBob,(a0)+ move.l #MonsterMask,(a0)+ bra.s monsterjatkuu level2monsterbob move.l #Monster2Bob,(a0)+ move.l #MonsterMask,(a0)+ bra.s monsterjatkuu level3monsterbob move.l #Monster3Bob,(a0)+ move.l #MonsterMask,(a0)+ monsterjatkuu move.w #1,DX lea Monster_explosion,a0 move.w #0,(a0)+ move.w #0,(a0)+ move.w #0,(a0)+ move.w #4,(a0)+ ; Viive move.l #0,(a0)+ move.b #0,kierros ; Taso 1 aloitustasoksi ; move.b #1,level ; move.l #Coolfield,coolfield move.l #SPR0,d0 move.w d0,s0_low swap d0 move.w d0,s0_high move.l #SPR1,d0 move.w d0,s1_low swap d0 move.w d0,s1_high move.l #SPR2,d0 move.w d0,s2_low swap d0 move.w d0,s2_high ; move.l #0,pt_Font move.b #'A',currentchar move.w #128,x ; Pelaajan koordinaatit move.w #235,y rts ;------------------------------------------------------------------------------ ; ;------------------------------------------------------------------------------ AlkuRoskat: move.w #5-1,d7 ; Spritejen määrä (mitkä "nollataan") move.l #Dummy,d0 ; "Nollataan" käyttämättämät spritet lea empty,a0 SprNl: move.w d0,2(a0) swap d0 move.w d0,6(a0) addq.l #8,a0 dbf d7,SprNl ; lea PTRsAndONOFF,a0 ; Lasketaan Enemyille koord. PTR:t ; moveq #0,d7 ; move.b nr_of_bobs,d7 ; subq.l #1,d7 ; move.l #0,d0 ;AlArv: move.l d0,(a0)+ ; move.w #1,(a0)+ ; "Enemy kehissä" -merkki ; add.l #32,d0 ; ; dbf d7,AlArv lea EnemyLaakit,a0 move.l #AmountEBullets,d7 ELSil: move.w #-1,(a0)+ move.w #0,(a0)+ dbf d7,ELSil lea Laakit,a0 move.l #AmountBullets,d7 SilL: move.w #0,(a0)+ move.w #0,(a0)+ move.w #0,(a0)+ dbf d7,SilL lea VanhaESij1,a0 move.l #AmountEBullets,d7 VES1Sil move.l #0,(a0)+ move.l #0,(a0)+ dbf d7,VES1Sil lea VanhaESij2,a0 move.l #AmountEBullets,d7 VES2Sil move.l #0,(a0)+ move.l #0,(a0)+ dbf d7,VES2Sil ; lea VanhaSij1,a0 ; moveq #0,d7 ; move.b nr_of_bobs,d7 ; subq.l #1,d7 ;ZIL: move.l #0,(a0)+ ; move.l #0,(a0)+ ; move.w #0,(a0)+ ; dbf d7,ZIL ; lea VanhaSij2,a0 ; moveq #0,d7 ; move.b nr_of_bobs,d7 ; subq.l #1,d7 ;ZIL2: move.l #0,(a0)+ ; move.l #0,(a0)+ ; move.w #0,(a0)+ ; dbf d7,ZIL2 move.l #SPR0,d0 move.w d0,s0_low swap d0 move.w d0,s0_high move.l #SPR1,d0 move.w d0,s1_low swap d0 move.w d0,s1_high move.l #SPR2,d0 move.w d0,s2_low swap d0 move.w d0,s2_high ; lea Blocks+2560+2,a0 ; Blockien loppu + skip 1 väri move.l #Blocks+2560+2,a0 ; lea Colours+2,a1 move.l #Colours+2,a1 moveq #15-1,d7 CSil move.w (a0)+,(a1) ; Asetetaan värit addq.l #4,a1 dbf d7,CSil ; lea Monster,a0 ; move.w #60,4(a0) ; Monsterin kestävyys move.b #1,level move.l #Coolfield,coolfield rts ;------------------------------------------------------------------------------ ; Musiikkikeskeytys ;------------------------------------------------------------------------------ Keskeytysrutiini bsr mt_music rts ;******************************************** ;* ----- Protracker V1.1B Playroutine ----- * ;* Lars "Zap" Hamre/Amiga Freelancers 1991 * ;* Bekkeliveien 10, N-2010 STRØMMEN, Norway * ;******************************************** ; CIA Version 1: ; Call SetCIAInt to install the interrupt server. Then call mt_init ; to initialize the song. Playback starts when the mt_enable flag ; is set to a nonzero value. To end the song and turn off all voices, ; call mt_end. At last, call ResetCIAInt to remove the interrupt. ; This playroutine is not very fast, optimized or well commented, ; but all the new commands in PT1.1 should work. ; If it's not good enough, you'll have to change it yourself. ; We'll try to write a faster routine soon... ; Changes from V1.0C playroutine: ; - ViBRAto depth changed to be compatible with Noisetracker 2.0. ; You'll have to double all vib. depths on old PT modules. ; - Funk Repeat changed to Invert Loop. ; - Period set back earlier when stopping an effect. ; You can use this routine to play a module. Just remove the semicolons. ; Exit by pressing both mousebuttons. ; ;main BSR.S SetCIAInt ; BSR mt_init ; ST mt_Enable ; MOVE.L 4.W,A6 ; LEA DOSname(PC),A1 ; MOVEQ #0,D0 ; JSR LVOOpenLiBRAry(A6) ; TST.L D0 ; BEQ.S theend ; MOVE.L D0,A6 ;wloop MOVEQ #10,D1 ; JSR LVODelay(A6) ; BTST #6,$BFE001 ; BNE.S wloop ; BTST #2,$DFF016 ; BNE.S wloop ; MOVE.L A6,A1 ; MOVE.L 4.W,A6 ; JSR LVOCloseLiBRAry(A6) ;theend BSR mt_end ; BSR ResetCIAInt ; RTS ; ;DOSname dc.b "dos.liBRAry",0 ;---- CIA Interrupt ---- AddICRVector = -6 RemICRVector = -12 LVOOpenResource = -498 LVOOpenLiBRAry = -552 LVOCloseLiBRAry = -414 LVODelay = -198 ciatalo = $400 ciatahi = $500 ciatblo = $600 ciatbhi = $700 ciacra = $E00 ciacrb = $F00 SetCIAInt MOVEQ #2,D6 LEA $BFD000,A5 MOVE.B #'b',CIAAname+3 SetCIALoop MOVEQ #0,D0 LEA CIAAname(PC),A1 MOVE.L 4.W,A6 JSR LVOOpenResource(A6) MOVE.L D0,CIAAbase BEQ mt_Return LEA GfxName(PC),A1 MOVEQ #0,D0 JSR LVOOpenLiBRAry(A6) TST.L D0 BEQ ResetCIAInt MOVE.L D0,A1 MOVE.W 206(A1),D0 ; DisplayFlags BTST #2,D0 ; PAL? BEQ.S WasNTSC MOVE.L #1773447,D7 ; PAL BRA.S sciask WasNTSC MOVE.L #1789773,D7 ; NTSC sciask MOVE.L D7,TimerValue DIVU #125,D7 ; Default to normal 50 Hz timer JSR CloseLiBRAry(A6) MOVE.L CIAAbase(PC),A6 CMP.W #2,D6 BEQ.S TryTimerA TryTimerB LEA MusicIntServer(PC),A1 MOVEQ #1,D0 ; Bit 1: Timer B JSR AddICRVector(A6) MOVE.L #1,TimerFlag TST.L D0 BNE.S CIAError MOVE.L A5,CIAAaddr MOVE.B D7,ciatblo(A5) LSR.W #8,D7 MOVE.B D7,ciatbhi(A5) BSET #0,ciacrb(A5) RTS TryTimerA LEA MusicIntServer(PC),A1 MOVEQ #0,D0 ; Bit 0: Timer A JSR AddICRVector(A6) CLR.L TimerFlag TST.L D0 BNE.S CIAError MOVE.L A5,CIAAaddr MOVE.B D7,ciatalo(A5) LSR.W #8,D7 MOVE.B D7,ciatahi(A5) BSET #0,ciacra(A5) RTS CIAError MOVE.B #'a',CIAAname+3 LEA $BFE001,A5 SUBQ.W #1,D6 BNE SetCIALoop CLR.L CIAAbase RTS ResetCIAInt MOVE.L CIAAbase(PC),D0 BEQ mt_Return CLR.L CIAAbase MOVE.L D0,A6 MOVE.L CIAAaddr(PC),A5 TST.L TimerFlag BEQ.S ResTimerA BCLR #0,ciacrb(A5) MOVEQ #1,D0 BRA.S RemInt ResTimerA BCLR #0,ciacra(A5) MOVEQ #0,D0 RemInt LEA MusicIntServer(PC),A1 MOVEQ #0,d0 JSR RemICRVector(A6) RTS ;---- Tempo ---- SetTempo MOVE.L CIAAbase(PC),D2 BEQ mt_Return CMP.W #32,D0 BHS.S setemsk MOVEQ #32,D0 setemsk MOVE.W D0,RealTempo MOVE.L TimerValue(PC),D2 DIVU D0,D2 MOVE.L CIAAaddr(PC),A4 MOVE.L TimerFlag(PC),D0 BEQ.S SetTemA MOVE.B D2,ciatblo(A4) LSR.W #8,D2 MOVE.B D2,ciatbhi(A4) RTS SetTemA MOVE.B D2,ciatalo(A4) LSR.W #8,D2 MOVE.B D2,ciatahi(A4) RTS RealTempo dc.w 125 CIAAaddr dc.l 0 CIAAname dc.b "ciaa.resource",0 CIAAbase dc.l 0 TimerFlag dc.l 0 TimerValue dc.l 0 GfxName dc.b "graphics.liBRAry",0,0 MusicIntServer dc.l 0,0 dc.b 2,5 ; type, priority dc.l musintname dc.l 0,mt_music musintname dc.b "Protracker MusicInt",0 ;---- Playroutine ---- n_note EQU 0 ; W n_cmd EQU 2 ; W n_cmdlo EQU 3 ; B n_start EQU 4 ; L n_length EQU 8 ; W n_loopstart EQU 10 ; L n_replen EQU 14 ; W n_period EQU 16 ; W n_finetune EQU 18 ; B n_volume EQU 19 ; B n_dmabit EQU 20 ; W n_toneportdirec EQU 22 ; B n_toneportspeed EQU 23 ; B n_wantedperiod EQU 24 ; W n_viBRAtocmd EQU 26 ; B n_viBRAtopos EQU 27 ; B n_tremolocmd EQU 28 ; B n_tremolopos EQU 29 ; B n_wavecontrol EQU 30 ; B n_glissfunk EQU 31 ; B n_sampleoffset EQU 32 ; B n_pattpos EQU 33 ; B n_loopcount EQU 34 ; B n_funkoffset EQU 35 ; B n_wavestart EQU 36 ; L n_reallength EQU 40 ; W mt_init ;LEA mt_data,A0 MOVE.L A0,mt_SongDataPtr MOVE.L A0,A1 LEA 952(A1),A1 MOVEQ #127,D0 MOVEQ #0,D1 MOVEQ #0,D2 mtloop MOVE.B (A1)+,D1 CMP.B D2,D1 BCS.S mtloop2 MOVE.L D1,D2 mtloop2 DBRA D0,mtloop ADDQ.B #1,D2 LEA mt_SampleStarts(PC),A1 ASL.L #8,D2 ASL.L #2,D2 ADD.L #1084,D2 ADD.L A0,D2 MOVE.L D2,A2 MOVEQ #30,D0 mtloop3 CLR.L (A2) MOVE.L A2,(A1)+ MOVEQ #0,D1 MOVE.W 42(A0),D1 ASL.L #1,D1 ADD.L D1,A2 ADD.L #30,A0 DBRA D0,mtloop3 OR.B #2,$BFE001 MOVE.B #6,mt_speed CLR.B mt_counter CLR.B mt_SongPos CLR.W mt_PatternPos mt_end SF mt_Enable LEA $DFF000,A0 CLR.W $A8(A0) CLR.W $B8(A0) CLR.W $C8(A0) CLR.W $D8(A0) MOVE.W #$F,$DFF096 RTS mt_music MOVEM.L D0-D4/A0-A6,-(SP) TST.B mt_Enable BEQ mt_exit ADDQ.B #1,mt_counter MOVE.B mt_counter(PC),D0 CMP.B mt_speed(PC),D0 BLO.S mt_NoNewNote CLR.B mt_counter TST.B mt_PattDelTime2 BEQ.S mt_GetNewNote BSR.S mt_NoNewAllChannels BRA mt_dskip mt_NoNewNote BSR.S mt_NoNewAllChannels BRA mt_NoNewPosYet mt_NoNewAllChannels LEA $DFF0A0,A5 LEA mt_chan1temp(PC),A6 BSR mt_CheckEfx LEA $DFF0B0,A5 LEA mt_chan2temp(PC),A6 BSR mt_CheckEfx LEA $DFF0C0,A5 LEA mt_chan3temp(PC),A6 BSR mt_CheckEfx LEA $DFF0D0,A5 LEA mt_chan4temp(PC),A6 BRA mt_CheckEfx mt_GetNewNote MOVE.L mt_SongDataPtr(PC),A0 LEA 12(A0),A3 LEA 952(A0),A2 ;pattpo LEA 1084(A0),A0 ;patterndata MOVEQ #0,D0 MOVEQ #0,D1 MOVE.B mt_SongPos(PC),D0 MOVE.B (A2,D0.W),D1 ASL.L #8,D1 ASL.L #2,D1 ADD.W mt_PatternPos(PC),D1 CLR.W mt_DMACONtemp LEA $DFF0A0,A5 LEA mt_chan1temp(PC),A6 BSR.S mt_PlayVoice LEA $DFF0B0,A5 LEA mt_chan2temp(PC),A6 BSR.S mt_PlayVoice LEA $DFF0C0,A5 LEA mt_chan3temp(PC),A6 BSR.S mt_PlayVoice LEA $DFF0D0,A5 LEA mt_chan4temp(PC),A6 BSR.S mt_PlayVoice BRA mt_SetDMA mt_PlayVoice TST.L (A6) BNE.S mt_plvskip BSR mt_PerNop mt_plvskip MOVE.L (A0,D1.L),(A6) ADDQ.L #4,D1 MOVEQ #0,D2 MOVE.B n_cmd(A6),D2 AND.B #$F0,D2 LSR.B #4,D2 MOVE.B (A6),D0 AND.B #$F0,D0 OR.B D0,D2 TST.B D2 BEQ mt_SetRegs MOVEQ #0,D3 LEA mt_SampleStarts(PC),A1 MOVE D2,D4 SUBQ.L #1,D2 ASL.L #2,D2 MULU #30,D4 MOVE.L (A1,D2.L),n_start(A6) MOVE.W (A3,D4.L),n_length(A6) MOVE.W (A3,D4.L),n_reallength(A6) MOVE.B 2(A3,D4.L),n_finetune(A6) MOVE.B 3(A3,D4.L),n_volume(A6) MOVE.W 4(A3,D4.L),D3 ; Get repeat TST.W D3 BEQ.S mt_NoLoop MOVE.L n_start(A6),D2 ; Get start ASL.W #1,D3 ADD.L D3,D2 ; Add repeat MOVE.L D2,n_loopstart(A6) MOVE.L D2,n_wavestart(A6) MOVE.W 4(A3,D4.L),D0 ; Get repeat ADD.W 6(A3,D4.L),D0 ; Add replen MOVE.W D0,n_length(A6) MOVE.W 6(A3,D4.L),n_replen(A6) ; Save replen MOVEQ #0,D0 MOVE.B n_volume(A6),D0 MOVE.W D0,8(A5) ; Set volume BRA.S mt_SetRegs mt_NoLoop MOVE.L n_start(A6),D2 ADD.L D3,D2 MOVE.L D2,n_loopstart(A6) MOVE.L D2,n_wavestart(A6) MOVE.W 6(A3,D4.L),n_replen(A6) ; Save replen MOVEQ #0,D0 MOVE.B n_volume(A6),D0 MOVE.W D0,8(A5) ; Set volume mt_SetRegs MOVE.W (A6),D0 AND.W #$0FFF,D0 BEQ mt_CheckMoreEfx ; If no note MOVE.W 2(A6),D0 AND.W #$0FF0,D0 CMP.W #$0E50,D0 BEQ.S mt_DoSetFineTune MOVE.B 2(A6),D0 AND.B #$0F,D0 CMP.B #3,D0 ; TonePortamento BEQ.S mt_ChkTonePorta CMP.B #5,D0 BEQ.S mt_ChkTonePorta CMP.B #9,D0 ; Sample Offset BNE.S mt_SetPeriod BSR mt_CheckMoreEfx BRA.S mt_SetPeriod mt_DoSetFineTune BSR mt_SetFineTune BRA.S mt_SetPeriod mt_ChkTonePorta BSR mt_SetTonePorta BRA mt_CheckMoreEfx mt_SetPeriod MOVEM.L D0-D1/A0-A1,-(SP) MOVE.W (A6),D1 AND.W #$0FFF,D1 LEA mt_PeriodTable(PC),A1 MOVEQ #0,D0 MOVEQ #35,D2 mt_ftuloop CMP.W (A1,D0.W),D1 BHS.S mt_ftufound ADDQ.L #2,D0 DBRA D2,mt_ftuloop mt_ftufound MOVEQ #0,D1 MOVE.B n_finetune(A6),D1 MULU #36*2,D1 ADD.L D1,A1 MOVE.W (A1,D0.W),n_period(A6) MOVEM.L (SP)+,D0-D1/A0-A1 MOVE.W 2(A6),D0 AND.W #$0FF0,D0 CMP.W #$0ED0,D0 ; Notedelay BEQ mt_CheckMoreEfx ; MOVE.W n_dmabit(A6),$DFF096 BTST #2,n_wavecontrol(A6) BNE.S mt_vibnoc CLR.B n_viBRAtopos(A6) mt_vibnoc BTST #6,n_wavecontrol(A6) BNE.S mt_trenoc CLR.B n_tremolopos(A6) mt_trenoc MOVE.L n_start(A6),(A5) ; Set start MOVE.W n_length(A6),4(A5) ; Set length ; MOVE.W n_period(A6),6(A5) ; Set period MOVE.W n_dmabit(A6),D0 OR.W D0,mt_DMACONtemp BRA mt_CheckMoreEfx mt_SetDMA MOVE.W mt_DMACONtemp(PC),D0 BSR mt_PlaySamples ; this does the magic LEA $DFF000,A5 LEA mt_chan1temp(PC),A6 MOVE.L n_loopstart(A6),$A0(A5) MOVE.W n_replen(A6),$A4(A5) LEA mt_chan2temp(PC),A6 MOVE.L n_loopstart(A6),$B0(A5) MOVE.W n_replen(A6),$B4(A5) LEA mt_chan3temp(PC),A6 MOVE.L n_loopstart(A6),$C0(A5) MOVE.W n_replen(A6),$C4(A5) LEA mt_chan4temp(PC),A6 MOVE.L n_loopstart(A6),$D0(A5) MOVE.W n_replen(A6),$D4(A5) mt_dskip ADD.W #16,mt_PatternPos MOVE.B mt_PattDelTime,D0 BEQ.S mt_dskc MOVE.B D0,mt_PattDelTime2 CLR.B mt_PattDelTime mt_dskc TST.B mt_PattDelTime2 BEQ.S mt_dska SUBQ.B #1,mt_PattDelTime2 BEQ.S mt_dska SUB.W #16,mt_PatternPos mt_dska TST.B mt_PBreakFlag BEQ.S mt_nnpysk SF mt_PBreakFlag MOVEQ #0,D0 MOVE.B mt_PBreakPos(PC),D0 CLR.B mt_PBreakPos LSL.W #4,D0 MOVE.W D0,mt_PatternPos mt_nnpysk CMP.W #1024,mt_PatternPos BLO.S mt_NoNewPosYet mt_NextPosition MOVEQ #0,D0 MOVE.B mt_PBreakPos(PC),D0 LSL.W #4,D0 MOVE.W D0,mt_PatternPos CLR.B mt_PBreakPos CLR.B mt_PosJumpFlag ADDQ.B #1,mt_SongPos AND.B #$7F,mt_SongPos MOVE.B mt_SongPos(PC),D1 MOVE.L mt_SongDataPtr(PC),A0 CMP.B 950(A0),D1 BLO.S mt_NoNewPosYet CLR.B mt_SongPos mt_NoNewPosYet TST.B mt_PosJumpFlag BNE.S mt_NextPosition mt_exit MOVEM.L (SP)+,D0-D4/A0-A6 RTS ; ; busywait-fixed by Delirium Softdesign. ; ; the old routine wasted about 2*10 rasterlines, this routine needs 2-8 lines ; (depending on the module). It was tested on an A500/A3000/A4000 and seems to ; play all modules ok. BTW, using this new technique it should be no problem ; to fix the busywait-loops of almost every other replay ! ; ; known bugs: ; ; sometimes when a module starts playing and the first note is played on ; a channel, the routine needs ~100 rasterlines (in the mt_Wait2 loop). ; perhaps this is a dma problem ? ; ; if you know how to fix these bugs please contact me: ; kunath@informatik.tu-muenchen.de (Peter Kunath) ; mt_PlaySamples movem.l d0-d2/a5-a6,-(sp) lea $DFF000,a5 move.w d0,d2 move.b $06(a5),d0 ; wait until end of line ; move.w #$0ff,$180(a5) mt_Wait1 cmp.b $06(a5),d0 ; the wait should be enough even on beq.s mt_Wait1 ; an A4000 running DBLPAL screenmode mt_MaxPer0 btst #0,d2 beq.s mt_MaxPer1 move.w #1,$A6(a5) ; max. speed mt_MaxPer1 btst #1,d2 beq.s mt_MaxPer2 move.w #1,$B6(a5) ; max. speed mt_MaxPer2 btst #2,d2 beq.s mt_MaxPer3 move.w #1,$C6(a5) ; max. speed mt_MaxPer3 btst #3,d2 beq.s mt_MaxPer4 move.w #1,$D6(a5) ; max. speed mt_MaxPer4 move.w $02(a5),d0 ; get active channels and.w d2,d0 move.w d0,d1 lsl.w #7,d0 move.w d0,$9C(a5) ; stop channels move.w d1,$96(a5) ; move.w #$f00,$180(a5) mt_Wait2 move.w $1E(a5),d1 ; wait until all channels are stopped and.w d0,d1 cmp.w d0,d1 bne.s mt_Wait2 move.w $02(a5),d0 ; get active channels not.w d0 and.w d2,d0 move.w d0,d1 lsl.w #7,d0 move.w d0,$9C(a5) or.w #$8000,d1 move.w d1,$96(a5) ; start channels ; move.w #$0f0,$180(a5) mt_Wait3 move.w $1E(a5),d1 ; wait until all channels are running and.w d0,d1 cmp.w d0,d1 bne.s mt_Wait3 move.b $06(a5),d0 ; wait until end of line ; move.w #$00f,$180(a5) mt_Wait4 cmp.b $06(a5),d0 ; the wait should be enough even on beq.s mt_Wait4 ; an A4000 running DBLPAL screenmode mt_SetPer0 btst #0,d2 beq.s mt_SetPer1 lea mt_chan1temp(pc),a6 move.w n_period(a6),$A6(a5) mt_SetPer1 btst #1,d2 beq.s mt_SetPer2 lea mt_chan2temp(pc),a6 move.w n_period(a6),$B6(a5) mt_SetPer2 btst #2,d2 beq.s mt_SetPer3 lea mt_chan3temp(pc),a6 move.w n_period(a6),$C6(a5) mt_SetPer3 btst #3,d2 beq.s mt_SetPer4 lea mt_chan4temp(pc),a6 move.w n_period(a6),$D6(a5) mt_SetPer4 ; move.w #$000,$180(a5) movem.l (sp)+,d0-d2/a5-a6 rts mt_CheckEfx BSR mt_UpdateFunk MOVE.W n_cmd(A6),D0 AND.W #$0FFF,D0 BEQ.S mt_PerNop MOVE.B n_cmd(A6),D0 AND.B #$0F,D0 BEQ.S mt_Arpeggio CMP.B #1,D0 BEQ mt_PortaUp CMP.B #2,D0 BEQ mt_PortaDown CMP.B #3,D0 BEQ mt_TonePortamento CMP.B #4,D0 BEQ mt_ViBRAto CMP.B #5,D0 BEQ mt_TonePlusVolSlide CMP.B #6,D0 BEQ mt_ViBRAtoPlusVolSlide CMP.B #$E,D0 BEQ mt_E_Commands SetBack MOVE.W n_period(A6),6(A5) CMP.B #7,D0 BEQ mt_Tremolo CMP.B #$A,D0 BEQ mt_VolumeSlide mt_Return RTS mt_PerNop MOVE.W n_period(A6),6(A5) RTS mt_Arpeggio MOVEQ #0,D0 MOVE.B mt_counter(PC),D0 DIVS #3,D0 SWAP D0 CMP.W #0,D0 BEQ.S mt_Arpeggio2 CMP.W #2,D0 BEQ.S mt_Arpeggio1 MOVEQ #0,D0 MOVE.B n_cmdlo(A6),D0 LSR.B #4,D0 BRA.S mt_Arpeggio3 mt_Arpeggio1 MOVEQ #0,D0 MOVE.B n_cmdlo(A6),D0 AND.B #15,D0 BRA.S mt_Arpeggio3 mt_Arpeggio2 MOVE.W n_period(A6),D2 BRA.S mt_Arpeggio4 mt_Arpeggio3 ASL.W #1,D0 MOVEQ #0,D1 MOVE.B n_finetune(A6),D1 MULU #36*2,D1 LEA mt_PeriodTable(PC),A0 ADD.L D1,A0 MOVEQ #0,D1 MOVE.W n_period(A6),D1 MOVEQ #35,D3 mt_arploop MOVE.W (A0,D0.W),D2 CMP.W (A0),D1 BHS.S mt_Arpeggio4 ADDQ.L #2,A0 DBRA D3,mt_arploop RTS mt_Arpeggio4 MOVE.W D2,6(A5) RTS mt_FinePortaUp TST.B mt_counter BNE.S mt_Return MOVE.B #$0F,mt_LowMask mt_PortaUp MOVEQ #0,D0 MOVE.B n_cmdlo(A6),D0 AND.B mt_LowMask(PC),D0 MOVE.B #$FF,mt_LowMask SUB.W D0,n_period(A6) MOVE.W n_period(A6),D0 AND.W #$0FFF,D0 CMP.W #113,D0 BPL.S mt_PortaUskip AND.W #$F000,n_period(A6) OR.W #113,n_period(A6) mt_PortaUskip MOVE.W n_period(A6),D0 AND.W #$0FFF,D0 MOVE.W D0,6(A5) RTS mt_FinePortaDown TST.B mt_counter BNE mt_Return MOVE.B #$0F,mt_LowMask mt_PortaDown CLR.W D0 MOVE.B n_cmdlo(A6),D0 AND.B mt_LowMask(PC),D0 MOVE.B #$FF,mt_LowMask ADD.W D0,n_period(A6) MOVE.W n_period(A6),D0 AND.W #$0FFF,D0 CMP.W #856,D0 BMI.S mt_PortaDskip AND.W #$F000,n_period(A6) OR.W #856,n_period(A6) mt_PortaDskip MOVE.W n_period(A6),D0 AND.W #$0FFF,D0 MOVE.W D0,6(A5) RTS mt_SetTonePorta MOVE.L A0,-(SP) MOVE.W (A6),D2 AND.W #$0FFF,D2 MOVEQ #0,D0 MOVE.B n_finetune(A6),D0 MULU #36*2,D0 LEA mt_PeriodTable(PC),A0 ADD.L D0,A0 MOVEQ #0,D0 mt_StpLoop CMP.W (A0,D0.W),D2 BHS.S mt_StpFound ADDQ.W #2,D0 CMP.W #36*2,D0 BLO.S mt_StpLoop MOVEQ #35*2,D0 mt_StpFound MOVE.B n_finetune(A6),D2 AND.B #8,D2 BEQ.S mt_StpGoss TST.W D0 BEQ.S mt_StpGoss SUBQ.W #2,D0 mt_StpGoss MOVE.W (A0,D0.W),D2 MOVE.L (SP)+,A0 MOVE.W D2,n_wantedperiod(A6) MOVE.W n_period(A6),D0 CLR.B n_toneportdirec(A6) CMP.W D0,D2 BEQ.S mt_ClearTonePorta BGE mt_Return MOVE.B #1,n_toneportdirec(A6) RTS mt_ClearTonePorta CLR.W n_wantedperiod(A6) RTS mt_TonePortamento MOVE.B n_cmdlo(A6),D0 BEQ.S mt_TonePortNoChange MOVE.B D0,n_toneportspeed(A6) CLR.B n_cmdlo(A6) mt_TonePortNoChange TST.W n_wantedperiod(A6) BEQ mt_Return MOVEQ #0,D0 MOVE.B n_toneportspeed(A6),D0 TST.B n_toneportdirec(A6) BNE.S mt_TonePortaUp mt_TonePortaDown ADD.W D0,n_period(A6) MOVE.W n_wantedperiod(A6),D0 CMP.W n_period(A6),D0 BGT.S mt_TonePortaSetPer MOVE.W n_wantedperiod(A6),n_period(A6) CLR.W n_wantedperiod(A6) BRA.S mt_TonePortaSetPer mt_TonePortaUp SUB.W D0,n_period(A6) MOVE.W n_wantedperiod(A6),D0 CMP.W n_period(A6),D0 BLT.S mt_TonePortaSetPer MOVE.W n_wantedperiod(A6),n_period(A6) CLR.W n_wantedperiod(A6) mt_TonePortaSetPer MOVE.W n_period(A6),D2 MOVE.B n_glissfunk(A6),D0 AND.B #$0F,D0 BEQ.S mt_GlissSkip MOVEQ #0,D0 MOVE.B n_finetune(A6),D0 MULU #36*2,D0 LEA mt_PeriodTable(PC),A0 ADD.L D0,A0 MOVEQ #0,D0 mt_GlissLoop CMP.W (A0,D0.W),D2 BHS.S mt_GlissFound ADDQ.W #2,D0 CMP.W #36*2,D0 BLO.S mt_GlissLoop MOVEQ #35*2,D0 mt_GlissFound MOVE.W (A0,D0.W),D2 mt_GlissSkip MOVE.W D2,6(A5) ; Set period RTS mt_ViBRAto MOVE.B n_cmdlo(A6),D0 BEQ.S mt_ViBRAto2 MOVE.B n_viBRAtocmd(A6),D2 AND.B #$0F,D0 BEQ.S mt_vibskip AND.B #$F0,D2 OR.B D0,D2 mt_vibskip MOVE.B n_cmdlo(A6),D0 AND.B #$F0,D0 BEQ.S mt_vibskip2 AND.B #$0F,D2 OR.B D0,D2 mt_vibskip2 MOVE.B D2,n_viBRAtocmd(A6) mt_ViBRAto2 MOVE.B n_viBRAtopos(A6),D0 LEA mt_ViBRAtoTable(PC),A4 LSR.W #2,D0 AND.W #$001F,D0 MOVEQ #0,D2 MOVE.B n_wavecontrol(A6),D2 AND.B #$03,D2 BEQ.S mt_vib_sine LSL.B #3,D0 CMP.B #1,D2 BEQ.S mt_vib_rampdown MOVE.B #255,D2 BRA.S mt_vib_set mt_vib_rampdown TST.B n_viBRAtopos(A6) BPL.S mt_vib_rampdown2 MOVE.B #255,D2 SUB.B D0,D2 BRA.S mt_vib_set mt_vib_rampdown2 MOVE.B D0,D2 BRA.S mt_vib_set mt_vib_sine MOVE.B (A4,D0.W),D2 mt_vib_set MOVE.B n_viBRAtocmd(A6),D0 AND.W #15,D0 MULU D0,D2 LSR.W #7,D2 MOVE.W n_period(A6),D0 TST.B n_viBRAtopos(A6) BMI.S mt_ViBRAtoNeg ADD.W D2,D0 BRA.S mt_ViBRAto3 mt_ViBRAtoNeg SUB.W D2,D0 mt_ViBRAto3 MOVE.W D0,6(A5) MOVE.B n_viBRAtocmd(A6),D0 LSR.W #2,D0 AND.W #$003C,D0 ADD.B D0,n_viBRAtopos(A6) RTS mt_TonePlusVolSlide BSR mt_TonePortNoChange BRA mt_VolumeSlide mt_ViBRAtoPlusVolSlide BSR.S mt_ViBRAto2 BRA mt_VolumeSlide mt_Tremolo MOVE.B n_cmdlo(A6),D0 BEQ.S mt_Tremolo2 MOVE.B n_tremolocmd(A6),D2 AND.B #$0F,D0 BEQ.S mt_treskip AND.B #$F0,D2 OR.B D0,D2 mt_treskip MOVE.B n_cmdlo(A6),D0 AND.B #$F0,D0 BEQ.S mt_treskip2 AND.B #$0F,D2 OR.B D0,D2 mt_treskip2 MOVE.B D2,n_tremolocmd(A6) mt_Tremolo2 MOVE.B n_tremolopos(A6),D0 LEA mt_ViBRAtoTable(PC),A4 LSR.W #2,D0 AND.W #$001F,D0 MOVEQ #0,D2 MOVE.B n_wavecontrol(A6),D2 LSR.B #4,D2 AND.B #$03,D2 BEQ.S mt_tre_sine LSL.B #3,D0 CMP.B #1,D2 BEQ.S mt_tre_rampdown MOVE.B #255,D2 BRA.S mt_tre_set mt_tre_rampdown TST.B n_viBRAtopos(A6) BPL.S mt_tre_rampdown2 MOVE.B #255,D2 SUB.B D0,D2 BRA.S mt_tre_set mt_tre_rampdown2 MOVE.B D0,D2 BRA.S mt_tre_set mt_tre_sine MOVE.B (A4,D0.W),D2 mt_tre_set MOVE.B n_tremolocmd(A6),D0 AND.W #15,D0 MULU D0,D2 LSR.W #6,D2 MOVEQ #0,D0 MOVE.B n_volume(A6),D0 TST.B n_tremolopos(A6) BMI.S mt_TremoloNeg ADD.W D2,D0 BRA.S mt_Tremolo3 mt_TremoloNeg SUB.W D2,D0 mt_Tremolo3 BPL.S mt_TremoloSkip CLR.W D0 mt_TremoloSkip CMP.W #$40,D0 BLS.S mt_TremoloOk MOVE.W #$40,D0 mt_TremoloOk MOVE.W D0,8(A5) MOVE.B n_tremolocmd(A6),D0 LSR.W #2,D0 AND.W #$003C,D0 ADD.B D0,n_tremolopos(A6) RTS mt_SampleOffset MOVEQ #0,D0 MOVE.B n_cmdlo(A6),D0 BEQ.S mt_sononew MOVE.B D0,n_sampleoffset(A6) mt_sononew MOVE.B n_sampleoffset(A6),D0 LSL.W #7,D0 CMP.W n_length(A6),D0 BGE.S mt_sofskip SUB.W D0,n_length(A6) LSL.W #1,D0 ADD.L D0,n_start(A6) RTS mt_sofskip MOVE.W #$0001,n_length(A6) RTS mt_VolumeSlide MOVEQ #0,D0 MOVE.B n_cmdlo(A6),D0 LSR.B #4,D0 TST.B D0 BEQ.S mt_VolSlideDown mt_VolSlideUp ADD.B D0,n_volume(A6) CMP.B #$40,n_volume(A6) BMI.S mt_vsuskip MOVE.B #$40,n_volume(A6) mt_vsuskip MOVE.B n_volume(A6),D0 MOVE.W D0,8(A5) RTS mt_VolSlideDown MOVEQ #0,D0 MOVE.B n_cmdlo(A6),D0 AND.B #$0F,D0 mt_VolSlideDown2 SUB.B D0,n_volume(A6) BPL.S mt_vsdskip CLR.B n_volume(A6) mt_vsdskip MOVE.B n_volume(A6),D0 MOVE.W D0,8(A5) RTS mt_PositionJump MOVE.B n_cmdlo(A6),D0 SUBQ.B #1,D0 MOVE.B D0,mt_SongPos mt_pj2 CLR.B mt_PBreakPos ST mt_PosJumpFlag RTS mt_VolumeChange MOVEQ #0,D0 MOVE.B n_cmdlo(A6),D0 CMP.B #$40,D0 BLS.S mt_VolumeOk MOVEQ #$40,D0 mt_VolumeOk MOVE.B D0,n_volume(A6) MOVE.W D0,8(A5) RTS mt_PatternBreak MOVEQ #0,D0 MOVE.B n_cmdlo(A6),D0 MOVE.L D0,D2 LSR.B #4,D0 MULU #10,D0 AND.B #$0F,D2 ADD.B D2,D0 CMP.B #63,D0 BHI.S mt_pj2 MOVE.B D0,mt_PBreakPos ST mt_PosJumpFlag RTS mt_SetSpeed MOVEQ #0,D0 MOVE.B 3(A6),D0 BEQ mt_end CMP.B #32,D0 BHS SetTempo CLR.B mt_counter MOVE.B D0,mt_speed RTS mt_CheckMoreEfx BSR mt_UpdateFunk MOVE.B 2(A6),D0 AND.B #$0F,D0 CMP.B #$9,D0 BEQ mt_SampleOffset CMP.B #$B,D0 BEQ mt_PositionJump CMP.B #$D,D0 BEQ.S mt_PatternBreak CMP.B #$E,D0 BEQ.S mt_E_Commands CMP.B #$F,D0 BEQ.S mt_SetSpeed CMP.B #$C,D0 BEQ mt_VolumeChange BRA mt_PerNop mt_E_Commands MOVE.B n_cmdlo(A6),D0 AND.B #$F0,D0 LSR.B #4,D0 BEQ.S mt_FilterOnOff CMP.B #1,D0 BEQ mt_FinePortaUp CMP.B #2,D0 BEQ mt_FinePortaDown CMP.B #3,D0 BEQ.S mt_SetGlissControl CMP.B #4,D0 BEQ mt_SetViBRAtoControl CMP.B #5,D0 BEQ mt_SetFineTune CMP.B #6,D0 BEQ mt_JumpLoop CMP.B #7,D0 BEQ mt_SetTremoloControl CMP.B #9,D0 BEQ mt_RetrigNote CMP.B #$A,D0 BEQ mt_VolumeFineUp CMP.B #$B,D0 BEQ mt_VolumeFineDown CMP.B #$C,D0 BEQ mt_NoteCut CMP.B #$D,D0 BEQ mt_NoteDelay CMP.B #$E,D0 BEQ mt_PatternDelay CMP.B #$F,D0 BEQ mt_FunkIt RTS mt_FilterOnOff MOVE.B n_cmdlo(A6),D0 AND.B #1,D0 ASL.B #1,D0 AND.B #$FD,$BFE001 OR.B D0,$BFE001 RTS mt_SetGlissControl MOVE.B n_cmdlo(A6),D0 AND.B #$0F,D0 AND.B #$F0,n_glissfunk(A6) OR.B D0,n_glissfunk(A6) RTS mt_SetViBRAtoControl MOVE.B n_cmdlo(A6),D0 AND.B #$0F,D0 AND.B #$F0,n_wavecontrol(A6) OR.B D0,n_wavecontrol(A6) RTS mt_SetFineTune MOVE.B n_cmdlo(A6),D0 AND.B #$0F,D0 MOVE.B D0,n_finetune(A6) RTS mt_JumpLoop TST.B mt_counter BNE mt_Return MOVE.B n_cmdlo(A6),D0 AND.B #$0F,D0 BEQ.S mt_SetLoop TST.B n_loopcount(A6) BEQ.S mt_jumpcnt SUBQ.B #1,n_loopcount(A6) BEQ mt_Return mt_jmploop MOVE.B n_pattpos(A6),mt_PBreakPos ST mt_PBreakFlag RTS mt_jumpcnt MOVE.B D0,n_loopcount(A6) BRA.S mt_jmploop mt_SetLoop MOVE.W mt_PatternPos(PC),D0 LSR.W #4,D0 MOVE.B D0,n_pattpos(A6) RTS mt_SetTremoloControl MOVE.B n_cmdlo(A6),D0 AND.B #$0F,D0 LSL.B #4,D0 AND.B #$0F,n_wavecontrol(A6) OR.B D0,n_wavecontrol(A6) RTS mt_RetrigNote MOVE.L D1,-(SP) MOVEQ #0,D0 MOVE.B n_cmdlo(A6),D0 AND.B #$0F,D0 BEQ.S mt_rtnend MOVEQ #0,D1 MOVE.B mt_counter(PC),D1 BNE.S mt_rtnskp MOVE.W (A6),D1 AND.W #$0FFF,D1 BNE.S mt_rtnend MOVEQ #0,D1 MOVE.B mt_counter(PC),D1 mt_rtnskp DIVU D0,D1 SWAP D1 TST.W D1 BNE.S mt_rtnend mt_DoRetrig ; MOVE.W n_dmabit(A6),$DFF096 ; Channel DMA off MOVE.L n_start(A6),(A5) ; Set sampledata pointer MOVE.W n_length(A6),4(A5) ; Set length MOVE.W n_dmabit(A6),D0 BSR mt_PlaySamples ; this does the magic MOVE.L n_loopstart(A6),(A5) MOVE.L n_replen(A6),4(A5) mt_rtnend MOVE.L (SP)+,D1 RTS mt_VolumeFineUp TST.B mt_counter BNE mt_Return MOVEQ #0,D0 MOVE.B n_cmdlo(A6),D0 AND.B #$F,D0 BRA mt_VolSlideUp mt_VolumeFineDown TST.B mt_counter BNE mt_Return MOVEQ #0,D0 MOVE.B n_cmdlo(A6),D0 AND.B #$0F,D0 BRA mt_VolSlideDown2 mt_NoteCut MOVEQ #0,D0 MOVE.B n_cmdlo(A6),D0 AND.B #$0F,D0 CMP.B mt_counter(PC),D0 BNE mt_Return CLR.B n_volume(A6) MOVE.W #0,8(A5) RTS mt_NoteDelay MOVEQ #0,D0 MOVE.B n_cmdlo(A6),D0 AND.B #$0F,D0 CMP.B mt_counter,D0 BNE mt_Return MOVE.W (A6),D0 BEQ mt_Return MOVE.L D1,-(SP) BRA mt_DoRetrig mt_PatternDelay TST.B mt_counter BNE mt_Return MOVEQ #0,D0 MOVE.B n_cmdlo(A6),D0 AND.B #$0F,D0 TST.B mt_PattDelTime2 BNE mt_Return ADDQ.B #1,D0 MOVE.B D0,mt_PattDelTime RTS mt_FunkIt TST.B mt_counter BNE mt_Return MOVE.B n_cmdlo(A6),D0 AND.B #$0F,D0 LSL.B #4,D0 AND.B #$0F,n_glissfunk(A6) OR.B D0,n_glissfunk(A6) TST.B D0 BEQ mt_Return mt_UpdateFunk MOVEM.L A0/D1,-(SP) MOVEQ #0,D0 MOVE.B n_glissfunk(A6),D0 LSR.B #4,D0 BEQ.S mt_funkend LEA mt_FunkTable(PC),A0 MOVE.B (A0,D0.W),D0 ADD.B D0,n_funkoffset(A6) BTST #7,n_funkoffset(A6) BEQ.S mt_funkend CLR.B n_funkoffset(A6) MOVE.L n_loopstart(A6),D0 MOVEQ #0,D1 MOVE.W n_replen(A6),D1 ADD.L D1,D0 ADD.L D1,D0 MOVE.L n_wavestart(A6),A0 ADDQ.L #1,A0 CMP.L D0,A0 BLO.S mt_funkok MOVE.L n_loopstart(A6),A0 mt_funkok MOVE.L A0,n_wavestart(A6) MOVEQ #-1,D0 SUB.B (A0),D0 MOVE.B D0,(A0) mt_funkend MOVEM.L (SP)+,A0/D1 RTS mt_FunkTable dc.b 0,5,6,7,8,10,11,13,16,19,22,26,32,43,64,128 mt_ViBRAtoTable dc.b 0, 24, 49, 74, 97,120,141,161 dc.b 180,197,212,224,235,244,250,253 dc.b 255,253,250,244,235,224,212,197 dc.b 180,161,141,120, 97, 74, 49, 24 mt_PeriodTable ; Tuning 0, Normal dc.w 856,808,762,720,678,640,604,570,538,508,480,453 dc.w 428,404,381,360,339,320,302,285,269,254,240,226 dc.w 214,202,190,180,170,160,151,143,135,127,120,113 ; Tuning 1 dc.w 850,802,757,715,674,637,601,567,535,505,477,450 dc.w 425,401,379,357,337,318,300,284,268,253,239,225 dc.w 213,201,189,179,169,159,150,142,134,126,119,113 ; Tuning 2 dc.w 844,796,752,709,670,632,597,563,532,502,474,447 dc.w 422,398,376,355,335,316,298,282,266,251,237,224 dc.w 211,199,188,177,167,158,149,141,133,125,118,112 ; Tuning 3 dc.w 838,791,746,704,665,628,592,559,528,498,470,444 dc.w 419,395,373,352,332,314,296,280,264,249,235,222 dc.w 209,198,187,176,166,157,148,140,132,125,118,111 ; Tuning 4 dc.w 832,785,741,699,660,623,588,555,524,495,467,441 dc.w 416,392,370,350,330,312,294,278,262,247,233,220 dc.w 208,196,185,175,165,156,147,139,131,124,117,110 ; Tuning 5 dc.w 826,779,736,694,655,619,584,551,520,491,463,437 dc.w 413,390,368,347,328,309,292,276,260,245,232,219 dc.w 206,195,184,174,164,155,146,138,130,123,116,109 ; Tuning 6 dc.w 820,774,730,689,651,614,580,547,516,487,460,434 dc.w 410,387,365,345,325,307,290,274,258,244,230,217 dc.w 205,193,183,172,163,154,145,137,129,122,115,109 ; Tuning 7 dc.w 814,768,725,684,646,610,575,543,513,484,457,431 dc.w 407,384,363,342,323,305,288,272,256,242,228,216 dc.w 204,192,181,171,161,152,144,136,128,121,114,108 ; Tuning -8 dc.w 907,856,808,762,720,678,640,604,570,538,508,480 dc.w 453,428,404,381,360,339,320,302,285,269,254,240 dc.w 226,214,202,190,180,170,160,151,143,135,127,120 ; Tuning -7 dc.w 900,850,802,757,715,675,636,601,567,535,505,477 dc.w 450,425,401,379,357,337,318,300,284,268,253,238 dc.w 225,212,200,189,179,169,159,150,142,134,126,119 ; Tuning -6 dc.w 894,844,796,752,709,670,632,597,563,532,502,474 dc.w 447,422,398,376,355,335,316,298,282,266,251,237 dc.w 223,211,199,188,177,167,158,149,141,133,125,118 ; Tuning -5 dc.w 887,838,791,746,704,665,628,592,559,528,498,470 dc.w 444,419,395,373,352,332,314,296,280,264,249,235 dc.w 222,209,198,187,176,166,157,148,140,132,125,118 ; Tuning -4 dc.w 881,832,785,741,699,660,623,588,555,524,494,467 dc.w 441,416,392,370,350,330,312,294,278,262,247,233 dc.w 220,208,196,185,175,165,156,147,139,131,123,117 ; Tuning -3 dc.w 875,826,779,736,694,655,619,584,551,520,491,463 dc.w 437,413,390,368,347,328,309,292,276,260,245,232 dc.w 219,206,195,184,174,164,155,146,138,130,123,116 ; Tuning -2 dc.w 868,820,774,730,689,651,614,580,547,516,487,460 dc.w 434,410,387,365,345,325,307,290,274,258,244,230 dc.w 217,205,193,183,172,163,154,145,137,129,122,115 ; Tuning -1 dc.w 862,814,768,725,684,646,610,575,543,513,484,457 dc.w 431,407,384,363,342,323,305,288,272,256,242,228 dc.w 216,203,192,181,171,161,152,144,136,128,121,114 mt_chan1temp dc.l 0,0,0,0,0,$00010000,0, 0,0,0,0 mt_chan2temp dc.l 0,0,0,0,0,$00020000,0, 0,0,0,0 mt_chan3temp dc.l 0,0,0,0,0,$00040000,0, 0,0,0,0 mt_chan4temp dc.l 0,0,0,0,0,$00080000,0, 0,0,0,0 mt_SampleStarts dc.l 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 dc.l 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 mt_SongDataPtr dc.l 0 mt_speed dc.b 6 mt_counter dc.b 0 mt_SongPos dc.b 0 mt_PBreakPos dc.b 0 mt_PosJumpFlag dc.b 0 mt_PBreakFlag dc.b 0 mt_LowMask dc.b 0 mt_PattDelTime dc.b 0 mt_PattDelTime2 dc.b 0 mt_Enable dc.b 0 mt_PatternPos dc.w 0 mt_DMACONtemp dc.w 0 ;------------------------------------------------------------------------------ ;------------------------------------------------------------------------------ Gamefield incbin "Work:MyProjects/Game/GameFieldStuff/level1.gamefield" Gamefield2 incbin "Work:MyProjects/Game/GameFieldStuff/level2.gamefield" Gamefield3 incbin "Work:MyProjects/Game/GameFieldStuff/level3.gamefield" Coords1 incbin "Work:MyProjects/Game/Coords/Coords4" Coords2 incbin "Work:MyProjects/Game/Coords/3Coords2" Coords3 incbin "Work:MyProjects/Game/Coords/3Coords3" even Fontti incbin "Work:MyProjects/Game/BPL/Font" gfxname dc.b "graphics.liBRAry",0 intuiname dc.b "intuition.liBRAry",0 dosname dc.b "dos.liBRAry",0 vertname dc.b "Music interrupt",0 xwars dc.b "A?JOURNEY?TO?HOME",0 codingby dc.b "CODING?BY?MARKUS?KETOLA",0 musicby dc.b "MUSIC?BY?VARIOUS?PEOPLE",0 titlemusicby dc.b "TITLE?MUSIC?BY?CHIPPER",0 ingamemusicby dc.b "IN?GAME?MUSIC?BY?MERLIN?M",0 endmusicby dc.b "END?MUSIC?BY?HEATBEAT",0 press dc.b "PRESS?JOYSTICK?BUTTON?TO?PLAY",0 gameover dc.b "GAME?OVER",0 pressjoy dc.b "PRESS?JOYSTICK?BUTTON",0 udidit dc.b "YOU?DID?IT",0 leftmouse dc.b "PRESS?LEFT?MOUSEBUTTON?TO?EXIT",0 usejoy dc.b "USE?JOYSTICK?TO",0 type dc.b "TYPE?YOUR?INITIALS",0 even section Muuttujat,DATA intuibase dc.l 0 gfxbase dc.l 0 dosbase dc.l 0 ptbase dc.l 0 ;------------------------------------------------------------------------------ ; Räjähdystietue ; WORD Kehissä 0/1 ; WORD x ; WORD y ; WORD viive ; LONG Pointteri grafiikkadataan. Tämä on pelkkä lisäysarvo Explosions ds.b 12*20 dc.w -1 ; ExpVanhaSij0 rakenne ; LONG ClearScreen-osoite ; LONG Vanha sijainti -osoite ; WORD BLITSIZE ExpVanhaSij0 ds.b 10*20 ExpVanhaSij1 ds.b 10*20 ;------------------------------------------------------------------------------ ; Monsterin räjähdystietue ;------------------------------------------------------------------------------ ; WORD Kehissä 0/1 ; WORD x ; WORD y ; WORD viive ; LONG Pointteri grafiikkadataan, pelkkä lisäysarvo Monster_explosion ds.b 12 MExp_VanhaSij0 ds.b 10 MExp_VanhaSij1 ds.b 10 ;------------------------------------------------------------------------------ ; VanhaSijX:n rakenne: LONG,LONG,WORD ; 1.LONG: ClearScreen-addy, 2.LONG: Screen1/2-addy, WORD: BLTSIZE VanhaSij1 ds.w max_bobs+(4*max_bobs) VanhaSij2 ds.w max_bobs+(4*max_bobs) ;------------------------------------------------------------------------------ ; Rakenne: LONG,WORD ; LONG: Pointteri Coordinaatteihin, WORD: ON/OFF (1=ON, 0=OFF) ; WORD kestävyys, LONG pointteri bob-dataan, LONG pointteri mask-dataan ; Tässä versiossa kaikkien wordien pitää olla ykkösiä aluksi! PTRsAndONOFF ds.b 16*max_bobs ;------------------------------------------------------------------------------ ; Rakenne: LONG,LONG: ClearScreen(osoite),Vanhasijainti(osoite) VanhaESij1 ds.l (AmountEBullets+1)*2 VanhaESij2 ds.l (AmountEBullets+1)*2 ;------------------------------------------------------------------------------ ; Rakenne WORD,WORD=x,y. Jos x=-1,niin laaki ei ole liikenteessä (=vapaa) ; Aluksi kaikkien x:ien pitää olla -1!! EnemyLaakit ds.w (AmountEBullets+1)*2 ;------------------------------------------------------------------------------ ; (0,0,0)=Laaki kehissä/ei kehissä,x,y) Laakit ds.w (AmountBullets+1)*3 dc.w -1 ;------------------------------------------------------------------------------ ; Monster-tietue ; ; WORD MX ; WORD MY ; WORD Kestävyys ; WORD Laaki liikkeelä ; LONG Bullet X ; LONG Bullet Y ; LONG AddX ; LONG AddY ; WORD Laaki liikkeellä ; LONG Bullet X ; LONG Bullet Y ; LONG AddX ; LONG AddY ; WORD Laaki liikkeellä ; LONG Bullet X ; LONG Bullet Y ; LONG AddX ; LONG AddY ; LONG BobData ; LONG MaskData Monster ds.b 68 ;------------------------------------------------------------------------------ ; Unit rakenne. ; WORD Liikkellä 0/1 0 ; LONG UnitX 2 ; LONG UnitY 6 ; WORD Laaki liikkeellä 10 ; LONG Bullet X 12 ; LONG Bullet Y 16 ; LONG BulletAddX 20 ; LONG BulletAddY 24 ; LONG UnitBob 28 ; LONG UnitBobMask 32 ; LONG ExplodedUnit 36 ; LONG ExplodedUnitMask 40 ; WORD Kestävyys 44 ; WORD Liikkuvako 46 Jos 0, niin liikkuu vain 1.:set 16 pikseliä ;-------------------------- ; 48 Units ds.b 48*5 UnitsVanhaSij0 ds.b 10*5 UnitsVanhaSij1 ds.b 10*5 UnitsVBSij0 ds.b 10*5 UnitsVBSij1 ds.b 10*5 ; UnitLiikkeellä, unit x, unit y, laaki liikkeellä, bullet X, bullet Y, ; UnitClearScr, UnitVanhaSij, UnitBulletClearScr, UnitBulletVanhaSij, ; UnitBob, UnitMask ; ;------------------------------------------------------------------------------ ; Asteroids-tietue: Liikkeellä-merkki, x,y,speed, Kestävyys ; ; Tässä laitetaan 28 asteroidia ; Asteroids ds.w 5*28 VanhaAstSij0 ds.w 28+(4*28) VanhaAstSij1 ds.w 28+(4*28) ;------------------------------------------------------------------------------ ; Monsterille vanhasijaintistuff MonstVanhaSij0 ds.b 10 MonstVanhaSij1 ds.b 10 MonstBVanhaSij0 ds.b 30 MonstBVanhaSij1 ds.b 30 ;------------------------------------------------------------------------------ ScrollOffset dc.l (256+16+16)*4*32 LaakiPT dc.l 0 ; Missä kohtaa laakeja ollaan menossa Exp_PT dc.l 0 ; VanhaExpSij dc.l 0 MExp_vanhasij dc.l 0 UnitsVanhaSij dc.l 0 UnitsVBSij dc.l 0 VanhaAstSij dc.l 0 VanhaSij dc.l 0 ; Vihollisten vanha sijainti VanhaESij dc.l 0 ; Vihollisten laakien vanha sijainti MonsterVanhaSij dc.l 0 MonstBVanhaSij dc.l 0 coolfield dc.l 0 x dc.w 128 y dc.w 235 MX dc.w 32 MY dc.w -64 DX dc.w 1 Nr_of_asteroids dc.w 0 LineN dc.l 256 ; Blo(c)kin y-paikka Bl_paikka dc.l 0 ; Blo(c)kin x-paikka pt_toCoolF dc.l 0 ; 2048 pt_toClear dc.l 0 Coords dc.l 0 BitMap1 dc.l 0 BitMap2 dc.l 0 ClearScreen dc.l 0 ; Pelkästään scrollaava alue ShowScreen dc.l 0 DrawScreen dc.l 0 AttackWavePointer dc.l 0 monster dc.l 0 outfile dc.l 0 Random dc.w 0 Pisteet dc.w 0 wbenchmsg dc.l 0 oldview dc.l 0 process dc.l 0 processor dc.w 0 chiprev dc.b 0 level dc.b 1 LastCBFrames dc.b 0 Kumpainen dc.b 0 LameFrame dc.b 0 Frame dc.b 0 Laskuri dc.b 0 NPohjassa dc.b 0 AmEnemies dc.b 0 MovingEBullets dc.b 0 ; Liikkeellä olevien EnemyBullettien määrä energia dc.b 16 gameOver dc.b 0 DoLastCoordBobFrames dc.b 0 CoordBobsRunning dc.b 0 ; Ovatko koordinaativalmiit bobit liikkeellä nr_of_bobs dc.b 0 Asteroids_on_screen dc.b 0 AsteroidsRunning dc.b 0 LastAsteroidFrames dc.b 3 OwnBulletsOnScreen dc.b 0 NrOfOwnBullets dc.b 0 MonsterKehissa dc.b 0 Monster_destroyed dc.b 0 MExpFinished dc.b 0 LastMExpFrames dc.b 0 phase dc.b 0 delay dc.b 0 kierros dc.b 0 even viive dc.b 0 letterstyped dc.b 0 currentchar dc.b 'A' small_font dc.b 0 even bitmap dc.l 0 pt_Font dc.l 0 hiscoretable dc.l Nimi1 dc.w 12345 dc.l Nimi2 dc.w 2345 dc.l Nimi3 dc.w 345 dc.l Nimi4 dc.w 45 dc.l Nimi5 dc.w 5 Nimi1 dc.b "ABC",0 Nimi2 dc.b "DEF",0 Nimi3 dc.b "GHI",0 Nimi4 dc.b "JKL",0 Nimi5 dc.b "MNO",0 Nimi dc.b " ",0,0,0,0,0,0,0,0,0 Luku dc.b 0,0,0,0,0,0 LevelTXT dc.b "LEVEL?0",0,0 Number dc.b 0,0,0,0,0 even ; Vertical blanking -keskeytyksen strukture Vert_str: dc.l 0 ; Käyttis asettaa dc.l 0 ; dc.b 2 ; Nodetyyppi=NT_INTERRUPT dc.b 0 ; Priotiteetti dc.l vertname dc.l 0 ; Kesk.rut.lle tuleva tieto dc.l Keskeytysrutiini ; Kesk. alkuosoite section ChipData,DATA,CHIP Coolfield ds.b 5120*4 dc.l 999 ; Loppumerrki Coolfield2 ds.b 5120*4 dc.l 999 Coolfield3 ds.b 5120*4 dc.l 999 Dummy dc.l 0 ;EsBob incbin "Work:MyProjects/Game/BPL/NewEs.bob" ;EsMask incbin "Work:MyProjects/Game/BPL/NewEs.mask" RengasBob incbin "Work:MyProjects/Game/BPL/Rengas.bob" RengasMask incbin "Work:MyProjects/Game/BPL/Rengas.mask" ;UfoBob incbin "Work:MyProjects/Game/BPL/Ufo.bob" ;UfoMask incbin "Work:MyProjects/Game/BPL/Ufo.mask" ShipBob incbin "Work:MyProjects/Game/BPL/alus.bob" ShipMask incbin "Work:MyProjects/Game/BPL/alus.mask" WBob incbin "Work:MyProjects/Game/BPL/w.bob" WMask incbin "Work:MyProjects/Game/BPL/w.mask" ;ThreeShipBob incbin "Work:MyProjects/Game/BPL/3-osainen_alus.bob" ;ThreeShipMask incbin "Work:MyProjects/Game/BPL/3-osainen_alus.mask" Bob incbin "Work:MyProjects/Game/BPL/es.bob" Mask incbin "Work:MyProjects/Game/BPL/es.mask" ;LBob incbin "Work:MyProjects/Game/BPL/OmaLaaki.mask" EnBulletBob incbin "Work:MyProjects/Game/BPL/newEnemyBullet.bob" EnBulletMask incbin "Work:MyProjects/Game/BPL/newEnemyBullet.mask" Blocks incbin "Work:MyProjects/Game/BPL/4BPLBlocks" Unit incbin "Work:MyProjects/Game/BPL/Unit.bob" UnitMask incbin "Work:MyProjects/Game/BPL/Unit.mask" ExplodedUnit incbin "Work:MyProjects/Game/BPL/ExplodedUnit.bob" ExplodedUnitM incbin "Work:MyProjects/Game/BPL/ExplodedUnit.mask" AsteroidBob incbin "Work:MyProjects/Game/BPL/NewAsteroid.bob" AsteroidMask incbin "Work:MyProjects/Game/BPL/NewAsteroid.mask" Explosion incbin "Work:MyProjects/Game/BPL/Explosion8Frames" ExplosionMask incbin "Work:MyProjects/Game/BPL/Explosion8Frames.mask" MonsterBob incbin "Work:MyProjects/Game/BPL/Monster_draft_smaller.bob" MonsterMask incbin "Work:MyProjects/Game/BPL/Monster_draft_smaller.mask" MonsterBullet incbin "Work:MyProjects/Game/BPL/Monster_bullet.bob" MonsterBulMask incbin "Work:MyProjects/Game/BPL/Monster_bullet.mask" MonsterExplosionBob incbin "Work:MyProjects/Game/BPL/Monster_explosion_smaller_2.bo" MonsterExplosionMask incbin "Work:MyProjects/Game/BPL/Monster_explosion_smaller_2.ma" Monster2Bob incbin "Work:MyProjects/Game/BPL/Monster2_draft_smaller.bob" Monster3Bob incbin "Work:MyProjects/Game/BPL/Monster3_draft_smaller.bob" Score incbin "Work:MyProjects/Game/BPL/NewScore" ScoreMask incbin "Work:MyProjects/Game/BPL/NewScore.mask" Numbers incbin "Work:MyProjects/Game/BPL/NewNumbers" NumbersMask incbin "Work:MyProjects/Game/BPL/NewNumbers.mask" even CopperLista dc.w $00e0 high1 dc.w $0000 dc.w $00e2 low1 dc.w $0000 dc.w $00e4 high2 dc.w $0000 dc.w $00e6 low2 dc.w $0000 dc.w $00e8 high3 dc.w $0000 dc.w $00ea low3 dc.w $0000 dc.w $00ec high4 dc.w $0000 dc.w $00ee low4 dc.w $0000 dc.w $0100,$4200 dc.w $0102,$0000 dc.w $0108,$0060 dc.w $010a,$0060 dc.w $0092,$0048 dc.w $0094,$00c0 dc.w $008e,$2c81 dc.w $0090,$2ca1 dc.w $0120 s0_high dc.w $0000 dc.w $0122 s0_low: dc.w $0000 dc.w $0124 s1_high dc.w $0000 dc.w $0126 s1_low: dc.w $0000 dc.w $0128 s2_high dc.w $0000 dc.w $012a s2_low dc.w $0000 empty dc.w $012c dc.w $0000 dc.w $012e dc.w $0000 dc.w $0130 dc.w $0000 dc.w $0132 dc.w $0000 dc.w $0134 dc.w $0000 dc.w $0136 dc.w $0000 dc.w $0138 dc.w $0000 dc.w $013a dc.w $0000 dc.w $013c,$0000 dc.w $013e,$0000 Colours dc.w $0182,$0000 dc.w $0184,$0000 dc.w $0186,$0000 dc.w $0188,$0000 dc.w $018a,$0000 dc.w $018c,$0000 dc.w $018e,$0000 dc.w $0190,$0000 dc.w $0192,$0000 dc.w $0194,$0000 dc.w $0196,$0000 dc.w $0198,$0000 dc.w $019a,$0000 dc.w $019c,$0000 dc.w $019e,$0000 ; Energiapalkin värit dc.w $3101,$ff00,$01aa,$0ff0 dc.w $3201,$ff00,$01aa,$0cf0 dc.w $3301,$ff00,$01aa,$09f0 dc.w $3401,$ff00,$01aa,$06f0 dc.w $3501,$ff00,$01aa,$03f0 dc.w $3601,$ff00,$01aa,$00f0 dc.w $3701,$ff00,$01aa,$00f3 dc.w $3801,$ff00,$01aa,$00f6 dc.w $3901,$ff00,$01aa,$00f9 dc.w $3a01,$ff00,$01aa,$00fc dc.w $3b01,$ff00,$01aa,$00ff dc.w $3c01,$ff00,$01aa,$00cf dc.w $3d01,$ff00,$01aa,$009f dc.w $3e01,$ff00,$01aa,$006f dc.w $3f01,$ff00,$01aa,$003f dc.w $4001,$ff00,$01aa,$000f ; dc.w $4101,$ff00,$01aa,$0fff dc.w $ffff,$fffe SPR2 dc.l $00000000 dc.l $e0000000,$e0000000,$e0000000,$e0000000 dc.l $e0000000,$e0000000,$e0000000,$e0000000 dc.l $e0000000,$e0000000,$e0000000,$e0000000 dc.l $e0000000,$e0000000,$e0000000,$e0000000 dc.l $00000000 ; Aluksi oma sprite-alus, sitten spritelaakit (30) SPR1 dc.w $0000,$0000,$0100,$0000,$4284,$0180,$A28A,$6186,$A44A,$63C6,$A44A,$63C6,$A92A,$66E6,$AAAA,$65E6,$B29A,$6DF6 dc.w $B45A,$6BF6,$B55A,$6BF6,$B55A,$6AF6,$B45A,$6BF6,$F7DE,$2872,$1010,$0FF0,$1FF0,$0010,$0000,$0000 SPR0 dc.w $0000,$0000,$2000,$0000,$5000,$3000,$5000,$3000,$5000,$3000,$8800,$7800,$8800,$7800,$8800,$7800,$7000,$7000 dc.w $0000,$0000,$2000,$0000,$5000,$3000,$5000,$3000,$5000,$3000,$8800,$7800,$8800,$7800,$8800,$7800,$7000,$7000 dc.w $0000,$0000,$2000,$0000,$5000,$3000,$5000,$3000,$5000,$3000,$8800,$7800,$8800,$7800,$8800,$7800,$7000,$7000 dc.w $0000,$0000,$2000,$0000,$5000,$3000,$5000,$3000,$5000,$3000,$8800,$7800,$8800,$7800,$8800,$7800,$7000,$7000 dc.w $0000,$0000,$2000,$0000,$5000,$3000,$5000,$3000,$5000,$3000,$8800,$7800,$8800,$7800,$8800,$7800,$7000,$7000 dc.w $0000,$0000,$2000,$0000,$5000,$3000,$5000,$3000,$5000,$3000,$8800,$7800,$8800,$7800,$8800,$7800,$7000,$7000 dc.w $0000,$0000,$2000,$0000,$5000,$3000,$5000,$3000,$5000,$3000,$8800,$7800,$8800,$7800,$8800,$7800,$7000,$7000 dc.w $0000,$0000,$2000,$0000,$5000,$3000,$5000,$3000,$5000,$3000,$8800,$7800,$8800,$7800,$8800,$7800,$7000,$7000 dc.w $0000,$0000,$2000,$0000,$5000,$3000,$5000,$3000,$5000,$3000,$8800,$7800,$8800,$7800,$8800,$7800,$7000,$7000 dc.w $0000,$0000,$2000,$0000,$5000,$3000,$5000,$3000,$5000,$3000,$8800,$7800,$8800,$7800,$8800,$7800,$7000,$7000 dc.w $0000,$0000,$2000,$0000,$5000,$3000,$5000,$3000,$5000,$3000,$8800,$7800,$8800,$7800,$8800,$7800,$7000,$7000 dc.w $0000,$0000,$2000,$0000,$5000,$3000,$5000,$3000,$5000,$3000,$8800,$7800,$8800,$7800,$8800,$7800,$7000,$7000 dc.w $0000,$0000,$2000,$0000,$5000,$3000,$5000,$3000,$5000,$3000,$8800,$7800,$8800,$7800,$8800,$7800,$7000,$7000 dc.w $0000,$0000,$2000,$0000,$5000,$3000,$5000,$3000,$5000,$3000,$8800,$7800,$8800,$7800,$8800,$7800,$7000,$7000 dc.w $0000,$0000,$2000,$0000,$5000,$3000,$5000,$3000,$5000,$3000,$8800,$7800,$8800,$7800,$8800,$7800,$7000,$7000 dc.w $0000,$0000,$2000,$0000,$5000,$3000,$5000,$3000,$5000,$3000,$8800,$7800,$8800,$7800,$8800,$7800,$7000,$7000 dc.w $0000,$0000,$2000,$0000,$5000,$3000,$5000,$3000,$5000,$3000,$8800,$7800,$8800,$7800,$8800,$7800,$7000,$7000 dc.w $0000,$0000,$2000,$0000,$5000,$3000,$5000,$3000,$5000,$3000,$8800,$7800,$8800,$7800,$8800,$7800,$7000,$7000 dc.w $0000,$0000,$2000,$0000,$5000,$3000,$5000,$3000,$5000,$3000,$8800,$7800,$8800,$7800,$8800,$7800,$7000,$7000 dc.w $0000,$0000,$2000,$0000,$5000,$3000,$5000,$3000,$5000,$3000,$8800,$7800,$8800,$7800,$8800,$7800,$7000,$7000 dc.w $0000,$0000,$2000,$0000,$5000,$3000,$5000,$3000,$5000,$3000,$8800,$7800,$8800,$7800,$8800,$7800,$7000,$7000 dc.w $0000,$0000,$2000,$0000,$5000,$3000,$5000,$3000,$5000,$3000,$8800,$7800,$8800,$7800,$8800,$7800,$7000,$7000 dc.w $0000,$0000,$2000,$0000,$5000,$3000,$5000,$3000,$5000,$3000,$8800,$7800,$8800,$7800,$8800,$7800,$7000,$7000 dc.w $0000,$0000,$2000,$0000,$5000,$3000,$5000,$3000,$5000,$3000,$8800,$7800,$8800,$7800,$8800,$7800,$7000,$7000 dc.w $0000,$0000,$2000,$0000,$5000,$3000,$5000,$3000,$5000,$3000,$8800,$7800,$8800,$7800,$8800,$7800,$7000,$7000 dc.w $0000,$0000,$2000,$0000,$5000,$3000,$5000,$3000,$5000,$3000,$8800,$7800,$8800,$7800,$8800,$7800,$7000,$7000 dc.w $0000,$0000,$2000,$0000,$5000,$3000,$5000,$3000,$5000,$3000,$8800,$7800,$8800,$7800,$8800,$7800,$7000,$7000 dc.w $0000,$0000,$2000,$0000,$5000,$3000,$5000,$3000,$5000,$3000,$8800,$7800,$8800,$7800,$8800,$7800,$7000,$7000 dc.w $0000,$0000,$2000,$0000,$5000,$3000,$5000,$3000,$5000,$3000,$8800,$7800,$8800,$7800,$8800,$7800,$7000,$7000 dc.w $0000,$0000,$2000,$0000,$5000,$3000,$5000,$3000,$5000,$3000,$8800,$7800,$8800,$7800,$8800,$7800,$7000,$7000 dc.w $0000,$0000 ;mt_data incbin "ram:thinktwiceiii.mod" end