From: Jonah Cohen Date: Tue, 23 Nov 1999 08:31:34 +0000 (+0100) Subject: final version by jonah X-Git-Url: http://git.shiar.nl/wormy.git/commitdiff_plain/bcb78186b07d00970fecbffb7986670a5f2b2a2b final version by jonah --- diff --git a/trigtab.asm b/trigtab.asm index b9f011f..f3807f1 100644 --- a/trigtab.asm +++ b/trigtab.asm @@ -1,28 +1,3 @@ -BuildTrigTables: - 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 - ret - TrigPrecalc: .db 0, 3, 6, 9, 12, 15, 18, 21 .db 24, 27, 30, 33, 36, 39, 42, 45 diff --git a/worm.asm b/worm.asm index 66d3549..33c8038 100644 --- a/worm.asm +++ b/worm.asm @@ -2,7 +2,7 @@ ; by Matthew Shepcar ; 30th December 1998 -; modified by Jonah Cohen 11-14-99 +; modified by Jonah Cohen 11-19-99 #include "TI86.inc" @@ -14,9 +14,32 @@ Start: ld (SpSave),sp call _runIndicOff + call _flushAllMenus call _clrLCD - call BuildTrigTables +;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 @@ -50,6 +73,10 @@ NextLife: 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 @@ -60,31 +87,59 @@ NextLife: 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 + ld bc,63 + ld (hl),%11111111 ldir inc hl - ld (hl),192 + ld (hl),%11000000 inc hl - ld b,14 + ld b,31 ClearLine: ld (hl),c inc hl djnz ClearLine - ld (hl),3 + 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,32 + ld c,64 ldir + pop hl ld a,(hl) @@ -141,12 +196,37 @@ NoLines: call NewPea - xor a + pop hl + pop bc + push bc + push hl call DisplayField ld hl,LevelMsg ld a,7 - call 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) + 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) @@ -157,7 +237,7 @@ ReadyDelay: dec a jr nz,ReadyDelay - ld hl,(HeadPos) + ld hl,(HeadPos) ;<====NEW ld (TailPos),hl pop hl pop bc @@ -165,32 +245,24 @@ ReadyDelay: 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 + ld a,2 Speed =$-1 + or a + jr z,HeadPos-1 Delay: halt dec a jr nz,Delay - ld hl,0A000h + ld hl,WormPos HeadPos =$-2 ld (hl),c inc hl ld (hl),b inc hl - res 4,h + res 2,h ;<====NEW ld (HeadPos),hl ld hl,SinCosTable @@ -332,13 +404,13 @@ WormCol =$-1 dec (hl) jr nz,GrowWorm inc (hl) - ld hl,0A000h + ld hl,$b000 TailPos =$-2 ld c,(hl) inc hl ld b,(hl) inc hl - res 4,h + res 2,h ;<====NEW ld (TailPos),hl call ResPixel @@ -401,27 +473,40 @@ Exit: ld (hl),a NotNewHigh: #endif + res 4,(iy+9) 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 +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,57-12 - ld b,a - ld a,l - and 7Fh - cp b - jr nc,NewPea - add a,5 - ld l,a + add a,51 + cp l + jr c,NewPea + inc l + inc l ld (PeaY),hl ld d,2 push hl @@ -458,24 +543,7 @@ DrawPeaPixel: 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 +;no random routine here ;<====NEW ResPixel: ;at bc call FindPixel @@ -499,7 +567,7 @@ CheckPixel: ;at bc in d dec d ret -FindPixel: ;bc to ahl + de gone +FindPixel: ;bc to ahl + de gone ;<====NEW push bc ld a,b and 7 @@ -507,18 +575,18 @@ FindPixel: ;bc to ahl + de gone 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,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 @@ -531,23 +599,20 @@ IncScore: 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 de,_penCol + ld a,79 + ld (de),a ld b,5 DoPutScore: - ld a,(hl) - inc hl - cp 32 - jr nz,NotZeroDigit - ld a,'0' -NotZeroDigit: - call _vputmap + push bc + push de + call _divHLby10 + call PutDigit + pop de + ld a,(de) + sub 8 + ld (de),a + pop bc djnz DoPutScore ret @@ -566,145 +631,142 @@ PutDigit: offsets_table: .db 128,64,32,16,8,4,2,1 -DisplayField: - ld l,a - ld h,0 +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 + ld de,ScrBuffer add hl,de - ld de,$FC00+$70 - ld bc,$0390 + 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 -DispMsg: +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 - 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: + rla + ld b,16 +ShiftRowLeft: dec hl rl (hl) djnz ShiftRowLeft @@ -715,27 +777,35 @@ eft: add hl,bc ex de,hl pop bc - djnz ShiftLeftLoop - ld a,(ShiftBitsLeft) - jr NoShift -ShiftRight: + 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 c,16 - sbc hl,bc + ld bc,-16 + add hl,bc ex de,hl ld b,57 - cpl - add a,9 - ld (ShiftBitsRight),a -ShiftRightLoop: +ShiftLeftLoop: push bc ld bc,-32 add hl,bc ex de,hl ld a,(de) +ShiftLeftChunk: + or a + call c,_SHRACC ld c,0 -ShiftBitsRight = $-1 +ShiftLeftCounter = $-1 ShiftRowsRight: push hl rra @@ -751,59 +821,66 @@ ShiftRowRight: 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 + 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,2 ;5 peas, speed 9 + + .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,2 + .db 8,4 .db 4,14,$40 .db 128,57 .db 1 .db 28,28,100,28 - .db 9,2 + .db 9,4 .db 4,8,$40 .db 128,57 .db 2 .db 28,14,100,14 .db 28,41,100,41 - .db 9,1 + .db 9,3 .db 4,8,$40 .db 128,80 .db 2 .db 64,14,64,66 .db 20,40,108,40 - .db 10,1 + .db 10,3 .db 4,8,$40 .db 128,90 .db 3 @@ -811,7 +888,7 @@ Levels: .db 110,20,110,70 .db 18,45,110,45 - .db 7,1 + .db 7,3 .db 64,4,0 .db 128,86 .db 6 @@ -822,7 +899,7 @@ Levels: .db 16,20,16,64 .db 110,20,110,64 - .db 9,0 + .db 9,2 .db 4,10,$40 .db 128,82 .db 3 @@ -830,7 +907,7 @@ Levels: .db 54,40,128,40 .db 0,60,74,60 - .db 12,0 + .db 12,2 .db 64,4,0 .db 128,90 .db 6 @@ -841,7 +918,7 @@ Levels: .db 20,72,54,72 .db 74,72,110,72 - .db 8,0 + .db 8,2 .db 72,52,$c0 .db 128,128 .db 13