?login_element?

Subversion Repositories NedoOS

Rev

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

  1. trdosgetdirfcb
  2.         ld hl,fcb2+FCB_FNAME
  3.         call dotname_to_cpmname ;de -> hl
  4.         ld hl,mfilinfo+FILINFO_FSIZE
  5.         ld de,fcb2+FCB_FSIZE
  6.         ld bc,4
  7.         ldir
  8.         ld hl,(mfilinfo+FILINFO_FDATE)
  9.         ld (fcb2+FCB_FDATE),hl
  10.         ld hl,(mfilinfo+FILINFO_FTIME)
  11.         ld (fcb2+FCB_FTIME),hl      
  12.         ld a,(mfilinfo+FILINFO_FATTRIB)
  13.         ;and 0x10
  14.         ld (fcb2+FCB_FATTRIB),a
  15.         ret
  16.  
  17. dos3d13.
  18. ;hl=addr
  19. ;de=track,sector
  20. ;b=size/256
  21. ;c=5 (read), 6 (write)
  22.         ;push bc
  23.         ;ex de,hl
  24.         ;call BDOS_preparedepage
  25.         ;call BDOS_setdepage ;TODO убрать в драйвер
  26.         ;ex de,hl
  27.         ;pop bc
  28. dos3d13nopg.
  29. ;bc,de,hl,a (for c=1)
  30.         push iy
  31.         exx
  32.         ld e,(iy+app.gfxmode)
  33.         ld iy,23610
  34.         push af
  35. dos3d13_waitnospace0
  36.         ld a,0x7f
  37.         in a,(0xfe)
  38.         rra
  39.         jr nc,dos3d13_waitnospace0
  40.         pop af
  41.         call dos3d13_resident
  42.         pop iy
  43.         ret
  44.  
  45. trdos_fread
  46.         ld hl,FCB_FFSFCB
  47.         add hl,de
  48.         ld a,(hl)
  49.         inc hl
  50.         ld h,(hl)
  51.         ld l,a ;hl = poi to TRDOSFCB
  52.        
  53.         ;ld de,(dma_addr) ;de=poi to data
  54.         call BDOS_getdta
  55.         call BDOS_preparedepage
  56.         call BDOS_setdepage ;TODO убрать в драйвер
  57.  
  58.         ex de,hl ;hl=poi to data, de=poi to TRDOSFCB
  59.         ld bc,128 ;bc=size
  60.          push bc ;blocksize
  61.         call fread ;hl=total processed bytes
  62.          pop bc ;blocksize
  63.         call movedma_addr ;+bc
  64.         ld a,l
  65.         xor 0x80 ;!=, если прочитали не 128 байт
  66. ;a=0: OK (прочитали 128 байт)
  67. ;a=128: fail (прочитали 0 байт)
  68. ;a=???: OK (последний блок файла меньше 128 байт)
  69.         ;ld a,(_waseof)
  70.         ;and 128 ;EOF (чтобы было как в FatFS)
  71.         ;xor a ;success
  72.         ret
  73. trdos_fread_b
  74. ;b=trdosfcb high
  75. ;de=poi to data
  76. ;hl=size
  77.         push hl ;Number of bytes to read
  78.         ld h,b
  79.         ld l,0
  80.         call BDOS_preparedepage
  81.         call BDOS_setdepage ;TODO убрать в драйвер
  82.         pop bc ;Number of bytes to read
  83.         ex de,hl
  84. ;hl=poi to data
  85. ;de=poi to TRDOSFCB
  86. ;bc=size
  87.         jp fread ;hl=total processed bytes, a=error
  88.  
  89.        
  90. trdos_fwrite
  91.         ld bc,128 ;bc=size
  92. ;trdos_fwrite_nbytes
  93.         ld hl,FCB_FFSFCB
  94.         add hl,de
  95.         ld a,(hl)
  96.         inc hl
  97.         ld h,(hl)
  98.         ld l,a ;hl = poi to TRDOSFCB
  99.  
  100.         push bc
  101.         ;ld de,(dma_addr) ;de=poi to data
  102.         call BDOS_getdta
  103.         call BDOS_preparedepage
  104.         call BDOS_setdepage ;TODO убрать в драйвер
  105.         pop bc
  106.         ex de,hl ;hl=poi to data, de=poi to TRDOSFCB
  107.          push bc ;blocksize
  108.         call fwrite
  109.          pop bc ;blocksize
  110.         call movedma_addr ;+bc
  111.         xor a ;success
  112.         ret
  113. trdos_fwrite_b
  114. ;b=trdosfcb high
  115. ;de=poi to data
  116. ;hl=size
  117.         ;jr $
  118.         push hl ;Number of bytes to write
  119.         ld h,b
  120.         ld l,0
  121.         call BDOS_preparedepage
  122.         call BDOS_setdepage ;TODO убрать в драйвер
  123.         pop bc ;Number of bytes to write
  124.         ex de,hl
  125. ;hl=poi to data
  126. ;de=poi to TRDOSFCB
  127. ;bc=size
  128.         jp fwrite ;hl=total processed bytes, a=0: no error
  129.        
  130. trdos_searchnext
  131. ;hl=адрес в директории
  132. ;de=FCB, куда класть описатель
  133. ;out: hl=следующий адрес в директории, z=error
  134.          ld a,' '
  135.          ld (de),a
  136.         ld a,(hl)
  137.         or a
  138.         ret z ;jr z,BDOS_fsearch_loadloop_noFATFS_empty
  139.         ld bc,8
  140.         ldir
  141.         ld a,(hl)
  142.         ldi
  143.         cp 'B'
  144.         jr nz,trdos_searchnext_nobas
  145. ;basic, если start < 0x4100 (чтобы можно было .BAT)
  146.          inc hl
  147.          ld a,(hl)
  148.          cp 0x41
  149.          jr nc,trdos_searchnext_decnobas
  150.          inc hl
  151.         ld a,' '
  152.         ld (de),a
  153.         inc de
  154.         ld (de),a
  155.         inc de
  156.         jr trdos_searchnext_basq
  157. trdos_searchnext_decnobas
  158.          dec hl
  159. trdos_searchnext_nobas
  160.         ldi
  161.         ldi
  162. trdos_searchnext_basq
  163.         ld de,fcb2+FCB_FSIZE
  164.         ldi
  165.         ldi
  166.         xor a
  167.         ld (de),a
  168.         inc de
  169.         ld (de),a
  170.         ld de,fcb2+FCB_FDATE
  171.         ld (de),a
  172.         inc de
  173.         ld (de),a
  174.         ld de,fcb2+FCB_FATTRIB
  175.         ld (de),a
  176.         ld de,fcb2+FCB_FTIME
  177.        ld a,l ;file pos in sector
  178.        and 0xf0
  179.         ld (de),a
  180.         inc de
  181.        ld a,h
  182.        sub trdos_catbuf/256 ;sector
  183.         ld (de),a
  184.         ld bc,16-11-2
  185.         add hl,bc
  186.         inc a ;nz
  187.         ret
  188.  
  189. trdos_fopen
  190. ;a=drive 0..3
  191.         push de ;FCB
  192.         inc de ;filename
  193.         ld c,'r'
  194. trdos_fopen_go
  195. ;a=drive 0..3
  196.         call nfopen ;out: a (0=success, 0xff=fail), hl=TRDOSFCB
  197.         pop bc ;bc = pointer to opened FCB (TODO чем отличается от unopened?)
  198.         or a
  199.         ret nz ;error
  200.         ex de,hl ;de=TRDOSFCB
  201.         ld hl,FCB_FFSFCB
  202.         add hl,bc
  203.         ld (hl),e
  204.         inc hl
  205.         ld (hl),d
  206.         ret
  207.  
  208. trdos_fcreate
  209. ;a=drive 0..3
  210.         push de ;FCB
  211.         inc de ;filename
  212.         ld c,'w'
  213.         jr trdos_fopen_go
  214.         ;call nfopen
  215.         ;pop bc ;bc = pointer to opened FCB (TODO чем отличается от unopened?)
  216.         ;xor a ;success ;TODO ошибка создания
  217.         ;ret
  218.  
  219. trdos_fclose
  220.         ;ld hl,TRDOSFCB1
  221.         ld hl,FCB_FFSFCB
  222.         add hl,de
  223.         ld a,(hl)
  224.         inc hl
  225.         ld h,(hl)
  226.         ld l,a ;hl = poi to TRDOSFCB
  227. trdos_fclose_hl
  228.         call fclose
  229.         xor a ;success
  230.         ret
  231.  
  232. trdos_getfilesize
  233. ;b=handle
  234. ;out: dehl=filesize
  235.         xor a
  236.         ld h,a
  237.         ld l,a
  238.         ld (trdos_getfilesizeLSW),hl
  239.         ld (trdos_getfilesizeHSB),a
  240.        
  241.         ld h,b
  242.         ld l,1 ;TRDOSFCB filename
  243.        
  244.         ld c,9 ;c=FILENAMESZ
  245.         call findfile
  246.         jr nz,trdos_getfilesize_q
  247. ;hl,de=after filename
  248. trdos_getfilesize_0
  249.         ;push bc
  250.         push de
  251.         push hl
  252. ;de=after filename on disk
  253.         ex de,hl
  254.         inc hl
  255.         inc hl
  256.         ld e,(hl)
  257.         inc hl
  258.         ld d,(hl) ;length
  259. trdos_getfilesizeLSW=$+1
  260.         ld hl,0
  261.         add hl,de
  262.         ld (trdos_getfilesizeLSW),hl
  263.         ld hl,trdos_getfilesizeHSB
  264.         jr nc,$+3
  265.         inc (hl)
  266.         pop hl
  267.         pop de
  268.         ;pop bc
  269.         call findfile_continue
  270.         jr z,trdos_getfilesize_0
  271. trdos_getfilesize_q
  272.         ld hl,(trdos_getfilesizeLSW)
  273. trdos_getfilesizeHSB=$+1
  274.         ld de,0
  275.         xor a
  276.         ret
  277.  
  278. trdos_getfiletime
  279. ;de=path/file ASCIIZ string
  280. ;out: ix=date, hl=time (counted from file index)
  281.         ld c,9 ;c=FILENAMESZ
  282.         call findfile
  283. ;carry = off, a = 0, de = DOSBUF after filename, b = 8-sector
  284.         ld a,e
  285.        and 0xf0
  286.         ld l,a
  287.         ld a,8
  288.         sub b
  289.         ld h,a
  290.         ld ix,0
  291.         ret
  292.  
  293. trdos_seekhandle_bof
  294. ;b=file handle
  295.         ld h,b
  296.         call nfopen_reopen ;переоткрываем файл
  297.         jr trdos_seekhandle_q
  298.         ;pop hl
  299.         ;pop de
  300.         ;xor a
  301.         ;ret
  302.        
  303. trdos_seekhandle
  304. ;                    B = File handle
  305. ;                    [A = Method code: 0=begin,1=cur,2=end]
  306. ;                DE:HL = Signed offset
  307. ;     Results:       A = Error
  308. ;                DE:HL = New file pointer
  309. ;только для чтения!!!
  310.         push de
  311.         push hl
  312.  
  313.         ld a,e
  314.         or h
  315.         or l
  316.         jr z,trdos_seekhandle_bof ;если addr=0, то переоткрыть файл
  317. ;addrm1=addr-1, т.к. все указатели и номера в TRDOSFCB при чтении рассчитаны на предыдущий байт
  318.         ld a,e
  319.         ld de,1
  320.         ;or a
  321.         sbc hl,de
  322.         sbc a,d;0
  323.         ld (trdos_seekhandleaddrLSW),hl
  324.         ld (trdos_seekhandleaddrHSB),a        
  325.        
  326.         xor a
  327.         ld h,a
  328.         ld l,a
  329.         ld (trdos_seekhandlesizeLSW),hl
  330.         ld (trdos_seekhandlesizeHSB),a
  331.        
  332.         ld h,b
  333.         ld l,1 ;TRDOSFCB filename
  334.        
  335.         ld c,9 ;c=FILENAMESZ
  336.         call findfile
  337.         jr nz,trdos_seekhandle_q
  338. ;пройти блоки файла, суммировать totalsize+=blocksize и остановиться на том, где addrm1 < totalsize+blocksize ((addrm1-totalsize) < blocksize)
  339. ;hl,de=after filename
  340. trdos_seekhandle_0
  341.         push bc
  342.         push de
  343.         push hl
  344. ;de=after filename on disk
  345.         ex de,hl
  346.         ld a,(hl)
  347.         ld (trdos_seekhandle_blocknumber),a
  348.         inc hl
  349.         inc hl
  350.         ld e,(hl)
  351.         inc hl
  352.         ld d,(hl) ;length
  353.         ld (trdos_seekhandle_length),de
  354.         inc hl
  355.         inc hl
  356.         ld c,(hl)
  357.         inc hl
  358.         ld b,(hl) ;track,sector
  359.         ld (trdos_seekhandle_trsec),bc
  360. trdos_seekhandleaddrLSW=$+1
  361.         ld hl,0
  362.         ld c,l ;addrm1&0xff
  363. trdos_seekhandleaddrHSB=$+1
  364.         ld a,0
  365. trdos_seekhandlesizeLSW=$+1
  366.         ld de,0
  367.         or a
  368.         sbc hl,de
  369. trdos_seekhandlesizeHSB=$+1
  370.         sbc a,0
  371. ;ahl=addrm1-totalsize
  372. ;keep h
  373.         ld (trdos_seekhandle_shiftinblock),hl
  374. ;остановиться на том блоке, где addrm1 < totalsize+blocksize ((addrm1-totalsize) < blocksize)
  375. trdos_seekhandle_length=$+1
  376.         ld de,0 ;blocksize = length блока
  377.         or a
  378.         sbc hl,de
  379.         sbc a,0
  380.         jp m,trdos_seekhandle_blockfound
  381.        
  382.         ld hl,(trdos_seekhandlesizeLSW)
  383.         ld a,(trdos_seekhandlesizeHSB)
  384.         add hl,de
  385.         adc a,0 ;ahl=totalsize+blocksize
  386.         ld (trdos_seekhandlesizeLSW),hl
  387.         ld (trdos_seekhandlesizeHSB),a
  388.         pop hl
  389.         pop de
  390.         pop bc
  391.         call findfile_continue
  392.         jr z,trdos_seekhandle_0
  393. ;TODO error
  394. trdos_seekhandle_q
  395.         pop hl
  396.         pop de
  397.         xor a
  398.         ret
  399.  
  400. trdos_seekhandle_blockfound
  401.         pop hl ;TRDOSFCB
  402.         push hl
  403. ;установить TRDOSFCB.remain = addrm1&0xff
  404.         ld l,TRDOSFCB.remain
  405.         ld (hl),c
  406. ;установить TRDOSFCB.firstsector = первый сектор блока
  407. trdos_seekhandle_trsec=$+1
  408.         ld bc,0
  409.         ld l,TRDOSFCB.firstsector
  410.         ld (hl),c
  411.         inc l
  412.         ld (hl),b
  413. ;установить TRDOSFCB.lastlen = length блока
  414.         ld l,TRDOSFCB.lastlen
  415.         ld (hl),e
  416.         inc l
  417.         ld (hl),d
  418. ;установить TRDOSFCB.secinblk = число оставшихся секторов в блоке = размер блока - (addrm1-totalsize)/256 - 1 (может получиться 0, если последний сектор блока уже загружен)
  419.         dec de
  420.         inc d
  421.         ld a,d
  422. trdos_seekhandle_shiftinblock=$+1
  423.         ld de,0
  424.         sub d
  425.         dec a
  426.         ld l,TRDOSFCB.secinblk
  427.         ld (hl),a
  428. ;установить TRDOSFCB.cursector = первый сектор блока + (addrm1-totalsize)/256, прочитать этот сектор и инкрементировать
  429.         ld lx,d
  430.         call addsectors
  431.         ld d,b
  432.         ld e,c
  433.         inc h
  434.         ld l,0 ;poi to buf
  435.         call rdsec.
  436.         ;hl=next sector
  437.         ex de,hl
  438.         pop hl
  439.         ld l,TRDOSFCB.cursector
  440.         ld (hl),e
  441.         inc l
  442.         ld (hl),d
  443. ;установить TRDOSFCB.block = номер блока + 1(!), т.е. всегда следующий блок
  444.         ld l,TRDOSFCB.block
  445. trdos_seekhandle_blocknumber=$+1
  446.         ld (hl),0
  447.         inc (hl)
  448.         pop de
  449.         pop bc
  450.         jr trdos_seekhandle_q
  451.  
  452. trdos_delete
  453.        ld (trdoscurdrive),a
  454. ;DE = Drive/path/file ASCIIZ string
  455.         ex de,hl
  456.         call findlastslash. ;de=last slash
  457.         ld hl,trdos_tempfilename
  458.         push hl
  459.         call dotname_to_cpmname ;de -> hl
  460.         pop de
  461.         jp nfdel_filename
  462.         ;xor a
  463.         ;ret
  464.        
  465. trdos_rename
  466.        ld (trdoscurdrive),a
  467. ;DE = Drive/path/file ASCIIZ string, HL = New filename ASCIIZ string
  468.         push de
  469.         call findlastslash. ;de=last slash
  470.         ld hl,trdos_tempfilename2
  471.         call dotname_to_cpmname ;de -> hl
  472.        
  473.         pop hl ;hl = poi to filename in string
  474.  
  475.         call findlastslash. ;de=last slash
  476.         ld hl,trdos_tempfilename
  477.         push hl
  478.         call dotname_to_cpmname ;de -> hl
  479.         pop hl ;hl=filename
  480.         ld c,9 ;c=FILENAMESZ
  481.         call findfile
  482.         jr nz,trdos_rename_q
  483. ;hl,de=after filename
  484.         push hl
  485.         ld a,(de)
  486.         ld hl,trdos_tempfilename2+9 ;&newext[1]
  487.         sub (hl) ;ext[1] - newext[1]
  488.         ld (trdos_rename_ext1diff),a
  489.         pop hl
  490. trdos_rename_0
  491.         push bc
  492.         push de
  493.         push hl
  494.          push bc
  495. ;de=after filename
  496.         ld hl,trdos_tempfilename2
  497.         ld a,e
  498.         and 0xf0
  499.         ld e,a
  500.         ld bc,9
  501.         ldir
  502.        dec hl
  503.        ld a,[hl]
  504.        inc hl
  505.        cp 'B'
  506.        jr nz,trdos_rename_nobasic
  507.        inc de
  508.        inc de
  509.        ld a,[de] ;length LSB
  510.        inc de
  511.        ex af,af' ;'
  512.        ld a,[de] ;length HSB
  513.        dec de
  514.        dec de
  515.        ld [de],a ;start HSB
  516.        ex af,af' ;'
  517.        dec de
  518.        ld [de],a ;start LSB
  519.        jr trdos_rename_basicq
  520. trdos_rename_nobasic
  521.         ld a,(de) ;block # + ext[1]
  522. trdos_rename_ext1diff=$+1
  523.         sub 0
  524.         ld (de),a ;block # + newext[1]
  525.         inc hl
  526.         inc de
  527.         ld a,(hl)
  528.         ld (de),a ;newext[2]
  529. trdos_rename_basicq
  530.          pop bc
  531.         ld d,0 ;track
  532.         ld a,8
  533.         sub b
  534.         ld e,a ;sector
  535.         call wrsecDOSBUF
  536.         pop hl
  537.         pop de
  538.         pop bc
  539.         call findfile_continue
  540.         jr z,trdos_rename_0
  541. trdos_rename_q
  542.         xor a
  543.         ret
  544.  
  545. dotname_to_cpmname
  546. ;de -> hl
  547. ;out: de=pointer to termination character
  548.         ;push hl ;buffer
  549.        
  550.         push de ;ASCIIZ string for parsing
  551.         push hl ;Pointer to 11 byte buffer
  552.         ld d,h
  553.         ld e,l
  554.         inc de
  555.         ld [hl],' '
  556.         ld bc,11-1
  557.         ldir ;empty filename
  558.         pop hl ;Pointer to 11 byte buffer
  559.         pop de ;ASCIIZ string for parsing
  560.  
  561. ;change dots to 1, except the last
  562.         ld a,(de)
  563.         cp '.'
  564.         jr z,parse_filename_changedots
  565.         push de
  566.         jr parse_filename_changedots0getgo
  567. parse_filename_changedots0get
  568.          ld a,1
  569.          ld (de),a
  570. parse_filename_changedots0getgo
  571.         ld b,d
  572.         ld c,e
  573. parse_filename_changedots0
  574.         ld a,(de)
  575.         cp '.'
  576.         jr z,parse_filename_changedots0get
  577.         inc de
  578.         or a
  579.         jr nz,parse_filename_changedots0
  580.         ld a,(bc)
  581.         cp 1
  582.         jr nz,$+5
  583.          ld a,'.'
  584.          ld (bc),a
  585.         pop de
  586. parse_filename_changedots
  587.  
  588.         ld b,9
  589.        
  590.         ld a,(de)
  591.         cp '.'
  592.         jr nz,parse_filename0.
  593.         ld (hl),a
  594.         inc de
  595.         ld a,(de)
  596.         cp '.'
  597.         jr nz,parse_filenameq_findterminator.
  598.         inc hl
  599.         ld (hl),a
  600.         jr parse_filenameq_findterminator.
  601. parse_filename0.
  602.         ld a,[de]
  603.         or a
  604.         ret z ;jr z,parse_filenameq. ;no extension in string
  605.         cp '.'
  606.         jr z,parse_filenamedot. ;можем уже быть на терминаторе
  607.          ;cp 0x80
  608.          ;jr nc,$+4
  609.          ;or 0x20
  610.          cp 1
  611.          jr nz,$+5
  612.           ld a,'.'
  613.           ld [de],a
  614.         ld [hl],a
  615.         inc de
  616.         inc hl
  617.         djnz parse_filename0.
  618. ;9 bytes in filename, no dot (9th byte goes to extension)
  619. ;возможно, длинное имя, надо найти, что раньше - точка или терминатор
  620. ;можем уже быть на терминаторе или на точке
  621.         dec hl
  622.         ld [hl],' '
  623. parse_filenamelongname0.
  624.         ld a,[de]
  625.         or a
  626.         ret z ;jr z,parse_filenameq. ;a=0
  627.         inc de
  628.         cp '.'
  629.         jr z,parse_filenameLONGnamedot. ;можем уже быть на терминаторе
  630.         jr parse_filenamelongname0.
  631. parse_filenamedot.
  632.         inc de
  633.         inc hl
  634.         djnz $-1 ;hl points to extension in FCB
  635.         dec hl
  636. parse_filenameLONGnamedot.
  637.         ld a,[de] ;extension in string
  638.         or a
  639.         ret z ;jr z,parse_filenameq. ;a=0
  640.          ;cp 0x80
  641.          ;jr nc,$+4
  642.          ;or 0x20
  643.         ld [hl],a ;extension in FCB
  644.         inc hl
  645.         inc de
  646.         ld a,[de] ;extension in string
  647.         or a
  648.         ret z ;jr z,parse_filenameq. ;a=0
  649.          ;cp 0x80
  650.          ;jr nc,$+4
  651.          ;or 0x20
  652.         ld [hl],a ;extension in FCB
  653.         inc hl
  654.         inc de
  655.         ld a,[de] ;extension in string
  656.         or a
  657.         ret z ;jr z,parse_filenameq. ;a=0
  658.          ;cp 0x80
  659.          ;jr nc,$+4
  660.          ;or 0x20
  661.         ld [hl],a ;extension in FCB
  662. parse_filenameq_findterminator.
  663.         inc de
  664.         ld a,[de]
  665.         or a
  666.         jr nz,parse_filenameq_findterminator.
  667. ;parse_filenameq. ;de на терминаторе
  668.         ;pop hl ;buffer
  669.         ret ;a=0
  670.        
  671. trdos_tempfilename
  672.         ds 11
  673. trdos_tempfilename2
  674.         ds 11
  675. BDOS_parse_filename_cpmnamebuf
  676.         ds 11 ;TODO объединить с одним из tempfilename
  677.