-
-; -- Peaworm v0.9 --
+; -WonderWorm--v0.9-
; by Matthew Shepcar
-; 28th December 1998
+; 30th December 1998
+
+; modified by Jonah Cohen 11-19-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 _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,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 de,0FC71h
- ld bc,31
- ld (hl),-1
+ 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),192
- ld l,9*16+15
- ld (hl),3
+ 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
- ld bc,52*16
+ pop de
+ pop bc
ldir
pop hl
- ld c,32
+ ld c,64
ldir
- ld (_penCol),de
- ld hl,WormMsg
+ 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,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
- ld hl,(HeadPos)
- ld (TailPos),hl
+
+ 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
- ld (Heading),a
- ld (Eaten),a
- ld bc,0400Ah
- ld d,a
- ld e,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:
- ld a,8
+ call DisplayField
+
+ 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
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
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
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
dec b
call SetPixel
+; xor 2
+; ld (WormCol),a
+
ld hl,GrowAmt
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
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
ld a,(HiScore)
ld (hl),a
NotNewHigh:
- call _clrScrn
- call _homeup
- jp _getky
-
-NewPea:
- call Random
- ld a,h
- and 7Fh
- cp 7Bh
- jr nc,NewPea
- add a,2
- ld h,a
- ld a,l
- and 3Fh
- cp 30h
- jr nc,NewPea
- add a,12
- ld l,a
- ld (PeaX),hl
+#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
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
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)
dec d
ret
-FindPixel:
+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)
- 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 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 UNPACK_HL
+ call _divHLby10
push af
ld a,l
call PutDigit
offsets_table:
.db 128,64,32,16,8,4,2,1
-#include trigtab.asm
+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
-WormMsg .db "Peaworm!",0
-PeasMsg .db "Eaten: 00",0
-HiMsg .db "Hiscore: ",0
+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
-Varname .db 4,"worm"
-Eaten =$
-SinCosTable =09000h
+Left =$
+Lives =$+1
+Level =$+2
+Score =$+3
+DispBuffer =$+5
+
+ScrBuffer =$8200 ;32x256 bytes
+SinCosTable =$a200
+WormPos = $b000
.end