final version by jonah
authorJonah Cohen <jcohen@orion.ac.hmc.edu>
Tue, 23 Nov 1999 08:31:34 +0000 (09:31 +0100)
committerMischa Poslawsky <wormy@shiar.org>
Sun, 22 Feb 2009 11:31:58 +0000 (12:31 +0100)
trigtab.asm
worm.asm

index b9f011f7a17cb4b946197de2aadf7dcbcb49023e..f3807f10bc190c7450062c22a0fec74f172786f3 100644 (file)
@@ -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
 TrigPrecalc:
 .db     0,    3,    6,    9,   12,   15,   18,   21
 .db    24,   27,   30,   33,   36,   39,   42,   45
index 66d354965d57dac704025dd75656d30d94b7c7fd..33c8038c154f01e023f7350cc8f1a9781cd20321 100644 (file)
--- a/worm.asm
+++ b/worm.asm
@@ -2,7 +2,7 @@
 ; by Matthew Shepcar
 ; 30th December 1998
 
 ; by Matthew Shepcar
 ; 30th December 1998
 
-; modified by Jonah Cohen 11-14-99
+; modified by Jonah Cohen 11-19-99
 
 #include "TI86.inc"
 
 
 #include "TI86.inc"
 
 Start:
   ld (SpSave),sp
   call _runIndicOff
 Start:
   ld (SpSave),sp
   call _runIndicOff
+  call _flushAllMenus
   call _clrLCD
 
   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
 
   ld a,r
   ld (Seed),a
@@ -50,6 +73,10 @@ NextLife:
   push de
   ld a,(hl)
   inc hl
   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
   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
   add hl,hl
   add hl,hl
+  add hl,hl
   ex de,hl
 
   ld hl,ScrBuffer
   push hl
   push de
   ld de,ScrBuffer+1
   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
   ldir
   inc hl
-  ld (hl),192
+  ld (hl),%11000000
   inc hl
   inc hl
-  ld b,14
+  ld b,31
 ClearLine:
   ld (hl),c
   inc hl
   djnz ClearLine
 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
   inc hl
+  ld (hl),c
+
   ex de,hl
   ex de,hl
+  pop de
   pop bc
   ldir
   pop hl
   pop bc
   ldir
   pop hl
-  ld c,32
+  ld c,64
   ldir
   ldir
+
   pop hl
 
   ld a,(hl)
   pop hl
 
   ld a,(hl)
@@ -141,12 +196,37 @@ NoLines:
 
   call NewPea
 
 
   call NewPea
 
-  xor a
+  pop hl
+  pop bc
+  push bc
+  push hl
   call DisplayField
   ld hl,LevelMsg
   ld a,7
   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)
   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)
   add a,'0'
   call _putc
   res 3,(iy+5)
@@ -157,7 +237,7 @@ ReadyDelay:
   dec a
   jr nz,ReadyDelay
 
   dec a
   jr nz,ReadyDelay
 
-  ld hl,(HeadPos)
+  ld hl,(HeadPos)                              ;<====NEW
   ld (TailPos),hl
   pop hl
   pop bc
   ld (TailPos),hl
   pop hl
   pop bc
@@ -165,32 +245,24 @@ ReadyDelay:
   ld de,0
 
 GameLoop:
   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
 
   call DisplayField
 
-  ld a,9
+  ld a,2
 Speed =$-1
 Speed =$-1
+  or a
+  jr z,HeadPos-1
 Delay:
   halt
   dec a
   jr nz,Delay
 
 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
 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
   ld (HeadPos),hl
 
   ld hl,SinCosTable
@@ -332,13 +404,13 @@ WormCol =$-1
   dec (hl)
   jr nz,GrowWorm
   inc (hl)
   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
 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 (TailPos),hl
 
   call ResPixel
@@ -401,27 +473,40 @@ Exit:
   ld (hl),a
 NotNewHigh:
 #endif
   ld (hl),a
 NotNewHigh:
 #endif
+  res 4,(iy+9)
   ld sp,0
 SpSave = $-2
   jp _clrWindow
 
   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)
   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 (PeaY),hl
   ld d,2
   push hl
@@ -458,24 +543,7 @@ DrawPeaPixel:
   ld (hl),a
   ret
 
   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
 
 ResPixel: ;at bc
   call FindPixel
@@ -499,7 +567,7 @@ CheckPixel: ;at bc in d
   dec d
   ret
 
   dec d
   ret
 
-FindPixel: ;bc to ahl + de gone
+FindPixel: ;bc to ahl + de gone                                ;<====NEW
   push bc
   ld a,b
   and 7
   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 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
   ld l,a
   ld a,(de)
   ld de,ScrBuffer
@@ -531,23 +599,20 @@ IncScore:
   add hl,de
   ld (Score),hl
 PutScore:
   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 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
 
   djnz DoPutScore
   ret
 
@@ -566,145 +631,142 @@ PutDigit:
 offsets_table:
   .db 128,64,32,16,8,4,2,1
 
 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
   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
   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
 
   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
   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
   dec hl
   rl (hl)
   djnz ShiftRowLeft
@@ -715,27 +777,35 @@ eft:
   add hl,bc
   ex de,hl
   pop bc
   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
   dec hl
+ShiftLeftSameByte:
   ex de,hl
   ex de,hl
-  ld c,16
-  sbc hl,bc
+  ld bc,-16
+  add hl,bc
   ex de,hl
   ld b,57
   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)
   push bc
   ld bc,-32
   add hl,bc
   ex de,hl
   ld a,(de)
+ShiftLeftChunk:
+  or a
+  call c,_SHRACC
   ld c,0
   ld c,0
-ShiftBitsRight = $-1
+ShiftLeftCounter = $-1
 ShiftRowsRight:
   push hl
   rra
 ShiftRowsRight:
   push hl
   rra
@@ -751,59 +821,66 @@ ShiftRowRight:
   add hl,bc
   ex de,hl
   pop bc
   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
   pop bc
+  djnz ChunkScreen
+  pop de
+  pop hl
+  ld c,$37                             ;scf
   ret
 
 
 NUM_LEVELS = 9
 
 Levels:
   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 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 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 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 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 4,8,$40
   .db 128,90
   .db 3
@@ -811,7 +888,7 @@ Levels:
   .db 110,20,110,70
   .db 18,45,110,45
 
   .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 64,4,0
   .db 128,86
   .db 6
@@ -822,7 +899,7 @@ Levels:
   .db 16,20,16,64
   .db 110,20,110,64
 
   .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 4,10,$40
   .db 128,82
   .db 3
@@ -830,7 +907,7 @@ Levels:
   .db 54,40,128,40
   .db 0,60,74,60
 
   .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 64,4,0
   .db 128,90
   .db 6
@@ -841,7 +918,7 @@ Levels:
   .db 20,72,54,72
   .db 74,72,110,72
 
   .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
   .db 72,52,$c0
   .db 128,128
   .db 13