home *** CD-ROM | disk | FTP | other *** search
/ The CDPD Public Domain Collection for CDTV 3 / CDPDIII.bin / pd / utilities / dirutils / visualshell / src / asmsupp2.asm < prev    next >
Assembly Source File  |  1992-10-30  |  39KB  |  1,557 lines

  1.         *********************************
  2.         *                               *
  3.         *   Visual Shell v1.17  10/92   *
  4.         *                               *
  5.         *     by Torsten Jürgeleit      *
  6.         *                               *
  7.         *   assembly support routines   *
  8.         *            part II            *
  9.         *                               *
  10.         *********************************
  11.  
  12.     NOLIST
  13.     INCLUDE "exec/types.i"
  14.     INCLUDE "exec/ports.i"
  15.     INCLUDE "exec/nodes.i"
  16.     INCLUDE "exec/lists.i"
  17.     INCLUDE "exec/memory.i"
  18.     INCLUDE "libraries/arpbase.i"
  19.     INCLUDE "intuition/intuition.i"
  20.     INCLUDE "equates.i"
  21.     LIST
  22.  
  23. ;---------------------------------------------------------------------------
  24. ; External definitions
  25. ;---------------------------------------------------------------------------
  26.  
  27.     XDEF    _unpack_font
  28.     XDEF    _display_text
  29.     XDEF    write_text
  30.     XDEF    _print_freq_lines
  31.     XDEF    _hcomp_freq_cursor
  32.     XDEF    _move_freq_cursor_down
  33.     XDEF    _scroll_file_req
  34.     XDEF    _print_vreq_lines
  35.     XDEF    _build_vreq_line
  36.     XDEF    build_text_line
  37.     XDEF    _hcomp_vreq_line
  38.     XDEF    _scroll_view_req
  39.     XDEF    _print_quick_view_lines
  40.  
  41. ;---------------------------------------------------------------------------
  42. ; External references
  43. ;---------------------------------------------------------------------------
  44.  
  45.     XREF    _IntuitionBase
  46.     XREF    _GfxBase
  47.     XREF    _gadget_buffer
  48.     XREF    _con_device
  49.     XREF    _con_unit
  50.     XREF    _con_window
  51.     XREF    _con_rport
  52.     XREF    _main_task
  53.     XREF    _vsh_port
  54.     XREF    _auto_repeat
  55.     XREF    _show_flag
  56.     XREF    _scroll_flag
  57.     XREF    _vsh_scroll_speed
  58.     XREF    _vsh_dump_mode
  59.     XREF    _qualifier
  60.     XREF    _enable_abort
  61.     XREF    _num_lock
  62.     XREF    _key_table
  63.     XREF    _action_table
  64.     XREF    _scroll_flag_table
  65.     XREF    _action
  66.     XREF    _file_req
  67.     XREF    _view_req
  68.     XREF    _active_freq
  69.     XREF    _line1_buffer
  70.     XREF    _wb_line_len
  71.     XREF    _max_line_len
  72.     XREF    _print_dir_info
  73.     XREF    _print_info_line
  74.     XREF    _print_vreq_status
  75.     XREF    _print_quick_view
  76.     XREF    _SPrintf
  77.     XREF    _protection_bits
  78.     XREF    _protection_string
  79.     XREF    _font_data
  80.     XREF    _template_buffer
  81.  
  82. ;---------------------------------------------------------------------------
  83. ; VOID unpack_font(font, font_data)
  84. ;            a0      a1
  85. ;     struct TextFont  *font
  86. ;    UBYTE *font_data
  87. ; Unpack specified text font into buffer
  88. ;---------------------------------------------------------------------------
  89. _unpack_font:
  90.     PUSH    d2-d4/a2-a3
  91.  
  92.     ; --- init some regs
  93.     move.w    tf_Modulo(a0),d1
  94.     moveq    #0,d2
  95.     move.b    tf_LoChar(a0),d2
  96.     moveq    #0,d3
  97.     move.b    tf_HiChar(a0),d3
  98.     move.l    tf_CharData(a0),a2
  99.     move.l    tf_CharLoc(a0),a3
  100.     moveq    #0,d4            ; reset char counter
  101.  
  102. up_low_loop:
  103.     ; --- copy 0 to tf_LoChar-1 dummy characters
  104.     cmp.w    d2,d4
  105.     bhs    up_mid_loop
  106.     move.w    d3,d0
  107.     sub.w    d2,d0
  108.     addq.w    #1,d0
  109.     bsr    copy_font_char
  110.     addq.w    #1,d4
  111.     bra    up_low_loop
  112.  
  113. up_mid_loop:
  114.     ; --- copy tf_LoChar to tf_HiChar-1 real characters
  115.     cmp.w    d3,d4
  116.     bhi    up_high_loop
  117.     move.w    d4,d0
  118.     sub.w    d2,d0
  119.     bsr    copy_font_char
  120.     addq.w    #1,d4
  121.     bra    up_mid_loop
  122.  
  123. up_high_loop:
  124.     ; --- copy tf_HiChar to 255 dummy characters
  125.     cmp.w    #255,d4
  126.     bhi    up_exit
  127.     move.w    d3,d0
  128.     sub.w    d2,d0
  129.     addq.w    #1,d0
  130.     bsr    copy_font_char
  131.     addq.w    #1,d4
  132.     bra    up_high_loop
  133.  
  134. up_exit:
  135.     PULL    d2-d4/a2-a3
  136.     rts
  137.  
  138. ;---------------------------------------------------------------------------
  139. ; Copy font character data of specified char to given buffer
  140. ;
  141. ; Input: d0.w = character num (0..255)
  142. ;     d1.w = tf_Modulo
  143. ;     a1   = buffer ptr
  144. ;     a2   = tf_CharData
  145. ;     a3   = tf_CharLoc
  146. ;---------------------------------------------------------------------------
  147. copy_font_char:
  148.     lsl.w    #2,d0
  149.     move.w    (a3,d0.w),d0        ; d0 := bit offset into tf_CharData
  150.     lsr.w    #3,d0            ; d0 := byte offset into tf_CharData
  151.     lea    0(a2,d0.w),a0        ; a0 := character bitmap ptr
  152.     moveq    #8-1,d0
  153.  
  154. cfc_copy_loop:
  155.     move.b    (a0),(a1)+
  156.     add.w    d1,a0
  157.     dbra    d0,cfc_copy_loop
  158.  
  159.     rts
  160.  
  161. ;---------------------------------------------------------------------------
  162. ; VOID display_text(front_color, back_color, x, y, text)
  163. ;    USHORT front_color, back_color, x, y
  164. ;    UBYTE  *text
  165. ; Print text on console window at specified position
  166. ;---------------------------------------------------------------------------
  167. _display_text:
  168.     PUSH    a2/a6
  169.  
  170.     move.l    _con_rport,a2        ; a2 := rast port
  171.     move.l    _GfxBase,a6
  172.  
  173.     moveq    #RP_JAM2,d0        ; draw mode
  174.     move.l    a2,a1
  175.     CALLSYS    SetDrMd
  176.  
  177.     move.w    4+2*4(sp),d0        ; front color
  178.     move.l    a2,a1
  179.     CALLSYS    SetAPen
  180.  
  181.     move.w    6+2*4(sp),d0        ; back color
  182.     move.l    a2,a1
  183.     CALLSYS    SetBPen
  184.  
  185.     move.w    8+2*4(sp),d0        ; x
  186.     move.w    10+2*4(sp),d1        ; y
  187.     move.l    12+2*4(sp),a0        ; text
  188.     bsr    write_text
  189.  
  190.     PULL    a2/a6
  191.     rts
  192.  
  193. ;---------------------------------------------------------------------------
  194. ; Input : a0   = text ptr
  195. ;      d0.w = xpos
  196. ;      d1.w = ypos
  197. ; Write text to given rastport at specified position
  198. ;---------------------------------------------------------------------------
  199. write_text:
  200.     PUSH    d2-d6/a2-a3/a6
  201.  
  202.     move.w    d0,d2                ; d2 := x pos
  203.     move.w    d1,d3                ; d3 := y pos
  204.      move.l    _font_data,d5            ; d5 := font data ptr
  205.     move.l    _template_buffer,d6        ; d6 := template buffer ptr
  206.     move.w    _wb_line_len,d4            ; d4 := template modulo
  207.     moveq    #0,d1                ; d1 := char counter
  208.  
  209. wt_loop:
  210.     moveq    #0,d0
  211.     move.b    (a0)+,d0            ; get next char from text
  212.     beq    wt_blit_line
  213.  
  214.     move.l    d5,a2                ; a2 := font data
  215.     lsl.w    #3,d0                ; d0 := offset in font data
  216.     add.w    d0,a2                ; a2 := start of char matrix
  217.     move.l    d6,a3                ; a3 := offset in template buffer
  218.  
  219.     move.b    (a2)+,(a3)            ; copy char matrix to template
  220.     add.w    d4,a3
  221.     move.b    (a2)+,(a3)
  222.     add.w    d4,a3
  223.     move.b    (a2)+,(a3)
  224.     add.w    d4,a3
  225.     move.b    (a2)+,(a3)
  226.     add.w    d4,a3
  227.     move.b    (a2)+,(a3)
  228.     add.w    d4,a3
  229.     move.b    (a2)+,(a3)
  230.     add.w    d4,a3
  231.     move.b    (a2)+,(a3)
  232.     add.w    d4,a3
  233.     move.b    (a2)+,(a3)
  234.  
  235.     addq.w    #1,d6                ; inc template ptr
  236.     addq.w    #1,d1                ; inc char counter
  237.     cmp.w    d4,d1                ; text too long ?
  238.     blo    wt_loop
  239.  
  240. wt_blit_line:
  241.     move.l    _template_buffer,a0        ; a0 := template ptr
  242.     move.l    _con_rport,a1            ; a1 := rast port
  243.     moveq    #0,d0                ; d0 := template x offset
  244.     exg    d1,d4                ; d1 := template modulo -> MUST BE EVEN!!!
  245.     lsl.w    #3,d4                ; d4 := template width
  246.     add.w    d4,rp_cp_x(a1)            ; inc cursor pos
  247.     moveq    #8,d5                ; d5 := template height
  248.     move.l    _GfxBase,a6            ; a6 := GfxBase
  249.     CALLSYS    BltTemplate
  250.     CALLSYS    WaitBlit
  251.  
  252.     PULL    d2-d6/a2-a3/a6
  253.     rts
  254.  
  255. ;---------------------------------------------------------------------------
  256. ; VOID print_freq_lines(freq, node, line, count)
  257. ;             a0    a1    d0    d1
  258. ;    struct FileRequest  *freq
  259. ;    struct FileNode     *node
  260. ;    USHORT line, count
  261. ; Print specified part of filerequester
  262. ;---------------------------------------------------------------------------
  263. _print_freq_lines:
  264.     PUSH    d2-d4/a2-a3/a5-a6
  265.  
  266.     tst.b    _show_flag            ; hidden display ?
  267.     beq    pfl_exit
  268.     move.l    a0,a2                ; a2 := freq
  269.     move.l    a1,a3                ; a3 := node
  270.     move.w    d0,d2                ; d2 := line
  271.     move.w    d1,d3                ; d3 := count
  272.     move.w    fr_Mode(a2),d0            ; d0 := freq mode
  273.  
  274. pfl_info_mode:
  275.     cmp.w    #FREQ_MODE_INFO,d0        ; info mode ?
  276.     bne    pfl_quick_view_mode
  277.     move.l    a2,a0                ; a0 := freq
  278.     jsr    _print_dir_info
  279.     bra    pfl_exit
  280.  
  281. pfl_quick_view_mode:
  282.     cmp.w    #FREQ_MODE_QUICK_VIEW,d0    ; quick view mode ?
  283.     bne    pfl_normal_mode
  284.     move.l    a2,a0                ; a0 := freq
  285.     jsr    _print_quick_view
  286.     bra    pfl_exit
  287.  
  288. pfl_normal_mode:
  289.     move.l    _con_rport,a5
  290.     move.l    _GfxBase,a6
  291.     lsl.w    #3,d2                ; line *= 8
  292.     add.w    fr_Display+d_TopEdge(a2),d2    ; d2 := vertical position
  293.     move.w    fr_Display+d_LeftEdge(a2),d4    ; d4 := horizontal position
  294.     subq.w    #1,d3                ; dec count for dbra
  295.  
  296.     move.l    a3,d0                ; node == NULL
  297.     beq    pfl_clear
  298.  
  299.     moveq    #RP_JAM2,d0            ; draw mode := JAM2
  300.     move.l    a5,a1                ; rport
  301.     CALLSYS    SetDrMd
  302.  
  303. pfl_print_loop:
  304.     tst.l    MLN_SUCC(a3)            ; end of list ?
  305.     beq    pfl_clear
  306.  
  307. pfl_check_type:
  308.     moveq    #COLOR1,d0            ; type = file | assign
  309.     move.b    fn_Type(a3),d1
  310.     cmp.b    #ENTRY_TYPE_FILE,d1
  311.     beq    pfl_set_front_color
  312.     cmp.b    #ENTRY_TYPE_DIR,d1
  313.     bne    pfl_set_front_color
  314.     moveq    #COLOR3,d0            ; type = dir | dev
  315.  
  316. pfl_set_front_color:
  317.     move.l    a5,a1                ; rport
  318.     CALLSYS    SetAPen
  319.  
  320. pfl_check_mark:
  321.     moveq    #COLOR0,d0            ; normal back color
  322.     tst.b    fn_Marked(a3)            ; entry marked ?
  323.     beq    pfl_set_back_pen
  324.     moveq    #COLOR2,d0            ; marked back color
  325.  
  326. pfl_set_back_pen:
  327.     move.l    a5,a1                ; rport
  328.     CALLSYS    SetBPen
  329.  
  330.     lea    fn_Text(a3),a0            ; text
  331.     move.w    d4,d0                ; x
  332.     move.w    d2,d1                ; y
  333.     bsr    write_text
  334.  
  335.     addq.l    #8,d2                ; inc vertical position
  336.     move.l    MLN_SUCC(a3),a3
  337.     dbra    d3,pfl_print_loop
  338.     bra    pfl_exit
  339.  
  340. pfl_clear:
  341.     moveq    #COLOR0,d0            ; fill color
  342.     move.l    a5,a1                ; rport
  343.     CALLSYS    SetAPen
  344.  
  345.     move.w    d4,d0                ; x1
  346.     move.w    d2,d1                ; y1
  347.     move.w    d0,d2
  348.     add.w    #MAX_FREQ_LINE_WIDTH,d2        ; x2
  349.     addq.w    #1,d3                ; inc count because of dbra
  350.     lsl.w    #3,d3                ; d3 * 8
  351.     add.w    d1,d3                ; y2
  352.     move.l    a5,a1                ; rport
  353.     CALLSYS    RectFill
  354.  
  355. pfl_exit:
  356.     PULL    d2-d4/a2-a3/a5-a6
  357.     rts
  358.  
  359. ;---------------------------------------------------------------------------
  360. ; VOID hcomp_freq_cursor(freq)
  361. ;              a0
  362. ;    struct FileRequest  *freq
  363. ; Highlight or de-highlight the cursor line in filerequester
  364. ;---------------------------------------------------------------------------
  365. _hcomp_freq_cursor:
  366.     PUSH    a2/a6
  367.  
  368.     tst.b    _show_flag            ; hidden display ?
  369.     beq    hfc_exit    
  370.     move.l    a0,a2                ; a2 := freq
  371.     lea    _file_req,a1            ; active freq ?
  372.     tst.b    _active_freq
  373.     beq    hfc_first_freq
  374.  
  375. hfc_second_freq:
  376.     add.l    #FileRequest_Sizeof,a1
  377.  
  378. hfc_first_freq:
  379.     cmp.l    a1,a2                ; a2 == &file_req[active_freq] ?
  380.     bne    hfc_exit
  381.     move.w    fr_Mode(a2),d0            ; d0 := freq mode
  382.     cmp.w    #FREQ_MODE_INFO,fr_Mode(a2)    ; info mode ?
  383.     beq    hfc_exit
  384.     cmp.w    #FREQ_MODE_QUICK_VIEW,d0    ; quick view mode ?
  385.     beq    hfc_exit
  386.  
  387.     move.l    _GfxBase,a6
  388.     bsr    hcomp_freq_cursor
  389.  
  390. hfc_exit:
  391.     PULL    a2/a6
  392.     rts
  393.  
  394. ;---------------------------------------------------------------------------
  395. ; Input : a2 = freq ptr
  396. ;      a6 = GfxBase
  397. ; Highlight or de-highlight the cursor line in filerequester
  398. ;---------------------------------------------------------------------------
  399. hcomp_freq_cursor:
  400.     PUSH    d2-d3/a3
  401.  
  402.     move.w    fr_CursorLine(a2),d2        ; d2 := cursor line
  403.     cmp.w    #-1,d2                ; no cursor line ?
  404.     beq    hfc_return
  405.     cmp.w    fr_Display+d_VisibleLines(a2),d2
  406.     bhs    hfc_return
  407.  
  408.     move.l    _con_rport,a3            ; a3 := rast port
  409.     moveq    #RP_COMPLEMENT,d0        ; draw mode
  410.     move.l    a3,a1
  411.     CALLSYS    SetDrMd
  412.  
  413.     moveq    #0,d0
  414.     move.w    fr_Display+d_LeftEdge(a2),d0    ; x1
  415.     moveq    #0,d1
  416.     move.w    fr_Display+d_TopEdge(a2),d1
  417.     lsl.w    #3,d2                ; d2 * 8
  418.     add.w    d2,d1                ; y1
  419.     move.l    d0,d2
  420.     add.w    #MAX_FREQ_LINE_WIDTH-1,d2    ; x2
  421.     move.l    d1,d3
  422.     addq.w    #7,d3                ; y2
  423.     move.l    a3,a1
  424.     CALLSYS    RectFill
  425.  
  426.     moveq    #RP_JAM2,d0            ; draw mode
  427.     move.l    a3,a1
  428.     CALLSYS    SetDrMd
  429.  
  430. hfc_return:
  431.     PULL    d2-d3/a3
  432.     rts
  433.  
  434. ;---------------------------------------------------------------------------
  435. ; VOID move_freq_cursor_down(freq)
  436. ;                  a0
  437. ;    struct FileRequest  *freq
  438. ; Move cursor one entry down in given filerequester
  439. ;---------------------------------------------------------------------------
  440. _move_freq_cursor_down:
  441.     PUSH    d2-d7/a2-a3/a6            ; save regs for scroll routine
  442.  
  443.     tst.b    _show_flag            ; hidden display ?
  444.     beq    mcd_exit
  445.     move.l    a0,a2                ; a2 := freq ptr
  446.     move.w    fr_Mode(a2),d0            ; d0 := freq mode
  447.     cmp.w    #FREQ_MODE_INFO,d0        ; info mode ?
  448.     beq    mcd_exit
  449.     cmp.w    #FREQ_MODE_QUICK_VIEW,d0    ; quick view mode ?
  450.     beq    mcd_exit
  451.     tst.l    fr_Display+d_NumEntries(a2)    ; empty file list ?
  452.     beq    mcd_exit
  453.  
  454.     move.l    _GfxBase,a6
  455.     bsr    hcomp_freq_cursor        ; draw new cursor line
  456.     moveq    #1,d7                ; d7 := count
  457.     bsr    scroll_freq_down
  458.     moveq    #INFO_LINE_MODE_NORMAL,d0    ; d0 := mode
  459.     jsr    _print_info_line        ; print new info line
  460.  
  461. mcd_exit:
  462.     PULL    d2-d7/a2-a3/a6
  463.     rts
  464.  
  465. ;---------------------------------------------------------------------------
  466. ; VOID scroll_file_req(VOID)
  467. ; Scroll file list in active filerequester
  468. ;---------------------------------------------------------------------------
  469. _scroll_file_req:
  470.     PUSH    d2-d7/a2-a3/a6            ; save regs for scroll routines
  471.  
  472.     tst.b    _scroll_flag            ; check scroll flag
  473.     beq    sfr_exit
  474.     tst.b    _show_flag            ; hidden display ?
  475.     beq    sfr_exit
  476.     lea    _file_req,a2            ; a2 := &file_req[active_freq]
  477.     tst.b    _active_freq
  478.     beq    sfr_left_freq
  479.     add.l    #FileRequest_Sizeof,a2
  480.  
  481. sfr_left_freq:
  482.     move.w    fr_Mode(a2),d0            ; d0 := freq mode
  483.     cmp.w    #FREQ_MODE_INFO,d0        ; info mode ?
  484.     beq    sfr_exit
  485.     cmp.w    #FREQ_MODE_QUICK_VIEW,d0    ; quick view mode ?
  486.     beq    sfr_exit
  487.     cmp.l    #1,fr_Display+d_NumEntries(a2)    ; more than one entries in file list ?
  488.     bls    sfr_exit
  489.  
  490. sfr_auto_repeat_loop:
  491.     move.l    _GfxBase,a6
  492.     move.b    _scroll_flag,d1            ; d1 := scroll flag
  493.     bclr    #7,d1                ; top or bottom ?
  494.     bne    sfr_scroll_all
  495.     moveq    #1,d7                ; d7 := count
  496.     bclr    #6,d1                ; page up or down ?
  497.     beq    sfr_scroll_part
  498.     moveq    #0,d7
  499.     move.w    fr_Display+d_VisibleLines(a2),d7    ; d7 := count
  500.  
  501. sfr_scroll_part:
  502.     bclr    #0,d1                ; scroll up ?
  503.     bne    sfr_scroll_part_up
  504.     bclr    #1,d1                ; scroll down ?
  505.     beq    sfr_exit
  506.  
  507. sfr_scroll_part_down:
  508.     bsr    scroll_freq_down
  509.     bra    sfr_print_info
  510.  
  511. sfr_scroll_part_up:
  512.     bsr    scroll_freq_up
  513.     bra    sfr_print_info
  514.  
  515. sfr_scroll_all:
  516.     bsr    hcomp_freq_cursor        ; clear old cursor line
  517.     move.l    fr_Display+d_List(a2),a0    ; a0 := file list ptr
  518.     move.b    _scroll_flag,d0            ; d0 := scroll flag
  519.     btst    #0,d0                ; scroll up ?
  520.     beq    sfr_scroll_all_down
  521.  
  522. sfr_scroll_all_up:
  523.     move.l    MLH_HEAD(a0),a0
  524.     clr.w    fr_CursorLine(a2)        ; cursor at top
  525.     bra    sfr_scroll_all_print
  526.  
  527. sfr_scroll_all_down:
  528.     moveq    #0,d0
  529.     move.w    fr_Display+d_VisibleLines(a2),d0
  530.     cmp.l    fr_Display+d_NumEntries(a2),d0    ; lesser entries than lines ?
  531.     blo    sfr_search_last_entry
  532.     move.l    fr_Display+d_NumEntries(a2),d0    ; cursor to last entry
  533.     subq.w    #1,d0
  534.     move.w    d0,fr_CursorLine(a2)
  535.     bra    sfr_draw_cursor
  536.  
  537. sfr_search_last_entry:
  538.     move.l    MLH_TAILPRED(a0),a0
  539.     move.w    fr_Display+d_VisibleLines(a2),d0
  540.     subq.w    #2,d0                ; dec for dbra
  541.  
  542. sfr_last_entry_loop:
  543.     move.l    MLN_PRED(a0),a0
  544.     dbra    d0,sfr_last_entry_loop
  545.     move.w    fr_Display+d_VisibleLines(a2),d0    ; cursor at bottom
  546.     subq.w    #1,d0
  547.     move.w    d0,fr_CursorLine(a2)
  548.  
  549. sfr_scroll_all_print:
  550.     move.l    a0,fr_Display+d_FirstVisibleNode(a2)
  551.     move.l    a0,a1                    ; a1 := node
  552.     move.l    a2,a0                    ; a0 := freq
  553.     moveq    #0,d0                    ; d0 := line
  554.     move.w    fr_Display+d_VisibleLines(a2),d1    ; d1 := count
  555.     jsr    _print_freq_lines            ; print whole page
  556.  
  557. sfr_draw_cursor:
  558.     bsr    hcomp_freq_cursor        ; draw new cursor line
  559.  
  560. sfr_print_info:
  561.     moveq    #INFO_LINE_MODE_NORMAL,d0    ; d0 := mode
  562.     jsr    _print_info_line        ; print new info line
  563.  
  564. sfr_check_auto_repeat:
  565.     cmp.b    #SCROLL_SPEED_FAST,_vsh_scroll_speed    ; fast scrolling ?
  566.     bne    sfr_exit
  567.     tst.b    _auto_repeat            ; auto_repeat ?
  568.     beq    sfr_exit
  569.     tst.b    _scroll_flag            ; check scroll flag
  570.     bne    sfr_auto_repeat_loop
  571.  
  572. sfr_exit:
  573.     PULL    d2-d7/a2-a3/a6
  574.     rts
  575.  
  576. ;---------------------------------------------------------------------------
  577. ; Input : a2   = filerequest ptr
  578. ;      a6   = GfxBase
  579. ;      d7.l = scroll count
  580. ; Scroll file list of active file requester count times up
  581. ;---------------------------------------------------------------------------
  582. scroll_freq_up:
  583.     moveq    #0,d2
  584.     move.w    fr_Display+d_VisibleLines(a2),d2    ; d2 := visible lines
  585.     move.l    fr_Display+d_NumEntries(a2),d3        ; d3 := number of entries
  586.     move.l    fr_Display+d_FirstVisibleNode(a2),a3    ; check cursor line - count
  587.     moveq    #0,d4
  588.     move.w    fr_CursorLine(a2),d4
  589.     add.l    fn_Pos(a3),d4
  590.     subq.l    #1,d4
  591.     beq    sfu_exit            ; already at top ?
  592.     bsr    hcomp_freq_cursor        ; clear old cursor line
  593.     cmp.l    d7,d4
  594.     bhi    sfu_move_cursor
  595.     cmp.l    #1,fn_Pos(a3)            ; already at top ?
  596.     bhi    sfu_start_scroll
  597.     clr.w    fr_CursorLine(a2)        ; now cursor at top
  598.     bra    sfu_draw_cursor
  599.  
  600. sfu_move_cursor:
  601.     move.w    fr_CursorLine(a2),d0        ; dec cursor line
  602.     sub.w    d7,d0
  603.     bmi    sfu_scroll
  604.     bne    sfu_set_cursor            ; cursor at top ?
  605.     cmp.l    #1,fn_Pos(a3)            ; already at top ?
  606.     bhi    sfu_start_scroll
  607.  
  608. sfu_set_cursor:
  609.     move.w    d0,fr_CursorLine(a2)
  610.     bra    sfu_draw_cursor
  611.  
  612. sfu_scroll:
  613.     cmp.l    #1,fn_Pos(a3)            ; already at top ?
  614.     bls    sfu_draw_cursor
  615.  
  616. sfu_start_scroll:
  617.     move.w    d7,d0                ; d0 := scroll count
  618.     subq.w    #1,d0                ; dec count for dbra
  619.  
  620. sfu_loop:
  621.     cmp.l    #1,fn_Pos(a3)            ; top reached ?
  622.     beq    sfu_check_count
  623.     move.l    MLN_PRED(a3),a3            ; get previous node
  624.     dbra    d0,sfu_loop
  625.  
  626. sfu_check_count:
  627.     cmp.w    #1,d7                ; paging ?
  628.     bhi    sfu_paging
  629.  
  630. sfu_init_scroll:
  631.     move.l    _con_rport,a0            ; source rport
  632.     move.l    a0,a1                ; dest rport
  633.     move.w    fr_Display+d_LeftEdge(a2),d0    ; x1
  634.     move.w    fr_Display+d_TopEdge(a2),d1    ; y1
  635.     move.w    d1,d3                ; y2
  636.     move.w    d0,d2                ; x2
  637.     move.w    fr_Display+d_Width(a2),d4    ; width
  638.     move.w    fr_Display+d_VisibleLines(a2),d5
  639.     lsl.w    #3,d5                ; height
  640.     move.w    #$0c0,d6            ; minterm
  641.     cmp.b    #SCROLL_SPEED_SLOW,_vsh_scroll_speed
  642.     beq    sfu_scroll_slow
  643.  
  644. sfu_scroll_normal:
  645.     addq.w    #8,d3                ; y2
  646.     subq.w    #8,d5                ; height
  647.     CALLSYS    ClipBlit            ; scroll one entry up
  648.     bra    sfu_paging
  649.  
  650. sfu_scroll_slow:
  651.     PUSH    d7
  652.     subq.w    #1,d1                ; y1
  653.     moveq    #8-1,d7                ; d7 := count
  654.  
  655. 1$:
  656.     movem.w    d0-d6,-(sp)
  657.     PUSH    a0-a1
  658.     CALLSYS    ClipBlit            ; scroll one scanline up
  659.     PULL    a0-a1
  660.     movem.w    (sp)+,d0-d6
  661.     dbra    d7,1$
  662.     PULL    d7
  663.  
  664. sfu_paging:
  665.     move.l    a2,a0                ; a0 := freq
  666.     move.l    a3,a1                ; a1 := node
  667.     moveq    #0,d0                ; d0 := line
  668.     move.w    d7,d1                ; d1 := count
  669.     jsr    _print_freq_lines        ; print new entry
  670.     move.l    a3,fr_Display+d_FirstVisibleNode(a2)
  671.  
  672. sfu_draw_cursor:
  673.     bsr    hcomp_freq_cursor        ; draw new cursor line
  674.  
  675. sfu_exit:
  676.     rts
  677.  
  678. ;---------------------------------------------------------------------------
  679. ; Input : a2   = filerequest ptr
  680. ;      a6   = GfxBase
  681. ;      d7.l = scroll count
  682. ; Scroll file list of active file requester count times down
  683. ;---------------------------------------------------------------------------
  684. scroll_freq_down:
  685.     moveq    #0,d2
  686.     move.w    fr_Display+d_VisibleLines(a2),d2    ; d2 := visible lines
  687.     move.l    fr_Display+d_NumEntries(a2),d3        ; d3 := number of entries
  688.     move.l    fr_Display+d_FirstVisibleNode(a2),a3    ; check cursor line + count
  689.     moveq    #0,d4
  690.     move.w    fr_CursorLine(a2),d4
  691.     add.l    fn_Pos(a3),d4
  692.     cmp.l    d3,d4                ; already at bottom ?
  693.     beq    sfd_exit
  694.     bsr    hcomp_freq_cursor        ; clear old cursor line
  695.     subq.l    #1,d4
  696.     add.l    d7,d4
  697.     cmp.l    d3,d4
  698.     blo    sfd_move_cursor
  699.     move.l    fn_Pos(a3),d1            ; already at bottom ?
  700.     add.l    d2,d1
  701.     cmp.l    d3,d1
  702.     bls    sfd_start_scroll
  703.     cmp.l    d2,d3                ; more than one page ?
  704.     bhi    sfd_more_pages
  705.     move.w    d3,d0                ; now cursor at bottom
  706.     subq.w    #1,d0
  707.     move.w    d0,fr_CursorLine(a2)
  708.     bra    sfd_draw_cursor
  709.  
  710. sfd_more_pages:
  711.     move.w    d2,d0                ; now cursor at bottom
  712.     subq.w    #1,d0
  713.     move.w    d0,fr_CursorLine(a2)
  714.     bra    sfd_scroll
  715.  
  716. sfd_move_cursor:
  717.     move.w    fr_CursorLine(a2),d0        ; dec cursor line
  718.     add.w    d7,d0
  719.     move.w    d2,d1
  720.     subq.w    #1,d1                ; d1 := visible lines - 1
  721.     cmp.w    d1,d0
  722.     bhi    sfd_scroll
  723.     bne    sfd_set_cursor            ; cursor at bottom ?
  724.     move.l    fn_Pos(a3),d1            ; already at bottom ?
  725.     add.l    d2,d1
  726.     cmp.l    d3,d1
  727.     bls    sfd_start_scroll
  728.  
  729. sfd_set_cursor:
  730.     move.w    d0,fr_CursorLine(a2)
  731.     bra    sfd_draw_cursor
  732.  
  733. sfd_scroll:
  734.     move.l    fn_Pos(a3),d1            ; already at bottom ?
  735.     add.l    d2,d1
  736.     cmp.l    d3,d1
  737.     bhi    sfd_draw_cursor
  738.  
  739. sfd_start_scroll:
  740.     move.w    d7,d0                ; d0 := scroll count
  741.     subq.w    #1,d0                ; dec count for dbra
  742.  
  743. sfd_loop:
  744.     move.l    fn_Pos(a3),d1            ; bottom reached ?
  745.     add.l    d2,d1
  746.     cmp.l    d3,d1
  747.     bhi    sfd_check_count
  748.     move.l    MLN_SUCC(a3),a3            ; get next node
  749.     dbra    d0,sfd_loop
  750.  
  751. sfd_check_count:
  752.     cmp.w    #1,d7                ; paging ?
  753.     bhi    sfd_paging
  754.  
  755. sfd_init_scroll:
  756.     move.l    _con_rport,a0            ; source rport
  757.     move.l    a0,a1                ; dest rport
  758.     move.w    fr_Display+d_LeftEdge(a2),d0    ; x1
  759.     move.w    fr_Display+d_TopEdge(a2),d1    ; y1
  760.     move.w    d1,d3                ; y2
  761.     move.w    d0,d2                ; x2
  762.     move.w    fr_Display+d_Width(a2),d4    ; width
  763.     move.w    fr_Display+d_VisibleLines(a2),d5
  764.     lsl.w    #3,d5                ; height
  765.     move.w    #$0c0,d6            ; minterm
  766.     cmp.b    #SCROLL_SPEED_SLOW,_vsh_scroll_speed
  767.     beq    sfd_scroll_slow
  768.  
  769. sfd_scroll_normal:
  770.     addq.w    #8,d1                ; y1
  771.     subq.w    #8,d5                ; height
  772.     CALLSYS    ClipBlit            ; scroll one entry up
  773.     bra    sfd_scroll_end
  774.  
  775. sfd_scroll_slow:
  776.     PUSH    d7
  777.     addq.w    #1,d1                ; y1
  778.     moveq    #8-1,d7                ; d7 := count
  779.  
  780. 1$:
  781.     movem.w    d0-d6,-(sp)
  782.     PUSH    a0-a1
  783.     CALLSYS    ClipBlit            ; scroll one scanline up
  784.     PULL    a0-a1
  785.     movem.w    (sp)+,d0-d6
  786.     dbra    d7,1$
  787.     PULL    d7
  788.  
  789. sfd_scroll_end:
  790.     move.l    a3,a1                ; a1 := node
  791.     move.w    fr_Display+d_VisibleLines(a2),d0
  792.     subq.w    #1,d0                ; d0 := line
  793.     move.w    d0,d1
  794.     subq.w    #1,d1                ; dec for dbra
  795.  
  796. sfd_get_last_line:
  797.     move.l    MLN_SUCC(a1),a1            ; get next node
  798.     dbra    d1,sfd_get_last_line
  799.     move.w    d7,d1                ; d1 := count
  800.     bra    sfd_print
  801.  
  802. sfd_paging:
  803.     move.l    a3,a1                ; a1 := node
  804.     moveq    #0,d0                ; d0 := line
  805.     move.w    d7,d1                ; d1 := count
  806.  
  807. sfd_print:
  808.     move.l    a2,a0                ; a0 := freq
  809.     jsr    _print_freq_lines        ; print new entry
  810.     move.l    a3,fr_Display+d_FirstVisibleNode(a2)
  811.  
  812. sfd_draw_cursor:
  813.     bsr    hcomp_freq_cursor        ; draw new cursor line
  814.  
  815. sfd_exit:
  816.     rts
  817.  
  818. ;---------------------------------------------------------------------------
  819. ; VOID print_vreq_lines(vreq, node, line, count)
  820. ;             a0    a1    d0    d1
  821. ;    struct ViewRequest  *vreq
  822. ;    struct LineNode     *node
  823. ;    USHORT line, count
  824. ; Print specified lines of text as ASCII or hex dump
  825. ;---------------------------------------------------------------------------
  826. _print_vreq_lines:
  827.     PUSH    d2-d7/a2-a3/a5-a6
  828.  
  829.     ; --- init some regs
  830.     move.l    a0,a2                ; a2 := vreq
  831.     move.l    a1,a3                ; a3 := node ptr
  832.     move.w    d0,d5                ; d5 := line
  833.     move.w    d1,d6                ; d6 := count
  834.     move.l    _con_rport,a5            ; a5 := rast port
  835.     move.l    _GfxBase,a6
  836.  
  837.     ; --- set draw mode and colors
  838.     moveq    #RP_JAM2,d0            ; draw mode
  839.     move.l    a5,a1
  840.     CALLSYS    SetDrMd
  841.  
  842.     moveq    #COLOR1,d0            ; front color
  843.     move.l    a5,a1
  844.     CALLSYS    SetAPen
  845.  
  846.     moveq    #COLOR0,d0            ; back color
  847.     move.l    a5,a1
  848.     CALLSYS    SetBPen
  849.  
  850.     ; --- init line buffer
  851.     subq.w    #1,d6                ; dec count for dbra
  852.     move.w    vr_Mode(a2),d7            ; d7 := mode
  853.     lea    _line1_buffer,a5
  854.     move.w    _max_line_len,d4        ; max num of chars per line
  855.     subq.w    #1,d4                ; dec num -> only valid for ASCII dump
  856.     tst.w    d7                ; check mode -> bytes per line
  857.     beq    pvl_loop
  858.     move.b    #':',8(a5)            ; insert delimiters in line buffer for hex dump
  859.     move.b    #' ',d0
  860.     move.b    d0,9(a5)
  861.     move.b    d0,9+1*9(a5)
  862.     move.b    d0,9+2*9(a5)
  863.     move.b    d0,9+3*9(a5)
  864.     move.b    d0,9+4*9(a5)
  865.     lea    9+MAX_HEX_LONG_WORDS*9+1(a5),a6    ; a6 := ASCII chars for hex dump
  866.     move.b    #'"',(a6)+
  867.  
  868. pvl_loop:
  869.     tst.l    MLN_SUCC(a3)            ; end of list ?
  870.     beq    pvl_exit
  871.     bsr    build_text_line            ; build line of ASCII or hex dump
  872.  
  873.     move.l    a5,a0                ; text
  874.     move.w    vr_Display+d_LeftEdge(a2),d0    ; x
  875.     move.w    d5,d1
  876.     lsl.w    #3,d1                ; d1 * 8
  877.     add.w    vr_Display+d_TopEdge(a2),d1    ; y
  878.     bsr    write_text
  879.  
  880.     move.l    MLN_SUCC(a3),a3            ; next node
  881.     addq.w    #1,d5                ; inc line counter
  882.     dbra    d6,pvl_loop
  883.  
  884. pvl_exit:
  885.     PULL    d2-d7/a2-a3/a5-a6
  886.     rts
  887.  
  888. ;---------------------------------------------------------------------------
  889. ; UBYTE *build_vreq_line(vreq, lnode, max_line_len)
  890. ;              a0    a1         d0
  891. ;    struct ViewRequest  *vreq
  892. ;    struct LineNode     *lnode
  893. ;    USHORT max_line_len
  894. ; Build specified line of text as ASCII or hex dump and returns pointer
  895. ;---------------------------------------------------------------------------
  896. _build_vreq_line:
  897.     PUSH    d2-d7/a2-a3/a5-a6
  898.  
  899.     move.l    a0,a2                ; a2 := vreq
  900.     move.l    a1,a3                ; a3 := node ptr
  901.     move.w    d0,d4                ; d4 := max num of chars per line
  902.     beq    _bvl_no_max_line_len
  903.     subq.w    #1,d4                ; dec num -> only valid for ASCII dump
  904.  
  905. _bvl_no_max_line_len:
  906.     move.w    vr_Mode(a2),d7            ; d7 := mode
  907.     lea    _line1_buffer,a5
  908.     tst.w    d7                ; check mode -> bytes per line
  909.     beq    _bvl_ascii
  910.     move.b    #':',8(a5)            ; insert delimiters in line buffer for hex dump
  911.     move.b    #' ',d0
  912.     move.b    d0,9(a5)
  913.     move.b    d0,9+1*9(a5)
  914.     move.b    d0,9+2*9(a5)
  915.     move.b    d0,9+3*9(a5)
  916.     move.b    d0,9+4*9(a5)
  917.     lea    9+MAX_HEX_LONG_WORDS*9+1(a5),a6    ; a6 := ASCII chars for hex dump
  918.     move.b    #'"',(a6)+
  919.  
  920. _bvl_ascii:
  921.     bsr    build_text_line
  922.     move.l    a5,d0                ; return pointer to line
  923.  
  924.     PULL    d2-d7/a2-a3/a5-a6
  925.     rts
  926.  
  927. ;---------------------------------------------------------------------------
  928. ; Input : a2 := req ptr (view or history req)
  929. ;      a3 := line node ptr
  930. ;      a5 := line buffer ptr
  931. ;      a6 := ASCII chars ptr for hex dump
  932. ;      d4 := max num of chars per line
  933. ;      d7 := view mode
  934. ; Build specified line of text as ASCII or hex dump
  935. ;---------------------------------------------------------------------------
  936. build_text_line:
  937.     move.l    ln_Line(a3),a0            ; a0 := source ptr
  938.     move.l    a5,a1                ; a1 := dest ptr
  939.     moveq    #0,d3                ; reset char counter
  940.     move.w    ln_LineLen(a3),d2        ; d2 := num of bytes in line
  941.     beq    btl_ascii_fill_line        ; empty line ?
  942.     subq.w    #1,d2                ; dec num for dbra
  943.     tst.w    d7                ; check mode
  944.     beq    btl_ascii_loop
  945.  
  946. btl_hex:
  947.     move.l    ln_Offset(a3),d0        ; insert relative position
  948.     moveq    #8,d1
  949.     bsr    bin_to_hex
  950.     add.l    #2,a1                ; start of first long word
  951.     moveq    #4,d4                ; load byte counter for first long word
  952.  
  953. btl_hex_loop:
  954.     move.b    (a0)+,d0            ; get byte from buffer
  955.  
  956. btl_insert_hex_byte:
  957.     moveq    #2,d1
  958.     bsr    bin_to_hex            ; convert to hex
  959.     subq.w    #1,d4                ; dec byte counter for long word
  960.     bne    btl_hex_check_ctrl_chars
  961.     moveq    #4,d4                ; load byte counter for next long word
  962.     add.l    #1,a1                ; start of next long word -> space as delimiter
  963.  
  964. btl_hex_check_ctrl_chars:
  965.     move.b    d0,d1                ; check for ctrl chars
  966.     bclr    #7,d1
  967.     cmp.b    #' ',d1
  968.     bhs    btl_hex_check_alternate_char
  969.  
  970. btl_hex_ctrl_char:
  971.     move.b    #31,d0                ; replace by ctrl char symbol
  972.     cmp.b    #DUMP_MODE_ALL_CHARS,_vsh_dump_mode    ; dump all chars ?
  973.     beq    btl_hex_insert_ascii
  974.     move.b    #'.',d0                ; replace by '.' char
  975.     bra    btl_hex_insert_ascii
  976.  
  977. btl_hex_check_alternate_char:
  978.     cmp.b    #'~',d0                ; check if ASCII char
  979.     bls    btl_hex_insert_ascii
  980.     cmp.b    #DUMP_MODE_ASCII_CHARS,_vsh_dump_mode    ; dump only ASCII chars ?
  981.     bne    btl_hex_insert_ascii
  982.     move.b    #'.',d0                ; replace by '.' char
  983.  
  984. btl_hex_insert_ascii:
  985.     move.b    d0,(a6,d3.w)            ; write ASCII char
  986.     addq.w    #1,d3
  987.     dbra    d2,btl_hex_loop            ; next hex byte
  988.     cmp.w    #MAX_HEX_LONG_WORDS*4,d3    ; line completely filled ?
  989.     blo    btl_hex_fill_line
  990.     lea    (a6,d3.w),a1            ; get end of line
  991.     move.b    #'"',(a1)+
  992.     bra    btl_exit
  993.  
  994. btl_hex_fill_line:
  995.     moveq    #' ',d0
  996.     move.l    a6,d1                ; calc num of spaces to fill
  997.     sub.l    a1,d1
  998.     subq.l    #2,d1
  999.  
  1000. btl_hex_fill_loop1:                ; fill with spaces
  1001.     move.b    d0,(a1)+
  1002.     dbra    d1,btl_hex_fill_loop1
  1003.     lea    (a6,d3.w),a1
  1004.     move.b    #'"',(a1)+
  1005.  
  1006. btl_hex_fill_loop2:                ; fill with spaces
  1007.     move.b    d0,(a1)+
  1008.     addq.w    #1,d3
  1009.     cmp.w    #MAX_HEX_LONG_WORDS*4,d3
  1010.     blo    btl_hex_fill_loop2
  1011.     bra    btl_exit
  1012.  
  1013. ****************************************************************************
  1014.  
  1015. btl_ascii_loop:
  1016.     move.b    (a0)+,d0            ; get char from buffer
  1017.     beq    btl_ascii_ctrl_char
  1018.  
  1019. btl_ascii_tab:
  1020.     cmp.b    #9,d0                ; tab ?
  1021.     bne    btl_ascii_check_ctrl_char
  1022.     move.b    #' ',d0                ; default tabskip = 8
  1023.     move.w    d3,d1                ; calc num of spaces to fill
  1024.     not.w    d1
  1025.     and.w    #7,d1
  1026.  
  1027. btl_ascii_tab_loop:
  1028.     move.b    d0,(a1)+            ; expand tab to spaces
  1029.     addq.w    #1,d3
  1030.     tst.w    d4                ; max line len given ?
  1031.     beq    btl_ascii_tab_no_max_line_len
  1032.     cmp.w    d4,d3                ; end of line ?
  1033.     bhi    btl_exit
  1034.  
  1035. btl_ascii_tab_no_max_line_len:
  1036.     dbra    d1,btl_ascii_tab_loop
  1037.     bra    btl_ascii_next
  1038.  
  1039. btl_ascii_check_ctrl_char:
  1040.     move.b    d0,d1                ; check for ctrl chars
  1041.     bclr    #7,d1
  1042.     cmp.b    #' ',d1
  1043.     bhs    btl_ascii_check_alternate_char
  1044.  
  1045. btl_ascii_ctrl_char:
  1046.     moveq    #31,d0                ; replace by ctrl char symbol
  1047.     cmp.b    #DUMP_MODE_ALL_CHARS,_vsh_dump_mode    ; dump all chars ?
  1048.     beq    btl_ascii_insert_ascii
  1049.     move.b    #'.',d0                ; replace by '.' char
  1050.     bra    btl_ascii_insert_ascii
  1051.  
  1052. btl_ascii_check_alternate_char:
  1053.     cmp.b    #'~',d0                ; check if ASCII char
  1054.     bls    btl_ascii_insert_ascii
  1055.     cmp.b    #DUMP_MODE_ASCII_CHARS,_vsh_dump_mode    ; dump only ASCII chars ?
  1056.     bne    btl_ascii_insert_ascii
  1057.     move.b    #'.',d0                ; replace by '.' char
  1058.  
  1059. btl_ascii_insert_ascii:
  1060.     move.b    d0,(a1)+            ; copy normal char
  1061.     addq.w    #1,d3
  1062.  
  1063. btl_ascii_next:
  1064.     dbra    d2,btl_ascii_loop        ; next ASCII byte
  1065.  
  1066. btl_ascii_fill_line:
  1067.     tst.w    d4                ; max line len given ?
  1068.     beq    btl_exit
  1069.     cmp.w    d4,d3                ; line completely filled ?
  1070.     bhi    btl_exit
  1071.     move.w    d4,d1                ; calc num of spaces to fill
  1072.     sub.w    d3,d1
  1073.     moveq    #' ',d0
  1074.  
  1075. btl_ascii_fill_loop:
  1076.     move.b    d0,(a1)+            ; fill rest of line with spaces
  1077.     dbra    d1,btl_ascii_fill_loop
  1078.  
  1079. btl_exit:
  1080.     clr.b    (a1)                ; set end of string
  1081.     rts
  1082.  
  1083. ;---------------------------------------------------------------------------
  1084. ; Input: d0.l = binary number
  1085. ;     d1.w = num of hex digits
  1086. ;     a1   = buffer ptr
  1087. ; Convert binary number to ASCII digits representing the hex value
  1088. ;---------------------------------------------------------------------------
  1089. bin_to_hex:
  1090.     PUSH    d0/d2/d3
  1091.     move.w    d1,d3                ; save num of hex digits
  1092.     subq.w    #1,d1                ; dec digit counter for dbra
  1093.  
  1094. bth_loop:
  1095.     move.b    d0,d2
  1096.     and.b    #15,d2                ; mask lower nibble
  1097.     cmp.b    #9,d2
  1098.     bhi    1$
  1099.     add.b    #'0',d2
  1100.     bra    bth_write_nibble
  1101.  
  1102. 1$:
  1103.     add.b    #'A'-10,d2
  1104.  
  1105. bth_write_nibble:
  1106.     move.b    d2,(a1,d1.w)            ; write size char to buffer
  1107.     asr.l    #4,d0                ; next nibble
  1108.     dbra    d1,bth_loop
  1109.     add.w    d3,a1                ; set new buffer ptr
  1110.     PULL    d0/d2/d3
  1111.     rts
  1112.  
  1113. ;---------------------------------------------------------------------------
  1114. ; VOID hcomp_vreq_line(vreq, line)
  1115. ;            a0    d0
  1116. ;    struct ViewRequest  *vreq
  1117. ;    USHORT line
  1118. ; Highlight or de-highlight selected line in viewrequester
  1119. ;---------------------------------------------------------------------------
  1120. _hcomp_vreq_line:
  1121.     PUSH    d2-d3/a2-a3/a6
  1122.  
  1123.     tst.b    _show_flag            ; hidden display ?
  1124.     beq    hvl_exit    
  1125.     move.l    a0,a2                ; a2 := vreq
  1126.     move.w    d0,d2                ; d2 := line
  1127.  
  1128.     ; --- set draw mode
  1129.     move.l    _con_rport,a3            ; rastport
  1130.     move.l    _GfxBase,a6
  1131.     moveq    #RP_COMPLEMENT,d0        ; draw mode
  1132.     move.l    a3,a1
  1133.     CALLSYS    SetDrMd
  1134.  
  1135.     ; --- init some regs
  1136.     moveq    #0,d0
  1137.     move.w    vr_Display+d_LeftEdge(a2),d0    ; x1
  1138.     move.w    vr_Display+d_TopEdge(a2),d1
  1139.     lsl.w    #3,d2                ; d2 * 8
  1140.     add.w    d2,d1                ; y1
  1141.     cmp.w    #VIEW_MODE_HEX,vr_Mode(a2)    ; hex dump ?
  1142.     beq    hvl_hex_dump
  1143.  
  1144. hvl_ascii_dump:
  1145.     move.w    vr_Display+d_Width(a2),d2
  1146.     bra    hvl_calc_width
  1147.  
  1148. hvl_hex_dump:
  1149.     move.w    #(9+MAX_HEX_LONG_WORDS*9+2+MAX_HEX_LONG_WORDS*4+1)*8,d2
  1150.  
  1151. hvl_calc_width:
  1152.     add.w    d0,d2                ; x2
  1153.     subq.w    #1,d2
  1154.     move.w    d1,d3
  1155.     addq.w    #8-1,d3                ; y2
  1156.     move.l    a3,a1
  1157.     CALLSYS    RectFill
  1158.  
  1159.     moveq    #RP_JAM2,d0            ; draw mode
  1160.     move.l    a3,a1
  1161.     CALLSYS    SetDrMd
  1162.  
  1163. hvl_exit:
  1164.     PULL    d2-d3/a2-a3/a6
  1165.     rts
  1166.  
  1167. ;---------------------------------------------------------------------------
  1168. ; VOID scroll_view_req()
  1169. ; Scroll line list of viewed text
  1170. ;---------------------------------------------------------------------------
  1171. _scroll_view_req:
  1172.     PUSH    d2-d7/a2-a3/a6            ; save regs for scrolling routines
  1173.  
  1174.     lea    _view_req,a2            ; a2 := view req ptr
  1175.     tst.b    _scroll_flag            ; check scroll flag
  1176.     beq    svr_exit
  1177.     moveq    #0,d0                ; num of entries > visible lines ?
  1178.     move.w    vr_Display+d_VisibleLines(a2),d0
  1179.     cmp.l    vr_Display+d_NumEntries(a2),d0
  1180.     bhs    svr_exit
  1181.  
  1182. svr_auto_repeat_loop:
  1183.     move.l    _GfxBase,a6
  1184.     move.b    _scroll_flag,d1
  1185.     bclr    #7,d1                ; top or bottom ?
  1186.     bne    svr_scroll_all
  1187.     moveq    #1,d7                ; scroll count = 1
  1188.     bclr    #6,d1                ; page up or down ?
  1189.     beq    svr_scroll_part
  1190.     move.w    vr_Display+d_VisibleLines(a2),d7    ; scroll count = lines
  1191.  
  1192. svr_scroll_part:
  1193.     bclr    #0,d1                ; scroll up ?
  1194.     bne    svr_scroll_part_up
  1195.     bclr    #1,d1                ; scroll down ?
  1196.     beq    svr_exit
  1197.  
  1198. svr_scroll_part_down:
  1199.     bsr    scroll_vreq_down
  1200.     bra    svr_print_vreq_status
  1201.  
  1202. svr_scroll_part_up:
  1203.     bsr    scroll_vreq_up
  1204.     bra    svr_print_vreq_status
  1205.  
  1206. svr_scroll_all:
  1207.     move.l    vr_Display+d_List(a2),a0    ; a0 := line list ptr
  1208.     btst    #0,d1                ; scroll up ?
  1209.     beq    svr_scroll_all_down
  1210.  
  1211. svr_scroll_all_up:
  1212.     move.l    MLH_HEAD(a0),a0
  1213.     bra    svr_scroll_all_print
  1214.  
  1215. svr_scroll_all_down:
  1216.     move.l    MLH_TAILPRED(a0),a0
  1217.     move.w    vr_Display+d_VisibleLines(a2),d0    ; reload line count
  1218.     subq.w    #2,d0                ; dec line count for dbra
  1219.  
  1220. 1$:
  1221.     move.l    MLN_PRED(a0),a0
  1222.     dbra    d0,1$
  1223.  
  1224. svr_scroll_all_print:
  1225.     move.l    a0,vr_Display+d_FirstVisibleNode(a2)
  1226.     move.l    a0,a1                    ; a1 := node
  1227.     move.l    a2,a0                    ; a0 := vreq
  1228.     moveq    #0,d0                    ; d0 := line
  1229.     move.w    vr_Display+d_VisibleLines(a2),d1    ; d1 := count
  1230.     jsr    _print_vreq_lines            ; print whole page
  1231.  
  1232. svr_print_vreq_status:
  1233.     move.l    a2,a0                ; a0 := vreq
  1234.     jsr    _print_vreq_status        ; print new status
  1235.  
  1236. svr_check_auto_repeat:
  1237.     cmp.b    #SCROLL_SPEED_FAST,_vsh_scroll_speed    ; fast scrolling ?
  1238.     bne    svr_exit
  1239.     tst.b    _auto_repeat            ; auto_repeat ?
  1240.     beq    svr_exit
  1241.     tst.b    _scroll_flag            ; check scroll flag
  1242.     bne    svr_auto_repeat_loop
  1243.  
  1244. svr_exit:
  1245.     PULL    d2-d7/a2-a3/a6
  1246.     rts
  1247.  
  1248. ;---------------------------------------------------------------------------
  1249. ; Input :  a2   = vreq ptr
  1250. ;       a6   = GfxBase
  1251. ;       d7.w = scroll count
  1252. ; Scroll text of typed file count times up
  1253. ;---------------------------------------------------------------------------
  1254. scroll_vreq_up:
  1255.     move.l    vr_Display+d_FirstVisibleNode(a2),a3
  1256.     cmp.l    #1,ln_Pos(a3)            ; alreday at top ?
  1257.     beq    svu_exit
  1258.     move.w    d7,d0                ; d0 := scroll count
  1259.     subq.w    #1,d0                ; dec count for dbra
  1260.  
  1261. svu_loop:
  1262.     cmp.l    #1,ln_Pos(a3)            ; top reached ?
  1263.     beq    svu_check_count
  1264.     move.l    MLN_PRED(a3),a3            ; get previous node
  1265.     dbra    d0,svu_loop
  1266.  
  1267. svu_check_count:
  1268.     cmp.w    #1,d7                ; paging ?
  1269.     bhi    svu_paging
  1270.  
  1271. svu_init_scroll:
  1272.     move.l    _con_rport,a0            ; source rport
  1273.     move.l    a0,a1                ; dest rport
  1274.     move.w    fr_Display+d_LeftEdge(a2),d0    ; x1
  1275.     move.w    fr_Display+d_TopEdge(a2),d1    ; y1
  1276.     move.w    d1,d3                ; y2
  1277.     move.w    d0,d2                ; x2
  1278.     move.w    fr_Display+d_Width(a2),d4    ; width
  1279.     move.w    fr_Display+d_VisibleLines(a2),d5
  1280.     lsl.w    #3,d5                ; height
  1281.     move.w    #$0c0,d6            ; minterm
  1282.     cmp.b    #SCROLL_SPEED_SLOW,_vsh_scroll_speed
  1283.     beq    svu_scroll_slow
  1284.  
  1285. svu_scroll_normal:
  1286.     addq.w    #8,d3                ; y2
  1287.     subq.w    #8,d5                ; height
  1288.     CALLSYS    ClipBlit            ; scroll one entry up
  1289.     bra    svu_paging
  1290.  
  1291. svu_scroll_slow:
  1292.     PUSH    d7
  1293.     subq.w    #1,d1                ; y1
  1294.     moveq    #8-1,d7                ; d7 := count
  1295.  
  1296. 1$:
  1297.     movem.w    d0-d6,-(sp)
  1298.     PUSH    a0-a1
  1299.     CALLSYS    ClipBlit            ; scroll one scanline up
  1300.     PULL    a0-a1
  1301.     movem.w    (sp)+,d0-d6
  1302.     dbra    d7,1$
  1303.     PULL    d7
  1304.  
  1305. svu_paging:
  1306.     move.l    a2,a0                ; a0 := vreq
  1307.     move.l    a3,a1                ; a1 := node
  1308.     moveq    #0,d0                ; d0 := line
  1309.     move.w    d7,d1                ; d1 := count
  1310.     jsr    _print_vreq_lines        ; print first line
  1311.     move.l    a3,vr_Display+d_FirstVisibleNode(a2)
  1312.  
  1313. svu_exit:
  1314.     rts
  1315.  
  1316. ;---------------------------------------------------------------------------
  1317. ; Input :  a2   = vreq ptr
  1318. ;       a6   = GfxBase
  1319. ;       d7.w = scroll count
  1320. ; Scroll text of typed file count times down
  1321. ;---------------------------------------------------------------------------
  1322. scroll_vreq_down:
  1323.     moveq    #0,d2
  1324.     move.w    vr_Display+d_VisibleLines(a2),d2    ; d2 := visible lines
  1325.     move.l    vr_Display+d_NumEntries(a2),d3        ; d3 := number of entries
  1326.     move.l    vr_Display+d_FirstVisibleNode(a2),a3
  1327.     move.l    ln_Pos(a3),d1            ; already at bottom ?
  1328.     add.l    d2,d1
  1329.     cmp.l    d3,d1
  1330.     bhi    svd_exit
  1331.     move.w    d7,d0                ; d0 := scroll count
  1332.     subq.w    #1,d0                ; dec count for dbra
  1333.  
  1334. svd_loop:
  1335.     move.l    ln_Pos(a3),d1            ; bottom reached ?
  1336.     add.l    d2,d1
  1337.     cmp.l    d3,d1
  1338.     bhi    svd_check_count
  1339.     move.l    MLN_SUCC(a3),a3            ; get next node
  1340.     dbra    d0,svd_loop
  1341.  
  1342. svd_check_count:
  1343.     cmp.w    #1,d7                ; paging ?
  1344.     bhi    svd_paging
  1345.  
  1346. svd_init_scroll:
  1347.     move.l    _con_rport,a0            ; source rport
  1348.     move.l    a0,a1                ; dest rport
  1349.     move.w    fr_Display+d_LeftEdge(a2),d0    ; x1
  1350.     move.w    fr_Display+d_TopEdge(a2),d1    ; y1
  1351.     move.w    d1,d3                ; y2
  1352.     move.w    d0,d2                ; x2
  1353.     move.w    fr_Display+d_Width(a2),d4    ; width
  1354.     move.w    fr_Display+d_VisibleLines(a2),d5
  1355.     lsl.w    #3,d5                ; height
  1356.     move.w    #$0c0,d6            ; minterm
  1357.     cmp.b    #SCROLL_SPEED_SLOW,_vsh_scroll_speed
  1358.     beq    svd_scroll_slow
  1359.  
  1360. svd_scroll_normal:
  1361.     addq.w    #8,d1                ; y1
  1362.     subq.w    #8,d5                ; height
  1363.     CALLSYS    ClipBlit            ; scroll one entry up
  1364.     bra    svd_scroll_end
  1365.  
  1366. svd_scroll_slow:
  1367.     PUSH    d7
  1368.     addq.w    #1,d1                ; y1
  1369.     moveq    #8-1,d7                ; d7 := count
  1370.  
  1371. 1$:
  1372.     movem.w    d0-d6,-(sp)
  1373.     PUSH    a0-a1
  1374.     CALLSYS    ClipBlit            ; scroll one scanline up
  1375.     PULL    a0-a1
  1376.     movem.w    (sp)+,d0-d6
  1377.     dbra    d7,1$
  1378.     PULL    d7
  1379.  
  1380. svd_scroll_end:
  1381.     move.l    a3,a1                ; a1 := node
  1382.     move.w    vr_Display+d_VisibleLines(a2),d0
  1383.     subq.w    #1,d0                ; d0 := line
  1384.     move.w    d0,d1
  1385.     subq.w    #1,d1                ; dec line num for dbra
  1386.  
  1387. svd_get_last_line:
  1388.     move.l    MLN_SUCC(a1),a1            ; get next node
  1389.     dbra    d1,svd_get_last_line
  1390.     moveq    #1,d1                ; d1 := count
  1391.     bra    svd_print
  1392.  
  1393. svd_paging:
  1394.     moveq    #0,d0                ; d0 := line
  1395.     move.w    d7,d1                ; d1 := count
  1396.     move.l    a3,a1                ; a1 := node
  1397.  
  1398. svd_print:
  1399.     move.l    a2,a0                ; a0 := vreq
  1400.     jsr    _print_vreq_lines        ; print first line
  1401.     move.l    a3,vr_Display+d_FirstVisibleNode(a2)
  1402.  
  1403. svd_exit:
  1404.     rts
  1405.  
  1406. ;---------------------------------------------------------------------------
  1407. ; VOID print_quick_view_lines(freq, buffer, len)
  1408. ;                   a0     a1    d0
  1409. ;    struct FileRequest  *freq
  1410. ;    BYTE   *buffer
  1411. ;    USHORT len
  1412. ; Print quick view lines from buffer to specified file requester
  1413. ;---------------------------------------------------------------------------
  1414. _print_quick_view_lines:
  1415.     PUSH    d2-d6/a2-a3/a5-a6
  1416.  
  1417.     tst.b    _show_flag            ; hidden display ?
  1418.     beq    pqvl_exit
  1419.  
  1420.     ; --- init some regs
  1421.     move.l    a0,a2                ; a2 := freq
  1422.     move.l    a1,a3                ; a3 := buffer ptr
  1423.     move.w    d0,d3                ; d3 := len
  1424.     move.l    _con_rport,a5            ; a5 := rast port
  1425.     move.l    _GfxBase,a6
  1426.  
  1427.     ; --- set draw mode and colors
  1428.     moveq    #RP_JAM2,d0            ; draw mode
  1429.     move.l    a5,a1
  1430.     CALLSYS    SetDrMd
  1431.  
  1432.     moveq    #COLOR1,d0            ; front color
  1433.     move.l    a5,a1
  1434.     CALLSYS    SetAPen
  1435.  
  1436.     moveq    #COLOR0,d0            ; back color
  1437.     move.l    a5,a1
  1438.     CALLSYS    SetBPen
  1439.  
  1440.     ; --- init line buffer
  1441.     moveq    #0,d2                ; d2 := line counter
  1442.     tst.w    d3                ; len == 0 ?
  1443.     beq    pqvl_clear
  1444.     lea    _line1_buffer,a5
  1445.     move.b    #' ',d0                ; insert delimiters in line buffer for hex dump
  1446.     move.b    d0,8(a5)
  1447.     move.b    d0,8+1*9(a5)
  1448.     move.b    d0,8+2*9(a5)
  1449.     lea    MAX_QVIEW_LONG_WORDS*9(a5),a6    ; a6 := ASCII chars for hex dump
  1450.     clr.b    MAX_QVIEW_LONG_WORDS*4(a6)    ; mark end of string
  1451.  
  1452. pqvl_print_loop:
  1453.     move.l    a5,a1                ; a1 := dest ptr
  1454.     moveq    #0,d4                ; reset char counter
  1455.     moveq    #MAX_QVIEW_LONG_WORDS*4-1,d5    ; d5 := num of bytes in line - 1
  1456.     moveq    #4,d6                ; load byte counter for first long word
  1457.  
  1458. pqvl_line_loop:
  1459.     tst.w    d3                ; end of text ?
  1460.     beq    pqvl_end_of_line
  1461.     move.b    (a3)+,d0            ; get byte from buffer
  1462.     subq.w    #1,d3                ; dec len
  1463.  
  1464. pqvl_insert_hex_byte:
  1465.     moveq    #2,d1
  1466.     bsr    bin_to_hex            ; convert to hex
  1467.     subq.w    #1,d6                ; dec byte counter for long word
  1468.     bne    pqvl_check_ctrl_char
  1469.     moveq    #4,d6                ; load byte counter for next long word
  1470.     add.l    #1,a1                ; start of next long word -> space as delimiter
  1471.  
  1472. pqvl_check_ctrl_char:
  1473.     move.b    d0,d1                ; check for ctrl chars
  1474.     bclr    #7,d1
  1475.     cmp.b    #' ',d1
  1476.     bhs    pqvl_check_alternate_char
  1477.  
  1478. pqvl_ctrl_char:
  1479.     moveq    #31,d0                ; replace by ctrl char symbol
  1480.     cmp.b    #DUMP_MODE_ALL_CHARS,_vsh_dump_mode    ; dump all chars ?
  1481.     beq    pqvl_insert_ascii
  1482.     move.b    #'.',d0                ; replace by '.' char
  1483.     bra    pqvl_insert_ascii
  1484.  
  1485. pqvl_check_alternate_char:
  1486.     cmp.b    #'~',d0                ; check if ASCII char
  1487.     bls    pqvl_insert_ascii
  1488.     cmp.b    #DUMP_MODE_ASCII_CHARS,_vsh_dump_mode    ; dump only ASCII chars ?
  1489.     bne    pqvl_insert_ascii
  1490.     move.b    #'.',d0                ; replace by '.' char
  1491.  
  1492. pqvl_insert_ascii:
  1493.     move.b    d0,(a6,d4.w)            ; write ASCII char
  1494.     addq.w    #1,d4
  1495.     dbra    d5,pqvl_line_loop        ; next hex byte
  1496.  
  1497. pqvl_end_of_line:
  1498.     cmp.w    #MAX_QVIEW_LONG_WORDS*4,d4    ; line completely filled ?
  1499.     bhs    pqvl_print_line
  1500.  
  1501. pqvl_fill_line:
  1502.     moveq    #' ',d0
  1503.     move.l    a6,d1                ; calc num of spaces to fill
  1504.     sub.l    a1,d1
  1505.     subq.l    #2,d1
  1506.  
  1507. pqvl_fill_loop1:                ; fill with spaces
  1508.     move.b    d0,(a1)+
  1509.     dbra    d1,pqvl_fill_loop1
  1510.     lea    (a6,d4.w),a1
  1511.  
  1512. pqvl_fill_loop2:                ; fill with spaces
  1513.     move.b    d0,(a1)+
  1514.     addq.w    #1,d4
  1515.     cmp.w    #MAX_QVIEW_LONG_WORDS*4,d4
  1516.     blo    pqvl_fill_loop2
  1517.  
  1518. pqvl_print_line:
  1519.     move.l    a5,a0                ; text
  1520.     move.w    fr_Display+d_LeftEdge(a2),d0    ; x
  1521.     move.w    d2,d1
  1522.     lsl.w    #3,d1                ; d0 * 8
  1523.     add.w    fr_Display+d_TopEdge(a2),d1    ; y
  1524.     bsr    write_text
  1525.  
  1526.     addq.w    #1,d2                ; inc line
  1527.     tst.w    d3                ; end of text ?
  1528.     bne    pqvl_print_loop
  1529.     cmp.w    fr_Display+d_VisibleLines(a2),d2    ; last line ?
  1530.     bhs    pqvl_exit
  1531.  
  1532. pqvl_clear:
  1533.     ; --- clear empty area
  1534.     move.l    _con_rport,a5            ; a5 := rast port
  1535.     move.l    _GfxBase,a6
  1536.  
  1537.     moveq    #COLOR0,d0            ; fill color
  1538.     move.l    a5,a1
  1539.     CALLSYS    SetAPen
  1540.  
  1541.     move.w    fr_Display+d_LeftEdge(a2),d0    ; x1
  1542.     move.w    d2,d1
  1543.     lsl.w    #3,d1                ; d1 * 8
  1544.     add.w    fr_Display+d_TopEdge(a2),d1    ; y1
  1545.     move.w    fr_Display+d_VisibleLines(a2),d3
  1546.     sub.w    d2,d3
  1547.     lsl.w    #3,d3                ; d3 * 8
  1548.     add.w    d1,d3                ; y2
  1549.     move.w    d0,d2
  1550.     add.w    #MAX_FREQ_LINE_WIDTH,d2        ; x2
  1551.     move.l    a5,a1
  1552.     CALLSYS    RectFill
  1553.  
  1554. pqvl_exit:
  1555.     PULL    d2-d6/a2-a3/a5-a6
  1556.     rts
  1557.