; -WonderWorm--v0.9- ; by Matthew Shepcar ; 30th December 1998 #include asm86.h #include ti86asm.inc #include ti86abs.inc .org _asm_exec_ram nop jp Start .dw 0,WormMsg Start: call _runindicoff call _clrLCD call BuildTrigTables ld hl,0FC00h ld de,GreyBuf ld bc,400h ldir ld hl,IHandler ld bc,IHandlerEnd-IHandler ld de,0BCBCh ldir ld hl,0BD00h ld (hl),d ld de,0BD01h ld a,d ld bc,256 ldir ld i,a im 2 ld a,r ld (Seed),a ld hl,0 ld (Score),hl ld a,1 ld (Level),a ld a,3 ld (Lives),a ld hl,Levels StartLevel: ld a,(hl) ld (Left),a inc hl ld a,(hl) ld (Speed),a inc hl ld a,25 NextLife: ld (GrowAmt),a push hl ld d,(hl) inc hl ld e,(hl) inc hl ld a,(hl) inc hl ld (Heading),a push de ld a,(hl) inc hl sub 57 ld (FieldHeight),a add a,57-5 push hl ld l,a ld h,0 add hl,hl add hl,hl add hl,hl add hl,hl ex de,hl ld hl,ScrBuffer push hl push de ld de,ScrBuffer+1 ld bc,31 ld (hl),-1 ldir inc hl ld (hl),192 inc hl ld b,14 ClearLine: ld (hl),c inc hl djnz ClearLine ld (hl),3 inc hl ex de,hl pop bc ldir pop hl ld c,32 ldir pop hl ld a,(hl) inc hl or a jr z,NoLines DrawLines: push af ld d,(hl) inc hl ld e,(hl) inc hl ld a,(hl) inc hl push hl 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 inc hl pop af dec a jr nz,DrawLines NoLines: push hl ld hl,ScrBuffer ld de,ScrBuffer+BufSize ld bc,BufSize ldir ld hl,0 ld (_penCol),hl ld hl,LivesMsg call _vputs ld a,(Lives) add a,'0' call _vputmap ld a,40 ld (_penCol),a call _vputs ;scoremsg ld a,100 ld (_penCol),a call _vputs ld a,(Left) call PutNum call PutScore call NewPea xor a call DisplayField ld hl,LevelMsg ld a,7 call DispMsg ld a,(Level) add a,'0' call _putc res 3,(iy+5) xor a ReadyDelay: halt dec a jr nz,ReadyDelay ld hl,(HeadPos) ld (TailPos),hl pop hl pop bc push hl ld de,0 GameLoop: ld a,c sub 29 jr nc,NotMinScroll xor a NotMinScroll: cp 43 FieldHeight =$-1 jr c,NotMaxScroll ld a,(FieldHeight) NotMaxScroll: call DisplayField ld a,5 Speed =$-1 Delay: halt dec a jr nz,Delay ld hl,0A000h HeadPos =$-2 ld (hl),c inc hl ld (hl),b inc hl res 4,h ld (HeadPos),hl ld hl,SinCosTable Heading =$-2 ld a,0FEh out (1),a in a,(1) rra rra jr c,NotRight ld a,l add a,8 ld l,a inc a NotRight: rra jr c,NotLeft ld a,l sub 8 ld l,a NotLeft: ld (Heading),hl push bc 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,40h 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: pop hl push de 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 CheckPixel inc b call CheckPixel inc c call CheckPixel dec b call CheckPixel dec c rl d jr nc,WormNotCrashed 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 jr nc,WormDead push bc call DrawPea ld a,0 GrowAmt =$-1 add a,15 ld (GrowAmt),a call NewPea ld de,10 call IncScore ld a,119 ld (_penCol),a ld hl,Left dec (hl) jr nz,NotNextLevel ld hl,Level inc (hl) pop bc pop de pop hl pop de jp StartLevel NotNextLevel: ld a,(hl) call PutNum pop bc WormNotCrashed: push bc ld a,3 WormCol =$-1 call SetPixel inc b call SetPixel inc c call SetPixel dec b call SetPixel ; xor 2 ; ld (WormCol),a ld hl,GrowAmt dec (hl) jr nz,GrowWorm inc (hl) ld hl,0A000h TailPos =$-2 ld c,(hl) inc hl ld b,(hl) inc hl res 4,h ld (TailPos),hl call ResPixel inc b call ResPixel inc c call ResPixel dec b call ResPixel GrowWorm: ld a,0BFh out (1),a in a,(1) rla jr c,NotPaused call _getky WaitUnpause: halt call _getky or a jr z,WaitUnpause ld a,128 NotPaused: pop bc pop de rla jp c,GameLoop push hl WormDead: pop de pop hl ld hl,(HeadPos) ld de,(TailPos) sbc hl,de ld a,l rr h rra ld hl,Lives dec (hl) pop hl jp nz,NextLife #if 0 ld a,(Eaten) ld hl,HiScore cp (hl) jr c,NotNewHigh ld (hl),a ld hl,Varname-1 rst 20h rst 10h call 460Bh ld de,HiScore-_asm_exec_ram+2 add hl,de adc a,0 call _load_ram_ahl ld a,(HiScore) ld (hl),a NotNewHigh: #endif im 1 ld a,03Ch out (0),a call _clrScrn call _homeup jp _getky NewPea: call Random ld a,h and 7Fh cp 77h jr nc,NewPea add a,3 ld h,a ld a,(FieldHeight) add a,57-12 ld b,a ld a,l and 7Fh cp b jr nc,NewPea add a,5 ld l,a ld (PeaY),hl ld d,2 push hl call CheckPea pop hl dec d jr z,NewPea DrawPea: ld d,0 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 and (hl) ret z ld d,1 ret DrawPeaPixel: xor (hl) ld (hl),a ret Random: ld hl,0 ld de,12345 Seed =$-2 ld a,7921 & 255 ld bc,1000h+(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) MOD 65536 ld a,h ret ResPixel: call FindPixel cpl ld d,a and (hl) ld (hl),a ld a,d ld de,BufSize add hl,de and (hl) ld (hl),a ret SetPixel: push bc push af push af call FindPixel pop de ld e,a rr d jr c,SetGrey1 cpl and (hl) ld (hl),a SetGrey1: or (hl) ld (hl),a ld bc,BufSize add hl,bc ld a,e rr d jr c,SetGrey2 cpl and (hl) ld (hl),a SetGrey2: or (hl) ld (hl),a pop af pop bc ret CheckPixel: push de call FindPixel push af and (hl) ld de,BufSize add hl,de ld e,a pop af and (hl) or e pop de ret z dec d ret FindPixel: push bc ld a,b and 7 add a,offsets_table & 255 ld e,a ld d,offsets_table/256 ld h,0 ld a,c add a,a add a,a rl h add a,a rl h add a,a rl h srl b srl b srl b or b ld l,a ld a,(de) ld de,ScrBuffer add hl,de pop bc ret IncScore: ld hl,(Score) add hl,de ld (Score),hl PutScore: ld hl,-1 ld (_curRow),hl ld a,63 ld (_penCol),a ld hl,(Score) xor a call 4A33h dec hl ld b,5 DoPutScore: ld a,(hl) inc hl cp 32 jr nz,NotZeroDigit ld a,'0' NotZeroDigit: call _vputmap djnz DoPutScore ret PutNum: ld l,a ld h,0 call UNPACK_HL push af ld a,l call PutDigit pop af PutDigit: add a,'0' jp _vputmap offsets_table: .db 128,64,32,16,8,4,2,1 IHandler: exx ex af,af' in a,(3) bit 1,a jr z,notvbl ld hl,GreyCounter inc (hl) ld a,(hl) cp 3 ld a,3Ch jr nz,notpage1 ld (hl),0 ld a,(GreyBuf/256)-0C0h notpage1: out (0),a notvbl: jp 3Ah IHandlerEnd: GreyCounter .db 0 DisplayField: ld l,a ld h,0 add hl,hl add hl,hl add hl,hl add hl,hl push bc push de ld de,ScrBuffer add hl,de ld de,0FC70h ld bc,00390h ldir ld de,BufSize-390h add hl,de ld de,GreyBuf+70h ld bc,00390h ldir pop de pop bc ret DispMsg: push hl ld h,a ld l,4 ld (_curRow),hl ld hl,0FDE0h ld de,0FDE1h ld (hl),-1 ld bc,0BFh ldir pop hl set 3,(iy+5) jp _puts Levels: .db 5,7 ;5 peas, speed 7 .db 64,4,0 ;x,y,d .db 57 ;field height .db 0 ;no additional lines .db 8,6 .db 4,14,40h .db 57 .db 1 .db 28,28,100,28 .db 99,5 .db 4,14,40h .db 100 .db 2 .db 28,28,28,72 .db 100,28,100,72 #include trigtab.asm #include line.asm WormMsg .db "Wonderworm!",0 LevelMsg .db "Level ",0 LivesMsg .db "Lives: ",0 ScoreMsg .db "Score: ",0 LeftMsg .db "Food: ",0 HiScore .db 0 Varname .db 4,"worm" Left =$ Lives =$+1 Level =$+2 Score =$+3 SinCosTable =09E00h ScrBuffer =8200h BufSize =0A00h GreyBuf =0F400h .end