; Title : Wormy
-; Version : 93%
-; Release Date : summer 2001
+; Version : 96% (0.96.C14)
+; Release Date : UUHHhhh... 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)
;----------- TO-DO -----------
;-----------------------------
-; 93% = DONE
+; 96% = DONE
; [* internal levels ]
; [ * check levels/gametype ]
; [ * 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
-; * CTF
-; 1% * fix pea XOR problem in ctf
-; 1% * fix wormstop in race
+; 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 buffer ;use display buffer (otherwise write directly to screen)
#define readymask ;"greys" out the field before starting a level
-;#define hlines ;horizontal-line routine for more speed drawing boxes
- ;^^(doesn't work properly)^^
+#define coolzgfx ;nice graphics for game over screen
+
;#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
worm3 = $AC3E ;-AC59 (1F)
worm4 = $AC5D ;-AC77 (1F)
balls = $AC7C ;-ACFF (3x43d)
-SinCosTable = $AD00 ;-AE00 (4x40)
+SinCosTable = $AD00 ;-AE00 (4*40)
;free $AE01 ;-AFFF (1FF)
worm1p = $B000 ;-B7FF (800) %1011O000
worm3p = $B800 ;-BBFF (400) %10111O00
;free $BF91 ;-BFFF (6F)
-
- ;program $D748 ;-E7FF (106D+4A)
- ;free $E800 ;-EFFF (800)
+ ;program $D748 ;-EFFF (186D+4A)
worm4p = $F000 ;-F3FF (400) %11110O00
leveldata = $F400 ;-FA70 (<=671)
-turn10 = $AE01
-peaspos = $AE02
+turn10 = $AE01 ; (1) (counter)
+peaspos = $AE02 ;-AE05 (4) (peas)
+
+;MEM|8---9---A---B---C---D---E---F---|
+; |..[------]||[]|......[-----]|[].|
+; | SCREEN 2* 13 PRGM 4LV |
;--- 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
WormTxt:
- .db "WORMY by SHIAR -- beta 93%",0
+ .db "WORMY by SHIAR -- 96% C14",0
WormIcon:
.db 8,2
- .db %00110000,%00111100
- .db %01110000,%00111110
- .db %11100000,%00000111
- .db %11000011,%11000011
- .db %11000111,%11100011
- .db %11101110,%01100111
- .db %01111100,%01111110
- .db %00111000,%00111100
+ .db %00000000,%00111100
+ .db %00000000,%01010010
+ .db %00000000,%01100001
+ .db %01100011,%10011001
+ .db %10010100,%01101001
+ .db %10011001,%00011001
+ .db %01000010,%11000001
+ .db %00111100,%00111110
levelhead = 'w'
-levelhead2 = 94 ;wormy levels header = "93"
+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:
im 1
ld a,$D4
ld h,a
- ld l,0 ;ld hl,$D400
+ ld l,0 ;ld hl,$D400
ld d,a
- ld e,1 ;ld de,$D401
+ ld e,1 ;ld de,$D401
ld b,e
- ld c,l ;ld bc,$0100
- dec a ;ld a,$D3
+ ld c,l ;ld bc,$0100
+ dec a ;ld a,$D3
ld (hl),a
ldir
ld hl,int_handler
ld d,a
- ld e,a ;ld de,$D3D3
+ ld e,a ;ld de,$D3D3
ld bc,int_end-int_handler
ldir
- inc a ;ld a,$D4
+ inc a ;ld a,$D4
ld i,a
im 2
ld a,255
ld (ix),a ;end mark
+ ld ix,templevels-6
+levelselectmenu:
+ psh ix ;offset
+ ld a,-2
+ ld (availevels),a
cal _clrWindow
- ld hl,templevels-3
- psh hl
- ld hl,$0020
+ ld hl,$0320
ld (_penCol),hl
ld hl,txtLevsel
- cal _vputs ;"< Select levels: >"
+ cal _vputs ;"< SELECT LEVELS >"
+ ld hl,$FC00+(2*16)
+ ld b,16*9
+ cal menuinvloop
+ ld hl,$FC00+(56*16)
+ cal hr
ld hl,$0601 ;x=1
ld (_penCol),hl
- pop hl
dispnextlevel:
- ld a,(hl)
+ ld a,(ix+3)
+ ld b,a
inc a ;cp 255
- jr z,_levselect
- ld a,(hl) ;ade=(hl)
+ jr z,__levselect
displevel:
- inc hl
- ld d,(hl)
- inc hl
- ld e,(hl)
- inc hl
- psh hl
- ex de,hl ;ahl=ade=(hl)
- 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
+ cp 49 ;bottom of screen
+ jr nc,_levselect
+ ld de,3
+ add ix,de
ld hl,availevels
inc (hl)
- pop 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
-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 \ halt
- psh bc
- cal GET_KEY
- 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
- cp K_EXIT-1
- jp z,ExitNoStats
- cp K_ENTER-1
- jr nz,levselect
-; jr z,loadlevel
-
-loadlevel:
+readylevelfile: ;selected level at ahl
+; ld hl,templevels-3
ld a,b
add a,3 ;sellev+3 (#0==-3)
ld e,a
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
-
inc hl
ld d,(hl)
inc hl
ld e,(hl)
ex de,hl ;ahl=ade
skiptitle:
- ld b,a ;psh ahl
+ ld d,a ;psh ahl
psh hl
cal _GETB_AHL ;ld a,(ahl)
pop hl
or a
- ld a,b ;pop ahl
+ 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,levselect
+ inc b ;undo
+ jr levselect
+levdown:
+ cal menupos
+ inc b ;down
+ ld a,b
+ cp -2
+availevels =$-1
+ jr nz,levselect
+ dec b ;back up
+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
+ jr levselect
+levselectmenu:
+ psh hl
+ psh bc
+ cal ubergetkey
+ pop bc ;GET_KEY destr. b
+ dec a ;cp K_DOWN
+ jr z,levdown
+ sub K_UP-1
+ jr z,levup
+ pop hl
+ inc a ;cp K_RIGHT
+ jp z,levelselectmenu
+ cp K_ENTER-K_RIGHT
+ jr z,loadlevel
+ sub K_EXIT-K_RIGHT
+ jp z,ExitNoStats
+ inc a ;cp K_SECOND
+ jr nz,levselectmenu
+; jr z,loadlevel
+
+loadlevel:
+ cal readylevelfile
+ or a ;levelfile on page 0 (=internal)
+ jr z,levelloaded
+ cal skiptitle ;skip description
cal _Get_Word_ahl
ld (leveldataSize),de
ld hl,TrigPrecalc
ld de,SinCosTable
- psh de ; >> 1
+ psh de
ld bc,65
ldir
dec hl
ld (de),a
inc de
dnz MirrorSineWave
- pop hl ; << 0k
+ pop hl ;SinCosTable
ld b,128+64
NegativeSineWave:
xor a
ld hl,wtPicture
ld bc,16*16
ldir
- ld hl,$FC00+$160
+ ld hl,$FC00+$010 ;(*,01)
cal hr
- ld hl,$FC00+$3E0
+ ld hl,$FC00+$160 ;(*,22)
+ cal hr
+ ld hl,$FC00+$3E0 ;(*,62)
cal hr
dispmainmenu:
ld hl,Gametype
;Mode|Level|Limit|Worms|worm #|controls
; jr dispmenucommon ;cal
+dispmenucommon_:
+ ld b,36*16/4
dispmenucommon:
ld de,$FD80 ;begin pos
- ld b,36*16/3
xor a
clroldmenuloop:
ld (de),a
inc de
ld (de),a
inc de
+ ld (de),a
+ inc de
dnz clroldmenuloop
- ld b,6
+ ld b,(ix)
dispmenuloop:
- ld d,(ix)
+ ld d,(ix+1)
inc ix
- ld e,(ix)
+ ld e,(ix+1)
inc ix
ld (_penCol),de
cal _vputs
; ld b,0 ;b=menu#
ret
-hr: ;draw horizontal line at hl
+;hr: ;draw horizontal line at hl
+; ld b,16
+; jp menuinvloop
+
+hr:
ld b,16
- jp menuinvloop
+hrloop:
+ ld (hl),-1
+ inc hl
+ dnz hrloop
+ ret
;--- menu loop ---
ld hl,txtoMenu
ld ix,posoMenu
;Back|Lives|Limit|Speed|Rotation|Growth
- cal dispmenucommon
+ cal dispmenucommon_
dispomenusets:
cal clrold
ld (_penCol),hl
cal loadgamecar
psh hl
- cal cshowA ;lives
+ cal cshowA0 ;lives
ld hl,$2A3E
ld (_penCol),hl
cal _vputs
jr dispspeeddone
dispspeed:
- cal cshowA
+ cal cshowA0
dispspeeddone:
ld hl,$363E
psh hl
ld a,(hl) ;(growth)
inc a ;-1=None; 0..98->1..99
- cal cshowA
+ cal cshowA0
ld hl,$303E
ld (_penCol),hl
cal _vputs
jr dispturndone
dispturn:
- cal cshowA ;turn speed
+ cal cshowA0 ;turn speed
dispturndone:
ld hl,$243E
ld a,(hl) ;(scorelimit)
or a
psh af
- cal cshowA ;limit
+ cal cshowA0 ;limit
pop af ;a==0?
jr z,optionMenu ;do not display 0 behind 'None'
ld a,'0'
cal loadgamecar
inc hl
pop af
- cp K_LEFT
+ sub K_LEFT
jr z,seloleft
- cp K_RIGHT
+ dec a ;K_RIGHT
ld a,b
jr nz,optionMenu
changespeed:
cal changespeedInit
inc a
- cp 99
+ cp 20
jr nc,_optionMenu ;>98
changedspeed:
dec hl ;(Speed)
cal loadgamecar
inc hl
pop af
- cp K_LEFT
+ sub K_LEFT
jr z,selleft
- cp K_RIGHT
+ dec a ;K_RIGHT
ld a,b
jr nz,mainMenu
jr nc,mainMenu ;may not be >4
changednrworms:
ld (hl),a
-_dispmenusets:
jr _dispmenusets ;mainMenu
changenrwormsInit:
ld a,(Gametype)
ld a,1 ;change LS-bit (=link)
xor (hl) ;0=1; 1=0
ld (hl),a
+_dispmenusets:
jr dispmenusets ;mainMenu
changegame:
cal _vputs
dec ix
waitcustomkey:
- halt \ halt
psh hl
- cal GET_KEY
+ cal ubergetkey
pop hl
or a
jr z,waitcustomkey
ld hl,$2A3E ;worms
ld (_penCol),hl
cal loadgamecar
- inc hl
psh hl
+ inc hl
ld a,(hl)
add a,'0'
cal _vputmap
ld hl,$1E3E ;level
ld (_penCol),hl
- pop hl ;loadgamecar; hl++
- inc hl
- ld a,(hl) ;(curlevel)
- cal cshowA
+ pop hl ;loadgamecar
+ psh bc
+ ld d,0
+ cal hlatlevel
+ ld a,(Gametype)
+ or a ;gamesingle
+ jr nz,displvlname
+ ld a,(Level)
+ cal cshowA0
+ jr lvldisped
+displvlname:
+ cal _vputs
+lvldisped:
+ pop bc
ld hl,$3032
ld (_penCol),hl
menucall:
psh bc
menuwaitkey:
- halt \ halt
- cal GET_KEY
+ cal ubergetkey
or a
jr z,menuwaitkey
pop bc ;GET_KEY destr. b
ld a,'_'
cal __vputmap
nokeypressed:
- halt
- cal GET_KEY
+ cal ubergetkey
or a
jr z,nokeypressed
ld (ix+8),0 ;end mark
jp DisplayMenu
-;--proc
+;-----------------------------
+;------- procs-n-stuff -------
+;-----------------------------
+
+ubergetkey:
+ halt ;woo hoo
+ halt ;save them batteries! yeah!
+ jp GET_KEY
clrold:
ld hl,$FD97 ;begin pos
jr nz,clroldsettings
ret
+hlatlevel: ;d must be 0
+ psh hl ;loadgamecar
+ ld a,(Gametype) ;8bytes -> 7bytes
+ ld e,a
+ add a,a ;nc
+ add a,e
+ add a,a ;8->2bytes
+ add a,24+1 ;go to datalevels
+ ld e,a ;=de
+ sbc hl,de ;datalevels
+ cal _ldHLind ;ld hl,(hl)
+ pop de ;de=loadgamecar
+ inc de \ inc de
+ ld a,(de) ;(curlevel)
+ ld (Level),a
+ ld d,a ;begin level
+skiplevelloop:
+ dec d ;levels to skip
+ ret z
+ cal skiplevel
+ jr skiplevelloop
+ ret ;hl=begin of correct level
+
+skiplvltitle: ;zf=singleplayer
+ ld a,(hl)
+ or a ;null-terminator
+ inc hl
+ jr nz,skiplvltitle
+ ret
+
skiplevel: ;@hl - destr:ab - alter:hl
+ ld a,(Gametype)
+ or a ;gamesingle
+ psh af
+ cal nz,skiplvltitle
inc hl
inc hl
inc hl
ld b,(hl) ;balls
inc b
inc b ;skip 6
- ld a,(Gametype)
- cp gamesingle
+ pop af ;cp (Gametype),0
jr z,skipworms
inc b ;multiplayer lvl
inc b
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
- psh hl
- ld a,(Gametype) ;8bytes -> 7bytes
- ld e,a
- add a,a ;nc
- add a,e
- add a,a ;8->2bytes
- add a,24+1 ;go to datalevels
- ld e,a ;=de
- sbc hl,de ;datalevels
-
- cal _ldHLind ;ld hl,(hl)
- pop de ;de=loadgamecar
- inc de \ inc de
- ld a,(de) ;(curlevel)
- ld (Level),a
- ld d,a ;begin level
-skiplevelloop:
- dec d ;levels to skip
- jr z,levelsskipped
- cal skiplevel
- jr skiplevelloop
-levelsskipped:
-
- psh hl ;1st level
- ld a,(gameCar)
+ cal hlatlevel
+ 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:
-; cal linkok
-; ld a,D0LD1L
-; out (7),a
- ld (SwapPos),a
- ld a,2
- ld (nrworms),a
-
-;-----------------------------
-;--------- game over ---------
-;-----------------------------
-
-GameOver:
- ld hl,worm1set
- ld de,worm1
- ld a,4 ;4x (all worms)
-createwormsloop:
+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 bc,died
- 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
+ ld b,8
+ cal sendstuff
+ jr StartLevel
+sendstuff:
+ psh de
+sendstuffloop:
+ psh bc
+ ld c,(hl)
inc hl
- ld (hl),3 ;lives=x
-wormbeglives =$-1
+ cal Qsend
+ pop bc
+ dnz sendstuffloop
+ pop de
+ ret
+recvstuff:
+ psh de
+recvstuffloop:
+ psh bc
+ cal Qrecv
+ ld (hl),c
inc hl
- ex de,hl ;de=wormX+head
- ld bc,18
- ldir ;copy 18 bytes
- dec a ;loop
- jr nz,createwormsloop
+ 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
+
+;-------- 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
+
+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 de,Left
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
+ cal nz,skiplvltitle
+ ld de,Left
ldi
+ ld de,Speed
ld a,0
customspeed =$-1
inc a ;$FF=def
- jr z,defspeed
+ jr nz,setspeed
+ ld a,(hl) ;speed from level
+ inc a
+setspeed:
dec a
- ld (hl),a ;store new speed
-defspeed:
- ld de,Speed
- ldi
+ ld (de),a ;custom speed
+ inc hl
ld de,peagrowth
ldi
ld a,(hl)
#endif
ld hl,worm1
- ld a,(Gametype)
- cp gamesingle
+ pop af ;cp (Gametype),0
ld b,1
jr z,worminit
ld b,4
inc a ;ld a,1
ld (turn10),a
- ld a,2
+ inc a ;ld a,2
ld (flashtime),a
;-------- draw level ---------
+initlevel:
ld a,(de)
inc de
sub 128
psh hl ; >> 1
psh de ; >> 2
ld de,ScrBuffer+1
- ld bc,63
+ ld bc,63 ;first 2 rows
ld (hl),%11111111
- ldir
+ ldir ;draw upper border
inc hl
- ld (hl),%11000000
+ ld (hl),%11000000 ;first left border
inc hl
ld b,31
ClearLine:
- ld (hl),c
- inc hl
+ ld (hl),c ;=0
+ inc hl ;clear rest of line
dnz ClearLine
psh hl ; >> 3
rra
rra
ld l,a
- ld h,0
+ ld h,c ;0
add hl,de
pop af ; << 3
and %00000111
ld b,a
- ld c,0
+; ld c,0
ld a,%11000000
jr z,NoVertShift
VertShift:
pop hl ; << levelp
ld a,(Gametype)
- cp gamectf
- jr nz,noctf
+ cp gamerace ;or gamectf
+ jr c,levelhasbeensetup
ld de,peaspos
- ld bc,4
+ ld c,2 ;ld bc,2 (2 bytes)
+ jr z,loadextralevelstuff ;cp gamerace
+ ld c,4 ;ld bc,4 (2nd flag in ctf)
+loadextralevelstuff:
ldir
- psh hl
- cal DrawAllPeas
- pop hl
-noctf:
+ ld a,1 ;draw delay
+ ld (drawctfpea1),a
+ ld (drawctfpea2),a
+levelhasbeensetup:
cal drawstuff
-;-----------------------------
+;--------- prepare -----------
+leveldone:
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
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
- cal Qrecv
- ld a,c
- ld (worm2+name+0),a
- cal Qrecv
- ld a,c
- ld (worm2+name+1),a
- cal Qrecv
- ld a,c
- ld (worm2+name+2),a
- cal Qrecv
- ld a,c
- ld (worm2+name+3),a
- cal Qrecv
- ld a,c
- ld (worm2+name+4),a
- jr initfinished
-sethost:
- ld (worm2+left),a ;worm 2+4..
- ld (worm4+left),a ;..over link
- ld c,'T'
- cal Qsend
- ld c,'e'
- cal Qsend
- ld c,'s'
- cal Qsend
- ld c,'t'
- cal Qsend
- ld c,0
- cal Qsend
-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:
cal forceshowstats ;update score
nodispupdate:
-drawctfpea1:
- jr drawctfpea2
- ld bc,drawctfpea1
+ ld a,(Gametype)
+ cp gamectf
+ jr nz,noctfpeas2draw
+ ld de,drawctfpea1
ld hl,(peaspos)
- cal tryDrawPea
-drawctfpea2:
- jr noctfpeas2draw
- ld bc,drawctfpea2
+ cal tryDrawPea ;pea#1
+ ld de,drawctfpea2
ld hl,(peaspos+2)
- cal tryDrawPea
+ cal tryDrawPea ;pea#2
noctfpeas2draw:
add ix,bc
pop bc
ld hl,handledworm
- inc (hl) ;1..nrworms
+ inc (hl) ;0..nrworms-1
dnz handleworms
;-----------------------------
out (1),a
in a,(1)
rla ;MORE?
- jr c,CheckExit
- ld bc,$0103
- out (c),b
- halt ;pause/off
- ld b,11
- out (c),b
-
+ jr nc,disppausemenu
CheckExit:
rla ;=$17 (c=EXIT-key)
;or$A7 (c=0)
jp c,GameLoop
- jr Exit
+ jp Exit ;jr?
-WormDead:
-#ifdef invincible
- jp stopworm
-#else
- ld a,2
- ld (flashtime),a
- ld (ix+delay),respawndelay
+;------- pause menu -------
-thislevel =$+1
- ld hl,0
- ld de,0
-handledworm =$-2
- add hl,de
- add hl,de
- add hl,de
- ld a,(hl)
- inc hl
- ld (ix+heading),a
- ld a,(hl)
- ld (ix+pos),a ;y
- inc hl
- ld a,(hl)
- ld (ix+pos+1),a ;x
- xor a
- ld (ix+pos2),a ;y2
- ld (ix+pos2+1),a ;x2
+disppausemenu:
+ ld hl,txtpMenu
+ ld ix,pospMenu
+;Resume|Turn Off|Contrast|Exit||
+ ld b,25*16/4
+ cal dispmenucommon
+ ld hl,$FC00+$170 ;(*,23)
+ cal hr
+ ld hl,$FC00+$310 ;(*,49)
+ cal hr
+ cal menupos
- inc (ix+died)
- dec (ix+lives)
+pauseMenu:
+ psh bc
+pmenuwaitkey:
+ cal ubergetkey
+ or a
+ jr z,pmenuwaitkey
+ pop bc ;GET_KEY
+ ld d,b ;c=new b
+ cp K_UP
+ jr nz,pmenunotup
+ dec d
+pmenunotup:
+ cp K_DOWN
+ jr nz,pmenunotdown
+ inc d
+pmenunotdown:
psh af
- ld de,10
- cal DecScore
+ cal menupos
+ ld a,d ;new pos
+ and 3 ;0-3
+ ld b,a
+ cal menupos
pop af
- ret nz ;HandleWorm done
- ld a,(wormbeglives)
- or a ;0=no live limit
- ret z ;don't end game
- ld a,(gameCar)
- and _datatime
- jr z,anyworm ;quit at any worm's death
- ld a,(nrworms) ;livematch: all worms must've died
- 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
-#endif
+ cp K_ENTER
+ jr z,pselect
+ cp K_SECOND
+ jr nz,notpselect
+pselect:
+ ld a,b
+ or a ;1: continue
+ jr z,donepausing
+ dec a ;2: off
+ jr z,turnoff
+ dec a ;3: contrast
+ jr z,pauseMenu
+ jr Exit ;4: exit
+notpselect
+ cp K_EXIT
+ jr z,donepausing
+ ld hl,CONTRAST
+ sub K_LEFT
+ jr z,contrastdown
+ dec a ;K_RIGHT
+ jr nz,pauseMenu
+contrastup:
+ inc (hl)
+ jr setcontrast
+contrastdown:
+ dec (hl)
+setcontrast:
+ ld a,(hl)
+ out (2),a
+ jr pauseMenu
+
+turnoff:
+ ld bc,$0103
+ out (c),b
+ halt ;pause/off
+ ld b,11
+ out (c),b
+ ld b,1
+ jr pauseMenu
+
+donepausing:
+ cal releasekeys
+ jp GameLoop
Exit:
cal releasekeys
ld a,D0LD1L
out (7),a ;both wires low = game over signal
cal _clrWindow
+#ifdef coolzgfx
+ ld de,$FC30 ;(0,1)
+ ld hl,wtWormy
+ ld bc,16*7
+ ldir
+ ld hl,$FC10
+ ld b,16*11
+ cal menuinvloop ;invert
+ ld hl,$FD80
+ cal hr ;menuinvloop w/ b=16
+ ld hl,$FCE0
+ cal hr
+ ld hl,_curRow
+ ld (hl),2
+#else
ld hl,txtGO
cal _puts
ld hl,$FC00
cal hr ;menuinvloop w/ b=16
ld hl,$FCE0
cal hr
-; ld l,$74
-; ld b,8
-; cal menuinvloop
ld hl,_curRow
inc (hl)
+#endif
ld hl,txtGame
CURtxtGame =$-2
cal _puts
ld a,13
ld (_curCol),a
ld a,(hl) ;worm+died
- cal showA
+ cal showA0
pop hl
psh hl
- ld a,10
- ld (_curCol),a
ld a,(Gametype)
cp gamedeathm
jr nz,nodmwinner ;deathmatch?
ld a,0 ;winner's deaths
dmwinner =$-1
cp (hl) ;equals this worm?
- jr nz,notwinner
- jr iswinner
+ scf ;jr nz,notwinner
+ cal z,iswinner
nodmwinner:
jr c,notwinner ;no singleplayer winners
inc hl ;worm+score
ld de,0
winnerscore =$-2
cal _cphlde ;==highest score..
- jr nz,notwinner
-iswinner:
- ld a,'*'
- cal _putc ;..then put *
+ cal z,iswinner
notwinner:
ld a,16
ld (_curCol),a
ld hl,5
cal _MM_LDIR_SET_SIZE ;save new
cal _RAM_PAGE_1
+ ld hl,_curRow
+ dec (hl)
+ cal iswinner
NotNewHigh:
ld hl,$3149
hiscorecheckdone:
waitkey:
- halt
- halt
- cal GET_KEY
+ cal ubergetkey
cp K_ENTER
jp z,DisplayMenu
cp K_SECOND
ld bc,(Level)
add a,c
ld b,a ;levels to skip (including 1 for singleplayer)
+ ld de,5 ;to add per level
addlevelposition:
- inc hl
- inc hl ;add one word per level
- inc hl
- inc hl
- inc hl ;plus 3 bytes for name
+ add hl,de ;one word+3 bytes for name
dnz addlevelposition
hi__:
xor a ;ahl=0(+hl)
highsave:
.db 0,0,"WOR ",0
+iswinner:
+ ld a,10
+ ld (_curCol),a
+ ld a,'*'
+ jp _putc ;..then put *
+
;-----------------------------
;----------- worm ------------
;-----------------------------
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
ld a,(gameCar)
and _datatime
jr z,notimescore
- ld de,1
+ ld e,1
cal IncScore
notimescore:
ld hl,Left
dec (hl)
psh af
- ld de,10
+ ld e,10
cal IncScore
pop af
jp nz,Drawworm ;continue
add hl,hl
cal _HLTIMES10
ex de,hl
- cal IncScore ;score+(40*level)
+ cal _IncScore ;score+(40*level)
cal removeworm
pop hl ; << call
pop hl ; << call
ld (ix+delay),2
- jp StartLevel
+ jp Nextlevel
chkpeahit: ;bc=ownpos;hl=peapos (destr:ad)
ld a,(sprsize)
jr z,nottheotherflag
ld hl,drawctfpea2 ;restore #2
nottheotherflag:
- ld (hl),$E6 ;and nn
+ ld (hl),3 ;draw delay 3 turns
ret
+drawctfpea1: .db 0
+drawctfpea2: .db 0
+
hitflag: ;correct pea hit
ld a,e ;pop a
xor %11 ;invert flag taken + ownflag
pop af
jr nz,Drawworm ;flag taken, continue game
psh hl
- ld de,20 ;flag captured+returned
+ ld e,20 ;flag captured+returned
cal IncScore
pop hl
- ld a,$E6 ;and nn
+ ld a,3 ;draw delay
ld (drawctfpea1),a ;redraw..
ld (drawctfpea2),a ;..both flags
jr Drawworm
-DrawAllPeas:
- ld hl,(peaspos)
- cal DrawPea
- ld hl,(peaspos+2)
- jp DrawPea
-
;-----------------------------
nextotherwormbit:
ret ;z
checkhitlapline:
- ld a,63
- sub b
+ ld a,(peaspos) ;63
+ sub b ;x==63
jr z,nextlaphalf
inc a
ret nz
nextlaphalf:
- ld a,c
- and 32 ;y>=32?
- jr nz,nolap
+ ld a,(peaspos+1) ;yline
+ cp c ;ypos
+ ld a,1
+ jr nc,checklap ;y>yline -> a=1
+ xor a ;y<yline -> a=0
+checklap:
cp (ix+reserv)
- jr z,nolap
+ ret z ;same as before
+ ld (ix+reserv),a ;1st time
+ ld e,a
+ ld a,(handledworm)
+ and 1 ;group 0 (1,3) or 1 (2,4)
+ xor e
+ ret z ;(group 0 and y<yline) or (group 1 and y>yline)
psh bc
- ld de,20
- cal IncScore
+ ld e,20
+ cal IncScore ;lap!
pop bc
- xor a
-nolap:
- ld (ix+reserv),a
ret
#ifdef optdie
add a,2
ret
-CheckPea: ;@hl; destr:abcde
- ld c,l
- ld a,(sprsize)
- ld e,a
-chkloopy:
- ld b,h
- ld a,(sprsize)
- ld d,a
-chkloopx:
- psh hl
- cal FindPixel
- and (hl)
- pop hl
- ret nz ;nz=pixel found
- inc b
- dec d
- jr nz,chkloopx
- inc c
- dec e
- jr nz,chkloopy
- ret ;z=empty space
+WormDead:
+#ifdef invincible
+ jp stopworm
+#else
+ ld a,2
+ ld (flashtime),a
+ ld (ix+delay),respawndelay
+
+thislevel =$+1
+ ld hl,0
+ ld de,0
+handledworm =$-2
+ add hl,de
+ add hl,de
+ add hl,de
+ ld a,(hl)
+ inc hl
+ ld (ix+heading),a
+ ld a,(hl)
+ ld (ix+pos),a ;y
+ inc hl
+ ld a,(hl)
+ ld (ix+pos+1),a ;x
+ xor a
+ ld (ix+pos2),a ;y2
+ ld (ix+pos2+1),a ;x2
+
+ inc (ix+died)
+ dec (ix+lives)
+ psh af
+ ld de,10
+ ld a,(Gametype)
+ cp gamectf ;ctf no death penalty
+ cal nz,DecScore
+ pop af
+ ret nz ;HandleWorm done
+ ld a,(wormbeglives)
+ or a ;0=no live limit
+ ret z ;don't end game
+ ld a,(gameCar)
+ and _datatime
+ jr z,anyworm ;quit at any worm's death
+ ld a,(nrworms) ;timematch: all worms must've died
+ 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
+#endif
+
+CheckPea: ;@hl; destr:abcde
+ ld c,l
+ ld a,(sprsize)
+ ld e,a
+chkloopy:
+ ld b,h
+ ld a,(sprsize)
+ ld d,a
+chkloopx:
+ psh hl
+ cal FindPixel
+ and (hl)
+ pop hl
+ ret nz ;nz=pixel found
+ inc b
+ dec d
+ jr nz,chkloopx
+ inc c
+ dec e
+ jr nz,chkloopy
+ ret ;z=empty space
tryDrawPea: ;hl=peapos;bc=dopea
- psh bc
+ ld a,(de)
+ or a ;0=drawn
+ ret z
+ psh de
cal CheckPea
- pop bc
+ pop de
ret nz ;unsuccesful
- ld a,$18 ;jr
- ld (bc),a
- jr DrawPea
+ ex de,hl
+ dec (hl) ;hl=appeartime
+ ex de,hl ;hl=peaspos
+ 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,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
;----------- score -----------
+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 c,a ;wormcounter
+chktimematchover:
+ xor a
+ cp c
+ jr z,nneexxtt ;yourself
+ cp (hl)
+ ret nz ;someone else still alive
+ dec hl ;+delay
+ dec hl ;+score+1
+ ld a,(hl)
+ cp (ix+score+1)
+ jr c,nneexxtt_ ;you>him
+ ret nz ;not highest
+ dec hl ;+score
+ ld a,(hl)
+ cp (ix+score)
+ ret nc ;you<=him
+ inc hl
+nneexxtt_:
+ inc hl
+ inc hl
+nneexxtt:
+ dec c
+ add hl,de
+ dnz chktimematchover
+ jp anyworm ;g/o
+
_divHLby1000:
psh hl
ld b,3
pop hl
ret
-IncScore:
- ld h,(ix+score+1)
- ld l,(ix+score)
+extralives:
cal _divHLby1000
ld c,a
- add hl,de
+ add hl,de ;increase score
cal _divHLby1000
cp c
jr z,scorecommon ;hl/1000 not increased
inc (ix+lives)
jr scorecommon
+
DecScore: ;&&&
ld h,(ix+score+1)
ld l,(ix+score)
or a
sbc hl,de
jr c,showstats ;<0=0
+ jr scorecommon
+
+IncScore: ;inc score by e
+ ld d,0
+_IncScore ; inc by de
+ ld h,(ix+score+1)
+ ld l,(ix+score)
+ ld a,(Gametype)
+ or a ;if singleplayer...
+ jr z,extralives
+ add hl,de ;score+=de
scorecommon:
ld (ix+score+1),h
- ld (ix+score),l
+ ld (ix+score),l ;save
ld de,0
scorelimit =$-2
ld a,d
showstats:
ld a,(gameCar)
and _datatime
- ret nz ;no disp for timematches
+ jr nz,timematchscore ;no disp for timematches
+ ld hl,$FC00 ;&&&only necessary in deathmatch
+ ld b,6*16-1
+clearstats:
+ ld (hl),a ;=0
+ inc hl
+ dnz clearstats
forceshowstats:
psh ix
ld h,0
jr __vputs
showlives:
ld a,(ix+lives)
+showA: ;small w/o leading 0 (&&&combine w/ cshowA0??)
+ cp 10
+ jr c,showleastsign
+ ld l,a
+ ld h,0
+ cal _divHLby10
+ psh af
+ ld a,l
+ add a,'0'
+ cal __vputmap
+ pop af
+showleastsign:
add a,'0'
__vputmap:
psh ix
cal __vputs
ld a,0
Level =$-1
- cp 10
- jr c,tilllevel9
- ld l,a
- ld h,0
- cal _divHLby10
- psh af
- ld a,l
- add a,'0'
- cal __vputmap
- pop af
-tilllevel9:
- add a,'0'
- cal __vputmap
+ cal showA
ld a,98
ld (_penCol),a
ld (_penCol),a
ld a,0
Left =$-1
- cal cshowA
+ cal cshowA0
ld hl,txtLeft
__vputs:
ld hl,txtLevel
cal _puts
ld a,(Level)
-showA:
+showA0: ;big w/ leading 0
ld l,a
ld h,0
cal _divHLby10
add a,'0'
jp _putc
-cshowA:
+cshowA0: ;small w/ leading 0
or a
jr nz,cshowavalue
ld hl,txtNone
drawsmtn:
dec a ;1 = line
- jp z,drawline
+ jr z,drawline
dec a ;2 = fatline
- jp z,drawfatline
+ jr z,drawfatline
dec a ;3 = box
- jp z,drawbox
- dec a ;4 = circle
- jp z,drawcircle
- dec a ;5 = hline
-#ifdef hlines
- jp z,drawhline
-#else
- jp z,drawline
-#endif
+ jr z,drawbox
+; dec a ;4 = circle
+; jp z,drawcircle
-drawbox: ;(d,e)-(h,l)
- ld b,l ;Delta-y
-#ifdef hlines
-boxloop:
- cal drawhline
- inc e
- dnz boxloop
- ret
-drawhline: ;(d,e)-(h,e)
- psh bc
- ld b,d
- ld c,e
- psh hl
- cal FindPixel
- ld c,a ;starting mask
+drawcircle: ;(d,e),h ;de=x,y; h=z
+ ld c,h ;c=yy=z
ld a,h
- sub b
- ld b,a
- inc b ;1+x2-x1
-hlineloop:
- ld a,(hl)
- or c
- ld (hl),a
- rrc c ;mask >>
- jr nc,hlinenext
- inc hl ;next byte
-hlinenext:
- dnz hlineloop
+ neg
+ ld l,a ;l=-z
+ xor a
+ ld b,a ;b=xx=0
+ dec a ;-$00**
+ ld h,a ;hl=zz=-z
+circloop:
+ psh de ;x,y
+ ex (sp),hl ;push zz \ pop x,y
+ cal circledraw ;(x-xx,y+yy)-(x+xx,y+yy)
+ ;(x-xx,y-yy)-(x+xx,y-yy)
+ cal circledraw ;(x-yy,y+xx)-(x+yy,y+xx)
+ ;(x-yy,y-xx)-(x+yy,y-xx)
+
+ ex (sp),hl ;push x,y \ pop zz
+ xor a
+ ld d,a ;d=0
+ dec a ;-256<h<0 = $FF**
+ cp h ;h<0?
+ jr z,circlenext ;jump if zz<0
+
+ ld a,c ;yy
+ dec a ;89<a<128
+ add a,a ;a=2yy-2 ;nc
+ ld e,a ;de=a
+ sbc hl,de ;zz=zz-2yy+2
+ dec c ;yy--
+circlenext:
+ ld a,b ;xx
+ inc a ;0<a<92
+ add a,a ;2xx+2
+ inc a
+ ld e,a ;de=a
+ add hl,de ;zz=zz+2xx+3
+
+ pop de ;x,y
+ ld a,b
+ cp c
+ ret nc ;xx>=yy
+ inc b ;xx++
+ jr circloop
+
+circledraw: ;destr:de
+ psh hl
+ ld a,h ;hl=x,y
+ sub b ;bc=xx,yy
+ ld d,a ;d=x-xx
+ add hl,bc ;h=x+xx; l=y+yy
+ ld e,l ;e=y+yy
+ cal drawline ;(h-b,l+c)-(h+b,l+c)
+ ld a,l
+ sub c ;a=y again
+ sub c
+ ld l,a ;l=y-yy
+ ld e,l ;e=l=y-yy
+ cal drawline ;(h-b,l-c)-(h+b,l-c)
+ ld a,b ;swap xx and yy
+ ld b,c
+ ld c,a ;ex b,c
pop hl
- pop bc
ret
-#else
+
+drawbox: ;(d,e)-(h,l)
+ ld b,l ;Delta-y
ld l,e
boxloop:
cal drawline
inc e
dnz boxloop
ret
-#endif
drawfatline:
cal drawline
cal drawline
dec d
dec h
- jp drawline
+; jp drawline
;LINE (d,e)-(h,l)
;destroyes a
dnz LineLoopSteep
jr DoneLine
-drawcircle: ;(d,e),h ;de=x,y; h=z
- ld c,h ;c=yy=z
- ld a,h
- neg
- ld l,a ;l=-z
- xor a
- ld b,a ;b=xx=0
- dec a ;-$00**
- ld h,a ;hl=zz=-z
-circloop:
- psh de ;x,y
- ex (sp),hl ;push zz \ pop x,y
- cal circledraw ;(x-xx,y+yy)-(x+xx,y+yy)
- ;(x-xx,y-yy)-(x+xx,y-yy)
- cal circledraw ;(x-yy,y+xx)-(x+yy,y+xx)
- ;(x-yy,y-xx)-(x+yy,y-xx)
-
- ex (sp),hl ;push x,y \ pop zz
- xor a
- ld d,a ;d=0
- dec a ;-256<h<0 = $FF**
- cp h ;h<0?
- jr z,circlenext ;jump if zz<0
-
- ld a,c ;yy
- dec a ;89<a<128
- add a,a ;a=2yy-2 ;nc
- ld e,a ;de=a
- sbc hl,de ;zz=zz-2yy+2
- dec c ;yy--
-circlenext:
- ld a,b ;xx
- inc a ;0<a<92
- add a,a ;2xx+2
- inc a
- ld e,a ;de=a
- add hl,de ;zz=zz+2xx+3
-
- pop de ;x,y
- ld a,b
- cp c
- ret nc ;xx>=yy
- inc b ;xx++
- jr circloop
-
-circledraw: ;destr:de
- psh hl
- ld a,h ;hl=x,y
- sub b ;bc=xx,yy
- ld d,a ;d=x-xx
- add hl,bc ;h=x+xx; l=y+yy
- ld e,l ;e=y+yy
- cal drawline ;(h-b,l+c)-(h+b,l+c)
- ld a,l
- sub c ;a=y again
- sub c
- ld l,a ;l=y-yy
- ld e,l ;e=l=y-yy
- cal drawline ;(h-b,l-c)-(h+b,l-c)
- ld a,b ;swap xx and yy
- ld b,c
- ld c,a ;ex b,c
- pop hl
- ret
-
-
+;..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
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)
ld (linklosses),a ;reset number of losses
ret ;=ok
-;--------------
;---- 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
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
;---------- 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 128,57 ;field width (128-255), height (57-255)
.db 0 ;no additional lines, boxes
- .db 255
- ret
+
+ .db 255 ;last level
+ ret ;ending code
LevelDefM:
+ .db "Empty Arena",0
.db 8,4,15,15,0,0
.db $40,30,2,$C0,30,125, $00,2,64,$80,54,64
.db 128,57
.db 0
+ .db "Fast Fun :))",0
.db 8,0,18,12,5
.db %1110000,%10001000,%10001000,%10001000,%1110000,0
.db $40,30,2,$C0,30,125, $00,2,64,$80,54,64
.db 128,57
.db 0
+ .db "Two Circles",0
.db 8,5,18,12,0,0
.db $40,30,2,$C0,30,125, $00,2,64,$80,54,64
.db 128,57
- .db 4,40,26,20,0
- .db 4,90,40,11,0,0
+ .db 4,40,26,20,0
+ .db 4,90,40,11,0,0
LevelDefT: ;tron=no delay
+ .db "Empty Tron Level",0
.db 8,4,18,12,5
.db %1110000,%10001000,%10001000,%10001000,%1110000,0
.db $40,30,64,$C0,30,64, $00,30,64,$80,30,64
.db 128,57
.db 0
+LevelDefR: ;race
+ .db "Round and Round",0
+ .db 8,4,18,12,5
+ .db %1110000,%10001000,%10001000,%10001000,%1110000,0
+ .db $40,23,2,$C0,23,125, $40,35,2,$C0,35,125
+ .db 128,57
+ .db 63,27
+ .db 4,63,27,10,0,0
+
LevelDefC: ;ctf
+ .db "Default CTF",0
.db 8,4,18,12,5
.db %1110000,%10001000,%10001000,%10001000,%1110000,0
- .db $40,30,64,$C0,30,64, $00,30,64,$80,30,64
+ .db $40,23,2,$C0,23,125, $40,35,2,$C0,35,125
.db 128,57
- .db 10,10,50,50
+ .db 27,8,27,116
.db 0
;-----------------------------
;---------- data -------------
;-----------------------------
-wdPicture = 16
-wtPicture:
-.db %00000000,%00000000,%00000111,%10000000,%00000000,%00000000,%00000000,%00000000,%00000000,%00000000,%01110000,%00000000,%00000000,%00000000,%00000000,%00000000
-.db %00000000,%00000000,%00001111,%10000000,%00000000,%00000000,%00000000,%00000000,%00000000,%00000000,%01111000,%00000000,%00000000,%00000110,%01111011,%00100000
-.db %00000000,%00000000,%00011100,%00000000,%00000000,%00000000,%00000000,%00000000,%00000000,%00000000,%00011100,%00001110,%00000000,%00001001,%00010011,%01000000
-.db %00000000,%00000000,%00011000,%00011111,%00000000,%01111111,%11000000,%00111100,%00011110,%01111000,%00001100,%00011111,%00000000,%10100111,%00110000,%10000000
-.db %00000000,%00000000,%00111000,%00111111,%10000000,%11111111,%11100000,%11111110,%00111111,%11111100,%00001100,%00111011,%00000000,%10100001,%00001001,%01100000
-.db %00000000,%00000000,%00110000,%01110001,%11000001,%11000000,%01110001,%11100110,%01110011,%11001110,%00001100,%00110001,%10000000,%01001110,%01110010,%01100000
-.db %00000000,%00000000,%00110000,%01100000,%11000001,%10000000,%00111001,%10000000,%01100111,%11100110,%00001110,%01110001,%10000000,%00000000,%00000000,%00000000
-.db %00000000,%00000000,%00110000,%01100000,%11000001,%10110000,%00011011,%10000000,%11101110,%01110111,%00001110,%01110001,%10000000,%00000000,%00000000,%00000000
-.db %00000000,%00000000,%00110000,%01110001,%11000001,%10110000,%00011011,%00000000,%11001100,%00110011,%00000111,%11100001,%10000000,%00000000,%00000000,%00000000
-.db %00000000,%00000000,%00110000,%00110001,%10000001,%10110000,%00011011,%00000000,%11001100,%00110011,%00000011,%11000011,%10000000,%00000000,%00000000,%00000000
-.db %00000000,%00000000,%00111000,%00111011,%10000011,%10110000,%00011011,%00000000,%11001110,%01110011,%00000000,%00000011,%00110101,%01001001,%10000000,%00000000
-.db %00000000,%00000000,%00011000,%00011111,%00000011,%00110000,%00011011,%00000000,%11000111,%11100011,%10000000,%00000011,%01000101,%00010101,%01000011,%01100011
-.db %00000000,%00000000,%00011100,%00001110,%00000111,%00111000,%00111011,%10000000,%11000011,%11000001,%10000000,%00000111,%01100101,%01010101,%01000101,%01010100
-.db %00000000,%00000000,%00001110,%00111111,%10001110,%00011100,%01110001,%10000000,%11100000,%00000001,%11100000,%00001110,%00110111,%01011101,%10010101,%01100101
-.db %00000000,%00000000,%00000111,%11111011,%11111100,%00001111,%11100001,%11000000,%01100000,%00000000,%11111111,%11111100,%00010101,%01010101,%01000101,%01010101
-.db %00000000,%00000000,%00000011,%11100000,%11111000,%00000111,%11000000,%11000000,%01100000,%00000000,%00111111,%11111000,%01100101,%01010101,%01000110,%01010011
+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 %01100000,%01111100,%00000001,%11111111,%00000000,%11110000,%01111001,%11100000,%00110000,%01111100,%00010001,%11001001,%00001000,%00100000,%10000010,%00010000
+.db %11100000,%11111110,%00000011,%11111111,%10000011,%11111000,%11111111,%11110000,%00110000,%11101100,%00010001,%11000100,%10000001,%00000100,%10001110,%00001000
+.db %11000001,%11000111,%00000111,%00000001,%11000111,%10011001,%11001111,%00111000,%00110000,%11000110,%00001100,%00000010,%01100010,%10011100,%00010001,%00001000
+.db %11000001,%10000011,%00000110,%00000000,%11100110,%00000001,%10011111,%10011000,%00111001,%11000110,%00000011,%11000010,%00011100,%01100010,%00100001,%01101000
+.db %11000001,%10000011,%00000110,%11000000,%01101110,%00000011,%10111001,%11011100,%00111001,%11000110,%01111000,%00100001,%00000000,%00000001,%11000001,%01101000
+.db %11000001,%11000111,%00000110,%11000000,%01101100,%00000011,%00110000,%11001100,%00011111,%10000110,%10000101,%11100001,%00000000,%00000000,%00000001,%00010000
+.db %11000000,%11000110,%00000110,%11000000,%01101100,%00000011,%00110000,%11001100,%00001111,%00001110,%10010110,%00010001,%00000000,%00000000,%00000000,%11100000
+.db %11100000,%11101110,%00001110,%11000000,%01101100,%00000011,%00111001,%11001100,%00000000,%00001100,%01100100,%00001001,%00111111,%11111111,%11000000,%00000000
+.db %01100000,%01111100,%00001100,%11000000,%01101100,%00000011,%00011111,%10001110,%00000000,%00001100,%01000000,%10000001,%01000000,%00000000,%00000000,%00000000
+.db %01110000,%00111000,%00011100,%11100000,%11101110,%00000011,%00001111,%00000110,%00000000,%00011100,%01000000,%11000001,%01100101,%01001001,%10000011,%01100011
+.db %00111000,%11111110,%00111000,%01110001,%11000110,%00000011,%10000000,%00000111,%10000000,%00111000,%01000001,%00100001,%00110101,%00010101,%01000101,%01010100
+.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: ;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
+.db %00100000,%00000000,%00001110,%00110010,%00011001,%10011011,%01101010,%11100000,%00110011,%01101101,%11000111,%10000001,%00011100,%00000000,%00000000,%00001100
+.db %01001100,%00011000,%00000000,%00000100,%00011000,%11011111,%01100010,%11001100,%00110011,%01101101,%10000111,%11000001,%00011100,%00111000,%00011000,%10000010
+.db %01010010,%00100100,%01100000,%00011000,%00011111,%11011011,%11101110,%11111100,%00011111,%01111000,%11110110,%11100000,%11000000,%11000110,%00101001,%10000010
+.db %01100001,%11000011,%10011111,%11100000,%00001111,%10001001,%11001100,%01111000,%00001110,%00110000,%01100110,%01100000,%00111111,%00000001,%11000110,%01111100
+
+;.db %00000000,%00000001,%10000000,%00000000,%00001111,%10000000
txtMenu: .db "Mode",0 ;1st menu item
.db "Level",0 ;2nd
.db "Link",0 ;...
.db "Worms",0
.db "worm #",0
- .db 0
-posMenu: .dw $2418,$231E,$2824,$1F2A,$1730,$1936
+posMenu: .db 5
+ .dw $2418,$231E,$2824,$1F2A,$1730
txtMenuR: .db "controls",0
txtoMenu: .db "Back",0 ;1st menu item
.db "Lives",0 ;2nd
.db "Speed",0
.db "Rotation",0
.db "Growth",0
-posoMenu: .dw $2618,$251E,$2524,$222A,$1A30,$1C36
+posoMenu: .db 6
+ .dw $2618,$251E,$2524,$222A,$1A30,$1C36
+txtpMenu: .db "Resume",0 ;1st menu item
+ .db "Turn Off",0 ;2nd
+ .db "Contrast",$CF,5,0 ;...
+ .db "Exit",0
+pospMenu: .db 4
+ .dw $3418,$331E,$2F24,$3A2A
txtGame: .db "Singleplayer",0
txtGame1: .db "Peaworm",0
txtGame2: .db "Tron",0
txtNo: .db "No",0
txtKeyleft: .db ":left",0
txtKeyright:.db "/right",0
-txtLevsel: .db $CF," Select levels ",5,0
+posLevsel = $0320
+txtLevsel: .db $CF," SELECT LEVELS ",5,0
txtWaiting: .db "Waiting...",0
txtReceive: .db "Receiving..." ;,0
txtScore: .db "Score",0 ;follows txtDied
txtLeft: .db " left",0 ;follows txtScore
txthiscore:.db "HiScore:",0
+#ifdef readytext
txtReady: .db "Prepare!",0
txtposReady = 7
+#endif
+#ifndef coolzgfx
txtGO: .db 5,5,5,5,5," GAME OVER ",$CF,$CF,$CF,$CF,$CF,0
+#endif
datalevels: .dw LevelDef, LevelDefM
.dw LevelDefT,LevelDefM
.dw LevelDefM,LevelDefM
- .dw LevelDefM,LevelDefC
-nrlevels: .db 1,3,1,3,3,3,3,1 ;=defaults
+ .dw LevelDefR,LevelDefC
+nrlevels: .db 0,3,1,3,3,3,3,1 ;=defaults
_datalink = %0000001 ;linkplay
_datafoodl = %0000010 ;left=0 limit
gamerace = 6 ;used
datarace: .db %0000000,0,2,1,-1,-1, 8,10 ;Race (100 score, no collision)
gamectf = 7 ;used
-datactf: .db %1001000,0,4,1,-1,-1, 8, 9 ;CTF (90 score)
+datactf: .db %1001000,0,4,1,-1,-1, 8,10 ;CTF (100 score)
worm1set: .dw worm1p,worm1p
- .db %11110111,%00,-01,K_RIGHT,K_LEFT
+ .db %11110111,1,-01,K_RIGHT,K_LEFT
worm1name: .db "WORMY ",0
worm2set: .dw worm2p,worm2p
- .db %11111011,%01,-01,K_F2,K_F1
+ .db %11111011,0,-01,K_F2,K_F1
worm2name: .db "VIPER ",0
worm3set: .dw worm3p,worm3p
- .db %11111011,%00,-01,K_COMMA,K_STO
+ .db %11111011,1,-01,K_COMMA,K_STO
worm3name: .db "NIBBLER ",0
worm4set: .dw worm4p,worm4p
- .db %11111011,%01,-01,K_PLUS,K_ENTER
+ .db %11111011,0,-01,K_PLUS,K_ENTER
worm4name: .db "JIM ",0
defhiscrpos:
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 "
+.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 " shiar0@hotmail.com",0
+.db " wormy@shiar.org",0
defspritesz = 4
defspriteimg: .db %01100000
.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: