Subversion Repositories Kolibri OS

Rev

Rev 529 | Go to most recent revision | Blame | Last modification | View Log | Download | RSS feed

  1. ;    IMGVIEW.ASM
  2. ;
  3. ;    This program displays jpeg images. The window can be resized.
  4. ;
  5. ;    Version 0.0    END OF 2003
  6. ;                   Octavio Vega
  7. ;    Version 0.1    7th March 2004
  8. ;                   Mike Hibbett ( very small part! )
  9. ;    Version 0.11   7th April 2004
  10. ;                   Ville Turjanmaa ( 'set_as_bgr' function )
  11. ;    Version 0.12   29th May 2004
  12. ;                   Ivan Poddubny (correct "set_as_bgr"+parameters+boot+...)
  13. ;    Version 0.12   30 de mayo 2004
  14. ;                   Octavio Vega
  15. ;                   bugs correction and slideshow
  16. ;    version 0.13   3 de junio 2004
  17. ;                   Octavio Vega
  18. ;                   unos retoques
  19. ;    version 0.14   10th August 2004
  20. ;                   Mike Hibbett Added setting default colours
  21. ;    version 0.15   24th August 2006
  22. ;                   diamond (rewritten to function 70)
  23. ;    version 0.16   19th May 2007
  24. ;                   Mario79
  25. ;                   1) correction for changed function 15,
  26. ;                   2) use monochrome background if free memory there are less than 2 MB
  27. ;                   3) use COL0 - COL9 boot parameter
  28. ;                   0=black,1=white,2=green,3=lilas,4=grey
  29. ;                   5=light-blue,6=blue,7=salad,8=pink,9=yellow
  30.                  
  31.                memsize=20000h
  32.                org 0
  33.  PARAMS     =    memsize - 1024
  34.  
  35. appname equ 'Jpegview '
  36. version equ '0.16'
  37.  
  38. use32
  39.  
  40.                db     'MENUET01'              ; 8 byte id
  41.                dd     0x01                    ; header version
  42.                dd     START                   ; start of code
  43.                dd     I_END                   ; size of image
  44.                dd     memsize                 ; memory for app
  45.                dd     memsize - 1024           ; esp
  46.                dd     PARAMS , 0x0               ; I_Param , I_Icon
  47.  
  48. stack_size=4096 + 1024
  49.  
  50. include '..\..\..\macros.inc'
  51.  
  52. START:                          ; start of execution
  53.  
  54.     cmp     [PARAMS], byte 0
  55.     jne     check_parameters
  56.  
  57.     ; Calculate the 'free' memory available
  58.     ; to the application, and create the malloc block from it
  59.   .l1:
  60.     mov     ecx,memsize-fin-stack_size
  61.     mov     edi,fin
  62.     call    add_mem
  63.  
  64.     call    colorprecalc ;inicializa tablas usadas para pasar de ybr a bgr
  65.     call    draw_window
  66.     call    read_string.rs_done
  67.  
  68. still:
  69.     push still
  70.     mov ebx,100                ;1 second
  71.     mov  eax,23                 ; wait here for event
  72.     mcall
  73.     cmp  eax,1                  ; redraw request ?
  74.     je   draw_window
  75.     cmp  eax,2                  ; key in buffer ?
  76.     je   read_string
  77.     cmp  eax,3                  ; button in buffer ?
  78.     je   button
  79.     jmp display_next
  80.  
  81. button:                       ; BUTTON
  82.     mov  eax,17
  83.     mcall
  84.     cmp ah,3
  85.     je set_as_bgr2
  86.     cmp ah,2
  87.     je slideshow
  88.     cmp  ah,1                   ; CLOSE PROGRAM
  89.     jne  close_program.exit
  90. close_program:
  91.     mov  eax,-1
  92.     mcall
  93.   .exit:
  94.     ret
  95.  
  96.    ; Put a 'chunk' of the image on the window
  97. put_image:
  98.     pushad
  99.  
  100.     lea ebp,[edx+eax+7]
  101.     cmp  [winxs],bp
  102.     jc     .l1
  103.     lea ebp,[ecx+ebx+20+2+17]
  104.     cmp [winys],bp
  105.     jc     .l1
  106.  
  107.     add     eax,2  ; offset for boarder
  108.     add     ebx,2 ; offset for title bar
  109.     push    ax ; pox
  110.     push    bx ; pos
  111.     push    cx ; size
  112.     push    dx ; size
  113.     pop     ecx
  114.     pop     edx
  115.     mov     ebx,edi
  116.     mov     eax,7
  117.  
  118.     mcall                         ; Put image function
  119. .l1:
  120.     popad
  121.     ret
  122.  
  123.  
  124.  
  125. ;******************************************************************************
  126.  
  127. check_parameters:
  128.     cmp     [PARAMS], dword "BOOT" ; received BOOT parameter -> goto handler
  129.     je      boot_set_background
  130.     cmp     [PARAMS], word "CO"
  131.     jne     @f
  132.     cmp     [PARAMS+2], byte "L"
  133.     je      boot_set_background    
  134. @@:
  135.         cmp     byte [PARAMS], 1
  136.         jz      ipc_service
  137.     mov     edi, name_string       ; clear string with file name
  138.     mov     al,  0
  139.     mov     ecx, 100
  140.     rep     stosb
  141.  
  142.     mov     ecx, 100               ; calculate length of parameter string
  143.     mov     edi, PARAMS
  144.     repne   scasb
  145.     sub     edi, PARAMS
  146.     mov     ecx, edi
  147.  
  148.     mov     esi, PARAMS            ; copy parameters to file name
  149.     mov     edi, name_string
  150.     cld
  151.     rep     movsb
  152.  
  153.     jmp     START.l1       ; return to beggining of the progra
  154.  
  155. ;******************************************************************************
  156. boot_set_background:
  157.     mcall 18,16
  158.     cmp   eax,1024*2
  159.     jb    set_mono
  160.     mov     ecx,memsize-fin-stack_size  ; size
  161.     mov     edi,fin                     ; pointer
  162.     call    add_mem             ; mark memory from fin to 0x100000-1024 as free
  163.     call    colorprecalc        ; calculate colors
  164.     mov     esi,name_string
  165.     call    open
  166.     test    eax,eax
  167.     jz      close_program
  168.     call    jpeg_info
  169.     mov dword [jpeg_st],ebp
  170.     call    set_as_bgr2         ; set wallpaper
  171.     jmp     close_program       ; close the program right now
  172.  
  173. ;******************************************************************************
  174. set_mono:
  175.     mov     eax, 15
  176.     mov     ebx, 1
  177.     mov     ecx, 1
  178.     mov     edx, 1
  179.     mcall
  180.  
  181.     cmp     [PARAMS], dword "BOOT" ; received BOOT parameter -> goto handler
  182.     jne     @f
  183. .green:
  184.     mov     ecx,mono+6
  185.     jmp     .set
  186. @@:
  187. ;    cmp     [PARAMS], word "CO" ; received BOOT parameter -> goto handler
  188. ;    jne     .green
  189.     xor     ecx,ecx
  190.     mov     cl,[PARAMS+3]
  191.     sub     cl,0x30
  192.     cmp     ecx,0
  193.     jb      .green
  194.     cmp     ecx,9    
  195.     ja      .green
  196.     imul    ecx,3
  197.     add     ecx,mono
  198. .set:
  199.     mcall   15,5, ,0,3
  200.  
  201.     ; Stretch the image to fit
  202.     mov     eax, 15
  203.     mov     ebx, 4
  204.     mov     ecx, 1
  205.     mcall
  206.  
  207.     mov     eax, 15
  208.     mov     ebx, 3
  209.     mcall
  210.     jmp     close_program
  211.    
  212. mono:
  213.     db 0,0,0       ; black
  214.     db 255,255,255 ; white
  215.     db 128,128,0   ; green
  216.     db 240,202,166 ; lilas
  217.     db 192,192,192 ; grey
  218.     db 255,255,0   ; light-blue
  219.     db 255,0,0     ; blue
  220.     db 192,220,192 ; salad
  221.     db 255,0,255   ; pink
  222.     db 0,255,255   ; yellow
  223. ;******************************************************************************
  224.  
  225. set_as_bgr2:
  226.     mov ebp,dword[jpeg_st]
  227.     test    ebp,ebp
  228.     jz      .end
  229.    
  230.     mov     eax, 15
  231.     mov     ebx, 1
  232.     mov     ecx, [ebp + x_size]
  233.     mov     edx, [ebp + y_size]
  234.     mcall
  235.  
  236.     mov     dword [ebp+draw_ptr],put_chunk_to_bgr
  237.     call    jpeg_display
  238.  
  239.     ; Stretch the image to fit
  240.     mov     eax, 15
  241.     mov     ebx, 4
  242.     mov     ecx, 2
  243.     mcall
  244.  
  245.     mov     eax, 15
  246.     mov     ebx, 3
  247.     mcall
  248.  
  249.  
  250.  .end:
  251.     ret
  252.  
  253. ;******************************************************************************
  254.  
  255. ipc_service:
  256.         mcall   68, 11
  257.         mov     esi, PARAMS+1
  258.         xor     eax, eax
  259.         xor     ecx, ecx
  260. @@:
  261.         lodsb
  262.         test    al, al
  263.         jz      @f
  264.         lea     ecx, [ecx*5]
  265.         lea     ecx, [ecx*2+eax-'0']
  266.         jmp     @b
  267. @@:
  268.         add     ecx, 16
  269.         mov     edx, ecx
  270.         mcall   68, 12
  271.         test    eax, eax
  272.         jnz     @f
  273. .exit:
  274.         mcall   -1
  275. @@:
  276.         mov     ecx, eax
  277.         and     dword [ecx], 0
  278.         mov     dword [ecx+4], 8
  279.         mov     [ipc_mem], ecx
  280.         mcall   60, 1
  281.         mcall   40, 1 shl 6
  282.         mcall   23, 500         ; wait up to 5 seconds for IPC message
  283.         test    eax, eax
  284.         jz      .exit
  285. ; we got message with JPEG data, now decode it
  286.         mov     eax, [ecx+12]
  287.         mov     [ipc_mem_size], eax
  288. ; init JPEG decoder
  289.     mov     ecx,memsize-fin-stack_size  ; size
  290.     mov     edi,fin                     ; pointer
  291.     call    add_mem             ; mark memory from fin to 0x100000-1024 as free
  292.     call    colorprecalc        ; calculate colors
  293. ; hook file functions
  294.         mov     ecx, 4
  295.         call    malloc
  296.         and     dword [edi], 0
  297.         lea     eax, [edi-file_handler.position]
  298.         mov     byte [read], 0xE9
  299.         mov     dword [read+1], read_from_mem - (read+5)
  300. ; decode
  301.     call    jpeg_info
  302.     mov     dword [jpeg_st],ebp
  303.     test    ebp,ebp
  304.     jz      .end
  305.  
  306.         mov     eax, [ebp + x_size]
  307.         mul     dword [ebp + y_size]
  308.         lea     eax, [eax*3+8]
  309.         mov     ecx, eax
  310.         mcall   68, 12
  311.         test    eax, eax
  312.         jz      .end
  313.         mov     [ipc_mem_out], eax
  314.         mov     ebx, [ebp + x_size]
  315.         mov     [eax], ebx
  316.         mov     ebx, [ebp + y_size]
  317.         mov     [eax+4], ebx
  318.  
  319.     mov     dword [ebp+draw_ptr],put_chunk_to_mem
  320.     call    jpeg_display
  321.  
  322. ; IPC response
  323.         mov     esi, [ebp + x_size]
  324.         imul    esi, [ebp + y_size]
  325.         lea     esi, [esi*3+8]
  326.         mov     edx, [ipc_mem_out]
  327. .response:
  328.         mov     ecx, [ipc_mem]
  329.         mov     ecx, [ecx+8]
  330.         mcall   60,2
  331.  
  332.     jmp     close_program       ; close the program right now
  333.  
  334. .end:
  335.         mov     esi, 8
  336.         mov     edx, x_pointer  ; points to 2 null dwords
  337.         jmp     .response
  338.  
  339. read_from_mem:
  340. ; in: eax=handle, ecx=size, edi=pointer to buffer
  341. ; out: ecx=number of read bytes, buffer filled
  342.         pushad
  343.         mov     esi, [ipc_mem]
  344.         add     esi, 16
  345.         add     esi, [eax+file_handler.position]
  346.         add     ecx, [eax+file_handler.position]
  347.         cmp     ecx, [ipc_mem_size]
  348.         jb      @f
  349.         mov     ecx, [ipc_mem_size]
  350. @@:
  351.         sub     ecx, [eax+file_handler.position]
  352.         add     [eax+file_handler.position], ecx
  353.         rep     movsb
  354.         popad
  355.         ret
  356.  
  357. ;******************************************************************************
  358.  
  359. put_chunk_to_bgr:
  360.     pushad
  361.  
  362.     mov     [x_pointer], edi
  363.     mov     esi, ecx
  364.     imul    esi, 3
  365.     mov     [x_numofbytes], esi
  366.     mov     ecx, [ebp + x_size]
  367.     imul    ecx, ebx
  368.     add     ecx, eax
  369.     imul    ecx, 3
  370.     mov     [x_offset], ecx
  371.     mov     [x_counter], edx
  372.     mov     eax, [ebp + x_size]
  373.     imul    eax, 3
  374.     mov     [x_numofb2], eax
  375.  .new_string:
  376.     mov     eax, 15
  377.     mov     ebx, 5
  378.     mov     ecx, [x_pointer]
  379.     mov     edx, [x_offset]
  380.     mov     esi, [x_numofbytes]
  381.     mcall
  382.     mov     eax, [x_numofbytes]
  383.     add     [x_pointer], eax
  384.     mov     eax, [x_numofb2]
  385.     add     [x_offset], eax
  386.     dec     [x_counter]
  387.     jnz     .new_string
  388.  
  389.     popad
  390.     ret
  391.  
  392. ;******************************************************************************
  393.  
  394. put_chunk_to_mem:
  395. ; in: (eax,ebx) = start coordinates of chunk
  396. ;     (ecx,edx) = sizes of chunk
  397. ;     edi -> chunk data
  398.         push    esi edi edx
  399.         mov     esi, edi
  400.         mov     edi, ebx
  401.         imul    edi, [ebp + x_size]
  402.         add     edi, eax
  403.         lea     edi, [edi*3+8]
  404.         add     edi, [ipc_mem_out]
  405. @@:
  406.         push    ecx edi
  407.         lea     ecx, [ecx*3]
  408.         rep     movsb
  409.         pop     edi ecx
  410.         add     edi, [ebp + x_size]
  411.         add     edi, [ebp + x_size]
  412.         add     edi, [ebp + x_size]
  413.         dec     edx
  414.         jnz     @b
  415.         pop     edx edi esi
  416.         ret
  417.  
  418. ;******************************************************************************
  419.  
  420.  
  421.  
  422. ;   *********************************************
  423. ;   *******  WINDOW DEFINITIONS AND DRAW ********
  424. ;   *********************************************
  425.  
  426.  
  427. draw_window:
  428.  
  429.     mov  eax,48
  430.     mov  ebx,3
  431.     mov  ecx,sc
  432.     mov  edx,sizeof.system_colors
  433.     mcall
  434.  
  435.     mov  eax,12
  436.     mov  ebx,1
  437.     mcall
  438.  
  439.     ; Draw the window to the appropriate size - it may have
  440.     ; been resized by the user
  441.     cmp     [winxs], 0
  442.     jne     dw_001
  443.  
  444.     ; Give the screen some inital defaults
  445.     mov     [winxs], 400
  446.     mov     [winys], 300
  447.     mov     ax, 100
  448.     mov     [winxo], ax
  449.     mov     [winyo], ax
  450.     jmp     dw_002
  451.  
  452. dw_001:
  453.     mov     eax, 9
  454.     mov ebx, memsize - 1024
  455.     mov ecx, -1
  456.     mcall
  457.     mov     eax, [ebx + 34]
  458.     mov     [winxo], ax
  459.     mov     eax, [ebx + 38]
  460.     mov     [winyo], ax
  461.     mov     eax, [ebx + 42]
  462.     mov     [winxs], ax
  463.     mov     eax, [ebx + 46]
  464.     mov     [winys], ax
  465.  
  466. dw_002:
  467.         mov     ebx, dword [winxo-2]
  468.         mov     bx, [winxs]
  469.         mov     ecx, dword [winyo-2]
  470.         mov     cx, [winys]
  471.  
  472.     xor  eax,eax                   ; DRAW WINDOW
  473.     mov  edx,[sc.work]
  474.     or   edx,0x33000000
  475.     mov  edi,title                ; WINDOW LABEL
  476.     mcall
  477.  
  478.  
  479.     mov  eax,8                     ; BUTTON 2: slideshow
  480.     mov  ebx,57
  481.     mov  cx, [winys]
  482.     sub  cx, 39
  483.     shl  ecx, 16
  484.     add  ecx, 12
  485.     mov  esi, [sc.work_button]
  486.     mov  edx,2
  487.     mcall
  488.  
  489.     mov  eax,4                     ; Button text
  490.     movzx ebx, word [winys]
  491.     add   ebx, 3 shl 16 - 36
  492.     mov  ecx,[sc.work_button_text]
  493.     mov  edx,setname
  494.     mov  esi,setnamelen-setname
  495.     mcall
  496.  
  497.  
  498.     mov  eax,8                     ; BUTTON 3: set as background
  499.     mov  bx, [winxs]
  500.     sub  bx, 65
  501.     shl  ebx, 16
  502.     mov  bx,55
  503.     mov  cx, [winys]
  504.     sub  cx, 39
  505.     shl  ecx, 16
  506.     add  ecx, 12
  507.     mov  esi, [sc.work_button]
  508.     mov  edx,3
  509.     mcall
  510.  
  511.     mov  eax,4                     ; Button text
  512.     movzx ebx, word [winxs]
  513.     sub   ebx, 63
  514.     shl   ebx,16
  515.     mov   bx, word [winys]
  516.     sub   bx,36
  517.     mov  ecx,[sc.work_button_text]
  518.     mov  edx,setbgr
  519.     mov  esi,setbgrlen-setbgr
  520.     mcall
  521.     call    print_strings
  522.     call    load_image
  523.     mov     eax,12                    ; function 12:tell os about windowdraw
  524.     mov     ebx,2                     ; 2, end of draw
  525.     mcall
  526.  
  527.     ret
  528.  
  529.  
  530.  
  531.     ; Read in the image file name.
  532. read_string:
  533.     movzx edi,byte[name_string.cursor]
  534.     add     edi,name_string
  535.     mov     eax,2
  536.     mcall                        ; Get the key value
  537.     shr     eax,8
  538.     cmp     eax,13                      ; Return key ends input
  539.     je      .rs_done
  540.     cmp     eax,8
  541.     jnz     .nobsl
  542.     cmp     edi,name_string
  543.     je      .exit
  544.     dec     edi
  545.     mov     [edi],byte 0;'_'
  546.     dec     byte[name_string.cursor]
  547.     jmp     print_strings
  548. .exit:   ret
  549. .nobsl:
  550.     cmp     eax,31
  551.     jbe     .exit
  552.     cmp     eax,97
  553.     jb      .keyok
  554.     sub     eax,32
  555. .keyok:
  556.     mov ah,0
  557.     stosw
  558.     cmp edi,name_string.end
  559.     jnc print_strings
  560.     inc byte[name_string.cursor]
  561.     jmp    print_strings
  562. .rs_done:
  563.     call   print_strings
  564.     mov     esi,name_string
  565.     call    open
  566.     test    eax,eax
  567.     jz      .exit
  568.     call    jpeg_info
  569.     test    ebp,ebp
  570.     jz      close
  571.     xchg    [jpeg_st],ebp
  572.     call jpeg_close
  573.  
  574. load_image:
  575.  
  576.     mov     eax,13              ; clear picture area
  577.     movzx    ebx, word [winxs]
  578.     add     ebx, 1  shl 16 -10
  579.     movzx    ecx, word [winys]
  580.     sub     ecx, 40
  581.     add     ecx, 1  shl 16
  582.  
  583.     mov     edx,[sc.work]
  584.     mcall
  585.     mov    ebp,[jpeg_st]
  586.     test    ebp,ebp
  587.     jz      .exit
  588.     mov     dword [ebp+draw_ptr],put_image
  589.     jmp    jpeg_display
  590.  .exit: ret
  591.  
  592. print_strings:
  593.     pusha
  594.     mov     eax,13              ; clear text area
  595.     movzx   ebx, word [winxs]
  596.     add     ebx, 59 shl 16 -125
  597.     mov     cx, [winys]
  598.     sub     cx, 39
  599.     shl     ecx, 16
  600.     add     ecx, 12
  601.     mov     edx,0xffffff
  602.     mcall
  603.  
  604.     mov     eax,4               ;
  605.     movzx   ebx, word [winys]
  606.     add     ebx, 61 shl 16 - 37
  607.     mov     ecx,0x000000
  608.     mov     edx,name_string
  609.     mov     esi,60
  610.     mcall
  611.     popa
  612.     ret
  613.  
  614. slideshow:
  615.         cmp     [file_dir], 0
  616.         jnz     .exit
  617.         cmp     [jpeg_st], 0
  618.         jz      .exit
  619.         mov     esi, name_string
  620.         movzx   ecx, byte [name_string.cursor]
  621. .l1:
  622.         cmp     byte [esi+ecx], '/'
  623.         jz      .l2
  624.         loop    .l1
  625. .exit:
  626.         ret
  627. .l2:
  628.         mov     byte [esi+ecx], 0
  629.         call    open
  630.         mov     byte [esi+ecx], '/'
  631.         test    eax, eax
  632.         jz      .exit
  633.         test    byte [fileattr], 0x10
  634.         jz      .exit
  635.         mov     [file_dir], eax
  636.         inc     ecx
  637.         mov     [name_string.cursor], cl
  638. display_next:
  639.         mov     ebx, [file_dir]
  640.         test    ebx, ebx
  641.         jnz     @f
  642.         ret
  643. @@:
  644.         mov     byte [ebx], 1
  645.         mov     byte [ebx+12], 1
  646.         mov     dword [ebx+16], dirinfo
  647.         mov     eax, 70
  648.         mcall
  649.         mov     eax, [file_dir]
  650.         inc     dword [eax+4]
  651.         cmp     ebx, 1
  652.         jz      @f
  653.         mov     eax, [file_dir]
  654.         and     [file_dir], 0
  655.         jmp     close
  656. @@:
  657.         movzx   edi, byte [name_string.cursor]
  658.         add     edi, name_string
  659.         lea     esi, [dirinfo+32+40]
  660. @@:
  661.         lodsb
  662.         stosb
  663.         test    al, al
  664.         jnz     @b
  665.         mov     ecx, name_string.end
  666.         sub     ecx, edi
  667.         rep     stosb
  668.     call   print_strings
  669.     mov     esi,name_string
  670.     call    open
  671.     test    eax,eax
  672.     jz      display_next
  673.     call    jpeg_info
  674.     test    ebp,ebp
  675.     jnz     .l6
  676.     call close
  677.     jmp display_next
  678.    .l6:
  679.     mov dword[ebp+draw_ptr],put_image
  680.     push ebp
  681.     xchg [jpeg_st],ebp
  682.     call jpeg_close
  683.     pop ebp
  684.     jmp jpeg_display
  685.  
  686.  
  687. include 'filelib.asm'
  688. include 'memlib.asm'
  689. include 'jpeglib.asm'
  690.  
  691.  
  692. ; DATA AREA
  693.  
  694. wcolor          dd  0x000000
  695. title          db  appname,version,0
  696. setname          db  'SLIDESHOW'
  697. setnamelen:
  698.  
  699. setbgr           db  '   BGR  '
  700. setbgrlen:
  701.  
  702. x_pointer       dd  0
  703. x_offset        dd  0
  704. x_numofbytes    dd  0
  705. x_numofb2       dd  0
  706. x_counter       dd  0
  707. winxo           dw  0
  708. winyo           dw  0
  709. winxs           dw  0
  710. winys           dw  0
  711. jpeg_st         dd  0
  712. file_dir        dd  0
  713. name_string:    db '/sys/jpegview.jpg',0
  714. rb 256
  715.     .end:
  716.     .cursor: db 19
  717.     .cursor2: db 0
  718.  
  719. align 4
  720.  
  721. rgb16:          db 0,4,8,13,17,21,25,29,34,38,42,46,50,55,59,63
  722. rgb4:           db 0,21,42,63
  723.  
  724. include 'jpegdat.asm'
  725.  
  726. align 4
  727.  
  728. iniciomemoria:
  729.               dd -(iniciomemoria+4),-(iniciomemoria+4),(iniciomemoria+4),.l1,0
  730. .l1           dd 0
  731.  
  732. I_END:
  733. sc     system_colors
  734. ipc_mem dd ?
  735. ipc_mem_size dd ?
  736. ipc_mem_out dd ?
  737. fileattr: rb 40
  738. dirinfo: rb 32+304
  739. fin:
  740.