; -WonderWorm--v0.9- ; by Matthew Shepcar ; 30th December 1998 ; modified by Jonah Cohen 11-14-99 #include "TI86.inc" .org _asm_exec_ram nop jp Start .dw 0,WormMsg Start: ld (SpSave),sp call _runIndicOff call _clrLCD call BuildTrigTables 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,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,9 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 push af ld a,l add a,8 ld l,a pop af 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 jp 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 ld a,(hl) inc (hl) pop bc pop de pop hl pop de cp NUM_LEVELS jp nz,StartLevel jr Exit 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 ld bc,$0103 out (c),b halt ld b,11 out (c),b NotPaused: pop bc pop de rla jp c,GameLoop jr Exit ; 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 Exit: #if 0 ld a,(Eaten) ld hl,HiScore cp (hl) jr c,NotNewHigh ld (hl),a ld hl,_asapvar 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 ld sp,0 SpSave = $-2 jp _clrWindow NewPea: ;------------------------------procs 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: ;at bc call FindPixel cpl and (hl) ld (hl),a ret SetPixel: ;at bc call FindPixel or (hl) ld (hl),a ret CheckPixel: ;at bc in d push de call FindPixel and (hl) pop de ret z dec d ret FindPixel: ;bc to ahl + de gone 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 _divHLby10 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 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,$FC00+$70 ld bc,$0390 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 NUM_LEVELS = 9 Levels: .db 5,9 ;5 peas, speed 7 .db 64,4,0 ;x,y,d .db 57 ;field height .db 0 ;no additional lines .db 8,9 .db 4,14,$40 .db 57 .db 1 .db 28,28,100,28 .db 9,8 .db 4,8,$40 .db 57 .db 2 .db 28,14,100,14 .db 28,41,100,41 .db 9,8 .db 4,8,$40 .db 80 .db 2 .db 64,14,64,66 .db 20,40,108,40 .db 10,7 .db 4,8,$40 .db 90 .db 3 .db 18,20,18,70 .db 110,20,110,70 .db 18,45,110,45 .db 7,7 .db 64,4,0 .db 86 .db 6 .db 34,13,56,35 .db 34,71,56,49 .db 72,35,94,13 .db 72,49,94,71 .db 16,20,16,64 .db 110,20,110,64 .db 9,7 .db 4,10,$40 .db 82 .db 3 .db 0,20,74,20 .db 54,40,128,40 .db 0,60,74,60 .db 12,7 .db 64,4,0 .db 90 .db 6 .db 20,16,54,16 .db 74,16,110,16 .db 20,16,20,72 .db 110,16,110,72 .db 20,72,54,72 .db 74,72,110,72 .db 8,7 .db 72,52,$c0 .db 128 .db 13 .db 34,56,56,34 .db 34,72,56,94 .db 72,34,94,56 .db 72,94,94,72 .db 46,64,80,64 .db 22,11,22,33 .db 11,22,33,22 .db 22,95,22,117 .db 11,106,33,106 .db 103,11,103,33 .db 91,22,115,22 .db 103,95,103,117 .db 91,106,115,106 #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 Left =$ Lives =$+1 Level =$+2 Score =$+3 SinCosTable =09E00h ScrBuffer =8200h ;size $1400 (at least) .end eft: 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 ShiftLeftLoop ld a,(ShiftBitsLeft) jr NoShift ShiftRight: dec hl ex de,hl ld c,16 sbc hl,bc ex de,hl ld b,57 cpl add a,9 ld (ShiftBitsRight),a ShiftRightLoop: push bc ld bc,-32 add hl,bc ex de,hl ld a,(de) ld c,0 ShiftBitsRight = $-1 ShiftRowsRight: push hl rra ld b,16 ShiftRowRight: rr (hl) inc hl djnz ShiftRowRight pop hl dec c jr nz,ShiftRowsRight ld bc,-16 add hl,bc ex de,hl pop bc djnz ShiftRightLoop ld a,(ShiftBitsRight) NoShift: ld hl,DispBuffer ld de,$fc00+$70 ld bc,1024-$70 ldir cpl add a,8 jr z,NoShiftDelay ShiftDelay: ld bc,$0005 ShiftDelayLoop = $-1 djnz ShiftDelayLoop dec c jr nz,ShiftDelayLoop dec a jr nz,ShiftDelay NoShiftDelay: pop de pop bc ret NUM_LEVELS = 9 Levels: .db 5,2 ;5 peas, speed 9 .db 64,4,0 ;x,y,d .db 0,0 ;field width, height .db 0 ;no additional lines .db 8,2 .db 4,14,$40 .db 128,57 .db 1 .db 28,28,100,28 .db 9,2 .db 4,8,$40 .db 128,57 .db 2 .db 28,14,100,14 .db 28,41,100,41 .db 9,1 .db 4,8,$40 .db 128,80 .db 2 .db 64,14,64,66 .db 20,40,108,40 .db 10,1 .db 4,8,$40 .db 128,90 .db 3 .db 18,20,18,70 .db 110,20,110,70 .db 18,45,110,45 .db 7,1 .db 64,4,0 .db 128,86 .db 6 .db 34,13,56,35 .db 34,71,56,49 .db 72,35,94,13 .db 72,49,94,71 .db 16,20,16,64 .db 110,20,110,64 .db 9,0 .db 4,10,$40 .db 128,82 .db 3 .db 0,20,74,20 .db 54,40,128,40 .db 0,60,74,60 .db 12,0 .db 64,4,0 .db 128,90 .db 6 .db 20,16,54,16 .db 74,16,110,16 .db 20,16,20,72 .db 110,16,110,72 .db 20,72,54,72 .db 74,72,110,72 .db 8,0 .db 72,52,$c0 .db 128,128 .db 13 .db 34,56,56,34 .db 34,72,56,94 .db 72,34,94,56 .db 72,94,94,72 .db 46,64,80,64 .db 22,11,22,33 .db 11,22,33,22 .db 22,95,22,117 .db 11,106,33,106 .db 103,11,103,33 .db 91,22,115,22 .db 103,95,103,117 .db 91,106,115,106 #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 Left =$ Lives =$+1 Level =$+2 Score =$+3 DispBuffer =$+5 ScrBuffer =$8200 ;32x256 bytes SinCosTable =$a200 WormPos = $b000 .end