X-Git-Url: http://git.shiar.net/wormy.git/blobdiff_plain/f9173ce4c203c5f2cdeeccdb7e76864fa286122c..1ef9903729b6d0785ae56e2422120b030f3ef1f6:/worm.z80 diff --git a/worm.z80 b/worm.z80 index d50545f..d5b88d1 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,45 +16,93 @@ ;----------- 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 + +;100% = bugs fixed + levels done + +;----------------------------- +;----------------------------- +;--------- W O R M --------- +;----------------------------- +;----------------------------- + +#define cal call +#define psh push +#define dnz djnz #include "asm86.h" #include "ti86asm.inc" -#include "ti86abs.inc" - -_SHRACC = $4383 -_SHLACC = $438B -_divHLby10 = $4044 -_divAby10 = $4DAF -_cphlde = $403C -_clrWindow = $4A86 -_asapvar = $D6FC -_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 - -leveldata = $EA00 ;size<$400 + +_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 ------- +;----------------------------- + +leveldata = $EA00 ;size< $400 +ScrBuffer = $8100 ;size=$2000 (32x256) + ;->mod$800 +templevels = $BC00 ;size= 3*$10 +DispBuffer = $BC00 ;size= $390 (16x57) +SinCosTable = $B500 ;size= $100 (4x64) + +worm1 = $B400 +worm2 = $B41E +worm3 = $B43C +worm4 = $B45A +ball1 = $B478 + +resbit = 2 ;and%11111011 +worm1p = $B000 ;%10110000 -$B3FF +worm2p = $B800 ;%10111000 -$BBFF +worm3p = $F000 ;%11110000 -$F3FF +worm4p = $A800 ;$E800=%11101000 ;$D748+$1000+ + +WormVersion = 088 ;----------------------------- ;------- program start ------- ;----------------------------- .org _asm_exec_ram + start: nop jp Start @@ -62,11 +110,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 @@ -74,48 +124,184 @@ WormIcon: .db %11101111,%00001111 .db %11000011,%10000000 -levelfile: - .db 7,"wormlvl" +levelhead = '8' +levelhead2 = '9' ;worm levels header = "89" Start: ld (SpSave),sp - call _runindicoff - call _flushallmenus - call _clrLCD + cal _runindicoff + cal _flushallmenus + cal _clrLCD + + cal _RAM_PAGE_7 + ld hl,$BFFF ;VAT start + ld bc,templevels +searchloop: + ld de,(_PTEMP_END+1) + 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 @@ -127,7 +313,7 @@ Start: ld hl,TrigPrecalc ld de,SinCosTable - push de ; >> 1 + psh de ; >> 1 ld bc,65 ldir dec hl @@ -137,7 +323,7 @@ MirrorSineWave: ld a,(hl) ld (de),a inc de - djnz MirrorSineWave + dnz MirrorSineWave pop hl ; << 0k ld b,128+64 NegativeSineWave: @@ -146,36 +332,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 - call _puts ;txtOptions + cal _puts ;Level + dec e ;$0205 + ld (_curRow),de + 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 @@ -183,48 +376,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 @@ -238,56 +419,225 @@ 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 GET_KEY + 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 a,(Gametype) + cp 2 + ld a,1 + jr c,wormnrname + ld a,(nrworms) +wormnrname: + 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 (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 a,$17 ;no exit + ld (CheckExit),a ;set exit state + ld hl,gamesdata ld a,(Gametype) ld e,a @@ -300,20 +650,13 @@ LetsGetThisPartyOn: ld e,8 ;=de add hl,de - ld d,a ;push af + ld c,a and _datasingl jr z,notsingle ld a,1 ld (nrworms),a - ld a,d - and _datafoodl - jr nz,notsingle - ld a,1 - ld (worm1+lives),a notsingle: - ld a,d - push af ;&&&b? - + ld a,c and _datascore ld de,$FF64 ;virt.infinate jr z,setscorelimit @@ -321,25 +664,35 @@ notsingle: setscorelimit: ld (scorelimit),de - call _ldHLind ;ld hl,(hl) - 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 + cal _clrWindow ld a,WormVersion - call send + cal send jr c,client ;2nd host: ld hl,txtWaiting - call _puts - call receive + cal _puts + cal receive cp WormVersion jp nz,LinkBreak - call send + cal send ld hl,SwapPos ld (hl),$f6 @@ -347,8 +700,8 @@ host: client: ld hl,txtReceive - call _puts - call receive + cal _puts + cal receive cp WormVersion jp nz,LinkBreak @@ -361,7 +714,7 @@ multiplayer: ;----------------------------- GameOver: - call _clrLCD + cal _clrLCD ld hl,0 ld (worm1+died),hl ;+died=0 \ +score1=0 @@ -374,31 +727,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 + cal _MOV5B + cal _mov9b + + ld a,(Gametype) + cp 1 ;=peaworm + jr nz,worminitdone + ld (worm1+lives),a ;&&&<* +worminitdone: pop hl StartLevel: 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 @@ -407,14 +784,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,ball1 + ldir toobad_noballs: #ifdef 0 @@ -428,19 +826,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 @@ -450,7 +848,7 @@ nohunter: jr nz,worminit ld b,4 worminit: - push bc ; >> 1 + psh bc ; >> 1 ex de,hl ldi ;d ld a,SinCosTable/256 @@ -468,7 +866,7 @@ worminit: ld bc,(worm2-worm1)-5 add hl,bc pop bc ; << 0k - djnz worminit + dnz worminit ;-------- draw level --------- @@ -481,7 +879,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 @@ -492,8 +890,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 @@ -505,12 +903,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 @@ -527,7 +925,7 @@ ClearLine: VertShift: rra rr c - djnz VertShift + dnz VertShift NoVertShift: ld (hl),a inc hl @@ -549,21 +947,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 @@ -576,12 +974,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 @@ -591,16 +989,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 @@ -610,7 +1007,7 @@ nofood: ld (_curRow),hl set 3,(iy+5) ld hl,txtReady - call _puts + cal _puts res 3,(iy+5) ld a,0 @@ -641,7 +1038,7 @@ initfinished: ld b,0 ReadyDelay: halt - djnz ReadyDelay + dnz ReadyDelay ;----------------------------- ;----------- LOOP ------------ @@ -649,7 +1046,7 @@ ReadyDelay: GameLoop: ld bc,(worm1+pos) - call DisplayField + cal DisplayField ld a,1 flashtime =$-1 @@ -677,18 +1074,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 ------------- @@ -698,54 +1095,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 a,respawndelay ld (ix+delay),a thislevel =$+1 @@ -761,41 +1128,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 @@ -811,7 +1181,7 @@ hostLinkIndic: ld a,8 ld (_curCol),a ld a,b - call _putc + cal _putc xor a ld (_curCol),a dec hl @@ -819,58 +1189,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,d - cp h - jr c,NotNewHigh - ld a,e - cp l - jr c,NotNewHigh - ld (HiScore),de - ex de,hl ;disp.new hiscore -NotNewHigh: - ex de,hl ;push + 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 + cal _puts ex de,hl ;pop - call showHL + cal showHL hiscorecheckdone: waitkey: halt halt - call GET_KEY + cal GET_KEY cp K_ENTER jp z,DisplayMenu ; cp K_EXIT @@ -890,25 +1288,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 _INC_PTR_AHL + ret + ;----------------------------- ;----------- worm ------------ ;----------------------------- @@ -919,22 +1327,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) @@ -945,23 +1353,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 @@ -976,7 +1440,7 @@ donediddelydone: ;-------- move worm ---------- Wormmove: - push bc ; >> pos + psh bc ; >> pos ld a,(hl) add a,a add a,d @@ -1022,7 +1486,7 @@ notmoveY: ;bc=newpos xor 3 ld d,a GotFour: - call chk4pixels + cal chk4pixels rl d jp nc,Drawworm @@ -1035,48 +1499,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 hl ; << levelp new - cp NUM_LEVELS - jp z,Exit - ld a,(gameCar) - and _datanextl - jp nz,StartLevel - jp Exit + jp StartLevel ;----------------------------- @@ -1102,7 +1576,7 @@ nextotherwormbit: nothit1: inc hl res resbit,h - call _cphlde + cal _cphlde jr nz,nextotherwormbit ret @@ -1118,9 +1592,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: @@ -1128,11 +1602,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: @@ -1142,14 +1616,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) @@ -1161,7 +1635,7 @@ Drawworm: ld (ix+head),l ld (ix+head+1),h - call set4pixels + cal set4pixels ld a,(ix+grow) dec a @@ -1181,52 +1655,103 @@ 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 ret -;----------------------------- -;---------- ball ------------- -;----------------------------- - -handlethatneatlittleball: - ld a,0 -nrballs =$-1 - or a - ret z -ballpos =$+1 - ld bc,$0503 - call res4pixels +;----------------------------- +;---------- ball ------------- +;----------------------------- + +handlethoseneatlittleballs: + ld a,0 +nrballs =$-1 + or a + ret z + + ld hl,ball1 + 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 @@ -1235,180 +1760,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+4 bytes) -; (b,c) to hl:a; destroyes: -) - -FindPixel: - 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 +;----------- score ----------- - push de - ld de,ScrBuffer - add hl,de - pop de +_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 @@ -1419,8 +1883,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 @@ -1428,7 +1892,7 @@ showstatloop: add a,10 ld (hl),a pop bc - djnz showstatloop + dnz showstatloop pop ix ret @@ -1439,41 +1903,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 @@ -1483,52 +1948,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: @@ -1554,8 +2020,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 @@ -1568,7 +2034,7 @@ FieldWidth = $-1 jr c,NotMaxXScroll ld a,(FieldWidth) NotMaxXScroll: - push af ; >> 3 + psh af ; >> 3 and %11111000 rra rra @@ -1578,7 +2044,7 @@ NotMaxXScroll: ld de,DispBuffer pop af ; << 2 and %00000111 - push af ; >> 3 + psh af ; >> 3 cp 6 jr c,CopyScreen inc c @@ -1586,13 +2052,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: @@ -1602,155 +2068,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 @@ -1758,6 +2224,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 @@ -1767,23 +2328,27 @@ loaddrawdata: inc hl ret -Line: ;draw line from de to hl (d - .db "Worm #1",0 -worm2set: .dw $B800,$B800 ;%10111000 +worm1name: .db "Left ",0 +worm2set: .dw worm2p,worm2p .db 3,0,%00111111,%10000,%1000 ;f1 f2 - .db "Worm #2",0 -worm3set: .dw $F000,$F000 ;$E800=%11101000 ;$D748+$1000+ +worm2name: .db "Right ",0 +worm3set: .dw worm3p,worm3p .db 3,0,%01011111,%10,%100 ;sto , - .db "Worm #3",0 -worm4set: .dw $A800,$A800 ;$F000=%11110000 +worm3name: .db "Top ",0 +worm4set: .dw worm4p,worm4p .db 3,0,%01111101,%10,%1 ;enter + - .db "Worm #4",0 -worm1 = $B400 -worm2 = $B42A -worm3 = $B454 -worm4 = $B47E ;-A8 +worm4name: .db "Bottom ",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 - -Level =$+1 -DispBuffer =$+2 ;912 bytes - -ScrBuffer = $8100 ;-$A2FF (32x256) mod$800=0 -SinCosTable = $B500 ;size=$100 (4x64) +input = 18 ;& +left = 19 ;& +right = 20 ;& +name = 21 ;game +wormsize = 30 + +respawndelay = 40 +maxnamelength = 9 ;----------------------------- ;----------- end -------------