Subversion Repositories NedoOS

Rev

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

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