?login_element?

Subversion Repositories NedoOS

Rev

Rev 661 | Blame | Compare with Previous | Last modification | View Log | Download

  1. ;доступ к файловой системе только через буфер в 0xc000
  2. ;там подключена pgtemp, там лежит директория (а во время чтения/записи там file_buf, она же подключена с 0x4000, там буфер текущей строки картинки - TODO грузить туда)
  3. ;во время переброски строки в 0x4000 подключена pgtemp (там буфер текущей строки картинки), а в 0x8000,0xc000 подключен bitmap
  4. filelist_maxfiles=25
  5.  
  6. filelistx8=0
  7. filelisty=0
  8. filelistwid8=20
  9. filelisthgt=filelist_maxfiles*8
  10.  
  11. savex8=23
  12. savey=0
  13. savewid8=4
  14. savehgt=8
  15.  
  16. quitx8=36-3
  17. quity=100
  18. quitwid8=4+3
  19. quithgt=8
  20.  
  21. exitx8=36
  22. exity=192
  23. exitwid8=4
  24. exithgt=8
  25.  
  26. filenamex8=34
  27. filenamey=0
  28. filenamewid8=6 ;12 символов
  29. filenamehgt=8
  30.  
  31. drivesx8=22
  32. drivesy=16
  33. driveswid8=1
  34. driveshgt=20*8
  35.  
  36. catbuf=0xc000
  37. scrbuf=0xc000 ;for .scr
  38. file_buf=0xff00
  39. file_buf_end=file_buf+127
  40.  
  41. ; I    1    0      2    Признак ВМР-файла - символы 'BM'       (+)
  42. ;      2    2      4    Размер ВМР-файла (байт)                (НАДО СФОРМИРОВАТЬ, ЧИТАТЬ НЕ НУЖНО)
  43. ;      3    6      4    Резерв (=0)                            (НАМ НЕ НУЖНО)
  44. ;      4   10      4    Смещение в байтах от начала файла до  
  45. ;                       начала описания растрового изображения (НАМ НЕ НУЖНО, у нас 118)
  46.                                                              
  47. ; II   5   14      4    Размер Описания Изображения (=40 WINDOWS) (НАМ НЕ НУЖНО, всегда 40 - в Linux больше!!!)
  48. ;      6   18      4    Ширина изображения (в пикселах)        (+)
  49. ;      7   22      4    Высота изображения (в пикселах)        (+)
  50. ;      8   26      2    Количество цветовых плоскостей (=1)    (НАМ НЕ НУЖНО, всегда 1)
  51. ;      9   28      2    Количество бит на пиксел               (+ 1, 4, 8, 24 БИТ)
  52. ;     10   30      4    Вид сжатия информации (0,1 или 2)      (ПОКА ЧТО БЕЗ СЖАТИЯ)
  53. ;     11   34      4    Размер образа растрового изображения   (НАДО СФОРМИРОВАТЬ, ЧИТАТЬ НЕ НУЖНО)
  54. ;     12   38      4    Рекомендуемое горизон-ое разрешение    (НАМ НЕ НУЖНО)
  55. ;     13   42      4    Рекомендуемое вертикальное разрешение  (НАМ НЕ НУЖНО)
  56. ;     14   46      4    Количество цветов в палитре            (+)
  57. ;     15   50      4    Количество важных цветов в палитре     (НАМ НЕ НУЖНО)
  58.  
  59. ;дальше идёт палитра (B, G, R, 0)
  60.  
  61. ;дальше идёт картинка (длины строк в байтах кратны 4)
  62.  
  63.         macro READBYTE_A
  64.         inc ly
  65.         call m,readbyte_readbuf
  66.         ld a,(iy)
  67.         endm
  68.         macro READBYTE_E
  69.         inc ly
  70.         call m,readbyte_readbuf
  71.         ld e,(iy)
  72.         endm
  73.         macro READBYTE_D
  74.         inc ly
  75.         call m,readbyte_readbuf
  76.         ld d,(iy)
  77.         endm
  78.  
  79.         macro WRITEBYTE_A
  80.         ld (iy),a
  81.         inc ly
  82.         call m,writebyte_writebuf
  83.         endm
  84.  
  85. isfilename_act
  86.         ld a,(fcb_filename+8)
  87.         or 0x20
  88.         cp 'a'
  89.         ret
  90.  
  91. isfilename_scr
  92.         ld a,(fcb_filename+8)
  93.         or 0x20
  94.         cp 's'
  95.         ret
  96.  
  97. readcurhandle
  98. curhandle=$+1
  99.         ld b,0
  100.         OS_READHANDLE
  101.         ret
  102.  
  103. readfile_scr
  104. ;0xc000=pgtemp
  105.         ld de,scrbuf
  106. ;        OS_SETDTA ;set disk transfer address = de
  107. ;        ld b,0x1b00/128
  108. ;readfile_scr0
  109. ;        push bc
  110. ;        ld de,fcb
  111. ;        OS_FREAD
  112. ;        pop bc
  113. ;        djnz readfile_scr0
  114.         ld hl,0x1b00
  115.         call readcurhandle
  116.        
  117.         call delbitmap ;удалить текущую картинку и освободить странички
  118.         ld hl,256
  119.         ld (curbitmapwid_edit),hl
  120.         ld hl,192
  121.         ld (curbitmaphgt),hl
  122.         call reserve_bmp_pages ;там genmuldewid_ahl
  123.         ld hl,RSTPAL
  124.         ld de,workpal
  125.         ld bc,32
  126.         ldir
  127.        
  128.         ld de,0 ;y
  129.         ld hx,192
  130. readfile_scrlines0
  131.         ld lx,32
  132. readfile_scrline0
  133.         ld a,32
  134.         sub lx
  135.         ld c,a ;x(chr)
  136.         ld a,e
  137.         rla
  138.         rla
  139.         and 0xe0;%11100000
  140.         add a,c ;x(chr)
  141.         ld l,a
  142.         ld a,e
  143.         rra
  144.         rra
  145.         rra
  146.         xor e
  147.         and 0x18;%00011000
  148.         xor e
  149.         and 0x1f;%00011111
  150.         add a,scrbuf/256
  151.         ld b,a ;bl=pixel addr
  152.         rra
  153.         rra
  154.         rra
  155.         and 3
  156.         add a,scrbuf/256+0x18
  157.         ld h,a ;hl=attr addr
  158.         ld a,(hl) ;attr
  159.         and 7
  160.         bit 6,(hl) ;bright
  161.         jr z,$+4
  162.         or 8
  163.         ld (readfile_scr_ink),a
  164.         ld a,(hl) ;attr
  165.         rra
  166.         rra
  167.         rra
  168.         and 15
  169.         ld (readfile_scr_paper),a
  170.         ld h,b ;hl=pixels attr
  171. ;e  = %TTYYYyyy
  172. ;hl = %110TTyyy YYYxxxxx
  173.         ld a,c
  174.         add a,a
  175.         add a,a
  176.         add a,a
  177.         ld c,a
  178.         ld b,0 ;bc=x
  179.         ld a,(hl) ;pixels
  180.         push af
  181.         call calcbitmap_from_xy ;a=pg, hl=addr
  182.         ;push bc
  183.         SETPGBITMAPLOW
  184.         ;pop bc
  185.         pop af
  186.         scf
  187.         adc a,a
  188. readfile_scrchr00
  189. readfile_scr_paper=$+1
  190.         ld (hl),0
  191.         jr nc,$+4
  192. readfile_scr_ink=$+1
  193.         ld (hl),0
  194.         add a,a
  195.         ;inc bc
  196.         inc hl ;строка имеет круглую длину 256, так что всё в одной страничке
  197.         jr nz,readfile_scrchr00
  198.         dec lx
  199.         jr nz,readfile_scrline0
  200.         inc de
  201.         dec hx
  202.         jr nz,readfile_scrlines0
  203.         ret
  204.  
  205. readfile_rgbtopal
  206.         call calcRGBtopal_pp
  207.         ld (ix+1),a
  208.         call calcRGBtopal_pp
  209.         ld (ix),a
  210.         inc ix
  211.         inc ix
  212.         ret
  213.  
  214. readfile_pal
  215.         ld ix,workpal
  216.         ld c,16
  217. readfile_pal0
  218.         call readbyte
  219.         ld l,a ;r
  220.         call readbyte
  221.         ld d,a ;g
  222.         call readbyte
  223.         ld e,a ;e=B, d=G, l=R
  224.         call readfile_rgbtopal
  225.         dec c
  226.         jr nz,readfile_pal0
  227.         ret ;z
  228.  
  229. readbmp
  230. ;out: nz=ошибка
  231.         call setpgtemp
  232.         ld iy,file_buf_end
  233.  
  234.         call isfilename_act
  235.         jr z,readfile_pal
  236.         cp 's'
  237.         jp z,readfile_scr
  238.  
  239.         call readbyte
  240.         cp 'B'
  241.         ret nz
  242.         call readbyte
  243.         cp 'M'
  244.         ret nz
  245.         push iy
  246.         call delbitmap ;удалить текущую картинку и освободить странички
  247.         pop iy
  248.        
  249.         call readlong ;размер ВМР-файла (байт) ;hlde
  250.         call readlong ;резерв
  251.         call readlong ;смещение в байтах от начала файла до начала описания растрового изображения
  252.         call readlong ;размер описания изображения (обычно 40 в Windows)
  253.          ld (bmpdescrsize),de
  254.         call readlong ;ширина
  255.         ;call readlong5
  256.         ld (curbitmapwid_edit),de
  257.         ;ld a,d;(curbitmapwid_view+1)
  258.         ;ld (readbmp_checkendline_HSB),a
  259.         ;ld a,e;(curbitmapwid_view)
  260.         ;ld (readbmp_checkendline_LSB),a
  261.         call readlong ;высота
  262.         ld a,0x3e ;ld a,N
  263.         ld h,d
  264.         ld l,e
  265.         dec hl ;starty
  266.         bit 7,d
  267.         jr z,readbmp_noneghgt
  268.         ld hl,0 ;starty
  269.         call negde
  270.         ld a,0x18 ;jr
  271. readbmp_noneghgt
  272.         ld (readbmp_nextlinejrneghgt),a
  273.         ld (curbitmaphgt),de
  274.         ld (readbmp_starty),hl
  275.         call readword ;количество цветовых плоскостей
  276.         call readword ;количество бит на пиксел
  277.         ld a,l
  278.         ld (readbmp_bpp),a
  279.  
  280.         push iy
  281.         call reserve_bmp_pages ;там genmuldewid_ahl
  282.         pop iy
  283.         ;call readlong ;вид сжатия информации
  284.         ;call readlong ;размер образа
  285.         ;call readlong ;Рекомендуемое горизон-ое разрешение (нет в ACDSee)
  286.         ;call readlong ;Рекомендуемое вертикальное разрешение (нет в ACDSee)
  287.         ;call readlong ;количество цветов в палитре (для 4бит не задаётся)
  288.         call readlong5
  289.         ld a,d
  290.         dec a
  291.         or e
  292.         jr z,readbmp_pal_256c
  293.         ld a,e
  294.         or a
  295.         jr nz,$+4 ;число цветов не задано - будет 16
  296.         ld a,16
  297. readbmp_pal_256c
  298.         push af
  299.         ;call readlong ;количество важных цветов в палитре
  300.        
  301. ;в Linux может быть дополнительный блок
  302. bmpdescrsize=$+1
  303.         ld hl,0
  304.         ld de,-(40-4)
  305.         add hl,de
  306. bmpdescrsizeskip0
  307.         call readbyte
  308.         dec hl
  309.         ld a,h
  310.         or l
  311.         jr nz,bmpdescrsizeskip0
  312.  
  313. ;дальше идёт палитра?
  314.         ld ix,workpal
  315.         pop bc ;b=число цветов
  316.  
  317.         ld a,(readbmp_bpp)
  318.         cp 24
  319.         jr z,readbmp24
  320.  
  321.         ld c,0
  322. readbmp_pal0
  323.         call readlong ;e=B, d=G, l=R, h=0
  324.         ld a,c
  325.         cp 16
  326.         call c,readfile_rgbtopal
  327.         inc c
  328.         ld a,c
  329.         cp b
  330.         jr nz,readbmp_pal0
  331. ;дальше идёт картинка?
  332.         ;ld de,(curbitmaphgt)
  333.         ;dec de ;y
  334. readbmp_bpp=$+1
  335.         ld a,0
  336.         cp 4
  337.         jr z,readbmp4
  338.         jr c,readbmp1
  339. readbmp8
  340.         call readbmp_start
  341. readbmp8_pic0
  342.         call readbmp_linestart
  343. ;bc=x в bitmap
  344. ;de=y в bitmap
  345. ;hl=addr
  346. readbmp8_pic00
  347.         READBYTE_A
  348.         ;and 0x0f
  349.         call readbmp_putbyte_checkendline
  350.         jr z,readbmp8_pic00
  351.         call readbmp_nextline
  352.         jr nz,readbmp8_pic0
  353.         ret
  354.  
  355. readbmp24
  356.         call readbmp_start
  357. readbmp24_pic0
  358.         call readbmp_linestart
  359. ;bc=x counter
  360. ;de=y в bitmap
  361. ;hl=addr
  362. readbmp24_pic00
  363.         push de
  364.         READBYTE_E ;b
  365.         READBYTE_D ;g
  366.         READBYTE_A ;r
  367.         rl d ;g
  368.         ld d,a ;r
  369.         ld a,1
  370.         rla ;g
  371.         rl d
  372.         rla ;r
  373.         rl e
  374.         rla ;b ;a=%1grb
  375.         pop de
  376.         call readbmp_putbyte_checkendline
  377.         jr z,readbmp24_pic00
  378.         call readbmp_nextline
  379.         jr nz,readbmp24_pic0
  380.         ld hl,RSTPAL
  381.         ld de,workpal
  382.         ld bc,32
  383.         ldir
  384.         ret
  385.  
  386. ;нельзя читать картинку прямо в bitmap, иначе байты округления в конце строки затрут другую строку
  387. ;читаем строку в pgtemp:tempc000, потом перебрасываем в bitmap
  388. readbmp4
  389.         call readbmp_start
  390. readbmp4_pic0
  391.         call readbmp_linestart
  392. ;bc=x counter
  393. ;de=y в bitmap
  394. ;hl=addr
  395. readbmp4_pic00
  396.         READBYTE_A
  397.         ld (hl),a
  398.          xor a
  399.          rrd ;(hl)=%0000llll, a=%0000rrrr
  400.         inc hl
  401.         dec bc ;x counter
  402.         call readbmp_putbyte_checkendline
  403.         jr z,readbmp4_pic00
  404.         call readbmp_nextline
  405.         jr nz,readbmp4_pic0
  406.         ret
  407.  
  408. readbmp1
  409.         call readbmp_start
  410. readbmp1_pic0
  411.         call readbmp_linestart
  412. ;bc=x counter
  413. ;de=y в bitmap
  414. ;hl=addr
  415. readbmp1_pic00
  416.         READBYTE_A
  417.         scf
  418.         rla
  419. readbmp1_pic000
  420.         ld (hl),0
  421.         rl (hl)
  422.         inc hl
  423.         dec bc ;x counter
  424.         add a,a
  425.         jr nz,readbmp1_pic000
  426.         bit 7,b
  427.         jr z,readbmp1_pic00
  428.         call readbmp_nextline
  429.         jr nz,readbmp1_pic0
  430.         ret
  431.  
  432. readbmp_start
  433. readbmp_starty=$+1
  434.         ld de,0
  435.         ld a,ly
  436.         ld lx,a
  437.         ret
  438.  
  439. readbmp_linestart
  440.         ld a,(curpgtemp)
  441.         SETPG4000 ;для буфера текущей строки
  442.         ;call setpgtemp ;для file_buf (должен быть выше 0xc000) ;уже подключен
  443.         ld bc,(curbitmapwid_edit)
  444.         dec bc
  445.         ld hl,tempc000
  446. ;hl=addr
  447.         ret
  448.  
  449. readbmp_putbyte_checkendline
  450. ;out: nz=endline
  451.         ld (hl),a
  452.         inc hl
  453.         dec bc ;x counter
  454.         bit 7,b
  455.         ret
  456.  
  457. readbmp_nextline
  458. ;out: z=конец картинки
  459.         ld bc,0
  460. ;bc=x в bitmap (не портится)
  461. ;de=y в bitmap (не портится)
  462.         push de
  463.         call calcbitmap_setpg32k ;hl=addr
  464.         ex de,hl
  465.         ld hl,tempc000
  466.         ld bc,(curbitmapwid_edit)
  467.         ldir
  468.         pop de
  469.         call setpgtemp ;для file_buf (должен быть выше 0xc000), иначе readbyte обломится
  470.         xor a ;z
  471. readbmp_wait4bytes0
  472.         call nz,readbyte
  473.         ld a,ly
  474.         xor lx
  475.         and 3
  476.         jr nz,readbmp_wait4bytes0
  477. readbmp_nextlinejrneghgt=$
  478.         jr readbmp_nextline_neghgt
  479.         ld a,d
  480.         or e
  481.         dec de
  482.         ret ;out: z=конец картинки
  483. readbmp_nextline_neghgt
  484.         inc de
  485.         ld a,(curbitmaphgt)
  486.         cp e
  487.         ret nz
  488.         ld a,(curbitmaphgt+1)
  489.         cp d
  490.         ret ;out: z=конец картинки
  491.  
  492. savebmp_inch
  493. ;readbmp_inch
  494.         inc h
  495.         bit 6,h
  496.         ret z
  497.         push af
  498.         call calcbitmap_from_xy ;a=pg, hl=addr
  499.         push bc
  500.         SETPGBITMAPLOW
  501.         pop bc
  502.         pop af
  503.         ret
  504.  
  505. readlong5
  506.         call readlong2
  507. ;readlong3
  508.         call readlong
  509. readlong2
  510.         call readlong
  511. readlong
  512. ;e,d,l,h
  513.         call readword
  514.         ex de,hl
  515. readword
  516. ;l,h
  517.         call readbyte
  518.         ld l,a
  519.         call readbyte
  520.         ld h,a
  521.         ret
  522.  
  523. readbyte
  524.         READBYTE_A
  525.         ret
  526.  
  527. readbyte_readbuf
  528.         push bc
  529.         push de
  530.         push hl
  531.         push ix
  532.         ld de,file_buf
  533.         push de
  534.         ;OS_SETDTA ;set disk transfer address = de
  535.         ;ld de,fcb
  536.         ;OS_FREAD
  537.         ld hl,128
  538.         call readcurhandle
  539.         pop iy
  540.         pop ix
  541.         pop hl
  542.         pop de
  543.         pop bc
  544.         ret
  545.  
  546. writelongzero
  547.         ld hl,0
  548.         ld d,h
  549.         ld e,l
  550. writelong
  551. ;e,d,l,h
  552.         ex de,hl
  553.         call writeword
  554.         ex de,hl
  555. writeword
  556. ;l,h
  557.         ld a,l
  558.         call writebyte
  559.         ld a,h
  560.         ;jp writebyte
  561. writebyte
  562.         WRITEBYTE_A
  563.         ret
  564.        
  565. writebyte_writebuf_ifneeded
  566.         inc ly
  567.         dec ly
  568.         ret z ;уже только что сохранили
  569. writebyte_writebuf
  570.         push bc
  571.         push de
  572.         push hl
  573.         push ix
  574.         ld de,file_buf
  575.         push de
  576.         ;OS_SETDTA ;set disk transfer address = de
  577.         ;ld de,fcb
  578.         ;OS_FWRITE
  579.         ld hl,128
  580.         ld a,(curhandle)
  581.         ld b,a
  582.         OS_WRITEHANDLE
  583.         pop iy
  584.         pop ix
  585.         pop hl
  586.         pop de
  587.         pop bc
  588.         ret
  589.        
  590. filemenu
  591.         call isitclick
  592.         ret nz ;кнопку уже держали
  593.  
  594.         ld hl,curpicname
  595.         ld de,savepicname
  596.         ld bc,12+1
  597.         ldir
  598.        
  599.         ld (filemenu_exitsp),sp
  600.         ld de,RSTPAL
  601.         call setpal_de
  602. filemenu_restart
  603.         call prfilemenu
  604.         ld a,ZONE_NO
  605.         ld (prarr_zone),a;от этого зависит форма стрелочки
  606.        
  607. filemenuloop
  608.         call setpgs_scr
  609. ;1. всё выводим
  610. ;2. ждём событие
  611. ;3. всё стираем
  612. ;4. обрабатываем событие
  613.         call setpgshapes
  614.  
  615.         call ahl_coords
  616.         call filemenu_invarrzone
  617.         call ahl_coords
  618.         call shapes_memorizearr
  619.         call ahl_coords
  620.         call shapes_prarr
  621.        
  622.         call waitsomething ;в это время стрелка видна
  623. ;что-то изменилось
  624.  
  625.         call setpgshapes
  626.  
  627.         call ahl_oldcoords
  628.         call shapes_rearr
  629.         call ahl_oldcoords
  630.         call filemenu_invarrzone ;инвертировать пункт под стрелкой
  631.        
  632.         ld a,(mousebuttons)
  633.         cpl
  634.         and 7
  635.         call nz,filemenu_fire
  636.         call file_control_keys
  637.         jr filemenuloop
  638. filemenu_exit
  639. filemenu_exitsp=$+1
  640.         ld sp,0
  641.         ;ld de,workpalend
  642.         ;call setpal_de
  643.         jp showworkscreen
  644.  
  645. filemenu_quit
  646. ;TODO проверить, сохранены ли картинки
  647.         QUIT
  648.  
  649. file_control_keys
  650.         ld a,(key)
  651.         cp cs6
  652.         jr z,file_control_keys_down
  653.         cp cs7
  654.         jr z,file_control_keys_up
  655.         cp key_redraw
  656.         jp z,prfilemenu
  657.         ;cp '1'
  658.         ;jr z,file_control_keys_drive1
  659.         ;cp '2'
  660.         ;jr z,file_control_keys_drive2
  661.         ;cp '3'
  662.         ;jr z,file_control_keys_drive3
  663.         ;cp '4'
  664.         ;jr z,file_control_keys_drive4 ;TODO more drives
  665.         ;sub '5'
  666.         ;jr z,file_control_keys_drive0 ;a=0
  667.         ret
  668.        
  669. ;file_control_keys_drive1
  670. ;file_control_keys_drive2
  671. ;file_control_keys_drive3
  672. ;file_control_keys_drive4
  673. ;        sub '0'
  674. ;file_control_keys_drive0
  675. file_control_keys_drive_fail0
  676. filemenu_setdrive
  677.         ld e,a
  678.         push de
  679.         OS_SETDRV
  680.         pop de
  681.         or a
  682.         jr nz,file_control_keys_drive_fail
  683.         ld a,e
  684.         ld (curdrive),a
  685.          pop af ;снимаем адрес возврата
  686.         jp filemenu_restart
  687. file_control_keys_drive_fail
  688. curdrive=$+1
  689.         ld a,0
  690.         jr file_control_keys_drive_fail0
  691.        
  692. file_control_keys_down
  693.         ld bc,(filelist_firstfilevisible)
  694.         ld hl,filelist_maxfiles
  695.         add hl,bc ;номер файла, который сейчас должен появиться ;CY=0
  696. filelist_nfiles=$+1
  697.         ld de,0
  698.         sbc hl,de
  699.         ret nc ;номер файла больше, чем число файлов
  700.         inc bc
  701.         ld (filelist_firstfilevisible),bc
  702.  
  703.         call setpgshapes
  704.  
  705.         ld hl,+(filelisty+8)*40 + filelistx8 + scrbase
  706.         ld de,filelisty*40 + filelistx8 + scrbase
  707.         ld bc,+(filelisthgt-8)*256 + filelistwid8
  708.         call shapes_copybox
  709.        
  710.         ld de,+(filelisty + filelisthgt-8)*40 + filelistx8 + scrbase ;de=scr (начало строки)
  711.         ld b,filelist_maxfiles-1 ;b=номер видимого файла
  712.         jp prdirfile
  713.  
  714. file_control_keys_up
  715.         ld hl,(filelist_firstfilevisible)
  716.         ld a,h
  717.         or l
  718.         ret z
  719.         dec hl
  720.         ld (filelist_firstfilevisible),hl
  721.  
  722.         call setpgshapes
  723.  
  724.         ld de,+(filelisty+8)*40 + filelistx8 + scrbase
  725.         ld hl,filelisty*40 + filelistx8 + scrbase
  726.         ld bc,+(filelisthgt-8)*256 + filelistwid8
  727.         call shapes_copybox
  728.        
  729.         ld de,+(filelisty)*40 + filelistx8 + scrbase ;de=scr (начало строки)
  730.         ld b,0 ;b=номер видимого файла
  731.         jp prdirfile
  732.  
  733. fcbtoname_temppicname
  734.         ld de,temppicname
  735. fcbtoname_de
  736.         ld hl,fcb_filename
  737.         push de
  738.         call cpmname_to_dotname
  739.         pop de
  740.         ret
  741.        
  742. filemenu_fire
  743.         call isitclick
  744.         ret nz ;кнопка уже была нажата
  745.         call ahl_coords
  746.         call filemenu_isitsave
  747.         jp c,savefile
  748.         call filemenu_isitquit
  749.         jp c,filemenu_quit
  750.         call filemenu_isitexit
  751.         jp c,filemenu_exit
  752.         call filemenu_isitfilename
  753.         jp c,editfilename
  754.         call filemenu_findvisibledrivenumber
  755.         jp c,filemenu_setdrive
  756.         call filemenu_findvisiblefilenumber
  757.         ret nc;jp nc,filemenu_exit ;не попали в список файлов
  758.         ;a = номер видимого файла
  759.         call file_findvisiblefile_a
  760.         call setpgtemp
  761.         ld de,fcb
  762.         ;push de ;FCB
  763.         ld bc,32;FCB_sz
  764.         ldir
  765.         ;pop de ;FCB
  766.         call fcbtoname_temppicname ;de=temppicname
  767.         ld a,(fcb+FCB_FATTRIB)
  768.         cp FATTRIB_DIR;0x10
  769.         jr nz,filemenu_fire_not_dir
  770.         pop af ;снимаем адрес возврата
  771.         ;ld hl,fcb_filename
  772.         ;ld de,temppicname
  773.         ;push de
  774.         ;call cpmname_to_dotname
  775.         ;pop de ;DE = Pointer to ASCIIZ string
  776.         OS_CHDIR
  777.         jp filemenu_restart
  778. filemenu_fire_not_dir
  779.         ;OS_FOPEN
  780.         ;ld hl,fcb_filename
  781.         ;ld de,temppicname
  782.         ;push de
  783.         ;call cpmname_to_dotname
  784.         ;pop de
  785.         OS_OPENHANDLE
  786.         or a
  787.         jr nz,filemenu_fire_finish;error
  788.         ld a,b
  789.         ld (curhandle),a
  790.  
  791.         call readbmp ;nz=ошибка (тогда не менять имя файла)
  792.  
  793.         push af
  794.  
  795.         call setpgtemp ;т.к. после чтения bmp может быть любая страница там
  796.         ;ld de,fcb
  797.         ;push de
  798.         ;OS_FCLOSE
  799.         ;pop hl ;fcb
  800.         ;inc hl ;имя в формате CP/M
  801.         call closecurhandle
  802.  
  803.         pop af
  804.         jr nz,filemenu_fire_finish;error
  805.        
  806.         call isfilename_act
  807.         jr z,filemenu_fire_finish ;если загрузили файл палитры, то не меняем имя текущей картинки
  808.  
  809.         ld de,curpicname
  810.         call fcbtoname_de
  811. filemenu_fire_finish
  812.         ;call clearwindowstate ;a=0
  813.         call kill_unfinished_shapes
  814.         xor a
  815.         ld h,a
  816.         ld l,a
  817.         ld (curbitmapxscroll),hl
  818.         ld (curbitmapyscroll),hl
  819.         jp filemenu_exit
  820.  
  821. dotname_to_cpmname
  822. ;de -> hl
  823. ;out: de=pointer to termination character
  824.         ;push hl ;buffer
  825.        
  826.         push de ;ASCIIZ string for parsing
  827.         push hl ;Pointer to 11 byte buffer
  828.         ld d,h
  829.         ld e,l
  830.         inc de
  831.         ld [hl],' '
  832.         ld bc,11-1
  833.         ldir ;empty filename
  834.         pop hl ;Pointer to 11 byte buffer
  835.         pop de ;ASCIIZ string for parsing
  836.  
  837.         ld b,9
  838.        
  839.         ld a,(de)
  840.         cp '.'
  841.         jr nz,parse_filename0.
  842.         ld (hl),a
  843.         inc de
  844.         ld a,(de)
  845.         cp '.'
  846.         jr nz,parse_filenameq_findterminator.
  847.         inc hl
  848.         ld (hl),a
  849.         jr parse_filenameq_findterminator.
  850. parse_filename0.
  851.         ld a,[de]
  852.         or a
  853.         ret z ;jr z,parse_filenameq. ;no extension in string
  854.         inc de
  855.         cp '.'
  856.         jr z,parse_filenamedot. ;можем уже быть на терминаторе
  857.         ld [hl],a
  858.         inc hl
  859.         djnz parse_filename0.
  860. ;9 bytes in filename, no dot (9th byte goes to extension)
  861. ;возможно, длинное имя, надо найти, что раньше - точка или терминатор
  862. ;можем уже быть на терминаторе или на точке
  863.         dec hl
  864.         ld [hl],' '
  865. parse_filenamelongname0.
  866.         ld a,[de]
  867.         or a
  868.         ret z ;jr z,parse_filenameq. ;a=0
  869.         inc de
  870.         cp '.'
  871.         jr z,parse_filenameLONGnamedot. ;можем уже быть на терминаторе
  872.         jr parse_filenamelongname0.
  873. parse_filenamedot.
  874.         inc hl
  875.         djnz $-1 ;hl points to extension in FCB
  876.         dec hl
  877. parse_filenameLONGnamedot.
  878.         ld a,[de] ;extension in string
  879.         or a
  880.         ret z ;jr z,parse_filenameq. ;a=0
  881.         ld [hl],a ;extension in FCB
  882.         inc hl
  883.         inc de
  884.         ld a,[de] ;extension in string
  885.         or a
  886.         ret z ;jr z,parse_filenameq. ;a=0
  887.         ld [hl],a ;extension in FCB
  888.         inc hl
  889.         inc de
  890.         ld a,[de] ;extension in string
  891.         or a
  892.         ret z ;jr z,parse_filenameq. ;a=0
  893.         ld [hl],a ;extension in FCB
  894. parse_filenameq_findterminator.
  895.         inc de
  896.         ld a,[de]
  897.         or a
  898.         jr nz,parse_filenameq_findterminator.
  899. ;parse_filenameq. ;de на терминаторе
  900.         ;pop hl ;buffer
  901.         ret ;a=0
  902.  
  903. cpmname_to_dotname
  904.         push hl
  905.         ld b,8
  906. cpmname_to_dotname0
  907.         ld a,(hl)
  908.         cp ' '
  909.         jr z,cpmname_to_dotname0q
  910.         ld (de),a
  911.         inc hl
  912.         inc de
  913.         djnz cpmname_to_dotname0
  914. cpmname_to_dotname0q
  915.         pop hl
  916.         ld bc,8
  917.         add hl,bc ;hl=pointer to ext
  918.         ld a,(hl)
  919.         cp ' '
  920.         jr z,cpmname_to_dotnameq
  921.         ld a,'.'
  922.         ld (de),a
  923.         inc de
  924.         ld  c,3
  925.         ldir
  926. cpmname_to_dotnameq
  927.         xor a
  928.         ld (de),a
  929.         ret
  930.  
  931. filemenu_invarrzone
  932. ;инвертировать пункт под стрелкой
  933. ;hl=x на экране
  934. ;a=y на экране
  935.         call filemenu_isitsave
  936.         ;jr c,filemenu_invarrzone_invert
  937.         call nc,filemenu_isitquit
  938.         ;jr c,filemenu_invarrzone_invert
  939.         call nc,filemenu_isitexit
  940.         ;jr c,filemenu_invarrzone_invert
  941.         call nc,filemenu_isitfilename
  942.         ;jr c,filemenu_invarrzone_invert
  943.         call nc,filemenu_findvisibledrivenumber
  944.         jr c,filemenu_invarrzone_invert
  945.         call filemenu_findvisiblefilenumber
  946.         ret nc ;не попали в список файлов
  947.         ;a = номер видимого файла
  948.         add a,a
  949.         add a,a
  950.         add a,a
  951.         add a,filelisty
  952.         ld b,a ;y
  953.         ld c,filelistx8 ;x/8
  954.         ld de,8*256 + filelistwid8 ;d=hgt ;e=wid/8
  955. filemenu_invarrzone_invert
  956.         call setpgshapes
  957.         ;call getcontrastcolors
  958.         ld ix,0xff00
  959.         jp shapes_invbox
  960.        
  961. filemenu_isitfilename
  962. ;hl=x на экране (не портится)
  963. ;a=y на экране (не портится)
  964. ;out: CY=1 - попали в редактируемое имя файла, bcde=размеры для invarrzone
  965.         ld bc,filenamey*256 + filenamex8 ;y, x/8
  966.         ld de,filenamehgt*256 + filenamewid8 ;d=hgt ;e=wid/8
  967.         jr filemenu_isitbox
  968.  
  969. filemenu_isitsave
  970. ;hl=x на экране (не портится)
  971. ;a=y на экране (не портится)
  972. ;out: CY=1 - попали в Save, bcde=размеры для invarrzone
  973.         ld bc,savey*256 + savex8 ;y, x/8
  974.         ld de,savehgt*256 + savewid8 ;d=hgt ;e=wid/8
  975.         jr filemenu_isitbox
  976.  
  977. filemenu_isitquit
  978. ;hl=x на экране (не портится)
  979. ;a=y на экране (не портится)
  980. ;out: CY=1 - попали в Quit, bcde=размеры для invarrzone
  981.         ld bc,quity*256 + quitx8 ;y, x/8
  982.         ld de,quithgt*256 + quitwid8 ;d=hgt ;e=wid/8
  983.         jr filemenu_isitbox
  984.        
  985. filemenu_isitexit
  986. ;hl=x на экране (не портится)
  987. ;a=y на экране (не портится)
  988. ;out: CY=1 - попали в Exit, bcde=размеры для invarrzone
  989.         ld bc,exity*256 + exitx8 ;y, x/8
  990.         ld de,exithgt*256 + exitwid8 ;d=hgt ;e=wid/8
  991.         ;jr filemenu_isitbox
  992. filemenu_isitbox
  993. ;hl=x на экране (не портится)
  994. ;a=y на экране (не портится)
  995. ;b=y ;c=x/8 (не портятся)
  996. ;d=hgt ;e=wid/8 (не портятся)
  997. ;out: CY=1 - попали в бокс
  998.         cp b ;y
  999.         ccf
  1000.         ret nc ;jr nc,filemenu_invarrzone_nofilename ;nc=мимо
  1001.         sub b ;y
  1002.         cp d ;hgt
  1003.         jr nc,filemenu_isitbox_addbret ;nc=мимо
  1004.         add a,b
  1005.         push bc
  1006.         ;ld bc,x8*8
  1007.          ;ld b,0
  1008.          ;sla c
  1009.          ;rl b
  1010.          ;sla c
  1011.          ;rl b
  1012.          ;sla c
  1013.          ;rl b
  1014.          ld b,0xc0
  1015.          sla c
  1016.          rl b
  1017.          jr c,$-4
  1018.         ;or a
  1019.         sbc hl,bc
  1020.         add hl,bc
  1021.         pop bc
  1022.         ccf
  1023.         ret nc ;jr nc,filemenu_invarrzone_nofilename ;nc=мимо
  1024.         push bc
  1025.         ;ld bc,+(x8*8)+(wid8*8)
  1026.          push af
  1027.          ld a,c ;x8
  1028.          add a,e ;wid8
  1029.          ;ld b,0
  1030.          ;add a,a
  1031.          ;rl b
  1032.          ;add a,a
  1033.          ;rl b
  1034.          ;add a,a
  1035.          ;rl b
  1036.          ld b,0xc0
  1037.          add a,a
  1038.          rl b
  1039.          jr c,$-3
  1040.          ld c,a
  1041.         ;or a
  1042.         sbc hl,bc
  1043.          pop af
  1044.         add hl,bc
  1045.         pop bc
  1046.         ret ;nc=мимо
  1047. filemenu_isitbox_addbret
  1048.         add a,b
  1049.         ret
  1050.        
  1051. filemenu_findvisiblefilenumber
  1052. ;hl=x на экране
  1053. ;a=y на экране
  1054. ;out: nc = не попали в список файлов, a = номер видимого файла
  1055.         sub filelisty
  1056.         rra
  1057.         rra
  1058.         rra
  1059.         and 31
  1060. filelist_filesvisible=$+1        
  1061.         cp 0
  1062.         ret nc ;не попали по y в список файлов
  1063.         ld bc,filelistx8*8
  1064.         or a
  1065.         sbc hl,bc
  1066.         ld bc,filelistwid8*8
  1067.         or a
  1068.         sbc hl,bc
  1069.         ret ;nc = не попали по x в список файлов
  1070.  
  1071. filemenu_findvisibledrivenumber
  1072. ;hl=x на экране
  1073. ;a=y на экране
  1074. ;out: nc = не попали в список драйвов, a = номер видимого драйва ;bc = y, x/8 ;de = hgt, wid/8
  1075.         ld c,a
  1076.         sub drivesy
  1077.         rra
  1078.         rra
  1079.         rra
  1080.         and 31
  1081. ;filelist_drivesvisible=$+1        
  1082.         cp 20
  1083.         ld d,a ;a = номер видимого файла
  1084.         ld a,c ;y
  1085.         ret nc ;не попали по y в список драйвов
  1086.         push hl
  1087.         ld bc,drivesx8*8
  1088.         or a
  1089.         sbc hl,bc
  1090.         ld bc,driveswid8*8
  1091.         or a
  1092.         sbc hl,bc
  1093.         pop hl
  1094.         ret nc ;nc = не попали по x в список драйвов
  1095.         ld a,d ;a = номер видимого файла
  1096.         add a,a
  1097.         add a,a
  1098.         add a,a
  1099.         add a,drivesy
  1100.         ld b,a ;y
  1101.         ld a,d ;a = номер видимого файла
  1102.         ld c,drivesx8 ;x/8
  1103.         ld de,8*256 + driveswid8 ;d=hgt ;e=wid/8
  1104.         scf
  1105.         ret
  1106.  
  1107. prfilemenu_drive
  1108.         db "A:",0
  1109.        
  1110. prfilemenu
  1111. ;FILINFO_sz=32
  1112.         call cls
  1113.         ld ix,0xff00 ;lx=фоновый цвет
  1114.         call prfilename
  1115.         ld de,tsave
  1116.         ld hl,savey*40 + savex8 + scrbase
  1117.         call shapes_prtext48ega;_oncolor
  1118.         ld de,tquit
  1119.         ld hl,quity*40 + quitx8 + scrbase
  1120.         call shapes_prtext48ega;_oncolor
  1121.         ld de,texit
  1122.         ld hl,exity*40 + exitx8 + scrbase
  1123.         call shapes_prtext48ega;_oncolor
  1124.  
  1125.         ld hl,drivesy*40 + drivesx8 + scrbase
  1126.         ld bc,256*(driveshgt/8) + 'A'
  1127. prfilemenu_drives0
  1128.         push bc
  1129.         push hl
  1130.         ld de,prfilemenu_drive
  1131.         ld a,c
  1132.         ld (de),a
  1133.         call shapes_prtext48ega;_oncolor
  1134.         pop hl
  1135.         ld bc,40*8
  1136.         add hl,bc
  1137.         pop bc
  1138.         inc c
  1139.         djnz prfilemenu_drives0
  1140.        
  1141.         call setpgtemp
  1142.  
  1143.         ;ld de,fcb
  1144.         ;OS_SETDTA ;set disk transfer address = de
  1145.         ;call makeemptymask
  1146.         ;ld de,fcbmask
  1147.         ;OS_FSEARCHFIRST
  1148.         ld de,emptypath
  1149.         OS_OPENDIR
  1150.         or a
  1151.        
  1152.         ld de,catbuf
  1153.         ld bc,0 ;nfiles
  1154.         ;ld a,' '
  1155.         ;ld (de),a
  1156.         ;jr nz,loaddir_error
  1157. loaddir0
  1158.         ;jr $
  1159.         ;ld a,(fcb+FCB_FNAME)
  1160.         ;cp ' '
  1161.         ;jr z,loaddirq
  1162.         push bc
  1163.         push de
  1164. filinfo=0x3e00
  1165.         ld de,filinfo
  1166.         OS_READDIR
  1167.         pop de
  1168.         pop bc
  1169.         or a
  1170.         jr nz,loaddirq
  1171.         ld hl,filinfo+FILINFO_FNAME
  1172.         ld a,(hl)
  1173.         or a
  1174.         jr z,loaddirq
  1175.         inc de
  1176.         push bc
  1177.         ex de,hl
  1178.         push hl
  1179.         call dotname_to_cpmname ;de -> hl
  1180.         pop hl
  1181.         ld bc,11
  1182.         add hl,bc
  1183.         ex de,hl
  1184.         inc de ;extent number - NU
  1185.         ld hl,filinfo+FILINFO_FATTRIB
  1186.         ldi
  1187.         inc de ;record count - NU
  1188.         inc de ;extent number hi - NU
  1189.         ld hl,filinfo+FILINFO_FSIZE
  1190.         ld c,4
  1191.         ldir
  1192.         ld hl,filinfo+FILINFO_FTIME
  1193.         ld c,2
  1194.         ldir
  1195.         ex de,hl
  1196.         ld c,8
  1197.         add hl,bc
  1198.         ex de,hl
  1199.         ld hl,filinfo+FILINFO_FDATE
  1200.         ld c,2
  1201.         ldir
  1202.  
  1203.         ;ld hl,fcb
  1204.         ;ld bc,32;FCB_sz
  1205.         ;ldir
  1206.         pop bc
  1207.         inc bc ;nfiles
  1208.          ;ld a,d
  1209.          ;inc a
  1210.          ;jr nz,loaddir0 ;страничка pgtemp закончилась? max 512-8 файлов по 32 байта
  1211.          ;inc bc
  1212.         bit 1,b ;страничка pgtemp закончилась? max 512 файлов по 32 байта
  1213.          ;dec bc
  1214.         jr z,loaddir0
  1215.         ;jr nz,loaddirq
  1216.         ;push bc
  1217.         ;push de ;catbuf
  1218.         ;ld de,fcb
  1219.         ;OS_SETDTA ;set disk transfer address = de
  1220.         ; ;call makeemptymask ;в CP/M не нужно, но отсутствие вредит многозадачности
  1221.         ; ld de,fcbmask ;в CP/M не нужно, но отсутствие вредит многозадачности
  1222.         ;OS_FSEARCHNEXT
  1223.         ;pop de ;catbuf
  1224.         ;pop bc ;nfiles
  1225.         ;or a
  1226.         ;jr z,loaddir0
  1227. loaddir_error
  1228. loaddirq
  1229. ;bc=nfiles
  1230.         push bc
  1231.         call setpgs_scr
  1232.         pop bc
  1233.        
  1234.         ld (filelist_nfiles),bc
  1235.         ld hl,0
  1236.         ld (filelist_firstfilevisible),hl
  1237.         ld a,b
  1238.         or a
  1239.         jr nz,loaddir_max
  1240.         ld a,c
  1241.         cp filelist_maxfiles
  1242.         jr c,loaddir_maxq
  1243. loaddir_max
  1244.         ld c,filelist_maxfiles
  1245. loaddir_maxq
  1246.         ld a,c
  1247.         ld (filelist_filesvisible),a
  1248.         or a
  1249.         ret z ;нет файлов
  1250.  
  1251.         ld b,0 ;номер видимого файла
  1252.         ld de,filelisty*40 + filelistx8 + scrbase ;scr
  1253. prdir0
  1254.         push bc ;c=nfiles, b=номер видимого файла
  1255.         push de ;scr (начало строки)
  1256.         call prdirfile
  1257.         pop de ;scr (начало строки)
  1258.         ld hl,40*8
  1259.         add hl,de ;CY=0
  1260.         ex de,hl
  1261.         pop bc ;c=nfiles, b=номер видимого файла
  1262.         inc b
  1263.         dec c
  1264.         jr nz,prdir0
  1265.         ret
  1266.  
  1267.         if 1==0
  1268. makeemptymask
  1269.         ld hl,fcbmask_filename
  1270.         ld d,h
  1271.         ld e,l
  1272.         inc de
  1273.         ld bc,11-1
  1274.         ld (hl),'?'
  1275.         ldir
  1276.         ret
  1277.         endif
  1278.  
  1279. prdirfile
  1280. ;de=scr (начало строки)
  1281. ;b=номер видимого файла
  1282.         push de ;scr (начало строки)
  1283.         ld a,b
  1284.         call file_findvisiblefile_a ;получили hl
  1285.         call setpgtemp
  1286.         ;ld de,filinfo
  1287.         ;ld bc,FILINFO_sz
  1288.         ld de,fcb_print
  1289.         ld bc,FCB_FATTRIB
  1290.         ldir
  1291.         ld a,(hl)
  1292.         and FATTRIB_DIR
  1293.         ld (prdirfile_dot_or_dir),a
  1294.         ld  c,32-FCB_FATTRIB ;FCB_sz-FCB_FATTRIB
  1295.         ldir
  1296.         ld ix,0xff00 ;lx=background color
  1297.         call setpgshapes
  1298.         call setpgs_scr
  1299.         ;ld de,filinfo+FILINFO.FNAME
  1300.         ld de,fcb_print+FCB_FNAME
  1301.         ;ex de,hl
  1302.         ;push hl ;text
  1303.         ;xor a
  1304.         ;ld bc,15
  1305.         ;cpir ;hl будет указывать после нуля, bc=число оставшихся байт
  1306.         ;ld b,c
  1307.         ;dec hl
  1308.         ;ld (hl),' '
  1309.         ;inc hl
  1310.         ;djnz $-3
  1311.         ;ld (hl),b ;0
  1312.         ;pop de ;de=text
  1313.         ;ld hl,prchar48ega_whiteoncolor
  1314.         ;ld (prchar48ega_colorproc),hl
  1315.         pop hl ;hl=scr (начало строки)
  1316.         ;call shapes_prtext48ega_oncolor
  1317.         ld a,8
  1318.         call shapes_prNchars;_oncolor
  1319.         ld a,'.'
  1320. prdirfile_dot_or_dir=$+1
  1321.         xor 0
  1322.         call shapes_prchar48ega;_oncolor
  1323.         ld a,3
  1324.         call shapes_prNchars;_oncolor
  1325.        
  1326.         ex hl,de
  1327.         exx
  1328.         ;ld hl,(filinfo+FILINFO.FSIZE+2)
  1329.         ld hl,(fcb_print+FCB_FSIZE+2)
  1330.         exx
  1331.         ;ld hl,(filinfo+FILINFO.FSIZE)
  1332.         ld hl,(fcb_print+FCB_FSIZE)
  1333.         call shapes_prnumdword;_oncolor
  1334.        
  1335. ;       shapes_prchar48ega
  1336. ;a=char
  1337. ;hl=scr
  1338. ;       shapes_prnum
  1339. ;de=scr
  1340. ;hl=num      
  1341. ;ld hl,(fcb_print+FCB_FTIME)
  1342. ;       shapes_prNchars
  1343. ;hl=scr
  1344. ;de=text
  1345. ;a=Nchars
  1346.         ld a,' '
  1347.         ex de,hl
  1348.         call shapes_prchar48ega;_oncolor
  1349.         ex de,hl
  1350.        
  1351.         ld hl,(fcb_print+FCB_FDATE)
  1352.         push hl
  1353.         ld a,h
  1354.         srl a
  1355.         sub 20
  1356.         jr nc,$+4
  1357.         add a,100 ;XX century
  1358.         call shapes_prNN ;year
  1359.         ld a,'-'
  1360.         ex de,hl
  1361.         call shapes_prchar48ega;_oncolor
  1362.         ex de,hl
  1363.         pop hl
  1364.         ld a,l
  1365.         push af
  1366.         add hl,hl
  1367.         add hl,hl
  1368.         add hl,hl
  1369.         ld a,h
  1370.         and 0x0f
  1371.         call shapes_prNN;_oncolor ;month
  1372.         ld a,'-'
  1373.         ex de,hl
  1374.         call shapes_prchar48ega;_oncolor
  1375.         ex de,hl
  1376.         pop af
  1377.         and 0x1f
  1378.         call shapes_prNN;_oncolor ;day
  1379.        
  1380.         ld a,' '
  1381.         ex de,hl
  1382.         call shapes_prchar48ega;_oncolor
  1383.         ex de,hl
  1384.        
  1385.         ld hl,(fcb_print+FCB_FTIME)
  1386.         push hl
  1387.         ld a,h
  1388.         rra
  1389.         rra
  1390.         rra
  1391.         and 0x1f
  1392.         call shapes_prNN;_oncolor ;hour
  1393.         ld a,':'
  1394.         ex de,hl
  1395.         call shapes_prchar48ega;_oncolor
  1396.         ex de,hl
  1397.         pop hl
  1398.         ld a,l
  1399.         push af
  1400.         add hl,hl
  1401.         add hl,hl
  1402.         add hl,hl
  1403.         ld a,h
  1404.         and 0x3f
  1405.         call shapes_prNN;_oncolor ;minute
  1406.         ld a,':'
  1407.         ex de,hl
  1408.         call shapes_prchar48ega;_oncolor
  1409.         ex de,hl
  1410.         pop af
  1411.         add a,a
  1412.         and 0x3f
  1413.         jp shapes_prNN;_oncolor ;second
  1414.        
  1415. file_findvisiblefile_a
  1416. ;a = номер видимого файла
  1417.         ld l,a
  1418.         ld h,catbuf/(32*256)
  1419. filelist_firstfilevisible=$+1
  1420.         ld bc,0
  1421.         add hl,bc
  1422.         add hl,hl
  1423.         add hl,hl
  1424.         add hl,hl
  1425.         add hl,hl
  1426.         add hl,hl ;(a+firstfilevisible)*FILINFO_sz = a*32
  1427.         ret
  1428.  
  1429. editfilename
  1430. editfilename0
  1431.         ld bc,filenamey*256 + filenamex8 ;y, x/8
  1432.         ld de,filenamehgt*256 + filenamewid8 ;d=hgt ;e=wid
  1433.         xor a
  1434.         call shapes_fillbox
  1435. editfilename_nokey
  1436.         call prfilename
  1437.         ;halt
  1438.         ;GET_KEY
  1439.         ;cp NOKEY
  1440.         ;jr z,editfilename_nokey
  1441.         YIELDGETKEYLOOP
  1442.         ld hl,savepicname
  1443.         cp key_enter
  1444.         ret z
  1445.         cp key_backspace
  1446.         jr z,editfilename_backspace
  1447.         cp 0x20
  1448.         jr c,editfilename_nokey ;прочие системные кнопки не нужны
  1449.         ld e,a
  1450.         ld bc,12
  1451.         xor a
  1452.         cpir
  1453.         dec hl ;hl=на терминаторе
  1454.         jr nz,editfilename0 ;не нашли терминатор = максимальная длина строки, нельзя вводить
  1455.         ld (hl),e
  1456.         inc hl
  1457.         ld (hl),a;0
  1458.         jr editfilename0
  1459. editfilename_backspace
  1460.         ld a,(savepicname)
  1461.         or a
  1462.         jr z,editfilename0 ;удалять нечего
  1463.         ld bc,12+1 ;чтобы точно найти терминатор
  1464.         xor a
  1465.         cpir
  1466.         dec hl ;hl=на терминаторе
  1467.         dec hl
  1468.         ld (hl),a;0
  1469.         jr editfilename0
  1470.  
  1471. prfilename
  1472.         call setpgshapes
  1473.         ld ix,0xff00 ;lx=background color
  1474.         ld de,savepicname
  1475.         ld hl,filenamey*40 + filenamex8 + scrbase
  1476.         jp shapes_prtext48ega;_oncolor
  1477.  
  1478. savefile
  1479.         call setpgtemp
  1480.         ld hl,savepicname
  1481.         ld de,catbuf
  1482.         ld bc,16
  1483.         push de
  1484.         ldir
  1485.         pop de ;ASCIIZ string for parsing (в 0xc000...)
  1486.         ld hl,fcb_filename ;Pointer to 11 byte buffer
  1487.         OS_PARSEFNAME
  1488.         call fcbtoname_temppicname ;de=temppicname
  1489.         ;ld de,fcb
  1490.         ;OS_FCREATE
  1491.         OS_CREATEHANDLE
  1492.         ;or a
  1493.         ;jr nz,error ;TODO
  1494.         ld a,b
  1495.         ld (curhandle),a
  1496.  
  1497.         ld iy,file_buf
  1498.  
  1499.         call isfilename_scr
  1500.         jp z,savefile_scr
  1501.         call isfilename_act
  1502.         jp z,savefile_pal
  1503.        
  1504.         ld a,(fcb_filename+8)
  1505.         cp 'B'
  1506.         ld d,4-1
  1507.         ld a,savebmp4_8_jrdata
  1508.         jr z,savefile_bmp8
  1509. ;savefile_bmp4
  1510.         ld d,8-1
  1511.         xor a
  1512. savefile_bmp8
  1513.         ld (savebmp4_8_jr),a
  1514.  
  1515. ;SAVEBIT4=0
  1516. ;если bmp
  1517.        push de
  1518.         ld hl,savepicname
  1519.         ld de,curpicname
  1520.         ld bc,12+1
  1521.         ldir
  1522.  
  1523.         ld a,'B'
  1524.         call writebyte
  1525.         ld a,'M'
  1526.         call writebyte
  1527.        pop de
  1528.        push de
  1529.        
  1530.         ld bc,(curbitmapwid_edit)
  1531.         dec bc
  1532.         ld a,c
  1533.        ;if SAVEBIT4
  1534.        ; or 8-1
  1535.        ;else
  1536.        ; or 4-1
  1537.        ;endif
  1538.        or d ;7(4bit)/3(8bit)
  1539.         ld c,a
  1540.         inc bc ;округлённая вверх до 4 байт (8 пикселей)
  1541.         ld a,c
  1542.         ld (savebmp4_pic00_widLSB),a
  1543.         ld a,b
  1544.         ld (savebmp4_pic00_widHSB),a
  1545.        ;if SAVEBIT4
  1546.        bit 2,d
  1547.        jr z,$+2+4 ;bmp8
  1548.         srl b
  1549.         rr c
  1550.        ;endif
  1551.         ld de,(curbitmaphgt)
  1552.         call mulbcde_ahl
  1553.         ex de,hl
  1554.         ld bc,118 ;???
  1555.         ld l,a
  1556.         ld h,b;0
  1557.        pop af
  1558.         push hl
  1559.         push de
  1560.        push af
  1561.         ex de,hl
  1562.         add hl,bc
  1563.         ex de,hl
  1564.         ld c,b ;0
  1565.         adc hl,bc
  1566.        
  1567. ;hlde = hgt*wid_view/2 + 118
  1568.         call writelong ;размер ВМР-файла (байт)
  1569.         call writelongzero ;резерв
  1570.         ld  e,118
  1571.         call writelong ;смещение в байтах от начала файла до начала описания растрового изображения
  1572.         ld  e,40
  1573.         call writelong ;размер описания изображения (обычно 40 в Windows)
  1574.         ld de,(curbitmapwid_edit)
  1575.         call writelong ;ширина
  1576.         ld de,(curbitmaphgt)
  1577.         call writelong ;высота
  1578.         ld  l,1
  1579.         call writeword ;количество цветовых плоскостей
  1580.        pop af ;7(4bit)/3(8bit)
  1581.        xor 4 ;3(4bit)/7(8bit)
  1582.        inc a
  1583.        ld l,a ;4/8
  1584.        ;if SAVEBIT4
  1585.        ; ld  l,4
  1586.        ;else
  1587.        ; ld  l,8
  1588.        ;endif
  1589.         call writeword ;количество бит на пиксел
  1590.         ld  e,0
  1591.         ld l,e;0
  1592.         call writelong ;вид сжатия информации
  1593.  
  1594.         pop de
  1595.         pop hl
  1596. ;hlde = hgt*wid_view/2
  1597.         call writelong ;размер образа
  1598.  
  1599.         call writelongzero ;Рекомендуемое горизон-ое разрешение (нет в ACDSee)
  1600.         call writelong ;Рекомендуемое вертикальное разрешение (нет в ACDSee)
  1601.         ld  e,16
  1602.         call writelong ;количество цветов в палитре (для 16 можно не задавать)
  1603.         call writelong ;количество важных цветов в палитре
  1604. ;дальше идёт палитра
  1605.         ld ix,workpal
  1606.         ld c,16
  1607. savebmp_pal0
  1608.         ld l,(ix)
  1609.         inc ix
  1610.         ld h,(ix)
  1611.         inc ix
  1612. ;hl=color (DDp palette)
  1613. ;DDp palette: %grbG11RB(low),%grbG11RB(high), инверсные
  1614.         call calchexcolor
  1615. ;b=0xBB
  1616. ;d=0xRR
  1617. ;e=0xGG
  1618.         ld l,d
  1619.         ld h,0
  1620.         ld d,e
  1621.         ld e,b
  1622.         call writelong ;e=B, d=G, l=R, h=0
  1623.         dec c
  1624.         jr nz,savebmp_pal0
  1625. ;дальше идёт картинка
  1626.         ld de,(curbitmaphgt)
  1627.         dec de ;y
  1628. savebmp4
  1629. savebmp4_pic0
  1630.         ld bc,0
  1631. ;bc=x в bitmap (не портится)
  1632. ;de=y в bitmap (не портится)
  1633.         call calcbitmap_from_xy ;a=pg, hl=addr
  1634.         push bc
  1635.         SETPGBITMAPLOW
  1636.         pop bc
  1637. savebmp4_pic00
  1638.         ld a,(hl)
  1639.         inc bc ;x
  1640.         inc l
  1641.         call z,savebmp_inch
  1642.        ;if SAVEBIT4
  1643.        jr savebmp4_8
  1644. savebmp4_8_jr=$-1
  1645.         rlca
  1646.         rlca
  1647.         rlca
  1648.         rlca
  1649.         or (hl)
  1650.         inc bc
  1651.         inc l
  1652.         call z,savebmp_inch
  1653. savebmp4_8
  1654. savebmp4_8_jrdata=$-(savebmp4_8_jr+1)
  1655.        ;endif
  1656.         WRITEBYTE_A
  1657. savebmp4_pic00_widLSB=$+1
  1658.         ld a,0
  1659.         cp c
  1660.         jr nz,savebmp4_pic00
  1661. savebmp4_pic00_widHSB=$+1
  1662.         ld a,0
  1663.         cp b
  1664.         jr nz,savebmp4_pic00
  1665.         dec de
  1666.         bit 7,d
  1667.         jr z,savebmp4_pic0
  1668. savefile_close_quit
  1669.         call writebyte_writebuf_ifneeded
  1670.         ;ld de,fcb
  1671.         ;OS_FCLOSE
  1672.         call closecurhandle
  1673.         ; pop af ;снимаем адрес возврата (т.к. вызывали call filemenu_fire)
  1674.         ;jp filemenu
  1675.         jp filemenu_exit
  1676.  
  1677. closecurhandle
  1678.         ld a,(curhandle)
  1679.         ld b,a
  1680.         OS_CLOSEHANDLE
  1681.         ret
  1682.  
  1683. savefile_pal
  1684.         ld ix,workpal
  1685.         ld c,16
  1686. savefile_pal0
  1687.         ld l,(ix)
  1688.         inc ix
  1689.         ld h,(ix)
  1690.         inc ix
  1691. ;hl=color (DDp palette)
  1692. ;DDp palette: %grbG11RB(low),%grbG11RB(high), инверсные
  1693.         call calchexcolor
  1694. ;b=0xBB
  1695. ;d=0xRR
  1696. ;e=0xGG
  1697.         ld a,d ;r
  1698.         call writebyte
  1699.         ld a,e ;g
  1700.         call writebyte
  1701.         ld a,b ;b
  1702.         call writebyte
  1703.         dec c
  1704.         jr nz,savefile_pal0
  1705.         jr savefile_close_quit
  1706.  
  1707. savefile_scr
  1708. savefile_scr_scrbuf=0xc000
  1709. savefile_scr_attrbuf=savefile_scr_scrbuf+0x1800
  1710. savefile_scr_chrbuf=0xfec0 ;64 bytes
  1711.         ;call setpgtemp ;уже включено, там файловый буфер
  1712. ;познакоместно формируем в savefile_scr_scrbuf файл для записи
  1713.         ;jr $
  1714.         ld hl,savefile_scr_scrbuf
  1715.         ld b,0 ;y
  1716. savefile_scr0
  1717.         ld c,0 ;x
  1718. savefile_scr1
  1719.         push bc
  1720. ;достаём знакоместо в линейный буфер
  1721.         push hl
  1722.         ld de,savefile_scr_chrbuf
  1723. savefile_scr_readchr0
  1724.         push bc
  1725.         push de
  1726.         ld e,b
  1727.         ld d,0
  1728.         ld b,d;0
  1729. ;bc=x в bitmap (не портится)
  1730. ;de=y в bitmap (не портится)
  1731.         call calcbitmap_from_xy ;a=pg, hl=addr
  1732.         SETPGBITMAPLOW
  1733.         pop de
  1734.         pop bc
  1735.         ld a,(hl)
  1736.         ld (de),a
  1737.         inc e
  1738.         jr z,savefile_scr_readchrq
  1739.         inc c
  1740.         ld a,c
  1741.         and 7
  1742.         jr nz,savefile_scr_readchr0
  1743.         ld a,c
  1744.         sub 8
  1745.         ld c,a
  1746.         inc b
  1747.         jr savefile_scr_readchr0        
  1748. savefile_scr_readchrq
  1749. ;ищем 2 самых частых цвета (или угловой и другой. если другого нет, то он контрастный по отношению к угловому)
  1750.         ld hl,savefile_scr_chrbuf
  1751.         ld e,(hl)
  1752. savefile_scr_findcolors0
  1753.         ld a,(hl)
  1754.         cp e
  1755.         jr nz,savefile_scr_findcolorsq
  1756.         inc l
  1757.         jr nz,savefile_scr_findcolors0
  1758. ;другого нет, делаем по умолчанию контрастный
  1759.         ld a,e
  1760.         and 8
  1761.         bit 2,e
  1762.         jr nz,$+4 ;для цветов 4..7 контрастный - 0
  1763.         or 7 ;иначе 7
  1764. savefile_scr_findcolorsq
  1765.         ld d,a
  1766.         pop hl
  1767. ;d,e=цвета ink,paper
  1768. ;кодируем атрибут
  1769.         push hl
  1770.         ld a,h
  1771.         rra
  1772.         rra
  1773.         rra
  1774.         and 3
  1775.         add a,savefile_scr_attrbuf/256
  1776.         ld h,a
  1777.         ld a,e
  1778.         add a,a
  1779.         add a,a
  1780.         add a,a
  1781.         res 3,d ;ignore bright for ink
  1782.         add a,d
  1783.         ld (hl),a
  1784.         pop hl
  1785. ;кодируем пиксели
  1786.         ld c,e ;paper color
  1787.         push hl
  1788.         ld de,savefile_scr_chrbuf
  1789.         ld b,8
  1790. savefile_scr_mkpixels0
  1791.         ld (hl),0xfe
  1792. savefile_scr_mkpixels1
  1793.         ld a,(de)
  1794.         sub c ;0=paper
  1795.          add a,0xff ;ink=CY
  1796.         rl (hl)
  1797.         inc e
  1798.         jr c,savefile_scr_mkpixels1
  1799.         inc h
  1800.         djnz savefile_scr_mkpixels0
  1801.         pop hl
  1802. ;следующее знакоместо
  1803.         pop bc
  1804.         inc l
  1805.         ld a,c
  1806.         add a,8
  1807.         ld c,a
  1808.         jr nz,savefile_scr1
  1809.          inc l
  1810.          dec l
  1811.          jr nz,$+6
  1812.          ld a,h
  1813.          add a,8
  1814.          ld h,a
  1815.         ld a,b
  1816.         add a,8
  1817.         ld b,a
  1818.         cp 192
  1819.         jp nz,savefile_scr0
  1820.          ;jr $
  1821.         ld hl,savefile_scr_scrbuf
  1822.         ld bc,0x1b00
  1823. savefile_scrsave0
  1824.         ld a,(hl)
  1825.         WRITEBYTE_A
  1826.         cpi
  1827.         jp pe,savefile_scrsave0
  1828.        
  1829.         jp savefile_close_quit
  1830.  
  1831. fcb;=(-FCB_sz)&0xffff     ;ds FCB_sz
  1832.         ds FCB_sz
  1833. fcb_filename=fcb+FCB_FNAME        
  1834.  
  1835. fcb_print
  1836. fcbmask
  1837.         ds FCB_sz
  1838. fcbmask_filename=fcbmask+FCB_FNAME        
  1839.  
  1840. texit
  1841.         db "  Back",0
  1842. tquit
  1843.         db "  Quit to OS",0
  1844. tsave
  1845.         db "  Save",0
  1846. emptypath=$-1
  1847.  
  1848. temppicname=0xfe00 ;выше 0xc000
  1849. savepicname
  1850.         db "12345678.123",0
  1851.