home *** CD-ROM | disk | FTP | other *** search
/ C!T ROM 5 / ctrom5b.zip / ctrom5b / PROGRAM / ASM / ALIB30B / CONFIG.ASM < prev    next >
Assembly Source File  |  1994-11-15  |  40KB  |  1,622 lines

  1.     PAGE    66,132
  2. ;******************************** CONFIG.ASM *******************************
  3. LIBSEG    SEGMENT BYTE PUBLIC "LIB"
  4.     ASSUME    CS:LIBSEG,DS:LIBSEG
  5.  
  6.     EXTRN    DOS_MEM_ALLOCATE:FAR,DOS_MEM_RELEASE:FAR
  7.     extrn    buffer_searchc:far
  8.     extrn    find_home_path:far
  9.     extrn    menu_system:far
  10.     extrn    clear_screen:far
  11.     extrn    display_string:far
  12.     extrn    message:far
  13.     extrn    str_copy:far
  14.     extrn    str_cleanl:far
  15.     extrn    BYTE_TO_HEX_STR:far
  16.     extrn    WORD_TO_HEX_STR:far
  17.     extrn    DWORD_TO_HEX_STR:far
  18.     extrn    DWORD_TO_DEC_STR:far
  19.     extrn    DEC_STR_TO_WORD:far
  20.     extrn    DEC_STR_TO_DWORD:far
  21.     extrn    HEX_STR_TO_BYTE:far
  22.     extrn    HEX_STR_TO_WORD:far
  23.     extrn    get_string:far
  24.     extrn    key_put:far
  25.     extrn    posn_to_adr:near
  26.     extrn    $put_crt_blk:near
  27.     extrn    put_crt_chr:far
  28.     extrn    $put_crt_chr:near
  29.     extrn    to_upper:far
  30.     extrn    one_beep:far
  31.  
  32.     extrn    lib_info:byte
  33.     extrn    bar_text_color:byte
  34.     extrn    bar_select_color:byte
  35.     extrn    bar_hotkey_color:byte
  36.     extrn    submenu_text_color:byte
  37.     extrn    submenu_select_color:byte
  38.     extrn    msg_text_color:byte
  39.     extrn    msg_hyper_color:byte
  40.     extrn    pick_color:byte
  41.     extrn    pick_select_color:byte
  42.             
  43.     INCLUDE    MAC.INC
  44.     INCLUDE    COMMON.INC
  45. ;----------------------------------------------------------------------------
  46. ;------------------------------ data section --------------------------------
  47. ;----------------------------------------------------------------------------
  48. top_data_line    equ    4
  49. last_data_line    equ    top_data_line+19
  50.  
  51. ;-----------
  52. work_area    struc
  53. default_ptr    dw    ?    ;ptr to default setup block
  54. header_count    db    ?    ;number of headers in block
  55. cursor_page_ptr    dw    ?    ;pointer into summary_table
  56. cursor_line_ptr    dw    ?    ;pointer into page_detail
  57. cursor_line    db    ?    ;display line
  58.  
  59. ;--- summary_table ---  table end has headerx_ptr set to zero
  60.  
  61. header1_ptr    dw    ?
  62. h1_line1_ptr    dw    ?
  63. header1_entries    dw    ?
  64. header2_ptr    dw    ?
  65. h2_line1_ptr    dw    ?
  66. header2_entries    dw    ?
  67. header3_ptr    dw    ?
  68. h3_line1_ptr    dw    ?
  69. header3_entries    dw    ?
  70. header4_ptr    dw    ?
  71. h4_line1_ptr    dw    ?
  72. header4_entries    dw    ?
  73. header5_ptr    dw    ?
  74. h5_line1_ptr    dw    ?
  75. header5_entries    dw    ?
  76. header6_ptr    dw    ?
  77. h6_line1_ptr    dw    ?
  78. header6_entries    dw    ?
  79. header7_ptr    dw    ?
  80. h7_line1_ptr    dw    ?
  81. header7_entries    dw    ?
  82.  
  83. ;--- page_detail (lines)  --- table end has linexx_ptr set to zero
  84.  
  85. line01_ptr    dw    ?
  86. line02_ptr    dw    ?
  87. line03_ptr    dw    ?
  88. line04_ptr    dw    ?
  89. line05_ptr    dw    ?
  90. line06_ptr    dw    ?
  91. line07_ptr    dw    ?
  92. line08_ptr    dw    ?
  93. line09_ptr    dw    ?
  94. line10_ptr    dw    ?
  95. line11_ptr    dw    ?
  96. line12_ptr    dw    ?
  97. line13_ptr    dw    ?
  98. line14_ptr    dw    ?
  99. line15_ptr    dw    ?
  100. line16_ptr    dw    ?
  101. line17_ptr    dw    ?
  102. line18_ptr    dw    ?
  103. line19_ptr    dw    ?
  104. line20_ptr    dw    ?
  105. line21_ptr    dw    ?
  106. line22_ptr    dw    ?
  107.  
  108. ;--- line detail
  109.  
  110. cursor_column    db    ?    ;display column
  111. ld_type        db    ?    ;1=bool 2=hex 3=decimal 4=color 5=string
  112. ld_len        db    ?    ;1=byte 2=word 4=dword n=string len
  113. ld_minimum    dd    ?    ;minimum setting
  114. ld_max        dd    ?    ;maximum setting
  115. ld_default_ptr    dw    ?    ;ptr to default/current setting
  116. ld_descrip_ptr    dw    ?    ;ptr to descriptive text
  117. ld_str_len    db    ?    ;length of get_string buffer & edit field
  118. temp_string    db    80 dup (?)
  119.  
  120. ;--- working_setup
  121.  
  122. working_setup    db    ?
  123.  
  124. ;--- default_setup
  125.  
  126. work_area    ends
  127. ;----------------------------------------
  128. callers_setup_block_off    dw    0
  129. callers_setup_block_seg    dw    0
  130. setup_block_len        dw    0
  131.  
  132. allocated_mem_seg    dw    0
  133.  
  134. end_string    db    '<<end>>',0
  135. setup_filename    db    13 dup (0)
  136. file_found    db    0        ;0=file not found  1=file found
  137.  
  138. off_string    db    'OFF',0
  139. on_string    db    'ON ',0
  140.  
  141. comment 
  142. ;- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -(  CONFIG )
  143. GET_SETUP - read setup file from disk
  144. ;
  145. ; inputs: ds:si = pointer to default setup block
  146. ;
  147. ; ouptut:  AL = 0 (setup block is ok, input block updated if file found)
  148. ;               1 (setup block is bad)
  149. ;          AH = 0 (setup file was not found, so it was created using defaults)
  150. ;               1 (setup file read from disk)
  151. ;
  152. ; processing: 0. allocate memory and copy default setup information.
  153. ;             1. build setup file name using executable plus ".CFG"
  154. ;             2. look for existing setup file & use if found
  155. ;             3. if setup not found write defaults to disk
  156. ;             4. parse setup block and build summary_table
  157. ;             5. feed color information to library
  158. ;
  159. ; notes:  GET_SETUP establishes the setup data block for program and
  160. ;         library code.  Each variable in the setup block is placed under
  161. ;         a header and is described by a structure.  The header format
  162. ;         is "<<header text>>" followed by a zero character.  Up to
  163. ;         six headers can be definded.  The variable data is described
  164. ;         by a structure with the following format:
  165. ;
  166. ;           struc  variable
  167. ;             db    ?    ;data type 1=boolian,2=hex,3=decimal,4=color,5=string
  168. ;             db    ?   ;data length 1=byte,2=word,4=dword, or n for string len
  169. ;             xx    ?   ;minimum value,used for data types 1,2,3,4 (see note1)
  170. ;             xx    ?   ;maximum value,used for data types 1,2,3,4 (see note1)
  171. ;             xx    ?   ;default setting, all data types, strings end with zero
  172. ;             db    ?   ;description of this variable (string) ending with zero
  173. ;
  174. ;             note1 - the length of minimum value and maximum value fields
  175. ;                     depends upon the data types and data length.  It will
  176. ;                     be a byte for all types except 2 & 3.  For 2&3 the
  177. ;                     length will track the length field setting.
  178. ;
  179. ;         The setup block must have color descriptions in the first block
  180. ;         and these color descripitions must be in the order needed by
  181. ;         library functions.  A typical setup block consisting of two sections
  182. ;         would look like this:
  183. ;
  184. ;         setup_block    label    byte
  185. ;              db    "<<color settings>>",0
  186. ;              db    4,1,0,0ff,1bh,"menu bar text color",0
  187. ;              db       4,1,0,0ff,2bh,"menu bar select color",0
  188. ;                         .
  189. ;                         .
  190. ;              db       "<<setup block 2>>",0
  191. ;              db       1,1,0,1,0,"turn sound on",0              ;yes/no setup
  192. ;              db       2,1,0,0ff,0,"enter hex value",0          ;hex byte
  193. ;              db       3, 0,0, 8,0, 4,0, 'enter decimal word",0 ;decimal word
  194. ;              db       5,15,0,0,"default string",0,"enter string",0
  195. ;                         .
  196. ;              db       "<<end>>"
  197. ;
  198. ;              note2 - The length of strings include the zero byte at end.
  199. ;              note3 - For correct order and wording of color setup entries
  200. ;                      see sample file EDREC.ASM and EDREC.CFG.
  201. ;
  202. ;           
  203. ;* * * * * * * * * * * * * *
  204. 
  205.     public    GET_SETUP
  206. GET_SETUP    proc    far
  207.     apush    bx,cx,dx,si,di,bp,ds,es
  208.     mov    cs:callers_setup_block_off,si
  209.     mov    cs:callers_setup_block_seg,ds
  210.     mov    cs:file_found,0
  211. ;
  212. ; scan input block to find length
  213. ;
  214.     call    find_block_end
  215.         
  216.     jc    gss_err1            ;jmp if <<end>> not found
  217. ;
  218. ; compute amount of memory needed
  219. ;
  220.     sub    di,cs:callers_setup_block_off    ;compute length of
  221.     add    di,7                ; setup block
  222.     mov    cs:setup_block_len,di        ;save length
  223.  
  224.     shl    di,1                ;double it
  225.     add    di,offset working_setup        ;include table area
  226. ;
  227. ; allocate memory
  228. ;
  229.     mov    ax,di
  230.     mov    dx,0
  231.     call    dos_mem_allocate
  232.     jnc    gss_1            ;jmp if memory allocated in -es-
  233.     mov    al,1
  234.     jmp    gss_exit
  235. ;
  236. ; compute pointer to default setup block area
  237. ;
  238. gss_1:    mov    di,offset working_setup
  239.     add    di,cs:setup_block_len
  240.     mov    es:default_ptr,di        ;save in allocated mem
  241. ;
  242. ; copy callers setup block into allocated memory (defaults)
  243. ;
  244.     cld
  245.     mov    cs:allocated_mem_seg,es
  246.     lds    si,dword ptr cs:callers_setup_block_off
  247.     mov    cx,cs:setup_block_len
  248.     rep    movsb
  249. ;
  250. ; copy callers setup block into allocated memory (working)
  251. ;
  252.     mov    si,cs:callers_setup_block_off
  253.     mov    cx,cs:setup_block_len
  254.     mov    di,offset working_setup
  255.     rep    movsb
  256. ;
  257. ; build name of setup file on disk
  258. ;
  259.     push    cs
  260.     pop    ds
  261.     call    build_filename
  262. ;
  263. ; read setup file into memory, first open file
  264. ;
  265.     mov    dx,offset setup_filename
  266.     mov    ax,3d00h
  267.     int    21h            ;open file
  268.     jc    gss_fcreate        ;jmp if file not found
  269.     push    ax            ;save file handle
  270. ;
  271. ; read the setup file into allocated memory
  272. ;
  273.           pop    bx            ;get file handle
  274.     mov    dx,offset working_setup    ;buffer offset
  275.     push    es            ;set ds:dx
  276.     pop    ds            ;  to point at buffer
  277.     mov    cx,cs:setup_block_len
  278.     mov    ah,3fh            ;read 
  279.     int    21h            ;read into buffer
  280.     jc    gss_fcreate        ; if bad read go to create
  281.     mov    cs:file_found,1
  282.     jmp    gss_parse        ; jmp if good read
  283. ;
  284. ; if bad read, try to write setup block to memory
  285. ;
  286. gss_fcreate:
  287.     push    cs
  288.     pop    ds
  289.     mov    dx,offset setup_filename
  290.     mov    cx,0            ;file attributes
  291.     mov    ah,3ch
  292.     int    21h
  293.     jc    gss_err1        ;jmp if error
  294. ;
  295. ; write data to file
  296. ;
  297.     lds    dx,dword ptr cs:callers_setup_block_off
  298.     mov    bx,ax            ;move file handle to -bx-
  299.     mov    cx,cs:setup_block_len
  300.     mov    ah,40h
  301.     int    21h
  302. ;
  303. ; parse setup block and build summary_table
  304. ;
  305. gss_parse:
  306.     mov    ah,3eh
  307.     int    21h            ;close file    
  308.     call    summary_parse        ;parse file & build summary_table
  309.     jc    gss_err1        ; jmp if parse error
  310. ;
  311. ; feed color information into library
  312. ;
  313.     call    feed_colors
  314. ;
  315. ; move working setup block to callers area
  316. ;
  317.     call    working_to_caller    
  318.     mov    al,0            ;successful parse
  319.     jmp    gss_exit
  320.     
  321. gss_err1:
  322.     mov    al,1
  323. gss_exit:
  324.     mov    ah,cs:file_found    ;get file or memory defaults used flag
  325.     apop    es,ds,bp,di,si,dx,cx,bx
  326.     retf
  327. GET_SETUP    endp
  328.  
  329. comment 
  330. ;- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -(  CONFIG )
  331. CHANGE_SETUP - modify setup data in memory
  332. ;
  333. ; inputs:  none
  334. ; ouptut:  none
  335. ; processing: 1. displaly setup block and accept user changes.
  336. ;             2. write setup block to disk only if user requests it.
  337. ;
  338. ; Notes:  The input to this routine are the setup block which
  339. ;         has been processed by GET_SETUP.  CHANGE_SETUP can
  340. ;         not be called until GET_SETUP has set up the data it needs.
  341. ;
  342. ;* * * * * * * * * * * * * *
  343. 
  344.     PUBLIC    CHANGE_SETUP
  345. CHANGE_SETUP       proc    far
  346.     apush    ax,bx,cx,dx,si,di,bp,ds,es
  347. ;
  348. ; initialize variables
  349. ;
  350. cs_1:    mov    ax,cs:allocated_mem_seg
  351.     mov    ds,ax
  352.     mov    es,ax
  353.     mov    ds:cursor_page_ptr,offset header1_ptr    ;summary_table ptr
  354. cs_2:    mov    ds:cursor_line_ptr,offset line01_ptr    ;detail_table ptr
  355.     mov    ds:cursor_line,top_data_line
  356. ;
  357. ; build page details
  358. ;
  359.     call    build_page_detail
  360. ;
  361. ; clear the screen
  362. ;
  363.     mov    ah,cs:submenu_text_color
  364.     mov    al,' '
  365.     call    clear_screen
  366. ;
  367. ; display header
  368. ;
  369.     mov    si,ds:cursor_page_ptr
  370.     mov    si,word ptr ds:[si]        ;get header ptr
  371.     
  372.     mov    ax,ds:line01_ptr        ;center
  373.     sub    ax,si                ;  the header
  374.     mov    dx,80                ;
  375.     sub    dx,ax
  376.     shr    dx,1                ;dx now has starting column
  377.     
  378.     mov    dh,2                ;display row
  379.     mov    ah,cs:submenu_select_color
  380.     call    display_string
  381. ;
  382. ; setup to display lines
  383. ;
  384.     mov    si,offset line01_ptr
  385. ;
  386. ; display all lines
  387. ;
  388. cs_lpp:    call    display_line
  389.     add    ds:cursor_line,1        ;move to next display column
  390.     add    ds:cursor_line_ptr,2        ;move to next line
  391.     add    si,2
  392.     cmp    word ptr ds:[si],0        ;check if done
  393.     jne    cs_lpp                ; loop till done
  394.          mov    ds:cursor_line_ptr,offset line01_ptr    ;detail_table ptr
  395.     mov    ds:cursor_line,top_data_line
  396.  
  397. ;
  398. ; get keyboard inputs from user
  399. ;
  400. cs_5:    call    grab_keyboard_inputs
  401. ;
  402. ; decode user request, carry =abort key  else ax=process to perform
  403. ;
  404.     jc    cs_abortx            ;jmp if abort request
  405.     jmp    ax
  406. ;
  407. config_restore:
  408.     mov    si,ds:default_ptr
  409.     mov    di,offset working_setup
  410.     mov    cx,cs:setup_block_len
  411.     rep    movsb
  412.     jmp    cs_1
  413.     
  414. config_save:
  415.     mov    si,offset working_setup
  416.     call    write_setup
  417.     jmp    cs_5
  418.     
  419. config_next:
  420.     mov    si,ds:cursor_page_ptr
  421.     add    si,6                    ;move to next page
  422.     cmp    word ptr ds:[si],0
  423.     jne    cn_ok                    ;jmp if next page avail
  424.     mov    si,offset header1_ptr            ;move to top
  425. cn_ok:    mov    ds:cursor_page_ptr,si
  426.     jmp    cs_2
  427.         
  428. config_help:
  429.     mov    ah,cs:msg_text_color
  430.     mov    al,0                ;seperator
  431.     mov    cx,1                ;record#
  432.     mov    bx,1048h            ;box size
  433.     mov    dx,0404h            ;box location
  434.     mov    si,offset config_help_msg
  435.     mov    bp,msg_save_win+msg_restore_win+msg_anykey+msg_ram+msg_disp
  436.     call    message
  437.     jmp    cs_5
  438.  
  439. config_help_msg label    byte
  440.  db 'The NEXT-PAGE menu selection can be used to view each page '
  441.  db 'of configuration information.  Changes can be made within '
  442.  db 'a page by selecting the correct field using arrow keys, then '
  443.  db 'entering the information.',0
  444.  
  445. config_exit:
  446.     call    feed_colors
  447.     call    working_to_caller            ;give caller changes
  448. cs_abortx:    
  449.     apop    es,ds,bp,di,si,dx,cx,bx,ax
  450.     retf
  451. CHANGE_SETUP       endp
  452. comment 
  453. ;- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -(  CONFIG )
  454. ;WRITE_SETUP - write setup to disk
  455. ;
  456. ; inputs:   ds:si = setup block ptr
  457. ;           cx = setup block length
  458. ;
  459. ; ouptut:   no carry = success
  460. ;           carry = problem creating the file
  461. ;             register changed are:  bx,dx
  462. ;             
  463. ;* * * * * * * * * * * * * *
  464. 
  465. callers_setup_blk_off    dw    0
  466. callers_setup_blk_seg    dw    0
  467.  
  468.     PUBLIC    WRITE_SETUP
  469. WRITE_SETUP      proc      far
  470.     apush    ax,cx,si,di,ds,es
  471.     mov    cs:callers_setup_blk_off,si
  472.     mov    cs:callers_setup_blk_seg,ds
  473. ;
  474. ; search for <<end>> string
  475. ;
  476.     les    di,dword ptr cs:callers_setup_blk_off
  477.     push    cs
  478.     pop    ds
  479.     mov    si,offset end_string
  480.     mov    cx,2000
  481.     call    buffer_searchc
  482.     jc    wss_exit            ;jmp if <<end>> not found
  483. ;
  484. ; compute length of setup block
  485. ;    
  486.     sub    di,cs:callers_setup_blk_off
  487.     add    di,7
  488.     mov    cs:setup_block_len,di
  489. ;
  490. ; build name of setup file on disk
  491. ;
  492.     push    cs
  493.     pop    ds
  494.     call    build_filename
  495. ;
  496. ; create the file
  497. ;
  498.     mov    dx,offset setup_filename
  499.     mov    cx,0            ;file attributes
  500.     mov    ah,3ch
  501.     int    21h
  502.     jc    wss_exit        ;jmp if error
  503. ;
  504. ; write data to file
  505. ;
  506.     mov    bx,ax            ;move file handle to -bx-
  507.     lds    dx,dword ptr cs:callers_setup_blk_off
  508.     mov    cx,cs:setup_block_len
  509.     mov    ah,40h
  510.     int    21h
  511. ;
  512. ; close the write file
  513. ;
  514.     mov    ah,3eh
  515.     int    21h            ;close file    
  516. wss_exit:
  517.     apop    es,ds,di,si,cx,ax
  518.     retf
  519. write_setup      endp
  520. comment 
  521. ;- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -(  CONFIG )
  522. SET_LIB_COLORS - set colors to be used by the library
  523. ;
  524. ; inputs:  al = color attributes
  525. ;          bx = color number (position in table)
  526. ;
  527. ;            options available are:           defaults:
  528. ;              0 = menu bar text color          07h
  529. ;              1 = menu bar select color        70h
  530. ;              2 = menu bar hotkey color        0Fh         (1)
  531. ;              3 = submenu box color            0Fh
  532. ;              4 = submenu selection color
  533. ;              5 = msg text color
  534. ;              6 = msg_hyper_color
  535. ;              7 = pick color
  536. ;              8 = pick selection color
  537. ;
  538. ; outputs: none
  539. ;* * * * * * * * * * * * * *
  540. 
  541.     PUBLIC    SET_LIB_COLORS
  542. SET_LIB_COLORS    PROC    FAR
  543.     APUSH   AX,BX
  544.     cmp     bx,8
  545.     ja      slc_exit            ;jmp if out of range
  546.     add        bx,offset bar_text_color
  547.     mov     byte ptr cs:[bx],al        ;store new color
  548. slc_exit:
  549.     apop    bx,ax
  550.     retf
  551. SET_LIB_COLORS    ENDP
  552. ;---------------------------------------------------------------------------
  553. ; setup common subroutines
  554. ;---------------------------------------------------------------------------
  555. ; summary_parse - parse input block & build summary_table
  556. ;
  557. ;  inputs:  allocated_mem_seg:working_setup has input block
  558. ;           setup_block_len = block lenght
  559. ;
  560. ;  output:  if no carry - allocated_mem_seg:header1_ptr (summary_table) is built
  561. ;                       - header_count is initialized
  562. ;           if carry - parse error
  563. ;
  564. summary_parse:
  565.     mov    ax,cs:allocated_mem_seg
  566.     mov    ds,ax
  567.     mov    es,ax
  568.     mov    ds:header_count,0
  569.  
  570.     mov    si,offset working_setup
  571.     mov    di,offset header1_ptr
  572. ;
  573. ; ds:si = block  es:di=summary table ptr
  574. ;
  575. sp_loop:
  576.     cmp    byte ptr ds:[si],'<'
  577.     je    sp_1            ;jmp if header start
  578.     inc    si
  579.     jmp    sp_loop
  580.  
  581. sp_1:    cmp    word ptr ds:[si],'<<'
  582.     jne    sp_err            ;jmp if parse error
  583.     cmp    word ptr ds:[si+2],'ne'
  584.     jne    sp_2            ;jmp if not "<<end>>"
  585.     cmp    word ptr ds:[si+4],'>d'
  586.     je    sp_end            ;jmp if end of parse
  587. ;
  588. ; look for end of header
  589. ;
  590. sp_2:    mov    ax,si
  591.     stosw                ;store     header_ptr into summary
  592.     inc    ds:header_count        ;bump header count
  593. sp_3:    lodsb
  594.     cmp    al,'>'
  595.     jne    sp_3            ;loop till end of header
  596.     lodsb
  597.     cmp    al,'>'
  598.     jne    sp_err            ;jmp if no ">>" at end
  599.     lodsb
  600.     cmp    al,0
  601.     jne    sp_err            ;jmp if no zero at end
  602.     mov    ax,si
  603.     stosw                ;store ptr to first line under header
  604.     mov    cx,0            ;set count =0
  605. sp_4:    call    parse_line
  606.     jc    sp_err            ;jmp if line bad
  607.     cmp    al,0
  608.     jne    sp_5            ;jmp if no more lines
  609.     inc    cx
  610.     jmp    sp_4            ;loop till all lines counted
  611. sp_5:    mov    ax,cx
  612.     stosw                ;store line count
  613.     jmp    sp_loop    
  614.     
  615. sp_end:    mov    word ptr es:[di],0    ;termainate parse table
  616.     clc
  617.     jmp    sp_exit
  618. sp_err:    stc
  619. sp_exit:ret
  620. ;---------------------------------------------------------------------------
  621. ; parse_line - parse one input block data item
  622. ;
  623. ;  inputs:  ds:si = pointer to start of data item
  624. ;
  625. ;  output:  if no carry - al = 0 found good line
  626. ;                         al = 1 found start of next header
  627. ;                       - si = pointer to next line or header
  628. ;                       - bx = pointer to max value
  629. ;                       - dx = pointer to default data
  630. ;                       - bp = pointer to descriptive string
  631. ;
  632. ;           if carry - parse error
  633. ;
  634. parse_line:
  635.     apush    cx,di
  636.           cmp    word ptr ds:[si],'<<'
  637.     je    pl_header        ;jmp if header next
  638.     lodsb                ;get data type
  639.     cmp    al,5
  640.     je    pl_string        ;jmp if string data
  641.     lodsb                ;get data length
  642.     cmp    al,1
  643.     je    pl_byte            ;jm if byte data
  644.     cmp    al,2
  645.     je    pl_word            ;jmp if word data
  646.     cmp    al,4
  647.     jne    pl_err            ;jmp if unknown data type
  648. ;
  649. ; a dword data type was found
  650. ;
  651.     add    si,4            ;move to maximum value
  652.     mov    bx,si            ;save ptr to max
  653.     add    si,4
  654.     mov    dx,si            ;save ptr to default value
  655.     add    si,4
  656.     mov    bp,si            ;save ptr to descriptive string
  657.     jmp    pl_skip_string
  658. ;
  659. ; a byte data type was found
  660. ;
  661. pl_byte:
  662.     add    si,1            ;move to maximum value
  663.     mov    bx,si            ;save ptr to max
  664.     add    si,1
  665.     mov    dx,si            ;save ptr to default value
  666.     add    si,1
  667.     mov    bp,si            ;save ptr to descriptive string
  668.     jmp    pl_skip_string
  669. ;
  670. ; a word data type was found
  671. ;
  672. pl_word:
  673.     add    si,2            ;move to maximum value
  674.     mov    bx,si            ;save ptr to max
  675.     add    si,2
  676.     mov    dx,si            ;save ptr to default value
  677.     add    si,2
  678.     mov    bp,si            ;save ptr to descriptive string
  679.     jmp    pl_skip_string
  680. ;
  681. ; a string data type was found
  682. ;
  683. pl_string:
  684.     lodsb                ;get string length
  685.     sub    cx,cx
  686.     mov    cl,al            ;al = string length
  687.     
  688.     add    si,1            ;move to maximum value
  689.     mov    bx,si            ;save ptr to max
  690.     add    si,1
  691.     mov    dx,si            ;save ptr to default value
  692. pl_string1:
  693.     lodsb
  694.     loop    pl_string1        ;loop to end of string
  695.     cmp    al,0            ;check if expected zero at end
  696.     jne    pl_err    
  697.     mov    bp,si            ;save ptr to descriptive string
  698. ;
  699. ; skip to end of descriptive string by looking for zero at end
  700. ;
  701. pl_skip_string:
  702.     lodsb
  703.     cmp    al,0
  704.     jne    pl_skip_string
  705.     
  706. pl_done:mov    al,0
  707.     jmp    pl_exit1
  708.     
  709. pl_err:    stc
  710.     jmp    pl_exit        
  711.     
  712. pl_header:
  713.     mov    al,1
  714. pl_exit1:    
  715.     clc
  716. pl_exit:apop    di,cx
  717.     ret    
  718. ;---------------------------------------------------------------------------
  719. ; build_line_detail - expand line information for grab_keyboard_input
  720. ;
  721. build_line_detail:
  722.     mov    ds,cs:allocated_mem_seg
  723.     mov    si,ds:cursor_line_ptr
  724.     mov    si,word ptr ds:[si]        ;get line ptr
  725.     
  726.     mov    al,byte ptr ds:[si]        ;get data type
  727.     mov    ds:ld_type,al
  728.  
  729.     mov    al,byte ptr ds:[si+1]        ;get data len
  730.     mov    ds:ld_len,al
  731.  
  732.     mov    ax,word ptr ds:[si+2]        ;get data min
  733.     mov    word ptr ds:ld_minimum,ax
  734.     mov    ax,word ptr ds:[si+4]
  735.     mov    word ptr ds:ld_minimum+2,ax
  736.  
  737.     call    parse_line
  738.  
  739.     mov    ax,word ptr ds:[bx]        ;get max data
  740.     mov    word ptr ds:ld_max,ax
  741.     mov    ax,word ptr ds:[bx+2]
  742.     mov    word ptr ds:ld_max+2,ax
  743.  
  744.     mov    ds:ld_default_ptr,dx        ;save default data ptr
  745.     mov    ds:ld_descrip_ptr,bp
  746.     mov    ds:cursor_column,1
  747.     ret
  748. ;----------------------------------------------------------------------------
  749. ; fill_temp_string - fill in temp string
  750. ;  inputs:  line_detail
  751. ;  output:  
  752. ;
  753. fill_temp_string:
  754.     apush    si,di
  755.     mov    al,ds:ld_type             ;get data type
  756.     cmp    al,5
  757.     je    fts_string        ;jmp if data_type = string
  758.     cmp    al,4
  759.     je    fts_color        ;jmp if data_type = color
  760.     cmp    al,1
  761.     je    fts_boolean        ;jmp if yes/no flag
  762.     cmp    al,2
  763.     jne    fts_1            ;jmp if not hex
  764.     mov    al,byte ptr ds:ld_len    ;get length
  765.     cmp    al,1
  766.     je    fts_hex_byte
  767.     cmp    al,2
  768.     je    fts_hex_word
  769. ;    cmp    al,4
  770.     jmp    fts_hex_dword
  771. fts_1:    mov    al,byte ptr ds:ld_len    ;get length
  772.     cmp    al,1
  773.     je    fts_dec_byte
  774.     cmp    al,2
  775.     je    fts_dec_word
  776. ;    cmp    al,4
  777.     jmp    fts_dec_dword
  778.     
  779. fts_string:
  780.     mov    si,ds:ld_default_ptr
  781.     mov    di,offset temp_string
  782.     push    ds
  783.     pop    es
  784.     call    str_copy
  785.     mov    ds:ld_str_len,cl        ;save string length
  786.     jmp    fts_exit
  787.     
  788. fts_color:
  789.     mov    si,ds:ld_default_ptr
  790.     mov    al,byte ptr ds:[si]        ;get color
  791.     mov    ah,0
  792.     mov    word ptr ds:temp_string,ax
  793.     mov    ds:ld_str_len,1
  794.     jmp    fts_exit
  795.     
  796. fts_boolean:
  797.     mov    si,ds:ld_default_ptr
  798.     cmp    byte ptr ds:[si],0        ;check if "off"
  799.     mov    si,offset off_string
  800.     je    fts_b2
  801.     mov    si,offset on_string
  802. fts_b2:    push    cs
  803.     pop    ds
  804.     mov    es,cs:allocated_mem_seg
  805.     mov    di,offset temp_string
  806.     call    str_copy
  807.     mov    ds,cs:allocated_mem_seg
  808.     mov    ds:ld_str_len,cl        ;save string length
  809.     jmp    fts_exit
  810.     
  811. fts_hex_byte:
  812.     mov    si,ds:ld_default_ptr
  813.     mov    al,byte ptr ds:[si]    ;get hex byte
  814.     mov    si,offset temp_string
  815.     call    BYTE_TO_HEX_STR
  816.     mov    byte ptr ds:[si],0    ;terminate string
  817.     mov    ds:ld_str_len,2
  818.     jmp    fts_exit
  819.         
  820. fts_hex_word:
  821.     mov    si,ds:ld_default_ptr
  822.     mov    ax,word ptr ds:[si]    ;get hex word
  823.     mov    si,offset temp_string
  824.     call    WORD_TO_HEX_STR
  825.     mov    byte ptr ds:[si],0    ;terminate string
  826.     mov    ds:ld_str_len,4
  827.     jmp    fts_exit
  828.     
  829. fts_hex_dword:
  830.     mov    si,ds:ld_default_ptr
  831.     mov    ax,word ptr ds:[si]    ;get hex word
  832.     mov    dx,word ptr ds:[si+2]    ;get hex dword
  833.     mov    si,offset temp_string
  834.     call    DWORD_TO_HEX_STR
  835.     mov    byte ptr ds:[si],0    ;terminate string
  836.     mov    ds:ld_str_len,8
  837.     jmp    fts_exit
  838.     
  839. fts_dec_byte:
  840.     mov    si,ds:ld_default_ptr
  841.     mov    al,byte ptr ds:[si]    ;get dec byte
  842.     mov    ah,0
  843.     mov    dx,0
  844.     mov    si,offset temp_string
  845.     call    DWORD_TO_DEC_STR
  846.     mov    ds:ld_str_len,3
  847.     jmp    fts_scan
  848.  
  849. fts_dec_word:
  850.     mov    si,ds:ld_default_ptr
  851.     mov    ax,word ptr ds:[si]    ;get dec word
  852.     mov    dx,0
  853.     mov    si,offset temp_string
  854.     call    DWORD_TO_DEC_STR
  855.     mov    ds:ld_str_len,5
  856.     jmp    fts_scan
  857.  
  858. fts_dec_dword:
  859.     mov    si,ds:ld_default_ptr
  860.     mov    ax,word ptr ds:[si]    ;get dec word
  861.     mov    dx,word ptr ds:[si+2]
  862.     mov    si,offset temp_string
  863.     call    DWORD_TO_DEC_STR
  864.     mov    ds:ld_str_len,10
  865. fts_scan:
  866.     call    str_cleanl
  867. fts_exit:
  868.     apop    di,si
  869.     ret    
  870.  
  871. ;---------------------------------------------------------------------------
  872. ; store_temp_string - move data from temp string to to working_setup
  873. ;  inputs:  none
  874. ;  outputs: carry set if conversion error
  875. ;
  876. store_temp_string:
  877.     apush    ax,cx,dx
  878.     mov    ax,cs:allocated_mem_seg
  879.     mov    ds,ax
  880.     mov    es,ax
  881.     
  882.     mov    di,ds:ld_default_ptr
  883.     mov    al,ds:ld_type             ;get data type
  884.     cmp    al,5
  885.     je    sts_string        ;jmp if data_type = string
  886.     cmp    al,4
  887.     je    sts_color        ;jmp if data_type = color
  888.     cmp    al,1
  889.     je    sts_boolean        ;jmp if yes/no flag
  890.     cmp    al,2
  891.     jne    sts_1            ;jmp if not hex
  892.     mov    al,byte ptr ds:ld_len    ;get length
  893.     cmp    al,1
  894.     je    sts_hex_byte
  895.     cmp    al,2
  896.     je    sts_hex_word
  897. ;    cmp    al,4
  898.     jmp    sts_hex_dword
  899. sts_1:    mov    al,byte ptr ds:ld_len
  900.     cmp    al,1
  901.     je    sts_dec_byte
  902.     cmp    al,2
  903.     je    sts_dec_word
  904. ;    cmp    al,4
  905.     jmp    sts_dec_dword
  906.     
  907. sts_string:
  908.     mov    si,offset temp_string
  909.     call    str_copy
  910.     jmp    sts_done
  911.     
  912. sts_color:
  913.     mov    al,byte ptr ds:temp_string    ;get color
  914.     mov    byte ptr ds:[di],al        ;store color
  915.     jmp    sts_done
  916.     
  917. sts_boolean:
  918.     mov    al,ds:temp_string
  919.     cmp    al,'o'
  920.     je    sts_bool1            ;jmp if ok
  921.     cmp    al,'O'
  922.     jne    sts_err                ;jmp if bad
  923. sts_bool1:
  924.     mov    al,ds:temp_string+1
  925.     cmp    al,'n'
  926.     je    sts_on                ;jmp if 'on' found
  927.     cmp    al,'N'
  928.     je    sts_on                ;jmp if 'ON' found
  929.     cmp    al,'f'
  930.     je    sts_off                ;jmp if 'of' found
  931.     cmp    al,'F'                
  932.     jne    sts_err                ;jmp if bad
  933. sts_off:
  934.     mov    al,ds:temp_string+2
  935.         cmp     al,'f'
  936.         je      sts_off1                        ;jmp if "off"
  937.         cmp     al,'F'
  938.     jne    sts_err
  939. sts_off1:
  940.     mov    byte ptr ds:[di],0        ;set off
  941.     jmp    sts_done
  942. sts_on: mov    al,ds:temp_string+2
  943.         cmp     al,' '
  944.         je      sts_on1                         ;jmp if 'on'
  945.     cmp    al,0
  946.     jne    sts_err
  947. sts_on1:mov    byte ptr ds:[di],1
  948.     jmp    sts_done    
  949.     
  950. sts_hex_byte:
  951.     mov    si,offset temp_string
  952.     call    HEX_STR_TO_BYTE
  953.     jc    sts_err
  954.     cmp    al,byte ptr ds:ld_minimum
  955.     jb    sts_err
  956.     cmp    al,byte ptr ds:ld_max
  957.     ja    sts_err
  958.     mov    byte ptr ds:[di],al
  959.     jmp    sts_done
  960.         
  961. sts_hex_word:
  962.     mov    si,offset temp_string
  963.     call    HEX_STR_TO_WORD
  964.     jc    sts_err
  965.     cmp    ax,word ptr ds:ld_minimum
  966.     jb    sts_err
  967.     cmp    ax,word ptr ds:ld_max
  968.     ja    sts_err
  969.     mov    word ptr ds:[di],ax
  970.     jmp    sts_done
  971.     
  972. sts_hex_dword:
  973.     mov    si,offset temp_string
  974.     call    HEX_STR_TO_WORD
  975.     xchg    ax,dx
  976.     add    si,4
  977.     call    HEX_STR_TO_WORD
  978.     jc    sts_err
  979. ; skip min & max checks for dwords    
  980.     mov    word ptr ds:[di],ax
  981.     mov    word ptr ds:[di+2],dx
  982.     jmp    sts_done
  983.     
  984. sts_dec_byte:
  985.     mov    si,offset temp_string
  986.     call    DEC_STR_TO_WORD
  987.     jc    sts_err
  988.     cmp    al,byte ptr ds:ld_minimum
  989.     jb    sts_err
  990.     cmp    al,byte ptr ds:ld_max
  991.     ja    sts_err
  992.     mov    byte ptr ds:[di],al
  993.     jmp    sts_done
  994.  
  995. sts_dec_word:
  996.     mov    si,offset temp_string
  997.     call    DEC_STR_TO_WORD
  998.     jc    sts_err
  999.     cmp    ax,word ptr ds:ld_minimum
  1000.     jb    sts_err
  1001.     cmp    ax,word ptr ds:ld_max
  1002.     ja    sts_err
  1003.     mov    word ptr ds:[di],ax
  1004.     jmp    sts_done
  1005.  
  1006. sts_dec_dword:
  1007.     mov    si,offset temp_string
  1008.     call    DEC_STR_TO_DWORD
  1009.     jc    sts_err
  1010.     cmp    dx,word ptr ds:ld_minimum+2
  1011.     jb    sts_err
  1012.     jne    sts_dec1            ;jmp if check done
  1013.     cmp    ax,word ptr ds:ld_minimum
  1014.     jb    sts_err
  1015. sts_dec1:
  1016.     cmp    dx,word ptr ds:ld_max+2
  1017.     ja    sts_err
  1018.     jne    sts_dec2            ;jmp if check done
  1019.     cmp    ax,word ptr ld_max
  1020.     ja    sts_err
  1021. sts_dec2:    
  1022.     mov    word ptr ds:[di],ax
  1023.     mov    word ptr ds:[di+2],dx
  1024.     
  1025. sts_done:
  1026.     clc    
  1027.     jmp    sts_exit
  1028. sts_err:
  1029.     stc    
  1030. sts_exit:
  1031.     apop    dx,cx,ax
  1032.     ret    
  1033.     
  1034. ;---------------------------------------------------------------------------
  1035. ; build_page_detail - fill in detail table
  1036. ;  inputs:  data area variables
  1037. ;  output:  detail_table
  1038. ;
  1039. build_page_detail:
  1040.     mov    ax,cs:allocated_mem_seg
  1041.     mov    ds,ax
  1042.     mov    es,ax
  1043.     mov    si,ds:cursor_page_ptr
  1044.     mov    si,word ptr ds:[si+2]        ;get ptr to first line
  1045.     mov    di,offset line01_ptr
  1046. bdt_loop:
  1047.     mov    ax,si
  1048.     stosw                    ;put data into detail_table
  1049.     call    parse_line
  1050.     cmp    al,0
  1051.     je    bdt_loop            ;loop till end
  1052.  
  1053.     sub    di,2                ;move back one and zero it
  1054.     mov    ax,0
  1055. bdt_1:    stosw                    ;put zero at end
  1056.     cmp    di,offset line22_ptr+2
  1057.     jne    bdt_1                ;loop till remainder zeroed
  1058.     ret
  1059.     
  1060. ;---------------------------------------------------------------------------
  1061. ; grab_keyboard_inputs - check for pulldown keys and decode them
  1062. ;
  1063. ;   inputs:    none (database variables used as inputs)
  1064. ;
  1065. ;   output:    no carry  ax = processing ptr (restore,save,next,help,exit)
  1066. ;                 carry     = abort
  1067. ;
  1068. grab_keyboard_inputs:
  1069.     mov    ax,cs:allocated_mem_seg
  1070.     mov    ds,ax
  1071.     mov    es,ax    
  1072.     call    build_line_detail
  1073.     call    fill_temp_string
  1074.     mov    al,ds:ld_type
  1075.     cmp    al,1
  1076.     je    string_disp
  1077.     cmp    al,4
  1078.     je    color_disp    
  1079.  
  1080. ;--------  string entry ---------
  1081. string_disp:
  1082.     mov    al,cs:pick_color
  1083.     mov    ah,cs:pick_select_color
  1084.     mov    ch,ds:ld_str_len        ;get length of input window
  1085.     mov    cl,ch                ;get length of buffer
  1086.  
  1087.     mov    dh,ds:cursor_line        ;get display row
  1088.     
  1089.     mov    dl,1                     ;get display column
  1090.     mov    di,offset temp_string
  1091.     mov    bl,gs_init
  1092.     
  1093.     call    get_string
  1094. str_1:    push    cs
  1095.     pop    es                ; es = local seg, ds=allocated
  1096.     
  1097.     call    do_pulldown            ;get input
  1098. ;
  1099. ; restore seg reg's
  1100. ;    
  1101.     mov    ds,cs:allocated_mem_seg
  1102.     push    ds
  1103.     pop    es
  1104. ;
  1105. ;  dx=location  ax=key cl=flag ch= (0-abort) (1-process) (2-up) (3=down) (4=??)
  1106. ;
  1107.     cmp    ax,0149h
  1108.     je    str_5                ;jmp if not pgdn
  1109.     cmp    ax,0151h
  1110.     jne    str_6                ;jmp if not pgup
  1111. str_5:    call    store_temp_string
  1112.     mov    ch,1
  1113.     mov    ax,offset config_next
  1114.     jmp    dp_exit1
  1115.     
  1116. str_6:    cmp    ch,4
  1117.     je    string_decode            ;jmp if unknown key
  1118.  
  1119. str_2:    mov    bl,gs_close
  1120.     call    get_string
  1121.     
  1122.     cmp    ch,0                ;check if abort
  1123.     jne    str_3                ;  jmp if not abort
  1124.     stc
  1125.     jmp    dp_exit2
  1126. ;
  1127. ; check if process(1) up arrow(2)  down arrow(3)
  1128. ;
  1129. str_3:    call    store_temp_string
  1130.     jnc    str_4                ;jmp if inputs ok
  1131.     call    one_beep
  1132.     jmp    grab_keyboard_inputs
  1133. str_4:    cmp    ch,1
  1134.     je    dp_exit1            ;jmp if ax=process request
  1135. ;
  1136. ; must be up or down arrow, check if color pointers present
  1137. ;
  1138.     cmp    ds:ld_type,4
  1139.     jne    move_cursor            ;jmp if not color
  1140.     mov    dl,ds:cursor_column        ;get display column (input area)
  1141.     mov    dh,ds:cursor_line
  1142.     dec    dl
  1143.     mov    al,' '
  1144.     call    put_crt_chr
  1145.     add    dl,2
  1146.     mov    al,' '
  1147.     call    put_crt_chr
  1148. move_cursor:
  1149.     call    display_line            ;remove highlight
  1150.     cmp    ch,2
  1151.     je    sts_up
  1152. ;
  1153. ; down arrow
  1154. ;
  1155.     add    ds:cursor_line_ptr,2
  1156.     add    ds:cursor_line,1
  1157.     jmp    grab_keyboard_inputs
  1158. ;
  1159. ; up arrow
  1160. ;
  1161. sts_up: sub    ds:cursor_line_ptr,2
  1162.     sub    ds:cursor_line,1
  1163.     jmp    grab_keyboard_inputs    
  1164. ;
  1165. ; unknown key was pressed, see if it can be added to the string        
  1166. ;    
  1167. string_decode:
  1168.     cmp    cl,3                ;check if mouse click
  1169.     jne    string_key0            ; jmp if keystroke
  1170.     jmp    str_1                   ;ignore all mouse clicks
  1171.     
  1172. string_key0:
  1173.     push    ax                ;save key
  1174.     call    KEY_PUT                ;setup key for get_string
  1175.     mov    bl,gs_key_check
  1176.     call    get_string
  1177.     cmp    cx,-1
  1178.     pop    cx                ;restore origional key
  1179.     je    str_end
  1180.     cmp    ax,0                ;check if no keys available
  1181.     je    str_lp                ; jmp if no keys unprocessed
  1182.     cmp    ax,cx                ;check if different key
  1183.     je    str_end                ;jmp if same key
  1184.     call    KEY_PUT                ;    
  1185. str_lp:    jmp    str_1                   ;let pulldown look at this key
  1186. str_end:
  1187.     mov    bl,gs_close
  1188.     call    get_string
  1189.     call    store_temp_string
  1190.     jmp    grab_keyboard_inputs
  1191. ;
  1192. ; ---------- color entry -----------
  1193. ;
  1194. color_disp:
  1195.     call    store_temp_string        ;needed if loop back from below
  1196.     mov    dh,ds:cursor_line        ;get display line
  1197.     mov    dl,ds:cursor_column        ;get display column (input area)
  1198.     mov    ah,ds:temp_string        ;get color from raw data
  1199.     mov    al,''                ;get character
  1200.     call    put_crt_chr
  1201. ;
  1202. ; put pointers around selected color
  1203. ;    
  1204.     dec    dl
  1205.     mov    al,'>'
  1206.     call    put_crt_chr
  1207.     add    dl,2
  1208.     mov    al,'<'
  1209.     call    put_crt_chr
  1210.         
  1211. cd_1:    call    do_pulldown            ;check pulldown keys
  1212. ;
  1213. ;  dx=location  ax=key cl=flag ch= (0-abort) (1-process) (2-up) (3=down) (4=??)
  1214. ;
  1215.     cmp    ch,0
  1216.     jne    cd_2                ;jmp if not abort
  1217.     stc
  1218.     jmp    dp_exit2
  1219.  
  1220. cd_2:    call    store_temp_string
  1221.     jc    cd_1                ;jmp if string bad
  1222.     cmp    ch,1
  1223.     je    dp_exit1            ;jmp process (ax) request
  1224.     cmp    ax,0149h
  1225.     jne    cd_3                ;jmp if not pgdn
  1226.     mov    ch,1
  1227.     mov    ax,offset config_next 
  1228.     jmp    dp_exit1
  1229. cd_3:    cmp    ax,0151h
  1230.     jne    cd_4                ;jmp if not pgup
  1231.     mov    ch,1
  1232.     mov    ax,offset config_next
  1233.     jmp    dp_exit1
  1234. cd_4:        
  1235.     cmp    ch,4
  1236.     je    color_decode            ;jmp if color change?
  1237. ;
  1238. ; must be up or down arrow
  1239. ;
  1240.     call    display_line            ;remove highlights
  1241.     cmp    ch,2
  1242.     je    cd_up
  1243. ;
  1244. ; down arrow
  1245. ;
  1246.     add    ds:cursor_line_ptr,2
  1247.     add    ds:cursor_line,1
  1248.     jmp    grab_keyboard_inputs
  1249. ;
  1250. ; up arrow
  1251. ;
  1252. cd_up:    sub    ds:cursor_line_ptr,2
  1253.     sub    ds:cursor_line,1
  1254.     jmp    grab_keyboard_inputs    
  1255.         
  1256. color_decode:
  1257.     cmp    cl,3                ;check if mouse click
  1258.     jne    color_key0            ; jmp if keystroke
  1259. ;
  1260. ; mouse click, check if right/left color change
  1261. ;
  1262.     cmp    dl,5
  1263.     je    color_right
  1264.     cmp    dl,7
  1265.     je    color_left
  1266.     jmp    cd_1
  1267.     
  1268. color_key0:    
  1269.     cmp    ax,014dh            ;check if right arrow
  1270.     jne    color_key1            ; jmp if not right arrow
  1271. color_right:    
  1272.     add    ds:temp_string,10h        ;bump background color
  1273.     and    ds:temp_string,7fh        ;remove high bit
  1274.     jmp    color_disp
  1275.     
  1276. color_key1:
  1277.     cmp    ax,014bh            ;check if left arrow
  1278.     jne    cd_1                  ; jmp if not left arrow (ignore)
  1279. color_left:    
  1280.     mov    al,ds:temp_string        ;get color
  1281.     mov    ah,al
  1282.     and    ah,0f0h
  1283.     inc    al
  1284.     and    al,0fh
  1285.     or    al,ah
  1286.     mov    ds:temp_string,al
  1287.     jmp    color_disp
  1288. ;
  1289. ; normal exit, ax=process (restore,save,next,help,exit)
  1290. ;
  1291. dp_exit1:
  1292.     clc
  1293. dp_exit2:
  1294.     ret
  1295. ;--------------------------------------------------------------------------
  1296. ; do_pulldown - check for pulldown keys and decode them
  1297. ;   inputs: none
  1298. ;   output: es:   = raw data segment
  1299. ;              dx = click/key location
  1300. ;              cl = pulldown decode flag
  1301. ;              ax = key if -ch- =0,1,2
  1302. ;              ch = 0(abort or exit request)
  1303. ;                   1(process request, ax=process from menu)
  1304. ;                   2(legal up key)
  1305. ;                   3(legal down key)
  1306. ;                   4(unknown key/click in ax,dx,cl
  1307. ;
  1308.  
  1309. do_pulldown:    
  1310.     push    cs
  1311.     pop    ds
  1312. ;    
  1313. ; put up the menu bar
  1314. ;
  1315.     mov    bx,offset config_menu
  1316.     mov    ah,bar_display+return_bad_key+no_mouse_sim+no_mouse_show
  1317.     call    MENU_SYSTEM
  1318.     mov    ds,cs:allocated_mem_seg
  1319.     mov    bx,ds:cursor_line_ptr        ;ptr to current line
  1320.     cmp    cl,1                ;check if process hit
  1321.     jne    dp_02                ; jmp if not process hit
  1322.     mov    ch,1
  1323.     jmp    dp_exit
  1324. dp_02:
  1325.     cmp    cl,4
  1326.     jne    dp_3
  1327.     mov    ch,0
  1328.     jmp    dp_exit                ;exit if abort key found
  1329. ;
  1330. ; an unknown key or mouse click occured, check if up/down arrow first
  1331. ;
  1332. dp_3:    cmp    cl,2                ;check if unknown keystroke
  1333.     jne    dp_08                ; jmp if mouse click
  1334.     cmp    ax,0148h            ;check if up arrow
  1335.     jne    dp_05                ; jmp if not up-arrow
  1336. ;
  1337. ; up arrow - check if we are at top of section
  1338. ;    
  1339.     cmp    bx,offset line01_ptr
  1340.     jne    dp_03                ; jmp if we can move up
  1341.     jmp    do_pulldown            ;jmp if we illegal key
  1342. dp_03:
  1343.     mov    ch,2
  1344.     jmp    dp_exit
  1345.  
  1346. dp_05:
  1347.     cmp    ax,0150h            ;check if down arrow
  1348.     jne    dp_07                ;  jmp if not down_arrow
  1349. ;
  1350. ; down arrow - check if we are at bottom already
  1351. ;    
  1352.     cmp    word ptr ds:[bx+2],0        ;check if another line
  1353.     je    do_pulldown            ; jmp if at last line
  1354.     mov    ch,3
  1355.     jmp    dp_exit
  1356. ;
  1357. ; unknown key press
  1358. ;
  1359. dp_07:    mov    ch,4
  1360.     jmp    dp_exit
  1361. ;
  1362. ; check if click on option, mouse checks
  1363. ;
  1364. dp_08:    cmp    dh,ds:cursor_line        ;check if click in same row
  1365.     je    dp_07                ;jmp if same row
  1366. ;
  1367. ; we have a click on non-selected row, try to move to this row
  1368. ;    
  1369.     mov    bl,dh
  1370.     sub    bh,bh
  1371.     shl    bx,1
  1372.     add    bx,offset line01_ptr
  1373.     cmp    word ptr ds:[bx],0
  1374.     je    do_pulldown            ;jmp if click out of range
  1375.     mov    ch,3                ;pre load down arrow code
  1376.     cmp    dh,ds:cursor_line
  1377.     jb    dp_exit                ;jmp if down arrow sim
  1378.     mov    ch,2
  1379. dp_exit:
  1380.     ret
  1381.  
  1382. ;----------------------------------------------------------------------------
  1383. ; display_line - display one line of config data
  1384. ;  inputs: ds & es point at allocated memory
  1385. ;               si = ptr into page_detail (lines)
  1386. ;
  1387.  
  1388. display_line:
  1389.     apush    cx,si
  1390. ;
  1391. ; parse the current line
  1392. ;
  1393.     call    build_line_detail
  1394.     call    fill_temp_string
  1395.  
  1396.     mov    si,offset temp_string
  1397.     mov    dl,1
  1398.     mov    dh,ds:cursor_line
  1399.     call    posn_to_adr
  1400.     cmp    ds:ld_type,4        ;check if color
  1401.     jne    dl_1
  1402.     sub    di,2            ;move back one char
  1403.     mov    ah,cs:submenu_text_color
  1404.         mov     al,' '
  1405.     call    $put_crt_chr
  1406.     mov    ah,ds:temp_string    ;get color
  1407.     mov    al,''
  1408.     call    $put_crt_chr
  1409.     mov    ah,cs:submenu_text_color
  1410.         mov     al,' '
  1411.     call    $put_crt_chr
  1412.     add    di,4
  1413.     jmp    dl_4
  1414.         
  1415. dl_1:    mov    ah,cs:submenu_text_color
  1416.     mov    cx,-1            ;set display length to max
  1417.     call    $put_crt_blk
  1418.     mov    dh,ds:cursor_line
  1419.     cmp    ds:ld_type,5        ;check if string
  1420.     je    dl_2            ;  jmp if string
  1421.     mov    dl,13
  1422.     call    posn_to_adr
  1423.     jmp    dl_4
  1424. ;
  1425. ; find text location for string description
  1426. ;
  1427. dl_2:    mov    dl,ds:ld_str_len
  1428.     add    dl,4
  1429.     call    posn_to_adr
  1430. ;
  1431. ; display descsriptive string
  1432. ;
  1433. dl_4:    mov    ah,cs:submenu_text_color
  1434.     mov    cx,-1            ;set display length to max
  1435.     mov    ds,cs:allocated_mem_seg
  1436.     mov    si,ds:ld_descrip_ptr
  1437.     call    $put_crt_blk
  1438.     apop    si,cx
  1439.     ret
  1440. ;----------------------------------------------------------------------------
  1441. ; build setup file name
  1442. ;  inputs:  ds = library segment
  1443. ;  output:  setup_filename is created.
  1444. ;
  1445. build_filename:
  1446.     apush    cx,si,di,es
  1447.     mov    es,lib_info.psp_seg
  1448.     call    find_home_path        ;returns ES:DI pointing at full path
  1449. ;
  1450. ; scan to end of name
  1451. ;
  1452.     mov    si,di
  1453. bf_lp1:    inc    si
  1454.     cmp    byte ptr es:[si],0
  1455.     jne    bf_lp1            ;loop till end found
  1456. bf_lp2:    dec    si
  1457.     cmp    byte ptr es:[si-1],'\'
  1458.     je    bf_copyf
  1459.     cmp    byte ptr es:[si-1],':'
  1460.     je    bf_copyf
  1461.     cmp    di,si
  1462.     jne    bf_lp2
  1463. bf_copyf:
  1464.     mov    di,offset setup_filename
  1465. bf_loop:    
  1466.     mov    al,es:[si]
  1467.     cmp    al,0
  1468.     je    bf_done            ;jmp if name moved
  1469.     mov    ds:[di],al
  1470.     inc    si
  1471.     inc    di
  1472.     loop    bf_loop
  1473. bf_done:
  1474.     sub    di,3
  1475.         mov     word ptr [di],'FC'
  1476.     add    di,2
  1477.         mov     byte ptr [di],'G'
  1478.     add    di,1
  1479.     mov    byte ptr [di],0
  1480.     apop    es,di,si,cx
  1481.     ret
  1482. ;------------------------------------------------------------------------------
  1483. ; find_block_end - find length of setup block
  1484. ;  inputs:  address of setup block stored at cs:callers_setup_block_off
  1485. ;  output:  di = match pointer if no carry
  1486. ;           if carry then block too big or no <<end>> statement
  1487. ;         
  1488. find_block_end:
  1489.     push    cs
  1490.     pop    ds
  1491.     mov    si,offset end_string
  1492.     les    di,dword ptr cs:callers_setup_block_off
  1493.     mov    cx,2000                ;maximum setup block size
  1494.     call    buffer_searchc            ;look of end string
  1495. fbe_exit:    
  1496.     ret
  1497. ;----------------------------------------------------------------------------
  1498. ; working_to_caller - copy working setup block to callers area
  1499. ;  inputs:  cs:callers_setup_block_off = destination
  1500. ;           cs:allocated_mem_seg:working_setup = source
  1501. ;           cs:setup_block_len = length
  1502. ;
  1503. working_to_caller:
  1504.     apush    ds,es
  1505.     les    di,dword ptr cs:callers_setup_block_off
  1506.     mov    ds,cs:allocated_mem_seg
  1507.     mov    si,offset working_setup
  1508.     mov    cx,cs:setup_block_len
  1509.     cld
  1510.     rep    movsb
  1511.     apop    es,ds
  1512.     ret
  1513. ;
  1514. ;----------------------------------------------------------------------------
  1515. feed_colors:
  1516.     apush     bx,si,di,ds
  1517.  
  1518.     mov    ds,cs:allocated_mem_seg
  1519.  
  1520.     mov    ds:cursor_page_ptr,offset header1_ptr
  1521.     call    build_page_detail
  1522.  
  1523.     mov    si,offset line01_ptr        ;get ptr to line 1
  1524.     mov    bx,0                ;color store #
  1525.  
  1526. fc_loop:mov    di,word ptr ds:[si]        ;get line ptr
  1527.     mov    al,ds:[di+4]            ;get color
  1528.     call    set_lib_colors
  1529.     inc    bx                ;move to next color
  1530.     add    si,2                ;move to next setup line
  1531.     cmp    bx,8
  1532.     jb    fc_loop                ;loop till done
  1533.  
  1534.     apop     ds,di,si,bx
  1535.     ret
  1536. ;----------------------------------------------------------------------------
  1537. ; CONFIG data section
  1538. ;----------------------------------------------------------------------------
  1539. ; The summary_table built by GET_SETUP and a copy of setup is kept in
  1540. ; memory.
  1541. ;---------------------------
  1542. ; config menu (top menu bar)
  1543. ;
  1544. config_menu    label    byte
  1545.     db    0            ;m_flag
  1546.     db    0            ;top row
  1547.     db    0            ;left column
  1548.     db    1            ;total rows
  1549.     db    80            ;total columns
  1550.     db    5            ;menu options
  1551.     dw    0            ;main selection
  1552.     dw    0            ;sub selection
  1553. ; config option #0 -RESTORE_DEFAULTS-
  1554.     db    0            ;e_count
  1555.     db    0            ;e_sub_length
  1556.     db    19            ;e_hot_key (alt-t)
  1557.     db    16            ;e_length
  1558.     dw    config_opt0_text    ;e_text_ptr
  1559.     dw    config_restore         ;e_process
  1560.     db    1            ;e_column
  1561.           db    0            ;e_row
  1562. ; config option #1 -SAVE_DATA-
  1563.     db    0            ;e_count
  1564.     db    0            ;e_sub_length
  1565.     db    31            ;e_hot_key (alt-a)
  1566.     db    09            ;e_length
  1567.     dw    config_opt1_text    ;e_text_ptr
  1568.     dw    config_save        ;e_process
  1569.     db    19            ;e_column
  1570.           db    0            ;e_row
  1571. ; config option #2 -NEXT_PAGE-
  1572.     db    0            ;e_count
  1573.     db    0            ;e_sub_length
  1574.     db    49            ;e_hot_key (alt-b)
  1575.     db    09            ;e_length
  1576.     dw    config_opt2_text    ;e_text_ptr
  1577.     dw    config_next        ;e_process
  1578.     db    30            ;e_column
  1579.           db    0            ;e_row
  1580. ; config option #3 -HELP-
  1581.     db    0            ;e_count
  1582.     db    0            ;e_sub_length
  1583.     db    35            ;e_hot_key (alt-b)
  1584.     db    04            ;e_length
  1585.     dw    config_opt3_text    ;e_text_ptr
  1586.     dw    config_help        ;e_process
  1587.     db    41            ;e_column
  1588.           db    0            ;e_row
  1589. ; config option #4 -EXIT-config-
  1590.     db    0            ;e_count
  1591.     db    0            ;e_sub_length
  1592.     db    18            ;e_hot_key (alt-b)
  1593.     db    11            ;e_length
  1594.     dw    config_opt4_text    ;e_text_ptr
  1595.     dw    config_exit        ;e_process
  1596.     db    47            ;e_column
  1597.           db    0            ;e_row
  1598. ; config option end, dummy option
  1599.     db    0            ;e_count
  1600.     db    0            ;e_sub_length
  1601.     db    00            ;e_hot_key (alt-b)
  1602.     db    0            ;e_length
  1603.     dw    0                     ;e_text_ptr
  1604.     dw    0            ;e_process
  1605.     db    0            ;e_column
  1606.     db    0            ;e_row
  1607.  
  1608. config_opt0_text     db 'Restore_defaluts',0
  1609. config_opt1_text     db 'Save_data',0
  1610. config_opt2_text     db 'Next_page',0
  1611. config_opt3_text     db 'Help',0
  1612. config_opt4_text     db 'Exit-config',0
  1613. config_opt5_text     label    byte    ;dummy for menu placement calc
  1614.  
  1615. ;------------------------------------------------------------------------------
  1616.  
  1617. LIBSEG    ENDS
  1618.     END
  1619.