home *** CD-ROM | disk | FTP | other *** search
/ ftp.barnyard.co.uk / 2015.02.ftp.barnyard.co.uk.tar / ftp.barnyard.co.uk / cpm / walnut-creek-CDROM / SIMTEL / CPMUG / CPMUG044.ARK / CRTFM.BAS < prev    next >
BASIC Source File  |  1984-04-29  |  9KB  |  329 lines

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