home *** CD-ROM | disk | FTP | other *** search
/ Power Programming / powerprogramming1994.iso / progtool / dskutl / hdsource.arc / SCRMGR.ASM < prev    next >
Assembly Source File  |  1986-05-17  |  40KB  |  1,152 lines

  1.      PAGE     86,132            ;PAGE WIDTH, LENGTH
  2.      TITLE     SCREEN INPUT/OUTPUT MANAGER
  3. ; *********************************************************************
  4. ; *                                      *
  5. ; *     AUTHOR:     JIM BRACKING                      *
  6. ; *     MODULE NAME:     SCRMGR                       *
  7. ; *     VERSION:     1:0                          *
  8. ; *     DECRIPTION:     THIS MODULE IS CALLED BY OTHER PROGRAMS TO   *
  9. ; *             PERFORM THE FOLLOWING FUNCTION:          *
  10. ; *                                      *
  11. ; *             1: SCREEN WRITES.                  *
  12. ; *             2: SCREEN INPUT AND EDITING.              *
  13. ; *                                      *
  14. ; *             ALL SCREEN WRITES ARE DIRECT TO THE VIDEO    *
  15. ; *             RAM.                          *
  16. ; *                                      *
  17. ; *     PARAMETERS:     AH = FUNCTION CODE                  *
  18. ; *                                      *
  19. ; *             00 = SCREEN WRITE                  *
  20. ; *             01 = SCREEN INPUT                  *
  21. ; *             02 = SET BORDER COLOR                  *
  22. ; *                AL = BORDER COLOR                  *
  23. ; *             03 = CLEAR THE SCREEN                  *
  24. ; *                AL = ATTRIBUTE                  *
  25. ; *                BH = STARTING ROW                  *
  26. ; *                BL = STARTING COLUMN              *
  27. ; *                CH = ENDING ROW                  *
  28. ; *                CL = ENDING COLUMN                  *
  29. ; *             04 = SCROLL SCREEN UP 1 LINE              *
  30. ; *                AL = ATTRIBUTE                  *
  31. ; *                BH = STARTING ROW                  *
  32. ; *                BL = STARTING COLUMN              *
  33. ; *                CH = ENDING ROW                  *
  34. ; *                CL = ENDING COLUMN                  *
  35. ; *             05 = WRITE CHARACTER                  *
  36. ; *                AL = ATTRIBUTE                  *
  37. ; *                BH = ROW                      *
  38. ; *                BL = COLUMN                   *
  39. ; *                CH = CHARACTER                  *
  40. ; *                CL = COUNT                      *
  41. ; *                                      *
  42. ; *                                      *
  43. ; *             ES:BX = POINTER TO PARAMETER LIST USED FOR   *
  44. ; *                 SCREEN INPUT/OUTPUT              *
  45. ; *                                      *
  46. ; *     OUTPUTS:     AH = CURSOR POSITION IN CURRENT ENTRY          *
  47. ; *             AL = RETURN CODE                  *
  48. ; *                  FF = ERROR                  *
  49. ; *                  NN = EXTENDED KEY CODE              *
  50. ; *             BX = OFFSET OF CURRENT ENTRY              *
  51. ; *                                      *
  52. ; *********************************************************************
  53. ;
  54. ; *********************************************************************
  55. ; *              LET THE OTHERS KNOW ABOUT US              *
  56. ; *********************************************************************
  57.      PUBLIC  SCRMGR
  58. ;
  59.      IF1
  60.      INCLUDE SCRNWORK.MAC
  61.      ENDIF
  62. ;
  63. ;
  64. CSEG     SEGMENT PUBLIC 'CODE'
  65.      ASSUME  CS:CSEG
  66. SCRMGR     PROC     NEAR
  67.      PUSH     AX               ;SAVE AX
  68.      PUSH     BX               ;SAVE BX
  69.      PUSH     CX               ;SAVE CX
  70.      PUSH     DX               ;SAVE DX
  71.      PUSH     DI               ;SAVE DI
  72.      PUSH     SI               ;SAVE SI
  73.      PUSH     DS               ;SAVE DS
  74.      PUSH     ES               ;SAVE ES
  75.      PUSH     BP               ;SAVE BP
  76.      PUSH     AX               ;SAVE AX
  77.      PUSH     CS               ;ESTABLISH
  78.      POP     DS               ;  DATA
  79.      ASSUME  DS:CSEG           ;    SEGMENT
  80.      JMP     BY_INFO           ;JMP AROUND COPYRIGHT
  81.      DB     'COPYRIGHT (C) ATI 1984 '
  82.      DB     'PROGRAM - SCRMGR '
  83.      DB     ' VERSION 1.10  11/20/84'
  84. ;
  85.      INCLUDE SCRNWORK.ASM
  86. ;
  87. ; *********************************************************************
  88. ; *                                      *
  89. ; *                GENERAL WORK AREAS                  *
  90. ; *                                      *
  91. ; *********************************************************************
  92. WORK_IN  LABEL     BYTE               ;WORK AREA
  93. ROW     DB     0               ;CURRENT ROW
  94. COL     DB     0               ;CURRENT COLUMN
  95. ENTSEG     DW     0               ;SEGMENT OF PARM ENTRY
  96. ENTOFF     DW     0               ;OFFSET OF PARM ENTRY
  97. PARMSEG  DW     0               ;PARM SEGMENT
  98. PARMOFF  DW     0               ;PARM OFFSET
  99. SW1     DB     0               ;SWITCH1 INDICATORS
  100. CAPS     EQU     080H               ;CAPS ON
  101. INS     EQU     040H               ;INSERT ACTIVE
  102. COLOR     EQU     020H               ;COLOR MONITOR
  103. MONO     EQU     010H               ;MONOCHROME MONITOR
  104. XLIST     EQU     008H               ;LIST REQUEST
  105. ADV     EQU     004H               ;ENHANCED GRAFICS ADAPTER
  106. NORM_CUR DW     0               ;NORMAL CURSOR
  107. WIDE_CUR DW     0               ;WIDE CURSOR
  108. SW2     DB     0               ;SPECIAL CHARACTER SWITCH
  109. DP     EQU     080H               ;DECIMAL POINT
  110. MS     EQU     040H               ;MINUS SIGN
  111. RETURN     DB     0               ;RETURN CODE
  112. CURPOS     DB     0               ;CURSOR POSITION FOR THIS ENTRY
  113. ;
  114. ; **********************************************************************
  115. ; *                                       *
  116. ; *             EXTENDED KEY TABLE                   *
  117. ; *                                       *
  118. ; **********************************************************************
  119. EX_KEY     LABEL     BYTE
  120.      DB     132 DUP(0)
  121.      ORG     $-132
  122.      ORG     EX_KEY+15
  123.      DB     TL_INDEX           ;TAB LEFT
  124.      ORG     EX_KEY+59
  125.      DB     0FFH,0FFH,0FFH,0FFH,0FFH   ;FUNCTION KEYS 1 TO 5
  126.      DB     0FFH,0FFH,0FFH,0FFH,0FFH   ;FUNCTION KEYS 6 TO 10
  127.      ORG     EX_KEY+71
  128.      DB     HO_INDEX           ;HOME KEY
  129.      ORG     EX_KEY+72
  130.      DB     CU_INDEX           ;CURSOR UP
  131.      ORG     EX_KEY+73
  132.      DB     0FFH               ;PAGE UP
  133.      ORG     EX_KEY+75
  134.      DB     CL_INDEX           ;CURSOR LEFT
  135.      ORG     EX_KEY+77
  136.      DB     CR_INDEX           ;CURSOR RIGHT
  137.      ORG     EX_KEY+79
  138.      DB     0FFH               ;END
  139.      ORG     EX_KEY+80
  140.      DB     CD_INDEX           ;CURSOR DOWN
  141.      ORG     EX_KEY+81
  142.      DB     0FFH               ;PAGE DOWN
  143.      ORG     EX_KEY+82
  144.      DB     IN_INDEX           ;INSERT
  145.      ORG     EX_KEY+83
  146.      DB     DE_INDEX           ;DELETE
  147.      ORG     EX_KEY+84
  148.      DB     0FFH,0FFH,0FFH,0FFH,0FFH   ;FUNCTION KEYS 11 TO 15
  149.      DB     0FFH,0FFH,0FFH,0FFH,0FFH   ;FUNCTION KEYS 16 TO 20
  150.      ORG     EX_KEY+94
  151.      DB     0FFH,0FFH,0FFH,0FFH,0FFH   ;FUNCTION KEYS 21 TO 25
  152.      DB     0FFH,0FFH,0FFH,0FFH,0FFH   ;FUNCTION KEYS 26 TO 30
  153.      ORG     EX_KEY+104
  154.      DB     0FFH,0FFH,0FFH,0FFH,0FFH   ;FUNCTION KEYS 31 TO 35
  155.      DB     0FFH,0FFH,0FFH,0FFH,0FFH   ;FUNCTION KEYS 36 TO 40
  156.      ORG     EX_KEY+132
  157. ; **********************************************************************
  158. ; *                                       *
  159. ; *        TRANSLATE TABLE FOR GET_INPUT ROUTINE               *
  160. ; *                                       *
  161. ; **********************************************************************
  162. TRANTBL  LABEL     BYTE
  163.      DB     128 DUP(0)
  164.      ORG     $-128
  165.      DB     0FFH,0FFH,0FFH
  166.      DB     CB_INDEX           ;CONTROL BREAK
  167.      DB     0FFH,0FFH,0FFH,0FFH
  168.      DB     0FFH,0FFH,0FFH,0FFH,0FFH,0FFH,0FFH,0FFH
  169.      DB     0FFH,0FFH,0FFH,0FFH,0FFH,0FFH,0FFH,0FFH
  170.      DB     0FFH,0FFH,0FFH,0FFH,0FFH,0FFH,0FFH,0FFH
  171.      ORG     TRANTBL+08
  172.      DB     BS_INDEX           ;BACKSPACE
  173.      ORG     TRANTBL+09
  174.      DB     TR_INDEX           ;TAB RIGHT
  175.      ORG     TRANTBL+13
  176.      DB     EN_INDEX           ;ENTER
  177.      ORG     TRANTBL+27
  178.      DB     ES_INDEX           ;ESC KEY
  179.      ORG     TRANTBL+126
  180.      DB     0FFH,0FFH
  181. ; *********************************************************************
  182. ; *                                      *
  183. ; *                                      *
  184. ; *                                      *
  185. ; *********************************************************************
  186. BY_INFO:
  187.      CMP     CS:VI_BASE,0           ;INIT COMPLETE??
  188.      JE     INIT               ;NO
  189.      JMP     INIT_20           ;YES
  190. INIT:
  191.      XOR     AH,AH               ;SET B&W
  192.      MOV     AL,2               ;  80 COLUMN
  193.      INT     10H               ;DO IT
  194.      MOV     AH,05H            ;SET ACTIVE
  195.      XOR     AL,AL               ;  PAGE TO ZERO
  196.      INT     10H               ;DO IT
  197.      INT     11H               ;GET CONFIGURATION
  198.      AND     AL,30H            ;ONLY INTERESTED IN VIDEO SWITCHES
  199.      PUSH     CX               ;SAVE CX
  200.      MOV     CL,4               ;SHIFT COUNT
  201.      SHR     AL,CL               ;ALIGN IT
  202.      POP     CX               ;RESTORE CX
  203.      CMP     AL,00H            ;ENHANCED ADAPTER??
  204.      JNE     INIT_00A           ;NO
  205.      MOV     CS:VI_BASE,0B800H     ;ENHANCED ADAPTER
  206.      MOV     AL,CS:SW1           ;INDICATE
  207.      OR     AL,ADV            ;ENHANCED ADAPTER
  208.      MOV     CS:SW1,AL
  209.      MOV     AX,000BH           ;WIDE CURSOR
  210.      MOV     CS:WIDE_CUR,AX        ;AND SAVE IT
  211.      MOV     AX,0B0CH           ;NORMAL CURSOR
  212.      MOV     CS:NORM_CUR,AX        ;AND SAVE IT
  213.      JMP     INIT_10           ;CONTINUE
  214. INIT_00A:
  215.      CMP     AL,03H            ;MONOCHROME??
  216.      JNE     INIT_05           ;NO - MUST BE COLOR
  217.      MOV     CS:VI_BASE,0B000H     ;MONOCHROME BASE ADDRESS
  218.      MOV     AL,CS:SW1           ;INDICATE
  219.      OR     AL,MONO           ;MONOCHROME MONITOR
  220.      MOV     CS:SW1,AL
  221. INIT_00:
  222.      MOV     AX,000BH           ;WIDE CURSOR
  223.      MOV     CS:WIDE_CUR,AX        ;AND SAVE IT
  224.      MOV     AX,0B0CH           ;NORMAL CURSOR
  225.      MOV     CS:NORM_CUR,AX        ;AND SAVE IT
  226.      JMP     INIT_10           ;CONTINUE
  227. INIT_05:
  228.      MOV     CS:VI_BASE,0B800H     ;COLOR BASE ADDRESS
  229.      MOV     AL,CS:SW1           ;INDICATE
  230.      OR     AL,COLOR           ;COLOR MONITOR
  231.      MOV     CS:SW1,AL
  232.      MOV     AX,0007H           ;WIDE CURSOR
  233.      MOV     CS:WIDE_CUR,AX        ;AND SAVE IT
  234.      MOV     AX,0707H           ;NORMAL CURSOR
  235.      MOV     CS:NORM_CUR,AX        ;AND SAVE IT
  236. INIT_10:
  237.      POP     AX               ;RESTORE AX
  238.      PUSH     AX               ;SAVE AX
  239. INIT_20:
  240.      MOV     CS:ENTOFF,BX           ;SAVE FIRST ENTRY
  241.      MOV     CS:RETCODE,0           ;ZERO RETURN CODE
  242.      MOV     AL,AH               ;FUNCTION CODE
  243.      XOR     AH,AH               ;CLEAR AH
  244.      CMP     AX,CS:TBL_LIMIT       ;BAD CALL??
  245.      JAE     ERROR_RET           ;YES
  246.      SHL     AL,1               ;ESTABLISH
  247.      MOV     SI,AX               ;  INDEX
  248.      POP     AX               ;RESTORE AX
  249.      JMP     WORD PTR CS:[SI+OFFSET FUNCTION_TABLE]
  250. ERROR_RET:
  251.      POP     AX               ;RESTORE AX
  252.      MOV     CS:RETCODE,0FFH       ;INDICATE ERROR
  253.      JMP     EXIT               ;AND EXIT
  254. ;
  255. FUNCTION_TABLE LABEL WORD
  256.      DW     SCREEN_OUTPUT
  257.      DW     SCREEN_INPUT
  258.      DW     SET_BORDER
  259.      DW     CLR_SCREEN
  260.      DW     SCROLL_UP
  261.      DW     WRITE_CHAR
  262. TBL_LIMIT EQU     ($-FUNCTION_TABLE)/2
  263. SCRMGR     ENDP
  264. ; *********************************************************************
  265. ; *                                      *
  266. ; *                 BLANK THE SCREEN                  *
  267. ; *                                      *
  268. ; *********************************************************************
  269. CLR_SCREEN PROC
  270.      MOV     DX,CX               ;ENDING ROW + COLUMN
  271.      MOV     CH,BH               ;STARTING ROW
  272.      MOV     CL,BL               ;STARTING COLUMN
  273.      MOV     BH,AL               ;SET ATTRIBUTE CHARACTER
  274.      XOR     AL,AL               ;NUMBER OF LINES TO SCROLL
  275.      XOR     BL,BL               ;CLEAR BL
  276.      MOV     AH,7               ;SCROLL ACTIVE PAGE DOWN
  277.      INT     10H               ;CLEAR THE SCREEN
  278.      JMP     EXIT               ;AND EXIT
  279. CLR_SCREEN ENDP
  280. ; *********************************************************************
  281. ; *                                      *
  282. ; *               SCROLL UP ONE LINE                  *
  283. ; *                                      *
  284. ; *********************************************************************
  285. SCROLL_UP PROC
  286.      MOV     DX,CX               ;ENDING ROW + COLUMN
  287.      MOV     CH,BH               ;STARTING ROW
  288.      MOV     CL,BL               ;STARTING COLUMN
  289.      MOV     BH,AL               ;SET ATTRIBUTE CHARACTER
  290.      MOV     AL,1               ;NUMBER OF LINES TO SCROLL
  291.      XOR     BL,BL               ;CLEAR BL
  292.      MOV     AH,6               ;SCROLL ACTIVE PAGE UP
  293.      INT     10H               ;SCROLL THE SCREEN
  294.      JMP     EXIT               ;AND EXIT
  295. SCROLL_UP ENDP
  296. ; *********************************************************************
  297. ; *                                      *
  298. ; *             WRITE CHARACTER ROUTINE              *
  299. ; *                                      *
  300. ; *********************************************************************
  301. WRITE_CHAR PROC
  302.      PUSH     ES               ;SAVE ES
  303.      PUSH     AX               ;SAVE AX
  304.      PUSH     BX               ;SAVE BX
  305.      PUSH     CX               ;SAVE CX
  306.      PUSH     DX               ;SAVE DX
  307.      PUSH     SI               ;SAVE SI
  308.      PUSH     DI               ;SAVE DI
  309.      PUSH     AX               ;SAVE AX
  310.      MOV     AX,CS:VI_BASE           ;ESTABLISH
  311.      MOV     ES,AX               ;  VIDEO BASE
  312.      XOR     AX,AX               ;CLEAR AX
  313.      MOV     AL,BH               ;CALCULATE
  314.      MUL     CS:LINE_LEN           ;  OFFSET TO LINE
  315.      ADD     AL,BL               ;INCLUDE COLUMN
  316.      JNC     WC_00               ;IF NO CARRY
  317.      ADD     AH,1               ;OTHERWISE ADDJUST
  318. WC_00:
  319.      SHL     AX,1               ;ALLOW FOR ATTRIBUTE
  320.      MOV     DI,AX               ;ESTABLISH OFFSET
  321.      POP     AX               ;RESTORE AX
  322.      MOV     AH,AL               ;ATTRIBUTE
  323.      MOV     AL,CH               ;CHARACTER
  324. WC_10:
  325.      XOR     CH,CH               ;CLEAR CH
  326.      CLD                   ;SET DIRECTION
  327. WC_12:
  328.      PUSH     AX               ;SAVE AX
  329.      TEST     CS:SW1,MONO           ;MONOCHROME DISPLAY??
  330.      JNZ     WC_18               ;YES - SKIP STUFF FOR COLOR
  331.      MOV     DX,03DAH           ;VIDEO STAT REGISTER
  332.      STI                   ;ENABLE INTERRUPTS
  333. WC_15:
  334.      IN     AL,DX               ;READ STAT REGISTER
  335.      TEST     AL,01H            ;VIDEO RAM AVAILABLE??
  336.      JNZ     WC_15               ;YES - WAIT FOR NEXT CYCLE
  337. WC_16:
  338.      IN     AL,DX               ;READ STAT REGISTER
  339.      TEST     AL,01H            ;VIDEO RAM AVAILABLE??
  340.      JZ     WC_16               ;NO - WAIT FOR IT
  341. WC_18:
  342.      POP     AX               ;RESTORE AX
  343.      CLI                   ;DISABLE INTERRUPTS
  344. WC_20:
  345.      STOSW                   ;WRITE THE CHARACTER AND ATTRIBUTE
  346.      LOOP     WC_20               ;LOOP UNTILL DONE
  347.      STI                   ;ENABLE INTERRUPTS
  348. WC_EXIT:
  349.      POP     DI               ;RESTORE DI
  350.      POP     SI               ;RESTORE SI
  351.      POP     DX               ;RESTORE DX
  352.      POP     CX               ;RESTORE CX
  353.      POP     BX               ;RESTORE BX
  354.      POP     AX               ;RESTORE AX
  355.      POP     ES               ;RESTORE ES
  356.      JMP     EXIT               ;RETURN
  357. WRITE_CHAR ENDP
  358. ; *********************************************************************
  359. ; *                                      *
  360. ; *               SET THE BORDER COLOR               *
  361. ; *                                      *
  362. ; *********************************************************************
  363. SET_BORDER PROC
  364.      PUSH     DX               ;SAVE DX
  365.      MOV     DX,03D9H           ;REGISTER FOR BORDER COLOR
  366.      AND     AL,0FH            ;CLEAN IT UP
  367.      OUT     DX,AL               ;SET BORDER COLOR
  368.      POP     DX               ;RESTORE DX
  369.      JMP     EXIT               ;A HARD DAYS WORK
  370. SET_BORDER ENDP
  371. ; *********************************************************************
  372. ; *                                      *
  373. ; *               SCREEN OUTPUT MANAGER              *
  374. ; *                                      *
  375. ; *********************************************************************
  376. SCREEN_OUTPUT PROC
  377.      MOV     CS:PARMSEG,ES           ;SAVE SEGMENT
  378.      MOV     CS:PARMOFF,BX           ;  AND OFFSET
  379.      PUSH     ES               ;ESTABLISH INPUT
  380.      POP     DS               ;  SEGMENT
  381.      CALL     SET_FIELDS           ;INIT ALL FIELDS
  382. SCREEN_O_00:
  383.      OR     CS:SW1,XLIST           ;LIST REQUEST
  384.      CALL     WRITE_DATA           ;WRITE THIS LIST
  385.      MOV     CS:RETCODE,0           ;SET RETURN CODE
  386.      JMP     EXIT               ;YES - RETURN
  387. SCREEN_OUTPUT ENDP
  388. ; *********************************************************************
  389. ; *                                      *
  390. ; *               SCREEN INPUT MANAGER                  *
  391. ; *                                      *
  392. ; *********************************************************************
  393. SCREEN_INPUT PROC
  394.      MOV     CS:PARMSEG,ES           ;SAVE SEGMENT
  395.      MOV     CS:PARMOFF,BX           ;  AND OFFSET
  396.      PUSH     ES               ;ESTABLISH INPUT
  397.      POP     DS               ;  SEGMENT
  398.      TEST     CS:SW1,INS           ;INSENSERT MODE??
  399.      JZ     SCREEN_I_A0           ;NO
  400.      PUSH     AX               ;SAVE AX
  401.      PUSH     CX               ;SAVE CX
  402.      MOV     CX,CS:WIDE_CUR        ;WIDE CURSOR
  403.      MOV     AH,1               ;FUNCTION
  404.      INT     10H               ;CALL BIOS
  405.      POP     CX               ;RESTORE CX
  406.      POP     AX               ;RESTORE AX
  407. SCREEN_I_A0:
  408.      TEST     [BX].S_OPT,@LABEL     ;A DATA INPUT FIELD??
  409.      JZ     SCREEN_I_X0           ;YES
  410.      CALL     GET_NEXT_OUTPUT       ;GET NEXT ENTRY
  411.      CMP     BX,CS:PARMOFF           ;ALL DONE??
  412.      JNE     SCREEN_I_A0           ;NO
  413.      MOV     CS:RETCODE,0FFH       ;ERROR RETURN CODE
  414.      JMP     EXIT               ;AND EXIT
  415. SCREEN_I_X0:
  416.      CALL     SET_FIELDS           ;INIT ALL FIELDS
  417. SCREEN_I_00:
  418.      MOV     DX,0               ;RELATIVE CURSOR OFFSET
  419.      CALL     UPDATE_CURSOR           ;UPDATE CURSOR POSITION
  420. SCREEN_I_05:
  421.      CALL     GET_INPUT           ;GET SOMETHING FROM THE KEYBOARD
  422.      PUSH     BX               ;SAVE BX
  423.      MOV     BL,AH               ;RESULT INDEX
  424.      XOR     BH,BH               ;CLEAR BH
  425.      SHL     BL,1               ;TRUE INDEX
  426.      MOV     SI,BX               ;BRANCH INDEX
  427.      POP     BX               ;RESTORE BX
  428.      JMP     WORD PTR CS:[SI + OFFSET FUNC_TABLE]
  429. ;
  430. FUNC_TABLE LABEL WORD
  431.      DW     DATA               ;DATA RETURNED
  432. D_INDEX  EQU     ($-FUNC_TABLE)/2-1
  433.      DW     ENTER               ;ENTER KEY
  434. EN_INDEX EQU     ($-FUNC_TABLE)/2-1
  435.      DW     ESC_KEY           ;ESC KEY
  436. ES_INDEX EQU     ($-FUNC_TABLE)/2-1
  437.      DW     CTRL_BK           ;CONTROL BREAK
  438. CB_INDEX EQU     ($-FUNC_TABLE)/2-1
  439.      DW     CURSRT            ;CURSOR RIGHT
  440. CR_INDEX EQU     ($-FUNC_TABLE)/2-1
  441.      DW     CURSLF            ;CURSOR LEFT
  442. CL_INDEX EQU     ($-FUNC_TABLE)/2-1
  443.      DW     CURSDN            ;CURSOR DOWN
  444. CD_INDEX EQU     ($-FUNC_TABLE)/2-1
  445.      DW     CURSUP            ;CURSOR UP
  446. CU_INDEX EQU     ($-FUNC_TABLE)/2-1
  447.      DW     TABRT               ;TAB RIGHT
  448. TR_INDEX EQU     ($-FUNC_TABLE)/2-1
  449.      DW     TABLF               ;TAB LEFT
  450. TL_INDEX EQU     ($-FUNC_TABLE)/2-1
  451.      DW     INS_KEY           ;INSERT KEY
  452. IN_INDEX EQU     ($-FUNC_TABLE)/2-1
  453.      DW     DEL_KEY           ;DELETE KEY
  454. DE_INDEX EQU     ($-FUNC_TABLE)/2-1
  455.      DW     HOME_KEY           ;DELETE KEY
  456. HO_INDEX EQU     ($-FUNC_TABLE)/2-1
  457.      DW     BACKSPACE           ;DELETE KEY
  458. BS_INDEX EQU     ($-FUNC_TABLE)/2-1
  459.      DW     EXTENDED_KEY           ;PGUP,PGDN,FUNCTION KEYS
  460. EX_INDEX EQU     ($-FUNC_TABLE)/2-1    ;EXTENDED KEY INDEX
  461. ; *********************************************************************
  462. ; *                                      *
  463. ; *            PROCESS THE DATA BYTE JUST READ              *
  464. ; *                                      *
  465. ; *********************************************************************
  466. DATA:
  467.      CMP     DL,[BX].S_LEN           ;EXCEEDED MAX COLUMN??
  468.      JAE     DATA_ERR           ;YES
  469.      TEST     [BX].S_OPT,@NUM       ;NUMERIC ONLY??
  470.      JZ     DATA_05           ;NO
  471.      CALL     CHK_NUMERIC           ;VALIDATE IT
  472.      JC     DATA_ERR           ;FAILED
  473. DATA_05:
  474.      TEST     [BX].S_OPT,@ALPHA     ;ALPHA ONLY??
  475.      JZ     DATA_10           ;NO
  476.      CALL     CHK_ALPHA           ;VALIDATE IT
  477.      JC     DATA_ERR           ;FAILED
  478. DATA_10:
  479.      TEST     [BX].S_OPT,@YN        ;YES OR NO??
  480.      JZ     DATA_15           ;NO
  481.      CALL     CHK_YN            ;VALIDATE IT
  482.      JC     DATA_ERR           ;FAILED
  483. DATA_15:
  484.      TEST     [BX].S_OPT,@UC        ;CONVERT TO UPPER CASE??
  485.      JZ     DATA_20           ;NO
  486.      CMP     AL,060H           ;ALPHA??
  487.      JBE     DATA_20           ;NO
  488.      CMP     AL,07BH           ;ALPHA??
  489.      JAE     DATA_20           ;NO
  490.      AND     AL,0FFH-020H           ;CONVERT TO UPPER CASE
  491.      JMP     DATA_20           ;CONTINUE
  492. ;
  493. DATA_ERR:
  494.      CALL     BEEP               ;RING THE BELL
  495.      JMP     SCREEN_I_05           ;TRY AGAIN
  496. ;
  497. DATA_20:
  498.      TEST     CS:SW1,INS           ;INSERT MODE??
  499.      JNZ     DATA_30           ;YES
  500.      CLD                   ;FORWARD DIRECTION
  501.      LEA     DI,[BX].S_DATA        ;DATA OFFSET
  502.      ADD     DI,DX               ;CURRENT COLUMN
  503.      STOSB                   ;STORE BYTE IN DATA FIELD
  504. ;     OR     [BX].S_OPT,@CHG       ;FIELD CHANGED
  505.      MOV     AH,[BX].S_LEN           ;FETCH MAX LENGTH
  506.      DEC     AH               ;MAX COLUMN
  507.      CMP     DL,AH               ;MAX COLUMN??
  508.      JE     DATA_28           ;YES - NO CURSOR UPDATE
  509. ;     INC     DX               ;UPDATE CURSOR OFFSET
  510. DATA_28:
  511.      JMP     DATA_50           ;GO DISPLAY IT
  512. DATA_30:
  513.      CALL     FIND_LEN           ;GET DATA LENGTH
  514.      CMP     CL,[BX].S_LEN           ;ROOM FOR INSERT??
  515.      JAE     DATA_ERR           ;NO
  516.      CMP     CL,DL               ;NEED TO SHIFT DATA??
  517.      JE     DATA_32           ;NO
  518.      CMP     CL,DL               ;NEED TO SHIFT DATA??
  519.      JAE     DATA_33           ;YES
  520. DATA_32:
  521.      LEA     DI,[BX].S_DATA        ;DATA OFFSET
  522.      ADD     DI,DX               ;ADD OFFSET
  523.      STOSB                   ;STORE THE DATA
  524. ;     OR     [BX].S_OPT,@CHG       ;FIELD CHANGED
  525.      JMP     DATA_50           ;CONTINUE
  526. DATA_33:
  527.      LEA     DI,[BX].S_DATA        ;DATA OFFSET
  528.      ADD     DI,CX               ;DESTINATION
  529.      MOV     SI,DI               ;SOURCE
  530.      DEC     SI               ;  OFFSET
  531.      SUB     CL,DL               ;COMPUTE LENGTH
  532.      STD                   ;REVERSE DIRECTION
  533. DATA_35:
  534.      MOVSB                   ;MOVE A BYTE
  535.      LOOP     DATA_35           ;NEXT BYTE
  536.      STOSB                   ;INSERT DATA BYTE
  537. ;     OR     [BX].S_OPT,@CHG       ;FIELD CHANGED
  538. DATA_50:
  539.      INC     DX               ;UPDATE CURSOR OFFSET
  540.      CALL     WRITE_DATA           ;DISPLAY IT ON THE SCREEN
  541.      CMP     DL,[BX].S_LEN           ;MAX COLUMN??
  542.      JNE     DATA_52           ;NO
  543.      TEST     CS:SW1,INS           ;IN INSERT MODE??
  544.      JNZ     DATA_52           ;YES - STAY HERE
  545.      TEST     [BX].S_OPT,@NFULL     ;NEXT LINE WHEN FULL??
  546.      JZ     DATA_52           ;NO
  547.      JMP     TABRT               ;MOVE THE CURSOR
  548. DATA_52:
  549.      CALL     UPDATE_CURSOR           ;POSITION THE CURSOR
  550.      JMP     SCREEN_I_05           ;NEXT
  551. ; *********************************************************************
  552. ; *                                      *
  553. ; *             PROCESS THE ENTER KEY                  *
  554. ; *                                      *
  555. ; *********************************************************************
  556. ENTER:
  557.      TEST     [BX].S_OPT,@EX        ;EXTENDED KEY ONLY??
  558.      JZ     ENTER_05           ;NO
  559.      JMP     CURSDN            ;CURSOR DOWN
  560. ENTER_05:
  561.      CALL     TREQ               ;REQUIRED??
  562.      JNC     ENTER_10           ;PASSED
  563.      JMP     SCREEN_I_00           ;DATA REQUIRED IN THIS FIELD
  564. ENTER_10:
  565.      MOV     CS:RETCODE,0DH        ;SET KEY CODE FOR ENTER KEY
  566.      JMP     EXIT               ;AND EXIT
  567. ; *********************************************************************
  568. ; *                                      *
  569. ; *             PROCESS THE ESC KEY                  *
  570. ; *                                      *
  571. ; *********************************************************************
  572. ESC_KEY:
  573.      MOV     CS:RETCODE,AL           ;SET KEY CODE FOR ESC KEY
  574.      JMP     EXIT               ;AND EXIT
  575. ; *********************************************************************
  576. ; *                                      *
  577. ; *             PROCESS CONTROL BREAK                  *
  578. ; *                                      *
  579. ; *********************************************************************
  580. CTRL_BK:
  581.      MOV     CS:RETCODE,114        ;SET KEY CODE FOR ESC KEY
  582.      JMP     EXIT               ;AND EXIT
  583. ; *********************************************************************
  584. ; *                                      *
  585. ; *              PROCESS THE CURSOR LEFT KEY              *
  586. ; *                                      *
  587. ; *********************************************************************
  588. CURSLF:
  589.      OR     DX,DX               ;AT ZERO??
  590.      JNZ     CURSLF_00           ;NO
  591.      CALL     GET_PREV_INPUT        ;GET THE PREV ENTRY
  592.      JMP     SCREEN_I_00           ;CONTINUE
  593. CURSLF_00:
  594.      DEC     DX               ;ONE LESS
  595.      CALL     UPDATE_CURSOR           ;UPDATE CURSOR POSITION
  596.      JMP     SCREEN_I_05           ;CONTINUE
  597. ; *********************************************************************
  598. ; *                                      *
  599. ; *              PROCESS THE CURSOR RIGHT KEY              *
  600. ; *                                      *
  601. ; *********************************************************************
  602. CURSRT:
  603.      CMP     [BX].S_LEN,01H        ;ONE BYTE FIELD??
  604.      JNE     CURSRT_02           ;NO
  605.      OR     DL,DL               ;FIRST COLUMN??
  606.      JZ     CURSRT_04           ;YES
  607. CURSRT_02:
  608.      MOV     AH,[BX].S_LEN           ;FETCH MAX LENGTH
  609.      DEC     AH               ;MAX COLUMN
  610.      CMP     DL,AH               ;MAX COLUMN??
  611.      JNE     CURSRT_10           ;NO
  612. CURSRT_04:
  613.      TEST     [BX].S_OPT,@NFULL     ;NEXT LINE WHEN FULL??
  614.      JZ     CURSRT_05           ;NO
  615.      CALL     GET_NEXT_INPUT        ;GET THE NEXT ENTRY
  616.      JMP     SCREEN_I_00           ;CONTINUE
  617. CURSRT_05:
  618.      CALL     BEEP               ;RING THE BELL
  619.      JMP     SCREEN_I_05           ;NEXT
  620. CURSRT_10:
  621.      INC     DX               ;PLUS ONE
  622.      CALL     UPDATE_CURSOR           ;UPDATE CURSOR POSITION
  623.      JMP     SCREEN_I_05           ;CONTINUE
  624. ; *********************************************************************
  625. ; *                                      *
  626. ; *              PROCESS THE CURSOR UP KEY               *
  627. ; *                                      *
  628. ; *********************************************************************
  629. CURSUP:
  630.      CALL     GET_PREV_INPUT        ;GET THE PREVIOUS ENTRY
  631.      JMP     SCREEN_I_00           ;CONTINUE
  632. ; *********************************************************************
  633. ; *                                      *
  634. ; *              PROCESS THE CURSOR DOWN KEY              *
  635. ; *                                      *
  636. ; *********************************************************************
  637. CURSDN:
  638.      CALL     GET_NEXT_INPUT        ;GET THE NEXT ENTRY
  639.      JMP     SCREEN_I_00           ;CONTINUE
  640. ; *********************************************************************
  641. ; *                                      *
  642. ; *              PROCESS THE TAB RIGHT KEY               *
  643. ; *                                      *
  644. ; *********************************************************************
  645. TABRT:
  646.      CALL     GET_NEXT_INPUT        ;GET THE NEXT ENTRY
  647.      JMP     SCREEN_I_00           ;CONTINUE
  648. ; *********************************************************************
  649. ; *                                      *
  650. ; *              PROCESS THE TAB LEFT KEY                  *
  651. ; *                                      *
  652. ; *********************************************************************
  653. TABLF:
  654.      CALL     GET_PREV_INPUT        ;GET THE PREVIOUS ENTRY
  655.      JMP     SCREEN_I_00           ;CONTINUE
  656. ; *********************************************************************
  657. ; *                                      *
  658. ; *              PROCESS THE INS KEY                  *
  659. ; *                                      *
  660. ; *********************************************************************
  661. INS_KEY:
  662.      TEST     CS:SW1,INS           ;INSERT MODE ACTIVE??
  663.      JNZ     INS_KEY_10           ;YES - TOGGLE IT
  664.      OR     CS:SW1,INS           ;INSERT MODE NOW ACTIVE
  665.      PUSH     AX               ;SAVE AX
  666.      PUSH     CX               ;SAVE CX
  667.      MOV     CX,CS:WIDE_CUR        ;WIDE CURSOR
  668.      MOV     AH,1               ;FUNCTION
  669.      INT     10H               ;CALL BIOS
  670.      POP     CX               ;RESTORE CX
  671.      POP     AX               ;RESTORE AX
  672.      JMP     SCREEN_I_05           ;CONTINUE
  673. INS_KEY_10:
  674.      AND     CS:SW1,0FFH-INS       ;RESET INSERT MODE
  675.      PUSH     AX               ;SAVE AX
  676.      PUSH     CX               ;SAVE CX
  677.      MOV     CX,CS:NORM_CUR        ;NORMAL CURSOR
  678.      MOV     AH,1               ;FUNCTION
  679.      INT     10H               ;CALL BIOS
  680.      POP     CX               ;RESTORE CX
  681.      POP     AX               ;RESTORE AX
  682.      JMP     SCREEN_I_05           ;CONTINUE
  683. ; *********************************************************************
  684. ; *                                      *
  685. ; *              PROCESS THE DEL KEY                  *
  686. ; *                                      *
  687. ; *********************************************************************
  688. DEL_KEY:
  689.      MOV     AH,[BX].S_LEN           ;FETCH MAX LENGTH
  690.      DEC     AH               ;MAX COLUMN
  691.      CMP     DL,AH               ;MAX COLUMN??
  692.      JNE     DEL_KEY_00           ;NO
  693.      LEA     DI,[BX].S_DATA        ;GET DATA
  694.      ADD     DI,DX               ;  OFFSET
  695.      JMP     DEL_KEY_20           ;CONTINUE
  696. DEL_KEY_00:
  697.      LEA     DI,[BX].S_DATA        ;DATA OFFSET
  698.      ADD     DI,DX               ;DESTINATION
  699.      MOV     SI,DI               ;SOURCE
  700.      INC     SI               ;  OFFSET
  701.      CLD                   ;SET DIRECTION
  702.      XOR     CX,CX               ;CLEAR CX
  703.      MOV     CL,[BX].S_LEN           ;GET FIELD LENGTH
  704.      SUB     CX,DX               ;LENGTH
  705.      DEC     CX
  706. DEL_KEY_10:
  707.      MOVSB                   ;MOVE A BYTE
  708.      LOOP     DEL_KEY_10           ;NEXT BYTE
  709. DEL_KEY_20:
  710.      MOV     BYTE PTR [DI],BLANK   ;BLANK EXTRA CHARACTER
  711.      CALL     WRITE_DATA           ;DISPLAY IT ON THE SCREEN
  712.      JMP     SCREEN_I_05           ;NEXT
  713. ; *********************************************************************
  714. ; *                                      *
  715. ; *             PROCESS THE BACKSPACE KEY                  *
  716. ; *                                      *
  717. ; *********************************************************************
  718. BACKSPACE:
  719.      OR     DX,DX               ;AT COLUMN ZER0??
  720.      JNZ     BS_00               ;NO
  721.      CALL     BEEP               ;RING THE BELL
  722.      JMP     SCREEN_I_05           ;CONTINUE
  723. BS_00:
  724.      DEC     DX               ;COLUMN    -1
  725.      LEA     DI,[BX].S_DATA        ;DATA OFFSET
  726.      ADD     DI,DX               ;CURRENT COLUMN
  727.      MOV     BYTE PTR [DI],BLANK   ;STORE A BLANK
  728.      CALL     WRITE_DATA           ;WRITE IT
  729.      CALL     UPDATE_CURSOR           ;UPDATE CURSOR POSITION
  730.      JMP     SCREEN_I_05           ;NEXT
  731. ; *********************************************************************
  732. ; *                                      *
  733. ; *              PROCESS THE HOME KEY                  *
  734. ; *                                      *
  735. ; *********************************************************************
  736. HOME_KEY:
  737.      MOV     BX,CS:PARMOFF           ;FIRST ENTRY
  738.      MOV     CS:ENTOFF,BX           ;CURRENT ENTRY
  739.      JMP     SCREEN_I_X0           ;CONTINUE
  740. ; *********************************************************************
  741. ; *                                      *
  742. ; *              PROCESS EXTENDED KEYS               *
  743. ; *              PGUP,PGDN,FUNCTION KEYS              *
  744. ; *                                      *
  745. ; *********************************************************************
  746. EXTENDED_KEY:
  747.      MOV     CS:RETCODE,AL           ;SAVE KEY CODE
  748.      JMP     EXIT               ;EXIT
  749. SCREEN_INPUT ENDP
  750. ; *********************************************************************
  751. ; *                                      *
  752. ; *               GET INPUT FROM THE KEYBOARD              *
  753. ; *                                      *
  754. ; *           OUTPUTS:  AH = TABLE INDEX                  *
  755. ; *             AL = DATA BYTE OR FUNCTION              *
  756. ; *                  KEY TABLE INDEX                  *
  757. ; *********************************************************************
  758. GET_INPUT PROC
  759.      MOV     AH,07H            ;DOS FUNCTION CODE
  760.      INT     21H               ;GET A CHARACTER
  761.      OR     AL,AL               ;EXTENDED CODE??
  762.      JZ     GET_INPUT_10           ;YES
  763.      PUSH     BX               ;SAVE BX
  764.      MOV     BX,OFFSET CS:TRANTBL  ;TABLE OFFSET
  765.      XOR     AH,AH               ;CLEAR AH
  766.      ADD     BX,AX               ;INDEX
  767.      MOV     AH,CS:[BX]           ;GET TABLE VALUE
  768.      POP     BX               ;RESTORE BX
  769.      CMP     AH,0FFH           ;VALID CHARACTER??
  770.      JNE     GET_INPUT_05           ;YES
  771. GET_INPUT_00:
  772.      CALL     BEEP               ;RING THE BELL
  773.      JMP     GET_INPUT           ;TRY AGAIN
  774. GET_INPUT_05:
  775.      RET                   ;RETURN
  776. GET_INPUT_10:
  777.      MOV     AH,07H            ;DOS FUNCTION CODE
  778.      INT     21H               ;GET A CHARACTER
  779.      PUSH     BX               ;SAVE BX
  780.      MOV     BX,OFFSET CS:EX_KEY   ;TABLE OFFSET
  781.      XOR     AH,AH               ;CLEAR AH
  782.      ADD     BX,AX               ;INDEX
  783.      MOV     AH,CS:[BX]           ;GET TABLE VALUE
  784.      POP     BX               ;RESTORE BX
  785.      CMP     AH,00H            ;VALID CHARACTER??
  786.      JNE     GET_INPUT_15           ;YES
  787.      CALL     BEEP               ;RING THE BELL
  788.      JMP     GET_INPUT           ;TRY AGAIN
  789. GET_INPUT_15:
  790.      CMP     AH,EX_INDEX           ;PASS IT TO THE PROGRAM??
  791.      JBE     GET_INPUT_20           ;NO
  792.      MOV     AH,EX_INDEX           ;RETURN CODE
  793.      RET                   ;AND RETURN
  794. GET_INPUT_20:
  795.      RET                   ;RETURN
  796. GET_INPUT ENDP
  797. ; *********************************************************************
  798. ; *                                      *
  799. ; *               FIND DATA LENGTH                  *
  800. ; *        OUTPUT:    CX = DATA LENGTH                  *
  801. ; *                                      *
  802. ; *********************************************************************
  803. FIND_LEN PROC
  804.      PUSH     AX               ;SAVE AX
  805.      PUSH     SI               ;SAVE SI
  806.      LEA     SI,[BX].S_DATA        ;DATA OFFSET
  807.      XOR     CX,CX               ;CLEAR CX
  808.      MOV     CL,[BX].S_LEN           ;MAX LENGTH
  809.      ADD     SI,CX               ;POINT TO LAST
  810.      DEC     SI               ;  BYTE
  811.      STD                   ;REVERSE DIRECTION
  812. FL_00:
  813.      LODSB                   ;FETCH A BYTE
  814.      CMP     AL,BLANK           ;IS IT A BLANK??
  815.      JNE     FL_EXIT           ;NO
  816.      LOOP     FL_00               ;KEEP TRYING
  817. FL_EXIT:
  818.      POP     SI               ;RESTORE SI
  819.      POP     AX               ;RESTORE AX
  820.      RET                   ;AND RETURN
  821. FIND_LEN ENDP
  822. SET_FIELDS PROC
  823.      PUSH     AX               ;SAVE AX
  824.      MOV     CS:ENTOFF,BX           ;CURRENT ENTRY OFFSET
  825.      MOV     SI,BX               ;INPUT OFFSET
  826.      MOV     AL,[BX].S_ROW           ;CURRENT
  827.      MOV     CS:ROW,AL           ;  ROW
  828.      MOV     AL,[BX].S_COL           ;CURRENT
  829.      MOV     CS:COL,AL           ;  COLUMN
  830.      POP     AX               ;RESTORE AX
  831.      RET                   ;AND RETURN
  832. SET_FIELDS ENDP
  833. ; *********************************************************************
  834. ; *                                      *
  835. ; *               GET THE NEXT INPUT ENTRY               *
  836. ; *                                      *
  837. ; *********************************************************************
  838. GET_NEXT_INPUT PROC
  839.      MOV     BX,[BX].S_NEXT        ;GET THE NEXT ENTRY
  840.      TEST     [BX].S_OPT,@LABEL     ;LABEL ENTRY??
  841.      JNZ     GET_NEXT_INPUT        ;YES - SKIP THIS ONE
  842. GET_NEXT_I_10:
  843.      CALL     SET_FIELDS           ;INIT FIELDS
  844.      RET                   ;AND RETURN
  845. GET_NEXT_INPUT ENDP
  846. ; *********************************************************************
  847. ; *                                      *
  848. ; *               GET THE PREV INPUT ENTRY               *
  849. ; *                                      *
  850. ; *********************************************************************
  851. GET_PREV_INPUT PROC
  852.      PUSH     DX               ;SAVE DX
  853.      PUSH     SI               ;SAVE SI
  854.      MOV     SI,[BX].S_NEXT        ;FETCH NEXT ENTRY
  855.      MOV     DX,BX               ;SET PREV ENTRY
  856. GET_PREV_I_00:
  857.      TEST     [SI].S_OPT,@LABEL     ;LABEL ENTRY??
  858.      JZ     GET_PREV_I_10           ;NO - PROCESS IT
  859. GET_PREV_I_05:
  860.      MOV     SI,[SI].S_NEXT        ;NEXT ENTRY
  861.      CMP     SI,BX               ;LAST ENTRY??
  862.      JE     GET_PREV_I_20           ;YES
  863.      JMP     GET_PREV_I_00           ;NEXT
  864. GET_PREV_I_10:
  865.      MOV     DX,SI               ;PREVIOUS ENTRY
  866.      JMP     GET_PREV_I_05           ;CONTINUE
  867. GET_PREV_I_20:
  868.      MOV     BX,DX               ;PREVIOUS ENTRY
  869.      CALL     SET_FIELDS           ;INIT ALL FIELDS
  870.      POP     SI               ;RESTORE SI
  871.      POP     DX               ;RESTORE DX
  872.      RET                   ;AND RETURN
  873. GET_PREV_INPUT ENDP
  874. ; *********************************************************************
  875. ; *                                      *
  876. ; *               GET THE NEXT OUTPUT ENTRY              *
  877. ; *                                      *
  878. ; *********************************************************************
  879. GET_NEXT_OUTPUT PROC
  880.      MOV     BX,[BX].S_NEXT        ;GET THE NEXT ENTRY
  881. GET_NEXT_O_10:
  882.      CALL     SET_FIELDS           ;INIT FIELDS
  883.      RET                   ;AND RETURN
  884. GET_NEXT_OUTPUT ENDP
  885. ; *********************************************************************
  886. ; *                                      *
  887. ; *             SCREEN WRITE ROUTINE                  *
  888. ; *                                      *
  889. ; *********************************************************************
  890. WRITE_DATA PROC
  891.      PUSH     ES               ;SAVE ES
  892.      PUSH     AX               ;SAVE AX
  893.      PUSH     BX               ;SAVE BX
  894.      PUSH     CX               ;SAVE CX
  895.      PUSH     SI               ;SAVE SI
  896.      PUSH     DI               ;SAVE DI
  897.      MOV     AX,CS:VI_BASE           ;ESTABLISH
  898.      MOV     ES,AX               ;  VIDEO BASE
  899.      PUSH     BX               ;SAVE FIRST ENTRY OFFSET
  900. WE_00:
  901.      CALL     CALC_OFFSET           ;RETURN VIDEO RAM OFFSET IN AX
  902.      MOV     DI,AX               ;ESTABLISH OFFSET
  903. WE_10:
  904.      XOR     CH,CH               ;CLEAR CH
  905.      MOV     CL,[BX].S_LEN           ;FIELD SIZE
  906.      LEA     SI,[BX].S_DATA        ;INPUT OFFSET
  907.      CLD                   ;SET DIRECTION
  908. WE_12:
  909.      PUSH     DX               ;SAVE DX
  910.      TEST     CS:SW1,MONO           ;MONOCHROME DISPLAY??
  911.      JNZ     WE_18               ;YES - SKIP STUFF FOR COLOR
  912.      MOV     DX,03DAH           ;VIDEO STAT REGISTER
  913.      STI                   ;ENABLE INTERRUPTS
  914. WE_15:
  915.      IN     AL,DX               ;READ STAT REGISTER
  916.      TEST     AL,01H            ;VIDEO RAM AVAILABLE??
  917.      JNZ     WC_15               ;YES - WAIT FOR NEXT CYCLE
  918. WE_16:
  919.      IN     AL,DX               ;READ STAT REGISTER
  920.      TEST     AL,01H            ;VIDEO RAM AVAILABLE??
  921.      JZ     WC_16               ;NO - WAIT FOR IT
  922. WE_18:
  923.      POP     DX               ;RESTORE DX
  924.      CLI                   ;DISABLE INTERRUPTS
  925. WE_20:
  926.      LODSB                   ;FETCH OUTPUT BYTE
  927.      MOV     AH,AL               ;PUT IT IN AH
  928.      MOV     AL,[BX].S_ATTR        ;ATTRIBUTE BYTE
  929.      XCHG     AL,AH               ;MAKE IT RIGHT
  930. WE_30:
  931.      STOSW                   ;WRITE THE CHARACTER AND ATTRIBUTE
  932.      LOOP     WE_20               ;LOOP UNTILL DONE
  933.      STI                   ;ENABLE INTERRUPTS
  934. WE_40:
  935.      POP     AX               ;RESTORE FIRST ENTRY OFFSET
  936.      TEST     CS:SW1,XLIST           ;LIST FUNCTION??
  937.      JZ     WE_EXIT           ;NO - WERE ALL DONE
  938.      CALL     GET_NEXT_OUTPUT       ;GET THE NEXT ENTRY
  939.      CMP     AX,BX               ;ALL DONE??
  940.      JE     WE_EXIT           ;YES
  941.      PUSH     AX               ;SAVE FIRST ENTRY OFFSET
  942.      JMP     WE_00               ;CONTINUE
  943. WE_EXIT:
  944.      AND     CS:SW1,0FFH-XLIST     ;RESET SWITCHE
  945.      POP     DI               ;RESTORE DI
  946.      POP     SI               ;RESTORE SI
  947.      POP     CX               ;RESTORE CX
  948.      POP     BX               ;RESTORE BX
  949.      POP     AX               ;RESTORE AX
  950.      POP     ES               ;RESTORE ES
  951.      RET                   ;RETURN
  952. WRITE_DATA ENDP
  953. ; *********************************************************************
  954. ; *                                      *
  955. ; *                SOUND THE MUSIC                  *
  956. ; *                                      *
  957. ; *********************************************************************
  958. BEEP     PROC
  959. BEEP_00:
  960.      PUSH     AX               ;SAVE AX
  961.      PUSH     BX               ;SAVE BX
  962.      PUSH     CX               ;SAVE CX
  963.      CLI                   ;DISABLE INTERRUPTS
  964.      IN     AL,61H            ;GET KEYBOARD/SPEAKER CTL DATA
  965.      PUSH     AX               ;AND SAVE IT
  966.      MOV     BX,300            ;DURATION OF TONE
  967. BEEP_05:
  968.      AND     AL,0FCH           ;TURN OFF TIMER GATE AND SPEAKER
  969.      OUT     61H,AL            ;WRITE NEW CTL DATA
  970.      MOV     CX,48H            ;HALF CYCLE TIME FOR TONE
  971. BEEP_10:
  972.      LOOP     BEEP_10           ;SPEAKER OFF
  973.      OR     AL,02H            ;TURN ON
  974.      OUT     61H,AL            ;  SPEAKER
  975.      MOV     CX,48H            ;HALF CYCLE TIME FOR TONE
  976. BEEP_20:
  977.      LOOP     BEEP_20           ;LET US HEAR THE MUSIC
  978.      DEC     BX               ;TIMES GROWING SHORTER
  979.      JNZ     BEEP_05           ;DO IT AGAIN
  980.      POP     AX               ;RESTORE AX
  981.      OUT     61H,AL            ;RESTORE KEYBOARD/SPEAKER CTL DATA
  982.      STI                   ;ENABLE INTERRUPTS
  983.      POP     CX               ;RESTORE CX
  984.      POP     BX               ;RESTORE BX
  985.      POP     AX               ;RESTORE AX
  986.      RET                   ;AND RETURN
  987. BEEP     ENDP
  988. ; *********************************************************************
  989. ; *                                      *
  990. ; *             TEST FOR REQUIRED PARAMETER              *
  991. ; *             CY = 1  IF PARMAMETER REQUIRED              *
  992. ; *             BUT NOT PRESENT                      *
  993. ; *                                      *
  994. ; *********************************************************************
  995. TREQ     PROC
  996.      PUSH     DX               ;SAVE DX
  997.      MOV     DX,BX               ;SAVE FIRST ENTRY
  998. TREQ_00:
  999.      TEST     [BX].S_OPT,@REQ       ;PARAMETER REQUIRED??
  1000.      JZ     TREQ_NEXT           ;NO
  1001.      CALL     FIND_LEN           ;GET DATA LENGTH
  1002.      CLC                   ;CLEAR CARRY
  1003.      OR     CX,CX               ;ANY DATA??
  1004.      JNZ     TREQ_NEXT           ;YES
  1005.      CALL     BEEP               ;RING THE BELL
  1006.      STC                   ;INDICATE DATA REQUIRED
  1007.      JMP     TREQ_EXIT           ;AND RETURN
  1008. TREQ_NEXT:
  1009.      CALL     GET_NEXT_INPUT        ;NEXT ENTRY
  1010.      CMP     BX,DX               ;LAST ENTRY??
  1011.      JNE     TREQ_00           ;NO - PROCESS THIS ONE
  1012.      CLC                   ;SUCESSFULL
  1013. TREQ_EXIT:
  1014.      POP     DX               ;RESTORE DX
  1015.      RET                   ;AND RETURN
  1016. TREQ     ENDP
  1017. ; *********************************************************************
  1018. ; *                                      *
  1019. ; *             VALIDATE AL FOR AN ALPHA CHARACTER           *
  1020. ; *                                      *
  1021. ; *********************************************************************
  1022. CHK_ALPHA PROC
  1023.      CMP     AL,20H            ;BLANK??
  1024.      JE     ALPHA_00           ;YES
  1025.      CMP     AL,040H           ;LESS THAN "A"??
  1026.      JBE     ALPHA_ERR           ;YES
  1027.      CMP     AL,'Z'                ;EQUAL TO OR LESS THAN A "Z"
  1028.      JBE     ALPHA_00           ;YES
  1029.      CMP     AL,060H           ;LESS THAN "a"??
  1030.      JBE     ALPHA_ERR           ;YES
  1031.      CMP     AL,07BH           ;GREATER THAN "z"??
  1032.      JAE     ALPHA_ERR           ;YES
  1033. ALPHA_00:
  1034.      CLC                   ;VALID CHARACTER
  1035.      RET                   ;RETURN
  1036. ALPHA_ERR:
  1037.      STC                   ;E R R O R
  1038.      RET                   ;RETURN
  1039. CHK_ALPHA ENDP
  1040. ; *********************************************************************
  1041. ; *                                      *
  1042. ; *             VALIDATE AL FOR AN Y OR N CHARACTER          *
  1043. ; *                                      *
  1044. ; *********************************************************************
  1045. CHK_YN     PROC
  1046.      CMP     AL,'n'                ;LOWER CASE N??
  1047.      JE     YN_00               ;YES
  1048.      CMP     AL,'N'                ;UPPER CASE N??
  1049.      JE     YN_00               ;YES
  1050.      CMP     AL,'y'                ;LOWER CASE Y??
  1051.      JE     YN_00               ;YES
  1052.      CMP     AL,'Y'                ;UPPER CASE Y??
  1053.      JE     YN_00               ;YES
  1054. YN_ERR:
  1055.      STC                   ;E R R O R
  1056.      RET                   ;RETURN
  1057. YN_00:
  1058.      CLC                   ;VALID CHARACTER
  1059.      RET                   ;RETURN
  1060. CHK_YN     ENDP
  1061. ; *********************************************************************
  1062. ; *                                      *
  1063. ; *             VALIDATE AL FOR NUMERIC              *
  1064. ; *                                      *
  1065. ; *********************************************************************
  1066. CHK_NUMERIC PROC
  1067.      CMP     AL,'.'                ;DECIMAL POINT??
  1068.      JE     NUMERIC_00           ;YES
  1069.      CMP     AL,'-'                ;MINUS SIGN??
  1070.      JE     NUMERIC_00           ;YES
  1071.      CMP     AL,' '                ;BLANK??
  1072.      JE     NUMERIC_00           ;YES
  1073.      CMP     AL,02FH           ;LESS THAN "0"??
  1074.      JBE     NUMERIC_ERR           ;YES
  1075.      CMP     AL,'9'                ;EQUAL TO OR LESS THAN "9"
  1076.      JBE     NUMERIC_00           ;YES
  1077. NUMERIC_ERR:
  1078.      STC                   ;E R R O R
  1079.      RET                   ;RETURN
  1080. NUMERIC_00:
  1081.      CLC                   ;GOOD NUMBER
  1082.      RET                   ;RETURN
  1083. CHK_NUMERIC ENDP
  1084. ; *********************************************************************
  1085. ; *                                      *
  1086. ; *              COMPUTE VIDEO RAM OFFSET                  *
  1087. ; *                                      *
  1088. ; *********************************************************************
  1089. CALC_OFFSET PROC
  1090.      PUSH     DX               ;SAVE DX
  1091.      PUSH     BX               ;SAVE BX
  1092.      SUB     AX,AX               ;CLEAR AX
  1093.      MOV     AL,CS:ROW           ;CALCULATE
  1094.      MUL     CS:LINE_LEN           ;  OFFSET TO LINE
  1095.      MOV     DL,CS:COL           ;GET COLUMN
  1096.      ADD     AL,DL               ;INCLUDE COLUMN
  1097.      JNC     CALC_OFFSET_00        ;IF NO CARRY
  1098.      ADD     AH,1               ;OTHERWISE ADDJUST
  1099. CALC_OFFSET_00:                ;RETURN
  1100.      SHL     AX,1               ;ALLOW FOR ATTRIBUTE
  1101.      POP     BX               ;RESTORE BX
  1102.      POP     DX               ;RESTORE DX
  1103.      RET                   ;RETURN
  1104. CALC_OFFSET ENDP
  1105. ; *********************************************************************
  1106. ; *                                      *
  1107. ; *            UPDATE CURSOR POSITION                  *
  1108. ; *                                      *
  1109. ; *********************************************************************
  1110. UPDATE_CURSOR PROC
  1111.      PUSH     AX               ;SAVE AX
  1112.      PUSH     BX               ;SAVE BX
  1113.      PUSH     DX               ;SAVE DX
  1114.      MOV     AH,CS:ROW           ;CURSOR ROW
  1115.      MOV     AL,CS:COL           ;CURSOR
  1116.      ADD     AL,DL               ;  COLUMN
  1117.      MOV     DX,AX
  1118.      MOV     AH,02H            ;SET CURSOR POSITION
  1119.      XOR     BX,BX               ;PAGE 0
  1120.      INT     10H               ;CALL VIDEO SERVICE ROUTINE
  1121.      POP     DX               ;RESTORE DX
  1122.      POP     BX               ;RESTORE BX
  1123.      POP     AX               ;RESTORE AX
  1124.      RET
  1125. UPDATE_CURSOR ENDP
  1126. ; *********************************************************************
  1127. ; *                                      *
  1128. ; *                EXIT                      *
  1129. ; *                                      *
  1130. ; *********************************************************************
  1131. EXIT     PROC
  1132.      MOV     CS:CURPOS,DL           ;SAVE CURSOR POSITION
  1133.      MOV     CX,CS:NORM_CUR        ;NORMAL CURSOR
  1134.      MOV     AH,1               ;FUNCTION
  1135.      INT     10H               ;CALL BIOS
  1136.      POP     BP               ;RESTORE BP
  1137.      POP     ES               ;RESTORE ES
  1138.      POP     DS               ;RESTORE DS
  1139.      POP     SI               ;RESTORE SI
  1140.      POP     DI               ;RESTORE DI
  1141.      POP     DX               ;RESTORE DX
  1142.      POP     CX               ;RESTORE CX
  1143.      POP     BX               ;RESTORE BX
  1144.      POP     AX               ;RESTORE AX
  1145.      MOV     AL,CS:RETCODE           ;SET RETURN CODE
  1146.      MOV     AH,CS:CURPOS           ;RESTORE CURSOR POSITION
  1147.      MOV     BX,CS:ENTOFF           ;CURRENT ENTRY OFFSET
  1148.      RET                   ;AND RETURN
  1149. EXIT     ENDP
  1150. CSEG     ENDS
  1151.      END     SCRMGR
  1152.