Subversion Repositories NedoOS

Rev

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

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