home *** CD-ROM | disk | FTP | other *** search
/ Oakland CPM Archive / oakcpm.iso / cpmug / cpmug043.ark / CRTFM.BAS < prev    next >
BASIC Source File  |  1984-04-29  |  9KB  |  283 lines

  1.     REMARK    *****************************************\
  2.         *  CRTFM.BAS  CRT MASK FILE MAINTENANCE *\
  3.         *    5/21/79                 3:20 PM    *\
  4.         *****************************************
  5.  
  6.  
  7. %INCLUDE CURSOR
  8.  
  9.     REMARK  **  SPECIAL CHARACTERS FOR CRT POSITIONING DEFINED HERE ** \
  10.           THE CODES BELOW ARE NOT CURSOR CONTROL CHARACTERS.  THEY \
  11.           ARE EQUATE STATEMENTS FOR KEYBOARD ENTRIES, WHICH IN TURN\
  12.           TRIGGER CURSOR MOVEMENT(CONTROLLED BY CURSOR.BAS).       
  13.  
  14.  
  15.            UP.CRSR%=15H                        REMARK  CONTROL-U
  16.          DOWN.CRSR%=04H                        REMARK  CONTROL-D
  17.          HOME.CRSR%=14H                        REMARK  CONTROL-T
  18.          LEFT.CRSR%=08H                        REMARK  CONTROL-H
  19.         RIGHT.CRSR%=12H                        REMARK  CONTROL-R
  20.                 CTRL.I%=09H                        REMARK  CONTROL-I
  21.             ESCAPE%=1BH                        REMARK  ESCAPE KEY
  22.  
  23.  
  24.     REMARK  CRT DIMENSIONS AND MASK RECORD LENGTH DEFINED HERE
  25.  
  26.         VERTICAL.LINES%=16
  27.              CRT.WIDTH%=64
  28.            MASK.LENGTH%=1100
  29.     DIM CRTMASK$(VERTICAL.LINES%),SCRATCH$(VERTICAL.LINES%)
  30.  
  31.  
  32.     REMARK    ***************************************************\
  33.         *  IN ORDER TO CHANGE THIS PROGRAM FOR A CRT WITH *\
  34.         *  OTHER X-Y DIMENSIONS, YOU MUST ALSO CHANGE THE *\
  35.         *  MASK FILE ACCESS ROUTINES IN 1000 AND 1200.ADD *\
  36.         *  OR DECREASE THE NUMBER OF CRT MASK LINES TO BE *\
  37.         *  READ FROM OR WRITTEN TO THE FILE AS NEEDED.    *\
  38.         ***************************************************
  39.  
  40.     BLANK$=CHR$(20H)
  41.     FOR I%=1 TO 7:BLANK$=BLANK$+BLANK$:NEXT I%            REMARK  SET UP BLANK FILLER SPACE (128 SPACES HERE)
  42.     GOTO 6000
  43. %INCLUDE SUBS1
  44.  
  45. 1000    REMARK  **********  READ CRT MASK FILE RECORD  **********
  46.  
  47.     READ #1,MASK%; CRTMASK$(1),CRTMASK$(2),CRTMASK$(3),CRTMASK$(4),\
  48.         CRTMASK$(5),CRTMASK$(6),CRTMASK$(7),CRTMASK$(8),CRTMASK$(9),\
  49.         CRTMASK$(10),CRTMASK$(11),CRTMASK$(12),CRTMASK$(13),CRTMASK$(14),\
  50.         CRTMASK$(15),CRTMASK$(16)
  51.         FOR I%=1 TO VERTICAL.LINES%
  52.         SCRATCH$(I%)=CRTMASK$(I%)                REMARK  SAVE CRT MASK ELEMENTS IN SCRATCH ARRAY
  53.         NEXT I%
  54.         RETURN
  55.  
  56. 1200    REMARK    **********  SAVE CRT MASK FILE RECORD  **********
  57.  
  58.     PRINT #1,MASK%; CRTMASK$(1),CRTMASK$(2),CRTMASK$(3),CRTMASK$(4),\
  59.         CRTMASK$(5),CRTMASK$(6),CRTMASK$(7),CRTMASK$(8),CRTMASK$(9),\
  60.         CRTMASK$(10),CRTMASK$(11),CRTMASK$(12),CRTMASK$(13),CRTMASK$(14),\
  61.         CRTMASK$(15),CRTMASK$(16)
  62.     
  63.     IF NEW.RECORD%=YES% THEN NEW.RECORD%=0:\
  64.     CLOSE 1:OPEN FILENAME$ RECL MASK.LENGTH% AS 1
  65.  
  66.     RETURN
  67.  
  68. 2100    REMARK    +++++++++++++++++CURSOR POSITIONING SUBROUTINE++++++++++++++++++
  69.     CONSOLE
  70.  
  71.     LINEFEEDS%= INT(X1/CRT.WIDTH%)+96                REMARK  CALCULATE ROW
  72.     HORIZONTAL%=X1- (LINEFEEDS% * CRT.WIDTH%)            REMARK  CALCULATE COLUMN
  73.  
  74.     IF HORIZONTAL% < 31 THEN HORIZONTAL%=HORIZONTAL%+96        REMARK  ADD SPECIAL OFFSET WHERE 0<= X <= 31
  75.     CHAR%=7EH:GOSUB 801                    REMARK  SEND LEAD-IN CODE
  76.     CHAR%=11H:GOSUB 801                    REMARK  SEND CURSOR ADDRESS CODE
  77.     CHAR%=HORIZONTAL%:GOSUB 801                REMARK  SEND X-COORDINATE
  78.     CHAR%=LINEFEEDS%:GOSUB 801                    REMARK  SEND Y-COORDINATE
  79.     RETURN
  80.  
  81. 6000    PRINT CLEAR.SCREEN$
  82.     X2$="ENTER NAME OF FILE":X2=13:X3=0:X4=0
  83.     GOSUB 665                            REMARK  ENTER CRT MASK FILENAME
  84.     IF END #1 THEN 6000                        REMARK  REJECT INVALID FILENAME
  85.     FILENAME$=X0$
  86.     OPEN FILENAME$ RECL MASK.LENGTH% AS 1                REMARK  OPEN CRT MASK FILE
  87.     PRINT "WORKING...DO NOT INTERRUPT"
  88.  
  89.  
  90.     RECS%=0
  91.     IF END #1 THEN 6007
  92.  
  93.     FOR F%=10 TO 1 STEP -1
  94.     READ #1,(2^F%)+RECS%; X$
  95.     RECS%=RECS% + 2^F%
  96. 6007    NEXT F%
  97.  
  98.  
  99.     EXTENT%=RECS%
  100.     
  101. 6010    PRINT CLEAR.SCREEN$;"CRT MASK FILE MAINTENANCE"            REMARK  PRINT PRORAM ID
  102.     PRINT
  103.     PRINT
  104.     PRINT
  105.     PRINT "(0) END"
  106.     PRINT "(1) INQUIRE"
  107.     PRINT "(2) CHANGE-ADD-REPLACE"
  108.     PRINT "(3) PRINT"
  109.  
  110.     X2=1:X3=0:X4=3:X2$="ENTER OPERATION CODE":GOSUB 665        REMARK  ENTER OPERATION CODE
  111.     IF X0=0 THEN\
  112.     PRINT CLEAR.SCREEN$;"CRTFM EXITING":STOP            REMARK  RETURN TO O/S IF OPERATION IS ZERO
  113.     F%=X0
  114.  
  115.     WHILE F%=1                            REMARK  CRT MASK FILE INQUIRY ROUTINE
  116. 6021        PRINT CLEAR.SCREEN$;"MASK FILE INQUIRY"
  117.         X2=3:X3=0:X4=999:X2$="ENTER FIRST MASK NUMBER"
  118.         GOSUB 665                        REMARK  ENTER FIRST MASK NUMBER TO DISPLAY
  119.         IF X0=0 THEN F%=0:GOTO 6050                REMARK  IF ZERO, EXIT TO OPERATION CODE PROMPT
  120.  
  121.         IF X0>EXTENT% THEN GOTO 6021
  122.         MASK%=X0
  123. 6030        GOSUB 1000                        REMARK  READ CRT MASK FROM DISK
  124.  
  125.         PRINT CLEAR.SCREEN$;
  126.         FOR I%=1 TO VERTICAL.LINES%
  127.         PRINT CRTMASK$(I%)                    REMARK  DISPLAY CRT MASK
  128.         NEXT I%
  129.  
  130. 6035        IF CONSTAT%=0 THEN GOTO 6035 ELSE A%=CONCHAR%        REMARK  WAIT FOR OPERATOR ENTRY
  131.         IF A%=ASC("E") THEN F%=0:GOTO 6050            REMARK  IF "E" WAS ENTERED, TERMINATE ROUTINE
  132.         IF A% <> 0DH THEN GOTO 6035                REMARK  WAIT FOR <RETURN> BEFORE CONTINUING
  133.         MASK%=MASK% + 1
  134.         IF MASK% > EXTENT% THEN F%=0:GOTO 6050
  135.         GOTO 6030                        REMARK  GET NEXT CRT MASK
  136. 6050    WEND                                REMARK  END OF INQUIRY ROUTINE
  137.  
  138.  
  139.     WHILE F%=2                            REMARK  ROUTINE TO CHANGE, ADD OR REPLACE CRT MASK ON FILE 
  140.         PRINT CLEAR.SCREEN$;"CRT MASK FILE CHANGE-ADD-REPLACE"    REMARK  IDENTIFY ROUTINE ON CRT
  141.         ROW%=0:COL%=0
  142.         X2$="ENTER MASK NUMBER TO CHANGE (OR 'NEW')"
  143.         X2=3:X3=0:X4=0:GOSUB 665                REMARK  ENTER MASK NUMBER
  144.         IF X0$="NEW"\
  145.         THEN EXTENT%=EXTENT%+1:\
  146.         MASK%=EXTENT%:\
  147.         NEW.RECORD%=YES%:\
  148.         FOR I%=1 TO VERTICAL.LINES%:\
  149.         CRTMASK$(I%)=LEFT$(BLANK$,CRT.WIDTH%):\
  150.         NEXT I%:\
  151.         PRINT CLEAR.SCREEN$:GOTO 6130
  152.  
  153.  
  154.         IF  MATCH("!",X0$,1) > 0 THEN GOTO 6150            REMARK  RE-PROMPT IF INCORRECT ENTRY
  155.         MASK%=VAL(X0$)                        REMARK  CONVERT ALPHA ENTRY TO MASK NUMBER
  156.         IF MASK%=0 THEN F%=0:GOTO 6150                REMARK  IF ZERO WAS ENTERED, GET OUT OF ROUTINE
  157.         IF MASK% > EXTENT% THEN GOTO 6150
  158.  
  159.         PRINT CLEAR.SCREEN$
  160.         X2$="LINE OR COMPOUND POSITION TO START CHANGES"
  161.         X2=4
  162.         X3=0:X4=(CRT.WIDTH%*VERTICAL.LINES%)-1
  163.         GOSUB 665                        REMARK  ENTER SCREEN POSITION
  164.         ADDR%=X0
  165.  
  166.         IF ADDR% > 15 THEN ROW%=(ADDR% / CRT.WIDTH%):\        REMARK  IF ADDRESS WAS ENTERED, SET SCREEN LOCATION
  167.         COL%=ADDR% - (ROW% * CRT.WIDTH%):\
  168.         X1=ADDR% \
  169.         ELSE\
  170.         ROW%=ADDR%:\
  171.         X2=2:X3=0:X4=CRT.WIDTH%-1:\
  172.         X2$="COLUMN TO START CHANGES":\
  173.         GOSUB 665:\                        REMARK  ENTER X-COORD FOR CHANGES
  174.         COL%=X0:\
  175.         X1=(ROW% * CRT.WIDTH%) + COL%
  176.  
  177. 6125        GOSUB 1000                        REMARK  READ CRT MASK FROM FILE
  178.         PRINT CLEAR.SCREEN$;
  179.         FOR I%=1 TO VERTICAL.LINES%
  180.         PRINT CRTMASK$(I%)                    REMARK  DISPLAY THE MASK BEING CHANGED
  181.         NEXT I%
  182.         GOSUB 2100                        REMARK  POSITION THE CURSOR TO CHANGE POINT
  183. 6130        IF CONSTAT%=0 THEN GOTO 6130 
  184.         A%=CONCHAR%                        REMARK  ACCEPT CHARACTER FROM KEYBOARD
  185.  
  186.         IF A% >= 20H AND A% <= 7EH THEN GOTO 6140        REMARK  IF ENTRY WAS VALID ASCII, THEN PROCESS IT
  187.  
  188.         IF A%=UP.CRSR%  AND ROW% > 0\
  189.         THEN CHAR%=LEAD.IN%:GOSUB 801:\                REMARK  MOVE CURSOR UP IF CONTROL-U PRESSED
  190.         CHAR%=UP.CURSOR%:GOSUB 801:\
  191.         ROW%=ROW%-1:GOTO 6130
  192.  
  193.         IF A%=DOWN.CRSR% AND ROW% < VERTICAL.LINES%-1\
  194.         THEN\
  195.         CHAR%=LEAD.IN%:GOSUB 801:\
  196.         CHAR%=DOWN.CURSOR%:GOSUB 801:\                REMARK  PRINT DOWN-CURSOR IF CTRL-D
  197.         ROW%=ROW%+1:\
  198.         GOTO 6130
  199.  
  200.         IF A%=LEFT.CRSR% AND COL% > 0 THEN\
  201.         CHAR%=BACKSPACE%:\                    REMARK  MOVE CURSOR LEFT IF BACKSPACE WAS DEPRESSED
  202.         GOSUB 801:\
  203.         COL%=COL% - 1:\
  204.         GOTO 6130
  205.  
  206.         IF A% = RIGHT.CRSR% AND COL% < CRT.WIDTH%-1\        REMARK  IF CTRL-R WAS DEPRESSED, MOVE CURSOR RIGHT
  207.         THEN\        
  208.         CHAR%=RIGHT.CURSOR%:GOSUB 801:\
  209.         COL%=COL%+1:\
  210.         GOTO 6130
  211.  
  212.         IF A% = 0DH AND ROW% >= VERTICAL.LINES% -1 THEN\    REMARK  SAVE THE MASK IF DONE WITH CHANGES
  213.         GOSUB 1200:F%=0:GOTO 6150                REMARK  THEN PROMPT FOR OPERATION CODE
  214.         IF A% = 0DH THEN\
  215.         ROW%=ROW% + 1:\
  216.         CHAR%=0DH:GOSUB 801:CHAR%=0AH:GOSUB 801:\        REMARK  IF CARRIAGE RETURN, MOVE CURSOR TO NEW LINE
  217.         COL%=0:\
  218.         GOTO 6130
  219.  
  220.         IF A% = HOME.CRSR% THEN CHAR%=LEAD.IN%:\        REMARK  SEND CURSOR HOME AND RESET X-Y COORDINATES
  221.         GOSUB 801:\
  222.         CHAR%=CURSOR.HOME%:GOSUB 801:\
  223.         ROW%=0:\
  224.         COL%=0:\
  225.         GOTO 6130
  226.  
  227.         IF A% = CTRL.I% THEN \                    REMARK  IF TAB CHARACTER WAS HIT, IGNORE CHANGES AND
  228.         PRINT CLEAR.SCREEN$;:\                    REMARK  RE-DISPLAY MASK FOR ANOTHER CHANGE ATTEMPT
  229.         FOR I%=1 TO 16:\
  230.         CRTMASK$(I%)=SCRATCH$(I%):\
  231.         PRINT CRTMASK$(I%):\
  232.         NEXT I%:\
  233.         ROW%=0:COL%=0:\
  234.         X1=0:GOSUB 2100
  235.         GOTO 6130
  236.  
  237.  
  238. 6140        IF A% < 20H OR A% > 7AH THEN GOTO 6130
  239.         IF COL% > CRT.WIDTH%-1 THEN\                REMARK  ACCEPT VALID ASCII CHARACTER ENTRY
  240.         CHAR%=BACKSPACE%:GOSUB 801:\
  241.         CHAR%=20H:GOSUB 801:\                    REMARK  REJECT ENTRIES PAST X-AXIS BOUNDARY
  242.         CHAR%=BACKSPACE%:GOSUB 801:\
  243.         GOTO 6130
  244.         D%=COL%+2
  245.         IF COL% < 1 THEN\
  246.         CRTMASK$(ROW%+1)=CHR$(A%)+MID$(CRTMASK$(ROW%+1),2,CRT.WIDTH%)\
  247.         ELSE\
  248.         CRTMASK$(ROW%+1)=LEFT$(CRTMASK$(ROW%+1),COL%)\
  249.         +CHR$(A%)+MID$(CRTMASK$(ROW%+1),D%,CRT.WIDTH%)
  250.         COL%=COL%+1
  251.         GOTO 6130
  252. 6150    WEND
  253.  
  254.     WHILE F%=3
  255.         CONSOLE
  256.         PRINT CLEAR.SCREEN$;"CRT MASK FILE PRINT"
  257.         X2$="ENTER FIRST MASK NUMBER (0 IF NONE)"
  258.         X2=3:X3=0:X4=999:GOSUB 665                REMARK  ENTER FIRST MASK TO PRINT
  259.         IF X0=0 THEN F%=0:GOTO 6200                REMARK  EXIT ROUTINE IF ZERO WAS ENTERED
  260.         FIRST%=X0
  261.         X3=FIRST%
  262.         X2$="ENTER LAST MASK NUMBER"
  263.         GOSUB 665                        REMARK  ENTER LAST MASK TO PRINT
  264.         LAST%=X0
  265.         IF LAST% > EXTENT% THEN LAST% = EXTENT%
  266.         IF FIRST% > EXTENT% THEN GOTO 6200
  267.         LPRINTER
  268.         MASK%=FIRST%
  269.  
  270.         WHILE MASK% <= LAST%
  271.             IF CONSTAT% <> 0 THEN\
  272.             MASK%=LAST%+1:GOTO 6180
  273.             GOSUB 1000                        REMARK  READ MASK FROM FILE
  274.             PRINT CHR$(0CH)                        REMARK  PRINT FORM FEED
  275.             FOR I%=1 TO VERTICAL.LINES%
  276.             PRINT CRTMASK$(I%)                    REMARK  PRINT CRT MASK ON PRINTER
  277.             NEXT I%
  278.             MASK%=MASK%+1
  279. 6180        WEND
  280.  
  281. 6200    WEND
  282.         GOTO 6010
  283.