-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
; by Matthew Shepcar
; 30th December 1998
-; modified by Jonah Cohen 11-14-99
+; modified by Jonah Cohen 11-19-99
#include "TI86.inc"
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
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
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)
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)
dec a
jr nz,ReadyDelay
- ld hl,(HeadPos)
+ ld hl,(HeadPos) ;<====NEW
ld (TailPos),hl
pop hl
pop bc
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
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
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
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
dec d
ret
-FindPixel: ;bc to ahl + de gone
+FindPixel: ;bc to ahl + de gone ;<====NEW
push bc
ld a,b
and 7
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
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
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
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
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
.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
.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
.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
.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