image of READY prompt

Wang2200.org

Listing of file='BLACKBOX' on disk='vmedia/games-droz01.wvd.zip'

# Sector 873, program filename = 'BLACKBOX'
0001 REM % BLACKBOX - Black Box Game - 01/12/82 - R.L. Droz
0090 DIM B$(24,80)1,E$1,M0$1,D(2),L(2),L0(2)
0092 DATA "@","#","$","%","&","*","+","?",HEX(7B),HEX(7C),HEX(7D),HEX(7E),HEX(
     7F)
0093 DATA HEX(10),HEX(11),HEX(12),HEX(13),HEX(14),HEX(15),HEX(16),HEX(17),HEX(
     18)
0094 DATA HEX(19),HEX(1A),HEX(1B),HEX(1C),HEX(1D),HEX(1E),HEX(1F)
0095 PRINT HEX(03)
0100 INPUT "ROWS,COLUMNS",R,C
0102 IF 2*R+2*C>52 THEN 100
0105 INPUT "NUMBER OF OBJECTS",N
0110 GOSUB '41(R,C)
0115 GOSUB '40("T",R,C)
0120 GOSUB '42(N,R,C)
0125 GOSUB '40("T",R,C)
0126 READ M0$
0127 GOSUB '44(R,C)
0128 PRINT AT(20,0,79);
   : PRINTUSING "LOCATION (ROW,COL) = ( ## , ## )     DIRECTION (ROW,COL) = (
     +# , +#)", L(1),L(2),D(1),D(2)
0140 GOSUB '45(M0$,"T",R,C)
0175 GOTO 126
0176 END
0299 REM % HIDE N OBJECTS
0300 DEFFN'42(N,R0,C0)
0302 N=MIN(N,R0*C0)
0304 FOR I=1 TO N
0306 R1=INT(R0*RND(1))+1
   : C1=INT(C0*RND(1))+1
0308 IF B$(R1+1,C1+1)<>" " THEN GOTO 306
   : ELSE B$(R1+1,C1+1)="\81"
0310 NEXT I
0312 RETURN
0314 REM % INITIALIZE BLACK BOX
0316 DEFFN'41(R0,C0)
   : B$()=ALL(" ")
   : L=VAL("A")
0318 FOR C1=1 TO C0
0320  B$(1,C1+1)=BIN(L)
   : IF L<VAL("Z") OR L>=VAL("a") THEN L=L+1
   : ELSE L=VAL("a")
0322 NEXT C1
0324 FOR R1=1 TO R0
0326 B$(R1+1,C0+2)=BIN(L)
   : IF L<VAL("Z") OR L>=VAL("a") THEN L=L+1
   : ELSE L=VAL("a")
0328 NEXT R1
0330 FOR R1=1 TO R0
0332 B$(R1+1,1)=BIN(L)
   : IF L<VAL("Z") OR L>=VAL("a") THEN L=L+1
   : ELSE L=VAL("a")
0334 NEXT R1
0336 FOR C1=1 TO C0
0338 B$(R0+2,C1+1)=BIN(L)
   : IF L<VAL("Z") OR L>=VAL("a") THEN L=L+1
   : ELSE L=VAL("a")
0340 NEXT C1
0342 RETURN
0349 REM % GET CO-ORDS AND DIRECTION OF RAY
0350 DEFFN'44(R0,C0)
0351 PRINT AT(22,0,);
   : LINPUT "Ray entry point?" ?-E$
   : IF VER(E$,"A")<>1 THEN 350
0355 IF E$<"a" THEN E=VAL(E$)-VAL("A")+1
   : ELSE E=VAL(E$)-VAL("a")+27
0357 IF E>2*R0+R*C0 THEN 351
0360 IF E>C0 THEN 365
   : D(1)=1
   : D(2)=0
   : L(1)=1
   : L(2)=E+1
   : RETURN
0365 IF E>C0+R0 THEN 370
   : D(1)=0
   : D(2)=-1
   : L(1)=E-C0+1
   : L(2)=C0+2
   : RETURN
0370 IF E>2*R0+C0 THEN 375
   : D(1)=0
   : D(2)=1
   : L(1)=E-R0-C0+1
   : L(2)=1
   : RETURN
0375 IF E>2*C0+2*R0 THEN 380
   : D(1)=-1
   : D(2)=0
   : L(1)=R0+2
   : L(2)=E-2*R0-C0+1
   : RETURN
0380 STOP "BUG!"
0398 REM % TRACE RAY THROUGH BLACK BOX
0399 DIM L7$1,R1(2,2),D1(1,2),L1(1,2),L2(1,2)
0400 DEFFN'45(M0$,L7$,R0,C0)
   : MAT L0=L
   : B$(L0(1),L0(2))=M0$
0402 L1(1,1)=L(1)
   : L1(1,2)=L(2)
0404 D1(1,1)=D(1)
   : D1(1,2)=D(2)
0405 IF L7$="T" THEN GOSUB '46(L7$,R0,C0)
0406 REM EDGE HITS & REFLECTIONS
0408 MAT L2=L1+D1
   : IF B$(L2(1,1),L2(1,2))<>"\81" THEN 412
0410 MAT L=L0
   : B$(L(1),L(2))="\8B"
   : GOSUB '46(L7$,R0,C0)
   : RETURN
0412 GOSUB 491
   : MAT D2=D1*R1
   : MAT L2=L2+D2
0414 IF B$(L2(1,1),L2(1,2))<>"\81" THEN 418
0416 MAT L=L0
   : B$(L(1),L(2))="\8D"
   : GOSUB '46(L7$,R0,C0)
   : RETURN
0418 MAT D2=(-2)*D2
   : MAT L2=L2+D2
   : IF B$(L2(1,1),L2(1,2))="\81" THEN 416
0420 REM TAKE A STEP AHEAD
0422 MAT L1=L1+D1
0424 B$(L1(1,1),L1(1,2))=M0$
   : IF L7$="T" THEN GOSUB '46(L7$,R0,C0)
0426 REM CHECK FOR EDGE
0428 IF L1(1,1)=1 OR L1(1,1)=R0+2 OR L1(1,2)=1 OR L1(1,2)=C0+2 THEN GOTO 429
   : ELSE GOTO 436
0429 L(1)=L1(1,1)
   : L(2)=L1(1,2)
0430 IF L(1)=L0(1) AND L(2)=L0(2) THEN B$(L(1),L(2))="\8D"
   : ELSE B$(L(1),L(2))=M0$
0432 GOSUB '46(L7$,R0,C0)
   : RETURN
0434 REM MID-BOX MOVEMENTS (hit)
0436 MAT L2=L1+D1
   : IF B$(L2(1,1),L2(1,2))<>"\81" THEN 442
0438 MAT L=L0
   : B$(L(1),L(2))="\8B"
0439 L1(1,1)=L(1)
   : L1(1,2)=L(2)
   : GOSUB '46(L7$,R0,C0)
   : RETURN
0440 REM (reflection)
0442 GOSUB 491
   : MAT D2=D1*R1
   : MAT L2=L2+D2
0444 IF B$(L2(1,1),L2(1,2))<>"\81" THEN 458
0446 MAT D2=(-2)*D2
   : MAT L2=L2+D2
0448 IF B$(L2(1,1),L2(1,2))<>"\81" THEN 454
0450 MAT D1=(-1)*D1
   : GOTO 422
0452 REM (right)
0454 GOSUB 492
   : MAT D2=D1
   : MAT D1=D2*R1
   : GOTO 422
0456 REM (left)
0458 MAT D2=(-2)*D2
   : MAT L2=L2+D2
0460 IF B$(L2(1,1),L2(1,2))<>"\81" THEN 422
0462 GOSUB 491
   : MAT D2=D1
   : MAT D1=D2*R1
   : GOTO 422
0464 REM HELPER ROUTINES
0491 R1(1,1),R1(2,2)=0
   : R1(1,2)=+1
   : R1(2,1)=-1
   : RETURN
   : REM LEFT TURN
0492 R1(1,1),R1(2,2)=0
   : R1(1,2)=-1
   : R1(2,1)=+1
   : RETURN
   : REM RIGHT TURN
0498 REM % DRAW BLACK BOX
0499 DIM L8$1,M8$80
0500 DEFFN'40(L8$,R0,C0)
0505 I1=(80-4*(C0+2))/2
   : D1=(24-R0-2)/2
0510 GOSUB '50(1)
0511 PRINT AT(D1,0);
0512 GOSUB 592
0515 FOR R1=2 TO R0+1
0517  M8$=HEX(0000)
0520  PRINTUSING TO M8$,597,B$(R1,1);
0530  FOR C1=2 TO C0+1
0535    IF L8$="T" THEN PRINTUSING TO M8$,597,B$(R1,C1);
   : ELSE PRINTUSING TO M8$,597," ";
0540  NEXT C1
0542  PRINTUSING TO M8$,596,B$(R1,C0+2)
0543  GOSUB 592
0545 NEXT R1
0550 GOSUB '50(R0+2)
0551 PRINT TAB(I1);STR(M8$,3,LEN(M8$)-3)
0555 RETURN
0591 REM PRINT
0592 R2=LEN(M8$)-3
0593 M8$=M8$ OR ALL(HEX(80))
0594 PRINT TAB(I1);STR(M8$,3,R2)
0595 RETURN
0596 % #
0597 % # \86
0598 REM % DISPLAY HELPER
0599 DEFFN'50(R1)
0600 M8$=HEX(0000)
0601 PRINTUSING TO M8$,597," ";
0602 FOR C1=2 TO C0+1
0604  PRINTUSING TO M8$,597,B$(R1,C1);
0606 NEXT C1
0607 PRINTUSING TO M8$,596," "
0610 RETURN
0700 % DEFFN'46(L8$,R0,C0): PRINT AT(1,0);: MAT PRINT L1: MAT PRINT L0: GOSUB
     '40(L8$,R0,C0): RETURN
0710 DEFFN'46(L8$,R0,C0)
   : PRINT AT(D1+L1(1,1)-1,I1+4*L1(1,2)-3);B$(L1(1,1),L1(1,2))
   : RETURN
8040 DEFFN'4 HEX(8B)
8999 END
9000 DEFFN'0 HEX(86)
9010 DEFFN'1 HEX(81)
9020 DEFFN'2 HEX(8C)
9030 DEFFN'3 HEX(8D)