diff --git a/Ocean_240/firmware_source/floppyhome.inc b/Ocean_240/firmware_source/floppyhome.inc index 29cd177..ef25608 100644 --- a/Ocean_240/firmware_source/floppyhome.inc +++ b/Ocean_240/firmware_source/floppyhome.inc @@ -4,8 +4,15 @@ ; Выход: a - код ошибки, cf - если была ошибка FloppyHome: - ; Отправка команды "Поиск нулевой дорожки" в КР1818ВГ93 + ; Отправка команды "Восстановление" в КР1818ВГ93 + ; - Головка не загружается + ; - Номер дорожки не проверяется + ; - Скорость перемещения 15мс (минимум) +#ifndef CONFIG_FLOPPY_SIZE_OPTIMIZATION mvi a, 0 +#else + xra a +#endif out PORT_VG93_DATA mvi a, 3 out PORT_VG93_COMMAND @@ -14,7 +21,7 @@ FloppyHome: nop nop - ; Ожидание пока КР1818ВГ93 занят или не выбрана нулевая дорожка или не наступит таймаут + ; Ожидание пока КР1818ВГ93 занят или не выбрана нулевая дорожка или не наступил таймаут loc_FDA8: in PORT_VG93_COMMAND ani 5 cpi 4 diff --git a/Ocean_240/firmware_source/floppyread.inc b/Ocean_240/firmware_source/floppyread.inc index 4064a99..8d3b820 100644 --- a/Ocean_240/firmware_source/floppyread.inc +++ b/Ocean_240/firmware_source/floppyread.inc @@ -1,23 +1,28 @@ ; ПЗУ Океан 240.2 REV 8 / Реверсинжиниринг aleksey.f.morozov@gmail.com / Лицензия GPL ; Прочитать сектор с дискеты -; Вход: a - диск, c - Код команды для К1818ВГ93 +; Вход: a - номер дисковода, c - код команды для К1818ВГ93 ; Выход: a - код ошибки, cf - если была ошибка FloppyRead: - push psw - ; Выбор дисковода и головки + push psw call FloppySetDriveHead pop psw - ; Если необходимо, то перезагрузить К1818ВГ93. Установить дорожку и сектор. - call FloppyReinitSetTrackSector + ; Запуск двигателя. Выбор дорожки и сектора. + call FloppyStartMotorSetTrackSector +#ifndef CONFIG_FLOPPY_SIZE_OPTIMIZATION jc Return - +#else + rc +#endif ; Отправка команды в К1818ВГ93, получение блока данных из К1818ВГ93 call FloppyReadInteral +#ifndef CONFIG_FLOPPY_SIZE_OPTIMIZATION jc Return - - ; Возврат кода ошибки 0 +#else + rc +#endif + ; Выход с кодом ошибки 0 xra a ret diff --git a/Ocean_240/firmware_source/floppyreadinternal.inc b/Ocean_240/firmware_source/floppyreadinternal.inc index d316d28..1c5babc 100644 --- a/Ocean_240/firmware_source/floppyreadinternal.inc +++ b/Ocean_240/firmware_source/floppyreadinternal.inc @@ -4,18 +4,17 @@ ; Выход: a - код ошибки, nz или cf - если была ошибка FloppyReadInteral: - ; Отправка команды в К1818ВГ93 + ; Передача кода команды в К1818ВГ93 mov a, c out PORT_VG93_COMMAND ; Цикл получения данных от К1818ВГ93 jmp loc_FF3F -loc_FF3D: ; Сохранение данных в память +loc_FF3D: ; Сохранение байта в память mov m, a inx h -loc_FF3F: ; Остановка процессора до появления сигналов INTRQ или DRQ - ; на выводах К1818ВГ93 или таймаута +loc_FF3F: ; Остановка процессора до появления сигналов INTRQ или DRQ от К1818ВГ93 in PORT_FLOPPY_WAIT rrc @@ -25,6 +24,10 @@ loc_FF3F: ; Остановка процессора до появления си ; Цикл длится, пока нет INTRQ от контроллера jc loc_FF3D - ; Возврат кода ошибки + ; Получение кода ошибки от К1818ВГ93 и выход +#ifndef CONFIG_FLOPPY_SIZE_OPTIMIZATION call FloppyCheckError ret +#else + jmp FloppyCheckError +#endif diff --git a/Ocean_240/firmware_source/floppyreinitsettracksector.inc b/Ocean_240/firmware_source/floppyreinitsettracksector.inc deleted file mode 100644 index ec3ec20..0000000 --- a/Ocean_240/firmware_source/floppyreinitsettracksector.inc +++ /dev/null @@ -1,84 +0,0 @@ -; ПЗУ Океан 240.2 REV 8 / Реверсинжиниринг aleksey.f.morozov@gmail.com / Лицензия GPL -; Если необходимо, то перезагрузить К1818ВГ93. Установить дорожку и сектор. -; Вход: a - дисковод -; Выход: a - код ошибки, cf - если была ошибка - -FloppyReinitSetTrackSector: - ; Если необходимо, то перезагрузить К1818ВГ93 - call FloppyReinitIfNecessary - rc - - ; Установить дорожку и сектор - call FloppySetTrackSector - rc - - ret - -;---------------------------------------------------------------------------- - -FloppyReinitIfNecessary: - ; Если будет выбран другой дисковод, то перезагрузить К1818ВГ93 - mov b, a - lda v_floppy_current - cmp b - jz loc_FE6B - call FloppyReinit - ret -loc_FE6B: - - ; Если мотор выключен, то перезагрузить К1818ВГ93 - in PORT_FLOPPY - rlc - jc FloppyReinit - - ; Если К1818ВГ93 выполняет какую то команду, то перезагрузить К1818ВГ93 - in PORT_VG93_COMMAND - ani 80h ; Not ready - rz - -;---------------------------------------------------------------------------- - -FloppyReinit: - push b - - ; Значение для задержки после перезагрузки - lxi b, 0FFFFh - - ; Перезагрузка К1818ВГ93 - call FloppyToggleResetPin - - ; Ожидаение готовности К1818ВГ93 или таймаута -loc_FE7D: in PORT_VG93_COMMAND - ani 80h ; Not ready - jz loc_FE8F - in PORT_FLOPPY - rlc - jnc loc_FE7D - - ; Таймаут. Выход с кодом ошибки. - mvi a, 20h - jmp loc_FE95 - - ; Задержка -loc_FE8F: dcx b - mov a, b - ora a - jnz loc_FE8F - -loc_FE95: - pop b - ret - -;---------------------------------------------------------------------------- - -FloppyToggleResetPin: - ; Установка 0 на ножке перезагрузки К1818ВГ93 - in PORT_FLOPPY - ani 4Eh ; Тут не снимается PFE_NEG_INIT! - rar - out PORT_FLOPPY - - ; Установка 1 на ножке перезагрузки К1818ВГ93 - ori PFE_NEG_INIT - out PORT_FLOPPY - ret diff --git a/Ocean_240/firmware_source/floppysetdrivehead.inc b/Ocean_240/firmware_source/floppysetdrivehead.inc index aa055bc..27290a3 100644 --- a/Ocean_240/firmware_source/floppysetdrivehead.inc +++ b/Ocean_240/firmware_source/floppysetdrivehead.inc @@ -28,14 +28,13 @@ loc_FDE1: pop psw dcr a jz loc_FDF6 - lda v_disk_c_tracks + lda v_disk_1_tracks jmp loc_FDF9 -loc_FDF6: lda cfg_disk_b_tracks +loc_FDF6: lda cfg_disk_0_tracks loc_FDF9: push b - ; Продолжаем, если номер дорожки больше или равен кол-ву - ; дорожек на одной стороне дискеты + ; Переход, если номер дорожки меньше кол-ва дорожек на одной стороне дискеты mov b, a mov a, d cmp b @@ -63,8 +62,12 @@ loc_FDF9: out PORT_FLOPPY ; Небольшая задержка +#ifndef CONFIG_FLOPPY_SIZE_OPTIMIZATION call Delay16 ret +#else + jmp Delay16 +#endif loc_FE15: pop b @@ -81,13 +84,16 @@ loc_FE15: out PORT_FLOPPY ; Небольшая задержка +#ifndef CONFIG_FLOPPY_SIZE_OPTIMIZATION call Delay16 ret +#endif ;---------------------------------------------------------------------------- Delay16: mvi b, 16 + ; Прододжение в DelayB ;---------------------------------------------------------------------------- diff --git a/Ocean_240/firmware_source/floppysettracksector.inc b/Ocean_240/firmware_source/floppysettracksector.inc index 98a0b32..ff46253 100644 --- a/Ocean_240/firmware_source/floppysettracksector.inc +++ b/Ocean_240/firmware_source/floppysettracksector.inc @@ -104,11 +104,15 @@ loc_FF06: ; Проверка результата выполнения команды in PORT_VG93_COMMAND - ani 19h ; Ошибка поиска + Ошибка КС + Занят + ani 19h ; Ошибка поиска + Ошибка КС + Занят, флаг CY сбрасывается +#ifndef CONFIG_FLOPPY_SIZE_OPTIMIZATION cpi 0 jnz loc_FF1D jmp loc_FF20 loc_FF1D: +#else + jz loc_FF20 +#endif ; Код ошибки stc mvi a, 40h diff --git a/Ocean_240/firmware_source/floppystartmotor.inc b/Ocean_240/firmware_source/floppystartmotor.inc new file mode 100644 index 0000000..2666494 --- /dev/null +++ b/Ocean_240/firmware_source/floppystartmotor.inc @@ -0,0 +1,71 @@ +; ПЗУ Океан 240.2 REV 8 / Реверсинжиниринг aleksey.f.morozov@gmail.com / Лицензия GPL +; Запустить двигатель дисковода +; Вход: b - дисковод +; Выход: a - код ошибки, cf - если была ошибка + +FloppyStartMotor: + ; Если выбран другой дисковод, то нужна задержка на раскрутку + mov b, a + lda v_floppy_current + cmp b + jz loc_FE6B + call FloppyStartMotor2 + ret +loc_FE6B: + + ; Если двигатель выключен, то запустить двигатель + in PORT_FLOPPY + rlc + jc FloppyStartMotor2 + + ; Если дисковод не готов, то запустить двигатель + in PORT_VG93_COMMAND + ani 80h ; Not ready + rz + +;---------------------------------------------------------------------------- + +FloppyStartMotor2: + push b + + ; Значение для задержки на раскрутку + lxi b, 0FFFFh + + ; Короткий негативный импульс на INIT запускает двигатель + call FloppyToggleInit + + ; Ожидаение готовности дисковода или остановки двигателя по таймауту +loc_FE7D: in PORT_VG93_COMMAND + ani 80h ; Not ready + jz loc_FE8F + in PORT_FLOPPY + rlc + jnc loc_FE7D + + ; Таймаут. Выход с кодом ошибки. + mvi a, 20h + jmp loc_FE95 + + ; Задержка на раскрутку +loc_FE8F: dcx b + mov a, b + ora a + jnz loc_FE8F + +loc_FE95: + pop b + ret + +;---------------------------------------------------------------------------- + +FloppyToggleInit: + ; Установка 0 на линии INIT + in PORT_FLOPPY + ani 4Eh + rar + out PORT_FLOPPY + + ; Установка 1 на линии INIT + ori PFE_NEG_INIT + out PORT_FLOPPY + ret diff --git a/Ocean_240/firmware_source/floppystartmotorsettracksector.inc b/Ocean_240/firmware_source/floppystartmotorsettracksector.inc new file mode 100644 index 0000000..9462629 --- /dev/null +++ b/Ocean_240/firmware_source/floppystartmotorsettracksector.inc @@ -0,0 +1,20 @@ +; ПЗУ Океан 240.2 REV 8 / Реверсинжиниринг aleksey.f.morozov@gmail.com / Лицензия GPL +; Запустить двигатель. Установить дорожку и сектор. +; Вход: a - дисковод +; Выход: a - код ошибки, cf - если была ошибка + +FloppyStartMotorSetTrackSector: + ; Запустить двигатель + call FloppyStartMotor + rc + + ; Установить дорожку и сектор +#ifndef CONFIG_FLOPPY_SIZE_OPTIMIZATION + call FloppySetTrackSector + rc + ret +#else + jmp FloppySetTrackSector +#endif + + diff --git a/Ocean_240/firmware_source/floppywrite.inc b/Ocean_240/firmware_source/floppywrite.inc index e2dd229..6f88b6c 100644 --- a/Ocean_240/firmware_source/floppywrite.inc +++ b/Ocean_240/firmware_source/floppywrite.inc @@ -1,6 +1,6 @@ ; ПЗУ Океан 240.2 REV 8 / Реверсинжиниринг aleksey.f.morozov@gmail.com / Лицензия GPL ; Записать сектор на дискету -; Вход: a - Диск, c - Код команды для К1818ВГ93 +; Вход: a - номер дисковода, c - код команды для К1818ВГ93 ; Выход: a - код ошибки, cf - если была ошибка FloppyWrite: @@ -9,14 +9,20 @@ FloppyWrite: call FloppySetDriveHead pop psw - ; Если необходимо, то перезагрузить К1818ВГ93. Установить дорожку и сектор. - call FloppyReinitSetTrackSector + ; Запуск двигателя. Выбор дорожки и сектора. + call FloppyStartMotorSetTrackSector +#ifndef CONFIG_FLOPPY_SIZE_OPTIMIZATION jc Return - +#else + rc +#endif ; Отправка команды в К1818ВГ93, отправка блока данных в К1818ВГ93 call FloppyWriteInternal +#ifndef CONFIG_FLOPPY_SIZE_OPTIMIZATION jc Return - - ; Возврат кода ошибки 0 +#else + rc +#endif + ; Выход с кодом ошибки 0 xra a ret diff --git a/Ocean_240/firmware_source/floppywriteinternal.inc b/Ocean_240/firmware_source/floppywriteinternal.inc index 7fbb5a5..d618619 100644 --- a/Ocean_240/firmware_source/floppywriteinternal.inc +++ b/Ocean_240/firmware_source/floppywriteinternal.inc @@ -4,16 +4,16 @@ ; Выход: a - код ошибки, cf - если была ошибка FloppyWriteInternal: - ; Отправка команды в К1818ВГ93 + ; Передача кода команды в К1818ВГ93 mov a, c out PORT_VG93_COMMAND -loc_FF29: ; Остановка процессора до появления сигналов INTRQ или DRQ - ; на выводах К1818ВГ93 или таймаута + ; Цикл отправки данных в К1818ВГ93 +loc_FF29: ; Остановка процессора до появления сигналов INTRQ или DRQ от К1818ВГ93 in PORT_FLOPPY_WAIT rrc - ; Передача данных в К1818ВГ93 + ; Передача байта в К1818ВГ93 mov a, m out PORT_VG93_DATA inx h @@ -21,7 +21,10 @@ loc_FF29: ; Остановка процессора до появления си ; Цикл длится, пока нет INTRQ от контроллера jc loc_FF29 - ; Возврат кода ошибки + ; Получение кода ошибки от К1818ВГ93 и выход +#ifndef CONFIG_FLOPPY_SIZE_OPTIMIZATION call FloppyCheckError ret - +#else + jmp FloppyCheckError +#endif