?login_element?

Subversion Repositories NedoOS

Rev

Rev 745 | Go to most recent revision | 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. ;DE = Drive/path/file ASCIIZ string
  454.         ex de,hl
  455.         call findlastslash. ;de=last slash
  456.         ld hl,trdos_tempfilename
  457.         push hl
  458.         call dotname_to_cpmname ;de -> hl
  459.         pop de
  460.         jp nfdel_filename
  461.         ;xor a
  462.         ;ret
  463.        
  464. trdos_rename
  465. ;DE = Drive/path/file ASCIIZ string, HL = New filename ASCIIZ string
  466.         push de
  467.  
  468.         call findlastslash. ;de=last slash
  469.         ld hl,trdos_tempfilename2
  470.         call dotname_to_cpmname ;de -> hl
  471.        
  472.         pop hl ;hl = poi to filename in string
  473.  
  474.         call findlastslash. ;de=last slash
  475.         ld hl,trdos_tempfilename
  476.         push hl
  477.         call dotname_to_cpmname ;de -> hl
  478.         pop hl ;hl=filename
  479.         ld c,9 ;c=FILENAMESZ
  480.          ;jr $
  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.         ld a,(de) ;block # + ext[1]
  503. trdos_rename_ext1diff=$+1
  504.         sub 0
  505.         ld (de),a ;block # + newext[1]
  506.         inc hl
  507.         inc de
  508.         ld a,(hl)
  509.         ld (de),a ;newext[2]
  510.          pop bc
  511.         ld d,0 ;track
  512.         ld a,8
  513.         sub b
  514.         ld e,a ;sector
  515.         call wrsecDOSBUF
  516.         pop hl
  517.         pop de
  518.         pop bc
  519.         call findfile_continue
  520.         jr z,trdos_rename_0
  521. trdos_rename_q
  522.         xor a
  523.         ret
  524.  
  525. dotname_to_cpmname
  526. ;de -> hl
  527. ;out: de=pointer to termination character
  528.         ;push hl ;buffer
  529.        
  530.         push de ;ASCIIZ string for parsing
  531.         push hl ;Pointer to 11 byte buffer
  532.         ld d,h
  533.         ld e,l
  534.         inc de
  535.         ld [hl],' '
  536.         ld bc,11-1
  537.         ldir ;empty filename
  538.         pop hl ;Pointer to 11 byte buffer
  539.         pop de ;ASCIIZ string for parsing
  540.  
  541. ;change dots to 1, except the last
  542.         ld a,(de)
  543.         cp '.'
  544.         jr z,parse_filename_changedots
  545.         push de
  546.         jr parse_filename_changedots0getgo
  547. parse_filename_changedots0get
  548.          ld a,1
  549.          ld (de),a
  550. parse_filename_changedots0getgo
  551.         ld b,d
  552.         ld c,e
  553. parse_filename_changedots0
  554.         ld a,(de)
  555.         cp '.'
  556.         jr z,parse_filename_changedots0get
  557.         inc de
  558.         or a
  559.         jr nz,parse_filename_changedots0
  560.         ld a,(bc)
  561.         cp 1
  562.         jr nz,$+5
  563.          ld a,'.'
  564.          ld (bc),a
  565.         pop de
  566. parse_filename_changedots
  567.  
  568.         ld b,9
  569.        
  570.         ld a,(de)
  571.         cp '.'
  572.         jr nz,parse_filename0.
  573.         ld (hl),a
  574.         inc de
  575.         ld a,(de)
  576.         cp '.'
  577.         jr nz,parse_filenameq_findterminator.
  578.         inc hl
  579.         ld (hl),a
  580.         jr parse_filenameq_findterminator.
  581. parse_filename0.
  582.         ld a,[de]
  583.         or a
  584.         ret z ;jr z,parse_filenameq. ;no extension in string
  585.         cp '.'
  586.         jr z,parse_filenamedot. ;можем уже быть на терминаторе
  587.          ;cp 0x80
  588.          ;jr nc,$+4
  589.          ;or 0x20
  590.          cp 1
  591.          jr nz,$+5
  592.           ld a,'.'
  593.           ld [de],a
  594.         ld [hl],a
  595.         inc de
  596.         inc hl
  597.         djnz parse_filename0.
  598. ;9 bytes in filename, no dot (9th byte goes to extension)
  599. ;возможно, длинное имя, надо найти, что раньше - точка или терминатор
  600. ;можем уже быть на терминаторе или на точке
  601.         dec hl
  602.         ld [hl],' '
  603. parse_filenamelongname0.
  604.         ld a,[de]
  605.         or a
  606.         ret z ;jr z,parse_filenameq. ;a=0
  607.         inc de
  608.         cp '.'
  609.         jr z,parse_filenameLONGnamedot. ;можем уже быть на терминаторе
  610.         jr parse_filenamelongname0.
  611. parse_filenamedot.
  612.         inc de
  613.         inc hl
  614.         djnz $-1 ;hl points to extension in FCB
  615.         dec hl
  616. parse_filenameLONGnamedot.
  617.         ld a,[de] ;extension in string
  618.         or a
  619.         ret z ;jr z,parse_filenameq. ;a=0
  620.          ;cp 0x80
  621.          ;jr nc,$+4
  622.          ;or 0x20
  623.         ld [hl],a ;extension in FCB
  624.         inc hl
  625.         inc de
  626.         ld a,[de] ;extension in string
  627.         or a
  628.         ret z ;jr z,parse_filenameq. ;a=0
  629.          ;cp 0x80
  630.          ;jr nc,$+4
  631.          ;or 0x20
  632.         ld [hl],a ;extension in FCB
  633.         inc hl
  634.         inc de
  635.         ld a,[de] ;extension in string
  636.         or a
  637.         ret z ;jr z,parse_filenameq. ;a=0
  638.          ;cp 0x80
  639.          ;jr nc,$+4
  640.          ;or 0x20
  641.         ld [hl],a ;extension in FCB
  642. parse_filenameq_findterminator.
  643.         inc de
  644.         ld a,[de]
  645.         or a
  646.         jr nz,parse_filenameq_findterminator.
  647. ;parse_filenameq. ;de на терминаторе
  648.         ;pop hl ;buffer
  649.         ret ;a=0
  650.        
  651. trdos_tempfilename
  652.         ds 11
  653. trdos_tempfilename2
  654.         ds 11
  655. BDOS_parse_filename_cpmnamebuf
  656.         ds 11 ;TODO объединить с одним из tempfilename
  657.