+DisplayField:
+ 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 ; >> 1
+ push de ; >> 2
+ 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 ; >> 3
+ and %11111000
+ rra
+ rra
+ rra
+ ld c,a
+ ld b,0
+ ld de,DispBuffer
+ pop af ; << 2
+ and %00000111
+ push af ; >> 3
+ cp 6
+ jr c,CopyScreen
+ inc c
+CopyScreen:
+ add hl,bc
+ ld b,57
+CopyScreenLoop:
+ push bc ; >> 4
+ ld bc,16
+ ldir
+ ld c,16
+ add hl,bc
+ pop bc ; << 3
+ djnz CopyScreenLoop
+ pop af ; << 2
+ 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 ; << 1
+ pop bc ; << 0k
+ ret
+
+ShiftRight1:
+ 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 ; >> 1
+ 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 ; >> 2
+ rla
+ ld b,16
+ShiftRowLeft:
+ dec hl
+ rl (hl)
+ djnz ShiftRowLeft
+ pop hl ; << 1
+ dec c
+ jr nz,ShiftRowsLeft
+ ld bc,-16
+ add hl,bc
+ ex de,hl
+ pop bc ; << 0k
+ djnz ShiftRightLoop
+ ret
+
+ShiftLeft1:
+ 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 ; >> 1
+ 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 ; >> 2
+ rra
+ ld b,16
+ShiftRowRight:
+ rr (hl)
+ inc hl
+ djnz ShiftRowRight
+ pop hl ; << 1
+ dec c
+ jr nz,ShiftRowsRight
+ ld bc,-16
+ add hl,bc
+ ex de,hl
+ pop bc ; << 0k
+ djnz ShiftLeftLoop
+ ret
+
+Chunk:
+ push hl ; >> 1
+ push de ; >> 2
+ ld c,16
+ add hl,bc
+ ld b,57
+ChunkScreen:
+ push bc ; >> 3
+ 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 ; << 2
+ djnz ChunkScreen
+ pop de ; << 1
+ pop hl ; << 0k
+ ld c,$37 ;scf
+ ret
+
+;-----------------------------
+;----------- link ------------
+;-----------------------------
+
+LINKMASK =3
+LINKPORT =7
+TIMEOUT =$1000
+
+LinkPrep:
+ ex (sp),hl
+ push bc
+ push de
+ set 2,(iy+12h)
+ ld b,8
+ jp (hl)
+
+TryReceiveByte:
+ in a,(LINKPORT)
+ and LINKMASK
+ cp LINKMASK
+ scf
+ ret z
+ReceiveByteCont:
+ call LinkPrep
+ jr ReceiveCont
+ReceiveByte:
+ call LinkPrep
+ReceiveBits:
+ ld de,TIMEOUT
+WaitRecBit:
+ call CheckLink
+ jr z,LinkFailed
+ cp LINKMASK
+ jr z,WaitRecBit
+ReceiveCont:
+ sub LINKMASK/3*2
+ ld a,LINKMASK/3*2
+ ld d,D0LD1H
+ jr c,ReceiveLow
+ rra
+ ld d,D0HD1L
+ReceiveLow:
+ rr c
+ ld (AckBit),a
+ ld a,d
+ out (LINKPORT),a
+ ld de,TIMEOUT
+WaitAckRec:
+ call CheckLink
+ cp 0
+AckBit =$-1
+ jr nz,WaitAckRec
+ ld a,D0HD1H
+ out (LINKPORT),a
+ ld d,4
+WaitReadyRec:
+ dec d
+ jr z,ReadyRec
+ in a,(LINKPORT)
+ cp LINKMASK
+ jr nz,WaitReadyRec
+ReadyRec:
+ djnz ReceiveBits
+ jr LinkSuccess
+
+SendByte:
+ call LinkPrep
+ ld c,a
+
+ inc b
+ jr SendAcked
+
+SendBits:
+ rr c
+ ld a,D0LD1H
+ jr nc,SendLow
+ ld a,D0HD1L
+SendLow:
+ out (LINKPORT),a
+ ld de,TIMEOUT
+WaitAckSend:
+ call CheckLink
+ jr nz,WaitAckSend
+SendAcked:
+ ld a,D0HD1H
+ out (LINKPORT),a
+ ld de,TIMEOUT
+WaitReadySend:
+ call CheckLink
+ cp LINKMASK
+ jr nz,WaitReadySend
+ djnz SendBits
+LinkSuccess:
+ or 0
+.org $-1
+LinkFailed:
+ scf
+ ld a,c
+ res 2,(iy+12h)
+ pop de
+ pop bc
+ pop hl
+ ret
+
+CheckLink:
+ pop hl
+ dec de
+ ld a,d
+ or e
+ jr z,LinkFailed
+ ld a,0BFh
+ call _readkeypad
+ bit 6,a
+ jr z,LinkFailed
+ in a,(LINKPORT)
+ and LINKMASK
+ jp (hl)
+
+_readkeypad:
+ out (1),a
+ in a,(1)
+ push af
+ ld a,255
+ out (1),a
+ pop af
+ ret
+
+
+
+;-----------------------------
+;---------- levels -----------
+;-----------------------------
+
+LevelsDM:
+
+ .db 8,0
+ .db $40,30,4,$C0,30,123
+ .db 0,0
+; .db 128,57
+ .db 0
+
+NUM_LEVELS = 9
+
+LevelsS:
+
+ .db 5,3 ;5 peas, speed 5
+ .db 0,4,64,0,0,0 ;d,y,x
+ .db 0,0 ;field width, height
+ .db 0 ;no additional lines
+
+ .db 8,4
+ .db $40,14,4,0,0,0
+ .db 128,57
+ .db 1
+ .db 28,28,100,28
+
+ .db 9,4
+ .db $40,8,4,0,0,0
+ .db 128,57
+ .db 2
+ .db 28,14,100,14
+ .db 28,41,100,41
+
+ .db 9,3
+ .db $40,8,4,0,0,0
+ .db 128,80
+ .db 2
+ .db 64,14,64,66
+ .db 20,40,108,40
+
+ .db 10,3
+ .db 4,8,$40,0,0,0
+ .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,0,0,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,0,0,0
+ .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,0,0,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,0,0,0
+ .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
+
+
+;-----------------------------
+;---------- data -------------
+;-----------------------------
+
+TrigPrecalc:
+.db 0, 3, 6, 9, 12, 15, 18, 21
+.db 24, 27, 30, 33, 36, 39, 42, 45
+.db 48, 51, 54, 57, 59, 62, 65, 67
+.db 70, 73, 75, 78, 80, 82, 85, 87
+.db 89, 91, 94, 96, 98,100,102,103
+.db 105,107,108,110,112,113,114,116
+.db 117,118,119,120,121,122,123,123
+.db 124,125,125,126,126,126,126,126
+.db 127
+
+#include "line.asm"
+
+txtWelcome .db "Welcome to PeaWorm!! ",
+ .db "by Jonah and Shiar",0
+txtMenu .db "Start Game",0
+ .db "Game: ",0
+ .db "Options",0
+ .db "Quit",0
+txtGame .db "Singleplayer",0
+txtGame2 .db "Deathmatch ",0
+ .db "Hot Pursuit",0
+ .db "CTF ",0
+WormMsg .db "Wonderworm!",0
+LevelMsg .db "Level ",0
+LivesMsg .db "Lives: ",0
+ScoreMsg .db "Score: ",0
+LeftMsg .db "Food: ",0
+HiScore .db 0
+
+nrworms .db 2
+worm1 .dw 0,0,0,0,0,0,0,0
+ .db 0,%11111110,%10,%100
+worm2 .dw 0,0,0,0,0,0,0,0
+ .db 0,0,%10000,%1000
+; .db 0,%00111111,%10000,%1000
+
+ ;set:
+heading = 0 ;level*
+pos = 2 ;level*
+pos2 = 4 ;level
+head = 6 ;level
+tail = 8 ;level
+grow = 10 ;level
+lives = 13 ;game
+score = 15 ;game
+input = 17 ;
+left = 18 ;
+right = 19 ;
+
+Worm1 = $B000
+Worm2 = $B800
+resbit = 2
+
+Level =$+1
+DispBuffer =$+2