;--------------------------------------------------------------------------- ; Space Invaders source code (Kollar Zoltan) ; ; Written by Xavier Ackaouy ;--------------------------------------------------------------------------- display = 3C00h keyboard = 3840h ;csak a control sort hasznalja inkey = 002Bh ;system inkey rutin key.enter = 00000001b ;enter key key.left = 00100000b ;left key key.right = 01000000b ;right key key.fire = 00001000b ;up key key.break = 00000100b ;break key speaker = 255 ;hangszoro port ;a display cimek a konnyebb attekinthetoseg miatt a kovetkezokepp vannak ;abrazolva: ROW.n +column, ahol n a sor szama, column pedig az oszlop row.0 = display + 0 * 64 row.1 = display + 1 * 64 row.2 = display + 2 * 64 row.3 = display + 3 * 64 row.4 = display + 4 * 64 row.5 = display + 5 * 64 row.6 = display + 6 * 64 row.7 = display + 7 * 64 row.8 = display + 8 * 64 row.9 = display + 9 * 64 row.10 = display + 10 * 64 row.11 = display + 11 * 64 row.12 = display + 12 * 64 row.13 = display + 13 * 64 row.14 = display + 14 * 64 row.15 = display + 15 * 64 ;--------------------------------------------- ;ix index valtozok ;------------------------------------------------ ?bases = bases - data.table ?demo.length = demo.length - data.table ?score = score - data.table ?base.firekey = base.firekey - data.table ?base.firepos = base.firepos - data.table ?ufo.status = ufo.status - data.table ?ufo.pos = ufo.pos - data.table ?ufo.speed = ufo.speed - data.table ?ufo.sound = ufo.sound - data.table ?base.firespd = base.firespd - data.table ?extrabase = extrabase - data.table ?enemy.pos = enemy.pos - data.table ?enemy.delay = enemy.delay - data.table ?enemy.phase = enemy.phase - data.table ?enemy.dir = enemy.dir - data.table ;------------------------------------------------ org 7000h start: di ld ix,data.table ld hl,0 ld (highscore),hl ld sp,7FFFh ld de,row.0 +0 ;Score sor display-re ld hl,txt.score call print ;--------------------------------------------------------------------------- ; info kepernyo osszeallitasa ;--------------------------------------------------------------------------- restart: call clrscr ;torli a jatakreszt, score sor marad ld a,r ;random valtozo inicializalasa ld (random + 1),a ld (ix+?bases),3 ;3 bazis call display.base ;kirajzolasa ld hl,row.1 +0 ;keret felso sora ld (hl),8Ch ld de,row.1 +1 ld bc,63 ldir ld hl,row.5 +0 ;keret also sora ld (hl),83h ld de,row.5 +1 ld bc,63 ldir ;a keret ferde vonalai ld a,0A0h ld (row.4 + 0),a ld a,84h ld (row.4 + 1),a ld a,88h ld (row.4 +62),a ld a,90h ld (row.4 +63),a ld a,0ACh ld (row.1 + 0),a ld a,81h ld (row.2 + 1),a ld a,82h ld (row.2 +62),a ld a,9Ch ld (row.1 +63),a ld hl,txt.letsplay ;LET'S PLAY ld de,row.2 +26 call print ld hl,txt.space ;SPACE ld de,row.3 +28 call print ld hl,txt.invaders ;INVADERS ld de,row.4 +26 call print ld a,'.' ;csillagok ld (row.2 +8),a ld (row.4 +5),a ld (row.3 +14),a ld (row.4 +15),a ld (row.2 +21),a ld (row.3 +42),a ld (row.4 +49),a ld (row.3 +54),a ld (row.4 +60),a ld hl,txt.copyright ;copyright sor ld de,row.6 +0 call print ld hl,txt.commands ;THE COMMANDS ld de,row.7 +46 call print ld hl,txt.baseleft ;BASE TO THE LEFT ld de,row.8 +30 call print ld hl,txt.baseright ;BASE TO THE RIGHT ld de,row.9 +30 call print ld hl,txt.firebutton ;THAT'THE FIRE BUTTON ld de,row.10 +30 call print ld hl,txt.extrabase ;EXTRA BASE WHEN... ld de,row.12 +29 call print ld hl,txt.pressenter ;PRESS ENTER... ld de,row.14 +29 call print ld hl,txt.mystery ;-=O=- MYSTERY? ld de,row.7 +6 call print ld b,'4' ;ellensegek es pontjaik ld hl,enemy.40pts ld de,row.9 +5 call enemy.score ld hl,enemy.30pts ld de,row.11 +5 call enemy.score ld hl,enemy.20pts ld de,row.13 +5 call enemy.score ld hl,enemy.10pts ld de,row.15 +5 call enemy.score ;zene lejatszasa elorefele ld a,23h ;INC IY ld (play.music@5 +1),a ld iy,music.tbl call play.music jp z,game ;enter volt? igen -> game ;---------------------------------------------------------------------------- ;demo - ellenseg kijavitja a szavakat ;---------------------------------------------------------------------------- ld b,19 ;ellenseg bemegy a PLAV V betujeig ld de,row.2 +56 @1: call demoenemy.move jp z,game ;Ha kozben enter volt, --> game dec de djnz @1 ld hl,row.2 +37 ;Beakasztja a "vonohorgot" ld (hl),'-' ; V/- dec hl ld (hl),'/' ld b,1 ;Kicsit var mielott visszaindul call wait jp z,game ;enter --> game ld b,18 ;Kiviszi a rossz betut ld de,row.2 +38 @2: call demoenemy.move ld h,d ld l,e ld (hl),'-' dec hl ld (hl),'/' dec hl ld (hl),'V' dec hl ld (hl),' ' ;itt torli a V-t az elozo poz.bol inc de jp z,game ;enter --> game djnz @2 ld hl,enemy.demo+1 ;ellenseg alaphelyzetbe ld de,row.2 +56 call print ld b,1 ;kicsit var call wait ld b,18 ;betolja a jo betut ld de,row.2 +56 @3: call demoenemy.move ld h,d ld l,e dec hl dec hl ld (hl),'-' dec hl ld (hl),'/' dec hl ld (hl),'Y' dec de jp z,game ;enter --> game djnz @3 ld hl,enemy.demo+1 ;ellenseg alaphelyzetbe ld de,row.2 +38 call print ld b,1 ;kicsit var call wait ld hl,row.2 +36 ld (hl),' ' ;torli a '/' jelet inc hl ex de,hl ld hl,enemy.demo ;ellenseg most space-el kezdodik call print ;torli a '-' jelet call test.enter ;enter? jp z,game ;igen, --> game ld b,11 ;jobbra megy a CCOMMANDS C-je fole ld de,row.2 +38 @4: ld h,d ld l,e dec hl ld (hl),' ' call demoenemy.move jp z,game inc de djnz @4 ld b,1 ;kicsit var call wait ld hl,firesnd.mode ld (hl),25h ;DEC H inc hl ld (hl),0Fh ;RRCA ld h,1 ;loves hangja call fire.sound ld iy,row.3 +50 ld hl,row.6 +50 ld (hl),80h ;a keretbe lyukat tesz ld (iy+0),99h ;a lovedek inditasa ld e,1 ;lovedek fazisa <- 1. @5: ld bc,0500h ;lovedek sebessege @6: call test.enter jp z,game ;enter? --> game dec bc ld a,c or b jr nz,@6 ;varakozas ld a,(iy+40h) ;elerte a C betut? xor 'C' jr nz,@7 ;nem, --> push iy ;torli a C betut pop hl ;es a becsapodas hangja call demo.hit.sound jr @8 @7: ld a,e ;lovedek fazisa call fire.down ;mozgatasa lefele ld e,a ;uj fazis mentese jr @5 @8: ld b,9 ;ellenseg visszamegy a jobb szelre ld de,row.2 +48 @9: ld h,d ld l,e dec hl ld (hl),' ' call demoenemy.move jp z,game ;enter? -> game inc de djnz @9 ld b,01h call wait ld de,row.2 +56 ;ellenseg torlese ld bc,5 ld hl,row.2 +55 ldir ;zene lejatszasa visszafele ld a,2Bh ;DEC IY ld (play.music@5 +1),a ld iy,music.tbl +11 call play.music jp z,game ld (ix+?demo.length),10h call game.start jp restart ;---------------------------------------------------------------------------- ; game - jatek inditasa ;---------------------------------------------------------------------------- game: ld (ix+?demo.length),0 call game.start jp restart game.start: call clrscr ;a score sor kivetelevel torli scr-t dec (ix+?bases) ;bases <- 2 call display.base ;bazisok display-re ld hl,default.tbl1 ld de,data.table1 ld bc,18 ldir ex de,hl ld (hl),0 ld d,h ld e,l inc de ld bc,001dh ldir ;fedezekek kirajzolasa ;--------------------- ld hl,row.14 +0 ;fedezekek also resze ld b,4 ;4 fedezek van @1: push bc ld bc,7 add hl,bc ld (hl),95h ;racs ld d,h ld e,l inc de ldir pop bc djnz @1 ld hl,row.13 +0 ;fedezekek felso resze ld b,4 @2: push bc ld bc,7 add hl,bc ld (hl),97h ;racs es teto ld d,h ld e,l inc de ldir pop bc djnz @2 ld a,95h ;a jobb felso sarkok javitasa ld (row.13 +14),a ld (row.13 +28),a ld (row.13 +42),a ld (row.13 +56),a ld hl,score+1 ;pontszam kiirasa ld de,row.0 +7 call print.score main.loop: ld hl,(base.pos) ;bazis mozgatasa ld a,(demo.length) ;demoban van? or a jr nz,@1 ;igen, random mozgas ld a,(keyboard) ;kulonben a billentyuket hasznalja jr move.base ;demo.length - milyen surun kerjen uj billentyut (rnd) ;demokeys - demo rnd billentyuk ;----------------------------------------------------- @1: dec (ix+?demo.length) ld a,(demokeys) jr nz,move.base ;uj bill.t kell kerni? @2: call rnd ;a hosszt allitja be srl a ;hossz = rnd mod 16 srl a ;de nem lehet 0 (akkor nem demo lenne) srl a srl a jr z,@2 ld (demo.length),a call rnd ;billentyuk veletlemszeruen ld (demokeys),a ;bazis mozgatasa, pozicioja HL-ben ;--------------------------------- move.base: and key.left + key.right cp key.left ;balra? jr nz,@1 dec hl @1: cp key.right ;jobbra? jr nz,@2 inc hl @2: push hl ;bal szelen tulmegy? ld bc,row.15 +0 scf ccf sbc hl,bc ;sub hl,bc ld a,h ;hl >= bc? or a jr z,@3 ;igen, ok, nem ment tul pop hl ;bal szelere allitja ld h,b ;jobb oldalt most nem kell ld l,c ;vizsgalni jr @5 @3: pop hl ;jobb oldalon tulment? push hl ld bc,row.15 +59 scf ccf sbc hl,bc ld a,h ;hl < bc? or a jr nz,@4 ;igen, ok pop hl ;jobb szelere allitja ld h,b ld l,c jr @5 @4: pop hl @5: ld (base.pos),hl ;uj pozicio beallitasa ex de,hl ;es kirajzolasa ld hl,base.bottom ;(bazis also sorbeli grafikaja) call print ld a,(keyboard) ;break bill.re kilep xor key.break ret z ld a,(demo.length) ;demoban van? or a jr z,fire.base call inkey ;bill. le van nyomva? or a ;ha igen, demoban marmire kilep ret nz ;fire.base - bazis lovese ;------------------------ fire.base: call delay ;varakozas vagy ufo hangja ld a,(base.firepos) ;loves megy? or a jr nz,cont.basefire ;igen, folytatja ld a,(demo.length) ;demo mod? or a jr z,@1 call rnd ;demo bill. and 1Fh xor key.fire jr z,start.basefire ;tuz jp move.enemy @1: ld a,(keyboard) ;tuzgomb lenyomva? and key.fire ld b,a xor (ix+?base.firekey) ;mar le volt? jp z,move.enemy ;igen, kilep ld a,b ;gomb status ld (base.firekey),a or a jp z,move.enemy start.basefire: ld hl,(base.pos) ;bazisba rajzolja a lovedeket inc hl inc hl ld (hl),'[' push hl ;bazis kozepe ld hl,firesnd.mode ;hang beallitasa ld (hl),24h ;INC H inc hl ld (hl),14h ;INC D call rnd ;loves hangmagassaga and 7 ;veletlenszeru (1-8) inc a ld h,a call fire.sound ;hang ki pop hl ;bazis kozepe vissza ld (hl),0BCh ;torli a lovedeket ld (base.firepos),hl ;lovedek cime jr move.bfire cont.basefire: inc (ix+?base.firespd) ;lovedek sebessege ld a,(base.firespd) xor 2 jp nz,move.enemy ld (base.firespd),a ;szamlalot torli ld hl,(base.firepos) ;lovedeket torli ld (hl),80h move.bfire: ld bc,64 ;lovedek egy sorral feljebb scf ccf sbc hl,bc ld (base.firepos),hl ld bc,row.1 +0 ;tulment? scf ccf sbc hl,bc ;pos < row.1 ? ld a,h or a jp p,@1 ;nem, ok --> tovabb ld (ix+?base.firepos),0 ;torli a lovest jp move.enemy ;talalat figyeles ;---------------- @1: ld hl,(base.firepos) ;ures helyre megy? ld a,(hl) xor 80h jr nz,hit ;nem, vmit eltalalt draw.missile: ld (hl),'[' jp move.enemy hit: push hl ;mit talalt el? ld b,0 ;milyen szeles? @1: dec hl ;balra nez ld a,(hl) cp 80h ;ures? jr z,@2 cp 95h ;fedezek? jr z,@2 cp 97h jr nz,@1 @2: inc hl ;jobbra nez ld a,(hl) cp 80h ;ures? jr z,@3 cp 95h ;fedezek? jr z,@3 cp 97h jr z,@3 inc b ;mas jr @2 @3: ld a,1 ;1 szeles? xor b pop hl jp nz,hit.cont ;nem, ellenseg, ufo, fedezek ;lovedeket talalt el, kikeresi a tablazatbol, hogy melyik az ;----------------------------------------------------------- ld iy,enemy.firepos ;ellenseg lovedekei ld b,8 ;max 8 lovese lehet kinn @4: push hl push bc ld a,(iy+0) ;phase ld c,(iy+1) ;low addr or a ld b,(iy+2) ;high addr jr z,@5 ;ez nem aktiv, --> scf ;talalt? ccf sbc hl,bc ld a,l or h jr z,clr.missile ;igen, --> torli cp 64 ;alatta van? jr z,clr.missile cp -64 ;felette van? jr z,clr.missile @5: inc iy ;tablazat kov. elemere all inc iy pop bc inc iy pop hl djnz @4 jr draw.missile ;nem talalta meg... clr.missile: pop bc pop hl push iy pop de ld (iy+0),0 jp clr.missile1 ;folytatja a torlest... ;nem lovedeket talalt, tovabb vizsgal hit.cont: ld a,(hl) cp 95h ;fedezek? jr z,clr.basefire cp 97h jr z,clr.basefire jp hit.mystery clr.missile1: ld a,(hl) ;lovedek 1. fazisban ? cp 99h jr z,clr.basefire cp 0A6h jr z,clr.basefire ;igen, --> ld iy,(base.firepos) ;ha nem, a felette levo sort ld (iy+0C0h),80h ;is torolni kell (+C0h !) clr.basefire: ld (ix+?base.firepos),0 ;torli a bazis loveset call hit.sound ;talalat hangja jp move.enemy ;ufot talalta el? hit.mystery: ld hl,(base.firepos) ld a,(hl) cp '-' jp z,mystery.score cp '=' jp z,mystery.score cp 'O' jp z,mystery.score ;ellenseget talalt el ;-------------------- hit.enemy: ld bc,(enemy.pos) ;melyik sorban talalt? scf ccf sbc hl,bc ld b,7 ;HL := HL div 128 @1: srl h ;azaz HL <- a sor szama rr l djnz @1 ld c,10000000b ;melyik oszlopban? ld a,(base.firepos) sub (ix+?enemy.pos) and 3Fh @2: sub 7 ;7 ch tavolsagra vannak jp m,@3 ;egymastol srl c jr @2 @3: ld de,enemytable ;index ex de,hl ld d,0 add hl,de ;ellenseg sora ld a,(hl) ;ellenseg torlese xor c ld (hl),a ;tablazatba vissza ;torli a kepernyorol a kilott ellenseget ;--------------------------------------- clr.enemy: ld hl,(base.firepos) ;megkeresi az ellenseg @1: dec hl ;bal szelet ld a,(hl) xor 80h jr nz,@1 ;eloszor inverzbe teszi ld b,5 ;5 ch szeles push hl @2: inc hl ld a,(hl) xor 7Fh ld (hl),a djnz @2 ;hangot general (melybol magasba megy) xor a ld b,80 ld d,b @3: ld c,d @4: dec c jr nz,@4 xor 1 out (speaker),a dec d djnz @3 ;majd kitorli a kepernyorol pop hl ld b,5 @5: inc hl ld (hl),80h djnz @5 ;pontozas ld a,e ;melyik sor volt? sub 4 ;score := -(row - 4) + 1 neg jr nz,@6 ld a,1 ;also ket sor 10-10 pont @6: sla a ;pontszam BCD-ben van, ezert sla a ;szoroz 16-al sla a sla a add a,(ix+?score) ;hozzaadja a pontszamot daa ld l,a ld a,(score+1) adc a,0 daa ld h,a set.score: ld (score),hl ;uj pontszam mentese ld hl,score+1 ld de,row.0 +7 call print.score ;kiirja disp.re ;extra base vizsgalat ld a,(score+1) ;0700 ? sub 07h jp m,@2 ;kevesebb, --> ld a,(extrabase) ;mar volt extra base? or a ;ha igen, nem ad tobbet jr nz,@2 ld (ix+?extrabase),-1 ;jelzi az extra bazist ;extra base effect ld b,2 @1: inc (ix+?bases) ;uj bazis felvillantasa push bc call display.base ld c,80 ;rovid hangeffect call xbase.effect dec (ix+?bases) ;uj bazis kikapcsolasa call display.base ld c,80 ;rovid effect call xbase.effect pop bc djnz @1 ;2x inc (ix+?bases) ;uj bazis kirajzolasa call display.base ld c,255 ;hosszu melyulo effect call xbase.effect @2: ld (ix+?base.firepos),0 ;bazis loves torlese ;maradt meg ellenseg? ld hl,enemytable ld b,5 @3: ld a,(hl) or a jp nz,move.enemy inc hl djnz @3 ;mind ki lett love, uj ellensegek ld hl,default.tbl2 ld de,data.table2 ld bc,14 ldir jp main.loop ;ufo talalat pontozasa ;--------------------- mystery.score: ld d,0 ;DE <- veletlen BCD pontszam call rnd and 0Fh daa ld b,a call rnd and 30h daa add a,b daa add a,50h daa ld e,a ld hl,(base.firepos) ;a loves poziciojaba kiirja dec hl ld a,e ;magasabb helyiertek srl a srl a srl a srl a add a,'0' ld (hl),a inc hl ;alacsonyabb h.ertek ld a,e and 0Fh add a,'0' ld (hl),a ;ufo talalat effect ;------------------ m.effect: ld b,80 push de ;pontszam mentese ld e,1 ;futo pont iranya ld d,255 @1: push bc @2: ld a,l ;pont futtatasa add a,e ld l,a ld a,(hl) cp 80h ;ufon tulment? jr nz,@3 ;nem, ok ld a,e ;iranyvaltas neg ld e,a jr @2 @3: ld b,30 ld (hl),8Fh ;pont display-re push af ;eredeti karakter mentese ;hang generalasa ;---------------------------------------------------------------------- ;eloszor lassan emelkedo magassagu hang, majd amikor D kisebb lesz mint ;B 30 erteke, akkor vibralasba megy at xor a ex af,af' ld c,d @4: ld a,c @5: dec a jr nz,@5 ex af,af' xor 1 out (speaker),a ex af,af' dec c djnz @4 pop af ;eredeti karakter vissza ld (hl),a dec d dec d dec d pop bc djnz @1 pop de ;pontszam elo ld a,e ;HL <- score + DE (BCD-ben) add a,(ix+?score) daa ld l,a ld a,d adc a,(ix+?score+1) daa ld h,a push hl ;torli az ufo sort ld hl,row.1 +0 ld de,row.1 +1 ld bc,003Fh ldir ld (ix+?ufo.pos),0 ;torli ufot pop hl jp set.score ;pontszam kiirasa ;---------------------------------------------------------------------------- ; ellenseg mozgatasa es kirajzolasa ;---------------------------------------------------------------------------- move.enemy: call delay ;ufo hangja vagy varakozas dec (ix+?enemy.delay) ;mozgatni kell az ellenseget? ld a,(ix+?enemy.delay) or a jp nz,move.missile ;nem, --> ;ellenseg lepesenek a hangja a pozicioja szerinti hangmagassaggal ld a,(enemy.pos) ;8 fele hang van and 7 ld e,a ld d,0 ;offset ld iy,enemy.step.data add iy,de xor a ex af,af' ld d,(iy+0) ;hangmagassagok elo ld e,(iy+1) ld bc,500 ;hang hossza @1: dec e ;1. hang magassaga jr nz,@2 ld e,(iy+1) ;szamlalo visszaallitasa ex af,af' ;hangszoro valtasa xor 1 out (speaker),a ex af,af' @2: dec d ;2. hang magassaga jr nz,@3 ld d,(iy+0) ex af,af' ;hangszoro valtasa xor 2 out (speaker),a ex af,af' @3: dec bc ld a,c or b jr nz,@1 ;ellenseg mozgatasa ld a,(ix+?enemy.phase) ;grafika fazisanak valtasa xor 6 ;6 ch. egy grafika ld (ix+?enemy.phase),a ld hl,(enemy.pos) ;ellensegek pozicioja emove.loop: ld a,(ix+?enemy.dir) ;mozgas iranya or a jp p,@1 ;jobbra dec hl jr @2 ;balra @1: inc hl @2: ld (enemy.pos),hl ;uj poz. mentese ex de,hl ;DE <- display cim ld b,0 ld iy,enemytable ;jelen levo ellensegek ld hl,enemy.40pts ;fentrol lefele 40,30...pts ld c,(ix+?enemy.phase) ;grafika fazisa add hl,bc ;HL <- grafika ld b,5 ;5 sorban vannak edraw.loop: ld a,(iy+0) ;1 sor ellenseg push bc push de ld b,8 ;8 ellenseg / sor @1: sla a jr nc,@2 ;mar kilove, nincs rajz push bc push hl push af push de call print ;ellenseg disp.re ;leert az also sorba? pop hl ;display cim vissza push hl ;cim +64 mar > mint kepernyo? ld bc,64 add hl,bc ld a,h xor 40h ;(4000h) jp z,clr.stack ;igen, game over --> pop de pop af pop hl pop bc ;kovetkezo rajzolasi pozicio @2: ex de,hl push bc ld bc,7 ;7 ch-re vannak egymastol add hl,bc pop bc ex de,hl djnz @1 ;sor kesz? ;kovetkezo sorra lep, kov. ellenseg grafika inc iy ;enemy tablazat pop de ex de,hl ;2 sorral lejebb megy ld bc,128 add hl,bc ex de,hl ld bc,12 ;kov. ellenseg grafika add hl,bc pop bc djnz edraw.loop ;megszamolja mennyi ellenseg van a sebesseg beallitasahoz ld hl,enemytable ;ellensegek ld b,5 ;5 sor ld a,0 ;szamlalo ecount.loop: push bc ld b,8 ;8 ellenseg / sor ld c,(hl) @1: sla c jr nc,@2 ;nincs, --> inc a @2: djnz @1 inc hl ;kov sor pop bc djnz ecount.loop ld (ix+?enemy.delay),a ;sebesseg beallitasa ;vegignezi a kep ket szelet, hogy ures-e. ha nem, megvaltoztatja ;az ellenseg mozgasiranyat ld hl,row.0 +63 ;majd a bal szel lesz belole ld b,15 ;15 sor ld de,63 ;a ket oldal tavolsaga jr test.disp test.disp.loop: ld a,(hl) ;jobb oldal xor 80h ;ures? jr nz,swap.dir ;nem, swap direction test.disp: inc hl ;bal oldal ld a,(hl) xor 80h ;ures? jr nz,swap.dir ;nem, swap dir. add hl,de ;jobb szelere all djnz test.disp.loop jp move.missile ;ok, nem kell valtani ;iranyvaltas es ellensegek 1 sorral lejebb swap.dir: ld a,(enemy.dir) ;iranyvaltas neg ld (enemy.dir),a ld hl,(enemy.pos) ;(NOP) ;torli az ellensegeket a disp.rol, a fedezekek maradnak ld hl,row.1 +0 ;1.sortol 14 sor ld (hl),80h ;torles ld de,row.1 +1 ld bc,037Fh @1: ldi jp po,@2 ;kesz? ld a,(de) cp 97h ;fedezek? jr z,@2 cp 95h jr nz,@1 @2: ld hl,(enemy.pos) ;1 sorral lejebb lep ld bc,64 add hl,bc ld (enemy.pos),hl jp emove.loop ;ujrarajzolja a kepet ;torli a stack-et, game over clr.stack: ld b,06h @1: pop hl djnz @1 jp game.over ;---------------------------------------------------------------------------- ; ellenseges lovesek mozgatasa ;---------------------------------------------------------------------------- move.missile: call delay ;var vagy ufo hangja ld b,8 ;max 8 lovedek ld iy,enemy.firepos ;lovedekek tablazata next.missile: ld a,(iy+0) ;lovedek megy? (fazisa) or a jp z,ehit.continue ;nem, --> ld l,(iy+1) ;lovedek cime ld h,(iy+2) push iy ;tablazat cimet menti push hl ;lovedek cime -> IY pop iy push bc ;lovedek mozgatasa lefele call fire.down ;A - lovedek fazisa pop bc push iy ;lovedek uj cime -> HL pop hl pop iy ;tablazat cime vissza ld (iy+0),a ;uj fazis ;s cim vissza ld (iy+1),l ;a tablazatba ld (iy+2),h and 3 ;lovedek abs(fazis) = 1? sub 1 jp nz,ehit.continue ;nem, nincs vizsgalat ;lovedek kiment a kepbol? ld de,64 ;(kov. sor mar out of disp?) add hl,de ld a,h xor 40h ;(HL > 3FFF ?) jr nz,test.hit ;nem, --> ld (iy+0),0 ;torli a lovedeket scf ccf sbc hl,de ;visszaall a lovedekre ld (hl),80h ;torli disp.rol jp ehit.continue ;---------------------------------------------------------------------------- ; ellenseg lovedeke eltalalt vmit? ;---------------------------------------------------------------------------- test.hit: ld a,(hl) ;lovedek alatt mi van? xor 80h ;ures, --> jp z,ehit.continue ;talalat ;------- ld de,64 clr.hit: push hl scf ccf sbc hl,de ld (hl),80h pop hl hit.proc: ld (iy+0),0 ;torli a lovedeket ld a,(base.firepos) ;bazist lovedeket talalta el? xor l jr nz,@1 ld a,(base.firepos+1) xor h jp z,hit.basemissile ;igen --> @1: ld a,(hl) ;fedezeket talalt? cp 95h jp z,hit.bunker cp 97h jp z,hit.bunker ;akkor csak a bazist talalhatta el, felrobbantja ;----------------------------------------------- explose.base: push bc ld hl,(base.pos) ld b,8 @1: push bc push hl ld b,5 push hl ;bazis kirajzolasa ld hl,base.bottom ld de,(base.pos) call print pop hl @2: call rnd ;bazis robbanasat rajzolja or (hl) ld (hl),a inc hl djnz @2 pop hl pop bc push bc ;hang generalasa (melyulo sisterges) xor a ex af,af' ld c,80 @3: ld e,b call rnd @4: dec e jr z,@5 srl a jr @4 @5: or a @6: jr z,@7 dec a jr @6 @7: ex af,af' xor 1 out (speaker),a ex af,af' dec c jr nz,@3 pop bc djnz @1 ;torli a bazist ld b,5 @8: ld (hl),80h inc hl djnz @8 dec (ix+?bases) ;elvesz egy bazist ld a,(ix+?bases) or a ;elfogyott? jp m,@9 ;igen, game over ld b,1 ;kicsit var call wait call display.base ;kirajzolja a maradek bazisokat ld hl,row.15 +0 ;bal also sarokba az uj bazis ld (base.pos),hl pop bc jr ehit.continue @9: pop bc jp game.over ;eltalaltak a bazis lovedeket hit.basemissile: ld (ix+?base.firepos),0 ;torli a bazis loveset ;a fedezeket talalta el hit.bunker: push bc ;hang generalasa call hit.sound pop bc ;kovetkezo lovedekre all ehit.continue: ld de,3 ;tablazat kov. elemere add iy,de dec b jp nz,next.missile ;---------------------------------------------------------------------------- ; ellenseges loves generalasa ;---------------------------------------------------------------------------- call rnd ;legyen loves? and 7 ;1:8 esellyel lesz csak jp nz,generate.ufo ;loves generalas call rnd ;melyik oszlopban legyen? and 7 ;0-7 ld c,a ;*3 add a,c add a,c ld l,a ;tablazat index ld h,0 ld de,enemy.firepos add hl,de ld a,(hl) ;ott mar van? or a jr nz,generate.ufo ;igen, --> kilep ;lovedek offset szamolasa hitgen: ld b,10000000b ld a,c ;oszlop? or a push hl push bc ld a,43h ;+1 sor es a kozepere all @1: jr z,@2 ;megvan? --> srl b ;maszk shiftelese add a,7 ;a kov. 7 oszloppal jobbra van dec c jr @1 @2: ex af,af' ;offset mentese ld c,b ;maszk ld iy,enemytable+4 ;ellenseg also sor ld b,5 ;5 sor van ld hl,(enemy.pos) ld de,0200h ;disp. cim (ellenseg also sor) add hl,de ld de,0080h @3: ld a,c ;ott van ellenseg? and (iy+0) jr nz,@4 ;igen, ok --> dec iy ;egy sorral feljebb scf ccf sbc hl,de djnz @3 pop bc ;nincs ellenseg abban pop hl ;az oszlopban jr generate.ufo @4: ex af,af' ;offset elo ld e,a ld d,0 add hl,de ;lovedek cime pop bc push hl ;hanggeneralas, beallitja a parametereket ld hl,firesnd.mode ld (hl),25h ;DEC H inc hl ld (hl),15h ;DEC D ld h,c call fire.sound pop hl pop iy ld (iy+0),1 ;1. fazis ld (iy+1),l ;lovedek cime ld (iy+2),h ld a,(hl) ;ott van valami? xor 80h ld b,1 jp nz,hit.proc ;igen, megnezi mit talalt el ld (hl),99h ;lovedek disp.re ld de,0040h ;alatta mi van? add hl,de ld a,h xor 40h ;kiment a disp.rol? jr z,generate.ufo ;igen, ok ld a,(hl) ;eltalalt vmit? xor 80h jp nz,clr.hit ;igen, nem ures ;---------------------------------------------------------------------------- ; ufo generalasa ;---------------------------------------------------------------------------- generate.ufo: call delay ;var vagy ufo hangja ld a,(ufo.pos) ;ufo megy? or a jr nz,move.ufo ;igen, kilep call rnd ;RNDn & 2 = RND(n+1)? and 2 ld b,a call rnd xor b jp nz,end.main.loop ;nem, nincs ufo ld hl,(enemy.pos) ;ellenseg meg a felso sorban? ld a,h ;ha igen, kilep xor 3Ch jr nz,start.ufo ld a,l cp 7Fh jp m,end.main.loop ;ufo inditasa start.ufo: ld hl,row.1 +62 ;jobb szelerol indul ld (ufo.pos),hl ld (ix+?ufo.speed),0 ld (ix+?ufo.sound),64 ld (ix+?ufo.status),-1 jp end.main.loop ;---------------------------------------------------------------------------- ; ufo mozgatasa ;---------------------------------------------------------------------------- move.ufo: inc (ix+?ufo.speed) ;ufo sebesseg ld a,(ix+?ufo.speed) xor 4 ;1/4 sebesseggel megy jr nz,@1 ld (ix+?ufo.speed),a ld hl,(ufo.pos) ;ufo balra dec hl ld (ufo.pos),hl @1: ld bc,(ufo.pos) ;ufo befer teljesen? ld hl,row.1 +58 scf ccf sbc hl,bc ld a,h or a jp p,@2 ;igen, ok or l jp z,@2 ld bc,5 ;hossz szamolasa add hl,bc ld b,h ld c,l ld hl,mystery ;kirajzolasa ld de,(ufo.pos) ldir jp end.main.loop @2: ld hl,(ufo.pos) ;bal oldalon teljesen befer? ld bc,row.1 +1 scf ccf sbc hl,bc ld a,h or a jp m,@3 ;nem, --> ld de,(ufo.pos) ;ok, teljesen ki lehet rajzolni ld hl,mystery call print jp end.main.loop @3: ld a,l ;teljesen kilepett? xor 0FBh jp z,@4 ;igen, torli ex de,hl ;hossz szamolasa ld hl,mystery scf ccf sbc hl,de ld de,row.1 +1 call print ;disp.re jp end.main.loop @4: ld a,80h ld (row.1 +1),a ld (ix+?ufo.pos),00h end.main.loop: call delay jp main.loop ;---------------------------------------------------------------------------- ; game over ;---------------------------------------------------------------------------- game.over: call clrscr ;torli a kepernyot ld hl,row.7 +0 ;game over felso sor ld (hl),0B0h ;teli ld de,row.7 +1 ld bc,003Eh ldir ex de,hl inc hl ld (hl),0BFh ;bal oldali keret inc hl ld (hl),86h ;kockas resz ld d,h ld e,l inc de ld bc,003Ch ;vegig ldir ex de,hl ld (hl),0BFh ld a,0A6h ld (row.8 +1),a ld (row.8 +61),a ld hl,game.over.data ;grafika disp.re ld de,row.9 +0 ld bc,191 ldir ld hl,row.12 +0 ;also vonal ld (hl),83h ld de,row.12 +1 ld bc,003Eh ldir ;game over hangeffekt ld b,10h ld c,01h @1: ld a,01h ld h,0ffh @2: ld d,c @3: ld l,h @4: dec l jr nz,@4 xor 3 out (speaker),a dec d jr nz,@3 dec h dec h dec h dec h dec h jr nz,@2 ;a kozepso resz inverzbe ld hl,row.8 +1 push bc ld b,4 @5: push bc ld b,3Dh ;belso resz szelessege @6: ld a,(hl) xor 7Fh ld (hl),a inc hl djnz @6 pop bc inc hl inc hl inc hl djnz @5 pop bc inc c djnz @1 ;uj high score? ld hl,(score) ;sore > high score? ld de,(highscore) ld a,l sub e daa ld a,h sbc a,d daa jp c,exit ;nem. --> ld hl,(score) ;uj high score ld (highscore),hl ld hl,txt.welldone ;WELL DONE... ld de,row.4 +20 call print ;well done hangja ;---------------- welldone: ld d,2 ld e,1 ld c,e ld a,e ex af,af' @1: ld a,e cp d jr nz,@3 @2: ld a,c neg ld c,a add a,e ld e,a jr @1 @3: or a jr z,@2 ld a,d sub e ld h,a ld b,4 @4: ld a,e call spkr.out ld a,h call spkr.out djnz @4 ld a,e add a,c ld e,a inc d jr nz,@1 ld hl,highscore+1 ;uj high score disp.re ld de,row.0 +28 call print.score exit: ld b,2 call wait ret ;---------------------------------------------------------------------------- ; print - (HL) -> (DE) -re masol, 80h a string vege ;---------------------------------------------------------------------------- print: push bc ;BC-t megtartja @1: ldi ;1 chr masolasa ld a,(hl) ;a kovetkezo chr? xor 80h ;end of string? jr nz,@1 ;nem, tovabb ldi ;kov. string elejere all pop bc ret ;---------------------------------------------------------------------------- ; clrscr - torli a kepernyo jatekreszet, score sor marad ;---------------------------------------------------------------------------- clrscr: ld hl,row.1 +0 ;no comment, ures grafikus charral ld (hl),80h ;tolti fel a kepernyot ld de,row.1 +1 ld bc,15 * 64 ldir ret ;---------------------------------------------------------------------------- ; display.base - a bazisok kirajzolasa ;---------------------------------------------------------------------------- display.base: ld hl,row.0 +51 ;a bazisok elotti spc cime ld de,row.0 +52 ld bc,12 ldir ;torli a mezot ld b,(ix+?bases) ;bazisok szama? ld a,b or a ret z ;nincs tobb, kesz ld de,row.0 +52 ;bazisok kezdete @1: ld hl,graph.base ;bazis rajza call print ;disp.re djnz @1 ;van meg? ret ;---------------------------------------------------------------------------- ; enemy.score - ellenseg kirajzolasa es a pontertek melle ;---------------------------------------------------------------------------- enemy.score: call print ;ellenseg inc de ;2 spc inc de ld a,b ;pontszam? ld (de),a dec b ;pontszam csokken a kovetkezohoz inc de ld hl,txt.points ;0 POINTS call print ret ;---------------------------------------------------------------------------- ; play.music - a kezdo zene lejatszasa ;---------------------------------------------------------------------------- play.music: xor a ;hangszoro ki ex af,af' ld e,(iy+00h) ;hangmagassag tablazatbol ld d,(iy+0ch) ;2 szolam van ld b,12 ;12 hang lesz @1: ld hl,2000h ;1 hang hossza @2: dec e ;1. hang delay jr nz,@3 ld e,(iy+00h) ;visszaallitja a hang erteket ex af,af' ;pozitiv hullam valtasa xor 01h out (speaker),a ex af,af' @3: dec d ;2. hang delay jr nz,@4 ld d,(iy+0ch) ;visszaallitas ex af,af' ;negativ hullam valtasa xor 02h out (speaker),a ex af,af' @4: dec hl ;hang lejart? ld a,l or h jr nz,@2 @5: inc iy ;INC / DEC ! ld a,(keyboard) ;test enter key xor key.enter ret z ;enter lenyomva Z=1 djnz @1 ld b,2 wait: ld hl,-1 ;varakozas: vagy az ido lejartaig @1: dec hl ;vagy az enter lenyomasaig call test.enter ret z ld a,h or l jr nz,@1 djnz wait or 1 ret test.enter: ld a,(keyboard) xor key.enter ret ;demoenemy.snd - a maszkalo ellenseg hangja demoenemy.snd: push bc ld a,1 ld b,64 ld d,160 @1: ld c,d @2: dec c jr nz,@2 xor 03h out (speaker),a dec d djnz @1 pop bc ret ;demoenemy.move - ellenseg mozgatasa es a hangja demoenemy.move: push de ld hl,enemy.demo +7 call print call demoenemy.snd pop de push de ld hl,enemy.demo +1 call print call demoenemy.snd call test.enter pop de ret ;---------------------------------------------------------------------------- ;fire.sound - loves hangja ; ;input: H - hangmagassag ; firesnd.mode - ; ;---------------------------------------------------------------------------- fire.sound: ld l,h xor a ld e,a ld d,a ex af,af' ld c,0 firesnd.loop: ld b,10 @1: dec e jr nz,@2 ld e,d ex af,af' xor 1 out (speaker),a ex af,af' @2: dec l jr nz,@3 ld l,h ex af,af' xor 2 out (speaker),a ex af,af' @3: djnz @1 firesnd.mode: dec h ;Itt atirja a kodot a lovesnek dec d ;megfeleloen (bazis / ellenseg) inc c jr nz,firesnd.loop ret ;---------------------------------------------------------------------------- ;lovedek mozgatasa lefele (6 fazis) ; ;input: A - a lovedek fazisa, IY - lovedek cime ;output: A - uj fazis, display-en a lovedek uj kepe ; ;---------------------------------------------------------------------------- fire.down: rlca ;negativ fazis? jp c,@3 rr a cp 1 ;1. fazis? jr nz,@1 res 0,(iy+00h) ;bal felso pont torlese set 1,(iy+40h) ;kov. sorban jobb felso ponttal ;folytatodik ld a,2 ;uj fazis beallitasa ret @1: cp 2 ;2. fazis jr nz,@2 res 3,(iy+00h) set 2,(iy+40h) ld a,3 ret @2: res 4,(iy+00h) ;3. fazis set 5,(iy+40h) ld a,81h ld bc,0040h add iy,bc ret @3: rr a ;1. negativ fazis cp 81h jr nz,@4 res 1,(iy+00h) set 0,(iy+40h) ld a,82h ret @4: cp 82h ;2. negativ fazis jr nz,@5 res 2,(iy+00h) set 3,(iy+40h) ld a,83h ret @5: res 5,(iy+00h) ;3. negativ fazis set 4,(iy+40h) ld bc,0040h add iy,bc ld a,1 ret ;---------------------------------------------------------------------------- ; rnd - veletlenszam generalasa ; ; output: A - veletlenszam ; ; RNDn := (RNDn-1 + RNDn-4 + RNDn-5) Mod 256 ; ;---------------------------------------------------------------------------- rnd: push ix push hl ld ix,random push de ld a,(ix+1) push bc adc a,(ix+4) adc a,(ix+5) ld (random),a ld hl,random + 4 ld de,random + 5 ld bc,5 lddr pop bc pop de pop hl pop ix ret ;---------------------------------------------------------------------------- demo.hit.sound: ld bc,0040h ;lovedek torlese demoban ld (hl),80h add hl,bc ;---------------------------------------------------------------------------- ; ellenseg lovedek utkozesenek a hangja (novekvo magassagu sisterges) ; ; kozben a becsapodas helyenek felvillantasa ; ;---------------------------------------------------------------------------- hit.sound: xor a ex af,af' ld a,(hl) ;karakter mentese ld b,64 @1: call @2 ;hanggeneralas ld (hl),0BFh ;felvillantas call @2 ;hanggeneralas ld (hl),a ;eredeti karakter vissza djnz @1 ld (hl),80h ;ures hely a becsapodas helyen ret @2: push af call rnd ;RND Div 16 srl a srl a srl a add a,b @3: dec a ;hangmagassag ciklusa jr nz,@3 ex af,af' xor 01h out (speaker),a ex af,af' pop af ret ;---------------------------------------------------------------------------- ; pontszam kiirasa ; ; input: HL - pontszam cime, DE - display cim ; ;---------------------------------------------------------------------------- print.score: ld a,'0' rld ld (de),a inc de rld ld (de),a rld inc de dec hl rld ld (de),a inc de rld ld (de),a rld ret ;---------------------------------------------------------------------------- ; extra base hangeffect ;---------------------------------------------------------------------------- xbase.effect: ld d,1 xor a @1: ld e,d @2: dec e jr nz,@2 xor 1 out (speaker),a inc d dec c jr nz,@1 ret ;---------------------------------------------------------------------------- ; delay - ufo hangja ha megy, egyebkent varakozas ;---------------------------------------------------------------------------- delay: ld a,(ufo.pos) ;ufo megy? or a jr nz,play.ufosound ;igen, mozgatasa ld bc,399 ;delay @1: dec bc ld a,b or c jr nz,@1 ret ;---------------------------------------------------------------------------- ; play.ufosound - ufo hangja ; ; a hang fel-le hullamzo magassagu, az ufo.status az iranya ; ufo.sound a pillanatnyi magassaga, 34 es 64 kozott valtozik ;---------------------------------------------------------------------------- play.ufosound: ld b,3 xor a ex af,af' @1: ld a,(ufo.sound) ;hangmagassag beallitasa add a,(ix+?ufo.status) ;(+1 vagy -1) ld (ufo.sound),a cp 34 ;elerte valamelyik veget? jr z,@2 cp 64 jr z,@2 jp @3 ;ha nem, --> @2: ld a,(ufo.status) ;iranyvaltas neg ld (ufo.status),a @3: ld c,4 ;hossz @4: ld d,(ix+?ufo.sound) ;magassag @5: dec d jr nz,@5 ex af,af' ;hangszoro kimenet valtasa xor 02h out (speaker),a ex af,af' dec c jr nz,@4 djnz @1 ret ;---------------------------------------------------------------------------- ; A delay-al hangszoro valtasa ;---------------------------------------------------------------------------- spkr.out: dec a jr nz,spkr.out ex af,af' xor 3 out (speaker),a ex af,af' ret random: db 'RANDOM' ;--------------------------------------------------------------------------- ;IX indexelt es direkt cimzesu ;--------------------------------------------------------------------------- data.table: bases: db 0 ;bazisok szama db 0,0 demo.length: db 0 ;demo, ha nem 0 demokeys: db 0 ;demo billentyuzet highscore: dw 0 ;------------------------ data.table1: ;------------------------ score: dw 0 ;pontszam BCD base.pos: dw 0 ;bazis pozicio ;------------------------ data.table2: ;------------------------ enemy.phase: db 0 ;ellenseg grafika fazisa enemy.pos: dw 0 ;ellenseg pozicioja (egesz tabla) enemy.dir: db 0 ;ellenseg mozgasanak iranya enemy.delay: db 0 ;mozgasanak sebessege ufo.pos: dw 0 ;ufo pozicioja ufo.speed: db 0 ;sebessege ufo.sound: db 0 ;hangja enemytable: db 0,0,0,0,0 ;5x8 ellenseg (bit=1 ON) ;enemy.firepos = array [0..7] of record (phase : byte; address : word) enemy.firepos: db 0,0,0, 0,0,0, 0,0,0, 0,0,0 db 0,0,0, 0,0,0, 0,0,0, 0,0,0 base.firepos: dw 0 extrabase: db 0 base.firekey: db 0 ufo.status: db 0 base.firespd: db 0 txt.score: db 'SCORE =0000 ' db 'HIGH-SCORE=0000 ' db 'REMAINING BASES: ',80h mystery: db '-=O=-' ;---------------------------------------------------- ;ellensegek rajzai. fontos a base.bottom elso karak- ;tere, mert ez a lezaro karaktere az enemy.demo-nak ; ;2x 6 karakter, 2 fazisu mozgashoz ;---------------------------------------------------- enemy.40pts: db 080h,09Ah,0B3h,08Fh,0B3h,0A5h db 080h,09Ah,08Fh,0B3h,08Fh,0A5h enemy.30pts: db 080h,09Ah,02Eh,0BFh,02Eh,0A5h db 080h,09Ah,021h,0BFh,021h,0A5h enemy.20pts: db 080h,090h,0A7h,08Fh,09Bh,0A0h db 080h,084h,0A7h,08Fh,09Bh,088h enemy.10pts: db 080h,0A0h,0A7h,08Fh,09Bh,090h db 080h,088h,0A7h,08Fh,09Bh,084h enemy.demo: db 080h,0A0h,0A7h,08Fh,09Bh,090h db 080h,088h,0A7h,08Fh,09Bh,084h ;---------------------------------------------------- base.bottom: db 080h,0B0h,0BCh,0B0h,080h ;bazis az also sorban graph.base: db 8Ch,8Fh,8Ch,80h ;bazis rajza txt.letsplay: db 'LET',27h,'S PLAV',80h txt.space: db 'SPACE',80h txt.invaders: db 'INVADERS',80h txt.copyright: db '=== BY XAVIER ACKAOUY ==========' db '====== DISTRIBUTED BY SIVEA ===',80h txt.commands: db 'THE CCOMMANDS:',80h txt.baseleft: db 0AAh,' ^ BASE TO THE LEFT.',80h txt.baseright: db 0AAh,' ] BASE TO THE RIGHT.',80h txt.firebutton: db 0AAh,' [ THAT',27h,'THE FIRE BUTTON!',80h txt.extrabase: db 'EXTRA BASE WHEN 0700 POINTS.',80h txt.pressenter: db 'PRESS "ENTER" TO BEGIN.',80h txt.mystery: db '-=O=- MYSTERY ?',80h txt.points: db '0 POINTS.',80h music.tbl: db 015h,019h,020h,018h,01Ch,022h,019h,020h db 026h,01Ch,022h,02Bh db 0FFh,0FFh,0FFh,0AAh,0AAh,0AAh,080h,080h db 080h,055h,055h,055h ;default parameterek default.tbl1: dw 0 ;score dw row.15 ;bazis pozicio (bal also sarok) default.tbl2: db 0 ;ellenseg grafika fazisa dw row.0+63 ;ellenseg poz. db 1 ;ellenseg mozgasanak iranya db 1 ;ellenseg sebessege dw 0 ;ufo poz. db 0 ;ufo speed db 0 ;ufo sound db 0FFh,0FFh,0FFh,0FFh,0FFh ;osszes ellenseg ON enemy.step.data: db 033h,020h,030h,01ch,02bh,019h,030h,018h db 033h,015h,039h,018h,040h,019h,039h,01ch game.over.data: db 0bfh,099h,080h,080h,080h,0bfh,083h,083h db 083h,083h,080h,0bfh,083h,083h,083h,0bfh db 080h,0bfh,089h,0b0h,086h,0bfh,080h,0bfh db 083h,083h,083h,083h,080h,080h,080h,080h db 080h,080h,080h,0bfh,083h,083h,083h,0bfh db 080h,0b5h,080h,080h,080h,0bah,080h,0bfh db 083h,083h,083h,083h,080h,0bfh,083h,083h db 083h,0bfh,080h,080h,080h,099h,0bfh,080h db 0bfh,0a6h,080h,080h,080h,0bfh,080h,080h db 083h,0bfh,080h,0bfh,083h,083h,083h,0bfh db 080h,0bfh,080h,080h,080h,0bfh,080h,0bfh db 083h,083h,081h,080h,080h,080h,080h,080h db 080h,080h,080h,0bfh,080h,080h,080h,0bfh db 080h,082h,0adh,0b0h,09eh,081h,080h,0bfh db 083h,083h,081h,080h,080h,0bfh,083h,08fh db 0b3h,083h,080h,080h,080h,0a6h,0bfh,080h db 0bfh,099h,090h,090h,090h,093h,093h,093h db 093h,093h,090h,093h,090h,090h,090h,093h db 090h,093h,090h,090h,090h,093h,090h,093h db 093h,093h,093h,093h,090h,090h,090h,090h db 090h,090h,090h,093h,093h,093h,093h,093h db 090h,090h,090h,093h,090h,090h,090h,093h db 093h,093h,093h,093h,090h,093h,090h,090h db 090h,093h,090h,090h,090h,099h,0bfh txt.welldone: db 'WELL DONE, NEW HIGH-SCORE!!',80h db 0,0 end start