; 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 "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 ;----------------------------- ;------- 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 levelfile: .db 7,"wormlvl" Start: ld (SpSave),sp call _runindicoff call _flushallmenus call _clrLCD ld hl,levelfile-1 rst 20h ;_ABS_MOV10TOOP1 rst 10h ;_FINDSYM ret c ;not found ex de,hl ld a,b ;call _ex_ahl_bde call _SET_ABS_SRC_ADDR xor a ld hl,leveldata ;datalevels call _SET_ABS_DEST_ADDR xor a ld hl,2 call _SET_MM_NUM_BYTES call _mm_ldir xor a ld hl,datalevels call _SET_ABS_DEST_ADDR xor a ld hl,16 call _SET_MM_NUM_BYTES call _mm_ldir xor a ld hl,leveldata call _SET_ABS_DEST_ADDR xor a ld hl,400 call _SET_MM_NUM_BYTES call _mm_ldir call _RAM_PAGE_1 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 GET_KEY 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,gamesdata ld a,(Gametype) ld e,a ld d,0 add hl,de ld a,(hl) ld (gameCar),a add hl,de ld e,8 ;=de add hl,de ld d,a ;push af 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? and _datascore ld de,$FF64 ;virt.infinate jr z,setscorelimit ld d,0 ;de=100 setscorelimit: ld (scorelimit),de call _ldHLind ;ld hl,(hl) pop af push hl and _datalink jr z,GameOver linkmatch: call _clrWindow ld a,WormVersion call send jr c,client ;2nd host: ld hl,txtWaiting call _puts call receive cp WormVersion jp nz,LinkBreak call send ld hl,SwapPos ld (hl),$f6 jr multiplayer client: ld hl,txtReceive call _puts call receive cp WormVersion jp nz,LinkBreak multiplayer: ld a,2 ld (nrworms),a ;----------------------------- ;--------- 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 hl StartLevel: 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 ex de,hl ldi ;d ld a,SinCosTable/256 ld (de),a inc de ldi ;y ldi ;x ex de,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,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 ld hl,$0807 ld (_curRow),hl ld hl,txthiscore call _puts ex de,hl ;pop call showHL hiscorecheckdone: waitkey: halt halt call GET_KEY 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 hl ; << 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+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 push de ld de,ScrBuffer add hl,de pop de 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 _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 datapeas: .db %00011010 datadeathm: .db %00000010 datafoodm: .db %10010000 datalinkm: .db %00000011 datahuntin: .db %10100000 datarace: .db %11000000 datactf: .db %00000000 ;==(8 modes) ;datadomin: .db %00000000 datalevels: .dw LevelDef, LevelDef .dw LevelDefM,LevelDefM .dw LevelDefM,LevelDefM .dw LevelDefM,LevelDefM 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 $F000,$F000 ;$E800=%11101000 ;$D748+$1000+ .db 3,0,%01011111,%10,%100 ;sto , .db "Worm #3",0 worm4set: .dw $A800,$A800 ;$F000=%11110000 .db 3,0,%01111101,%10,%1 ;enter + .db "Worm #4",0 worm1 = $B400 worm2 = $B42A worm3 = $B454 worm4 = $B47E ;-A8 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 = $8100 ;-$A2FF (32x256) mod$800=0 SinCosTable = $B500 ;size=$100 (4x64) ;----------------------------- ;----------- end ------------- ;----------------------------- .end .end