X-Git-Url: http://git.shiar.nl/wormy.git/blobdiff_plain/26fb52490a2e38fde7ebf17e201773c254ba9929..7337dc93183d156ff1a6e1c771bf58b40fd9044a:/wormy.z80 diff --git a/wormy.z80 b/wormy.z80 index 22fc918..ad95960 100644 --- a/wormy.z80 +++ b/wormy.z80 @@ -1,5 +1,5 @@ ; Title : Wormy -; Version : 96% (0.96.C14) +; Version : 96% (0.96.C24) ; Release Date : UUHHhhh... soon?!? ; Filename : wormy.86p (5kb) ; Author(s) : Shiar @@ -17,23 +17,17 @@ ; 96% = DONE -; [* internal levels ] -; [ * check levels/gametype ] -; [ * enough hiscore saves! ] -; [* complete readme ] -; 1% * misc (pollish, bugs, &&&) -; 1% * long length save (level#6) -; * mem at worm #4 +; 1% * misc (bugs, &&&, pollish, &&, &) +; * mem at worm #4 (still 12 bytes or so.. or more? or less?) +; * look at init-z in line routine again ; * LINK -; 1% * transmit game/level data -; Xfirst packet loss?? or vti onlyXXXXX -; X1/3 worms over linkXXXX -; Xsend new peas' positionsXXXXX +; 1% * fix transmit game/level data (?) +; * >Somehow do a lot of testing with 2 calcs< *sigh* ;100% = bugs fixed + levels done -; MAYBE: sound -; NO: coop +;>110%: sound, startpos (?) +;>120%: coop (DON'T COUNT ON IT) ;----------------------------- ;----------------------------- @@ -41,10 +35,22 @@ ;----------------------------- ;----------------------------- +;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 +;#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 @@ -55,7 +61,6 @@ #include "asm86.h" #include "ti86asm.inc" - _SHRACC = $4383 ;4x srl a _SHLACC = $438B ;4x sll a _divHLby10 = $4044 ;hl=hl/10 @@ -102,20 +107,20 @@ worm3 = $AC3E ;-AC59 (1F) worm4 = $AC5D ;-AC77 (1F) balls = $AC7C ;-ACFF (3x43d) SinCosTable = $AD00 ;-AE00 (4*40) - ;free $AE01 ;-AFFF (1FF) +turn10 = $AE01 ;-AE01 (1) (counter) +peaspos = $AE02 ;-AE05 (4) (peas) +;free = $AE06 ;-AFFF (1FA) worm1p = $B000 ;-B7FF (800) %1011O000 worm3p = $B800 ;-BBFF (400) %10111O00 - ;free $BF91 ;-BFFF (6F) - ;program $D748 ;-EFFF (186D+4A) +;free = $BF91 ;-BFFF (6F) +;program = $D748 ;-EFFF (186D+4A) worm4p = $F000 ;-F3FF (400) %11110O00 leveldata = $F400 ;-FA70 (<=671) + ;can you believe i actually left $269 bytes of memory unused?!? -turn10 = $AE01 ; (1) (counter) -peaspos = $AE02 ;-AE05 (4) (peas) - -;MEM|8---9---A---B---C---D---E---F---| -; |..[------]||[]|......[-----]|[].| -; | SCREEN 2* 13 PRGM 4LV | +;MEM|8---9---A---B---C---D---E---F---| ;there's something wrong +; |..[------]||[]|......[-----]|[].| ;if you still understand +; | SCREEN 2* 13 PRGM 4LV | ;after looking at this ;--- temporary @@ -131,21 +136,30 @@ DispBuffer = $FC70 ;------- program start ------- ;----------------------------- -.org _asm_exec_ram + .org %1101011101001000 -wormVhost = 095 -wormVclient = 195 - -start: - nop +start: ;turn back NOW! + nop ;and so it begins... jp Start - .db 1 - nop + ld bc,42 + .org $-1 ;3y3 M 1337! .dw WormTxt .dw WormIcon - WormTxt: - .db "WORMY by SHIAR -- 96% C14",0 + 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 " 96% C24",0 WormIcon: .db 8,2 .db %00000000,%00111100 @@ -193,7 +207,7 @@ Start: ldir inc a ;ld a,$D4 ld i,a - im 2 + im 2 ;...it *does* work ;) cal _RAM_PAGE_7 ld hl,$BFFF ;VAT start @@ -248,7 +262,7 @@ stringfound: inc ix _searchnext: cal _RAM_PAGE_7 - jr searchnext + jr searchnext loadgametype: psh de @@ -270,9 +284,17 @@ searchcomplete: ld a,255 ld (ix),a ;end mark +#ifdef intlevels ld ix,templevels-6 -levelselectmenu: +#else + ld ix,templevels-3 +#endif + cp (ix+3) ;1st=255 + jp z,ExitNoStats ;->no lvls psh ix ;offset + cp (ix+6) ;2nd=255 + jr z,loadlevel1 ;->1 lvl +levelselectmenu: ;load next page ld a,-2 ld (availevels),a cal _clrWindow @@ -288,7 +310,9 @@ levelselectmenu: ld hl,$0601 ;x=1 ld (_penCol),hl dispnextlevel: - ld a,(ix+3) + ld de,3 + add ix,de + ld a,(ix) ld b,a inc a ;cp 255 jr z,__levselect @@ -301,8 +325,6 @@ displevel: ld (hl),a ;y+6 cp 49 ;bottom of screen jr nc,_levselect - ld de,3 - add ix,de ld hl,availevels inc (hl) ld a,b ;(ix+0) @@ -312,8 +334,13 @@ displevel: cal _vputs jr dispnextlevel +loadlevel1: + pop hl + ld b,-2 + jr loadlevel + readylevelfile: ;selected level at ahl -; ld hl,templevels-3 +; ld hl,templevels-3/0 ld a,b add a,3 ;sellev+3 (#0==-3) ld e,a @@ -375,7 +402,11 @@ 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 @@ -452,11 +483,11 @@ setdeflevels: ;----- build trig tables ----- ;----------------------------- - ld hl,TrigPrecalc - ld de,SinCosTable - psh de - ld bc,65 - ldir + 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: @@ -533,12 +564,9 @@ dispmenuloop: ; ld b,0 ;b=menu# ret -;hr: ;draw horizontal line at hl -; ld b,16 -; jp menuinvloop - -hr: +hr: ;draw horizontal line at hl ld b,16 +; jp menuinvloop ;shorter but not good for pausescreen hrloop: ld (hl),-1 inc hl @@ -1255,10 +1283,13 @@ 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: @@ -1304,8 +1335,35 @@ LetsGetThisPartyOn: ld a,$17 ;no exit ld (CheckExit),a ;set exit state +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 (hl),b ;score=0 + inc hl + ld (hl),b ;score+1=0 + inc hl + ld (hl),2 ;delay=2 + inc hl + ld (hl),3 ;lives=x +wormbeglives =$-1 + inc hl + ex de,hl ;de=wormX+head + ld bc,18 + ldir ;copy 18 bytes + dec a ;loop + jr nz,createwormsloop + +OhMyGodItsALabel: ;pj34r my coding skillz cal loadgamecar - psh hl + psh hl ;datatype cal hlatlevel ex (sp),hl ;pop \ psh leveldata psh hl ;psh loadgamecar @@ -1316,6 +1374,9 @@ gameCar =$-1 ;--------- link ------------ +wormVhost = 095 +wormVclient = 195 + linkmatch: cal _clrWindow ld c,wormVhost @@ -1359,14 +1420,20 @@ setclient: ld hl,worm2+name ld b,9 cal sendstuff - pop hl - pop de + pop hl ;loadgamecar + pop de ;leveldata psh de - psh hl - ld b,168 + 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 b,8 + ld b,168 cal sendstuff jr StartLevel sendstuff: @@ -1409,16 +1476,22 @@ sethost: ld hl,worm2+name ld b,9 cal recvstuff - pop hl - pop de - ld hl,templevels + pop hl ;loadgamecar + pop de ;leveldata + ld hl,templevels ;&&&&&&& ld de,datalink psh de - psh hl - ld b,168 + 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,8 + ld b,168 cal recvstuff ;-------- load level --------- @@ -1447,32 +1520,6 @@ StartLevel: cal _HLTIMES10 ;hl=10*(hl) ld (scorelimit),hl -setupworms: - ld hl,worm1set - ld de,worm1 - ld a,4 ;4x (all worms) -createwormsloop: - ex de,hl - ld bc,died ;8 - add hl,bc -; ld b,0 - ld (hl),b ;died=0 - inc hl - ld (hl),b ;score=0 - inc hl - ld (hl),b ;score+1=0 - inc hl - ld (hl),2 ;delay=2 - inc hl - ld (hl),3 ;lives=x -wormbeglives =$-1 - inc hl - ex de,hl ;de=wormX+head - ld bc,18 - ldir ;copy 18 bytes - dec a ;loop - jr nz,createwormsloop - Nextlevel: cal _clrWindow pop hl ;begin of current level @@ -1575,8 +1622,11 @@ 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 @@ -2246,6 +2296,8 @@ removewormloop: cal res4pixels pop hl inc (ix+grow) + jr nz,DoesWormTailEqualsWormHead + inc (ix+grow+1) ;+256 DoesWormTailEqualsWormHead: cal _cphlde jr nz,removewormloop @@ -2256,6 +2308,7 @@ DoesWormTailEqualsWormHead: ld a,0 beginsize =$-1 ld (ix+grow),a + ld (ix+grow+1),0 ;high safewormsizedone: ;de=ix+head @@ -2375,6 +2428,7 @@ donediddelydone: ld e,(ix+pos2) ld d,(ix+pos2+1) +#ifdef optdie psh hl ld hl,previouspos ld (hl),c @@ -2386,6 +2440,7 @@ donediddelydone: inc hl ld (hl),d pop hl +#endif ;-------- move worm ---------- @@ -2466,6 +2521,9 @@ PeaX =$-1 add a,15 peagrowth =$-1 ld (ix+grow),a + jr nc,wormset2grow + inc (ix+grow+1) +wormset2grow: cal NewPea ld hl,Left dec (hl) @@ -2608,37 +2666,6 @@ checklap: pop bc 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 ---------- Drawworm: @@ -2665,10 +2692,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: @@ -2681,6 +2712,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 @@ -2827,7 +2865,7 @@ Seed =$+1 WormDead: #ifdef invincible jp stopworm -#else +#endif ld a,2 ld (flashtime),a ld (ix+delay),respawndelay @@ -2880,6 +2918,37 @@ 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 @@ -2918,24 +2987,6 @@ tryDrawPea: ;hl=peapos;bc=dopea jr z,DrawPea ret -sendnewpeaoverlink: - ld a,(gameCar) - rra ;and _datalink - ret nc ;no link - ld a,(ix+left) - or a - jr z,receivenewpeaoverlink - ld c,l ;send pea's pos - cal Qsend - ld c,h - jp Qsend ;&&&possible jr -receivenewpeaoverlink: - cal Qrecv ;Crecv - ld l,c - cal Qrecv ;Crecv - ld h,c - ret - NewPea: ld a,(FieldWidth) add a,127-4 @@ -3012,7 +3063,7 @@ chktimematchover: jr z,nneexxtt ;yourself cp (hl) ret nz ;someone else still alive - dec hl ;+delay + dec hl ;+del0ay dec hl ;+score+1 ld a,(hl) cp (ix+score+1) @@ -3249,9 +3300,9 @@ savestr: ;----------------------------- -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: @@ -3520,7 +3571,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 @@ -3558,6 +3609,12 @@ drawsmtn: ; dec a ;4 = circle ; jp z,drawcircle +;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 ld a,h @@ -3621,7 +3678,7 @@ circledraw: ;destr:de ld b,c ld c,a ;ex b,c pop hl - ret + ret ;thats it drawbox: ;(d,e)-(h,l) ld b,l ;Delta-y @@ -3645,110 +3702,127 @@ drawfatline: dec h ; jp drawline -;LINE (d,e)-(h,l) -;destroyes a +;A lot like Scabby's line routine in Wonderworm (dunno whether he wrote it +;himself.) 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. 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 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 ; :