mirror of https://github.com/dschmenk/VM02.git
236 lines
3.7 KiB
Plaintext
Executable File
236 lines
3.7 KiB
Plaintext
Executable File
CONST FALSE = 0
|
|
CONST TRUE = NOT FALSE
|
|
CONST SHOWLORES = $C056
|
|
CONST KEYBOARD = $C000
|
|
CONST KEYSTROBE = $C010
|
|
CONST SPEAKER = $C030
|
|
BYTE EXITMSG = "PRESS ANY KEY TO EXIT."
|
|
BYTE GOODBYE = "THAT'S ALL FOLKS!"
|
|
BYTE LEVEL = "1=HARD 2=MED 3=EASY ?"
|
|
BYTE YOURSCORE = "YOUR SCORE WAS "
|
|
BYTE AUTOPLAY = TRUE
|
|
BYTE PDLPOS, PDLSIZE, PDLMID, MISS
|
|
BYTE XSCRN, YSCRN
|
|
BYTE SCORE[3]
|
|
WORD XBALL, YBALL, XSPEED, YSPEED
|
|
FUNC INCSCORE
|
|
|
|
DEF BEEP(TONE, DURATION)
|
|
BYTE I, J
|
|
|
|
FOR J = DURATION DOWNTO 0
|
|
FOR I = TONE DOWNTO 0
|
|
NEXT
|
|
DROP ^SPEAKER
|
|
NEXT
|
|
END
|
|
|
|
DEF KEYPRESSED
|
|
RETURN ^KEYBOARD > 127
|
|
END
|
|
|
|
DEF GETKEY
|
|
BYTE KEY
|
|
|
|
REPEAT
|
|
KEY = ^KEYBOARD
|
|
UNTIL KEY > 127
|
|
DROP ^KEYSTROBE
|
|
RETURN KEY
|
|
END
|
|
|
|
DEF TEXTMODE
|
|
DROP ROMCALL(0, 0, 0, 0, $FB39)
|
|
END
|
|
|
|
DEF HOME
|
|
DROP ROMCALL(0, 0, 0, 0, $FC58)
|
|
END
|
|
|
|
DEF GOTOXY(X, Y)
|
|
^($24) = X
|
|
DROP ROMCALL(Y, 0, 0, 0, $FB5B)
|
|
END
|
|
|
|
DEF PRSTRXY(X, Y, STRPTR)
|
|
GOTOXY(X, Y)
|
|
PRSTR(STRPTR)
|
|
END
|
|
|
|
DEF GRMODE
|
|
DROP ROMCALL(0, 0, 0, 0, $FB40)
|
|
DROP ^SHOWLORES
|
|
END
|
|
|
|
DEF COLOR(CLR)
|
|
DROP ROMCALL(CLR, 0, 0, 0, $F864)
|
|
END
|
|
|
|
DEF PLOT(X, Y)
|
|
DROP ROMCALL(Y, 0, X, 0, $F800)
|
|
END
|
|
|
|
DEF HLIN(LEFT, RIGHT, VERT)
|
|
^($2C) = RIGHT
|
|
DROP ROMCALL(VERT, 0, LEFT, 0, $F819)
|
|
END
|
|
|
|
DEF VLIN(TOP, BOTTOM, HORZ)
|
|
^($2D) = BOTTOM
|
|
DROP ROMCALL(TOP, 0, HORZ, 0, $F828)
|
|
END
|
|
|
|
DEF PADDLE(NUM)
|
|
RETURN ROMCALL(0, NUM, 0, 0, $FB1E).2
|
|
END
|
|
|
|
DEF BUTTON(NUM)
|
|
RETURN ^($C060 + NUM) > 127
|
|
END
|
|
|
|
DEF UPDTPDL
|
|
IF AUTOPLAY
|
|
IF PDLPOS + PDLMID > XSCRN
|
|
IF PDLPOS > 0
|
|
PDLPOS = PDLPOS - 1
|
|
FIN
|
|
ELSIF PDLPOS + PDLMID + 1 < XSCRN
|
|
IF PDLPOS + PDLSIZE < 39
|
|
PDLPOS = PDLPOS + 1
|
|
FIN
|
|
FIN
|
|
ELSE
|
|
PDLPOS = PADDLE(0) / 5
|
|
FIN
|
|
IF PDLPOS + PDLSIZE > 39
|
|
PDLPOS = 39 - PDLSIZE
|
|
FIN
|
|
IF PDLPOS
|
|
COLOR(0)
|
|
HLIN(0, PDLPOS - 1, 39)
|
|
FIN
|
|
COLOR(1)
|
|
HLIN(PDLPOS, PDLPOS + PDLSIZE, 39)
|
|
IF PDLPOS + PDLSIZE < 38
|
|
COLOR(0)
|
|
HLIN(PDLPOS + PDLSIZE + 1, 39, 39)
|
|
FIN
|
|
END
|
|
|
|
DEF UPDTBALL
|
|
BYTE XNEW, YNEW
|
|
|
|
;
|
|
; UPDATE HORIZONTAL POSITION
|
|
;
|
|
XBALL = XBALL + XSPEED
|
|
IF XBALL > 623
|
|
XBALL = 623
|
|
XSPEED = -XSPEED
|
|
BEEP(4, 10)
|
|
ELSIF XBALL < 16
|
|
XBALL = 16
|
|
XSPEED = -XSPEED
|
|
BEEP(4, 10)
|
|
FIN
|
|
XNEW = XBALL >> 4
|
|
;
|
|
; UPDATE VERTICAL POSITION
|
|
;
|
|
YBALL = YBALL + YSPEED
|
|
IF YBALL > 623
|
|
;
|
|
; CHECK FOR PADDLE HIT
|
|
;
|
|
IF XNEW >= PDLPOS AND XNEW <= PDLPOS + PDLSIZE
|
|
YBALL = 623
|
|
YSPEED = -YSPEED - 2
|
|
XSPEED = XSPEED + (XNEW - (PDLPOS + PDLMID - 1))
|
|
IF XSPEED == 0
|
|
IF PDLPOS + PDLMID > 19
|
|
XSPEED = 1
|
|
ELSE
|
|
XSPEED = -1
|
|
FIN
|
|
FIN
|
|
INCSCORE
|
|
BEEP(4, 10)
|
|
ELSE
|
|
MISS = 1
|
|
BEEP(14, 40)
|
|
FIN
|
|
ELSIF YBALL < 16
|
|
YBALL = 16
|
|
YSPEED = -YSPEED
|
|
BEEP(4, 10)
|
|
FIN
|
|
YNEW = YBALL >> 4
|
|
;
|
|
; UPDATE ON-SCREEN BALL
|
|
;
|
|
IF XNEW <> XSCRN OR YNEW <> YSCRN
|
|
COLOR(8)
|
|
PLOT(XNEW, YNEW)
|
|
COLOR(0)
|
|
PLOT(XSCRN, YSCRN)
|
|
XSCRN = XNEW
|
|
YSCRN = YNEW
|
|
FIN
|
|
END
|
|
|
|
DEF PRSCORE
|
|
COUT(SCORE[2])
|
|
COUT(SCORE[1])
|
|
COUT(SCORE[0])
|
|
END
|
|
|
|
DEF INCSCORE
|
|
SCORE[0] = SCORE[0] + 1
|
|
IF SCORE[0] > '9'
|
|
SCORE[0] = '0'
|
|
SCORE[1] = SCORE[1] + 1
|
|
IF SCORE[1] > '9'
|
|
SCORE[1] = '0'
|
|
SCORE[2] = SCORE[2] + 1
|
|
FIN
|
|
FIN
|
|
GOTOXY(17, 22)
|
|
PRSCORE
|
|
END
|
|
|
|
DEF INITSCORE
|
|
SCORE[0] = '0'
|
|
SCORE[1] = '0'
|
|
SCORE[2] = '0'
|
|
GOTOXY(17, 22)
|
|
PRSCORE
|
|
END
|
|
|
|
PRSTR(@LEVEL)
|
|
PDLSIZE = (GETKEY - $B0) * 3
|
|
PDLMID = PDLSIZE >> 1
|
|
GRMODE
|
|
COLOR(15)
|
|
HLIN(0, 39, 0)
|
|
VLIN(1, 38, 0)
|
|
VLIN(1, 38, 39)
|
|
XBALL = PADDLE(0) + 16
|
|
YBALL = PADDLE(1) + 16
|
|
XSCRN = XBALL >> 4
|
|
YSCRN = YBALL >> 4
|
|
XSPEED = 1
|
|
YSPEED = 1
|
|
MISS = 0
|
|
INITSCORE
|
|
REPEAT
|
|
UPDTPDL
|
|
UPDTBALL
|
|
UNTIL KEYPRESSED OR MISS
|
|
TEXTMODE
|
|
HOME
|
|
PRSTR(@YOURSCORE)
|
|
PRSCORE
|
|
COUT($0D)
|
|
PRSTR(@GOODBYE)
|
|
DONE
|