home *** CD-ROM | disk | FTP | other *** search
/ CP/M / CPM_CDROM.iso / demon / amstrad / ptrdef02.arc / DDMENU.ASM < prev    next >
Encoding:
Assembly Source File  |  1993-08-30  |  19.3 KB  |  1,121 lines

  1. ;This module contains the installable routines for the program PTRDEF.
  2. ;Installed at present on Amstrad PCW/CPC/Spectrum +3
  3. ;
  4. ;To alter: Change values/graphic routines included.
  5. ;Then type:
  6. ;      RMAC DDMENU
  7. ;      LINK PTRDEF,DDMENU,PTRLIB[S]
  8. ;
  9. ; This can only be updated and run on CP/M 3 computers.
  10. ;
  11.     CSEG
  12. ;
  13. ; Graphics:
  14. ;
  15. GTLC    EQU    134        ; Top left corner
  16. GTRC    EQU    140        ; Top right corner
  17. GBLC    EQU    131        ; Bottom left corner
  18. GBRC    EQU    137        ; Bottom right corner
  19. GTL    EQU    138        ; Top line
  20. GBL    EQU    GTL        ; Bottom line
  21. GLL    EQU    133        ; Left side
  22. GRL    EQU    GLL        ; Right side
  23. GLJ    EQU    130        ; Left side /internal line junction
  24. GRJ    EQU    136        ; Right side/internal line junction
  25. GIL    EQU    154        ; Internal line
  26. DOT    EQU    144        ; Graphic dot
  27. DOTCUR    EQU    128        ; Graphic cursor
  28.  
  29. ;If your terminal doesn't have graphics, suggested replacements are:
  30. ;GTLC,GTRC,GBLC,GBRC   + sign
  31. ;GTL,GBL               - sign
  32. ;GLL,GRL,GLJ,GRJ       Exclamation mark or Vertical Bar
  33. ;GIL                   = sign
  34. ;DOT                   . full stop
  35. ;DOTCUR                * or similar.
  36.  
  37. ESC    EQU    1BH        ; Escape
  38. CR    EQU    0DH        ; Return
  39.  
  40. LA    EQU    1        ; Left  Arrow
  41. RA    EQU    6        ; Right Arrow
  42. UA    EQU    31        ; Up    Arrow
  43. DA    EQU    30        ; Down  Arrow
  44.  
  45. FDOS    EQU    0005H
  46.  
  47.     PUBLIC    CON6,PRINT,STRING$,OPCHAR,OPCCB,UPCASEA,BLEEP,MENU,CLRMENU
  48.     PUBLIC    CURON,CUROFF,HIVON,HIVOFF,LOVON,LOVOFF,DRAWBOX,PLOTBYTE,SCRINI
  49.     PUBLIC    SCRUNI,DOTHL,CURHL,ARRTEST,PRINAT,FNTBOX,ANYCHAR
  50.  
  51. UPCASEA:
  52.     CPI    'a'        ; PUBLIC - convert the character in A to
  53.     RC            ;upper case.
  54.     CPI    'z'+1
  55.     RNC
  56.     ANI    0DFH
  57.     RET
  58. ;
  59. BLEEP:    PUSH    D        ; PUBLIC - Sound the bell.
  60.     MVI    E,7
  61.     CALL    OPCHAR
  62.     POP    D
  63.     RET
  64. ;
  65. CON6:    PUSH    B        ; PUBLIC. If there is no keypress A=0 else
  66.     PUSH    D        ;A=Keypress.
  67.     PUSH    H
  68.     MVI    C,6
  69.     MVI    E,0FFH
  70.     CALL    FDOS
  71.     POP    H
  72.     POP    D
  73.     POP    B
  74.     RET
  75. ;
  76. PRINT:    PUSH    PSW        ; PUBLIC. Print an ASCII string, saving all 8080
  77.     PUSH    B        ;registers.
  78.     PUSH    D
  79.     PUSH    H
  80.     MVI    C,9
  81.     CALL    FDOS
  82.     POP    H
  83.     POP    D
  84.     POP    B
  85.     POP    PSW
  86.     RET
  87. ;
  88. STRING$:
  89.                 ; Print the character in E, B times.
  90.     PUSH    B
  91. STRI$1:    CALL    OPCHAR
  92.     DCR    B
  93.     JNZ    STRI$1
  94.     POP    B
  95.     RET
  96. ;
  97. OPCCB:    PUSH    PSW        ; Print a fixed length string, saving all 8080
  98.     PUSH    B        ; registers.
  99.     PUSH    D
  100.     PUSH    H
  101.     MVI    C,111
  102.     CALL    FDOS
  103.     POP    H
  104.     POP    D
  105.     POP    B
  106.     POP    PSW
  107.     RET
  108. ;
  109. ANYCHAR:
  110.     PUSH    PSW        ; PUBLIC - Print any character from 0-255.
  111.     MOV    A,E        ;If your terminal only supports nos 32-126,
  112.     CPI    20H        ;you may wish to alter this routine so that
  113.     JC    AC1        ;characters above 126 give a ? mark, by removing
  114. ;    CPI    7FH        ;the semicolons at the start of these lines.
  115. ;    JNC    AC1
  116.     POP    PSW
  117.     JMP    OPCHAR
  118. ;
  119. AC1:    PUSH    D
  120.     MVI    E,'?'
  121.     CALL    OPCHAR
  122.     POP    D
  123.     POP    PSW
  124.     RET
  125. ;
  126. OPCHAR:
  127.     PUSH    PSW        ; PUBLIC - print a character, saving all 8080
  128.     PUSH    B        ;registers.
  129.     PUSH    D
  130.     PUSH    H
  131.     MVI    C,2
  132.     CALL    FDOS
  133.     POP    H
  134.     POP    D
  135.     POP    B
  136.     POP    PSW
  137.     RET
  138. ;
  139. PRINAT:
  140.     PUSH    PSW        ; PUBLIC. Move the cursor to a Y position
  141.     PUSH    D        ; specified by D, and an X position specified
  142.     LXI    D,AT$        ; by E.
  143.     CALL    PRINT
  144.     POP    D
  145.     MVI    A,32
  146.     ADD    D
  147.     PUSH    D
  148.     MOV    E,A
  149.     CALL    OPCHAR
  150.     MVI    A,32
  151.     POP    D
  152.     PUSH    D
  153.     ADD    E
  154.     MOV    E,A
  155.     CALL    OPCHAR
  156.     POP    D
  157.     POP    PSW
  158.     RET
  159. ;
  160.     DSEG
  161. AT$:    DB    CR,ESC,'Y$'
  162. HV1$:    DB    ESC,'p$'
  163. HV0$:    DB    ESC,'q$'
  164. LV1$:    DB    ESC,'r$'
  165. LV0$:    DB    ESC,'u$'
  166. CUR0$:    DB    ESC,'f$'
  167. CUR1$:    DB    ESC,'e$'
  168. SCRINI:
  169.     DB    ESC,'y',ESC,'E',ESC,'x',ESC,'0',ESC,'H$'
  170. SCRUNI:
  171.     DB    ESC,'y',ESC,'E',ESC,'1',ESC,'H$'
  172. ;
  173. ;SCRINI and SCRUNI are public. They are, respectively, the screen initialisation
  174. ;and de-initialisation codes sent to the terminal. SCRINI is sent at the start
  175. ;of the program and should select a 24x80 screen, clear the screen and home the
  176. ;cursor. SCRUNI should return the terminal to whatever state you think it should
  177. ;be returned to.
  178. ;
  179.     CSEG
  180. ;
  181. ;The next four routines are used for special effects:
  182. ;"High/Inverse video" is used for the information lines, the menus, "inked"
  183. ;                    dots on the character design grid, etc.
  184. ;"Low video"          is used for character markers when marking a section of
  185. ;                    the font.
  186. ;"Normal video"       is used in the menus, "blank" dots on the character grid
  187. ;                    etc. Normal video should be selected by the "Cancel High"
  188. ;                    and "Cancel low" routines.
  189. ;
  190. ;"High video" and "Low video" will not be used at the same time, but they have
  191. ;separate "cancel" routines for future expansion.
  192.  
  193. HIVON:    PUSH    D    ;PUBLIC - Select High/Inverse video.
  194.     LXI    D,HV1$
  195.     CALL    PRINT
  196.     POP    D
  197.     RET
  198. ;
  199. HIVOFF:            ;PUBLIC - Cancel High/Inverse video.
  200.     PUSH    D
  201.     LXI    D,HV0$
  202.     CALL    PRINT
  203.     POP    D
  204.     RET
  205. ;
  206. LOVON:    PUSH    D    ;PUBLIC - Select Low video (implemented as underlining)
  207.     LXI    D,LV1$
  208.     CALL    PRINT
  209.     POP    D
  210.     RET
  211. ;
  212. LOVOFF:    PUSH    D    ;PUBLIC - Cancel Low video/underlining.
  213.     LXI    D,LV0$
  214.     CALL    PRINT
  215.     POP    D
  216.     RET
  217. ;
  218. CURON:    PUSH    D    ;PUBLIC - turn the cursor on.
  219.     LXI    D,CUR1$
  220.     CALL    PRINT
  221.     POP    D
  222.     RET
  223. ;
  224. CUROFF:            ;PUBLIC - turn the cursor off.
  225.     PUSH    D
  226.     LXI    D,CUR0$
  227.     CALL    PRINT
  228.     POP    D
  229.     RET
  230. ;
  231. ;COMTAB is a keyboard translation table for the control keys. It is used for editing 
  232. ;options in the "line input" routine and are at present set up as for a PCW keyboard.
  233. ;To change it, set a DW to the new value. Allowed values are:
  234. ;
  235. ;INPUT3          - No special action; put the control character in the input buffer.
  236. ;                  It will display as a ? mark.
  237. ;MOVLT,MOVRT     - cursor left or right
  238. ;LINEOL          - cursor to start/end of line
  239. ;ABANDON         - abandon input and quit menu
  240. ;RDEL            - delete character under cursor
  241. ;DELETE          - delete left
  242. ;FINISH          - End input successfully
  243. ;DEL2EOL,DEL2BOL - delete to end/start of line
  244. ;OUT2MEN         - Up and down cursor keys
  245. ;EXIT            - Escape. Similar in effect to ABANDON.
  246.  
  247.     DSEG
  248. COMTAB:    DW    INPUT3        ; ^@ (^@ cannot be typed anyway).
  249.     DW    MOVLT        ; ^A
  250.     DW    LINEOL        ; ^B
  251.     DW    ABANDON        ; ^C
  252.     DW    INPUT3        ; ^D
  253.     DW    INPUT3        ; ^E
  254.     DW    MOVRT        ; ^F
  255.     DW    RDEL        ; ^G
  256.     DW    DELETE        ; ^H
  257.     DW    INPUT3        ; ^I
  258.     DW    FINISH        ; ^J
  259.     DW    DEL2EOL        ; ^K
  260.     DW    INPUT3        ; ^L
  261.     DW    FINISH        ; ^M
  262.     DW    INPUT3        ; ^N
  263.     DW    INPUT3        ; ^O
  264.     DW    INPUT3        ; ^P
  265.     DW    INPUT3        ; ^Q
  266.     DW    INPUT3        ; ^R
  267.     DW    INPUT3        ; ^S
  268.     DW    INPUT3        ; ^T
  269.     DW    INPUT3        ; ^U
  270.     DW    INPUT3        ; ^V
  271.     DW    INPUT3        ; ^W
  272.     DW    DEL2BOL        ; ^X
  273.     DW    INPUT3        ; ^Y
  274.     DW    INPUT3        ; ^Z
  275.     DW    EXIT        ; ^[
  276.     DW    DEL2EOL        ; ^\ ([-])
  277.     DW    INPUT3        ; ^]
  278.     DW    OUT2MEN        ; ^^
  279.     DW    OUT2MEN        ; ^_
  280.     CSEG
  281. ;
  282. ;Beyond this point are routines which should not need altering. They are only in
  283. ;this file because they use the graphic characters or cursor keys defined above.
  284. ;_______________________________________________________________________________
  285. ;
  286. MENU:
  287. ;
  288. ;PUBLIC - Pull down Menu.
  289. ;
  290. ;On entry, HL points to menu buffer.
  291. ;A=Option number indicated at start (usually 1)
  292. ;
  293. ;On exit, A=Option number selected.
  294. ;   B=0 => ENTER was pressed.
  295. ;   B=2 => EXIT  was pressed.
  296. ;   B=3 => STOP  was pressed.
  297. ;   B=4 => Left or right arrow was pressed; and line input was made.
  298. ;
  299. ; DE points to the input made if B=4; Otherwise DE corrupt.
  300. ; Flags corrupt.
  301. ; All other registers preserved.
  302. ;
  303. ;FORMAT OF THE MENU BUFFER:
  304. ;
  305. ;+0:        Y-coordinate of top of menu
  306. ; 1:        X-coordinate of left side of menu
  307. ; 2:        Width of a menu option
  308. ; 3:        Number of menu options
  309. ; 4:        Title
  310. ; 4+width:      Option entries 1..N
  311. ;
  312. ;Each option entry is:
  313. ;
  314. ; Base:        Name
  315. ; Base+width:   Shortcut; if this byte is recieved at the keyboard, the menu
  316. ;                        cursor will jump to this entry. (unless input
  317. ;                        specified)
  318. ; Base+width+1:    Status word.
  319. ;         If bit 15 is set, input can be allowed at this entry.
  320. ;         Bits 14-8 : Max. possible length of input buffer
  321. ;                Bits 7 -0 : Offset for input buffer
  322. ; 0=LH edge of menu
  323. ;
  324. ;1. DRAW THE MENU
  325.  
  326.     SHLD    HLSTORE
  327.     MOV    D,M
  328.     INX    H
  329.     MOV    E,M        ; Y,X COORDINATES
  330.     PUSH    D
  331.     CALL    PRINAT        ; PRINT @ Y,X
  332.     CALL    HIVON        ; HI VIDEO ON.
  333.     MVI    E,GTLC
  334.     CALL    OPCHAR
  335.     MVI    E,GTL        ; TOP LEFT CORNER; TOP LINE; TOP RIGHT CORNER
  336.     INX    H
  337.     MOV    B,M
  338.     CALL    STRING$
  339.     MVI    E,GTRC
  340.     CALL    OPCHAR
  341.     POP    D
  342.     INR    D
  343.     PUSH    D
  344.     CALL    PRINAT
  345.     MVI    E,GLL        ; LH LINE; TITLE; RH LINE
  346.     CALL    OPCHAR
  347.     PUSH    PSW
  348.     MOV    A,B
  349.     STA    OPTLEN
  350.     XRA    A        ; SAVE LENGTH OF OPTION/TITLE
  351.     STA    OPTLEN+1
  352.     POP    PSW
  353.     INX    H
  354.     INX    H        ; HL=TITLE
  355.     SHLD    MENUCCB
  356.     LXI    D,MENUCCB
  357.     CALL    OPCCB
  358.     MVI    E,GRL
  359.     CALL    OPCHAR
  360.     POP    D
  361.     INR    D
  362.     PUSH    D
  363.     CALL    PRINAT
  364.     MVI    E,GLJ        ; LH JUNCTION; INTERIOR LINE; RH JUNCTION
  365.     CALL    OPCHAR
  366.     CALL    GETLEN        ; LENGTH OF INTERIOR LINE
  367.     MVI    E,GIL
  368.     CALL    STRING$
  369.     MVI    E,GRJ
  370.     CALL    OPCHAR
  371.     DCX    H
  372.     MOV    B,M        ; B=NUMBER OF OPTIONS
  373.     PUSH    PSW
  374.     MOV    A,B
  375.     STA    NUMOPT
  376.     POP    PSW
  377.     INX    H
  378.     CALL    SKIPLEN        ; MSTART = START OF 1ST OPTION
  379.     SHLD    MSTART
  380. MENULOOP:
  381.     POP    D
  382.     INR    D        ; MOVE DOWN 1 LINE
  383.     PUSH    D
  384.     CALL    PRINAT
  385.     MVI    E,GLL        ; LINE; OPTION; LINE
  386.     CALL    OPCHAR
  387.     SHLD    MENUCCB
  388.     LXI    D,MENUCCB
  389.     CALL    OPCCB
  390.     CALL    SKIPLEN3
  391.     MVI    E,GRL        ; NEXT OPTION
  392.     CALL    OPCHAR
  393.     DCR    B
  394.     JNZ    MENULOOP
  395.     POP    D
  396.     INR    D
  397.     CALL    PRINAT
  398.     MVI    E,GBLC        ; BOTTOM LEFT; BOTTOM LINE; BOTTOM RIGHT
  399.     CALL    OPCHAR
  400.     MVI    E,GBL
  401.     CALL    GETLEN
  402.     CALL    STRING$
  403.     MVI    E,GBRC
  404.     CALL    OPCHAR        ; MENU DRAWN.
  405. ;
  406. ; FIND OUT IF THERE IS AN INITIAL POSITION.
  407. ;
  408.     LXI    H,NUMOPT
  409.     MOV    B,M        ; B=MAX. VALUE OF A
  410.     INR    B
  411.     CMP    B        ; A=REAL VALUE OF A
  412.     JNC    SETNO1
  413.     ORA    A        ; A=0 UNACCEPTABLE.
  414.     JZ    SETNO1
  415.     JMP    SETNO2
  416. ;
  417. SETNO1:    MVI    A,1
  418. SETNO2:    STA    BARPOS
  419.  
  420. ;2. PUT THE MENU BAR UP.
  421.  
  422. MAINLOOP:
  423.     CALL    CUROFF        ; CURSOR OFF
  424.     LDA    BARPOS
  425.     CALL    PRINTBAR
  426.     CALL    FINDOPT        ; PRINT THE BAR; MOVE HL TO OPTIONS FOR THIS LINE
  427.     CALL    SKIPLEN
  428.     INX    H        ; STATUS WORD BYTE 1
  429.     MOV    C,A
  430.     MOV    A,M        ; BIT 7,M
  431.     RAL
  432.     MOV    A,C
  433.     JNC    NOOPT        ; NO SPECIAL EFFECTS
  434.     INX    H
  435.     MOV    C,M        ; C=OFFSET FOR CURSOR: HORIZONTAL
  436.     CALL    BARPL        ; DE=Y,X COORDINATES OF START OF BAR
  437.     MOV    A,C
  438.     ADD    E
  439.     MOV    E,A        ; E=E+C
  440.     CALL    PRINAT
  441.     CALL    CURON        ; POSITION CURSOR AT START OF INPUT.
  442. ;
  443. ;3. GET A CHARACTER AND ACT AS FOLLOWS:
  444. ;      IF IT IS UP OR DOWN ARROW, MOVE MENU BAR ACCORDINGLY.
  445. ;      IF IT IS ^M, FLAG CR AND RETURN
  446. ;      IF IT IS <-DEL, FLAG DEL & RETURN
  447. ;      IF IT IS ^C, FLAG ETX & RETURN
  448. ;      IF IT IS ^[, FLAG ESC & RETURN
  449. ;      IF BAR IS ON AN INPUT OPTION, ENTER SPECIAL INPUT ROUTINE.
  450. ;      OTHERWISE, USE THE SHORTCUT KEY.
  451. ;
  452. NOOPT:    CALL    CON6
  453.     ORA    A
  454.     JZ    NOOPT
  455.     CPI    CR        ; TEST FOR CARRIAGE RETURN
  456.     JNZ    NOCR
  457.     MVI    B,0
  458. EXMENU:    LHLD    HLSTORE
  459.     CALL    HIVOFF
  460.     CALL    CUROFF
  461.     LDA    BARPOS
  462.     RET
  463. ;
  464. NOCR:    CPI    1BH        ; TEST FOR ESCAPE (EXIT)
  465.     JNZ    NOESC
  466.     MVI    B,2
  467.     JMP    EXMENU
  468. ;
  469. NOESC:    CPI    03H        ; TEST FOR ETX (STOP)
  470.     JNZ    NOSTOP
  471.     MVI    B,3
  472.     JMP    EXMENU
  473. ;
  474. NOSTOP:    CPI    UA
  475.     JZ    UP
  476.     CPI    DA        ; DEAL WITH BAR UP/DOWN
  477.     JZ    DOWN
  478.     MOV    C,A        ; SAVE CHARACTER FOR LATER USE.
  479.     LDA    BARPOS
  480.     CALL    FINDOPT        ; DOES THIS OPTION ALLOW INPUT?
  481.     CALL    SKIPLEN
  482.     INX    H        ; HL=FIRST OPTION BYTE
  483.     MOV    A,M
  484.     RAL            ; BIT 7,M
  485.     JC    INDATA
  486.     MOV    A,C
  487. ;
  488. ; Test the shortcuts.
  489. ;
  490. ; Convert to uppercase.
  491. ;
  492.     CALL    UPCASEA
  493.     LXI    H,NUMOPT
  494.     MOV    B,M        ; B=NO. OF OPTIONS => NUMBER OF SHORTCUTS
  495. SCLOOP:    MOV    C,A        ; C=KEYPRESS
  496.     MOV    A,B
  497.     CALL    FINDOPT
  498.     CALL    SKIPLEN        ; HL POINTS TO SHORTCUTS.
  499.     MOV    A,C        ; A=KEYPRESS
  500.     CMP    M        ; DOES A=SHORTCUT?
  501.     JZ    MOVBAR
  502.     DCR    B
  503.     JNZ    SCLOOP
  504.     CALL    BLEEP
  505. ;
  506. ;4. GO TO 2.
  507. ;
  508.     JMP    MAINLOOP
  509. ;
  510. MOVBAR:    LDA    BARPOS        ; MOVE BAR TO POSITION IN B.
  511.     CALL    DELBAR
  512.     MOV    A,B
  513.     STA    BARPOS
  514.     JMP    MAINLOOP
  515. ;
  516. UP:    LDA    BARPOS
  517.     MOV    B,A
  518.     DCR    B
  519.     JZ    MAINLOOP
  520.     JMP    MOVBAR
  521. ;
  522. DOWN:    LXI    H,NUMOPT    ; (HL)=NO. OF OPTIONS
  523.     LDA    BARPOS
  524.     CMP    M
  525.     JNC    MAINLOOP
  526.     MOV    B,A
  527.     INR    B
  528.     JMP    MOVBAR
  529. ;
  530. PRINTBAR:
  531.                 ; PRINT THE MENU BAR
  532.     PUSH    D
  533.     CALL    BARPL        ; LOCATE BAR
  534.     CALL    PRINAT        ; PRINT POSITION AT START OF BAR
  535.     CALL    HIVOFF
  536.     LXI    D,MENUCCB
  537.     CALL    OPCCB        ; PRINT MENU OPTION
  538.     CALL    HIVON
  539.     POP    D
  540.     RET
  541. ;
  542. DELBAR:    PUSH    D        ; REMOVE THE MENU BAR
  543.     CALL    BARPL
  544.     CALL    PRINAT
  545.     CALL    HIVON
  546.     LXI    D,MENUCCB
  547.     CALL    OPCCB
  548.     POP    D
  549.     RET
  550. ;
  551. BARPL:    PUSH    PSW
  552.     PUSH    H
  553.     CALL    FINDOPT        ; FIND Y,X FOR OPTION NUMBER A
  554.     SHLD    MENUCCB
  555.     LHLD    HLSTORE        ; HL POINTS TO Y,X COORDINATES
  556.     ADD    M        ; A=OPTION NUMBER+TOP LINE
  557.     INR    A
  558.     INR    A        ; A=OPT.NO + OFFSET
  559.     MOV    D,A
  560.     INX    H
  561.     MOV    E,M        ; E=X-COORDINATE OF MENU
  562.     INR    E
  563.     POP    H
  564.     POP    PSW
  565.     RET            ; RETURN Y,X IN D,E
  566.  
  567. FINDOPT:            ; FIND THE ADDRESS OF OPTION NO. A
  568.     PUSH    B        ; AND RETURN IT IN HL.
  569.     LHLD    MSTART        ; HL POINTS TO OPTIONS
  570.     CPI    1
  571.     JZ    FOPT2        ; OPTION ALREADY FOUND
  572.     MOV    B,A
  573.     DCR    B
  574. FOPT1:    CALL    SKIPLEN3    ; SKIP AN ENTRY
  575.     DCR    B
  576.     JNZ    FOPT1
  577. FOPT2:    POP    B
  578.     RET
  579. ;
  580. INDATA:    LDA    BARPOS
  581.     CALL    FINDOPT
  582.     CALL    SKIPLEN        ; OPTION BYTES
  583.     INX    H
  584.     MOV    A,M
  585.     ANI    7FH        ; A=MAX. LENGTH OF INPUT
  586.     STA    MAXLEN
  587.     INX    H
  588.     MOV    A,M
  589.     STA    XOFF
  590.     CALL    HIVOFF        ; NO INVERSE VIDEO.
  591.     CALL    INPUT1        ; WITH C=FIRST KEYPRESS.
  592.     LXI    D,MAXLEN
  593.     MVI    B,4
  594.     JMP    EXMENU
  595. ;
  596.     DSEG
  597. MSTART:    DW    0        ; START ADDR. OF OPTIONS
  598. MENUCCB:
  599.     DW    0
  600. OPTLEN:    DW    0
  601. MAXLEN:    DB    0
  602. INPLEN:    DB    0
  603. INPBUF:    DS    136
  604. HLSTORE:
  605.     DW    0
  606. BARPOS:    DB    0
  607. NUMOPT:    DB    0
  608.     CSEG
  609.  
  610. SKIPLEN:
  611.     XCHG            ; SKIP 1 ENTRY
  612.     LHLD    OPTLEN
  613.     DAD    D
  614.     RET
  615. ;
  616. SKIPLEN3:
  617.     CALL    SKIPLEN
  618.     INX    H
  619.     INX    H        ; MOVE PAST EXTRA DATA
  620.     INX    H
  621.     RET
  622. ;
  623. GETLEN:                ; GET LENGTH OF AN ENTRY IN B.
  624.     PUSH    PSW
  625.     LDA    OPTLEN
  626.     MOV    B,A
  627.     POP    PSW
  628.     RET
  629. ;
  630. INPUT1:    MOV    A,C        ; A=FIRST CHARACTER
  631.     PUSH    PSW
  632.     LXI    H,MAXLEN
  633.     MOV    A,M
  634.     INX    H        ; FIRST LDIR PARAMETER
  635.     MOV    C,A
  636.     MVI    B,0        ; LDIR LENGTH
  637.     LXI    D,INPBUF
  638.     XRA    A
  639.     MOV    M,A
  640. LDIR1:    MOV    A,M        ; CLEAR INPUT BUFFER
  641.     STAX    D    
  642.     INX    D
  643.     INX    H        ; 8080 LDIR
  644.     DCX    B
  645.     MOV    A,B
  646.     ORA    C
  647.     JNZ    LDIR1
  648.     STA    PTR        ; ZERO CURSOR POINTER
  649.     POP    PSW
  650.     JMP    INPUT2
  651. ;
  652.     DSEG
  653. PTR:    DB    0
  654. XOFF:    DB    0
  655.  
  656.  
  657.     CSEG
  658. ;
  659. INPUT:    CALL    CON6
  660.     ORA    A
  661.     JZ    INPUT
  662. INPUT2:    CALL    MOVXY        ; MOVE CURSOR TO RIGHT PLACE
  663.     CPI    20H
  664.     JNC    INPUT3
  665. ;
  666.     MOV    L,A
  667.     MVI    H,0
  668.     DAD    H
  669.     LXI    D,COMTAB
  670.     DAD    D
  671.     MOV    D,M
  672.     INX    H
  673.     MOV    H,M
  674.     MOV    L,D
  675.     PCHL
  676. ;
  677. FINISH:    RET
  678. ;
  679. OUT2MEN:
  680.     POP    H
  681.     JMP    NOSTOP
  682. ;
  683. ABANDON:
  684.     POP    D
  685.     LXI    D,MAXLEN
  686.     MVI    B,3
  687.     RET
  688. ;
  689. EXIT:    POP    D
  690.     LXI    D,MAXLEN
  691.     MVI    B,2
  692.     RET
  693. ;
  694. ;
  695. DELETE:    LDA    PTR
  696.     ORA    A        ; DEL LEFT/^H. AT THE LH END OF THE LINE?
  697.     CZ    BLEEP
  698.     JZ    INPUT
  699. ;
  700.     LXI    H,INPLEN
  701.     CMP    M        ; LAST CHARACTER SPECIAL CASE
  702.     JZ    DELLAST
  703. ;
  704.     CALL    GETPPOS        ; DE=NEXT CHARACTER
  705.     MOV    D,H
  706.     MOV    E,L
  707.     DCX    H        ; HL=THIS CHARACTER
  708. DEL1:    LDAX    D
  709.     MOV    M,A
  710.     ORA    A
  711.     INX    H
  712.     INX    D
  713.     JNZ    DEL1
  714.     LXI    H,PTR
  715.     DCR    M
  716.     LXI    H,INPLEN
  717.     DCR    M
  718.     CALL    UPDLN        ; UPDATE LINE
  719.     CALL    MOVXY
  720.     JMP    INPUT
  721. ;
  722. DELLAST:
  723.     CALL    GETLPOS
  724.     MVI    M,0
  725.     LXI    H,INPLEN
  726.     DCR    M
  727.     LXI    H,PTR
  728.     DCR    M
  729.     CALL    UPDLN
  730.     CALL    MOVXY
  731.     JMP    INPUT
  732. ;
  733. RDEL:    LDA    PTR
  734.     LXI    H,INPLEN
  735.     CMP    M
  736.     CZ    BLEEP
  737.     JZ    INPUT
  738.     CALL    GETPPOS
  739.     MOV    D,H
  740.     MOV    E,L
  741.     INX    D        ; HL=THIS CHARACTER
  742. RDEL1:    LDAX    D
  743.     MOV    M,A
  744.     ORA    A
  745.     INX    H
  746.     INX    D
  747.     JNZ    RDEL1
  748.     LXI    H,INPLEN
  749.     DCR    M
  750.     CALL    UPDLN        ; UPDATE LINE
  751.     CALL    MOVXY
  752.     JMP    INPUT
  753. ;
  754. DEL2EOL:
  755.     CALL    GETPPOS
  756.     LDA    PTR
  757.     STA    INPLEN
  758. DEL3E:    MOV    A,M
  759.     MVI    M,0
  760.     INX    H
  761.     ORA    A
  762.     JNZ    DEL3E
  763.     CALL    UPDLN
  764.     CALL    MOVXY
  765.     JMP    INPUT
  766. ;
  767. DEL2BOL:
  768.     CALL    GETPPOS
  769.     LXI    D,INPBUF
  770.     MVI    B,0
  771. DEL3B:    MOV    A,M
  772.     STAX    D
  773.     INX    H
  774.     INX    D
  775.     INR    B
  776.     ORA    A
  777.     JNZ    DEL3B
  778.     DCR    B
  779.     MOV    A,B
  780.     STA    INPLEN
  781.     XRA    A
  782.     STA    PTR
  783.     CALL    UPDLN
  784.     CALL    MOVXY
  785.     JMP    INPUT
  786. ;
  787. INPUT3:    CPI    127        ; <-DEL?
  788.     JZ    DELETE
  789.     CALL    INSERT
  790.     CALL    UPDLN
  791.     CALL    MOVXY
  792.     JMP    INPUT
  793. ;
  794.     DSEG
  795. CHAR:    DB    0
  796.     CSEG
  797. ;
  798. INSERT:    STA    CHAR        ; INSERT A CHARACTER
  799.     LDA    INPLEN
  800.     LXI    H,MAXLEN
  801.     CMP    M        ; IS LENGTH=MAXIMUM?
  802.     CZ    BLEEP        ; IF YES, BLEEP; DISALLOW
  803.     RZ
  804. ;
  805.     LXI    H,PTR
  806.     CMP    M        ; IS THIS THE LAST CHARACTER?
  807.     JNZ    INSERT1        ; SPECIAL CASE IF JUST ADDING THE LAST CHARACTER
  808.     CALL    GETLPOS
  809.     LDA    CHAR
  810.     MOV    M,A
  811.     INX    H
  812.     MVI    M,0
  813.     LDA    INPLEN
  814.     INR    A
  815.     STA    INPLEN
  816.     STA    PTR
  817.     RET
  818. ;
  819. INSERT1:
  820.     CALL    GETPPOS        ; HL=CURRENT POSITION
  821.     MOV    C,M
  822. INSERT2:
  823.     MOV    A,M
  824.     MOV    M,C
  825.     MOV    C,A
  826.     INX    H
  827.     ORA    A
  828.     ORA    C
  829.     JNZ    INSERT2
  830.     CALL    GETPPOS
  831.     LDA    CHAR
  832.     MOV    M,A        ; STORE NEW CHARACTER
  833.     LXI    H,PTR
  834.     INR    M
  835.     LXI    H,INPLEN
  836.     INR    M
  837.     RET
  838. ;
  839. GETPPOS:
  840.     PUSH    D
  841.     LXI    D,INPBUF
  842.     LHLD    PTR
  843.     MVI    H,0
  844.     DAD    D        ; HL=CURSOR POS.
  845.     POP    D
  846.     RET
  847. ;
  848. MOVLT:    LDA    PTR
  849.     ORA    A
  850.     JZ    INPUT
  851.     DCR    A
  852.     STA    PTR
  853.     CALL    MOVXY
  854.     JMP    INPUT
  855. ;
  856. MOVRT:    LDA    PTR
  857.     LXI    H,INPLEN
  858.     CMP    M
  859.     JZ    INPUT
  860.     INR    A
  861.     STA    PTR
  862.     CALL    MOVXY
  863.     JMP    INPUT
  864. ;
  865. ;
  866. GETLPOS:
  867.     PUSH    D
  868.     LXI    D,INPBUF
  869.     LHLD    INPLEN
  870.     MVI    H,0
  871.     DAD    D
  872.     POP    D
  873.     RET
  874. ;
  875. MOVXY:    PUSH    PSW
  876.     PUSH    B
  877.     PUSH    D
  878.     PUSH    H
  879.     LDA    BARPOS
  880.     CALL    BARPL        ; DE=BAR CO-ORDS (E IS X)
  881.     LDA    XOFF
  882.     MOV    L,A        ; ADD PERMANENT OFFSET
  883.     LDA    PTR
  884.     ADD    L        ; ADD CURSOR OFFSET
  885.     ADD    E
  886.     MOV    E,A        ; PRINT AT CURSOR POSITION FOR BAR.
  887.     CALL    PRINAT
  888. UPDLN2:    POP    H
  889.     POP    D
  890.     POP    B
  891.     POP    PSW
  892.     RET
  893. ;
  894. UPDLN:    PUSH    PSW
  895.     PUSH    B
  896.     PUSH    D
  897.     PUSH    H
  898.     LDA    BARPOS
  899.     CALL    BARPL
  900.     LDA    XOFF
  901.     ADD    E        ; PRINT AT START OF LINE
  902.     MOV    E,A
  903.     CALL    PRINAT
  904.     LXI    H,INPBUF
  905.     LDA    INPLEN
  906.     ORA    A
  907.     JZ    UPDLN3
  908.     MOV    B,A
  909. UPDLN1:    MOV    A,M
  910.     ORA    A        ; PRINT THE STRING SO FAR.
  911.     JZ    UPDLN3
  912.     MOV    E,A
  913.     INX    H
  914.     CALL    ANYCHAR
  915.     DCR    B
  916.     JNZ    UPDLN1
  917. UPDLN3:    LDA    MAXLEN
  918.     LXI    H,INPLEN
  919.     SUB    M        ; A=UNUSED CHARS
  920.     ORA    A
  921.     JZ    UPDLN2
  922.     MOV    B,A
  923.     MVI    E,' '
  924. UPDLN4:    CALL    OPCHAR
  925.     DCR    B
  926.     JNZ    UPDLN4
  927.     JMP    UPDLN2
  928. ;
  929. LINEOL:    LDA    PTR
  930.     ORA    A
  931.     JZ    EOL
  932.     XRA    A
  933.     STA    PTR
  934.     CALL    MOVXY
  935.     JMP    INPUT
  936. ;
  937. EOL:    LDA    INPLEN
  938.     STA    PTR
  939.     CALL    MOVXY
  940.     JMP    INPUT
  941. ;
  942. CLRMENU:
  943.                 ; PUBLIC. CLEAR THE MENU
  944.                 ; HL=MENU BUFFER
  945.     PUSH    PSW
  946.     PUSH    B
  947.     PUSH    D
  948.     PUSH    H
  949.     MOV    D,M
  950.     INX    H
  951.     MOV    E,M
  952.     INX    H
  953.     MOV    C,M
  954.     INX    H
  955.     MOV    B,M
  956.     INR    C
  957.     INR    C
  958.     INR    B
  959.     INR    B
  960.     INR    B
  961.     INR    B
  962. CLRLOOP:
  963.     CALL    PRINAT
  964.     INR    D
  965.     PUSH    D
  966.     MVI    E,' '
  967.     PUSH    B
  968.     MOV    B,C
  969.     CALL    STRING$
  970.     POP    B
  971.     POP    D
  972.     DCR    B
  973.     JNZ    CLRLOOP
  974.     JMP    UPDLN2
  975. ;
  976. DRAWBOX:        ;PUBLIC. Draws a grid of graphic dots, 16 high by 8 wide
  977.     CALL    HIVOFF    ;Surrounds this with a graphic border.
  978.     LXI    D,0423H
  979.     CALL    PRINAT
  980.     MVI    E,GTLC
  981.     CALL    OPCHAR
  982.     MVI    B,8
  983.     MVI    E,GTL
  984.     CALL    STRING$
  985.     MVI    E,GTRC
  986.     CALL    OPCHAR
  987.     MVI    C,16
  988.     LXI    D,0523H
  989. DB1:    PUSH    B
  990.     CALL    PRINAT
  991.     INR    D
  992.     PUSH    D
  993.     MVI    E,GLL
  994.     CALL    OPCHAR
  995.     MVI    E,DOT
  996.     MVI    B,8
  997.     CALL    STRING$
  998.     MVI    E,GRL
  999.     CALL    OPCHAR
  1000.     POP    D
  1001.     POP    B
  1002.     DCR    C
  1003.     JNZ    DB1
  1004.     CALL    PRINAT
  1005.     MVI    E,GBLC
  1006.     CALL    OPCHAR
  1007.     MVI    E,GBL
  1008.     MVI    B,8
  1009.     CALL    STRING$
  1010.     MVI    E,GBRC
  1011.     CALL    OPCHAR
  1012.     RET
  1013. ;
  1014. PLOTBYTE:        ;PUBLIC. Converts a byte into a series of 8 graphic
  1015.     PUSH    PSW    ;dots, and displays them. 0 bits are shown in normal
  1016.     PUSH    B    ;video; 1 bits in high/inverse video.
  1017.     PUSH    D
  1018.     PUSH    H
  1019.     MVI    B,8
  1020. PLB1:    RAL
  1021.     CC    HIVON
  1022.     CNC    HIVOFF
  1023.     MVI    E,DOT
  1024.     CALL    OPCHAR
  1025.     DCR    B
  1026.     JNZ    PLB1
  1027.     POP    H
  1028.     POP    D
  1029.     POP    B
  1030.     POP    PSW
  1031.     RET
  1032. ;
  1033. DOTHL:    PUSH    PSW    ;PUBLIC. Plots the character you have defined as
  1034.     PUSH    B    ;graphic dot, at the grid origin + offsets in
  1035.     PUSH    D    ;H (Y offset) and L (X offset)
  1036.     PUSH    H
  1037.     LXI    D,0524H
  1038.     DAD    D
  1039.     XCHG
  1040.     CALL    PRINAT
  1041.     MVI    E,DOT
  1042.     CALL    OPCHAR
  1043.     POP    H
  1044.     POP    D
  1045.     POP    B
  1046.     POP    PSW
  1047.     RET
  1048. ;
  1049. CURHL:    PUSH    PSW    ;PUBLIC. Plots the character you have defined as
  1050.     PUSH    B    ;graphic cursor, at the grid origin + offsets in
  1051.     PUSH    D    ;H (Y offset) and L (X offset)
  1052.     PUSH    H
  1053.     LXI    D,0524H
  1054.     DAD    D
  1055.     XCHG
  1056.     CALL    PRINAT
  1057.     MVI    E,DOTCUR
  1058.     CALL    OPCHAR
  1059.     POP    H
  1060.     POP    D
  1061.     POP    B
  1062.     POP    PSW
  1063.     RET
  1064. ;
  1065. ARRTEST:        ;PUBLIC. Tests the four keys you have defined as
  1066.     MVI    B,1    ;cursor keys. Answer returned in A: 1=UP, 2=DOWN
  1067.     CPI    UA    ;3=LEFT, 4=RIGHT, 0 otherwise.
  1068.     JZ    ARRT1
  1069.     INR    B
  1070.     CPI    DA
  1071.     JZ    ARRT1
  1072.     INR    B
  1073.     CPI    LA
  1074.     JZ    ARRT1
  1075.     INR    B
  1076.     CPI    RA
  1077.     JZ    ARRT1
  1078.     XRA    A
  1079.     RET
  1080. ;
  1081. ARRT1:    MOV    A,B
  1082.     ORA    A
  1083.     RET
  1084. ;
  1085. FNTBOX: LXI    DE,1306h    ;PUBLIC. Draw a box, size 5x66 (external) at
  1086.     CALL    PRINAT        ;19,6.
  1087.     MVI    E,GTLC
  1088.     CALL    OPCHAR
  1089.     MVI    E,GTL
  1090.     MVI    B,64
  1091.     CALL    STRING$
  1092.     MVI    E,GTRC
  1093.     CALL    OPCHAR
  1094.     MVI    C,3
  1095.     LXI    D,1406H
  1096. FNTB1:    CALL    PRINAT
  1097.     PUSH    D
  1098.     MVI    E,GLL
  1099.     CALL    OPCHAR
  1100.     MVI     E,' '
  1101.     MVI    B,64
  1102.     CALL    STRING$
  1103.     MVI    E,GRL
  1104.     CALL    OPCHAR
  1105.     POP    D
  1106.     INR    D
  1107.     DCR    C
  1108.     JNZ    FNTB1
  1109.     CALL    PRINAT
  1110.     MVI    E,GBLC
  1111.     CALL    OPCHAR
  1112.     MVI    E,GBL
  1113.     MVI    B,64
  1114.     CALL    STRING$
  1115.     MVI    E,GBRC
  1116.     CALL    OPCHAR
  1117.     RET
  1118. ;
  1119. MORPAT:    DS    128    ;Possible area for further patching
  1120.     END
  1121.