ONp N ON /ppp/ppf(pNY_AI6 S I`| * Senast uppdaterad 950425 START_SPRITE EQU 48 SPRITE_ANIMATIONER EQU 14 MAX_LJUD_I_SOUND_BOARD EQU 20 SIKT_STRACKA EQU 64*6*64*6 ; Den strckan som fi kan se. HAR_STRACKA EQU 64*4*64*4 ; Den strckan som fi kan hra. EVENT_STRACKA EQU 64*4*64*4 ; Den strckan som eventet nr. BIT_AVST EQU 70*70 ; Den strckan som 'bitet' nr. VAKEN_TID EQU 25*12 ; Den tid som fi r vaken(larm) FLY_TID EQU 25*12 ; Den tid som fi flyr FI_MAX_SHOOT_WAIT EQU 20 ; Vad skall nedrkningen brja p TJOCKLEK EQU 16*25 ; Gubbens tjocklek ;-J ; Initiering av Fi ;-J init_av_fi: * Fixxa till IX,IY +m.m om det r en vakt och * lgg in Fi's adress(Adressen till adressmappen) i 56+2(a0) och * i adrmap. jsr .init_sublevel jsr .plot_fi move.b $fff820d,slump ; Lite slump in i slump rts *) * Initieringen av en sublevel * *) .init_sublevel: movem.l d0-d7/a0-a6,-(sp) move.l fi_data,a0 tst.w sublev bne .hjdhopp add.w #4,a0 ; A0 pekar p rtt sublevel bra .hjdhopp2 .hjdhopp: move.w sublev,d0 subq.w #1,d0 add.w d0,d0 add.w (a0,d0),a0 ; A0 pekar p rtt sublevel .hjdhopp2: move.w 8(a0),enemies move.l a0,fi_data_subl add.w 2(a0),a0 ; A0 pekar mot fi infon move.w enemies,d0 subq.w #1,d0 ; Rtta till bmi .end ; Inga fiender, hoppa ur .loop: cmp.w #3,(a0) beq .next_fi move.w 0+2(a0),d6 asr.w #4,d6 ; X asr.w #6,d6 ; /64 move.w 2+2(a0),d7 asr.w #4,d7 ; Y asr.w #6,d7 ; /64 asl.w #5,d7 ; *32 ; (LO) add.w d6,d7 ; X+Y*32 move.w d7,d3 ; Utan uppgngring i d3 asl.w #4,d7 ; *4*4 move.l #adrmap,a1 move.l (a1,d7),d4 beq .rut_tom ; Lo 1 tom=vi slipper kolla drr i rutan addq.w #4,d7 tst.l (a1,d7) ; +4 beq .tomrum addq.w #4,d7 tst.l (a1,d7) ; +8 beq .tomrum addq.w #4,d7 .tomrum: move.l d4,a4 ; D4 br innehlla en adress nu. cmp.w #2,(a4) ; Kolla efter drr bne .rut_tom ; hoppa ver ppna drr rutinen lea akt_d_adr,a5 move.w #ANT_DOOR-1-1,d4 ; max antal drrar samtidigt=ANT_DOOR (-1 fr att om alla r upptagna s skrivs sista ver) .chkadr1 cmp.l (a5),a4 beq.s .open cmp.l #0,(a5) beq.s .put_adr addq.l #4,a5 dbf d4,.chkadr1 move.l a4,(a5) bra.s .open .put_adr move.l a4,(a5)+ subq.w #1,d4 blt.s .open .chkadr2 cmp.l (a5),a4 bne.s .nollej move.l #0,(a5) .nollej addq.l #4,a5 dbf d4,.chkadr2 .open * Slut p ppnadrr rutinen .rut_tom ; knalla in i rutan add.w d7,a1 move.l a1,56+2(a0) ; adressmaps adressen in i PRE_LO move.l a0,(a1) ; A(ADDR*4)=adressen till fi (D7 redan adderad) move.w d3,20+2(a0) ; Flytta in ADDR i ADDR_FI cmp.w #1,8+2(a0) bne .hopp move.w 14+2(a0),d6 ; PP move.w 12+2(a0),d7 ; NP movem.l d0/a0,-(sp) jsr .init_vakt ; Initiera om det r en vakt. Initierings rutinen r en stor del av NY_SLUTPUNKT rutinen movem.l (sp)+,d0/a0 .hopp: .next_fi: add.w #82,a0 dbf.w d0,.loop * Fixxa rtt ban adress om det r en fi som fljer bana. move.w enemies,d0 subq.w #1,d0 ; Rtta till move.l fi_data_subl,a0 add.w 2(a0),a0 ; A0 pekar mot fi infon move.l fi_data_subl,a1 add.w 4(a1),a1 ; A1 pekar mot banorna .ban_fix_loop: ; Detta krs ven om fi r dd. Grs inte cmp.w #2,8+2(a0) ; det s hamnar vi nmligen snett i ban bne .flopp ; datat. move.l a1,40+2(a0) .mini_loop: tst.w (a1)+ bne.s .mini_loop .flopp: lea 82(a0),a0 dbf.w d0,.ban_fix_loop .end movem.l (sp)+,d0-d7/a0-a6 rts * * Init vakt * * .init_vakt: subq.w #1,d6 ; PP ligger ett steg fr hgt muls.w #24,d6 ; Nrmaste 24 steg(12 word) move.l fi_data_subl,a4 add.w (a4),a4 ; Pekar mot punkt_connection listan add.w d6,a4 ; a4 pekar p den punkten som du nu r p move.l fi_data_subl,a6 add.w #10,a6 move.w #4,w tst.w 18(a4) bne .kopp ; 4 punkter runt om move.w #3,w tst.w 12(a4) bne .kopp ; 3 punkter runt om move.w #2,w tst.w 6(a4) bne .kopp ; 2 punkter runt om move.w #1,w ; 1 punkt runt om .kopp: moveq #0,d6 ; D6=0 cmp.w (a4),d7 beq .vidare ; Om den nya punkten r samma som frsta i OMGIV_PUNKT (E(1)) s r D6=0 och vi hoppar vidare moveq #6,d6 ; D6=1 cmp.w 6(a4),d7 beq .vidare ; Om den nya punkten r samma som andra i OMGIV_PUNKT (E(2)) s r D6=6 och vi hoppar vidare move.w #12,d6 ; D6=12 cmpA.w 12(a4),d7 beq .vidare ; Om den nya punkten r samma som tredje i OMGIV_PUNKT (E(3)) s r D6=12 och vi hoppar vidare move.w #18,d6 ; D6=18 cmp.w 18(a4),d7 beq .vidare ; Om den nya punkten r samma som fjrde i OMGIV_PUNKT (E(4)) s r D6=18 och vi hoppar vidare move.w #0,d6 ; Kommer vi hit har det blivit fel i ; Mapeditorn och vi lter fi titta p ; punkt nr.1 .vidare: ; D6 skall vara 0,6,12. move.w 44+2(a0),d2 ; Plocka ut farten till D2 move.w (a4,d6),12+2(a0) ; Lgg in den nya punkten i NP move.w 2(a4,d6),22+2(a0) ; Lgg in vinkeln move.w 4(a4,d6),d3 ; d3 frstrs, blir avstnd asr.w d2,d3 ; Dra ner p slutsteg (om farten r stor) move.w d3,34+2(a0) ; avstndet in i SLUTSTEG tst.w d3 move.w 12+2(a0),d6 ; Nya punkten(NP) i D6 subq.w #1,d6 add.w d6,d6 ; *4 fr att passa listan add.w d6,d6 move.w (a6,d6),d4 ; NY_X move.w 2(a6,d6),d5 ; NY_Y move.w d4,d0 ; OBS!Frstr DX! move.w d5,d1 ; OBS!Frstr DY! move.w 0+2(a0),d6 ; X lsr.w #4,d6 ; /64 sub.w d6,d4 ; NY_X-X (DX) move.w 2+2(a0),d7 ; Y lsr.w #4,d7 ; /64 sub.w d7,d5 ; NY_Y-Y (DY) move.w d4,d6 ; DX asl.w #4,d6 ; *64 ext.l d6 divs.w d3,d6 ; DX/SLUTSTEG move.w d6,26+2(a0) ; Lgg in i IX move.w d5,d6 DY asl.w #4,d6 ; *64 ext.l d6 divs.w d3,d6 ; DY/SLUTSTEG move.w d6,28+2(a0) ; Lgg in i IY move.w #0,32+2(a0) asl.w #4,d0 ; *64 asl.w #4,d1 ; *64 move.w d0,4+2(a0) ; in i SPX move.w d1,6+2(a0) ; in i SPY rts * * Rita fienderna i adrmap * * .plot_fi: move.w enemies,d3 subq.w #1,d3 bmi .ur ; Inga fi, hoppa ur move.l #adrmap,a3 move.l fi_data_subl,a0 add.w 2(a0),a0 ; A0 pekar mot fi infon .plot_loop: cmp.w #3,(a0) bne .next move.w 2(a0),d0 move.w 4(a0),d1 lsr.w #6,d0 ; RUTX lsr.w #6,d1 ; RUTY lsl.w #5,d1 ; D1=RUTY*32 add.w d0,d1 ; D1=D1+RUTX lsl.w #4,d1 ; D1=D1*4*4 (4 long) move.l (a3,d1),d2 beq .rita ; Lo 1 tom=vi slipper kolla drr i rutan bmi .next addq.w #4,d1 tst.l (a3,d1) ; +4 beq .kolla_drr addq.w #4,d1 tst.l (a3,d1) ; +8 beq .kolla_drr bra .next ; Rita inte ut fi .kolla_drr: move.l d2,a1 ; D2 br innehlla en adress nu. cmp.w #2,(a1) ; Kolla efter drr ble .next ; rita inte ut dd fi om han ligger p drr .rita: move.l a0,(a3,d1) ; Stt ut adressen i adrmap .next: add.w #82,a0 dbf.w d3,.plot_loop .ur rts ;-J ; MOVE FI ;-J move_fi: addq.w #1,move_fi_flag cmp.w #2,move_fi_flag bne .rts ; Move_fi krs bara varannan vbl. move.w #0,move_fi_flag moveq #0,d7 add.b $ff820d,d7 add.b $4bd,d7 add.b $ff890c,d7 add.b d7,slump ; fixa slumpen move.l fi_data_subl,a0 move.l #x_gubbe,a1 add.w 2(a0),a0 ; A0 pekar mot fi infon move.w enemies,counter subq.w #1,counter bmi .rts .loop: tst.w 36+2(a0) ; Om fi r dd ska han ej rras. ble .next_fi cmp.w #100,48+2(a0) bge .ingen_upprkning ; Om fi dr skall han ej rra sig. moveq #0,d0 moveq #0,d1 moveq #0,d2 moveq #0,d3 moveq #0,d4 moveq #0,d5 moveq #0,d6 moveq #0,d7 move.w #0,skott move.w 0+2(a0),d0 asr.w #4,d0 ; /64 move.w d0,slx sub.w (a1),d0 ; d0=DX move.w 2+2(a0),d1 asr.w #4,d1 ; /64 move.w d1,sly sub.w 2(a1),d1 ; d0=DY move.w d0,d2 move.w d1,d4 muls d2,d2 muls d4,d4 ; d4.l=ATD OBS!! DETTA R DET VANLIGA ATD UTAN NGON HGRE PRECISION!!! add.l d2,d4 move.l d4,atd tst.w 54+2(a0) bne .larm_p ; Om fi blir trffad skall larmet p. tst.w vilket_vapen ; Anvnder vi kniven ska fi inte hra dig. beq .nupp tst.w 8(a1) ; Spelar_E beq .nupp ; om spelar_e=0 s hoppa (fi kan ej d hra dig) cmp.l #HAR_STRACKA,d4 bgt .nupp .larm_p: move.w #VAKEN_TID,30+2(a0) ; larmet skall fortstta vara p... tst.w 10+2(a0) ; r larmet redan p??? bne .nupp cmp.w #1,72+2(a0) ; probe skall fly nr du skjuter blt .no_probe bgt .no_probe move.w #FLY_TID*2,68+2(a0) tst.w vilket_vapen bgt .nupp move.w #0,54+2(a0) ; Kniven skall ej skada proben bra .nupp .no_probe: move.w #1,10+2(a0) ; larm p jsr vid_larm_p cmp.w #1,8+2(a0) ; Om typen r vakt s mste lite saker initieras bne .nupp movem.l d0-d7,-(sp) jsr special_ny_slutpunkt ; ny slutpunkt mste vljas nr det r en vakt. SPARA D0-D3! movem.l (sp)+,d0-d7 move.w #3,8+2(a0) ; Fi ska bli en 'slumpare' .nupp: * ; Hr rknade vi frut ut smf_vin move.w #0,sikt tst.w fi_alarm beq .no_event_koll ; Skall vi kolla event?? cmp.l #EVENT_STRACKA,d4 ble .event_ger_larm .no_event_koll: cmp.l #SIKT_STRACKA,d4 bgt .fi_ser_dig_ej ; Hoppa om avstndet r lnge n ; siktstrckan. * Nu br avstndet vara under 4*64*16(man kan max se 4 rutor framt)=4096 pix (4096*sqr(2)) om vi skall vara helt exakta, blir <6000 ngonting. OBS 6000 r max i listan! move.w d0,d2 ext.l d2 asl.w #4,d2 move.w d1,d3 ext.l d3 asl.w #4,d3 muls d2,d2 muls d3,d3 add.l d2,d3 move.l d3,d4 ; d4.l=ATD OBS!! DETTA ATD R MED HGRE PRECISION N DET VANLIGA!!! move.w d0,d2 ; DX i D2 ext.l d2 asl.w #4,d2 ; Lgga in hg precision p DX add.w 26+2(a0),d2 ; Lgg p IX p DX move.w d1,d3 ; DY i D3 ext.l d3 asl.w #4,d3 ; Lgga in hg precision p DX add.w 28+2(a0),d3 ; Lgg p IY p DY muls d2,d2 muls d3,d3 add.l d2,d3 move.l d3,d5 ; d5.l=ATD2 OBS!!! VEN DETTA MED HG PRECISION! cmp.l d4,d5 bge .fi_ser_dig_ej ; Inget larm sls p om fi inte ser dig * Om fi rr sig mot dig(tittar mot dig) minskar avstndet till dig .event_ger_larm: jsr check_wall ; Kolla s fi inte ser genom vgg tst.w sikt beq .fi_ser_dig_ej ; Inget larm sls p om fi inte ser dig ; Om larmet r p s gr datorn hit varje ; Uppdatering fr att se till att sikten r ; fri om han skulle vilja skjuta. cmp.w #1,72+2(a0) beq .hopp ; Probe! Inget larm move.w #VAKEN_TID,30+2(a0) ; Se till att fi fortstter att vara vaken. tst.w 10+2(a0) bne .fi_ser_dig_ej ; Om larmet redan r p behver vi ej g igenom hela pslagnings proceduren. move.w #1,10+2(a0) jsr vid_larm_p cmp.w #1,8+2(a0) ; Typ=1 ? bne .hopp move.w 14+2(a0),12+2(a0) ; PP till NP fr att inget dumt skall ske... movem.l d0-d7,-(sp) jsr special_ny_slutpunkt ; Om fi r en vakt s mste en ny slutpunkt vljas movem.l (sp)+,d0-d7 move.w #3,8+2(a0) ; Fi ska bli en 'slumpare' .hopp: .fi_ser_dig_ej move.w 34+2(a0),d6 ; Slutsteg cmp.w 32+2(a0),d6 ; Steg=slutsteg? bne .hopp2 jsr ny_slutpunkt ; Ny slutpunkt .hopp2: cmp.w #1,8+2(a0) bne .hopp3 ; Om TYP<>1 s skall vi hoppa. tst.w 10+2(a0) ; Testa om larmet r p. beq .ingen_upprkning ; Stillastende vakt skall ej .hopp3: ; rknas upp. move.w 60+2(a0),d6 ; "Vnta" flaggan subq.w #1,d6 blt .min_tal move.w d6,60+2(a0) .min_tal: tst.w 38+2(a0) bne .ingen_upprkning ; Om fi skall skjuta s skall han ; ej rra sig. tst.w 60+2(a0) ; "Vnta" flaggan bgt .ingen_upprkning move.l 26+2(a0),d6 ; XI och YI i D6 OBS! YI direkt efter XI add.l d6,0+2(a0) ; X=X+IX och Y=Y+IY OBS! Y direkt efter X move.w 0+2(a0),d0 asr.w #4,d0 ; /64 move.w d0,slx move.w 2+2(a0),d1 asr.w #4,d1 ; /64 move.w d1,sly addq.w #1,32+2(a0) jsr kolla_ruta ; r rutan ledig??? .ingen_upprkning: tst.w 10+2(a0) beq .hopp4 ; Inte larm p? Hoppa i s fall! jsr larm_groml .hopp4: jsr anim_fi tst.w 68+2(a0) ble .no_sub subq.w #1,68+2(a0) ; minska 'fly' tiden .no_sub: .next_fi: lea 82(a0),a0 ; Till nsta fiendedata sub.w #1,counter bge .loop move.w #0,fi_alarm ; Ska alltid nollas efter loopen. move.w #0,ritat_frdigt ; Nolla 'frdig ritat' flaggan .rts rts * * Ny slutpunkt * * ny_slutpunkt: move.l 4+2(a0),0+2(a0) ; SPX och SPY in i X och Y move.w 12+2(a0),14+2(a0) ; NP till PP special_ny_slutpunkt: move.w 14+2(a0),d6 ; d6 innehller PP subq.w #1,d6 ; PP ligger ett steg fr hgt muls.w #24,d6 ; Nrmaste 24 steg(12 word) move.l fi_data_subl,a4 add.w (a4),a4 ; Pekar mot punkt_connection listan add.w d6,a4 ; a4 pekar p den punkten som du nu r p move.l fi_data_subl,a6 add.w #10,a6 move.w #4,w tst.w 18(a4) bne .hopp ; 4 punkter runt om move.w #3,w tst.w 12(a4) bne .hopp ; 3 punkter runt om move.w #2,w tst.w 6(a4) bne .hopp ; 2 punkter runt om move.w #1,w ; 1 punkt runt om .hopp: move.w 66+2(a0),d0 subq.w #1,d0 ; Olovs bugg beq .no_fly ; Fi r ingen 'flyende' typ. tst.w 68+2(a0) ble .no_fly ; tiden har tagit slut. move.w 36+2(a0),d6 move.w 66+2(a0),d0 subq.w #1,d0 ; Olovs bugg cmp.w d0,d6 ; Kolla om kraften r lg ble fly .no_fly: tst.w 10+2(a0) ; r alarm p? bne flj_efter_spelare cmp.w #2,8+2(a0) ; Om typ=2(bana) skall frutbest. vg vljas. beq vlj_frutbestmd_vg cmp.w #3,8+2(a0) ; Om typ inte r lika med 3 s skall inget slumptal plockas ut. bne ls ; Om det r en vakt hr hr det FEL! move.l #slump_tab,a5 move.w w,d6 subq.w #1,d6 lsl.w #5,d6 ; d6 blir nu 0,32,64 eller 96 add.w d6,a5 ; Nu hamnar vi p rtt stlle i slumplistan moveq #0,d7 add.b slump,d7 and.w #%0 10,d7 ; Ett slump nummer frn 0 till 30 i steg om 2 move.w (a5,d7),d6 ; d6=ett passande slumptal fr punkten som fi befinner sig p. back1: ; D6 skall vara 0,6,12. move.w 44+2(a0),d2 ; Plocka ut farten till D2 move.w (a4,d6),12+2(a0) ; Lgg in den nya punkten i NP move.w 2(a4,d6),22+2(a0) ; Lgg in vinkeln move.w 4(a4,d6),d3 ; d3 frstrs, blir avstnd asr.w d2,d3 ; Dra ner p slutsteg (om farten r stor) move.w d3,34+2(a0) ; avstndet in i SLUTSTEG tst.w d3 bne .no_ful ; Om avstndet=0 r ngot fel .no_ful: move.w 12+2(a0),d6 ; Nya punkten(NP) i D6 subq.w #1,d6 add.w d6,d6 ; *4 fr att passa listan add.w d6,d6 * move.l fi_data_subl,a6 * add.w #10,a6 ; Pekar mot punkt koordinater move.w (a6,d6),d4 ; NY_X move.w 2(a6,d6),d5 ; NY_Y move.w d4,d0 ; OBS!Frstr DX! move.w d5,d1 ; OBS!Frstr DY! move.w slx,d6 ; X sub.w d6,d4 ; NY_X-X (DX) move.w sly,d7 ; Y sub.w d7,d5 ; NY_Y-Y (DY) move.w d4,d6 ; DX asl.w #4,d6 ; *64 ext.l d6 divs.w d3,d6 ; DX/SLUTSTEG move.w d6,26+2(a0) ; Lgg in i IX move.w d5,d6 DY asl.w #4,d6 ; *64 ext.l d6 divs.w d3,d6 ; DY/SLUTSTEG move.w d6,28+2(a0) ; Lgg in i IY move.w #0,32+2(a0) asl.w #4,d0 ; *64 asl.w #4,d1 ; *64 move.w d0,4+2(a0) ; in i SPX move.w d1,6+2(a0) ; in i SPY rts * * Bestm vg efter spelaren * * flj_efter_spelare: * move.w #$7,$ff8240 move.l #tillf_av,a5 move.l #$7f,(a5)+ ; Ett tal s stort att det aldrig move.l #$7f,(a5)+ ; kan vljas, lggs in. move.l #$7f,(a5)+ move.l #$7f,(a5)+ move.l #tillf_av,a5 move.w slx,d0 ; fi X move.w sly,d1 ; fi Y move.w (a1),d2 ; D2=Spelar X sub.w d0,d2 ; CX move.w 2(a1),d3 ; D3=Spelar Y sub.w d1,d3 ; CY moveq #0,d1 move.w w,d0 ; Antalet punkter runt om fi. subq.w #1,d0 ; loopen rtt antal gnger! .loop: move.w (a4,d1),d4 ; En av de punkter som ligger runt subq.w #1,d4 ; om punkten som fi nu str p. add.w d4,d4 add.w d4,d4 move.w (a6,d4),d5 ; X till den mjliga punkten move.w 2(a6,d4),d6 ; Y till den mjliga punkten addq.w #6,d1 ; lgg p 6 s kommer vi till nsta sub.w (a1),d5 ; Delta vrdet (A1)=Spelar X sub.w 2(a1),d6 ; Delta vrdet 2(A1)=Spelar Y ext.l d5 ext.l d6 muls d5,d5 muls d6,d6 add.l d5,d6 move.l d6,d7 ; d7.l=avstndet till spelaren frn den tnkta punkten move.l d7,(a5)+ dbf.w d0,.loop move.l #tillf_av,a5 move.l 4(a5),d6 cmp.l (a5),d6 blt .hopp move.l (a5),d0 ; B moveq #0,d2 ; R bra .hopp2 .hopp: move.l 4(a5),d0 ; B moveq #6,d2 ; R .hopp2: move.l 12(a5),d6 cmp.l 8(a5),d6 blt .hopp3 move.l 8(a5),d1 ; C move.w #12,d3 ; R2 bra .hopp4 .hopp3: move.l 12(a5),d1 ; C move.w #18,d3 ; R2 .hopp4: cmp.l d0,d1 bgt .hopp5 move.w d3,d2 .hopp5: move.w d2,d6 bra back1 * * Fly undan frn spelaren * * fly: move.l #tillf_av,a5 move.l #0,(a5)+ ; Ett tal s litet att det aldrig move.l #0,(a5)+ ; kan vljas, lggs in. move.l #0,(a5)+ move.l #0,(a5)+ move.l #tillf_av,a5 move.w (a1),d2 ; D2=Spelar X sub.w slx,d2 ; CX move.w 2(a1),d3 ; D3=Spelar Y sub.w sly,d3 ; CY moveq #0,d1 move.w w,d0 ; Antalet punkter runt om fi. subq.w #1,d0 ; loopen rtt antal gnger! .loop: move.w (a4,d1),d4 ; En av de punkter som ligger runt subq.w #1,d4 ; om punkten som fi nu str p. add.w d4,d4 add.w d4,d4 move.w (a6,d4),d5 ; X till den mjliga punkten move.w 2(a6,d4),d6 ; Y till den mjliga punkten addq.w #6,d1 ; lgg p 6 s kommer vi till nsta sub.w (a1),d5 ; Delta vrdet (A1)=Spelar X sub.w 2(a1),d6 ; Delta vrdet 2(A1)=Spelar Y ext.l d5 ext.l d6 muls d5,d5 muls d6,d6 add.l d5,d6 move.l d6,d7 ; d7.l=avstndet till spelaren frn den tnkta punkten move.l d7,(a5)+ dbf.w d0,.loop move.l #tillf_av,a5 move.l 4(a5),d6 cmp.l (a5),d6 bgt .hopp move.l (a5),d0 ; B moveq #0,d2 ; R bra .hopp2 .hopp: move.l 4(a5),d0 ; B moveq #6,d2 ; R .hopp2: move.l 12(a5),d6 cmp.l 8(a5),d6 bgt .hopp3 move.l 8(a5),d1 ; Cj move.w #12,d3 ; R2 bra .hopp4 .hopp3: move.l 12(a5),d1 ; C move.w #18,d3 ; R2 .hopp4: cmp.l d0,d1 blt .hopp5 move.w d3,d2 .hopp5: move.w d2,d6 bra back1 *" * G efter frutbestmd vg * *" vlj_frutbestmd_vg: move.l 40+2(a0),a5 ; Lgg in adressen till vg listan. add.w 18+2(a0),a5 ; Lgg p NY_VAG s vi kommer till rtt stlle i listan. move.w (a5),d7 ; Lgg in den nya punkten i d7 move.w 18+2(a0),16+2(a0) ; LAST_VAG=NY_VAG add.w #2,18+2(a0) ; ka NY_VAG med ett word s vi hittar rtt punkt i listan nsta gng. moveq #0,d6 ; D6=0 cmp.w (a4),d7 beq .vidare ; Om den nya punkten r samma som frsta i OMGIV_PUNKT (E(1)) s r D6=0 och vi hoppar vidare moveq #6,d6 ; D6=1 cmp.w 6(a4),d7 beq .vidare ; Om den nya punkten r samma som andra i OMGIV_PUNKT (E(2)) s r D6=6 och vi hoppar vidare move.w #12,d6 ; D6=12 cmp.w 12(a4),d7 beq .vidare ; Om den nya punkten r samma som tredje i OMGIV_PUNKT (E(3)) s r D6=12 och vi hoppar vidare move.w #18,d6 ; D6=18 cmp.w 18(a4),d7 beq .vidare ; Om den nya punkten r samma som fjrde i OMGIV_PUNKT (E(4)) s r D6=18 och vi hoppar vidare .vidare: tst 2(a5) ; Testa om listan dr den frutbestmda vgen ligger skall brja om. bne .inte_slut_p_listan_n move.w #0,18+2(a0) ; Nollstll NY_VAG .inte_slut_p_listan_n: bra back1 * * Fi's groml nr alarm r p * * larm_groml: cmp.w #100,48+2(a0) ; Fi dr blt .go_on rts .go_on: cmp.w #1,72+2(a0) blt .go_on2 bgt .go_on2 rts ; Probe .go_on2: subq.w #1,30+2(a0) ; minska tid med 1 tst.w 38+2(a0) ble .shoot_maybe subq.w #1,38+2(a0) cmp.w #2,72+2(a0) ; Atat killen vntar inte som alla beq .atat ; andra bldiga. cmp.w #3,72+2(a0) ; Slutboss1 skjuter tv skott beq .boss1 ; i rad. move.w #FI_MAX_SHOOT_WAIT,d0 asr.w #1,d0 cmp.w 38+2(a0),d0 bne .ingen_skjutning bra .skutta_ver .atat: move.w 38+2(a0),d0 and.w #%011,d0 bne .ingen_skjutning bra .skutta_ver .boss1: move.w 38+2(a0),d0 and.w #%0 111,d0 bne .ingen_skjutning .skutta_ver: tst.w sikt beq .ingen_skjutning move.w 22+2(a0),d0 add.b $ff890a,d0 add.b slump,d0 tst.w 50+2(a0) ; attack_typ(bit,skott1,skott2) bne .next_sprite1 ; Hit om spriten skall bita cmp.l #BIT_AVST,atd bgt .ingen_skjutning ; Om avstndet till dig r mer n ; sqr(30) s r monstret fr lngt ; bort fr att bita dig. * Hr ligger rutinen fr att fi skall bita spelaren. move.l #fi_skjut,a4 ; Adr till fi ljud listan move.w slx,d0 ; X move.w sly,d1 ; Y move.w 24+2(a0),d2 ; plocka ut grund_utseende add.w d2,d2 ; *2 move.w (a4,d2),d2 ; d2=ljud nr jsr sound move.w #1,skott move.w 52+2(a0),d2 sub.w d2,health ; han r skadad. bra .ingen_skjutning .next_sprite1: cmp.w #2,50+2(a0) ; om 2 s r det flygande skott beq .next_sprite2 ; Hit om spriten skall skjuta * Hr ligger rutinen dr fi skjuter spelaren. move.l #fi_skjut,a4 ; Adr till fi ljud listan move.w slx,d0 ; X move.w sly,d1 ; Y move.w 24+2(a0),d2 ; plocka ut grund_utseende add.w d2,d2 ; *2 move.w (a4,d2),d2 ; d2=ljud nr jsr sound move.w #1,skott cmp.w #2,72+2(a0) beq .atat_missar_inte and.w #%01,d0 ; 0=0 s missar fi .atat_missar_inte: move.w 52+2(a0),d2 sub.w d2,health ; han r skadad. bra .ingen_skjutning ;--- hr skjuter fi ett flygande skott --- .next_sprite2 movem.l d0-d7/a3-a6,-(sp) lea flyg_skott_buf,a4 lea sin_360,a5 lea adrmap,a6 move.l aktiva_skott,d0 moveq #-1,d1 move.w #32-1-1,d7 ; testa vilket skott vi .tst_vilk addq.w #1,d1 ; kan anvnda btst d1,d0 beq.s .hitt_en dbf d7,.tst_vilk ; om alla r upptagna mla ver 32:an bra .ingen_skjutning .hitt_en bset d1,d0 ; nu r denna upptagen move.l d0,aktiva_skott lsl.w #5,d1 ; vilk*32 (16words) add.w d1,a4 ; peekar p skottet ;--- Rkna relvink --- move.w 2(a0),d2 ; fi x move.w 4(a0),d3 ; fi z ext.l d2 ext.l d3 lsr.w #4,d2 lsr.w #4,d3 sub.w x_gubbe,d2 ; dx bge.s .no_neg1 neg.w d2 .no_neg1 sub.w z_gubbe,d3 ; dz bge.s .no_neg2 neg.w d3 .no_neg2 muls d2,d2 muls d3,d3 add.l d2,d3 jsr roten_ur ; sqr sum cmp.w #512,d3 blt .ejo512 move.w #512,d3 .ejo512 move.w 2(a0),d1 ; x move.w 4(a0),d2 ; z lsr.w #4,d1 lsr.w #4,d2 jsr rkna_vinkel ; rknar relativ vinkel d3=relvink add.w look_angle,d3 cmp.w #360,d3 blt.s .nores1 sub.w #360,d3 .nores1 sub.w #180,d3 ; bara fr vi inte har den relativa bge.s .nores2 ; vinkeln mellan fi och gubbe -utan add.w #360,d3 ; tvrtom .nores2 ;--- stt skottet --- move.w #FISKOTTHAST,hast cmp.w #3,72+2(a0) bne .lille_skutt move.w hast,d6 asr.w d6 add.w d6,hast ; d7+50% av d7 .lille_skutt move.w 2(a0),d0 move.w 4(a0),d1 move.w d3,d7 ; spara till save lsr.w #4,d0 lsr.w #4,d1 add.w #5,d3 add.w d3,d3 add.w d3,a5 move.w (a5),d3 ; sin move.w 180(a5),d4 ; cos muls hast,d3 ; sin(grad)*snabbhet muls hast,d4 ; cos(grad)*snabbhet swap d3 swap d4 rol.l #6,d3 ; x inc*16 rol.l #6,d4 ; z inc*16 neg.w d3 lsr.w #6,d0 lsr.w #6,d1 lsl.w #5,d1 ; z_gubbe*32 add.w d1,d0 ; z_gubbe*32+x_gubbe lsl.w #4,d0 ; offs i adrmap tst.l (a6,d0.w) beq.s .found_c addq.w #4,d0 tst.l (a6,d0.w) beq.s .found_c addq.w #4,d0 tst.l (a6,d0.w) beq.s .found_c addq.w #4,d0 .found_c move.l a4,(a6,d0.w) ; lgg in skottadr p sr lea -90*2(a5),a5 ; look_angle-90 cmp.l #sin_360,a5 bge.s .nojjo lea 360*2(a5),a5 .nojjo move.w (a5),d1 move.w 180(a5),d2 muls #2,d1 ; skott bredd muls #2,d2 ; skott bredd swap d1 swap d2 rol.l #2,d1 rol.l #2,d2 lsl.w #4,d1 lsl.w #4,d2 sub.w d3,d1 add.w d4,d2 lsr.w #4,d1 lsr.w #4,d2 move.w 2(a0),d5 lsr.w #4,d5 sub.w d1,d5 move.w 4(a0),d6 lsr.w #4,d6 add.w d2,d6 move.w #3,(a4)+ ; stt indik move.w d5,(a4)+ ; x_start move.w d6,(a4)+ ; z_start move.w #0,(a4)+ tst.w medishoot bne .fusk move.w 72(a0),-2(a4) ; spr nr 1 .fusk: move.w #0,(a4)+ ; explosions rknare move.w 72(a0),(a4)+ ; spr nr 2 (-1=ej anim) move.w d3,(a4)+ ; x_inc*16 move.w d4,(a4)+ ; z_inc*16 move.w hast,(a4)+ ; hyp move.w d7,(a4)+ ; skott_vinkel move.w 54(a0),(a4)+ ; skada move.w d0,(a4)+ ; adrmap offs (ej +lo:s offs) movem.l (sp)+,d0-d7/a3-a6 move.l #fi_skjut,a4 ; Adr till fi ljud listan move.w slx,d0 ; X move.w sly,d1 ; Y move.w 24+2(a0),d2 ; plocka ut grund_utseende add.w d2,d2 ; *2 move.w (a4,d2),d2 ; d2=ljud nr jsr sound move.w #1,skott .ingen_skjutning: tst.w 30+2(a0) ; Testa TID bgt .no_alarm_av ; hopp om larm ej skall stngas av. move.w #0,10+2(a0) ; alarm=0 move.w #0,38+2(a0) move.w #3,8+2(a0) ; typ=3 .no_alarm_av: * Skall fienden skrika lite kanske??? tst.w 10+2(a0) beq .no_scream move.w 22+2(a0),d0 and.b $ff8209,d0 add.b slump,d0 and.w #%0 1,d0 ; 1 p 32 bne .no_scream ; Om slump<>0 s skriker fi ej. move.l #fi_scream,a4 ; Adr till fi ljud listan move.w slx,d0 move.w sly,d1 move.w 24+2(a0),d2 ; plocka ut grund_utseende add.w d2,d2 ; *2 move.w (a4,d2),d2 ; d2=ljud nr jsr sound .no_scream: rts * Skall vi skjuta lite kanske?? .shoot_maybe: tst.w sikt ; Om fi inte ser dig skjuter han beq .ingen_skjutning ; inte. tst.w 68+2(a0) bgt .ingen_skjutning ; Om fi flyr ska han ej skjuta cmp.w #1,50+2(a0) blt .bitare ; bitare bgt .skott2 ; Skott2 tst.w 54+2(a0) ; Om fi blir trffad skall han bgt .skjut ; skjuta!!! move.w 22+2(a0),d0 add.b $ff890c,d0 add.b slump,d0 and.w #%0 1,d0 ; 1 gng av 16 s skjuter fi. bne .ingen_skjutning .skjut: move.w #FI_MAX_SHOOT_WAIT,38+2(a0) bra .ingen_skjutning .bitare: cmp.l #BIT_AVST,atd ; Om avstndet till dig r mer n bgt .ingen_skjutning ; sqr(30) s r monstret fr lngt ; bort fr att bita dig. tst.w 54+2(a0) ; Om fi blir trffad skall han bgt .bit ; bita!!! move.w 22+2(a0),d0 add.b $ff890c,d0 add.b slump,d0 and.w #%0 10,d0 ; 1 gng av 2 s biter fi. bne .ingen_skjutning .bit: move.w #FI_MAX_SHOOT_WAIT,38+2(a0) bra .ingen_skjutning .skott2: move.w 22+2(a0),d0 add.b $ff890c,d0 add.b slump,d0 tst.w 54+2(a0) ; Om fi blir trffad r det bgt .skjut2 ; strre chans att han skjuter!!! and.w #%0 100,d0 ; 1 gng av 16 s skjuter fi. bne .ingen_skjutning move.w #FI_MAX_SHOOT_WAIT,38+2(a0) bra .ingen_skjutning .skjut2: and.w #%0 1010,d0 ; 1 gng av 4 s skjuter fi. bne .ingen_skjutning move.w #FI_MAX_SHOOT_WAIT,38+2(a0) bra .ingen_skjutning * * Ljud rutin * * D0=x, D1=Y, D2=ljud * * sound: move.l d3,-(sp) move.l #sound_board,a4 cmp.w #MAX_LJUD_I_SOUND_BOARD,(a4) bge .no_add move.w (a4),d3 ; D3=antal ljud som skall startas add.w #1,(a4)+ ; ka med ett ljud OBS TA BORT "*" NR EMPAS SOUNDBOARD FUNGERAR. add.w d3,d3 move.w d3,d4 add.w d3,d3 add.w d3,d3 sub.w d4,d3 ; D3*6 fr att passa listan add.w d3,a4 move.w d0,(a4)+ ; X move.w d1,(a4)+ ; Y move.w d2,(a4) ; Ljud nr .no_add: move.l (sp)+,d3 rts *7 * Kolla om det r ngon spelare,fi eller drr i rutan * *7 kolla_ruta: move.w slx,d2 move.w sly,d3 lsr.w #6,d2 ; RUTX lsr.w #6,d3 ; RUTY lsl.w #5,d3 ; D3=RUTY*32 add.w d2,d3 ; D3=D3+RUTX move.w d3,d7 ; D3=ADDR lsl.w #4,d7 ; D7=D7*4*4 (4 long) D7=ADDR*4*4 cmp.w 20+2(a0),d3 beq .tillbaka ; fi har ej gtt in i ngon ny ruta sedan senaste uppdateringen. move.w x_gubbe,d4 lsr.w #6,d4 ; Spelar X SR move.w z_gubbe,d5 lsr.w #6,d5 ; Spelar Y SR lsl.w #5,d5 ; D5=RUTY*32 add.w d4,d5 ; D5=D5+RUTX cmp.w d3,d5 beq .vnd ; Spelaren str redan hr och fi ska vnda. .no_vnd move.l #adrmap,a3 ; A() i stos listningen tst.l (a3,d7) blt .vnd beq .no_wall move.l (a3,d7),a4 cmp.w #1,(a4) ble .vnd ; Vgg i vgen .no_wall: tst.l (a3,d7) ; Kolla om det r en fi i frsta rutan beq .no_adr move.l (a3,d7),a4 ; A4=SJUK ADRESS IBLAND!(VID 3 BOMBER) cmp.w #4,(a4) beq .vnd .no_adr: tst.l 4(a3,d7) ; Kolla om det r en fi i andra rutan beq .no_adr2 move.l 4(a3,d7),a4 cmp.w #4,(a4) beq .vnd .no_adr2: tst.l 8(a3,d7) ; Kolla om det r en fi i tredje rutan beq .no_adr3 move.l 8(a3,d7),a4 cmp.w #4,(a4) beq .vnd .no_adr3: tst.l 12(a3,d7) ; Kolla om det r en fi i fjrde rutan beq .no_adr4 move.l 12(a3,d7),a4 cmp.w #4,(a4) beq .vnd .no_adr4: * Ingen fi i ngon av rutorna r nu konstaterat * Leta tomrum move.l (a3,d7),d4 beq .rut_tom ; Lo 1 tom=vi slipper kolla drr i rutan addq.w #4,d7 tst.l (a3,d7) ; +4 beq .tomrum addq.w #4,d7 tst.l (a3,d7) ; +8 beq .tomrum addq.w #4,d7 tst.l (a3,d7) ; +12 beq .tomrum * Kommer vi hit finns det inget tomrum att lgga in fi i. Vi frsker * hitta en 3:a att skriva ver. sub.w #12,d7 move.l (a3,d7),a4 cmp.w #3,(a4) beq .tomrum ; En trea, vi skriver ver denna ruta addq.w #4,d7 move.l (a3,d7),a4 cmp.w #3,(a4) beq .tomrum ; En trea, vi skriver ver denna ruta addq.w #4,d7 move.l (a3,d7),a4 cmp.w #3,(a4) beq .tomrum ; En trea, vi skriver ver denna ruta addq.w #4,d7 move.l (a3,d7),a4 cmp.w #3,(a4) beq .tomrum ; En trea, vi skriver ver denna ruta * Allt var fullt av viktiga saker, vnd! bra .vnd .tomrum: move.l d4,a4 ; D4 br innehlla en adress nu. cmp.w #2,(a4) ; Kolla efter drr beq .door ; hoppa till drr rutinen blt .vnd ; Fi slog emot en vgg, stoppa honom! bra .rut_tom ; knalla in i rutan .vnd: move.w 26+2(a0),d4 ; Flytta tillbaka spelaren (skall gras om det r en fi i rutan) sub.w d4,0+2(a0) ; X=X-IX move.w 28+2(a0),d4 sub.w d4,2+2(a0) ; Y=Y-IY move.w 0+2(a0),d0 asr.w #4,d0 ; /64 move.w d0,slx move.w 2+2(a0),d1 asr.w #4,d1 ; /64 move.w d1,sly cmp.w #100,48+2(a0) ; Kolla om fi hller p att d,Flyger bakt bge .tillbaka ; I s fall skall han ej vnda utan bara ; Stanna neg.w 26+2(a0) ; IX=-IX neg.w 28+2(a0) ; IY=-IY move.w 32+2(a0),34+2(a0) ; SLUTSTEG=STEG move.w #0,32+2(a0) ; STEG=0 add.w #128,22+2(a0) ; VIN+128 and.w #$00ff,22+2(a0) ; if VIN>256 then VIN=VIN-256 move.w 14+2(a0),12+2(a0) ; NP=PP move.l fi_data_subl,a6 add.w #10,a6 move.w 12+2(a0),d4 ; D4=NP subq.w #1,d4 ; NP r ett steg fr hgt. add.w d4,d4 ; NP*4 (Fr att passa listan)(2 word(X och Y)) add.w d4,d4 move.w (a6,d4),d5 ; NY_X move.w 2(a6,d4),d6 ; NY_Y lsl.w #4,d5 ; NY_X*16 lsl.w #4,d6 ; NY_Y*16 move.w d5256 then VIN=VIN-256 move.w 14+2(a0),12+2(a0) ; NP=PP move.l fi_data_subl,a6 add.w #10,a6 move.w 12+2(a0),d4 ; D4=NP subq.w #1,d4 ; NP r ett steg fr hgt. add.w d4,d4 ; NP*4 (Fr att passa listan)(2 word(X och Y)) add.w d4,d4 move.w (a6,d4),d5 ; NY_X move.w 2(a6,d4),d6 ; NY_Y lsl.w #4,d5 ; NY_X*16 lsl.w #4,d6 ; NY_Y*16 move.w d5256 then VIN=VIN-256 move.w 14+2(a0),12+2(a0) ; NP=PP move.l fi_data_subl,a6 add.w #10,a6 move.w 12+2(a0),d4 ; D4=NP subq.w #1,d4 ; NP r ett steg fr hgt. add.w d4,d4 ; NP*4 (Fr att passa listan)(2 word(X och Y)) add.w d4,d4 move.w (a6,d4),d5 ; NY_X move.w 2(a6,d4),d6 ; NY_Y lsl.w #4,d5 ; NY_X*16 lsl.w #4,d6 ; NY_Y*16 move.w d5?trea, vi skriver ver denna ruta addq.w #4,d7 move.l (a3,d7),a4 cmp.w #3,(a4) beq .tomrum ; En trea, vi skriver ver denna ruta addq.w #4,d7 move.l (a3,d7),a4 cmp.w #3,(a4) beq .tomrum ; En trea, vi skriver ver denna ruta * Allt var fullt av viktiga saker, vnd! bra .vnd .tomrum: move.l d4,a4 ; D4 br innehlla en adress nu. cmp.w #2,(a4) ; Kolla efter drr beq .door ; hoppa till drr rutinen blt .vnd ; Fi slog emot en vgg, stoppa honom! bra .rut_tom ; knalla in i rutan .vnd: move.w 26+2(a0),d4 ; Flytta tillbaka spelaren (skall gras om det r en fi i rutan) sub.w d4,0+2(a0) ; X=X-IX move.w 28+2(a0),d4 sub.w d4,2+2(a0) ; Y=Y-IY move.w 0+2(a0),d0 asr.w #4,d0 ; /64 move.w d0,slx move.w 2+2(a0),d1 asr.w #4,d1 ; /64 move.w d1,sly cmp.w #100,48+2(a0) ; Kolla om fi hller p att d,Flyger bakt bge .tillbaka ; I s fall skall han ej vnda utan bara ; Stanna neg.w 26+2(a0) ; IX=-IX neg.w 28+2(a0) ; IY=-IY move.w 32+2(a0),34+2(a0) ; SLUTSTEG=STEG move.w #0,32+2(a0) ; STEG=0 add.w #128,22+2(a0) ; VIN+128 and.w #$00ff,22+2(a0) ; if VIN>256 then VIN=VIN-256 move.w 14+2(a0),12+2(a0) ; NP=PP move.l fi_data_subl,a6 add.w #10,a6 move.w 12+2(a0),d4 ; D4=NP subq.w #1,d4 ; NP r ett steg fr hgt. add.w d4,d4 ; NP*4 (Fr att passa listan)(2 word(X och Y)) add.w d4,d4 move.w (a6,d4),d5 ; NY_X move.w 2(a6,d4),d6 ; NY_Y lsl.w #4,d5 ; NY_X*16 lsl.w #4,d6 ; NY_Y*16 move.w d5 ,4+2(a0) ; lgg in i SPX move.w d6,6+2(a0) ; lgg in i SPY cmp.w #2,8+2(a0) bne .no_vnd_bana_fi move.w 18+2(a0),d5 move.w 16+2(a0),18+2(a0) ; NY_VAG=LAST_VAG move.w d5,16+2(a0) .no_vnd_bana_fi: rts .rut_tom: move.l 56+2(a0),a4 move.l #0,(a4) ; ( A(ADDR_FI)=0 ) add.w d7,a3 move.l a3,56+2(a0) ; Spara adr till fi move.l a0,(a3) ; A(ADDR*4)=adressen till fi (D7 redan adderad) move.w d3,20+2(a0) ; Flytta in ADDR i ADDR_FI .tillbaka: rts *, * Hit kommer vi om fi str framfr en drr * *, .door: * Denna rutin ppnar drren (om den nu inte redan r ppen) * i a4 ligger adr till drren cmp.w #100,48+2(a0) bge .check_open move.w 2(a4),d4 move.w 4(a4),d5 lsr.w #6,d4 lsr.w #6,d5 lsl.w #5,d5 add.w d4,d5 lsl.w #4,d5 tst.l 4(a3,d5.w) ; Kolla LO 234 bne .rut_tom tst.l 8(a3,d5.w) bne .rut_tom tst.l 12(a3,d5.w) bne .rut_tom cmp.w #-1,22(a4) bgt .check_open ; Om det r en nyckel-drr skall vi ; kolla om den r ppen. blt .check_open ; Om det r en event-drr lea akt_d_adr,a5 move.w #ANT_DOOR-1-1,d4 ; max antal drrar samtidigt=ANT_DOOR (-1 fr att om alla r upptagna s skrivs sista ver) .chkadr1 cmp.l (a5),a4 beq.s .open cmp.l #0,(a5) beq.s .put_adr addq.l #4,a5 dbf d4,.chkadr1 move.l a4,(a5) bra.s .open .put_adr move.l a4,(a5)+ subq.w #1,d4 blt.s .open .chkadr2 cmp.l (a5),a4 bne.s .nollej move.l #0,(a5) .nollej addq.l #4,a5 dbf d4,.chkadr2 .open * Slut p ppnadrr rutinen move.w 20(a4),d4 ; Drr animationen cmp.w #OPEN,d4 bge .vnd ; Vnd om drren hller p att stngas cmp.w #15,d4 bgt.w .no_wait ; Drren r redan ppen s fi vntar inte. * Nu vet vi att drren hller p att ppnas. move.w d4,60+2(a0) ; Antal cykler att vnta tills drren ; r helt ppen. move.w 26+2(a0),d4 ; Flytta tillbaka spelaren sub.w d4,0+2(a0) ; X=X-IX move.w 28+2(a0),d4 q sub.w d4,2+2(a0) ; Y=Y-IY bra .tillbaka .no_wait: * Drren r ppen och det r bara att fortstta knalla... bra .rut_tom * Hit kommer vi om Fi hller p att ddsanimeras eller om han str * vid en nyckeldrr. D fi ej kan ppna drren sjlv! .check_open move.w 20(a4),d4 ; Drr animationen cmp.w #OPEN,d4 bge .vnd ; Vnd om drren hller p att stngas cmp.w #15,d4 bgt.w .no_wait ; Drren r redan ppen s fi fortstter g bra .vnd ; Drren r stngd eller hller p att ; ppnas. *% * Kolla om det r ngon vgg ivgen * *% check_wall: move.l (a0),d0 ; Fi X asr.w #4,d0 move.w d0,x1 move.l 2(a0),d1 ; Fi Y asr.w #4,d1 move.w d1,y1 move.w (a1),x2 ; Spelar X move.w 2(a1),y2 ; Spelar Y move.w x2,d0 sub.w x1,d0 bge .no_neg neg.w d0 .no_neg: move.w y2,d1 sub.w y1,d1 bge .no_neg2 neg.w d1 .no_neg2: cmp.w d1,d0 blt .more_y .more_x: move.w x2,d0 cmp.w x1,d0 bge .no_swap move.l x1,d0 move.l x2,x1 move.l d0,x2 ; Swappa .no_swap: moveq.l #0,d0 move.w y2,d0 sub.w y1,d0 swap d0 asr.l #2,d0 move.w x2,d1 sub.w x1,d1 divs d1,d0 ; d0=K move.w x1,d1 muls.w d0,d1 swap d1 asl.l #2,d1 @@r pp fNAȁ226960 497647432;2;2;2:46347437902;0 828C9B::,64522;2;22;2,4+2(a0) ; lgg in i SPX move.w d6,6+2(a0) ; lgg in i SPY cmp.w #2,8+2(a0) bne .no_vnd_bana_fi move.w 18+2(a0),d5 move.w 16+2(a0),18+2(a0) ; NY_VAG=LAST_VAG move.w d5,16+2(a0) .no_vnd_bana_fi: rts .rut_tom: move.l 56+2(a0),a4 move.l #0,(a4) ; ( A(ADDR_FI)=0 ) add.w d7,a3 move.l a3,56+2(a0) ; Spara adr till fi move.l a0,(a3) ; A(ADDR*4)=adressen till fi (D7 redan adderad) move.w d3,20+2(a0) ; Flytta in ADDR i ADDR_FI .tillbaka: rts *, * Hit kommer vi om fi str framfr en drr * *, .door: * Denna rutin ppnar drren (om den nu inte redan r ppen) * i a4 ligger adr till drren cmp.w #100,48+2(a0) bge .check_open move.w 2(a4),d4 move.w 4(a4),d5 lsr.w #6,d4 lsr.w #6,d5 lsl.w #5,d5 add.w d4,d5 lsl.w #4,d5 tst.l 4(a3,d5.w) ; Kolla LO 234 bne .rut_tom tst.l 8(a3,d5.w) bne .rut_tom tst.l 12(a3,d5.w) bne .rut_tom cmp.w #-1,22(a4) bgt .check_open ; Om det r en nyckel-drr skall vi ; kolla om den r ppen. blt .check_open ; Om det r en event-drr lea akt_d_adr,a5 move.w #ANT_DOOR-1-1,d4 ; max antal drrar samtidigt=ANT_DOOR (-1 fr att om alla r upptagna s skrivs sista ver) .chkadr1 cmp.l (a5),a4 beq.s .open cmp.l #0,(a5) beq.s .put_adr addq.l #4,a5 dbf d4,.chkadr1 move.l a4,(a5) bra.s .open .put_adr move.l a4,(a5)+ subq.w #1,d4 blt.s .open .chkadr2 cmp.l (a5),a4 bne.s .nollej move.l #0,(a5) .nollej addq.l #4,a5 dbf d4,.chkadr2 .open * Slut p ppnadrr rutinen move.w 20(a4),d4 ; Drr animationen cmp.w #OPEN,d4 bge .vnd ; Vnd om drren hller p att stngas cmp.w #15,d4 bgt.w .no_wait ; Drren r redan ppen s fi vntar inte. * Nu vet vi att drren hller p att ppnas. move.w d4,60+2(a0) ; Antal cykler att vnta tills drren ; r helt ppen. move.w 26+2(a0),d4 ; Flytta tillbaka spelaren sub.w d4,0+2(a0) ; X=X-IX move.w 28+2(a0),d4 q sub.w d4,2+2(a0) ; Y=Y-IY bra .tillbaka .no_wait: * Drren r ppen och det r bara att fortstta knalla... bra .rut_tom * Hit kommer vi om Fi hller p att ddsanimeras eller om han str * vid en nyckeldrr. D fi ej kan ppna drren sjlv! .check_open move.w 20(a4),d4 ; Drr animationen cmp.w #OPEN,d4 bge .vnd ; Vnd om drren hller p att stngas cmp.w #15,d4 bgt.w .no_wait ; Drren r redan ppen s fi fortstter g bra .vnd ; Drren r stngd eller hller p att ; ppnas. *% * Kolla om det r ngon vgg ivgen * *% check_wall: move.l (a0),d0 ; Fi X asr.w #4,d0 move.w d0,x1 move.l 2(a0),d1 ; Fi Y asr.w #4,d1 move.w d1,y1 move.w (a1),x2 ; Spelar X move.w 2(a1),y2 ; Spelar Y move.w x2,d0 sub.w x1,d0 bge .no_neg neg.w d0 .no_neg: move.w y2,d1 sub.w y1,d1 bge .no_neg2 neg.w d1 .no_neg2: cmp.w d1,d0 blt .more_y .more_x: move.w x2,d0 cmp.w x1,d0 bge .no_swap move.l x1,d0 move.l x2,x1 move.l d0,x2 ; Swappa .no_swap: moveq.l #0,d0 move.w y2,d0 sub.w y1,d0 swap d0 asr.l #2,d0 move.w x2,d1 sub.w x1,d1 divs d1,d0 ; d0=K move.w x1,d1 muls.w d0,d1 swap d1 asl.l #2,d1 2;@3' 9226960 497647432;2;2;2:46347437902;0 828C9B::,64522;2;22;2,4+2(a0) ; lgg in i SPX move.w d6,6+2(a0) ; lgg in i SPY cmp.w #2,8+2(a0) bne .no_vnd_bana_fi move.w 18+2(a0),d5 move.w 16+2(a0),18+2(a0) ; NY_VAG=LAST_VAG move.w d5,16+2(a0) .no_vnd_bana_fi: rts .rut_tom: move.l 56+2(a0),a4 move.l #0,(a4) ; ( A(ADDR_FI)=0 ) add.w d7,a3 move.l a3,56+2(a0) ; Spara adr till fi move.l a0,(a3) ; A(ADDR*4)=adressen till fi (D7 redan adderad) move.w d3,20+2(a0) ; Flytta in ADDR i ADDR_FI .tillbaka: rts *, * Hit kommer vi om fi str framfr en drr * *, .door: * Denna rutin ppnar drren (om den nu inte redan r ppen) * i a4 ligger adr till drren cmp.w #100,48+2(a0) bge .check_open move.w 2(a4),d4 move.w 4(a4),d5 lsr.w #6,d4 lsr.w #6,d5 lsl.w #5,d5 add.w d4,d5 lsl.w #4,d5 tst.l 4(a3,d5.w) ; Kolla LO 234 bne .rut_tom tst.l 8(a3,d5.w) bne .rut_tom tst.l 12(a3,d5.w) bne .rut_tom cmp.w #-1,22(a4) bgt .check_open ; Om det r en nyckel-drr skall vi ; kolla om den r ppen. blt .check_open ; Om det r en event-drr lea akt_d_adr,a5 move.w #ANT_DOOR-1-1,d4 ; max antal drrar samtidigt=ANT_DOOR (-1 fr att om alla r upptagna s skrivs sista ver) .chkadr1 cmp.l (a5),a4 beq.s .open cmp.l #0,(a5) beq.s .put_adr addq.l #4,a5 dbf d4,.chkadr1 move.l a4,(a5) bra.s .open .put_adr move.l a4,(a5)+ subq.w #1,d4 blt.s .open .chkadr2 cmp.l (a5),a4 bne.s .nollej move.l #0,(a5) .nollej addq.l #4,a5 dbf d4,.chkadr2 .open * Slut p ppnadrr rutinen move.w 20(a4),d4 ; Drr animationen cmp.w #OPEN,d4 bge .vnd ; Vnd om drren hller p att stngas cmp.w #15,d4 bgt.w .no_wait ; Drren r redan ppen s fi vntar inte. * Nu vet vi att drren hller p att ppnas. move.w d4,60+2(a0) ; Antal cykler att vnta tills drren ; r helt ppen. move.w 26+2(a0),d4 ; Flytta tillbaka spelaren sub.w d4,0+2(a0) ; X=X-IX move.w 28+2(a0),d4 q sub.w d4,2+2(a0) ; Y=Y-IY bra .tillbaka .no_wait: * Drren r ppen och det r bara att fortstta knalla... bra .rut_tom * Hit kommer vi om Fi hller p att ddsanimeras eller om han str * vid en nyckeldrr. D fi ej kan ppna drren sjlv! .check_open move.w 20(a4),d4 ; Drr animationen cmp.w #OPEN,d4 bge .vnd ; Vnd om drren hller p att stngas cmp.w #15,d4 bgt.w .no_wait ; Drren r redan ppen s fi fortstter g bra .vnd ; Drren r stngd eller hller p att ; ppnas. *% * Kolla om det r ngon vgg ivgen * *% check_wall: move.l (a0),d0 ; Fi X asr.w #4,d0 move.w d0,x1 move.l 2(a0),d1 ; Fi Y asr.w #4,d1 move.w d1,y1 move.w (a1),x2 ; Spelar X move.w 2(a1),y2 ; Spelar Y move.w x2,d0 sub.w x1,d0 bge .no_neg neg.w d0 .no_neg: move.w y2,d1 sub.w y1,d1 bge .no_neg2 neg.w d1 .no_neg2: cmp.w d1,d0 blt .more_y .more_x: move.w x2,d0 cmp.w x1,d0 bge .no_swap move.l x1,d0 move.l x2,x1 move.l d0,x2 ; Swappa .no_swap: moveq.l #0,d0 move.w y2,d0 sub.w y1,d0 swap d0 asr.l #2,d0 move.w x2,d1 sub.w x1,d1 divs d1,d0 ; d0=K move.w x1,d1 muls.w d0,d1 swap d1 asl.l #2,d1 2;2;22 88x8yD @&@"' '!'''ADx8yD @9 x8y`@9& `x8y@9& y9 'AAD' `g`8y@9`"99 '"'gÜg@D'88yD @9`x8y`@9& `x8yD @9 88y,4+2(a0) ; lgg in i SPX move.w d6,6+2(a0) ; lgg in i SPY cmp.w #2,8+2(a0) bne .no_vnd_bana_fi move.w 18+2(a0),d5 move.w 16+2(a0),18+2(a0) ; NY_VAG=LAST_VAG move.w d5,16+2(a0) .no_vnd_bana_fi: rts .rut_tom: move.l 56+2(a0),a4 move.l #0,(a4) ; ( A(ADDR_FI)=0 ) add.w d7,a3 move.l a3,56+2(a0) ; Spara adr till fi move.l a0,(a3) ; A(ADDR*4)=adressen till fi (D7 redan adderad) move.w d3,20+2(a0) ; Flytta in ADDR i ADDR_FI .tillbaka: rts *, * Hit kommer vi om fi str framfr en drr * *, .door: * Denna rutin ppnar drren (om den nu inte redan r ppen) * i a4 ligger adr till drren cmp.w #100,48+2(a0) bge .check_open move.w 2(a4),d4 move.w 4(a4),d5 lsr.w #6,d4 lsr.w #6,d5 lsl.w #5,d5 add.w d4,d5 lsl.w #4,d5 tst.l 4(a3,d5.w) ; Kolla LO 234 bne .rut_tom tst.l 8(a3,d5.w) bne .rut_tom tst.l 12(a3,d5.w) bne .rut_tom cmp.w #-1,22(a4) bgt .check_open ; Om det r en nyckel-drr skall vi ; kolla om den r ppen. blt .check_open ; Om det r en event-drr lea akt_d_adr,a5 move.w #ANT_DOOR-1-1,d4 ; max antal drrar samtidigt=ANT_DOOR (-1 fr att om alla r upptagna s skrivs sista ver) .chkadr1 cmp.l (a5),a4 beq.s .open cmp.l #0,(a5) beq.s .put_adr addq.l #4,a5 dbf d4,.chkadr1 move.l a4,(a5) bra.s .open .put_adr move.l a4,(a5)+ subq.w #1,d4 blt.s .open .chkadr2 cmp.l (a5),a4 bne.s .nollej move.l #0,(a5) .nollej addq.l #4,a5 dbf d4,.chkadr2 .open * Slut p ppnadrr rutinen move.w 20(a4),d4 ; Drr animationen cmp.w #OPEN,d4 bge .vnd ; Vnd om drren hller p att stngas cmp.w #15,d4 bgt.w .no_wait ; Drren r redan ppen s fi vntar inte. * Nu vet vi att drren hller p att ppnas. move.w d4,60+2(a0) ; Antal cykler att vnta tills drren ; r helt ppen. move.w 26+2(a0),d4 ; Flytta tillbaka spelaren sub.w d4,0+2(a0) ; X=X-IX move.w 28+2(a0),d4 q sub.w d4,2+2(a0) ; Y=Y-IY bra .tillbaka .no_wait: * Drren r ppen och det r bara att fortstta knalla... bra .rut_tom * Hit kommer vi om Fi hller p att ddsanimeras eller om han str * vid en nyckeldrr. D fi ej kan ppna drren sjlv! .check_open move.w 20(a4),d4 ; Drr animationen cmp.w #OPEN,d4 bge .vnd ; Vnd om drren hller p att stngas cmp.w #15,d4 bgt.w .no_wait ; Drren r redan ppen s fi fortstter g bra .vnd ; Drren r stngd eller hller p att ; ppnas. *% * Kolla om det r ngon vgg ivgen * *% check_wall: move.l (a0),d0 ; Fi X asr.w #4,d0 move.w d0,x1 move.l 2(a0),d1 ; Fi Y asr.w #4,d1 move.w d1,y1 move.w (a1),x2 ; Spelar X move.w 2(a1),y2 ; Spelar Y move.w x2,d0 sub.w x1,d0 bge .no_neg neg.w d0 .no_neg: move.w y2,d1 sub.w y1,d1 bge .no_neg2 neg.w d1 .no_neg2: cmp.w d1,d0 blt .more_y .more_x: move.w x2,d0 cmp.w x1,d0 bge .no_swap move.l x1,d0 move.l x2,x1 move.l d0,x2 ; Swappa .no_swap: moveq.l #0,d0 move.w y2,d0 sub.w y1,d0 swap d0 asr.l #2,d0 move.w x2,d1 sub.w x1,d1 divs d1,d0 ; d0=K move.w x1,d1 muls.w d0,d1 swap d1 asl.l #2,d1 2;@2^Ibsq<<" |a c``` "<<" bq<<0 0bq<<p pbq<``b "0sc3p0|