; Title : Wormy
-; Version : 95%
-; Release Date : summer 2001
+; Version : 95% (0.95.B09)
+; Release Date : OOHHhhh... soon?!?
; 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)
; [ * enough hiscore saves! ]
; [* complete readme ]
; 1% * misc (pollish, bugs, &&&)
+; 1% * long length save (level#6)
+; * mem at worm #4
; * LINK
-; * fix first packet loss
; 1% * transmit game/level data
-;;;1% * get g/o signal (l&l) working
-; 2% * send new peas' positions
+; Xfirst packet loss?? or vti onlyXXXXX
+; X1/3 worms over linkXXXX
+; Xsend new peas' positionsXXXXX
;100% = bugs fixed + levels done
+; MAYBE: sound
+; NO: coop
+
;-----------------------------
;-----------------------------
-;--------- W O R M ---------
+;------- W O R M Y ---------
;-----------------------------
;-----------------------------
#define cal call
#define psh push
#define dnz djnz
-;#define halt nop
#include "asm86.h"
#include "ti86asm.inc"
;--- temporary
namelength = $BC00 ;(1) @menu
+datalink = $BC00 ;(8) @init
#ifdef buffer
DispBuffer = $BC00 ;(10x57d) @game
#else
.org _asm_exec_ram
-wormVhost = 093
-wormVclient = 193
+wormVhost = 095
+wormVclient = 195
start:
nop
- jp Start
- .dw 1
+ jp Start
+ .db 1
+ nop
.dw WormTxt
.dw WormIcon
levelhead2 = 95 ;wormy levels header = "95"
int_handler:
- ex af,af'
- in a,($03)
+ ex af,af'
+ in a,($03)
bit 3,a
- jp z,$0039
+ jp z,$0039
res 0,a
out ($03),a
- jp $0039
+ jp $0039
int_end:
Start:
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,$0601 ;x=1
psh bc
cal ubergetkey
pop bc ;GET_KEY destr. b
- cp K_UP
- jr z,levup
- dec a ;K_DOWN
+ dec a ;cp K_DOWN
jr z,levdown
- cp K_SECOND-1
- jr z,loadlevel
+ 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
+ inc a ;cp K_SECOND
jr nz,levselectmenu
; jr z,loadlevel
ld (ix+8),0 ;end mark
jp DisplayMenu
-;--proc
+;-----------------------------
+;------- procs-n-stuff -------
+;-----------------------------
ubergetkey:
halt ;woo hoo
noflagstoskip:
skipobjects:
- ld a,(hl)
- inc hl
- or a
+ xor a
+ or (hl)
+ inc hl ;nf
ret z ;0=end
inc hl
inc hl
cal loadgamecar
psh hl
- ld (wormbeglives),a
- inc hl ;nrworms
- ld a,(hl)
- ld (nrworms),a
- inc hl ;level
- inc hl
- ld a,(hl)
- ld (customspeed),a
- inc hl
- ld a,(hl)
- ld (growspeed),a
- inc hl
- ld a,(hl)
- ld (turnleft),a
- ld (turnright),a ;more efficient
- inc hl
- ld l,(hl)
- ld h,0
- cal _HLTIMES10 ;hl=10*(hl)
- ld (scorelimit),hl
-
- pop hl ;loadgamecar
cal hlatlevel
-
- psh hl ;1st level
- ld a,(gameCar)
+ ex (sp),hl ;pop \ psh leveldata
+ psh hl ;psh loadgamecar
+ ld a,0
+gameCar =$-1
rra ;and _datalink
- jr nc,GameOver
+ jp nc,StartLevel ;&&&jr
+
+;--------- link ------------
linkmatch:
cal _clrWindow
host:
ld c,wormVclient
cal Qsend
- ld a,$18
- jr multiplayer
+ jr sethost
client:
ld hl,txtReceive
cal _puts
- ld a,$E6
-multiplayer:
- ld (SwapPos),a
-; ld a,2
-; ld (nrworms),a
+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
+ pop hl
+ pop de
+ psh de
+ psh hl
+ ld b,168
+ cal sendstuff
+ ex de,hl
+ ld b,8
+ cal sendstuff
+ jr StartLevel
+sendstuff:
+ psh de
+sendstuffloop:
+ psh bc
+ ld c,(hl)
+ inc hl
+ cal Qsend
+ pop bc
+ dnz sendstuffloop
+ pop de
+ ret
+recvstuff:
+ psh de
+recvstuffloop:
+ psh bc
+ cal Qrecv
+ ld (hl),c
+ 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
+ ld b,9
+ cal sendstuff
+ ld hl,worm2+name
+ ld b,9
+ cal recvstuff
+ pop hl
+ pop de
+ ld hl,templevels
+ ld de,datalink
+ psh de
+ psh hl
+ ld b,168
+ cal recvstuff
+ ex de,hl
+ ld b,8
+ cal recvstuff
-;-----------------------------
-;--------- game over ---------
-;-----------------------------
+;-------- load level ---------
+
+StartLevel:
+ pop hl ;loadgamecar
+ ld a,(hl)
+ ld (wormbeglives),a
+ inc hl ;nrworms
+ ld a,(hl)
+ ld (nrworms),a
+ inc hl ;level
+ inc hl
+ ld a,(hl)
+ ld (customspeed),a
+ inc hl
+ ld a,(hl)
+ ld (growspeed),a
+ inc hl
+ ld a,(hl)
+ ld (turnleft),a
+ ld (turnright),a ;more efficient
+ inc hl
+ ld l,(hl)
+ ld h,0
+ cal _HLTIMES10 ;hl=10*(hl)
+ ld (scorelimit),hl
-GameOver:
+setupworms:
ld hl,worm1set
ld de,worm1
ld a,4 ;4x (all worms)
dec a ;loop
jr nz,createwormsloop
-StartLevel:
+Nextlevel:
cal _clrWindow
pop hl ;begin of current level
ld a,(hl)
inc a ;=255?
- jp nz,nextlevel
+ jp nz,donextlevel
psh hl
ld hl,Level
psh bc ;where to go afterwards
inc hl ;location of ending-code
jp (hl) ;go there ("call")
-nextlevel:
+donextlevel:
ld a,(Gametype)
or a ;gamesingle
psh af
;-------- draw level ---------
+initlevel:
ld a,(de)
inc de
sub 128
cal drawstuff
-;-----------------------------
+;--------- prepare -----------
+leveldone:
psh hl ; >> levelp new
cal forceshowstats
dec c
jr nz,maskloop
#endif
-
#ifdef readytext
ld hl,$FDE0
ld de,$FDE1
res 3,(iy+5)
#endif
- ld a,0
-gameCar =$-1
- rra ;and _datalink
- jr nc,initfinished ;no link
- xor a
-SwapPos: ;$18 xx -> $E6 xx
- ; jr xx -> and xx
- jr sethost
-setclient:
- 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
- jr initfinished
-sendstuff:
- psh bc
- ld c,(hl)
- inc hl
- psh hl
- cal Qsend
- pop hl
- pop bc
- dnz sendstuff
- ret
-recvstuff:
- psh bc
- psh hl
- cal Qrecv
- pop hl
- ld (hl),c
- inc hl
- pop bc
- dnz recvstuff
- ret
-sethost:
- ld (worm2+left),a ;worm 2+4..
- ld (worm4+left),a ;..over link
- ld hl,worm1+name
- ld b,9
- cal sendstuff
- ld hl,worm2+name
- ld b,9
- cal recvstuff
-initfinished:
ld a,(gameCar)
and _datafood
jr z,nofood
jr nz,unnamedlabel
cal saverespawncounter
removeworm:
- ld h,(ix+tail+1)
+ ld h,(ix+tail+1) ;&
ld l,(ix+tail)
ld d,(ix+head+1)
ld e,(ix+head)
ld l,c
ret
+;-----------------------------
;------- handle worm ---------
+;-----------------------------
HandleWorm:
xor a
pop hl ; << call
pop hl ; << call
ld (ix+delay),2
- jp StartLevel
+ jp Nextlevel
chkpeahit: ;bc=ownpos;hl=peapos (destr:ad)
ld a,(sprsize)
;----------- score -----------
-timematchscore: ;piece of crap checking whether you've already won in timematch
+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)
dnz LineLoopSteep
jr DoneLine
+;..and last but not least..:
;-----------------------------
;----------- link ------------
;-----------------------------
+timeout = $8000
+lossout = 20
+
linkok:
ld a,D0HD1H
- out (7),a ;raise both wires = link ok
+ out (7),a ;raise both wires = link ok
ret
-timeout = $8000
-lossout = 20
-
checklink: ;load wires in A and check for timeout
dec de ;decrease timer
ld a,d
or e
- jr nz,linkfine ;ok if de>0
-;de==0 = timeout
+ jr z,linktimeout ;timeout if de==0
+linktest:
+ ld a,$BF
+ out (1),a ;select keys
+ in a,(1) ;input
+ bit 6,a ;exit key
+ jp z,Exit ;break!
+linkfine:
+ in a,(7)
+ and %11
+ ret
+linktimeout: ;de==0
cal linkok
ld a,0 ;losses so far
linklosses =$-1
ret c ;otherwise just continue
linkerr:
jp Exit
-linkfine:
- in a,(7)
- and %11
- ret
;---- SEND ----
-Csend:
- ld b,32
-csendwait:
- nop
- dnz csendwait
- cal Qsend
- jr c,Csend
- ret
-
-Qsend: ;try to send 8 bits in C; CF=error --- destr:abcde
+Qsend: ;--- try to send 8 bits in C; CF=error --- destr:abcde ---
nop \ nop
- in a,(7)
- and %11 ;both wires low = exit signal
- jr z,linkerr ;error otherwise
+ cal linkfine
+ jr z,linkerr ;both wires low = exit signal
ld b,8 ;bits to send
sendloop:
ld de,timeout
;---- RECV ----
-Crecv: ;--- receive 8 bits into A/C --- destr:abcdehl ---
+Crecv: ;--- receive 8 bits into A/C --- destr:abCde ---
cal Qrecv
ret nc ;return if all went ok
jr Crecv ;and try again
-Qrecv: ;--- receive 8 bits into A/C; CF=error --- destr:abcde ---
- in a,(7)
- and %11
+Qrecv: ;--- receive 8 bits into A/C; CF=error --- destr:abCde ---
+ cal linkfine
jr z,linkerr ;both low = error, quit
ld b,8 ;bits to receive
recvloop:
- ld de,timeout
+; ld de,timeout
recvwait:
- cal checklink
+ cal linktest ;checklink
cp %11
jr z,recvwait ;both high = nothing sent (yet)
+ ld de,timeout
rra ;received bit in cf
ld a,D0LD1H
jr c,received ;lower white wire as well
;---------- levels -----------
;-----------------------------
+;&&&&& 99%
LevelDef:
.db 5,4,15,15,0,0 ;peas,speed,growth,begin_size,sprite,balls
.db 0,2,63 ;start d, y, x
;---------- data -------------
;-----------------------------
-wtPicture:
+wtPicture: ;title
.db %00011110,%00000000,%00000000,%00000000,%00000000,%00000000,%00000000,%00000001,%11000000,%00000000,%00000000,%00000001,%10000000,%00000000,%00001111,%10000000
.db %00111110,%00000000,%00000000,%00000000,%00000000,%00000000,%00000000,%00000001,%11100000,%00000000,%00000011,%11000010,%01000011,%10011100,%00110000,%01100000
.db %01110000,%00000000,%00000000,%00000000,%00000000,%00000000,%00000000,%00000000,%01110000,%00111000,%00001100,%00110001,%00110100,%01100011,%01000000,%00010000
.db %00011111,%11101111,%11110000,%00111111,%10000111,%00000001,%10000000,%00000011,%11111111,%11110000,%00111110,%00011110,%00010111,%01011101,%10010101,%01100101
.db %00001111,%10000011,%11100000,%00011111,%00000011,%00000001,%10000000,%00000000,%11111111,%11100000,%00000000,%00000000,%11100101,%01010101,%01000110,%01010011
-wtWormy:
+wtWormy: ;g/o
.db %00000110,%00111000,%00000000,%00111100,%00001111,%10001110,%00111100,%01111000,%00001100,%11011000,%11100011,%10000000,%00000000,%11111100,%00111000,%00000000
.db %00011001,%01000110,%11100000,%11000010,%00011100,%11011111,%01111110,%11111000,%00011110,%11011101,%11110111,%11000000,%00111111,%00000011,%01000110,%11100000
.db %00100000,%10000011,%00010001,%00110010,%00011000,%00010011,%01101010,%11000000,%00111011,%01001101,%10000110,%01000000,%11000000,%00000000,%10000001,%00010000
.dw LevelDefT,LevelDefM
.dw LevelDefM,LevelDefM
.dw LevelDefR,LevelDefC
-nrlevels: .db 1,3,1,3,3,3,3,1 ;=defaults
+nrlevels: .db 0,3,1,3,3,3,3,1 ;=defaults
_datalink = %0000001 ;linkplay
_datafoodl = %0000010 ;left=0 limit
tail = 15 ;also@next level
storepos = 17
reserv = 18 ;loop (race:lap|ctf:pea)
-input = 19
+input = 19 ;---currently unused afaik---
left = 20
right = 21
name = 22
respawndelay = 30
maxnamelength = 8+1
+;bla space (reserved for internal levels)
.db "WWW.SHIAR.ORG WWW.SHIAR.ORG "
.db "WWW.SHIAR.ORG WWW.SHIAR.ORG "
.db "WWW.SHIAR.ORG WWW.SHIAR.ORG "