100H: /* THE PROCEDURES CLOCK AND RND USE A FEATURE OF PICKLES AND TROUT CP/M2 AND ARE NOT LIKELY TO WORK ON OTHER VERSIONS OF CP/M */ BDOS: PROCEDURE (FN, ARG) BYTE; DECLARE FN BYTE, ARG ADDRESS; GO TO 5; END BDOS; EXIT: PROCEDURE; MEMORY(0)=BDOS(0,0); END EXIT; TTYIN: PROCEDURE BYTE; DECLARE C BYTE; RETURN BDOS(1,0); END TTYIN; PRINT: PROCEDURE (S); DECLARE S ADDRESS; S=BDOS(9,S); END PRINT; CLOCK: PROCEDURE; DECLARE B$ADR ADDRESS; DECLARE B BASED B$ADR BYTE; B$ADR=047H; B = 0EH; GO TO 043H; END CLOCK; RND: PROCEDURE ADDRESS; DECLARE E$ADR ADDRESS; DECLARE E BASED E$ADR BYTE; DECLARE D$ADR ADDRESS; DECLARE D BASED D$ADR BYTE; DECLARE L$ADR ADDRESS; DECLARE L BASED L$ADR BYTE; DECLARE H$ADR ADDRESS; DECLARE H BASED H$ADR BYTE; DECLARE (NUM, DE, HL) ADDRESS; E$ADR=048H; D$ADR=049H; L$ADR=04AH; H$ADR=04BH; CALL CLOCK; DE = D * 255 + E; HL = H * 255 + L; NUM = DE * HL; RETURN NUM; END RND; EIGHTBALL: DO; DECLARE CR LITERALLY '13'; DECLARE CRLF(3) BYTE INITIAL (13,10,'$'); DECLARE CHR BYTE; DECLARE NUM ADDRESS; DECLARE GREETING(30) BYTE INITIAL ('ASK AND ALL WILL BE REVEALED $'); DECLARE MSG01(41) BYTE INITIAL ( 'AS I SEE IT, YES $' ); DECLARE MSG02(41) BYTE INITIAL ( 'ASK AGAIN LATER $' ); DECLARE MSG03(41) BYTE INITIAL ( 'BETTER NOT TELL YOU NOW $' ); DECLARE MSG04(41) BYTE INITIAL ( 'CANNOT PREDICT NOW $' ); DECLARE MSG05(41) BYTE INITIAL ( 'CONCENTRATE AND ASK AGAIN $' ); DECLARE MSG06(41) BYTE INITIAL ( 'DON''T BET ON IT $' ); DECLARE MSG07(41) BYTE INITIAL ( 'IT IS CERTAIN $' ); DECLARE MSG08(41) BYTE INITIAL ( 'IT IS DECIDEDLY SO $' ); DECLARE MSG09(41) BYTE INITIAL ( 'MOST LIKELY $' ); DECLARE MSG10(41) BYTE INITIAL ( 'MY REPLY IS NO $' ); DECLARE MSG11(41) BYTE INITIAL ( 'MY SOURCES SAY MAYBE $' ); DECLARE MSG12(41) BYTE INITIAL ( 'MY SOURCES SAY NO $' ); DECLARE MSG13(41) BYTE INITIAL ( 'OUTLOOK GOOD $' ); DECLARE MSG14(41) BYTE INITIAL ( 'OUTLOOK NOT SO GOOD $' ); DECLARE MSG15(41) BYTE INITIAL ( 'REPLY HAZY, TRY AGAIN $' ); DECLARE MSG16(41) BYTE INITIAL ( 'SIGNS POINT TO YES $' ); DECLARE MSG17(41) BYTE INITIAL ( 'VERY DOUBTFUL $' ); DECLARE MSG18(41) BYTE INITIAL ( 'WITHOUT A DOUBT $' ); DECLARE MSG19(41) BYTE INITIAL ( 'YES $' ); DECLARE MSG20(41) BYTE INITIAL ( 'YES, DEFINITELY $' ); DECLARE MSG21(41) BYTE INITIAL ( 'YES, PROBABLY NOT $' ); DECLARE MSG22(41) BYTE INITIAL ( 'YOU MAY RELY ON IT $' ); DECLARE MSG23(41) BYTE INITIAL ( 'YOUR QUESTION HAS ALREADY BEEN ANSWERED $' ); NUM = RND MOD 24; CALL PRINT(.GREETING); CALL PRINT(.CRLF); DO WHILE CHR <> CR; CHR = TTYIN; END; CALL PRINT(.CRLF); DO CASE NUM; CALL PRINT(.MSG01); CALL PRINT(.MSG02); CALL PRINT(.MSG03); CALL PRINT(.MSG04); CALL PRINT(.MSG05); CALL PRINT(.MSG06); CALL PRINT(.MSG07); CALL PRINT(.MSG08); CALL PRINT(.MSG09); CALL PRINT(.MSG10); CALL PRINT(.MSG11); CALL PRINT(.MSG12); CALL PRINT(.MSG13); CALL PRINT(.MSG14); CALL PRINT(.MSG15); CALL PRINT(.MSG16); CALL PRINT(.MSG17); CALL PRINT(.MSG18); CALL PRINT(.MSG19); CALL PRINT(.MSG20); CALL PRINT(.MSG21); CALL PRINT(.MSG22); CALL PRINT(.MSG23); END; CALL PRINT(.CRLF); CALL EXIT; END; EOF