?login_element?

Subversion Repositories NedoOS

Rev

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

  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_FTIME
  175.         ld (de),a
  176.         inc de
  177.         ld (de),a
  178.         ld de,fcb2+FCB_FATTRIB
  179.         ld (de),a
  180.         ld bc,16-11-2
  181.         add hl,bc
  182.         inc a ;nz
  183.         ret
  184.  
  185. trdos_fopen
  186. ;a=drive 0..3
  187.         push de ;FCB
  188.         inc de ;filename
  189.         ld c,'r'
  190. trdos_fopen_go
  191. ;a=drive 0..3
  192.         call nfopen ;out: a (0=success, 0xff=fail), hl=TRDOSFCB
  193.         pop bc ;bc = pointer to opened FCB (TODO чем отличается от unopened?)
  194.         or a
  195.         ret nz ;error
  196.         ex de,hl ;de=TRDOSFCB
  197.         ld hl,FCB_FFSFCB
  198.         add hl,bc
  199.         ld (hl),e
  200.         inc hl
  201.         ld (hl),d
  202.         ret
  203.  
  204. trdos_fcreate
  205. ;a=drive 0..3
  206.         push de ;FCB
  207.         inc de ;filename
  208.         ld c,'w'
  209.         jr trdos_fopen_go
  210.         ;call nfopen
  211.         ;pop bc ;bc = pointer to opened FCB (TODO чем отличается от unopened?)
  212.         ;xor a ;success ;TODO ошибка создания
  213.         ;ret
  214.  
  215. trdos_fclose
  216.         ;ld hl,TRDOSFCB1
  217.         ld hl,FCB_FFSFCB
  218.         add hl,de
  219.         ld a,(hl)
  220.         inc hl
  221.         ld h,(hl)
  222.         ld l,a ;hl = poi to TRDOSFCB
  223. trdos_fclose_hl
  224.         call fclose
  225.         xor a ;success
  226.         ret
  227.  
  228. trdos_getfilesize
  229. ;b=handle
  230. ;out: dehl=filesize
  231.         xor a
  232.         ld h,a
  233.         ld l,a
  234.         ld (trdos_getfilesizeLSW),hl
  235.         ld (trdos_getfilesizeHSB),a
  236.        
  237.         ld h,b
  238.         ld l,1 ;TRDOSFCB filename
  239.        
  240.         ld c,9 ;c=FILENAMESZ
  241.         call findfile
  242.         jr nz,trdos_getfilesize_q
  243. ;hl,de=after filename
  244. trdos_getfilesize_0
  245.         ;push bc
  246.         push de
  247.         push hl
  248. ;de=after filename on disk
  249.         ex de,hl
  250.         inc hl
  251.         inc hl
  252.         ld e,(hl)
  253.         inc hl
  254.         ld d,(hl) ;length
  255. trdos_getfilesizeLSW=$+1
  256.         ld hl,0
  257.         add hl,de
  258.         ld (trdos_getfilesizeLSW),hl
  259.         ld hl,trdos_getfilesizeHSB
  260.         jr nc,$+3
  261.         inc (hl)
  262.         pop hl
  263.         pop de
  264.         ;pop bc
  265.         call findfile_continue
  266.         jr z,trdos_getfilesize_0
  267. trdos_getfilesize_q
  268.         ld hl,(trdos_getfilesizeLSW)
  269. trdos_getfilesizeHSB=$+1
  270.         ld de,0
  271.         xor a
  272.         ret
  273.  
  274. trdos_seekhandle_bof
  275. ;b=file handle
  276.         ld h,b
  277.         call nfopen_reopen ;переоткрываем файл
  278.         jr trdos_seekhandle_q
  279.         ;pop hl
  280.         ;pop de
  281.         ;xor a
  282.         ;ret
  283.        
  284. trdos_seekhandle
  285. ;                    B = File handle
  286. ;                    [A = Method code: 0=begin,1=cur,2=end]
  287. ;                DE:HL = Signed offset
  288. ;     Results:       A = Error
  289. ;                DE:HL = New file pointer
  290. ;только для чтения!!!
  291.         push de
  292.         push hl
  293.  
  294.         ld a,e
  295.         or h
  296.         or l
  297.         jr z,trdos_seekhandle_bof ;если addr=0, то переоткрыть файл
  298. ;addrm1=addr-1, т.к. все указатели и номера в TRDOSFCB при чтении рассчитаны на предыдущий байт
  299.         ld a,e
  300.         ld de,1
  301.         ;or a
  302.         sbc hl,de
  303.         sbc a,d;0
  304.         ld (trdos_seekhandleaddrLSW),hl
  305.         ld (trdos_seekhandleaddrHSB),a        
  306.        
  307.         xor a
  308.         ld h,a
  309.         ld l,a
  310.         ld (trdos_seekhandlesizeLSW),hl
  311.         ld (trdos_seekhandlesizeHSB),a
  312.        
  313.         ld h,b
  314.         ld l,1 ;TRDOSFCB filename
  315.        
  316.         ld c,9 ;c=FILENAMESZ
  317.         call findfile
  318.         jr nz,trdos_seekhandle_q
  319.         ;jr $
  320. ;пройти блоки файла, суммировать totalsize+=blocksize и остановиться на том, где addrm1 < totalsize+blocksize ((addrm1-totalsize) < blocksize)
  321. ;hl,de=after filename
  322. trdos_seekhandle_0
  323.         push bc
  324.         push de
  325.         push hl
  326. ;de=after filename on disk
  327.         ex de,hl
  328.         ld a,(hl)
  329.         ld (trdos_seekhandle_blocknumber),a
  330.         inc hl
  331.         inc hl
  332.         ld e,(hl)
  333.         inc hl
  334.         ld d,(hl) ;length
  335.         ld (trdos_seekhandle_length),de
  336.         inc hl
  337.         inc hl
  338.         ld c,(hl)
  339.         inc hl
  340.         ld b,(hl) ;track,sector
  341.         ld (trdos_seekhandle_trsec),bc
  342. trdos_seekhandleaddrLSW=$+1
  343.         ld hl,0
  344.         ld c,l ;addrm1&0xff
  345. trdos_seekhandleaddrHSB=$+1
  346.         ld a,0
  347. trdos_seekhandlesizeLSW=$+1
  348.         ld de,0
  349.         or a
  350.         sbc hl,de
  351. trdos_seekhandlesizeHSB=$+1
  352.         sbc a,0
  353. ;ahl=addrm1-totalsize
  354. ;keep h
  355.         ld (trdos_seekhandle_shiftinblock),hl
  356. ;остановиться на том блоке, где addrm1 < totalsize+blocksize ((addrm1-totalsize) < blocksize)
  357. trdos_seekhandle_length=$+1
  358.         ld de,0 ;blocksize = length блока
  359.         or a
  360.         sbc hl,de
  361.         sbc a,0
  362.         jp m,trdos_seekhandle_blockfound
  363.        
  364.         ld hl,(trdos_seekhandlesizeLSW)
  365.         ld a,(trdos_seekhandlesizeHSB)
  366.         add hl,de
  367.         adc a,0 ;ahl=totalsize+blocksize
  368.         ld (trdos_seekhandlesizeLSW),hl
  369.         ld (trdos_seekhandlesizeHSB),a
  370.         pop hl
  371.         pop de
  372.         pop bc
  373.         call findfile_continue
  374.         jr z,trdos_seekhandle_0
  375. ;TODO error
  376. trdos_seekhandle_q
  377.         pop hl
  378.         pop de
  379.         xor a
  380.         ret
  381.  
  382. trdos_seekhandle_blockfound
  383.         pop hl ;TRDOSFCB
  384.         push hl
  385. ;установить TRDOSFCB.remain = addrm1&0xff
  386.         ld l,TRDOSFCB.remain
  387.         ld (hl),c
  388. ;установить TRDOSFCB.firstsector = первый сектор блока
  389. trdos_seekhandle_trsec=$+1
  390.         ld bc,0
  391.         ld l,TRDOSFCB.firstsector
  392.         ld (hl),c
  393.         inc l
  394.         ld (hl),b
  395. ;установить TRDOSFCB.lastlen = length блока
  396.         ld l,TRDOSFCB.lastlen
  397.         ld (hl),e
  398.         inc l
  399.         ld (hl),d
  400. ;установить TRDOSFCB.secinblk = число оставшихся секторов в блоке = размер блока - (addrm1-totalsize)/256 - 1 (может получиться 0, если последний сектор блока уже загружен)
  401.         dec de
  402.         inc d
  403.         ld a,d
  404. trdos_seekhandle_shiftinblock=$+1
  405.         ld de,0
  406.         sub d
  407.         dec a
  408.         ld l,TRDOSFCB.secinblk
  409.         ld (hl),a
  410. ;установить TRDOSFCB.cursector = первый сектор блока + (addrm1-totalsize)/256, прочитать этот сектор и инкрементировать
  411.         ld lx,d
  412.         call addsectors
  413.         ld d,b
  414.         ld e,c
  415.         inc h
  416.         ld l,0 ;poi to buf
  417.         call rdsec.
  418.         ;hl=next sector
  419.         ex de,hl
  420.         pop hl
  421.         ld l,TRDOSFCB.cursector
  422.         ld (hl),e
  423.         inc l
  424.         ld (hl),d
  425. ;установить TRDOSFCB.block = номер блока + 1(!), т.е. всегда следующий блок
  426.         ld l,TRDOSFCB.block
  427. trdos_seekhandle_blocknumber=$+1
  428.         ld (hl),0
  429.         inc (hl)
  430.         pop de
  431.         pop bc
  432.         jr trdos_seekhandle_q
  433.  
  434. trdos_delete
  435. ;DE = Drive/path/file ASCIIZ string
  436.         ex de,hl
  437.         call findlastslash. ;de=last slash
  438.         ld hl,trdos_tempfilename
  439.         push hl
  440.         call dotname_to_cpmname ;de -> hl
  441.         pop de
  442.         jp nfdel_filename
  443.         ;xor a
  444.         ;ret
  445.        
  446. trdos_rename
  447. ;DE = Drive/path/file ASCIIZ string, HL = New filename ASCIIZ string
  448.         push de
  449.  
  450.         call findlastslash. ;de=last slash
  451.         ld hl,trdos_tempfilename2
  452.         call dotname_to_cpmname ;de -> hl
  453.        
  454.         pop hl ;hl = poi to filename in string
  455.  
  456.         call findlastslash. ;de=last slash
  457.         ld hl,trdos_tempfilename
  458.         push hl
  459.         call dotname_to_cpmname ;de -> hl
  460.         pop hl ;hl=filename
  461.         ld c,9 ;c=FILENAMESZ
  462.          ;jr $
  463.         call findfile
  464.         jr nz,trdos_rename_q
  465. ;hl,de=after filename
  466.         push hl
  467.         ld a,(de)
  468.         ld hl,trdos_tempfilename2+9 ;&newext[1]
  469.         sub (hl) ;ext[1] - newext[1]
  470.         ld (trdos_rename_ext1diff),a
  471.         pop hl
  472. trdos_rename_0
  473.         push bc
  474.         push de
  475.         push hl
  476.          push bc
  477. ;de=after filename
  478.         ld hl,trdos_tempfilename2
  479.         ld a,e
  480.         and 0xf0
  481.         ld e,a
  482.         ld bc,9
  483.         ldir
  484.         ld a,(de) ;block # + ext[1]
  485. trdos_rename_ext1diff=$+1
  486.         sub 0
  487.         ld (de),a ;block # + newext[1]
  488.         inc hl
  489.         inc de
  490.         ld a,(hl)
  491.         ld (de),a ;newext[2]
  492.          pop bc
  493.         ld d,0 ;track
  494.         ld a,8
  495.         sub b
  496.         ld e,a ;sector
  497.         call wrsecDOSBUF
  498.         pop hl
  499.         pop de
  500.         pop bc
  501.         call findfile_continue
  502.         jr z,trdos_rename_0
  503. trdos_rename_q
  504.         xor a
  505.         ret
  506.  
  507. dotname_to_cpmname
  508. ;de -> hl
  509. ;out: de=pointer to termination character
  510.         ;push hl ;buffer
  511.        
  512.         push de ;ASCIIZ string for parsing
  513.         push hl ;Pointer to 11 byte buffer
  514.         ld d,h
  515.         ld e,l
  516.         inc de
  517.         ld [hl],' '
  518.         ld bc,11-1
  519.         ldir ;empty filename
  520.         pop hl ;Pointer to 11 byte buffer
  521.         pop de ;ASCIIZ string for parsing
  522.  
  523. ;change dots to 1, except the last
  524.         ld a,(de)
  525.         cp '.'
  526.         jr z,parse_filename_changedots
  527.         push de
  528.         jr parse_filename_changedots0getgo
  529. parse_filename_changedots0get
  530.          ld a,1
  531.          ld (de),a
  532. parse_filename_changedots0getgo
  533.         ld b,d
  534.         ld c,e
  535. parse_filename_changedots0
  536.         ld a,(de)
  537.         cp '.'
  538.         jr z,parse_filename_changedots0get
  539.         inc de
  540.         or a
  541.         jr nz,parse_filename_changedots0
  542.         ld a,(bc)
  543.         cp 1
  544.         jr nz,$+5
  545.          ld a,'.'
  546.          ld (bc),a
  547.         pop de
  548. parse_filename_changedots
  549.  
  550.         ld b,9
  551.        
  552.         ld a,(de)
  553.         cp '.'
  554.         jr nz,parse_filename0.
  555.         ld (hl),a
  556.         inc de
  557.         ld a,(de)
  558.         cp '.'
  559.         jr nz,parse_filenameq_findterminator.
  560.         inc hl
  561.         ld (hl),a
  562.         jr parse_filenameq_findterminator.
  563. parse_filename0.
  564.         ld a,[de]
  565.         or a
  566.         ret z ;jr z,parse_filenameq. ;no extension in string
  567.         cp '.'
  568.         jr z,parse_filenamedot. ;можем уже быть на терминаторе
  569.          ;cp 0x80
  570.          ;jr nc,$+4
  571.          ;or 0x20
  572.          cp 1
  573.          jr nz,$+5
  574.           ld a,'.'
  575.           ld [de],a
  576.         ld [hl],a
  577.         inc de
  578.         inc hl
  579.         djnz parse_filename0.
  580. ;9 bytes in filename, no dot (9th byte goes to extension)
  581. ;возможно, длинное имя, надо найти, что раньше - точка или терминатор
  582. ;можем уже быть на терминаторе или на точке
  583.         dec hl
  584.         ld [hl],' '
  585. parse_filenamelongname0.
  586.         ld a,[de]
  587.         or a
  588.         ret z ;jr z,parse_filenameq. ;a=0
  589.         inc de
  590.         cp '.'
  591.         jr z,parse_filenameLONGnamedot. ;можем уже быть на терминаторе
  592.         jr parse_filenamelongname0.
  593. parse_filenamedot.
  594.         inc de
  595.         inc hl
  596.         djnz $-1 ;hl points to extension in FCB
  597.         dec hl
  598. parse_filenameLONGnamedot.
  599.         ld a,[de] ;extension in string
  600.         or a
  601.         ret z ;jr z,parse_filenameq. ;a=0
  602.          ;cp 0x80
  603.          ;jr nc,$+4
  604.          ;or 0x20
  605.         ld [hl],a ;extension in FCB
  606.         inc hl
  607.         inc de
  608.         ld a,[de] ;extension in string
  609.         or a
  610.         ret z ;jr z,parse_filenameq. ;a=0
  611.          ;cp 0x80
  612.          ;jr nc,$+4
  613.          ;or 0x20
  614.         ld [hl],a ;extension in FCB
  615.         inc hl
  616.         inc de
  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. parse_filenameq_findterminator.
  625.         inc de
  626.         ld a,[de]
  627.         or a
  628.         jr nz,parse_filenameq_findterminator.
  629. ;parse_filenameq. ;de на терминаторе
  630.         ;pop hl ;buffer
  631.         ret ;a=0
  632.        
  633. trdos_tempfilename
  634.         ds 11
  635. trdos_tempfilename2
  636.         ds 11
  637. BDOS_parse_filename_cpmnamebuf
  638.         ds 11 ;TODO объединить с одним из tempfilename
  639.