Blame |
Last modification |
View Log
| Download
| RSS feed
MODULE Dos
; API methods
ESX_GETSETDRV = #89
ESX_FOPEN = #9A
ESX_FCLOSE = #9B
ESX_FSYNC = #9C
ESX_FREAD = #9D
ESX_FWRITE = #9E
; File modes
FMODE_READ = #01
FMODE_WRITE = #06
FMODE_CREATE = #0E
; MACRO esxCall func
; rst #8 : db func
; ENDM
;id = 0 ╤Д╨░╨╣╨╗ ╨╜╨╡ ╨╛╤В╨║╤А╤Л╤В
;id = 1 ╤Д╨░╨╣╨╗ ╨┤╨╗╤П ╤З╤В╨╡╨╜╨╕╤П
;id = 2 ╤Д╨░╨╣╨╗ ╨┤╨╗╤П ╨╖╨░╨┐╨╕╤Б╨╕
;id = 3 ╤Д╨░╨╣╨╗ ╨┤╨╗╤П ╨╖╨░╨┐╨╕╤Б╨╕ ╤В╨╕╨┐ TRD
;id = 4 ╤Д╨░╨╣╨╗ ╨┤╨╗╤П ╨╖╨░╨┐╨╕╤Б╨╕ ╤В╨╕╨┐ SCL
; HL - filename in ASCIIZ
loadBuffer:
ld b, Dos.FMODE_READ: call Dos.fopen
push af
ld hl, outputBuffer, bc, #ffff - outputBuffer : call Dos.fread
ld hl, outputBuffer : add hl, bc : xor a : ld (hl), a : inc hl : ld (hl), a
pop af
call Dos.fclose
ret
; Returns:
; A - current drive
; getDefaultDrive: ;╨╜╨╕╨│╨┤╨╡ ╨╜╨╡ ╨╕╤Б╨┐╨╛╨╗╤М╨╖╤Г╨╡╤В╤Б╤П
; ld a, 0 : esxCall ESX_GETSETDRV
; ret
; Opens file on default drive
; B - File mode
; HL - File name
; Returns:
; A - file stream id
fopen:
; push bc : push hl
; call getDefaultDrive
; pop ix : pop bc
; esxCall ESX_FOPEN
; ret
ld a,b
cp FMODE_READ ;╨╡╤Б╨╗╨╕ ╤А╨╡╨╢╨╕╨╝ ╨╛╤В╨║╤А╤Л╤В╨╕╨╡ ╤Д╨░╨╣╨╗╨░
jr z,fopen_r
cp FMODE_CREATE
jr z,fopen_c ;╨╡╤Б╨╗╨╕ ╤А╨╡╨╢╨╕╨╝ ╤Б╨╛╨╖╨┤╨░╨╜╨╕╨╡ ╤Д╨░╨╣╨╗╨░
jr fopen_err ;╨╕╨╜╨░╤З╨╡ ╨▓╤Л╤Е╨╛╨┤
fopen_r ;╨╛╤В╨║╤А╤Л╤В╨╕╨╡ ╤Б╤Г╤Й╨╡╤Б╤В╨▓╤Г╤О╤Й╨╡╨│╨╛ ╤Д╨░╨╣╨╗╨░ ╨╜╨░ ╤З╤В╨╡╨╜╨╕╨╡ (id=1)
call format_name ;
ld c,#13 ;move file info to syst var
call #3d13
ld c,#0a ;find file
call #3d13
ld a,c
cp #ff
jr z,fopen_err ;╨╡╤Б╨╗╨╕ ╨╜╨╡ ╨╜╨░╤И╨╗╨╕ ╤Д╨░╨╣╨╗╨░
ld c,#08 ;read file title
call #3d13
;ld hl,loadadr ;╨║╤Г╨┤╨░
ld de,(#5ceb) ;╨╜╨░╤З╨░╨╗╨╛ ╤Д╨░╨╣╨╗╨░ ╤Б╨╡╨║╤В╨╛╤А ╨┤╨╛╤А╨╛╨╢╨║╨░
ld (f_r_cur_trk),de
ld a,(#5cea)
ld (f_r_len_sec),a ;╨┤╨╗╨╕╨╜╨░ ╨▓ ╤Б╨╡╨║╤В╨╛╤А╨░╤Е
;or a
;ret z ;╨▓╤Л╤Е╨╛╨┤ ╨╡╤Б╨╗╨╕ ╨┐╤Г╤Б╤В╨╛╨╣
; ld de,(fcurtrk) ;╤В╨╡╨║╤Г╤Й╨╕╨╡ ╤Б╨╡╨║╤В╨╛╤А ╨┤╨╛╤А╨╛╨╢╨║╨░
; ld (#5cf4),de ;╨▓╨╛╤Б╤Б╤В╨░╨╜╨╛╨▓╨╕╨╝
xor a
ld a,1
ld (f_r_flag),a ;╤Д╨╗╨░╨│ ╤З╤В╨╛ ╤Д╨░╨╣╨╗ ╨┤╨╗╤П ╤З╤В╨╡╨╜╨╕╤П ╨╛╤В╨║╤А╤Л╤В
;id ╨║╨░╨╜╨░╨╗╨░ ╨▒╤Г╨┤╨╡╤В 1
ret
fopen_err
xor a ;╨╡╤Б╨╗╨╕ ╨╜╨╕╨║╨░╨║╨╛╨╣ ╤Д╨░╨╣╨╗ ╨╜╨╡ ╨╛╤В╨║╤А╤Л╨╗╨╕, ╤В╨╛ id = 0
scf ;╤Д╨╗╨░╨│ ╨╛╤И╨╕╨▒╨║╨╕
ret
fopen_c ;╤Б╨╛╨╖╨┤╨░╨╜╨╕╨╡ ╨╜╨╛╨▓╨╛╨│╨╛ ╤Д╨░╨╣╨╗╨░ (id=2-4)
call format_name ;
ld a,(de) ;╨▓╤Л╤П╤Б╨╜╨╕╨╝, ╨╜╨╡ ╨╛╨▒╤А╨░╨╖ ╨╗╨╕ ╤Н╤В╨╛ ╨┤╨╗╤П ╤А╨░╨╖╨▓╨╛╤А╨░╤З╨╕╨▓╨░╨╜╨╕╤П
cp "t"
jr nz,fopen_c_s
inc de
ld a,(de)
cp "r"
jr nz,fopen_c_2
inc de
ld a,(de)
cp "d"
jr nz,fopen_c_2
jr fopen_c_trd
fopen_c_s
ld a,(de)
cp "s"
jr nz,fopen_c_2
inc de
ld a,(de)
cp "c"
jr nz,fopen_c_2
inc de
ld a,(de)
cp "l"
jr nz,fopen_c_2
jr fopen_c_scl
fopen_c_2 ;╤Б╨╛╨╖╨┤╨░╨╜╨╕╨╡ ╨┐╤А╨╛╨╕╨╖╨▓╨╛╨╗╤М╨╜╨╛╨│╨╛ ╤Д╨░╨╣╨╗╨░
jr fopen_err ;╨┐╨╛╨║╨░ ╨╛╤В╨║╨╗╤О╤З╨╡╨╜╨╛
ld c,#13 ;move file info to syst var
call #3d13
ld de,256 ;╨╖╨░╨┐╨╕╤И╨╡╨╝ ╨┐╨╛╨║╨░ 1 ╤Б╨╡╨║╤В╨╛╤А
ld hl,#4000 ;╨▓╨╛╨╖╤М╨╝╤С╨╝ ╤Б╨╗╤Г╤З╨░╨╣╨╜╤Л╨╡ ╨┤╨░╨╜╨╜╤Л╨╡ ╨╕╨╖ ╤Н╨║╤А╨░╨╜╨░
ld c,#0b ;╨╖╨░╨┐╨╕╤Б╤М ╤Д╨░╨╣╨╗╨░ CODE
call #3d13
ld a,c
cp #ff
jr z,fopen_err ;╨╡╤Б╨╗╨╕ ╨╛╤И╨╕╨▒╨║╨░
ld de,(#5ceb) ;╨╜╨░╤З╨░╨╗╨╛ ╤Д╨░╨╣╨╗╨░ ╤Б╨╡╨║╤В╨╛╤А ╨┤╨╛╤А╨╛╨╢╨║╨░
ld (f_w_cur_trk),de
ld a,(#5cea)
ld (f_w_len_sec),a ;╨┤╨╗╨╕╨╜╨░ ╨▓ ╤Б╨╡╨║╤В╨╛╤А╨░╤Е
xor a ;id ╨║╨░╨╜╨░╨╗╨░ ╨▒╤Г╨┤╨╡╤В 2
ld a,2
ld (f_w_flag),a ;╤Д╨╗╨░╨│ ╤З╤В╨╛ ╤Д╨░╨╣╨╗ ╨┤╨╗╤П ╨╖╨░╨┐╨╕╤Б╨╕ ╨╛╤В╨║╤А╤Л╤В
ret
fopen_c_trd ;╤А╨░╨╖╨▓╨╛╤А╨░╤З╨╕╨▓╨░╨╜╨╕╨╡ ╨╛╨▒╤А╨░╨╖╨░ trd (id=3)
ld a,(#5D19) ;╨╜╨╛╨╝╨╡╤А ╨┤╨╕╤Б╨║╨╛╨▓╨╛╨┤╨░ ╨┐╨╛ ╤Г╨╝╨╛╨╗╤З╨░╨╜╨╕╤О
add a,"A"
ld (write_trd_d),a ;╨┐╨╛╨┤╤Б╤В╨░╨▓╨╕╨╝ ╨▒╤Г╨║╨▓╤Г ╨▓ ╨╖╨░╨┐╤А╨╛╤Б╨╡
ld hl, write_trd
call DialogBox.msgBox ;╨┐╤А╨╡╨┤╤Г╤А╨╡╨╢╨┤╨╡╨╜╨╕╨╡
WAITKEY_trd
ld a,(23556)
cp 255
JR Z,WAITKEY_trd ;╨╢╨┤╤С╨╝ ╨╗╤О╨▒╤Г╤О ╨║╨╗╨░╨▓╨╕╤И╤Г
ld de,0 ;╨╜╨░╤З╨░╨╗╨╛ ╤Б╨╡╨║╤В╨╛╤А ╨┤╨╛╤А╨╛╨╢╨║╨░
ld (#5cf4),de
xor a
ld (sec_shift),a ;╨┐╨╡╤А╨╡╨╝╨╡╨╜╨╜╨░╤П
ld hl,0
ld (f_w_len+0),hl
ld (f_w_len+2),hl
ld a,3 ;id ╨║╨░╨╜╨░╨╗╨░
ld (f_w_flag),a ;╤Д╨╗╨░╨│ ╤З╤В╨╛ trd ╨┤╨╗╤П ╨╖╨░╨┐╨╕╤Б╨╕ ╨╛╤В╨║╤А╤Л╤В
ret
fopen_c_scl ;╤А╨░╨╖╨▓╨╛╤А╨░╤З╨╕╨▓╨░╨╜╨╕╨╡ ╨╛╨▒╤А╨░╨╖╨░ scl (id=4)
jp fopen_err ;╨┐╨╛╨║╨░ ╨╛╤В╨║╨╗╤О╤З╨╡╨╜╨╛
ld de,0 ;╨╜╨░╤З╨░╨╗╨╛ ╤Б╨╡╨║╤В╨╛╤А ╨┤╨╛╤А╨╛╨╢╨║╨░
ld (f_w_cur_trk),de
xor a
ld a,4 ;id ╨║╨░╨╜╨░╨╗╨░
ld (f_w_flag),a ;╤Д╨╗╨░╨│ ╤З╤В╨╛ scl ╨┤╨╗╤П ╨╖╨░╨┐╨╕╤Б╨╕ ╨╛╤В╨║╤А╤Л╤В
ret
; A - file stream id
fclose:
;esxCall ESX_FCLOSE
xor a ;╨║╨░╨║ ╨▒╤Л ╨╖╨░╨║╤А╤Л╨▓╨░╨╡╨╝ ╨▓╤Б╨╡ ╤Д╨░╨╣╨╗╤Л
ld (f_r_flag),a
ld (f_w_flag),a
ret
; A - file stream id
; BC - length
; HL - buffer
; Returns
; BC - length(how much was actually read)
fread: ;(id=1)
; push hl : pop ix
; esxCall ESX_FREAD
; push af
; ld a,4
; out (254),a
; WAITKEY XOR A:IN A,(#FE):CPL:AND #1F:JR Z,WAITKEY
; xor a
; out (254),a
; pop af
cp 1 ;id = 1?
jr nz,fread_no_chek ;╨▓╤Л╤Е╨╛╨┤ ╨╡╤Б╨╗╨╕ ╨╜╨╛╨╝╨╡╤А ╨┐╨╛╤В╨╛╨║╨░ ╨╜╨╡ = 1
ld a,(f_r_flag)
or a
jr nz,fread_chek ;╤Д╨░╨╣╨╗ ╤Г╨╢╨╡ ╨╛╤В╨║╤А╤Л╤В?
fread_no_chek ;╨▓╤Л╤Е╨╛╨┤ ╤Б ╨╛╤И╨╕╨▒╨║╨╛╨╣
xor a
scf ;╤Д╨╗╨░╨│ ╨╛╤И╨╕╨▒╨║╨╕
ld bc,0 ;╨╜╨╕╤З╨╡╨│╨╛ ╨╝╤Л ╨╜╨╡ ╤Б╤З╨╕╤В╨░╨╗╨╕
ret
fread_chek
push bc
ld bc,(f_r_len_sec-1) ;╨╖╨░╨│╤А╤Г╨╢╨░╨╡╨╝ ╤Д╨░╨╣╨╗ ╤Ж╨╡╨╗╨╕╨║╨╛╨╝, ╨╜╨╡ ╤Б╨╝╨╛╤В╤А╤П ╨╜╨░ ╤В╨╛, ╤Б╨║╨╛╨╗╤М╨║╨╛ ╨▒╨░╨╣╤В ╨▒╤Л╨╗╨╛ ╨╖╨░╨┐╤А╨╛╤И╨╡╨╜╨╛
ld c,5 ;read ╤З╨╕╤В╨░╨╡╨╝ ╤Ж╨╡╨╗╤Л╨╝╨╕ ╤Б╨╡╨║╤В╨╛╤А╨░╨╝╨╕
ld de,(f_r_cur_trk)
call #3d13
pop bc ;╨▓╨╛╨╖╨▓╤А╨░╤В╨╕╨╝, ╤З╤В╨╛ ╤Б╨║╨╛╨╗╤М╨║╨╛ ╨╖╨░╨┐╤А╨░╤И╨╕╨▓╨░╨╗╨╕, ╤Б╤В╨╛╨╗╤М╨║╨╛ ╨╕ ╤Б╤З╨╕╤В╨░╨╗╨╕ ╨▒╨░╨╣╤В
xor a ;╤Д╨╗╨░╨│╨╕ ╤Б╨▒╤А╨╛╤Б╨╕╨╝
ret
; A - file stream id
; BC - length
; HL - buffer
; Returns:
; BC - actually written bytes
fwrite: ;
; push hl : pop ix
; esxCall ESX_FWRITE
; push af
; ld a,2
; out (254),a
; WAITKEY1 XOR A:IN A,(#FE):CPL:AND #1F:JR Z,WAITKEY1
; xor a
; out (254),a
; pop af
cp 2 ;id = 2?
jr z,fwrite_chek ;╨┐╤А╨╛╨▓╨╡╤А╨║╨░ id ╨┐╨╛╤В╨╛╨║╨░
cp 3 ;id = 3?
jr z,fwrite_chek_trd ;╨┐╤А╨╛╨▓╨╡╤А╨║╨░ id ╨┐╨╛╤В╨╛╨║╨░
cp 4 ;id = 4?
jp z,fwrite_chek_scl ;╨┐╤А╨╛╨▓╨╡╤А╨║╨░ id ╨┐╨╛╤В╨╛╨║╨░
fwrite_no_chek ;╨▓╤Л╤Е╨╛╨┤ ╤Б ╨╛╤И╨╕╨▒╨║╨╛╨╣
xor a
scf ;╤Д╨╗╨░╨│ ╨╛╤И╨╕╨▒╨║╨╕
ld bc,0 ;╨╜╨╕╤З╨╡╨│╨╛ ╨╝╤Л ╨╜╨╡ ╨╖╨░╨┐╨╕╤Б╨░╨╗╨╕
ret
fwrite_chek ;╨╖╨░╨┐╨╕╤Б╤М ╨┐╤А╨╛╨╕╨╖╨▓╨╛╨╗╤М╨╜╨╛╨│╨╛ ╤В╨╕╨┐╨░ ╤Д╨░╨╣╨╗╨░
jr fwrite_no_chek ;╨┐╨╛╨║╨░ ╨╛╤В╨║╨╗╤О╤З╨╡╨╜╨╛
ld a,(f_w_flag)
or a
jr z,fwrite_no_chek ;╤Д╨░╨╣╨╗ ╤Г╨╢╨╡ ╨╛╤В╨║╤А╤Л╤В?
ld (temp_bc),bc
;ld bc,(f_r_len_sec-1) ;
ld c,6 ;╨┐╨╕╤И╨╡╨╝ ╤Ж╨╡╨╗╤Л╨╝╨╕ ╤Б╨╡╨║╤В╨╛╤А╨░╨╝╨╕
ld de,(f_w_cur_trk)
call #3d13
ld bc,(temp_bc) ;╨▓╨╛╨╖╨▓╤А╨░╤В╨╕╨╝, ╤З╤В╨╛ ╤Б╨║╨╛╨╗╤М╨║╨╛ ╨╖╨░╨┐╤А╨░╤И╨╕╨▓╨░╨╗╨╕, ╤Б╤В╨╛╨╗╤М╨║╨╛ ╨╕ ╤Б╤З╨╕╤В╨░╨╗╨╕ ╨▒╨░╨╣╤В
xor a ;╤Д╨╗╨░╨│╨╕ ╤Б╨▒╤А╨╛╤Б╨╕╨╝
ret
fwrite_chek_trd ;╨╖╨░╨┐╨╕╤Б╤М trd ╤Д╨░╨╣╨╗╨░ (╤А╨░╨╖╨▓╨╛╤А╨░╤З╨╕╨▓╨░╨╜╨╕╨╡ ╨╛╨▒╤А╨░╨╖╨░)
ld a,(f_w_flag)
or a
jr z,fwrite_no_chek ;╤Д╨░╨╣╨╗ ╤Г╨╢╨╡ ╨╛╤В╨║╤А╤Л╤В?
ld (temp_bc),bc
ld (temp_hl),hl
ld a,b
or c
jr z,fwrite_no_chek ; ╨╡╤Б╨╗╨╕ ╨┤╨╗╨╕╨╜╨░ 0, ╤В╨╛ ╨▓╤Л╤Е╨╛╨┤
ld a,b
or a
jr nz,testt1
nop
testt1
xor a
ld (sec_part),a ;╨╛╨▒╨╜╤Г╨╗╨╕╤В╤М ╨┐╨╡╤А╨╡╨╝╨╡╨╜╨╜╤Л╨╡
ld (sec_shift2),a
ld (sec_shift2+1),a
ld (sec_shift_flag),a
ld a,(sec_shift)
or a
jr z,fwrite_trd3 ;╨╡╤Б╨╗╨╕ ╤Б╨╝╨╡╤Й╨╡╨╜╨╕╤П ╨╜╨╡╤В, ╤В╨╛ ╨┐╨╡╤А╨▓╤Г╤О ╤З╨░╤Б╤В╤М ╨┐╤А╨╛╨┐╤Г╤Б╤В╨╕╨╝
ld c,a
ld b,0
ld hl,(temp_bc) ;╨┐╤А╨╛╨▓╨╡╤А╨║╨░ ╨╖╨░╨┐╨╛╨╗╨╜╨╕╤В╤Б╤П ╨╗╨╕ ╤Ж╨╡╨╗╤Л╨╣ ╤Б╨╡╨║╤В╨╛╤А
add hl,bc
ld a,h
or a
jr nz,fwrite_trd4
ld a,1
ld (sec_shift_flag),a ;╤Д╨╗╨░╨│ ╤З╤В╨╛ ╨╜╨╡ ╨╖╨░╨┐╨╛╨╗╨╜╨╡╨╜ ╤Б╨╡╨║╤В╨╛╤А
fwrite_trd4
ld hl,sec_buf ;╨▒╤Г╤Д╨╡╤А ╨┐╨╛╤Б╨╗╨╡╨┤╨╜╨╡╨│╨╛ ╤Б╨╡╨║╤В╨╛╤А╨░
add hl,bc ;╨╜╨░ ╤Н╤В╨╛╨╣ ╤В╨╛╤З╨║╨╡ ╨╛╤Б╤В╨░╨╜╨╛╨▓╨╕╨╗╨╕╤Б╤М
ex de,hl
ld hl,(temp_hl) ;╨┐╤А╨╕╤Б╨╛╨╡╨┤╨╕╨╜╨╕╨╝ ╨╜╨░╤З╨░╨╗╨╛ ╨┤╨░╨╜╨╜╤Л╤Е ╨▓ ╨║╨╛╨╜╨╡╤Ж ╨┐╤А╨╡╨┤╤Л╨┤╤Г╤Й╨╕╤Е
ld a,c
or a
jr nz,fwrite_trd2
inc b ;╨║╨╛╤А╤А╨╡╨║╤Ж╨╕╤П
fwrite_trd2
ld c,a
xor a
sub c
ld c,a ;╤Б╨║╨╛╨╗╤М╨║╨╛ ╨╛╤Б╤В╨░╨╗╨╛╤Б╤М ╨┐╨╡╤А╨╡╨╜╨╡╤Б╤В╨╕ ╨┤╨╛ ╨╖╨░╨┐╨╛╨╗╨╜╨╡╨╜╨╕╤П ╤Б╨╡╨║╤В╨╛╤А╨░
ld (sec_shift2),bc ;╤Б╨╛╤Е╤А╨░╨╜╨╕╨╝ ╤Б╨║╨╛╨╗╤М╨║╨╛ ╨┤╨╛╨▒╨░╨▓╨╕╨╗╨╕ ╨▒╨░╨╣╤В
ldir
ld hl,sec_buf
ld de,(#5cf4)
ld (f_w_cur_trk),de ;╨╖╨░╨┐╨╛╨╝╨╜╨╕╨╝ ╨┐╨╛╨╖╨╕╤Ж╨╕╤О
ld bc,#0106 ;╨┐╨╕╤И╨╡╨╝ 1 ╤Б╨╡╨║╤В╨╛╤А ╨╕╨╖ ╨▒╤Г╤Д╨╡╤А╨░
call #3d13
ld a,c
cp 255
jp z,fwrite_no_chek ;╨▓╤Л╤Е╨╛╨┤ ╨╡╤Б╨╗╨╕ ╨╛╤И╨╕╨▒╨║╨░
ld a,(sec_shift_flag)
or a
jr z,fwrite_trd3
ld de,(f_w_cur_trk) ;╨╡╤Б╨╗╨╕ ╤Б╨╡╨║╤В╨╛╤А ╨╡╤Й╤С ╨╜╨╡ ╨╖╨░╨┐╨╛╨╗╨╜╨╡╨╜, ╨╛╤Б╤В╨░╨╜╨╡╨╝╤Б╤П ╨╜╨░ ╤Б╤В╨░╤А╨╛╨╣ ╨┐╨╛╨╖╨╕╤Ж╨╕╨╕
ld (#5cf4),de
; ld b,1 ;╨╜╨░ ╤Б╨╡╨║╤В╨╛╤А ╨▓╨┐╨╡╤А╤С╨┤
; ld de,(f_w_cur_trk)
; call calc_next_pos
; ld (f_w_cur_trk),de
fwrite_trd3
ld hl,(temp_hl) ;╨╖╨░╨┐╨╕╤И╨╡╨╝ ╨╛╤Б╤В╨░╤В╨╛╨║ ╨┤╨░╨╜╨╜╤Л╤Е
;ld a,(sec_shift)
;ld c,a
;ld b,0
ld bc,(sec_shift2)
add hl,bc ;╤Б ╤Н╤В╨╛╨╣ ╤В╨╛╤З╨║╨╕ ╨┐╨╕╤И╨╡╨╝
ld (temp_hl2),hl ;╤Б╨╛╤Е╤А╨░╨╜╨╕╨╝ ╨╜╨░╤З╨░╨╗╨╛ ╨╖╨░╨┐╨╕╤Б╨╕ ╨▓╤В╨╛╤А╨╛╨│╨╛ ╤Б╨╡╨║╤В╨╛╤А╨░
ld hl,(temp_bc) ;╨▓╤Л╤З╨╕╤Б╨╗╨╡╨╜╨╕╨╡ ╨╜╨░ ╤З╤С╨╝ ╨╛╤Б╤В╨░╨╜╨╛╨▓╨╕╨╝╤Б╤П ╨▓ ╤Н╤В╨╛╤В ╤А╨░╨╖
and a
sbc hl,bc ;╨▓╤Л╤З╤В╨╡╨╝ ╤В╨╛, ╤З╤В╨╛ ╨┤╨╛╨▒╨░╨▓╨╕╨╗╨╕ ╨║ ╨┐╨╡╤А╨▓╨╛╨╝╤Г ╤Б╨╡╨║╤В╨╛╤А╤Г
ld c,l
ld b,h
jr nc,fwrite_trd5
ld b,0 ;╨║╨╛╤А╤А╨╡╨║╤Ж╨╕╤П ╨╡╤Б╨╗╨╕ ╨▓╤Л╤И╨╡╨╗ ╨╝╨╕╨╜╤Г╤Б
fwrite_trd5
ld hl,(temp_hl)
add hl,bc
ld a,l
ld (sec_shift),a ;╤Б╨╝╨╡╤Й╨╡╨╜╨╕╨╡ ╨╜╨░ ╤Б╨╗╨╡╨┤╤Г╤О╤Й╨╕╨╣ ╤А╨░╨╖
;ld hl,(temp_hl)
; or a
; jr z,fwrite_trd1
; inc b ;╨║╨╛╤А╤А╨╡╨║╤Ж╨╕╤П ╨║╨╛╨╗╨╕╤З╨╡╤Б╤В╨▓╨░ ╤Б╨╡╨║╤В╨╛╤А╨╛╨▓
ld a,b ;╨╜╤Г╨╢╨╜╨░ ╨┐╤А╨╛╨▓╨╡╤А╨║╨░ ╨╜╨░ ╨║╨╛╨╗╨╕╤З╨╡╤Б╤В╨▓╨╛ ╤Б╨╡╨║╤В╨╛╤А╨╛╨▓!!!
ld (sec_part),a ;╨╖╨░╨┐╨╛╨╝╨╜╨╕╨╝ ╤Б╨║╨╛╨╗╤М╨║╨╛ ╤Б╨╡╨║╤В╨╛╤А╨╛╨▓ ╨▓╨╛ ╨▓╤В╨╛╤А╨╛╨╣ ╤З╨░╤Б╤В╨╕
or a
jr z,fwrite_trd_ex ;╨╡╤Б╨╗╨╕ ╤А╨░╨╖╨╝╨╡╤А ╨┤╨░╨╜╨╜╤Л╤Е ╨╝╨╡╨╜╤М╤И╨╡ ╤Б╨╡╨║╤В╨╛╤А╨░, ╤В╨╛ ╨┐╤А╨╛╨┐╤Г╤Б╤В╨╕╨╝ ╨▓╤В╨╛╤А╨╛╨╣ ╤Н╤В╨░╨┐
ld hl,(temp_hl2)
;push bc
ld de,(#5cf4)
ld c,6 ;╨┐╨╕╤И╨╡╨╝ ╤Ж╨╡╨╗╤Л╨╝╨╕ ╤Б╨╡╨║╤В╨╛╤А╨░╨╝╨╕
call #3d13
ld a,c
;pop bc
cp 255
jp z,fwrite_no_chek ;╨▓╤Л╤Е╨╛╨┤ ╨╡╤Б╨╗╨╕ ╨╛╤И╨╕╨▒╨║╨░
; ld de,(f_w_cur_trk)
; call calc_next_pos
; ld (f_w_cur_trk),de
fwrite_trd1
ld hl,(temp_hl2) ;╤Б╨╛╤Е╤А╨░╨╜╨╕╨╝ ╨┐╨╛╤Б╨╗╨╡╨┤╨╜╨╕╨╣ ╤Б╨╡╨║╤В╨╛╤А
ld a,(sec_part)
ld b,a
ld c,0
add hl,bc
ld bc,256
ld de,sec_buf
ldir
fwrite_trd_ex
ld bc,(temp_bc) ;╨▓╨╛╨╖╨▓╤А╨░╤В╨╕╨╝, ╤З╤В╨╛ ╤Б╨║╨╛╨╗╤М╨║╨╛ ╨╖╨░╨┐╤А╨░╤И╨╕╨▓╨░╨╗╨╕, ╤Б╤В╨╛╨╗╤М╨║╨╛ ╨╕ ╤Б╤З╨╕╤В╨░╨╗╨╕ ╨▒╨░╨╣╤В
;╨┐╨╛╤Б╤З╨╕╤В╨░╨╡╨╝ ╨╛╨▒╤Й╤Г╤О ╨┤╨╗╨╕╨╜╤Г ╨╖╨░╨┐╨╕╤Б╨░╨╜╨╜╨╛╨│╨╛
ld hl,(f_w_len)
add hl,bc
ld (f_w_len),hl
jr nc,fwrite_trd_ex1
ld hl,(f_w_len+2)
inc hl
ld (f_w_len+2),hl
fwrite_trd_ex1
xor a ;╤Д╨╗╨░╨│╨╕ ╤Б╨▒╤А╨╛╤Б╨╕╨╝
ret
fwrite_chek_scl ;╨╖╨░╨┐╨╕╤Б╤М scl ╤Д╨░╨╣╨╗╨░ ---------------
jp fwrite_no_chek ;╨┐╨╛╨║╨░ ╨╛╤В╨║╨╗╤О╤З╨╡╨╜╨╛
ld a,(f_w_flag)
or a
jp z,fwrite_no_chek ;╤Д╨░╨╣╨╗ ╤Г╨╢╨╡ ╨╛╤В╨║╤А╤Л╤В?
ld (temp_bc),bc
;ld bc,(f_r_len_sec-1) ;
ld c,6 ;╨┐╨╕╤И╨╡╨╝ ╤Ж╨╡╨╗╤Л╨╝╨╕ ╤Б╨╡╨║╤В╨╛╤А╨░╨╝╨╕
ld de,(f_w_cur_trk)
call #3d13
ld bc,(temp_bc) ;╨▓╨╛╨╖╨▓╤А╨░╤В╨╕╨╝, ╤З╤В╨╛ ╤Б╨║╨╛╨╗╤М╨║╨╛ ╨╖╨░╨┐╤А╨░╤И╨╕╨▓╨░╨╗╨╕, ╤Б╤В╨╛╨╗╤М╨║╨╛ ╨╕ ╤Б╤З╨╕╤В╨░╨╗╨╕ ╨▒╨░╨╣╤В
xor a ;╤Д╨╗╨░╨│╨╕ ╤Б╨▒╤А╨╛╤Б╨╕╨╝
ret
; A - file stream id
; fsync:
; esxCall ESX_FSYNC
; ret
; HL - name (name.ext)
; Returns:
; HL - name (name e)
format_name ;╨┐╨╛╨┤╨│╨╛╨╜╤П╨╡╤В ╨╕╨╝╤П ╤Д╨░╨╣╨╗╨░ ╨┐╨╛╨┤ ╤Б╤В╨░╨╜╨┤╨░╤А╤В trdos (8+1)
push hl ;╤Б╨╜╨░╤З╨░╨╗╨░ ╨╛╤З╨╕╤Б╤В╨╕╨╝ ╨╝╨╡╤Б╤В╨╛
ld hl,f_name
ld de,f_name+1
ld (hl)," "
ld bc,8
ldir
pop hl
ld bc,#09ff ;╨┤╨╗╨╕╨╜╨░ ╨╕╨╝╨╡╨╜╨╕ 9 ╤Б╨╕╨╝╨▓╨╛╨╗╨╛╨▓
ld de,f_name ;╨║╤Г╨┤╨░
format_name2
ld a,(hl)
cp "."
jr nz,format_name1
inc hl
ld a,(hl)
ld (f_name+8),a ; ╨╕ ╨▓ ╨║╨╛╨╜╤Ж╨╡ ╨┐╨╡╤А╨▓╤Г╤О ╨▒╤Г╨║╨▓╤Г ╤А╨░╤Б╤И╨╕╤А╨╡╨╜╨╕╤П
ex de,hl ;╤Б╨╛╤Е╤А╨░╨╜╨╕╨╝ ╨░╨┤╤А╨╡╤Б ╨╕╤Б╤Е╨╛╨┤╨╜╨╛╨│╨╛ ╤А╨░╤Б╤И╨╕╤А╨╡╨╜╨╕╤П
jr format_name_e
format_name1
ldi
djnz format_name2
format_name_e
ld hl,f_name ;╨▓╨╡╤А╨╜╤С╨╝ ╤А╨╡╨╖╤Г╨╗╤М╤В╨░╤В
ret
; DE - trk/sec
; B - sectors step
; Returns:
; DE - trk/sec
calc_next_pos ;╨▓╨┐╨╡╤А╤С╨┤ ╨╜╨░ N ╤Б╨╡╨║╤В╨╛╤А╨╛╨▓
;ld b,4
;ld de,(#5ceb)
calc_next_pos2
inc e
ld a,e
cp 16
jr c,calc_next_pos1
inc d
ld e,0
calc_next_pos1
;ld (#5ceb),de
djnz calc_next_pos2
ret
;testt db "123.trd"
write_trd db "Insert disk to drive "
write_trd_d db "A. "
db "All data will be lost!",0
f_name ds 9 ;╨╕╨╝╤П ╤Д╨░╨╣╨╗╨░
f_r_cur_trk dw 0 ;╤В╨╡╨║╤Г╤Й╨╕╨╡ ╤Б╨╡╨║╤В╨╛╤А-╨┤╨╛╤А╨╛╨╢╨║╨░ ╤Д╨░╨╣╨╗╨░ ╨╜╨░ ╤З╤В╨╡╨╜╨╕╨╡
f_r_len_sec db 0 ;╨┤╨╗╨╕╨╜╨░ ╤Д╨░╨╣╨╗╨░ ╨╜╨░ ╤З╤В╨╡╨╜╨╕╨╡ ╨▓ ╤Б╨╡╨║╤В╨╛╤А╨░╤Е
f_r_flag db 0 ;╤Д╨╗╨░╨│ ╤З╤В╨╛ ╨╛╤В╨║╤А╤Л╤В ╤Д╨░╨╣╨╗ ╨╜╨░ ╤З╤В╨╡╨╜╨╕╨╡
f_w_cur_trk dw 0 ;╤В╨╡╨║╤Г╤Й╨╕╨╡ ╤Б╨╡╨║╤В╨╛╤А-╨┤╨╛╤А╨╛╨╢╨║╨░ ╤Д╨░╨╣╨╗╨░ ╨╜╨░ ╨╖╨░╨┐╨╕╤Б╤М
f_w_len_sec db 0 ;╨┤╨╗╨╕╨╜╨░ ╤Д╨░╨╣╨╗╨░ ╨╜╨░ ╨╖╨░╨┐╨╕╤Б╤М ╨▓ ╤Б╨╡╨║╤В╨╛╤А╨░╤Е
f_w_flag db 0 ;╤Д╨╗╨░╨│ ╤З╤В╨╛ ╨╛╤В╨║╤А╤Л╤В ╤Д╨░╨╣╨╗ ╨╜╨░ ╨╖╨░╨┐╨╕╤Б╤М
f_w_len ds 4 ;╨┤╨╗╨╕╨╜╨░ ╨╖╨░╨┐╨╕╤Б╨░╨╜╨╜╤Л╤Е ╨┤╨░╨╜╨╜╤Л╤Е
temp_bc dw 0 ;╤Е╤А╨░╨╜╨╡╨╜╨╕╨╡ ╤А╨╡╨│╨╕╤Б╤В╤А╨░
temp_hl dw 0 ;╤Е╤А╨░╨╜╨╡╨╜╨╕╨╡ ╤А╨╡╨│╨╕╤Б╤В╤А╨░
temp_hl2 dw 0 ;╤Е╤А╨░╨╜╨╡╨╜╨╕╨╡ ╤А╨╡╨│╨╕╤Б╤В╤А╨░
sec_shift db 0 ;╤Г╨║╨░╨╖╨░╤В╨╡╨╗╤М ╨╜╨░ ╨║╨░╨║╨╛╨╝ ╨▒╨░╨╣╤В╨╡ ╨╛╤Б╤В╨░╨╜╨╛╨▓╨╗╨╡╨╜╨░ ╨╖╨░╨┐╨╕╤Б╤М
sec_shift2 db 0 ;╤Г╨║╨░╨╖╨░╤В╨╡╨╗╤М ╨╜╨░ ╨║╨░╨║╨╛╨╝ ╨▒╨░╨╣╤В╨╡ ╨╛╤Б╤В╨░╨╜╨╛╨▓╨╗╨╡╨╜╨░ ╨╖╨░╨┐╨╕╤Б╤М (╨╛╤Б╤В╨░╤В╨╛╨║)
sec_part db 0 ;╤Б╨║╨╛╨╗╤М╨║╨╛ ╤Б╨╡╨║╤В╨╛╤А╨╛╨▓ ╨▓╨╛ ╨▓╤В╨╛╤А╨╛╨╣ ╨┐╨╛╤А╤Ж╨╕╨╕ ╨┤╨╗╤П ╨╖╨░╨┐╨╕╤Б╨╕
sec_shift_flag db 0 ;╤Д╨╗╨░╨│ ╤З╤В╨╛ ╨▒╤Г╤Д╨╡╤А ╤Б╨╡╨║╤В╨╛╤А╨░ ╨╜╨╡ ╨╖╨░╨┐╨╛╨╗╨╜╨╡╨╜
align 256 ;╨▓╤А╨╡╨╝╨╡╨╜╨╜╨╛
sec_buf ds 256 ;╨▒╤Г╤Д╨╡╤А ╤Б╨╡╨║╤В╨╛╤А╨░ ╨┤╨╗╤П ╨╖╨░╨┐╨╕╤Б╨╕
ENDMODULE