X-Git-Url: http://git.shiar.nl/wormy.git/blobdiff_plain/f3f7b1cf38613a97046b61ba09bff74cf79a629b..d5bfaf913bc4776654586efd74bd535eb4d9774b:/wormy.z80 diff --git a/wormy.z80 b/wormy.z80 index 6ed5a09..22fc918 100644 --- a/wormy.z80 +++ b/wormy.z80 @@ -1,10 +1,9 @@ ; Title : Wormy -; Version : 93% -; Release Date : summer 2001 +; Version : 96% (0.96.C14) +; Release Date : UUHHhhh... soon?!? ; Filename : wormy.86p (5kb) ; Author(s) : Shiar -; Email Address : shiar0@hotmail.com -; ICQ UIN : #43840958 +; Email Address : wormy@shiar.org ; Web Page : www.shiar.org ; Description : ruling Nibbles-like game 1-4 players ; Where to get this game : www.shiar.org (home of Wormy) @@ -16,34 +15,36 @@ ;----------- TO-DO ----------- ;----------------------------- -; 93% = DONE +; 96% = DONE ; [* internal levels ] ; [ * check levels/gametype ] ; [ * enough hiscore saves! ] ; [* complete readme ] ; 1% * misc (pollish, bugs, &&&) +; 1% * long length save (level#6) +; * mem at worm #4 ; * LINK -; * fix first packet loss ; 1% * transmit game/level data -; 1% * get g/o signal (l&l) working -; 2% * send new peas' positions -; * CTF -; 1% * fix pea XOR problem in ctf -; 1% * fix wormstop in race +; Xfirst packet loss?? or vti onlyXXXXX +; X1/3 worms over linkXXXX +; Xsend new peas' positionsXXXXX ;100% = bugs fixed + levels done +; MAYBE: sound +; NO: coop + ;----------------------------- ;----------------------------- -;--------- W O R M --------- +;------- W O R M Y --------- ;----------------------------- ;----------------------------- #define buffer ;use display buffer (otherwise write directly to screen) #define readymask ;"greys" out the field before starting a level -;#define hlines ;horizontal-line routine for more speed drawing boxes - ;^^(doesn't work properly)^^ +#define coolzgfx ;nice graphics for game over screen + ;#define readytext ;displays "prepare" before level starts ;#define invincible ;worms cannot die =) ;#define optdie ;in race games worms don't die when they run into each other @@ -100,23 +101,26 @@ worm2 = $AC1F ;-AC3B (1F) worm3 = $AC3E ;-AC59 (1F) worm4 = $AC5D ;-AC77 (1F) balls = $AC7C ;-ACFF (3x43d) -SinCosTable = $AD00 ;-AE00 (4x40) +SinCosTable = $AD00 ;-AE00 (4*40) ;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) + ;program $D748 ;-EFFF (186D+4A) worm4p = $F000 ;-F3FF (400) %11110O00 leveldata = $F400 ;-FA70 (<=671) -turn10 = $AE01 -peaspos = $AE02 +turn10 = $AE01 ; (1) (counter) +peaspos = $AE02 ;-AE05 (4) (peas) + +;MEM|8---9---A---B---C---D---E---F---| +; |..[------]||[]|......[-----]|[].| +; | SCREEN 2* 13 PRGM 4LV | ;--- temporary namelength = $BC00 ;(1) @menu +datalink = $BC00 ;(8) @init #ifdef buffer DispBuffer = $BC00 ;(10x57d) @game #else @@ -129,40 +133,41 @@ DispBuffer = $FC70 .org _asm_exec_ram -wormVhost = 093 -wormVclient = 193 +wormVhost = 095 +wormVclient = 195 start: nop - jp Start - .dw 1 + jp Start + .db 1 + nop .dw WormTxt .dw WormIcon WormTxt: - .db "WORMY by SHIAR -- beta 93%",0 + .db "WORMY by SHIAR -- 96% C14",0 WormIcon: .db 8,2 - .db %00110000,%00111100 - .db %01110000,%00111110 - .db %11100000,%00000111 - .db %11000011,%11000011 - .db %11000111,%11100011 - .db %11101110,%01100111 - .db %01111100,%01111110 - .db %00111000,%00111100 + .db %00000000,%00111100 + .db %00000000,%01010010 + .db %00000000,%01100001 + .db %01100011,%10011001 + .db %10010100,%01101001 + .db %10011001,%00011001 + .db %01000010,%11000001 + .db %00111100,%00111110 levelhead = 'w' -levelhead2 = 94 ;wormy levels header = "93" +levelhead2 = 95 ;wormy levels header = "95" int_handler: - ex af,af' - in a,($03) + ex af,af' + in a,($03) bit 3,a - jp z,$0039 + jp z,$0039 res 0,a out ($03),a - jp $0039 + jp $0039 int_end: Start: @@ -173,20 +178,20 @@ Start: im 1 ld a,$D4 ld h,a - ld l,0 ;ld hl,$D400 + ld l,0 ;ld hl,$D400 ld d,a - ld e,1 ;ld de,$D401 + ld e,1 ;ld de,$D401 ld b,e - ld c,l ;ld bc,$0100 - dec a ;ld a,$D3 + ld c,l ;ld bc,$0100 + dec a ;ld a,$D3 ld (hl),a ldir ld hl,int_handler ld d,a - ld e,a ;ld de,$D3D3 + ld e,a ;ld de,$D3D3 ld bc,int_end-int_handler ldir - inc a ;ld a,$D4 + inc a ;ld a,$D4 ld i,a im 2 @@ -265,83 +270,50 @@ searchcomplete: ld a,255 ld (ix),a ;end mark + ld ix,templevels-6 +levelselectmenu: + psh ix ;offset + ld a,-2 + ld (availevels),a cal _clrWindow - ld hl,templevels-3 - psh hl - ld hl,$0020 + ld hl,$0320 ld (_penCol),hl ld hl,txtLevsel - cal _vputs ;"< Select levels: >" + cal _vputs ;"< SELECT LEVELS >" + ld hl,$FC00+(2*16) + ld b,16*9 + cal menuinvloop + ld hl,$FC00+(56*16) + cal hr ld hl,$0601 ;x=1 ld (_penCol),hl - pop hl dispnextlevel: - ld a,(hl) + ld a,(ix+3) + ld b,a inc a ;cp 255 - jr z,_levselect - ld a,(hl) ;ade=(hl) + jr z,__levselect displevel: - inc hl - ld d,(hl) - inc hl - ld e,(hl) - inc hl - psh hl - ex de,hl ;ahl=ade=(hl) - cal _load_ram_ahl ;hl=ahl - ld b,(hl) ;b=title size - cal _vputs ld hl,_penCol ld (hl),$01 ;x=1 inc hl ld a,(hl) add a,6 ld (hl),a ;y+6 + cp 49 ;bottom of screen + jr nc,_levselect + ld de,3 + add ix,de ld hl,availevels inc (hl) - pop hl + ld a,b ;(ix+0) + ld h,(ix+1) + ld l,(ix+2) ;ahl=(ix) + cal _load_ram_ahl ;hl=ahl + cal _vputs jr dispnextlevel -levup: - cal menupos - dec b ;up - ld a,b - cp -4 - jr nz,levselected - inc b ;undo - jr levselected -levdown: - cal menupos - inc b ;down - ld a,b - cp -3 -availevels =$-1 - jr nz,levselected - dec b ;back up -levselected: - jp menupos - -_levselect: - ld b,-3 ;level selected - cal menupos -levselect: - halt \ halt - psh bc - cal GET_KEY - pop bc ;GET_KEY destr. b - cp K_UP - cal z,levup - dec a ;K_DOWN - cal z,levdown - cp K_SECOND-1 - jr z,loadlevel - cp K_EXIT-1 - jp z,ExitNoStats - cp K_ENTER-1 - jr nz,levselect -; jr z,loadlevel - -loadlevel: +readylevelfile: ;selected level at ahl +; ld hl,templevels-3 ld a,b add a,3 ;sellev+3 (#0==-3) ld e,a @@ -349,28 +321,89 @@ loadlevel: add a,e ;*3 ld e,a ld d,0 ;de=sellev*3 - ld hl,templevels-3 add hl,de ld a,(hl) ;ade=(hl) - or a ;levelfile on page 0 (=internal) - jr z,levelloaded - inc hl ld d,(hl) inc hl ld e,(hl) ex de,hl ;ahl=ade skiptitle: - ld b,a ;psh ahl + ld d,a ;psh ahl psh hl cal _GETB_AHL ;ld a,(ahl) pop hl or a - ld a,b ;pop ahl + ld a,d ;pop ahl psh af cal _INC_PTR_AHL ;ahl++ pop af ;cp 0 jr nz,skiptitle ;goto #0-terminator + ret + +levup: + cal menupos + dec b ;up + ld a,b + cp -3 + jr nz,levselect + inc b ;undo + jr levselect +levdown: + cal menupos + inc b ;down + ld a,b + cp -2 +availevels =$-1 + jr nz,levselect + dec b ;back up +levselect: + cal menupos + ld hl,$3900 + ld (_penCol),hl + pop hl + psh hl + cal readylevelfile + cal _load_ram_ahl ;hl=ahl + ld de,$FFA0 ;desc.text + xor a +levdescclearloop: + ld (de),a ;empty + inc de + cp d ;de>$FFFF (offscreen) + jr nz,levdescclearloop + cal _vputs + jr levselectmenu+1 +__levselect: + ld ix,templevels-6 ;reset 2 1st page +_levselect: + ld b,-2 ;level selected + jr levselect +levselectmenu: + psh hl + psh bc + cal ubergetkey + pop bc ;GET_KEY destr. b + dec a ;cp K_DOWN + jr z,levdown + sub K_UP-1 + jr z,levup + pop hl + inc a ;cp K_RIGHT + jp z,levelselectmenu + cp K_ENTER-K_RIGHT + jr z,loadlevel + sub K_EXIT-K_RIGHT + jp z,ExitNoStats + inc a ;cp K_SECOND + jr nz,levselectmenu +; jr z,loadlevel + +loadlevel: + cal readylevelfile + or a ;levelfile on page 0 (=internal) + jr z,levelloaded + cal skiptitle ;skip description cal _Get_Word_ahl ld (leveldataSize),de @@ -421,7 +454,7 @@ setdeflevels: ld hl,TrigPrecalc ld de,SinCosTable - psh de ; >> 1 + psh de ld bc,65 ldir dec hl @@ -432,7 +465,7 @@ MirrorSineWave: ld (de),a inc de dnz MirrorSineWave - pop hl ; << 0k + pop hl ;SinCosTable ld b,128+64 NegativeSineWave: xor a @@ -453,9 +486,11 @@ DisplayMenu: ;---draw menu--- ld hl,wtPicture ld bc,16*16 ldir - ld hl,$FC00+$160 + ld hl,$FC00+$010 ;(*,01) cal hr - ld hl,$FC00+$3E0 + ld hl,$FC00+$160 ;(*,22) + cal hr + ld hl,$FC00+$3E0 ;(*,62) cal hr dispmainmenu: ld hl,Gametype @@ -470,9 +505,10 @@ dispmainmenu: ;Mode|Level|Limit|Worms|worm #|controls ; jr dispmenucommon ;cal +dispmenucommon_: + ld b,36*16/4 dispmenucommon: ld de,$FD80 ;begin pos - ld b,36*16/3 xor a clroldmenuloop: ld (de),a @@ -481,13 +517,15 @@ clroldmenuloop: inc de ld (de),a inc de + ld (de),a + inc de dnz clroldmenuloop - ld b,6 + ld b,(ix) dispmenuloop: - ld d,(ix) + ld d,(ix+1) inc ix - ld e,(ix) + ld e,(ix+1) inc ix ld (_penCol),de cal _vputs @@ -495,9 +533,17 @@ dispmenuloop: ; ld b,0 ;b=menu# ret -hr: ;draw horizontal line at hl +;hr: ;draw horizontal line at hl +; ld b,16 +; jp menuinvloop + +hr: ld b,16 - jp menuinvloop +hrloop: + ld (hl),-1 + inc hl + dnz hrloop + ret ;--- menu loop --- @@ -505,7 +551,7 @@ dispoptionmenu: ld hl,txtoMenu ld ix,posoMenu ;Back|Lives|Limit|Speed|Rotation|Growth - cal dispmenucommon + cal dispmenucommon_ dispomenusets: cal clrold @@ -514,7 +560,7 @@ dispomenusets: ld (_penCol),hl cal loadgamecar psh hl - cal cshowA ;lives + cal cshowA0 ;lives ld hl,$2A3E ld (_penCol),hl @@ -528,7 +574,7 @@ dispomenusets: cal _vputs jr dispspeeddone dispspeed: - cal cshowA + cal cshowA0 dispspeeddone: ld hl,$363E @@ -538,7 +584,7 @@ dispspeeddone: psh hl ld a,(hl) ;(growth) inc a ;-1=None; 0..98->1..99 - cal cshowA + cal cshowA0 ld hl,$303E ld (_penCol),hl @@ -552,7 +598,7 @@ dispspeeddone: cal _vputs jr dispturndone dispturn: - cal cshowA ;turn speed + cal cshowA0 ;turn speed dispturndone: ld hl,$243E @@ -562,7 +608,7 @@ dispturndone: ld a,(hl) ;(scorelimit) or a psh af - cal cshowA ;limit + cal cshowA0 ;limit pop af ;a==0? jr z,optionMenu ;do not display 0 behind 'None' ld a,'0' @@ -586,9 +632,9 @@ notoselect cal loadgamecar inc hl pop af - cp K_LEFT + sub K_LEFT jr z,seloleft - cp K_RIGHT + dec a ;K_RIGHT ld a,b jr nz,optionMenu @@ -657,7 +703,7 @@ changelimitInit: changespeed: cal changespeedInit inc a - cp 99 + cp 20 jr nc,_optionMenu ;>98 changedspeed: dec hl ;(Speed) @@ -738,9 +784,9 @@ notselect cal loadgamecar inc hl pop af - cp K_LEFT + sub K_LEFT jr z,selleft - cp K_RIGHT + dec a ;K_RIGHT ld a,b jr nz,mainMenu @@ -793,7 +839,6 @@ changenrworms: jr nc,mainMenu ;may not be >4 changednrworms: ld (hl),a -_dispmenusets: jr _dispmenusets ;mainMenu changenrwormsInit: ld a,(Gametype) @@ -824,6 +869,7 @@ bchangelink: ld a,1 ;change LS-bit (=link) xor (hl) ;0=1; 1=0 ld (hl),a +_dispmenusets: jr dispmenusets ;mainMenu changegame: @@ -877,9 +923,8 @@ getcustomkey: cal _vputs dec ix waitcustomkey: - halt \ halt psh hl - cal GET_KEY + cal ubergetkey pop hl or a jr z,waitcustomkey @@ -918,8 +963,8 @@ dispmenusets: ld hl,$2A3E ;worms ld (_penCol),hl cal loadgamecar - inc hl psh hl + inc hl ld a,(hl) add a,'0' cal _vputmap @@ -935,10 +980,20 @@ displink: ld hl,$1E3E ;level ld (_penCol),hl - pop hl ;loadgamecar; hl++ - inc hl - ld a,(hl) ;(curlevel) - cal cshowA + pop hl ;loadgamecar + psh bc + ld d,0 + cal hlatlevel + ld a,(Gametype) + or a ;gamesingle + jr nz,displvlname + ld a,(Level) + cal cshowA0 + jr lvldisped +displvlname: + cal _vputs +lvldisped: + pop bc ld hl,$3032 ld (_penCol),hl @@ -963,8 +1018,7 @@ curworm =$-1 menucall: psh bc menuwaitkey: - halt \ halt - cal GET_KEY + cal ubergetkey or a jr z,menuwaitkey pop bc ;GET_KEY destr. b @@ -1064,8 +1118,7 @@ enternameloop: ld a,'_' cal __vputmap nokeypressed: - halt - cal GET_KEY + cal ubergetkey or a jr z,nokeypressed @@ -1113,7 +1166,14 @@ nameentered: ld (ix+8),0 ;end mark jp DisplayMenu -;--proc +;----------------------------- +;------- procs-n-stuff ------- +;----------------------------- + +ubergetkey: + halt ;woo hoo + halt ;save them batteries! yeah! + jp GET_KEY clrold: ld hl,$FD97 ;begin pos @@ -1132,7 +1192,41 @@ clroldsetsloop: jr nz,clroldsettings ret +hlatlevel: ;d must be 0 + psh hl ;loadgamecar + ld a,(Gametype) ;8bytes -> 7bytes + ld e,a + add a,a ;nc + add a,e + add a,a ;8->2bytes + add a,24+1 ;go to datalevels + ld e,a ;=de + sbc hl,de ;datalevels + cal _ldHLind ;ld hl,(hl) + pop de ;de=loadgamecar + inc de \ inc de + ld a,(de) ;(curlevel) + ld (Level),a + ld d,a ;begin level +skiplevelloop: + dec d ;levels to skip + ret z + cal skiplevel + jr skiplevelloop + ret ;hl=begin of correct level + +skiplvltitle: ;zf=singleplayer + ld a,(hl) + or a ;null-terminator + inc hl + jr nz,skiplvltitle + ret + skiplevel: ;@hl - destr:ab - alter:hl + ld a,(Gametype) + or a ;gamesingle + psh af + cal nz,skiplvltitle inc hl inc hl inc hl @@ -1145,8 +1239,7 @@ skipsprite: ld b,(hl) ;balls inc b inc b ;skip 6 - ld a,(Gametype) - cp gamesingle + pop af ;cp (Gametype),0 jr z,skipworms inc b ;multiplayer lvl inc b @@ -1171,9 +1264,9 @@ skipflags: noflagstoskip: skipobjects: - ld a,(hl) - inc hl - or a + xor a + or (hl) + inc hl ;nf ret z ;0=end inc hl inc hl @@ -1213,55 +1306,15 @@ LetsGetThisPartyOn: cal loadgamecar psh hl - ld (wormbeglives),a - inc hl ;nrworms - ld a,(hl) - ld (nrworms),a - inc hl ;level - inc hl - ld a,(hl) - ld (customspeed),a - inc hl - ld a,(hl) - ld (growspeed),a - inc hl - ld a,(hl) - ld (turnleft),a - ld (turnright),a ;more efficient - inc hl - ld l,(hl) - ld h,0 - cal _HLTIMES10 ;hl=10*(hl) - ld (scorelimit),hl - - pop hl ;loadgamecar - psh hl - ld a,(Gametype) ;8bytes -> 7bytes - ld e,a - add a,a ;nc - add a,e - add a,a ;8->2bytes - add a,24+1 ;go to datalevels - ld e,a ;=de - sbc hl,de ;datalevels - - cal _ldHLind ;ld hl,(hl) - pop de ;de=loadgamecar - inc de \ inc de - ld a,(de) ;(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,(gameCar) + cal hlatlevel + ex (sp),hl ;pop \ psh leveldata + psh hl ;psh loadgamecar + ld a,0 +gameCar =$-1 rra ;and _datalink - jr nc,GameOver + jp nc,StartLevel ;&&&jr + +;--------- link ------------ linkmatch: cal _clrWindow @@ -1281,57 +1334,151 @@ linkmatch: host: ld c,wormVclient cal Qsend - ld a,$18 - jr multiplayer + jr sethost client: ld hl,txtReceive cal _puts - ld a,$E6 -multiplayer: -; cal linkok -; ld a,D0LD1L -; out (7),a - ld (SwapPos),a - ld a,2 - ld (nrworms),a - -;----------------------------- -;--------- game over --------- -;----------------------------- - -GameOver: - ld hl,worm1set - ld de,worm1 - ld a,4 ;4x (all worms) -createwormsloop: +setclient: + ;name/keys: wormy#1 = link = 0 + link (name1) + ; 2 = worm #1 = #1 + local(name1) + ; 3 = link = 0 + link (name2) + ; 4 = worm #2 = #2 + local(name2) + ld de,worm2+left + ld hl,worm1+left + ldi ;keys worm#2 = worm#1 + ldi ;+right + ld de,worm4+left + ldi ;keys worm#4 = worm#2 + ldi + xor a + ld (worm1+left),a ;worm 1... + ld (worm3+left),a ;and worm 3 via link + ld hl,worm1+name + ld b,9 + cal recvstuff + ld hl,worm2+name + ld b,9 + cal sendstuff + pop hl + pop de + psh de + psh hl + ld b,168 + cal sendstuff ex de,hl - ld bc,died - add hl,bc - ld b,0 - ld (hl),b ;died=0 - inc hl - ld (hl),b ;score=0 - inc hl - ld (hl),b ;score+1=0 - inc hl - ld (hl),2 ;delay=2 + ld b,8 + cal sendstuff + jr StartLevel +sendstuff: + psh de +sendstuffloop: + psh bc + ld c,(hl) inc hl - ld (hl),3 ;lives=x -wormbeglives =$-1 + cal Qsend + pop bc + dnz sendstuffloop + pop de + ret +recvstuff: + psh de +recvstuffloop: + psh bc + cal Qrecv + ld (hl),c inc hl - ex de,hl ;de=wormX+head - ld bc,18 - ldir ;copy 18 bytes - dec a ;loop - jr nz,createwormsloop + pop bc + dnz recvstuffloop + pop de + ret +sethost: + ;name/keys: wormy#1 = worm #1 = ok + ; 2 = link = 0 + link (name1) + ; 3 = worm #2 = #2 + local(name2) + ; 4 = link = 0 + link (name2) + ld de,worm3+left + ld hl,worm2+left + ldi ;keys worm#3 = worm#2 + ldi ;+right + xor a + ld (worm2+left),a ;worm 2+4.. + ld (worm4+left),a ;..over link + ld hl,worm1+name + ld b,9 + cal sendstuff + ld hl,worm2+name + ld b,9 + cal recvstuff + pop hl + pop de + ld hl,templevels + ld de,datalink + psh de + psh hl + ld b,168 + cal recvstuff + ex de,hl + ld b,8 + cal recvstuff + +;-------- load level --------- StartLevel: + pop hl ;loadgamecar + ld a,(hl) + ld (wormbeglives),a + inc hl ;nrworms + ld a,(hl) + ld (nrworms),a + inc hl ;level + inc hl + ld a,(hl) + ld (customspeed),a + inc hl + ld a,(hl) + ld (growspeed),a + inc hl + ld a,(hl) + ld (turnleft),a + ld (turnright),a ;more efficient + inc hl + ld l,(hl) + ld h,0 + cal _HLTIMES10 ;hl=10*(hl) + ld (scorelimit),hl + +setupworms: + ld hl,worm1set + ld de,worm1 + ld a,4 ;4x (all worms) +createwormsloop: + ex de,hl + ld bc,died ;8 + add hl,bc +; ld b,0 + ld (hl),b ;died=0 + inc hl + ld (hl),b ;score=0 + inc hl + ld (hl),b ;score+1=0 + inc hl + ld (hl),2 ;delay=2 + inc hl + ld (hl),3 ;lives=x +wormbeglives =$-1 + inc hl + ex de,hl ;de=wormX+head + ld bc,18 + ldir ;copy 18 bytes + dec a ;loop + jr nz,createwormsloop + +Nextlevel: cal _clrWindow pop hl ;begin of current level - ld de,Left ld a,(hl) inc a ;=255? - jp nz,nextlevel + jp nz,donextlevel psh hl ld hl,Level @@ -1343,17 +1490,24 @@ StartLevel: psh bc ;where to go afterwards inc hl ;location of ending-code jp (hl) ;go there ("call") -nextlevel: +donextlevel: + ld a,(Gametype) + or a ;gamesingle + psh af + cal nz,skiplvltitle + ld de,Left ldi + ld de,Speed ld a,0 customspeed =$-1 inc a ;$FF=def - jr z,defspeed + jr nz,setspeed + ld a,(hl) ;speed from level + inc a +setspeed: dec a - ld (hl),a ;store new speed -defspeed: - ld de,Speed - ldi + ld (de),a ;custom speed + inc hl ld de,peagrowth ldi ld a,(hl) @@ -1403,8 +1557,7 @@ toobad_noballs: #endif ld hl,worm1 - ld a,(Gametype) - cp gamesingle + pop af ;cp (Gametype),0 ld b,1 jr z,worminit ld b,4 @@ -1430,11 +1583,12 @@ worminit: inc a ;ld a,1 ld (turn10),a - ld a,2 + inc a ;ld a,2 ld (flashtime),a ;-------- draw level --------- +initlevel: ld a,(de) inc de sub 128 @@ -1466,16 +1620,16 @@ setfieldy: psh hl ; >> 1 psh de ; >> 2 ld de,ScrBuffer+1 - ld bc,63 + ld bc,63 ;first 2 rows ld (hl),%11111111 - ldir + ldir ;draw upper border inc hl - ld (hl),%11000000 + ld (hl),%11000000 ;first left border inc hl ld b,31 ClearLine: - ld (hl),c - inc hl + ld (hl),c ;=0 + inc hl ;clear rest of line dnz ClearLine psh hl ; >> 3 @@ -1487,12 +1641,12 @@ ClearLine: rra rra ld l,a - ld h,0 + ld h,c ;0 add hl,de pop af ; << 3 and %00000111 ld b,a - ld c,0 +; ld c,0 ld a,%11000000 jr z,NoVertShift VertShift: @@ -1515,29 +1669,26 @@ NoVertShift: pop hl ; << levelp ld a,(Gametype) - cp gamectf - jr nz,noctf + cp gamerace ;or gamectf + jr c,levelhasbeensetup ld de,peaspos - ld bc,4 + ld c,2 ;ld bc,2 (2 bytes) + jr z,loadextralevelstuff ;cp gamerace + ld c,4 ;ld bc,4 (2nd flag in ctf) +loadextralevelstuff: ldir - psh hl - cal DrawAllPeas - pop hl -noctf: + ld a,1 ;draw delay + ld (drawctfpea1),a + ld (drawctfpea2),a +levelhasbeensetup: cal drawstuff -;----------------------------- +;--------- prepare ----------- +leveldone: psh hl ; >> levelp new cal forceshowstats - ld a,(gameCar) - and _datafood - jr z,nofood - cal NewPea -nofood: - ld bc,(worm1+pos) - cal DisplayField #ifdef readymask ld hl,$FC70 @@ -1557,7 +1708,6 @@ maskline: dec c jr nz,maskloop #endif - #ifdef readytext ld hl,$FDE0 ld de,$FDE1 @@ -1572,47 +1722,14 @@ maskline: res 3,(iy+5) #endif - ld a,0 -gameCar =$-1 - rra ;and _datalink - jr nc,initfinished ;no link - xor a -SwapPos: ;$18 xx -> $E6 xx - ; jr xx -> and xx - jr sethost -setclient: - ld (worm1+left),a ;worm 1... - ld (worm3+left),a ;and worm 3 via link - cal Qrecv - ld a,c - ld (worm2+name+0),a - cal Qrecv - ld a,c - ld (worm2+name+1),a - cal Qrecv - ld a,c - ld (worm2+name+2),a - cal Qrecv - ld a,c - ld (worm2+name+3),a - cal Qrecv - ld a,c - ld (worm2+name+4),a - jr initfinished -sethost: - ld (worm2+left),a ;worm 2+4.. - ld (worm4+left),a ;..over link - ld c,'T' - cal Qsend - ld c,'e' - cal Qsend - ld c,'s' - cal Qsend - ld c,'t' - cal Qsend - ld c,0 - cal Qsend -initfinished: + ld a,(gameCar) + and _datafood + jr z,nofood + ld ix,worm1 + cal NewPea +nofood: + ld bc,(worm1+pos) + cal DisplayField ld b,startdelay ReadyDelay: @@ -1682,16 +1799,15 @@ nextturnok: cal forceshowstats ;update score nodispupdate: -drawctfpea1: - jr drawctfpea2 - ld bc,drawctfpea1 + ld a,(Gametype) + cp gamectf + jr nz,noctfpeas2draw + ld de,drawctfpea1 ld hl,(peaspos) - cal tryDrawPea -drawctfpea2: - jr noctfpeas2draw - ld bc,drawctfpea2 + cal tryDrawPea ;pea#1 + ld de,drawctfpea2 ld hl,(peaspos+2) - cal tryDrawPea + cal tryDrawPea ;pea#2 noctfpeas2draw: @@ -1711,7 +1827,7 @@ handleworms: add ix,bc pop bc ld hl,handledworm - inc (hl) ;1..nrworms + inc (hl) ;0..nrworms-1 dnz handleworms ;----------------------------- @@ -1723,74 +1839,93 @@ HandleKeys: 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 - + jr nc,disppausemenu CheckExit: rla ;=$17 (c=EXIT-key) ;or$A7 (c=0) jp c,GameLoop - jr Exit + jp Exit ;jr? -WormDead: -#ifdef invincible - jp stopworm -#else - ld a,2 - ld (flashtime),a - ld (ix+delay),respawndelay +;------- pause menu ------- -thislevel =$+1 - ld hl,0 - ld de,0 -handledworm =$-2 - add hl,de - add hl,de - add hl,de - ld a,(hl) - inc hl - ld (ix+heading),a - ld a,(hl) - ld (ix+pos),a ;y - inc hl - ld a,(hl) - ld (ix+pos+1),a ;x - xor a - ld (ix+pos2),a ;y2 - ld (ix+pos2+1),a ;x2 +disppausemenu: + ld hl,txtpMenu + ld ix,pospMenu +;Resume|Turn Off|Contrast|Exit|| + ld b,25*16/4 + cal dispmenucommon + ld hl,$FC00+$170 ;(*,23) + cal hr + ld hl,$FC00+$310 ;(*,49) + cal hr + cal menupos - inc (ix+died) - dec (ix+lives) +pauseMenu: + psh bc +pmenuwaitkey: + cal ubergetkey + or a + jr z,pmenuwaitkey + pop bc ;GET_KEY + ld d,b ;c=new b + cp K_UP + jr nz,pmenunotup + dec d +pmenunotup: + cp K_DOWN + jr nz,pmenunotdown + inc d +pmenunotdown: psh af - ld de,10 - cal DecScore + cal menupos + ld a,d ;new pos + and 3 ;0-3 + ld b,a + cal menupos pop af - ret nz ;HandleWorm done - ld a,(wormbeglives) - or a ;0=no live limit - ret z ;don't end game - ld a,(gameCar) - and _datatime - jr z,anyworm ;quit at any worm's death - ld a,(nrworms) ;livematch: all worms must've died - ld b,a ;# of worms - ld hl,worm1+lives-(worm2-worm1) - ld de,worm2-worm1 - xor a ;check for 0 lives -checklives: - add hl,de ;next worm - cp (hl) ;lives==0? - ret nz ;any >0: don't exit - dnz checklives -anyworm: - ld a,$A7 ;exit@end of turn - ld (CheckExit),a ;set exit state - ret ;finish turn -#endif + cp K_ENTER + jr z,pselect + cp K_SECOND + jr nz,notpselect +pselect: + ld a,b + or a ;1: continue + jr z,donepausing + dec a ;2: off + jr z,turnoff + dec a ;3: contrast + jr z,pauseMenu + jr Exit ;4: exit +notpselect + cp K_EXIT + jr z,donepausing + ld hl,CONTRAST + sub K_LEFT + jr z,contrastdown + dec a ;K_RIGHT + jr nz,pauseMenu +contrastup: + inc (hl) + jr setcontrast +contrastdown: + dec (hl) +setcontrast: + ld a,(hl) + out (2),a + jr pauseMenu + +turnoff: + ld bc,$0103 + out (c),b + halt ;pause/off + ld b,11 + out (c),b + ld b,1 + jr pauseMenu + +donepausing: + cal releasekeys + jp GameLoop Exit: cal releasekeys @@ -1799,6 +1934,21 @@ SpSave = $-2 ld a,D0LD1L out (7),a ;both wires low = game over signal cal _clrWindow +#ifdef coolzgfx + ld de,$FC30 ;(0,1) + ld hl,wtWormy + ld bc,16*7 + ldir + ld hl,$FC10 + ld b,16*11 + cal menuinvloop ;invert + ld hl,$FD80 + cal hr ;menuinvloop w/ b=16 + ld hl,$FCE0 + cal hr + ld hl,_curRow + ld (hl),2 +#else ld hl,txtGO cal _puts ld hl,$FC00 @@ -1808,11 +1958,9 @@ SpSave = $-2 cal hr ;menuinvloop w/ b=16 ld hl,$FCE0 cal hr -; ld l,$74 -; ld b,8 -; cal menuinvloop ld hl,_curRow inc (hl) +#endif ld hl,txtGame CURtxtGame =$-2 cal _puts @@ -1898,20 +2046,18 @@ NoLinkIndic: ld a,13 ld (_curCol),a ld a,(hl) ;worm+died - cal showA + cal showA0 pop hl psh hl - ld a,10 - ld (_curCol),a ld a,(Gametype) cp gamedeathm jr nz,nodmwinner ;deathmatch? ld a,0 ;winner's deaths dmwinner =$-1 cp (hl) ;equals this worm? - jr nz,notwinner - jr iswinner + scf ;jr nz,notwinner + cal z,iswinner nodmwinner: jr c,notwinner ;no singleplayer winners inc hl ;worm+score @@ -1919,10 +2065,7 @@ nodmwinner: ld de,0 winnerscore =$-2 cal _cphlde ;==highest score.. - jr nz,notwinner -iswinner: - ld a,'*' - cal _putc ;..then put * + cal z,iswinner notwinner: ld a,16 ld (_curCol),a @@ -1987,6 +2130,9 @@ newhigh: ;New>Old ld hl,5 cal _MM_LDIR_SET_SIZE ;save new cal _RAM_PAGE_1 + ld hl,_curRow + dec (hl) + cal iswinner NotNewHigh: ld hl,$3149 @@ -2002,9 +2148,7 @@ NotNewHigh: hiscorecheckdone: waitkey: - halt - halt - cal GET_KEY + cal ubergetkey cp K_ENTER jp z,DisplayMenu cp K_SECOND @@ -2057,12 +2201,9 @@ hi_: ld bc,(Level) add a,c ld b,a ;levels to skip (including 1 for singleplayer) + ld de,5 ;to add per level addlevelposition: - inc hl - inc hl ;add one word per level - inc hl - inc hl - inc hl ;plus 3 bytes for name + add hl,de ;one word+3 bytes for name dnz addlevelposition hi__: xor a ;ahl=0(+hl) @@ -2075,6 +2216,12 @@ hiscrposa =$+1 highsave: .db 0,0,"WOR ",0 +iswinner: + ld a,10 + ld (_curCol),a + ld a,'*' + jp _putc ;..then put * + ;----------------------------- ;----------- worm ------------ ;----------------------------- @@ -2084,7 +2231,7 @@ respawncheck: jr nz,unnamedlabel cal saverespawncounter removeworm: - ld h,(ix+tail+1) + ld h,(ix+tail+1) ;& ld l,(ix+tail) ld d,(ix+head+1) ld e,(ix+head) @@ -2187,7 +2334,9 @@ inlink: ld l,c ret +;----------------------------- ;------- handle worm --------- +;----------------------------- HandleWorm: xor a @@ -2211,7 +2360,7 @@ nogrow: ld a,(gameCar) and _datatime jr z,notimescore - ld de,1 + ld e,1 cal IncScore notimescore: @@ -2321,7 +2470,7 @@ peagrowth =$-1 ld hl,Left dec (hl) psh af - ld de,10 + ld e,10 cal IncScore pop af jp nz,Drawworm ;continue @@ -2341,12 +2490,12 @@ peagrowth =$-1 add hl,hl cal _HLTIMES10 ex de,hl - cal IncScore ;score+(40*level) + cal _IncScore ;score+(40*level) cal removeworm pop hl ; << call pop hl ; << call ld (ix+delay),2 - jp StartLevel + jp Nextlevel chkpeahit: ;bc=ownpos;hl=peapos (destr:ad) ld a,(sprsize) @@ -2386,9 +2535,12 @@ sel_otherpea: jr z,nottheotherflag ld hl,drawctfpea2 ;restore #2 nottheotherflag: - ld (hl),$E6 ;and nn + ld (hl),3 ;draw delay 3 turns ret +drawctfpea1: .db 0 +drawctfpea2: .db 0 + hitflag: ;correct pea hit ld a,e ;pop a xor %11 ;invert flag taken + ownflag @@ -2399,20 +2551,14 @@ hitflag: ;correct pea hit pop af jr nz,Drawworm ;flag taken, continue game psh hl - ld de,20 ;flag captured+returned + ld e,20 ;flag captured+returned cal IncScore pop hl - ld a,$E6 ;and nn + ld a,3 ;draw delay ld (drawctfpea1),a ;redraw.. ld (drawctfpea2),a ;..both flags jr Drawworm -DrawAllPeas: - ld hl,(peaspos) - cal DrawPea - ld hl,(peaspos+2) - jp DrawPea - ;----------------------------- nextotherwormbit: @@ -2436,24 +2582,30 @@ ChkWorm: ret ;z checkhitlapline: - ld a,63 - sub b + ld a,(peaspos) ;63 + sub b ;x==63 jr z,nextlaphalf inc a ret nz nextlaphalf: - ld a,c - and 32 ;y>=32? - jr nz,nolap + ld a,(peaspos+1) ;yline + cp c ;ypos + ld a,1 + jr nc,checklap ;y>yline -> a=1 + xor a ;y a=0 +checklap: cp (ix+reserv) - jr z,nolap + ret z ;same as before + ld (ix+reserv),a ;1st time + ld e,a + ld a,(handledworm) + and 1 ;group 0 (1,3) or 1 (2,4) + xor e + ret z ;(group 0 and yyline) psh bc - ld de,20 - cal IncScore + ld e,20 + cal IncScore ;lap! pop bc - xor a -nolap: - ld (ix+reserv),a ret #ifdef optdie @@ -2672,36 +2824,117 @@ Seed =$+1 add a,2 ret -CheckPea: ;@hl; destr:abcde - 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 - ret nz ;nz=pixel found - inc b - dec d - jr nz,chkloopx - inc c - dec e - jr nz,chkloopy - ret ;z=empty space +WormDead: +#ifdef invincible + jp stopworm +#else + ld a,2 + ld (flashtime),a + ld (ix+delay),respawndelay + +thislevel =$+1 + ld hl,0 + ld de,0 +handledworm =$-2 + add hl,de + add hl,de + add hl,de + ld a,(hl) + inc hl + ld (ix+heading),a + ld a,(hl) + ld (ix+pos),a ;y + inc hl + ld a,(hl) + ld (ix+pos+1),a ;x + xor a + ld (ix+pos2),a ;y2 + ld (ix+pos2+1),a ;x2 + + inc (ix+died) + dec (ix+lives) + psh af + ld de,10 + ld a,(Gametype) + cp gamectf ;ctf no death penalty + cal nz,DecScore + pop af + ret nz ;HandleWorm done + ld a,(wormbeglives) + or a ;0=no live limit + ret z ;don't end game + ld a,(gameCar) + and _datatime + jr z,anyworm ;quit at any worm's death + ld a,(nrworms) ;timematch: all worms must've died + ld b,a ;# of worms + ld hl,worm1+lives-(worm2-worm1) + ld de,worm2-worm1 + xor a ;check for 0 lives +checklives: + add hl,de ;next worm + cp (hl) ;lives==0? + ret nz ;any >0: don't exit + dnz checklives +anyworm: + ld a,$A7 ;exit@end of turn + ld (CheckExit),a ;set exit state + ret ;finish turn +#endif + +CheckPea: ;@hl; destr:abcde + 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 + ret nz ;nz=pixel found + inc b + dec d + jr nz,chkloopx + inc c + dec e + jr nz,chkloopy + ret ;z=empty space tryDrawPea: ;hl=peapos;bc=dopea - psh bc + ld a,(de) + or a ;0=drawn + ret z + psh de cal CheckPea - pop bc + pop de ret nz ;unsuccesful - ld a,$18 ;jr - ld (bc),a - jr DrawPea + ex de,hl + dec (hl) ;hl=appeartime + ex de,hl ;hl=peaspos + jr z,DrawPea + ret + +sendnewpeaoverlink: + ld a,(gameCar) + rra ;and _datalink + ret nc ;no link + ld a,(ix+left) + or a + jr z,receivenewpeaoverlink + ld c,l ;send pea's pos + cal Qsend + ld c,h + jp Qsend ;&&&possible jr +receivenewpeaoverlink: + cal Qrecv ;Crecv + ld l,c + cal Qrecv ;Crecv + ld h,c + ret NewPea: ld a,(FieldWidth) @@ -2712,9 +2945,10 @@ NewPea: add a,56-4 cal randompos ld l,a - ld (PeaY),hl cal CheckPea jr nz,NewPea + cal sendnewpeaoverlink + ld (PeaY),hl DrawPea: ;hl=(PeaY) ld b,h ld c,l @@ -2762,6 +2996,42 @@ nextbitok: ;----------- score ----------- +timematchscore: + ;piece of crap checking whether you've already won in timematch + ld a,(nrworms) + ld b,a ;# of worms + dec a + ret z ;singleplayer + ld hl,worm1+lives + ld de,worm2-worm1 + ld a,(handledworm) + ld c,a ;wormcounter +chktimematchover: + xor a + cp c + jr z,nneexxtt ;yourself + cp (hl) + ret nz ;someone else still alive + dec hl ;+delay + dec hl ;+score+1 + ld a,(hl) + cp (ix+score+1) + jr c,nneexxtt_ ;you>him + ret nz ;not highest + dec hl ;+score + ld a,(hl) + cp (ix+score) + ret nc ;you<=him + inc hl +nneexxtt_: + inc hl + inc hl +nneexxtt: + dec c + add hl,de + dnz chktimematchover + jp anyworm ;g/o + _divHLby1000: psh hl ld b,3 @@ -2772,26 +3042,36 @@ divideagain: ;3x pop hl ret -IncScore: - ld h,(ix+score+1) - ld l,(ix+score) +extralives: cal _divHLby1000 ld c,a - add hl,de + add hl,de ;increase score 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 + jr scorecommon + +IncScore: ;inc score by e + ld d,0 +_IncScore ; inc by de + ld h,(ix+score+1) + ld l,(ix+score) + ld a,(Gametype) + or a ;if singleplayer... + jr z,extralives + add hl,de ;score+=de scorecommon: ld (ix+score+1),h - ld (ix+score),l + ld (ix+score),l ;save ld de,0 scorelimit =$-2 ld a,d @@ -2803,7 +3083,13 @@ scorelimit =$-2 showstats: ld a,(gameCar) and _datatime - ret nz ;no disp for timematches + jr nz,timematchscore ;no disp for timematches + ld hl,$FC00 ;&&&only necessary in deathmatch + ld b,6*16-1 +clearstats: + ld (hl),a ;=0 + inc hl + dnz clearstats forceshowstats: psh ix ld h,0 @@ -2860,6 +3146,18 @@ showscore: jr __vputs showlives: ld a,(ix+lives) +showA: ;small w/o leading 0 (&&&combine w/ cshowA0??) + cp 10 + jr c,showleastsign + ld l,a + ld h,0 + cal _divHLby10 + psh af + ld a,l + add a,'0' + cal __vputmap + pop af +showleastsign: add a,'0' __vputmap: psh ix @@ -2872,19 +3170,7 @@ showstatsS: ;(singleplayer) 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 + cal showA ld a,98 ld (_penCol),a @@ -2901,7 +3187,7 @@ showleft: ld (_penCol),a ld a,0 Left =$-1 - cal cshowA + cal cshowA0 ld hl,txtLeft __vputs: @@ -2914,7 +3200,7 @@ showLevel: ld hl,txtLevel cal _puts ld a,(Level) -showA: +showA0: ;big w/ leading 0 ld l,a ld h,0 cal _divHLby10 @@ -2926,7 +3212,7 @@ showA: add a,'0' jp _putc -cshowA: +cshowA0: ;small w/ leading 0 or a jr nz,cshowavalue ld hl,txtNone @@ -3264,52 +3550,81 @@ drawstuff: drawsmtn: dec a ;1 = line - jp z,drawline + jr z,drawline dec a ;2 = fatline - jp z,drawfatline + jr z,drawfatline dec a ;3 = box - jp z,drawbox - dec a ;4 = circle - jp z,drawcircle - dec a ;5 = hline -#ifdef hlines - jp z,drawhline -#else - jp z,drawline -#endif + jr z,drawbox +; dec a ;4 = circle +; jp z,drawcircle -drawbox: ;(d,e)-(h,l) - ld b,l ;Delta-y -#ifdef hlines -boxloop: - cal drawhline - inc e - dnz boxloop - ret -drawhline: ;(d,e)-(h,e) - psh bc - ld b,d - ld c,e - psh hl - cal FindPixel - ld c,a ;starting mask +drawcircle: ;(d,e),h ;de=x,y; h=z + ld c,h ;c=yy=z ld a,h - sub b - ld b,a - inc b ;1+x2-x1 -hlineloop: - ld a,(hl) - or c - ld (hl),a - rrc c ;mask >> - jr nc,hlinenext - inc hl ;next byte -hlinenext: - dnz hlineloop + neg + ld l,a ;l=-z + xor a + ld b,a ;b=xx=0 + dec a ;-$00** + ld h,a ;hl=zz=-z +circloop: + psh de ;x,y + ex (sp),hl ;push zz \ pop x,y + cal circledraw ;(x-xx,y+yy)-(x+xx,y+yy) + ;(x-xx,y-yy)-(x+xx,y-yy) + cal circledraw ;(x-yy,y+xx)-(x+yy,y+xx) + ;(x-yy,y-xx)-(x+yy,y-xx) + + ex (sp),hl ;push x,y \ pop zz + xor a + ld d,a ;d=0 + dec a ;-256=yy + inc b ;xx++ + jr circloop + +circledraw: ;destr:de + psh hl + ld a,h ;hl=x,y + sub b ;bc=xx,yy + ld d,a ;d=x-xx + add hl,bc ;h=x+xx; l=y+yy + ld e,l ;e=y+yy + cal drawline ;(h-b,l+c)-(h+b,l+c) + ld a,l + sub c ;a=y again + sub c + ld l,a ;l=y-yy + ld e,l ;e=l=y-yy + cal drawline ;(h-b,l-c)-(h+b,l-c) + ld a,b ;swap xx and yy + ld b,c + ld c,a ;ex b,c pop hl - pop bc ret -#else + +drawbox: ;(d,e)-(h,l) + ld b,l ;Delta-y ld l,e boxloop: cal drawline @@ -3317,7 +3632,6 @@ boxloop: inc e dnz boxloop ret -#endif drawfatline: cal drawline @@ -3329,7 +3643,7 @@ drawfatline: cal drawline dec d dec h - jp drawline +; jp drawline ;LINE (d,e)-(h,l) ;destroyes a @@ -3435,90 +3749,35 @@ line4sm: dnz LineLoopSteep jr DoneLine -drawcircle: ;(d,e),h ;de=x,y; h=z - ld c,h ;c=yy=z - ld a,h - neg - ld l,a ;l=-z - xor a - ld b,a ;b=xx=0 - dec a ;-$00** - ld h,a ;hl=zz=-z -circloop: - psh de ;x,y - ex (sp),hl ;push zz \ pop x,y - cal circledraw ;(x-xx,y+yy)-(x+xx,y+yy) - ;(x-xx,y-yy)-(x+xx,y-yy) - cal circledraw ;(x-yy,y+xx)-(x+yy,y+xx) - ;(x-yy,y-xx)-(x+yy,y-xx) - - ex (sp),hl ;push x,y \ pop zz - xor a - ld d,a ;d=0 - dec a ;-256=yy - inc b ;xx++ - jr circloop - -circledraw: ;destr:de - psh hl - ld a,h ;hl=x,y - sub b ;bc=xx,yy - ld d,a ;d=x-xx - add hl,bc ;h=x+xx; l=y+yy - ld e,l ;e=y+yy - cal drawline ;(h-b,l+c)-(h+b,l+c) - ld a,l - sub c ;a=y again - sub c - ld l,a ;l=y-yy - ld e,l ;e=l=y-yy - cal drawline ;(h-b,l-c)-(h+b,l-c) - ld a,b ;swap xx and yy - ld b,c - ld c,a ;ex b,c - pop hl - ret - - +;..and last but not least..: ;----------------------------- ;----------- link ------------ ;----------------------------- +timeout = $8000 +lossout = 20 + linkok: ld a,D0HD1H - out (7),a ;raise both wires = link ok + out (7),a ;raise both wires = link ok ret -timeout = $8000 -lossout = 20 - checklink: ;load wires in A and check for timeout dec de ;decrease timer ld a,d or e - jr nz,linkfine ;ok if de>0 -;de==0 = timeout + jr z,linktimeout ;timeout if de==0 +linktest: + ld a,$BF + out (1),a ;select keys + in a,(1) ;input + bit 6,a ;exit key + jp z,Exit ;break! +linkfine: + in a,(7) + and %11 + ret +linktimeout: ;de==0 cal linkok ld a,0 ;losses so far linklosses =$-1 @@ -3529,29 +3788,13 @@ linklosses =$-1 ret c ;otherwise just continue linkerr: jp Exit -linkfine: - in a,(7) - and %11 - ret -;-------------- ;---- SEND ---- -;-------------- -Csend: - ld b,32 -csendwait: - nop - dnz csendwait - cal Qsend - jr c,Csend - ret - -Qsend: ;try to send 8 bits in C; CF=error --- destr:abcde +Qsend: ;--- try to send 8 bits in C; CF=error --- destr:abcde --- nop \ nop - in a,(7) - and %11 ;both wires low = exit signal - jr z,linkerr ;error otherwise + cal linkfine + jr z,linkerr ;both wires low = exit signal ld b,8 ;bits to send sendloop: ld de,timeout @@ -3564,8 +3807,7 @@ sendbit: sendwaitack: cal checklink ;other calc must lower other wire jr nz,sendwaitack - ld a,D0HD1H ;raise one, ok to raise other - out (7),a + cal linkok ;raise one, ok to raise other (out (7),D0HD1H) sendfinish: cal checklink cp %11 ;both raised (by other calc) @@ -3576,26 +3818,24 @@ sendfinish: ld (linklosses),a ;reset number of losses ret ;=ok -;-------------- ;---- RECV ---- -;-------------- -Crecv: ;--- receive 8 bits into A/C --- destr:abcdehl --- +Crecv: ;--- receive 8 bits into A/C --- destr:abCde --- cal Qrecv ret nc ;return if all went ok jr Crecv ;and try again -Qrecv: ;--- receive 8 bits into A/C; CF=error --- destr:abcde --- - in a,(7) - and %11 +Qrecv: ;--- receive 8 bits into A/C; CF=error --- destr:abCde --- + cal linkfine jr z,linkerr ;both low = error, quit ld b,8 ;bits to receive recvloop: - ld de,timeout +; ld de,timeout recvwait: - cal checklink + cal linktest ;checklink cp %11 jr z,recvwait ;both high = nothing sent (yet) + ld de,timeout rra ;received bit in cf ld a,D0LD1H jr c,received ;lower white wire as well @@ -3606,8 +3846,7 @@ received: recvwaitack: cal checklink jr z,recvwaitack ;same wire will be raised again by other calc - ld a,D0HD1H - out (7),a ;raise both + cal linkok ;raise both recvfinish: dnz recvloop ;repeat for all bits xor a ;nc=no error @@ -3619,77 +3858,103 @@ recvfinish: ;---------- levels ----------- ;----------------------------- +;&&&&& 99% 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 ;no additional lines, boxes - .db 255 - ret + + .db 255 ;last level + ret ;ending code LevelDefM: + .db "Empty Arena",0 .db 8,4,15,15,0,0 .db $40,30,2,$C0,30,125, $00,2,64,$80,54,64 .db 128,57 .db 0 + .db "Fast Fun :))",0 .db 8,0,18,12,5 .db %1110000,%10001000,%10001000,%10001000,%1110000,0 .db $40,30,2,$C0,30,125, $00,2,64,$80,54,64 .db 128,57 .db 0 + .db "Two Circles",0 .db 8,5,18,12,0,0 .db $40,30,2,$C0,30,125, $00,2,64,$80,54,64 .db 128,57 - .db 4,40,26,20,0 - .db 4,90,40,11,0,0 + .db 4,40,26,20,0 + .db 4,90,40,11,0,0 LevelDefT: ;tron=no delay + .db "Empty Tron Level",0 .db 8,4,18,12,5 .db %1110000,%10001000,%10001000,%10001000,%1110000,0 .db $40,30,64,$C0,30,64, $00,30,64,$80,30,64 .db 128,57 .db 0 +LevelDefR: ;race + .db "Round and Round",0 + .db 8,4,18,12,5 + .db %1110000,%10001000,%10001000,%10001000,%1110000,0 + .db $40,23,2,$C0,23,125, $40,35,2,$C0,35,125 + .db 128,57 + .db 63,27 + .db 4,63,27,10,0,0 + LevelDefC: ;ctf + .db "Default CTF",0 .db 8,4,18,12,5 .db %1110000,%10001000,%10001000,%10001000,%1110000,0 - .db $40,30,64,$C0,30,64, $00,30,64,$80,30,64 + .db $40,23,2,$C0,23,125, $40,35,2,$C0,35,125 .db 128,57 - .db 10,10,50,50 + .db 27,8,27,116 .db 0 ;----------------------------- ;---------- data ------------- ;----------------------------- -wdPicture = 16 -wtPicture: -.db %00000000,%00000000,%00000111,%10000000,%00000000,%00000000,%00000000,%00000000,%00000000,%00000000,%01110000,%00000000,%00000000,%00000000,%00000000,%00000000 -.db %00000000,%00000000,%00001111,%10000000,%00000000,%00000000,%00000000,%00000000,%00000000,%00000000,%01111000,%00000000,%00000000,%00000110,%01111011,%00100000 -.db %00000000,%00000000,%00011100,%00000000,%00000000,%00000000,%00000000,%00000000,%00000000,%00000000,%00011100,%00001110,%00000000,%00001001,%00010011,%01000000 -.db %00000000,%00000000,%00011000,%00011111,%00000000,%01111111,%11000000,%00111100,%00011110,%01111000,%00001100,%00011111,%00000000,%10100111,%00110000,%10000000 -.db %00000000,%00000000,%00111000,%00111111,%10000000,%11111111,%11100000,%11111110,%00111111,%11111100,%00001100,%00111011,%00000000,%10100001,%00001001,%01100000 -.db %00000000,%00000000,%00110000,%01110001,%11000001,%11000000,%01110001,%11100110,%01110011,%11001110,%00001100,%00110001,%10000000,%01001110,%01110010,%01100000 -.db %00000000,%00000000,%00110000,%01100000,%11000001,%10000000,%00111001,%10000000,%01100111,%11100110,%00001110,%01110001,%10000000,%00000000,%00000000,%00000000 -.db %00000000,%00000000,%00110000,%01100000,%11000001,%10110000,%00011011,%10000000,%11101110,%01110111,%00001110,%01110001,%10000000,%00000000,%00000000,%00000000 -.db %00000000,%00000000,%00110000,%01110001,%11000001,%10110000,%00011011,%00000000,%11001100,%00110011,%00000111,%11100001,%10000000,%00000000,%00000000,%00000000 -.db %00000000,%00000000,%00110000,%00110001,%10000001,%10110000,%00011011,%00000000,%11001100,%00110011,%00000011,%11000011,%10000000,%00000000,%00000000,%00000000 -.db %00000000,%00000000,%00111000,%00111011,%10000011,%10110000,%00011011,%00000000,%11001110,%01110011,%00000000,%00000011,%00110101,%01001001,%10000000,%00000000 -.db %00000000,%00000000,%00011000,%00011111,%00000011,%00110000,%00011011,%00000000,%11000111,%11100011,%10000000,%00000011,%01000101,%00010101,%01000011,%01100011 -.db %00000000,%00000000,%00011100,%00001110,%00000111,%00111000,%00111011,%10000000,%11000011,%11000001,%10000000,%00000111,%01100101,%01010101,%01000101,%01010100 -.db %00000000,%00000000,%00001110,%00111111,%10001110,%00011100,%01110001,%10000000,%11100000,%00000001,%11100000,%00001110,%00110111,%01011101,%10010101,%01100101 -.db %00000000,%00000000,%00000111,%11111011,%11111100,%00001111,%11100001,%11000000,%01100000,%00000000,%11111111,%11111100,%00010101,%01010101,%01000101,%01010101 -.db %00000000,%00000000,%00000011,%11100000,%11111000,%00000111,%11000000,%11000000,%01100000,%00000000,%00111111,%11111000,%01100101,%01010101,%01000110,%01010011 +wtPicture: ;title +.db %00011110,%00000000,%00000000,%00000000,%00000000,%00000000,%00000000,%00000001,%11000000,%00000000,%00000000,%00000001,%10000000,%00000000,%00001111,%10000000 +.db %00111110,%00000000,%00000000,%00000000,%00000000,%00000000,%00000000,%00000001,%11100000,%00000000,%00000011,%11000010,%01000011,%10011100,%00110000,%01100000 +.db %01110000,%00000000,%00000000,%00000000,%00000000,%00000000,%00000000,%00000000,%01110000,%00111000,%00001100,%00110001,%00110100,%01100011,%01000000,%00010000 +.db %01100000,%01111100,%00000001,%11111111,%00000000,%11110000,%01111001,%11100000,%00110000,%01111100,%00010001,%11001001,%00001000,%00100000,%10000010,%00010000 +.db %11100000,%11111110,%00000011,%11111111,%10000011,%11111000,%11111111,%11110000,%00110000,%11101100,%00010001,%11000100,%10000001,%00000100,%10001110,%00001000 +.db %11000001,%11000111,%00000111,%00000001,%11000111,%10011001,%11001111,%00111000,%00110000,%11000110,%00001100,%00000010,%01100010,%10011100,%00010001,%00001000 +.db %11000001,%10000011,%00000110,%00000000,%11100110,%00000001,%10011111,%10011000,%00111001,%11000110,%00000011,%11000010,%00011100,%01100010,%00100001,%01101000 +.db %11000001,%10000011,%00000110,%11000000,%01101110,%00000011,%10111001,%11011100,%00111001,%11000110,%01111000,%00100001,%00000000,%00000001,%11000001,%01101000 +.db %11000001,%11000111,%00000110,%11000000,%01101100,%00000011,%00110000,%11001100,%00011111,%10000110,%10000101,%11100001,%00000000,%00000000,%00000001,%00010000 +.db %11000000,%11000110,%00000110,%11000000,%01101100,%00000011,%00110000,%11001100,%00001111,%00001110,%10010110,%00010001,%00000000,%00000000,%00000000,%11100000 +.db %11100000,%11101110,%00001110,%11000000,%01101100,%00000011,%00111001,%11001100,%00000000,%00001100,%01100100,%00001001,%00111111,%11111111,%11000000,%00000000 +.db %01100000,%01111100,%00001100,%11000000,%01101100,%00000011,%00011111,%10001110,%00000000,%00001100,%01000000,%10000001,%01000000,%00000000,%00000000,%00000000 +.db %01110000,%00111000,%00011100,%11100000,%11101110,%00000011,%00001111,%00000110,%00000000,%00011100,%01000000,%11000001,%01100101,%01001001,%10000011,%01100011 +.db %00111000,%11111110,%00111000,%01110001,%11000110,%00000011,%10000000,%00000111,%10000000,%00111000,%01000001,%00100001,%00110101,%00010101,%01000101,%01010100 +.db %00011111,%11101111,%11110000,%00111111,%10000111,%00000001,%10000000,%00000011,%11111111,%11110000,%00111110,%00011110,%00010111,%01011101,%10010101,%01100101 +.db %00001111,%10000011,%11100000,%00011111,%00000011,%00000001,%10000000,%00000000,%11111111,%11100000,%00000000,%00000000,%11100101,%01010101,%01000110,%01010011 + +wtWormy: ;g/o +.db %00000110,%00111000,%00000000,%00111100,%00001111,%10001110,%00111100,%01111000,%00001100,%11011000,%11100011,%10000000,%00000000,%11111100,%00111000,%00000000 +.db %00011001,%01000110,%11100000,%11000010,%00011100,%11011111,%01111110,%11111000,%00011110,%11011101,%11110111,%11000000,%00111111,%00000011,%01000110,%11100000 +.db %00100000,%10000011,%00010001,%00110010,%00011000,%00010011,%01101010,%11000000,%00111011,%01001101,%10000110,%01000000,%11000000,%00000000,%10000001,%00010000 +.db %00100000,%00000000,%00001110,%00110010,%00011001,%10011011,%01101010,%11100000,%00110011,%01101101,%11000111,%10000001,%00011100,%00000000,%00000000,%00001100 +.db %01001100,%00011000,%00000000,%00000100,%00011000,%11011111,%01100010,%11001100,%00110011,%01101101,%10000111,%11000001,%00011100,%00111000,%00011000,%10000010 +.db %01010010,%00100100,%01100000,%00011000,%00011111,%11011011,%11101110,%11111100,%00011111,%01111000,%11110110,%11100000,%11000000,%11000110,%00101001,%10000010 +.db %01100001,%11000011,%10011111,%11100000,%00001111,%10001001,%11001100,%01111000,%00001110,%00110000,%01100110,%01100000,%00111111,%00000001,%11000110,%01111100 + +;.db %00000000,%00000001,%10000000,%00000000,%00001111,%10000000 txtMenu: .db "Mode",0 ;1st menu item .db "Level",0 ;2nd .db "Link",0 ;... .db "Worms",0 .db "worm #",0 - .db 0 -posMenu: .dw $2418,$231E,$2824,$1F2A,$1730,$1936 +posMenu: .db 5 + .dw $2418,$231E,$2824,$1F2A,$1730 txtMenuR: .db "controls",0 txtoMenu: .db "Back",0 ;1st menu item .db "Lives",0 ;2nd @@ -3697,7 +3962,14 @@ txtoMenu: .db "Back",0 ;1st menu item .db "Speed",0 .db "Rotation",0 .db "Growth",0 -posoMenu: .dw $2618,$251E,$2524,$222A,$1A30,$1C36 +posoMenu: .db 6 + .dw $2618,$251E,$2524,$222A,$1A30,$1C36 +txtpMenu: .db "Resume",0 ;1st menu item + .db "Turn Off",0 ;2nd + .db "Contrast",$CF,5,0 ;... + .db "Exit",0 +pospMenu: .db 4 + .dw $3418,$331E,$2F24,$3A2A txtGame: .db "Singleplayer",0 txtGame1: .db "Peaworm",0 txtGame2: .db "Tron",0 @@ -3722,7 +3994,8 @@ txtYes: .db "Yes",0 txtNo: .db "No",0 txtKeyleft: .db ":left",0 txtKeyright:.db "/right",0 -txtLevsel: .db $CF," Select levels ",5,0 +posLevsel = $0320 +txtLevsel: .db $CF," SELECT LEVELS ",5,0 txtWaiting: .db "Waiting...",0 txtReceive: .db "Receiving..." ;,0 @@ -3745,15 +4018,19 @@ txtDied: .db "Died " ;follows txtWinner txtScore: .db "Score",0 ;follows txtDied txtLeft: .db " left",0 ;follows txtScore txthiscore:.db "HiScore:",0 +#ifdef readytext txtReady: .db "Prepare!",0 txtposReady = 7 +#endif +#ifndef coolzgfx txtGO: .db 5,5,5,5,5," GAME OVER ",$CF,$CF,$CF,$CF,$CF,0 +#endif datalevels: .dw LevelDef, LevelDefM .dw LevelDefT,LevelDefM .dw LevelDefM,LevelDefM - .dw LevelDefM,LevelDefC -nrlevels: .db 1,3,1,3,3,3,3,1 ;=defaults + .dw LevelDefR,LevelDefC +nrlevels: .db 0,3,1,3,3,3,3,1 ;=defaults _datalink = %0000001 ;linkplay _datafoodl = %0000010 ;left=0 limit @@ -3787,19 +4064,19 @@ datatimem: .db %1010000,1,2,1,-1, 0, 8, 0 ;Timematch (tron, 100 score) gamerace = 6 ;used datarace: .db %0000000,0,2,1,-1,-1, 8,10 ;Race (100 score, no collision) gamectf = 7 ;used -datactf: .db %1001000,0,4,1,-1,-1, 8, 9 ;CTF (90 score) +datactf: .db %1001000,0,4,1,-1,-1, 8,10 ;CTF (100 score) worm1set: .dw worm1p,worm1p - .db %11110111,%00,-01,K_RIGHT,K_LEFT + .db %11110111,1,-01,K_RIGHT,K_LEFT worm1name: .db "WORMY ",0 worm2set: .dw worm2p,worm2p - .db %11111011,%01,-01,K_F2,K_F1 + .db %11111011,0,-01,K_F2,K_F1 worm2name: .db "VIPER ",0 worm3set: .dw worm3p,worm3p - .db %11111011,%00,-01,K_COMMA,K_STO + .db %11111011,1,-01,K_COMMA,K_STO worm3name: .db "NIBBLER ",0 worm4set: .dw worm4p,worm4p - .db %11111011,%01,-01,K_PLUS,K_ENTER + .db %11111011,0,-01,K_PLUS,K_ENTER worm4name: .db "JIM ",0 defhiscrpos: @@ -3827,7 +4104,7 @@ head = 13 ;4B (head=tail) tail = 15 ;also@next level storepos = 17 reserv = 18 ;loop (race:lap|ctf:pea) -input = 19 +input = 19 ;---currently unused afaik--- left = 20 right = 21 name = 22 @@ -3837,6 +4114,27 @@ startdelay = 30 respawndelay = 30 maxnamelength = 8+1 +;bla space (reserved for internal levels) +.db "WWW.SHIAR.ORG WWW.SHIAR.ORG " +.db "WWW.SHIAR.ORG WWW.SHIAR.ORG " +.db "WWW.SHIAR.ORG WWW.SHIAR.ORG " +.db "WWW.SHIAR.ORG WWW.SHIAR.ORG " +.db "WWW.SHIAR.ORG WWW.SHIAR.ORG " +.db "WWW.SHIAR.ORG WWW.SHIAR.ORG " +.db "WWW.SHIAR.ORG WWW.SHIAR.ORG " +.db "WWW.SHIAR.ORG WWW.SHIAR.ORG " +.db "WWW.SHIAR.ORG WWW.SHIAR.ORG " +.db "WWW.SHIAR.ORG WWW.SHIAR.ORG " +.db "WWW.SHIAR.ORG WWW.SHIAR.ORG " +.db "WWW.SHIAR.ORG WWW.SHIAR.ORG " +.db "WWW.SHIAR.ORG WWW.SHIAR.ORG " +.db "WWW.SHIAR.ORG WWW.SHIAR.ORG " +.db "WWW.SHIAR.ORG WWW.SHIAR.ORG " +.db "WWW.SHIAR.ORG WWW.SHIAR.ORG " +.db "WWW.SHIAR.ORG WWW.SHIAR.ORG " +.db "WWW.SHIAR.ORG WWW.SHIAR.ORG " +.db "WWW.SHIAR.ORG WWW.SHIAR.ORG " +.db "WWW.SHIAR.ORG WWW.SHIAR.ORG " .db "WWW.SHIAR.ORG WWW.SHIAR.ORG " .db "WWW.SHIAR.ORG WWW.SHIAR.ORG " .db "WWW.SHIAR.ORG WWW.SHIAR.ORG " @@ -3846,7 +4144,7 @@ maxnamelength = 8+1 .db "WWW.SHIAR.ORG WWW.SHIAR.ORG " .db "WWW.SHIAR.ORG WWW.SHIAR.ORG " .db "WWW.SHIAR.ORG WWW.SHIAR.ORG " -.db " shiar0@hotmail.com",0 +.db " wormy@shiar.org",0 defspritesz = 4 defspriteimg: .db %01100000 @@ -3855,7 +4153,9 @@ defspriteimg: .db %01100000 .db %01100000 deflevels: - .db "Internal Levels" ;,0 + .db "Internal Levels",0 + .db "by SHIAR -- still t" + .db "o be added...." ;,0 .db 0,deflevels/256,deflevels&255 templevels: