wormy 0.95.1914
[wormy.git] / wormy.z80
index e0bb2b21affa566f98efa39a2fd6ba19de19d30a..edb70567e7d1f53e739135f999a81bf4f9f31cfa 100644 (file)
--- a/wormy.z80
+++ b/wormy.z80
@@ -3,8 +3,7 @@
 ; Release Date               : summer 2001
 ; Filename                   : wormy.86p (5kb)
 ; Author(s)                  : Shiar
 ; Release Date               : summer 2001
 ; Filename                   : wormy.86p (5kb)
 ; Author(s)                  : Shiar
-; Email Address              : shiar0@hotmail.com
-; ICQ UIN                    : #43840958
+; Email Address              : wormy@shiar.org
 ; Web Page                   : www.shiar.org
 ; Description                : ruling Nibbles-like game 1-4 players
 ; Where to get this game     : www.shiar.org (home of Wormy)
 ; Web Page                   : www.shiar.org
 ; Description                : ruling Nibbles-like game 1-4 players
 ; Where to get this game     : www.shiar.org (home of Wormy)
@@ -26,8 +25,9 @@
 ;   * LINK
 ;     * fix first packet loss
 ;  1% * transmit game/level data
 ;   * LINK
 ;     * fix first packet loss
 ;  1% * transmit game/level data
+;  1% * 1/3 worms over link
 ;;;1% * get g/o signal (l&l) working
 ;;;1% * get g/o signal (l&l) working
-;  2% * send new peas' positions
+;;;1% * send new peas' positions
 
 ;100% = bugs fixed + levels done
 
 
 ;100% = bugs fixed + levels done
 
@@ -48,7 +48,6 @@
 #define cal call
 #define psh push
 #define dnz djnz
 #define cal call
 #define psh push
 #define dnz djnz
-;#define halt nop
 
 #include "asm86.h"
 #include "ti86asm.inc"
 
 #include "asm86.h"
 #include "ti86asm.inc"
@@ -135,7 +134,8 @@ wormVclient = 193
 start:
   nop
   jp Start
 start:
   nop
   jp Start
-  .dw 1
+  .db 1
+  nop
   .dw WormTxt
   .dw WormIcon
 
   .dw WormTxt
   .dw WormIcon
 
@@ -276,113 +276,129 @@ levelselectmenu:
   ld  hl,txtLevsel
   cal _vputs ;"< SELECT LEVELS >"
   ld  hl,$FC00+(2*16)
   ld  hl,txtLevsel
   cal _vputs ;"< SELECT LEVELS >"
   ld  hl,$FC00+(2*16)
-  cal hr
-  ld  hl,$FC00+(10*16)
-  cal hr
+  ld  b,16*9
+  cal menuinvloop
   ld  hl,$FC00+(56*16)
   cal hr
   ld  hl,$FC00+(56*16)
   cal hr
-  ld  hl,$0C01 ;x=1
+  ld  hl,$0601 ;x=1
   ld  (_penCol),hl
 dispnextlevel:
   ld  (_penCol),hl
 dispnextlevel:
-  ld  de,3
-  add ix,de
-  ld  a,(ix)
+  ld  a,(ix+3)
+  ld  b,a
   inc a ;cp 255
   jr  z,__levselect
   inc a ;cp 255
   jr  z,__levselect
-  dec a
 displevel:
 displevel:
-  ld  h,(ix+1)
-  ld  l,(ix+2) ;ahl=(ix)
-  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
   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)
   cp  49 ;bottom of screen
   jr  nc,_levselect
   cp  49 ;bottom of screen
   jr  nc,_levselect
+  ld  de,3
+  add ix,de
+  ld  hl,availevels
+  inc (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
 
   jr  dispnextlevel
 
+readylevelfile: ;selected level at ahl
+; ld  hl,templevels-3
+  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
+  add hl,de
+  ld  a,(hl) ;ade=(hl)
+  inc hl
+  ld  d,(hl)
+  inc hl
+  ld  e,(hl)
+  ex  de,hl ;ahl=ade
+skiptitle:
+  ld  d,a ;psh ahl
+  psh hl
+  cal _GETB_AHL ;ld a,(ahl)
+  pop hl
+  or  a
+  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
 levup:
   cal menupos
   dec b ;up
   ld  a,b
   cp  -3
-  jr  nz,levselected
+  jr  nz,levselect
   inc b ;undo
   inc b ;undo
-  jr  levselected
+  jr  levselect
 levdown:
   cal menupos
   inc b ;down
   ld  a,b
   cp  -2
 availevels =$-1
 levdown:
   cal menupos
   inc b ;down
   ld  a,b
   cp  -2
 availevels =$-1
-  jr  nz,levselected
+  jr  nz,levselect
   dec b ;back up
   dec b ;back up
-levselected:
-  jp  menupos
-
+levselect:
+  cal menupos
+  ld  hl,$3900
+  ld  (_penCol),hl
+  pop hl
+  psh hl
+  cal readylevelfile
+  cal _load_ram_ahl ;hl=ahl
+  ld  de,$FFA0 ;desc.text
+  xor a
+levdescclearloop:
+  ld (de),a ;empty
+  inc de
+  cp  d ;de>$FFFF (offscreen)
+  jr  nz,levdescclearloop
+  cal _vputs
+  jr  levselectmenu+1
 __levselect:
   ld  ix,templevels-6 ;reset 2 1st page
 _levselect:
   ld  b,-2 ;level selected
 __levselect:
   ld  ix,templevels-6 ;reset 2 1st page
 _levselect:
   ld  b,-2 ;level selected
-  cal menupos
-  pop hl
-levselect:
+  jr  levselect
+levselectmenu:
   psh hl
   psh bc
   cal ubergetkey
   pop bc ;GET_KEY destr. b
   psh hl
   psh bc
   cal ubergetkey
   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 ;cp K_DOWN
+  jr  z,levdown
+  sub K_UP-1
+  jr  z,levup
   pop hl
   pop hl
-  cp  K_RIGHT-1
+  inc a ;cp K_RIGHT
   jp  z,levelselectmenu
   jp  z,levelselectmenu
-  cp  K_EXIT-1
+  cp  K_ENTER-K_RIGHT
+  jr  z,loadlevel
+  sub K_EXIT-K_RIGHT
   jp  z,ExitNoStats
   jp  z,ExitNoStats
-  cp  K_ENTER-1
-  jr  nz,levselect
+  inc a ;cp K_SECOND
+  jr  nz,levselectmenu
 ; jr  z,loadlevel
 
 loadlevel:
 ; jr  z,loadlevel
 
 loadlevel:
-; ld  hl,templevels-3
-  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
-  add hl,de
-  ld  a,(hl) ;ade=(hl)
+  cal readylevelfile
   or  a ;levelfile on page 0 (=internal)
   jr  z,levelloaded
   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
-  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 skiptitle ;skip description
 
   cal _Get_Word_ahl
   ld  (leveldataSize),de
 
   cal _Get_Word_ahl
   ld  (leveldataSize),de
@@ -1326,12 +1342,9 @@ client:
   cal _puts
   ld  a,$E6
 multiplayer:
   cal _puts
   ld  a,$E6
 multiplayer:
-;  cal linkok
-;  ld a,D0LD1L
-;  out (7),a
   ld  (SwapPos),a
   ld  (SwapPos),a
-  ld  a,2
-  ld  (nrworms),a
+; ld  a,2
+; ld  (nrworms),a
 
 ;-----------------------------
 ;--------- game over ---------
 
 ;-----------------------------
 ;--------- game over ---------
@@ -1577,13 +1590,6 @@ levelhasbeensetup:
 
   psh hl                        ; >> levelp new
   cal forceshowstats
 
   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
 
 #ifdef readymask
   ld  hl,$FC70
@@ -1657,8 +1663,6 @@ recvstuff:
   dnz recvstuff
   ret
 sethost:
   dnz recvstuff
   ret
 sethost:
- halt
- dnz sethost
   ld  (worm2+left),a ;worm 2+4..
   ld  (worm4+left),a ;..over link
   ld  hl,worm1+name
   ld  (worm2+left),a ;worm 2+4..
   ld  (worm4+left),a ;..over link
   ld  hl,worm1+name
@@ -1668,6 +1672,14 @@ sethost:
   ld  b,9
   cal recvstuff
 initfinished:
   ld  b,9
   cal recvstuff
 initfinished:
+  ld  a,(gameCar)
+  and _datafood
+  jr  z,nofood
+  ld  ix,worm1
+  cal NewPea
+nofood:
+  ld  bc,(worm1+pos)
+  cal DisplayField
 
   ld  b,startdelay
 ReadyDelay:
 
   ld  b,startdelay
 ReadyDelay:
@@ -2779,6 +2791,24 @@ tryDrawPea: ;hl=peapos;bc=dopea
   jr  z,DrawPea
   ret
 
   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
 NewPea:
   ld  a,(FieldWidth)
   add a,127-4
@@ -2788,9 +2818,10 @@ NewPea:
   add a,56-4
   cal randompos
   ld  l,a
   add a,56-4
   cal randompos
   ld  l,a
-  ld  (PeaY),hl
   cal CheckPea
   jr  nz,NewPea
   cal CheckPea
   jr  nz,NewPea
+  cal sendnewpeaoverlink
+  ld  (PeaY),hl
 DrawPea: ;hl=(PeaY)
   ld  b,h
   ld  c,l
 DrawPea: ;hl=(PeaY)
   ld  b,h
   ld  c,l
@@ -2841,6 +2872,8 @@ nextbitok:
 timematchscore: ;piece of crap checking whether you've already won in timematch
   ld  a,(nrworms)
   ld  b,a ;# of worms
 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  hl,worm1+lives
   ld  de,worm2-worm1
   ld  a,(handledworm)
@@ -3649,8 +3682,7 @@ sendbit:
 sendwaitack:
   cal checklink                ;other calc must lower other wire
   jr  nz,sendwaitack
 sendwaitack:
   cal checklink                ;other calc must lower other wire
   jr  nz,sendwaitack
-  ld  a,D0HD1H         ;raise one, ok to raise other
-  out (7),a
+  cal linkok           ;raise one, ok to raise other (out (7),D0HD1H)
 sendfinish:
   cal checklink
   cp  %11              ;both raised (by other calc)
 sendfinish:
   cal checklink
   cp  %11              ;both raised (by other calc)
@@ -3689,8 +3721,7 @@ received:
 recvwaitack:
   cal checklink
   jr  z,recvwaitack    ;same wire will be raised again by other calc
 recvwaitack:
   cal checklink
   jr  z,recvwaitack    ;same wire will be raised again by other calc
-  ld  a,D0HD1H
-  out (7),a            ;raise both
+  cal linkok           ;raise both
 recvfinish:
   dnz recvloop         ;repeat for all bits
   xor a                        ;nc=no error
 recvfinish:
   dnz recvloop         ;repeat for all bits
   xor a                        ;nc=no error
@@ -3988,7 +4019,9 @@ defspriteimg:     .db %01100000
                .db %01100000
 
 deflevels:
                .db %01100000
 
 deflevels:
-  .db "Internal Levels" ;,0
+  .db "Internal Levels",0
+  .db "by SHIAR -- still t"
+  .db "o be added...." ;,0
 
   .db 0,deflevels/256,deflevels&255
 templevels:
 
   .db 0,deflevels/256,deflevels&255
 templevels: