X-Git-Url: http://git.shiar.nl/wormy.git/blobdiff_plain/b2288323cde0474b43669f9c5805fa92191c75d6..fb53f987bcd8b3a1abf600eee973cb673552d1c3:/worm.asm diff --git a/worm.asm b/worm.asm deleted file mode 100644 index d8f61e0..0000000 --- a/worm.asm +++ /dev/null @@ -1,2352 +0,0 @@ -; Title : Worm -; Version : 0.92 -; Release Date : soon (I hope) -; Filename : worm.86p (3404) -; Author(s) : Shiar -; Email Address : shiar@mailroom.com -; ICQ UIN : #43840958 -; Web Page : www.games3.net/shiar -; Description : ruling multiplayer game for 86 (most like Nibbles) -; Where to get this game : games3.net/shiar (home of Worm) -; Other games by author(s) : Shiar: Nemesis beta -; Additional Credits to : Matthew Shepcar (wrote original Peaworm, end'98) -; Jonah Cohen (wrote some parts of worm) - -;----------------------------- -;----------- TO-DO ----------- -;----------------------------- - -; Shiar 3.III.00 - -;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 - -;1) Working on a new pickup-system allowing more than one "food" and different pickup-handling - -#include "TI86.inc" - -;----------------------------- -;------- program start ------- -;----------------------------- - -.org _asm_exec_ram -start: - nop - jp Start - .dw 1 - .dw WormMsg - .dw WormIcon - -WormIcon: - .db 9,2 - .db %10010111,%01101111 - .db %10110101,%01001011 - .db %11110111,%01001001 - .db %00000011,%10000000 - .db %00000001,%11100000 - .db %00111000,%11111000 - .db %01111110,%00111111 - .db %11101111,%00001111 - .db %11000011,%10000000 - -Start: - ld (SpSave),sp - call _runIndicOff - call _flushAllMenus - call _clrLCD - res 2,(iy+13) ;appAutoScroll - - ld a,r - ld (Seed),a - -;----------------------------- -;----- build trig tables ----- -;----------------------------- - - ld hl,TrigPrecalc - ld de,SinCosTable - push de ; >> 1 - ld bc,65 - ldir - dec hl - ld b,63 -MirrorSineWave: - dec hl - ld a,(hl) - ld (de),a - inc de - djnz MirrorSineWave - pop hl ; << 0k - ld b,128+64 -NegativeSineWave: - xor a - sub (hl) - ld (de),a - inc hl - inc de - djnz NegativeSineWave - -;----------------------------- -;---------- menu ------------- -;----------------------------- - -DisplayMenu: - ld a,2 - ld (nrworms),a -gomainMenu: - call _clrWindow - ld hl,txtWelcome - call _puts - ld de,$0205 - ld (_curRow),de - call _puts ;txtOptions - dec e ;$0204 - ld (_curRow),de - ld hl,(CURtxtGame) - call _puts - - xor a -mainMenu: - call menucall - jr nz,notselect -select: - ld a,b - or a - jr nz,gooptionsMenu - jp LetsGetThisPartyOn -notselect - cp K_EXIT - jp z,ExitNoStats - cp K_RIGHT - ld a,b - jr nz,mainMenu - or a - jr z,Variation - -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 - -Variation: - ld a,0 -Gametype =$-1 - ld hl,txtGame2 -NEXTtxtGame =$-2 - inc a - and 7 ;mod 8 - jr nz,okilydokily - ld hl,txtGame -okilydokily: - ld (Gametype),a - ld de,$0204 - ld (_curRow),de - ld (CURtxtGame),hl - call _puts - ld (NEXTtxtGame),hl - ld a,b - jp 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 - ld (_curRow),hl - ld a,'*' - call _putc - pop af - ld b,a -menukeys: - halt \ halt - call _getcsc - or a - jr z,menukeys - cp K_UP - jr nz,notup -updown: - ld a,b - xor 1 - ld b,a - inc a ;nz - ret -notup: - cp K_DOWN - jr z,updown - cp K_ENTER - ret z - cp K_SECOND - ret ;z=select - -;----------------------------- -;-------- start game --------- -;----------------------------- - -LetsGetThisPartyOn: - ld hl,Gametype - ld a,(hl) - add a,a - add a,(hl) - ld e,a - ld d,0 - ld hl,gamesdata - add hl,de - - ld a,(hl) - push af - and _datasingl - jr z,notsingle - ld a,1 - ld (nrworms),a -notsingle: - pop af - ld (gameCar),a - push af - - and _datascore - ld de,$FF64 ;virt.infinate - jr z,setscorelimit - ld d,0 ;de=100 -setscorelimit: - ld (scorelimit),de - - inc hl - call _ldHLind - pop af - push hl - and _datalink - jr z,GameOver - -linkmatch: - call _clrWindow - - -; in a,(7) -; and %11 -; cp %11 - 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 - -host: - ld hl,txtWaiting - call _puts - call receive - cp WormVersion - ret nz - call send - ld hl,SwapPos - ld (hl),$f6 - -multiplayer: - ld a,2 - ld (nrworms),a - ld de,LevelsDM - -;----------------------------- -;--------- game over --------- -;----------------------------- - -GameOver: - call _clrLCD - ld hl,0 - ld (worm1+died),hl -;+died=0 \ +score1=0 - ld (worm2+died),hl - ld (worm3+died),hl - ld (worm4+died),hl - inc h - ld (worm1+score+1),hl -;+score2=0 \ +delay=1 - 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 - ld hl,worm2set+4 - ld de,worm2+lives - call _MOV5B - call _mov9b - ld hl,worm3set+4 - ld de,worm3+lives - call _MOV5B - call _mov9b - ld hl,worm4set+4 - ld de,worm4+lives - call _MOV5B - call _mov9b - pop de - -StartLevel: - ex de,hl - ld de,Left - ldi - ld de,Speed - ldi - ld a,(hl) - ld (worm1+grow),a - ld (worm2+grow),a - ld (worm3+grow),a - ld (worm4+grow),a - ld (beginsize),a - inc hl - - ld a,(hl) - inc hl - ld (nrballs),a - or a - jr z,toobad_noballs - ld de,ballpos - ldi - ldi -toobad_noballs: - -#ifdef 0 - ld a,(gameCar) - and _datahunt - jr z,nohunter - ld a,huntersize - ld (worm2+grow),a -nohunter: -#endif - - ex de,hl - ld (thislevel),de - push de - ld hl,worm1set - ld de,worm1+head - call _MOV4B - ld hl,worm2set - ld de,worm2+head - call _MOV4B - ld hl,worm3set - ld de,worm3+head - call _MOV4B - ld hl,worm4set - ld de,worm4+head - call _MOV4B - pop de - - ld hl,worm1 - ld a,(gameCar) - and _datanextl - ld b,1 - jr nz,worminit - ld b,4 -worminit: - push bc ; >> 1 - ld a,(de) - ld (hl),a ;d - inc de - inc hl - 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 - inc de - inc hl - - xor a - ld (hl),a ;y2 - inc hl - ld (hl),a ;x2 - - ld bc,(worm2-worm1)-5 - add hl,bc - pop bc ; << 0k - djnz worminit - -;-------- draw level --------- - - ld a,(de) - inc de - sub 128 - ld (FieldWidth),a - ld a,(de) - inc de - sub 57 - ld (FieldHeight),a - add a,57-5 - push de ; >> levelp - ld l,a - ld h,0 - add hl,hl - add hl,hl - add hl,hl - add hl,hl - add hl,hl - ex de,hl - - ld hl,ScrBuffer - push hl ; >> 1 - push de ; >> 2 - ld de,ScrBuffer+1 - ld bc,63 - ld (hl),%11111111 - ldir - inc hl - ld (hl),%11000000 - inc hl - ld b,31 -ClearLine: - ld (hl),c - inc hl - djnz ClearLine - push hl ; >> 3 - - ld a,(FieldWidth) - add a,126 - push af ; >> 4 - and %11111000 - rra - rra - rra - ld l,a - ld h,0 - add hl,de - pop af ; << 3 - and %00000111 - ld b,a - ld c,0 - ld a,%11000000 - jr z,NoVertShift -VertShift: - rra - rr c - djnz VertShift -NoVertShift: - ld (hl),a - inc hl - ld (hl),c - - ex de,hl - pop de ; << 2 - pop bc ; << 1 - ldir - pop hl ; << 0k - ld c,64 - ldir - -;-draw lines- - - pop hl ; << levelp - ld a,(hl) - inc hl - or a - jr z,NoLines -DrawLines: - push af ; >> 1 - call loaddrawdata - push hl ; >> 2 - ld l,(hl) - ld h,a - call Line - inc d - inc h - call Line - inc e - inc l - call Line - dec d - dec h - call Line - pop hl ; << 1 - inc hl - pop af ; << 0k - dec a - jr nz,DrawLines -NoLines: - - ld a,(hl) - inc hl - or a - jr z,noboxes -drawboxes: - push af - call loaddrawdata - push hl - ld l,(hl) - ld h,a - call drawbox - pop hl - inc hl - pop af - dec a - jr nz,drawboxes -noboxes: - -;----------------------------- - - push hl ; >> levelp new - call showstats - ld a,(gameCar) - and _datafood - jr z,nofood - call NewPea - call DrawPea -nofood: - ld bc,(worm1+pos) - call DisplayField - ld hl,$FDE0 - ld de,$FDE1 - ld (hl),%11111111 - ld bc,$BF - ldir - ld hl,4+(txtposReady*256) - ld (_curRow),hl - set 3,(iy+5) - ld hl,txtReady - call _puts - res 3,(iy+5) - - ld a,0 -gameCar =$-1 - and _datalink - jr z,SwapPos ;no link - xor a - ld (worm2+input),a - ld (worm2+left),a - ld (Speed),a - -SwapPos: ;$18 xx -> $F6 xx - jr initfinished - inc a - ld (worm2+left),a - ld hl,(worm1+pos) - ld de,(worm2+pos) - ld (worm2+pos),hl - ld (worm1+pos),de - ld a,(worm1+heading) - ld b,a - ld a,(worm2+heading) - ld (worm1+heading),a - ld a,b - ld (worm2+heading),a -initfinished: - - ld b,0 -ReadyDelay: - halt - djnz ReadyDelay - -;----------------------------- -;----------- LOOP ------------ -;----------------------------- - -GameLoop: - ld bc,(worm1+pos) - call DisplayField - - ld a,1 -flashtime =$-1 - dec a - jr z,noflash - ld (flashtime),a - ld hl,$fc00+(16*7) -screeninvertloop: - ld a,(hl) - cpl - ld (hl),a - inc hl - xor a - cp h - jr nz,screeninvertloop -noflash: - - ld a,0 -Speed =$-1 - or a - jr z,NoDelay -Delay: - halt - dec a - jr nz,Delay -NoDelay: - - call handlethatneatlittleball - - ld ix,worm1 - ld a,(nrworms) - ld b,a -handleworms: - push bc - call HandleWorm - ld bc,worm2-worm1 - add ix,bc - pop bc - djnz handleworms - -;----------------------------- -;---------- keys ------------- -;----------------------------- - -HandleKeys: - ld a,%10111111 - out (1),a - in a,(1) - rla - jr c,NotPaused - ld bc,$0103 - out (c),b - halt - ld b,11 - out (c),b - -NotPaused: - rla - jp c,GameLoop - 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 - -thislevel =$+1 - ld de,0 - ld a,(de) - inc de - ld (ix+heading),a - ld a,(de) - ld (ix+pos),a - inc de - ld a,(de) - ld (ix+pos+1),a - - inc (ix+died) - dec (ix+lives) - push af - ld de,10 - call DecScore - pop af - ret nz ;HandleWorm done - ld a,(gameCar) - and _datalivel - ret z - -Exit: - ld sp,0 ;pop all -SpSave = $-2 - call _clrWindow - ld hl,txtGO - call _puts - ld hl,txtGame -CURtxtGame =$-2 - call _puts - ld de,0002 - ld (_curRow),de - call showLevel - ld de,$0B03 - ld (_curRow),de - ld hl,txtDied - call _puts - call _puts ;txtScore - xor a - ld (_curCol),a - - ld b,2 -nrworms =$-1 - ld hl,worm1+died -displayWormStats: - push bc - push hl - - ld bc,input-died - add hl,bc ;+input - xor a - cp (hl) - jr nz,NoLinkIndic - ld b,7 - inc hl ;+left - cp (hl) - jr z,hostLinkIndic - dec b -hostLinkIndic: - ld a,8 - ld (_curCol),a - ld a,b - call _putc - xor a - ld (_curCol),a - dec hl -NoLinkIndic: - inc hl - inc hl - inc hl ;+name - call _puts - - pop hl - push hl - ld a,13 - ld (_curCol),a - ld a,(hl) ;worm+died - push hl - call showA - pop hl - - ld a,16 - ld (_curCol),a - inc hl ;worm+score - call _ldHLind ;ld hl,(hl) - call showHL ;worm+score - - pop hl - ld bc,worm2-worm1 - add hl,bc - pop bc - djnz displayWormStats - - 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: - ex de,hl - ld hl,txthiscore - call _puts - ex de,hl - call showHL -hiscorecheckdone: - -waitkey: - halt - halt - call _getcsc - cp K_ENTER - jp z,DisplayMenu -; cp K_EXIT - jr nz,waitkey - -;x123456789012345678901 -;1----- GAME OVER ----- -;2Multiplayer -;3Level 01 -;4 Died Score: -;5NameName 03 00070 -;6Worm#02 @ 05 00120 -;7Worm#03 15 00030 -;8Snaky @ 00 04820 - -ExitNoStats: - ld hl,_asapvar - rst 20h ;_ABS_MOV10TOOP1 - rst 10h ;_FINDSYM - call _swapt_ ;_ex_ahl_bde - ld de,4 - add hl,de - adc a,0 - call _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 - res 4,(iy+9) - set 2,(iy+13) - jp _clrWindow - -;----------------------------- -;----------- worm ------------ -;----------------------------- - -inlink: - ld a,0 -sendbyte =$-1 - ld b,(ix+left) - dec b - jr z,receivefirst - call send - call receive - ld l,a - ret -receivefirst: - push af - call receive - ld l,a - pop af - push hl - call send - pop hl - ret - -inkeys: ;use jp not call! - out (1),a - in a,(1) - ld b,a - and (ix+right) - jr z,notright - ld a,l - add a,8 - ld l,a -notright: - ld a,b - and (ix+left) - jr z,donediddelydone - ld a,l - sub 8 - ld l,a - jr donediddelydone - -;------- handle worm --------- - -HandleWorm: - dec (ix+delay) - ret nz - inc (ix+delay) - ld l,(ix+heading) - ld a,(ix+input) - or a - jr nz,inkeys - call inlink -donediddelydone: - ld a,l - ld (sendbyte),a - ld (ix+heading),l - ld h,(ix+heading+1) - - ld c,(ix+pos) - ld b,(ix+pos+1) - ld e,(ix+pos2) - ld d,(ix+pos2+1) - -;-------- move worm ---------- - -Wormmove: - push bc ; >> pos - ld a,(hl) - add a,a - add a,d - ld d,a - bit 7,(hl) - jr z,notnegX - dec b -notnegX: - jr nc,notmoveX - inc b -notmoveX: - ld a,l - add a,$40 - ld l,a - ld a,(hl) - add a,a - add a,e - ld e,a - bit 7,(hl) - jr z,notnegY - dec c -notnegY: - jr nc,notmoveY - inc c -notmoveY: ;bc=newpos - ld (ix+pos2),e - ld (ix+pos2+1),d - ld (ix+pos),c - ld (ix+pos+1),b - -;-check- - pop hl ; << pos (old) - ld a,h - sub b - and 1 - ld h,a - ld a,l - sub c - and 1 - add a,h - ld d,4 - jr z,GotFour - xor 3 - ld d,a -GotFour: - call chk4pixels - rl d - jp nc,Drawworm - -;--------- worm hit ---------- - -Hitworm: - ld a,(gameCar) - ld h,a - and _datafood - jp z,WormDead - ld a,h - and _datahunt - call nz,checkhitotherworm - - ld hl,0 -PeaY =$-2 -PeaX =$-1 - ld a,b - sub h - inc a - cp 4 - jp nc,WormDead - ld a,c - sub l - inc a - cp 4 - jp nc,WormDead - call DrawPea - ld a,(ix+grow) - add a,15 - ld (ix+grow),a - call NewPea - ld hl,Left - dec (hl) - push af - ld de,10 - call IncScore - pop af - jr nz,still_alive_not_dead - ld a,(gameCar) - and _datafoodl - jr z,still_alive_not_dead - ld hl,Level - ld a,(hl) - inc (hl) - 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 - -;----------------------------- - -checkhitotherworm: - .db $dd,$7d ;ld a,lx - cp worm2&255 - ret nz -ThisIsJustASillyUselessLabel: - ld hl,(worm1+tail) - ld de,(worm1+head) -nextotherwormbit: - ld a,c - sub (hl) - inc hl - inc a - cp 4 - jr nc,nothit1 ;no - ld a,b - sub (hl) - inc a - cp 4 - jr c,otherwormHIT ;yes -nothit1: - inc hl - res resbit,h - call _cphlde - jr nz,nextotherwormbit - ret - -checkhitlapline: - ld a,63 - sub b - jr z,nextlaphalf - inc a - ret nz -nextlaphalf: - ld a,c - and 32 ;y>=32? - jr nz,nolap - cp (ix+reserv) - jr z,nolap - push bc - ld de,20 - call IncScore - pop bc - xor a -nolap: - ld (ix+reserv),a - ret - -otherwormHIT: - push ix - ld de,10 - call IncScore - ld ix,worm1 - call WormDead - pop ix - pop bc -still_alive_not_dead: - -;-------- draw worm ---------- - -Drawworm: - ld a,(gameCar) - and _datahunt - call nz,HuntingTimeScore - - ld c,(ix+pos) - ld b,(ix+pos+1) - - ld a,(gameCar) - and _datalaps - call nz,checkhitlapline - - ld l,(ix+head) - ld h,(ix+head+1) - ld (hl),c - inc hl - ld (hl),b - inc hl - res resbit,h - ld (ix+head),l - ld (ix+head+1),h - - call set4pixels - - ld a,(ix+grow) - dec a - jr z,removetail - ld (ix+grow),a - ret - -removetail: - ld l,(ix+tail) - ld h,(ix+tail+1) - ld c,(hl) - inc hl - ld b,(hl) - inc hl - res resbit,h - ld (ix+tail),l - ld (ix+tail+1),h - -res4pixels: - call ResPixel - inc b - call ResPixel - inc c - call ResPixel - dec b -ResPixel: - call 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 - 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 -ballymove: - inc c ;=%001100 dec=%001101 - call checkballhit - jr z,balldone - ld c,e - ld hl,ballymove - call letsmovetheotherway -balldone: - ld (ballpos),bc - jp set4pixels - -letsmovetheotherway: - ld a,1 - xor (hl) - ld (hl),a - ret - -checkballhit: - ld d,0 - call chk4pixels - xor a - cp d - 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 - - 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 - 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 - inc b - call SetPixel - inc c - call SetPixel - dec b -SetPixel: ;at bc - call FindPixel - or (hl) - ld (hl),a - ret - -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 - ret - -;CLEM's FIND_PIXEL (131 cycles; 28 bytes) -; (b,c) to hl:a; destroyes: -) - -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 - ret - -;----------- score ----------- - -HuntingTimeScore: - .db $dd,$7d ;ld a,lx - cp worm2&255 - ret z ;=worm#2 - dec (ix+reserv) - ret nz - ld de,10 - -IncScore: - ld h,(ix+score+1) - ld l,(ix+score) - add hl,de - jr scorecommon -DecScore: ;&&& - ld h,(ix+score+1) - ld l,(ix+score) - or a - sbc hl,de - ret c -scorecommon: - ld (ix+score+1),h - ld (ix+score),l - ld de,0 -scorelimit =$-2 - call _cphlde - jp nc,Exit - -showstats: - push ix - ld h,0 - ld l,h - ld (_penCol),hl - ld a,(nrworms) - ld b,a - ld ix,worm1 - ld a,(gameCar) - and _datanextl - jr nz,showstatsS -showstatloop: - push bc - call showstat - ld de,worm2-worm1 - add ix,de - ld hl,_penCol - ld a,(hl) - add a,10 - ld (hl),a - pop bc - djnz showstatloop - pop ix - ret - -showstat: - ld a,(gameCar) - and _datalivel - jr nz,showlives -showscore: - ld h,(ix+score+1) - ld l,(ix+score) - call _D_HL_DECI - jr __vputs -showlives: - ld a,(ix+lives) - add a,'0' -__vputmap: - push ix - call _vputmap - pop ix - ret - -showstatsS: - ld hl,txtLevel - call __vputs - ld a,(Level) - cp 10 - jr c,tilllevel9 - ld l,a - ld h,0 - call _divHLby10 - push af - ld a,l - add a,'0' - call __vputmap - pop af -tilllevel9: - add a,'0' - call __vputmap - - ld a,98 - ld (_penCol),a - call showscore - ld a,123 - ld (_penCol),a - call showlives - ld a,(gameCar) - and _datafoodl - pop ix - ret z -showleft: - ld a,31 - ld (_penCol),a - ld a,0 -Left =$-1 - push af - call _divAby10 - add a,'0' - call __vputmap - pop af - add a,'0' - call __vputmap - ld hl,txtLeft -__vputs: - push ix - call _vputs - pop ix - ret - -showLevel: - ld hl,txtLevel - call _puts - ld a,(Level) -showA: - cp 10 - jr c,LevelBelowTen - ld l,a - ld h,0 - call _divHLby10 - push af - ld a,l - add a,'0' - call _putc - pop af -LevelBelowTen: - add a,'0' - jp _putc - -showHL: - call _D_HL_DECI - jp _puts - -_D_HL_DECI: - ld de,savestr+4 - ld b,5 -ldhld: - call _divHLby10 - add a,'0' - ld (de),a - dec de - djnz ldhld - ld hl,savestr - ret -savestr: - .db "00000",0 - -;----------------------------- - -DisplayField: - ld a,c - sub 29 - jr nc,NotMinYScroll - xor a -NotMinYScroll: - cp 43 -FieldHeight =$-1 - jr c,NotMaxYScroll - ld a,(FieldHeight) -NotMaxYScroll: - ld l,a - ld h,0 - add hl,hl - add hl,hl - add hl,hl - add hl,hl - add hl,hl - push bc ; >> 1 - push de ; >> 2 - ld de,ScrBuffer - add hl,de - ld a,b - sub 64 - jr nc,NotMinXScroll - xor a -NotMinXScroll: - cp 128 -FieldWidth = $-1 - jr c,NotMaxXScroll - ld a,(FieldWidth) -NotMaxXScroll: - push af ; >> 3 - and %11111000 - rra - rra - rra - ld c,a - ld b,0 - ld de,DispBuffer - pop af ; << 2 - and %00000111 - push af ; >> 3 - cp 6 - jr c,CopyScreen - inc c -CopyScreen: - add hl,bc - ld b,57 -CopyScreenLoop: - push bc ; >> 4 - ld bc,16 - ldir - ld c,16 - add hl,bc - pop bc ; << 3 - djnz CopyScreenLoop - pop af ; << 2 - ld c,$b7 ;or a -Bit0: - jr nz,Bit1 - halt - halt - jr AfterShiftDelay -Bit1: - dec a - jr nz,Bit2 - call ShiftRight1 - jr AfterShiftDelay -Bit2: - dec a - jr nz,Bit3 - ld a,2 - call ShiftRight - jr AfterShiftDelay -Bit3: - dec a - jr nz,Bit4 - call Chunk - call ShiftLeft1 - jr AfterShift -Bit4: - dec a - jr nz,Bit5 - call Chunk - jr AfterShiftDelay -Bit5: - dec a - jr nz,Bit6 - call Chunk - call ShiftRight1 - jr AfterShift -Bit6: - dec a - jr nz,Bit7 - ld a,2 - call ShiftLeft - jr AfterShift -Bit7: - call ShiftLeft -AfterShiftDelay: - halt -AfterShift: - ld hl,DispBuffer - ld de,$fc00+$70 - ld bc,1024-$70 - ldir - pop de ; << 1 - pop bc ; << 0k - ret - -ShiftRight1: - ld a,1 -ShiftRight: - ld (ShiftRightCounter),a - ld a,c - ld (ShiftRightChunk),a - ld c,16 - add hl,bc - ld b,57 -ShiftRightLoop: - push bc - ld bc,-32 - add hl,bc - ex de,hl - ld a,(de) -ShiftRightChunk: - or a - call c,_SHLACC - ld c,0 -ShiftRightCounter = $-1 -ShiftRowsLeft: - push hl - rla - ld b,16 -ShiftRowLeft: - dec hl - rl (hl) - djnz ShiftRowLeft - pop hl - dec c - jr nz,ShiftRowsLeft - ld bc,-16 - add hl,bc - ex de,hl - pop bc - djnz ShiftRightLoop - ret - -ShiftLeft1: - ld a,1 -ShiftLeft: - ld (ShiftLeftCounter),a - ld a,c - ld (ShiftLeftChunk),a - rla - jr nc,ShiftLeftSameByte - dec hl -ShiftLeftSameByte: - ex de,hl - ld bc,-16 - add hl,bc -NewSprite: - ex de,hl - ld b,57 -ShiftLeftLoop: - push bc ; >> 1 - ld bc,-32 - add hl,bc - ex de,hl - ld a,(de) -ShiftLeftChunk: - or a - call c,_SHRACC - ld c,0 -ShiftLeftCounter = $-1 -ShiftRowsRight: - push hl ; >> 2 - rra - ld b,16 -ShiftRowRight: - rr (hl) - inc hl - djnz ShiftRowRight - pop hl ; << 1 - dec c - jr nz,ShiftRowsRight - ld bc,-16 - add hl,bc - ex de,hl - pop bc ; << 0k - djnz ShiftLeftLoop - ret - -Chunk: - push hl ; >> 1 - push de ; >> 2 - ld c,16 - add hl,bc - ld b,57 -ChunkScreen: - push bc ; >> 3 - ld bc,-32 - add hl,bc - ex de,hl - ld a,(de) - call _SHRACC - ld b,16 -ChunkRow: - dec hl - rld - djnz ChunkRow - ex de,hl - pop bc ; << 2 - djnz ChunkScreen - pop de ; << 1 - pop hl ; << 0k - ld c,$37 ;scf - ret - -;----------- draw ------------ - -loaddrawdata: - ld d,(hl) - inc hl - ld e,(hl) - inc hl - ld a,(hl) - inc hl - ret - -Line: ;draw line from de to hl (doptions) - .db "Hunting ",0 ;5 - .db "Race ",0 ;6 - .db "CTF ",0 ;7 - .db "Domination",0 ;(>=8) -txtWaiting: .db "Waiting...",0 -txtReceive: .db "Receiving...",0 - -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 -txthiscore:.db "HiScore:",0 -txtReady: .db "Prepare!",0 -txtposReady = 7 -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 -_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 - .db 3,0,%01111110,%10,%100 ;< > - .db "Worm #1",0 -worm2set: .dw $B800,$B800 ;%10111000 - .db 3,0,%00111111,%10000,%1000 ;f1 f2 - .db "Worm #2",0 -worm3set: .dw $E800,$E800 ;%11101000 ;$D748+$1000+ - .db 3,0,%01011111,%10,%100 ;sto , - .db "Worm #3",0 -worm4set: .dw $F000,$F000 ;%11110000 - .db 3,0,%01111101,%10,%1 ;enter + - .db "Worm #4",0 -worm1 = $B400 -worm2 = $B430 -worm3 = $B460 -worm4 = $B490 -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 - ;race:lap - ;hunt:time -input = 18 ;& -left = 19 ;& -right = 20 ;& -name = 21 ;game - -Level =$+1 -DispBuffer =$+2 ;912 bytes - -ScrBuffer = $8000 ;-$A1FF (32x256) -SinCosTable = $A200 ;-$A300 (4x64) - -;----------------------------- -;----------- end ------------- -;----------------------------- - -.end \ No newline at end of file