Subversion Repositories NedoOS

Rev

Rev 122 | Rev 144 | Go to most recent revision | Blame | Compare with Previous | Last modification | View Log | Download

  1.  
  2. NVOLUMES=8
  3. MAXFILES=8
  4. vol_trdos=4
  5.  
  6. ;яЁхфяюырурхЄё , ўЄю ■чхЁ эх шьххЄ ёЄхъ эшцх #3b00, шэрўх юэ чрЄЁ╕Є ёшёЄхьє
  7.  
  8. ;FCB ш шь  ьюцэю яхЁхфртрЄ№ т ы■сющ юсырёЄш userspace
  9. ;DTA ьюцхЄ с√Є№ т ы■сющ юсырёЄш userspace
  10. fatfs_org=0x4000
  11. ;CurrVol=0X4000+26
  12. ;CurrDir=CurrVol+1
  13.  
  14.         MACRO GETVOLUME
  15.         ;ld a,(CurrVol)
  16.         ;ld a,(iy+app.dir+DIR.ID)
  17.          ld a,(iy+app.vol)
  18.         ENDM
  19.         MACRO SETVOLUME
  20.         ;ld a,(CurrVol)
  21.         ;ld a,(iy+app.dir+DIR.ID)
  22.          ld (iy+app.vol),a
  23.         ENDM
  24.  
  25.         MACRO CHECKVOLUMETRDOS
  26.         GETVOLUME
  27.         cp vol_trdos
  28.         ENDM
  29.  
  30. BDOS_setpgtrdosfs
  31.         ld a,pgtrdosfs
  32.         jr BDOS_setpg4000
  33.         ;ld bc,memport4000
  34.         ;ld (sys_curpg4000),a
  35.         ;out (c),a
  36.         ;ret
  37.  
  38. BDOS_setpgfatfs
  39.         ld a,pgfatfs
  40. BDOS_setpg4000
  41.         ld bc,memport4000
  42.         ld (sys_curpg4000),a ;фы  sys_sysint
  43.         out (c),a
  44.         ret
  45.  
  46. blocksize=128 ;ёъюы№ъю срщЄют ўшЄрЄ№ т CP/M юяхЁрЎш ї
  47.  
  48. setmainpg_c000
  49.         ld a,(iy+app.mainpg)
  50.         ld bc,memportc000
  51.         out (c),a
  52.         ret
  53.  
  54. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  55. BDOS_wiznetopen
  56.         BDOSSETPGTRDOSFS ;яюЁЄшЄ bc
  57.         jp wiznet_open
  58.  
  59. BDOS_wiznetclose
  60.         BDOSSETPGTRDOSFS ;яюЁЄшЄ bc
  61.         jp wiznet_close
  62.  
  63. BDOS_wiznetread
  64. ;de=pointer, hl=buffer size
  65. ;out: hl=size
  66.         call BDOS_preparedepage
  67.         call BDOS_setdepage
  68. ;DE = Pointer to physical data
  69.         BDOSSETPGTRDOSFS
  70.         jp wiznet_read
  71.  
  72. BDOS_wiznetwrite
  73. ;de=pointer, hl=size
  74.         call BDOS_preparedepage
  75.         call BDOS_setdepage
  76. ;DE = Pointer to physical data
  77.         BDOSSETPGTRDOSFS
  78.         jp wiznet_write
  79.  
  80. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  81.        
  82. BDOS_setscreen
  83.         ;ld iy,(appaddr)
  84. ;e=screen=0..1
  85.         ld a,e
  86.         add a,a
  87.         add a,a
  88.         add a,a
  89.         ld d,a
  90.         or fd_user
  91.         ld (iy+app.screen),a
  92.         xor a ;success
  93.         ret;jr rest_exit
  94.  
  95. BDOS_getscreenpages
  96. ;out: de=ёЄЁрэшЎ√ 0-ую ¤ъЁрэр (d=ёЄрЁ°р ), hl=ёЄЁрэшЎ√ 1-ую ¤ъЁрэр (h=ёЄрЁ°р )
  97.         ld de,pgscr0_1*256+pgscr0_0
  98.         ld hl,pgscr1_1*256+pgscr1_0
  99.         xor a
  100.         ret
  101.  
  102. BDOS_getappmainpages
  103. ;e=id
  104. ;out: d,e,h,l=pages in 0000,4000,8000,c000, c=flags
  105.         call BDOS_findapp
  106.         jp nz,BDOS_fail
  107. BDOS_getmainpages
  108.         ;ld iy,(appaddr)
  109. ;out: dehl=эюьхЁр ёЄЁрэшЎ т 0000,4000,8000,c000, c=flags
  110. BDOS_getmainpages_iy
  111.         call setmainpg_c000
  112.         ld d,a
  113.         ld a,(curpg16k+#c000)
  114.         ld e,a
  115.         ld a,(curpg32klow+#c000)
  116.         ld hl,(curpg32khigh+#c000)
  117.         ld h,a
  118.         ld c,(iy+app.flags)
  119.         xor a
  120.         ret
  121.  
  122. BDOS_preparedepage
  123. ;de=userspace addr
  124. ;out: de>=#8000, тъы■ўхэ√ эєцэ√х ёЄЁрэшЎ√ т 8000,c000
  125.         ;ld iy,(appaddr)
  126.         ld a,(iy+app.mainpg)
  127.         ld bc,memport8000
  128.         out (c),a
  129.         bit 7,d
  130.         jr nz,BDOS_preparedepage8000_c000
  131.         bit 6,d
  132.         jr nz,BDOS_preparedepage4000_8000
  133.         set 7,d
  134.         ld (depage8000),a
  135.         ld a,(curpg16k+#8000)
  136.         ;ld bc,memportc000
  137.         ;out (c),a
  138.         ld (depagec000),a
  139.         ret
  140. BDOS_preparedepage4000_8000
  141.         ld a,d
  142.         add a,#40
  143.         ld d,a
  144.         ld a,(curpg32klow+#8000)
  145.         ;ld bc,memportc000
  146.         ;out (c),a
  147.         ld (depagec000),a
  148.         ld a,(curpg16k+#8000)
  149.         ;ld bc,memport8000
  150.         ;out (c),a
  151.         ld (depage8000),a
  152.         ret
  153. BDOS_preparedepage8000_c000
  154.         ld a,(curpg32khigh+#8000)
  155.         ;ld bc,memportc000
  156.         ;out (c),a
  157.         ld (depagec000),a
  158.         ld a,(curpg32klow+#8000)
  159.         ;ld bc,memport8000
  160.         ;out (c),a
  161.         ld (depage8000),a
  162.         ret
  163.  
  164. BDOS_setdepage
  165. ;keep de,hl
  166. depagec000=$+1
  167.         ld a,0
  168.         ld bc,memportc000
  169.         out (c),a
  170. depage8000=$+1
  171.         ld a,0
  172.         ld b,memport8000_hi
  173.         out (c),a
  174.         ret
  175.  
  176. BDOS_setpgstructs
  177.         ld a,pgfatfs2
  178.         ld bc,memportc000
  179.         out (c),a
  180.         ret
  181.  
  182. BDOS_setpal
  183.         call BDOS_preparedepage
  184.         call BDOS_setdepage
  185. ;de=ярышЄЁр (т√°х #c000)
  186.         push iy
  187.         pop hl
  188.         ld bc,app.pal
  189.         add hl,bc
  190.         ex de,hl
  191.         ld bc,32
  192.         ldir
  193.         xor a
  194.         ret
  195.        
  196. BDOS_scroll_prepare
  197.         ld a,l
  198.         srl a
  199.         ld (BDOS_scrollpagelinelayer_wid),a
  200.         ld b,h
  201.         dec b
  202. BDOS_countxy
  203. ;keeps bc
  204.         ld a,d ;y
  205.         sub -#87&#ff ;#e1c0*4=#8700
  206.         rra
  207.         ld h,a
  208.          ld a,0;16
  209.         rra
  210.         sra h
  211.         rra
  212.         ld l,e ;x
  213.         srl l
  214.         jr c,$+4
  215.         res 5,h
  216.         add a,l
  217.         ld l,a
  218.         ret
  219.  
  220. BDOS_getxy
  221. ;out: de=yx ;GET CURSOR POSITION
  222.         ;ld hl,(pr_textmode_curaddr)
  223.         ld l,(iy+app.textcuraddr)
  224.         ld h,(iy+app.textcuraddr+1)
  225.         ld a,h
  226.         rla
  227.         rla
  228.         rla ;bit5
  229.         ld a,l
  230.         rla
  231.         and 0x7f
  232.         ld e,a ;x
  233.         add hl,hl
  234.         add hl,hl ;h=y*4 + const + n*#80
  235.         ld a,h
  236.         sub 0x87 ;#e1c0*4=#8700
  237.         and 0x1f
  238.         ld d,a ;y
  239.         xor a ;success
  240.         ret
  241.  
  242. BDOS_countattraddr
  243.         BDOSSETPGSSCR
  244.         ;ld hl,(pr_textmode_curaddr)
  245.         ld l,(iy+app.textcuraddr)
  246.         ld h,(iy+app.textcuraddr+1)
  247.         ld a,h
  248.         xor #60 ;attr + #20
  249.         ld h,a
  250.          and #20
  251.         jr nz,$+3
  252.         inc l
  253.         ret
  254.        
  255. BDOS_prattr
  256. ;e=color byte
  257.          ld hl,(appaddr)
  258.          ld bc,(focusappaddr)
  259.          or a
  260.          sbc hl,bc
  261.          ret nz
  262.         call BDOS_countattraddr
  263.         ld (hl),e
  264.         ret
  265.  
  266. BDOS_getattr
  267. ;out: a=color byte
  268.         call BDOS_countattraddr
  269.         ld a,(hl)
  270.         ret
  271.  
  272. BDOS_setxy
  273. ;de=yx
  274.         call BDOS_countxy
  275. BDOS_settextcuraddr
  276.         ;ld (pr_textmode_curaddr),hl
  277.         ld (iy+app.textcuraddr),l
  278.         ld (iy+app.textcuraddr+1),h
  279.         xor a ;success
  280.         ret
  281.        
  282. BDOS_prchar_controlcode
  283.         cp #0a
  284.         jr z,BDOS_prchar_lf
  285.         cp #0d
  286.         jp nz,BDOS_prchar_nocontrolcode
  287.         ;jr z,BDOS_prchar_cr
  288. BDOS_prchar_cr
  289.         ld a,l
  290.         and #c0
  291.         ld l,a
  292.         res 5,h
  293.         jr BDOS_settextcuraddr
  294.         ;jp BDOS_prchar_q
  295.        
  296. BDOS_prchar_lf
  297.         ld a,l
  298.         add a,#40
  299.         ld l,a
  300.         jr nc,BDOS_settextcuraddr ;BDOS_prchar_q ;ret nc
  301.         jr BDOS_prchar_lf_q
  302.  
  303. BDOS_prchar
  304. ;e=char
  305.         ld a,e
  306. BDOS_prchar_a
  307. ;яюЁЄшЄ Єюы№ъю #c000+, эю ёрьр тюёёЄрэртыштрхЄ Єрь pgkillable
  308.         ld h,trecode/256
  309.         ld l,a
  310.         ld a,(hl)
  311. ;pr_textmode_curaddr=$+1
  312.         ;ld hl,#c1c0
  313.         ld l,(iy+app.textcuraddr)
  314.         ld h,(iy+app.textcuraddr+1)
  315.         cp #0e
  316.         jr c,BDOS_prchar_controlcode
  317. BDOS_prchar_nocontrolcode
  318.          push hl
  319.          ld hl,(appaddr)
  320.          ld de,(focusappaddr)
  321.          or a
  322.          sbc hl,de
  323.          pop hl
  324.          jr nz,BDOS_prchar_skip
  325.         ld de,pgscr0_1*256+pgscr0_0
  326.         ld bc,memportc000
  327.         out (c),d ;text
  328.         ld (hl),a
  329.         out (c),e ;attr
  330. BDOS_prchar_skip        
  331.  
  332.         ld de,#2000 + pgkillable
  333.        
  334.          push af
  335.  
  336.         ld a,h
  337.         xor d;#20 ;attr + #20
  338.         ld h,a
  339.         and d;#20
  340.         jr nz,$+3
  341.         inc l
  342.  
  343.          pop af
  344.          jr nz,BDOS_prchar_skipattr
  345. ;pr_textmode_curcolor=$+1
  346.         ;ld (hl),7
  347.         ld a,(iy+app.curcolor)
  348.         ld (hl),a
  349.        
  350.         ;set 6,h ;attr -> next char
  351.  
  352.         ;ld e,pgkillable
  353.         out (c),e ;pgkillable
  354. BDOS_prchar_skipattr
  355.  
  356.         ld a,l
  357.         and #3f
  358.         cp 80/2
  359.         ;ld (pr_textmode_curaddr),hl
  360.         ld (iy+app.textcuraddr),l
  361.         ld (iy+app.textcuraddr+1),h
  362.         ret nz ;jr nz,BDOS_prchar_q ;ret nz ;эхЄ яхЁхэюёр ёЄЁюъш
  363.         ld a,l
  364.         and #c0
  365.         add a,#40
  366.         ld l,a
  367.         jr nc,BDOS_settextcuraddr ;BDOS_prchar_q ;ret nc
  368. BDOS_prchar_lf_q
  369.         inc h
  370.         bit 3,h
  371.         jr z,BDOS_settextcuraddr ;BDOS_prchar_q ;эхЄ т√їюфр чр яюёыхфэ■■ ёЄЁюъє
  372. BDOS_scrolllock0
  373.         ld a,#fe
  374.         in a,(#fe)
  375.         rra ;Caps Shift
  376.         jr nc,BDOS_scrolllock0
  377.         ld hl,(appaddr)
  378.         ld de,(focusappaddr)
  379.         or a
  380.         sbc hl,de
  381.         jr nz,BDOS_prchar_skipscroll
  382. ;scroll+clear bottom line
  383.         call BDOS_scrollpage ;attr
  384.         ld a,pgscr0_1 ;text
  385.         ld bc,memportc000
  386.         out (c),a
  387.         call BDOS_cllastline
  388.         ld a,pgscr0_0 ;attr
  389.         ld bc,memportc000
  390.         out (c),a
  391.         call BDOS_cllastline
  392.         ld a,pgkillable
  393.         ld bc,memportc000
  394.         out (c),a
  395. BDOS_prchar_skipscroll
  396.         ld hl,#c7c0
  397. BDOS_prchar_q
  398.         jp BDOS_settextcuraddr
  399.         ;;ld (pr_textmode_curaddr),hl
  400.         ;ld (iy+app.textcuraddr),l
  401.         ;ld (iy+app.textcuraddr+1),h
  402.         ;ret
  403.        
  404. BDOS_scrollpage
  405.         ld a,40
  406.         ld (BDOS_scrollpagelinelayer_wid),a
  407.         ld hl,#c1c0
  408.         ld b,24
  409. BDOS_scrollpage0
  410.         push bc
  411.         ld d,h
  412.         ld e,l
  413.         ld bc,64
  414.         add hl,bc
  415.         call BDOS_scrollpageline
  416.         pop bc
  417.         djnz BDOS_scrollpage0
  418.         ret
  419. BDOS_scrollpageline
  420.         ld a,pgscr0_1 ;text
  421.         or a
  422.         call BDOS_scrollpagelinelayers ;text
  423.         ld a,pgscr0_0 ;attr
  424.         scf
  425. BDOS_scrollpagelinelayers
  426.         ld bc,memportc000
  427.         out (c),a
  428.         push af
  429.         push de
  430.         push hl
  431.         set 5,h
  432.         set 5,d
  433.         or a
  434.         call BDOS_scrollpagelinelayer
  435.         pop hl
  436.         pop de
  437.         pop af
  438. BDOS_scrollpagelinelayer
  439.         push de
  440.         push hl
  441.         jr nc,$+4
  442.         inc hl
  443.         inc de
  444. BDOS_scrollpagelinelayer_wid=$+1
  445.         ld bc,39;40
  446.         ldir
  447.         pop hl
  448.         pop de
  449.         ret
  450.  
  451. BDOS_scrolldown
  452. ;de=topyx, hl=hgt,wid
  453. ;x, wid even
  454.          push hl
  455.          ld hl,(appaddr)
  456.          ld bc,(focusappaddr)
  457.          or a
  458.          sbc hl,bc
  459.          pop hl
  460.          ret nz
  461.         ld a,d
  462.         add a,h
  463.         dec a
  464.         ld d,a ;ybottom
  465.         call BDOS_scroll_prepare
  466. BDOS_scrolldown0
  467.         push bc
  468.         ld d,h
  469.         ld e,l
  470.         ld bc,-64
  471.         add hl,bc
  472.         call BDOS_scrollpageline
  473.         pop bc
  474.         djnz BDOS_scrolldown0
  475.         ret
  476.  
  477. BDOS_scrollup
  478. ;de=topyx, hl=hgt,wid
  479. ;x, wid even
  480.          push hl
  481.          ld hl,(appaddr)
  482.          ld bc,(focusappaddr)
  483.          or a
  484.          sbc hl,bc
  485.          pop hl
  486.          ret nz
  487.         call BDOS_scroll_prepare
  488.         jp BDOS_scrollpage0
  489.        
  490. BDOS_cllastline
  491.         ld hl,#c7c0
  492.         call BDOS_scrollpage_clline
  493.         ;ld de,#c7c1
  494.         ;ld bc,64-1
  495.         ;ld (hl),b
  496.         ;ldir
  497.         ld hl,#e7c0
  498. BDOS_scrollpage_clline        
  499.         ld d,h
  500.         ld e,l
  501.         inc e
  502.         ld bc,64-1
  503.         ld (hl),b
  504.         ldir ;clear bottom line
  505.         ret
  506.        
  507. BDOS_setcolor
  508. ;e=color byte
  509.         ;ld a,e
  510.         ;ld (pr_textmode_curcolor),a
  511.         ld (iy+app.curcolor),e
  512.         ret
  513.        
  514. BDOS_cls
  515.          ld hl,(appaddr)
  516.          ld bc,(focusappaddr)
  517.          or a
  518.          sbc hl,bc
  519.          ret nz
  520.         ;ld iy,(appaddr)
  521. ;e=color byte
  522.         BDOSSETPGSSCR
  523.         ld a,(iy+app.gfxmode)
  524.         and 7
  525.         jr z,BDOS_cls_EGA
  526.          cp 2 ;MC hires
  527.          jr z,BDOS_cls_EGA ;TODO юЄфхы№эє■ юўшёЄъє фы  MC hires
  528. ;textmode
  529.         ld a,e ;attr byte
  530.         ld hl,#81c0
  531.         call BDOS_cls_textmode_ldir
  532.         ld hl,#a1c0
  533.         call BDOS_cls_textmode_ldir
  534.        
  535.         ;ld de,0
  536.         ld d,b
  537.         ld e,b ;0
  538.         call BDOS_setxy
  539.        
  540.         xor a
  541.         ld hl,#c1c0
  542.         call BDOS_cls_textmode_ldir
  543.         ld hl,#e1c0
  544. BDOS_cls_textmode_ldir
  545.         ld d,h
  546.         ld e,l
  547.         inc de
  548.         ld (hl),a
  549.         ld bc,25*64-1
  550.         ldir
  551.         ret
  552. BDOS_cls_EGA
  553.         ld a,e
  554. scrbase=#8000
  555. ;ўшёЄшь ўхЁхч ёЄхъ, ъЁюьх яхЁт√ї срщЄют (шэрўх яЁхЁ√трэшх ьюцхЄ чряюЁЄшЄ№ фтр срщЄр яхЁхф ¤ъЁрэюь)
  556.         ld (clssp),sp
  557.         ld hl,scrbase+(200*40) ;ўшёЄшь ё ъюэЎр, яюЄюьє ўЄю яЁхЁ√трэшх яюЁЄшЄ ёЄхъ
  558.         ld b,200-1
  559. clsline0
  560.         ld d,a
  561.         ld e,a
  562.         ld sp,hl
  563.         dup 20
  564.         push de
  565.         edup
  566.         set 5,h
  567.         ld sp,hl
  568.         dup 20
  569.         push de
  570.         edup
  571.         set 6,h
  572.         ld sp,hl
  573.         dup 20
  574.         push de
  575.         edup
  576.         res 5,h
  577.         ld sp,hl
  578.         dup 20
  579.         push de
  580.         edup
  581.         ;res 6,h
  582.         ld de,-40-#4000
  583.         add hl,de
  584.         djnz clsline0
  585. clssp=$+1
  586.         ld sp,0
  587.         ld hl,#0000 + scrbase
  588.         call clslayer2
  589.         ;ld hl,#2000 + scrbase
  590.         ;call clslayer
  591. clslayer2
  592.         ;ld hl,#4000 + scrbase
  593.         call clslayer
  594.         ;ld hl,#6000 + scrbase
  595. clslayer
  596.         ld d,h
  597.         ld e,l
  598.         inc de
  599.         ld  c,40-1;8000-1
  600.         ld (hl),a
  601.         ldir
  602.         ld de,#2000-(40-1)
  603.         add hl,de
  604.         ret
  605.  
  606. BDOShandler
  607.         push hl
  608.         ld a,c
  609.         ld hl,tbdoscmds
  610.         push bc
  611.         ld bc,nbdoscmds
  612.         cpir
  613.         jp nz,BDOS_pop2fail
  614. ;bc=nbdoscmds-(#ъюьрэф√+1) = 0..(nbdoscmds-1)
  615.         add hl,bc
  616. ;hl=tbdoscmds+nbdoscmds
  617.         add hl,bc
  618.         add hl,bc
  619. ;hl=tbdoscmds+nbdoscmds+ 2*(nbdoscmds-(#ъюьрэф√+1))
  620.         pop bc
  621.         ld a,(hl)
  622.         inc hl
  623.         ld h,(hl)
  624.         ld l,a
  625.         ;hl=jump addr
  626.         ex (sp),hl
  627.         ret
  628.  
  629. tbdoscmds
  630.          db CMD_PRATTR
  631.          db CMD_SETXY
  632.          db CMD_SETCOLOR
  633.          db CMD_GETATTR
  634.          db CMD_PRCHAR
  635.          db CMD_WIZNETREAD
  636.         db CMD_SETDTA;0x1a
  637.         db CMD_FOPEN;0x0f
  638.         db CMD_FREAD;0x14
  639.         db CMD_FCLOSE;0x10
  640.         db CMD_FDEL;0x13
  641.         db CMD_FCREATE;0x16
  642.         db CMD_FWRITE;0x15
  643.         db CMD_FSEARCHFIRST;0x11
  644.         db CMD_FSEARCHNEXT;0x12
  645.         db CMD_SETDRV
  646.         db CMD_PARSEFNAME;0x5c
  647.         db CMD_CHDIR
  648.         db CMD_GETPATH
  649.         db CMD_GETKEYMATRIX
  650.         db CMD_GETTIMER
  651.         db CMD_YIELD
  652.         db CMD_RUNAPP
  653.         db CMD_NEWAPP
  654.         db CMD_CLS
  655.         db CMD_SETGFX
  656.         db CMD_SETPAL
  657.         db CMD_GETMAINPAGES
  658.         db CMD_NEWPAGE
  659.         db CMD_DELPAGE
  660.         db CMD_SETSCREEN
  661.         db CMD_GETSCREENPAGES
  662.         db CMD_MOUNT
  663.         db CMD_FREEZEAPP
  664.         db CMD_WAITPID
  665.         db CMD_MKDIR
  666.         db CMD_RENAME
  667.         db CMD_SETSYSDRV
  668.         ;db CMD_GETKEYNOLANG
  669.         db CMD_FWRITE_NBYTES
  670.         db CMD_SCROLLUP
  671.         db CMD_SCROLLDOWN
  672.         db CMD_OPENHANDLE
  673.         db CMD_CREATEHANDLE
  674.         db CMD_CLOSEHANDLE
  675.         db CMD_READHANDLE
  676.         db CMD_WRITEHANDLE
  677.         db CMD_SEEKHANDLE
  678.         db CMD_TELLHANDLE
  679.         db CMD_SETFILETIME
  680.         db CMD_GETFILETIME
  681.         db CMD_GETTIME
  682.         db CMD_GETXY
  683.         db CMD_GETAPPMAINPAGES
  684.         db CMD_DROPAPP
  685.         db CMD_WIZNETOPEN
  686.         db CMD_WIZNETCLOSE
  687.         db CMD_WIZNETWRITE
  688.         db CMD_GETFILESIZE
  689.         db CMD_DELETE
  690.         db CMD_SETWAITING
  691. nbdoscmds=$-tbdoscmds
  692.         dw BDOS_setwaiting
  693.         dw BDOS_delete
  694.         dw BDOS_getfilesize
  695.         dw BDOS_wiznetwrite
  696.         dw BDOS_wiznetclose
  697.         dw BDOS_wiznetopen
  698.         dw BDOS_dropapp
  699.         dw BDOS_getappmainpages
  700.         dw BDOS_getxy
  701.         dw BDOS_gettime
  702.         dw BDOS_getfiletime
  703.         dw BDOS_setfiletime
  704.         dw BDOS_tellhandle
  705.         dw BDOS_seekhandle
  706.         dw BDOS_writehandle
  707.         dw BDOS_readhandle
  708.         dw BDOS_closehandle
  709.         dw BDOS_createhandle
  710.         dw BDOS_openhandle
  711.         dw BDOS_scrolldown
  712.         dw BDOS_scrollup
  713.         dw BDOS_fwrite_nbytes
  714.         ;dw BDOS_getkeynolang
  715.         dw BDOS_setsysdrv
  716.         dw BDOS_rename
  717.         dw BDOS_mkdir
  718.         dw BDOS_waitpid
  719.         dw BDOS_freezeapp
  720.         dw BDOS_mount
  721.         dw BDOS_getscreenpages
  722.         dw BDOS_setscreen
  723.         dw BDOS_delpage
  724.         dw BDOS_newpage
  725.         dw BDOS_getmainpages
  726.         dw BDOS_setpal
  727.         dw BDOS_setgfx
  728.         dw BDOS_cls
  729.         dw BDOS_newapp
  730.         dw BDOS_runapp
  731.         dw BDOS_yield
  732.         dw BDOS_gettimer
  733.         dw BDOS_getkeymatrix
  734.         dw BDOS_getpath
  735.         dw BDOS_chdir
  736.         dw BDOS_parse_filename
  737.         dw BDOS_setdrv
  738.         dw BDOS_fsearchnext
  739.         dw BDOS_fsearchfirst
  740.         dw BDOS_fwrite
  741.         dw BDOS_fcreate
  742.         dw BDOS_fdel
  743.         dw BDOS_fclose
  744.         dw BDOS_fread
  745.         dw BDOS_fopen
  746.         dw BDOS_setdta
  747.          dw BDOS_wiznetread
  748.          dw BDOS_prchar
  749.          dw BDOS_getattr
  750.          dw BDOS_setcolor
  751.          dw BDOS_setxy
  752.          dw BDOS_prattr
  753.        
  754. BDOS_getkeymatrix
  755. ;out: bcdehlix = яюыєЁ ф√ cs...space
  756.         ld hl,(appaddr)
  757.         ld de,(focusappaddr)
  758.         or a
  759.         sbc hl,de
  760.         jr nz,BDOS_getkeymatrix_fail
  761.         ld bc,#7ffe
  762.         in a,(c)
  763.         ld lx,a  ;lx=%???bnmS_
  764.         ld b,#bf
  765.         in a,(c)
  766.         ld hx,a  ;hx=%???hjklE
  767.         ld b,#df
  768.         in l,(c)  ;l=%???yuiop
  769.         ld b,#ef
  770.         in h,(c)  ;h=%???67890
  771.         ld b,#f7
  772.         in e,(c)  ;e=%???54321
  773.         ld b,#fb
  774.         in d,(c)  ;d=%???trewq
  775.         ld a,#fd
  776.         in a,(#fe);c=%???gfdsa
  777.         ld b,c;#fe
  778.         in b,(c)  ;b=%???vcxzC
  779.         ld c,a
  780.         ret
  781. BDOS_getkeymatrix_fail
  782.         ld bc,#ffff
  783.         ld d,c
  784.         ld e,c
  785.         ld h,c
  786.         ld l,c
  787.         push bc
  788.         pop ix
  789.         ret
  790.  
  791. BDOS_gettimerX
  792. BDOS_gettimer
  793.         ld hl,(sys_timer+2)
  794.         ld de,(sys_timer)
  795.          ld a,(sys_timer+2)
  796.          sub l
  797.          jr nz,BDOS_gettimerX ;фы  рЄюьрЁэюёЄш
  798.         ret ;a=0
  799.        
  800. BDOS_yield
  801. ;ЁхушёЄЁ√ эх ёюїЁрэ хь, Є.ъ. эрь эх трцэю, ўЄю эр т√їюфх шч yield
  802. ;эю эрфю:
  803. ;тч Є№ рфЁхё ёЄхър фы  т√їюфр шч CALLBDOS ш чряшёрЄ№ хую т ld sp эр т√їюфх шч юсЁрсюЄўшър яЁхЁ√трэшщ
  804. ;тч Є№ рфЁхё тючтЁрЄр шч CALLBDOS ш чряшёрЄ№ хую т jp эр т√їюфх шч юсЁрсюЄўшър яЁхЁ√трэшщ
  805.         ;ld iy,(appaddr)
  806.        
  807.         if bdosstack_sz==0
  808.         ld hl,(callbdos_sp)
  809.         else
  810.         ;ld l,(iy+app.callbdos_sp)
  811.         ;ld h,(iy+app.callbdos_sp+1)
  812.         exx
  813.         endif
  814.  
  815.         call setmainpg_c000
  816.         ld (intsp+#c000),hl
  817.  
  818.         ex de,hl
  819.         call BDOS_preparedepage
  820.         call BDOS_setdepage
  821.         ex de,hl
  822.        
  823.         ld e,(hl)
  824.         inc hl
  825.         ld d,(hl)
  826.  
  827.         call setmainpg_c000
  828.         ld (intjp+#c000),de
  829.  
  830.         ld a,pgkillable
  831.         out (c),a
  832.         ld b,memport8000_hi
  833.         out (c),a
  834.        
  835.         ld a,0xc0
  836.         ld (callbdos_mutex),a ;Єю цх ёрьюх фхыр■Є Єх ЇєэъЎшш BDOS, ъюЄюЁ√х эх ёюсшЁр■Єё  тючтЁр∙рЄ№ё 
  837.  
  838. ;эх т√їюфшь шч CALLBDOS, тчрьхэ °хфєышь ш т√їюфшь ўхЁхч ъюэхЎ юсЁрсюЄўшър яЁхЁ√трэшщ
  839.  
  840. BDOS_yield_q
  841.         ;di ;TODO critical section
  842.  
  843.         push iy
  844.         call schedule ;out: hl=iy=app ;ьюцэю ё тъы■ўхээ√ьш яЁхЁ√трэш ьш, яюър ёшёЄхьэ√щ юсЁрсюЄўшъ эх єьххЄ °хфєышЄ№
  845.         pop de
  846.         or a
  847.         sbc hl,de
  848.         jr nz,BDOS_yield_nosame
  849.         ld iy,app1 ;idle (TODO тьхёЄю ¤Єюую ёфхырЄ№ яюыэюЎхээ√х яЁшюЁшЄхЄ√)
  850.         ld (appaddr),iy
  851. BDOS_yield_nosame
  852.        
  853.         di ;TODO critical section
  854.  
  855. ;хёыш ёхщўрё эх яюёЄртшЄ№ ярышЄЁє тЄюЁющ чрфрўх, Єю юэр эшъюуфр эх яюёЄртшЄё , хёыш яхЁтр  чрфрўр т Ўшъых фхырхЄ yield
  856. ;яюЄюьє ўЄю тёх яЁхЁ√трэш  сєфєЄ ёЄртшЄ№ яхЁтє■ чрфрўє
  857.         ;ld hl,(appaddr)
  858.         ;ld iy,(appaddr)
  859.         ;call iffocus_setgfx ;ьюуєЄ с√Є№ яЁюсыхь√ ё т√ёЄртыхэшхь ярышЄЁ√, хёыш yield т√ч√трЄ№ т ёыєўрщэ√ї ьхёЄрї шыш хёыш тёх чрфрўш эхръЄштэ√
  860. ;яю¤Єюьє юсЁрсюЄўшъ яЁхЁ√трэшщ фюыцхэ т√ёЄрты Є№ ярышЄЁє чрфрўш, ъюЄюЁр  т Їюъєёх, эхчртшёшью юЄ х╕ ръЄштэюёЄш
  861.        
  862.         jp sys_int_popregs ;Єрь ei
  863.        
  864. BDOS_newapp
  865. ;яюър ёЄЁєъЄєЁр эх чряюыэхэр фю ъюэЎр, эхы№ч  фхырЄ№ runapp
  866. ;out: b=id, dehl=эюьхЁр ёЄЁрэшЎ т 0000,4000,8000,c000 эютюую яЁшыюцхэш , a=error
  867.         BDOSSETPGTRDOSFS
  868.         ld a,(iy+app.id)
  869.         push af ;parent id
  870.          ld l,(iy+app.textcuraddr)
  871.          ld h,(iy+app.textcuraddr+1)
  872.          push hl
  873.           di ;ьхцфє findfreeid+findfreeappstruct ш чряюыэхэшхь iy+app.id эхы№ч  яхЁхъы■ўрЄ№ чрфрўш!!! ;TODO critical section
  874.         call sys_findfreeid ;яюЁЄшЄ iy
  875.          pop hl
  876.         push af ;id
  877.          push hl
  878.         call sys_findfreeappstruct ;тючтЁр∙рхЄ iy = рфЁхё яхЁтющ ётюсюфэющ ёЄЁєъЄєЁ√ app ;TODO error
  879.          pop hl
  880.          jr nz,BDOS_newapp_fail
  881.         pop af ;id
  882.         push af ;id
  883.         ld e,#ff ;auto page
  884.         ;hl=textcuraddr
  885.         call sys_newapp
  886.           ei
  887.          push iy
  888.          pop de
  889.          ld hl,(appaddr)
  890.          ld bc,app.vol
  891.          add hl,bc
  892.          ex de,hl
  893.          add hl,bc
  894.          ex de,hl
  895.          ld bc,5;DIR_sz
  896.          ;jr $
  897.          ldir ;ъюяшЁютрЄ№ Єхъє∙шщ vol ш dircluster
  898.         call BDOS_getmainpages_iy
  899.         pop bc ;b=id
  900.         pop af ;parent id
  901.         ld (iy+app.parentid),a
  902.         xor a
  903.         ret ;success
  904. BDOS_newapp_fail
  905.         pop af
  906.         pop af
  907.         ld a,#ff
  908.           ei
  909.         ret
  910.  
  911. BDOS_findapp
  912. ;nz=error
  913.         ld iy,app1
  914.         ld a,e
  915.         ld de,app_sz
  916.         ld b,MAXAPPS
  917. BDOS_findapp0
  918.         cp (iy+app.id)
  919.         ret z
  920.         add iy,de
  921.         djnz BDOS_findapp0
  922.         ret ;nz
  923.        
  924. BDOS_dropapp
  925. ;e=id
  926.         call BDOS_findapp
  927.         jp nz,BDOS_fail ;BDOS_popfail
  928.         call BDOS_freezeapp_go
  929. BDOS_delapppages
  930.         ld hl,tsys_pages
  931.         ld a,(iy+app.id)
  932.         ld b,sys_npages&0xff
  933. sys_quit_delpages0
  934.         cp (hl) ;ёЄЁрэшЎр ёэшьрхьющ чрфрўш
  935.         jr nz,$+4
  936.         ld (hl),0 ;юётюсюфшыш ёЄЁрэшЎє
  937.         inc hl
  938.         djnz sys_quit_delpages0
  939.         ld (iy+app.id),b;0 ;юётюсюфшыш ьхёЄю
  940.         xor a ;ok
  941.         ret
  942.        
  943. BDOS_runapp
  944. ;e=id
  945.         ;push iy
  946.         call BDOS_findapp
  947.         jp nz,BDOS_fail ;BDOS_popfail
  948.         set factive,(iy+app.flags)
  949.         ;pop iy
  950.         xor a
  951.         ret
  952.  
  953. BDOS_setwaiting
  954.          set fwaiting,(iy+app.flags)
  955.         ret
  956.  
  957. BDOS_waitpid
  958. ;e=id
  959. ;check for app close (a=0 and reset waiting, or else a!=0)
  960.          push iy
  961.          ;set fwaiting,(iy+app.flags)
  962.         ld c,(iy+app.id) ;my (parent's) id ;caller is the parent
  963.          ;jr $
  964.         push bc
  965.         call BDOS_findapp ;iy=found app
  966.         pop bc
  967.         ld a,(iy+app.parentid)
  968.          pop iy
  969.         jr nz,BDOS_waitpid_OK ;app doesn't exist = OK
  970.         cp c ;parent id
  971.         jp z,BDOS_fail ;existing app = fail
  972. BDOS_waitpid_OK
  973.          res fwaiting,(iy+app.flags)
  974.         xor a
  975.         ret
  976.  
  977. ;BDOS_setwaiting
  978. ;        ret
  979.        
  980. BDOS_setgfx
  981.         ;ld iy,(appaddr)
  982. ;e=0:EGA, e=2:MC, e=3:6912, e=6:text
  983. ;e=-1: disable gfx (out: e=old gfxmode)
  984.         ld a,e
  985.         cp -1
  986.         jr z,BDOS_gfxoff;BDOS_gfxoff_givefocus
  987.         or %10101000
  988.         ld (iy+app.gfxmode),a
  989.        
  990. ;ъырф╕ь Їюъєё т ёЄхъ, Єюы№ъю хёыш эх фтр Ёрчр setgfx т юфэющ чрфрўх:
  991.         ld hl,(focusappaddr)
  992.         push iy
  993.         pop de
  994.         or a
  995.         sbc hl,de
  996.         jr z,BDOS_setgfx_nopushfocus
  997.          ld hl,(oldfocusappaddr)
  998.          ld (oldoldfocusappaddr),hl ;TODO ёЄхъ Їюъєёют (ўЄюс√ яюёых чръЁ√Єш  чрфрўш тхЁэєЄ№ Їюъєё т√чтрт°хщ)
  999.         ld hl,(focusappaddr)
  1000.         ld (oldfocusappaddr),hl ;TODO ёЄхъ Їюъєёют (ўЄюс√ яюёых чръЁ√Єш  чрфрўш тхЁэєЄ№ Їюъєё т√чтрт°хщ)
  1001.         ld (focusappaddr),iy
  1002. BDOS_setgfx_nopushfocus        
  1003.         set fgfx,(iy+app.flags)
  1004.         ld e,(iy+app.gfxmode)
  1005.         xor a ;success
  1006.         ret
  1007. BDOS_gfxoff
  1008.         ld e,(iy+app.gfxmode)
  1009.         push de
  1010.         call BDOS_gfxoff_givefocus
  1011.         pop de
  1012.         ret
  1013.  
  1014.        
  1015. BDOS_freezeapp
  1016. ;e=id
  1017.         ;push iy
  1018.         call BDOS_findapp
  1019.         jp nz,BDOS_fail ;BDOS_popfail
  1020. BDOS_freezeapp_go
  1021.         ;ld (iy+app.flags),0 ;яюър ЄєЄ 0, чрфрўє эшъЄю эх сєфхЄ ЄЁюурЄ№
  1022.         res factive,(iy+app.flags)
  1023. BDOS_gfxoff_givefocus
  1024.         res fgfx,(iy+app.flags) ;хёыш т ъюэЎх, Єю яю фюЁюух ьюуєЄ тЁєўэє■ яхЁхъы■ўшЄ№ Їюъєё, р хёыш т эрўрых, Єю ...
  1025. ;хёыш Їюъєё є ¤Єющ чрфрўш, Єю фрЄ№ Їюъєё ъръющ-эшсєф№ уЁрЇшўхёъющ чрфрўх
  1026.         push iy
  1027.         pop hl
  1028.         ld de,(focusappaddr)
  1029.         xor a
  1030.         sbc hl,de
  1031.         ret nz ;jr nz,sys_quit_findgfxapp_fail ;Їюъєё эх є ¤Єющ чрфрўш
  1032.        
  1033.          ;jr $
  1034. oldfocusappaddr=$+1
  1035.         ld hl,app1
  1036. oldoldfocusappaddr=$+1
  1037.          ld de,app1
  1038.          ld (oldfocusappaddr),de
  1039.         bit fgfx,(hl)
  1040.         jr nz,sys_quit_findgfxappq ;TODO ёЄхъ Їюъєёют (ўЄюс√ яюёых чръЁ√Єш  чрфрўш тхЁэєЄ№ Їюъєё т√чтрт°хщ)
  1041.        
  1042.         ld hl,app1
  1043.         ld bc,-app_last;app_afterlast
  1044.         ld de,app_last+app_sz;app_sz
  1045. sys_quit_findgfxapp0
  1046.         add hl,bc
  1047.         jr c,sys_quit_findgfxapp_fail ;єцх яЁютхЁшыш app_last, є эхую эхЄ Їюъєёр - эхъюьє фртрЄ№ Їюъєё
  1048.         add hl,de
  1049.         bit fgfx,(hl)
  1050.         jr z,sys_quit_findgfxapp0
  1051. sys_quit_findgfxappq
  1052.         ld (focusappaddr),hl
  1053.          ;ld a,key_redraw
  1054.          ;ld (curkey),a
  1055.          ;ld bc,key_redraw
  1056.          ; ld (keyqueueput_codenolang),bc
  1057.          ;call KEYQUEUEPUT
  1058.          call KEY_PUTREDRAW
  1059. sys_quit_findgfxapp_fail
  1060.         ;pop iy
  1061.         xor a
  1062.         ret
  1063.  
  1064. BDOS_newpage
  1065.         ;ld iy,(appaddr)
  1066. BDOS_newpage_iy
  1067. ;out: a=0 (OK)/#ff (fail), e=page
  1068.        if TOPDOWNMEM
  1069.         ld hl,tsys_pages +sys_npages-1
  1070.         ld bc,sys_npages
  1071.         xor a
  1072.         cpdr
  1073.         jr nz,BDOS_fail
  1074.         inc hl
  1075.         ld a,(iy+app.id)
  1076.         ld (hl),a
  1077.         ld a,pagexor;#7f
  1078.         sub c ;c=0..sys_npages-1
  1079.        else
  1080.         ld hl,tsys_pages
  1081.         ;push hl
  1082.         ld bc,sys_npages
  1083.         xor a
  1084.         cpir
  1085.         ;pop de
  1086.         jr nz,BDOS_fail
  1087.         dec hl
  1088.         ld a,(iy+app.id)
  1089.         ld (hl),a
  1090.          ;or a
  1091.          ;sbc hl,de ;hl=(0..sys_npages-1)
  1092.         ;ld a,pagexor;#7f
  1093.         ;sub l ;l=0..sys_npages-1
  1094.         ld a,0xff&(pagexor-(sys_npages-1))
  1095.         add a,c
  1096.        endif
  1097.         ld e,a ;page
  1098. BDOS_OK
  1099.         xor a
  1100.         ret ;a=0 (OK), e=page
  1101.  
  1102. BDOS_pop2fail
  1103.         pop af
  1104. BDOS_popfail
  1105.         pop af
  1106. BDOS_fail
  1107.         ld a,0xff
  1108.         ret
  1109.  
  1110. BDOS_delpage
  1111. ;e=page
  1112. ;эх яюЁЄшЄ de
  1113.         ld a,pagexor;#7f
  1114.         sub e
  1115.         ld c,a
  1116.         ld hl,tsys_pages
  1117.         xor a
  1118.         ld b,a
  1119.         add hl,bc
  1120.         ld (hl),b ;0
  1121.         ret ;a=0
  1122.  
  1123. BDOS_fdel
  1124.         call BDOS_preparedepage
  1125.         call BDOS_setdepage ;TODO єсЁрЄ№ т фЁрщтхЁ
  1126. ;DE = Pointer to unopened FCB
  1127.         CHECKVOLUMETRDOS
  1128.         jr c,BDOS_fdel_noFATFS
  1129.  
  1130.         call get_name
  1131.         ld de,mfil
  1132.         F_UNLINK_CURDRV
  1133.         ;or a:jp z,fexit
  1134.         ;ld a,0xff
  1135.         ret;jp fexit
  1136. BDOS_fdel_noFATFS
  1137.         BDOSSETPGTRDOSFS
  1138. ;DE = Pointer to unopened FCB
  1139.         jp nfdel
  1140.  
  1141. BDOS_fread
  1142.         call BDOS_preparedepage
  1143.         call BDOS_setdepage ;TODO єсЁрЄ№ т фЁрщтхЁ
  1144. ;DE = Pointer to opened FCB
  1145.         ;CHECKVOLUMETRDOS
  1146.         ld a,(de)
  1147.         cp vol_trdos
  1148.         jr c,BDOS_fread_noFATFS
  1149. ;фюёЄрЄ№ шч эхую рфЁхё ffile
  1150.         call getFILfromFCB ;hl=FIL
  1151.          ;jr $
  1152.         call BDOS_getdta ;de = disk transfer address
  1153.         call BDOS_preparedepage
  1154.         call BDOS_setdepage ;TODO єсЁрЄ№ т фЁрщтхЁ
  1155.         ld b,d
  1156.         ld c,e
  1157.         ld de,blocksize
  1158.          push de ;blocksize
  1159.         ld ix,fres
  1160.         push ix ;fres
  1161.         push de ;blocksize
  1162.         ex de,hl;ld de,ffile
  1163.         F_READ_CURDRV
  1164. BDOS_fread_fatfsq        
  1165.         pop bc
  1166.         pop bc
  1167.         ld a,(bc)
  1168.          pop bc ;blocksize
  1169.         call movedma_addr ;+bc
  1170.         xor 0x80 ;!=, хёыш яЁюўшЄрыш эх 128 срщЄ
  1171. ;a=0: OK (яЁюўшЄрыш 128 срщЄ)
  1172. ;a=128: fail (яЁюўшЄрыш 0 срщЄ)
  1173. ;a=???: OK (яюёыхфэшщ сыюъ Їрщыр ьхэ№°х 128 срщЄ)
  1174.         ret;jp fexit
  1175. BDOS_fread_noFATFS
  1176.         BDOSSETPGTRDOSFS
  1177. ;DE = Pointer to opened FCB (#8000+/#c000+)
  1178.         jp trdos_fread
  1179.  
  1180. BDOS_fwrite
  1181.         call BDOS_preparedepage
  1182.         call BDOS_setdepage ;TODO єсЁрЄ№ т фЁрщтхЁ
  1183. ;DE = Pointer to opened FCB
  1184.         ;CHECKVOLUMETRDOS
  1185.         ld a,(de)
  1186.         cp vol_trdos
  1187.         jr c,BDOS_fwrite_noFATFS
  1188. ;фюёЄрЄ№ шч эхую рфЁхё ffile
  1189.         call getFILfromFCB ;hl=FIL
  1190.  
  1191.         call BDOS_getdta ;de = disk transfer address
  1192.         call BDOS_preparedepage
  1193.         call BDOS_setdepage ;TODO єсЁрЄ№ т фЁрщтхЁ
  1194.         ld b,d
  1195.         ld c,e
  1196.         ld de,blocksize
  1197.          push de ;blocksize
  1198.         ld ix,fres
  1199.         push ix ;fres
  1200.         push de ;blocksize
  1201.         ex de,hl;ld de,ffile
  1202.         F_WRITE_CURDRV
  1203.         jr BDOS_fread_fatfsq
  1204. BDOS_fwrite_noFATFS
  1205.         BDOSSETPGTRDOSFS
  1206. ;DE = Pointer to opened FCB
  1207.         jp trdos_fwrite
  1208.  
  1209. BDOS_fwrite_nbytes
  1210.         call BDOS_preparedepage
  1211.         call BDOS_setdepage ;TODO єсЁрЄ№ т фЁрщтхЁ
  1212. ;DE = Pointer to opened FCB
  1213. ;hl = bytes
  1214.         ;CHECKVOLUMETRDOS
  1215.         ld a,(de)
  1216.         cp vol_trdos
  1217.         jr c,BDOS_fwrite_nbytes_noFATFS
  1218. ;фюёЄрЄ№ шч эхую рфЁхё ffile
  1219.          push hl ;bytes
  1220.         call getFILfromFCB ;hl=FIL
  1221.  
  1222.         call BDOS_getdta ;de = disk transfer address
  1223.         call BDOS_preparedepage
  1224.         call BDOS_setdepage ;TODO єсЁрЄ№ т фЁрщтхЁ
  1225.         ld b,d
  1226.         ld c,e
  1227.         ;ld de,blocksize
  1228.          pop de ;bytes
  1229.          push de ;blocksize
  1230.         ld ix,fres
  1231.         push ix ;fres
  1232.         push de ;blocksize
  1233.         ex de,hl;ld de,ffile
  1234.         F_WRITE_CURDRV
  1235.         jr BDOS_fread_fatfsq
  1236. BDOS_fwrite_nbytes_noFATFS
  1237.         BDOSSETPGTRDOSFS
  1238. ;DE = Pointer to opened FCB
  1239. ;hl = bytes
  1240.         ld b,h
  1241.         ld c,l
  1242.         jp trdos_fwrite_nbytes
  1243.  
  1244.        
  1245. count_fdir
  1246.         push iy
  1247.         pop de
  1248.         ld hl,app.dir
  1249.         add hl,de
  1250.         ex de,hl
  1251.         ret
  1252.  
  1253. BDOS_opencurdir
  1254.         call count_fdir ;LD de,fdir
  1255.                 F_OPDIR_CURDRV
  1256.         ret
  1257.  
  1258. ;SEARCH FOR FIRST [FCB] (11H)
  1259. ;     Parameters:    C = 11H (_SFIRST)
  1260. ;                   DE = Pointer to unopened FCB
  1261. ;     Results:     L=A = 0FFH if file not found
  1262. ;                      =   0  if file found.
  1263. ;The filename may be ambiguous (containing "?" characters) in which case the first match will be found. The low byte of the extent field will be used, and a file will only be found if it is big enough to contain this extent number. Normally the extent field will be set to zero by the program before calling this function. System file and sub-directory entries will not be found.
  1264. ;If a suitable match is found (A=0) then the directory entry will be copied to the DTA address, preceded by the drive number. This can be used directly as an FCB for an OPEN function call if desired. The extent number will be set to the low byte of the extent from the search FCB, and the record count will be initialized appropriately (as for OPEN). The attributes byte from the directory entry will be stored in the S1 byte position, since its normal position (immediately after the filename extension field) is used for the extent byte.
  1265. BDOS_fsearchfirst
  1266.         call BDOS_preparedepage
  1267.         call BDOS_setdepage ;TODO єсЁрЄ№ т фЁрщтхЁ
  1268.          push de ;DE = Pointer to unopened FCB (#8000+/#c000+)
  1269.         CHECKVOLUMETRDOS
  1270.         jr c,BDOS_fsearchfirst_noFATFS
  1271.         call BDOS_opencurdir
  1272.  
  1273.          pop de ;DE = Pointer to unopened FCB (#8000+/#c000+)
  1274.         or a
  1275.         ret nz;jp nz,fexit
  1276.         jr BDOS_fsearch_goloadloop
  1277. BDOS_fsearchfirst_noFATFS
  1278. ;TR-DOS
  1279.        push af
  1280.         BDOSSETPGTRDOSFS
  1281.        pop af
  1282.        ld (trdoscurdrive),a
  1283.         ld hl,trdos_catbuf
  1284.         ;ld (BDOS_fsearch_loadloop_trdosaddr),hl ;TODO уфх їЁрэшЄ№ фы  ьэюуючрфрўэюёЄш? тючтЁр∙рЄ№ т FCB_DIRPOS?
  1285.         ld (iy+app.dircluster),l
  1286.         ld (iy+app.dircluster+1),h
  1287.        
  1288.         ld de,#0000 ;track,sector
  1289.         ld bc,#0905 ;read 9 sectors
  1290.         ;cp 1
  1291.         ;jr $
  1292.         call iodos.
  1293.          pop de ;DE = Pointer to unopened FCB (#8000+/#c000+)
  1294.         jr BDOS_fsearch_goloadloop
  1295.        
  1296. ;SEARCH FOR NEXT [FCB] (12H)
  1297. ;     Parameters:    C = 12H (_SNEXT)
  1298. ;     Results:     L=A = 0FFH if file not found
  1299. ;                      =   0  if file found.
  1300. BDOS_fsearchnext
  1301. ;(not CP/M!!!) фы  ьэюуючрфрўэюёЄш яЁшэшьрЄ№ ЄєЄ de = Pointer to unopened FCB
  1302.         call BDOS_preparedepage
  1303.         call BDOS_setdepage ;TODO єсЁрЄ№ т фЁрщтхЁ
  1304. BDOS_fsearch_goloadloop
  1305.         inc de
  1306.         ld (fsearchnext_filename),de
  1307. BDOS_fsearch_loadloop
  1308.         ld iy,(appaddr) ;Є.ъ. ffs яюЁЄшЄ iy
  1309.         CHECKVOLUMETRDOS
  1310.         jr c,BDOS_fsearch_loadloop_noFATFS
  1311.  
  1312.         call count_fdir ;LD de,fdir
  1313.          ;jr $
  1314.         LD bc,mfilinfo
  1315.         F_RDIR_CURDRV
  1316.         ;or a
  1317.         ;ret nz;jp nz,fexit
  1318.  
  1319. ;яхЁхфхырЄ№ ёЄЁєъЄєЁє FILINFO (ъюЄюЁє■ ь√ ёхщўрё ёўшЄрыш) т ёЄЁєъЄєЁє FCB
  1320.         ld de,mfilinfo+FILINFO.FNAME
  1321.         ld a,(de)
  1322.         or a
  1323.         jp z,BDOS_fail ;fsearchnext_nofile
  1324.         BDOSSETPGTRDOSFS
  1325.         ld hl,fcb2+FCB_FNAME
  1326.         call dotname_to_cpmname ;de -> hl
  1327.         ld hl,mfilinfo+FILINFO.FSIZE
  1328.         ld de,fcb2+FCB_FSIZE
  1329.         ld bc,4
  1330.         ldir
  1331.         ld hl,(mfilinfo+FILINFO.FDATE)
  1332.         ld (fcb2+FCB_FDATE),hl
  1333.         ld hl,(mfilinfo+FILINFO.FTIME)
  1334.         ld (fcb2+FCB_FTIME),hl      
  1335.         ld a,(mfilinfo+FILINFO.FATTRIB)
  1336.         ;and 0x10
  1337.         ld (fcb2+FCB_FATTRIB),a
  1338.         jr BDOS_fsearch_loadloop_FATFSq
  1339. BDOS_fsearch_loadloop_noFATFS
  1340. ;TR-DOS
  1341.         BDOSSETPGTRDOSFS
  1342. ;BDOS_fsearch_loadloop_trdosaddr=$+1
  1343.         ;ld hl,0
  1344.         ld l,(iy+app.dircluster)
  1345.         ld h,(iy+app.dircluster+1)
  1346.         ld de,fcb2+FCB_FNAME
  1347.         call trdos_searchnext
  1348.         jp z,BDOS_fail ;fsearchnext_nofile;BDOS_fsearch_loadloop_noFATFS_empty
  1349.         ;ld (BDOS_fsearch_loadloop_trdosaddr),hl
  1350.         ld (iy+app.dircluster),l
  1351.         ld (iy+app.dircluster+1),h
  1352.         jr BDOS_fsearch_loadloop_FATFSq
  1353. BDOS_fsearch_loadloop_FATFSq
  1354.         ld hl,fcb2+FCB_FNAME ;яЁюўшЄрээюх шь 
  1355. fsearchnext_filename=$+1
  1356.         ld de,0 ;юсЁрчхЎ
  1357.        
  1358. ;яЁютхЁшЄ№ шь  Їрщыр hl == de (шуэюЁшЁютрЄ№ (de)=='?')
  1359.         ld bc,11*256;0x0a00 ;b=bytes to compare, c=errors
  1360. fsearchnext_cp00
  1361.         ld a,[de]
  1362.         cp '?'
  1363.         jr z,fsearchnext_cpskip
  1364.         sub [hl]
  1365.         or c
  1366.         ld c,a ;errors
  1367. fsearchnext_cpskip
  1368.         inc hl
  1369.         inc de
  1370.         djnz fsearchnext_cp00
  1371.        
  1372. ;хёыш эх ёютярыю, чрЎшъышЄ№
  1373.         ld a,c
  1374.         or a
  1375.         jp nz,BDOS_fsearch_loadloop
  1376. fsearchnext_nofileq
  1377. ;шэрўх чряшёрЄ№ т dma
  1378.         ld iy,(appaddr)
  1379.         ld hl,fcb2
  1380.         call BDOS_getdta ;de = disk transfer address
  1381.         call BDOS_preparedepage
  1382.         call BDOS_setdepage ;TODO єсЁрЄ№ т фЁрщтхЁ
  1383.         ld bc,FCB_sz;32;16
  1384.          push bc
  1385.         ldir
  1386.          pop bc
  1387.         call movedma_addr ;+bc
  1388.         xor a ;success
  1389.         ret;jp rest_exit
  1390.  
  1391. BDOS_getfiletime
  1392. ;de=Drive/path/file ASCIIZ string
  1393. ;out: ix=date, hl=time
  1394.         call BDOS_preparedepage
  1395.         call BDOS_setdepage ;TODO єсЁрЄ№ т фЁрщтхЁ
  1396.         call countfiledrive ;a=volume, de=path without drive, c=1: drive in path, NC=TR-DOS
  1397.         jr c,BDOS_getfiletime_zero
  1398.                 push af
  1399.                 pop af
  1400.         ld bc,fres
  1401. ;de=name
  1402. ;bc=pointer to time,date
  1403.                 F_GETUTIME
  1404.         ld hl,(fres)
  1405.         ld ix,(fres+2)
  1406.         ;xor a
  1407.         ret
  1408. BDOS_getfiletime_zero
  1409.         ;xor a
  1410.         ;ld l,a
  1411.         ;ld h,a
  1412.         ;push hl
  1413.         ;pop ix
  1414. BDOS_gettime
  1415. ;out: ix=date, hl=time
  1416.         ld hl,(sys_time_date)
  1417.         ld ix,(sys_time_date+2)
  1418.         ret
  1419.        
  1420.  
  1421. BDOS_setfiletime
  1422. ;de=Drive/path/file ASCIIZ string, ix=date, hl=time
  1423.         call BDOS_preparedepage
  1424.         call BDOS_setdepage ;TODO єсЁрЄ№ т фЁрщтхЁ
  1425.         push hl ;time
  1426.         push ix ;date
  1427.         pop bc ;date
  1428. ;de=name
  1429. ;bc=date
  1430. ;stack=time
  1431.         F_UTIME_CURDRV
  1432.         pop bc
  1433.         ret
  1434.        
  1435. BDOS_seekhandle
  1436. ;                    B = File handle
  1437. ;                    [A = Method code: 0=begin,1=cur,2=end]
  1438. ;                DE:HL = Signed offset
  1439. ;     Results:       A = Error
  1440. ;                DE:HL = New file pointer
  1441.         bit 6,b
  1442.         jr nz,BDOS_seekhandle_noFATFS
  1443.         push de ;HSW
  1444.         push hl ;LSW
  1445.         call BDOS_number_to_fil ;de=fil
  1446.         F_LSEEK_CURDRV        
  1447.         pop bc
  1448.         pop bc
  1449.         ret
  1450. BDOS_seekhandle_noFATFS
  1451.         push bc
  1452.         BDOSSETPGTRDOSFS
  1453.         pop bc
  1454.         jp trdos_seekhandle
  1455.  
  1456. BDOS_getfilesize
  1457. ;b=handle
  1458. ;out: dehl=filesize
  1459.         bit 6,b
  1460.         jr nz,BDOS_getfilesize_noFATFS
  1461.         call BDOS_number_to_fil ;de=fil
  1462.         ld hl,FIL.FSIZE
  1463.         jr BDOS_tellhandleq
  1464.         ;add hl,de
  1465.         ;ld e,(hl)
  1466.         ;inc hl
  1467.         ;ld d,(hl)
  1468.         ;inc hl
  1469.         ;ld a,(hl)
  1470.         ;inc hl
  1471.         ;ld h,(hl)
  1472.         ;ld l,a
  1473.         ;ex de,hl
  1474.         ;xor a
  1475.         ;ret
  1476. BDOS_getfilesize_noFATFS
  1477.         push bc
  1478.         BDOSSETPGTRDOSFS
  1479.         pop bc
  1480.         jp trdos_getfilesize ;dehl=filesize
  1481.  
  1482. BDOS_tellhandle
  1483. ;b=file handle, out: dehl=offset
  1484. ;TODO TR-DOS
  1485.         call BDOS_number_to_fil ;de=fil
  1486.         ld hl,FIL.FPTR
  1487. BDOS_tellhandleq
  1488.         add hl,de
  1489.         ld c,(hl)
  1490.         inc hl
  1491.         ld b,(hl)
  1492.         inc hl
  1493.         ld e,(hl)
  1494.         inc hl
  1495.         ld d,(hl)
  1496.         ld h,b
  1497.         ld l,c
  1498.         xor a
  1499.         ret
  1500.        
  1501. BDOS_createhandle
  1502. ;DE = Drive/path/file ASCIIZ string
  1503. ;A = Open mode. b0 set => no write, b1 set => no read, b2 set => inheritable, b3..b7   -  must be clear
  1504. ;B = b0..b6 = Required attributes, b7 = Create new flag
  1505. ;out: B = new file handle, A=error
  1506.         ld c,a
  1507.         ld a,'w'
  1508.         LD HL,FA_READ|FA_WRITE|FA_CREATE_ALWAYS
  1509.         jr BDOS_openorcreatehandle
  1510.  
  1511. BDOS_openhandle
  1512. ;DE = Drive/path/file ASCIIZ string
  1513. ;A = Open mode. b0 set => no write, b1 set => no read, b2 set => inheritable, b3..b7   -  must be clear
  1514. ;out: B = new file handle, A=error
  1515.         ld c,a
  1516.         ld a,'r'
  1517.         ld hl,FA_READ|FA_WRITE
  1518. BDOS_openorcreatehandle
  1519.         ld (BDOS_openorcreatehandle_trdosmode),a
  1520.         ld (.mode),hl
  1521.         call BDOS_preparedepage
  1522.         call BDOS_setdepage ;TODO єсЁрЄ№ т фЁрщтхЁ
  1523. ;DE = Drive/path/file ASCIIZ string
  1524.         call countfiledrive ;a=volume, de=path without drive, c=1: drive in path, NC=TR-DOS
  1525.         jr c,BDOS_openhandle_noFATFS
  1526.                 ld (.store_a),a
  1527.         push de
  1528.          ;dec c ;was c=1: drive in path
  1529.          ;call z,BDOS_setvol_rootdir ;drive specified in path
  1530.         call findfreeffile
  1531.          jr nz,$ ;TODO error
  1532.         ld a,b
  1533.         ex de,hl ;a=fil number, de=poi to FIL
  1534.         pop bc
  1535.         push af
  1536.          ;jr $
  1537. .mode=$+1
  1538.         LD HL,FA_READ|FA_WRITE
  1539. .store_a=$+1
  1540.                 ld a,0
  1541.         F_OP
  1542.         pop bc ;b=fil number=new file handle
  1543.          ret
  1544.  
  1545. BDOS_openhandle_noFATFS
  1546. ;a=drive
  1547. ;recode file name
  1548.         ;pop af ;z=drive in path
  1549.        push af ;drive
  1550.         BDOSSETPGTRDOSFS
  1551.         ex de,hl ;hl=path
  1552.         call findlastslash. ;de=after last slash or beginning of path
  1553.         ld hl,BDOS_parse_filename_cpmnamebuf
  1554.         push hl
  1555.         call dotname_to_cpmname ;de -> hl ;out: de=pointer to termination character, hl=buffer filled in
  1556.         ;BDOSSETPGTRDOSFS
  1557.         pop de
  1558. BDOS_openorcreatehandle_trdosmode=$+1
  1559.         ld c,'r'
  1560.        pop af ;drive
  1561.         call nfopen ;hl=trdosfcb
  1562.         ld b,h ;new file handle
  1563.         ret
  1564.  
  1565. BDOS_number_to_fil
  1566. ;b = file handle = 0..
  1567. ;out: de=fil
  1568.         inc b
  1569.         ld hl,ffilearray-FIL_sz
  1570.         ld de,FIL_sz
  1571. BDOS_number_to_fil0
  1572.         add hl,de
  1573.         djnz BDOS_number_to_fil0
  1574.         ex de,hl
  1575.         ret
  1576.        
  1577. BDOS_closehandle
  1578. ;B = file handle
  1579. ;out: A=error
  1580.         bit 6,b
  1581.         jr nz,BDOS_closehandle_noFATFS
  1582.         call BDOS_number_to_fil
  1583. ;de=fil
  1584.         F_CLOS_CURDRV
  1585.         ret
  1586. BDOS_closehandle_noFATFS
  1587.         ld h,b
  1588.         ld l,0
  1589.         BDOSSETPGTRDOSFS
  1590.         jp trdos_fclose_hl
  1591.  
  1592.        
  1593. BDOS_readwritehandleprepare
  1594. ;b=handle, hl=number of bytes, de=addr
  1595. ;out: hl=fil, de=number of bytes, bc=addr(#8000+)
  1596.         push hl ;Number of bytes to read
  1597.         push de ;Buffer address
  1598.         call BDOS_number_to_fil ;de=fil
  1599.         ex de,hl ;hl=FIL
  1600.         pop de ;Buffer address
  1601.         call BDOS_preparedepage
  1602.         call BDOS_setdepage ;TODO єсЁрЄ№ т фЁрщтхЁ
  1603.         ld b,d
  1604.         ld c,e
  1605.         pop de ;Number of bytes to read
  1606.         ret
  1607.        
  1608. BDOS_readhandle
  1609. ;B = file handle
  1610. ;DE = Buffer address
  1611. ;HL = Number of bytes to read
  1612. ;out: HL = Number of bytes actually read, A=error
  1613.         push hl
  1614.         ld hl,BDOS_readhandlego
  1615. BDOS_readwritehandle
  1616.         ld (BDOS_readwritehandle_proc),hl
  1617.         pop hl
  1618.         ld (BDOS_readwritehandle_oldaddr),de
  1619. BDOS_readwritehandle0
  1620.         push bc
  1621.         push hl
  1622.         push de ;addr
  1623.          dec hl
  1624.          ld a,h
  1625.          inc hl
  1626.          cp 0x40
  1627.          jr c,$+5 ;<=0x4000
  1628.          ld hl,0x4000
  1629.          push hl ;bytes to process
  1630.         ;call BDOS_readwritehandlego ;hl=processed bytes
  1631. BDOS_readwritehandle_proc=$+1
  1632.         call BDOS_readhandlego
  1633. ;TODO ўЄю фхырЄ№, хёыш тючтЁрЄшыюё№ hl=0?
  1634.         ;ex af,af' ;error
  1635.         ;jr $
  1636.          pop bc ;bytes to process
  1637.          or a
  1638.          sbc hl,bc
  1639.          ld a,h
  1640.          or l
  1641.          add hl,bc ;z=all bytes were processed
  1642.         ld b,h
  1643.         ld c,l
  1644.         pop hl ;addr
  1645.         add hl,bc ;+processed bytes
  1646.         ex de,hl ;de = new addr
  1647.         pop hl
  1648.         or a
  1649.         sbc hl,bc ;-processed bytes
  1650.         pop bc
  1651.         jr z,BDOS_readwritehandleq ;0 bytes remain
  1652.         jr c,BDOS_readwritehandleq ;less than 0 bytes remain
  1653.         ;jr nc,BDOS_readwritehandle0 ;no less than 0 bytes remain
  1654.          or a
  1655.         jr z,BDOS_readwritehandle0 ;all bytes were processed
  1656. BDOS_readwritehandleq
  1657. ;0 bytes remain
  1658. ;de=end address
  1659.         ld h,d
  1660.         ld l,e
  1661. BDOS_readwritehandle_oldaddr=$+1
  1662.         ld bc,0
  1663.         xor a ;no error
  1664.         sbc hl,bc ;hl=processed bytes
  1665.         ;ex af,af' ;error
  1666.         ret
  1667. ;BDOS_readwritehandlego
  1668. ;BDOS_readwritehandle_proc=$+1
  1669. ;        jp BDOS_readhandlego
  1670. BDOS_readhandlego
  1671. ;b=handle
  1672.         bit 6,b
  1673.         jr nz,BDOS_readhandle_noFATFS
  1674.          ;jr $
  1675.         call BDOS_readwritehandleprepare
  1676.         ld ix,fres
  1677.         push ix ;fres
  1678.         push de ;blocksize
  1679.         ex de,hl;ld de,ffile
  1680.         F_READ_CURDRV
  1681.         pop bc
  1682.         pop bc ;fres
  1683.         ld hl,(fres) ;hl=total processed bytes
  1684.         ret
  1685. BDOS_readhandle_noFATFS
  1686.         push bc
  1687.         BDOSSETPGTRDOSFS
  1688.         pop bc
  1689.         jp trdos_fread_b ;hl=total processed bytes
  1690.  
  1691. BDOS_writehandle
  1692. ;B = file handle
  1693. ;DE = Buffer address
  1694. ;HL = Number of bytes to write
  1695. ;out: HL = Number of bytes actually written, A=error
  1696.         push hl
  1697.         ld hl,BDOS_writehandlego
  1698.         jr BDOS_readwritehandle
  1699. BDOS_writehandlego
  1700. ;b=handle
  1701.         bit 6,b
  1702.         jr nz,BDOS_writehandle_noFATFS
  1703.         call BDOS_readwritehandleprepare
  1704.         ld ix,fres
  1705.         push ix ;fres
  1706.         push de ;blocksize
  1707.         ex de,hl;ld de,ffile
  1708.         F_WRITE_CURDRV
  1709.         pop bc
  1710.         pop bc ;fres
  1711.         ld hl,(fres) ;hl=total processed bytes
  1712.         ret
  1713. BDOS_writehandle_noFATFS
  1714.         push bc
  1715.         BDOSSETPGTRDOSFS
  1716.         pop bc
  1717.         jp trdos_fwrite_b ;hl=total processed bytes
  1718.  
  1719. BDOS_fopen_getname_fil
  1720. ;out: de=poi to FIL, bc=mfil
  1721.         push de
  1722.         call get_name ;->mfil
  1723.         pop de
  1724.         call findfreeffile
  1725.          jr nz,$ ;TODO error
  1726.         ex de,hl ;de=poi to FIL
  1727.         LD bc,mfil
  1728.         jp nz,BDOS_pop2fail ;ёэшьрхь рфЁхё тючтЁрЄр ш FCB
  1729.         ret
  1730.        
  1731. BDOS_fopen
  1732.         call BDOS_preparedepage
  1733.         call BDOS_setdepage ;TODO єсЁрЄ№ т фЁрщтхЁ
  1734. ;de = pointer to unopened FCB
  1735.          ;jr $
  1736.         GETVOLUME
  1737.         ld (de),a ;volume
  1738.         cp vol_trdos ;CHECKVOLUMETRDOS
  1739.         jr c,BDOS_fopen_noFATFS
  1740.         push de ;FCB
  1741.         call BDOS_fopen_getname_fil ;de=poi to FIL, bc=mfil
  1742.         LD HL,FA_READ|FA_WRITE
  1743.         jr BDOS_fopen_go
  1744. BDOS_fopen_noFATFS
  1745. ;a=drive
  1746.        push af
  1747.         BDOSSETPGTRDOSFS
  1748.        pop af
  1749.         jp trdos_fopen
  1750.  
  1751. BDOS_fcreate
  1752.         call BDOS_preparedepage
  1753.         call BDOS_setdepage ;TODO єсЁрЄ№ т фЁрщтхЁ
  1754. ;DE = Pointer to unopened FCB
  1755.         GETVOLUME
  1756.         ld (de),a ;volume
  1757.         cp vol_trdos ;CHECKVOLUMETRDOS
  1758.         jr c,BDOS_fcreate_noFATFS
  1759.         push de ;FCB
  1760.         call BDOS_fopen_getname_fil ;de=poi to FIL, bc=mfil
  1761.         LD HL,FA_READ|FA_WRITE|FA_CREATE_ALWAYS
  1762. BDOS_fopen_go
  1763.          ;jr $
  1764.         ;F_OPEN ffile,mfil,FA_READ|FA_WRITE|FA_CREATE_ALWAYS
  1765.         ;LD de,ffile
  1766.         push de ;FIL
  1767.         F_OPEN_CURDRV
  1768.         pop de ;FIL
  1769.         pop bc ;FCB
  1770.         or a
  1771.         ret nz ;error
  1772. ;BDOS_fopen_OK
  1773. ;de=ffile (FIL)
  1774. ;bc=FCB
  1775.         ;ld iy,(appaddr)
  1776.         ;GETVOLUME
  1777.         ;ld (bc),a ;volume
  1778.         ld hl,FCB_FFSFCB
  1779.         add hl,bc
  1780.         push af
  1781.         call BDOS_setdepage
  1782.         pop af
  1783.         ld (hl),e
  1784.         inc hl
  1785.         ld (hl),d
  1786.         ret
  1787. BDOS_fcreate_noFATFS
  1788.        push af
  1789.         BDOSSETPGTRDOSFS
  1790.        pop af
  1791.         jp trdos_fcreate
  1792.  
  1793. getFILfromFCB
  1794. ;de=FCB (ёЄЁрэшЎ√ єцх тъы■ўхэ√)
  1795. ;out: hl=FIL
  1796.         ld hl,FCB_FFSFCB
  1797.         add hl,de
  1798.         ld a,(hl)
  1799.         inc hl
  1800.         ld h,(hl)
  1801.         ld l,a ;hl = poi to FIL
  1802.         ret
  1803.        
  1804. BDOS_fclose
  1805.          ;jr $
  1806.         call BDOS_preparedepage
  1807.         call BDOS_setdepage ;TODO єсЁрЄ№ т фЁрщтхЁ
  1808. ;DE = Pointer to opened FCB (фы  FATFS яЁшф╕Єё  шуэюЁшЁютрЄ№, сЁрЄ№ Єхъє∙шщ ffile - TODO шёърЄ№ яюфїюф ∙шщ ffile)
  1809.         ;CHECKVOLUMETRDOS
  1810.         ld a,(de)
  1811.         cp vol_trdos
  1812.         jr c,BDOS_fclose_noFATFS
  1813.         ;F_CLOSE ffile ;ёрь юётюсюцфрхЄ FIL
  1814.         call getFILfromFCB
  1815.         ex de,hl
  1816.         F_CLOS_CURDRV
  1817. ;TODO єсЁрЄ№ poi to FIL шч FCB?
  1818.         ;or a:jp z,fexit
  1819.         ;ld a,0xff
  1820.         ret;jp fexit
  1821. BDOS_fclose_noFATFS
  1822.         BDOSSETPGTRDOSFS
  1823.         jp trdos_fclose
  1824.  
  1825.         display "ffs ",$
  1826.  
  1827. call_ffs_curvol
  1828.                 GETVOLUME
  1829. call_ffs        ;A=ыюушўхёъшщ Ёрчфхы, HL=ЇєэъЎш 
  1830. ;яюЁЄшЄ iy! яю эхы№ч  фтшурЄ№ ёЄхъ! т э╕ь ярЁрьхЄЁ√!
  1831.                 push hl
  1832.                 push bc
  1833.         ld hl,fatfsarray ;т√ўшёы хь єърчрЄхы№ эр ёЄЁєъЄєЁє fatfs
  1834.                 sub vol_trdos
  1835.         or a
  1836.         jr z,.fix_vol_dir
  1837.         ld bc,FATFS_sz
  1838. .calcfatfs
  1839.         add hl,bc
  1840.         dec a
  1841.         jr nz,.calcfatfs
  1842. .fix_vol_dir    ;єёЄрэртыштрхь Єхъє∙шх fatfs ш фшЁхъЄюЁш■
  1843.                 BDOSSETPGFATFS
  1844.         ld (fatfs_org+FFS_DRV.curr_fatfs),hl
  1845.          ld l,(iy+app.dircluster)
  1846.          ld h,(iy+app.dircluster+1)
  1847.         ld (fatfs_org+FFS_DRV.curr_dir0),hl
  1848.          ld l,(iy+app.dircluster+2)
  1849.          ld h,(iy+app.dircluster+3)
  1850.         ld (fatfs_org+FFS_DRV.curr_dir2),hl
  1851.                 call BDOS_setpgstructs 
  1852.                 pop bc
  1853.                 ret             ;єїюфшь т ЇрЄЇё
  1854.  
  1855.                
  1856. BDOS_mount
  1857. ;TODO e=logical volume(char A-Z)
  1858. ;out: a!=0 => not mounted
  1859.                 ld a,e
  1860.                 and 0xdf
  1861.                 sub 'A'
  1862.                 ret c
  1863.                 cp 26
  1864.                 ret nc
  1865.                 sub vol_trdos
  1866.         jr c,.noFATFS
  1867.                 ld e,a
  1868.         BDOSSETPGFATFS
  1869.                 call BDOS_setpgstructs
  1870.         ld hl,fatfsarray ;т√ўшёы хь єърчрЄхы№ эр ёЄЁєъЄєЁє fatfs
  1871.         ld a,e
  1872.                 or a
  1873.         jr z,.fix_ffs
  1874.         ld bc,FATFS_sz
  1875. .calcfatfs
  1876.         add hl,bc
  1877.         dec a
  1878.         jr nz,.calcfatfs
  1879. .fix_ffs
  1880.         ld (fatfs_org+FFS_DRV.curr_fatfs),hl ;l
  1881.                 ld a,e
  1882.                 srl e
  1883.                 srl e
  1884.                 inc hl
  1885.                 ld (hl),e       ;эюьхЁ фЁрщтр
  1886.                 and %00000011
  1887.                 inc hl
  1888.                 ld (hl),a       ;эюьхЁ Ёрчфхыр
  1889.                 F_MNT
  1890.                 ret
  1891. .noFATFS
  1892.         xor a ;xor a ;NC:success, CY:fail
  1893.         ret;jr rest_exit
  1894. BDOS_setsysdrv
  1895.         ld e,SYSDRV
  1896.          call BDOS_setdrv
  1897.          ld de,syspath
  1898.          jp setpath
  1899.        
  1900. BDOS_setdrv
  1901. ;e=volume
  1902. ;out: a!=0 => not mounted (TODO), l=number of volumes
  1903. ;ь√ эх фюыцэ√ ьюэЄшЁютрЄ№, яЁюёЄю фюыцэ√ єърчрЄ№ volume, Єхъє∙шщ фы  фрээющ чрфрўш, ш ёсЁюёшЄ№ path, Єхъє∙шщ фы  фрээющ чрфрўш
  1904.         ld a,e
  1905.         call BDOS_setvol_rootdir
  1906.         ;call BDOS_opencurdir ;¤Єр юяхЁрЎш  эєцэр фы  юяЁхфхыхэш  ёьюэЄшЁютрээюёЄш (F_MNT тёхуфр тючтЁр∙рхЄ 0)
  1907.         ;or a
  1908.         ;jr nc,BDOS_setdrvnfail
  1909.         ; ld (iy+app.vol),d
  1910. ;BDOS_setdrvnfail
  1911.          
  1912.         ld l,NVOLUMES ;фюёЄєяэю 5 фЁрщтют
  1913.         xor a ;success
  1914.         ret;jr rest_exit
  1915.        
  1916. BDOS_setvol_rootdir
  1917. ;єёЄрэютыхэр ёЄЁрэшЎр PGFATFS
  1918.           ld d,(iy+app.vol)
  1919.          ld (iy+app.vol),a
  1920. BDOS_setrootdir
  1921. ;єёЄрэютыхэр ёЄЁрэшЎр PGFATFS
  1922. ;CY=error (яЁш NC a=0)
  1923.          xor a
  1924.          ld (iy+app.dircluster),a
  1925.          ld (iy+app.dircluster+1),a
  1926.          ld (iy+app.dircluster+2),a
  1927.          ld (iy+app.dircluster+3),a
  1928.         CHECKVOLUMETRDOS
  1929.         sbc a,a; ld a,0
  1930.         ret c ;NC=no error, A=0
  1931.         ;jr $
  1932.         push de
  1933.         call BDOS_opencurdir ;¤Єр юяхЁрЎш  эєцэр фы  юяЁхфхыхэш  ёьюэЄшЁютрээюёЄш (F_MNT тёхуфр тючтЁр∙рхЄ 0)
  1934.         ;jr $
  1935.         pop de
  1936.         or a
  1937.         ret z ;NC=no error, A=0
  1938.          ld a,d
  1939.          ld (iy+app.vol),a
  1940.          scf
  1941.         ret ;CY=error
  1942.        
  1943. BDOS_delete
  1944. ;DE = Drive/path/file ASCIIZ string
  1945.         call BDOS_preparedepage
  1946.         call BDOS_setdepage ;TODO єсЁрЄ№ т фЁрщтхЁ
  1947. ;DE = Pointer to ASCIIZ string
  1948.         call countfiledrive ;a=volume, de=path without drive, c=1: drive in path, NC=TR-DOS
  1949.         ;call eatdrive ;TODO keep and restore curdrv,curdir!!!
  1950.         jr c,BDOS_delete_nofatfs
  1951.         ;call keepvoldir
  1952.         ; dec c ;was c=1: drive in path
  1953.         ; push de
  1954.         ; call z,BDOS_setvol_rootdir ;drive specified in path
  1955.         ; pop de
  1956.         F_UNLINK
  1957.         ret        
  1958. BDOS_delete_nofatfs
  1959.         BDOSSETPGTRDOSFS
  1960.         jp trdos_delete
  1961.        
  1962. BDOS_rename
  1963. ;DE = Drive/path/file ASCIIZ string, HL = New filename ASCIIZ string (can contain drive/path! NOT MSXDOS)
  1964.         ex de,hl
  1965.         call BDOS_preparedepage ;TODO Ёрчэ√х ёЄЁрэшЎ√ hl,de (Є.х. эрфю ъюяшЁютрЄ№ юЄё■фр т сєЇхЁ)
  1966.         call BDOS_setdepage ;TODO єсЁрЄ№ т фЁрщтхЁ
  1967.         ex de,hl
  1968.         call BDOS_preparedepage
  1969.         call BDOS_setdepage ;TODO єсЁрЄ№ т фЁрщтхЁ
  1970.         CHECKVOLUMETRDOS
  1971.         jr c,BDOS_rename_nofatfs
  1972.         ld b,h
  1973.         ld c,l
  1974. ;DE = Drive/path/file ASCIIZ string, BC = New filename ASCIIZ string
  1975.         F_RENAME
  1976.         ret
  1977. BDOS_rename_nofatfs
  1978.         BDOSSETPGTRDOSFS
  1979.         jp trdos_rename
  1980.  
  1981. countfiledrive
  1982. ;DE = Drive/path/file ASCIIZ string
  1983. ;out: a=volume, de=path without drive, c=1: drive in path, NC=TR-DOS
  1984.         inc de
  1985.         ld a,(de)
  1986.         cp ':'
  1987.         dec de
  1988.          ld c,0
  1989.         ;push af ;z=drive in path
  1990.         GETVOLUME
  1991.         jr nz,BDOS_openhandle_nodriveinpath ;drive not specified in path
  1992.          ld a,(de)
  1993.                  and 0xdf
  1994.          sub 'A'
  1995.          inc de
  1996.          inc de
  1997.         ;cp a ;z
  1998.          inc c
  1999. BDOS_openhandle_nodriveinpath
  2000. ;a=volume, de=path without drive, c=1: drive in path
  2001.         cp vol_trdos
  2002.         ret
  2003.        
  2004. BDOS_mkdir
  2005.         call BDOS_preparedepage
  2006.         call BDOS_setdepage ;TODO єсЁрЄ№ т фЁрщтхЁ
  2007. ;DE = Pointer to ASCIIZ string
  2008.         call countfiledrive ;call eatdrive
  2009.         jp c,BDOS_fail
  2010. ;DE = Pointer to ASCIIZ string
  2011.         ;call keepvoldir
  2012.         ; dec c ;was c=1: drive in path
  2013.         ; push de
  2014.         ; call z,BDOS_setvol_rootdir ;drive specified in path
  2015.         ; pop de
  2016.         F_MKDIR
  2017.         ret
  2018.         display "BDOS_chdir",$
  2019. BDOS_chdir
  2020.         call BDOS_preparedepage
  2021.         call BDOS_setdepage ;TODO єсЁрЄ№ т фЁрщтхЁ
  2022. ;DE = Pointer to ASCIIZ string
  2023.  
  2024. setpath
  2025. ;єёЄрэютыхэр ёЄЁрэшЎр PGFATFS
  2026. ;DE = Pointer to ASCIIZ string
  2027.         call countfiledrive ;call eatdrive
  2028.         jr c,BDOS_chdir_trdos
  2029.         push af
  2030.         ; dec c ;was c=1: drive in path
  2031.         ; call z,BDOS_setvol_rootdir ;drive specified in path
  2032.         F_CHDIR
  2033.         pop hl
  2034.         or a
  2035.         ret nz
  2036.                 ld (iy+app.vol),h
  2037.          ld hl,(fatfs_org+FFS_DRV.curr_dir0)
  2038.          ld (iy+app.dircluster),l
  2039.          ld (iy+app.dircluster+1),h
  2040.          ld hl,(fatfs_org+FFS_DRV.curr_dir2)
  2041.          ld (iy+app.dircluster+2),l
  2042.          ld (iy+app.dircluster+3),h
  2043.                  ;xor a
  2044.          ret
  2045.        
  2046. BDOS_chdir_trdos
  2047.                 ld (iy+app.vol),a
  2048.         ld a,(de) ;яєЄ№ яєёЄющ?
  2049.         ;or a
  2050.         ;jp nz,BDOS_fail ;эхяєёЄющ
  2051.         ret
  2052.  
  2053.         if 1==0
  2054. strlen
  2055. ;hl=str
  2056. ;out: hl=length
  2057.         xor a
  2058.         ld b,a
  2059.         ld c,a ;bc=0 ;ўЄюс√ Єюўэю эрщЄш ЄхЁьшэрЄюЁ
  2060.         cpir ;эрщф╕ь юс чрЄхы№эю, хёыш фышэр=0, Єю bc=-1 ш Є.ф.
  2061.         ld hl,-1
  2062.         ;or a
  2063.         sbc hl,bc
  2064.         ret
  2065.         endif
  2066.  
  2067. ;GET WHOLE PATH STRING (5EH)
  2068. ;     Parameters:    C = 5EH (_WPATH)
  2069. ;                   DE = Pointer to 64 byte (MAXPATH_sz!) buffer
  2070. ;     Results:       A = Error
  2071. ;                   DE = Filled in with whole path string
  2072. ;                   HL = Pointer to start of last item
  2073. ;This function simply copies an ASCIIZ path string from an internal buffer into the user's buffer. The string represents the whole path and filename, from the root ;directory, of a file or sub-directory located by a previous "find first entry" or "find new entry" function. [MSXDOS: The returned string will not include a drive, or an; ;initial "\" character.] Register HL will point at the first character of the last item on the string, exactly as for the "parse path" function (function 5Bh).
  2074. ;in NedoOS: DRIVE:/PATH/ !!!
  2075. BDOS_getpath
  2076.         push de ;эхы№ч  яюёых BDOS_preparedepage
  2077.         call BDOS_preparedepage
  2078.         call BDOS_setdepage ;TODO єсЁрЄ№ т фЁрщтхЁ
  2079.         push de ;DE = Pointer to 64 byte (MAXPATH_sz!) buffer (#8000+/c000+!)
  2080.  
  2081.         push de ;Pointer to 64 byte (MAXPATH_sz!) buffer (#8000+/c000+!)
  2082.        
  2083.         GETVOLUME
  2084.         add a,'A'
  2085.         ex de,hl
  2086.         ld (hl),a
  2087.         inc hl
  2088.         ld (hl),':'
  2089.         inc hl
  2090.         ld (hl),'/'
  2091.         inc hl
  2092.         ld (hl),0
  2093.         cp vol_trdos+'A'
  2094.         jr c,BDOS_getpath_FATq
  2095.         ex de,hl
  2096. BDOS_getpath_FAT
  2097.         ;DE=TCHAR *path,        /* Pointer to the directory path */ сєЇхЁ
  2098.         ld bc,MAXPATH_sz;64 ;BC=UINT sz_path    /* Size of path */) ЁрчьхЁ сєЇхЁр
  2099.         F_GETCWD_CURDRV
  2100. BDOS_getpath_FATq
  2101.         pop hl ;Pointer to 64 byte (MAXPATH_sz!) buffer (#8000+/c000+!)
  2102.         call findlastslash.
  2103.         ex de,hl ;HL = Pointer to start of last item (#8000+/#c000+!)
  2104.        
  2105.         pop de ;DE = Pointer to 64 byte (MAXPATH_sz!) buffer (#8000+/#c000+!)
  2106.         or a
  2107.         sbc hl,de ;hl=ЁрёёЄю эшх фю яюёыхфэхую ёы¤°р
  2108.         pop de ;DE = Pointer to 64 byte (MAXPATH_sz!) buffer
  2109.         add hl,de ;HL = Pointer to start of last item
  2110.         ret
  2111.  
  2112. ;hl = poi to filename in string
  2113. findlastslash.
  2114. ;hl=path string
  2115. ;out: de = after last slash (or start of path)
  2116. nfopenfnslash.
  2117.         ld d,h
  2118.         ld e,l ;de = after last slash
  2119. ;find last slash
  2120. nfopenfnslash0.
  2121.         ld a,[hl]
  2122.         inc hl
  2123.         or a
  2124.         ret z;jr z,nfopenfnslashq.
  2125.         cp '/'
  2126.         jr nz,nfopenfnslash0.
  2127.         jr nfopenfnslash.
  2128.  
  2129. ;PARSE FILENAME (5CH) - MSX-DOS
  2130. ;     Parameters:    C = 5CH (_PFILE)
  2131. ;                   DE = ASCIIZ string for parsing
  2132. ;                   HL = Pointer to 11 byte buffer
  2133. ;     Results:       A = Error (always zero)
  2134. ;                   DE = Pointer to termination character
  2135. ;                   HL = Preserved, buffer filled in
  2136. ;                    B = Parse flags (TODO)
  2137. ;b0 - set if any characters parsed other than drive name
  2138. ;b1 - set if any directory path specified
  2139. ;b2 - set if drive name specified
  2140. ;b3 - set if main filename specified in last item
  2141. ;b4 - set if filename extension specified in last item
  2142. ;b5 - set if last item is ambiguous
  2143. ;b6 - set if last item is "." or ".."
  2144. ;b7 - set if last item is ".."
  2145. BDOS_parse_filename
  2146.         BDOSSETPGTRDOSFS
  2147. ;фхырхЄ шч шьхэш ё Єюўъющ шь  схч Єюўъш (фы  CP/M)
  2148.         push hl ;Pointer to 11 byte buffer
  2149.  
  2150.         push de ;ASCIIZ string for parsing
  2151.         call BDOS_preparedepage
  2152.         call BDOS_setdepage ;TODO єсЁрЄ№ т фЁрщтхЁ
  2153.         push de ;ASCIIZ string for parsing (#8000+/#c000+)
  2154.         ld hl,BDOS_parse_filename_cpmnamebuf
  2155.         call dotname_to_cpmname ;de -> hl
  2156.         ex de,hl ;de=Pointer to termination character (#8000+/#c000+)
  2157.         pop bc ;ASCIIZ string for parsing (#8000+/#c000+)
  2158.         or a
  2159.         sbc hl,bc ;hl=ЁрёёЄю эшх фю ЄхЁьшэрЄюЁр
  2160.         pop bc ;ASCIIZ string for parsing
  2161.         add hl,bc ;Pointer to termination character
  2162.  
  2163.         pop de ;Pointer to 11 byte buffer
  2164.         push hl ;Pointer to termination character
  2165.  
  2166.         push de ;Pointer to 11 byte buffer
  2167.         call BDOS_preparedepage
  2168.         call BDOS_setdepage ;TODO єсЁрЄ№ т фЁрщтхЁ
  2169.         ld hl,BDOS_parse_filename_cpmnamebuf
  2170.         ld bc,11
  2171.         ldir
  2172.         pop hl ;HL = Pointer to 11 byte buffer
  2173.  
  2174.         pop de ;DE = Pointer to termination character
  2175.         xor a
  2176.         ret
  2177.  
  2178. get_name
  2179. ;фхырхЄ шч шьхэш схч Єюўъш шь  ё Єюўъющ (фы  FATFS ш фы  яхўрЄш)
  2180. ;hl->de
  2181.         inc de
  2182.         ex hl,de
  2183.         ld b,7
  2184.         ld de,mfil
  2185.         ld a,' '
  2186. 1       ldi
  2187.         cp (hl)
  2188.         jr z,get_name_skipspaces
  2189.         djnz 1b
  2190.         ldi
  2191.         jr get_name_findext ;ёъюяшЁютрыш 8 ёшьтюыют, яЁюсхы эх эр°ыш
  2192. get_name_skipspaces
  2193. 1       inc hl
  2194.         djnz 1b ;яЁюяєёърхь юёЄрт°шхё  яЁюсхы√
  2195. get_name_findext
  2196.         cp (hl)
  2197.         jr z,1f ;эр ьхёЄх Ёрё°шЁхэш  яЁюсхы - эх ёЄртшь Єюўъє
  2198.         ex hl,de
  2199.         ld (hl),'.'
  2200.         inc hl
  2201.         ex hl,de
  2202.         ldi
  2203.         cp (hl)
  2204.         jr z,1f
  2205.         ldi
  2206.         cp (hl)
  2207.         jr z,1f
  2208.         ldi
  2209. 1       xor a
  2210.         ld (de),a
  2211.         ret
  2212.  
  2213. findfreeffile
  2214. ;out: nz=fail, hl=FIL, b=fil number
  2215.         ld hl,ffilearray
  2216.         ld de,FIL_sz
  2217.         ld b,0
  2218. findfreeffile0
  2219.         inc hl
  2220.         ld a,(hl) ;FS(HSB)
  2221.         dec hl
  2222.         or a
  2223.         ret z ;OK
  2224.         add hl,de
  2225.         inc b
  2226.         ld a,b
  2227.         cp MAXFILES
  2228.         jr nz,findfreeffile0
  2229.         or a ;nz
  2230.         ret
  2231.  
  2232. BDOS_getdta
  2233.         ld e,(iy+app.dta)
  2234.         ld d,(iy+app.dta+1)
  2235.         ret
  2236.        
  2237. movedma_addr
  2238.         ld iy,(appaddr)
  2239.         ;ld hl,(dma_addr) ;юЁшушэры№э√щ, эх яхЁхёўшЄрээ√щ рфЁхё
  2240.         call BDOS_getdta
  2241.         ex de,hl
  2242.         add hl,bc
  2243.         ex de,hl
  2244.         ;ld (dma_addr),hl
  2245.         ;ret
  2246. BDOS_setdta
  2247.         ld (iy+app.dta),e
  2248.         ld (iy+app.dta+1),d
  2249.         ret
  2250.  
  2251. ;***********************╟└├╦╙╪╩╚**************************     
  2252.  
  2253. ;ъюяшЁютрэшх ёЄЁюъш шч\т ■чхЁёяхщёр т\шч ышсє ЇрЄЇё
  2254. strcpy_lib2usp  ;DE - dst, BC - src
  2255. strcpy_usp2lib
  2256.         push bc
  2257.         call BDOS_setdepage
  2258.         pop bc
  2259. strcpy_lib2usp0
  2260.         ld a,(bc)
  2261.         ld (de),a
  2262.         inc de
  2263.         inc bc
  2264.         or a
  2265.         jr nz,strcpy_lib2usp0
  2266.         ;BDOSSETPGFATFS
  2267.         jp BDOS_setpgstructs
  2268.  
  2269. ;ъюяшЁютрэшх т\шч ■чхЁёяхщёр т\шч ёЄЁєъЄєЁє
  2270. memcpy_buf2usp  ;DE - dst, BC - src, эр ёЄхъх count
  2271.         res 7,b ;src=buf
  2272.         jr memcpy_buf_go
  2273. memcpy_usp2buf
  2274.         res 7,d ;dst=buf
  2275. memcpy_buf_go
  2276.         push bc
  2277.         ld a,pgfatfs2;=pgstructs
  2278.         call BDOS_setpg4000
  2279.         pop bc
  2280.         jr memcpy_loop
  2281. ;ъюяшЁютрэшх т\шч ■чхЁёяхщёр т\шч ышсє ЇрЄЇё
  2282. memcpy_lib2usp  ;DE - dst, BC - src, эр ёЄхъх count
  2283. memcpy_usp2lib
  2284. memcpy_loop
  2285.         push bc
  2286.         call BDOS_setdepage
  2287.         pop hl;bc
  2288.         ;ld h,b
  2289.         ;ld l,c
  2290.         pop af
  2291.         pop bc
  2292.         push bc
  2293.         push af
  2294.         ldir
  2295.         BDOSSETPGFATFS ;4000
  2296.         jp BDOS_setpgstructs
  2297.  
  2298. ;яю ўшёыє фЁрщтют FatFS (фы  TR-DOS эх эрфю)
  2299. fatfsarray=0xc000
  2300.         ;display "fatfsarray=",fatfsarray
  2301.         ;ds 4*FATFS_sz
  2302.  
  2303. ffilearray
  2304.         ds MAXFILES*FIL_sz
  2305.         ;dw #100 ;яЁшчэръ ъюэЎр ffilearray
  2306.        
  2307. mfil    db "12345678.123",0 ;эєцэю Єюы№ъю эр тЁхь  юяхЁрЎшш, ъюЄюЁр  яЁшэшьрхЄ шь  Їрщыр (ьюцхЄ с√Є№ ё яєЄ╕ь?)
  2308.  
  2309. mfilinfo FILINFO ;эєцэю Єюы№ъю эр тЁхь  findnext
  2310.  
  2311. fcb2    ds FCB_sz ;эєцэю Єюы№ъю эр тЁхь  findnext
  2312.  
  2313. fres    dw 0 ;ёЄЁєъЄєЁр фы  тючтЁрЄр Ёхчєы№ЄрЄр FatFS (ўшёыю яЁюўшЄрээ√ї/чряшёрээ√ї срщЄ)
  2314.         dw 0 ;фы  тючтЁрЄр фрЄ√
  2315.  
  2316. syspath
  2317.         db "bin",0
  2318.        
  2319. ;фы  TASiS: эх шёяюы№чє■Єё  ёЄЁрэшЎ√ ╬╟╙ #00, #1B, #1C, #1D, #1E, #1F
  2320. ;фы  шчсхцрэш  ушсхЁэрЎшш: эх шёяюы№чє■Єё  ёЄЁрэшЎ√ ╬╟╙ 128K
  2321. tsys_pages
  2322.         ds 8,0xff ;ёшёЄхьэ√х ёЄЁрэшЎ√
  2323.         if TOPDOWNMEM
  2324.         db 0,0,0,0
  2325.         else
  2326.         db 0xff,0xff,0xff,0xff
  2327.         endif
  2328.         db 0,0,0,0 ;#08..#0f
  2329.         db 0,0,0,0,0,0,0,0 ;#10..#17
  2330.         db 0,0,0,#ff,#ff,#ff,#ff,#ff ;#18..#1f
  2331.         ds sys_npages-32-4 ;0=empty, or else process number
  2332.         if TOPDOWNMEM
  2333.         db 0xff,0xff,0xff,0xff
  2334.         else
  2335.         db 0,0,0,0
  2336.         endif
  2337.  
  2338.         display "$ before align=",$
  2339. ;TODO їЁрэшЄ№ яЁ ью т ЄхъёЄютюь ¤ъЁрэх? р хёыш чрЄЁєЄ, Єю тюёёЄрэртыштрЄ№? яю ъръюьє ёюс√Єш■?
  2340.         align 256
  2341. trecode
  2342.         incbin "866toatm"
  2343.