final version by jonah
[wormy.git] / worm.asm
index 85ffafbf15afd532351ba47709ba4d06c614b497..33c8038c154f01e023f7350cc8f1a9781cd20321 100644 (file)
--- a/worm.asm
+++ b/worm.asm
-
-; -- 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
@@ -89,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
@@ -157,18 +343,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 +362,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,17 +397,20 @@ WormNotCrashed:
   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
@@ -222,26 +428,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 +472,42 @@ WormDead:
   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
@@ -306,39 +543,22 @@ 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
   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 +567,7 @@ CheckPixel:
   dec d
   ret
 
-FindPixel:
+FindPixel: ;bc to ahl + de gone                                ;<====NEW
   push bc
   ld a,b
   and 7
@@ -355,31 +575,51 @@ 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)
-  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
@@ -391,15 +631,331 @@ 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