; Title : Worm ; Version : 91% ; Release Date : may 2000 ; Filename : worm.86p (5kb) ; Author(s) : Shiar ; Email Address : shiar@mailroom.com ; ICQ UIN : #43840958 ; Web Page : www.games3.net/shiar ; Description : ruling multiplayer game for 86 (most like Nibbles) ; Where to get this game : games3.net/shiar (home of Worm) ; Other games by author(s) : Shiar: Nemesis beta ; Additional Credits to : Matthew Shepcar (wrote original Peaworm, end'98) ; Jonah Cohen (wrote some parts of worm) ;----------------------------- ;----------- TO-DO ----------- ;----------------------------- ; 91% = DONE ; 2% * fix deaths linkplay and transmit game/level data ; 2% * make linkplay available for all gametypes (not just deathmatch) ; 1% * fix pea XOR problem in ctf (+dom?) ; * fix wormstop ; 1% * domination?: take control points by running over them and hold them ; * customizable keys ; * complete readme (+custom level info) ; 2% * ... (pollish, &&&) ; 99% = beta release ;100% = bugs fixed + levels done ;----------------------------- ;----------------------------- ;--------- W O R M --------- ;----------------------------- ;----------------------------- #define buffer ;use display buffer (otherwise write directly to screen) #define readymask ;"grays" out the field before starting a level ;#define readytext ;displays "prepare" before level starts ;#define invincible ;worms cannot die =) #define cal call #define psh push #define dnz djnz #include "asm86.h" #include "ti86asm.inc" _SHRACC = $4383 _SHLACC = $438B _divHLby10 = $4044 ;hl=hl/10 _divAby10 = $4DAF ;a=a/10 _HLTIMES10 = $41BF ;hl=hl*10 _cphlde = $403C _clrWindow = $4A86 ;clear screen _asapvar = $D6FC ;own name (worm) _MOV4B = $429B ;4x ld (de),(hl) _MOV5B = $4297 ;5x ld (de),(hl) _mov9b = $4283 ;9x ld (de),(hl) _ldHLind = $4010 ;ld hl,(hl) _swapt_ = $45F3 ;ex_ahl_bde _Get_Word_ahl = $521D ;ld de,(ahl) _Set_Word_ahl = $5221 ;ld (ahl),de _INC_PTR_AHL = $4637 ;ahl=ahl+1 _AHL_PLUS_2_PG3 = $4C3F ;ahl=ahl+2 _SET_ABS_SRC_ADDR = $4647 ;set source for mm.ldir =ahl _LOAD_ABS_SRC_ADDR = $5209 ;ahl = mm.ldir source _SET_ABS_DEST_ADDR = $5285 ;set destination for mm.ldir = ahl _SET_MM_NUM_BYTES = $464F ;number of bytes for mm.ldir = ahl _mm_ldir = $52ED ;24bit ldir _RAM_PAGE_1 = $47E3 ;set $8000+ to page 1 _RAM_PAGE_7 = $47F3 _PTEMP_END = $D29A ;end of VAT _load_ram_ahl = $462F ;ahl->page+hl _writeb_inc_ahl = $5567 ;ld (ahl),c _jforce = $409C ;TI-OS stack restored _EXLP = $4493 ;swap (hl),(de) b times ;----------------------------- ;------- data storage ------- ;----------------------------- ;--- permanent ScrBuffer = $8820 ;-A7FF (20*FF=1FE0) worm2p = $A800 ;-ABFF (400) %10101O00 worm1 = $AC00 ;-AC1D (31d) worm2 = $AC1F ;-AC3B (1F) worm3 = $AC3E ;-AC59 (1F) worm4 = $AC5D ;-AC77 (1F) balls = $AC7C ;-ACFF (3x43d) SinCosTable = $AD00 ;-AE00 (4x40) ;free $AE01 ;-AFFF (1FF) worm1p = $B000 ;-B7FF (800) %1011O000 worm3p = $B800 ;-BBFF (400) %10111O00 ;free $BF91 ;-BFFF (6F) ;program $D748 ;-E7FF (106D+4A) ;free $E800 ;-EFFF (800) worm4p = $F000 ;-F3FF (400) %11110O00 leveldata = $F400 ;-FA70 (<=671) peaspos = $AE01 ;--- temporary templevels = $BC00 ;(3*strings) @init namelength = $BC00 ;(1) @menu #ifdef buffer DispBuffer = $BC00 ;(10x57d) @game #else DispBuffer = $FC70 #endif ;----------------------------- ;------- program start ------- ;----------------------------- .org _asm_exec_ram WormVersion = 091 start: nop jp Start .dw 1 .dw WormMsg .dw WormIcon WormMsg: .db "WORM by SHIAR -- pre-beta 91%",0 WormIcon: .db 9,2 .db %10010110,%01101111 .db %10110101,%01001011 .db %01110011,%01001001 .db %00000011,%10000000 .db %00000001,%11100000 .db %00111000,%11111000 .db %01111110,%00111111 .db %11101111,%00001111 .db %11000011,%10000000 levelhead = 'w' levelhead2 = 91 ;worm levels header = "91" Start: ld (SpSave),sp cal _runindicoff cal _flushallmenus cal _RAM_PAGE_7 ld hl,$BFFF ;VAT start ld bc,templevels searchloop: ld de,(_PTEMP_END+1) ;VAT end or a ;nc sbc hl,de ;hl" ld hl,$0004 ld (_curRow),hl pop hl ld a,(hl) cp 255 jr nz,displevel ld hl,templevels ld a,(hl) displevel: inc hl ld d,(hl) inc hl ld e,(hl) inc hl ;ade=(hl) psh hl ;HL ld c,a ld h,d ld l,e ;cde=ahl=(hl) cal _load_ram_ahl ;hl=ahl ld b,(hl) ;b=title size psh bc cal _putps ;destr=abchl pop bc ;cde=hl pop hl ;HL levselect: halt psh hl psh de psh bc cal GET_KEY pop bc pop de pop hl cp K_RIGHT jr z,dispnextlevel sub K_SECOND jr z,loadlevel dec a ;K_EXIT ret z cp K_ENTER-K_EXIT+256 jr nz,levselect loadlevel: ld a,c ex de,hl ;ahl=cde inc b ;b=titlesize+1 skiptitle: cal _INC_PTR_AHL dnz skiptitle cal _Get_Word_ahl ld (leveldataSize),de ld d,8 ;counter ld bc,datalevels-2 cal loadgametype ld (hilvlposa),a ld (hilvlposhl),hl ld d,4 cal loadgametype cal _SET_ABS_SRC_ADDR xor a ld hl,leveldata cal _SET_ABS_DEST_ADDR xor a ld hl,0 leveldataSize =$-2 cal _SET_MM_NUM_BYTES cal _mm_ldir cal _LOAD_ABS_SRC_ADDR ;->ahl levelloaded: ld (hiscrposa),a ld (hiscrposhl),hl cal _RAM_PAGE_1 ;&&& res 2,(iy+13) ;appAutoScroll ld a,r ld (Seed),a ;----------------------------- ;----- build trig tables ----- ;----------------------------- ld hl,TrigPrecalc ld de,SinCosTable psh de ; >> 1 ld bc,65 ldir dec hl ld b,63 MirrorSineWave: dec hl ld a,(hl) ld (de),a inc de dnz MirrorSineWave pop hl ; << 0k ld b,128+64 NegativeSineWave: xor a sub (hl) ld (de),a inc hl inc de dnz NegativeSineWave ;----------------------------- ;---------- menu ------------- ;----------------------------- ld a,1 ld (curlevel),a DisplayMenu: cal _clrWindow ld de,$FC42 ;(10,2) ld hl,wtPicture ld a,16 ;height disptitleloop: ld bc,8 ;width ldir ex de,hl ld bc,8 ;next line add hl,bc ex de,hl dec a jr nz,disptitleloop ld hl,txtMenu ld de,$0D5A ld (_penCol),de cal _vputs ;by Shiar ld de,$0207 ld (_curRow),de cal _puts ;--- dec e ;$0206 ld (_curRow),de cal _puts ;Level <00> dec e ;$0205 ld (_curRow),de cal _puts ;Worms <2> dec e ;$0204 ld (_curRow),de ld hl,(CURtxtGame) cal _puts ;Singleplayer xor a cal menudraw jr howmanyworms mainMenu: cal menucall jr nz,notselect select: ld a,b dec a ;2nd item jp z,changeworms jp LetsGetThisPartyOn ;1/3/4 notselect cp K_EXIT jp z,ExitNoStats cp K_LEFT jr z,selleft cp K_RIGHT ld a,b jr nz,mainMenu or a jr z,changegame dec a jr z,changenrworms dec a jp nz,LetsGetThisPartyOn changelevel: ld hl,Gametype ld d,0 ld e,(hl) ld hl,nrlevels add hl,de ld d,(hl) ;max level for sel.game curlevel =$+1 ld a,1 inc a cp d jr c,changedlevel ld a,d changedlevel: ld (curlevel),a _dispcurlevel: ld hl,$0906 ld (_curRow),hl cal showA _mainMenu: jr mainMenu selleft: ld a,b dec a jr z,bchangenrworms dec a jr nz,mainMenu bchangelevel: ld a,(curlevel) dec a jr nz,changedlevel jr mainMenu changegame: ld a,1 ld (curlevel),a ld a,0 Gametype =$-1 ld hl,txtGame2 NEXTtxtGame =$-2 inc a and 7 ;mod 8 jr nz,okilydokily ld hl,txtGame okilydokily: ld (Gametype),a ld de,$0204 ld (_curRow),de ld (CURtxtGame),hl cal _puts ld (NEXTtxtGame),hl howmanyworms: ld hl,nrworms ld a,(Gametype) cp 2 ld (hl),1 jr c,dispnrworms inc (hl) ;2 jr dispnrworms ;mainMenu changenrworms: ld a,(Gametype) cp 2 ;&& jr c,_mainMenu ;type 0/1 ld hl,nrworms ld a,(hl) inc a cp 5 jr nc,dispcurlevel changednrworms: ld (hl),a dispnrworms: ld a,(hl) ;hl=nrworms ld hl,$0905 ld (_curRow),hl add a,'0' cal _putc dispcurlevel ld a,(curlevel) jr _dispcurlevel ;mainMenu bchangenrworms: ld hl,nrworms ld a,(hl) dec a cp 2 ;2-4 jr nc,changednrworms jr dispcurlevel menucall: psh bc menuwaitkey: halt \ halt cal GET_KEY or a jr z,menuwaitkey pop bc ;pop a as b cp K_UP cal z,menuup cp K_DOWN cal z,menudown cp K_ENTER ret z cp K_SECOND ret ;z=select menupos: ld a,b add a,4 ld h,0 ld l,a ld (_curRow),hl ret menuclr: cal menupos ld a,' ' jp _putc menudown: cal menuclr inc b jr menuupdown menuup: cal menuclr dec b menuupdown: ld a,b and %11 ;4=0;-1=3 menudraw: ld b,a cal menupos ld a,'*' jp _putc ;a=K_STO changeworms: cal _clrWindow ld hl,txtName cal _puts ;"Enter name player " ld a,(Gametype) cp 2 ld a,1 jr c,wormnrname nrworms =$+1 ld a,1 wormnrname: add a,'0' cal _putc sub '0' ld d,a ;1x add a,a ;2x ld e,a add a,a ;4x add a,a ;8x add a,a ;16x add a,e ;18x add a,d ;19x ld e,a ld d,0 ;de=a ld ix,worm1name-19 add ix,de ld a,maxnamelength cal entername ld (ix),0 jp DisplayMenu entername: ld h,1 ld l,h ;) ld (_curRow),hl ld (namelength),a enternameloop: ld a,'_' cal _putc ld hl,_curCol dec (hl) nokeypressed: halt cal GET_KEY or a jr z,nokeypressed cp K_DEL jr nz,continue backspace: ld hl,namelength ld a,(hl) cp maxnamelength jr nc,nokeypressed inc (hl) dec ix ld a,' ' ld (ix),a cal _putc ld hl,_curCol dec (hl) dec (hl) jr enternameloop continue: cp K_ENTER ret z cp K_EXIT ret z ld hl,namelength dec (hl) ret z ld hl,chartable ld e,a ld d,0 add hl,de ld a,(hl) or a jr z,nokeypressed ld (ix),a cal _putc inc ix cal waitnokeypressed jr enternameloop waitnokeypressed: halt cal GET_KEY or a jr nz,waitnokeypressed ret chartable: .db 0,".<>!",0,0,0,0 ;down,L,R,up .db 0,"XTOJE0",0 ;enter..clear .db " WSNID9",0 ;(-)..custom .db "ZVRMHC8",0 ;dot..del .db "YUQLGB7#" ;0..xvar .db $D9,"-PKFA6'" ;on..alpha .db "54321*",0,$D0 ;F5..more ;--proc skiplevel: ;@hl - destr:ab - alter:hl inc hl inc hl inc hl inc hl ;skip 4 ld b,(hl) ;spritesize inc b skipsprite: inc hl dnz skipsprite ld b,(hl) ;balls inc b inc b ;skip 6 ld a,c and _datasingl jr nz,skipworms inc b ;multiplayer lvl inc b inc b ;skip other 3 worms (9 bytes) skipworms: ld a,b add a,a add a,b ld b,a ;3x(balls+2) skipballs: inc hl dnz skipballs skipflags: ld a,(Gametype) cp gamectf jr nz,noflagstoskip inc hl inc hl inc hl inc hl noflagstoskip: cal skiplines ;lines skiplines: ;boxes ld a,(hl) ;lines/boxes add a,a add a,a inc a ld b,a ;4x(hl)+1 skiplb inc hl dnz skiplb ret ;----------------------------- ;-------- start game --------- ;----------------------------- LetsGetThisPartyOn: ld a,$17 ;no exit ld (CheckExit),a ;set exit state ld hl,gamesdata ld a,(Gametype) ld e,a ld d,0 add hl,de ld a,(hl) ld (gameCar),a add hl,de ld e,8 ;=de add hl,de ld c,a and _datasingl jr z,notsingle ld a,1 ld (nrworms),a notsingle: ld a,c and _datascore ld de,$FF64 ;virt.infinate jr z,setscorelimit ld d,0 ;de=100 setscorelimit: ld (scorelimit),de cal _ldHLind ;ld hl,(hl) ld a,(curlevel) ld (Level),a ld d,a ;begin level skiplevelloop: dec d ;levels to skip jr z,levelsskipped cal skiplevel jr skiplevelloop levelsskipped: psh hl ;1st level ld a,c and _datalink jr z,GameOver linkmatch: cal _clrWindow ld a,WormVersion cal send jr nc,client ;2nd host: ld hl,txtWaiting cal _puts cal receive cp WormVersion jp nz,linkiniterror cal send ; cal sendname ; cal receivename ld a,$18 jr nc,multiplayer linkiniterror: pop hl jp DisplayMenu sendname: ld hl,worm1+name ld b,maxnamelength sendnameloop: ld a,(hl) inc hl psh bc psh hl cal send pop hl pop bc dnz sendnameloop ret receivename: ld hl,worm2+name ld b,maxnamelength recvnameloop: psh bc psh hl cal receive pop hl pop bc ld (hl),a inc hl dnz recvnameloop ret client: ld hl,txtReceive cal _puts cal Qreceive jp c,linkiniterror cp WormVersion jp nz,linkiniterror ; cal receivename ; cal sendname ld a,$f6 multiplayer: ld (SwapPos),a ld a,2 ld (nrworms),a ;----------------------------- ;--------- game over --------- ;----------------------------- GameOver: cal _clrLCD ld hl,worm1set ld de,worm1 ld a,4 ;4x (all worms) createwormsloop: ex de,hl ld bc,died add hl,bc ld (hl),0 ;died=0 inc hl ld (hl),0 ;score=0 inc hl ld (hl),0 ;score+1=0 inc hl ld (hl),2 ;delay=2 inc hl ex de,hl ;de=wormX+head ld bc,19 ldir ;copy 19 bytes dec a ;loop jr nz,createwormsloop ld a,(Gametype) cp 1 ;=peaworm jr nz,worminitdone ld (worm1+lives),a worminitdone: pop hl ;begin of current level StartLevel: ld de,Left ld a,(hl) inc a ;=255? jp nz,nextlevel psh hl cal releasekeys cal _clrWindow pop hl ;show end msg or smtn ld bc,Exit psh bc ;where to go afterwards inc hl ;location of ending-code jp (hl) ;go there ("call") nextlevel: ldi ld de,Speed ldi ld de,peagrowth ldi ld a,(hl) ld (worm1+grow),a ld (worm2+grow),a ld (worm3+grow),a ld (worm4+grow),a ld (beginsize),a inc hl ld a,(hl) inc hl or a jr z,defaultsprite ld d,h ld e,l ;ld de,hl ld c,a ld b,0 ;bc=sprite size add hl,bc ;hl=behind sprite jr setsprite defaultsprite: ld a,defsprsize ld de,peasprite setsprite: ld (sprsize),a ld (spritepos),de ld a,(hl) inc hl ld (nrballs),a or a jr z,toobad_noballs ld c,a add a,a add a,c ld c,a ld b,0 ld de,balls ldir toobad_noballs: ex de,hl #ifndef invincible ld (thislevel),de #endif ld hl,worm1 ld a,(gameCar) and _datanextl ld b,1 jr nz,worminit ld b,4 worminit: psh bc ; >> 1 ex de,hl ldi ;d ld a,SinCosTable/256 ld (de),a inc de ldi ;y ldi ;x ex de,hl xor a ld (hl),a ;y2 inc hl ld (hl),a ;x2 ld bc,(worm2-worm1)-5 add hl,bc pop bc ; << 0k dnz worminit ;-------- draw level --------- ld a,(de) inc de sub 128 ld (FieldWidth),a ld a,(de) inc de sub 57 ld (FieldHeight),a add a,57-5 psh de ; >> levelp ld l,a ld h,0 add hl,hl add hl,hl add hl,hl add hl,hl add hl,hl ex de,hl ld hl,ScrBuffer psh hl ; >> 1 psh de ; >> 2 ld de,ScrBuffer+1 ld bc,63 ld (hl),%11111111 ldir inc hl ld (hl),%11000000 inc hl ld b,31 ClearLine: ld (hl),c inc hl dnz ClearLine psh hl ; >> 3 ld a,(FieldWidth) add a,126 psh af ; >> 4 and %11111000 rra rra rra ld l,a ld h,0 add hl,de pop af ; << 3 and %00000111 ld b,a ld c,0 ld a,%11000000 jr z,NoVertShift VertShift: rra rr c dnz VertShift NoVertShift: ld (hl),a inc hl ld (hl),c ex de,hl pop de ; << 2 pop bc ; << 1 ldir pop hl ; << 0k ld c,64 ldir pop hl ; << levelp ld a,(Gametype) cp gamectf jr nz,noctf ld de,peaspos ld bc,4 ldir psh hl cal DrawAllPeas pop hl noctf: ;-draw lines- ld a,(hl) inc hl or a jr z,NoLines DrawLines: psh af ; >> 1 cal loaddrawdata psh hl ; >> 2 ld l,(hl) ld h,a cal Line inc d inc h cal Line inc e inc l cal Line dec d dec h cal Line pop hl ; << 1 inc hl pop af ; << 0k dec a jr nz,DrawLines NoLines: ld a,(hl) inc hl or a jr z,noboxes drawboxes: psh af cal loaddrawdata psh hl ld l,(hl) ld h,a cal drawbox pop hl inc hl pop af dec a jr nz,drawboxes noboxes: ;----------------------------- psh hl ; >> levelp new cal showstats ld a,(gameCar) and _datafood jr z,nofood cal NewPea nofood: ld bc,(worm1+pos) cal DisplayField #ifdef readymask ld hl,$FC70 ld d,%10101010 ld c,56 maskloop: ld a,d xor %11111111 ld d,a ld b,$10 maskline: ld a,(hl) or d ld (hl),a inc hl dnz maskline dec c jr nz,maskloop #endif #ifdef readytext ld hl,$FDE0 ld de,$FDE1 ld (hl),%11111111 ld bc,$BF ldir ld hl,4+(txtposReady*256) ld (_curRow),hl set 3,(iy+5) ld hl,txtReady cal _puts res 3,(iy+5) #endif ld a,0 gameCar =$-1 and _datalink jr z,initfinished ;no link xor a ld (worm2+input),a ;worm 2 via link ld (worm2+left),a ld (Speed),a ;max.speed SwapPos: ;$18 xx -> $F6 xx ; jr xx -> or xx jr initfinished inc a ld (worm2+left),a ;1 ld hl,worm1 ld de,worm2 ld b,4 ;+heading +pos cal _EXLP ;swap positions ;&&& over link ld hl,worm1+name ld de,worm2+name ld b,maxnamelength cal _EXLP ;swap positions initfinished: ld b,startdelay ReadyDelay: halt dnz ReadyDelay cal releasekeys ;----------------------------- ;----------- LOOP ------------ ;----------------------------- GameLoop: ld bc,(worm1+pos) cal DisplayField ld a,1 flashtime =$-1 dec a jr z,noflash ld (flashtime),a ld hl,$fc00+(16*7) screeninvertloop: ld a,(hl) cpl ld (hl),a inc hl xor a cp h jr nz,screeninvertloop noflash: ld a,0 Speed =$-1 or a jr z,NoDelay Delay: halt dec a jr nz,Delay NoDelay: ld a,0 nrballs =$-1 or a cal nz,handlethoseneatlittleballs ld ix,worm1 ld a,(nrworms) ld b,a handleworms: psh bc cal HandleWorm ld bc,worm2-worm1 add ix,bc pop bc dnz handleworms ;----------------------------- ;---------- keys ------------- ;----------------------------- HandleKeys: ld a,%10111111 out (1),a in a,(1) rla ;MORE? jr c,CheckExit ld bc,$0103 out (c),b halt ;pause/off ld b,11 out (c),b CheckExit: rla ;=$17 (c=EXIT-key) ;or$A7 (c=0) jp c,GameLoop jr Exit WormDead: #ifdef invincible jp stopworm #else ld a,2 ld (flashtime),a ld (ix+delay),respawndelay thislevel =$+1 ld de,0 ld a,(de) inc de ld (ix+heading),a ld a,(de) ld (ix+pos),a inc de ld a,(de) ld (ix+pos+1),a inc (ix+died) dec (ix+lives) psh af ld de,10 cal DecScore pop af ret nz ;HandleWorm done ld a,(gameCar) and _datalivel ret z ld a,$A7 ;exit@end of turn ld (CheckExit),a ;set exit state ret ;finish turn #endif Exit: ld sp,0 ;pop all SpSave = $-2 cal _clrWindow ld hl,txtGO cal _puts ld hl,txtGame CURtxtGame =$-2 cal _puts ld de,0002 ld (_curRow),de cal showLevel ld de,$0B03 ld (_curRow),de ld hl,txtDied cal _puts cal _puts ;txtScore xor a ld (_curCol),a ld a,(nrworms) ld b,a ld hl,worm1+died displayWormStats: psh bc psh hl ld bc,input-died add hl,bc ;+input xor a cp (hl) ;input=0 = link jr nz,NoLinkIndic ld b,7 ;{DOWN} inc hl ;+left cp (hl) jr z,hostLinkIndic dec b ;{UP} hostLinkIndic: ld a,8 ld (_curCol),a ld a,b cal _putc xor a ld (_curCol),a dec hl NoLinkIndic: inc hl inc hl inc hl ;+name cal _puts pop hl psh hl ld a,13 ld (_curCol),a ld a,(hl) ;worm+died cal showA pop hl psh hl ld a,16 ld (_curCol),a inc hl ;worm+score cal _ldHLind ;ld hl,(hl) cal showHL ;worm+score pop hl ld bc,worm2-worm1 add hl,bc pop bc dnz displayWormStats ld a,(Gametype) or a ;singleplayer (0) only jr nz,hilevelcheckdone checkhilevel: ld hl,nrlevels ld a,(Level) cp (hl) jr c,hilevelcheckdone ld (hl),a ;save local ld c,a ld a,0 hilvlposa =$-1 ld hl,0 hilvlposhl =$-2 ;save external cal _writeb_inc_ahl ;ld (ahl),c hilevelcheckdone: ld a,(gameCar) and _datasingl jr z,hiscorecheckdone checkhiscore: cal loadhiscoreposinahl cal _Get_Word_ahl ;de=old_hi psh de cal _RAM_PAGE_1 ;&& pop de ld hl,(worm1+score) ld a,h ;New cp d ;Old jr c,NotNewHigh ;NewOld ld a,e ;old cp l ;new jr nc,NotNewHigh ;new=Old ex de,hl cal loadhiscoreposinahl cal _Set_Word_ahl ;de->(ahl) cal _RAM_PAGE_1 NotNewHigh: ;de=current hiscore ld hl,$0807 ld (_curRow),hl ld hl,txthiscore cal _puts ex de,hl ;pop cal showHL hiscorecheckdone: cal releasekeys waitkey: halt halt cal GET_KEY cp K_ENTER jp z,DisplayMenu cp K_SECOND jp z,DisplayMenu cp K_EXIT jr nz,waitkey ;x123456789012345678901 ;1----- GAME OVER ----- ;2Multiplayer ;3Level 01 ;4 Died Score: ;5NameName 03 00070 ;6Worm#02 @ 05 00120 ;7Worm#03 15 00030 ;8Snaky @ 00 04820 ExitNoStats: ld hl,_asapvar rst 20h ;_ABS_MOV10TOOP1 rst 10h ;_FINDSYM ld hl,4 xor a add hl,de adc a,b ;ahl=bde+4 cal _SET_ABS_DEST_ADDR xor a ld hl,_asm_exec_ram cal _SET_ABS_SRC_ADDR ld hl,end-_asm_exec_ram cal _SET_MM_NUM_BYTES cal _mm_ldir cal releasekeys res 4,(iy+9) set 2,(iy+13) jp _clrWindow loadhiscoreposinahl: ld a,(Level) ld b,a ld a,(Gametype) or a externalhiscoresavepos: ld a,0 hiscrposa =$-1 ld hl,0 hiscrposhl =$-2 ret z ;(Gametype)=0 addlevelposition: cal _AHL_PLUS_2_PG3 dnz addlevelposition ret ;----------------------------- ;----------- worm ------------ ;----------------------------- respawncheck: cp respawndelay-1 jr nz,unnamedlabel cal saverespawncounter removeworm: ld h,(ix+tail+1) ld l,(ix+tail) ld d,(ix+head+1) ld e,(ix+head) jr DoesWormTailEqualsWormHead ;chk4 size=0 removewormloop: ld c,(hl) inc hl ld b,(hl) inc hl cal resbit psh hl cal res4pixels pop hl inc (ix+grow) DoesWormTailEqualsWormHead: cal _cphlde jr nz,removewormloop ld a,(gameCar) and _datasingl jr nz,safewormsizedone ld a,0 beginsize =$-1 ld (ix+grow),a safewormsizedone: ;de=ix+head ld (ix+tail+1),d ld (ix+tail),e ;head=tail/size=0 ret unnamedlabel: cp 1 ld h,a jr nz,saverespawncounter respawndue: ld l,a cal inputcall ld (sendbyte),a ld a,h ;previous cp l ;changed? ret z ld (ix+delay),a ;=0 ret saverespawncounter: ld (ix+delay),a jr inputcall ; ld a,(ix+input) ; or a ; jr z,inlink ; ret inkeys: ;use jp not call! out (1),a ;nop\nop in a,(1) ld b,a and (ix+right) jr z,notright ld a,l add a,8 ld l,a notright: ld a,b and (ix+left) ret z ld a,l sub 8 ld l,a ret inputcall: ld a,(ix+input) or a jr nz,inkeys inlink: ld a,0 sendbyte =$-1 ld b,(ix+left) dec b jr z,receivefirst psh hl cal send cal receive pop hl ld l,a ret receivefirst: psh af psh hl cal receive pop hl ld l,a pop af psh hl cal send pop hl ret ;------- handle worm --------- HandleWorm: ld a,(ix+delay) dec a jp nz,respawncheck ld l,(ix+heading) cal inputcall donediddelydone: ld a,l ld (sendbyte),a ld (ix+heading),l ld h,(ix+heading+1) ld c,(ix+pos) ld b,(ix+pos+1) ld e,(ix+pos2) ld d,(ix+pos2+1) psh hl ld hl,previouspos ld (hl),c inc hl ld (hl),b inc hl inc hl ld (hl),e inc hl ld (hl),d pop hl ;-------- move worm ---------- Wormmove: psh bc ; >> pos ld a,(hl) add a,a add a,d ld d,a bit 7,(hl) jr z,notnegX dec b notnegX: jr nc,notmoveX inc b notmoveX: ld a,l add a,$40 ld l,a ld a,(hl) add a,a add a,e ld e,a bit 7,(hl) jr z,notnegY dec c notnegY: jr nc,notmoveY inc c notmoveY: ;bc=newpos ld (ix+pos2),e ld (ix+pos2+1),d ld (ix+pos),c ld (ix+pos+1),b ;-check- pop hl ; << pos (old) ld a,h sub b and 1 ld h,a ld a,l sub c and 1 add a,h ld d,4 jr z,GotFour xor 3 ld d,a GotFour: cal chk4pixels rl d jp nc,Drawworm ;--------- worm hit ---------- Hitworm: ld a,(gameCar) ld h,a and _datadie cal z,checkhitotherworm ld a,h and _datamultpeas ;&&bit jr nz,multiple_peas ld a,h and _datafood jp z,WormDead ;no food ld hl,0 PeaY =$-2 PeaX =$-1 cal chkpeahit jp nc,WormDead cal DrawPea ;remove pea ld a,(ix+grow) add a,15 peagrowth =$-1 ld (ix+grow),a cal NewPea ld hl,Left dec (hl) psh af ld de,10 cal IncScore pop af jp nz,Drawworm ;continue ld a,(gameCar) and _datafoodl jp z,Drawworm ld a,(Gametype) or a jp nz,Exit ;stack restored ld hl,Level ld a,(hl) inc (hl) ld l,a ;hl=Level ld h,0 add hl,hl add hl,hl cal _HLTIMES10 ex de,hl cal IncScore ;score+(40*level) cal removeworm pop hl ; << call pop hl ; << call pop hl ; << levelp new ld (ix+delay),2 jp StartLevel chkpeahit: ;hl=peapos ld a,(sprsize) inc a ld d,a ld a,b sub h inc a cp d ;=(sprsize)+1 ret nc ;nc=no pea ld a,c sub l inc a cp d ret ;c=pea flagcaptured: psh hl ld de,30 cal IncScore pop hl sillylabel: cal WormDead DrawAllPeas: ld hl,(peaspos) cal DrawPea ld hl,(peaspos+2) jp DrawPea multiple_peas: ld hl,(peaspos) ;1st pea psh hl ld a,(ix+reserv) ld e,a ;push a and %01 jr nz,sel_ownpea ld hl,(peaspos+2) ;2nd pea sel_ownpea: cal chkpeahit pop hl ;(peapos) 1st pea jp c,stopworm ;own pea hit ld a,e ;peek a (that x86 asm for pop\push ;) and %01 jr z,sel_otherpea ld hl,(peaspos+2) ;2nd pea sel_otherpea: cal chkpeahit jp c,hitflag ;no peas hit ld a,e cal flagtoken jp z,WormDead ld b,a ;%10 srl b ;%01 add a,b ;%11 ld (ix+reserv),a cal DrawPea ;restore own flag jr sillylabel ;inv both\die hitflag: ;correct pea hit ld a,e ;pop a xor %01 ;0=1;1=0 ld (ix+reserv),a cal flagtoken psh af ;safe z-flag cal DrawPea ;remove pop af jr z,flagcaptured jr stopworm flagtoken: and %01 ;current add a,a ;<< for cp ld b,a ;in b ld a,e and %10 ;own cp b ;same? ret ;Z=yes: no flag taken ;----------------------------- nextotherwormbit: ld a,c sub (hl) inc hl inc a cp 4 jr nc,nothit1 ;no ld a,b sub (hl) inc a cp 4 ret c ;nz ;yes nothit1: inc hl cal resbit ChkWorm: cal _cphlde jr nz,nextotherwormbit ret ;z checkhitlapline: ld a,63 sub b jr z,nextlaphalf inc a ret nz nextlaphalf: ld a,c and 32 ;y>=32? jr nz,nolap cp (ix+reserv) jr z,nolap psh bc ld de,20 cal IncScore pop bc xor a nolap: ld (ix+reserv),a ret checkhitotherworm: .db $dd,$7d ;ld a,lx cp worm2&255 psh ix jr nz,chkworm2 ; ret nz ld ix,worm1 jr chkworm chkworm2: ld ix,worm2 chkworm: ld h,(ix+tail+1) ld l,(ix+tail) ld e,(ix+head) ld d,(ix+head+1) cal ChkWorm pop ix ret z ;not hit pop bc ;call stopworm: ld bc,0 previouspos =$-2 ld de,0 ld (ix+pos),c ld (ix+pos+1),b ld (ix+pos2),e ld (ix+pos2+1),d ret ;-------- draw worm ---------- Drawworm: ld c,(ix+pos) ld b,(ix+pos+1) ld a,(Gametype) cp gamerace cal z,checkhitlapline ld l,(ix+head) ld h,(ix+head+1) ld (hl),c inc hl ld (hl),b inc hl cal resbit ld (ix+head),l ld (ix+head+1),h cal set4pixels ld a,(ix+grow) dec a jr z,removetail ld (ix+grow),a ret removetail: ld l,(ix+tail) ld h,(ix+tail+1) ld c,(hl) inc hl ld b,(hl) inc hl cal resbit ld (ix+tail),l ld (ix+tail+1),h res4pixels: cal ResPixel inc b cal ResPixel inc c cal ResPixel dec b ResPixel: cal FindPixel cpl and (hl) ld (hl),a ret ;----------------------------- ;---------- ball ------------- ;----------------------------- handlethoseneatlittleballs: ld hl,balls ld b,a ;a=(nrballs) handleballs psh bc psh hl ld c,(hl) inc hl ld b,(hl) inc hl ld d,(hl) cal handleball dec c pop hl ld (hl),c inc hl ld (hl),b inc hl ld (hl),d inc hl pop bc dnz handleballs ret handleball: cal res4pixels dec c ballxmove: bit 0,d ;1=L; 0=R jr z,ballright ballleft: dec b cal checkballhit jr z,ballymove inc b ;undo res 0,d ;go right jr ballymove ballright: inc b cal checkballhit jr z,ballymove dec b ;back set 0,d ;>left ballymove: bit 1,d ;1=up; 0=down jr z,balldown ballup: dec c cal checkballhit jr z,balldone inc c res 1,d ;go down jr balldone balldown: inc c cal checkballhit jr z,balldone dec c set 1,d ;up balldone: set4pixels: ;@(b,c) cal SetPixel inc b cal SetPixel inc c cal SetPixel dec b SetPixel: ;at bc cal FindPixel or (hl) ld (hl),a ret letsmovetheotherway: ld a,1 xor (hl) ld (hl),a ret checkballhit: psh de ld d,0 cal chk4pixels xor a cp d pop de ret ;----------------------------- ;----------- procs ----------- ;----------------------------- releasekeys: halt ld a,%10000000 ;all key-masks out (1),a in a,(1) inc a ;cp %11111111 (no keys pressed) jr nz,releasekeys ;keep waitin cal GET_KEY ;clear buffer ret resbit: ld a,h and (ix+storepos) ld h,a ret randompos: ld b,a Random: ;(2..b+2) ld a,r Seed =$+1 add a,0 ld (Seed),a and %01111110 cp b jr nc,Random add a,2 ret NewPea: ld a,(FieldWidth) add a,127-4 cal randompos ld h,a ld a,(FieldHeight) add a,56-4 cal randompos ld l,a ld (PeaY),hl CheckPea: ld c,l ld a,(sprsize) ld e,a chkloopy: ld b,h ld a,(sprsize) ld d,a chkloopx: psh hl cal FindPixel and (hl) pop hl jr nz,NewPea ;pixel found inc b dec d jr nz,chkloopx inc c dec e jr nz,chkloopy ;all ok; empty space DrawPea: ;hl=(PeaY) ld b,h ld c,l ld de,peasprite spritepos =$-2 jp PutSprite ;||-ed ;----------- score ----------- _divHLby1000: psh hl ld b,3 divideagain: ;3x cal _divHLby10 dnz divideagain ld a,l ;a=hl/1000 pop hl ret IncScore: ld h,(ix+score+1) ld l,(ix+score) cal _divHLby1000 ld c,a add hl,de cal _divHLby1000 cp c jr z,scorecommon ;hl/1000 not increased inc (ix+lives) jr scorecommon DecScore: ;&&& ld h,(ix+score+1) ld l,(ix+score) or a sbc hl,de jr c,showstats ;<0=0 scorecommon: ld (ix+score+1),h ld (ix+score),l ld de,0 scorelimit =$-2 cal _cphlde jp nc,Exit showstats: psh ix ld h,0 ld l,h ld (_penCol),hl ld a,(nrworms) ld b,a ld ix,worm1 ld a,(gameCar) and _datanextl jr nz,showstatsS showstatloop: psh bc cal showstat ld de,worm2-worm1 add ix,de ld hl,_penCol ld a,(hl) add a,10 ld (hl),a pop bc dnz showstatloop pop ix ret showstat: ld a,(gameCar) and _datalivel jr nz,showlives showscore: ld h,(ix+score+1) ld l,(ix+score) cal _D_HL_DECI jr __vputs showlives: ld a,(ix+lives) add a,'0' __vputmap: psh ix cal _vputmap pop ix ret showstatsS: ld hl,txtLevel cal __vputs ld a,0 Level =$-1 cp 10 jr c,tilllevel9 ld l,a ld h,0 cal _divHLby10 psh af ld a,l add a,'0' cal __vputmap pop af tilllevel9: add a,'0' cal __vputmap ld a,98 ld (_penCol),a cal showscore ld a,123 ld (_penCol),a cal showlives ld a,(gameCar) and _datafoodl pop ix ret z showleft: ld a,31 ld (_penCol),a ld a,0 Left =$-1 ld l,a ld h,0 cal _divHLby10 psh af ld a,l add a,'0' cal __vputmap pop af add a,'0' cal __vputmap ld hl,txtLeft __vputs: psh ix cal _vputs pop ix ret showLevel: ld hl,txtLevel cal _puts ld a,(Level) showA: ld l,a ld h,0 cal _divHLby10 psh af ld a,l add a,'0' cal _putc pop af add a,'0' jp _putc showHL: cal _D_HL_DECI jp _puts _D_HL_DECI: ld de,savestr+4 ld b,5 ldhld: cal _divHLby10 add a,'0' ld (de),a dec de dnz ldhld ld hl,savestr ret savestr: .db "00000",0 ;----------------------------- DisplayField: ld a,c sub 29 jr nc,NotMinYScroll xor a NotMinYScroll: cp 43 FieldHeight =$-1 jr c,NotMaxYScroll ld a,(FieldHeight) NotMaxYScroll: ld l,a ld h,0 add hl,hl add hl,hl add hl,hl add hl,hl add hl,hl psh bc ; >> 1 psh de ; >> 2 ld de,ScrBuffer add hl,de ld a,b sub 64 jr nc,NotMinXScroll xor a NotMinXScroll: cp 128 FieldWidth = $-1 jr c,NotMaxXScroll ld a,(FieldWidth) NotMaxXScroll: psh af ; >> 3 and %11111000 rra rra rra ld c,a ld b,0 ld de,DispBuffer pop af ; << 2 and %00000111 psh af ; >> 3 cp 6 jr c,CopyScreen inc c CopyScreen: add hl,bc ld b,57 CopyScreenLoop: psh bc ; >> 4 ld bc,16 ldir ld c,16 add hl,bc pop bc ; << 3 dnz CopyScreenLoop pop af ; << 2 ld c,$b7 ;or a Bit0: jr nz,Bit1 halt halt jr AfterShiftDelay Bit1: dec a jr nz,Bit2 cal ShiftRight1 jr AfterShiftDelay Bit2: dec a jr nz,Bit3 ld a,2 cal ShiftRight jr AfterShiftDelay Bit3: dec a jr nz,Bit4 cal Chunk cal ShiftLeft1 jr AfterShift Bit4: dec a jr nz,Bit5 cal Chunk jr AfterShiftDelay Bit5: dec a jr nz,Bit6 cal Chunk cal ShiftRight1 jr AfterShift Bit6: dec a jr nz,Bit7 ld a,2 cal ShiftLeft jr AfterShift Bit7: cal ShiftLeft AfterShiftDelay: halt AfterShift: #ifdef buffer ld hl,DispBuffer ld de,$fc00+$70 ld bc,1024-$70 ldir #endif pop de ; << 1 pop bc ; << 0k ret ShiftRight1: ld a,1 ShiftRight: ld (ShiftRightCounter),a ld a,c ld (ShiftRightChunk),a ld c,16 add hl,bc ld b,57 ShiftRightLoop: psh bc ld bc,-32 add hl,bc ex de,hl ld a,(de) ShiftRightChunk: or a cal c,_SHLACC ld c,0 ShiftRightCounter = $-1 ShiftRowsLeft: psh hl rla ld b,16 ShiftRowLeft: dec hl rl (hl) dnz ShiftRowLeft pop hl dec c jr nz,ShiftRowsLeft ld bc,-16 add hl,bc ex de,hl pop bc dnz ShiftRightLoop ret ShiftLeft1: ld a,1 ShiftLeft: ld (ShiftLeftCounter),a ld a,c ld (ShiftLeftChunk),a rla jr nc,ShiftLeftSameByte dec hl ShiftLeftSameByte: ex de,hl ld bc,-16 add hl,bc NewSprite: ex de,hl ld b,57 ShiftLeftLoop: psh bc ; >> 1 ld bc,-32 add hl,bc ex de,hl ld a,(de) ShiftLeftChunk: or a cal c,_SHRACC ld c,0 ShiftLeftCounter = $-1 ShiftRowsRight: psh hl ; >> 2 rra ld b,16 ShiftRowRight: rr (hl) inc hl dnz ShiftRowRight pop hl ; << 1 dec c jr nz,ShiftRowsRight ld bc,-16 add hl,bc ex de,hl pop bc ; << 0k dnz ShiftLeftLoop ret Chunk: psh hl ; >> 1 psh de ; >> 2 ld c,16 add hl,bc ld b,57 ChunkScreen: psh bc ; >> 3 ld bc,-32 add hl,bc ex de,hl ld a,(de) cal _SHRACC ld b,16 ChunkRow: dec hl rld dnz ChunkRow ex de,hl pop bc ; << 2 dnz ChunkScreen pop de ; << 1 pop hl ; << 0k ld c,$37 ;scf ret ;----------- draw ------------ ;--- pixel --- chk4pixels: ;&& cal CheckPixel inc b cal CheckPixel inc c cal CheckPixel dec b cal CheckPixel dec c ret CheckPixel: ;at bc in d cal FindPixel and (hl) ret z dec d ret ;CLEM's FIND_PIXEL (131+? cycles; 28+4 bytes) ;(b,c) to hl:a; "destroyes" ahl FindPixel: ;(b,c) to hl:a ld h,0 ld l,c ;hl=y add hl,hl add hl,hl ld a,b ;a=x rra add hl,hl rra add hl,hl add hl,hl ;hl=32*y rra ;a=x/8 or l ld l,a ld a,b and 7 cpl rlca rlca rlca ld (FP_Bit),a xor a FP_Bit =$+1 set 0,a psh de ;&&& ld de,ScrBuffer add hl,de pop de ret ;--- sprite --- PutSprite: ;||@(b,c) ;by SHIAR only ix saved cal FindPixel putspr: ld (beginbit),a ld a,(sprsize) ld b,a ;rows sprloopy: psh bc ;rows psh hl ld a,(de) ld c,a inc de ld a,(sprsize) ld b,a ;width beginbit =$+1 ld a,1 sprloopx: sla c ;draw? jr nc,sprnodraw psh af xor (hl) ld (hl),a pop af sprnodraw: rrca ;next bit jp nc,nextbitok inc hl ;next byte nextbitok: dnz sprloopx pop hl ld bc,32 ;next line add hl,bc pop bc dnz sprloopy ret ;--- line --- loaddrawdata: ld d,(hl) inc hl ld e,(hl) inc hl ld a,(hl) inc hl ret ;LINE (d,e)-(h,l) ;destroyes a Line: psh bc psh hl psh de ld a,d cp h jr c,lineOrdered ex de,hl lineOrdered: ld b,d ld c,e psh hl psh bc cal FindPixel pop bc pop de connectedLine: psh hl ld h,c ld c,a ld a,d sub b ld b,a ld a,e jr nz,LineNotPoint cp h jr nz,LineNotPoint pop hl jr DoneLine LineNotPoint: sub h ld de,32 jr nc,LinePositiveY neg ld de,-32 LinePositiveY: cp b jr nc,SteepLine add a,a ld (line2sm+1),a ld h,a xor a sub b add a,a ld (line1sm+1),a ld a,h sub b pop hl LineLoopGentle: psh af ld a,(hl) or c ld (hl),a rrc c jr nc,$+3 inc hl pop af jp m,line2sm line1sm: add a,0 add hl,de line2sm: add a,0 dnz LineLoopGentle DoneLine: ld a,(hl) or c ld (hl),a pop de pop hl pop bc ret SteepLine: ld h,a neg add a,a ld (line3sm+1),a ld a,b add a,a ld (line4sm+1),a sub h ld b,h pop hl LineLoopSteep: psh af ld a,(hl) or c ld (hl),a add hl,de pop af jp m,line4sm line3sm: add a,0 rrc c jr nc,$+3 inc hl line4sm: add a,0 dnz LineLoopSteep jr DoneLine drawbox: ;(d,e)-(h,l) ld b,l ;Delta-y ld l,e boxloop: cal Line inc l inc e dnz boxloop ret ;----------------------------- ;----------- link ------------ ;----------------------------- TIMEOUT = $1000 receive: cal GET_KEY cp K_EXIT jp z,LinkBreak in a,(7) and %11 ; jr z,LinkBreak cp %11 jr z,receive ld b,8 cal ReceiveCont jr c,receive ret Qreceive: ld b,8 receiveloop: ld de,TIMEOUT WaitRecBit: cal CheckLink jr z,LinkFailed cp %11 jr z,WaitRecBit ReceiveCont: sub %10 ld a,%10 ld d,D0LD1H ;01 jr c,ReceiveLow rra ;ld a,%01 ld d,D0HD1L ;10 ReceiveLow: rr c ld (AckBit),a ld a,d out (7),a ld de,TIMEOUT WaitAckRec: cal CheckLink cp 0 AckBit =$-1 jr nz,WaitAckRec ld a,D0HD1H ;11 out (7),a ld d,4 WaitReadyRec: dec d jr z,ReadyRec in a,(7) cp %11 jr nz,WaitReadyRec ReadyRec: dnz receiveloop ld a,c ret LinkBreak: ld a,D0HD1L out (7),a jp Exit send: ld c,a ld b,8+1 jr SendAcked sendloop: rr c ld a,D0LD1H ;%01 jr nc,SendLow ld a,D0HD1L ;%10 SendLow: out (7),a ld de,TIMEOUT WaitAckSend: cal CheckLink jr nz,WaitAckSend SendAcked: ld a,D0HD1H ;%11 out (7),a ld de,TIMEOUT WaitReadySend: cal CheckLink cp %11 jr nz,WaitReadySend dnz sendloop ld a,c ret LinkSuccess: .db $F6 ;or NN (skip scf) LinkFailed: scf ld a,c ret CheckLink: pop hl dec de ld a,d or e jr z,LinkFailed ld a,$BF out (1),a ; nop \ nop in a,(1) psh af ld a,%11111111 out (1),a pop af bit 6,a jr z,LinkBreak in a,(7) and %11 jp (hl) ;----------------------------- ;---------- levels ----------- ;----------------------------- LevelDef: .db 5,4,15,15,0,0 ;peas,speed,growth,begin_size,sprite,balls .db 0,2,63 ;start d, y, x .db 128,57 ;field width (128-255), height (57-255) .db 0,0 ;no additional lines, boxes .db 255 ret LevelDefM: .db 8,0,15,15,0,0 .db $40,30,2,$C0,30,125, $00,2,64,$80,54,64 .db 128,57 .db 0,0 ;----------------------------- ;---------- data ------------- ;----------------------------- wtPicture: .db %00011110,%00000000,%00000000,%00000000,%00000000,%00000000,%00000000,%00000000 .db %00111110,%00000000,%00000000,%00000000,%00000000,%00000000,%00000000,%00000000 .db %01110000,%00000000,%00000000,%00000000,%00000000,%00000000,%00000000,%00000000 .db %01100000,%01111100,%00000001,%11111111,%00000000,%11110000,%01111001,%11100000 .db %11100000,%11111110,%00000011,%11111111,%10000011,%11111000,%11111111,%11110000 .db %11000001,%11000111,%00000111,%00000001,%11000111,%10011001,%11001111,%00111000 .db %11000001,%10000011,%00000110,%00000000,%11100110,%00000001,%10011111,%10011000 .db %11000001,%10000011,%00000110,%11000000,%01101110,%00000011,%10111001,%11011100 .db %11000001,%11000111,%00000110,%11000000,%01101100,%00000011,%00110000,%11001100 .db %11000000,%11000110,%00000110,%11000000,%01101100,%00000011,%00110000,%11001100 .db %11100000,%11101110,%00001110,%11000000,%01101100,%00000011,%00111001,%11001100 .db %01100000,%01111100,%00001100,%11000000,%01101100,%00000011,%00011111,%10001100 .db %01110000,%00111000,%00011100,%11100000,%11101110,%00000011,%00001111,%00001100 .db %00111000,%11111110,%00111000,%01110001,%11000110,%00000011,%10000000,%00011100 .db %00011111,%11101111,%11110000,%00111111,%10000111,%00000001,%10000000,%00011000 .db %00001111,%10000011,%11100000,%00011111,%00000011,%00000001,%10000000,%00011000 txtMenu: .db "by Shiar",0 .db "Have fun!",0 ;4th menu item .db "Level ",$CF,"??",5,0 ;3rd .db "Worms ",$CF,"?",5,0 ;2nd txtGame: .db "Singleplayer",0 ;0 (1st) txtGame2: .db "Peaworm ",0 ;1 (next 1st) .db "Deathmatch",0 ;2 .db "Foodmatch ",0 ;3 .db "LinkMatch",0 ;4 .db "Race ",0 ;5 .db "CTF ",0 ;6 .db "Domination",0 ;7 txtLevsel: .db $CF," Select levels: ",5,0 txtName: .db "Enter name player ",0 txtWaiting: .db "Waiting...",0 txtReceive: .db "Receiving..." ;,0 TrigPrecalc: .db 0, 3, 6, 9, 12, 15, 18, 21 .db 24, 27, 30, 33, 36, 39, 42, 45 .db 48, 51, 54, 57, 59, 62, 65, 67 .db 70, 73, 75, 78, 80, 82, 85, 87 .db 89, 91, 94, 96, 98,100,102,103 .db 105,107,108,110,112,113,114,116 .db 117,118,119,120,121,122,123,123 .db 124,125,125,126,126,126,126,126 .db 127 txtLevel: .db "Level ",0 txtWorms: .db "Worms: 0",0 ;follows txtLevel txtDied: .db "Died ",0 txtScore: .db "Score",0 ;follows txtDied txtLeft: .db " left",0 ;follows txtScore txthiscore:.db "HiScore:",0 txtReady: .db "Prepare!",0 txtposReady = 7 txtGO: .db "----- GAME OVER -----",0 gamesdata: _datalink = %00000001 ;linkplay _datalivel = %00000010 ;lives=0 limit _datafoodl = %00000100 ;left=0 limit _datanextl = %00001000 ;next level if left=0 _datasingl = %00001000 ;singleplayer=1 _datafood = %00010000 ;food present _________ = %00100000 ; _datadie = %01000000 ;worm dies on impact _datascore = %10000000 ;score>=100 limit _datamultpeas = %00100000 gamesingle = 0 datasingle: .db %01011110 gamepeas = 1 datapeas: .db %01011010 gamedeathm = 2 datadeathm: .db %01000010 gamefoodm = 3 datafoodm: .db %11010000 gamelinkm = 4 datalinkm: .db %01000011 gamerace = 5 datarace: .db %10000000 gamectf = 6 datactf: .db %11100000 gamedomin = 7 datadomin: .db %01000000 ;==(8 modes) datalevels: .dw LevelDef, LevelDef .dw LevelDefM,LevelDefM .dw LevelDefM,LevelDefM .dw LevelDefM,LevelDefM nrlevels: .db 2,2,2,2,2,2,2,2 worm1set: .dw worm1p,worm1p .db %11110111,3,%00,%01111110,%10,%100 ;< > worm1name: .db "worm #01",0 worm2set: .dw worm2p,worm2p .db %11111011,3,%11,%00111111,%10000,%1000 ;f1 f2 worm2name: .db "worm #02",0 worm3set: .dw worm3p,worm3p .db %11111011,3,0,%01011111,%10,%100 ;sto , worm3name: .db "worm #03",0 worm4set: .dw worm4p,worm4p .db %11111011,3,0,%01111101,%10,%1 ;enter + worm4name: .db "worm #04",0 end: defsprsize = 4 sprsize: .db 4 peasprite: .db %01100000 .db %11110000 .db %11110000 .db %01100000 ;set: heading = 0 ;level* pos = 2 ;level* pos2 = 4 ;level grow = 6 ;level died = 8 ;game score = 9 ;game delay = 11 ;game ;19B @game head = 12 ;4B (head=tail) tail = 14 ;also@next level storepos = 16 lives = 17 reserv = 18 ;loop ;race:lap ;ctf:pea input = 19 left = 20 right = 21 name = 22 wormsize = 31 startdelay = 30 respawndelay = 30 maxnamelength = 8+1 ;----------------------------- ;----------- end ------------- ;----------------------------- .end .end