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 / CPM / TURBODSG / MENU.AQ / MENU.A
Text File  |  2000-06-30  |  10KB  |  430 lines

  1.     #TITLE    "TURBODOS 1.4X MENU UTILITY"
  2.     #PAGE    132,66
  3.     MODULE    "TDMENU"
  4. ;
  5. ;    +----------------------------------+
  6. ;    | MENU UTILITY FOR 16-BIT TURBODOS |
  7. ;    +----------------------------------+
  8. ;
  9. CFUNC    ==    0XE0            ; C-FUNCTION INTERRUPT
  10. TFUNC    ==    0XDF            ; T-FUNCTION INTERRUPT
  11. ;    
  12.     LOC    Data#
  13. ;
  14. ;    +-----------------------+
  15. ;    | TERMINAL CONFIG BLOCK |
  16. ;    +-----------------------+
  17. ;
  18. ESC    ==    0X1B
  19. ;
  20. CCURUP:: BYTE    2,ESC,'A',0,0,0,0    ; CURSOR UP
  21. CCURDN:: BYTE    2,ESC,'B',0,0,0,0    ; CURSOR DOWN
  22. CCURLF:: BYTE    2,ESC,'D',0,0,0,0    ; CURSOR LEFT
  23. CCURRT:: BYTE    2,ESC,'C',0,0,0,0    ; CURSOR RIGHT
  24. CHOMEC:: BYTE    2,ESC,'H',0,0,0,0    ; HOME CURSOR
  25. CURAD1:: BYTE    2,ESC,'F',0,0,0,0    ; CURSOR ADDRESSING STRING 1
  26. CURAD2:: BYTE    0XFF            ; FF=R/C, 00=C/R
  27. CURAD3:: BYTE    0XFF            ; FF=BINARY, 00=ASCII
  28. CURAD4:: BYTE    ' '            ; BINARY OFFSET
  29. CDISON:: BYTE    3,ESC,"-1",0,0,0    ; CURSOR DISPLAY ON
  30. CDISOF:: BYTE    3,ESC,"-0",0,0,0    ; CURSOR DISPLAY OFF
  31. CLEOLN:: BYTE    2,ESC,'K',0,0,0,0    ; CLEAR TO END OF LINE
  32. CLRSCR:: BYTE    2,ESC,'E',0,0,0,0    ; CLEAR SCREEN AND HOME
  33. CINHIL:: BYTE    3,ESC,"dA",0,0,0    ; INTO HIGHLIGHTING
  34. COTHIL:: BYTE    3,ESC,"d@",0,0,0    ; OUT OF HIGHLIGHTING
  35. CINREV:: BYTE    3,ESC,"dP",0,0,0    ; INTO REVERSE
  36. COTREV:: BYTE    3,ESC,"d@",0,0,0    ; OUT OF REVERSE
  37. CLINES:: BYTE    24            ; NUMBER OF LINES
  38. CCOLUM:: BYTE    80            ; NUMBER OF COLUMNS
  39. KEYUP::     BYTE    'P'-0X40        ; KEY: CURSOR UP
  40. KEYDN::     BYTE    'N'-0X40        ; KEY: CURSOR DOWN
  41. KEYXIT:: BYTE    'X'-0X40        ; KEY: EXIT TO O/S
  42. NPRIVX:: BYTE    0            ; NONPRIV MAY EXIT IF NZ
  43. ;
  44. ;    +------------------------+
  45. ;    | SYSTEM MESSAGE SECTION |
  46. ;    +------------------------+
  47. ;
  48. BANNER:: BYTE    "YOUR MENU TITLE HERE$"    ; CUSTOMIZABLE MENU HEADER
  49.     RES    60            ; UP TO 80 CHARS
  50. CRLFLF:    BYTE    "\r\n"
  51. CRLF:    BYTE    "\r\n$"
  52. MENTER:    BYTE    "Enter selection [ ]\8\8$"
  53. MINVME:    BYTE    "\r\n\n\7FATAL ERROR: Menu not "
  54.     BYTE    "terminated or too large!\r\n\n$"
  55. TOOMNL:    BYTE    "\R\N\NTESTING: TOO MANY LINES\R\N\N\N$"
  56. SEP:    BYTE    "  =  $"
  57. PRTC:    BYTE    "PRESS ANY KEY TO RETURN TO MENU:$"
  58. ;
  59. ;    +----------------------+
  60. ;    | DATA STORAGE SECTION |
  61. ;    +----------------------+
  62. ;
  63. NMBLNS:    WORD    0            ; NUMBER OF MENU LINES
  64. PRIV:    BYTE    0            ; PRIVILEGE FLAG
  65. ;
  66. CMDLN:    BYTE    0,"\\"
  67.     RES    160
  68. ;
  69. ;    +------------------------+
  70. ;    | MENU SCREEN DEFINITION |
  71. ;    +------------------------+
  72. ;
  73. ; THE FOLLOWING WORKSPACE CONTAINS THE SCREEN DEFINITIONS WHICH MUST
  74. ; BE DEFINED IN THE MENU.PAR FILE IN STRICT ACCORDANCE WITH THE
  75. ; SAMPLE PROVIDED BELOW. THE TOTAL CHARACTER COUNT MUST NEVER
  76. ; EXCEED 8K!
  77. ;
  78. SCREEN::
  79.     BYTE    "A|DISPLAY DIRECTORY|DIR\\MENU W",0
  80.     BYTE    "B|DISPLAY DRIVE STATS|DRIVE\\MENU W",0
  81.     BYTE    "C|DISPLAY DRIVE A DIRECTORY|DIR A:\\MENU W",0
  82.     BYTE    "D|LOG ONTO MASTER|MASTER",0
  83.     BYTE    0XFF
  84.     RES    8192-(.-SCREEN)
  85. ;
  86. ; EXPLANATION OF EXAMPLE:
  87. ; THE VERTICAL BAR IS A FIELD DELIMITER, THE SINGLE QUOTE IS
  88. ; A PROMPT DELIMITER.
  89. ; A DEFINITION LINE MUST CONTAIN 4 FIELDS:
  90. ; 1. THE RESPONSE CHARACTER WHICH MUST BE ONE SINGLE CHARACTER
  91. ;    AND MAY BE ANY CHARACTER OTHER THAN 0X00,"'",OR "|"
  92. ; 2. THE SELECTION TITLE, WHICH MAY BE A STRING OF UP TO 40
  93. ;    CHARACTERS
  94. ; 3. THE COMMAND
  95. ;    (THE COMMAND MAY BE FOLLOWED IMMEDIATELY BY A STRING ENCLOSED
  96. ;    IN SINGLE QUOTES. IN SUCH A CASE, THE STRING WILL BE DISPLAYED
  97. ;    BEFORE COMMAND EXECUTION AND A RESPONSE WILL BE SOLICITED FROM
  98. ;    THE USER WHICH WILL BE PASSED ALONG WITH THE COMMAND.
  99. ;    THE RESPONSE WILL ONLY BE PARSED FOR A BACKSLASH CHARACTER,
  100. ;    WHICH IN THIS CONTEXT IS ILLEGAL AND WILL BE IGNORED.
  101. ; 4. THE ENDMARK, WHICH IS A NUL (0X00) AND DELIMITS DEFINITION
  102. ;    LINES.
  103. ;
  104. ; THE SPECIAL DEFINITION LINE 0XFF DENOTES THE END OF ALL DEFINITIONS
  105. ; AND THUS THE END OF THE MENU AND MUST BE PRESENT.
  106. ;
  107.     RES    100            ; ENOUGH STACK SPACE
  108. STACK    ==    .
  109. ;
  110.     LOC    Code#
  111. ;
  112. ;    +------------------+
  113. ;    | START OF PROGRAM |
  114. ;    +------------------+
  115. ;
  116. START:    MOV    AX,DS            ; GET DATA SEGMENT
  117.     MOV    SS,AX            ; SET UP STACK SEGMENT
  118. RESTRT:    MOV    SP,&STACK        ;   AND OFFSET
  119.     CALL    INIPGM            ; INITIALIZE THE PROGRAM
  120.     CMP    0X5D,=BYTE 'W'        ; WAIT?
  121.     JNZ    __NWT            ;   NO
  122.     MOV    CX,=23*256+45        ; BOTTOM LINE, END OF LINE
  123.     CALL    GOTOXY
  124.     CALL    INREV            ; REVERSE ON
  125.     MOV    DX,&PRTC        ; SEND MESSAGE
  126.     CALL    PRINTM
  127.     CALL    GETCH
  128.     CALL    OUTREV            ; REVERSE OFF
  129. __NWT:    CALL    CLS            ; CLEAR THE SCREEN
  130.     MOV    DX,&CRLF        ; SPACE DOWN A LINE
  131.     CALL    PRINTM
  132.     MOV    BX,&BANNER        ; POINT TO BANNER
  133.     CALL    CENTER            ; PRINT CENTERED
  134.     CMP    NMBLNS,=20    ; TESTING: OVER 20?
  135.     JNA    __LO
  136.     MOV    CX,=16*256+30
  137.     CALL    GOTOXY
  138.     MOV    DX,&TOOMNL
  139.     CALL    PRINTM
  140.     JMP    EXIT
  141. ;
  142. __LO:    CALL    DSPMNU            ; DISPLAY MENU SELECTIONS
  143.     MOV    CX,=4*256+20        ; CURSOR POSITION
  144. ;
  145. ; THE FOLLOWING LOOP IS USED TO SELECT AN ITEM
  146. ; CX PRESERVED THROUGHOUT TO HOLD SCREEN ADDRESS
  147. ;
  148. SELECT:    CALL    GOTOXY            ; PLACE CURSOR ON SELECTION
  149.     CALL    GETCH            ; GET A CHARACTER
  150.     CMP    AL,KEYUP        ; KEY UP?
  151.     JZ    __KUP            ;   YES
  152.     CMP    AL,KEYDN        ; KEY DOWN?
  153.     JZ    __KDN            ;   YES
  154.     CMP    AL,=0X0D        ; RETURN?
  155.     JNZ    __KER            ;   NO, ERROR
  156.     JMP    EXECUT            ;     ELSE EXECUTE COMMAND
  157. ;
  158. __KER:    CMP    AL,KEYXIT        ; EXIT KEY?
  159.     JNZ    __NXK            ;   NO
  160.     CMP    NPRIVX,=0        ; CHECK NONPR FLAG
  161.     JNZ    __EX1            ; EXIT IF SET
  162.     CMP    PRIV,=0            ; PRIV FLAG SET?
  163.     JNZ    __EX1            ;   YES
  164. __NXK:    MOV    AL,=0X07        ; BELL
  165.     CALL    PUTCH
  166.     JMPS    SELECT
  167. ;
  168. __EX1:    JMP    EXIT            ; SPRINGBOARD
  169. ;
  170. ; KEY UP
  171. ;
  172. __KUP:    DEC    CH            ; DECREMENT LINE COUNT
  173.     CMP    CH,=3            ; PAST TOP?
  174.     JNZ    SELECT            ;   NO, LOOP ON
  175.     MOV    CH,BYTE NMBLNS        ;     ELSE LOAD MAXLINE
  176.     ADD    CH,=3            ;     ADD OFFSET
  177.     JMPS    SELECT            ;     AND LOOP
  178. ;
  179. ; KEY DOWN
  180. ;
  181. __KDN:    INC    CH            ; INCREMENT LINE COUNT
  182.     MOV    AX,NMBLNS        ; GET LINE COUNT
  183.     ADD    AL,=4            ; ADD OFFSET
  184.     CMP    AL,CH            ; BELOW BOTTOM?
  185.     JNZ    SELECT            ;   NO, CONTINUE
  186.     MOV    CH,=4            ;     ELSE LOAD TOP
  187.     JMPS    SELECT            ;     AND LOOP
  188. ;
  189. ; COME HERE TO EXECUTE A PROGRAM
  190. ;
  191. EXECUT:    SUB    CH,=3            ; NORMALIZE COMMAND POINTER
  192.     MOV    SI,&SCREEN        ; POINT TO SCREEN STRING
  193. __EXF:    DEC    CH            ; DECREMENT COUNTER
  194.     JZ    __FND            ; EXIT LOOP IF FOUND
  195. __F0:    INC    SI
  196.     CMP    [SI],=BYTE 0
  197.     JZ    __EXF
  198.     JMPS    __F0
  199. ;
  200. __FND:    INC    SI            ; STEP PAST EOL
  201.     INC    SI            ; STEP PAST COMMAND BYTE
  202. __FVB:    INC    SI
  203.     CMP    [SI],=BYTE '|'        ; STEP TO SECOND DELIMITER
  204.     JNZ    __FVB            ; LOOP TILL FOUND
  205.     INC    SI            ; POINT TO COMMAND STRING
  206.     MOV    DI,&CMDLN+2        ; POINT TO COMMAND LINE
  207.     MOV    AL,=1            ;   CONSTRUCTION AREA
  208. __ML:    MOVS    BYTE            ;   MOVE A BYTE
  209.     INC    AL
  210.     CMP    [SI],=BYTE 0        ; CHECK FOR END
  211.     JNZ    __ML            ; LOOP IF NOT
  212.     MOV    CMDLN,AL
  213.     MOV    CL,=18            ; ELSE SEND COMMAND LINE
  214.     MOV    DX,&CMDLN
  215.     INT    TFUNC            ; DO IT
  216.     MOV    CL,=17            ; ENABLE AUTOLOAD
  217.     MOV    DL,=0XFF
  218.     INT    TFUNC
  219.     CALL    CLS            ; CLEAR THE SCREEN
  220.     JMP    EXITX            ; EXIT AND EXECUTE
  221.  
  222.  
  223. ;
  224. EXIT:    MOV    CX,=22*256+0        ; PLACE CURSOR ON BOTTON OF SCREEN
  225.     CALL    GOTOXY
  226.     MOV    CL,=17            ; DISABLE AUTOLOAD
  227.     MOV    DL,=0
  228.     INT    TFUNC
  229. EXITX:    MOV    CL,=0
  230.     INT    CFUNC
  231. ;
  232. ;    +-------------+
  233. ;    | SUBROUTINES |
  234. ;    +-------------+
  235. ;
  236. ;    DISPLAY MENU SCREEN
  237. ;    -------------------
  238. ;
  239. DSPMNU:    MOV    SI,&SCREEN        ; POINT TO SELECTIONS
  240.     MOV    CX,=4*256+20        ; CURSOR POSITION
  241. __DSLP:    CALL    GOTOXY
  242.     MOV    AL,[SI]
  243.     CMP    AL,=0XFF        ; END OF MENU?
  244.     JNZ    __X
  245.     RET                ; YES, RETURN
  246. ;
  247. __X:    CALL    PUTCH            ; DISPLAY RESPONSE CHARACTER
  248.     INC    SI
  249.     INC    SI            ; POINT TO DESCRIPTION
  250.     MOV    DX,&SEP            ; DISPLAY SEPARATOR
  251.     CALL    PRINTM
  252. __DSDL:    MOV    AL,[SI]
  253.     CMP    AL,='|'            ; DELIMITER?
  254.     JZ    __DSDX            ;   YES, EXIT
  255.     CALL    PUTCH
  256.     INC    SI
  257.     JMPS    __DSDL
  258. ;
  259. __DSDX:    INC    SI
  260.     CMP    [SI],=BYTE 0
  261.     JNZ    __DSDX
  262.     INC    SI
  263.     INC    CH            ; NEXT LINE
  264.     JMPS    __DSLP
  265. ;
  266. ;    CENTER PRINT STRING AT BX
  267. ;    -------------------------
  268. ;
  269. CENTER:    PUSH    BX            ; SAVE STRING POINTER
  270.     XOR    CX,CX            ; SET COUNTER TO 0
  271. __CCL:    CMP    [BX],=BYTE '$'        ; END MARK?
  272.     JZ    __CCE            ;   YES
  273.     INC    BX
  274.     INC    CL
  275.     JMPS    __CCL
  276. ;
  277. __CCE:    MOV    AL,CCOLUM        ; GET NUMBER OF COLUMNS
  278.     SUB    AL,CL            ; SUBTRACT NUMBER OF CHARACTERS
  279.     SHR    AL,=1            ; DIVIDE BY 2
  280.     MOV    CL,AL            ; PUT INTO COUNTER REGISTER
  281.     MOV    AL,=' '            ; SPACE
  282. __CCS:    CALL    PUTCH            ; PRINT A SPACE
  283.     LOOP    __CCS            ; UNTIL DONE
  284.     POP    DX            ; GET STRING POINTER
  285.     JMP    PRINTM            ; NOW PRINT IT
  286. ;
  287. ;    POSITION CURSOR
  288. ;    ---------------
  289. ;
  290. GOTOXY:    PUSH    SI
  291.     MOV    SI,&CURAD1        ; SEND LEAD-IN
  292.     CALL    TERCMD
  293.     CMP    CURAD2,=0        ; COL/ROW?
  294.     JNZ    __NCR            ; NO, ROW/COL
  295.     XCHG    CH,CL            ; ELSE SWAP
  296. __NCR:    MOV    AL,CH            ; GET ADDR
  297.     ADD    AL,CURAD4        ; ADD OFFSET
  298.     CALL    PUTCH            ; OUTPUT IT
  299.     MOV    AL,CL            ; GET SECOND ADDR
  300.     ADD    AL,CURAD4        ; ADD OFFSET
  301.     CALL    PUTCH            ; OUTPUT IT
  302.     POP    SI
  303.     RET
  304. ;
  305. ;    TURN REVERSE ON
  306. ;    ---------------
  307. ;
  308. INREV:    MOV    SI,&CINREV
  309.     JMPS    TERCMD
  310. ;
  311. ;    TURN REVERSE OFF
  312. ;    ----------------
  313. ;
  314. OUTREV:    MOV    SI,&COTREV
  315.     JMPS    TERCMD
  316. ;
  317. ;    CLEAR THE SCREEN
  318. ;    ----------------
  319. ;
  320. CLS:    MOV    SI,&CLRSCR        ; POINT TO CLEAR SCREEN CODE
  321. ;
  322. ;    SEND TERMINAL COMMAND
  323. ;    ---------------------
  324. ;
  325. TERCMD:    PUSH    AX            ; SAVE ACCUMULATOR
  326.     PUSH    CX            ; SAVE COUNTER
  327.     MOV    CL,[SI]            ; GET NUMBER OF BYTES
  328.     XOR    CH,CH            ; MAKE 16 BITS
  329. __TCL:    INC    SI            ; POINT TO NEXT BYTE
  330.     MOV    AL,[SI]            ; GET BYTE
  331.     CALL    PUTCH            ; OUTPUT CHARACTER
  332.     LOOP    __TCL            ; REPEAT UNTIL DONE
  333.     POP    CX            ; RESTORE REGISTERS
  334.     POP    AX
  335.     RET
  336. ;
  337. ;    OUTPUT CHARACTER IN AL
  338. ;    ----------------------
  339. ;
  340. PUTCH:    PUSH    AX            ; SAVE MOST REGISTERS
  341.     PUSH    BX
  342.     PUSH    CX
  343.     PUSH    DX
  344.     PUSH    SI
  345.     MOV    CL,=2
  346.     MOV    DL,AL
  347.     INT    CFUNC
  348.     POP    SI
  349.     POP    DX
  350.     POP    CX
  351.     POP    BX
  352.     POP    AX
  353.     RET
  354. ;
  355. ; GET CHARACTER INTO AL
  356. ;
  357. GETCH:    PUSH    BX            ; SAVE MOST REGISTERS
  358.     PUSH    CX
  359.     PUSH    DX
  360.     PUSH    SI
  361.     MOV    CL,=3
  362.     INT    CFUNC
  363.     POP    SI
  364.     POP    DX
  365.     POP    CX
  366.     POP    BX
  367.     RET
  368. ;
  369. ;    PRINT STRING AT DX
  370. ;    ------------------
  371. ;
  372. PRINTM:    PUSH    BX
  373.     PUSH    CX
  374.     PUSH    DX
  375.     PUSH    SI
  376.     MOV    CL,=9
  377.     INT    CFUNC
  378.     POP    SI
  379.     POP    DX
  380.     POP    CX
  381.     POP    BX
  382.     RET
  383. ;
  384. ;    INITIALIZE PROGRAM
  385. ;    ------------------
  386. ;
  387. INIPGM:    MOV    BX,CS            ; SET UP REGISTERS
  388.     MOV    DX,&ABORT        ;   FOR ABORT TRAP
  389.     MOV    CL,=8
  390.     INT    TFUNC
  391.     MOV    CL,=12            ; GET PRIVILEGE STATUS
  392.     INT    TFUNC
  393.     MOV    PRIV,CH            ; SAVE IT
  394.     MOV    CL,=17            ; ENABLE AUTOLOAD
  395.     MOV    DL,=0XFF
  396.     INT    TFUNC
  397. ;
  398. ; NOW DETERMINE TOTAL NUMBER OF MENU SELECTIONS
  399. ; (SIMPLY COUNT NULL CHARACTERS IN THE DEFINITION SPACE)
  400. ;
  401.     MOV    SI,&SCREEN        ; POINT TO SCREEN DEF SPACE
  402.     XOR    AX,AX            ; CLEAR COUNTER
  403.     MOV    CX,=8192        ; MAX NUMBER OF BYTES
  404. __NCL:    CMP    [SI],=BYTE 0X00        ; DEF LINE END?
  405.     JZ    __DLE            ;   YES
  406.     CMP    [SI],=BYTE 0XFF        ; SCREEN END?
  407.     JZ    __SCE            ;   YES
  408. __C:    INC    SI            ; INCREMENT POINTER
  409.     LOOP    __NCL            ;   AND CONTINUE
  410.     MOV    DX,&MINVME        ; COMPLAIN
  411.     CALL    PRINTM
  412.     JMP    EXIT            ; AND QUIT
  413. ;
  414. __DLE:    INC    AX            ; BUMP COUNTER
  415.     JMPS    __C
  416. ;
  417. __SCE:    MOV    NMBLNS,AX        ; STORE NUMBER OF LINES
  418.     RET                ; AND RETURN
  419. ;
  420. ABORT:    RETF
  421.     END
  422. RINTM:    PUSH    BX
  423.     PUSH    CX
  424.     PUSH    DX
  425.     PUSH    SI
  426.     MOV    CL,=9
  427.     INT    CFUNC
  428.     POP    SI
  429.     POP    DX
  430.     P