X-Git-Url: http://git.shiar.nl/wormy.git/blobdiff_plain/f3f7b1cf38613a97046b61ba09bff74cf79a629b..7ad6d272ed2820c7e2c8c884d1184072168d80d0:/wormy.z80 diff --git a/wormy.z80 b/wormy.z80 index 6ed5a09..ab13324 100644 --- a/wormy.z80 +++ b/wormy.z80 @@ -1,60 +1,99 @@ -; Title : Wormy -; Version : 93% -; Release Date : summer 2001 -; Filename : wormy.86p (5kb) -; Author(s) : Shiar -; Email Address : shiar0@hotmail.com -; ICQ UIN : #43840958 -; Web Page : www.shiar.org -; Description : ruling Nibbles-like game 1-4 players -; Where to get this game : www.shiar.org (home of Wormy) -; Other games by author(s) : Nemesis beta -; Additional Credits to : Matthew Shepcar (wrote original Peaworm, end'98) -; Jonah Cohen (helped writing worm) - -;----------------------------- -;----------- TO-DO ----------- -;----------------------------- - -; 93% = DONE - -; [* internal levels ] -; [ * check levels/gametype ] -; [ * enough hiscore saves! ] -; [* complete readme ] -; 1% * misc (pollish, bugs, &&&) -; * 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 +;___ÜÛÛÛ________________________________________________________ÜÜÜÜ____________ +; ÛÛÛß ÛÛÛÛÝ +; ÛÛÛ ßÛÛÛ ÞÛÛÜ +;ÞÛÛ ÜÛÛÛÜ ÜÜÛÛÛÛÜÜ ÜÛÛÛÛ ÜÛÛÜ ÜÛÛÜ ÞÛÛ ÛÛÛÛÛ +;ÛÛÝ ÛÛÛÛÛÛÛ ÜÛÛÛÛÛÛÛÛÛÛ ÛÛÛÛÛÛÛ ÛÛÛÛÛÛÛÛÛÛÛÛÜ ÛÛ ÛÛÛ ÛÛÛ +;ÛÛ ÛÛß ßÛÛ ÞÛÛßß ßÛÛÛ ÛÛÛß ÛÛÝ ÛÛß ÛÛÛÛ ßÛÛ ÛÛÝ ÞÛÛÝ ÞÛÛ +;ÛÛ ÛÛ ÛÛ ÛÛ Ü ÛÛÝ ÞÛÛÝ ÞÛÛ ÛÛÛÛÛÛ ÛÛÝ ÛÛÛ ÛÛÛ ÛÛ +;ÛÛ ÛÛ ÛÛ ÛÛ ÛÛ ÞÛÛ ÛÛÛ ÛÛÝ ÛÛÛß ÞÛÛ ßÛÛ ÛÛÛ ÞÛÛÛ ÛÛ +;ÛÛ ÛÛÝ ÞÛÛ ÛÛ ÛÛ ÛÛ ÛÛÝ ÛÛÝÞÛÛÝ ÛÛÝ ÛÛ ÛÛÛÛÛÛß ÛÛ +;ÛÛ ÞÛÛ ÛÛÝ ÞÛÛ ÛÛ ÛÛ ÛÛ ÛÛ ÞÛÛ ÛÛÝ ÛÛÝ ßÛÛÛß ÞÛÛ +;ÛÛÝ ÛÛÜ ÜÛÛ ÛÛÝ ÛÛ ÛÛ ÛÛÝ ÛÛ ÞÛÛÝ ÞÛÛÝ ÛÛÝ ÛÛÝ +;ÞÛÛ ÛÛÛÛÛ ÞÛÛ ÛÛÝ ÞÛÛ ÛÛÝ ÛÛ ßÛÛÜÜÛÛß ÛÛÛ ÞÛÛ +; ÛÛÛ ÛÛÛ ÛÛÝ ÞÛÛ ÛÛÝ ÛÛÛ ÛÛÝ ßÛÛÛÛß ÞÛÛ ÛÛÛ +; ÛÛÛÜ ÜÛÛÛÛÛÜ ÜÛÛÛ ÛÛÝ ÛÛÛ ÞÛÛÝ ÛÛÝ ÛÛÛÜÜ ÜÛÛÛ +; ÛÛÛÛÛÛÛß ßÛÛÛÛÛÛÛ ÞÛÛÜÜÛÛÛÝ ÛÛÛ ÞÛÛ ÛÛÛÛÛÛÛÛÛÛÛÛÛÛÝ +; ßÛÛÛß ßÛÛßß ßÛÛÛÛÛß ÛÛ ÛÛÝ ßÛÛÛÛÛÛÛÛÛß +;_______________________________________________________________________________ +; +; Version : 97% (0.97.19) +; Release Date : 2002 January 9 +; Author(s) : Shiar +; 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) +; Other games by author(s) : Nemesis beta +; Additional Credits to : Matthew Shepcar : wrote original Peaworm, end'98 +; Jonah Cohen : helped writing worm +; Files : wormy.z80 (89kB) : 515ad14b922572bdc8a96e780b8b24ca +; wormy.86p (6532) : efef32a8c541b4585087f55deb31f51d +;_______________________________________________________________________________ + +;NOTES: +;* Use for LEARNING practises ONLY! +; Don't _ever_ release altered code w/o permission! +;* Code was originally by Scabby (Matthew Shepcar), +; a few lines by Jonah Cohen, +; and everything else by me - Shiar (Mischa Poslawsky). +;* Although I've commented & labeled quite some stuff, I can't guarantee +; everybody will understand it. This is probably not the best source +; to learn z80 from. w00t the Shyer Way (tm). +;* Also read wormy.txt please, thank you +;* Don't scroll down if you get scared easily. + +;_______________________________________________________________________________ +; _______ _____ ______ _____ +; | | | | \ | | +; | |_____| _____ |_____/ |_____| +;_______________________________________________________________________________ + +; 97% = DONE +; X [15] lives >9 dispay +; X [15] sp modes not configurable +; X [16] LVL: episode #2: 10 sp levels +; X [17] lives stats for every liveslimited game (also !dm) +; X [18] LINK: fix transmit game/level data +; X [19] datalevels+nrlevels not in program if !intlevels +; X [19] mem at worm #4 (still 12 bytes or so.. or more? or less?) +; X [19] alter level editor to use new address and set level id #97 +; 1% * misc (bugs, &&&, pollish, &&, &) +; * menu s/limit/peas in multifm +; * autogrowth doesn't always work +; * look at init-z in line routine again +; * team score! +; * random pixel still occurs +; * LINK: optimize transmit +; 1% * LINK: >Somehow do a lot of testing with 2 calcs< *sigh* +; * LINK: called "Linkmatch" at g/o +; * LVL: episode #3: at least 5 lvls for each mp mode +; * LVL: episode #4: 10 sp levels, including multipeas +; 1% * LVL: episode #5: ... +; * LVL: Wormage +; * LVL: Free Bird +; * LVL: Jonah? ;100% = bugs fixed + levels done - -;----------------------------- -;----------------------------- -;--------- W O R M --------- -;----------------------------- -;----------------------------- - -#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 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 - -#define cal call -#define psh push -#define dnz djnz +;> * switchable scoredecrease on death? +; * wall at pickup position fix +; * arrow to offscreen peas +;110% * sound +; * startpos +;120% * coop (DON'T COUNT ON IT) + +;_______________________________________________________________________________ +; _/_/_____ __ _ _______ _ _ ______ _______ +; _/_/ | | \ | | | | | | \ |______ +; / / __|__ | \_| |_____ |_____ |_____| |_____/ |______ +;_______________________________________________________________________________ #include "asm86.h" #include "ti86asm.inc" + #define cal call + #define psh push + #define dnz djnz + _SHRACC = $4383 ;4x srl a _SHLACC = $438B ;4x sll a _divHLby10 = $4044 ;hl=hl/10 @@ -85,84 +124,117 @@ _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 -_GETB_AHL = $46C3 ;a=(ahl) \ hl=ahl - -;----------------------------- -;------- data storage ------- -;----------------------------- - -;--- permanent - -ScrBuffer = $8820 ;-A7FF (20*FF=1FE0) +_GETB_AHL = $46C3 ;a=(ahl) \ hl=ahl + + #define buffer ;use display buffer (otherwise write directly to screen) + #define readymask ;"greys" out the field before starting a level + #define coolzgfx ;nice graphics for game over screen + #define spprotect ;options not changable for singleplayer modes +;#define intlevels ;-internal levels +;#define readytext ;-displays "prepare" before level starts +;#define invincible ;-worms cannot die =) +;#define optdie ;-in race games worms dont die when they run into each other + +;_______________________________________________________________________________ +; _______ _______ _____ ______ _______ ______ _______ +; |______ | | | |_____/ |_____| | ____ |______ +; ______| | |_____| | \_ | | |_____| |______ +;_______________________________________________________________________________ + +;--- permanent --- + +ScrBuffer = $8420 ;-A3FF (20*FF=1FE0) +worm4p = $A400 ;-A5FF (200) %101001O0 +;free = $A600 ;-A7FF (200) 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) +SinCosTable = $AC00 ;-AD00 (4*40) +worm1 = $AD01 ;-AD1F (1F) +worm2 = $AD20 ;-AD3E (1F) +worm3 = $AD3F ;-AD5D (1F) +worm4 = $AD5E ;-AD7C (1F) +balls = $AD7D ;-AE00 (<=3x44d) +turn10 = $AE01 ;-AE01 (1) (counter) +peaspos = $AE02 ;-AF05 (4-260) (peas) +;free = $AF06 ;-AFFF (F9) 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) +;buffer = $BC00 ;-BF90 (390) +;free = $BF91 ;-BFFF (6F) +;program = $D748 ;-EFFF (186D+4A) ;6327 +leveldata = $F080 ;-F9FF (<=97F) +#ifndef intlevels +datalevels = $FA00 ;-FA11 (12) (>=$C000) +nrlevels = $FA12 ;-FA1B (A) (<$FA70) +#endif -turn10 = $AE01 -peaspos = $AE02 +;MEM|8---9---A---B---C---D---E---F---| ;there's something wrong +; |..[------]||[]|......[-----]|[].| ;if you still understand < OUTDATED < +; | SCREEN 2* 13 PRGM 4LV | ;after looking at this -;--- temporary +;--- temporary --- namelength = $BC00 ;(1) @menu +datalink = $BC00 ;(8) @init #ifdef buffer DispBuffer = $BC00 ;(10x57d) @game #else DispBuffer = $FC70 #endif - -;----------------------------- -;------- program start ------- -;----------------------------- - -.org _asm_exec_ram - -wormVhost = 093 -wormVclient = 193 - -start: - nop - jp Start - .dw 1 - .dw WormTxt - .dw WormIcon - -WormTxt: - .db "WORMY by SHIAR -- beta 93%",0 +linklevel = $AECC ;(<=134) @game+init +lefttotalb = $BF91 ;(1) @game +drawctfpea1 = peaspos+4 +drawctfpea2 = peaspos+6 + +;_______________________________________________________________________________ +; _____ ______ _____ ______ _______ _______ _______ ______ _______ +; |_____] |_____/ | | | ____ |______ | |_____| |_____/ | +; | | \_ |_____| |_____| _____ ______| | | | | \_ | +;_______________________________________________________________________________ + + .org %1101011101001000 + +start: ;turn back NOW! + nop ;and so it begins... + jp Start + ld bc,$5242 + rst 10h + .dw WormIcon + ld d,a + ld c,a + ld d,d + ld c,l + ld e,c + jr nz,$+100 + ld a,c + jr nz,$+$55 + ld c,b + .dw 16713 + .db %1010010 + jr nz,$+47 + dec l + .db " 97% .19",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 8,2 + .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 = 97 ;wormy levels header = "97" 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,22 +245,22 @@ 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 + im 2 ;...it *does* work ;) cal _RAM_PAGE_7 ld hl,$BFFF ;VAT start @@ -243,7 +315,7 @@ stringfound: inc ix _searchnext: cal _RAM_PAGE_7 - jr searchnext + jr searchnext loadgametype: psh de @@ -257,91 +329,78 @@ loadgametype: inc bc pop af pop de ;counter - dec d ;8x + dec d ;9x jr nz,loadgametype ret +;_______________________________________________________________________________ +; _______ _ _ _______ _______ _______ _______ _______ +; | |______ \ / |______ |______ | |______ | | +; |_____ |______ \/ _____ ______| |______ |_____ |______ |_____ | +;_______________________________________________________________________________ + searchcomplete: ld a,255 ld (ix),a ;end mark +#ifdef intlevels + ld ix,templevels-6 +#else + ld ix,templevels-3 +#endif + cp (ix+3) ;1st=255 + jp z,ExitNoStats ;->no lvls + cp (ix+6) ;2nd=255 + jr z,loadlevel1 ;->1 lvl +levelselectmenu: ;load next page + 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 de,3 + add ix,de + ld a,(ix) + 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 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 +loadlevel1: + psh ix + pop hl + ld b,-2 + jr loadlevel -loadlevel: +readylevelfile: ;selected level at ahl +; ld hl,templevels-3/0 ld a,b add a,3 ;sellev+3 (#0==-3) ld e,a @@ -349,38 +408,103 @@ 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: +#ifdef intlevels + ld ix,templevels-6 ;reset 2 1st page +#else + ld ix,templevels-3 +#endif +_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 - ld d,8 ;counter + ld d,9 ;counter ld bc,datalevels cal loadgametype ld (hilvlposa),a ;singleplayer levels ld (hilvlposhl),hl - ld d,4 + ld d,5 cal loadgametype cal _SET_ABS_SRC_ADDR ;levelsstart @@ -415,15 +539,19 @@ setdeflevels: add hl,de ;next dnz setdeflevels -;----------------------------- -;----- build trig tables ----- -;----------------------------- +;_______________________________________________________________________________ +; _______ _____ ______ _______ _____ __ _ _____ _______ +; | | | | | |_____/ |______ | | \ | | | +; | | | |_____| | \_ |______ _____ __|__ | \_| __|__ | +;_______________________________________________________________________________ - ld hl,TrigPrecalc - ld de,SinCosTable - psh de ; >> 1 - ld bc,65 - ldir +;--- trig tables --- + + ld hl,TrigPrecalc ;I believe this + ld de,SinCosTable ;is one of the few + psh de ;pieces of original + ld bc,65 ;Peaworm code still + ldir ;left intact.. dec hl ld b,63 MirrorSineWave: @@ -432,7 +560,7 @@ MirrorSineWave: ld (de),a inc de dnz MirrorSineWave - pop hl ; << 0k + pop hl ;SinCosTable ld b,128+64 NegativeSineWave: xor a @@ -442,27 +570,31 @@ NegativeSineWave: inc de dnz NegativeSineWave -;----------------------------- -;---------- menu ------------- -;----------------------------- +;_______________________________________________________________________________ +; _______ _______ _____ __ _ _______ _______ __ _ _ _ +; | | | |_____| | | \ | | | | |______ | \ | | | +; | | | | | __|__ | \_| _____ | | | |______ | \_| |_____| +;_______________________________________________________________________________ + +;---draw menu--- -DisplayMenu: ;---draw menu--- +DisplayMenu: cal linkok cal _clrWindow ld de,$FC40 ;(0,4) 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 - ld a,(hl) + ld a,(Gametype) dec a ;will be inced @changegame - and 7 - ld (hl),a + cal changedgame ld hl,changegame ;dispmenusets ;mainMenu psh hl ;jump here after ret ld hl,txtMenu @@ -470,9 +602,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 +614,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 @@ -497,17 +632,27 @@ dispmenuloop: hr: ;draw horizontal line at hl ld b,16 - jp menuinvloop +; jp menuinvloop ;shorter but not good for pausescreen +hrloop: + ld (hl),-1 + inc hl + dnz hrloop + ret -;--- menu loop --- +;--- options menu --- dispoptionmenu: ld hl,txtoMenu ld ix,posoMenu ;Back|Lives|Limit|Speed|Rotation|Growth - cal dispmenucommon + cal dispmenucommon_ dispomenusets: +#ifdef spprotect + ld a,(gameCar) + and _datasingl + jp nz,LetsGetThisPartyOn +#endif cal clrold ld hl,$1E3E @@ -586,9 +731,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 +802,7 @@ changelimitInit: changespeed: cal changespeedInit inc a - cp 99 + cp 20 jr nc,_optionMenu ;>98 changedspeed: dec hl ;(Speed) @@ -714,7 +859,7 @@ bchangegrowth: jr z,__optionMenu ;<-1 jr changedgrowth -;--- +;--- main menu --- mainMenu: cal menupos @@ -730,6 +875,17 @@ select: ;2nd/enter dec a ;6th: controls jp z,changekeys jp LetsGetThisPartyOn ;otherwise + +changenrworms: + cal change4spOnly + ld a,(hl) ;hl=nrworms + inc a + cp 5 + jr nc,mainMenu ;may not be >4 +changednrworms: + ld (hl),a + jr _dispmenusets ;mainMenu + notselect cp K_EXIT jp z,ExitNoStats @@ -738,9 +894,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 @@ -785,16 +941,6 @@ bchangecurworm: jr nz,changedcurworm ;save >0 jr mainMenu -changenrworms: - cal change4spOnly - ld a,(hl) ;hl=nrworms - inc a - cp 5 - jr nc,mainMenu ;may not be >4 -changednrworms: - ld (hl),a -_dispmenusets: - jr _dispmenusets ;mainMenu changenrwormsInit: ld a,(Gametype) cp 3 @@ -824,6 +970,7 @@ bchangelink: ld a,1 ;change LS-bit (=link) xor (hl) ;0=1; 1=0 ld (hl),a +_dispmenusets: jr dispmenusets ;mainMenu changegame: @@ -833,7 +980,12 @@ changegame: jr z,changegame jr dispmenusets ;mainMenu changedgame: - and 7 ;mod 8 + cp 9 + jr c,changedgameok + sub 255-8 ;-1 -> 8 + jr nc,changedgameok + xor a ;9 -> 0 +changedgameok: ld (Gametype),a cal getnrlevels xor a @@ -877,9 +1029,8 @@ getcustomkey: cal _vputs dec ix waitcustomkey: - halt \ halt psh hl - cal GET_KEY + cal ubergetkey pop hl or a jr z,waitcustomkey @@ -897,7 +1048,7 @@ changekeys: cal getcustomkey ;right ; jr dispmenusets -;---display current settings--- +;--- display current settings --- dispmenusets: cal clrold @@ -918,8 +1069,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 +1086,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 cshowA00 + jr lvldisped +displvlname: + cal _vputs +lvldisped: + pop bc ld hl,$3032 ld (_penCol),hl @@ -963,8 +1124,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 +1224,7 @@ enternameloop: ld a,'_' cal __vputmap nokeypressed: - halt - cal GET_KEY + cal ubergetkey or a jr z,nokeypressed @@ -1113,7 +1272,16 @@ nameentered: ld (ix+8),0 ;end mark jp DisplayMenu -;--proc +;_______________________________________________________________________________ +; _______ _____ _______ _______ _____ ______ _____ _______ _______ +; | | | | |______ | |_____] |_____/ | | | |______ +; | | | __|__ ______| |_____ _____ | | \_ |_____| |_____ ______| +;_______________________________________________________________________________ + +ubergetkey: + halt ;woo hoo + halt ;save them batteries! yeah! + jp GET_KEY clrold: ld hl,$FD97 ;begin pos @@ -1132,7 +1300,38 @@ clroldsetsloop: jr nz,clroldsettings ret +hlatlevel: ;d must be 0 + psh hl ;loadgamecar + ld a,(Gametype) ;8bytes -> 7bytes + add a,a + ld e,a ;=de + ld hl,datalevels + add hl,de + 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 +1344,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 @@ -1162,18 +1360,21 @@ skipballs: skipflags: ld a,(Gametype) + cp gamerace + jr z,skiplaps cp gamectf jr nz,noflagstoskip inc hl inc hl +skiplaps: inc hl inc hl noflagstoskip: skipobjects: - ld a,(hl) - inc hl - or a + xor a + or (hl) + inc hl ;nf ret z ;0=end inc hl inc hl @@ -1203,65 +1404,57 @@ loadgamecar: ld (wormbeglives),a ret -;----------------------------- -;-------- start game --------- -;----------------------------- +;_______________________________________________________________________________ +; _______ _______ _______ ______ _______ ______ _______ _______ _______ +; |______ | |_____| |_____/ | | ____ |_____| | | | |______ +; ______| | | | | \_ | _____ |_____| | | | | | |______ +;_______________________________________________________________________________ LetsGetThisPartyOn: ld a,$17 ;no exit ld (CheckExit),a ;set exit state - cal loadgamecar - psh hl - ld (wormbeglives),a - inc hl ;nrworms - ld a,(hl) - ld (nrworms),a - inc hl ;level +setupworms: + ld hl,worm1set + ld de,worm1 + ld a,4 ;4x (all worms) +createwormsloop: + ex de,hl + ld bc,died ;0008 + add hl,bc +; ld b,0 + ld (hl),b ;died=0 inc hl - ld a,(hl) - ld (customspeed),a + ld (hl),b ;score=0 inc hl - ld a,(hl) - ld (growspeed),a + ld (hl),b ;score+1=0 inc hl - ld a,(hl) - ld (turnleft),a - ld (turnright),a ;more efficient + ld (hl),2 ;delay=2 inc hl - ld l,(hl) - ld h,0 - cal _HLTIMES10 ;hl=10*(hl) - ld (scorelimit),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 - 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 +OhMyGodItsALabel: ;pj34r my coding skillz + cal loadgamecar + psh hl ;datatype + cal hlatlevel + ex (sp),hl ;pop \ psh leveldata + psh hl ;psh loadgamecar + ld a,0 +gameCar =$-1 + rra ;and _datalink + jr nc,_StartLevel - 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: +;--- link --- - psh hl ;1st level - ld a,(gameCar) - rra ;and _datalink - jr nc,GameOver +wormVhost = 095 +wormVclient = 195 linkmatch: cal _clrWindow @@ -1281,57 +1474,146 @@ 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 ;loadgamecar + pop de ;leveldata + psh de + psh hl ;loadgamecar + ld b,8 + cal sendstuff + ld hl,gameCar + ld b,1 + cal sendstuff + ld hl,Gametype + ld b,1 + cal sendstuff ex de,hl - ld bc,died - add hl,bc - ld b,0 - ld (hl),b ;died=0 + ld b,168 + cal sendstuff +_StartLevel: + jr StartLevel +sendstuff: + psh de +sendstuffloop: + psh bc + ld c,(hl) inc hl - ld (hl),b ;score=0 + cal Qsend + pop bc + dnz sendstuffloop + pop de + ret +recvstuff: + psh de +recvstuffloop: + psh bc + cal Qrecv + ld (hl),c inc hl - ld (hl),b ;score+1=0 + 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 ;loadgamecar + pop de ;leveldata + ld de,linklevel ;&&&&&&& + ld hl,datalink + psh de + psh hl ;loadgamecar + ld b,8 + cal recvstuff + ld hl,gameCar + ld b,1 + cal recvstuff + ld hl,Gametype + ld b,1 + cal recvstuff + ex de,hl + ld b,168 + 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 (hl),2 ;delay=2 + ld a,(hl) + ld (customspeed),a inc hl - ld (hl),3 ;lives=x -wormbeglives =$-1 + ld a,(hl) + ld (growspeed),a inc hl - ex de,hl ;de=wormX+head - ld bc,18 - ldir ;copy 18 bytes - dec a ;loop - jr nz,createwormsloop + ld a,(hl) + ld (turnleft),a + ld (turnright),a ;more efficient + inc hl + ld l,(hl) + ld h,0 + ld a,(gameCar) + rla + ld a,h ;(Left)=256 + jr nc,setscorelimit + ld a,l + ld l,h +setscorelimit: + ld (customleft),a + cal _HLTIMES10 ;hl=10*(hl) + ld (scorelimit),hl -StartLevel: +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,21 +1625,45 @@ StartLevel: psh bc ;where to go afterwards inc hl ;location of ending-code jp (hl) ;go there ("call") -nextlevel: - ldi +donextlevel: + ld a,(Gametype) + or a ;gamesingle + psh af + cal nz,skiplvltitle + ld a,(hl) + and 127 + jr nz,setleft +customleft =$+1 + ld a,0 +setleft: + ld (Left),a + inc a + ld (lefttotal),a + dec a + xor (hl) ;bit (hl),7 + ld bc,gameCar + ld a,(bc) + jr z,leftloaded + or 128+32 +leftloaded: + ld (bc),a + inc de + inc hl + 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) - ld (worm1+grow),a + ld (worm1+grow),a ;&&sh ld (worm2+grow),a ld (worm3+grow),a ld (worm4+grow),a @@ -1403,8 +1709,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 @@ -1422,19 +1727,23 @@ worminit: ld (hl),a ;y2 inc hl ld (hl),a ;x2 + inc hl + inc hl + ld (hl),a ;growH=0 - ld bc,(worm2-worm1)-5 + ld bc,(worm2-worm1)-7 add hl,bc pop bc ;<0 dnz worminit inc a ;ld a,1 ld (turn10),a - ld a,2 + inc a ;ld a,2 ld (flashtime),a -;-------- draw level --------- +;--- draw level --- +initlevel: ld a,(de) inc de sub 128 @@ -1466,16 +1775,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 +1796,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 +1824,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 +1863,6 @@ maskline: dec c jr nz,maskloop #endif - #ifdef readytext ld hl,$FDE0 ld de,$FDE1 @@ -1572,47 +1877,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) + rla ;bit _bitmultpeas,a + cal c,multnewpea ;a=0 + rla ;bit _bitfood,a + cal nc,NewPea +nofood: + ld bc,(worm1+pos) + cal DisplayField ld b,startdelay ReadyDelay: @@ -1620,9 +1892,11 @@ ReadyDelay: dnz ReadyDelay cal releasekeys -;----------------------------- -;----------- LOOP ------------ -;----------------------------- +;_______________________________________________________________________________ +; ______ _______ _______ _______ _____ _____ _____ +; | ____ |_____| | | | |______ | | | | | |_____] +; |_____| | | | | | |______ _____ |_____ |_____| |_____| | +;_______________________________________________________________________________ GameLoop: ld bc,(worm1+pos) ;camera worm #1 @@ -1682,16 +1956,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,86 +1984,113 @@ handleworms: add ix,bc pop bc ld hl,handledworm - inc (hl) ;1..nrworms + inc (hl) ;0..nrworms-1 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 - + 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 +2099,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 +2123,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 @@ -1868,7 +2181,7 @@ nonewdmwinner: dnz finddmwinner ld (dmwinner),a -;---display worms--- +;--- display worms --- ld a,(nrworms) ld b,a @@ -1898,20 +2211,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 +2230,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 @@ -1930,7 +2238,8 @@ notwinner: psh hl inc hl ;worm+score cal _ldHLind - cal showHL + cal _D_HL_DECI + cal _puts ;showHL pop hl ld bc,worm2-worm1 @@ -1987,6 +2296,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 @@ -1998,13 +2310,12 @@ NotNewHigh: ld hl,highsave+2 cal _puts ld hl,(highsave) - cal showHL + cal _D_HL_DECI + cal _puts ;showHL hiscorecheckdone: waitkey: - halt - halt - cal GET_KEY + cal ubergetkey cp K_ENTER jp z,DisplayMenu cp K_SECOND @@ -2057,12 +2368,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,16 +2383,24 @@ hiscrposa =$+1 highsave: .db 0,0,"WOR ",0 -;----------------------------- -;----------- worm ------------ -;----------------------------- +iswinner: + ld a,10 + ld (_curCol),a + ld a,'*' + jp _putc ;..then put * + +;_______________________________________________________________________________ +; _ _ _ _____ ______ _______ _______ _______ _ _ _______ _______ +; | | | | | |_____/ | | | |______ | | | |______ |______ +; |__|__| |_____| | \_ | | | _____ ______| | |_____| | | +;_______________________________________________________________________________ respawncheck: cp respawndelay-1 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) @@ -2099,6 +2415,8 @@ removewormloop: cal res4pixels pop hl inc (ix+grow) + jr nz,DoesWormTailEqualsWormHead + inc (ix+grow+1) ;+256 DoesWormTailEqualsWormHead: cal _cphlde jr nz,removewormloop @@ -2109,6 +2427,7 @@ DoesWormTailEqualsWormHead: ld a,0 beginsize =$-1 ld (ix+grow),a + ld (ix+grow+1),0 ;high safewormsizedone: ;de=ix+head @@ -2187,7 +2506,11 @@ inlink: ld l,c ret -;------- handle worm --------- +;_______________________________________________________________________________ +; _ _ _ _____ ______ _______ _______ _____ _ _ _______ +; | | | | | |_____/ | | | |_____| | | \ / |______ +; |__|__| |_____| | \_ | | | _____ | | |_____ __|__ \/ |______ +;_______________________________________________________________________________ HandleWorm: xor a @@ -2211,7 +2534,7 @@ nogrow: ld a,(gameCar) and _datatime jr z,notimescore - ld de,1 + ld e,1 cal IncScore notimescore: @@ -2226,6 +2549,7 @@ donediddelydone: ld e,(ix+pos2) ld d,(ix+pos2+1) +#ifdef optdie psh hl ld hl,previouspos ld (hl),c @@ -2237,8 +2561,9 @@ donediddelydone: inc hl ld (hl),d pop hl +#endif -;-------- move worm ---------- +;--- move worm --- Wormmove: psh bc ; >> pos @@ -2291,43 +2616,46 @@ GotFour: rl d jp nc,Drawworm -;--------- worm hit ---------- +;--- worm hit --- Hitworm: ld a,(gameCar) - ld h,a #ifdef optdie - and _datadie - cal z,checkhitotherworm +; if race - originally + ld h,a + cal checkhitotherworm ld a,h #endif - and _datamultpeas ;&&bit + bit _bitctfpeas,a jr nz,chkctfpeas - ld a,h - and _datafood - jp z,WormDead ;no food + rla ;and _datamultpeas + jp c,chkmultpeas + rla ;and _datafood + jp c,WormDead ;no food ld hl,0 PeaY =$-2 PeaX =$-1 cal chkpeahit jp nc,WormDead +pickpea: cal DrawPea ;remove pea + cal NewPea +pickpea_: ld a,(ix+grow) add a,15 peagrowth =$-1 ld (ix+grow),a - cal NewPea + jr nc,wormset2grow + inc (ix+grow+1) +wormset2grow: ld hl,Left - dec (hl) + dec (hl) ;dec left before display psh af - ld de,10 + ld e,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 @@ -2341,12 +2669,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) @@ -2384,9 +2712,10 @@ sel_otherpea: pop af ;which flag? (=and %1) ld hl,drawctfpea1 ;restore #1 jr z,nottheotherflag - ld hl,drawctfpea2 ;restore #2 + inc hl ;ld hl,drawctfpea2 + inc hl ;restore #2 nottheotherflag: - ld (hl),$E6 ;and nn + ld (hl),3 ;draw delay 3 turns ret hitflag: ;correct pea hit @@ -2399,22 +2728,45 @@ 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) +chkmultpeas: + ld de,peaspos-1 + ld hl,lefttotalb +lefttotal =$+1 + ld (hl),0 +chkmultpealoop: + ex de,hl + inc hl + ld e,(hl) + inc hl + ld d,(hl) + ex de,hl + psh de + cal chkpeahit + pop de + jr c,pickmultpea + ld hl,lefttotalb + dec (hl) + jr nz,chkmultpealoop + jp WormDead +pickmultpea: + ld a,247 + ld (de),a + dec de + ld (de),a cal DrawPea - ld hl,(peaspos+2) - jp DrawPea + jp pickpea_ -;----------------------------- +;--- misc --- +#ifdef optdie nextotherwormbit: ld a,c sub (hl) @@ -2434,60 +2786,36 @@ ChkWorm: cal _cphlde jr nz,nextotherwormbit ret ;z +#endif 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 -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 -#endif -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 ---------- +;--- draw worm --- Drawworm: ld c,(ix+pos) @@ -2513,10 +2841,14 @@ Drawworm: ld (ix+head),l ld (ix+head+1),h - ld a,(ix+grow) - dec a + ld l,(ix+grow) + ld h,(ix+grow+1) + dec hl + ld a,h + or l jr z,removetail - ld (ix+grow),a + ld (ix+grow),l + ld (ix+grow+1),h ret removetail: @@ -2529,6 +2861,13 @@ removetail: cal resbit ld (ix+tail),l ld (ix+tail+1),h + psh hl + cal res4pixels + pop hl + ld c,(hl) + inc hl + ld b,(hl) + jr set4pixels res4pixels: cal ResPixel @@ -2544,9 +2883,11 @@ ResPixel: ld (hl),a ret -;----------------------------- -;---------- ball ------------- -;----------------------------- +;_______________________________________________________________________________ +; ______ _____ _ _ __ _ _______ __ __ ______ _______ +; |_____] | | | | | \ | | \_/ |_____] |_____| | | +; |_____] |_____| |_____| | \_| |_____ | |_____] | | |_____ |_____ +;_______________________________________________________________________________ handlethoseneatlittleballs: ld hl,balls @@ -2639,9 +2980,11 @@ checkballhit: pop de ret -;----------------------------- -;----------- procs ----------- -;----------------------------- +;_______________________________________________________________________________ +; _____ ______ _____ _______ _______ +; |_____] |_____/ | | | |______ +; | | \_ |_____| |_____ ______| +;_______________________________________________________________________________ releasekeys: halt @@ -2672,6 +3015,92 @@ Seed =$+1 add a,2 ret +WormDead: +#ifdef invincible + jp stopworm +#endif + 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 a,(Gametype) + cp gamectf ;ctf no death penalty + cal nz,DecScore10 + 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 + +#ifdef optdie +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 +#endif + CheckPea: ;@hl; destr:abcde ld c,l ld a,(sprsize) @@ -2695,13 +3124,35 @@ chkloopx: 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 + +multnewpea: + ld de,peaspos + ld a,(Left) + ld b,a +multpealoop: + psh bc + psh de + cal NewPea + pop de + ld hl,PeaY + ldi + ldi + pop bc + dnz multpealoop + ld a,-1 + ret NewPea: ld a,(FieldWidth) @@ -2712,9 +3163,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 @@ -2760,7 +3212,47 @@ nextbitok: dnz sprloopy ret -;----------- 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 ;+del0ay + 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 @@ -2772,26 +3264,34 @@ 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 + +DecScore10: + cal ldscoreinhl + ld de,-10 + add hl,de + jr nc,showstats ;<0=0 + jr scorecommon + +IncScore: ;inc score by e + ld d,0 +_IncScore ; inc by de + cal ldscoreinhl + 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 +3303,14 @@ 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 @@ -2850,16 +3357,32 @@ nameshown: ret showstat: ;(multiplayer) - ld a,(Gametype) - cp gamedeathm - jr z,showlives + ld a,(wormbeglives) + or a + jr nz,showlives showscore: - ld h,(ix+score+1) - ld l,(ix+score) + cal ldscoreinhl cal _D_HL_DECI jr __vputs showlives: ld a,(ix+lives) + jr cshowA00 + +cshowA: ;small w/ leading 0 + or a + jr nz,cshowA00 + ld hl,txtNone + jp _vputs +cshowA00: + ld l,a + ld h,0 + cal _divHLby10 + psh af + ld a,l + add a,'0' + cal __vputmap + pop af +cshowA0: add a,'0' __vputmap: psh ix @@ -2873,31 +3396,24 @@ showstatsS: ;(singleplayer) 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 + cal c,cshowA0 pop af -tilllevel9: - add a,'0' - cal __vputmap + cal nc,cshowA00 - ld a,98 + ld a,97 ld (_penCol),a cal showscore ld a,123 ld (_penCol),a - cal showlives + ld a,(ix+lives) + cal cshowA0 ;showlives ld a,(gameCar) and _datafoodl pop ix ret z showleft: - ld a,31 + ld a,33 ld (_penCol),a ld a,0 Left =$-1 @@ -2914,7 +3430,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,27 +3442,6 @@ showA: add a,'0' jp _putc -cshowA: - or a - jr nz,cshowavalue - ld hl,txtNone - jp _vputs -cshowavalue: - ld l,a - ld h,0 - cal _divHLby10 - psh af - ld a,l - add a,'0' - cal __vputmap - pop af - add a,'0' - jp __vputmap - -showHL: - cal _D_HL_DECI - jp _puts - _D_HL_DECI: ld de,savestr+4 ld b,5 @@ -2961,11 +3456,20 @@ ldhld: savestr: .db "00000",0 -;----------------------------- +ldscoreinhl: + ld h,(ix+score+1) + ld l,(ix+score) + ret -DisplayField: - ld a,c - sub 29 +;_______________________________________________________________________________ +; ______ _____ _______ _____ _______ __ __ +; | \ | |______ |_____] | |_____| \_/ +; |_____/ __|__ ______| | |_____ | | | +;_______________________________________________________________________________ + +DisplayField: ;all done by Jonah Cohen iirc. (-scrolling is scary-) + ld a,c ;not the fastest routine outthere, but it does get the job done. + sub 29 ;if something doesn't work, I probably _did_ alter it ;) jr nc,NotMinYScroll xor a NotMinYScroll: @@ -3185,7 +3689,11 @@ ChunkRow: ld c,$37 ;scf ret -;----------- draw ------------ +;_______________________________________________________________________________ +; ______ ______ _______ _ _ _ +; | \ |_____/ |_____| | | | +; |_____/ | \_ | | |__|__| +;_______________________________________________________________________________ ;--- pixel --- @@ -3234,7 +3742,7 @@ FindPixel: ;(b,c) to hl:a FP_Bit =$+1 set 0,a - psh de ;&&& + psh de ;&&& C`MON! THIS IS UGLY! *hit myself* ld de,ScrBuffer add hl,de pop de @@ -3264,176 +3772,21 @@ 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 - -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 - 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 - pop hl - pop bc - ret -#else - ld l,e -boxloop: - cal drawline - inc l - inc e - dnz boxloop - ret -#endif + jr z,drawbox +; dec a ;4 = circle +; jp z,drawcircle -drawfatline: - cal drawline - inc d - inc h - cal drawline - inc e - inc l - cal drawline - dec d - dec h - jp drawline - -;LINE (d,e)-(h,l) -;destroyes a +;--- circle --- -drawline: ;(d,e)-(h,l) - psh bc ;destr: a - 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 +;IMHO, one weery nice routine. Oh lemme be proud just *once*. +;Not perfect since it uses a screwy lineroutine to draw stuff +;but, just _look_ at it. Ain't it grand? Z80 at its best. +;Nice comments, also. So here we go: Shiar's Circle Routine: +;(using the Bresenham method) drawcircle: ;(d,e),h ;de=x,y; h=z ld c,h ;c=yy=z @@ -3498,60 +3851,173 @@ circledraw: ;destr:de ld b,c ld c,a ;ex b,c pop hl + ret ;thats it + +;--- box --- + +drawbox: ;(d,e)-(h,l) + ld b,l ;Delta-y + ld l,e +boxloop: + cal drawline + inc l + inc e + dnz boxloop ret +;--- fatline --- -;----------------------------- -;----------- link ------------ -;----------------------------- +drawfatline: + cal drawline + inc d + inc h + cal drawline + inc e + inc l + cal drawline + dec d + dec h +; jp drawline -linkok: - ld a,D0HD1H - out (7),a ;raise both wires = link ok - ret +;--- line --- -timeout = $8000 -lossout = 20 +;A lot like Scabby's line routine in Wonderworm (dunno whether he wrote it +;himself tho.) I did make a few optimizations and commented the thing. +;A nice routine (also Bresenham), but for Wormy not perfect since really +;large lines (>128 pixels in length or something) won't be flawless. -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 - cal linkok - ld a,0 ;losses so far -linklosses =$-1 - inc a ;and this is another one - ld (linklosses),a - pop de ;return from link - cp lossout ;quit if too many errors - ret c ;otherwise just continue -linkerr: - jp Exit -linkfine: - in a,(7) - and %11 +drawline: ;(d,e)-(h,l) + psh bc ;destr: a + psh hl + psh de + ld a,d ;a=d=x + cp h ;h=xx + jr c,lineXincs ;if x>xx + ex de,hl ;make x + ld c,a ;c=mask (always) + ld a,h ;a=xx + sub b ;xx-x + ld b,a ;b=deltax (always>0) + ld a,l ;a=yy + jr nz,lineexists ;deltax!=0 + cp e ;yy==y + jr nz,lineexists ;deltay!=0 + pop hl ; :