; -WonderWorm--v0.9- ; by Matthew Shepcar ; 30th December 1998 ; modified by Jonah Cohen 11-19-99 #include "TI86.inc" .org _asm_exec_ram nop jp Start .dw 0,WormMsg Start: ld (SpSave),sp call _runIndicOff call _flushAllMenus call _clrLCD ;build trig tables ld hl,TrigPrecalc ld de,SinCosTable push de ld bc,65 ldir dec hl ld b,63 MirrorSineWave: dec hl ld a,(hl) ld (de),a inc de djnz MirrorSineWave pop hl ld b,128+64 NegativeSineWave: xor a sub (hl) ld (de),a inc hl inc de djnz NegativeSineWave 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 128 ld (FieldWidth),a 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 add hl,hl ex de,hl ld hl,ScrBuffer push hl push de 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 ld a,(FieldWidth) add a,126 push af and %11111000 rra rra rra ld l,a ld h,0 add hl,de pop af 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 pop bc ldir pop hl ld c,64 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 pop hl pop bc push bc push hl call DisplayField ld hl,LevelMsg ld a,7 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) call _puts ld a,(Level) 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' call _putc res 3,(iy+5) xor a ReadyDelay: halt dec a jr nz,ReadyDelay ld hl,(HeadPos) ;<====NEW ld (TailPos),hl pop hl pop bc push hl ld de,0 GameLoop: call DisplayField ld a,2 Speed =$-1 or a jr z,HeadPos-1 Delay: halt dec a jr nz,Delay ld hl,WormPos HeadPos =$-2 ld (hl),c inc hl ld (hl),b inc hl res 2,h ;<====NEW 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,$b000 TailPos =$-2 ld c,(hl) inc hl ld b,(hl) inc hl res 2,h ;<====NEW 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 res 4,(iy+9) ld sp,0 SpSave = $-2 jp _clrWindow NewPea: ;------------------------------procs ;<====NEW ;random routine 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,(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 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 ;no random routine here ;<====NEW 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 ;<====NEW push bc ld a,b and 7 add a,offsets_table & 255 ld e,a ld d,offsets_table/256 ld h,0 ld l,c add hl,hl add hl,hl add hl,hl add hl,hl add hl,hl ld a,b and %11111000 rra rra rra or l 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 de,_penCol ld a,79 ld (de),a ld b,5 DoPutScore: push bc push de call _divHLby10 call PutDigit pop de ld a,(de) sub 8 ld (de),a pop bc 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: ;<====NEW 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 push de 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 and %11111000 rra rra rra ld c,a ld b,0 ld de,DispBuffer pop af and %00000111 push af cp 6 jr c,CopyScreen inc c CopyScreen: add hl,bc ld b,57 CopyScreenLoop: push bc ld bc,16 ldir ld c,16 add hl,bc pop bc djnz CopyScreenLoop pop af 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 pop bc ret ShiftRight1: ;<====NEW 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: ;<====NEW 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 ex de,hl ld b,57 ShiftLeftLoop: push bc 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 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 ShiftLeftLoop ret Chunk: ;<====NEW push hl push de ld c,16 add hl,bc ld b,57 ChunkScreen: push bc 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 djnz ChunkScreen pop de pop hl ld c,$37 ;scf ret NUM_LEVELS = 9 Levels: .db 5,3 ;5 peas, speed 5 .db 64,4,0 ;x,y,d .db 0,0 ;field width, height .db 0 ;no additional lines .db 8,4 .db 4,14,$40 .db 128,57 .db 1 .db 28,28,100,28 .db 9,4 .db 4,8,$40 .db 128,57 .db 2 .db 28,14,100,14 .db 28,41,100,41 .db 9,3 .db 4,8,$40 .db 128,80 .db 2 .db 64,14,64,66 .db 20,40,108,40 .db 10,3 .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,3 .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,2 .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,2 .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,2 .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