PDA

Просмотр полной версии : Фукция чтения ТР-ДОС



Dr.Potapov
18.10.2015, 23:37
Очень нужна посильная помощь, приложил исходник драйвера fdd. Код не мой, разобраться не могу почему не работает функция чтения с диска (не читает с диска, даже данные в памяти не меняются). Пишет отлично. Опыта в ТР-ДОС нет совсем, возможно что то не проинициализировано?
Повторю - запись проходит отлично, по нужным секторам, в нужном объеме, а чтения нет совсем (диск в эмуле мигает синим, видимо что то пытается читать).


;device fd
;external low-level disk driver v1.3
;for rawr disk distribution system
;by michael borisov (c) 1996

; 0 - init
; 1 - set drive (>a - number drive 0,1,2,3)
; 2 - read (>hl - to address, >de - start track/block, >b - blocks to read)
; 3 - write (>hl - from address, >de - start track/block, >b - blocks to write)

device_fd_ent



cp #00
call z,fd_00 ;init
cp #01
call z,fd_01 ;set drive
cp #02
call z,fd_02 ;read
cp #03
call z,fd_03 ;write
ret



fd_clr_error
ld a,#ff
ld (fd_err_co),a
ret

fd_00 call fd_inifdc ;init
call fd_motor_on
jr fd_res_head

fd_inifdc
di
call fd_clr_error
ld a,%00011000
ld c,#ff
call fd_out_c_a
ld a,%00011100
call fd_out_c_a
ld hl,300
call fd_pause
ld a,#d0
ld c,#1f
call fd_out_c_a
ld hl,1000
jp fd_pause

fd_res_head
di
ld a,8
jr fd_posrt

fd_motor_on
di
call fd_inifdc
call fd_get_pos
call fd_position
ld hl,#2134
jp fd_pause

fd_position
di
srl a
call fd_store_pos
ld c,#7f
call fd_out_c_a
ccf
sbc a,a
and %00010000 ;side
ld b,a
ld a,(fd_drive_no)
or b
or %00001100
ld c,#ff
call fd_out_c_a
; call fd_break_key
ld c,#1f
ld a,#18 ;position cmd
fd_posrt
call fd_out_c_a
call fd_wt_irq
ret

fd_01 ;set drive:
ld a,c
and 3
ld (fd_drive_no),a
call fd_get_pos
ld c,#3f
call fd_out_c_a
call fd_clr_error
ret

fd_02 ;readgr:
ld a,#80
ld c,0
jr fd_rdwrgr

fd_03 ;writgr
ld a,#a0
ld c,1
fd_rdwrgr
ld (fd_rwcmd+1),a
ld a,c
ld (fd_dmatyp+1),a
ld a,b
ld (fd_sec_remain),a
ld (fd_err_sp),sp
call fd_clr_error
fd_rwgpos
ld a,d
call fd_position

fd_rwgnxt
ld (fd_dma_addr),hl
ld (fd_rw_loc),de

fd_rwretr
ld de,(fd_rw_loc)
ld hl,(fd_dma_addr)
;call break_key
ld c,#5f
ld a,e
inc a
call fd_out_c_a
fd_rwcmd
ld a,0
ld c,#1f
call fd_out_c_a
ld c,#7f
fd_dmatyp
ld a,0
or a
jr nz,fd_rwgr0
call fd_dma_rd
jr fd_rwgr1
fd_rwgr0
call fd_dma_wr
fd_rwgr1
ld a,b
or a
ld a,1 ;no disk
jp z,fd_err_ret
call fd_in_1f
ld c,a
and #1f
jr z,fd_rwgr2
ld a,4 ;snf/crc err
jp fd_err_ret

fd_rwgr2
bit 6,c
ld a,2 ;wprt
jp nz,fd_err_ret
fd_rwignr
ld de,(fd_rw_loc)
inc e
bit 4,e ;16 secs/trk
jr z,fd_xalal
ld e,0
inc d
scf
fd_xalal
ld a,(fd_sec_remain)
dec a
ld (fd_sec_remain),a
ret z
jr nc,fd_rwgnxt
jr fd_rwgpos

fd_err_ret
ld (fd_err_co),a
ld a,#d0
ld c,#1f
call fd_out_c_a
ld sp,(fd_err_sp)
ret

fd_store_pos
push hl
push af
ld hl,fd_drv_head
ld a,(fd_drive_no)
add a,l
ld l,a
adc a,h
sub l
ld h,a
pop af
ld (hl),a
pop hl
ret

fd_get_pos
push hl
ld hl,fd_drv_head
ld a,(fd_drive_no)
add a,l
ld l,a
adc a,h
sub l
ld h,a
ld a,(hl)
pop hl
ret

fd_pause
push af
fd_pau_0
dec hl
ld a,h
or l
jr nz,fd_pau_0
pop af
ret

;'radisk v1.3 (c) 1996, michael borisov'
;tr-dos port routines

fd_out_c_a
push hl
ld hl,#2a53
ex (sp),hl
jp #3d30

fd_dma_rd
push hl
ld hl,#3fd5
ex (sp),hl
jp #3d30

fd_dma_wr
push hl
ld hl,#3fba
ex (sp),hl
jp #3d30

fd_wt_irq
push hl
ld hl,#3fe5
ex (sp),hl
jp #3d30

fd_irz
ld hl,#3f33
push hl
jp #3d30

fd_in_1f
push hl
push bc
push de
xor a
ld c,#3f
call fd_out_c_a
ld a,#0a
ld c,#5f
call fd_out_c_a
ld d,#01
call fd_irz
call fd_get_pos
ld c,#3f
call fd_out_c_a
ld a,b
pop de
pop bc
pop hl
ret


fd_drive_no
db 00

fd_drv_head
db 00 ;a
db 00 ;b
db 00 ;c
db 00 ;d

fd_ttbl_adr
dw 0000
fd_dma_addr
dw 0000
fd_rw_loc dw 0000
fd_sec_remain
db 00
fd_err_sp dw 0000
fd_err_co db #ff



Вызываю на чтение так (fdc это сам драйвер):


ld a,0 ;инициализирую
call fdc

ld a,1 ;функция установки дисковода
ld c,0 ; устанавливаю нулевой
call fdc

ld a,2 ;функция чтения
ld hl,#c000 ;по адресу #с000
ld d,0 ;нулевая дорожка
ld e,0 ;нулевой сектор
ld b,1 ;читать один сектор
call fdc



---------- Post added at 23:37 ---------- Previous post was at 22:22 ----------

чуть чуть разобрался ))
читает тоже отлично но до сменной банки (до #с000). там какая то чехарда со страницами начинается...

SAM style
18.10.2015, 23:51
cp #00
call z,fd_00 ;init
cp #01
call z,fd_01 ;set drive
cp #02
call z,fd_02 ;read
cp #03
call z,fd_03 ;writeВот это вот заменить. К проблеме не относится, но это же ужосЪ... Поменяй все call в этом блоке на jp.

Dr.Potapov
19.10.2015, 00:14
Вот это вот заменить. К проблеме не относится, но это же ужосЪ... Поменяй все call в этом блоке на jp.

Спасибо ) копипаста зарулила...
Пишу как то наспех, бамну уже рабочий код. ) но ужас понял, дошло! )))

shurik-ua
19.10.2015, 01:03
Поменяй все call в этом блоке на jp.

я бы рекомендовал заменить на это



device_fd_ent

or a
jp z,fd_00 ;init
dec a
jp z,fd_01 ;set drive
dec a
jp z,fd_02 ;read
dec a
jp z,fd_03 ;write
ret

Dr.Potapov
19.10.2015, 01:15
спасибо ребята )

кстати разобрался, все там отлично читает/пишет, но по умолчанию в нулевую страницу, которая потом подменяется на 7-ю и создается ощущения что ничерта не прочиталось.

как /dev/mem прикручу полегче пойдет.

отбой короче, функции хорошие )

Картинку вот пока еще глупую но для меня уже крайне радостную ))

http://cs628629.vk.me/v628629921/17190/gUKU2lNIrKo.jpg

shurik-ua
19.10.2015, 01:24
FUZIX пилишь ? - тут вроде есть отдельная тема по линуксам на спеке

Dr.Potapov
19.10.2015, 01:39
FUZIX пилишь ? - тут вроде есть отдельная тема по линуксам на спеке

Fuzix жаль (( но ls в 16 КБ меня прям убивает.
Тему про него прочитал, кто его развивает - монстры!! )
А это я для себя и для души. Особенного там ничего нет: монолитное микро-ядро компилируемое юзерами под разновидности своих клонов, никаких многозадачностей и 64 символьных 6912 экранов и прочего. Хочу попробовать вынести максимум функционала в user apps и сделать универсальную систему с открытым кодом, не более того. Без всяких амбиций. Получится - отлично, не получится - хорошо ))

Andrew771
19.10.2015, 23:37
я бы рекомендовал заменить на это

Код:
device_fd_ent

or a
jp z,fd_00 ;init
dec a
jp z,fd_01 ;set drive
dec a
jp z,fd_02 ;read
dec a
jp z,fd_03 ;write
ret
Такие вещи можно еще оптимизировать, если использовать регистр b и команды djnz.

Dr.Potapov
20.10.2015, 09:51
Такие вещи можно еще оптимизировать, если использовать регистр b и команды djnz.

До оптимизации очень далеко ) В основном сейчас приходится решать вопросы архитектурные, чем действительно код писать. Пару дней на раздумья (листочек и карандаш), пару макетов в freepascal, выбросить, опять пару дней на раздумья )) Пока раздумья - пишу то, что готово по своей архитектуре. Как то так все происходит. На JP переделал, не сложно. Но реально оптимизировать по сути еще нечего - бинарь будущего ядра сейчас 732 байта, уверен можно ужать на треть еще как минимум, а то и вполовину. В нем на сей момент собираются (по выбору юзера) три драйвера:
* цветной экран 32х24
* виртуальная консоль (системная обертка драйвера, сама определяет и цепляется к вкомпиленному низкоуровневому видеодрайверу по имени, ничего не умеет кроме определения существующего видеодрайвера и все транзитит в этот драйвер)
* дисковод (выбор дисковода, чтение и запись секторов)
Так же содержится таблица имен для вызовов вкомпиленных драйверов и системная функция отдающая user_app адрес вызова нужного драйвера по его имени.

Программа "hello world" в этом плане выглядит так:
User_app на старте получает от ядра адрес системной функции, дергает ее на предмет адреса драйвера виртуальной консоли (обращение прямо по имени драйвера "sc"), запоминает полученный адрес и в дальнейшем обращается к нему напрямую что бы напечатать что либо и как либо на экране. Драйвер "sc" работает с видеодрайвером внутри ядра уже сам.
По идее бинарь этого "hello world" должен работать на любой конфигурации ядра которое уже в свою очередь работает с любым вкомпиленным низкоуровневым видеодрайвером.

Так же user_app может запросить у ядра любой нужный ему драйвер (реальный или виртуальный) по его имени, если он там есть - приедет его адрес в текущей сборке ядра. К примеру "hello world" может не запрашивать "sc" а запросить сразу низкоуровневый и аппаратно-зависимый "scrn32" и работать с ним напрямую если он есть в ядре.

Это я зачем все написал. Вдруг это *****архитектура ))

James DiGreze
20.10.2015, 10:55
Да пока, на словах, вроде бы нормально. Делай пока как сам считаешь нужным, потом посмотрим как оно работет, мож чего дельного подскажем.

haywire
08.11.2015, 19:31
Вот с таких драйверов и начинается код, который работает только на эмуляторах. Данный код багованый, и ошибка не воспроизводится ни на каком эмуляторе, только на реале. Суть ошибки в том, что после того, как вы сбросили B-DISK, первая команда, с которой должна начинаться работа с устройством - это команда восстановления. В данном драйвере, данная команда имеет место, но вызывается только один раз для диска по умолчанию (A). Вот только с этим диском драйвер и будет работать, на остальных любая операция будет возвращать ошибку. Это так и есть, проверено. Надо разбить код инициализации на две части. Вот так я сделал :



vg_init_drive

DI

ld a, E
ld (fd_drive_no), A
call fd_motor_on
call fd_res_head

EI

ret


vg_drv_init
call fd_inifdc
EI
RET

fd_inifdc:
di

call fd_clr_error

ld a,%00011000
ld c,255
call fd_out_c_a

ld a,%00011100
ld c, 255
call fd_out_c_a
ld hl,300
call fd_pause
ld a,208
ld c,31
call fd_out_c_a
ld hl,1000
call fd_pause

RET


И вызывать vg_init_drive перед первым использованием диска.

Dr.Potapov
11.11.2015, 10:40
Вот с таких драйверов и начинается код, который работает только на эмуляторах. Данный код багованый, и ошибка не воспроизводится ни на каком эмуляторе, только на реале.
Спасибо преогромное )) Жаль у меня реала пока нет. То есть есть, но без дисковода )