X-Git-Url: http://git.shiar.nl/wormy.git/blobdiff_plain/50c1e65dc9f0f79f155e399577771e8d9757063c..f28fc4783bc8d8a2038e5fa4c10406ba11a79290:/worm.asm diff --git a/worm.asm b/worm.asm index 85ffafb..66d3549 100644 --- a/worm.asm +++ b/worm.asm @@ -1,71 +1,184 @@ - -; -- Peaworm v0.9 -- +; -WonderWorm--v0.9- ; by Matthew Shepcar -; 28th December 1998 +; 30th December 1998 + +; modified by Jonah Cohen 11-14-99 -#include asm86.h -#include ti86asm.inc -#include ti86abs.inc +#include "TI86.inc" .org _asm_exec_ram - - nop - jp Start + + nop + jp Start .dw 0,WormMsg Start: - - call _runindicoff + ld (SpSave),sp + call _runIndicOff call _clrLCD + call BuildTrigTables + ld a,r ld (Seed),a - ld hl,0FC70h + 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 - ld de,0FC71h + push de + ld de,ScrBuffer+1 ld bc,31 ld (hl),-1 ldir inc hl ld (hl),192 - ld l,9*16+15 + inc hl + ld b,14 +ClearLine: + ld (hl),c + inc hl + djnz ClearLine ld (hl),3 inc hl ex de,hl - ld bc,52*16 + 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 (_penCol),de - ld hl,WormMsg + ld hl,0 + ld (_penCol),hl + ld hl,LivesMsg call _vputs - ld a,48 + ld a,(Lives) + add a,'0' + call _vputmap + + ld a,40 ld (_penCol),a - call _vputs - ld a,91 + call _vputs ;scoremsg + ld a,100 ld (_penCol),a call _vputs - ld a,(hl) + ld a,(Left) call PutNum - call BuildTrigTables + call PutScore call NewPea - ld a,25 - ld (GrowAmt),a + + 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 - xor a - ld (Heading),a - ld (Eaten),a - ld bc,0400Ah - ld d,a - ld e,a + pop hl + pop bc + push hl + ld de,0 GameLoop: - ld a,8 + 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 @@ -89,10 +202,11 @@ Heading =$-2 rra rra jr c,NotRight + push af ld a,l add a,8 ld l,a - inc a + pop af NotRight: rra jr c,NotLeft @@ -157,18 +271,18 @@ GotFour: rl d jr nc,WormNotCrashed ld hl,0 -PeaX =$-2 -PeaY =$-1 +PeaY =$-2 +PeaX =$-1 ld a,b sub h inc a cp 4 - jr nc,WormDead + jp nc,WormDead ld a,c sub l inc a cp 4 - jr nc,WormDead + jp nc,WormDead push bc call DrawPea ld a,0 @@ -176,16 +290,33 @@ GrowAmt =$-1 add a,15 ld (GrowAmt),a call NewPea - ld a,70 + ld de,10 + call IncScore + ld a,119 ld (_penCol),a - ld hl,Eaten + 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 @@ -194,6 +325,9 @@ WormNotCrashed: dec b call SetPixel +; xor 2 +; ld (WormCol),a + ld hl,GrowAmt dec (hl) jr nz,GrowWorm @@ -222,26 +356,40 @@ GrowWorm: in a,(1) rla jr c,NotPaused - call _getky -WaitUnpause: - call _getky - or a - jr z,WaitUnpause - ld a,128 + ld bc,$0103 + out (c),b + halt + ld b,11 + out (c),b NotPaused: pop bc pop de rla jp c,GameLoop - push hl + 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,Varname-1 + ld hl,_asapvar rst 20h rst 10h call 460Bh @@ -252,25 +400,29 @@ WormDead: ld a,(HiScore) ld (hl),a NotNewHigh: - call _clrScrn - call _homeup - jp _getky +#endif + ld sp,0 +SpSave = $-2 + jp _clrWindow -NewPea: +NewPea: ;------------------------------procs call Random ld a,h and 7Fh - cp 7Bh + cp 77h jr nc,NewPea - add a,2 + add a,3 ld h,a + ld a,(FieldHeight) + add a,57-12 + ld b,a ld a,l - and 3Fh - cp 30h + and 7Fh + cp b jr nc,NewPea - add a,12 + add a,5 ld l,a - ld (PeaX),hl + ld (PeaY),hl ld d,2 push hl call CheckPea @@ -313,32 +465,32 @@ Seed =$-2 ld a,7921 & 255 ld bc,1000h+(7921/256) domult16: - add hl,hl - rla + add hl,hl + rla rl c - jr nc,noadd16 - add hl,de + jr nc,noadd16 + add hl,de noadd16: - djnz domult16 + djnz domult16 inc hl ld (Seed),hl ;seed=(seed*7921+1) MOD 65536 ld a,h ret -ResPixel: +ResPixel: ;at bc call FindPixel cpl and (hl) - ld (hl),a + ld (hl),a ret -SetPixel: +SetPixel: ;at bc call FindPixel - or (hl) - ld (hl),a + or (hl) + ld (hl),a ret -CheckPixel: +CheckPixel: ;at bc in d push de call FindPixel and (hl) @@ -347,7 +499,7 @@ CheckPixel: dec d ret -FindPixel: +FindPixel: ;bc to ahl + de gone push bc ld a,b and 7 @@ -369,17 +521,40 @@ FindPixel: or b ld l,a ld a,(de) - dec h - dec h - dec h - dec h + 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 + call _divHLby10 push af ld a,l call PutDigit @@ -391,15 +566,319 @@ PutDigit: offsets_table: .db 128,64,32,16,8,4,2,1 -#include trigtab.asm +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 -WormMsg .db "Peaworm!",0 -PeasMsg .db "Eaten: 00",0 -HiMsg .db "Hiscore: ",0 +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 -Varname .db 4,"worm" -Eaten =$ -SinCosTable =09000h +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