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