; Title : Wormy
-; Version : 96% (0.96.C14)
+; Version : 96% (0.96.C21)
; Release Date : UUHHhhh... soon?!?
; Filename : wormy.86p (5kb)
; Author(s) : Shiar
; 96% = DONE
-; [* internal levels ]
-; [ * check levels/gametype ]
-; [ * enough hiscore saves! ]
-; [* complete readme ]
+; * complete readme
; 1% * misc (pollish, bugs, &&&)
-; 1% * long length save (level#6)
-; * mem at worm #4
+; * mem at worm #4 (still 12 bytes or so.....)
+; * fix line proc (+large circles)
; * 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
;100% = bugs fixed + levels done
-; MAYBE: sound
-; NO: coop
+;>110%: sound, startpos
+;>120%: coop (DON'T COUNT ON IT)
;-----------------------------
;-----------------------------
#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
#include "asm86.h"
#include "ti86asm.inc"
-
_SHRACC = $4383 ;4x srl a
_SHLACC = $438B ;4x sll a
_divHLby10 = $4044 ;hl=hl/10
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)
-
-turn10 = $AE01 ; (1) (counter)
-peaspos = $AE02 ;-AE05 (4) (peas)
+ ;can you believe i actually left $269 bytes of memory unused?!?
;MEM|8---9---A---B---C---D---E---F---|
; |..[------]||[]|......[-----]|[].|
;------- program start -------
;-----------------------------
-.org _asm_exec_ram
-
-wormVhost = 095
-wormVclient = 195
+ .org %1101011101001000
start:
nop
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% C21",0
WormIcon:
.db 8,2
.db %00000000,%00111100
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
ld a,255
ld (ix),a ;end mark
+#ifdef intlevels
ld ix,templevels-6
+#else
+ ld ix,templevels-3
+#endif
levelselectmenu:
psh ix ;offset
ld a,-2
jr dispnextlevel
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
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
; 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
skipflags:
ld a,(Gametype)
+ cp gamerace
+ jr z,skiplaps
cp gamectf
jr nz,noflagstoskip
inc hl
inc hl
+skiplaps:
inc hl
inc hl
noflagstoskip:
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
;--------- link ------------
+wormVhost = 095
+wormVclient = 195
+
linkmatch:
cal _clrWindow
ld c,wormVhost
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:
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 ---------
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
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
cal res4pixels
pop hl
inc (ix+grow)
+ jr nz,DoesWormTailEqualsWormHead
+ inc (ix+grow+1) ;+256
DoesWormTailEqualsWormHead:
cal _cphlde
jr nz,removewormloop
ld a,0
beginsize =$-1
ld (ix+grow),a
+ ld (ix+grow+1),0 ;high
safewormsizedone:
;de=ix+head
ld e,(ix+pos2)
ld d,(ix+pos2+1)
+#ifdef optdie
psh hl
ld hl,previouspos
ld (hl),c
inc hl
ld (hl),d
pop hl
+#endif
;-------- move worm ----------
add a,15
peagrowth =$-1
ld (ix+grow),a
+ jr nc,wormset2grow
+ inc (ix+grow+1)
+wormset2grow:
cal NewPea
ld hl,Left
dec (hl)
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:
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:
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
WormDead:
#ifdef invincible
jp stopworm
-#else
+#endif
ld a,2
ld (flashtime),a
ld (ix+delay),respawndelay
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
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
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)
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<xx
+lineXincs: ;deltax=|deltax|
ld b,d
- ld c,e
- psh hl
- psh bc
- cal FindPixel
- pop bc
- pop de
-connectedLine:
- psh hl
- ld h,c
- ld c,a
- ld a,d
- sub b
- ld b,a
- ld a,e
- jr nz,LineNotPoint
- cp h
- jr nz,LineNotPoint
- pop hl
- jr DoneLine
-LineNotPoint:
- sub h
- ld de,32
- jr nc,LinePositiveY
- neg
- ld de,-32
-LinePositiveY:
- cp b
- jr nc,SteepLine
- add a,a
- ld (line2sm+1),a
+ ld c,e ;bc=x,y
+ psh hl ;hl=xx,yy
+ cal FindPixel ; (ahl=x+y)
+ ex (sp),hl ; :hl>
+ 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 ; :<hl
+ jr DoneLine ;line is 1 pixel
+lineexists:
+ sub e ;a=deltay
+ ld de,32 ;go down (def)
+ jr nc,lineYincs ;cf = deltay<0
+ neg ;a=|deltay|
+ ld de,-32 ;go up
+lineYincs: ;lets assume y incs as well
+ cp b
+ jr nc,SteepLine ;deltay<deltax?
+ ld (line2sm+1),a ;a=deltay
ld h,a
xor a
sub b
- add a,a
- ld (line1sm+1),a
- ld a,h
- sub b
- pop hl
-LineLoopGentle:
- psh af
+ ld (line1sm+1),a ;a=-deltax
+ rra
+ add a,h ;a=deltay-deltax/2
+ pop hl ; :<hl
+
+linedrawxloop:
+ psh af ;init z=dy-dx
ld a,(hl)
- or c
+ or c ;|c:hl
ld (hl),a
rrc c
jr nc,$+3
- inc hl
+ inc hl ;(x++,y)
pop af
- jp m,line2sm
+ jp m,line2sm ;z<0
line1sm:
- add a,0
- add hl,de
+ add a,0 ;z-=deltax
+ add hl,de ;(x,y++)
line2sm:
- add a,0
- dnz LineLoopGentle
+ add a,0 ;z+=deltay
+ dnz linedrawxloop ;|deltax| times
+
DoneLine:
ld a,(hl)
- or c
- ld (hl),a
+ or c ;|c:hl
+ ld (hl),a ;draw end
pop de
pop hl
pop bc
ret
+
SteepLine:
- ld h,a
- neg
- add a,a
+ ld h,a ;h=deltay
+ neg ;a=-deltay
ld (line3sm+1),a
ld a,b
- add a,a
- ld (line4sm+1),a
- sub h
- ld b,h
- pop hl
-LineLoopSteep:
- psh af
+ ld (line4sm+1),a ;a=deltax
+ sub h ;a=deltax-deltay
+ ld b,h ;b=deltay
+ pop hl ; :<hl
+linedrawyloop:
+ psh af ;init z=2(dx-dy)
ld a,(hl)
- or c
+ or c ;|c:hl
ld (hl),a
- add hl,de
+ add hl,de ;(x,y++)
pop af
- jp m,line4sm
+ jp m,line4sm ;z<0
line3sm:
- add a,0
+ add a,0 ;z-=deltay
rrc c
jr nc,$+3
- inc hl
+ inc hl ;(x++,y)
line4sm:
- add a,0
- dnz LineLoopSteep
+ add a,0 ;z+=deltax
+ dnz linedrawyloop ;|deltay| times
jr DoneLine
+
+;--- foo ---
+;wild insert
+receivenewpeaoverlink:
+ cal Qrecv ;Crecv
+ ld l,c
+ cal Qrecv ;Crecv
+ ld h,c
+ 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
+; jr Qsend ;that's why it's here
+
;..and last but not least..:
;-----------------------------
;----------- link ------------
timeout = $8000
lossout = 20
-linkok:
- ld a,D0HD1H
- out (7),a ;raise both wires = link ok
- ret
-
-checklink: ;load wires in A and check for timeout
- dec de ;decrease timer
- ld a,d
- or e
- 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
- inc a ;and this is another one
- ld (linklosses),a
- pop de ;return from link
- cp lossout ;quit if too many errors
- ret c ;otherwise just continue
-linkerr:
- jp Exit
-
;---- SEND ----
Qsend: ;--- try to send 8 bits in C; CF=error --- destr:abcde ---
ld (linklosses),a ;reset number of losses
ret
+;---- COMMON ----
+
+linkok:
+ ld a,D0HD1H
+ out (7),a ;raise both wires = link ok
+ ret
+
+checklink: ;load wires in A and check for timeout
+ dec de ;decrease timer
+ ld a,d
+ or e
+ 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
+ inc a ;and this is another one
+ ld (linklosses),a
+ pop de ;return from link
+ cp lossout ;quit if too many errors
+ ret c ;otherwise just continue
+linkerr:
+ jp Exit
+
+#ifdef intlevels
;-----------------------------
;---------- 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
.db 27,8,27,116
.db 0
+#endif
+
;-----------------------------
;---------- data -------------
;-----------------------------
txtGO: .db 5,5,5,5,5," GAME OVER ",$CF,$CF,$CF,$CF,$CF,0
#endif
+#ifdef intlevels
datalevels: .dw LevelDef, LevelDefM
.dw LevelDefT,LevelDefM
.dw LevelDefM,LevelDefM
.dw LevelDefR,LevelDefC
nrlevels: .db 0,3,1,3,3,3,3,1 ;=defaults
+#else
+datalevels: .dw 0,0,0,0,0,0,0,0
+nrlevels: .dw 0,0,0,0
+#endif
_datalink = %0000001 ;linkplay
_datafoodl = %0000010 ;left=0 limit
worm4name: .db "JIM ",0
defhiscrpos:
+#ifdef intlevels
.db 0,0,"SHI"
.db 0,0,"SHI"
.db 0,0,"SHI"
.db 0,0,"SHI"
.db 0,0,"SHI"
+#endif
Gametype: .db 0 ;last gamemode
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 "
-.db "WWW.SHIAR.ORG WWW.SHIAR.ORG "
-.db "WWW.SHIAR.ORG WWW.SHIAR.ORG "
-.db "WWW.SHIAR.ORG WWW.SHIAR.ORG "
-.db "WWW.SHIAR.ORG WWW.SHIAR.ORG "
-.db "WWW.SHIAR.ORG WWW.SHIAR.ORG "
-.db "WWW.SHIAR.ORG WWW.SHIAR.ORG "
-.db "WWW.SHIAR.ORG WWW.SHIAR.ORG "
-.db "WWW.SHIAR.ORG WWW.SHIAR.ORG "
-.db "WWW.SHIAR.ORG WWW.SHIAR.ORG "
-.db "WWW.SHIAR.ORG WWW.SHIAR.ORG "
-.db "WWW.SHIAR.ORG WWW.SHIAR.ORG "
-.db "WWW.SHIAR.ORG WWW.SHIAR.ORG "
-.db "WWW.SHIAR.ORG WWW.SHIAR.ORG "
-.db "WWW.SHIAR.ORG WWW.SHIAR.ORG "
-.db "WWW.SHIAR.ORG WWW.SHIAR.ORG "
-.db "WWW.SHIAR.ORG WWW.SHIAR.ORG "
-.db "WWW.SHIAR.ORG WWW.SHIAR.ORG "
-.db "WWW.SHIAR.ORG WWW.SHIAR.ORG "
-.db "WWW.SHIAR.ORG WWW.SHIAR.ORG "
-.db "WWW.SHIAR.ORG WWW.SHIAR.ORG "
-.db "WWW.SHIAR.ORG WWW.SHIAR.ORG "
-.db "WWW.SHIAR.ORG WWW.SHIAR.ORG "
-.db "WWW.SHIAR.ORG WWW.SHIAR.ORG "
-.db "WWW.SHIAR.ORG WWW.SHIAR.ORG "
-.db "WWW.SHIAR.ORG WWW.SHIAR.ORG "
-.db "WWW.SHIAR.ORG WWW.SHIAR.ORG "
-.db " wormy@shiar.org",0
-
defspritesz = 4
defspriteimg: .db %01100000
.db %11110000
.db %11110000
.db %01100000
+#ifdef intlevels
deflevels:
.db "Internal Levels",0
- .db "by SHIAR -- still t"
- .db "o be added...." ;,0
+ .db "by Shiar" ;,0
.db 0,deflevels/256,deflevels&255
+#endif
templevels:
;-----------------------------