Subversion Repositories NedoOS

Rev

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

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