?login_element?

Subversion Repositories NedoOS

Rev

Rev 516 | Rev 657 | Go to most recent revision | Blame | Compare with Previous | Last modification | View Log | Download | RSS feed

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