K-BAMDUA 036&qHBIO BAS-!BIOPR BASN"CHASE85 BASp%CHASE85XBAS(D-100 COMyOMDSETCOMCOM_MDSETCOMHEX'<MDSETCOMMAC/MDSETCOMPRNTksMDSETCOMRELHMDT60 COM* MDT60 DOCQMDT60M BAS.MDT60S BASkOKI92 COM/OKI92 DOCN [OKI92M BASXOKI92S BASjy2WINDEX2 COM|CWINDEX2 DOCDdXCAT36 COMhXCAT36 DOC \NOTES\  -BAMDUA.036 Thi librar volum contain program submitte b BAMDU members Th Basi CHAS gam program th bi-ryth program th MDT6 termina curso controlle program an th Okidat Microlin printe utilit wer submitte b To Sarbec o Sa Francisco Th utilit progra t modif th contro parameter o th seria port o th MicroDecisio Rev boar wa writte b Georg Borys Othe program o thi volum includ improve versio o th indexin progra fo WS/N documen files utilit t generat cros-referenc listin fro th informatio containe i th MAST.CA catalo file an anothe "DIR utilit fo thos o yo wh ar tire o seein everythin liste i uppe-cas letters. -BAMDUA .036 6k -You'r readin i now. BIO .BAS 6k -Cleaned-up version of the bio-rythm program. BIOP .BAS 6k -Same except that it prints a bio-rythm chart. CHASE85 .BAS 18k - vastl change versio o th origina CHASE.BA program Th change includ th following: 1. larger 2 hig b 7 wide gri tha throughou th gam remain o th screen Se not below. 2. Automati play (Usin th MBASI INKE function initia movemen o no-movemen continue unti th playe key i anothe digi fro th numbe keypad). 3. necessar MD 6 termina escap sequenc (ES X position th curso o th screen Othe terminal ma requir changin lin 70. 4. Anothe MD 6 escap sequenc (ES QUOT N turn th curso o an of an change it blin spee durin play Fo othe terminals chec line 8 an 9 i th progra o us th CHASE85X.BA versio o th game. 5. REM statements document the program logic. CHASE85X.BAS 18k -Exactl th sam a abov excep tha i doe no us th curso on/of an blin spee control Bu th curso definition an us cod ar al presen i RE statements I run a i o Kaypr 2 an 10 D-100 .COM 4k - 'DIR progra tha print it outpu usin lowe-cas rathe tha UPPE-CAS characters. MDSETCOM.COM 2k -Utilit t chang th bau rat (2-50000) th numbe o dat bit (-8) and/o th numbe o sto bit (1 1.5 2 o eithe o bot o th seria port o th Morro Micr-Decisio revisio board Us i t "push 30 bau mode t 45 baud o goos i (th bau rate t th limi fo prin buffer o othe har- wire applications Thi progra ca b drive directl fro th comman lin o us th buil- i men screen. \NOTES . 2 <-- REA M !!!!! MDSETCOM.MAC 18 -Assemble (M80 sourc cod fil fo above. MDSETCOM.HEX 6 -M8 assemble outpu file. MDSETCOM.REL 4 -M8 assemble outpu file. MDSETCOM.PRN 46 -M8 assemble listin file. MDT60M .BAS 2k - MDT6 termina curso controlle progra writte i MBASIC Se MDT60.DOC. MDT60 .BAS 2 -Same a abov except in SBASIC. MDT6 .CO 6 -Compile versio o the SBASIC program. MDT6 .DO 2 <- Documentatio for abov - REA M ! OKI92M .BAS 4k -A OKI9 printe controlle progra writte i MBASIC Se OKI92.DOC. OKI92 .BAS 4 -Same a abov except in SBASIC. OKI9 .COM 6 -Compile versio of the SBASIC program. OKI9 .DOC 2 <-- Documentatio fo abov - REA M ! WINDEX2 .COM 4k -Faster improve versio o WINDEX progra t creat indexe fo WS/N file writte i documen mode. WINDEX .DO 10 <- Complet documentatio fo abov REA M !! XCAT36 .COM 4k -Generate cros-referenc listin fro th informatio containe i th MAST.CA file. XCAT36 .DOC 4 <-- Documentatio fo abov - REA M ! 1000 R1=(360/33)/57.2958: R2=(360/28)/57.2958: R3=(360/23)/57.2958 1010 PRINT CHR$(26):PRINT 1020 PRINT "******************** BIO-RHYTHM ********************" 1030 PRINT:PRINT 1040 PRINT "TO GENERATE AND PRINT YOUR BIO-RHYTHM CHART:" 1050 PRINT 1060 PRINT " - Enter the subject's birthday, a comma and the " 1070 PRINT " current date, both in YYMMDD format." 1080 PRINT " - Enter the number of days you want to cover." 1090 PRINT " - Enter the name of the subject." 1100 PRINT:PRINT:PRINT 1110 DATA 0,31,59,90,120,151,181,212,243,273,304,334 1120 DATA 365 1130 DIM L$(50) 1140 GOTO 1180 1150 INPUT "Do you want another Bio-rhythm? (Y/y/N/n)",ANS$ 1160 IF LEFT$(ANS$,1)="N" OR LEFT$(ANS$,1)="n" THEN END 1170 PRINT CHR$(26);:PRINT:PRINT:PRINT 1180 RESTORE 1190 INPUT"Enter birth date - comma - study date (YYMMDD,YYMMDD): ",D1,D2 1200 IF D1>D2 THEN PRINT" INVALID DATES: ";D1;D2: GOTO 1190 1210 P1=0: J6=1: D9=D2 1220 PRINT:INPUT"Enter duration of study (in days): ",J5 1230 PRINT:INPUT"Enter subject's full name: ",A$:PRINT 1240 GOSUB 1840 1250 X1=D1: GOSUB 1300 1260 Y1=X2: M1=X3: D1=X4 1270 X1=D2: GOSUB 1300 1280 Y2=X2: M2=X3: D2=X4 1290 GOSUB 1320 1300 X2=INT(X1/10000): X3=INT(X1/100)-(X2*100): X4=X1-((X3*100)+(X2*10000)) 1310 RETURN 1320 D4=(INT((Y2-1)*365.25)-INT((Y1-1)*365.25)) 1330 FOR I=1 TO M1: READ J1: NEXT I 1340 RESTORE 1350 FOR I =1 TO M2: READ J2: NEXT I 1360 J1=J1+D1: J2=J2+D2: L1=(Y1/4)-(INT(Y1/4)) 1370 IF L1=0 THEN L1=1: GOTO 1390 1380 L1=0 1390 L2=(Y2/4)-(INT(Y2/4)) 1400 IF L2=0 THEN L2=1:GOTO 1420 1410 L2=0 1420 IF M1>2 THEN J1=J1+L1 1430 IF M2>2 THEN J2=J2+L2 1440 D4=D4+J2-J1: D1=(D4-(INT(D4/33)*33)) 1450 D2=(D4-(INT(D4/28)*28)): D3=(D4-(INT(D4/23)*23)) 1460 FOR L3=1 TO 50 1470 FOR I= 1 TO 50: L$(I)=" ": NEXT I 1480 X=SIN(R1*D1): Y=SIN(R2*D2): Z=SIN(R3*D3) 1490 L$(X*17+25)="M": L$(Y*20+25)="E": L$(Z*23+25)="P" 1500 PRINT": "; 1510 FOR I=1 TO 50: IF L$(25)=" " THEN L$(25)="|" 1515 PRINT L$(I);: NEXT I 1520 PRINT": "; 1530 GOSUB 1710: PRINT D5;" : "; 1535 IF D3= 0 THEN C=1:PRINT TAB(69) "P"; 1545 IF D3=12 THEN C=1:PRINT TAB(69) "P"; 1560 IF D2= 0 THEN C=1:PRINT TAB(70) "E"; 1570 IF D2=14 THEN C=1:PRINT TAB(70) "E"; 1575 IF D1= 0 THEN C=1:PRINT TAB(71) "M"; 1585 IF D1=16 THEN C=1:PRINT TAB(71) "M"; 1600 PRINT TAB(76)":" 1610 IF C=1 THEN C=0 1620 D1=D1+1: D2=D2+1: D3=D3+1 1630 IF D1=33 THEN D1=0 1640 IF D2=28 THEN D2=0 1650 IF D3=23 THEN D3=0 1660 J2=J2+1: J6=J6+1: IF J559 THEN J3=J3+L2 1740 IF J2<=J3 GOTO 1800 1750 NEXT I 1760 Y2=Y2+1: L2=(Y2/4)-(INT(Y2/4)) 1770 IF L2=0 THEN L2=1:GOTO 1790 1780 L2=0 1790 J2=J2-365: GOTO 1710 1800 M2=I-1: D6=J2-J4 1810 IF J2=60 THEN D6=D6+L2 1820 D5=Y2*10000+(M2*100)+D6: RETURN 1830 REM -------------------------------- 1840 FOR I=1 TO 76:PRINT"-";:NEXT I:PRINT 1850 PRINT": Elmer's Computerized Study of Biorhythms for ";A$; 1860 GOSUB 1980 1870 PRINT": Birth date:";D1; 1880 PRINT " Study Date:";D9;" Duration:";J5;"days "; 1890 GOSUB 1980 1900 FOR I=1 TO 76:PRINT"-";:NEXT I:PRINT 1910 PRINT": P = PHYSICAL E = EMOTIONAL M = MENTAL :"; 1915 PRINT" DATE : CRITICAL :" 1920 REM PRINT TAB(76)":" 1930 FOR I=1 TO 53:PRINT"-";:NEXT I:PRINT":(YY/MM/DD): FOR? :" 1940 PRINT": LOW : HIGH :"; 1950 PRINT" : :" 1960 FOR I=1 TO 76:PRINT"-";:NEXT I:PRINT 1970 RETURN 1980 PRINT TAB(76)":": RETURN 1990 FOR I=1 TO 76:PRINT"-";:NEXT I:PRINT 2000 PRINT": HIGH - Days of full vitality, efficiency, "; 2010 PRINT"and high endurance"; 2020 GOSUB 1980 2030 PRINT": LOW - Days of reduced efficiency, recuperation, "; 2040 PRINT"tiring easily"; 2050 GOSUB 1980 2060 PRINT": CRITICAL - Days to avoid situations that might "; 2070 PRINT"lead to trouble"; 2080 GOSUB 1980 2090 FOR I=1 TO 76:PRINT"-";:NEXT I:PRINT 2100 PRINT TAB(34);"PAGE ";P1 2110 RETURN T"lead to trouble"; 2080 GOSUB 1980 2090 FOR I=1 TO 76:PRINT1000 R1=(360/33)/57.2958: R2=(360/28)/57.2958: R3=(360/23)/57.2958 1010 PRINT CHR$(26):PRINT 1020 PRINT "******************** BIO-RHYTHM ********************" 1030 PRINT:PRINT 1040 PRINT "TO GENERATE AND PRINT YOUR BIO-RHYTHM CHART:" 1050 PRINT 1055 PRINT " - Ready your printer to accept 60 lines/page." 1060 PRINT " - Enter the subject's birthday, a comma and the " 1070 PRINT " current date, both in YYMMDD format." 1080 PRINT " - Enter the number of days you want to cover." 1090 PRINT " - Enter the name of the subject." 1100 PRINT:PRINT:PRINT 1110 DATA 0,31,59,90,120,151,181,212,243,273,304,334 1120 DATA 365 1130 DIM L$(50) 1140 GOTO 1180 1150 INPUT "Do you want another Bio-rhythm? (Y/y/N/n)",ANS$ 1160 IF LEFT$(ANS$,1)="N" OR LEFT$(ANS$,1)="n" THEN END 1170 PRINT CHR$(26);:PRINT:PRINT:PRINT 1180 RESTORE 1190 INPUT"Enter birth date - comma - study date (YYMMDD,YYMMDD): ",D1,D2 1200 IF D1>D2 THEN PRINT" INVALID DATES: ";D1;D2: GOTO 1190 1210 P1=0: J6=1: D9=D2 1220 PRINT:INPUT"Enter duration of study (in days): ",J5 1230 PRINT:INPUT"Enter subject's full name: ",A$:PRINT 1240 GOSUB 1840 1250 X1=D1: GOSUB 1300 1260 Y1=X2: M1=X3: D1=X4 1270 X1=D2: GOSUB 1300 1280 Y2=X2: M2=X3: D2=X4 1290 GOSUB 1320 1300 X2=INT(X1/10000): X3=INT(X1/100)-(X2*100): X4=X1-((X3*100)+(X2*10000)) 1310 RETURN 1320 D4=(INT((Y2-1)*365.25)-INT((Y1-1)*365.25)) 1330 FOR I=1 TO M1: READ J1: NEXT I 1340 RESTORE 1350 FOR I =1 TO M2: READ J2: NEXT I 1360 J1=J1+D1: J2=J2+D2: L1=(Y1/4)-(INT(Y1/4)) 1370 IF L1=0 THEN L1=1: GOTO 1390 1380 L1=0 1390 L2=(Y2/4)-(INT(Y2/4)) 1400 IF L2=0 THEN L2=1:GOTO 1420 1410 L2=0 1420 IF M1>2 THEN J1=J1+L1 1430 IF M2>2 THEN J2=J2+L2 1440 D4=D4+J2-J1: D1=(D4-(INT(D4/33)*33)) 1450 D2=(D4-(INT(D4/28)*28)): D3=(D4-(INT(D4/23)*23)) 1460 FOR L3=1 TO 46 1470 FOR I= 1 TO 50: L$(I)=" ": NEXT I 1480 X=SIN(R1*D1): Y=SIN(R2*D2): Z=SIN(R3*D3) 1490 L$(X*17+25)="M": L$(Y*20+25)="E": L$(Z*23+25)="P" 1500 LPRINT": "; 1510 FOR I=1 TO 50: IF L$(25)=" " THEN L$(25)="|" 1515 LPRINT L$(I);: NEXT I 1520 LPRINT": "; 1530 GOSUB 1710: LPRINT D5;" : "; 1535 IF D3= 0 THEN C=1:LPRINT TAB(69) "P"; 1545 IF D3=12 THEN C=1:LPRINT TAB(69) "P"; 1560 IF D2= 0 THEN C=1:LPRINT TAB(70) "E"; 1570 IF D2=14 THEN C=1:LPRINT TAB(70) "E"; 1575 IF D1= 0 THEN C=1:LPRINT TAB(71) "M"; 1585 IF D1=16 THEN C=1:LPRINT TAB(71) "M"; 1600 LPRINT TAB(76)":" 1610 IF C=1 THEN C=0 1620 D1=D1+1: D2=D2+1: D3=D3+1 1630 IF D1=33 THEN D1=0 1640 IF D2=28 THEN D2=0 1650 IF D3=23 THEN D3=0 1660 J2=J2+1: J6=J6+1: IF J559 THEN J3=J3+L2 1740 IF J2<=J3 GOTO 1800 1750 NEXT I 1760 Y2=Y2+1: L2=(Y2/4)-(INT(Y2/4)) 1770 IF L2=0 THEN L2=1:GOTO 1790 1780 L2=0 1790 J2=J2-365: GOTO 1710 1800 M2=I-1: D6=J2-J4 1810 IF J2=60 THEN D6=D6+L2 1820 D5=Y2*10000+(M2*100)+D6: RETURN 1830 REM -------------------------------- 1840 FOR I=1 TO 76:LPRINT"-";:NEXT I:LPRINT 1850 LPRINT": Elmer's Computerized Study of Biorhythms for ";A$; 1860 GOSUB 1980 1870 LPRINT": Birth date:";D1; 1880 LPRINT " Study Date:";D9;" Duration:";J5;"days "; 1890 GOSUB 1980 1900 FOR I=1 TO 76:LPRINT"-";:NEXT I:LPRINT 1910 LPRINT": P = PHYSICAL E = EMOTIONAL M = MENTAL :"; 1915 LPRINT" DATE : CRITICAL :" 1920 REM LPRINT TAB(76)":" 1930 FOR I=1 TO 53:LPRINT"-";:NEXT I:LPRINT":(YY/MM/DD): FOR? :" 1940 LPRINT": LOW : HIGH :"; 1950 LPRINT" : :" 1960 FOR I=1 TO 76:LPRINT"-";:NEXT I:LPRINT 1970 RETURN 1980 LPRINT TAB(76)":": RETURN 1990 FOR I=1 TO 76:LPRINT"-";:NEXT I:LPRINT 2000 LPRINT": HIGH - Days of full vitality, efficiency, "; 2010 LPRINT"and high endurance"; 2020 GOSUB 1980 2030 LPRINT": LOW - Days of reduced efficiency, recuperation, "; 2040 LPRINT"tiring easily"; 2050 GOSUB 1980 2060 LPRINT": CRITICAL - Days to avoid situations that might "; 2070 LPRINT"lead to trouble"; 2080 GOSUB 1980 2090 FOR I=1 TO 76:LPRINT"-";:NEXT I:LPRINT 2100 LPRINT TAB(34);"PAGE ";P1 2110 RETURN ead to trouble"; 2080 GOSUB 1980 2090 FOR I=1 TO 76:LPRINT"-";:NEXT I:LPRINT 210010 REM C H A S E 8 5 Version 4.3 September 13, 1985 20 REM BY HERMAN DEMONSTOY IN FEBRUARY 1977 KILOBAUD MAGAZINE 30 REM BY TOM SARBECK: A LARGER SCREEN, ON-SCREEN AUTOMATIC ACTION, 40 REM CURSOR ACTIVITY AND PROGRAM PARAMETERIZATION 50 DEFINT A-Z: REM INTEGER VARIABLES FOR INCREASED SPEED 60 REM ----------------------------------------------> CURSOR CONTROLS 70 CURPOS$=CHR$(27)+"=": REM BYTES 1,2 OF CURSOR POSITIONING: ESC = Y X 80 CURFAST$=CHR$(27)+CHR$(34)+"1": CURSLOW$=CHR$(27)+CHR$(34)+"0" 90 CURNONE$=CHR$(27)+CHR$(34)+"6": REM CURSOR FREQUENCY AND PRESENCE 100 REM ----------------------------------------------> PARAMETERS 110 HIGH=20: WIDE=79: DIM ARENA(HIGH,WIDE) 120 REM ARENA(Y,X) = 0 - EMPTY SPACE 130 REM ARENA(Y,X) = 1 - CHARGED FENCE OR POST (X) 140 REM ARENA(Y,X) = 2 - ROBOT GUARDS (+) 150 REM ARENA(Y,X) = 3 - YOU (O) 160 VH=81: DIM VERT(VH), HORIZ(VH) 170 REM VERT/HORIZ(1 TO NRG) - GUARD Y/X POSITIONS 180 REM VERT/HORIZ(NRG+1 TO VH-1) - FENCE POST Y/X POSITIONS 190 REM VERT/HORIZ(VH) - YOUR Y/X POSITION 200 NRG=20: NRGLIM=25: NPLYRS=1: NFP=VH-NRG-NPLYRS 210 REM NRG - NUMBER OF ROBOT GUARDS 220 REM NRGLIM - INITIAL LIMIT ON NRG 230 REM NPLYRS - NUMBER OF PLAYERS (TINKER AT YOUR OWN RISK) 240 REM NFP - NUMBER OF FENCE POSTS 250 DIM BETS$(4): BETS$(1)="Place your bets. ": BETS$(2)="Your bets down? " 260 BETS$(3)="Are you betting? ": BETS$(4)="$$$$$$$$$$$$$$$$$" 270 DIM CTR$(4),DEMISE$(2): REM - JUMP AND LOST GAME COMMENTS 280 CTR$(1)="5: Has no effect ": CTR$(2)="5: Halves the speed" 290 CTR$(3)="5: random jump ": CTR$(4)="5: random jumps" 300 DEMISE$(1)="you klutz!": DEMISE$(2)="I gotcha!!" 310 DIM RNDCHK!(100): REM ----------------------------> PREVENT RND LOOPS 320 NRG=20: NRGLIM=25: TSCORE!=O: DMS=3: REM ---------> RE-START HERE 330 PRINT CURSLOW$;: REM -----------------------------> SLOW CURSOR 340 WON=0: LOST=0: STRAIGHT=0: WONTOP=0: JUMPS=1: TMOVES=0 350 FOR D=1 TO 50: RNDCHK!(D)=99999!: NEXT D: RNDCNT=0: REM RND FIX 360 REM ----------------------------------------------> THE INSTRUCTIONS 370 PRINT CHR$(26):PRINT CURPOS$;CHR$(32);CHR$(32); 380 PRINT"Twenty robot guards (+) are pursuing you (0). If you can maneuver"; 390 PRINT" them into" 400 PRINT"the charged fence posts (X) or into each other, and if you can"; 410 PRINT" avoid the posts" 420 PRINT"and the charged fence (X), you can get away. You can also score"; 430 PRINT" some points." 440 PRINT"To see how I compute your score, enter a 0 game speed." 450 PRINT 460 PRINT" 7 8 9" 470 PRINT"From 5, your moves are: 4 5 6 5 See notes on screen." 480 PRINT" 1 2 3 0 Stop in place." 490 PRINT 500 PRINT"Enter a game speed and a starting number. When the board appears,"; 510 PRINT" plan your" 520 PRINT"first move and enter it. Each move you select repeats until you"; 530 PRINT" change it." 540 PRINT"With a win the game speed increases; with a loss it decreases. "; 550 PRINT"The jumps you" 560 PRINT"don't use add up for later games. Win five games in a row and"; 570 PRINT" things begin" 580 PRINT"to happen. For bettors, but for your end of game position, your"; 590 PRINT" starting" 600 PRINT"number determines all board setups in a series. Good luck and"; 610 PRINT" good moves." 620 PRINT 630 INPUT"Enter a game speed (1 = slow; 50 = fast. Try for 55?) ",SPEED 640 IF SPEED> 0 GOTO 780 650 PRINT CURPOS$;CHR$(41);CHR$(32); 660 PRINT"For each guard you destroy you get 10 points--unless that guard"; 670 PRINT" destroys you." 680 PRINT"If you destroy all of the guards, I add to this total a number"; 690 PRINT" proportional " 700 PRINT"to the game speed. In the first game in a series, this result"; 710 PRINT" is your score." 720 PRINT"In subsequent games, I add to your score the number of moves you"; 730 PRINT" take less " 740 PRINT"than your average and subtract from your score one half the"; 750 PRINT" number of moves " 760 PRINT"you take more than your average. One more time, g" 770 PRINT:PRINT: SPEED=1 780 IF SPEED<51 GOTO 800 ELSE SPEED=50 790 PRINT:PRINT CHR$(7);"Whoa! Win at 50 first." 800 DELAY=55-SPEED: SPEED!=SPEED 810 PRINT:INPUT"Enter a starting number (0 to 32767) ",SEED! 820 SEED!=ABS(SEED!): IF SEED!>32767! THEN SEED!=32767! 830 SEED!=-((LOG(SEED!+2!)-.5)/10!) 840 RNDCNT=RNDCNT+1: RNDCHK!(RNDCNT)=SEED! 850 PRINT CURNONE$;: REM -----------------------------> NO CURSOR 860 REM ----------------------------------------------> THE GAME LOOP 870 FACTOR!=1!+(55-DELAY)/100!: SEED!=-RND(SEED!) 880 RNDCNT=RNDCNT+1: IF RNDCNT<101 GOTO 900: REM ----> RND LOOP? 890 FOR D=1 TO 50: RNDCHK!(D)=RNDCHK!(D+50): NEXT D: RNDCNT=51 900 RNDCHK!(RNDCNT)=SEED! 910 FOR D=1 TO RNDCNT-1: IF SEED!<>RNDCHK!(D) GOTO 930 920 SEED!=SEED!-.001001: SEED!=-RND(SEED!): REM YES 930 NEXT D 940 PRINT CURPOS$;CHR$(54);CHR$(83);" " 950 PRINT CURPOS$;CHR$(54);CHR$(54);"Press . to quit or , to re-start. "; 960 NRGL=NRG: NMOVES=0: JUMPS=JUMPS+1: FIVER=3: BETS=INT(4*RND+1) 970 GSCORE!=0!: IF DELAY<54 THEN CTRX$=CTR$(2) ELSE CTRX$=CTR$(1) 980 IF JUMPS< 2 THEN FIVER=2 990 FOR XPOS=1 TO WIDE: ARENA( 1,XPOS)=1: NEXT XPOS 1000 FOR XPOS=1 TO WIDE: ARENA(HIGH,XPOS)=1: NEXT XPOS 1010 FOR YPOS=1 TO HIGH: ARENA(YPOS, 1)=1: NEXT YPOS 1020 FOR YPOS=1 TO HIGH: ARENA(YPOS,WIDE)=1: NEXT YPOS 1030 FOR YPOS=2 TO HIGH-1 1040 FOR XPOS=2 TO WIDE-1: ARENA(YPOS,XPOS)=0: NEXT XPOS 1050 KEY$=INKEY$: IF LEN(KEY$)=0 GOTO 1070 1060 IF KEY$="," GOTO 320 ELSE IF KEY$="." GOTO 3150 1070 PRINT MID$(BETS$(BETS),YPOS-1,1);: REM ---------> SCREEN ACTIVITY 1080 NEXT YPOS 1090 IF WON+LOST=0 GOTO 1110: REM ---------------------> IF FIRST GAME 1100 IF DMS=0 THEN ARENA(VERT(VH),HORIZ(VH))=3: REM ---> AFTER A WIN 1110 FOR D=1 TO VH: REM -------------------------------> Y-X POSITIONS 1120 YPOS=INT(RND*(HIGH-2))+2: XPOS=INT(RND*(WIDE-2))+2 1130 IF ARENA(YPOS,XPOS)<>0 GOTO 1120: REM ----------> IF TAKEN 1140 IF D=20 OR D=40 OR D=60 THEN PRINT"$";: REM ----> SCREEN ACTIVITY 1150 IF D RG 1160 IF D POST 1170 IF DMS=0 GOTO 1200: REM ------------------------> AFTER A WIN 1180 ARENA(YPOS,XPOS)=3 1190 VERT(D)=YPOS: HORIZ(D)=XPOS 1200 KEY$=INKEY$: IF LEN(KEY$)=0 GOTO 1220 1210 IF KEY$="," GOTO 320 ELSE IF KEY$="." GOTO 3150 1220 NEXT D: PRINT 1230 REM ----------------------------------------------> DISPLAY ARENA 1240 FOR D=32 TO 109: PRINT CURPOS$;CHR$(32);CHR$(D);" ";: NEXT D:PRINT" " 1250 PRINT CURPOS$;CHR$(32);CHR$(32);"You've won";WON;"and lost";LOST 1260 PRINT CURPOS$;CHR$(32);CHR$(63);"This game's speed:";55-DELAY 1270 PRINT CURPOS$;CHR$(32);CHR$(92);CTR$(FIVER+1) 1280 PRINT CURPOS$;CHR$(32);CHR$(95);JUMPS 1290 FOR YPOS=1 TO HIGH 1300 FOR XPOS=1 TO WIDE 1310 IF ARENA(YPOS,XPOS)=0 THEN PRINT" ";: GOTO 1350 1320 IF ARENA(YPOS,XPOS)=1 THEN PRINT"X";: GOTO 1350 1330 IF ARENA(YPOS,XPOS)=2 THEN PRINT"+";: GOTO 1350 1340 IF ARENA(YPOS,XPOS)=3 THEN PRINT"O"; 1350 NEXT XPOS 1360 PRINT 1370 KEY$=INKEY$: IF LEN(KEY$)=0 GOTO 1390 1380 IF KEY$="," GOTO 320 ELSE IF KEY$="." GOTO 3150 1390 NEXT YPOS 1400 PRINT CURPOS$;CHR$(53);CHR$(32);"In moves " 1410 PRINT CURPOS$;CHR$(53);CHR$(56);" Game score:" 1420 PRINT CURPOS$;CHR$(53);CHR$(76);"Total score:" 1430 PRINT CURPOS$;CHR$(53);CHR$(94);" " 1440 REM ----------------------------------------------> FAST CURSOR ON O 1450 PRINT CURPOS$;CHR$(VERT(VH)+32);CHR$(HORIZ(VH)+31);CURFAST$; 1460 FOR DLY=1 TO 100: TIME=1.5^1.5: NEXT DLY: REM ----> PAUSE 1470 KEY$=INKEY$: IF LEN(KEY$)=0 GOTO 1490: REM -------> CHECK CONSOLE 1480 IF KEY$="," GOTO 320 ELSE IF KEY$="." GOTO 3150 1490 PRINT CURPOS$;CHR$(54);CHR$(32);" " 1500 PRINT CURPOS$;CHR$(54);CHR$(54);: REM ------------> GET FIRST MOVE 1510 PRINT"Press ONLY a # key. Do not or ENTER. Your move: " 1520 PRINT CURPOS$;CHR$(54);CHR$(109);CURSLOW$;: REM --> SLOW CURSOR 1530 KEY$=INKEY$: REM ---------------------------------> GET FIRST MOVE 1540 IF LEN(KEY$)=0 GOTO 1530 1550 IF KEY$<"0" OR KEY$>"9" GOTO 1530 1560 PRINT CURNONE$: REM ------------------------------> NO CURSOR 1570 PRINT CURPOS$;CHR$(54);CHR$(109);KEY$ 1580 PRINT CURPOS$;CHR$(54);CHR$(97);" " 1590 KEY=ASC(KEY$)-48: KEYL=KEY: GOTO 1620 1600 REM ----------------------------------------------> THE PLAY LOOP 1610 FOR DLY=1 TO DELAY: TIME=1.5^1.5: NEXT DLY: REM --> THE PLAY PAUSE 1620 OLDY=VERT(VH): YPOS=OLDY: OLDX=HORIZ(VH): XPOS=OLDX 1630 ARENA(OLDY,OLDX)=0 1640 PRINT CURPOS$;CHR$(54);CHR$(98);"You keyed:" 1650 KEY$=INKEY$: REM ---------------------------------> GET A MOVE 1660 IF LEN(KEY$)=0 THEN KEY=KEYL: GOTO 1700 1670 IF KEY$<"0" OR KEY$>"9" GOTO 1650 1680 KEY=ASC(KEY$)-48 1690 PRINT CURPOS$;CHR$(54);CHR$(108);KEY 1700 IF KEY=0 GOTO 1970 1710 ON KEY GOTO 1730,1730,1730,1740,1770,1740,1720,1720,1720 1720 YPOS=YPOS-1: GOTO 1740: REM MOVE UP 1730 YPOS=YPOS+1: REM MOVE DOWN 1740 ON KEY GOTO 1750,1960,1760,1750,1770,1760,1750,1960,1760 1750 XPOS=XPOS-1: GOTO 1960: REM MOVE LEFT 1760 XPOS=XPOS+1: GOTO 1960: REM MOVE RIGHT 1770 JUMPS=JUMPS-1: REM A 5 MOVE 1780 IF JUMPS<-1 THEN KEY=KEYL: GOTO 1690 1790 IF JUMPS< 0 THEN KEY=KEYL: DELAY=DELAY+(55-DELAY)/2: ELSE GOTO 1830 1800 IF DELAY>54 THEN DELAY=54 1810 PRINT CURPOS$;CHR$(32);CHR$(92);CTR$(1); 1820 PRINT CURPOS$;CHR$(32);CHR$(81);55-DELAY;: GOTO 1690 1830 IF JUMPS< 1 THEN PRINT CURPOS$;CHR$(32);CHR$(92);CTRX$: GOTO 1860 1840 PRINT CURPOS$;CHR$(32);CHR$(95);JUMPS 1850 IF JUMPS< 2 THEN PRINT CURPOS$;CHR$(32);CHR$(110);" " 1860 KEYL=0: YLO=3: YHI=HIGH-2: XLO=3: XHI=WIDE-2 1870 YPOS=INT(RND*HIGH-2)+2: XPOS=INT(RND*WIDE-2)+2 1880 IF YPOSYHI GOTO 1870 1890 IF XPOSXHI GOTO 1870 1900 IF ARENA(YPOS,XPOS)<>0 GOTO 1870 1910 NEWY=YPOS-2: NEWX=XPOS-2: REM --------------------> LOOK AROUND 1920 FOR D=NEWY TO NEWY+4: FOR E=NEWX TO NEWX+4 1930 IF ARENA(D,E)=2 GOTO 1870: REM -------------------> NOT NEXT TO AN RG 1940 NEXT E: NEXT D 1950 REM ----------------------------------------------> MOVE RESULTS 1960 PRINT CURPOS$;CHR$(OLDY+32);CHR$(OLDX+31);" " 1970 NMOVES=NMOVES+1 1980 IF NMOVES>1 THEN PRINT CURPOS$;CHR$(53);CHR$(34);NMOVES 1990 IF ARENA(YPOS,XPOS)=1 THEN DMS=1: GOTO 2380: REM FENCE OR POST 2000 IF ARENA(YPOS,XPOS)=2 THEN DMS=1: GOTO 2380: REM ROBOT GUARD 2010 ARENA(YPOS,XPOS)=3: REM EMPTY - MOVE INTO THE SPACE 2020 VERT(VH)=YPOS: HORIZ(VH)=XPOS 2030 PRINT CURPOS$;CHR$(OLDY+32);CHR$(OLDX+31);" " 2040 PRINT CURPOS$;CHR$(YPOS+32);CHR$(XPOS+31);"O" 2050 IF KEY <> 5 THEN KEYL=KEY: GOTO 2090 2060 PRINT CURPOS$;CHR$(YPOS+32);CHR$(XPOS+31);CURFAST$; 2070 FOR DLY=1 TO 100: TIME=1.5^1.5: NEXT DLY: REM PAUSE AFTER JUMP 2080 PRINT CURNONE$ 2090 IF DELAY > 36 THEN PRINT CURPOS$;CHR$(54);CHR$(98);"Your move:" 2100 FOR D=1 TO NRG: REM ------------------------------> MOVE THE GUARDS 2110 IF VERT(D)=0 GOTO 2330 2120 OLDY=VERT(D): NEWY=OLDY: OLDX=HORIZ(D): NEWX=OLDX 2130 ARENA(OLDY,OLDX)=0: PRINT CURPOS$;CHR$(OLDY+32);CHR$(OLDX+31);" " 2140 IF OLDY < YPOS THEN NEWY=NEWY+1: GOTO 2160: REM -------> DOWN 2150 IF OLDY > YPOS THEN NEWY=NEWY-1: REM ------------------> UP 2160 IF OLDX < XPOS THEN NEWX=NEWX+1: GOTO 2180: REM -------> RIGHT 2170 IF OLDX > XPOS THEN NEWX=NEWX-1: Z=RND: REM -----------> LEFT 2180 IF ARENA(NEWY,NEWX) > 0 GOTO 2210 2190 PRINT CURPOS$;CHR$(NEWY+32);CHR$(NEWX+31);"+": REM ----> EMPTY 2200 VERT(D)=NEWY: HORIZ(D)=NEWX: ARENA(NEWY,NEWX)=2: GOTO 2330 2210 IF ARENA(NEWY,NEWX) > 1 GOTO 2240 2220 PRINT CURPOS$;CHR$(NEWY+32);CHR$(NEWX+31);" ": REM ----> FENCE/POST 2230 VERT(D)=0: ARENA(NEWY,NEWX)=0: NRGL=NRGL-1: GOTO 2320 2240 IF ARENA(NEWY,NEWX) > 2 THEN DMS=2: GOTO 2380: REM ----> GOT ME 2250 PRINT CURPOS$;CHR$(NEWY+32);CHR$(NEWX+31);" ": REM ----> ANOTHER RG 2260 VERT(D)=0: ARENA(NEWY,NEWX)=0: NRGL=NRGL-2 2270 FOR E=1 TO NRG: IF E=D GOTO 2310: REM -----------------> WHICH OTHER? 2280 IF VERT(E) <> NEWY GOTO 2310 2290 IF HORIZ(E) <> NEWX GOTO 2310 2300 VERT(E)=0: REM --------------------------------------> KILL IT TOO 2310 NEXT E 2320 IF NRGL<1 GOTO 2520 2330 NEXT D: REM ---------------------------------------------> ALL DONE 2340 XSCORE!=TSCORE!+GSCORE! 2350 PRINT CURPOS$;CHR$(53);CHR$(88);INT(XSCORE!) 2360 GOTO 1610: REM -----------------------------------> NEXT MOVE 2370 REM ----------------------------------------------> GAME OVER - LOSS 2380 PRINT CURPOS$;CHR$(YPOS+32);CHR$(XPOS+31);"-" 2390 LOST=LOST+1: STRAIGHT=0: GSCORE!=10*(NRG-NRGL) 2400 TSCORE!=TSCORE!+GSCORE!: ASCORE!=TSCORE!/(WON+LOST) 2410 PRINT CURPOS$;CHR$(53);CHR$(46);DEMISE$(DMS) 2420 PRINT CURPOS$;CHR$(53);CHR$(69);GSCORE! 2430 PRINT CURPOS$;CHR$(53);CHR$(88);TSCORE! 2440 PRINT CURPOS$;CHR$(53);CHR$(94);" "; 2450 PRINT USING "####.##";ASCORE!;:PRINT" per game" 2460 IF DELAY>10 THEN DELAY=DELAY+INT(DELAY/5) ELSE DELAY=DELAY+2 2470 WONTOP=0: IF DELAY>54 THEN DELAY=54 2480 PRINT CURPOS$;CHR$(32);CHR$(32);"You've won";WON;"and lost";LOST 2490 PRINT CURPOS$;CHR$(32);CHR$(63);"Next game's speed:";55-DELAY 2500 JUMPS=JUMPS-1: GOTO 3110 2510 REM ----------------------------------------------> GAME OVER - WIN 2520 WON=WON+1: STRAIGHT=STRAIGHT+1: PRINT CHR$(7) 2530 GSCORE!=INT(10*NRG*FACTOR!+.5): IF WON>1 GOTO 2550 2540 TMOVES=NMOVES: AMOVES!=TMOVES: GOTO 2570: REM ----> FIRST WIN 2550 NET=INT(AMOVES!)-NMOVES: IF NET<0 THEN NET=NET/2 2560 GSCORE!=GSCORE!+NET: TMOVES=TMOVES+NMOVES: AMOVES!=TMOVES/WON 2570 TSCORE!=TSCORE!+GSCORE!: ASCORE!=TSCORE!/(WON+LOST) 2580 PRINT CURPOS$;CHR$(53);CHR$(46);"YOU WIN!!": DMS=0 2590 PRINT CURPOS$;CHR$(53);CHR$(69);GSCORE! 2600 PRINT CURPOS$;CHR$(53);CHR$(88);TSCORE! 2610 PRINT CURPOS$;CHR$(53);CHR$(95); 2620 PRINT USING "####.##";ASCORE!;:PRINT" per game" 2630 DLY=INT(3*DELAY/5): PRINT CURPOS$;CHR$(54);CHR$(34); 2640 PRINT USING "###.##";AMOVES!;: PRINT" moves/win" 2650 PRINT CURPOS$;CHR$(32);CHR$(32);"You've won";WON;"and lost";LOST 2660 PRINT CURPOS$;CHR$(32);CHR$(63);"Next game's speed:";55-DLY 2670 PRINT CURPOS$;CHR$(32);CHR$(92);" And add 1 jump " 2680 IF DELAY>0 AND STRAIGHT<5 GOTO 3090 2690 FOR DLY=1 TO 10: TIME=1.5^1.5: NEXT DLY 2700 FOR DLY=1 TO 3 2710 PRINT CHR$(7);: FOR D=1 TO 20: TIME=1.5^1.5: NEXT D 2720 NEXT DLY 2730 FOR DLY=1 TO 100: TIME=1.5^1.5: NEXT DLY 2740 FOR D=33 TO 52 2750 PRINT CURPOS$;CHR$(D);CHR$(32);" " 2760 PRINT CURPOS$;CHR$(D);CHR$(58);" " 2770 PRINT CURPOS$;CHR$(D);CHR$(85);" " 2780 IF D-1=YPOS+32 THEN PRINT CURPOS$;CHR$(YPOS+32);CHR$(XPOS+31);"O" 2790 NEXT D 2800 IF DELAY<1 GOTO 2900 2810 PRINT CURPOS$;CHR$(36);CHR$(32); 2820 PRINT TAB(20) "Y O U ' V E W O N ";STRAIGHT;" S T R A I G H T !" 2830 PRINT:PRINT: IF RND<.5 THEN GOTO 2870 2840 PRINT:PRINT TAB(19) "A N D Y O U W I N T H E T O S S" 2850 PRINT TAB(22) "F O R A N E X T R A J U M P":JUMPS=JUMPS+1 2860 PRINT CURPOS$;CHR$(32);CHR$(103);"2 jumps"; 2870 PRINT CURPOS$;CHR$(46);CHR$(32) 2880 PRINT TAB(28) "T R Y F O R ";STRAIGHT+1;"? ?" 2890 GOTO 3090 2900 WONTOP=WONTOP+1: PRINT CURPOS$;CHR$(36);CHR$(32); 2910 PRINT TAB(3) "Y O U ' V E W O N ";WONTOP; 2920 PRINT TAB(32) "S T R A I G H T A T T O P S P E E D !" 2930 PRINT: IF WONTOP<>2 GOTO 2960 2940 PRINT:PRINT TAB(11) "S T A R T C O U N T I N G "; 2950 PRINT TAB(43) "T H O S E B U G G E R S": GOTO 3030 2960 PRINT: IF WONTOP<>5 GOTO 2980 2970 PRINT TAB(20) "Y O U ' R E D O I N G W E L L ! ! !": GOTO 3030 2980 IF WONTOP<>10 GOTO 3000 2990 PRINT TAB(25) "C O U N T ' E M A G A I N":NRGLIM=30: GOTO 3030 3000 IF WONTOP<15 GOTO 3030 3010 IF NRG.5 GOTO 3070 3040 PRINT:PRINT TAB(19) "A N D Y O U W I N T H E T O S S" 3050 PRINT TAB(22) "F O R A N E X T R A J U M P":JUMPS=JUMPS+1 3060 PRINT CURPOS$;CHR$(32);CHR$(103);"2 jumps"; 3070 PRINT CURPOS$;CHR$(47);CHR$(32) 3080 PRINT TAB(28) "T R Y F O R ";WONTOP+1;"? ?" 3090 PRINT CURPOS$;CHR$(YPOS+32);CHR$(XPOS+31);"O" 3100 DELAY=INT(3*DELAY/5) 3110 IF JUMPS<0 THEN JUMPS=0 3120 IF DELAY=0 THEN NRG=NRG+1 3130 IF NRG>NRGLIM THEN NRG=NRGLIM 3140 GOTO 870 3150 PRINT CURPOS$;CHR$(53);CHR$(32);CURSLOW$: REM ----> SLOW CURSOR 3160 END  IF NRG>NRGLIM THEN NRG=NRGLIM 3140 GOTO 870 3150 PRINT CURPOS$;CHR$(53);CHR$(32);CURSLOW$: RE10 REM C H A S E 8 5 X Version 4.3 September 13, 1985 20 REM BY HERMAN DEMONSTOY IN FEBRUARY 1977 KILOBAUD MAGAZINE 30 REM BY TOM SARBECK: A LARGER SCREEN, ON-SCREEN AUTOMATIC ACTION, 40 REM CURSOR ACTIVITY AND PROGRAM PARAMETERIZATION 50 DEFINT A-Z: REM INTEGER VARIABLES FOR INCREASED SPEED 60 REM ----------------------------------------------> CURSOR CONTROLS 70 CURPOS$=CHR$(27)+"=": REM BYTES 1,2 OF CURSOR POSITIONING: ESC = Y X 80 CURFAST$=CHR$(27)+CHR$(34)+"1": CURSLOW$=CHR$(27)+CHR$(34)+"0" 90 CURNONE$=CHR$(27)+CHR$(34)+"6": REM CURSOR FREQUENCY AND PRESENCE 100 REM ----------------------------------------------> PARAMETERS 110 HIGH=20: WIDE=79: DIM ARENA(HIGH,WIDE) 120 REM ARENA(Y,X) = 0 - EMPTY SPACE 130 REM ARENA(Y,X) = 1 - CHARGED FENCE OR POST (X) 140 REM ARENA(Y,X) = 2 - ROBOT GUARDS (+) 150 REM ARENA(Y,X) = 3 - YOU (O) 160 VH=81: DIM VERT(VH), HORIZ(VH) 170 REM VERT/HORIZ(1 TO NRG) - GUARD Y/X POSITIONS 180 REM VERT/HORIZ(NRG+1 TO VH-1) - FENCE POST Y/X POSITIONS 190 REM VERT/HORIZ(VH) - YOUR Y/X POSITION 200 NRG=20: NRGLIM=25: NPLYRS=1: NFP=VH-NRG-NPLYRS 210 REM NRG - NUMBER OF ROBOT GUARDS 220 REM NRGLIM - INITIAL LIMIT ON NRG 230 REM NPLYRS - NUMBER OF PLAYERS (TINKER AT YOUR OWN RISK) 240 REM NFP - NUMBER OF FENCE POSTS 250 DIM BETS$(4): BETS$(1)="Place your bets. ": BETS$(2)="Your bets down? " 260 BETS$(3)="Are you betting? ": BETS$(4)="$$$$$$$$$$$$$$$$$" 270 DIM CTR$(4),DEMISE$(2): REM - JUMP AND LOST GAME COMMENTS 280 CTR$(1)="5: Has no effect ": CTR$(2)="5: Halves the speed" 290 CTR$(3)="5: random jump ": CTR$(4)="5: random jumps" 300 DEMISE$(1)="you klutz!": DEMISE$(2)="I gotcha!!" 310 DIM RNDCHK!(100): REM ----------------------------> PREVENT RND LOOPS 320 NRG=20: NRGLIM=25: TSCORE!=O: DMS=3: REM ---------> RE-START HERE 330 REM PRINT CURSLOW$;: REM -----------------------------> SLOW CURSOR 340 WON=0: LOST=0: STRAIGHT=0: WONTOP=0: JUMPS=1: TMOVES=0 350 FOR D=1 TO 50: RNDCHK!(D)=99999!: NEXT D: RNDCNT=0: REM RND FIX 360 REM ----------------------------------------------> THE INSTRUCTIONS 370 PRINT CHR$(26): PRINT CURPOS$;CHR$(32);CHR$(32); 380 PRINT"Twenty robot guards (+) are pursuing you (0). If you can maneuver"; 390 PRINT" them into" 400 PRINT"the charged fence posts (X) or into each other, and if you can"; 410 PRINT" avoid the posts" 420 PRINT"and the charged fence (X), you can get away. You can also score"; 430 PRINT" some points." 440 PRINT"To see how I compute your score, enter a 0 game speed." 450 PRINT 460 PRINT" 7 8 9" 470 PRINT"From 5, your moves are: 4 5 6 5 See notes on screen." 480 PRINT" 1 2 3 0 Stop in place." 490 PRINT 500 PRINT"Enter a game speed and a starting number. When the board appears,"; 510 PRINT" plan your" 520 PRINT"first move and enter it. Each move you select repeats until you"; 530 PRINT" change it." 540 PRINT"With a win the game speed increases; with a loss it decreases. "; 550 PRINT"The jumps you" 560 PRINT"don't use add up for later games. Win five games in a row and"; 570 PRINT" things begin" 580 PRINT"to happen. For bettors, but for your end of game position, your"; 590 PRINT" starting" 600 PRINT"number determines all board setups in a series. Good luck and"; 610 PRINT" good moves." 620 PRINT 630 INPUT"Enter a game speed (1 = slow; 50 = fast. Try for 55?) ",SPEED 640 IF SPEED> 0 GOTO 780 650 PRINT CURPOS$;CHR$(41);CHR$(32); 660 PRINT"For each guard you destroy you get 10 points--unless that guard"; 670 PRINT" destroys you." 680 PRINT"If you destroy all of the guards, I add to this total a number"; 690 PRINT" proportional " 700 PRINT"to the game speed. In the first game in a series, this result"; 710 PRINT" is your score." 720 PRINT"In subsequent games, I add to your score the number of moves you"; 730 PRINT" take less " 740 PRINT"than your average and subtract from your score one half the"; 750 PRINT" number of moves " 760 PRINT"you take more than your average. One more time, g" 770 PRINT:PRINT: SPEED=1 780 IF SPEED<51 GOTO 800 ELSE SPEED=50 790 PRINT:PRINT CHR$(7);"Whoa! Win at 50 first." 800 DELAY=55-SPEED: SPEED!=SPEED 810 PRINT:INPUT"Enter a starting number (0 to 32767) ",SEED! 820 SEED!=ABS(SEED!): IF SEED!>32767! THEN SEED!=32767! 830 SEED!=-((LOG(SEED!+2!)-.5)/10!) 840 RNDCNT=RNDCNT+1: RNDCHK!(RNDCNT)=SEED! 850 REM PRINT CURNONE$;: REM -----------------------------> NO CURSOR 860 REM ----------------------------------------------> THE GAME LOOP 870 FACTOR!=1!+(55-DELAY)/100!: SEED!=-RND(SEED!) 880 RNDCNT=RNDCNT+1: IF RNDCNT<101 GOTO 900: REM ----> RND LOOP? 890 FOR D=1 TO 50: RNDCHK!(D)=RNDCHK!(D+50): NEXT D: RNDCNT=51 900 RNDCHK!(RNDCNT)=SEED! 910 FOR D=1 TO RNDCNT-1: IF SEED!<>RNDCHK!(D) GOTO 930 920 SEED!=SEED!-.001001: SEED!=-RND(SEED!): REM YES 930 NEXT D 940 PRINT CURPOS$;CHR$(54);CHR$(83);" " 950 PRINT CURPOS$;CHR$(54);CHR$(54);"Press . to quit or , to re-start. "; 960 NRGL=NRG: NMOVES=0: JUMPS=JUMPS+1: FIVER=3: BETS=INT(4*RND+1) 970 GSCORE!=0!: IF DELAY<54 THEN CTRX$=CTR$(2) ELSE CTRX$=CTR$(1) 980 IF JUMPS< 2 THEN FIVER=2 990 FOR XPOS=1 TO WIDE: ARENA( 1,XPOS)=1: NEXT XPOS 1000 FOR XPOS=1 TO WIDE: ARENA(HIGH,XPOS)=1: NEXT XPOS 1010 FOR YPOS=1 TO HIGH: ARENA(YPOS, 1)=1: NEXT YPOS 1020 FOR YPOS=1 TO HIGH: ARENA(YPOS,WIDE)=1: NEXT YPOS 1030 FOR YPOS=2 TO HIGH-1 1040 FOR XPOS=2 TO WIDE-1: ARENA(YPOS,XPOS)=0: NEXT XPOS 1050 KEY$=INKEY$: IF LEN(KEY$)=0 GOTO 1070 1060 IF KEY$="," GOTO 320 ELSE IF KEY$="." GOTO 3150 1070 PRINT MID$(BETS$(BETS),YPOS-1,1);: REM ---------> SCREEN ACTIVITY 1080 NEXT YPOS 1090 IF WON+LOST=0 GOTO 1110: REM ---------------------> IF FIRST GAME 1100 IF DMS=0 THEN ARENA(VERT(VH),HORIZ(VH))=3: REM ---> AFTER A WIN 1110 FOR D=1 TO VH: REM -------------------------------> Y-X POSITIONS 1120 YPOS=INT(RND*(HIGH-2))+2: XPOS=INT(RND*(WIDE-2))+2 1130 IF ARENA(YPOS,XPOS)<>0 GOTO 1120: REM ----------> IF TAKEN 1140 IF D=20 OR D=40 OR D=60 THEN PRINT"$";: REM ----> SCREEN ACTIVITY 1150 IF D RG 1160 IF D POST 1170 IF DMS=0 GOTO 1200: REM ------------------------> AFTER A WIN 1180 ARENA(YPOS,XPOS)=3 1190 VERT(D)=YPOS: HORIZ(D)=XPOS 1200 KEY$=INKEY$: IF LEN(KEY$)=0 GOTO 1220 1210 IF KEY$="," GOTO 320 ELSE IF KEY$="." GOTO 3150 1220 NEXT D: PRINT 1230 REM ----------------------------------------------> DISPLAY ARENA 1240 FOR D=32 TO 109: PRINT CURPOS$;CHR$(32);CHR$(D);" ";: NEXT D:PRINT" " 1250 PRINT CURPOS$;CHR$(32);CHR$(32);"You've won";WON;"and lost";LOST 1260 PRINT CURPOS$;CHR$(32);CHR$(63);"This game's speed:";55-DELAY 1270 PRINT CURPOS$;CHR$(32);CHR$(92);CTR$(FIVER+1) 1280 PRINT CURPOS$;CHR$(32);CHR$(95);JUMPS 1290 FOR YPOS=1 TO HIGH 1300 FOR XPOS=1 TO WIDE 1310 IF ARENA(YPOS,XPOS)=0 THEN PRINT" ";: GOTO 1350 1320 IF ARENA(YPOS,XPOS)=1 THEN PRINT"X";: GOTO 1350 1330 IF ARENA(YPOS,XPOS)=2 THEN PRINT"+";: GOTO 1350 1340 IF ARENA(YPOS,XPOS)=3 THEN PRINT"O"; 1350 NEXT XPOS 1360 PRINT 1370 KEY$=INKEY$: IF LEN(KEY$)=0 GOTO 1390 1380 IF KEY$="," GOTO 320 ELSE IF KEY$="." GOTO 3150 1390 NEXT YPOS 1400 PRINT CURPOS$;CHR$(53);CHR$(32);"In moves " 1410 PRINT CURPOS$;CHR$(53);CHR$(56);" Game score:" 1420 PRINT CURPOS$;CHR$(53);CHR$(76);"Total score:" 1430 PRINT CURPOS$;CHR$(53);CHR$(94);" " 1440 REM ----------------------------------------------> FAST CURSOR ON O 1450 PRINT CURPOS$;CHR$(VERT(VH)+32);CHR$(HORIZ(VH)+31);: REM CURFAST$; 1460 FOR DLY=1 TO 100: TIME=1.5^1.5: NEXT DLY: REM ----> PAUSE 1470 KEY$=INKEY$: IF LEN(KEY$)=0 GOTO 1490: REM -------> CHECK CONSOLE 1480 IF KEY$="," GOTO 320 ELSE IF KEY$="." GOTO 3150 1490 PRINT CURPOS$;CHR$(54);CHR$(32);" " 1500 PRINT CURPOS$;CHR$(54);CHR$(54);: REM ------------> GET FIRST MOVE 1510 PRINT"Press ONLY a # key. Do not or ENTER. Your move: " 1520 PRINT CURPOS$;CHR$(54);CHR$(109);: REM CURSLOW$;: REM --> SLOW CURSOR 1530 KEY$=INKEY$: REM ---------------------------------> GET FIRST MOVE 1540 IF LEN(KEY$)=0 GOTO 1530 1550 IF KEY$<"0" OR KEY$>"9" GOTO 1530 1560 REM PRINT CURNONE$: REM ------------------------------> NO CURSOR 1570 PRINT CURPOS$;CHR$(54);CHR$(109);KEY$ 1580 PRINT CURPOS$;CHR$(54);CHR$(97);" " 1590 KEY=ASC(KEY$)-48: KEYL=KEY: GOTO 1620 1600 REM ----------------------------------------------> THE PLAY LOOP 1610 FOR DLY=1 TO DELAY: TIME=1.5^1.5: NEXT DLY: REM --> THE PLAY PAUSE 1620 OLDY=VERT(VH): YPOS=OLDY: OLDX=HORIZ(VH): XPOS=OLDX 1630 ARENA(OLDY,OLDX)=0 1640 PRINT CURPOS$;CHR$(54);CHR$(98);"You keyed:" 1650 KEY$=INKEY$: REM ---------------------------------> GET A MOVE 1660 IF LEN(KEY$)=0 THEN KEY=KEYL: GOTO 1700 1670 IF KEY$<"0" OR KEY$>"9" GOTO 1650 1680 KEY=ASC(KEY$)-48 1690 PRINT CURPOS$;CHR$(54);CHR$(108);KEY 1700 IF KEY=0 GOTO 1970 1710 ON KEY GOTO 1730,1730,1730,1740,1770,1740,1720,1720,1720 1720 YPOS=YPOS-1: GOTO 1740: REM MOVE UP 1730 YPOS=YPOS+1: REM MOVE DOWN 1740 ON KEY GOTO 1750,1960,1760,1750,1770,1760,1750,1960,1760 1750 XPOS=XPOS-1: GOTO 1960: REM MOVE LEFT 1760 XPOS=XPOS+1: GOTO 1960: REM MOVE RIGHT 1770 JUMPS=JUMPS-1: REM A 5 MOVE 1780 IF JUMPS<-1 THEN KEY=KEYL: GOTO 1690 1790 IF JUMPS< 0 THEN KEY=KEYL: DELAY=DELAY+(55-DELAY)/2: ELSE GOTO 1830 1800 IF DELAY>54 THEN DELAY=54 1810 PRINT CURPOS$;CHR$(32);CHR$(92);CTR$(1); 1820 PRINT CURPOS$;CHR$(32);CHR$(81);55-DELAY;: GOTO 1690 1830 IF JUMPS< 1 THEN PRINT CURPOS$;CHR$(32);CHR$(92);CTRX$: GOTO 1860 1840 PRINT CURPOS$;CHR$(32);CHR$(95);JUMPS 1850 IF JUMPS< 2 THEN PRINT CURPOS$;CHR$(32);CHR$(110);" " 1860 KEYL=0: YLO=3: YHI=HIGH-2: XLO=3: XHI=WIDE-2 1870 YPOS=INT(RND*HIGH-2)+2: XPOS=INT(RND*WIDE-2)+2 1880 IF YPOSYHI GOTO 1870 1890 IF XPOSXHI GOTO 1870 1900 IF ARENA(YPOS,XPOS)<>0 GOTO 1870 1910 NEWY=YPOS-2: NEWX=XPOS-2: REM --------------------> LOOK AROUND 1920 FOR D=NEWY TO NEWY+4: FOR E=NEWX TO NEWX+4 1930 IF ARENA(D,E)=2 GOTO 1870: REM -------------------> NOT NEXT TO AN RG 1940 NEXT E: NEXT D 1950 REM ----------------------------------------------> MOVE RESULTS 1960 PRINT CURPOS$;CHR$(OLDY+32);CHR$(OLDX+31);" " 1970 NMOVES=NMOVES+1 1980 IF NMOVES>1 THEN PRINT CURPOS$;CHR$(53);CHR$(34);NMOVES 1990 IF ARENA(YPOS,XPOS)=1 THEN DMS=1: GOTO 2380: REM FENCE OR POST 2000 IF ARENA(YPOS,XPOS)=2 THEN DMS=1: GOTO 2380: REM ROBOT GUARD 2010 ARENA(YPOS,XPOS)=3: REM EMPTY - MOVE INTO THE SPACE 2020 VERT(VH)=YPOS: HORIZ(VH)=XPOS 2030 PRINT CURPOS$;CHR$(OLDY+32);CHR$(OLDX+31);" " 2040 PRINT CURPOS$;CHR$(YPOS+32);CHR$(XPOS+31);"O" 2050 IF KEY <> 5 THEN KEYL=KEY: GOTO 2090 2060 PRINT CURPOS$;CHR$(YPOS+32);CHR$(XPOS+31);: REM CURFAST$;: REM> CURSOR 2070 FOR DLY=1 TO 100: TIME=1.5^1.5: NEXT DLY: REM PAUSE AFTER JUMP 2080 REM PRINT CURNONE$: REM ------------------------------> CORSOR OFF 2090 IF DELAY > 36 THEN PRINT CURPOS$;CHR$(54);CHR$(98);"Your move:" 2100 FOR D=1 TO NRG: REM ------------------------------> MOVE THE GUARDS 2110 IF VERT(D)=0 GOTO 2330 2120 OLDY=VERT(D): NEWY=OLDY: OLDX=HORIZ(D): NEWX=OLDX 2130 ARENA(OLDY,OLDX)=0: PRINT CURPOS$;CHR$(OLDY+32);CHR$(OLDX+31);" " 2140 IF OLDY < YPOS THEN NEWY=NEWY+1: GOTO 2160: REM -------> DOWN 2150 IF OLDY > YPOS THEN NEWY=NEWY-1: REM ------------------> UP 2160 IF OLDX < XPOS THEN NEWX=NEWX+1: GOTO 2180: REM -------> RIGHT 2170 IF OLDX > XPOS THEN NEWX=NEWX-1: Z=RND: REM -----------> LEFT 2180 IF ARENA(NEWY,NEWX) > 0 GOTO 2210 2190 PRINT CURPOS$;CHR$(NEWY+32);CHR$(NEWX+31);"+": REM ----> EMPTY 2200 VERT(D)=NEWY: HORIZ(D)=NEWX: ARENA(NEWY,NEWX)=2: GOTO 2330 2210 IF ARENA(NEWY,NEWX) > 1 GOTO 2240 2220 PRINT CURPOS$;CHR$(NEWY+32);CHR$(NEWX+31);" ": REM ----> FENCE/POST 2230 VERT(D)=0: ARENA(NEWY,NEWX)=0: NRGL=NRGL-1: GOTO 2320 2240 IF ARENA(NEWY,NEWX) > 2 THEN DMS=2: GOTO 2380: REM ----> GOT ME 2250 PRINT CURPOS$;CHR$(NEWY+32);CHR$(NEWX+31);" ": REM ----> ANOTHER RG 2260 VERT(D)=0: ARENA(NEWY,NEWX)=0: NRGL=NRGL-2 2270 FOR E=1 TO NRG: IF E=D GOTO 2310: REM -----------------> WHICH OTHER? 2280 IF VERT(E) <> NEWY GOTO 2310 2290 IF HORIZ(E) <> NEWX GOTO 2310 2300 VERT(E)=0: REM --------------------------------------> KILL IT TOO 2310 NEXT E 2320 IF NRGL<1 GOTO 2520 2330 NEXT D: REM ---------------------------------------------> ALL DONE 2340 XSCORE!=TSCORE!+GSCORE! 2350 PRINT CURPOS$;CHR$(53);CHR$(88);INT(XSCORE!) 2360 GOTO 1610: REM -----------------------------------> NEXT MOVE 2370 REM ----------------------------------------------> GAME OVER - LOSS 2380 PRINT CURPOS$;CHR$(YPOS+32);CHR$(XPOS+31);"-" 2390 LOST=LOST+1: STRAIGHT=0: GSCORE!=10*(NRG-NRGL) 2400 TSCORE!=TSCORE!+GSCORE!: ASCORE!=TSCORE!/(WON+LOST) 2410 PRINT CURPOS$;CHR$(53);CHR$(46);DEMISE$(DMS) 2420 PRINT CURPOS$;CHR$(53);CHR$(69);GSCORE! 2430 PRINT CURPOS$;CHR$(53);CHR$(88);TSCORE! 2440 PRINT CURPOS$;CHR$(53);CHR$(94);" "; 2450 PRINT USING "####.##";ASCORE!;:PRINT" per game" 2460 IF DELAY>10 THEN DELAY=DELAY+INT(DELAY/5) ELSE DELAY=DELAY+2 2470 WONTOP=0: IF DELAY>54 THEN DELAY=54 2480 PRINT CURPOS$;CHR$(32);CHR$(32);"You've won";WON;"and lost";LOST 2490 PRINT CURPOS$;CHR$(32);CHR$(63);"Next game's speed:";55-DELAY 2500 JUMPS=JUMPS-1: GOTO 3110 2510 REM ----------------------------------------------> GAME OVER - WIN 2520 WON=WON+1: STRAIGHT=STRAIGHT+1: PRINT CHR$(7) 2530 GSCORE!=INT(10*NRG*FACTOR!+.5): IF WON>1 GOTO 2550 2540 TMOVES=NMOVES: AMOVES!=TMOVES: GOTO 2570: REM ----> FIRST WIN 2550 NET=INT(AMOVES!)-NMOVES: IF NET<0 THEN NET=NET/2 2560 GSCORE!=GSCORE!+NET: TMOVES=TMOVES+NMOVES: AMOVES!=TMOVES/WON 2570 TSCORE!=TSCORE!+GSCORE!: ASCORE!=TSCORE!/(WON+LOST) 2580 PRINT CURPOS$;CHR$(53);CHR$(46);"YOU WIN!!": DMS=0 2590 PRINT CURPOS$;CHR$(53);CHR$(69);GSCORE! 2600 PRINT CURPOS$;CHR$(53);CHR$(88);TSCORE! 2610 PRINT CURPOS$;CHR$(53);CHR$(95); 2620 PRINT USING "####.##";ASCORE!;:PRINT" per game" 2630 DLY=INT(3*DELAY/5): PRINT CURPOS$;CHR$(54);CHR$(34); 2640 PRINT USING "###.##";AMOVES!;: PRINT" moves/win" 2650 PRINT CURPOS$;CHR$(32);CHR$(32);"You've won";WON;"and lost";LOST 2660 PRINT CURPOS$;CHR$(32);CHR$(63);"Next game's speed:";55-DLY 2670 PRINT CURPOS$;CHR$(32);CHR$(92);" And add 1 jump " 2680 IF DELAY>0 AND STRAIGHT<5 GOTO 3090 2690 FOR DLY=1 TO 10: TIME=1.5^1.5: NEXT DLY 2700 FOR DLY=1 TO 3 2710 PRINT CHR$(7);: FOR D=1 TO 20: TIME=1.5^1.5: NEXT D 2720 NEXT DLY 2730 FOR DLY=1 TO 100: TIME=1.5^1.5: NEXT DLY 2740 FOR D=33 TO 52 2750 PRINT CURPOS$;CHR$(D);CHR$(32);" " 2760 PRINT CURPOS$;CHR$(D);CHR$(58);" " 2770 PRINT CURPOS$;CHR$(D);CHR$(85);" " 2780 IF D-1=YPOS+32 THEN PRINT CURPOS$;CHR$(YPOS+32);CHR$(XPOS+31);"O" 2790 NEXT D 2800 IF DELAY<1 GOTO 2900 2810 PRINT CURPOS$;CHR$(36);CHR$(32); 2820 PRINT TAB(20) "Y O U ' V E W O N ";STRAIGHT;" S T R A I G H T !" 2830 PRINT:PRINT: IF RND<.5 THEN GOTO 2870 2840 PRINT:PRINT TAB(19) "A N D Y O U W I N T H E T O S S" 2850 PRINT TAB(22) "F O R A N E X T R A J U M P":JUMPS=JUMPS+1 2860 PRINT CURPOS$;CHR$(32);CHR$(103);"2 jumps"; 2870 PRINT CURPOS$;CHR$(46);CHR$(32) 2880 PRINT TAB(28) "T R Y F O R ";STRAIGHT+1;"? ?" 2890 GOTO 3090 2900 WONTOP=WONTOP+1: PRINT CURPOS$;CHR$(36);CHR$(32); 2910 PRINT TAB(3) "Y O U ' V E W O N ";WONTOP; 2920 PRINT TAB(32) "S T R A I G H T A T T O P S P E E D !" 2930 PRINT: IF WONTOP<>2 GOTO 2960 2940 PRINT:PRINT TAB(11) "S T A R T C O U N T I N G "; 2950 PRINT TAB(43) "T H O S E B U G G E R S": GOTO 3030 2960 PRINT: IF WONTOP<>5 GOTO 2980 2970 PRINT TAB(20) "Y O U ' R E D O I N G W E L L ! ! !": GOTO 3030 2980 IF WONTOP<>10 GOTO 3000 2990 PRINT TAB(25) "C O U N T ' E M A G A I N":NRGLIM=30: GOTO 3030 3000 IF WONTOP<15 GOTO 3030 3010 IF NRG.5 GOTO 3070 3040 PRINT:PRINT TAB(19) "A N D Y O U W I N T H E T O S S" 3050 PRINT TAB(22) "F O R A N E X T R A J U M P":JUMPS=JUMPS+1 3060 PRINT CURPOS$;CHR$(32);CHR$(103);"2 jumps"; 3070 PRINT CURPOS$;CHR$(47);CHR$(32) 3080 PRINT TAB(28) "T R Y F O R ";WONTOP+1;"? ?" 3090 PRINT CURPOS$;CHR$(YPOS+32);CHR$(XPOS+31);"O" 3100 DELAY=INT(3*DELAY/5) 3110 IF JUMPS<0 THEN JUMPS=0 3120 IF DELAY=0 THEN NRG=NRG+1 3130 IF NRG>NRGLIM THEN NRG=NRGLIM 3140 GOTO 870 3150 PRINT CURPOS$;CHR$(53);CHR$(32);: REM CURSLOW$: REM ----> SLOW CURSOR 3160 END G>NRGLIM THEN NRG=NRGLIM 3140 GOTO 870 3150 PRINT CURPOS$;CHR$(53);CHR$(32);: REM CURSLOW$: REM ----> SLOW CURSOR 3160 E0SET THESE: DIMVIDEO)REGVIDEO(    / > 2w ")s'1'͐͜.:l v*} } Ñ* |ʑ:u ‹+|_ͤ {'*)!] ~[ʭ#ó> w#!:G~[##:m !y 4:s !y 5Nog>A*B.C2F6GZN:P>RBSFUJWNXRZV2j 2k 2l 2m 2o 2p 2q 2r 2s 2t 2u 2v Í0 ҍOÂ0 oy҂OÄ2 >2n :\ʠ=_:] ¶>?!]w^ :s ! 6?:n  2   !]>?!\w] :w \ * ##)+" : <o&" * #" \ƀo&" ~* *Rg P ÔRu!")* +" K ͦ:l * DM6 * q#p*{ "{  [ * #* ~* #" )!+[ s#r* " 6:x <2x +  >' ': x! w * ~ /=6: 6~6*} #"} ͎ P  ~#ed  [>*_R p l_R P P ͎ P : Œ͎ â~͡ ~͛ ## ":s ʹ !  ~?W >#¾ :j :v   :q :t  :k :r / 2 i`  !: N H#B W Y#P! 6!" * " : =2  j > :m v > :s } > ! 5 [} Ky ͪ }S !" !" 2  : [ * #*} Ru[ * " ! 4:y -* #" [ R  )+^#VS ! ~2 d *  ~_R #:m  * ^#VK >͹ * k~r##~{ _R :s  * n&>͹ : p   A[ a{ >?* #[ 0 +" *} >͹  *} +}U 2  [{ K >͹  [ K >͹  Ü }ʮ d  p * >͹  * +} 2 >y2  :w 8 _ >͹  :  ? o&>͹ a_R :R : 0 !  ~_R #:p _.*[* #]T~ +}ʈ | N#p K . g ¤ -’ >>!>)jBҾ =¯ !>)) = : G=R ! w _R   R  R :p !z 568  ʔP :p J :o J  _ | 4 Å 4  :p |  Å | ( Å :p 2p :p 2p ~#͛ ͡ P ͪ 0: _R 2 2<2 : !  R ! 4 ! 6:=! * & ^R ! 4 ɯ3 % 03} Z; { )1 # Hit any key to continue Name Ext Bytes U# | Files, occupying k of k total capacity -- Disk is Read Only -- directory entries and k bytes remain on Us Fn Ft Ex S1 S2 RC Group #'s Z80 cpu only. $ CP/M v2.x or greater only. $ Sorry, dir too big. $^4Õ MDSETCOM.COM is a PUBLIC DOMAIN program for the Morrow Micro-Decision with the revision 2 board. Parameters expected are: the port number (1 or 2), the baud rate (20 to 50000), the parity (Even, Odd, or None), the number of data bits (5 to 8) and the number of stop bits (1, 1.5, or 2). In real life, that means that MDSETCOM 1 19200 N 8 1 will set serial port number 1 (the terminal port) to 19.2 Kbaud with no parity, 8 data bits, and 1 stop bit. Use MDSETCOM 2 450 N 8 1 to "push" a 300 baud modem to 450 baud, or goose it to the limit for print buffers or other hard-wired applications. The trap door falls thru to a menu, so have fun.1!~ʓG͂1ڎ3Ҏ2e͂!08:0T])))_Î!!%R>!8<2R#0+)Zj)R8#"">2iT]#RMD>2[͂ON( O( EŽy2g͂5899052h͂2(1 ##~. #~5  y2fÆ#(~ (82 !e>02#^!#~_!#>02#~_! A8[8  A :e2eÛ= :f<82fÛ= :g<82gÛ= :h< 8>2hÛ= :i<82iÛ= :i!j_~#fo">8=2!e~2~>2#~(= >>@>_#~(=>(>0_#~(=(=(> >>2>YQyO>@y>y>7y:e02S:i__!U:g!G(#= ~2[:h02]:f__!_ JNOE SETCOM 2 1200 N 8 2 $ pAhE?4 whNONEODD EVEN1 1.52 $SETCOM: SET SERIAL COMMUNICATIONS PORTS (MORROW REV. 2) FOR COMMAND LINE ENTRY OF PARAMETERS, USE THE FOLLOWING COMMAND FORMAT: SETCOM [PORT] [BAUD] [PARITY] [DATA BITS] [STOP BITS] (EXAMPLE: SETCOM 2 19200 N 8 1.5 ) A--> SERIAL PORT NUMBER: 2 B--> TRANSMIT STOP BITS: 2 C--> XMTR - RCVR PARITY: NONE D--> DATA BITS PER CHAR: 8 E--> BAUD RATE: 1200 F--> FINISH (INSTALL ALL PARAMETERS AS SHOWN ON THE SCREEN) POKE SOME KEYS (A'S TO E'S), THEN JUST 'F' OFF (OR ESCape):  $50 75 110 135 150 300 450 600 1200 1800 2000 2400 4800 7200 9600 144001680019200 :20010000C395030D4D44534554434F4D2E434F4D2069732061205055424C494320444F4DB2 :2001200041494E2070726F6772616D20666F7220746865204D6F72726F770A0D4D696372BF :200140006F2D4465636973696F6E207769746820746865207265766973696F6E2032206235 :200160006F6172642E20506172616D65746572730A0D6578706563746564206172653A205C :2001800074686520706F7274206E756D626572202831206F722032292C207468652062612B :2001A000756420726174650A0D28323020746F203530303030292C2074686520706172695F :2001C000747920284576656E2C204F64642C206F72204E6F6E65292C207468650A0D6E756C :2001E0006D626572206F662064617461206269747320283520746F20382920616E642074F0 :200200006865206E756D626572206F662073746F700A0D626974732028312C20312E352C3F :20022000206F722032292E2020496E207265616C206C6966652C2074686174206D65616EDB :200240007320746861740A0D2020204D44534554434F4D2031203139323030204E20382034 :20026000310A0D77696C6C207365742073657269616C20706F7274206E756D626572203193 :200280002028746865207465726D696E616C20706F7274290A0D746F2031392E32204B629A :2002A0006175642077697468206E6F207061726974792C2038206461746120626974732C36 :2002C00020616E6420312073746F700A0D6269742E2020557365204D44534554434F4D2007 :2002E0003220343530204E2038203120746F202270757368222061203330302062617564E5 :200300000A0D6D6F64656D20746F2034353020626175642C206F7220676F6F7365206974D5 :2003200020746F20746865206C696D697420666F720A0D7072696E74206275666665727362 :20034000206F72206F7468657220686172642D7769726564206170706C69636174696F6E9F :20036000732E0A0D546865207472617020646F6F722066616C6C73207468727520746F20C1 :2003800061206D656E752C20736F20686176652066756E2E1A3100012180007EB7CA93041B :2003A00047CD8204FE31DA8E04FE33D28E04E603326506CD8204E5EB2100001AFE30381910 :2003C000FE3A3015E60FD5545D29292919195F160019D11310E5C38E04C5D5EB210000E531 :2003E000218025AFED523E0121841E018008380306043C32CB05AFED52E323E330F9E32B2D :2004000029E3ED5ACB11ED6A10ED29ED52E138012322D505228E063E12326906E1545DC1BE :20042000E3EB23ED52C54D44EB11FA08EDB03E13325B05C1E1CD8204E64F0E00FE4E280B01 :200440000CFE4F28060CFE45C28E0479326706CD8204FE353839FE393035E60F326806CD65 :200460008204FE320E022813FE312023237E0E00FE2E2007237EFE3520150C79326606C318 :200480008605230528087EFE2028F73801C9E1AF32800011A5060E09CD05002165063E30DB :2004A000B632A907235E1600E5219C0619191911C607010300EDB0E1237E07075F1600E5B1 :2004C0002190061911E507010400EDB0E1233E30B6320508237E07078E5F160021A00819B2 :2004E000111908010500EDB011A7060E09CD05000E01CD0500FE413808FE5B3810D6201871 :20050000F4FE1BCA00000E09119C0818DED641200B3A6506EE03326506C39B043D200F3AC5 :2005200066063CFE033801AF326606C39B043D200F3A67063CFE033801AF326706C39B04F1 :200540003D20103A68063CFE0938023E05326806C39B043D200F3A69063CFE123801AF3249 :200560006906C39B043D20993A6906F5216A06075F1600197E23666F22D505F1FE0F3E0240 :2005800038013D32CB052165067EF6F032D8057E0F0FF63E32D105237EB728063D20063EE5 :2005A000B0013E40013EC05F237EB728073D3E1028023E30B35F237ED605280E3D28063D98 :2005C00028063E0C013E04013E08F602B332E9053EBED3F31183060EF2ED59ED5179E6030C :2005E00007C6FB4F3E40ED793ECEED793E37ED793A6506F6303253063A69065F0707835F65 :20060000160021A00819115506010500EDB03A6706214706B72804233D20FC7E325B063A14 :200620006806F630325D063A66065F07835F1600219C0619115F06010300EDB00E09114A28 :2006400006CD0500C300004E4F450A0D534554434F4D2032203132303020204E20382032CE :2006600020200A0D240202000808C40983067004A1034103A1011601D000680045003F00C4 :2006800034001A0011000D008B007700680000004E4F4E454F4444204556454E312020318D :2006A0002E353220201A241E534554434F4D3A205345542053455249414C20434F4D4D5577 :2006C0004E49434154494F4E5320504F52545320284D4F52524F57205245562E2032290ACC :2006E0000D0A464F5220434F4D4D414E44204C494E4520454E545259204F462050415241EA :200700004D45544552532C205553452054484520464F4C4C4F57494E4720434F4D4D414E23 :200720004420464F524D41543A0A0D0A2020534554434F4D205B504F52545D205B424155B6 :20074000445D205B5041524954595D205B4441544120424954535D205B53544F5020424997 :2007600054535D0A0D0A2020284558414D504C453A2020534554434F4D203220313932305D :2007800030204E203820312E35202020290A0D0A412D2D3E2053455249414C20504F5254E7 :2007A000204E554D4245523A20320A0D0A422D2D3E205452414E534D49542053544F5020B1 :2007C000424954533A203220200A0D0A432D2D3E20584D5452202D20524356522050415207 :2007E0004954593A204E4F4E450A0D0A442D2D3E2044415441204249545320504552204386 :200800004841523A20380A0D0A452D2D3E204241554420524154453A2031323030200A0D91 :200820000A462D2D3E2046494E4953482028494E5354414C4C20414C4C20504152414D45C1 :20084000544552532041532053484F574E204F4E205448452053435245454E290A0D0A50BF :200860004F4B4520534F4D45204B455953202841275320544F20452753292C205448454EA0 :20088000204A55535420274627204F464620284F5220455343617065293A20200820082432 :2008A0003530202020373520202031313020203133352020313530202033303020203435EA :2008C000302020363030202031323030203138303020323030302032343030203438303072 :1F08E000203732303020393630302031343430303136383030313932303020202020206D :00000001FF 8303020323030302032343030203438303072 :1F08E0002037; MDSETCOM.COM VERSION 1.0 11/26/85 ; SET SERIAL COMMUNICATION PORT PARAMETERS FOR MICRO DECISION (rev. 2) ; USAGE: COMMAND LINE (OR MENU DRIVEN IF ERROR IN COMMAND LINE) ; SETCOM 2 1200 N 8 2 IS THE DEFAULT MENU DISPLAY ; PROGRAM END DISPLAYS COMMAND LINE EQUIVALENT OF SETTING USED. ; THIS PROGRAM REQUIRES M80, L80, AND LOAD.COM TO COMPILE & LOAD: .Z80 ;USE STANDARD ZILOG Z-80 MNEMONICS ASEG ;ABSOLUTE SEGMENT AT 100H ORG 100H ;LIKE ANY GOOD .COM FILE BEGIN: JP START ;SKIP OVER THIS FIRST BUNCH OF TEXT DB 0DH,'MDSETCOM.COM is a PUBLIC DOMAIN program for the Morrow' DB 0AH,0DH,'Micro-Decision with the revision 2 board. Parameters' DB 0AH,0DH,'expected are: the port number (1 or 2), the baud rate' DB 0AH,0DH,'(20 to 50000), the parity (Even, Odd, or None), the' DB 0AH,0DH,'number of data bits (5 to 8) and the number of stop' DB 0AH,0DH,'bits (1, 1.5, or 2). In real life, that means that' DB 0AH,0DH,' MDSETCOM 1 19200 N 8 1' DB 0AH,0DH,'will set serial port number 1 (the terminal port)' DB 0AH,0DH,'to 19.2 Kbaud with no parity, 8 data bits, and 1 stop' DB 0AH,0DH,'bit. Use MDSETCOM 2 450 N 8 1 to "push" a 300 baud' DB 0AH,0DH,'modem to 450 baud, or goose it to the limit for' DB 0AH,0DH,'print buffers or other hard-wired applications.' DB 0AH,0DH,'The trap door falls thru to a menu, so have fun.',1AH ; DEFINE A FEW LOW MEMORY AREAS: BOOT EQU 0 BDOS EQU 5 BUFFER EQU 80H ; DEFINE SOME HANDY ASCII CHARACTERS: BS EQU 8 LF EQU 0AH CR EQU 0DH ESC EQU 1BH ; THESE MORROW STANDARD CONTOL CODES ARE NEEDED FOR PRETTINESS: CLR EQU 1AH ; CLEAR SCREEN HOME EQU 1EH ; HOME CURSOR ; ONLY 2 BDOS FUNCTION CALLS ARE USED: CONIN EQU 1 ; CONSOLE INPUT PRTSTR EQU 9 ; PRINT STRING ($ TERMINATOR) START: LD SP,BEGIN ; SET UP YOUR OWN STACK SPACE LD HL,BUFFER ;CHECK FOR COMMAND LINE ENTRY LD A,(HL) ; GET CHARATER COUNT OR A ; NO COMMAND LINE ENTRY? JP Z,MENUDRV ; THEN USE THE MENU-DRIVEN PROGRAM LD B,A ;OTHERWISE, GET THE LINE LENGTH CALL SCAN ;RETURN NEXT NON-BLANK CHARACTER CP '1' ;PORT 1? JP C,BLANK ;IF LESS THAN 1, USE THE MENU CP '3' ;MORE THAN 2? JP NC,BLANK ;LIKEWISE UNACCEPTABLE AND 3 ;CONVERT 1 OR 2 TO BINARY LD (PARAMS),A ;AND SAVE IT IN THE PARAMETER AREA CALL SCAN ;SCAN FORWARD TO BAUD RATE PUSH HL ;SAVE POINTER TO BAUD RATE IN COMMAND LINE EX DE,HL ;COMMAND LINE POINTER IN DE LD HL,0 ;INITIALIZE FOR ASCII - BINARY CONVERSION NEXTNUM:LD A,(DE) ; GET DIGIT CP '0' ;IF IT'S LESS THAN ZERO, JR C,NONNUM ;CONVERSION IS FINISHED CP '9'+1 ; IF IT'S GREATER THAN 9 JR NC,NONNUM ; YOU ARE LIKEWISE FINISHED AND 0FH ;MASK 0-9 ASCII TO 0-9 BINARY PUSH DE ;SAVE POINTER TO TEXT LD D,H ;MOVE ACCUMULATED BINARY NUMBER LD E,L ;TO THE DE REGISTER PAIR ADD HL,HL ;SO THAT ADD HL,HL ;YOU CAN ADD HL,HL ;MULTIPLY ADD HL,DE ;IT BY 10 ADD HL,DE ;BEFORE LD E,A ;ADDING LD D,0 ;THE MOST ADD HL,DE ;RECENT DIGIT. POP DE ;RETRIEVE TEXT POINTER INC DE ;GET NEXT CHARACTER DJNZ NEXTNUM ;AND KEEP LOOPING JP BLANK ;(MENU TIME IF YOU RUN OUT OF TEXT) NONNUM: PUSH BC ;SAVE LENGTH PUSH DE ;SAVE POINTER EX DE,HL ;DE=BAUD RATE LD HL,0 ;ZERO DIVIDEND PUSH HL ;ON STACK LD HL,9600 ;CHECK FOR 9600 BAUD OR LESS XOR A ;ZERO FLAGS SBC HL,DE ;IF > 9600 BAUD, USE LD A,1 ;X1 MASK, AND LD HL,1E84H ;DIVIDE INTO 2 MHZ CLOCK RATE LD BC,0880H ;1E8480H=2000000 IN HLC, B=BITS TO SHIFT JR C,GT9600 ; IF NOT GREATER THAN 9600 BAUD, 4 BIT SHIFT: LD B,4 ;1E848H=2000000/16 FOR <=9600 BAUD INC A ;X16 MASK GT9600: LD (FACTOR),A ;SAVE THE X1 OR X16 FLAG XOR A ; ZERO EVERYTHING BEFORE DOING THE DIVISION: DIVIDE: SBC HL,DE ;SUBTRACT BAUD RATE FROM CLOCK EX (SP),HL ; SWAP QUOTIENT & DIVIDEND INC HL ; INCREASE QUOTIENT EX (SP),HL ; QUOTIENT ON STACK, DIVIDEND IN HL JR NC,DIVIDE ;IF DIVIDEND > DIVISOR, KEEP LOOPING EX (SP),HL ; OTHERWISE YOU WENT TOO FAR: DEC HL ; DECREASE QUOTIENT ADD HL,HL ; SHIFT QUOTIENT LEFT 1 BIT EX (SP),HL ; QUOTIENT ON STACK, DIVIDEND IN HL ADC HL,DE ; UN-DO THE EXCESS SUBTRACTION, THEN RL C ;SHIFT DIVIDEND LEFT ADC HL,HL ; 1 BIT, LOOP THRU HOWEVER MANY TIMES DJNZ DIVIDE ; THE BIT SHIFT INDICATES. ADD HL,HL ;DOUBLE THE REMAINDER, SEE IF THE BAUD RATE SBC HL,DE ; IS BIGGER (FOR ROUNDING UP) POP HL ;RETRIEVE THE QUOTIENT FROM THE STACK JR C,NOROUND ;IF THE REMAINDER IS MORE THAN HALF THE BAUD, INC HL ; ROUND UP THE QUOTIENT NOROUND:LD (CDIVIS),HL ; (HEREAFTER KNOWN AS THE BAUD RATE DIVISOR) LD (EXTRAD),HL ; SAVE IT TWICE LD A,18 ;INSTALL LD (PARAMS+4),A ;IN PARAMETER TABLE ;(INSTALL BAUD RATE INFO AS EXTRA TEXT & DIVISOR IN TABLES.) POP HL ; RETRIEVE POINTER TO TEXT IN BUFFER LD D,H ; IN BOTH HL LD E,L ; AND DE. POP BC ; GET LENGTH OF TEXT YET TO PROCESS EX (SP),HL ;SWAP CURRENT POINTER WITH OLD POINTER TO BAUD EX DE,HL ;SWAP OLD & NEW INC HL ;GOOSE IT UP SBC HL,DE ;HL = LENGTH OF BAUD RATE TEXT PUSH BC ;SAVE LENGTH AGAIN LD C,L ;MOVE LENGTH OF TEXT LD B,H ;INTO BC EX DE,HL ;HL > SOURCE OF TEXT IN COMMAND LINE LD DE,EXTRAB ;DE > DESTINATION IN BAUD RATE TABLE LDIR ;MOVE IT OVER LD A,19 ;ADD EXTRA BAUD RATE TO MENU LD (BAUDS),A ;BY GOOSING UP MAX COUNTER POP BC ;RETRIEVE TEXT LENGTH POP HL ; AND TEXT POINTER CALL SCAN ;LOOK PAST THE BAUD RATE AND 4FH ;FORCE CHARACTER TO UPPER CASE LD C,0 ; C = NO PARITY FLAG CP 'N' ; RIGHT? JR Z,SETP ; THEN SET THE PARITY INC C ; C = ODD PARITY FLAG CP 'O' ; RIGHT? JR Z,SETP ; SO DO IT INC C ; C = EVEN PARITY FLAG CP 'E' ; THAT'S WHAT "E" MEANS JP NZ,BLANK ; IF IT'S NOT O,E, OR N, IT'S WRONG. SETP: LD A,C ;SAVE THE PARITY FLAG LD (PARAMS+2),A ;IN THE PARAMETER AREA FOR LATER USE ;NOW PROCESS THE DATA BITS & STOP BITS: CALL SCAN ;NEXT CHARACTER CP '5' ;LESS THAN 5 DATA BITS JR C,ABORTD ;IS AN ABORTION CP '9' ;9 DATA BITS? JR NC,ABORTD ;DON'T BE SILLY. AND 0FH ;MAKE ASCII 5-8 TO BINARY 5-8 LD (PARAMS+3),A ; THEN INSERT IN THE APPROPRIATE PLACE CALL SCAN ;GET THE LAST INFORMATION CP '2' ;2 STOP BITS? LD C,2 ;C = 2 STOP BITS FLAG JR Z,SB2 ;THEN SKIP OUT WITH YOUR INFO CP '1' ; 1 OR 1.5 STOP BITS? JR NZ,ABORTD ;IF IT AIN'T, IT'S WRONG INC HL ; NEXT CHARACTER LD A,(HL) ; IN THE ACCUMULATOR, LD C,0 ;C = 1 STOP BIT FLAG CP '.' ;DECIMAL POINT (AS IN 1.5 STOP BITS)? JR NZ,SB2 ; IF NOT, IT MUST BE 1 STOP BIT INC HL ;NEXT CHARACTER LD A,(HL) ;TO CHECK: CP '5' ; IS IT REALLY 1.5 STOP BITS? JR NZ,ABORTD ;IF NOT, GO TO THE MENU STUFF INC C ;OTHERWISE, C=1 FOR 1.5 STOP BITS SB2: LD A,C ;SAVE THE STOP BIT FLAG LD (PARAMS+1),A ;IN THE PARAMETER AREA, THEN JP TIMES16+3 ;RUN THEM ALL THRU THE PROGRAM SCAN: INC HL ; POINT TO THE NEXT CHARACTER IN THE BUFFER DEC B ; AND DECREASE THE NUMBER OF CHARS TO LOOK AT JR Z,BLANK ;SKIP OUT IF NO MORE CHARS LD A,(HL) ;GET CHAR CP ' ' ;BLANK? JR Z,SCAN ;THEN KEEP LOOKING JR C,BLANK ;EXIT IF IT'S A CONTROL CHARACTER RET ; OTHERWISE RETURN WITH THE GOOD NEWS. BLANK: POP HL ;JERK OUT THE RETURN ADDRESS ABORTD: XOR A ;ZERO OUT THE BUFFER LD (BUFFER),A ;(FOR NO GOOD REASON AT ALL, I GUESS) ; - AND NOW, CONTINUE WITH THE MENU DRIVEN PORTION OF THE PROGRAM ; IF THE COMMAND LINE ENTRY IS INVALID, DO IT MENU DRIVEN: MENUDRV:LD DE,CLS ;THE FIRST-TIME THRU, CLEAR THE SCREEN LD C,PRTSTR ;BY PRINTING OUT THE CLEAR SCREEN FUNCTION CALL BDOS ;WITH THE BDOS CALL PRINT: LD HL,PARAMS ; POINT TO THE PARAMETERS LD A,'0' ; CONVERT BINARY TO ASCII OR (HL) ; 1 OR 2 LD (S1OR2),A ; AND INSTALL INTO THE MENU DISPLAY INC HL ;NEXT PARAMETER: STOP BITS LD E,(HL) ; 0,1,2 FOR 1,1.5,2 STOP BITS LD D,0 ; MEANS 3 BYTES MAX TO INSTALL IN THE MENU, PUSH HL ; SO SAVE POINTER TO PARAMETERS, LD HL,STOPTXT ;HL > TEXT OF STOP BIT VALUES ADD HL,DE ;SKIP OVER ADD HL,DE ;TO THE ADD HL,DE ;DESIRED TEXT, LD DE,STOPS ;THEN MOVE LD BC,3 ;3 BYTES LDIR ;FROM TEXT AREA TO THE MENU. POP HL ;RETRIEVE THE PARAMETER POINTER INC HL ;HL > PARITY PARAMETER LD A,(HL) ; GET 0,1,2 FOR NONE, ODD, EVEN RLCA ; MULTIPLY RLCA ; BY 4 (4 BYTES OF TEXT, RIGHT?) LD E,A ;MOVE OFFSET LD D,0 ;TO DE REGISTER, PUSH HL ;SAVE PARAM. POINTER LD HL,PARTXT ;HL > TEXT OF PARITY WORDS ADD HL,DE ;ADD OFFSET LD DE,PARITY ;NOW MOVE THE TEXT LD BC,4 ;(ALL 4 BYTES OF IT) LDIR ;INTO THE MENU POP HL ;RETRIEVE THE PARAMETER POINTER INC HL ;HL > DATA BITS LD A,'0' ;CREATE ASCII 5,6,7,8 OR (HL) ;FROM THE BINARY 5,6,7,8 LD (BITS),A ;AND PLUG INTO THE MENU TEXT INC HL ;HL > BAUD RATE PARAMETER LD A,(HL) ;(0-17 FOR 50-19200 BAUD) RLCA ; TIMES 2 RLCA ; TIMES 4 ADC A,(HL) ; TIMES 5 (5 BYTES OF TEXT) LD E,A ;DE NOW HOLD THE OFFSET LD D,0 ;TO THE DESIRED BAUD RATE TEXT LD HL,BAUDTXT ;IN THE BAUD RATE TEXT TABLE ADD HL,DE ; ADD IT, LD DE,BAUD ; POINT TO MENU, LD BC,5 ; COUNT THE BYTES, LDIR ; AND SQUIRT IT OUT. LD DE,MENU ;NOW POINT TO THE MENU, BYPASS: LD C,PRTSTR ;SET UP BDOS FUNCTION FOR DISPLAY CALL BDOS ;AND DISPLAY THE MENU INPUT: LD C,CONIN ;GET SOMETHING CALL BDOS ;IN FROM THE KEYBOARD: KEYCHK: CP 'A' ;BELOW "A"? JR C,BADKEY ;I WOULDN'T BELIEVE IT EITHER CP 'Z'+1 ;BETWEEN "A" AND "Z"? JR C,KEYOK ;JUMP OUT FOR FURTHER PROCESSING SUB 20H ;FOLD LOWER CASE INTO UPPER CASE JR KEYCHK ;AND RE-PROCESS TO CHECK RANGE BADKEY: CP ESC ;ESCAPE? JP Z,BOOT ;THEN ESCAPE! LD C,PRTSTR ;OTHERWISE BACKSPACE AND ERASE LD DE,BSERAS ;WHATEVER KEY WAS PRESSED JR BYPASS ;AND LOOP THRU AGAIN KEYOK: SUB 'A' ;NORMALIZE KEY A-F TO 0-5 JR NZ,SKIP1 ;BYPASS THE SET PORT ROUTINE IF B,C,D,E,F LD A,(PARAMS) ;OTHERWISE GET THE PORT NUMBER, XOR 3 ;TOGGLE BETWEEN 1 AND 2 LD (PARAMS),A ;SAVE THE NEW PORT NUMBER JP PRINT ;AND DISPLAY THE NEW MENU SKIP1: DEC A ;C,D,E,F? JR NZ,SKIP2 ;BYPASS THE STOP BIT ROUTINE LD A,(PARAMS+1) ;GET THE STOP BIT PARAMETER INC A ;GOOSE IT UP CP 3 ;0,1,2 ACCEPTED JR C,STOPOK ;OTHERWISE XOR A ;FOLD BACK TO 0, STOPOK: LD (PARAMS+1),A ;SAVE THE NEW PARAMETER, JP PRINT ;DISPLAY THE NEW MENU SKIP2: DEC A ;D,E,F? JR NZ,SKIP3 ;BYPASS THE PARITY SETTING LD A,(PARAMS+2) ;GET 0,1,2 INC A ;GOOSE IT UP 1 CP 3 ;0,1,2 FOR NONE, ODD, EVEN JR C,PTYOK ;IF OUT OF THIS RANGE, XOR A ;FOLD BACK TO 0 PTYOK: LD (PARAMS+2),A ;RE-INSTALL PARITY JP PRINT ;JUMP TO MENU DISPLAY SKIP3: DEC A ;E,F? JR NZ,SKIP4 ;SKIP OVER THE DATA BIT SETTING LD A,(PARAMS+3) ;GET THE DATA BITS INC A ;GOOSE UP THE COUNT CP 9 ;5,6,7,8 DATA BITS JR C,DATOK ;IF TOO MANY, LD A,5 ;FOLD BACK TO 5 DATOK: LD (PARAMS+3),A ;SAVE PARAMETER JP PRINT ;DISPLAY MENU SKIP4: DEC A ;F? JR NZ,SKIP5 ;SKIP OVER THE BAUD SETTING LD A,(PARAMS+4) ;GET BAUD RATE INC A ;GOOSE IT UP CP 18 ;0 THRU 17 ALLOWED BAUDS EQU $-1 ;(UNLESS #18 INSTALLED IN COMMAND LINE) JR C,BAUDOK ;IF NOT ACCEPTABLE, XOR A ;RESET TO THE FIRST BAUD RATE IN TABLE BAUDOK: LD (PARAMS+4),A ;SAVE THE BAUD RATE JP PRINT ;DISPLAY THE MENU SKIP5: DEC A ;BETTER BE DOWN TO ZERO BY NOW... JR NZ,BADKEY ;IF IT AIN'T THE EXIT, IT'S WRONG. ; NOW IS THE TIME TO PROCESS ALL THE PARAMETERS AND SET THE CHIPS: PROCESS:LD A,(PARAMS+4) ;GET THE BAUD RATE POINTER PUSH AF ;SAVE FOR LATER TWEAKING LD HL,DIVISOR ;HL > TABLE OF BAUD RATE DIVISORS RLCA ;BAUD RATE POINTER TIMES 2 LD E,A ;IN ORDER TO GENERATE THE OFFSET LD D,0 ;INTO THE TABLE OF BAUD RATE DIVISORS ADD HL,DE ;HL NOW POINTS TO THE DIVISOR LD A,(HL) ;GET THE DIVISOR INC HL ;(BOTH BYTES) LD H,(HL) ;INTO THE LD L,A ;HL REGISTER PAIR LD (CDIVIS),HL ;SAVE THE DIVISOR IN THE SELF-WRITING AREA POP AF ;RETRIEVE THE BAUD RATE NUMBER CP 15 ;<= 9600 BAUD ? LD A,2 ;THEN USE THE TIMES 16 SETTING JR C,TIMES16 ;IF > 9600 BAUD, DEC A ;SET THE TIMES 1 FLAG TIMES16:LD (FACTOR),A ;IN SELF-WRITING AREA OF PROGRAM LD HL,PARAMS ;FIRST PARAMETER LD A,(HL) ;IS PORT NUMBER (1 OR 2) OR 0F0H ;MAKE IT F1 OR F2 LD (CPORT),A ;RE-WRITE THE PROGRAM WITH THE RIGHT PORT. LD A,(HL) ;BACK TO 1 OR 2 AGAIN RRCA ;SHIFT THE BITS UNTIL THEY RRCA ;SWEEP AROUND TO BITS 6,7 OR 3EH ;ADD IN THE REST OF THE 8253 CONTROL BYTE LD (CSELECT),A ;AND WRITE IT INTO THE PROGRAM. INC HL ; NEXT, GET THE LD A,(HL) ; STOP BIT PARAMETER OR A ;0 MEANS 1 STOP BIT JR Z,STOP1 ;SO SKIP OVER IF SO DEC A ;1 COUNTS DOWN TO 0 JR NZ,STOP2 ;SO NON-ZERO MEANS SKIP OUT. LD A,0B0H ;MUST BE 1.5 STOP BITS DB 1 ;MASK OUT 1 STOP BIT: STOP1: LD A,040H ; 40H IS THE 1 STOP BIT MASK DB 1 ;MASK OUT 2 STOP BIT: STOP2: LD A,0C0H ; 0C0H IS THE 2 STOP BIT MASK LD E,A ;SAVE THE STOP BIT MASK INC HL ;HL > PARITY LD A,(HL) ;IS THE PARAMETER OR A ;ZERO? JR Z,PARITY0 ;THEN SKIP OUT TO SET IT THUS. DEC A ;1 DECREMENTS TO ZERO LD A,10H ;ODD PARITY MASK JR Z,PARITY0 ;SKIP TO INSTALL ODD PARITY LD A,30H ;EVEN PARITY MASK PARITY0:OR E ;SAVE THE PARITY MASK LD E,A ;COMBINED WITH THE STOP BIT MASK INC HL ;HL > DATA BITS LD A,(HL) ; GET IT. SUB 5 ;NORMALIZE 5,6,7,8 TO 0,1,2,3 JR Z,SETBIT ;5 DATA BITS -> ZERO MASK DEC A ;STEP THRU JR Z,BIT6 ;THE DEC A ;POSSIBILITIES JR Z,BIT7 ;ONE AT A TIME LD A,0CH ;LOAD THE 8 DATA BIT MASK. DB 1 ;MASK OUT THE 6 BIT MASK BIT6: LD A,4 ;(6 BIT MASK) DB 1 ;MASK OUT BIT 7 BIT7: LD A,8 ;(7 BIT MASK) SETBIT: OR 2 ;SET FOR 16X BAUD RATE FACTOR EQU $-1 ;SET TO X1 IF OVER 9600 BAUD OR E ;ABSORB THE STOP BIT AND PARITY MASK LD (CCONFIG),A ;AND GO TO THE SELF-MODIFYING CODE: ; LD A,0BEH ;SELECT CHANNEL 1 OR 2 CSELECT EQU $-1 OUT (0F3H),A ;ON THE CTC CHIP LD DE,0683H ;DE = BAUD RATE DIVISOR CDIVIS EQU $-2 LD C,0F2H ;C = PORT TO OUTPUT CPORT EQU $-1 OUT (C),E ;OUTPUT THE DIVISOR OUT (C),D ; (BOTH BYTES) LD A,C ;TAKE THE PORT, AND 3 ;0F1 OR 0F2 BECOMES 1 OR 2 AGAIN RLCA ;DOUBLE THAT TO 2 OR 4 ADD A,0FBH ;FD OR FF FOR PORT 1 OR PORT 2, RESPECTIVELY LD C,A ;C = PORT NUMBER LD A,40H ;RESET 8251 OUT (C),A ;RESET LD A,0CEH ;FLAGS FOR N,8,2 CCONFIG EQU $-1 OUT (C),A ;SET THE SERIAL PARAMETERS LD A,37H ;RESETS ERRORS, SET DSR, ETC. OUT (C),A ;DO IT TO IT, ; NOW PRINT OUT WHAT'S HAPPENED (IN COMMAND LINE FORMAT) LD A,(PARAMS) ;GET PORT OR '0' ;AS ASCII CHARACTER LD (WHAT1),A ;INTO OUTPUT LINE LD A,(PARAMS+4) ;GET LD E,A ;5 TIMES RLCA ;DOUBLED RLCA ;QUADRUPLED ADD A,E ;PLUS 1 LD E,A ;ADD LD D,0 ;OFFSET LD HL,BAUDTXT ;GET ADD HL,DE ;POINTER TO BAUD TEXT LD DE,WHAT2 ;BAUD LD BC,5 ;RATE LDIR ;ACROSS LD A,(PARAMS+2) ;MOVE LD HL,NOE ;N OR O OR E OR A ;ZERO? JR Z,GOTNOE ;EXIT LOOPING:INC HL ;WORK THRU DEC A ;THE JR NZ,LOOPING ;POSSIBILITIES GOTNOE: LD A,(HL) ;SAVE LD (WHAT3),A ;PARITY, LD A,(PARAMS+3) ;DATA OR '0' ;AS ASCII LD (WHAT4),A ;BITS LD A,(PARAMS+1) ;GET STOPS LD E,A ;TIMES RLCA ;3 ADD A,E ;FOR LD E,A ;THEN LD D,0 ;FETCHING LD HL,STOPTXT ;TEXT OF ADD HL,DE ;STOP BITS LD DE,WHAT5 ;STOP BITS LD BC,3 ;ALSO LDIR ;MOVED, LD C,PRTSTR ;DISPLAY LD DE,BYEBYE ;TEXT CALL BDOS ;BEFORE EXIT JP BOOT ;AND THAT'S THE END OF THE PROGRAM ; NOE: DB 'NOE' ; BYEBYE: DB LF,CR,'SETCOM ' WHAT1: DB '2 ' WHAT2: DB '1200 ' WHAT3: DB 'N ' WHAT4: DB '8 ' WHAT5: DB '2 ',LF,CR,'$' ; ; DEFAULT SETTINGS: PARAMS: DB 2 ;PORT NUMBER 2 DB 2 ;2 STOP BITS DB 0 ;NO PARITY DB 8 ;8 DATA BITS DB 8 ;1200 BAUD: SEE DIVISOR + 8 * 2 BYTES ; DIVISOR: ;ASSUMES X16 FOR 9600 BAUD & BELOW, X1 FOR ABOVE. DW 09C4H ;50 BAUD DW 0683H ;75 DW 0470H ;110 DW 03A1H ;135 DW 0341H ;150 DW 01A1H ;300 DW 0116H ;450 BAUD FOR "PUSHING" A 300 BAUD MODEM DW 00D0H ;600 DW 0068H ;1200 (THIS IS THE DEFAULT SETTING FOR PORT 2) DW 0045H ;1800 DW 003FH ;2000 DW 0034H ;2400 DW 001AH ;4800 DW 0011H ;7200 DW 000DH ;9600 DW 008BH ;14400 AT THE X1 SETTING DW 0077H ;16800 AT THE X1 SETTING DW 0068H ;19200 AT THE X1 SETTING EXTRAD: DW 0000H ;ALLOW ROOM FOR A COMMAND LINE DIVISOR ; PARTXT: DB 'NONE' DB 'ODD ' DB 'EVEN' ; STOPTXT:DB '1 ' DB '1.5' DB '2 ' ; CLS: DB CLR,'$' ;CLEAR THE SCREEN MENU: DB HOME ;HOME THE CURSOR DB 'SETCOM: SET SERIAL COMMUNICATIONS PORTS (MORROW REV. 2)' DB LF,CR,LF DB 'FOR COMMAND LINE ENTRY OF PARAMETERS, ' DB 'USE THE FOLLOWING COMMAND FORMAT:',LF,CR,LF DB ' SETCOM [PORT] [BAUD] [PARITY] [DATA BITS] [STOP BITS]' DB LF,CR,LF,' (EXAMPLE: SETCOM 2 19200 N 8 1.5 )',LF,CR,LF DB 'A--> SERIAL PORT NUMBER: ' S1OR2: DB '2',LF,CR,LF DB 'B--> TRANSMIT STOP BITS: ' STOPS: DB '2 ',LF,CR,LF DB 'C--> XMTR - RCVR PARITY: ' PARITY: DB 'NONE',LF,CR,LF DB 'D--> DATA BITS PER CHAR: ' BITS: DB '8',LF,CR,LF DB 'E--> BAUD RATE: ' BAUD: DB '1200 ',LF,CR,LF DB 'F--> FINISH (INSTALL ALL PARAMETERS AS SHOWN ON THE SCREEN)' DB LF,CR,LF DB "POKE SOME KEYS (A'S TO E'S), THEN JUST 'F' OFF" DB " (OR ESCape): " BSERAS: DB BS," ",BS,"$" ; BAUDTXT:DB '50 ' DB '75 ' DB '110 ' DB '135 ' DB '150 ' DB '300 ' DB '450 ' DB '600 ' DB '1200 ' DB '1800 ' DB '2000 ' DB '2400 ' DB '4800 ' DB '7200 ' DB '9600 ' DB '14400' DB '16800' DB '19200' EXTRAB: DB ' ' ;EXTRA BAUD RATE TEXT ; END END BEGIN MACRO-80 3.44 09-Dec-81 PAGE 1 ; MDSETCOM.COM VERSION 1.0 11/26/85 ; SET SERIAL COMMUNICATION PORT PARAMETERS FOR MICRO DECISION (rev. 2) ; USAGE: COMMAND LINE (OR MENU DRIVEN IF ERROR IN COMMAND LINE) ; SETCOM 2 1200 N 8 2 IS THE DEFAULT MENU DISPLAY ; PROGRAM END DISPLAYS COMMAND LINE EQUIVALENT OF SETTING USED. ; THIS PROGRAM REQUIRES M80, L80, AND LOAD.COM TO COMPILE & LOAD: .Z80 ;USE STANDARD ZILOG Z-80 MNEMONICS 0000' ASEG ;ABSOLUTE SEGMENT AT 100H ORG 100H ;LIKE ANY GOOD .COM FILE 0100 C3 0395 BEGIN: JP START ;SKIP OVER THIS FIRST BUNCH OF TEXT 0103 0D 4D 44 53 DB 0DH,'MDSETCOM.COM is a PUBLIC DOMAIN program for the Morrow' 0107 45 54 43 4F 010B 4D 2E 43 4F 010F 4D 20 69 73 0113 20 61 20 50 0117 55 42 4C 49 011B 43 20 44 4F 011F 4D 41 49 4E 0123 20 70 72 6F 0127 67 72 61 6D 012B 20 66 6F 72 012F 20 74 68 65 0133 20 4D 6F 72 0137 72 6F 77 013A 0A 0D 4D 69 DB 0AH,0DH,'Micro-Decision with the revision 2 board. Parameters' 013E 63 72 6F 2D 0142 44 65 63 69 0146 73 69 6F 6E 014A 20 77 69 74 014E 68 20 74 68 0152 65 20 72 65 0156 76 69 73 69 015A 6F 6E 20 32 015E 20 62 6F 61 0162 72 64 2E 20 0166 50 61 72 61 016A 6D 65 74 65 016E 72 73 0170 0A 0D 65 78 DB 0AH,0DH,'expected are: the port number (1 or 2), the baud rate' 0174 70 65 63 74 0178 65 64 20 61 017C 72 65 3A 20 0180 74 68 65 20 0184 70 6F 72 74 0188 20 6E 75 6D 018C 62 65 72 20 0190 28 31 20 6F 0194 72 20 32 29 0198 2C 20 74 68 019C 65 20 62 61 01A0 75 64 20 72 01A4 61 74 65 01A7 0A 0D 28 32 DB 0AH,0DH,'(20 to 50000), the parity (Even, Odd, or None), the' 01AB 30 20 74 6F 01AF 20 35 30 30 01B3 30 30 29 2C MACRO-80 3.44 09-Dec-81 PAGE 1-1 01B7 20 74 68 65 01BB 20 70 61 72 01BF 69 74 79 20 01C3 28 45 76 65 01C7 6E 2C 20 4F 01CB 64 64 2C 20 01CF 6F 72 20 4E 01D3 6F 6E 65 29 01D7 2C 20 74 68 01DB 65 01DC 0A 0D 6E 75 DB 0AH,0DH,'number of data bits (5 to 8) and the number of stop' 01E0 6D 62 65 72 01E4 20 6F 66 20 01E8 64 61 74 61 01EC 20 62 69 74 01F0 73 20 28 35 01F4 20 74 6F 20 01F8 38 29 20 61 01FC 6E 64 20 74 0200 68 65 20 6E 0204 75 6D 62 65 0208 72 20 6F 66 020C 20 73 74 6F 0210 70 0211 0A 0D 62 69 DB 0AH,0DH,'bits (1, 1.5, or 2). In real life, that means that' 0215 74 73 20 28 0219 31 2C 20 31 021D 2E 35 2C 20 0221 6F 72 20 32 0225 29 2E 20 20 0229 49 6E 20 72 022D 65 61 6C 20 0231 6C 69 66 65 0235 2C 20 74 68 0239 61 74 20 6D 023D 65 61 6E 73 0241 20 74 68 61 0245 74 0246 0A 0D 20 20 DB 0AH,0DH,' MDSETCOM 1 19200 N 8 1' 024A 20 4D 44 53 024E 45 54 43 4F 0252 4D 20 31 20 0256 31 39 32 30 025A 30 20 4E 20 025E 38 20 31 0261 0A 0D 77 69 DB 0AH,0DH,'will set serial port number 1 (the terminal port)' 0265 6C 6C 20 73 0269 65 74 20 73 026D 65 72 69 61 0271 6C 20 70 6F 0275 72 74 20 6E 0279 75 6D 62 65 027D 72 20 31 20 0281 28 74 68 65 0285 20 74 65 72 0289 6D 69 6E 61 MACRO-80 3.44 09-Dec-81 PAGE 1-2 028D 6C 20 70 6F 0291 72 74 29 0294 0A 0D 74 6F DB 0AH,0DH,'to 19.2 Kbaud with no parity, 8 data bits, and 1 stop' 0298 20 31 39 2E 029C 32 20 4B 62 02A0 61 75 64 20 02A4 77 69 74 68 02A8 20 6E 6F 20 02AC 70 61 72 69 02B0 74 79 2C 20 02B4 38 20 64 61 02B8 74 61 20 62 02BC 69 74 73 2C 02C0 20 61 6E 64 02C4 20 31 20 73 02C8 74 6F 70 02CB 0A 0D 62 69 DB 0AH,0DH,'bit. Use MDSETCOM 2 450 N 8 1 to "push" a 300 baud' 02CF 74 2E 20 20 02D3 55 73 65 20 02D7 4D 44 53 45 02DB 54 43 4F 4D 02DF 20 32 20 34 02E3 35 30 20 4E 02E7 20 38 20 31 02EB 20 74 6F 20 02EF 22 70 75 73 02F3 68 22 20 61 02F7 20 33 30 30 02FB 20 62 61 75 02FF 64 0300 0A 0D 6D 6F DB 0AH,0DH,'modem to 450 baud, or goose it to the limit for' 0304 64 65 6D 20 0308 74 6F 20 34 030C 35 30 20 62 0310 61 75 64 2C 0314 20 6F 72 20 0318 67 6F 6F 73 031C 65 20 69 74 0320 20 74 6F 20 0324 74 68 65 20 0328 6C 69 6D 69 032C 74 20 66 6F 0330 72 0331 0A 0D 70 72 DB 0AH,0DH,'print buffers or other hard-wired applications.' 0335 69 6E 74 20 0339 62 75 66 66 033D 65 72 73 20 0341 6F 72 20 6F 0345 74 68 65 72 0349 20 68 61 72 034D 64 2D 77 69 0351 72 65 64 20 0355 61 70 70 6C 0359 69 63 61 74 035D 69 6F 6E 73 0361 2E MACRO-80 3.44 09-Dec-81 PAGE 1-3 0362 0A 0D 54 68 DB 0AH,0DH,'The trap door falls thru to a menu, so have fun.',1AH 0366 65 20 74 72 036A 61 70 20 64 036E 6F 6F 72 20 0372 66 61 6C 6C 0376 73 20 74 68 037A 72 75 20 74 037E 6F 20 61 20 0382 6D 65 6E 75 0386 2C 20 73 6F 038A 20 68 61 76 038E 65 20 66 75 0392 6E 2E 1A ; DEFINE A FEW LOW MEMORY AREAS: 0000 BOOT EQU 0 0005 BDOS EQU 5 0080 BUFFER EQU 80H ; DEFINE SOME HANDY ASCII CHARACTERS: 0008 BS EQU 8 000A LF EQU 0AH 000D CR EQU 0DH 001B ESC EQU 1BH ; THESE MORROW STANDARD CONTOL CODES ARE NEEDED FOR PRETTINESS: 001A CLR EQU 1AH ; CLEAR SCREEN 001E HOME EQU 1EH ; HOME CURSOR ; ONLY 2 BDOS FUNCTION CALLS ARE USED: 0001 CONIN EQU 1 ; CONSOLE INPUT 0009 PRTSTR EQU 9 ; PRINT STRING ($ TERMINATOR) 0395 31 0100 START: LD SP,BEGIN ; SET UP YOUR OWN STACK SPACE 0398 21 0080 LD HL,BUFFER ;CHECK FOR COMMAND LINE ENTRY 039B 7E LD A,(HL) ; GET CHARATER COUNT 039C B7 OR A ; NO COMMAND LINE ENTRY? 039D CA 0493 JP Z,MENUDRV ; THEN USE THE MENU-DRIVEN PROGRAM 03A0 47 LD B,A ;OTHERWISE, GET THE LINE LENGTH 03A1 CD 0482 CALL SCAN ;RETURN NEXT NON-BLANK CHARACTER 03A4 FE 31 CP '1' ;PORT 1? 03A6 DA 048E JP C,BLANK ;IF LESS THAN 1, USE THE MENU 03A9 FE 33 CP '3' ;MORE THAN 2? 03AB D2 048E JP NC,BLANK ;LIKEWISE UNACCEPTABLE 03AE E6 03 AND 3 ;CONVERT 1 OR 2 TO BINARY 03B0 32 0665 LD (PARAMS),A ;AND SAVE IT IN THE PARAMETER AREA 03B3 CD 0482 CALL SCAN ;SCAN FORWARD TO BAUD RATE 03B6 E5 PUSH HL ;SAVE POINTER TO BAUD RATE IN COMMAND LINE 03B7 EB EX DE,HL ;COMMAND LINE POINTER IN DE 03B8 21 0000 LD HL,0 ;INITIALIZE FOR ASCII - BINARY CONVERSION 03BB 1A NEXTNUM:LD A,(DE) ; GET DIGIT 03BC FE 30 CP '0' ;IF IT'S LESS THAN ZERO, 03BE 38 19 JR C,NONNUM ;CONVERSION IS FINISHED 03C0 FE 3A CP '9'+1 ; IF IT'S GREATER THAN 9 03C2 30 15 JR NC,NONNUM ; YOU ARE LIKEWISE FINISHED 03C4 E6 0F AND 0FH ;MASK 0-9 ASCII TO 0-9 BINARY 03C6 D5 PUSH DE ;SAVE POINTER TO TEXT 03C7 54 LD D,H ;MOVE ACCUMULATED BINARY NUMBER 03C8 5D LD E,L ;TO THE DE REGISTER PAIR 03C9 29 ADD HL,HL ;SO THAT MACRO-80 3.44 09-Dec-81 PAGE 1-4 03CA 29 ADD HL,HL ;YOU CAN 03CB 29 ADD HL,HL ;MULTIPLY 03CC 19 ADD HL,DE ;IT BY 10 03CD 19 ADD HL,DE ;BEFORE 03CE 5F LD E,A ;ADDING 03CF 16 00 LD D,0 ;THE MOST 03D1 19 ADD HL,DE ;RECENT DIGIT. 03D2 D1 POP DE ;RETRIEVE TEXT POINTER 03D3 13 INC DE ;GET NEXT CHARACTER 03D4 10 E5 DJNZ NEXTNUM ;AND KEEP LOOPING 03D6 C3 048E JP BLANK ;(MENU TIME IF YOU RUN OUT OF TEXT) 03D9 C5 NONNUM: PUSH BC ;SAVE LENGTH 03DA D5 PUSH DE ;SAVE POINTER 03DB EB EX DE,HL ;DE=BAUD RATE 03DC 21 0000 LD HL,0 ;ZERO DIVIDEND 03DF E5 PUSH HL ;ON STACK 03E0 21 2580 LD HL,9600 ;CHECK FOR 9600 BAUD OR LESS 03E3 AF XOR A ;ZERO FLAGS 03E4 ED 52 SBC HL,DE ;IF > 9600 BAUD, USE 03E6 3E 01 LD A,1 ;X1 MASK, AND 03E8 21 1E84 LD HL,1E84H ;DIVIDE INTO 2 MHZ CLOCK RATE 03EB 01 0880 LD BC,0880H ;1E8480H=2000000 IN HLC, B=BITS TO SHIFT 03EE 38 03 JR C,GT9600 ; IF NOT GREATER THAN 9600 BAUD, 4 BIT SHIFT: 03F0 06 04 LD B,4 ;1E848H=2000000/16 FOR <=9600 BAUD 03F2 3C INC A ;X16 MASK 03F3 32 05CB GT9600: LD (FACTOR),A ;SAVE THE X1 OR X16 FLAG 03F6 AF XOR A ; ZERO EVERYTHING BEFORE DOING THE DIVISION: 03F7 ED 52 DIVIDE: SBC HL,DE ;SUBTRACT BAUD RATE FROM CLOCK 03F9 E3 EX (SP),HL ; SWAP QUOTIENT & DIVIDEND 03FA 23 INC HL ; INCREASE QUOTIENT 03FB E3 EX (SP),HL ; QUOTIENT ON STACK, DIVIDEND IN HL 03FC 30 F9 JR NC,DIVIDE ;IF DIVIDEND > DIVISOR, KEEP LOOPING 03FE E3 EX (SP),HL ; OTHERWISE YOU WENT TOO FAR: 03FF 2B DEC HL ; DECREASE QUOTIENT 0400 29 ADD HL,HL ; SHIFT QUOTIENT LEFT 1 BIT 0401 E3 EX (SP),HL ; QUOTIENT ON STACK, DIVIDEND IN HL 0402 ED 5A ADC HL,DE ; UN-DO THE EXCESS SUBTRACTION, THEN 0404 CB 11 RL C ;SHIFT DIVIDEND LEFT 0406 ED 6A ADC HL,HL ; 1 BIT, LOOP THRU HOWEVER MANY TIMES 0408 10 ED DJNZ DIVIDE ; THE BIT SHIFT INDICATES. 040A 29 ADD HL,HL ;DOUBLE THE REMAINDER, SEE IF THE BAUD RATE 040B ED 52 SBC HL,DE ; IS BIGGER (FOR ROUNDING UP) 040D E1 POP HL ;RETRIEVE THE QUOTIENT FROM THE STACK 040E 38 01 JR C,NOROUND ;IF THE REMAINDER IS MORE THAN HALF THE BAUD, 0410 23 INC HL ; ROUND UP THE QUOTIENT 0411 22 05D5 NOROUND:LD (CDIVIS),HL ; (HEREAFTER KNOWN AS THE BAUD RATE DIVISOR) 0414 22 068E LD (EXTRAD),HL ; SAVE IT TWICE 0417 3E 12 LD A,18 ;INSTALL 0419 32 0669 LD (PARAMS+4),A ;IN PARAMETER TABLE ;(INSTALL BAUD RATE INFO AS EXTRA TEXT & DIVISOR IN TABLES.) 041C E1 POP HL ; RETRIEVE POINTER TO TEXT IN BUFFER 041D 54 LD D,H ; IN BOTH HL 041E 5D LD E,L ; AND DE. 041F C1 POP BC ; GET LENGTH OF TEXT YET TO PROCESS 0420 E3 EX (SP),HL ;SWAP CURRENT POINTER WITH OLD POINTER TO BAUD 0421 EB EX DE,HL ;SWAP OLD & NEW MACRO-80 3.44 09-Dec-81 PAGE 1-5 0422 23 INC HL ;GOOSE IT UP 0423 ED 52 SBC HL,DE ;HL = LENGTH OF BAUD RATE TEXT 0425 C5 PUSH BC ;SAVE LENGTH AGAIN 0426 4D LD C,L ;MOVE LENGTH OF TEXT 0427 44 LD B,H ;INTO BC 0428 EB EX DE,HL ;HL > SOURCE OF TEXT IN COMMAND LINE 0429 11 08FA LD DE,EXTRAB ;DE > DESTINATION IN BAUD RATE TABLE 042C ED B0 LDIR ;MOVE IT OVER 042E 3E 13 LD A,19 ;ADD EXTRA BAUD RATE TO MENU 0430 32 055B LD (BAUDS),A ;BY GOOSING UP MAX COUNTER 0433 C1 POP BC ;RETRIEVE TEXT LENGTH 0434 E1 POP HL ; AND TEXT POINTER 0435 CD 0482 CALL SCAN ;LOOK PAST THE BAUD RATE 0438 E6 4F AND 4FH ;FORCE CHARACTER TO UPPER CASE 043A 0E 00 LD C,0 ; C = NO PARITY FLAG 043C FE 4E CP 'N' ; RIGHT? 043E 28 0B JR Z,SETP ; THEN SET THE PARITY 0440 0C INC C ; C = ODD PARITY FLAG 0441 FE 4F CP 'O' ; RIGHT? 0443 28 06 JR Z,SETP ; SO DO IT 0445 0C INC C ; C = EVEN PARITY FLAG 0446 FE 45 CP 'E' ; THAT'S WHAT "E" MEANS 0448 C2 048E JP NZ,BLANK ; IF IT'S NOT O,E, OR N, IT'S WRONG. 044B 79 SETP: LD A,C ;SAVE THE PARITY FLAG 044C 32 0667 LD (PARAMS+2),A ;IN THE PARAMETER AREA FOR LATER USE ;NOW PROCESS THE DATA BITS & STOP BITS: 044F CD 0482 CALL SCAN ;NEXT CHARACTER 0452 FE 35 CP '5' ;LESS THAN 5 DATA BITS 0454 38 39 JR C,ABORTD ;IS AN ABORTION 0456 FE 39 CP '9' ;9 DATA BITS? 0458 30 35 JR NC,ABORTD ;DON'T BE SILLY. 045A E6 0F AND 0FH ;MAKE ASCII 5-8 TO BINARY 5-8 045C 32 0668 LD (PARAMS+3),A ; THEN INSERT IN THE APPROPRIATE PLACE 045F CD 0482 CALL SCAN ;GET THE LAST INFORMATION 0462 FE 32 CP '2' ;2 STOP BITS? 0464 0E 02 LD C,2 ;C = 2 STOP BITS FLAG 0466 28 13 JR Z,SB2 ;THEN SKIP OUT WITH YOUR INFO 0468 FE 31 CP '1' ; 1 OR 1.5 STOP BITS? 046A 20 23 JR NZ,ABORTD ;IF IT AIN'T, IT'S WRONG 046C 23 INC HL ; NEXT CHARACTER 046D 7E LD A,(HL) ; IN THE ACCUMULATOR, 046E 0E 00 LD C,0 ;C = 1 STOP BIT FLAG 0470 FE 2E CP '.' ;DECIMAL POINT (AS IN 1.5 STOP BITS)? 0472 20 07 JR NZ,SB2 ; IF NOT, IT MUST BE 1 STOP BIT 0474 23 INC HL ;NEXT CHARACTER 0475 7E LD A,(HL) ;TO CHECK: 0476 FE 35 CP '5' ; IS IT REALLY 1.5 STOP BITS? 0478 20 15 JR NZ,ABORTD ;IF NOT, GO TO THE MENU STUFF 047A 0C INC C ;OTHERWISE, C=1 FOR 1.5 STOP BITS 047B 79 SB2: LD A,C ;SAVE THE STOP BIT FLAG 047C 32 0666 LD (PARAMS+1),A ;IN THE PARAMETER AREA, THEN 047F C3 0586 JP TIMES16+3 ;RUN THEM ALL THRU THE PROGRAM 0482 23 SCAN: INC HL ; POINT TO THE NEXT CHARACTER IN THE BUFFER 0483 05 DEC B ; AND DECREASE THE NUMBER OF CHARS TO LOOK AT 0484 28 08 JR Z,BLANK ;SKIP OUT IF NO MORE CHARS 0486 7E LD A,(HL) ;GET CHAR MACRO-80 3.44 09-Dec-81 PAGE 1-6 0487 FE 20 CP ' ' ;BLANK? 0489 28 F7 JR Z,SCAN ;THEN KEEP LOOKING 048B 38 01 JR C,BLANK ;EXIT IF IT'S A CONTROL CHARACTER 048D C9 RET ; OTHERWISE RETURN WITH THE GOOD NEWS. 048E E1 BLANK: POP HL ;JERK OUT THE RETURN ADDRESS 048F AF ABORTD: XOR A ;ZERO OUT THE BUFFER 0490 32 0080 LD (BUFFER),A ;(FOR NO GOOD REASON AT ALL, I GUESS) ; - AND NOW, CONTINUE WITH THE MENU DRIVEN PORTION OF THE PROGRAM ; IF THE COMMAND LINE ENTRY IS INVALID, DO IT MENU DRIVEN: 0493 11 06A5 MENUDRV:LD DE,CLS ;THE FIRST-TIME THRU, CLEAR THE SCREEN 0496 0E 09 LD C,PRTSTR ;BY PRINTING OUT THE CLEAR SCREEN FUNCTION 0498 CD 0005 CALL BDOS ;WITH THE BDOS CALL 049B 21 0665 PRINT: LD HL,PARAMS ; POINT TO THE PARAMETERS 049E 3E 30 LD A,'0' ; CONVERT BINARY TO ASCII 04A0 B6 OR (HL) ; 1 OR 2 04A1 32 07A9 LD (S1OR2),A ; AND INSTALL INTO THE MENU DISPLAY 04A4 23 INC HL ;NEXT PARAMETER: STOP BITS 04A5 5E LD E,(HL) ; 0,1,2 FOR 1,1.5,2 STOP BITS 04A6 16 00 LD D,0 ; MEANS 3 BYTES MAX TO INSTALL IN THE MENU, 04A8 E5 PUSH HL ; SO SAVE POINTER TO PARAMETERS, 04A9 21 069C LD HL,STOPTXT ;HL > TEXT OF STOP BIT VALUES 04AC 19 ADD HL,DE ;SKIP OVER 04AD 19 ADD HL,DE ;TO THE 04AE 19 ADD HL,DE ;DESIRED TEXT, 04AF 11 07C6 LD DE,STOPS ;THEN MOVE 04B2 01 0003 LD BC,3 ;3 BYTES 04B5 ED B0 LDIR ;FROM TEXT AREA TO THE MENU. 04B7 E1 POP HL ;RETRIEVE THE PARAMETER POINTER 04B8 23 INC HL ;HL > PARITY PARAMETER 04B9 7E LD A,(HL) ; GET 0,1,2 FOR NONE, ODD, EVEN 04BA 07 RLCA ; MULTIPLY 04BB 07 RLCA ; BY 4 (4 BYTES OF TEXT, RIGHT?) 04BC 5F LD E,A ;MOVE OFFSET 04BD 16 00 LD D,0 ;TO DE REGISTER, 04BF E5 PUSH HL ;SAVE PARAM. POINTER 04C0 21 0690 LD HL,PARTXT ;HL > TEXT OF PARITY WORDS 04C3 19 ADD HL,DE ;ADD OFFSET 04C4 11 07E5 LD DE,PARITY ;NOW MOVE THE TEXT 04C7 01 0004 LD BC,4 ;(ALL 4 BYTES OF IT) 04CA ED B0 LDIR ;INTO THE MENU 04CC E1 POP HL ;RETRIEVE THE PARAMETER POINTER 04CD 23 INC HL ;HL > DATA BITS 04CE 3E 30 LD A,'0' ;CREATE ASCII 5,6,7,8 04D0 B6 OR (HL) ;FROM THE BINARY 5,6,7,8 04D1 32 0805 LD (BITS),A ;AND PLUG INTO THE MENU TEXT 04D4 23 INC HL ;HL > BAUD RATE PARAMETER 04D5 7E LD A,(HL) ;(0-17 FOR 50-19200 BAUD) 04D6 07 RLCA ; TIMES 2 04D7 07 RLCA ; TIMES 4 04D8 8E ADC A,(HL) ; TIMES 5 (5 BYTES OF TEXT) 04D9 5F LD E,A ;DE NOW HOLD THE OFFSET 04DA 16 00 LD D,0 ;TO THE DESIRED BAUD RATE TEXT 04DC 21 08A0 LD HL,BAUDTXT ;IN THE BAUD RATE TEXT TABLE 04DF 19 ADD HL,DE ; ADD IT, 04E0 11 0819 LD DE,BAUD ; POINT TO MENU, 04E3 01 0005 LD BC,5 ; COUNT THE BYTES, MACRO-80 3.44 09-Dec-81 PAGE 1-7 04E6 ED B0 LDIR ; AND SQUIRT IT OUT. 04E8 11 06A7 LD DE,MENU ;NOW POINT TO THE MENU, 04EB 0E 09 BYPASS: LD C,PRTSTR ;SET UP BDOS FUNCTION FOR DISPLAY 04ED CD 0005 CALL BDOS ;AND DISPLAY THE MENU 04F0 0E 01 INPUT: LD C,CONIN ;GET SOMETHING 04F2 CD 0005 CALL BDOS ;IN FROM THE KEYBOARD: 04F5 FE 41 KEYCHK: CP 'A' ;BELOW "A"? 04F7 38 08 JR C,BADKEY ;I WOULDN'T BELIEVE IT EITHER 04F9 FE 5B CP 'Z'+1 ;BETWEEN "A" AND "Z"? 04FB 38 10 JR C,KEYOK ;JUMP OUT FOR FURTHER PROCESSING 04FD D6 20 SUB 20H ;FOLD LOWER CASE INTO UPPER CASE 04FF 18 F4 JR KEYCHK ;AND RE-PROCESS TO CHECK RANGE 0501 FE 1B BADKEY: CP ESC ;ESCAPE? 0503 CA 0000 JP Z,BOOT ;THEN ESCAPE! 0506 0E 09 LD C,PRTSTR ;OTHERWISE BACKSPACE AND ERASE 0508 11 089C LD DE,BSERAS ;WHATEVER KEY WAS PRESSED 050B 18 DE JR BYPASS ;AND LOOP THRU AGAIN 050D D6 41 KEYOK: SUB 'A' ;NORMALIZE KEY A-F TO 0-5 050F 20 0B JR NZ,SKIP1 ;BYPASS THE SET PORT ROUTINE IF B,C,D,E,F 0511 3A 0665 LD A,(PARAMS) ;OTHERWISE GET THE PORT NUMBER, 0514 EE 03 XOR 3 ;TOGGLE BETWEEN 1 AND 2 0516 32 0665 LD (PARAMS),A ;SAVE THE NEW PORT NUMBER 0519 C3 049B JP PRINT ;AND DISPLAY THE NEW MENU 051C 3D SKIP1: DEC A ;C,D,E,F? 051D 20 0F JR NZ,SKIP2 ;BYPASS THE STOP BIT ROUTINE 051F 3A 0666 LD A,(PARAMS+1) ;GET THE STOP BIT PARAMETER 0522 3C INC A ;GOOSE IT UP 0523 FE 03 CP 3 ;0,1,2 ACCEPTED 0525 38 01 JR C,STOPOK ;OTHERWISE 0527 AF XOR A ;FOLD BACK TO 0, 0528 32 0666 STOPOK: LD (PARAMS+1),A ;SAVE THE NEW PARAMETER, 052B C3 049B JP PRINT ;DISPLAY THE NEW MENU 052E 3D SKIP2: DEC A ;D,E,F? 052F 20 0F JR NZ,SKIP3 ;BYPASS THE PARITY SETTING 0531 3A 0667 LD A,(PARAMS+2) ;GET 0,1,2 0534 3C INC A ;GOOSE IT UP 1 0535 FE 03 CP 3 ;0,1,2 FOR NONE, ODD, EVEN 0537 38 01 JR C,PTYOK ;IF OUT OF THIS RANGE, 0539 AF XOR A ;FOLD BACK TO 0 053A 32 0667 PTYOK: LD (PARAMS+2),A ;RE-INSTALL PARITY 053D C3 049B JP PRINT ;JUMP TO MENU DISPLAY 0540 3D SKIP3: DEC A ;E,F? 0541 20 10 JR NZ,SKIP4 ;SKIP OVER THE DATA BIT SETTING 0543 3A 0668 LD A,(PARAMS+3) ;GET THE DATA BITS 0546 3C INC A ;GOOSE UP THE COUNT 0547 FE 09 CP 9 ;5,6,7,8 DATA BITS 0549 38 02 JR C,DATOK ;IF TOO MANY, 054B 3E 05 LD A,5 ;FOLD BACK TO 5 054D 32 0668 DATOK: LD (PARAMS+3),A ;SAVE PARAMETER 0550 C3 049B JP PRINT ;DISPLAY MENU 0553 3D SKIP4: DEC A ;F? 0554 20 0F JR NZ,SKIP5 ;SKIP OVER THE BAUD SETTING 0556 3A 0669 LD A,(PARAMS+4) ;GET BAUD RATE 0559 3C INC A ;GOOSE IT UP 055A FE 12 CP 18 ;0 THRU 17 ALLOWED 055B BAUDS EQU $-1 ;(UNLESS #18 INSTALLED IN COMMAND LINE) MACRO-80 3.44 09-Dec-81 PAGE 1-8 055C 38 01 JR C,BAUDOK ;IF NOT ACCEPTABLE, 055E AF XOR A ;RESET TO THE FIRST BAUD RATE IN TABLE 055F 32 0669 BAUDOK: LD (PARAMS+4),A ;SAVE THE BAUD RATE 0562 C3 049B JP PRINT ;DISPLAY THE MENU 0565 3D SKIP5: DEC A ;BETTER BE DOWN TO ZERO BY NOW... 0566 20 99 JR NZ,BADKEY ;IF IT AIN'T THE EXIT, IT'S WRONG. ; NOW IS THE TIME TO PROCESS ALL THE PARAMETERS AND SET THE CHIPS: 0568 3A 0669 PROCESS:LD A,(PARAMS+4) ;GET THE BAUD RATE POINTER 056B F5 PUSH AF ;SAVE FOR LATER TWEAKING 056C 21 066A LD HL,DIVISOR ;HL > TABLE OF BAUD RATE DIVISORS 056F 07 RLCA ;BAUD RATE POINTER TIMES 2 0570 5F LD E,A ;IN ORDER TO GENERATE THE OFFSET 0571 16 00 LD D,0 ;INTO THE TABLE OF BAUD RATE DIVISORS 0573 19 ADD HL,DE ;HL NOW POINTS TO THE DIVISOR 0574 7E LD A,(HL) ;GET THE DIVISOR 0575 23 INC HL ;(BOTH BYTES) 0576 66 LD H,(HL) ;INTO THE 0577 6F LD L,A ;HL REGISTER PAIR 0578 22 05D5 LD (CDIVIS),HL ;SAVE THE DIVISOR IN THE SELF-WRITING AREA 057B F1 POP AF ;RETRIEVE THE BAUD RATE NUMBER 057C FE 0F CP 15 ;<= 9600 BAUD ? 057E 3E 02 LD A,2 ;THEN USE THE TIMES 16 SETTING 0580 38 01 JR C,TIMES16 ;IF > 9600 BAUD, 0582 3D DEC A ;SET THE TIMES 1 FLAG 0583 32 05CB TIMES16:LD (FACTOR),A ;IN SELF-WRITING AREA OF PROGRAM 0586 21 0665 LD HL,PARAMS ;FIRST PARAMETER 0589 7E LD A,(HL) ;IS PORT NUMBER (1 OR 2) 058A F6 F0 OR 0F0H ;MAKE IT F1 OR F2 058C 32 05D8 LD (CPORT),A ;RE-WRITE THE PROGRAM WITH THE RIGHT PORT. 058F 7E LD A,(HL) ;BACK TO 1 OR 2 AGAIN 0590 0F RRCA ;SHIFT THE BITS UNTIL THEY 0591 0F RRCA ;SWEEP AROUND TO BITS 6,7 0592 F6 3E OR 3EH ;ADD IN THE REST OF THE 8253 CONTROL BYTE 0594 32 05D1 LD (CSELECT),A ;AND WRITE IT INTO THE PROGRAM. 0597 23 INC HL ; NEXT, GET THE 0598 7E LD A,(HL) ; STOP BIT PARAMETER 0599 B7 OR A ;0 MEANS 1 STOP BIT 059A 28 06 JR Z,STOP1 ;SO SKIP OVER IF SO 059C 3D DEC A ;1 COUNTS DOWN TO 0 059D 20 06 JR NZ,STOP2 ;SO NON-ZERO MEANS SKIP OUT. 059F 3E B0 LD A,0B0H ;MUST BE 1.5 STOP BITS 05A1 01 DB 1 ;MASK OUT 1 STOP BIT: 05A2 3E 40 STOP1: LD A,040H ; 40H IS THE 1 STOP BIT MASK 05A4 01 DB 1 ;MASK OUT 2 STOP BIT: 05A5 3E C0 STOP2: LD A,0C0H ; 0C0H IS THE 2 STOP BIT MASK 05A7 5F LD E,A ;SAVE THE STOP BIT MASK 05A8 23 INC HL ;HL > PARITY 05A9 7E LD A,(HL) ;IS THE PARAMETER 05AA B7 OR A ;ZERO? 05AB 28 07 JR Z,PARITY0 ;THEN SKIP OUT TO SET IT THUS. 05AD 3D DEC A ;1 DECREMENTS TO ZERO 05AE 3E 10 LD A,10H ;ODD PARITY MASK 05B0 28 02 JR Z,PARITY0 ;SKIP TO INSTALL ODD PARITY 05B2 3E 30 LD A,30H ;EVEN PARITY MASK 05B4 B3 PARITY0:OR E ;SAVE THE PARITY MASK 05B5 5F LD E,A ;COMBINED WITH THE STOP BIT MASK MACRO-80 3.44 09-Dec-81 PAGE 1-9 05B6 23 INC HL ;HL > DATA BITS 05B7 7E LD A,(HL) ; GET IT. 05B8 D6 05 SUB 5 ;NORMALIZE 5,6,7,8 TO 0,1,2,3 05BA 28 0E JR Z,SETBIT ;5 DATA BITS -> ZERO MASK 05BC 3D DEC A ;STEP THRU 05BD 28 06 JR Z,BIT6 ;THE 05BF 3D DEC A ;POSSIBILITIES 05C0 28 06 JR Z,BIT7 ;ONE AT A TIME 05C2 3E 0C LD A,0CH ;LOAD THE 8 DATA BIT MASK. 05C4 01 DB 1 ;MASK OUT THE 6 BIT MASK 05C5 3E 04 BIT6: LD A,4 ;(6 BIT MASK) 05C7 01 DB 1 ;MASK OUT BIT 7 05C8 3E 08 BIT7: LD A,8 ;(7 BIT MASK) 05CA F6 02 SETBIT: OR 2 ;SET FOR 16X BAUD RATE 05CB FACTOR EQU $-1 ;SET TO X1 IF OVER 9600 BAUD 05CC B3 OR E ;ABSORB THE STOP BIT AND PARITY MASK 05CD 32 05E9 LD (CCONFIG),A ;AND GO TO THE SELF-MODIFYING CODE: ; 05D0 3E BE LD A,0BEH ;SELECT CHANNEL 1 OR 2 05D1 CSELECT EQU $-1 05D2 D3 F3 OUT (0F3H),A ;ON THE CTC CHIP 05D4 11 0683 LD DE,0683H ;DE = BAUD RATE DIVISOR 05D5 CDIVIS EQU $-2 05D7 0E F2 LD C,0F2H ;C = PORT TO OUTPUT 05D8 CPORT EQU $-1 05D9 ED 59 OUT (C),E ;OUTPUT THE DIVISOR 05DB ED 51 OUT (C),D ; (BOTH BYTES) 05DD 79 LD A,C ;TAKE THE PORT, 05DE E6 03 AND 3 ;0F1 OR 0F2 BECOMES 1 OR 2 AGAIN 05E0 07 RLCA ;DOUBLE THAT TO 2 OR 4 05E1 C6 FB ADD A,0FBH ;FD OR FF FOR PORT 1 OR PORT 2, RESPECTIVELY 05E3 4F LD C,A ;C = PORT NUMBER 05E4 3E 40 LD A,40H ;RESET 8251 05E6 ED 79 OUT (C),A ;RESET 05E8 3E CE LD A,0CEH ;FLAGS FOR N,8,2 05E9 CCONFIG EQU $-1 05EA ED 79 OUT (C),A ;SET THE SERIAL PARAMETERS 05EC 3E 37 LD A,37H ;RESETS ERRORS, SET DSR, ETC. 05EE ED 79 OUT (C),A ;DO IT TO IT, ; NOW PRINT OUT WHAT'S HAPPENED (IN COMMAND LINE FORMAT) 05F0 3A 0665 LD A,(PARAMS) ;GET PORT 05F3 F6 30 OR '0' ;AS ASCII CHARACTER 05F5 32 0653 LD (WHAT1),A ;INTO OUTPUT LINE 05F8 3A 0669 LD A,(PARAMS+4) ;GET 05FB 5F LD E,A ;5 TIMES 05FC 07 RLCA ;DOUBLED 05FD 07 RLCA ;QUADRUPLED 05FE 83 ADD A,E ;PLUS 1 05FF 5F LD E,A ;ADD 0600 16 00 LD D,0 ;OFFSET 0602 21 08A0 LD HL,BAUDTXT ;GET 0605 19 ADD HL,DE ;POINTER TO BAUD TEXT 0606 11 0655 LD DE,WHAT2 ;BAUD 0609 01 0005 LD BC,5 ;RATE 060C ED B0 LDIR ;ACROSS 060E 3A 0667 LD A,(PARAMS+2) ;MOVE MACRO-80 3.44 09-Dec-81 PAGE 1-10 0611 21 0647 LD HL,NOE ;N OR O OR E 0614 B7 OR A ;ZERO? 0615 28 04 JR Z,GOTNOE ;EXIT 0617 23 LOOPING:INC HL ;WORK THRU 0618 3D DEC A ;THE 0619 20 FC JR NZ,LOOPING ;POSSIBILITIES 061B 7E GOTNOE: LD A,(HL) ;SAVE 061C 32 065B LD (WHAT3),A ;PARITY, 061F 3A 0668 LD A,(PARAMS+3) ;DATA 0622 F6 30 OR '0' ;AS ASCII 0624 32 065D LD (WHAT4),A ;BITS 0627 3A 0666 LD A,(PARAMS+1) ;GET STOPS 062A 5F LD E,A ;TIMES 062B 07 RLCA ;3 062C 83 ADD A,E ;FOR 062D 5F LD E,A ;THEN 062E 16 00 LD D,0 ;FETCHING 0630 21 069C LD HL,STOPTXT ;TEXT OF 0633 19 ADD HL,DE ;STOP BITS 0634 11 065F LD DE,WHAT5 ;STOP BITS 0637 01 0003 LD BC,3 ;ALSO 063A ED B0 LDIR ;MOVED, 063C 0E 09 LD C,PRTSTR ;DISPLAY 063E 11 064A LD DE,BYEBYE ;TEXT 0641 CD 0005 CALL BDOS ;BEFORE EXIT 0644 C3 0000 JP BOOT ;AND THAT'S THE END OF THE PROGRAM ; 0647 4E 4F 45 NOE: DB 'NOE' ; 064A 0A 0D 53 45 BYEBYE: DB LF,CR,'SETCOM ' 064E 54 43 4F 4D 0652 20 0653 32 20 WHAT1: DB '2 ' 0655 31 32 30 30 WHAT2: DB '1200 ' 0659 20 20 065B 4E 20 WHAT3: DB 'N ' 065D 38 20 WHAT4: DB '8 ' 065F 32 20 20 0A WHAT5: DB '2 ',LF,CR,'$' 0663 0D 24 ; ; DEFAULT SETTINGS: 0665 02 PARAMS: DB 2 ;PORT NUMBER 2 0666 02 DB 2 ;2 STOP BITS 0667 00 DB 0 ;NO PARITY 0668 08 DB 8 ;8 DATA BITS 0669 08 DB 8 ;1200 BAUD: SEE DIVISOR + 8 * 2 BYTES ; 066A DIVISOR: ;ASSUMES X16 FOR 9600 BAUD & BELOW, X1 FOR ABOVE. 066A 09C4 DW 09C4H ;50 BAUD 066C 0683 DW 0683H ;75 066E 0470 DW 0470H ;110 0670 03A1 DW 03A1H ;135 0672 0341 DW 0341H ;150 0674 01A1 DW 01A1H ;300 0676 0116 DW 0116H ;450 BAUD FOR "PUSHING" A 300 BAUD MODEM 0678 00D0 DW 00D0H ;600 MACRO-80 3.44 09-Dec-81 PAGE 1-11 067A 0068 DW 0068H ;1200 (THIS IS THE DEFAULT SETTING FOR PORT 2) 067C 0045 DW 0045H ;1800 067E 003F DW 003FH ;2000 0680 0034 DW 0034H ;2400 0682 001A DW 001AH ;4800 0684 0011 DW 0011H ;7200 0686 000D DW 000DH ;9600 0688 008B DW 008BH ;14400 AT THE X1 SETTING 068A 0077 DW 0077H ;16800 AT THE X1 SETTING 068C 0068 DW 0068H ;19200 AT THE X1 SETTING 068E 0000 EXTRAD: DW 0000H ;ALLOW ROOM FOR A COMMAND LINE DIVISOR ; 0690 4E 4F 4E 45 PARTXT: DB 'NONE' 0694 4F 44 44 20 DB 'ODD ' 0698 45 56 45 4E DB 'EVEN' ; 069C 31 20 20 STOPTXT:DB '1 ' 069F 31 2E 35 DB '1.5' 06A2 32 20 20 DB '2 ' ; 06A5 1A 24 CLS: DB CLR,'$' ;CLEAR THE SCREEN 06A7 1E MENU: DB HOME ;HOME THE CURSOR 06A8 53 45 54 43 DB 'SETCOM: SET SERIAL COMMUNICATIONS PORTS (MORROW REV. 2)' 06AC 4F 4D 3A 20 06B0 53 45 54 20 06B4 53 45 52 49 06B8 41 4C 20 43 06BC 4F 4D 4D 55 06C0 4E 49 43 41 06C4 54 49 4F 4E 06C8 53 20 50 4F 06CC 52 54 53 20 06D0 28 4D 4F 52 06D4 52 4F 57 20 06D8 52 45 56 2E 06DC 20 32 29 06DF 0A 0D 0A DB LF,CR,LF 06E2 46 4F 52 20 DB 'FOR COMMAND LINE ENTRY OF PARAMETERS, ' 06E6 43 4F 4D 4D 06EA 41 4E 44 20 06EE 4C 49 4E 45 06F2 20 45 4E 54 06F6 52 59 20 4F 06FA 46 20 50 41 06FE 52 41 4D 45 0702 54 45 52 53 0706 2C 20 0708 55 53 45 20 DB 'USE THE FOLLOWING COMMAND FORMAT:',LF,CR,LF 070C 54 48 45 20 0710 46 4F 4C 4C 0714 4F 57 49 4E 0718 47 20 43 4F 071C 4D 4D 41 4E 0720 44 20 46 4F 0724 52 4D 41 54 0728 3A 0A 0D 0A MACRO-80 3.44 09-Dec-81 PAGE 1-12 072C 20 20 53 45 DB ' SETCOM [PORT] [BAUD] [PARITY] [DATA BITS] [STOP BITS]' 0730 54 43 4F 4D 0734 20 5B 50 4F 0738 52 54 5D 20 073C 5B 42 41 55 0740 44 5D 20 5B 0744 50 41 52 49 0748 54 59 5D 20 074C 5B 44 41 54 0750 41 20 42 49 0754 54 53 5D 20 0758 5B 53 54 4F 075C 50 20 42 49 0760 54 53 5D 0763 0A 0D 0A 20 DB LF,CR,LF,' (EXAMPLE: SETCOM 2 19200 N 8 1.5 )',LF,CR,LF 0767 20 28 45 58 076B 41 4D 50 4C 076F 45 3A 20 20 0773 53 45 54 43 0777 4F 4D 20 32 077B 20 31 39 32 077F 30 30 20 4E 0783 20 38 20 31 0787 2E 35 20 20 078B 20 29 0A 0D 078F 0A 0790 41 2D 2D 3E DB 'A--> SERIAL PORT NUMBER: ' 0794 20 53 45 52 0798 49 41 4C 20 079C 50 4F 52 54 07A0 20 4E 55 4D 07A4 42 45 52 3A 07A8 20 07A9 32 0A 0D 0A S1OR2: DB '2',LF,CR,LF 07AD 42 2D 2D 3E DB 'B--> TRANSMIT STOP BITS: ' 07B1 20 54 52 41 07B5 4E 53 4D 49 07B9 54 20 53 54 07BD 4F 50 20 42 07C1 49 54 53 3A 07C5 20 07C6 32 20 20 0A STOPS: DB '2 ',LF,CR,LF 07CA 0D 0A 07CC 43 2D 2D 3E DB 'C--> XMTR - RCVR PARITY: ' 07D0 20 58 4D 54 07D4 52 20 2D 20 07D8 52 43 56 52 07DC 20 50 41 52 07E0 49 54 59 3A 07E4 20 07E5 4E 4F 4E 45 PARITY: DB 'NONE',LF,CR,LF 07E9 0A 0D 0A 07EC 44 2D 2D 3E DB 'D--> DATA BITS PER CHAR: ' 07F0 20 44 41 54 07F4 41 20 42 49 07F8 54 53 20 50 MACRO-80 3.44 09-Dec-81 PAGE 1-13 07FC 45 52 20 43 0800 48 41 52 3A 0804 20 0805 38 0A 0D 0A BITS: DB '8',LF,CR,LF 0809 45 2D 2D 3E DB 'E--> BAUD RATE: ' 080D 20 42 41 55 0811 44 20 52 41 0815 54 45 3A 20 0819 31 32 30 30 BAUD: DB '1200 ',LF,CR,LF 081D 20 0A 0D 0A 0821 46 2D 2D 3E DB 'F--> FINISH (INSTALL ALL PARAMETERS AS SHOWN ON THE SCREEN)' 0825 20 46 49 4E 0829 49 53 48 20 082D 28 49 4E 53 0831 54 41 4C 4C 0835 20 41 4C 4C 0839 20 50 41 52 083D 41 4D 45 54 0841 45 52 53 20 0845 41 53 20 53 0849 48 4F 57 4E 084D 20 4F 4E 20 0851 54 48 45 20 0855 53 43 52 45 0859 45 4E 29 085C 0A 0D 0A DB LF,CR,LF 085F 50 4F 4B 45 DB "POKE SOME KEYS (A'S TO E'S), THEN JUST 'F' OFF" 0863 20 53 4F 4D 0867 45 20 4B 45 086B 59 53 20 28 086F 41 27 53 20 0873 54 4F 20 45 0877 27 53 29 2C 087B 20 54 48 45 087F 4E 20 4A 55 0883 53 54 20 27 0887 46 27 20 4F 088B 46 46 088D 20 28 4F 52 DB " (OR ESCape): " 0891 20 45 53 43 0895 61 70 65 29 0899 3A 20 20 089C 08 20 08 24 BSERAS: DB BS," ",BS,"$" ; 08A0 35 30 20 20 BAUDTXT:DB '50 ' 08A4 20 08A5 37 35 20 20 DB '75 ' 08A9 20 08AA 31 31 30 20 DB '110 ' 08AE 20 08AF 31 33 35 20 DB '135 ' 08B3 20 08B4 31 35 30 20 DB '150 ' 08B8 20 08B9 33 30 30 20 DB '300 ' 08BD 20 MACRO-80 3.44 09-Dec-81 PAGE 1-14 08BE 34 35 30 20 DB '450 ' 08C2 20 08C3 36 30 30 20 DB '600 ' 08C7 20 08C8 31 32 30 30 DB '1200 ' 08CC 20 08CD 31 38 30 30 DB '1800 ' 08D1 20 08D2 32 30 30 30 DB '2000 ' 08D6 20 08D7 32 34 30 30 DB '2400 ' 08DB 20 08DC 34 38 30 30 DB '4800 ' 08E0 20 08E1 37 32 30 30 DB '7200 ' 08E5 20 08E6 39 36 30 30 DB '9600 ' 08EA 20 08EB 31 34 34 30 DB '14400' 08EF 30 08F0 31 36 38 30 DB '16800' 08F4 30 08F5 31 39 32 30 DB '19200' 08F9 30 08FA 20 20 20 20 EXTRAB: DB ' ' ;EXTRA BAUD RATE TEXT 08FE 20 ; END MACRO-80 3.44 09-Dec-81 PAGE S Macros: Symbols: 048F ABORTD 0501 BADKEY 0819 BAUD 055F BAUDOK 055B BAUDS 08A0 BAUDTXT 0005 BDOS 0100 BEGIN 05C5 BIT6 05C8 BIT7 0805 BITS 048E BLANK 0000 BOOT 0008 BS 089C BSERAS 0080 BUFFER 064A BYEBYE 04EB BYPASS 05E9 CCONFIG 05D5 CDIVIS 001A CLR 06A5 CLS 0001 CONIN 05D8 CPORT 000D CR 05D1 CSELECT 054D DATOK 03F7 DIVIDE 066A DIVISOR 001B ESC 08FA EXTRAB 068E EXTRAD 05CB FACTOR 061B GOTNOE 03F3 GT9600 001E HOME 04F0 INPUT 04F5 KEYCHK 050D KEYOK 000A LF 0617 LOOPING 06A7 MENU 0493 MENUDRV 03BB NEXTNUM 0647 NOE 03D9 NONNUM 0411 NOROUND 0665 PARAMS 07E5 PARITY 05B4 PARITY0 0690 PARTXT 049B PRINT 0568 PROCESS 0009 PRTSTR 053A PTYOK 07A9 S1OR2 047B SB2 0482 SCAN 05CA SETBIT 044B SETP 051C SKIP1 052E SKIP2 0540 SKIP3 0553 SKIP4 0565 SKIP5 0395 START 05A2 STOP1 05A5 STOP2 0528 STOPOK 07C6 STOPS 069C STOPTXT 0583 TIMES16 0653 WHAT1 0655 WHAT2 065B WHAT3 065D WHAT4 065F WHAT5 No Fatal error(s)  047B SB2 QUT & dR M 0 R0C $ 8s 3B &G#y &Lg#xe1Nfy@w4  9NƓn #yd e:NG0P4x8LgC)@a9GB 8GAm1NB@@o9B`h2 F@r0 hd0 `0 E 8NF@("`d2 󐀜o7E"eMSir!a'CP5 @a7CA@n:LFSfΆ(b4b@X   E$ 9L&f2CA 6L&㘀h0@@M"ȥB< #` '(w4  9NF @p7qb2h2Sn0y)Nr. f# ;N 8NFX  @b4bd D3 'Ap@U9D!LT!ɢh5 b :#h "` 1N@P4o2M@4# ,B9s2 'A : ai: (p9MAf3NG1 7 Sa9sIdNaa:M㘸 * p a6bu e7E@h01. @ ~[`B;5 [H#fG1 A `sڥBR) K`e9Xh#Q Jv <@00x2eUғF>\bKZe]R)8G#p F)1IGXEv1l pP@G1<c(V8y5_Ñ27@#@QTy40F8\*Rh!2R(8 C!0;V/Q @ @ ڰp tq|,d @p?#C856po5"XwFP3 60x* Mx?c dg0`A :4H>fl=F0U#HD Ѥ rX?T !z2eD&P16x=>4@3P|@n(G@|0YgP@| !Y Q瓴(\0;O9y ݧє  `aѤ _eBB%P0 vFp0[1~ã@0@ã0A p ڰB$34 ay )J2y4@2 FC@N! @@! AE PB"4X4qȥ"I (EA8M!JC R dIP@S*$SB( !E`T) R%"IP:(( " ET DL@P"2A:@QZ-D@R d0@QZ-Ēq$H $PL&$`A)IRSJb W' PEe"))AEy, )ɤQ,Y)9L@T'rX *(S*a8F#򐀊S!NQH@ A@  Ƣb1@ F`0Q@6 `0 Gd0 !` d0#a@1 p0 G#!@ QZ-Ēq$H $PL&$`A)IRSJb W' PEe"))AEy, )ɤQ,Y)9L@T'rX *(*͞>>>>>>>>>^*\j*h ͑ #> Æ*3Enter the number of the MDT60 cursor type you want.!͑ #>*#>*  0 - Block Cursor, Slow Blink!͑ #>9*7c 1 - Block Cursor, Fast Blink!C͑ #>|*zä 2 - Block Cursor, No Blink!͑ #>ý*#>*# 3 - Underline Cursor, Slow Blink!͑ #>*K# 4 - Underline Cursor, Fast Blink!'͑ #>d*bÐ! 5 - Underline Cursor, No Blink!n͑ #>é*#>* 6 - No Cursor!͑ #> *$# 7 - Reset to Block Slow and Exit!͑ #>!=*;#>"V*TÃ">7 - Leave Cursor As Is and Exit!`͑ #>#Ü*#>$ Your selection y; ! y#>%**T >!>&** ͈ 3>&>'>(F**D+ ͈ a>(>)>0>0*}ʲn*ʈD>1>2>2þ** ͑ "* ͑ 0* ͑ #>3R>4>5>5*(*& ͑ 7"*5 ͑ F1*D ͑ #>6R>7>8>8z*xÆ* ͑ Õ"* ͑ ä2* ͑ #>9R>@>A>A** ͑ "* ͑ 3* ͑ #>BR>C>D>D6*4B*@ ͑ Q"*O ͑ `4*^ ͑ #>ER>F>G>GÔ*à* ͑ ï"* ͑ þ5* ͑ #>HR>I>P>P** ͑ "*  ͑ 6* ͑ #>QR>R>S>SP*N\*Z ͑ k"*i ͑ z0*x ͑ #>T>UCopyright (C) 1979, By Topaz programming. All rights reserved. From here on protected by End User License.  >"Q ` >M K "Q ` >M M >M "Q ` >M >| !}o|gzt z>q 7z{ {!† !|>" 2!3:_!6: !:O> * ͼ J s#r ! ERROR IN INPUT, RE-ENTER PLEAS:#:Oy#!+ :; ??!4 NUMBER TO LARGE/SMAL̯2 +^ -_ >2`i" ! ʂ T])))0 ?ڐ _g :|/g}/o#* DM! Hȷ707 ڬ ?_))))Ú " :O *~ # ~,$ $ $ E~ +$ -$  #1  ~, # >01 ~,  ~,1 # "y2O>͂> O2!"2ڜ ʜ  ʲ   ʥ w :ʕ ~~#X >26:>À xX +~X xX +>> >X ͜ >##!> X >##:; ! K:O :; TOO MANY CHARECTERS. MAX IS 252!"2^#V" >!f * **~ ʉ ʤ #":2X ! ó>! * **6!"#":2җ >2× -ASCII FIL~ # #~#y#2 ~ 2 #~ ! 5 : y#!" ?2 "L O 2 ! 3! " ! ͘:!* H ~#.,-$*^+/&!\ƒ #~:O~#R N# 6~ʫ#á6#ë^"#:q:#**2H~2#~2#:H!I:O>[͢>]> :J=2J>2Jy#::I/2I=^"#q!d:# WARNING ONL:O#!:!͢ ERRO IN LINE*|0|0}0}0!>w~!4#y2 :O!@ ~> <O> > 2"zgOFx~yQ#6~#w~~ Q#6~O~ڄy #6#y*"|˜}˜qi!y2*ͯ~FO #6 w÷z  !@ 4 6 !a 4 6y2>>͂ 2?^#V!6!?>:>O:?ʠ!A Ž#~#^#VN#!A ¬~#¹"__{s+=r+=s+=!Ki> 2!D !8ó%BAD CHANNEL NUMBEÓKKKKKPÊ9BKKKKKKKK_#|¬*:"¾ʳ2"è!Ô:"#|*7>|2"2"*7|! "7__7:m\!ʳ>2:Œ\!³_<2!~ɀ&INPUT FILE REAtDocumentation for the MDT60 Cursor Controller program: MDT60M.BAS is an MBASIC program for controlling the cursor on the MDT60 terminal. To use, enter MBASIC MDT60M at the CP/M prompt. MDT60S.BAS is an SBASIC version of the same program for people who have friends who have a KAYPRO computer with an SBASIC compiler. MDT60.COM is MDT60S.BAS compiled on a KAYPRO'S SBASIC compiler. To use, enter MDT60 at the CP/M prompt. MDT60M.BAS and MDT60.COM both put a menu on the screen. From this menu, select the cursor you want. (Block: slow blink, fast blink, no blink; underline: slow blink, fast blink or no blink: or no cursor). Then run your program. For other terminals, make appropriate changes to the PRINT statements and rename the program. Tom Sarbeck. name>], print the file. 10 REM Program: MDT60.BAS By Tom Sarbeck June, 1985 20 REM 30 REM Controls the cursor type on the MDT60 terminal. Each selection 40 REM (1 thru 7) sends one control to the terminal. Some processors 50 REM may send their own controls and override those selected here. 60 REM 70 REM var branch=integer 80 PRINT CHR$(26) 90 PRINT"Enter the number of the MDT60 cursor type you want." 100 PRINT 110 PRINT" 0 - Block Cursor, Slow Blink" 120 PRINT" 1 - Block Cursor, Fast Blink" 130 PRINT" 2 - Block Cursor, No Blink" 140 PRINT 150 PRINT" 3 - Underline Cursor, Slow Blink" 160 PRINT" 4 - Underline Cursor, Fast Blink" 170 PRINT" 5 - Underline Cursor, No Blink" 180 PRINT 190 PRINT" 6 - No Cursor" 200 PRINT" 7 - Reset to Block Slow and Exit" 210 PRINT 220 PRINT">7 - Leave Cursor As Is and Exit" 230 PRINT 240 INPUT" Your selection";BRANCH 250 BRANCH = BRANCH+1 260 IF BRANCH < 1 THEN END 270 REM Leave As Is and Exit 280 IF BRANCH > 8 THEN END 290 REM Branch 300 ON BRANCH GOTO 320,350,380,410,440,470,500,530 310 REM Block Slow 320 PRINT CHR$(27);CHR$(34);CHR$(48) 330 GOTO 80 340 REM Block Fast 350 PRINT CHR$(27);CHR$(34);CHR$(49) 360 GOTO 80 370 REM Block Steady 380 PRINT CHR$(27);CHR$(34);CHR$(50) 390 GOTO 80 400 REM Underline Slow 410 PRINT CHR$(27);CHR$(34);CHR$(51) 420 GOTO 80 430 REM Underline Fast 440 PRINT CHR$(27);CHR$(34);CHR$(52) 450 GOTO 80 460 REM Underline Steady 470 PRINT CHR$(27);CHR$(34);CHR$(53) 480 GOTO 80 490 REM No Cursor 500 PRINT CHR$(27);CHR$(34);CHR$(54) 510 GOTO 80 520 REM Block Slow and Exit 530 PRINT CHR$(27);CHR$(34);CHR$(48) 540 END HR$(27);CHR$(34);CHR$(54) 510 GOTO 80 510 REM Program: MDT60.BAS By Tom Sarbeck June, 1985 20 REM 30 REM Controls the cursor type on the MDT60 terminal. Each selection 40 REM (1 thru 7) sends one control to the terminal. Some processors 50 REM may send their own controls and override those selected here. 60 REM 70 VAR BRANCH=INTEGER 80 PRINT CHR$(26) 90 PRINT"Enter the number of the MDT60 cursor type you want." 100 PRINT 110 PRINT" 0 - Block Cursor, Slow Blink" 120 PRINT" 1 - Block Cursor, Fast Blink" 130 PRINT" 2 - Block Cursor, No Blink" 140 PRINT 150 PRINT" 3 - Underline Cursor, Slow Blink" 160 PRINT" 4 - Underline Cursor, Fast Blink" 170 PRINT" 5 - Underline Cursor, No Blink" 180 PRINT 190 PRINT" 6 - No Cursor" 200 PRINT" 7 - Reset to Block Slow and Exit" 210 PRINT 220 PRINT">7 - Leave Cursor As Is and Exit" 230 PRINT 240 INPUT" Your selection";BRANCH 250 BRANCH = BRANCH+1 260 IF BRANCH < 1 THEN END 270 REM Leave As Is and Exit 280 IF BRANCH > 8 THEN END 290 REM Branch 300 ON BRANCH GOTO 320,350,380,410,440,470,500,530 310 REM Block Slow 320 PRINT CHR$(27);CHR$(34);CHR$(48) 330 GOTO 80 340 REM Block Fast 350 PRINT CHR$(27);CHR$(34);CHR$(49) 360 GOTO 80 370 REM Block Steady 380 PRINT CHR$(27);CHR$(34);CHR$(50) 390 GOTO 80 400 REM Underline Slow 410 PRINT CHR$(27);CHR$(34);CHR$(51) 420 GOTO 80 430 REM Underline Fast 440 PRINT CHR$(27);CHR$(34);CHR$(52) 450 GOTO 80 460 REM Underline Steady 470 PRINT CHR$(27);CHR$(34);CHR$(53) 480 GOTO 80 490 REM No Cursor 500 PRINT CHR$(27);CHR$(34);CHR$(54) 510 GOTO 80 520 REM Block Slow and Exit 530 PRINT CHR$(27);CHR$(34);CHR$(48) 540 END HR$(27);CHR$(34);CHR$(54) 510 GOTO 80 520 R* >0>0>0>0>0>0>0>0>0^*\Hj*ḧ́ Wx>0 Æ*H=Enter the number of the printing feature you desire. You may! Wx>0*H0>enter more than one control (e.g., 1 4 6 0 ! Wx>0I*GHÏ;to set corresponding mode print at 3 CPI for a max 48 CPL).!S Wx>0è*HWx>0*H 0 - Exit As You Have Set It! Wx>0*H( 1 - Correspondence Mode!  Wx>0A*?Hq% 2 - Data Processing Mode (Default)!K Wx>0Ê*HWx>0ã*H+ 3 - Pica type (10 CPI, 80 CPL. Default)! Wx>0*H" 4 - Elite type (12 CPI, 96 CPL)! Wx>08*6Hr/ 5 - Condensed type (17.1 CPI) [dp mode only]!B Wx>0 Ë*H. 6 - Double width (Half the current CPI/CPL)! Wx>0!*H4 (Caution: this halves the Characters per Line)! Wx>0"5*3HWx>0#N*LHÅ, 7 - Six lines per vertical inch (Default)!X Wx>0$Þ*H$ 8 - Eight lines per vertical inch! Wx>0%*HWx>0&*H=3 9 - Print a four-line test, max 29 char per line!  Wx>0'V*THÁ >9 - Reset to default and exit!` Wx>0(Ú*HWx>0)HW Your selectionWqWy͐ ! Wyx>00**͑ >00>01 **͑ 9>01À>02>03L*JHX*V̈́ Wx>04>05>06>06*}fʦ& f ʵ >07>08>08*H*̈́ 1*̈́ Wx>09R>0@>0A>0A#*!H/*-̈́ >0*<̈́ Wx>0BR>0C>0D>0Dr*pH~*|̈́ Wx>0ER>0F>0G>0Gò*Hþ*̈́ Wx>0HR>0I>0P>0P*H*̈́ Wx>0QR>0R>0S>0S2 *0 H> *< ̈́ Wx>0TR>0U>0V>0Vr *p H~ *| ̈́ Í 6* ̈́ Wx>0WR>0X>0Y>0Y * H * ̈́ 8* ̈́ Wx>0`R>0a>0a * H+ Mary had a little lamb;! Wx>0bD *B Hl Its fleece was white as snow.!N Wx>0cÅ * Hé Everywhere that Mary went! Wx>0d * H That damn lamb left a pile.! Wx>0eR>0f>0gCopyright (C) 1979, By Topaz programming. All rights reserved. From here on protected by End User License.  >" ͵ >ڮ ì " ͵ >® > !z z> 7z {! !|>" 2,!,͈:,_!-6: !,:0O>?* - -͟ 5 s#r; !A ` ERROR IN INPUT, RE-ENTER PLEAS:4x:4O0yx! 0:)͐ ??! ` NUMBER TO LARGE/SMAL̯27 +ʳ -´ >27`i" ! T])))0 ? _ü :7|/g}/o#* DM! Hȷ707  ?_)))) "n :,O_ **~ 1 #_ # ~,y y y E~T +y -y  #ʆ 1 ~,g # >0Æ ~,_ T p ~,† # "*y2,O>ʓO2)!-"*2,k 8R w`:2 ~;~#­ >2,6:1> xʭ +~;í xʭ +>;> ;>;í >#;x!,>?í >#;x:)Ð !s͠:4Oq:)Ð TOO MANY CHARECTERS. MAX IS 252)!-"*2,^#V">!*****~ #"*:,2,ҭ!>!*****6!-"*#"*:,2,>2,-ASCII FIL~+#;#~#yx\2p~`2o#~`;!o5`J:p\yx!w0?2"ʤ2!͈!"!:0!*~#.,-$*^+/&!\#~:0O~;#çN# 6~#6#^"#:-%:4x**.2~25#~26#:!t:4O>[;>];> ;:=2t>2yxk:/2k’^"#!0:4x WARNING ONL:4Ox0!0:6!0 ERRO IN LINE*5|0;|0;}0;}0;!3>w~B;!34#0;y20 q:0O! ~c> ;<jO> ;> ;23"zʼOFxy¦#6#w ¦#6O~ #6#y@*",|}qþ!-y2,@*F,O #6 w z% V V! 4 b6b! 4 b6y2>uq2^#V!!>:O:!A #~#^#VN#!A ~#"h__{[s+=gr+=gs+=Z!t> ڇ!D !%BAD CHANNEL NUMBEàà3$àààåÎ×àààààààà_x|*:w2w!.4:wOx|V*O7>|i2wO2wO*|! "__7:\!>2:\!_<2!~ɀ&INPUT FILE REAtDocumentation for OKI92/93 Printer Controller: OKI92M.BAS is an MBASIC program for controlling printing mode, character spacing and line spacing on the OKIDATA 92/93 printer. To use, enter MBASIC OKI92M at the CP/M prompt. OKI92S.BAS is an SBASIC version of the same program for people who have friends who have a KAYPRO computer with an SBASIC compiler. OKI92.COM is OKI92S.BAS compiled on a KAYPRO'S SBASIC compiler. To use, enter OKI92 at the CP/M prompt. OKI92M.BAS and OKI92.COM both put a menu on the screen. From this menu, select correspondence mode or data processing mode, character width (pica, elite or condensed, or one of these widths doubled), and vertical line spacing (6 or 8 lines per vertical inch). Then, from a word processor, from CP/M [TYPE ] or from PIP [LST:=], print the file. For other printers, make appropriate changes to the PRINT statements and rename the program. If you do double-space printing, consider changing the PRINT statement for the 9 option (currently a four-line printer test). Tom Sarbeck. UUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUU100 REM Program: OKI92M.BAS In MBASIC By Tom Sarbeck May, 1985 110 REM 120 REM Controls print options of the OKI92/93 printer. Each selection 130 REM (1 thru 9) sends one control to the printer. Some processors 140 REM may send their own controls and override those selected here. 150 REM 160 REM var branch=integer 170 PRINT CHR$(26) 180 PRINT"Enter the number of the printing feature you desire. You may" 190 PRINT"enter more than one control (e.g., 1 4 6 0 " 200 PRINT"to set corresponding mode print at 3 CPI for a max 48 CPL)." 210 PRINT 220 PRINT" 0 - Exit As You Have Set It" 230 PRINT" 1 - Correspondence Mode" 240 PRINT" 2 - Data Processing Mode (Default)" 250 PRINT 260 PRINT" 3 - Pica type (10 CPI, 80 CPL. Default)" 270 PRINT" 4 - Elite type (12 CPI, 96 CPL)" 280 PRINT" 5 - Condensed type (17.1 CPI) [dp mode only]" 290 PRINT" 6 - Double width (Half the current CPI/CPL)" 300 PRINT" (Caution: this halves the Characters per Line)" 310 PRINT 320 PRINT" 7 - Six lines per vertical inch (Default)" 330 PRINT" 8 - Eight lines per vertical inch" 340 PRINT 350 PRINT" 9 - Print a four-line test, max 29 char per line" 360 PRINT">9 - Reset to default and exit" 370 PRINT 380 INPUT " Your selection";BRANCH 390 IF BRANCH < 1 THEN END 400 IF BRANCH < 10 THEN GOTO 450 410 REM Reset to default and end 420 LPRINT CHR$(24); 430 END 440 REM Branch 450 ON BRANCH GOTO 470,500,530,560,590,620,650,680,700 460 REM Correspondence mode 470 LPRINT CHR$(27);CHR$(49); 480 GOTO 170 490 REM Data processing mode 500 LPRINT CHR$(27);CHR$(48); 510 GOTO 170 520 REM Ten CPHI 530 LPRINT CHR$(30); 540 GOTO 170 550 REM Twelve CPHI 560 LPRINT CHR$(28); 570 GOTO 170 580 REM Seventeen CPHI 590 LPRINT CHR$(29); 600 GOTO 170 610 REM Double width 620 LPRINT CHR$(31); 630 GOTO 170 640 REM Six LPVI 650 LPRINT CHR$(27);CHR$(54); 660 GOTO 170 670 REM Eight LPVI 680 LPRINT CHR$(27);CHR$(56); 690 GOTO 170 700 LPRINT "Mary had a little lamb;" 710 LPRINT "Its fleece was white as snow." 720 LPRINT "Everywhere that Mary went" 730 LPRINT "That damn lamb left a pile." 740 GOTO 170 750 END  was white as snow." 720 LPRINT "Everem Program: OKI92.BAS By Tom Sarbeck May, 1985 rem rem Controls print options of the OKI92/93 printer. Each selection rem (1 thru 9) sends one control to the printer. Some processors rem may send their own controls and override those selected here. rem var branch=integer 9 print #0; chr$(26) print #0; "Enter the number of the printing feature you desire. You may" print #0; "enter more than one control (e.g., 1 4 6 0 " print #0; "to set corresponding mode print at 3 CPI for a max 48 CPL)." print #0; print #0; " 0 - Exit As You Have Set It" print #0; " 1 - Correspondence Mode" print #0; " 2 - Data Processing Mode (Default)" print #0; print #0; " 3 - Pica type (10 CPI, 80 CPL. Default)" print #0; " 4 - Elite type (12 CPI, 96 CPL)" print #0; " 5 - Condensed type (17.1 CPI) [dp mode only]" print #0; " 6 - Double width (Half the current CPI/CPL)" print #0; " (Caution: this halves the Characters per Line)" print #0; print #0; " 7 - Six lines per vertical inch (Default)" print #0; " 8 - Eight lines per vertical inch" print #0; print #0; " 9 - Print a four-line test, max 29 char per line" print #0; ">9 - Reset to default and exit" print #0; input " Your selection";branch if branch < 1 then end if branch < 10 then goto 10 rem Reset to default and end print #1; chr$(24) end rem Branch 10 on branch goto 11,12,13,14,15,16,17,18,19 rem Correspondence mode 11 print #1; chr$(27);chr$(49) goto 9 rem Data processing mode 12 print #1; chr$(27);chr$(48) goto 9 rem Ten CPHI 13 print #1; chr$(30) goto 9 rem Twelve CPHI 14 print #1; chr$(28) goto 9 rem Seventeen CPHI 15 print #1; chr$(29) goto 9 rem Double width 16 print #1; chr$(31) goto 9 rem Six LPVI 17 print #1; chr$(27);chr$(54) goto 9 rem Eight LPVI 18 print #1; chr$(27);chr$(56) goto 9 19 print #1; "Mary had a little lamb;" print #1; "Its fleece was white as snow." print #1; "Everywhere that Mary went" print #1; "That damn lamb left a pile." goto 9 end s 1 *. "!!~{o~? !4* >2  # >2 \<{! _s# x *R|000 0xg" 1\ : (D~'(-  (˯A8 [0,('{(! wͯ ,(~'_A8[0>2 ,  ~('_ ( (\!* #" >2 o:\2: (D< X*e" :g2 !KW"e>D2g\2  : (,~˿/( -(A8 {0,(${(!  ,(~A8{0>2 !!     G!M-   )T]))08Åo0$ | /g}Do" " 'R!" Improper entry !$ G* ) [ S s#rx~[0-(/( y< #˯#~- yS A! 4~<(: ȯ2 * ͭ* DOF0G#8 #y * " ! 5(>2 >2  * ͷK ~ : w* ͷ: w2 2 * ͭDOF0G#8, ##y * : w#[ s#r#>w" (>2 >2  * ͷK ~2 ! : 2  * ͷ#~(S2 * ͷ##~(2 ++~o&ͷ#: (## * ͷ~2 * ͷ~o&ͷ##: (* ͷ~2 * ͭF#X~[ ( <~(2 ~ >  #: <2 > 2S * 6* #" K Bʃ;!" > 2|!: W~Ⱥ# N#F* B( C "+##* | | !" !" .R0x2 dR0x2 } 0gh" ! ~ #* 6 #" : <2 ?[ ~0: <2 #S >,2|) ^#VDM) !k ! 4~! (>2>2>22! [ ~#S >2 [ S !!]~# (!e>.~# (6" !ND"e!X"g2|\\<(!R R!!E* ~( N#[ !" bkK B0\(\*B~###{ ~O#WINDEX v2.0 (c) Eric Gans 05/22/85 (WINDEX ? for help) Indexes WS Doc fn.ft to fn.NDX fn.ft [*|#] * = keys in fn.KWD # = keys in file (^PP toggles) / searches no-break space (^O) Maximums: 254 keys, 9999 pages Index of File KWD File not found.Page offset -256 < 9999 (CR=0) >>You have reached the maximum of 254 keywords.Can't create index file. Enter keyword (CR ends) >> [More] ;;04-06-85 Eric Gans French Department UCLA Los Angeles, CA 90024 WINDEX.DOC v2.0 Version 2.0 update (05/22/85): A number of features have been added at the request of users, whom I thank for their interest. WINDEX now: - carries all-caps words into the index unaltered (Paul Foote) - permits a negative page offset (Simon Heifetz) - allows tagging keys within the text file with ^PP, and - allows indexing of strings (John-Mark Stensvaag) - allows indexing of (hard-)hyphenated words - uses entire free memory (max of about 11000 page references and a 17 K NDX file for a 60 K system -- e.g., Kaypro-10) The I/O has been speeded up (again), a bug or two corrected, and tabs replaced by spaces in the NDX file, plus a few minor changes. Version 1.2 update (4/6/85): Finds words divided by "soft" hyphens at the end or middle of the line; more efficient I/O for long index files. Version 1.1 update (4/3/85): Fixed bug in v1.0 that forgot to open file to be indexed (!) when keywords entered from console. (Thanks to B. Cardozo for catching this one.) ***** WINDEX creates indexes for Wordstar files written in document mode. It can be used to index a manuscript of any length, including books of up to 9999 pages, with a maximum of 254 keys. The keywords to be WINDEXed can be entered in three modes: 1. (windex [d:]fn.ft) Direct keyboard entry; you will be prompted at the console. The simplest approach for short indexes. 2. (windex [d:]fn.ft * NB: * replaces / used in previous versions) Keywords will be sought in a file fn.KWD on the same drive/user. In creating this file, you need only avoid hyphens and the exotic punctuation marks [\]^_` The character / may be used between words to index strings; it will be treated as the equivalent of a non-break space (^O) in the file. All other characters, including numbers, periods, commas, semicolons or blanks, are permitted as separators: the simplest way is to list the words with a CR after each. Hyphenated words may be indexed (this means that the program will not find indexed words that are contained in hyphenated groups: Big-Mac will not be found in a search for Mac); no other internal punctuation (e.g., apostrophes) is permitted. First or all letters may be capitalized and will remain so in the output (the search function won't pay attention to capitalization). You need not enter the words in order; the program will alphabetize them. The same criteria hold true if you prefer to enter your word list from the keyboard. 3. (windex [d:]fn.ft #) Keywords may be tagged in the file to be indexed. This allows you to create your index as you go along (duplicate entries will be discarded). ^P (entered as ^PP) must precede each keyword. To index strings, separate words by a non- break space (^O, entered as ^PO), which keeps the whole string on the same line. To end the index string, you may enter a second ^P, although any non-alphabetical character except - and ^O will suffice. The maximum string length permitted is 29 characters. The output file (on the same drive) will be fn.NDX. An approximate right margin of 65 will be adhered to; CR's will be added after each line and second and succeeding lines of index entries will be tabbed. This file can be edited with Wordstar and converted if you like to document mode (this doesn't seem appropriate for an index, however). If you have more than 254 keywords, you should divide them alphabetically into two or more groups. (ALPHA.COM will do this for you.) You can then combine the indexes later in alphabetical order using PIP or Wordstar's ^KR command. The current version of WINDEX allocates about 2/3 of the free memory to the page-reference buffer and about 1/3 for the NDX file. This allows (on a 60 K Kaypro-10) for about 17 K for the file and 34 K for the buffer, or about 11000 references at 3 bytes each. (This proportion is based on the fact that many references are multiple appearances on the same page that do not appear in the NDX file.) This should be enough for any normal use of the program (110 references/page in a 100-page manuscript!) In case you somehow do run out of memory, WINDEX will recognize when the CCP is overwritten and do a Warm Boot, but it doesn't check if you go even further. But long before you get to that point, you should divide your keyword list into smaller alphabetical groups and index them separately. As long as you keep the different indexes in alphabetical order (you'll also have to change their names if you keep them on the same disk), you can PIP them together with no internal editing save removal of a few headings. Page offset: You will be prompted for an offset between -255 and 9999 (default = 0). All page numbers will be increased by the offset. This feature allows you to index manuscripts that don't start at page 1 (say, chapters in a book). A negative offset may be used if page 1 is preceded by prefatory material; index entries that come before page 1 will be listed as "-#". Hyphens: Wordstar distinguishes between hard hyphens (those you enter yourself) and soft hyphens (entered for formatting purposes). WINDEX skips over soft hyphens, since they merely break words at the end of lines; hard hyphens are treated as letters in the keyword and in the file. This remains true even when they occur at the end of a line; the difference is that you entered them as part of a hyphenated word. String example: (Console or KWD file) The entry: blurk/zap/zlonk will search the string "blurk^Ozap^Ozlonk", which will appear in print as "blurk zap zlonk" (all words on the same line). To tag this string in your text file, it should appear on the screen as: "^Pblurk^Ozap^Ozlonk^P"; the second ^P can be replaced by a (normal) space. Features: - makes use of a binary tree for maximum search speed (5-6 seconds for a 40K file) - occupies less than 3K on disk Limitations: - won't recognize words with internal punctuation other than hyphens (apostrophes, accents, &c.) - only works with files saved in document mode (it needs this for its page-count feature) - all files (fn.ft, fn.KWD, fn.NDX) must be on same drive Warning: - WINDEX will create a new NDX file each time it is run and delete any previous file of the same name. You must rename old index files you want to save before rerunning the program. Trick: - You can rename an old NDX file as a KWD file, since the program won't notice the numbers following the entries. Before you do this, don't forget to delete the heading within the NDX file. ***************************************************************** ALPHA.COM v1.0 In order to facilitate finding keywords in your files, I have included my word-sorting program ALPHA in this library. This program uses a binary tree to sort all the words in a file in alphabetical order and gives the number of times (up to 256) each is used (words used more than 255 times will wrap around; this may be changed in a future version but isn't very important for our purposes here.) Entering a / after the filename (i.e., entering: alpha fn.ft /) will limit the word list to capitalized words. Many of these will be The or This, but you will also find all the proper names in your file. ALPHA doesn't create a separate file, but you can print it out (use CP/M ^P, or if you have a Kaypro, my PRINT or BIOSP print-screen patch in EGKTEN.LBR). ALPHA allows internal apostrophes, but not hyphens. (I didn't allow for apostrophes in WINDEX since when you write an index you usually want to include possessives under the possessor: if you are indexing "Smith," you want instances of "Smith's" to be included, not listed separately.) Note to the user: Version 2.0 contains several enhancements suggested by users. If you can think of anything else you'd like to see, let me know--we aim to please. Possibilities: - allowing numbers, etc. in index words - freer string entry options - ???  CATALOG X-REFERENCE PGM v3.6 - 09/01/82 Do you want to include any ".FRE" files? (Y/N): Do you want hard copy instead of a file? (Y/N): Do you want tear tabs to use roll paper? (Y/N): Number of spaces to augment left margin? (0-9): Current date is: Start at page : Quit at page : ++ UNABLE TO OPEN MAST.CAT ++ ** READING MAST.CAT ** ++ READ ERROR OR EARLY EOF ++ ++ MAST.CAT FILE TOO LONG. LAST ENTRY THIS SECTION: " " WORKING ON NEXT SECTION ** WRITING OUTPUT FILE ** ++ UNABLE TO MAKE OUTPUT FILE ++ ++ DISK OR DIRECTORY FULL ++ DONE: 0 FILE NAMES 1 UNIQUE NAMES ++ PROGRAM ABORTED ++ - Master Catalog as of Page 1 1 - -  MAST CAT MAST LST"b1 ! _Y"2w! ! "! "ͤ  ͥ> ":c>2*}o|g ! ͛ :!"#":>*k<2:*:] :e !\ 2h5.!>22d ʳq :C*"#"*z>{>:2<2>:  > <2> * *#"*z { :>2k"*'2* ! ">2ͤ c!~4Uw!M ~:[2 [xs> }+> wͼ >ͼ !#~ ‡+®+ ”2! !#~ ¸++ 2! ! :W6#|\!.L**(%# :% C\\ ! !M ![ !u :> *:ʜ6#<ÐY  .% ,% % ¥ ::[ͼ _a~#)))) !~  >0 ' !` _Y 2! E ! 1p :p 0!|G> w#h ! ! ! ʦ ” iÁ w#x#ځ {sÁ ! ! !  i÷ w#xڷ {s÷ ! ! !   i w#x {s !  *|8 !dL! ~#"! Yx >!2>2! "!!"" "I !""R ! > > :<26ڄ !   : _: Y ! "<2*w#"~ͼ # ~ͭ # > ͼ > ͼ > ͭ > ͭ :& :́!| ::<26د2 ! Ͳ! \!.LFILE : XCAT36 DATE : 01 SEPT 82 TOPIC : HOW TO USE XCAT36 uses the CP/M catalog file called MAST.CAT. It makes a new cross-reference file which it can then immediately print in paginated format, or can put the new file directly to disk. It loads in as much of MAST.CAT as available memory permits, then rearranges the file in a cross-reference manner so duplicate copies of the same program show what disks they are on. Here is a small sample: CAT .ASM - 106 CAT .COM - 033 034 092 093 106 123 147 CAT .DOC - 033 034 106 CAT2 .COM - 033 034 CATALOG .HLP - 051 CBAS2 .COM - 031 032 040 CCP .ASM - 059 CCP .DOC - 059 CHECKERS.BAS - 082 Among other things this allows you to quickly determine how many copies of each file you have, and delete unneeded extra copies. Up to ten disk ID numbers are shown per line. If more exist, a new line is started to continue the numbering. XCAT36 uses only disk volume numbers and discards any disk volume names that might be on the same line. This can affect the sequence in which the volume numbers are displayed. There is a simple remedy for this -- do not put volume names on the same line as the volume number. Here is an alternate possibility: A>SAVE 0 B:-.023 A>SAVE 0 B:-EDITORS A>SAVE 0 B:-08AUG82 All three of these examples may be placed on the same disk to give additional information. They use no disk space at all, but do use disk file names (slightly reducing the number of available remaining names.) XCAT36 paginates when printing to the list device. It asks several questions for the operator to answer: Do you want to include any '.FRE' files? (Y/N): (1) Do you want hard copy instead of a file? (Y/N): (2) Do you want tear tabs to use roll paper? (Y/N): (3) Number of spaces to augment left margin? (0-9): (4) Current date is: (5) Start on page : (6) Stop on page : (7) 1) User option of including 'space remaining' lines added by NCAT 2) Any key other than 'Y' makes a disk file instead of printing 3) A 'Y' puts tear tabs for roll paper every 11 inches, any other key defaults to fanfold paper with no tear tabs 4) A RET leaves the left margin at the normal position 5) A RET leaves the date area blank 6) A RET starts on page 1 7) A RET prints all remaining pages Not all printers have adjustable left margins. You can readily insert up to 9 extra spaces, faking an adjustable left margin. Any number of file names may be handled by XCAT36. With a 64k system using a typical size BIOS, around 3200 names may be handled each pass. It can handle up to 999 pages on the pagination before it starts over. This should handle at least 50,000 file names. XCAT36 is based on a 1979 program by Lewis Moseley called CROSSREF. (This was called CRSREF on the Compuserve system which limits names to six chars.) It did not offer hard copy print. It was limited to only the number of file names that could be held in memory at one time. If too many for the available memory size, it just bombed CP/M by over- writing BDOS with no warning. It also was very slow, taking as long as 15 minutes to process the maximum length file it could handle. (XCAT36 takes about one minute to handle a file with 3000 names.) XCAT36 also shows the total number of files handled as well as the number of "unique file names", since a great many of the total number are duplicates. This information gives the true count of different files in the catalog. Irvin M. Hoff Los Altos Hills, CA 94022NOTES: FOR QUICKIE DOCUMENTATION ON MDSETCOM.COM, JUST TYPE IT! TYPE SETCOM.COM WILL ACTUALLY TYPE OUT A BRIEF (EMBEDDED) DOC FILE. TRY IT.