X-Git-Url: http://git.shiar.nl/wormy.git/blobdiff_plain/fb53f987bcd8b3a1abf600eee973cb673552d1c3..5df4f3685fcfcfe6d79661a8f54d256c2e987a59:/worm.z80 diff --git a/worm.z80 b/worm.z80 index d8f61e0..2db4d9c 100644 --- a/worm.z80 +++ b/worm.z80 @@ -1,7 +1,7 @@ ; Title : Worm -; Version : 0.92 -; Release Date : soon (I hope) -; Filename : worm.86p (3404) +; Version : 89% +; Release Date : april 2000??? +; Filename : worm.86p (4kb) ; Author(s) : Shiar ; Email Address : shiar@mailroom.com ; ICQ UIN : #43840958 @@ -16,28 +16,102 @@ ;----------- TO-DO ----------- ;----------------------------- -; Shiar 3.III.00 +; 89% = DONE -;Feel like doing something? (name indicates who's working on it) -; * linkplay -; * singleplay ending -; * titlescreen -; * make linkplay available for all gametypes (not just deathmatch) -; * two worms collide with heads -> both should die -; * game types: -;1) * ctf: take enemy flag (right-bottom) and return to your flag (left-top) -;1) * domination?: take control points by running over them and hold them -;1)* sprites for picks instead of blocks +; 3% * linkplay +; 1% * titlescreen +; 2% * make linkplay available for all gametypes (not just deathmatch) +; * game types: +; 1% * ctf: take enemy flag (right-bottom) and return to your flag (left-top) +; 1% * domination?: take control points by running over them and hold them +; * complete readme (+custom level info) +; 2% * ... (pollish, &&&) -;1) Working on a new pickup-system allowing more than one "food" and different pickup-handling +; 99% = beta release -#include "TI86.inc" +;100% = bugs fixed + levels done + +;----------------------------- +;----------------------------- +;--------- W O R M --------- +;----------------------------- +;----------------------------- + +#define cal call +#define psh push +#define dnz djnz + +#include "asm86.h" +#include "ti86asm.inc" + +_SHRACC = $4383 +_SHLACC = $438B +_divHLby10 = $4044 ;hl=hl/10 +_divAby10 = $4DAF ;a=a/10 +_HLTIMES10 = $41BF ;hl=hl*10 +_cphlde = $403C +_clrWindow = $4A86 ;clear screen +_asapvar = $D6FC ;own name (worm) +_MOV4B = $429B ;4x ld (de),(hl) +_MOV5B = $4297 ;5x ld (de),(hl) +_mov9b = $4283 ;9x ld (de),(hl) +_ldHLind = $4010 ;ld hl,(hl) +_swapt_ = $45F3 ;ex_ahl_bde +_Get_Word_ahl = $521D ;ld de,(ahl) +_Set_Word_ahl = $5221 ;ld (ahl),de +_INC_PTR_AHL = $4637 ;ahl=ahl+1 +_AHL_PLUS_2_PG3 = $4C3F ;ahl=ahl+2 +_SET_ABS_SRC_ADDR = $4647 ;set source for mm.ldir =ahl +_LOAD_ABS_SRC_ADDR = $5209 ;ahl = mm.ldir source +_SET_ABS_DEST_ADDR = $5285 ;set destination for mm.ldir = ahl +_SET_MM_NUM_BYTES = $464F ;number of bytes for mm.ldir = ahl +_mm_ldir = $52ED ;24bit ldir +_RAM_PAGE_1 = $47E3 ;set $8000+ to page 1 +_RAM_PAGE_7 = $47F3 +_PTEMP_END = $D29A +_load_ram_ahl = $462F ;ahl->page+hl +_writeb_inc_ahl = $5567 ;ld (ahl),c + +;----------------------------- +;------- data storage ------- +;----------------------------- + +;--- permanent + +resbit = 2 ;and%111110** + +ScrBuffer = $8820 ;-A7FF (20*FF=1FE0) +worm1p = $A800 ;-ABFF (400) %10101O00 +worm1 = $AC00 ;-AC1D (30d) +worm2 = $AC1E ;-AC3B (1E) +worm3 = $AC3C ;-AC59 (1E) +worm4 = $AC5A ;-AC77 (1E) +balls = $AC78 ;-ACFF (3x45d) +SinCosTable = $AD00 ;-AE00 (4x40) + ;free $AE01 ;-AFFF (1FF) +worm2p = $B000 ;-B3FF (400) %10110O00 +DispBuffer = $B400 ;-B790 (10x57d) + ;free $B791 ;-B7FF (6F) +worm3p = $B800 ;-BBFF (400) %10111O00 + ;free $BC00 ;-BFFF (400) + + ;program $D748 ;-E7FF (106D+4A) + ;free $E800 ;-EFFF (800) +worm4p = $F000 ;-F3FF (400) %11110O00 +leveldata = $F400 ;-FA70 (<=671) + +;--- temporary + +templevels = $B400 ;(3*levelstr_on_calc) ;----------------------------- ;------- program start ------- ;----------------------------- .org _asm_exec_ram + +WormVersion = 089 + start: nop jp Start @@ -45,11 +119,13 @@ start: .dw WormMsg .dw WormIcon +WormMsg: + .db "WORM by SHIAR -- pre-beta 89%",0 WormIcon: .db 9,2 - .db %10010111,%01101111 + .db %10010110,%01101111 .db %10110101,%01001011 - .db %11110111,%01001001 + .db %01110011,%01001001 .db %00000011,%10000000 .db %00000001,%11100000 .db %00111000,%11111000 @@ -57,13 +133,186 @@ WormIcon: .db %11101111,%00001111 .db %11000011,%10000000 +levelhead = 'w' +levelhead2 = 89 ;worm levels header = "89" + Start: ld (SpSave),sp - call _runIndicOff - call _flushAllMenus - call _clrLCD - res 2,(iy+13) ;appAutoScroll + cal _runindicoff + cal _flushallmenus + cal _clrLCD + + cal _RAM_PAGE_7 + ld hl,$BFFF ;VAT start + ld bc,templevels +searchloop: + ld de,(_PTEMP_END+1) ;VAT end + or a ;nc + sbc hl,de ;hlahl +levelloaded: + ld (hiscrposa),a + ld (hiscrposhl),hl + cal _RAM_PAGE_1 ;&&& + res 2,(iy+13) ;appAutoScroll ld a,r ld (Seed),a @@ -73,7 +322,7 @@ Start: ld hl,TrigPrecalc ld de,SinCosTable - push de ; >> 1 + psh de ; >> 1 ld bc,65 ldir dec hl @@ -83,7 +332,7 @@ MirrorSineWave: ld a,(hl) ld (de),a inc de - djnz MirrorSineWave + dnz MirrorSineWave pop hl ; << 0k ld b,128+64 NegativeSineWave: @@ -92,36 +341,43 @@ NegativeSineWave: ld (de),a inc hl inc de - djnz NegativeSineWave + dnz NegativeSineWave ;----------------------------- ;---------- menu ------------- ;----------------------------- + ld a,1 + ld (curlevel),a DisplayMenu: - ld a,2 - ld (nrworms),a -gomainMenu: - call _clrWindow + cal _clrWindow ld hl,txtWelcome - call _puts - ld de,$0205 + cal _puts + ld de,$0207 + ld (_curRow),de + cal _puts ;--- + dec e ;$0206 + ld (_curRow),de + cal _puts ;Level + dec e ;$0205 ld (_curRow),de - call _puts ;txtOptions + cal _puts ;Worms: 2 dec e ;$0204 ld (_curRow),de ld hl,(CURtxtGame) - call _puts + cal _puts ;Singleplayer xor a + cal menudraw + jr howmanyworms mainMenu: - call menucall + cal menucall jr nz,notselect select: ld a,b - or a - jr nz,gooptionsMenu - jp LetsGetThisPartyOn + dec a ;2nd item + jp z,changeworms + jp LetsGetThisPartyOn ;1/3/4 notselect cp K_EXIT jp z,ExitNoStats @@ -129,48 +385,36 @@ notselect ld a,b jr nz,mainMenu or a - jr z,Variation + jr z,changegame + dec a + jr z,changenrworms + dec a + jp nz,LetsGetThisPartyOn -gooptionsMenu: - call _clrWindow - ld hl,txtWelcome - call _puts - ld hl,txtLevel - ld de,$0205 - ld (_curRow),de - call _puts ;txtLevel - dec e ;$0204 - ld (_curRow),de - call _puts ;txtWorms - ld a,(nrworms) - add a,'0' - call _putc - xor a -optionsMenu: - call menucall - jr nz,notopselect -opselect: - ld a,b - or a - jr nz,changelevel -changeworms: - ld hl,nrworms - inc (hl) - ld a,4 - cp (hl) - jr nc,gooptionsMenu - ld (hl),2 - jr gooptionsMenu changelevel: - jr optionsMenu - -notopselect: - cp K_EXIT - jr z,gomainMenu - ld a,b - jr optionsMenu + ld hl,Gametype + ld d,0 + ld e,(hl) + ld hl,nrlevels + add hl,de + ld d,(hl) ;max level for sel.game + ld a,1 +curlevel =$-1 + inc a + cp d + jr c,changedlevel + ld a,1 +changedlevel: + ld (curlevel),a +dispcurlevel: + ld hl,$0806 + ld (_curRow),hl + cal showA + jr mainMenu -Variation: +changegame: + ld a,1 + ld (curlevel),a ld a,0 Gametype =$-1 ld hl,txtGame2 @@ -184,76 +428,252 @@ okilydokily: ld de,$0204 ld (_curRow),de ld (CURtxtGame),hl - call _puts + cal _puts ld (NEXTtxtGame),hl - ld a,b - jp mainMenu +howmanyworms: + ld a,(Gametype) + cp 2 + ld a,1 + jr c,oneworm +nrworms =$+1 + ld a,2 +oneworm: + jr dispnrworms ;jr mainMenu -menucall: - push af - ld hl,$0004 - ld (_curRow),hl - ld a,' ' - call _putc - ld hl,$0005 - ld (_curRow),hl - call _putc - pop af - push af - ld h,0 - add a,4 - ld l,a +changenrworms: + ld a,(Gametype) + cp 2 + jr c,mainMenu ;type 0/1 + ld hl,nrworms + ld a,(hl) + inc a + cp 5 + jr c,changednrworms + ld a,1 +changednrworms: + ld (hl),a +dispnrworms: + ld hl,$0905 ld (_curRow),hl - ld a,'*' - call _putc - pop af - ld b,a -menukeys: + cal showA + ld a,(curlevel) + jr dispcurlevel ;mainMenu + +menucall: + psh bc +menuwaitkey: halt \ halt - call _getcsc + cal GET_KEY or a - jr z,menukeys + jr z,menuwaitkey + pop bc ;pop a as b cp K_UP - jr nz,notup -updown: - ld a,b - xor 1 - ld b,a - inc a ;nz - ret -notup: + cal z,menuup cp K_DOWN - jr z,updown + cal z,menudown cp K_ENTER ret z cp K_SECOND ret ;z=select +menupos: + ld a,b + add a,4 + ld h,0 + ld l,a + ld (_curRow),hl + ret +menuclr: + cal menupos + ld a,' ' + jp _putc +menudown: + cal menuclr + inc b + jr menuupdown +menuup: + cal menuclr + dec b +menuupdown: + ld a,b + and %11 ;4=0;-1=3 +menudraw: + ld b,a + cal menupos + ld a,'*' + jp _putc ;a=K_STO + +changeworms: + cal _clrWindow + ld hl,txtName + cal _puts ;"Enter name player " + ld a,(Gametype) + cp 2 + ld a,1 + jr c,wormnrname + ld a,(nrworms) +wormnrname: + add a,'0' + cal _putc + sub '0' + add a,a ;2x + ld e,a + add a,a ;4x + add a,a ;8x + add a,a ;16x + add a,e ;18x + ld e,a + ld d,0 + ld ix,worm1name-18 + add ix,de + ld a,maxnamelength + cal entername + ld (ix),0 + jp DisplayMenu + +entername: + ld h,1 + ld l,h + ld (_curRow),hl + ld (namelength),a +enternameloop: + ld a,'_' + cal _putc + ld hl,_curCol + dec (hl) +nokeypressed: + halt + cal GET_KEY + or a + jr z,nokeypressed + + cp K_DEL + jr nz,continue +backspace: + ld hl,namelength + ld a,(hl) + cp maxnamelength + jr nc,nokeypressed + inc (hl) + + dec ix + ld a,' ' + ld (ix),a + cal _putc + ld hl,_curCol + dec (hl) + dec (hl) + jr enternameloop +continue: + cp K_ENTER + ret z + cp K_EXIT + ret z + + ld hl,namelength + dec (hl) + ret z + + ld hl,chartable + ld e,a + ld d,0 + add hl,de + ld a,(hl) + or a + jr z,nokeypressed + + ld (ix),a + cal _putc + inc ix + cal waitnokeypressed + jr enternameloop + +waitnokeypressed: + halt + cal GET_KEY + or a + jr nz,waitnokeypressed + ret + +namelength: + .db 0 +chartable: + .db 0,".<>!",0,0,0,0 + .db 0,"xtoje0",0 ;enter..clear + .db " wsnid9",0 ;(-)..custom + .db "zvrmhc8",0 ;dot..del + .db "yuqlgb7#" ;0..xvar + .db 0,"-pkfa6'" ;on..alpha + .db "54321*",0,0 ;F5..more + +;--proc + +skiplevel: ;@hl - destr:ab - alter:hl + inc hl + inc hl + inc hl + inc hl ;skip 4 + ld b,(hl) ;spritesize + inc b +skipsprite: + inc hl + dnz skipsprite + ld b,(hl) ;balls + inc b + inc b ;skip 6 + ld a,c + and _datasingl + jr nz,skipworms + inc b ;multiplayer lvl + inc b + inc b ;skip other 3 worms (9 bytes) +skipworms: + ld a,b + add a,a + add a,b + ld b,a ;3x(balls+2) +skipballs: + inc hl + dnz skipballs + cal skiplines ;lines +skiplines: ;boxes + ld a,(hl) ;lines/boxes + add a,a + add a,a + inc a + ld b,a ;4x(hl)+1 +skiplb + inc hl + dnz skiplb + ret + ;----------------------------- ;-------- start game --------- ;----------------------------- LetsGetThisPartyOn: - ld hl,Gametype - ld a,(hl) - add a,a - add a,(hl) + ld a,$17 ;no exit + ld (CheckExit),a ;set exit state + + ld hl,gamesdata + ld a,(Gametype) ld e,a ld d,0 - ld hl,gamesdata add hl,de - ld a,(hl) - push af + ld (gameCar),a + + add hl,de + ld e,8 ;=de + add hl,de + + ld c,a and _datasingl jr z,notsingle ld a,1 ld (nrworms),a notsingle: - pop af - ld (gameCar),a - push af - + ld a,c and _datascore ld de,$FF64 ;virt.infinate jr z,setscorelimit @@ -261,54 +681,57 @@ notsingle: setscorelimit: ld (scorelimit),de - inc hl - call _ldHLind - pop af - push hl + cal _ldHLind ;ld hl,(hl) + ld a,(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,c and _datalink jr z,GameOver linkmatch: - call _clrWindow - - -; in a,(7) -; and %11 -; cp %11 + cal _clrWindow ld a,WormVersion -; jr nz,host - call send - jr c,host - -client: - ld hl,txtReceive - call _puts - call receive - cp WormVersion - ret nz - jr multiplayer + cal send + jr c,client ;2nd host: ld hl,txtWaiting - call _puts - call receive + cal _puts + cal receive cp WormVersion - ret nz - call send + jp nz,LinkBreak + cal send + ld hl,SwapPos ld (hl),$f6 + jr multiplayer + +client: + ld hl,txtReceive + cal _puts + cal receive + cp WormVersion + jp nz,LinkBreak multiplayer: ld a,2 ld (nrworms),a - ld de,LevelsDM ;----------------------------- ;--------- game over --------- ;----------------------------- GameOver: - call _clrLCD + cal _clrLCD ld hl,0 ld (worm1+died),hl ;+died=0 \ +score1=0 @@ -321,32 +744,55 @@ GameOver: ld (worm2+score+1),hl ld (worm3+score+1),hl ld (worm4+score+1),hl - ld a,l - ld (Level),a ld hl,worm1set+4 ld de,worm1+lives - call _MOV5B ;9xld(de),(hl) - call _mov9b +;&&&>* + cal _MOV5B ;9xld(de),(hl) + cal _mov9b ld hl,worm2set+4 ld de,worm2+lives - call _MOV5B - call _mov9b + cal _MOV5B + cal _mov9b ld hl,worm3set+4 ld de,worm3+lives - call _MOV5B - call _mov9b + cal _MOV5B + cal _mov9b ld hl,worm4set+4 ld de,worm4+lives - call _MOV5B - call _mov9b - pop de + cal _MOV5B + cal _mov9b + + ld a,(Gametype) + cp 1 ;=peaworm + jr nz,worminitdone + ld (worm1+lives),a ;&&&<* +worminitdone: + pop hl StartLevel: - ex de,hl ld de,Left + ld a,(hl) + inc a ;=255? + jp nz,nextlevel + + psh hl + ld b,150 +waitsomemore: + halt + dnz waitsomemore + cal _clrWindow + pop hl +;show end msg or smtn + ld bc,Exit + psh bc ;where to go afterwards + inc hl ;location of ending-code + jp (hl) ;go there ("call") +nextlevel: ldi ld de,Speed ldi + ld de,peagrowth + ldi ld a,(hl) ld (worm1+grow),a ld (worm2+grow),a @@ -355,14 +801,35 @@ StartLevel: ld (beginsize),a inc hl + ld a,(hl) + inc hl + or a + jr z,defaultsprite + ld d,h + ld e,l ;ld de,hl + ld c,a + ld b,0 ;bc=sprite size + add hl,bc ;hl=behind sprite + jr setsprite +defaultsprite: + ld a,defsprsize + ld de,peasprite +setsprite: + ld (sprsize),a + ld (spritepos),de + ld a,(hl) inc hl ld (nrballs),a or a jr z,toobad_noballs - ld de,ballpos - ldi - ldi + ld c,a + add a,a + add a,c + ld c,a + ld b,0 + ld de,balls + ldir toobad_noballs: #ifdef 0 @@ -376,19 +843,19 @@ nohunter: ex de,hl ld (thislevel),de - push de + psh de ld hl,worm1set ld de,worm1+head - call _MOV4B + cal _MOV4B ld hl,worm2set ld de,worm2+head - call _MOV4B + cal _MOV4B ld hl,worm3set ld de,worm3+head - call _MOV4B + cal _MOV4B ld hl,worm4set ld de,worm4+head - call _MOV4B + cal _MOV4B pop de ld hl,worm1 @@ -398,23 +865,15 @@ nohunter: jr nz,worminit ld b,4 worminit: - push bc ; >> 1 - ld a,(de) - ld (hl),a ;d - inc de - inc hl + psh bc ; >> 1 + ex de,hl + ldi ;d ld a,SinCosTable/256 - ld (hl),a - inc hl - - ld a,(de) - ld (hl),a ;y - inc de - inc hl - ld a,(de) - ld (hl),a ;x + ld (de),a inc de - inc hl + ldi ;y + ldi ;x + ex de,hl xor a ld (hl),a ;y2 @@ -424,7 +883,7 @@ worminit: ld bc,(worm2-worm1)-5 add hl,bc pop bc ; << 0k - djnz worminit + dnz worminit ;-------- draw level --------- @@ -437,7 +896,7 @@ worminit: sub 57 ld (FieldHeight),a add a,57-5 - push de ; >> levelp + psh de ; >> levelp ld l,a ld h,0 add hl,hl @@ -448,8 +907,8 @@ worminit: ex de,hl ld hl,ScrBuffer - push hl ; >> 1 - push de ; >> 2 + psh hl ; >> 1 + psh de ; >> 2 ld de,ScrBuffer+1 ld bc,63 ld (hl),%11111111 @@ -461,12 +920,12 @@ worminit: ClearLine: ld (hl),c inc hl - djnz ClearLine - push hl ; >> 3 + dnz ClearLine + psh hl ; >> 3 ld a,(FieldWidth) add a,126 - push af ; >> 4 + psh af ; >> 4 and %11111000 rra rra @@ -483,7 +942,7 @@ ClearLine: VertShift: rra rr c - djnz VertShift + dnz VertShift NoVertShift: ld (hl),a inc hl @@ -505,21 +964,21 @@ NoVertShift: or a jr z,NoLines DrawLines: - push af ; >> 1 - call loaddrawdata - push hl ; >> 2 + psh af ; >> 1 + cal loaddrawdata + psh hl ; >> 2 ld l,(hl) ld h,a - call Line + cal Line inc d inc h - call Line + cal Line inc e inc l - call Line + cal Line dec d dec h - call Line + cal Line pop hl ; << 1 inc hl pop af ; << 0k @@ -532,12 +991,12 @@ NoLines: or a jr z,noboxes drawboxes: - push af - call loaddrawdata - push hl + psh af + cal loaddrawdata + psh hl ld l,(hl) ld h,a - call drawbox + cal drawbox pop hl inc hl pop af @@ -547,16 +1006,15 @@ noboxes: ;----------------------------- - push hl ; >> levelp new - call showstats + psh hl ; >> levelp new + cal showstats ld a,(gameCar) and _datafood jr z,nofood - call NewPea - call DrawPea + cal NewPea nofood: ld bc,(worm1+pos) - call DisplayField + cal DisplayField ld hl,$FDE0 ld de,$FDE1 ld (hl),%11111111 @@ -566,7 +1024,7 @@ nofood: ld (_curRow),hl set 3,(iy+5) ld hl,txtReady - call _puts + cal _puts res 3,(iy+5) ld a,0 @@ -597,7 +1055,7 @@ initfinished: ld b,0 ReadyDelay: halt - djnz ReadyDelay + dnz ReadyDelay ;----------------------------- ;----------- LOOP ------------ @@ -605,7 +1063,7 @@ ReadyDelay: GameLoop: ld bc,(worm1+pos) - call DisplayField + cal DisplayField ld a,1 flashtime =$-1 @@ -633,18 +1091,18 @@ Delay: jr nz,Delay NoDelay: - call handlethatneatlittleball + cal handlethoseneatlittleballs ld ix,worm1 ld a,(nrworms) ld b,a handleworms: - push bc - call HandleWorm + psh bc + cal HandleWorm ld bc,worm2-worm1 add ix,bc pop bc - djnz handleworms + dnz handleworms ;----------------------------- ;---------- keys ------------- @@ -654,55 +1112,24 @@ HandleKeys: ld a,%10111111 out (1),a in a,(1) - rla - jr c,NotPaused + rla ;MORE? + jr c,CheckExit ld bc,$0103 out (c),b - halt + halt ;pause/off ld b,11 out (c),b -NotPaused: - rla +CheckExit: + rla ;=$17 (c=EXIT-key) + ;or$A7 (c=0) jp c,GameLoop - jr Exit ;&& + jr Exit WormDead: ld a,2 ld (flashtime),a - - ld h,(ix+tail+1) - ld l,(ix+tail) - ld d,(ix+head+1) - ld e,(ix+head) - jr DoesWormTailEqualsWormHead ;chk4 size=0 -removewormloop: - ld c,(hl) - inc hl - ld b,(hl) - inc hl - res resbit,h - push hl - call res4pixels - pop hl - inc (ix+grow) -DoesWormTailEqualsWormHead: - call _cphlde - jr nz,removewormloop - - ld a,(gameCar) - and _datasingl - jr nz,safewormsizedone - ld a,0 -beginsize =$-1 - ld (ix+grow),a -safewormsizedone: - - ;de=ix+head - ld (ix+tail+1),d - ld (ix+tail),e - ld a,50 - ld (ix+delay),a + ld (ix+delay),respawndelay thislevel =$+1 ld de,0 @@ -717,41 +1144,44 @@ thislevel =$+1 inc (ix+died) dec (ix+lives) - push af + psh af ld de,10 - call DecScore + cal DecScore pop af ret nz ;HandleWorm done ld a,(gameCar) and _datalivel ret z + ld a,$A7 ;exit@end of turn + ld (CheckExit),a ;set exit state + ret ;finish turn Exit: ld sp,0 ;pop all SpSave = $-2 - call _clrWindow + cal _clrWindow ld hl,txtGO - call _puts + cal _puts ld hl,txtGame CURtxtGame =$-2 - call _puts + cal _puts ld de,0002 ld (_curRow),de - call showLevel + cal showLevel ld de,$0B03 ld (_curRow),de ld hl,txtDied - call _puts - call _puts ;txtScore + cal _puts + cal _puts ;txtScore xor a ld (_curCol),a - ld b,2 -nrworms =$-1 + ld a,(nrworms) + ld b,a ld hl,worm1+died displayWormStats: - push bc - push hl + psh bc + psh hl ld bc,input-died add hl,bc ;+input @@ -767,7 +1197,7 @@ hostLinkIndic: ld a,8 ld (_curCol),a ld a,b - call _putc + cal _putc xor a ld (_curCol),a dec hl @@ -775,56 +1205,86 @@ NoLinkIndic: inc hl inc hl inc hl ;+name - call _puts + cal _puts pop hl - push hl + psh hl ld a,13 ld (_curCol),a ld a,(hl) ;worm+died - push hl - call showA + psh hl + cal showA pop hl ld a,16 ld (_curCol),a inc hl ;worm+score - call _ldHLind ;ld hl,(hl) - call showHL ;worm+score + cal _ldHLind ;ld hl,(hl) + cal showHL ;worm+score pop hl ld bc,worm2-worm1 add hl,bc pop bc - djnz displayWormStats + dnz displayWormStats + + ld a,(Gametype) + or a ;singleplayer (0) only + jr nz,hilevelcheckdone +checkhilevel: + ld hl,nrlevels + ld a,(Level) + inc a + cp (hl) + jr c,hilevelcheckdone + ld (hl),a ;save local + ld c,a + ld a,0 +hilvlposa =$-1 + ld hl,0 +hilvlposhl =$-2 ;save external + cal _writeb_inc_ahl ;ld (ahl),c +hilevelcheckdone: ld a,(gameCar) and _datasingl jr z,hiscorecheckdone checkhiscore: - ld de,(worm1+score) -HiScore =$+1 - ld hl,0 - ld a,e - cp l - jr c,NotNewHigh - ld a,d - cp h - jr c,NotNewHigh - ld (HiScore),de - ex de,hl ;disp.new hiscore -NotNewHigh: + cal loadhiscoreposinahl + cal _Get_Word_ahl ;de=old_hi + psh de + cal _RAM_PAGE_1 ;&& + pop de + ld hl,(worm1+score) + + ld a,h ;New + cp d ;Old + jr c,NotNewHigh ;NewOld + + ld a,e ;old + cp l ;new + jr nc,NotNewHigh ;new=Old ex de,hl + cal loadhiscoreposinahl + cal _Set_Word_ahl ;de->(ahl) + cal _RAM_PAGE_1 + +NotNewHigh: ;de=current hiscore + ld hl,$0807 + ld (_curRow),hl ld hl,txthiscore - call _puts - ex de,hl - call showHL + cal _puts + ex de,hl ;pop + cal showHL hiscorecheckdone: waitkey: halt halt - call _getcsc + cal GET_KEY cp K_ENTER jp z,DisplayMenu ; cp K_EXIT @@ -844,25 +1304,35 @@ ExitNoStats: ld hl,_asapvar rst 20h ;_ABS_MOV10TOOP1 rst 10h ;_FINDSYM - call _swapt_ ;_ex_ahl_bde - ld de,4 + ld hl,4 + xor a add hl,de - adc a,0 - call _SET_ABS_DEST_ADDR + adc a,b ;ahl=bde+4 + cal _SET_ABS_DEST_ADDR xor a - ld hl,start - call _SET_ABS_SRC_ADDR - ld hl,end-start - call _SET_MM_NUM_BYTES - call _MM_LDIR - -; xor a -; ld (_asapvar+1),a + ld hl,_asm_exec_ram + cal _SET_ABS_SRC_ADDR + ld hl,end-_asm_exec_ram + cal _SET_MM_NUM_BYTES + cal _mm_ldir + res 4,(iy+9) set 2,(iy+13) jp _clrWindow +loadhiscoreposinahl: + ld a,(Gametype) + or a +externalhiscoresavepos: + ld a,0 +hiscrposa =$-1 + ld hl,0 +hiscrposhl =$-2 + ret z ;(Gametype)=0 + cal _AHL_PLUS_2_PG3 + ret + ;----------------------------- ;----------- worm ------------ ;----------------------------- @@ -873,22 +1343,22 @@ sendbyte =$-1 ld b,(ix+left) dec b jr z,receivefirst - call send - call receive + cal send + cal receive ld l,a ret receivefirst: - push af - call receive + psh af + cal receive ld l,a pop af - push hl - call send + psh hl + cal send pop hl ret inkeys: ;use jp not call! - out (1),a + out (1),a ;nop\nop in a,(1) ld b,a and (ix+right) @@ -899,23 +1369,79 @@ inkeys: ;use jp not call! notright: ld a,b and (ix+left) - jr z,donediddelydone + ret z ld a,l sub 8 ld l,a - jr donediddelydone + ret + +chkinput: + ld bc,donediddelydone + psh bc ;ret-dest. +inputcall: + ld a,(ix+input) + or a + jr nz,inkeys + jr inlink + +respawncheck: + cp respawndelay-1 + jr nz,unnamedlabel +removeworm: + ld h,(ix+tail+1) + ld l,(ix+tail) + ld d,(ix+head+1) + ld e,(ix+head) + jr DoesWormTailEqualsWormHead ;chk4 size=0 +removewormloop: + ld c,(hl) + inc hl + ld b,(hl) + inc hl + res resbit,h + psh hl + cal res4pixels + pop hl + inc (ix+grow) +DoesWormTailEqualsWormHead: + cal _cphlde + jr nz,removewormloop + + ld a,(gameCar) + and _datasingl + jr nz,safewormsizedone + ld a,0 +beginsize =$-1 + ld (ix+grow),a +safewormsizedone: + + ;de=ix+head + ld (ix+tail+1),d + ld (ix+tail),e + +unnamedlabel: + cp 1 + ld h,a + jr nz,saverespawncounter +respawndue: + ld l,a + cal inputcall + ld a,h ;previous + cp l ;changed? + ret z +saverespawncounter: + ld (ix+delay),h + ret ;------- handle worm --------- HandleWorm: - dec (ix+delay) - ret nz - inc (ix+delay) + ld a,(ix+delay) + dec a + jr nz,respawncheck + ld l,(ix+heading) - ld a,(ix+input) - or a - jr nz,inkeys - call inlink + jr chkinput donediddelydone: ld a,l ld (sendbyte),a @@ -930,7 +1456,7 @@ donediddelydone: ;-------- move worm ---------- Wormmove: - push bc ; >> pos + psh bc ; >> pos ld a,(hl) add a,a add a,d @@ -976,7 +1502,7 @@ notmoveY: ;bc=newpos xor 3 ld d,a GotFour: - call chk4pixels + cal chk4pixels rl d jp nc,Drawworm @@ -989,48 +1515,58 @@ Hitworm: jp z,WormDead ld a,h and _datahunt - call nz,checkhitotherworm + cal nz,checkhitotherworm ld hl,0 PeaY =$-2 PeaX =$-1 + ld a,(sprsize) + inc a + ld d,a ld a,b sub h inc a - cp 4 + cp d ;=(sprsize)+1 jp nc,WormDead ld a,c sub l inc a - cp 4 + cp d jp nc,WormDead - call DrawPea + cal DrawPea ;remove pea ld a,(ix+grow) add a,15 +peagrowth =$-1 ld (ix+grow),a - call NewPea + cal NewPea ld hl,Left dec (hl) - push af + psh af ld de,10 - call IncScore + cal IncScore pop af jr nz,still_alive_not_dead ld a,(gameCar) and _datafoodl jr z,still_alive_not_dead + ld a,(Gametype) + or a + jp nz,Exit ;stack restored + ld hl,Level ld a,(hl) inc (hl) + ld l,a ;hl=Level + ld h,0 + add hl,hl + add hl,hl + cal _HLTIMES10 + ex de,hl + cal IncScore ;score+(40*level) pop hl ; << call pop hl ; << call - pop de ; << levelp new - cp NUM_LEVELS - jp z,Exit - ld a,(gameCar) - and _datanextl - jp nz,StartLevel - jp Exit + pop hl ; << levelp new + jp StartLevel ;----------------------------- @@ -1056,7 +1592,7 @@ nextotherwormbit: nothit1: inc hl res resbit,h - call _cphlde + cal _cphlde jr nz,nextotherwormbit ret @@ -1072,9 +1608,9 @@ nextlaphalf: jr nz,nolap cp (ix+reserv) jr z,nolap - push bc + psh bc ld de,20 - call IncScore + cal IncScore pop bc xor a nolap: @@ -1082,11 +1618,11 @@ nolap: ret otherwormHIT: - push ix + psh ix ld de,10 - call IncScore + cal IncScore ld ix,worm1 - call WormDead + cal WormDead pop ix pop bc still_alive_not_dead: @@ -1096,14 +1632,14 @@ still_alive_not_dead: Drawworm: ld a,(gameCar) and _datahunt - call nz,HuntingTimeScore + cal nz,HuntingTimeScore ld c,(ix+pos) ld b,(ix+pos+1) ld a,(gameCar) and _datalaps - call nz,checkhitlapline + cal nz,checkhitlapline ld l,(ix+head) ld h,(ix+head+1) @@ -1115,7 +1651,7 @@ Drawworm: ld (ix+head),l ld (ix+head+1),h - call set4pixels + cal set4pixels ld a,(ix+grow) dec a @@ -1135,14 +1671,14 @@ removetail: ld (ix+tail+1),h res4pixels: - call ResPixel + cal ResPixel inc b - call ResPixel + cal ResPixel inc c - call ResPixel + cal ResPixel dec b ResPixel: - call FindPixel + cal FindPixel cpl and (hl) ld (hl),a @@ -1152,35 +1688,86 @@ ResPixel: ;---------- ball ------------- ;----------------------------- -handlethatneatlittleball: +handlethoseneatlittleballs: ld a,0 nrballs =$-1 or a ret z -ballpos =$+1 - ld bc,$0503 - call res4pixels + + ld hl,balls + ld b,a +handleballs + psh bc + psh hl + ld c,(hl) + inc hl + ld b,(hl) + inc hl + ld d,(hl) + cal handleball + dec c + pop hl + ld (hl),c + inc hl + ld (hl),b + inc hl + ld (hl),d + inc hl + pop bc + dnz handleballs + ret + +handleball: + cal res4pixels dec c - ld e,b + ballxmove: - inc b ;=%000100 dec=%000101 - call checkballhit - jr z,ballxdone - ld b,e - ld hl,ballxmove - call letsmovetheotherway -ballxdone: - ld e,c + bit 0,d ;1=L; 0=R + jr z,ballright +ballleft: + dec b + cal checkballhit + jr z,ballymove + inc b ;undo + res 0,d ;go right + jr ballymove +ballright: + inc b + cal checkballhit + jr z,ballymove + dec b ;back + set 0,d ;>left + ballymove: - inc c ;=%001100 dec=%001101 - call checkballhit + bit 1,d ;1=up; 0=down + jr z,balldown +ballup: + dec c + cal checkballhit jr z,balldone - ld c,e - ld hl,ballymove - call letsmovetheotherway + inc c + res 1,d ;go down + jr balldone +balldown: + inc c + cal checkballhit + jr z,balldone + dec c + set 1,d ;up balldone: - ld (ballpos),bc - jp set4pixels + +set4pixels: ;@(b,c) + cal SetPixel + inc b + cal SetPixel + inc c + cal SetPixel + dec b +SetPixel: ;at bc + cal FindPixel + or (hl) + ld (hl),a + ret letsmovetheotherway: ld a,1 @@ -1189,176 +1776,119 @@ letsmovetheotherway: ret checkballhit: + psh de ld d,0 - call chk4pixels + cal chk4pixels xor a cp d + pop de ret ;----------------------------- ;----------- procs ----------- ;----------------------------- -NewPea: -;random routine - ld hl,0 - ld de,12345 -Seed =$-2 - ld a,7921&255 - ld bc,$1000+(7921/256) -domult16: - add hl,hl - rla - rl c - jr nc,noadd16 - add hl,de -noadd16: - djnz domult16 - inc hl - ld (Seed),hl ;seed=(seed*7921+1)\65536 +randompos: + ld b,a +Random: ;(2..b+2) + ld a,r +Seed =$+1 + add a,0 + ld (Seed),a + and %01111110 + cp b + jr nc,Random + add a,2 + ret +NewPea: ld a,(FieldWidth) - add a,123 - cp h - jr c,NewPea - inc h - inc h - ld a,(FieldHeight) - add a,51 - cp l - jr c,NewPea - inc l - inc l + add a,127-4 + cal randompos + ld h,a + ld a,(FieldHeight) + add a,56-4 + cal randompos + ld l,a ld (PeaY),hl - ld d,2 ;don't draw - push hl - call CheckPea - pop hl - dec d - jr z,NewPea -DrawPea: ;hl=(PeaY) - ld d,0 ;draw CheckPea: - ld b,h ld c,l - call PeaPixel - inc c - call PeaPixel - inc b - call PeaPixel - dec c -PeaPixel: - push de - call FindPixel - pop de - ld e,a ;>> - ld a,d - or a - ld a,e ;<< - jr z,DrawPeaPixel ;d=0:draw - and (hl) ;pixel? - ret z - ld d,1 ;d=1:yes 2:no - ret -DrawPeaPixel: - xor (hl) ;change pixel - ld (hl),a - ret - -;-------- pixelprocs --------- - -set4pixels: - call SetPixel + 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 + jr nz,NewPea ;pixel found inc b - call SetPixel + dec d + jr nz,chkloopx inc c - call SetPixel - dec b -SetPixel: ;at bc - call FindPixel - or (hl) - ld (hl),a - ret + dec e + jr nz,chkloopy +;all ok; empty space -chk4pixels: ;&& - call CheckPixel - inc b - call CheckPixel - inc c - call CheckPixel - dec b - call CheckPixel - dec c - ret -CheckPixel: ;at bc in d - call FindPixel - and (hl) - ret z - dec d +DrawPea: ;hl=(PeaY) + ld b,h + ld c,l + ld de,peasprite +spritepos =$-2 + cal PutSprite ;||-ed ret -;CLEM's FIND_PIXEL (131 cycles; 28 bytes) -; (b,c) to hl:a; destroyes: -) +;----------- score ----------- -FindPixel: - ld h,ScrBuffer/$800 - ld a,c - add a,a - add a,a - ld l,a ;hl=4*y + offset/8 - ld a,b - rra - add hl,hl - rra - add hl,hl - add hl,hl ;hl=32*y + offset - rra ;a=x/8 - or l - ld l,a - ld a,b - and 7 - cpl - rlca - rlca - rlca - ld (FP_Bit),a - xor a -FP_Bit =$+1 - set 0,a +_divHLby1000: + psh hl + ld b,3 +divideagain: ;3x + cal _divHLby10 + dnz divideagain + ld a,l ;a=hl/1000 + pop hl ret -;----------- score ----------- - HuntingTimeScore: .db $dd,$7d ;ld a,lx cp worm2&255 ret z ;=worm#2 dec (ix+reserv) ret nz - ld de,10 + ld hl,10 IncScore: ld h,(ix+score+1) ld l,(ix+score) + cal _divHLby1000 + ld c,a add hl,de + 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 - ret c + jr c,showstats ;<0=0 scorecommon: ld (ix+score+1),h ld (ix+score),l ld de,0 scorelimit =$-2 - call _cphlde + cal _cphlde jp nc,Exit showstats: - push ix + psh ix ld h,0 ld l,h ld (_penCol),hl @@ -1369,8 +1899,8 @@ showstats: and _datanextl jr nz,showstatsS showstatloop: - push bc - call showstat + psh bc + cal showstat ld de,worm2-worm1 add ix,de ld hl,_penCol @@ -1378,7 +1908,7 @@ showstatloop: add a,10 ld (hl),a pop bc - djnz showstatloop + dnz showstatloop pop ix ret @@ -1389,41 +1919,42 @@ showstat: showscore: ld h,(ix+score+1) ld l,(ix+score) - call _D_HL_DECI + cal _D_HL_DECI jr __vputs showlives: ld a,(ix+lives) add a,'0' __vputmap: - push ix - call _vputmap + psh ix + cal _vputmap pop ix ret showstatsS: ld hl,txtLevel - call __vputs - ld a,(Level) + cal __vputs + ld a,0 +Level =$-1 cp 10 jr c,tilllevel9 ld l,a ld h,0 - call _divHLby10 - push af + cal _divHLby10 + psh af ld a,l add a,'0' - call __vputmap + cal __vputmap pop af tilllevel9: add a,'0' - call __vputmap + cal __vputmap ld a,98 ld (_penCol),a - call showscore + cal showscore ld a,123 ld (_penCol),a - call showlives + cal showlives ld a,(gameCar) and _datafoodl pop ix @@ -1433,52 +1964,53 @@ showleft: ld (_penCol),a ld a,0 Left =$-1 - push af - call _divAby10 + ld l,a + ld h,0 + cal _divHLby10 + psh af + ld a,l add a,'0' - call __vputmap + cal __vputmap pop af add a,'0' - call __vputmap + cal __vputmap + ld hl,txtLeft __vputs: - push ix - call _vputs + psh ix + cal _vputs pop ix ret showLevel: ld hl,txtLevel - call _puts + cal _puts ld a,(Level) showA: - cp 10 - jr c,LevelBelowTen ld l,a ld h,0 - call _divHLby10 - push af + cal _divHLby10 + psh af ld a,l add a,'0' - call _putc + cal _putc pop af -LevelBelowTen: add a,'0' jp _putc showHL: - call _D_HL_DECI + cal _D_HL_DECI jp _puts _D_HL_DECI: ld de,savestr+4 ld b,5 ldhld: - call _divHLby10 + cal _divHLby10 add a,'0' ld (de),a dec de - djnz ldhld + dnz ldhld ld hl,savestr ret savestr: @@ -1504,8 +2036,8 @@ NotMaxYScroll: add hl,hl add hl,hl add hl,hl - push bc ; >> 1 - push de ; >> 2 + psh bc ; >> 1 + psh de ; >> 2 ld de,ScrBuffer add hl,de ld a,b @@ -1518,7 +2050,7 @@ FieldWidth = $-1 jr c,NotMaxXScroll ld a,(FieldWidth) NotMaxXScroll: - push af ; >> 3 + psh af ; >> 3 and %11111000 rra rra @@ -1528,7 +2060,7 @@ NotMaxXScroll: ld de,DispBuffer pop af ; << 2 and %00000111 - push af ; >> 3 + psh af ; >> 3 cp 6 jr c,CopyScreen inc c @@ -1536,13 +2068,13 @@ CopyScreen: add hl,bc ld b,57 CopyScreenLoop: - push bc ; >> 4 - ld bc,16 + psh bc ; >> 4 + ld bc,16 ldir - ld c,16 + ld c,16 add hl,bc pop bc ; << 3 - djnz CopyScreenLoop + dnz CopyScreenLoop pop af ; << 2 ld c,$b7 ;or a Bit0: @@ -1552,155 +2084,155 @@ Bit0: jr AfterShiftDelay Bit1: dec a - jr nz,Bit2 - call ShiftRight1 - jr AfterShiftDelay + jr nz,Bit2 + cal ShiftRight1 + jr AfterShiftDelay Bit2: dec a - jr nz,Bit3 - ld a,2 - call ShiftRight - jr AfterShiftDelay + jr nz,Bit3 + ld a,2 + cal ShiftRight + jr AfterShiftDelay Bit3: dec a - jr nz,Bit4 - call Chunk - call ShiftLeft1 - jr AfterShift + jr nz,Bit4 + cal Chunk + cal ShiftLeft1 + jr AfterShift Bit4: dec a - jr nz,Bit5 - call Chunk - jr AfterShiftDelay + jr nz,Bit5 + cal Chunk + jr AfterShiftDelay Bit5: dec a - jr nz,Bit6 - call Chunk - call ShiftRight1 - jr AfterShift + jr nz,Bit6 + cal Chunk + cal ShiftRight1 + jr AfterShift Bit6: dec a - jr nz,Bit7 - ld a,2 - call ShiftLeft - jr AfterShift + jr nz,Bit7 + ld a,2 + cal ShiftLeft + jr AfterShift Bit7: - call ShiftLeft + cal ShiftLeft AfterShiftDelay: halt AfterShift: - ld hl,DispBuffer - ld de,$fc00+$70 - ld bc,1024-$70 + ld hl,DispBuffer + ld de,$fc00+$70 + ld bc,1024-$70 ldir pop de ; << 1 pop bc ; << 0k ret ShiftRight1: - ld a,1 + ld a,1 ShiftRight: - ld (ShiftRightCounter),a - ld a,c - ld (ShiftRightChunk),a - ld c,16 + ld (ShiftRightCounter),a + ld a,c + ld (ShiftRightChunk),a + ld c,16 add hl,bc - ld b,57 + ld b,57 ShiftRightLoop: - push bc - ld bc,-32 + psh bc + ld bc,-32 add hl,bc - ex de,hl - ld a,(de) + ex de,hl + ld a,(de) ShiftRightChunk: - or a - call c,_SHLACC - ld c,0 + or a + cal c,_SHLACC + ld c,0 ShiftRightCounter = $-1 ShiftRowsLeft: - push hl + psh hl rla - ld b,16 + ld b,16 ShiftRowLeft: dec hl - rl (hl) - djnz ShiftRowLeft + rl (hl) + dnz ShiftRowLeft pop hl dec c - jr nz,ShiftRowsLeft - ld bc,-16 + jr nz,ShiftRowsLeft + ld bc,-16 add hl,bc - ex de,hl + ex de,hl pop bc - djnz ShiftRightLoop + dnz ShiftRightLoop ret ShiftLeft1: - ld a,1 + ld a,1 ShiftLeft: - ld (ShiftLeftCounter),a - ld a,c - ld (ShiftLeftChunk),a + ld (ShiftLeftCounter),a + ld a,c + ld (ShiftLeftChunk),a rla - jr nc,ShiftLeftSameByte + jr nc,ShiftLeftSameByte dec hl ShiftLeftSameByte: - ex de,hl - ld bc,-16 + ex de,hl + ld bc,-16 add hl,bc NewSprite: - ex de,hl - ld b,57 + ex de,hl + ld b,57 ShiftLeftLoop: - push bc ; >> 1 - ld bc,-32 + psh bc ; >> 1 + ld bc,-32 add hl,bc - ex de,hl - ld a,(de) + ex de,hl + ld a,(de) ShiftLeftChunk: - or a - call c,_SHRACC - ld c,0 + or a + cal c,_SHRACC + ld c,0 ShiftLeftCounter = $-1 ShiftRowsRight: - push hl ; >> 2 + psh hl ; >> 2 rra - ld b,16 + ld b,16 ShiftRowRight: - rr (hl) + rr (hl) inc hl - djnz ShiftRowRight + dnz ShiftRowRight pop hl ; << 1 dec c - jr nz,ShiftRowsRight - ld bc,-16 + jr nz,ShiftRowsRight + ld bc,-16 add hl,bc - ex de,hl + ex de,hl pop bc ; << 0k - djnz ShiftLeftLoop + dnz ShiftLeftLoop ret Chunk: - push hl ; >> 1 - push de ; >> 2 + psh hl ; >> 1 + psh de ; >> 2 ld c,16 add hl,bc ld b,57 ChunkScreen: - push bc ; >> 3 + psh bc ; >> 3 ld bc,-32 add hl,bc ex de,hl ld a,(de) - call _SHRACC + cal _SHRACC ld b,16 ChunkRow: dec hl rld - djnz ChunkRow + dnz ChunkRow ex de,hl pop bc ; << 2 - djnz ChunkScreen + dnz ChunkScreen pop de ; << 1 pop hl ; << 0k ld c,$37 ;scf @@ -1708,6 +2240,101 @@ ChunkRow: ;----------- draw ------------ +;--- pixel --- + +chk4pixels: ;&& + cal CheckPixel + inc b + cal CheckPixel + inc c + cal CheckPixel + dec b + cal CheckPixel + dec c + ret +CheckPixel: ;at bc in d + cal FindPixel + and (hl) + ret z + dec d + ret + +;CLEM's FIND_PIXEL (131+? cycles; 28+4 bytes) +;(b,c) to hl:a; "destroyes" ahl + +FindPixel: ;(b,c) to hl:a + ld h,0 + ld l,c ;hl=y + add hl,hl + add hl,hl + ld a,b ;a=x + rra + add hl,hl + rra + add hl,hl + add hl,hl ;hl=32*y + rra ;a=x/8 + or l + ld l,a + ld a,b + and 7 + cpl + rlca + rlca + rlca + ld (FP_Bit),a + xor a +FP_Bit =$+1 + set 0,a + + psh de ;&&& + ld de,ScrBuffer + add hl,de + pop de + ret + +;--- sprite --- + +PutSprite: ;||@(b,c) + ;by SHIAR only ix saved + cal FindPixel +putspr: + ld (beginbit),a + ld a,(sprsize) + ld b,a ;rows +sprloopy: + psh bc ;rows + psh hl + ld a,(de) + ld c,a + inc de + ld a,(sprsize) + ld b,a ;width +beginbit =$+1 + ld a,1 +sprloopx: + sla c ;draw? + jr nc,sprnodraw + psh af + xor (hl) + ld (hl),a + pop af +sprnodraw: + rrca ;next bit + jp nc,nextbitok + inc hl ;next byte +nextbitok: + dnz sprloopx + + pop hl + ld bc,32 ;next line + add hl,bc + pop bc + dnz sprloopy + ret + +;--- line --- + loaddrawdata: ld d,(hl) inc hl @@ -1717,23 +2344,27 @@ loaddrawdata: inc hl ret -Line: ;draw line from de to hl (d=8) +txtName: .db "Enter name player ",0 txtWaiting: .db "Waiting...",0 -txtReceive: .db "Receiving...",0 +txtReceive: .db "Receiving..." ;,0 + +TrigPrecalc: +.db 0, 3, 6, 9, 12, 15, 18, 21 +.db 24, 27, 30, 33, 36, 39, 42, 45 +.db 48, 51, 54, 57, 59, 62, 65, 67 +.db 70, 73, 75, 78, 80, 82, 85, 87 +.db 89, 91, 94, 96, 98,100,102,103 +.db 105,107,108,110,112,113,114,116 +.db 117,118,119,120,121,122,123,123 +.db 124,125,125,126,126,126,126,126 +.db 127 -WormVersion = 092 -WormMsg: .db "WORM by SHIAR -- test version",0 txtLevel: .db "Level ",0 txtWorms: .db "Worms: 0",0 ;follows txtLevel txtDied: .db "Died ",0 -txtScore: .db "Score",0 ;follows txtDied -txtLeft: .db " left",0 ;follows txtScore +txtScore: .db "Score",0 ;follows txtDied +txtLeft: .db " left",0 ;follows txtScore txthiscore:.db "HiScore:",0 txtReady: .db "Prepare!",0 txtposReady = 7 @@ -2271,82 +2641,81 @@ txtGO: .db "----- GAME OVER -----",0 gamesdata: _datalink = %00000001 -_datasingl = %00001000 ;singleplayer=1 _datalivel = %00000010 ;ix+lives=0 limit _datafoodl = %00000100 ;left=0 limit _datanextl = %00001000 ;next level if left=0 +_datasingl = %00001000 ;singleplayer=1 _datafood = %00010000 ;food present _datahunt = %00100000 _datalaps = %01000000 ;give lap score _datascore = %10000000 ;score>=100 limit datasingle: .db %00011110 - .dw LevelsS datapeas: .db %00011010 - .dw LevelsS datadeathm: .db %00000010 - .dw LevelsDM2 datafoodm: .db %10010000 - .dw LevelsDM datalinkm: .db %00000011 - .dw LevelsDM datahuntin: .db %10100000 - .dw LevelsH datarace: .db %11000000 - .dw LevelsR -datactf: .db %00000000 - .dw LevelsDM -datadomin: .db %00000000 - .dw LevelsDM - - -setdata = 18 -resbit = 2 ;and%11111011 -worm1set: .dw $B000,$B000 ;%10110000 +datactf: .db %00000000 ;==(8 modes) +;datadomin: .db %00000000 +datalevels: .dw LevelDef, LevelDef + .dw LevelDefM,LevelDefM + .dw LevelDefM,LevelDefM + .dw LevelDefM,LevelDefM +nrlevels: .db 2,2,2,2,2,2,2,2 + +worm1set: .dw worm1p,worm1p .db 3,0,%01111110,%10,%100 ;< > - .db "Worm #1",0 -worm2set: .dw $B800,$B800 ;%10111000 +worm1name: .db "worm #01",0 +worm2set: .dw worm2p,worm2p .db 3,0,%00111111,%10000,%1000 ;f1 f2 - .db "Worm #2",0 -worm3set: .dw $E800,$E800 ;%11101000 ;$D748+$1000+ +worm2name: .db "worm #02",0 +worm3set: .dw worm3p,worm3p .db 3,0,%01011111,%10,%100 ;sto , - .db "Worm #3",0 -worm4set: .dw $F000,$F000 ;%11110000 +worm3name: .db "worm #03",0 +worm4set: .dw worm4p,worm4p .db 3,0,%01111101,%10,%1 ;enter + - .db "Worm #4",0 -worm1 = $B400 -worm2 = $B430 -worm3 = $B460 -worm4 = $B490 +worm4name: .db "worm #04",0 + +hipeaworm: .dw 0 end: - ;set: -heading = 0 ;level* -pos = 2 ;level* -pos2 = 4 ;level -grow = 6 ;level -died = 8 ;game -score = 9 ;game -delay = 11 ;game - -head = 12 ;level -tail = 14 ;level -lives = 16 ;game -reserv = 17 ;loop + +defsprsize = 4 +sprsize: .db 4 +peasprite: .db %01100000 + .db %11110000 + .db %11110000 + .db %01100000 + + ;set: +heading = 0 ;level* +pos = 2 ;level* +pos2 = 4 ;level +grow = 6 ;level +died = 8 ;game +score = 9 ;game +delay = 11 ;game + +head = 12 ;level +tail = 14 ;level +lives = 16 ;game +reserv = 17 ;loop ;race:lap ;hunt:time -input = 18 ;& -left = 19 ;& -right = 20 ;& -name = 21 ;game +input = 18 ;& +left = 19 ;& +right = 20 ;& +name = 21 ;game +wormsize = 30 -Level =$+1 -DispBuffer =$+2 ;912 bytes - -ScrBuffer = $8000 ;-$A1FF (32x256) -SinCosTable = $A200 ;-$A300 (4x64) +respawndelay = 80 +maxnamelength = 9 ;----------------------------- ;----------- end ------------- ;----------------------------- + .end + .end \ No newline at end of file