; 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)
; * LINK
; * fix first packet loss
; 1% * transmit game/level data
+; 1% * 1/3 worms over link
;;;1% * get g/o signal (l&l) working
-; 2% * send new peas' positions
+;;;1% * send new peas' positions
;100% = bugs fixed + levels done
#define cal call
#define psh push
#define dnz djnz
-;#define halt nop
#include "asm86.h"
#include "ti86asm.inc"
start:
nop
jp Start
- .dw 1
+ .db 1
+ nop
.dw WormTxt
.dw WormIcon
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,$0C01 ;x=1
+ ld hl,$0601 ;x=1
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
- dec a
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,availevels
- inc (hl)
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
+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
- jr nz,levselected
+ jr nz,levselect
inc b ;undo
- jr levselected
+ jr levselect
levdown:
cal menupos
inc b ;down
ld a,b
cp -2
availevels =$-1
- jr nz,levselected
+ jr nz,levselect
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
- cal menupos
- pop hl
-levselect:
+ jr levselect
+levselectmenu:
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
- cp K_RIGHT-1
+ inc a ;cp K_RIGHT
jp z,levelselectmenu
- cp K_EXIT-1
+ cp K_ENTER-K_RIGHT
+ jr z,loadlevel
+ sub K_EXIT-K_RIGHT
jp z,ExitNoStats
- cp K_ENTER-1
- jr nz,levselect
+ inc a ;cp K_SECOND
+ jr nz,levselectmenu
; 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
-
- 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 _puts
ld a,$E6
multiplayer:
-; cal linkok
-; ld a,D0LD1L
-; out (7),a
ld (SwapPos),a
- ld a,2
- ld (nrworms),a
+; ld a,2
+; ld (nrworms),a
;-----------------------------
;--------- game over ---------
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
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 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:
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
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
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)
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)
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
.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: