User Tag List

Показано с 1 по 4 из 4

Тема: Help! Ищу доки по кодингу работы с HDD на Nemo-IDE и SMUC.

  1. #1

    Регистрация
    16.11.2005
    Адрес
    Санкт-Петербург
    Сообщений
    2,925
    Спасибо Благодарностей отдано 
    1,168
    Спасибо Благодарностей получено 
    362
    Поблагодарили
    198 сообщений
    Mentioned
    2 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию Help! Ищу доки по кодингу работы с HDD на Nemo-IDE и SMUC.

    Коллеги.

    Ткните, пожалуйста, носом, где лежат сабжи. Лучше, чтобы с примерами и объяснялками почти на пальцах.

    Спасибо!

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

  3. #2

    Регистрация
    27.01.2005
    Сообщений
    924
    Спасибо Благодарностей отдано 
    28
    Спасибо Благодарностей получено 
    193
    Поблагодарили
    154 сообщений
    Mentioned
    2 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию

    Доки по IDE АТА интерфейсу ищешь гуглом.

    Вкратце:
    Обмен по IDE ATA идет блоками по 512 байт.


    Порты Nemo IDE http://speccy.info/%D0%9F%D0%BE%D1%80%D1%82%D1%8B

    +----+---------------------------+----------------------------+
    | | in | out |
    +----+---------------------------+----------------------------+
    |#11 | Регистр данных D8-D15 | Регистр данных D8-D15 |
    |#10 | Регистр данных D0-D7 | Регистр данных D0-D7 |
    |#30 | Регистр ошибок | Регистр предкомпенсации (*)|
    |#50 | Регистр счетчика секторов | Регистр счетчика секторов |
    |#70 | Регистр номера сектора | Регистр номера сектора |
    |#90 | Регистр номера цилиндра | Регистр номера цилиндра | (конфликтует с GMX[5])
    | | (low) | (low) |
    |#B0 | Регистр номера цилиндра | Регистр номера цилиндра |
    | | (high) | (high) |
    |#D0 | Регистр накопителя/головки| Регистр накопителя/головки |
    |#F0 | Регистр состояния | Регистр команд |
    +----+---------------------------+----------------------------+
    |#C8 | Регистр альтернативного | Управление состоянием нако-|
    | | состояния | пителя |


    Готовые примеры - смотри исходники DNAOS, например.

    Принцип простой.
    1. Настраиваешь регистры адреса LBA (они же - цилиндра, сектора, головки, но кто сейчас использует CHS?).
    2. Кидаешь команду в регистр команд.
    3. Читаешь или пишешь регистр данных блоками по 512 байт.

    Подробнее, если не забуду, отпишусь вечером (на работе нет исходников).
    Лучше, конечно, к матерым авторам DNAOS или к Савелию.
    Последний раз редактировалось SfS; 13.12.2016 в 06:52.

  4. #3

    Регистрация
    27.01.2005
    Сообщений
    924
    Спасибо Благодарностей отдано 
    28
    Спасибо Благодарностей получено 
    193
    Поблагодарили
    154 сообщений
    Mentioned
    2 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию

    Вот чтение-запись для NEMO IDE.


    Код:
    ;------------------------------------------------
    ; NEMO драйвер HDD
    ;------------------------------------------------
    	.module nemo_drv
    	
    	.area _CODE
    	; i:Status o:Command
    	P_CTRL		= 0xF0			;РЕГИСТР СОСТОЯНИЯ/РЕГИСТР КОМАНД
    	; io: Drive/Head / LBA24-27
    	P_LBA3		= 0xD0			;CHS-НОМЕР ГОЛОВЫ И УСТР/LBA АДРЕС 24-27
    	; io: Cylinder High / LBA16-23
    	P_LBA2		= 0xB0			;CHS-ЦИЛИНДР 8-15/LBA АДРЕС 16-23
    	; io: Cylinder Low / LBA8-15
    	P_LBA1		= 0x90			;CHS-ЦИЛИНДР 0-7/LBA АДРЕС 8-15
    	; io: Sector Number / LBA0-7
    	P_LBA0		= 0x70			;CHS-НОМЕР СЕКТОРА/LBA АДРЕС 0-7
    
    	; io: Sector Count
    	P_SECTCNT	= 0x50			;СЧЕТЧИК СЕКТОРОВ
    
    	; i:Error register o:Features
    	P_FUTERROR	= 0x30			;ПОРТ ОШИБОК/СВОЙСТВ
    
    	; io: Data register
    	P_DATAL		= 0x10			;ПОРТ ДАННЫХ (low)
    	P_DATAH		= 0x11			;СТАРШИЕ 8 БИТ (hi)
    	;
    	P_EXTCTL	= 0xC8			; Доп. РЕГИСТР СОСТОЯНИЯ/УПРАВЛЕНИЯ
    ;------------------------------------------------
    	; Error register mask
    	E_ABRT		= 0x04			; Последняя команда не выполнена (Aborted Command)
    	E_IDNF		= 0x10			; Сектор не найден (ID not Found)
    	E_UNC		= 0x40			; Некорректируемая ошибка данных (Uncorrectable Data Error)
    	E_BBK		= 0x80			; Ошибка CRC-кода или обнаружен сбойный блок (Bad Block Detected)
    ;------------------------------------------------
    	; Drive/Head format: 1m1dXXXX
    	; m - 0=CHS, 1=LBA
    	; d - 0=master, 1=slave
    	M_MASL		=0x10
    	M_LBA		=0x40
    	M_ADR		=0x0F
    	M_CTL		=0xA0
    ;------------------------------------------------
    	; Status mask
    	SM_BSY		=0x80	; =1 устройство занято
    	SM_DRDY		=0x40	; =1 устройство готово к приему команды
    	SM_DF		=0x20	; =1 индикатор ошибки устройства
    	SM_DSC		=0x10	; =1 Признак успешного позиционирования головки
    	SM_DRQ		=0x08	; =1 DRQ сообщает о том, что устройство готово к приему данных
    	SM_ERR		=0x01	; =1 во время выполнения последней команды произошла ошибка
    				;    Дополнительная информация об ошибке находится в Error register.
    ;------------------------------------------------
    	CMD_ID		=0xEC	; Identify Drive
    	CMD_RECAL	=0x10	; Recalibrate
    	CMD_RDS		=0x20	; Read Sector(s)
    	CMD_WRS		=0x30	; Write Sector(s)
    ;------------------------------------------------
    ; Ждать готовности устройства
    ; i: o: C=1 - таймаут, C=0, устройство готово
    NO_BSY:
    	LD 	BC,#P_CTRL	; порт состояния
    	LD	DE,#0x0000	; тайм-аут (65536 циклов)
    NO_BSY1:
    	in	a,(c)
    	RLCA
    	RET 	NC		; выход - устройство готово, C=0
    	;
    	dec	de
    	ld	a,e
    	or	d
    	jr	NZ,NO_BSY1	; ждём, таймаут не кончился
    	; Таймаут. C=1, устройство не готово
    	scf
    	ret
    ;------------------------------------------------
    ; Ожидание готовности к приёму данных
    ; io:
    W_DRQ:
    	LD 	BC,#P_CTRL	; порт состояния
    	LD	DE,#0x0000	; тайм-аут (65536 циклов)
    W_DRQ1:
    	in	a,(c)
    	and 	#SM_DRQ
    	RET 	NZ		; выход - устройство готово, C=0
    	;
    	jr	NZ,W_DRQ1
    	; Таймаут. C=1, устройство не готово
    	scf
    	ret
    ;------------------------------------------------
    ; Проверить на ошибку
    ; i: o: С=1 - ошибка, C=0 - всё ОК
    ;
    ERR_:	LD BC,#P_CTRL
    	in a,(c)
    	RRCA
    	; Если была ошибка - считать ее код
    	LD BC,#P_FUTERROR
    	in a,(c)
    	RET
    ;------------------------------------------------
    ;HDD Send Command.
    ;IN:    [A] - код команды.
    ;OUT:   CY - Операция выполнена с ошибкой.
    ;
    HDSC:
    	LD 	BC,#P_CTRL
    	out 	(c),a	; послали команду.
    	CALL 	NO_BSY 	; ждем выполнения.
    	RET	C	; таймаут
    	JP 	ERR_	; смотрим, нет ли ошибок.
    ;------------------------------------------------
    ;Чтение заданного количества секторов
    ; i: HL-адрес буфера, A-количество секторов
    ; o: С=1 - ошибка, C=0 - всё ОК
    READ:
    	LD	B,A
    	PUSH	BC
    	LD	BC,#P_SECTCNT
    	out	(c),a
    	LD	A,#CMD_RDS
    	CALL	HDSC	;команда читать...
    	jr	C,RWERR
    	POP	BC
    READ1:
    	PUSH	BC
    	CALL	W_DRQ
    	jr	C,RWERR
    	LD	BC,#P_DATAL ;Читаем сектор из (2 раза по 256 байт)
    	INIR
    	INIR
    	POP	BC
    	DJNZ	READ1
    	and	a ; C=0
    	RET
    ;------------------------------------------------
    ; Выход их процедур чтения и записи секторов при ошибке
    RWERR:
    	POP	BC
    	RET
    ;------------------------------------------------
    ;Запись заданного количества секторов
    ; i: HL-адрес буфера, A-количество секторов
    ; o: С=1 - ошибка, C=0 - всё ОК
    WRITE:
    	LD B,A
    	PUSH BC
    	LD BC,#P_SECTCNT
    	out	(c),a
    	;
    	LD A,#CMD_WRS
    	CALL HDSC    ;команда писать...
    	jr	C,RWERR
    	POP BC
    WRITE1:
    	PUSH BC
    	CALL W_DRQ
    	jr	C,RWERR
    	LD BC,#P_DATAL ;Пишем сектор в (2 раза по 256 байт)
    	OTIR
    	OTIR
    	POP BC
    	DJNZ WRITE1
    	and	a ; C=0
    	RET
    ;------------------------------------------------
    ; Интерфейс для С
    ;------------------------------------------------
    ; Чтение описателя диска
    .globl _ID_HDD
    _ID_HDD:
    	ld	IX,#0002
    	add	IX,sp
    	;
    	ld	a,(IX)	; mode
    	;
    	ld	l,1(ix)
    	ld	h,2(ix) ; hl=buffer
    	; master or slave ?
    	or	a
    	ld	a,#(M_MASL + M_CTL + M_LBA)
    	jr	nz,ID_HDD_SL
    	ld	a,#(M_CTL + M_LBA)
    ID_HDD_SL:
    
    	LD	BC,#P_LBA3
    	out	(c),a
    	; Команда - считать инфу о винте
    	LD	A,#CMD_ID
    	CALL	HDSC
    	; Читаем один сектор
    	ld b,#1
    	call	READ1
    	ld	l,#00
    	ret	nc
    	ld	l,#0xFF
    	ret
    ;------------------------------------------------
    Для SMUC будет нечто подобное, я полагаю, только адреса портов другие.
    Последний раз редактировалось SfS; 14.12.2016 в 05:32.

  5. #4

    Регистрация
    06.04.2015
    Адрес
    г. Приозерск, Ленинградская обл.
    Сообщений
    299
    Спасибо Благодарностей отдано 
    0
    Спасибо Благодарностей получено 
    1
    Поблагодарили
    1 сообщение
    Mentioned
    0 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию

    про SMUC
    Вложения Вложения
    Scorpion ZS-256turbo_Проф ПЗУ27040_Smuc_HDD_PCkeyMause(Scorp)_GS_512+XTR Модем(X-Trade)
    ZX-Evolution rev.С+VDAC+OldGS_512+OpenSMUC+TSFM+TS-conf
    Amiga500 1m+512k
    Schneider EuroPC
    ReVerSE-U16

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

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

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

Похожие темы

  1. NEMO IDE + Pentagon128
    от doc_fbi в разделе Pentagon
    Ответов: 30
    Последнее: 03.10.2015, 14:44
  2. Программа для работы с HDD-NEMO
    от kgbond в разделе Софт
    Ответов: 46
    Последнее: 07.02.2012, 13:59
  3. NEMO IDE - SCHEMATICS
    от VELESOFT в разделе Внешние накопители
    Ответов: 2
    Последнее: 01.01.2010, 02:06
  4. Контроллер Nemo IDE не пишет на HDD
    от dM_GBG в разделе Внешние накопители
    Ответов: 0
    Последнее: 04.07.2009, 10:58
  5. Ищу описание функций RST 8 для работы с HDD SMUC
    от Evgeny Muchkin в разделе Программирование
    Ответов: 0
    Последнее: 17.11.2006, 20:06

Ваши права

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