X-Git-Url: http://git.shiar.nl/wormy.git/blobdiff_plain/bf4b72fa8be434aad2c0415684c8625ae8df77a7..8804e9541b51585f5f9bb062568e34965a0a52e8:/wormy.z80 diff --git a/wormy.z80 b/wormy.z80 index 26d374f..18efe0c 100644 --- a/wormy.z80 +++ b/wormy.z80 @@ -1,4 +1,4 @@ -; ÜÛÛÝ ÜÜÜÜ +;___ÜÛÛÛ________________________________________________________ÜÜÜÜ____________ ; ÛÛÛß ÛÛÛÛÝ ; ÛÛÛ ßÛÛÛ ÞÛÛÜ ;ÞÛÛ ÜÛÛÛÜ ÜÜÛÛÛÛÜÜ ÜÛÛÛÛ ÜÛÛÜ ÜÛÛÜ ÞÛÛ ÛÛÛÛÛ @@ -13,74 +13,112 @@ ; ÛÛÛ ÛÛÛ ÛÛÝ ÞÛÛ ÛÛÝ ÛÛÛ ÛÛÝ ßÛÛÛÛß ÞÛÛ ÛÛÛ ; ÛÛÛÜ ÜÛÛÛÛÛÜ ÜÛÛÛ ÛÛÝ ÛÛÛ ÞÛÛÝ ÛÛÝ ÛÛÛÜÜ ÜÛÛÛ ; ÛÛÛÛÛÛÛß ßÛÛÛÛÛÛÛ ÞÛÛÜÜÛÛÛÝ ÛÛÛ ÞÛÛ ÛÛÛÛÛÛÛÛÛÛÛÛÛÛÝ -; ßÛÛÛß ÛÛÛÛÝ ßÛÛÛÛÛß ÛÛ ÛÛÝ ßÛÛÛÛÛÛÛÛÛß +; ßÛÛÛß ßÛÛßß ßÛÛÛÛÛß ÛÛ ÛÛÝ ßÛÛÛÛÛÛÛÛÛß +;_______________________________________________________________________________ ; -; Version : 97% (0.97.13) -; Release Date : UUHHhhh... soon?!? -; 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 (80898 bytes) 1234 - -;----------------------------- -;----------- TO-DO ----------- -;----------------------------- +; Version : 97% (0.97.116) +; Release Date : 2002 January 16 +; Author(s) : Shiar +; Email Address : wormy@shiar.org +; Web Page : www.shiar.org +; Description : perfect Nibbles game with free movement, nine +; game modes, for 1-4 players +; Where to get this game : www.shiar.org +; 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 (6512) : efef32a8c541b4585087f55deb31f51d +;_______________________________________________________________________________ + +;--- notes --- + +; * Use for LEARNING practises ONLY! +; Don't _ever_ release altered code w/o permission! +; Please notify me of using code, and give me credits! +; * 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 +; X [19A] team score! +; X [19A] autogrowth doesn't always work -> init (turn) +; X [111] ED: disabled objects counted causing CRASH when writing hiscore! +; X [111] LINK: init+multiple pea transmit seems to work.. +; X [111] LINK: host/client swapped (host now sends level config) +; X [111] LINK: optimize transmit (most initcode same for client+host) +; X [113] menu limit in multifm not x10 +; X [113] wormhit procedure seperate (called now) +; X [114] LINK: peas sent again :P +; X [114] internal level check and sprite storage removed +; X [115] layout data stuff at bottom +; X [115] ED: init place bar fixed +; X [115] ED: keys also usable together with mouse +; X [115] ED: improved version handling +; X [115] LINK: receive message not needed anymore afaik +; X [115A] $D8 used for spacing at g/o screen. i rule B) +; X [115A] exit at g/o goes back to menu +; X [115A] more in menu lets you reselect the levelfile +; X [115A] LINK: fixed waiting mode (minor display problem) +; X [116] incs at skiplevels effectively replaced by add (-4 bytes) +; X [116] another 2 bytes shaved off +; X [116] LINK: received gamemode now displayed correctly at g/o +; X [116] gamecar right after gametype saves about 20 bytes +; X [116] LINK: minimize sent data +; X [116] remove +input in worm storage +; X [116] head position init uses same data as tail (-4 bytes) +; * word-value display storage in chartable hole?? ; 1% * misc (bugs, &&&, pollish, &&, &) -; * score >9 dispay -; * mem at worm #4 (still 12 bytes or so.. or more? or less?) ; * look at init-z in line routine again -; * LINK -; 1% * fix transmit game/level data (?) -; * >Somehow do a lot of testing with 2 calcs< *sigh* - +; * rare pea|wall overwrite <- apply stopworm fix? +; 1% * LINK: >Somehow do a lot of testing with 2 calcs< *sigh* +; * 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 - -; arrow to offscreen peas -; multiple peas in sp level -;>110%: sound, startpos (?) -;>120%: coop (DON'T COUNT ON IT) - -;----------------------------- -;----------------------------- -;------- W O R M Y --------- -;----------------------------- -;----------------------------- - -;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 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). -;* Don't scroll down if you get scared easily. - -#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 -multpeas - -;#define intlevels ;internal levels -;#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 +; * correct team winners +; * arrow to offscreen peas +;110% * sound +; * startpos +;120% * coop (DON'T COUNT ON IT) +; * pause in linkplay + +;_______________________________________________________________________________ +; _/_/_____ __ _ _______ _ _ ______ _______ +; _/_/ | | \ | | | | | | \ |______ +; / / __|__ | \_| |_____ |_____ |_____| |_____/ |______ +;_______________________________________________________________________________ #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 @@ -111,38 +149,55 @@ _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 (4*40) -turn10 = $AE01 ;-AE01 (1) (counter) -peaspos = $AE02 ;-AE05 (4+) (peas) -;free = $AE06 ;-AFFF (1FA) +SinCosTable = $AC00 ;-AD00 (4*40) +worm1 = $AD01 ;-AD1E (1E) +worm2 = $AD1F ;-AD3C (1E) +worm3 = $AD3D ;-AD5A (1E) +worm4 = $AD5B ;-AD78 (1E) +balls = $AD79 ;-AE00 (<=3x2D) (bb<=45) +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 +;buffer = $BC00 ;-BF90 (390) ;free = $BF91 ;-BFFF (6F) ;program = $D748 ;-EFFF (186D+4A) ;6327 -worm4p = $F000 ;-F3FF (400) %11110O00 -leveldata = $F400 ;-FA70 (<=671) - ;can you believe i actually left $269 bytes of memory unused?!? +leveldata = $F080 ;-F9FF (<=97F) +#ifndef intlevels +datalevels = $FA00 ;-FA11 (12) (>=$C000) +nrlevels = $FA12 ;-FA1B (A) (<$FA70) +defspr = $F078 ;-F07F (8) +#endif ;MEM|8---9---A---B---C---D---E---F---| ;there's something wrong -; |..[------]||[]|......[-----]|[].| ;if you still understand +; |..[------]||[]|......[-----]|[].| ;if you still understand < OUTDATED < ; | SCREEN 2* 13 PRGM 4LV | ;after looking at this -;--- temporary +;--- temporary --- namelength = $BC00 ;(1) @menu datalink = $BC00 ;(8) @init @@ -151,11 +206,38 @@ DispBuffer = $BC00 ;(10x57d) @game #else DispBuffer = $FC70 #endif -lefttotalb = $AFFF - -;----------------------------- -;------- program start ------- -;----------------------------- +linklevel = $AECC ;(<=134) @game+init +lefttotalb = $BF91 ;(1) @game +drawctfpea1 = peaspos+4 +drawctfpea2 = peaspos+6 + +;--- layout --- + +;(wormN) set: +heading = 0 ;level* +pos = 2 ;level* +pos2 = 4 ;level +grow = 6 ;level +died = 8 ;game: +score = 9 +delay = 11 +lives = 12 +head = 13 + ; Ú15B (wormNset) +tail = 15 ; |also@next level +storepos = 17 ; | +reserv = 18 ; |loop (race:lap|ctf:pea) +left = 19 ; | +right = 20 ; | +name = 21 ; |_ + +wormsize = 30 ;^mark^ + +;_______________________________________________________________________________ +; _____ ______ _____ ______ _______ _______ _______ ______ _______ +; |_____] |_____/ | | | ____ |______ | |_____| |_____/ | +; | | \_ |_____| |_____| _____ ______| | | | | \_ | +;_______________________________________________________________________________ .org %1101011101001000 @@ -178,7 +260,7 @@ start: ;turn back NOW! .db %1010010 jr nz,$+47 dec l - .db " 97% .13",0 + .db " 97% .116",0 WormIcon: .db 8,2 .db %00000000,%00111100 @@ -191,7 +273,7 @@ WormIcon: .db %00111100,%00111110 levelhead = 'w' -levelhead2 = 95 ;wormy levels header = "95" +levelhead2 = 97 ;wormy levels header = "97" int_handler: ex af,af' @@ -228,6 +310,7 @@ Start: ld i,a im 2 ;...it *does* work ;) +restart: cal _RAM_PAGE_7 ld hl,$BFFF ;VAT start ld ix,templevels @@ -243,11 +326,8 @@ searchloop: jr z,stringfound searchnext: pop hl - dec hl ;5x - dec hl - dec hl - dec hl - dec hl + ld de,-5 + add hl,de ld b,(hl) ;name size inc b skipname: @@ -295,10 +375,16 @@ 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 @@ -324,7 +410,7 @@ levelselectmenu: ;load next page ld hl,$FC00+(2*16) ld b,16*9 cal menuinvloop - ld hl,$FC00+(56*16) + ld hl,$FC00+$380 ;(*,56) cal hr ld hl,$0601 ;x=1 ld (_penCol),hl @@ -452,8 +538,10 @@ levselectmenu: loadlevel: cal readylevelfile +#ifdef intlevels or a ;levelfile on page 0 (=internal) jr z,levelloaded +#endif cal skiptitle ;skip description cal _Get_Word_ahl @@ -499,11 +587,15 @@ setdeflevels: add hl,de ;next dnz setdeflevels -;----------------------------- -;----- build trig tables ----- -;----------------------------- +;_______________________________________________________________________________ +; _______ _____ ______ _______ _____ __ _ _____ _______ +; | | | | | |_____/ |______ | | \ | | | +; | | | |_____| | \_ |______ _____ __|__ | \_| __|__ | +;_______________________________________________________________________________ + +;--- trig tables --- - ld hl,TrigPrecalc ;I believe this + ld hl,trigtable ;I believe this ld de,SinCosTable ;is one of the few psh de ;pieces of original ld bc,65 ;Peaworm code still @@ -526,11 +618,15 @@ NegativeSineWave: inc de dnz NegativeSineWave -;----------------------------- -;---------- menu ------------- -;----------------------------- +;_______________________________________________________________________________ +; _______ _______ _____ __ _ _______ _______ __ _ _ _ +; | | | |_____| | | \ | | | | |______ | \ | | | +; | | | | | __|__ | \_| _____ | | | |______ | \_| |_____| +;_______________________________________________________________________________ -DisplayMenu: ;---draw menu--- +;---draw menu--- + +DisplayMenu: cal linkok cal _clrWindow ld de,$FC40 ;(0,4) @@ -544,14 +640,14 @@ DisplayMenu: ;---draw menu--- ld hl,$FC00+$3E0 ;(*,62) cal hr dispmainmenu: - ld a,(Gametype) + ld a,(gametype) dec a ;will be inced @changegame cal changedgame ld hl,changegame ;dispmenusets ;mainMenu psh hl ;jump here after ret ld hl,txtMenu ld ix,posMenu -;Mode|Level|Limit|Worms|worm #|controls +;Mode|Level|Link|Worms|worm #|controls ; jr dispmenucommon ;cal dispmenucommon_: @@ -591,7 +687,7 @@ hrloop: dnz hrloop ret -;--- menu loop --- +;--- options menu --- dispoptionmenu: ld hl,txtoMenu @@ -600,13 +696,18 @@ dispoptionmenu: cal dispmenucommon_ dispomenusets: +#ifdef spprotect + ld a,(gamecar) + and _datasingl + jp nz,LetsGetThisPartyOn +#endif cal clrold ld hl,$1E3E ld (_penCol),hl cal loadgamecar psh hl - cal cshowA0 ;lives + cal cshowA ;lives ld hl,$2A3E ld (_penCol),hl @@ -620,7 +721,7 @@ dispomenusets: cal _vputs jr dispspeeddone dispspeed: - cal cshowA0 + cal cshowA dispspeeddone: ld hl,$363E @@ -630,7 +731,7 @@ dispspeeddone: psh hl ld a,(hl) ;(growth) inc a ;-1=None; 0..98->1..99 - cal cshowA0 + cal cshowA ld hl,$303E ld (_penCol),hl @@ -644,7 +745,7 @@ dispspeeddone: cal _vputs jr dispturndone dispturn: - cal cshowA0 ;turn speed + cal cshowA ;turn speed dispturndone: ld hl,$243E @@ -654,9 +755,12 @@ dispturndone: ld a,(hl) ;(scorelimit) or a psh af - cal cshowA0 ;limit + cal cshowA ;limit pop af ;a==0? jr z,optionMenu ;do not display 0 behind 'None' + ld a,c ;(gamecar) + rla ;and _dataPmult + jr nz,optionMenu ;in multifood limit == #peas ld a,'0' cal _vputmap ;x10 @@ -806,7 +910,7 @@ bchangegrowth: jr z,__optionMenu ;<-1 jr changedgrowth -;--- +;--- main menu --- mainMenu: cal menupos @@ -827,8 +931,8 @@ changenrworms: cal change4spOnly ld a,(hl) ;hl=nrworms inc a - cp 5 - jr nc,mainMenu ;may not be >4 + cp 7 + jr nc,mainMenu ;may not be >4+2 changednrworms: ld (hl),a jr _dispmenusets ;mainMenu @@ -836,6 +940,8 @@ changednrworms: notselect cp K_EXIT jp z,ExitNoStats + cp K_MORE + jp z,restart psh af cal menupos cal loadgamecar @@ -860,13 +966,11 @@ selright: ; jr z,changecurworm changecurworm: -; hl=nrworms - ld a,(curworm) - cp (hl) - jr nc,mainMenu ;may not become >(nrworms) - inc a -changedcurworm: - ld (curworm),a + ld hl,curworm + ld a,(hl) + cp 4 + jr nc,mainMenu ;may not become >4 + inc (hl) jr _dispmenusets ;mainMenu selleft: @@ -883,27 +987,24 @@ selleft: ; jr z,bchangecurworm bchangecurworm: - ld a,(curworm) - dec a ;0-3 - jr nz,changedcurworm ;save >0 + ld hl,curworm + ld a,(hl) + dec (hl) ;0-3 + jr nz,_dispmenusets ;save >0 + inc (hl) +_mainMenu: jr mainMenu -changenrwormsInit: - ld a,(Gametype) - cp 3 - ld a,(hl) ;hl=nrworms - ret bchangenrworms: cal change4spOnly ld a,(hl) ;hl=nrworms - dec a ;0-3 + dec a ;0-(3+2) cp 2 jr nc,changednrworms ;save >=2 -_mainMenu: - jr mainMenu + jr _mainMenu change4spOnly: - ld a,(Gametype) + ld a,(gametype) cp 3 ret nc pop hl ;cal @@ -913,7 +1014,7 @@ changelink: bchangelink: cal change4spOnly dec hl ;inced earlier - dec hl ;gameCar + dec hl ;gamecar ld a,1 ;change LS-bit (=link) xor (hl) ;0=1; 1=0 ld (hl),a @@ -921,7 +1022,7 @@ _dispmenusets: jr dispmenusets ;mainMenu changegame: - ld a,(Gametype) + ld a,(gametype) inc a cal changedgame jr z,changegame @@ -933,13 +1034,13 @@ changedgame: jr nc,changedgameok xor a ;9 -> 0 changedgameok: - ld (Gametype),a + ld (gametype),a cal getnrlevels xor a cp (hl) ret bchangegame: - ld a,(Gametype) + ld a,(gametype) dec a cal changedgame jr z,bchangegame @@ -965,7 +1066,7 @@ bchangelevel: jr _mainMenu getnrlevels: ;for current gametype at hl - ld hl,Gametype + ld hl,gametype ld d,0 ld e,(hl) ld hl,nrlevels @@ -990,28 +1091,19 @@ waitcustomkey: changekeys: cal getwormname - ld hl,txtKeyleft + ld hl,txtKleft cal getcustomkey ;left cal getcustomkey ;right ; jr dispmenusets -;---display current settings--- +;--- display current settings --- dispmenusets: - cal clrold ld de,$183E ld (_penCol),de - ld d,0 - ld a,(Gametype) - ld e,a - ld hl,posGame - add hl,de ;hl=posGame+(Gametype) - ld a,(hl) ;str.offset - ld e,a ;^d=0^ - ld hl,txtGame - add hl,de ;txtGameX - ld (CURtxtGame),hl ;save for g/o - cal _vputs ;Singleplayer + cal clrold + cal loadtxtgame + cal _vputs ;Singleplayer or smtn ld hl,$2A3E ;worms ld (_penCol),hl @@ -1019,12 +1111,19 @@ dispmenusets: psh hl inc hl ld a,(hl) + dec a ;0-5 + and 3 ;0-3 + inc a ;1-4 add a,'0' cal _vputmap + ld a,(hl) + cp 5 + ld hl,txtteamed + cal nc,_vputs ld hl,$243E ld (_penCol),hl - rr c ;(gameCar) + rr c ;(gamecar) ld hl,txtNo jr nc,displink ld hl,txtYes @@ -1037,11 +1136,11 @@ displink: psh bc ld d,0 cal hlatlevel - ld a,(Gametype) + ld a,(gametype) or a ;gamesingle jr nz,displvlname ld a,(Level) - cal cshowA0 + cal cshowA00 jr lvldisped displvlname: cal _vputs @@ -1132,16 +1231,16 @@ menunewok: getwormname: ;of (curworm) ld a,(curworm) - add a,a ;2x ld e,a + add a,a ;2x add a,a ;4x add a,a ;8x add a,a ;16x - add a,e ;18x + sub e ;15x ld e,a ld d,0 ;de=a - ld ix,worm1name-18 + ld ix,worm1name-15 add ix,de ret @@ -1155,7 +1254,7 @@ emptyname: ld (hl),' ' inc hl dnz emptyname - ld a,maxnamelength + ld a,maxnamesize ld (namelength),a enternameloop: ld hl,$FF07 ;begin pos @@ -1180,7 +1279,7 @@ nokeypressed: jr nz,continue backspace: ld a,(hl) - cp maxnamelength + cp maxnamesize jr nc,nokeypressed inc (hl) dec ix @@ -1205,30 +1304,34 @@ continue: cal releasekeys jr enternameloop +savestr: + .db "00000" ;,0 ;&&&somehow put in chartable's 5-byte hole chartable: - .db 0,".<>!",0,0,0,0 ;down,L,R,up - .db 0,"XTOJE0",0 ;enter..clear - .db " WSNID9",0 ;(-)..custom - .db "ZVRMHC8",0 ;dot..del - .db "YUQLGB7#" ;0..xvar - .db $D9,"-PKFA6'" ;on..alpha - .db "54321*",0,$D0 ;F5..more + .db 0,".<>!",0,0,0,0 ;down|L|R|up|-|-|-|- + .db -1,"XTOJE0",0 ;enter|+|-|*|/|^|clear|- + .db " WSNID9",0 ;(-)|3|6|9|)|tan|custom|- + .db "ZVRMHC8",-1 ;.|2|5|8|(|cos|prgm|del + .db "YUQLGB7#" ;0|1|4|7|ee|sin|table|xvar + .db $D9,"-PKFA6'" ;on|sto|,|x2|ln|log|graph|alpha + .db "54321*",-1,$D0 ;F5|F4|F3|F2|F1|2nd|exit|more nameentered: pop ix ;stringbegin ld (ix+8),0 ;end mark jp DisplayMenu -;----------------------------- -;------- procs-n-stuff ------- -;----------------------------- +;_______________________________________________________________________________ +; _______ _____ _______ _______ _____ ______ _____ _______ _______ +; | | | | |______ | |_____] |_____/ | | | |______ +; | | | __|__ ______| |_____ _____ | | \_ |_____| |_____ ______| +;_______________________________________________________________________________ ubergetkey: halt ;woo hoo halt ;save them batteries! yeah! jp GET_KEY -clrold: +clrold: ;destr:acdehl (acd=0) ld hl,$FD97 ;begin pos ld a,35 ;nr of lines clroldcustom: @@ -1247,22 +1350,21 @@ clroldsetsloop: 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,28+1 ;go to datalevels + ld a,(gametype) + add a,a ld e,a ;=de - sbc hl,de ;datalevels + ld hl,datalevels + add hl,de ;+2*mode cal _ldHLind ;ld hl,(hl) - pop de ;de=loadgamecar - inc de \ inc de - ld a,(de) ;(curlevel) + ex (sp),hl ;hl=loadgamecar + ld e,2 ;=de + add hl,de + ld a,(hl) ;(curlevel) ld (Level),a - ld d,a ;begin level + ld c,a ;begin level + pop hl ;@level1 skiplevelloop: - dec d ;levels to skip + dec c ;levels to skip ret z cal skiplevel jr skiplevelloop @@ -1275,15 +1377,13 @@ skiplvltitle: ;zf=singleplayer jr nz,skiplvltitle ret -skiplevel: ;@hl - destr:ab - alter:hl - ld a,(Gametype) +skiplevel: ;@hl; de=2 - destr:ab - alter:hl + ld a,(gametype) or a ;gamesingle psh af cal nz,skiplvltitle - inc hl - inc hl - inc hl - inc hl ;skip 4 + add hl,de + add hl,de ;skip 4 ld b,(hl) ;spritesize inc b skipsprite: @@ -1292,52 +1392,39 @@ skipsprite: ld b,(hl) ;balls inc b inc b ;skip 6 - pop af ;cp (Gametype),0 - jr z,skipworms + pop af ;cp (gametype),0 + jr z,skipstuff inc b ;multiplayer lvl inc b inc b ;skip other 3 worms (9 bytes) -skipworms: - ld a,b - add a,a - add a,b - ld b,a ;3x(balls+2) -skipballs: - inc hl - dnz skipballs - -skipflags: - ld a,(Gametype) - cp gamerace +skipstuff: + add hl,de + inc hl ;3x(balls+2) + dnz skipstuff + sub gamerace ;a=(gametype) jr z,skiplaps - cp gamectf - jr nz,noflagstoskip - inc hl - inc hl + dec a ;gamectf + jr nz,skipobjects + add hl,de skiplaps: - inc hl - inc hl -noflagstoskip: - + add hl,de skipobjects: xor a or (hl) inc hl ;nf ret z ;0=end - inc hl - inc hl - inc hl - inc hl + add hl,de + add hl,de jr skipobjects loadgamecar: -;in: (Gametype) +;in: (gametype) ;out: hl=dataTYPE -;build: c=(gameCar)=(hl-1) +;build: c=(gamecar)=(hl-1) ; a=(wormbeglives)=(hl) ;destr: acdehl ld hl,datasingle - ld a,(Gametype) + ld a,(gametype) add a,a add a,a add a,a ;8 bytes per mode @@ -1345,16 +1432,18 @@ loadgamecar: ld d,0 add hl,de ld a,(hl) - ld (gameCar),a + ld (gamecar),a ld c,a inc hl ld a,(hl) ld (wormbeglives),a ret -;----------------------------- -;-------- start game --------- -;----------------------------- +;_______________________________________________________________________________ +; _______ _______ _______ ______ _______ ______ _______ _______ _______ +; |______ | |_____| |_____/ | | ____ |_____| | | | |______ +; ______| | | | | \_ | _____ |_____| | | | | | |______ +;_______________________________________________________________________________ LetsGetThisPartyOn: ld a,$17 ;no exit @@ -1369,35 +1458,38 @@ createwormsloop: ld bc,died ;0008 add hl,bc ; ld b,0 - ld (hl),b ;died=0 + ld (hl),b ;+died=0 inc hl - ld (hl),b ;score=0 + ld (hl),b ;+score=0 inc hl - ld (hl),b ;score+1=0 + ld (hl),b ;+score+1=0 inc hl - ld (hl),2 ;delay=2 + ld c,2 + ld (hl),c ;+delay=2 inc hl - ld (hl),3 ;lives=x + ld (hl),3 ;+lives=x wormbeglives =$-1 inc hl ex de,hl ;de=wormX+head - ld bc,18 - ldir ;copy 18 bytes + ldir ;+head=+tail (2) + dec hl + dec hl + ld c,wormsize-tail ;=bc + ldir ;copy 15 bytes dec a ;loop jr nz,createwormsloop -OhMyGodItsALabel: ;pj34r my coding skillz +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 + ld a,(gamecar) rra ;and _datalink jr nc,_StartLevel -;--------- link ------------ +;--- link --- wormVhost = 095 wormVclient = 195 @@ -1406,129 +1498,134 @@ linkmatch: cal _clrWindow ld c,wormVhost cal Qsend - ld hl,txtWaiting + ld hl,txtWaitn cal _puts cal Crecv ld a,c cp wormVclient - jr z,client - cp wormVhost - jr z,host - pop hl ;error - jp DisplayMenu ;return to menu + jr nz,host + +;--- client --- -host: - ld c,wormVclient - cal Qsend - jr sethost client: - ld hl,txtReceive - cal _puts -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 +; ld hl,txtReceiv +; cal _puts ;shouldnt be necessary since this part always seems to work afaik + + ;name/keys: wormy#1 = worm #1 = ok + ; 2 = link = 0 + link (name1) + ; 3 = worm #2 = #2 + local(name2) + ; 4 = link = 0 + link (name2) + ld e,worm3+left&255 + cal moveworm2 ;3=2 + ld l,worm1+name&255 + cal sendworm + ld l,worm2+left&255 + cal linkworm ;worm2+4 over link pop hl ;loadgamecar pop de ;leveldata + ld de,linklevel + ld hl,datalink 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 + cal recvstuff ;game setup + ld hl,gametype ;+gamecar + ld b,2 + cal recvstuff ;transmit game ex de,hl ld b,168 - cal sendstuff + cal recvstuff ;level + ld d,b + cal loadtxtgame ;set CURtxtGame + _StartLevel: jr StartLevel -sendstuff: - psh de -sendstuffloop: - psh bc - ld c,(hl) - inc hl - cal Qsend - pop bc - dnz sendstuffloop - pop de + +linkerror: + pop hl ;error + jp DisplayMenu ;return to menu + +;--- set/send worms --- + +moveworm2: + ld hl,worm2+left +moveworm: ;hl=wormN+left + ld d,worm1/256 + ld bc,11 + ldir ;keys+name worm(de) = worm(hl) ret -recvstuff: - psh de -recvstuffloop: - psh bc - cal Qrecv - ld (hl),c +linkworm: ;hl=wormN+left + ld (hl),0 ;worm1|2+left inc hl - 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 + inc hl ;+name + ld b,9 + cal recvstuff + ld bc,worm3-worm1-11 ;+2 + add hl,bc ;b=0 + ld (hl),b ;worm3|4+left + inc hl + inc hl ;+name + ld b,9 + jp recvstuff +sendworm: ;hl=wormN+name ld b,9 cal sendstuff - ld hl,worm2+name + ld bc,worm3-worm1-9 + add hl,bc ;worm(N+2)+name ld b,9 - cal recvstuff + jp sendstuff + +;--- host --- + +host: + cp wormVhost + jr nz,linkerror + ld c,wormVclient + cal Qsend + + ;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 e,worm4+left&255 + cal moveworm2 ;4=2 + ld e,worm2+left&255 + ld hl,worm1+left + cal moveworm ;2=1 + ld l,worm1+left&255 + cal linkworm ;worm1+3 over link + ld l,worm2+name&255 + cal sendworm pop hl ;loadgamecar pop de ;leveldata - ld hl,templevels ;&&&&&&& - ld de,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 + cal sendstuff ;setup + ld hl,gametype ;+gamecar + ld b,2 + cal sendstuff ;game ex de,hl ld b,168 - cal recvstuff + cal sendstuff ;level -;-------- load level --------- +;--- load level --- StartLevel: pop hl ;loadgamecar ld a,(hl) ld (wormbeglives),a inc hl ;nrworms + ld b,$11 ;=ignore (ld) ld a,(hl) + cp 5 + jr c,teamset + sub 2 + ld b,$CD ;=continue (call) +teamset: ld (nrworms),a + ld a,b + ld (doteam),a ;do team score (CD) or not (11) inc hl ;level inc hl ld a,(hl) @@ -1536,6 +1633,7 @@ StartLevel: inc hl ld a,(hl) ld (growspeed),a + ld (turn),a inc hl ld a,(hl) ld (turnleft),a @@ -1543,9 +1641,9 @@ StartLevel: inc hl ld l,(hl) ld h,0 - ld a,(gameCar) + ld a,(gamecar) rla - ld a,0 ;(Left)=256 + ld a,h ;(Left)=256 jr nc,setscorelimit ld a,l ld l,h @@ -1572,7 +1670,8 @@ Nextlevel: inc hl ;location of ending-code jp (hl) ;go there ("call") donextlevel: - ld a,(Gametype) + ld bc,gametype + ld a,(bc) or a ;gamesingle psh af cal nz,skiplvltitle @@ -1587,7 +1686,7 @@ setleft: ld (lefttotal),a dec a xor (hl) ;bit (hl),7 - ld bc,gameCar + inc bc ;gamecar ld a,(bc) jr z,leftloaded or 128+32 @@ -1609,7 +1708,7 @@ setspeed: 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 @@ -1627,10 +1726,14 @@ setspeed: add hl,bc ;hl=behind sprite jr setsprite defaultsprite: - ld a,defspritesz +#ifndef intlevels + ld a,42 ;always overwritten +#else + ld a,defsprsz +#endif defsprsize =$-1 defsprite =$+1 - ld de,defspriteimg + ld de,defspr setsprite: ;de=@sprite ;a=sprsize ld (sprsize),a ld (spritepos),de @@ -1655,7 +1758,7 @@ toobad_noballs: #endif ld hl,worm1 - pop af ;cp (Gametype),0 + pop af ;cp (gametype),0 ld b,1 jr z,worminit ld b,4 @@ -1687,7 +1790,7 @@ worminit: inc a ;ld a,2 ld (flashtime),a -;-------- draw level --------- +;--- draw level --- initlevel: ld a,(de) @@ -1769,7 +1872,7 @@ NoVertShift: pop hl ; << levelp - ld a,(Gametype) + ld a,(gametype) cp gamerace ;or gamectf jr c,levelhasbeensetup ld de,peaspos @@ -1785,7 +1888,7 @@ levelhasbeensetup: cal drawstuff -;--------- prepare ----------- +;--- prepare --- leveldone: psh hl ; >> levelp new @@ -1823,15 +1926,12 @@ maskline: res 3,(iy+5) #endif - ld a,(gameCar) - bit _bitfood,a - jr nz,nofood -; ld ix,worm1 - cal NewPea - xor a + ld a,(gamecar) + rla ;bit __bitPmult,a + cal c,multnewpea ;a=0 + rla ;bit __bitfood,a + cal nc,NewPea nofood: - rla ;bit _bitmultpeas,a - cal c,multnewpea ld bc,(worm1+pos) cal DisplayField @@ -1841,9 +1941,11 @@ ReadyDelay: dnz ReadyDelay cal releasekeys -;----------------------------- -;----------- LOOP ------------ -;----------------------------- +;_______________________________________________________________________________ +; ______ _______ _______ _______ _____ _____ _____ +; | ____ |_____| | | | |______ | | | | | |_____] +; |_____| | | | | | |______ _____ |_____ |_____| |_____| | +;_______________________________________________________________________________ GameLoop: ld bc,(worm1+pos) ;camera worm #1 @@ -1887,13 +1989,13 @@ NoDelay: inc a ;-1 jr z,nextturnok dec (hl) - dec a ;0 (now <0) + dec a ;>=0 jr nz,nextturnok growspeed =$+1 - ld (hl),$FF + ld (hl),$FF ;reset nextturnok: - ld a,(gameCar) + ld a,(gamecar) and _datatime jr z,nodispupdate ld hl,turn10 @@ -1903,7 +2005,7 @@ nextturnok: cal forceshowstats ;update score nodispupdate: - ld a,(Gametype) + ld a,(gametype) cp gamectf jr nz,noctfpeas2draw ld de,drawctfpea1 @@ -1934,9 +2036,11 @@ handleworms: inc (hl) ;0..nrworms-1 dnz handleworms -;----------------------------- -;---------- keys ------------- -;----------------------------- +;_______________________________________________________________________________ +; _ _ _______ __ __ _______ +; |____/ |______ \_/ |______ +; | \_ |______ | ______| +;_______________________________________________________________________________ HandleKeys: ld a,%10111111 @@ -1950,7 +2054,7 @@ CheckExit: jp c,GameLoop jp Exit ;jr? -;------- pause menu ------- +;--- pause menu --- disppausemenu: ld hl,txtpMenu @@ -2031,6 +2135,12 @@ donepausing: cal releasekeys jp GameLoop +;_______________________________________________________________________________ +; ______ _______ _______ _______ _____ _ _ _______ ______ +; | ____ |_____| | | | |______ | | \ / |______ |_____/ +; |_____| | | | | | |______ _____ |_____| \/ |______ | \_ +;_______________________________________________________________________________ + Exit: cal releasekeys ld sp,0 ;pop all @@ -2046,9 +2156,9 @@ SpSave = $-2 ld hl,$FC10 ld b,16*11 cal menuinvloop ;invert - ld hl,$FD80 + ld hl,$FC00+$180 cal hr ;menuinvloop w/ b=16 - ld hl,$FCE0 + ld hl,$FC00+$E0 cal hr ld hl,_curRow ld (hl),2 @@ -2058,9 +2168,9 @@ SpSave = $-2 ld hl,$FC00 ld b,16*8 cal menuinvloop ;invert - inc h ;$FD80 + inc h ;$FC00+$180 cal hr ;menuinvloop w/ b=16 - ld hl,$FCE0 + ld hl,$FC00+$E0 cal hr ld hl,_curRow inc (hl) @@ -2076,12 +2186,14 @@ CURtxtGame =$-2 ld (_penCol),de ld hl,txtName cal _vputs ;Name - ld a,$3D + ld a,$3C ld (_penCol),a cal _vputs ;Died Score ld de,$0004 ld (_curRow),de +;--- who won? --- + findwinner: ld hl,(worm1+score) ld (winnerscore),hl @@ -2120,7 +2232,17 @@ nonewdmwinner: dnz finddmwinner ld (dmwinner),a -;---display worms--- +;--- display worms --- + +;x123456789012345678901 +;>>>>>> GAME OVER <<<<< +;2Multiplayer +;3Level 01 +;4 Died Score: +;5NameName 03 00070 +;6Worm#02 @ 05 00120 +;7Worm#03 15 00030 +;8Snaky @ 00 04820 ld a,(nrworms) ld b,a @@ -2132,7 +2254,7 @@ displayWormStats: ld bc,left-died add hl,bc ;+left xor a - cp (hl) ;input=0 = link + cp (hl) ;left=0 = link jr nz,NoLinkIndic ld a,9 ld (_curCol),a @@ -2154,7 +2276,7 @@ NoLinkIndic: pop hl psh hl - ld a,(Gametype) + ld a,(gametype) cp gamedeathm jr nz,nodmwinner ;deathmatch? ld a,0 ;winner's deaths @@ -2177,7 +2299,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 @@ -2185,7 +2308,8 @@ notwinner: pop bc dnz displayWormStats - ld a,(Gametype) + ld de,gametype + ld a,(de) or a ;singleplayer (0) only jr nz,hilevelcheckdone checkhilevel: @@ -2202,7 +2326,8 @@ hilvlposhl =$-2 ;save external cal _writeb_inc_ahl ;ld (ahl),c hilevelcheckdone: - ld a,(gameCar) + inc de + ld a,(de) ;gamecar and _datasingl jr z,hiscorecheckdone ;no SP checkhiscore: @@ -2248,54 +2373,26 @@ NotNewHigh: ld hl,highsave+2 cal _puts ld hl,(highsave) - cal showHL + cal _D_HL_DECI + cal _puts ;showHL hiscorecheckdone: waitkey: + ld hl,DisplayMenu + psh hl ;main menu +waitkeyloop: cal ubergetkey cp K_ENTER - jp z,DisplayMenu + ret z cp K_SECOND - jp z,DisplayMenu + ret z cp K_EXIT - jr nz,waitkey - -;x123456789012345678901 -;>>>>>> GAME OVER <<<<< -;2Multiplayer -;3Level 01 -;4 Died Score: -;5NameName 03 00070 -;6Worm#02 @ 05 00120 -;7Worm#03 15 00030 -;8Snaky @ 00 04820 - -ExitNoStats: - cal linkok - ld hl,_asapvar - rst 20h ;_ABS_MOV10TOOP1 - rst 10h ;_FINDSYM - ld hl,savestart-_asm_exec_ram+4 - xor a - add hl,de - adc a,b ;ahl=bde+4 - cal _SET_ABS_DEST_ADDR - - xor a - ld hl,savestart - cal _SET_ABS_SRC_ADDR - ld hl,saveend-savestart - cal _MM_LDIR_SET_SIZE - - cal releasekeys - res 4,(iy+9) - set 2,(iy+13) - im 1 ;remove keyfix - jp _clrWindow + jr nz,waitkeyloop + ret loadhiscoreposinahl: ld hl,0 ;for peaworm and singleplayer - ld a,(Gametype) + ld a,(gametype) or a ;Singleplayer? jr z,hi__ dec a ;peaworm? @@ -2318,7 +2415,7 @@ hiscrposa =$+1 adc a,0 ;ahl=saveloc ret highsave: - .db 0,0,"WOR ",0 + .db 0,0,"SHI ",0 iswinner: ld a,10 @@ -2326,37 +2423,64 @@ iswinner: ld a,'*' jp _putc ;..then put * -;----------------------------- -;----------- worm ------------ -;----------------------------- +;--- quit --- -respawncheck: - cp respawndelay-1 - jr nz,unnamedlabel - cal saverespawncounter -removeworm: - ld h,(ix+tail+1) ;& - ld l,(ix+tail) - ld d,(ix+head+1) - ld e,(ix+head) - jr DoesWormTailEqualsWormHead ;chk4 size=0 -removewormloop: - ld c,(hl) - inc hl - ld b,(hl) - inc hl - cal resbit - psh hl - cal res4pixels - pop hl - inc (ix+grow) - jr nz,DoesWormTailEqualsWormHead +ExitNoStats: + cal linkok + ld hl,_asapvar + rst 20h ;_ABS_MOV10TOOP1 + rst 10h ;_FINDSYM + ld hl,savestart-_asm_exec_ram+4 + xor a + add hl,de + adc a,b ;ahl=bde+4 + cal _SET_ABS_DEST_ADDR + + xor a + ld hl,savestart + cal _SET_ABS_SRC_ADDR + ld hl,saveend-savestart + cal _MM_LDIR_SET_SIZE + + cal releasekeys + res 4,(iy+9) + set 2,(iy+13) + im 1 ;remove keyfix + jp _clrWindow + +;_______________________________________________________________________________ +; _ _ _ _____ ______ _______ _______ _______ _ _ _______ _______ +; | | | | | |_____/ | | | |______ | | | |______ |______ +; |__|__| |_____| | \_ | | | _____ ______| | |_____| | | +;_______________________________________________________________________________ + +respawncheck: + cp rspawndelay-1 + jr nz,unnamedlabel + cal saverespawncounter +removeworm: + ld h,(ix+tail+1) ;& + ld l,(ix+tail) + ld d,(ix+head+1) + ld e,(ix+head) + jr DoesWormTailEqualsWormHead ;chk4 size=0 +removewormloop: + ld c,(hl) + inc hl + ld b,(hl) + inc hl + cal resbit + psh hl + cal res4pixels + pop hl + inc (ix+grow) + jr nz,DoesWormTailEqualsWormHead inc (ix+grow+1) ;+256 DoesWormTailEqualsWormHead: cal _cphlde jr nz,removewormloop - ld a,(gameCar) + ld a,(gamecar) and _datasingl jr nz,safewormsizedone ld a,0 @@ -2431,7 +2555,7 @@ inputcall: or a jr z,inlink ;input by link cal inkeys ;input by keys - ld a,(gameCar) + ld a,(gamecar) rra ;and _datalink ret nc ;no link ld c,l ;send our keys @@ -2441,9 +2565,11 @@ inlink: ld l,c ret -;----------------------------- -;------- handle worm --------- -;----------------------------- +;_______________________________________________________________________________ +; _ _ _ _____ ______ _______ _______ _____ _ _ _______ +; | | | | | |_____/ | | | |_____| | | \ / |______ +; |__|__| |_____| | \_ | | | _____ | | |_____ __|__ \/ |______ +;_______________________________________________________________________________ HandleWorm: xor a @@ -2464,7 +2590,7 @@ turn =$-1 inc (ix+grow) nogrow: - ld a,(gameCar) + ld a,(gamecar) and _datatime jr z,notimescore ld e,1 @@ -2496,10 +2622,10 @@ donediddelydone: pop hl #endif -;-------- move worm ---------- +;--- move worm --- Wormmove: - psh bc ; >> pos + psh bc ;pos ld a,(hl) add a,a add a,d @@ -2525,13 +2651,13 @@ notnegY: jr nc,notmoveY inc c notmoveY: ;bc=newpos - ld (ix+pos2),e - ld (ix+pos2+1),d ld (ix+pos),c ld (ix+pos+1),b + ld (ix+pos2),e + ld (ix+pos2+1),d ;-check- - pop hl ; << pos (old) + pop hl ;pos (old) ld a,h sub b and 1 @@ -2547,32 +2673,197 @@ notmoveY: ;bc=newpos GotFour: cal chk4pixels rl d - jp nc,Drawworm + cal c,hitworm -;--------- worm hit ---------- +;--- draw worm --- -Hitworm: - ld a,(gameCar) - ld h,a +Drawworm: + ld c,(ix+pos) + ld b,(ix+pos+1) + + ld a,(gametype) + cp gamerace + cal z,checkhitlapline + + cal set4pixels + dec c + ld a,(growspeed) + or a ;0=tron + ret z ;keep tail in "Tron" + + ld l,(ix+head) + ld h,(ix+head+1) + ld (hl),c + inc hl + ld (hl),b + inc hl + cal resbit + ld (ix+head),l + ld (ix+head+1),h + + ld l,(ix+grow) + ld h,(ix+grow+1) + dec hl + ld a,h + or l + jr z,removetail + ld (ix+grow),l + ld (ix+grow+1),h + ret + +removetail: + ld l,(ix+tail) + ld h,(ix+tail+1) + ld c,(hl) + inc hl + ld b,(hl) + inc hl + cal resbit + ld (ix+tail),l + ld (ix+tail+1),h + psh hl + cal res4pixels + pop hl + ld c,(hl) + inc hl + ld b,(hl) + jr set4pixels + +res4pixels: + cal ResPixel + inc b + cal ResPixel + inc c + cal ResPixel + dec b +ResPixel: + cal FindPixel + cpl + and (hl) + ld (hl),a + ret + +;_______________________________________________________________________________ +; ______ _____ _ _ __ _ _______ __ __ ______ _______ +; |_____] | | | | | \ | | \_/ |_____] |_____| | | +; |_____] |_____| |_____| | \_| |_____ | |_____] | | |_____ |_____ +;_______________________________________________________________________________ + +handlethoseneatlittleballs: + ld hl,balls + ld b,a ;a=(nrballs) +handleballs + psh bc + psh hl + ld c,(hl) + inc hl + ld b,(hl) + inc hl + ld d,(hl) + cal handleball + dec c + pop hl + ld (hl),c + inc hl + ld (hl),b + inc hl + ld (hl),d + inc hl + pop bc + dnz handleballs + ret + +handleball: + cal res4pixels + dec c + +ballxmove: + bit 0,d ;1=L; 0=R + jr z,ballright +ballleft: + dec b + cal checkballhit + jr z,ballymove + inc b ;undo + res 0,d ;go right + jr ballymove +ballright: + inc b + cal checkballhit + jr z,ballymove + dec b ;back + set 0,d ;>left + +ballymove: + bit 1,d ;1=up; 0=down + jr z,balldown +ballup: + dec c + cal checkballhit + jr z,balldone + inc c + res 1,d ;go down + jr balldone +balldown: + inc c + cal checkballhit + jr z,balldone + dec c + set 1,d ;up +balldone: + +set4pixels: ;@(b,c) + cal SetPixel + inc b + cal SetPixel + inc c + cal SetPixel + dec b +SetPixel: ;at bc + cal FindPixel + or (hl) + ld (hl),a + ret + +letsmovetheotherway: + ld a,1 + xor (hl) + ld (hl),a + ret + +checkballhit: + psh de + ld d,0 + cal chk4pixels + xor a + cp d + pop de + ret + +;_______________________________________________________________________________ +; _ _ _ _____ ______ _______ __ __ _ _ _____ _______ +; | | | | | |_____/ | | | \_/ |_____| | | +; |__|__| |_____| | \_ | | | | _____ | | __|__ | +;_______________________________________________________________________________ + +hitworm: #ifdef optdie ; if race - originally cal checkhitotherworm - ld a,h #endif - and _datactfpeas ;&&bit + ld a,(gamecar) + bit __bitPctf,a jr nz,chkctfpeas - ld a,h - and _datamultpeas ;&&bit - jp nz,chkmultpeas - ld a,h - and _datafood - jp nz,WormDead ;no food + rla ;and _dataPmult + jp c,chkmultpeas + rla ;and _datafood + jp c,wormdead ;no food ld hl,0 PeaY =$-2 PeaX =$-1 cal chkpeahit - jp nc,WormDead + jp nc,wormdead pickpea: cal DrawPea ;remove pea cal NewPea @@ -2591,10 +2882,7 @@ wormset2grow: cal IncScore pop af jp nz,Drawworm ;continue -; ld a,(gameCar) ;(Left)>256 -; and _datafoodl -; jp z,Drawworm - ld a,(Gametype) + ld a,(gametype) or a jp nz,Exit ;stack restored @@ -2609,8 +2897,9 @@ wormset2grow: ex de,hl cal _IncScore ;score+(40*level) cal removeworm - pop hl ; << call - pop hl ; << call + pop hl ;<<$some call + pop hl ;<yline -> a=1 - xor a ;y a=0 -checklap: - cp (ix+reserv) - 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 e,20 - cal IncScore ;lap! - pop bc - ret - -;-------- draw worm ---------- - -Drawworm: - ld c,(ix+pos) - ld b,(ix+pos+1) - - ld a,(Gametype) - cp gamerace - cal z,checkhitlapline - - cal set4pixels - dec c - ld a,(growspeed) - or a ;0=tron - ret z ;keep tail in "Tron" - - ld l,(ix+head) - ld h,(ix+head+1) - ld (hl),c - inc hl - ld (hl),b - inc hl - cal resbit - ld (ix+head),l - ld (ix+head+1),h - - ld l,(ix+grow) - ld h,(ix+grow+1) - dec hl - ld a,h - or l - jr z,removetail - ld (ix+grow),l - ld (ix+grow+1),h - ret - -removetail: - ld l,(ix+tail) - ld h,(ix+tail+1) - ld c,(hl) - inc hl - ld b,(hl) - inc hl - cal resbit - ld (ix+tail),l - ld (ix+tail+1),h - psh hl - cal res4pixels - pop hl - ld c,(hl) - inc hl - ld b,(hl) - jr set4pixels - -res4pixels: - cal ResPixel - inc b - cal ResPixel - inc c - cal ResPixel - dec b -ResPixel: - cal FindPixel - cpl - and (hl) - ld (hl),a - ret - -;----------------------------- -;---------- ball ------------- -;----------------------------- - -handlethoseneatlittleballs: - ld hl,balls - ld b,a ;a=(nrballs) -handleballs - psh bc - psh hl - ld c,(hl) - inc hl - ld b,(hl) - inc hl - ld d,(hl) - cal handleball - dec c - pop hl - ld (hl),c - inc hl - ld (hl),b - inc hl - ld (hl),d - inc hl - pop bc - dnz handleballs - ret - -handleball: - cal res4pixels - dec c - -ballxmove: - bit 0,d ;1=L; 0=R - jr z,ballright -ballleft: - dec b - cal checkballhit - jr z,ballymove - inc b ;undo - res 0,d ;go right - jr ballymove -ballright: - inc b - cal checkballhit - jr z,ballymove - dec b ;back - set 0,d ;>left + ld (de),a + cal DrawPea + jp pickpea_ -ballymove: - bit 1,d ;1=up; 0=down - jr z,balldown -ballup: - dec c - cal checkballhit - jr z,balldone - inc c - res 1,d ;go down - jr balldone -balldown: - inc c - cal checkballhit - jr z,balldone - dec c - set 1,d ;up -balldone: +;--- misc --- -set4pixels: ;@(b,c) - cal SetPixel - inc b - cal SetPixel - inc c - cal SetPixel - dec b -SetPixel: ;at bc - cal FindPixel - or (hl) - ld (hl),a - ret +#ifdef optdie +nextotherwormbit: + ld a,c + sub (hl) + inc hl + inc a + cp 4 + jr nc,nothit1 ;no + ld a,b + sub (hl) + inc a + cp 4 + ret c ;nz ;yes +nothit1: + inc hl + cal resbit +ChkWorm: + cal _cphlde + jr nz,nextotherwormbit + ret ;z +#endif -letsmovetheotherway: +checkhitlapline: + ld a,(peaspos) ;63 + sub b ;x==63 + jr z,nextlaphalf + inc a + ret nz +nextlaphalf: + ld a,(peaspos+1) ;yline + cp c ;ypos ld a,1 - xor (hl) - ld (hl),a - ret - -checkballhit: - psh de - ld d,0 - cal chk4pixels - xor a - cp d - pop de + jr nc,checklap ;y>yline -> a=1 + xor a ;y a=0 +checklap: + cp (ix+reserv) + 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 e,20 + cal IncScore ;lap! + pop bc ret -;----------------------------- -;----------- procs ----------- -;----------------------------- +;_______________________________________________________________________________ +; _____ ______ _____ _______ _______ +; |_____] |_____/ | | | |______ +; | | \_ |_____| |_____ ______| +;_______________________________________________________________________________ releasekeys: halt @@ -2949,13 +3079,15 @@ Seed =$+1 add a,2 ret +wormdead: + pop hl ;<