Важная информация

User Tag List

Страница 1 из 2 12 ПоследняяПоследняя
Показано с 1 по 10 из 12

Тема: Фукция чтения ТР-ДОС

Комбинированный просмотр

Предыдущее сообщение Предыдущее сообщение   Следующее сообщение Следующее сообщение
  1. #1
    Member Аватар для Dr.Potapov
    Регистрация
    31.10.2006
    Адрес
    г. Воронеж
    Сообщений
    75
    Записей в дневнике
    1
    Спасибо Благодарностей отдано 
    0
    Спасибо Благодарностей получено 
    0
    Поблагодарили
    0 сообщений
    Mentioned
    0 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию Фукция чтения ТР-ДОС

    Очень нужна посильная помощь, приложил исходник драйвера 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). там какая то чехарда со страницами начинается...

  2. #1
    С любовью к вам, Yandex.Direct
    Размещение рекламы на форуме способствует его дальнейшему развитию

  3. #2
    Guru Аватар для SAM style
    Регистрация
    28.02.2005
    Адрес
    Великий Новгород
    Сообщений
    2,055
    Спасибо Благодарностей отдано 
    10
    Спасибо Благодарностей получено 
    218
    Поблагодарили
    92 сообщений
    Mentioned
    9 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию

    Цитата Сообщение от Dr.Potapov Посмотреть сообщение
    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.
    Все любят гипножабу

  4. #3
    Member Аватар для Dr.Potapov
    Регистрация
    31.10.2006
    Адрес
    г. Воронеж
    Сообщений
    75
    Записей в дневнике
    1
    Спасибо Благодарностей отдано 
    0
    Спасибо Благодарностей получено 
    0
    Поблагодарили
    0 сообщений
    Mentioned
    0 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию

    Цитата Сообщение от SAM style Посмотреть сообщение
    Вот это вот заменить. К проблеме не относится, но это же ужосЪ... Поменяй все call в этом блоке на jp.
    Спасибо ) копипаста зарулила...
    Пишу как то наспех, бамну уже рабочий код. ) но ужас понял, дошло! )))

  5. #4
    Master
    Регистрация
    24.05.2005
    Адрес
    г. Запорожье, Украина
    Сообщений
    992
    Спасибо Благодарностей отдано 
    571
    Спасибо Благодарностей получено 
    364
    Поблагодарили
    239 сообщений
    Mentioned
    2 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию

    Цитата Сообщение от SAM style Посмотреть сообщение
    Поменяй все 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
    Последний раз редактировалось shurik-ua; 19.10.2015 в 01:06.

  6. #5
    Member Аватар для Dr.Potapov
    Регистрация
    31.10.2006
    Адрес
    г. Воронеж
    Сообщений
    75
    Записей в дневнике
    1
    Спасибо Благодарностей отдано 
    0
    Спасибо Благодарностей получено 
    0
    Поблагодарили
    0 сообщений
    Mentioned
    0 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию

    спасибо ребята )

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

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

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

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

    Последний раз редактировалось Dr.Potapov; 19.10.2015 в 01:20.

  7. #6
    Veteran
    Регистрация
    29.12.2010
    Адрес
    Москва
    Сообщений
    1,858
    Спасибо Благодарностей отдано 
    131
    Спасибо Благодарностей получено 
    104
    Поблагодарили
    62 сообщений
    Mentioned
    0 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию

    Цитата Сообщение от shurik-ua Посмотреть сообщение
    я бы рекомендовал заменить на это

    Код:
    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.

  8. #7
    Member Аватар для Dr.Potapov
    Регистрация
    31.10.2006
    Адрес
    г. Воронеж
    Сообщений
    75
    Записей в дневнике
    1
    Спасибо Благодарностей отдано 
    0
    Спасибо Благодарностей получено 
    0
    Поблагодарили
    0 сообщений
    Mentioned
    0 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию

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

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

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

    Это я зачем все написал. Вдруг это *****архитектура ))
    Последний раз редактировалось Dr.Potapov; 20.10.2015 в 10:30.

  9. #8
    Master
    Регистрация
    04.07.2012
    Адрес
    г. Москва
    Сообщений
    552
    Спасибо Благодарностей отдано 
    5
    Спасибо Благодарностей получено 
    83
    Поблагодарили
    39 сообщений
    Mentioned
    0 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию

    Вот с таких драйверов и начинается код, который работает только на эмуляторах. Данный код багованый, и ошибка не воспроизводится ни на каком эмуляторе, только на реале. Суть ошибки в том, что после того, как вы сбросили 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 перед первым использованием диска.

  10. #9
    Member Аватар для Dr.Potapov
    Регистрация
    31.10.2006
    Адрес
    г. Воронеж
    Сообщений
    75
    Записей в дневнике
    1
    Спасибо Благодарностей отдано 
    0
    Спасибо Благодарностей получено 
    0
    Поблагодарили
    0 сообщений
    Mentioned
    0 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию

    Цитата Сообщение от haywire Посмотреть сообщение
    Вот с таких драйверов и начинается код, который работает только на эмуляторах. Данный код багованый, и ошибка не воспроизводится ни на каком эмуляторе, только на реале.
    Спасибо преогромное )) Жаль у меня реала пока нет. То есть есть, но без дисковода )

  11. #10
    Master
    Регистрация
    24.05.2005
    Адрес
    г. Запорожье, Украина
    Сообщений
    992
    Спасибо Благодарностей отдано 
    571
    Спасибо Благодарностей получено 
    364
    Поблагодарили
    239 сообщений
    Mentioned
    2 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию

    FUZIX пилишь ? - тут вроде есть отдельная тема по линуксам на спеке

Страница 1 из 2 12 ПоследняяПоследняя

Информация о теме

Пользователи, просматривающие эту тему

Эту тему просматривают: 1 (пользователей: 0 , гостей: 1)

Похожие темы

  1. Схема чтения с магнитофона на 544СА3
    от roma в разделе Внешние накопители
    Ответов: 20
    Последнее: 02.10.2015, 22:26
  2. Плагин FAR для чтения реальных дисков TR DOS
    от Alexandr Medvedev в разделе Утилиты
    Ответов: 2
    Последнее: 15.09.2010, 06:17
  3. Минимальное время чтения/записи байта
    от spensor в разделе Программирование
    Ответов: 9
    Последнее: 02.03.2009, 20:32
  4. Индикатор чтения\запись FDD. Есть вопрос по схеме
    от luzanov в разделе Внешние накопители
    Ответов: 10
    Последнее: 12.09.2007, 17:58

Ваши права

  • Вы не можете создавать новые темы
  • Вы не можете отвечать в темах
  • Вы не можете прикреплять вложения
  • Вы не можете редактировать свои сообщения
  •