X-Git-Url: http://git.shiar.nl/wormy.git/blobdiff_plain/6624b13cbde902470fcebf219beb843fe07e5aed..05b2b45114015912ccf5db24096b386eace99029:/wormy.z80?ds=inline diff --git a/wormy.z80 b/wormy.z80 index 386a5bc..a2c919b 100644 --- a/wormy.z80 +++ b/wormy.z80 @@ -1,6 +1,6 @@ ; Title : Wormy -; Version : 92% -; Release Date : june 2000 +; Version : 93% +; Release Date : summer 2001 ; Filename : wormy.86p (5kb) ; Author(s) : Shiar ; Email Address : shiar0@hotmail.com @@ -16,14 +16,13 @@ ;----------- TO-DO ----------- ;----------------------------- -; 92% = DONE +; 93% = DONE -; * customizable keys ; * internal levels ; * check levels/gametype ; * enough hiscore saves! ; * complete readme -; 2% * misc (pollish, bugs, &&&) +; 1% * misc (pollish, bugs, &&&) ; * LINK ; 2% * fix deaths linkplay and transmit game/level data ; 2% * make linkplay available for all gametypes (not just deathmatch) @@ -41,7 +40,8 @@ ;----------------------------- #define buffer ;use display buffer (otherwise write directly to screen) -#define readymask ;"grays" out the field before starting a level +#define readymask ;"greys" out the field before starting a level +;#define hlines ;horizontal-line routine for more speed drawing boxes ;#define readytext ;displays "prepare" before level starts ;#define invincible ;worms cannot die =) @@ -82,6 +82,7 @@ _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 ------- @@ -124,18 +125,18 @@ DispBuffer = $FC70 .org _asm_exec_ram -wormVhost = 092 -wormVclient = 192 +wormVhost = 093 +wormVclient = 193 start: nop jp Start .dw 1 - .dw WormMsg + .dw WormTxt .dw WormIcon -WormMsg: - .db "WORMY by SHIAR -- alpha 92%",0 +WormTxt: + .db "WORMY by SHIAR -- beta 93%",0 WormIcon: .db 9,2 .db %10010110,%01101111 @@ -149,7 +150,7 @@ WormIcon: .db %11000011,%10000000 levelhead = 'w' -levelhead2 = 92 ;wormy levels header = "92" +levelhead2 = 93 ;wormy levels header = "93" int_handler: ex af,af' @@ -188,7 +189,7 @@ Start: cal _RAM_PAGE_7 ld hl,$BFFF ;VAT start - ld bc,templevels + ld ix,templevels searchloop: ld de,(_PTEMP_END+1) ;VAT end or a ;nc @@ -200,20 +201,17 @@ searchloop: cp $0C ;string jr z,stringfound searchnext: - cal _RAM_PAGE_7 pop hl dec hl ;5x dec hl dec hl dec hl dec hl - psh bc ld b,(hl) ;name size inc b skipname: dec hl dnz skipname - pop bc jr searchloop stringfound: @@ -226,23 +224,23 @@ stringfound: ex de,hl ;ld ahl,(hl) cal _AHL_PLUS_2_PG3 ;string id cal _Get_Word_ahl ;ld de,(ahl) - cal _RAM_PAGE_1 - ld (bc),a + ld (ix),a ld a,levelhead cp e - jr nz,searchnext ;not worm + jr nz,_searchnext ;not worm ld a,levelhead2 cp d - jr nz,searchnext - - inc bc - ld a,h - ld (bc),a - inc bc - ld a,l - ld (bc),a - inc bc - jr searchnext + jr nz,_searchnext + inc ix ;save level's ahl + ld a,h + ld (ix),a + inc ix + ld a,l + ld (ix),a + inc ix +_searchnext: + cal _RAM_PAGE_7 + jr searchnext loadgametype: psh de @@ -267,70 +265,115 @@ defaultlevels: ret searchcomplete: - cal _RAM_PAGE_1 ld a,255 - ld (bc),a ;end mark + ld (ix),a ;end mark + + cal _clrWindow ld hl,templevels-3 -dispnextlevel: - cal _RAM_PAGE_1 psh hl - cal _clrWindow - ld a,2 - ld (_curRow),a + ld hl,$0020 + ld (_penCol),hl ld hl,txtLevsel - cal _puts ;"< Select levels: >" - ld hl,$0004 - ld (_curRow),hl + cal _vputs ;"< Select levels: >" + ld hl,$0601 ;x=1 + ld (_penCol),hl pop hl +dispnextlevel: ld a,(hl) - cp 255 ;&& - jr nz,displevel - ld hl,templevels-3 - ld a,(hl) + inc a ;cp 255 + jr z,_levselect + ld a,(hl) ;ade=(hl) displevel: inc hl ld d,(hl) inc hl ld e,(hl) - inc hl ;ade=(hl) - psh hl ;HL - ld c,a - ld h,d - ld l,e ;cde=ahl=(hl) + inc hl + psh hl + ex de,hl ;ahl=ade=(hl) cal _load_ram_ahl ;hl=ahl ld b,(hl) ;b=title size - psh bc - cal _putps ;destr=abchl - pop bc ;cde=hl - pop hl ;HL + cal _vputs + ld hl,_penCol + ld (hl),$01 ;x=1 + inc hl + ld a,(hl) + add a,6 + ld (hl),a ;y+6 + ld hl,availevels + inc (hl) + pop hl + 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 - psh hl - psh de + halt \ halt psh bc cal GET_KEY - pop bc - pop de - pop hl - cp K_RIGHT - jr z,dispnextlevel - sub K_SECOND + 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 - dec a ;K_EXIT + cp K_EXIT-1 ret z - cp K_ENTER-K_EXIT+256 + cp K_ENTER-1 jr nz,levselect +; jr z,loadlevel loadlevel: - ld a,c + ld a,b + add a,3 ;sellev+3 (#0==-3) + ld e,a + add a,a ;*2 + 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 - ex de,hl ;ahl=cde - inc b ;b=titlesize+1 + inc hl + ld d,(hl) + inc hl + ld e,(hl) + ex de,hl ;ahl=ade skiptitle: - cal _INC_PTR_AHL - dnz skiptitle + ld b,a ;psh ahl + psh hl + cal _GETB_AHL ;ld a,(ahl) + pop hl + or a + ld a,b ;pop ahl + psh af + cal _INC_PTR_AHL ;ahl++ + pop af ;cp 0 + jr nz,skiptitle ;goto #0-terminator cal _Get_Word_ahl ld (leveldataSize),de @@ -367,6 +410,16 @@ levelloaded: ld a,r ld (Seed),a + ld hl,datasingle+3 + ld b,8 +setdeflevels: + ld (hl),1 ;def=level#1 + inc hl + inc hl + inc hl + inc hl + dnz setdeflevels + ;----------------------------- ;----- build trig tables ----- ;----------------------------- @@ -398,61 +451,50 @@ NegativeSineWave: ;---------- menu ------------- ;----------------------------- - ld a,1 - ld (curlevel),a - -;--- draw menu --- - -DisplayMenu: +DisplayMenu: ;---draw menu--- cal _clrWindow - ld de,$FC42 ;(10,2) + ld de,$FC40 ;(0,4) ld hl,wtPicture - ld a,16 ;height -disptitleloop: - ld bc,8 ;width + ld bc,16*16 ldir - ex de,hl - ld bc,8 ;next line - add hl,bc - ex de,hl - dec a - jr nz,disptitleloop + ld hl,txtMenu - ld de,$0D5A + ld ix,posMenu + ld b,6 +dispmenuloop: + ld d,(ix) + inc ix + ld e,(ix) + inc ix ld (_penCol),de - cal _vputs ;by Shiar - - ld de,$0207 - ld (_curRow),de - cal _puts ;Level <00> - dec e ;$0206 - ld (_curRow),de - cal _puts ;Limit <00> - dec e ;$0205 - ld (_curRow),de - cal _puts ;Worms <2> - dec e ;$0204 - ld (_curRow),de - ld hl,(CURtxtGame) - cal _puts ;Singleplayer + cal _vputs ;Mode \ Level \ Limit \ Worms \ worm # \ controls + dnz dispmenuloop - xor a - cal menudraw - jr howmanyworms + ld b,0 ;b=menu# + jr _dispmenusets ;mainMenu ;--- menu loop --- mainMenu: + cal menupos cal menucall jr nz,notselect select: ;2nd/enter + cal menupos ld a,b - dec a ;2nd item + sub 4 ;4th item? jp z,changeworms - jp LetsGetThisPartyOn ;1/3/4 + dec a ;5th? + jp z,changekeys + jp LetsGetThisPartyOn ;1/2/3/5 notselect cp K_EXIT jp z,ExitNoStats + psh af + cal menupos + cal loadgamecar + inc hl + pop af cp K_LEFT jr z,selleft cp K_RIGHT @@ -463,116 +505,183 @@ selright: or a jr z,changegame dec a - jr z,changenrworms + jp z,changelevel ;&&&jr?? + dec a + jr z,changelives dec a - jp z,changelives + jr z,changenrworms +; dec a +; jr z,changecurworm -changelevel: - ld hl,Gametype - ld d,0 - ld e,(hl) - ld hl,nrlevels - add hl,de - ld d,(hl) ;max level for sel.game -curlevel =$+1 - ld a,1 +changecurworm: +; hl=nrworms + ld a,(curworm) + cp (hl) + jr nc,mainMenu ;may not become >(nrworms) inc a - cp d - jr c,changedlevel - ld a,d -changedlevel: - ld (curlevel),a -_dispcurlevel: - ld hl,$0807 - ld (_curRow),hl - cal showA - jp displives ;mainMenu +changedcurworm: + ld (curworm),a + jr _dispmenusets ;mainMenu selleft: ld a,b + or a + jr z,bchangegame dec a - jr z,bchangenrworms + jr z,bchangelevel dec a - jp z,bchangelives + jr z,bchangelives dec a - jr nz,mainMenu + jr z,bchangenrworms +; dec a +; jr z,bchangecurworm -bchangelevel: - ld a,(curlevel) - dec a - jr nz,changedlevel -_mainMenu: +bchangecurworm: + ld a,(curworm) + dec a ;0-3 + jr nz,changedcurworm ;save >0 jr mainMenu -changegame: - ld a,1 - ld (curlevel),a - ld a,0 -Gametype =$-1 - ld hl,txtGame2 -NEXTtxtGame =$-2 - inc a - and 7 ;mod 8 - jr nz,okilydokily - ld hl,txtGame -okilydokily: - ld (Gametype),a - ld de,$0204 - ld (_curRow),de - ld (CURtxtGame),hl - cal _puts - ld (NEXTtxtGame),hl -howmanyworms: - ld hl,nrworms - ld a,(Gametype) - cp 2 - ld (hl),1 - jr c,dispnrworms - inc (hl) ;2 - jr dispnrworms ;mainMenu - changenrworms: ld a,(Gametype) - cp 2 ;&& - jr c,_mainMenu ;type 0/1 - - ld hl,nrworms + cp 2 + jr c,mainMenu ;type 0/1 + ;hl=nrworms ld a,(hl) inc a cp 5 - jr nc,dispcurlevel + jr nc,mainMenu ;may not be >4 changednrworms: ld (hl),a -dispnrworms: - ld a,(hl) ;hl=nrworms - ld hl,$0805 - ld (_curRow),hl - add a,'0' - cal _putc -dispcurlevel: - ld a,(curlevel) - jr _dispcurlevel ;mainMenu - +_dispmenusets: + jr dispmenusets ;mainMenu bchangenrworms: - ld hl,nrworms + ;hl=nrworms ld a,(hl) - dec a ;1-3 - jr nz,changednrworms - jr dispcurlevel + dec a ;0-3 + jr nz,changednrworms ;save >0 +_mainMenu: + jr mainMenu +changegame: + ld a,0 +Gametype =$-1 + inc a +changedgame: + and 7 ;mod 8 + ld (Gametype),a + jr dispmenusets ;mainMenu +bchangegame: + ld a,(Gametype) + dec a + jr changedgame changelives: cal changelivesInit inc a cp 100 - jr nc,displives + jr nc,_mainMenu ;&& _? changedlives: ld (hl),a -displives: + jr dispmenusets ;mainMenu +bchangelives: + cal changelivesInit + dec a + jr z,_mainMenu + jr changedlives +changelivesInit: + cal loadgamecar ;c=(gameCar) +;a=(hl)=(Gametype+1)=(wormbeglives) + ld a,(Gametype) ;&&& + cp 3 + ld a,(hl) + ret nc ;change lives + pop hl ;restore stack + jr _mainMenu ;singleplayer (no limit) + +changelevel: + inc hl ;hl=loadgamecar+2 + psh hl + ld a,(hl) ;(curlevel) + ld hl,Gametype + ld d,0 + ld e,(hl) + ld hl,nrlevels + add hl,de + cp (hl) ;max level for sel.game + pop hl + jr z,_mainMenu + inc a +changedlevel: + ld (hl),a + jr dispmenusets ;mainMenu +bchangelevel: + inc hl + ld a,(hl) ;(curlevel) + dec a + jr nz,changedlevel + jr _mainMenu + +getcustomkey: + cal _vputs + dec ix +waitcustomkey: + halt \ halt + psh hl + cal GET_KEY + pop hl + or a + jr z,waitcustomkey + cp K_EXIT + ret z + cp K_MORE + jr z,waitcustomkey + ld (ix),a + ret + +changekeys: + cal getwormname + ld hl,txtKeyleft + cal getcustomkey ;left + cal getcustomkey ;right +; jr dispmenusets + +;---display current settings--- + +dispmenusets: + ld hl,$FD97 ;begin pos + ld de,7 ;bytes to add + ld a,35 ;nr of lines +clroldsettings: + ld c,9 ;bytes to clear +clroldsetsloop: + ld (hl),d ;=0 + inc hl + dec c + jr nz,clroldsetsloop + add hl,de + dec a + jr nz,clroldsettings + + 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 loadgamecar - ld hl,$0806 - ld (_curRow),hl - cal showA ;liveslimit + psh hl + ld hl,$243E + ld (_penCol),hl + cal cshowA ;liveslimit sub '0' ;original A ld l,a ld a,c @@ -581,23 +690,41 @@ displives: jr z,limitok ld a,'0' limitok: - cal _putc ;x10 - jp mainMenu -bchangelives: - cal changelivesInit - dec a - jr z,displives - jr changedlives + cal _vputmap ;x10 -changelivesInit: - cal loadgamecar ;c=(gameCar) -;a=(hl)=(Gametype+1)=(wormbeglives) - ld a,(Gametype) ;&&& - cp 3 + ld hl,$2A3E ;worms + ld (_penCol),hl + pop hl ;cal loadgamecar + inc hl + psh hl ld a,(hl) - ret nc ;change lives - pop hl ;restore stack - jr displives + add a,'0' + cal _vputmap + + ld hl,$1E3E ;level + ld (_penCol),hl + pop hl ;loadgamecar; hl++ + inc hl + ld a,(hl) ;(curlevel) + cal cshowA + + ld hl,$3032 + ld (_penCol),hl + ld a,1 +curworm =$-1 + add a,'0' + cal _vputmap + ld hl,$303E + ld (_penCol),hl + cal getwormname + ld hl,worm1name-18 + add hl,de + cal _vputs + ld hl,$363E ;controls + ld (_penCol),hl +; ld hl,txtMenu +; cal _vputs + jp mainMenu ;--- handle menukeys --- @@ -608,7 +735,7 @@ menuwaitkey: cal GET_KEY or a jr z,menuwaitkey - pop bc ;pop a as b + pop bc ;GET_KEY destr. b cp K_UP cal z,menuup cp K_DOWN @@ -617,68 +744,80 @@ menuwaitkey: ret z cp K_SECOND ret ;z=select -menupos: + +menupos: ;highlight #b + ld c,b ;psh b ld a,b - add a,4 - ld h,0 + add a,3 + add a,a + add a,a + sub b + add a,a + add a,a + add a,a ;*24 + ld h,$FC/4 ld l,a - ld (_curRow),hl - ret -menuclr: - cal menupos - ld a,' ' - jp _putc + add hl,hl + add hl,hl ;$FD20+item*96 + ld b,16*7 +menuinvloop: + ld a,(hl) + cpl + ld (hl),a + inc hl + dnz menuinvloop + ld b,c ;pop b + ret ;a=-1 menudown: - cal menuclr + cal menupos inc b jr menuupdown menuup: - cal menuclr + cal menupos dec b menuupdown: ld a,b - and %11 ;4=0;-1=3 -menudraw: + cp 6 + jr nz,menunewchk + xor a ;6=0 +menunewchk: + inc b + jr nz,menunewok + ld a,5 ;-1=5 +menunewok: ld b,a - cal menupos - ld a,'*' - jp _putc ;a=K_STO + jr menupos ;--- change name --- -; of worm#(nrworms) -;or #1 if Gametype<2 +; of worm#(curworm) -changeworms: - cal _clrWindow - ld hl,txtName - cal _puts ;"Enter name player " - ld a,(Gametype) - cp 2 - ld a,1 - jr c,wormnrname -nrworms =$+1 - ld a,1 -wormnrname: - add a,'0' - cal _putc - sub '0' - - ld d,a ;1x +getwormname: ;of (curworm) + ld a,(curworm) add a,a ;2x ld e,a add a,a ;4x add a,a ;8x add a,a ;16x add a,e ;18x - add a,d ;19x ld e,a ld d,0 ;de=a - ld ix,worm1name-19 + ld ix,worm1name-18 add ix,de + ret + +changeworms: + cal _clrWindow + ld hl,txtEName + cal _puts ;"Enter name player " + ld a,(curworm) + add a,'0' + cal _putc + + cal getwormname ld a,maxnamelength cal entername - ld (ix),0 + ld (ix),0 ;end mark jp DisplayMenu entername: @@ -808,6 +947,7 @@ loadgamecar: ld hl,datasingle ld a,(Gametype) add a,a + add a,a ld e,a ld d,0 add hl,de @@ -828,22 +968,24 @@ LetsGetThisPartyOn: ld (CheckExit),a ;set exit state cal loadgamecar - ld l,a + ld b,a ;psh a + inc hl ;nrworms + ld a,(hl) + ld (nrworms),a + ld l,b ;pop a ld h,0 ;hl=a cal _HLTIMES10 ;hl=10*(hl) ld (scorelimit),hl ;set limit cal loadgamecar ;nc - ld e,24+1 ;=de + psh hl + ld a,(Gametype) ;4bytes -> 3bytes + add a,a ;3->2bytes + add a,24+1 ;go to datalevels + ld e,a ;=de sbc hl,de ;datalevels ld a,c ;(gameCar) - and _datasingl - jr z,notsingle - ld a,1 - ld (nrworms),a -notsingle: - ld a,c and _datascore jr nz,scorelimitset dec a ;ld a,$FF ;=no_limit @@ -851,7 +993,9 @@ notsingle: scorelimitset: cal _ldHLind ;ld hl,(hl) - ld a,(curlevel) + pop de ;de=loadgamecar + inc de \ inc de + ld a,(de) ;(curlevel) ld (Level),a ld d,a ;begin level skiplevelloop: @@ -873,12 +1017,11 @@ linkmatch: ld hl,txtWaiting cal _puts cal Crecv -; ld a,c + ld a,c cp wormVclient jr z,client cp wormVhost jr nz,linkiniterror - host: ld c,wormVclient cal Qsend @@ -892,8 +1035,7 @@ linkiniterror: client: ld hl,txtReceive cal _puts - - ld a,$f6 + ld a,$E6 multiplayer: ld (SwapPos),a ld a,2 @@ -904,6 +1046,8 @@ multiplayer: ;----------------------------- GameOver: + ld a,%11000000 + out (7),a ;link normal cal _clrLCD ld hl,worm1set ld de,worm1 @@ -937,6 +1081,8 @@ StartLevel: inc a ;=255? jp nz,nextlevel + ld hl,Level + dec (hl) ;curlevel-- (not beyond last lvl) psh hl cal releasekeys cal _clrWindow @@ -1030,13 +1176,21 @@ worminit: ld a,(de) inc de sub 128 + jr nc,setfieldx + xor a ;fieldx<128 +setfieldx: ld (FieldWidth),a ld a,(de) inc de + ld l,a sub 57 + jr nc,setfieldy + xor a ;fieldy<57 +setfieldy: ld (FieldHeight),a - add a,57-5 psh de ; >> levelp + ld a,l ;pop + sub 5 ld l,a ld h,0 add hl,hl @@ -1160,25 +1314,16 @@ maskline: gameCar =$-1 and _datalink jr z,initfinished ;no link - xor a - ld (worm2+input),a ;worm 2 via link - ld (worm2+left),a ld (Speed),a ;max.speed -SwapPos: ;$18 xx -> $F6 xx - ; jr xx -> or xx +SwapPos: ;$18 xx -> $E6 xx + ; jr xx -> and xx + jr sethost +setclient: + ld (worm1+left),a ;worm 1 via link jr initfinished - inc a - ld (worm2+left),a ;1 - ld hl,worm1 - ld de,worm2 - ld b,4 ;+heading +pos - cal _EXLP ;swap positions -;&&& over link - ld hl,worm1+name - ld de,worm2+name - ld b,maxnamelength - cal _EXLP ;swap positions +sethost: + ld (worm2+left),a ;worm 2 via link initfinished: ld b,startdelay @@ -1221,13 +1366,16 @@ Delay: jr nz,Delay NoDelay: + ld (handledworm),a ;=0 + ld a,0 nrballs =$-1 or a cal nz,handlethoseneatlittleballs ld ix,worm1 - ld a,(nrworms) + ld a,1 +nrworms =$-1 ld b,a handleworms: psh bc @@ -1235,6 +1383,8 @@ handleworms: ld bc,worm2-worm1 add ix,bc pop bc + ld hl,handledworm + inc (hl) ;1..nrworms dnz handleworms ;----------------------------- @@ -1268,14 +1418,19 @@ WormDead: ld (ix+delay),respawndelay thislevel =$+1 + ld hl,0 ld de,0 - ld a,(de) - inc de +handledworm =$-2 + add hl,de + add hl,de + add hl,de + ld a,(hl) + inc hl ld (ix+heading),a - ld a,(de) + ld a,(hl) ld (ix+pos),a - inc de - ld a,(de) + inc hl + ld a,(hl) ld (ix+pos+1),a inc (ix+died) @@ -1287,7 +1442,21 @@ thislevel =$+1 ret nz ;HandleWorm done ld a,(gameCar) and _datalivel - ret z + ret z ;don't end game + ld a,(Gametype) + cp gametron + jr nz,anyworm ;if not Tron, quit at any worm's death + ld a,(nrworms) + 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 @@ -1301,19 +1470,36 @@ SpSave = $-2 cal _clrWindow ld hl,txtGO cal _puts + ld hl,$FC00 + ld b,16*8 + cal menuinvloop ;invert + inc h ;$FD80 + ld b,16 + cal menuinvloop ;