X-Git-Url: http://git.shiar.nl/wormy.git/blobdiff_plain/fdf8f011d4a41fb2932efc938a282f263e164f46..bcb78186b07d00970fecbffb7986670a5f2b2a2b:/worm.asm?ds=sidebyside diff --git a/worm.asm b/worm.asm index 0abad60..33c8038 100644 --- a/worm.asm +++ b/worm.asm @@ -1,41 +1,45 @@ - ; -WonderWorm--v0.9- ; by Matthew Shepcar ; 30th December 1998 -#include asm86.h -#include ti86asm.inc -#include ti86abs.inc +; modified by Jonah Cohen 11-19-99 + +#include "TI86.inc" .org _asm_exec_ram - + nop jp Start .dw 0,WormMsg Start: - - call _runindicoff + ld (SpSave),sp + call _runIndicOff + call _flushAllMenus 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 +;build trig tables + ld hl,TrigPrecalc + ld de,SinCosTable + push de + ld bc,65 ldir - ld i,a - im 2 + 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 @@ -69,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 @@ -79,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) @@ -139,11 +175,6 @@ DrawLines: NoLines: push hl - ld hl,ScrBuffer - ld de,ScrBuffer+BufSize - ld bc,BufSize - ldir - ld hl,0 ld (_penCol),hl ld hl,LivesMsg @@ -165,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) @@ -181,7 +237,7 @@ ReadyDelay: dec a jr nz,ReadyDelay - ld hl,(HeadPos) + ld hl,(HeadPos) ;<====NEW ld (TailPos),hl pop hl pop bc @@ -189,33 +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,5 + 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 @@ -227,10 +274,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 @@ -306,7 +354,7 @@ PeaX =$-1 sub l inc a cp 4 - jr nc,WormDead + jp nc,WormDead push bc call DrawPea ld a,0 @@ -322,12 +370,15 @@ GrowAmt =$-1 dec (hl) jr nz,NotNextLevel ld hl,Level + ld a,(hl) inc (hl) pop bc pop de pop hl pop de - jp StartLevel + cp NUM_LEVELS + jp nz,StartLevel + jr Exit NotNextLevel: ld a,(hl) @@ -353,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 @@ -377,19 +428,18 @@ GrowWorm: in a,(1) rla jr c,NotPaused - call _getky -WaitUnpause: + ld bc,$0103 + out (c),b halt - call _getky - or a - jr z,WaitUnpause - ld a,128 + 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 @@ -403,6 +453,7 @@ WormDead: dec (hl) pop hl jp nz,NextLife +Exit: #if 0 ld a,(Eaten) @@ -410,7 +461,7 @@ WormDead: cp (hl) jr c,NotNewHigh ld (hl),a - ld hl,Varname-1 + ld hl,_asapvar rst 20h rst 10h call 460Bh @@ -422,31 +473,40 @@ WormDead: ld (hl),a NotNewHigh: #endif + res 4,(iy+9) + ld sp,0 +SpSave = $-2 + jp _clrWindow - 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 +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 @@ -483,85 +543,31 @@ 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: +ResPixel: ;at bc 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 + ld (hl),a ret -SetPixel: - push bc - push af - push af +SetPixel: ;at bc 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 + or (hl) + ld (hl),a ret -CheckPixel: +CheckPixel: ;at bc in d 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: +FindPixel: ;bc to ahl + de gone ;<====NEW push bc ld a,b and 7 @@ -569,18 +575,18 @@ FindPixel: 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 @@ -593,30 +599,27 @@ 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 PutNum: ld l,a ld h,0 - call UNPACK_HL + call _divHLby10 push af ld a,l call PutDigit @@ -628,86 +631,315 @@ PutDigit: 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: +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 de,0FC70h - ld bc,00390h + 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 de,BufSize-390h - add hl,de - ld de,GreyBuf+70h - ld bc,00390h + 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 + rla + ld b,16 +ShiftRowLeft: + dec hl + rl (hl) + djnz ShiftRowLeft pop hl - set 3,(iy+5) - jp _puts + 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,7 ;5 peas, speed 7 + + .db 5,3 ;5 peas, speed 5 .db 64,4,0 ;x,y,d - .db 57 ;field height + .db 0,0 ;field width, height .db 0 ;no additional lines - .db 8,6 - .db 4,14,40h - .db 57 + .db 8,4 + .db 4,14,$40 + .db 128,57 .db 1 .db 28,28,100,28 - .db 99,5 - .db 4,14,40h - .db 100 + .db 9,4 + .db 4,8,$40 + .db 128,57 .db 2 - .db 28,28,28,72 - .db 100,28,100,72 + .db 28,14,100,14 + .db 28,41,100,41 -#include trigtab.asm -#include line.asm + .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 @@ -715,16 +947,15 @@ 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 +DispBuffer =$+5 -SinCosTable =09E00h -ScrBuffer =8200h -BufSize =0A00h -GreyBuf =0F400h +ScrBuffer =$8200 ;32x256 bytes +SinCosTable =$a200 +WormPos = $b000 .end