image of READY prompt

Wang2200.org

Listing of file='@TBLEDIT' on disk='vmedia/printer_driver_editor.wvd.zip'

# Sector 97, program filename = '@TBLEDIT', protected file
0010 REM ! @TBLEDIT 07/15/87 (c) Wang, Laboratories, Inc. 1986
0025 %! *******  COMPANY  CONFIDENTIAL  *******
0030 % ---------------------------------------
0040 %    Program Name = @TBLEDIT
0050 %          Author = Steve McGarry
0060 %    Date Written = 05 November 1985
0070 %    Last Revised = 29 January 1987
0080 % ---------------------------------------
0090 %
0100 REM % VARIABLE DEFINITIONS
0110 COM D$3,F$8
   : REM - DISK ADDRESS & NAME OF FILE BEING WORKED ON
0120 DIM V$8
   : V$="02.00.02"
   : REM - VERSION NUMBER
0130 DIM S0$(256)1,S0,S1
   : REM - SECTOR WORK ARRAY, NUMBER OF SECTOR IN MEMORY & BYTE POSITION IN TH
     E ARRAY
0140 DIM C,C1,C0$(258)3,C1$(258)28
   : REM - CHARACTER TRANSLATE TABLE WORK VARIABLES, INDEX & STRINGS
0150 DIM E0,E1,E0$(45)3,E1$(49)28
   : REM - ESCAPE CODE TRANSLATE TABLE WORK VARIABLES, INDEX & STRINGS
0155 DIM E2$3,E2,E2$(5)2
   : REM - PRINTER INCREMENTS PER INCH & PITCH SUFFIXES
0160 DIM H$2,H1$14
   : REM - HEX PACK/UNPACK WORK VARIABLES
0170 DIM K$1
   : REM - KEYIN BYTE
0180 DIM B,E,U,S
   : REM - FILE POINTERS; B=BEGINNING, E=END, U=USED, S=STATUS
0190 DIM W0$3,W1$3,W0
   : REM - CONTROL WORD VALUE, WORK VARIABLE & NUMBER
0200 DIM M0$(10)78,M$40,M,M0,M1,M2
   : REM - MENU ARRAY, MESSAGE & MENU WORK VARIABLES
0210 DIM I0$(1)80,I0$1,I1$80,I0,I1,I2,I3
   : REM - VARIABLES FOR ACCEPTING A FIELD
0220 DIM K,J,I
   : REM - FOR...NEXT LOOP COUNTERS
0230 DIM K0
   : REM - FIELD BEING EDITED
0240 DIM H0$40
   : REM - HEX FIELD VALIDATION WORK VARIABLE
0250 DIM I$80,F
   : REM - MODIFICATION TEST VARIABLES
0260 DIM T$2,T0$3
   : REM - TABLE ID BYTES (FIRST 2 BYTES OF FIRST SECTOR) & OUTPUT FORMAT FIEL
     D
0270 REM .Printer table 1st sector bytes 1-2 describe version
   : REM = 6911 @....V01  6A11 @....V02
   : REM .hhhh = C0 Length of CTT
   : REM .hhhh = E0 Length of ETT
0280 REM .CTT data for C0$(C9)3  eg. 00 FF 01 thru 00 02 BC
   : REM .CTT data for C1$(C9)28  eg.
0300 REM % INITIALIZE EVERYTHING
0310 S0=-1
   : REM - FORCE INITIAL LOAD OF SECTOR
0320 E2$="000"
   : REM - DEFAULT PRINTER INCREMENTS PER INCH
0330 F=0
   : REM - RESET "DATA MODIFIED" FLAG
0400 REM % MAIN MENU
0410 SELECT PRINT /005
   : PRINT HEX(020D0C030F)
0420 PRINT HEX(0306);TAB(14);"GENERALIZED PRINTER DRIVER TRANSLATION TABLE EDI
     TOR"
   : PRINT TAB(20);"(c) Copr. Wang Laboratories, Inc. 1986"
   : PRINT TAB(20);"Release ";V$;" - Company Confidential"
   : REM - TITLE & VERSION NUMBER
0430 PRINT AT(4,0);HEX(0E);"Select an item and press RUN/EXEC:"
   : REM - PROMPT
0440 GOSUB '201(M$)
   : REM - DISPLAY MESSAGE
0450 PRINT AT(22,50);HEX(0E);"RUN/EXEC    - Proceed";AT(23,50);"CANCEL/EDIT -
     Previous Menu";HEX(01)
   : REM - KEY DEFINITIONS
0460 RESTORE LINE460
   : DATA 3,"Prefill Translation Tables","Edit Translation Tables","Write Tran
     slation Tables to Disk"
   : REM - MENU DATA (COUNT FOLLOWED BY STRINGS)
0470 GOSUB '200
   : REM - PROCESS THE MENU DATA (RETURNS PICK # IN M2 - 0=CANCEL/EDIT)
0480 ON M2GOTO 510,1020,2010
   : REM - BRANCH TO PREFILL, EDIT OR WRITE ROUTINES
0485 IF F=0THEN 490
   : GOSUB '201("Changes were not saved, exit (Y/N)?")
   : PRINT HEX(07)
   : GOSUB '204
   : GOSUB '201(" ")
   : IF K$="N"THEN 420
   : REM - CANCEL PRESSED; PROMPT USER IF TABLES CHANGED BUT NOT SAVED
0490 COM CLEAR
   : GOSUB '201("(Returning to System Menu)")
   : $PSTAT=" "
   : LOAD DC T"@MENU"
   : END
   : REM - THAT'S ALL FOLKS!!!
0500 REM %^PREFILL SELECTED; LOAD ALL TABLES FROM A FILE
0510 IF F=0THEN 515
   : GOSUB '201("Changes were not saved, prefill (Y/N)?")
   : PRINT HEX(07)
   : GOSUB '204
   : GOSUB '201(" ")
   : IF K$="N"THEN 420
   : REM - PROMPT USER IF TABLES CHANGED BUT NOT SAVED
0515 PRINT HEX(020402040F);AT(16,0);"Enter drive:     ";HEX(0E);STR(D$);HEX(0F
     );AT(17,0);"Enter file name: ";HEX(0E);STR(F$);HEX(020402000F)
   : REM - DISPLAY FIELDS
0520 PRINT AT(21,50);HEX(0E);"RETURN      - Next Field";AT(23,50);"CANCEL/EDIT
      - Cancel Prefill";HEX(01)
   : REM - UPDATE KEY DEFINITIONS
0530 M$=" "
   : GOSUB '202(16,17,D$,3,"H",HEX(F0))
   : D$=I0$(1)
   : IF K$=HEX(F0)THEN 420
   : REM - ACCEPT DISK ADDRESS
0535 GOSUB '201(" ")
   : IF VER(D$,"HHH")=3THEN 536
   : GOSUB '201("Disk address must be 3 hex digits")
   : PRINT HEX(07)
   : GOTO 530
   : REM - YELL AT HIM IF INVALID ADDRESS
0536 IF K$=HEX(82)THEN 550
   : REM - RUN/EXEC PRESSED?
0540 GOSUB '202(17,17,F$,8,"X",HEX(F0))
   : F$=I0$(1)
   : ON POS(HEX(20F0)=K$)GOTO 530,420
   : REM - ACCEPT FILE NAME
0550 GOSUB '201(" ")
   : SELECT #1<D$>
   : ERRORGOSUB '255
   : GOTO 530
   : REM /SELECT THE DISK
0560 LIMITS T#1,F$,B,E,U,S
   : ERRORGOSUB '255
   : GOTO 530
   : REM / FIND THE FILE
0570 IF S=2THEN 580
   : IF S=0THEN GOSUB '201("File not found")
   : ELSE GOSUB '201("File is not an active data file")
   : M$=" "
   : PRINT HEX(07)
   : GOTO 540
0580 DATA LOAD BA T#1,(B)S0$()
   : T$=STR(S0$(),,2)
   : IF T$=HEX(6911)OR T$=HEX(6A11)THEN 585
   : GOSUB '201("File is not a printer table")
   : M$=" "
   : PRINT HEX(07)
   : GOTO 540
   : REM / Read 1st Sector & Yell if it isn't a printer driver table
0585 IF T$=HEX(6A11)THEN T=10
   : ELSE T=0
   : REM - SET RELEASE 3.0 OFFSET IF 3.0 TABLE
0588 IF T$=HEX(6A11)THEN C9=258
   : ELSE C9=256
   : REM /.Length of CTT table
0590 C0=VAL(STR(S0$(),3,2),2)
   : E0=VAL(STR(S0$(),5,2),2)
   : REM - GET LENGTH OF CTT & ETT
0600 C1$(),E1$(),E2$()=" "
   : REM - INITIALIZE TABLES
0605 F=0
   : REM - RESET "DATA MODIFIED" FLAG
0610 REM % LOAD THE CTT INDEX
0620 GOSUB '201("(Loading the Character Table)")
   : FOR K=1TO C9
   : GOSUB '100(K)
   : C0$(K)=W0$
   : NEXT K
   : REM - KEEP THE USER HAPPY & LOAD THE CTT INDEX
0630 REM % LOAD THE CTT STRINGS
0640 FOR K=1TO C9
   : REM - START LOOP
0650 IF STR(C0$(K),2,1)=HEX(FF)THEN HEXUNPACKSTR(C0$(K),3,1)TO C1$(K)
   : REM - 1-BYTE REPLACEMENT
0660 IF STR(C0$(K),2,1)=HEX(0F)THEN C1$(K)=" "
   : REM - NOT SUPPORTED
0670 IF STR(C0$(K),2,1)=HEX(FF)OR STR(C0$(K),2,1)=HEX(0F)THEN 710
   : REM - JUMP IF STRING ALREADY DETERMINED
0680 W0=VAL(STR(C0$(K),2,2),2)+1
   : GOSUB '100(W0)
   : REM - LOAD FIRST WORD OF TRANSLATION STRING (FIRST BYTE IS STRING LENGTH)
0690 FOR J=1TO VAL(STR(W0$,,1))
   : HEXUNPACKSTR(W0$,MOD(J-1,2)+2,1)TO STR(C1$(K),(J-1)*2+1,2)
   : IF MOD(J,2)<>0THEN 700
   : W0=W0+1
   : GOSUB '100(W0)
   : REM - LOAD THE TRANSLATION STRING
0700 NEXT J
   : REM - LOOP THROUGH THE STRING
0710 NEXT K
   : REM - LOOP THROUGH THE CTT INDEX
0720 REM % LOAD THE PRINTER INCREMENTS/INCH & THE PITCH TRANSLATION SUFFIXES
0730 GOSUB '100(C0+1)
   : E2=VAL(STR(W0$,2,2),2)
   : CONVERT E2TO E2$,(###)
   : FOR K=1TO 5
   : GOSUB '100(C0+K+1)
   : IF STR(W0$,3,1)<>HEX(00)THEN HEXUNPACKSTR(W0$,3,1)TO E2$(K)
   : NEXT K
   : REM - LOAD THE INCREMENTS/INCH & THE PITCH TRANSLATION SUFFIXES
0740 REM % LOAD THE ETT INDEX
0750 GOSUB '201("(Loading the Escape Sequence Table)")
   : FOR K=1TO 35+T
   : GOSUB '100(C0+K+6)
   : E0$(K)=W0$
   : NEXT K
   : REM - KEEP THE USER HAPPY & LOAD THE ETT INDEX
0760 REM % LOAD THE ETT STRINGS
0770 FOR K=1TO 35+T
   : REM - START LOOP
0780 IF E0$(K)=HEX(000000)THEN 820
   : REM - BRANCH IF NULL POINTER (NOT SUPPORTED)
0790 W0=VAL(STR(E0$(K),2,2),2)+C0+1
   : GOSUB '100(W0)
   : REM - LOAD FIRST WORD OF TRANSLATION STRING (FIRST BYTE IS STRING LENGTH)
0800 FOR J=1TO VAL(STR(W0$,,1))
   : HEXUNPACKSTR(W0$,MOD(J-1,2)+2,1)TO STR(E1$(K),(J-1)*2+1,2)
   : IF MOD(J,2)<>0THEN 810
   : W0=W0+1
   : GOSUB '100(W0)
   : REM - LOAD THE TRANSLATION STRING
0810 NEXT J
   : REM - LOOP THROUGH THE STRING
0820 NEXT K
   : REM - LOOP THROUGH THE ETT INDEX
0900 REM % MAP THE CHARACTERS X'0E' & X'0F' TO ENABLE/DISABLE ENHANCED MODE
0910 E1$(46)=C1$(15)
   : REM - X'0E'
0920 E1$(47)=C1$(16)
   : REM - X'0F'
0930 REM % MAP THE CHARACTER X'7F' TO CLEAR BUFFER
0935 E1$(49)=C1$(128)
   : REM - X'7F'
0950 M$="Tables loaded from "&F$&" on "&D$
   : GOTO 420
   : REM - SET MESSAGE & RE-DISPLAY THE MAIN MENU
1000 REM %^EDIT SELECTED; EDIT THE CHARACTER TABLE AND THE ESCAPE CODE TABLE
1010 REM % FLAG THE NON-MODIFIABLE FIELDS
1020 FOR K=1TO 7
   : C1$(K)="(Reserved)"
   : NEXT K
   : REM - X'00' thru X'06'
1030 C1$(10),C1$(12),C1$(15),C1$(16),C1$(128)=C1$(1)
   : REM - X'09', X'0B', X'0E', X'0F' and X'7F' (REVERSE LINEFEED CODE REMOVED
     )
1040 FOR K=130TO 144
   : C1$(K)=C1$(1)
   : NEXT K
   : REM - X'81' thru X'8F'
1045 REM % EDIT THE CHARACTER TRANSLATION TABLE
1050 PRINT HEX(0306);TAB(14);"GENERALIZED PRINTER DRIVER TRANSLATION TABLE EDI
     TOR"
   : PRINT TAB(26);"Character Translation Table"
   : REM - CHARACTER SCREEN TITLE
1060 PRINT AT(4,0);HEX(0E);"Make modifications and press RUN/EXEC or CANCEL/ED
     IT:"
   : REM - PROMPT
1070 PRINT HEX(0E);AT(17,0);"NOTE: A blank field indicates that";AT(18,6);"cha
     racter is not supported."
1080 PRINT AT(17,50);HEX(0E);"RETURN      - Next Field";AT(18,50);"FN/TAB
      - Previous Field";AT(19,50);"SF'5/NEXT   - Next Screen";AT(20,50);"SF'6/
     PREV   - Previous Screen";
   : REM - KEY DEFINITIONS
1090 PRINT AT(21,50);"SF'15/GOTO  - Find Character";AT(22,50);"RUN/EXEC    - E
     scape Table";AT(23,50);"CANCEL/EDIT - End of Edit";HEX(01)
   : REM - MORE KEY DEFINITIONS
1100 P=0
   : REM - START AT THE BEGINNING UPON ENTRY
1110 K0=P
   : REM - SET FIELD LOCATION
1120 PRINT HEX(06);HEX(020402040F);
   : REM - SET ATTRIBUTES TO BRIGHT/UNDERSCORE
1130 FOR K=PTO P+7
   : K$=BIN(K)
   : PRINT AT(7+K-P,0);
   : IF K>15THEN PRINT K$;
   : ELSE PRINT " ";
   : PRINT " ";HEXOF(K$);" - ";HEX(0E);
   : PRINT STR(C1$(K+1));HEX(0F)
   : NEXT K
   : REM - DISPLAY FIRST HALF OF CURRENT PAGE
1140 FOR K=P+8TO P+15
   : K$=BIN(K)
   : PRINT AT(K-P-1,45);
   : IF K>15THEN PRINT K$;
   : ELSE PRINT " ";
   : PRINT " ";HEXOF(K$);" - ";HEX(0E);STR(C1$(K+1));HEX(0F)
   : NEXT K
   : REM - DISPLAY SECOND HALF OF CURRENT PAGE
1150 PRINT HEX(020402000F)
   : REM - SET ATTRIBUTES BACK TO BRIGHT
1160 K=K0
   : REM - GET FIELD BEING EDITED
1170 PRINT AT(21,0,40)
   : REM - ERASE SF'15 PROMPT
1180 I1=K-P-1
   : IF K-P<8THEN I1=I1+8
   : I0$="H"
   : IF C1$(K+1)=C1$(1)THEN I0$=HEX(00)
   : GOSUB '202(I1,INT((K-P)/8)*45+7,C1$(K+1),28,I0$,HEX(F0054306420F7E))
   : GOSUB '205(C1$(K+1))
   : C1$(K+1)=I0$(1)
   : REM - GET FIELD (KEYS; CANCEL '5/NEXT '6/PREV '15 TAB)
1185 GOSUB '203(I0$(1))
   : IF M$<>" "THEN 1180
   : REM - VALIDATE FIELD & BRANCH IF ERROR MESSAGE WAS DISPLAYED
1190 ON POS(HEX(F0054306420F7E2082)=K$)GOTO 420,1200,1200,1210,1210,1215,1230,
     1240,1250
   : GOTO 1180
   : REM - PROCESS CANCEL, '5, NEXT, '6, PREV, '15, FN/TAB, RETURN AND RUN/EXE
     C
1200 P=MOD(P+16,256)
   : IF P=0THEN 1300
   : GOTO 1110
   : REM - '5/NEXT PRESSED
1210 P=MOD(P-16,256)
   : IF P=240THEN 1300
   : GOTO 1110
   : REM - '6/PREV PRESSED
1215 I0$(1)="00"
   : REM - SF'15 PRESSED; SET DEFAULT FIELD VALUE
1220 PRINT AT(21,0);"Enter character code:"
   : GOSUB '202(21,22,I0$(1),2,"H",HEX(F0))
   : GOSUB '201(" ")
   : IF K$=HEX(F0)THEN 1170
   : IF VER(I0$(1),"HH")=2THEN 1225
   : GOSUB '201("Field must contain 2 hex digits.")
   : PRINT HEX(07)
   : GOTO 1220
   : REM - GET ENTRY & VALIDATE IT
1225 HEXPACKH$FROMI0$(1)
   : K0=VAL(H$)
   : P=K0-MOD(K0,16)
   : GOTO 1120
   : REM - MOVE TO THE ENTRY REQUESTED
1230 K=K-1
   : IF K<PTHEN K=P+15
   : GOTO 1180
   : REM - FN/TAB PRESSED; DECREMENT FIELD POINTER
1240 K=K+1
   : IF K>P+15THEN K=P
   : GOTO 1180
   : REM - RETURN PRESSED; INCREMENT FIELD POINTER
1250 GOTO 1500
   : REM - RUN/EXEC PRESSED; BRANCH TO ESCAPE CODE TABLE EDITOR
1290 REM %.Edit CTT items 257 and 258
1300 PRINT AT(5,0,1080);HEX(020402040F);AT(7,12);"Select Underscore hex value
     ";HEX(0E);STR(C1$(257),,2);HEX(0F);AT(8,12);"Select Overstrike hex value
     ";HEX(0E);STR(C1$(258),,2);HEX(0F)
   : REM - CTT items 257 and 258
1310 P=257
   : I1=7
   : GOTO 1330
1315 IF P=258THEN 1310
1320 P=258
   : I1=8
1325 REM .Exits F0=Edit  05=Down  43=Down  06=Up  42=Up 7E=TAB
1330 GOSUB '202(I1,40,C1$(P),2,"H",HEX(F0054306427E))
   : GOSUB '203(I0$(1))
   : IF M$<>" "THEN 1330
   : C1$(P)=I0$(1)
   : ON POS(HEX(F00F7E2082)=K$)GOTO 420,1215,1315,1315,1250
1340 PRINT AT(7,0,8*80)
   : ON POS(HEX(05430642)=K$)GOTO 1350,1350,1360,1360
1350 P=0
   : GOTO 1110
1360 P=240
   : GOTO 1110
1495 REM % EDIT THE ESCAPE SEQUENCE TRANSLATION TABLE
1500 PRINT HEX(0306);TAB(14);"GENERALIZED PRINTER DRIVER TRANSLATION TABLE EDI
     TOR"
   : PRINT TAB(23);"Escape Sequence Translation Table"
   : REM - ESCAPE CODE SCREEN TITLE
1510 PRINT AT(4,0);HEX(0E);"Make modifications and press RUN/EXEC or CANCEL/ED
     IT:"
   : REM - PROMPT
1520 PRINT HEX(0E);AT(18,0);"NOTE: A blank field indicates that";AT(19,6);"esc
     ape sequence is not supported."
1530 PRINT AT(18,50);HEX(0E);"RETURN      - Next Field";AT(19,50);"FN/TAB
      - Previous Field";AT(20,50);"SF'5/NEXT   - Next Screen";AT(21,50);"SF'6/
     PREV   - Previous Screen";
   : REM - KEY DEFINITIONS
1540 PRINT AT(22,50);"RUN/EXEC    - Character Table";AT(23,50);"CANCEL/EDIT -
     End of Edit";HEX(01)
   : REM - MORE KEY DEFINITIONS
1549 REM %.ETT #1-1
1550 PRINT AT(5,0,1040);HEX(020402040F);AT(6,11);"Enable  Superscript Mode . .
      ";HEX(0E);STR(E1$(13));HEX(0F);AT(7,11);"Disable Superscript Mode . . ";
     HEX(0E);STR(E1$(14));HEX(0F)
   : REM - ESCAPE TABLE SCREEN #1-1
1560 PRINT AT(9,11);"Enable  Subscript Mode . . . ";HEX(0E);STR(E1$(15));HEX(0
     F);AT(10,11);"Disable Subscript Mode . . . ";HEX(0E);STR(E1$(16));HEX(0F)
   : REM - ESCAPE TABLE SCREEN #1-2
1570 PRINT AT(12,11);"Enable  Enhanced Mode  . . . ";HEX(0E);STR(E1$(46));HEX(
     0F);AT(13,11);"Disable Enhanced Mode  . . . ";HEX(0E);STR(E1$(47));HEX(0F
     )
   : REM - ESCAPE TABLE SCREEN #1-4
1580 PRINT AT(15,11);"Enable  Proportional Spacing ";HEX(0E);STR(E1$(30));HEX(
     0F);AT(16,11);"Disable Proportional Spacing ";HEX(0E);STR(E1$(31));HEX(0F
     )
   : REM - ESCAPE TABLE SCREEN #1-3
1583 K0=1
   : REM - RESET FIELD COUNTER
1584 ON K0GOSUB 1590,1591,1592,1593,1594,1595,1596,1597
   : REM - PROCESS THE CURRENT FIELD
1585 GOSUB '203(I0$(1))
   : IF M$<>" "THEN 1584
   : REM - VALIDATE FIELD & BRANCH IF ERROR MESSAGE WAS DISPLAYED
1586 ON POS(HEX(F005430642827E)=K$)GOTO 420,1600,1600,1750,1750,1020,1588
   : REM - CANCEL, '5/NEXT, '6/PREV, RUN, TAB
1587 K0=K0+1
   : IF K0>8THEN K0=1
   : GOTO 1584
   : REM - ADVANCE TO NEXT FIELD
1588 K0=K0-1
   : IF K0<1THEN K0=8
   : GOTO 1584
   : REM - BACK UP TO PREVIOUS FIELD
1590 GOSUB '202(6,40,E1$(13),28,"H",HEX(F0054306427E))
   : GOSUB '205(E1$(13))
   : E1$(13)=I0$(1)
   : RETURN
   : REM - ACCEPT ENABLE SUPERSCRIPT MODE
1591 GOSUB '202(7,40,E1$(14),28,"H",I1$)
   : GOSUB '205(E1$(14))
   : E1$(14)=I0$(1)
   : RETURN
   : REM - ACCEPT DISABLE SUPERSCRIPT MODE
1592 GOSUB '202(9,40,E1$(15),28,"H",I1$)
   : GOSUB '205(E1$(15))
   : E1$(15)=I0$(1)
   : RETURN
   : REM - ACCEPT ENABLE SUBSCRIPT MODE
1593 GOSUB '202(10,40,E1$(16),28,"H",I1$)
   : GOSUB '205(E1$(16))
   : E1$(16)=I0$(1)
   : RETURN
   : REM - ACCEPT DISABLE SUBSCRIPT MODE
1594 GOSUB '202(12,40,E1$(46),28,"H",I1$)
   : GOSUB '205(E1$(46))
   : E1$(46)=I0$(1)
   : RETURN
   : REM - ACCEPT ENABLE ENHANCED MODE
1595 GOSUB '202(13,40,E1$(47),28,"H",I1$)
   : GOSUB '205(E1$(47))
   : E1$(47)=I0$(1)
   : RETURN
   : REM - ACCEPT DISABLE ENHANCED MODE
1596 GOSUB '202(15,40,E1$(30),28,"H",I1$)
   : GOSUB '205(E1$(30))
   : E1$(30)=I0$(1)
   : RETURN
   : REM - ACCEPT ENABLE PROPORTIONAL SPACING
1597 GOSUB '202(16,40,E1$(31),28,"H",I1$)
   : GOSUB '205(E1$(31))
   : E1$(31)=I0$(1)
   : RETURN
   : REM - ACCEPT ENABLE PROPORTIONAL SPACING
1599 REM %.ETT #2-1
1600 PRINT AT(5,0,1040);HEX(020402040F);AT(8,15);"Select Pitch String ";HEX(0E
     );STR(E1$(21));HEX(0F)
   : REM - ESCAPE TABLE SCREEN #2-1
1610 PRINT AT(10,15);"Pitch Selection Codes:";AT(10,45);"   5 Pitch ";HEX(0E);
     STR(E2$(1));HEX(0F);AT(11,45);"  10 Pitch ";HEX(0E);STR(E2$(2));HEX(0F)
   : REM - ESCAPE TABLE SCREEN #2-2
1620 PRINT AT(12,45);"  12 Pitch ";HEX(0E);STR(E2$(3));HEX(0F);AT(13,45);"  15
      Pitch ";HEX(0E);STR(E2$(4));HEX(0F);AT(14,45);"16.5 Pitch ";HEX(0E);STR(
     E2$(5));HEX(0F)
   : REM - ESCAPE TABLE SCREEN #2-3
1623 K0=1
   : REM - RESET FIELD COUNTER
1624 ON K0GOSUB 1630,1631,1632,1633,1634,1635
   : REM - PROCESS THE CURRENT FIELD
1625 GOSUB '203(I0$(1))
   : IF M$<>" "THEN 1624
   : REM - VALIDATE FIELD & BRANCH IF ERROR MESSAGE WAS DISPLAYED
1626 ON POS(HEX(F005430642827E)=K$)GOTO 420,1650,1650,1550,1550,1020,1628
   : REM - CANCEL, '5/NEXT, '6/PREV, RUN, TAB
1627 K0=K0+1
   : IF K0>6THEN K0=1
   : GOTO 1624
   : REM - ADVANCE TO NEXT FIELD
1628 K0=K0-1
   : IF K0<1THEN K0=6
   : GOTO 1624
   : REM - BACK UP TO PREVIOUS FIELD
1630 GOSUB '202(8,35,E1$(21),28,"H",HEX(F0054306427E))
   : GOSUB '205(E1$(21))
   : E1$(21)=I0$(1)
   : RETURN
   : REM - ACCEPT SELECT PITCH PREFIX STRING
1631 GOSUB '202(10,56,E2$(1),2,"H",HEX(F0054306427E))
   : GOSUB '205(E2$(1))
   : E2$(1)=I0$(1)
   : RETURN
   : REM - ACCEPT 5 PITCH SUFFIX BYTE
1632 GOSUB '202(11,56,E2$(2),2,"H",HEX(F0054306427E))
   : GOSUB '205(E2$(2))
   : E2$(2)=I0$(1)
   : RETURN
   : REM - ACCEPT 10 PITCH SUFFIX BYTE
1633 GOSUB '202(12,56,E2$(3),2,"H",HEX(F0054306427E))
   : GOSUB '205(E2$(3))
   : E2$(3)=I0$(1)
   : RETURN
   : REM - ACCEPT 12 PITCH SUFFIX BYTE
1634 GOSUB '202(13,56,E2$(4),2,"H",HEX(F0054306427E))
   : GOSUB '205(E2$(4))
   : E2$(4)=I0$(1)
   : RETURN
   : REM - ACCEPT 15 PITCH SUFFIX BYTE
1635 GOSUB '202(14,56,E2$(5),2,"H",HEX(F0054306427E))
   : GOSUB '205(E2$(5))
   : E2$(5)=I0$(1)
   : RETURN
   : REM - ACCEPT 16.5 PITCH SUFFIX BYTE
1649 REM %.ETT #3-1
1650 PRINT AT(5,0,1040);HEX(020402040F);AT(8,15);"Select Font #0 . . . ";HEX(0
     E);STR(E1$(2));HEX(0F);AT(9,15);"Select Font #1 . . . ";HEX(0E);STR(E1$(3
     ));HEX(0F);AT(10,15);"Select Font #2 . . . ";HEX(0E);STR(E1$(4));HEX(0F);
     AT(11,15);"Select Color . . . . ";HEX(0E);STR(E1$(39));HEX(0F)
   : REM - ETT SCREEN #3-1
1660 PRINT AT(12,15);"Select Paper Tray #1 ";HEX(0E);STR(E1$(10));HEX(0F);AT(1
     3,15);"Select Paper Tray #2 ";HEX(0E);STR(E1$(11));HEX(0F);AT(14,15);"Sel
     ect Paper Tray #3 ";HEX(0E);STR(E1$(36));HEX(0F)
   : REM - ESCAPE TABLE SCREEN #3-2
1663 K0=1
   : REM - RESET FIELD COUNTER
1664 ON K0GOSUB 1670,1671,1672,1673,1674,1675,1676
   : REM - PROCESS THE CURRENT FIELD
1665 GOSUB '203(I0$(1))
   : IF M$<>" "THEN 1664
   : REM - VALIDATE FIELD & BRANCH IF ERROR MESSAGE WAS DISPLAYED
1666 ON POS(HEX(F005430642827E)=K$)GOTO 420,1700,1700,1600,1600,1020,1668
   : REM - CANCEL, '5/NEXT, '6/PREV, RUN, TAB
1667 K0=K0+1
   : IF K0>7THEN K0=1
   : GOTO 1664
   : REM - ADVANCE TO NEXT FIELD
1668 K0=K0-1
   : IF K0<1THEN K0=7
   : GOTO 1664
   : REM - BACK UP TO PREVIOUS FIELD
1670 GOSUB '202(8,36,E1$(2),28,"H",HEX(F0054306427E))
   : GOSUB '205(E1$(2))
   : E1$(2)=I0$(1)
   : RETURN
   : REM - ACCEPT SELECT FONT #0
1671 GOSUB '202(9,36,E1$(3),28,"H",HEX(F0054306427E))
   : GOSUB '205(E1$(3))
   : E1$(3)=I0$(1)
   : RETURN
   : REM - ACCEPT SELECT FONT #1
1672 GOSUB '202(10,36,E1$(4),28,"H",HEX(F0054306427E))
   : GOSUB '205(E1$(4))
   : E1$(4)=I0$(1)
   : RETURN
   : REM - ACCEPT SELECT FONT #2
1673 GOSUB '202(11,36,E1$(39),28,"H",HEX(F0054306427E))
   : GOSUB '205(E1$(39))
   : E1$(39)=I0$(1)
   : RETURN
   : REM - ACCEPT SELECT COLOR
1674 GOSUB '202(12,36,E1$(10),28,"H",HEX(F0054306427E))
   : GOSUB '205(E1$(10))
   : E1$(10)=I0$(1)
   : RETURN
   : REM - ACCEPT SELECT PAPER TRAY #1
1675 GOSUB '202(13,36,E1$(11),28,"H",HEX(F0054306427E))
   : GOSUB '205(E1$(11))
   : E1$(11)=I0$(1)
   : RETURN
   : REM - ACCEPT SELECT PAPER TRAY #2
1676 GOSUB '202(14,36,E1$(36),28,"H",HEX(F0054306427E))
   : GOSUB '205(E1$(36))
   : E1$(36)=I0$(1)
   : RETURN
   : REM - ACCEPT SELECT PAPER TRAY #3
1699 REM %.ETT #4-1
1700 PRINT AT(5,0,1040);HEX(020402040F);AT(7,12);"Number of Printer Increments
      per Inch . . . . . .  ";HEX(0E);STR(E2$);HEX(0F);AT(9,12);"Set Line Feed
      Spacing . . ";HEX(0E);STR(E1$(22));HEX(0F);AT(11,12);"Set Form Length in
      Lines  ";HEX(0E);STR(E1$(32));HEX(0F)
   : REM - ESCAPE TABLE SCREEN #4-1
1710 PRINT AT(13,12);"Set Left Margin . . . . . ";HEX(0E);STR(E1$(29));HEX(0F)
   : REM - ESCAPE TABLE SCREEN #4-2
1712 K0=1
   : REM - RESET FIELD COUNTER
1713 ON K0GOSUB 1720,1721,1722,1724
   : REM - PROCESS THE CURRENT FIELD
1714 IF K0>1THEN 1715
   : GOSUB '201(" ")
   : IF E2$=" "THEN E2$="000"
   : GOTO 1716
   : REM - JUMP IF NOT FIRST FIELD; ERASE MSG, FILL-IN DEFAULT, JUMP PAST HEX
     VALIDATION
1715 GOSUB '203(I0$(1))
   : IF M$<>" "THEN 1713
   : REM - VALIDATE FIELD & BRANCH IF ERROR MESSAGE WAS DISPLAYED
1716 ON POS(HEX(F005430642827E)=K$)GOTO 420,1750,1750,1650,1650,1020,1718
   : REM - CANCEL, '5/NEXT, '6/PREV, RUN, TAB
1717 K0=K0+1
   : IF K0>4THEN K0=1
   : GOTO 1713
   : REM - ADVANCE TO NEXT FIELD
1718 K0=K0-1
   : IF K0<1THEN K0=4
   : GOTO 1713
   : REM - BACK UP TO PREVIOUS FIELD
1720 GOSUB '202(7,63,E2$,3,"#",HEX(F0054306427E))
   : GOSUB '205(E2$)
   : E2$=I0$(1)
   : RETURN
   : REM - ACCEPT NUMBER OF PRINTER INCREMENTS PER INCH
1721 GOSUB '202(9,38,E1$(22),28,"H",HEX(F0054306427E))
   : GOSUB '205(E1$(22))
   : E1$(22),E1$(23)=I0$(1)
   : RETURN
   : REM - ACCEPT SET LF SPACING (GOES INTO ENABLE & DISABLE AUTO LF...)
1722 GOSUB '202(11,38,E1$(32),28,"H",HEX(F0054306427E))
   : GOSUB '205(E1$(32))
   : E1$(32)=I0$(1)
   : RETURN
   : REM - ACCEPT SET FORM LENGTH IN LINES
1724 GOSUB '202(13,38,E1$(29),28,"H",HEX(F0054306427E))
   : GOSUB '205(E1$(29))
   : E1$(29)=I0$(1)
   : RETURN
   : REM - ACCEPT SET LEFT MARGIN
1749 REM %.ETT #5-1
1750 PRINT AT(5,0,1040);HEX(020402040F);AT(7,11);"Execute Built-in Diagnostics
      ";HEX(0E);STR(E1$(1));HEX(0F);AT(8,11);"Clear Platten  . . . . . . . ";H
     EX(0E);STR(E1$(5));HEX(0F)
   : REM - ESCAPE TABLE SCREEN #5-1
1755 PRINT AT(9,11);"Clear Buffer . . . . . . . . ";HEX(0E);STR(E1$(49));HEX(0
     F);AT(10,11);"Select Printer . . . . . . . ";HEX(0E);STR(E1$(38));HEX(0F)
     ;AT(11,11);"Deselect Printer . . . . . . ";HEX(0E);STR(E1$(12));HEX(0F)
   : REM - ESCAPE TABLE SCREEN #5-2
1760 PRINT AT(12,11);"1/4 Line Feed  . . . . . . . ";HEX(0E);STR(E1$(26));HEX(
     0F);AT(13,11);"1/2 Line Feed  . . . . . . . ";HEX(0E);STR(E1$(27));HEX(0F
     );AT(14,11);"3/4 Line Feed  . . . . . . . ";HEX(0E);STR(E1$(28));HEX(0F)
   : REM - ESCAPE TABLE SCREEN #5-3
1770 PRINT AT(15,11);"Reverse Line Feed  . . . . . ";HEX(0E);STR(E1$(38));HEX(
     0F)
   : REM - ESCAPE TABLE SCREEN #5-3
1773 K0=1
   : REM - RESET FIELD COUNTER
1774 ON K0GOSUB 1780,1781,1782,1783,1784,1785,1786,1787,1788
   : REM - PROCESS THE CURRENT FIELD
1775 GOSUB '203(I0$(1))
   : IF M$<>" "THEN 1774
   : REM - VALIDATE FIELD & BRANCH IF ERROR MESSAGE WAS DISPLAYED
1776 ON POS(HEX(F005430642827E)=K$)GOTO 420,1550,1550,1700,1700,1020,1778
   : REM - CANCEL, '5/NEXT, '6/PREV, RUN, TAB
1777 K0=K0+1
   : IF K0>9THEN K0=1
   : GOTO 1774
   : REM - ADVANCE TO NEXT FIELD
1778 K0=K0-1
   : IF K0<1THEN K0=9
   : GOTO 1774
   : REM - BACK UP TO PREVIOUS FIELD
1780 GOSUB '202(7,40,E1$(1),28,"H",HEX(F0054306427E))
   : GOSUB '205(E1$(1))
   : E1$(1)=I0$(1)
   : RETURN
   : REM - ACCEPT EXECUTE BUILT-IN DIAGNOSTICS
1781 GOSUB '202(8,40,E1$(5),28,"H",HEX(F0054306427E))
   : GOSUB '205(E1$(5))
   : E1$(5)=I0$(1)
   : RETURN
   : REM - ACCEPT CLEAR PLATTEN
1782 GOSUB '202(9,40,E1$(49),28,"H",HEX(F0054306427E))
   : GOSUB '205(E1$(49))
   : E1$(49)=I0$(1)
   : RETURN
   : REM - ACCEPT CLEAR BUFFER
1783 GOSUB '202(10,40,E1$(38),28,"H",HEX(F0054306427E))
   : GOSUB '205(E1$(38))
   : E1$(38)=I0$(1)
   : RETURN
   : REM - ACCEPT SELECT PRINTER
1784 GOSUB '202(11,40,E1$(12),28,"H",HEX(F0054306427E))
   : GOSUB '205(E1$(12))
   : E1$(12)=I0$(1)
   : RETURN
   : REM - ACCEPT DESELECT PRINTER
1785 GOSUB '202(12,40,E1$(26),28,"H",HEX(F0054306427E))
   : GOSUB '205(E1$(26))
   : E1$(26)=I0$(1)
   : RETURN
   : REM - ACCEPT 1/4 LINE FEED
1786 GOSUB '202(13,40,E1$(27),28,"H",HEX(F0054306427E))
   : GOSUB '205(E1$(27))
   : E1$(27)=I0$(1)
   : RETURN
   : REM - ACCEPT 1/2 LINE FEED
1787 GOSUB '202(14,40,E1$(28),28,"H",HEX(F0054306427E))
   : GOSUB '205(E1$(28))
   : E1$(28)=I0$(1)
   : RETURN
   : REM - ACCEPT 3/4 LINE FEED
1788 GOSUB '202(15,40,E1$(37),28,"H",HEX(F0054306427E))
   : GOSUB '205(E1$(37))
   : E1$(37)=I0$(1)
   : RETURN
   : REM - ACCEPT REVERSE LINE FEED
2000 REM %^WRITE SELECTED; WRITE ALL TABLES TO A FILE
2010 T0$="NEW"
   : REM - DEFAULT FILE FORMAT
2015 PRINT HEX(020402040F);AT(16,0);"Enter drive:  . . . . . . . . . ";HEX(0E)
     ;STR(D$);HEX(0F);AT(17,0);"Enter file name:  . . . . . . . ";HEX(0E);STR(
     F$);HEX(0F);AT(18,0);"Enter NEW if 3.0 or OLD if 2.7: ";HEX(0E);STR(T0$);
     HEX(020402000F)
   : REM - DISPLAY FIELDS
2020 PRINT AT(21,50);HEX(0E);"RETURN      - Next Field";AT(23,50);"CANCEL/EDIT
      - Cancel Write  ";HEX(01)
   : REM - UPDATE KEY DEFINITIONS
2030 M$=" "
   : GOSUB '202(16,32,D$,3,"H",HEX(F0))
   : D$=I0$(1)
   : IF K$=HEX(F0)THEN 420
   : REM - ACCEPT DISK ADDRESS
2035 GOSUB '201(" ")
   : IF VER(D$,"HHH")=3THEN 2036
   : GOSUB '201("Disk address must be 3 hex digits")
   : PRINT HEX(07)
   : GOTO 2030
2036 IF K$=HEX(82)THEN 2048
   : REM - RUN/EXEC PRESSED?
2040 GOSUB '202(17,32,F$,8,"X",HEX(F0))
   : F$=I0$(1)
   : ON POS(HEX(82F0)=K$)GOTO 2048,420
   : REM - ACCEPT FILE NAME
2045 GOSUB '202(18,32,T0$,3,"X",HEX(F0))
   : T0$=I0$(1)
   : $TRAN(T0$,"AaBbCcDdEeFfGgHhIiJjKkLlMmNnOoPpQqRrSsTtUuVvWwXxYyZz")R
   : ON POS(HEX(20F0)=K$)GOTO 2030,420
   : REM - ACCEPT TABLE FORMAT
2048 IF T0$="NEW"OR T0$="OLD"THEN 2049
   : GOSUB '201("Please enter NEW or OLD.")
   : PRINT HEX(07)
   : GOTO 2045
   : REM - VALIDATE TABLE FORMAT & YELL AT HIM IF INCORRECT ENTRY
2049 IF T0$="NEW"THEN T=10
   : ELSE T=0
   : REM - SET OFFSET VALUE BASED ON USER INPUT
2050 GOSUB '201(" ")
   : SELECT #1<D$>
   : ERRORGOSUB '255
   : GOTO 2030
   : REM - SELECT THE DISK
2060 LIMITS T#1,F$,B,E,U,S
   : ERRORGOSUB '255
   : GOTO 2030
   : REM - FIND THE FILE
2070 IF S=2THEN 2085
   : IF S=0THEN 2075
   : GOSUB '201("File is not an active data file")
   : PRINT HEX(07)
   : GOTO 2040
   : REM - YELL AT HIM IF IT ISN'T AN ACTIVE DATA FILE
2075 GOSUB '201("File does not exist, create it (Y/N)?")
   : PRINT HEX(07)
   : GOSUB '204
   : GOSUB '201(" ")
   : IF K$="N"THEN 2030
2080 GOSUB '201("(Creating file)")
   : DATA SAVE DC OPEN T#1,(31)F$
   : DATA SAVE DC CLOSE#1
   : GOSUB '201(" ")
   : LIMITS T#1,F$,B,E,U,S
   : GOTO 2100
   : REM - CREATE THE FILE (28 SECTORS NEEDED IF TABLES ARE FULL)
2085 GOSUB '201("File exists, overwrite it (Y/N)?")
   : PRINT HEX(07)
   : GOSUB '204
   : GOSUB '201(" ")
   : IF K$="N"THEN 2030
2090 REM % RESET THE NON-MODIFIABLE FIELDS
2100 FOR K=1TO 7
   : C1$(K)=" "
   : H$=BIN(K)
   : HEXUNPACKSTR(H$,,1)TO C1$(K)
   : NEXT K
2110 C1$(10)="09"
   : C1$(12)="0B"
2120 FOR K=130TO 144
   : C1$(K)=" "
   : H$=BIN(K)
   : HEXUNPACKSTR(H$,,1)TO C1$(K)
   : NEXT K
2130 REM % MAP ENABLE/DISABLE ENHANCED MODE TO THE CHARACTERS X'0E' & X'0F'
2140 C1$(15)=E1$(46)
   : REM - X'0E'
2150 C1$(16)=E1$(47)
   : REM - X'0F'
2155 REM %MAP "Length in Inches" TO "Length in Lines"
2156 E1$(33)=E1$(32)
   : REM - LENGTH IN LINES
2160 REM % MAP CLEAR BUFFER TO THE CHARACTER X'7F'
2165 C1$(128)=E1$(49)
   : REM - X'7F'
2180 C0=C9
   : FOR K=1TO C9
   : IF LEN(C1$(K))>2THEN C0=C0+INT((LEN(C1$(K))+2)/4)
   : NEXT K
   : REM - CALCULATE LENGTH OF THE CTT
2190 E0=41+T
   : FOR K=1TO 35+T
   : IF E1$(K)<>" "THEN E0=E0+INT((LEN(E1$(K))+2)/4)
   : NEXT K
   : REM - CALCULATE LENGTH OF THE ETT
2200 S0$()=ALL(00)
   : IF T=0THEN STR(S0$(),,2)=HEX(6911)
   : ELSE STR(S0$(),,2)=HEX(6A11)
   : STR(S0$(),3,2)=BIN(C0,2)
   : STR(S0$(),5,2)=BIN(E0,2)
   : DATA SAVE BA T$#1,(B)S0$()
   : REM - CREATE & STORE THE HEADER RECORD
2210 REM % SAVE THE CTT INDEX
2220 GOSUB '201("(Writing the Character Table)")
   : C1=C9
   : W0=1
   : FOR K=1TO C9
   : REM - KEEP THE USER HAPPY, INITIALIZE STRING OFFSET & WORD ADDRESS AND ST
     ART LOOP
2230 C=LEN(C1$(K))
   : IF C>1THEN HEXPACKH1$FROMC1$(K)
   : REM - GET LENGTH OF USER'S ENTRY & GENERATE HEX FROM THE ENTRY
2240 IF C=1THEN W0$=HEX(000F)&BIN(K-1)
   : REM - NOT SUPPORTED IF BLANK
2250 IF C=2THEN W0$=HEX(00FF)&STR(H1$,,1)
   : REM - 1-BYTE REPLACEMENT
2260 IF C<4THEN 2280
   : REM - BRANCH IF NOT A STRING REPLACEMENT
2270 W0$=HEX(00)&BIN(C1,2)
   : C1=C1+INT(((C/2)+1)/2)
   : REM - STORE CURRENT OFFSET & ADVANCE IT
2280 GOSUB '101(W0$,W0)
   : W0=W0+1
   : NEXT K
   : REM - STORE THIS WORD, POINT TO NEXT WORD & CONTINUE LOOP
2290 REM % SAVE THE CTT STRINGS
2300 FOR K=1TO C9
   : REM - START LOOP
2310 C=LEN(C1$(K))
   : IF C<4THEN 2350
   : REM - GET LENGTH OF USER'S ENTRY & BRANCH IF IT'S NOT A STRING
2320 H1$=ALL(00)
   : HEXPACKH1$FROMC1$(K)
   : W0$=BIN(C/2)
   : REM - GENERATE HEX FROM USER'S ENTRY & STORE LENGTH OF STRING
2330 FOR J=1TO C/2STEP 2
   : STR(W0$,2,2)=STR(H1$,J,2)
   : REM - START LOOP FOR STRING & STORE THE NEXT 2 BYTES
2340 GOSUB '101(W0$,W0)
   : W0=W0+1
   : W0$=ALL(00)
   : NEXT J
   : REM - WRITE WORD, INCREMENT WORD POINTER, RESET WORD STORAGE & CONTINUE S
     TRING LOOP
2350 NEXT K
   : REM - CONTINUE LOOP THROUGH TABLE
2360 REM % SAVE THE PRINTER INCREMENTS/INCH & THE PITCH TRANSLATION SUFFIXES
2370 CONVERT E2$TO E2
   : W0$=HEX(00)&BIN(E2,2)
   : GOSUB '101(W0$,W0)
   : W0=W0+1
   : REM - SAVE THE INCREMENTS/INCH
2380 FOR K=1TO 5
   : W0$=ALL(00)
   : IF E2$(K)<>" "THEN HEXPACKSTR(W0$,3,1)FROME2$(K)
   : GOSUB '101(W0$,W0)
   : W0=W0+1
   : NEXT K
   : REM - SAVE THE PITCH TRANSLATION SUFFIXES
2400 REM % SAVE THE ETT INDEX
2410 GOSUB '201("(Writing the Escape Sequence Table)")
   : E1=41+T
   : FOR K=1TO 35+T
   : REM - KEEP THE USER HAPPY, INITIALIZE STRING OFFSET AND START LOOP
2420 C=LEN(E1$(K))
   : IF C>1THEN HEXPACKH1$FROME1$(K)
   : REM - GET LENGTH OF USER'S ENTRY & GENERATE HEX FROM THE ENTRY
2430 W0$=HEX(000000)
   : IF C=1THEN 2450
   : REM - NOT SUPPORTED IF BLANK
2440 W0$=HEX(00)&BIN(E1,2)
   : E1=E1+INT(((C/2)+1)/2)
   : REM - STORE CURRENT OFFSET & ADVANCE IT
2450 GOSUB '101(W0$,W0)
   : W0=W0+1
   : NEXT K
   : REM - STORE THIS WORD, POINT TO NEXT WORD & CONTINUE LOOP
2500 REM % SAVE THE ETT STRINGS
2510 FOR K=1TO 35+T
   : REM - START LOOP
2520 C=LEN(E1$(K))
   : IF C<2THEN 2560
   : REM - BRANCH IF NOT SUPPORTED (NO STRING)
2530 H1$=ALL(00)
   : HEXPACKH1$FROME1$(K)
   : W0$=BIN(C/2)
   : REM - GENERATE HEX FROM USER'S ENTRY & STORE LENGTH OF STRING
2540 FOR J=1TO C/2STEP 2
   : STR(W0$,2,2)=STR(H1$,J,2)
   : REM - START LOOP FOR STRING & STORE THE NEXT 2 BYTES
2550 GOSUB '101(W0$,W0)
   : W0=W0+1
   : W0$=ALL(00)
   : NEXT J
   : REM - WRITE WORD, INCREMENT WORD POINTER, RESET WORD STORAGE & CONTINUE S
     TRING LOOP
2560 NEXT K
   : REM - CONTINUE LOOP THROUGH TABLE
2570 GOSUB '101(" ",0)
   : REM - FLUSH SECTOR BUFFER
2575 DATA LOAD DC OPEN T#1,F$
   : DSKIP #1,S0+1S
   : DATA SAVE DC #1,END
   : DATA SAVE DC CLOSE#1
   : REM - UPDATE SECTORS USED COUNT
2580 F=0
   : REM - RESET "DATA MODIFIED" FLAG
2590 M$="Tables written to "&F$&" on "&D$
   : GOTO 420
   : REM - SET MESSAGE & RE-DISPLAY THE MAIN MENU
2600 RETURN CLEAR ALL
   : GOSUB '201("File full. Tables \CE\CF\D4 saved properly.")
   : PRINT HEX(07)
   : GOTO 2030
   : REM - GIVE HIM THE BAD NEWS AND BRANCH TO THE DISK ADDRESS PROMPT
5000 DEFFN'100(W0)
   : REM % READ CONTROL WORD W0 INTO W0$3
5010 IF S0=INT(W0/83)THEN 5030
   : REM - BRANCH IF SECTOR IS ALREADY LOADED
5020 S0=INT(W0/83)
   : DATA LOAD BA T#1,(B+S0)S0$()
   : REM - SET SECTOR OFFSET & LOAD IT
5030 S1=(W0-INT(W0/83)*83+1)*3
   : REM - GET THE BYTE POSITION WITHIN A "NORMAL" SECTOR
5040 IF W0<83THEN S1=S1+1
   : REM - COMPENSATE FOR SECTOR # 1
5050 W0$=STR(S0$(),S1,3)
   : REM - GET THE CONTROL WORD
5060 RETURN
5100 DEFFN'101(W0$,W0)
   : REM % WRITE CONTROL WORD W0$ AT ADDRESS W0 (W0=0 FORCES FLUSH ONLY)
5110 IF S0>-1AND S0<>INT(W0/83)OR W0=0THEN DATA SAVE BA T$#1,(B+S0)S0$()
   : REM - WRITE SECTOR IN MEMORY (IF ANY) IF NEW ONE WILL BE LOADED
5120 IF W0=0THEN 5170
   : REM - EXIT IF FLUSH REQUESTED
5125 IF INT(W0/83)>E-B-1THEN 2600
   : REM - BRANCH TO THE ERROR HANDLER IF ATTEMPT MADE TO WRITE PAST END-OF-FI
     LE
5130 W1$=W0$
   : REM - STORE W0$ (BECAUSE '100 WILL DESTROY IT)
5140 GOSUB '100(W0)
   : REM - READ THE WORD CURRENTLY AT W0 (TO SET VARIABLES S0$(), S0 & S1)
5150 IF T=0THEN STR(S0$(),,2)=HEX(6911)
   : ELSE STR(S0$(),,2)=HEX(6A11)
   : REM - FLAG THE SECTOR AS THE RIGHT KIND OF PRINTER DRIVER TABLE
5160 STR(S0$(),S1,3)=W1$
   : REM - STORE THE CONTROL WORD IN THE CURRENT SECTOR (S1 SET BY '100)
5170 RETURN
6000 DEFFN'200
   : REM % PROCESS MENU AT CURRENT "DATA" POSITION.  RETURN M2 (0=CANCEL/EDIT)
6010 READ M0
   : M0$()=" "
   : M1=0
   : FOR K=1TO M0
   : READ M0$(K)
   : IF LEN(M0$(K))>M1THEN M1=LEN(M0$(K))
   : NEXT K
   : REM - READ THE MENU STRINGS INTO THE MENU ARRAY
6020 FOR K=1TO 10
   : IF M0$(K)<>" "THEN PRINT AT(7+K,INT((78-M1)/2));HEX(8520);M0$(K)
   : NEXT K
   : REM - DISPLAY THE MENU
6030 M2=1
   : REM - SET INITIAL POSITION
6040 PRINT AT(7+M2,INT((78-M1)/2));HEX(0E8B20);M0$(M2)
   : REM - DISPLAY CURRENT POSITION AS BRIGHT
6050 KEYIN K$,,6120
   : REM - GET A KEY (BRANCH IF SF KEY)
6060 GOSUB '201(" ")
   : REM - ERASE MESSAGE
6070 PRINT AT(7+M2,INT((78-M1)/2));HEX(8520);M0$(M2)
   : REM - DISPLAY CURRENT POSITION AS DIM
6080 ON POS(HEX(200882)=K$)GOTO 6090,6100,6110
   : GOTO 6040
   : REM - HANDLE SPACE, BACK SPACE AND RUN KEYS
6090 M2=M2+1
   : IF M2>M0THEN M2=1
   : GOTO 6040
   : REM - SPACE BAR PRESSED
6100 M2=M2-1
   : IF M2<1THEN M2=M0
   : GOTO 6040
   : REM - BACK SPACE PRESSED
6110 PRINT AT(7+M2,INT((78-M1)/2));HEX(8B)
   : GOTO 6140
   : REM - RUN/EXEC PRESSED
6120 GOSUB '201(" ")
   : REM - ERASE MESSAGE
6125 PRINT AT(7+M2,INT((78-M1)/2));HEX(8520);M0$(M2)
   : REM - DISPLAY CURRENT POSITION AS DIM
6130 IF K$<>HEX(F0)THEN 6040
   : M2=0
   : GOTO 6140
   : REM - IF CANCEL, SET M2 TO 0 & RETURN
6140 RETURN
6200 DEFFN'201(M$)
   : REM % DISPLAY M$ IN LOWER LEFT CORNER OF THE DISPLAY
6210 PRINT AT(23,0);HEX(0E);STR(M$);HEX(01)
   : REM - DISPLAY MESSAGE
6220 RETURN
6300 DEFFN'202(I1,I2,I0$(1),I3,I0$,I1$)
   : REM % ACCEPT FIELD (I1,I2=ROW,COL I0$(1)=DATA I3=LEN I0$=VER MASK I1$=EXI
     T SFKEYS)
6310 MAT REDIM I0$(1)I3
   : REM - CHANGE LENGTH OF FIELD TO LENGTH SPECIFIED
6320 PRINT HEX(020402040E)
   : REM - SET ATTRIBUTES TO BRIGHT/UNDERSCORE
6330 I0=1
   : REM - INITIALIZE CURSOR POSITION
6340 PRINT HEX(06);AT(I1,I2);STR(I0$(1))
   : REM - DISPLAY THE FIELD
6350 PRINT AT(I1,I2+I0-1);HEX(02050F);
   : REM - POSITION CURSOR
6360 KEYIN K$,,6470
   : REM - WAIT FOR A KEY.  BRANCH IF SF KEY PRESSED
6370 PRINT HEX(06);
   : REM - "NORMAL" KEY PRESSED; SHUT OFF THE CURSOR
6380 ON POS(HEX(20080D82)=K$)GOTO 6400,6420,6450,6460
   : REM - BRANCH IF SPACE, BACKSPACE, RETURN OR RUN/EXEC
6390 IF VER(K$,I0$)<>1THEN 6350
   : REM - IF NOT A VALID KEY, WAIT FOR ANOTHER
6400 IF I0$=HEX(00)THEN 6350
   : STR(I0$(1),I0,1)=K$
   : PRINT K$;
   : REM - IF ACCEPTING CHARACTERS, PUT THE CHARACTER INTO THE FIELD & PRINT I
     T
6410 IF I0<I3THEN I0=I0+1
   : GOTO 6350
   : REM - INCREMENT CURSOR POSITION & UPDATE IT
6420 IF I0=1THEN 6350
   : REM - BACKSPACE PRESSED; GET ANOTHER KEY IF AT LEFTMOST COLUMN
6430 IF I0<I3OR STR(I0$(1),I0,1)=" "THEN I0=I0-1
   : REM - DON'T DECREMENT CURSOR POSITION IF AT RIGHTMOST POSITION & IT'S NON
     -BLANK
6440 STR(I0$(1),I0,1)=" "
   : GOTO 6340
   : REM - REMOVE THE CHARACTER & UPDATE THE CRT
6450 K$=HEX(20)
   : GOTO 6550
   : REM - RETURN PRESSED; TRANSLATE IT TO HEX(20) & EXIT
6460 GOTO 6550
   : REM - RUN/EXEC PRESSED; EXIT
6470 PRINT HEX(06);
   : REM - SF KEY PRESSED; SHUT OFF THE CURSOR
6480 IF POS(I1$=K$)<>0THEN 6550
   : REM - IF AN EXIT KEY, EXIT
6490 IF I0$<>HEX(00)THEN ON POS(HEX(48494A4C4D)=K$)GOTO 6500,6510,6520,6530,65
     40
   : GOTO 6350
   : REM - IF MODIFIABLE, BRANCH TO ERASE, DELETE, INSERT, RIGHT OR LEFT
6500 STR(I0$(1),I0)=" "
   : GOTO 6340
   : REM - ERASE PRESSED; DO IT & UPDATE THE CRT
6510 IF I0<I3THEN STR(I0$(1),I0)=STR(I0$(1),I0+1)
   : STR(I0$(1),I3,1)=" "
   : GOTO 6340
   : REM - DELETE PRESSED; DO IT & UPDATE THE CRT
6520 IF I0<I3THEN MAT COPY -STR(I0$(1),I0,I3-I0)TO -STR(I0$(1),I0+1)
   : STR(I0$(1),I0,1)=" "
   : GOTO 6340
   : REM - INSERT PRESSED; DO IT & UPDATE THE CRT
6530 IF I0<I3THEN I0=I0+1
   : GOTO 6340
   : REM - RIGHT PRESSED; MOVE CURSOR & REPOSITION IT
6540 IF I0>1THEN I0=I0-1
   : GOTO 6340
   : REM - LEFT PRESSED; MOVE CURSOR & REPOSITION IT
6550 PRINT HEX(020402000F)
   : REM - SET THE ATTRIBUTES TO BRIGHT (NORMAL)
6560 MAT REDIM I0$(1)80
   : REM - RESET THE FIELD LENGTH TO ITS MAXIMUM
6570 RETURN
6600 DEFFN'203(H0$)
   : REM % VALIDATE VALUE IN H0$ AS A HEXADECIMAL FIELD
6610 GOSUB '201(" ")
   : IF H0$=" "THEN 6640
   : REM - ERASE MESSAGE & EXIT IF FIELD IS BLANK
6620 IF POS(H0$=" ")>LEN(H0$)THEN 6630
   : GOSUB '201("Field contains embedded spaces")
   : PRINT HEX(07)
   : GOTO 6640
   : REM - YELL AT HIM & EXIT IF EMBEDDED SPACES EXIST
6630 IF LEN(H0$)/2=INT(LEN(H0$)/2)THEN 6640
   : GOSUB '201("Field contains odd number of digits")
   : PRINT HEX(07)
   : REM - YELL AT HIM IF ODD NUMBER OF DIGITS
6640 RETURN
6700 DEFFN'204
   : REM % RETURN K$ = "Y" or "N"
6710 KEYIN K$
6720 $TRAN(K$,"YyNn")R
   : IF K$<>"Y"AND K$<>"N"THEN 6710
6730 RETURN
6800 DEFFN'205(I$)
   : REM %COMPARE I$ TO I0$(1) & SET F=1 IF DIFFERENT
6810 IF I$<>I0$(1)THEN F=1
   : RETURN
   : REM - LIKE IT SAYS, COMPARE I$ TO I0$(1) & SET F=1 IF DIFFERENT
9000 DEFFN'255
   : REM % ERROR HANDLER
9005 M=ERR
   : REM - GET THE ERROR NUMBER
9010 M$=" "
   : REM - INITIALIZE MESSAGE
9015 IF M<90THEN 9025
   : RESTORE LINE9020,M-89
   : READ M$
   : REM - GET MESSAGE IF DISK ERROR
9020 DATA "Disk Hardware Error","Disk Drive Not Ready","Disk Drive Time-Out","
     Disk Format Error","Disk Format Key Engaged","Disk Seek Error or Platter
     Protected","Disk CRC Error","Disk LRC Error","Disk Platter Not Mounted","
     Verify Error"
   : REM - DISK ERRORS
9025 IF M=48THEN M$="Illegal Device Specification"
9030 IF M$<>" "THEN 9040
   : M$="Unexpected Error ### Occurred"
   : CONVERT MTO STR(M$,18,3),(###)
   : REM - CATCH-ALL
9040 GOSUB '201(M$)
   : PRINT HEX(07)
   : RETURN
9998 DEFFN'30
   : SELECT LIST 215(132)
   : LIST "@TBLEDIT - GPD printer table editor"D
   : LIST "Line number cross-reference"#
   : LIST "Subroutine cross-reference"'
   : LIST "Variable cross-reference"V
   : SELECT LIST 005(80)
   : STOP "- LISTINGS GENERATED"
9999 DEFFN'31"Z$=";HEX(22);"@TBLEDIT";HEX(22);":SCRATCHTZ$:SAVE<S>T$()Z$:Z$=";
     HEX(22);"@tbledit";HEX(22);":SCRATCHTZ$:SAVE<SR>T$()Z$0,9998";HEX(0D)