А вот еще интересное из мира Корвета: https://zx-pk.ru/threads/24900-korvet-rezhim-80x25.html
(обожаю эксгумировать лежалые топики)
Пришлось вспомнить, как работать с ghidra (спойлер: весьма комфортно) и заново отдизелить океанские MONITOR, BIOS, BDOS и CCP.
Монитор (0xe000-0xffff) после минимальной инициализации смотрит, прошит ли CPM (0xc0000-0xdfff), и передает управление загрузчику по адресу 0xd600.
Загрузчик немножечко колдует, затем копирует CCP из ПЗУ (0xc000-0xc809) в RAM по адресу 0xb200, куда после недолгих раздумий прыгает сам.
CCP почти один-в-один соответствует исходникам CP/M 2.2, за несколькими мелкими исключениями:
- процедура проверки серийного номера на месте, но аварийный выход из нее забит NOP-ами
- встроенных команд 6 ($DIR, ERA, TYPE, SAVE, REN, USER), к имени команды DIR добавлен доллар. Интересно, будет ли работать, если написать $DIR
- после адресов обработчиков встроенных команд обычно идет адрес обработчика транзитных команд userfunc. В нашем случае там вбит адрес обработчика дополнительных команд из ПЗУ CP/M (0xdb00)
- каковой добавляет еще 4 встроенные команды (DIR, READ, WRITE, EXIT). Ну и в конце ссылается обратно на штатный обработчик userfunc (0xb8a5).
Последний раз редактировалось tnt23; 14.04.2023 в 10:44.
dk_spb (30.12.2023)
dk_spb (30.12.2023)
В Мониторе неизвестной версии, который подогнали коллеги из Североморска, процедуры уже пропатчены:
Код:WBLOCK XREF[2]: ram:e01e(c), RAM2TAP:fa61(c) ram:fb43 e5 PUSH HL ram:fb44 d5 PUSH DE ram:fb45 7a MOV A,D ram:fb46 e6 07 ANI 0x7 ram:fb48 c6 02 ADI 0x2 ram:fb4a f6 00 ORI 0x0
Последний раз редактировалось tnt23; 04.01.2024 в 21:45.
В версии "ОКЕАН-240 CP/M (V2.2) REL.8'" DPT длиной 57 байт (три DPB по 19 байт каждый) копируется загрузчиком из ПЗУ с адреса 0xd9f8 в ОЗУ по адресу 0xbade.
DPB 1 задает параметры RAM-диска А: (192 блока по 1К), итого 192К.
DPB 2 и 3 для дисков B: и C: определяются в зависимости от плотности как 180 или 360 блоков по 2К, итого 360К или 720К.Код:DPB_1_rom XREF[1]: ram:d715(*) ram:d9af 10 00 03 struct 07 00 bf 00 1f 00 ram:d9af 10 00 dw 16 SPT Number of 128-byte Sectors Pe XREF[1]: ram:d715(*) ram:d9b1 03 db 3 BSH Block Shift. 3=1K, 4=2K, 5=4K ram:d9b2 07 db 7h BLM Block Mask. 7=1K, f=2K, 1f=4K ram:d9b3 00 db 0h EXM Extent Mask ram:d9b4 bf 00 dw 191 DSM Number of blocks on disk - 1 ram:d9b6 1f 00 dw 31 DRM Number of directory entries - 1 ram:d9b8 80 db 80h AL0 Directory allocation bitmap, ram:d9b9 00 db 0h AL1 Directory allocation bitmap, ram:d9ba 08 00 dw 8h CKS Checksum vector size, 0 for a ram:d9bc 00 00 dw 0h OFF Offset, number of reserved tr
Я не прошивал соответствующую версию BIOS, поэтому стартовый экран выглядит забавно. Встроенная команда SDIR исправно поддерживает 192К рам-диска, уж не знаю, подсчитывает или захардкожено, как в ранних версиях.Код:d725 21 26 bb LXI HL,DPB_2 d728 0e 0f MVI C,15 d72a 11 dc d9 LXI DE,DPB_2_rom_Single d72d 3a 48 d6 LDA (Drive_B) d730 fe 01 CPI 0x1 d732 ca 38 d7 JZ LAB_ram_d738 d735 11 cd d9 LXI DE,DPB_2_rom_Double
Последний раз редактировалось tnt23; 05.01.2024 в 15:24.
При прописанных в DPT для квазидиска А: 447 1-килобайтных блоках имеем следующую картину:
Встроенный DIR пропатчен показывать 448К свободных, но записать очередной CHUNK5 весом 64К не получается. На диске образуется его обрезок весом 32К и выдается сообщение NO SPACE.
Внешняя команда STAT, по-видимому, показывает более похожий на правду результат.
Есть подозрение, что для размеров квазидиска более 192К (а конкретно DSM больше 256К) нужно переходить на другой размер BLS (2,048 байт) и, соответственно, указывать BSH = 4 и BLM = 15, ну и EXM = 0.
Собственно, как это и сделано для дискет:
Прописываем BSH=4, BLM=15, EXM=0, DSM=223:Код:DPB_2_rom_Double d9cd 24 00 dw 36 SPT Number of 128-byte Sectors Pe d9cf 04 db 4h BSH Block Shift. 3=1K, 4=2K, 5=4K d9d0 0f db Fh BLM Block Mask. 7=1K, f=2K, 1f=4K d9d1 00 db 0h EXM Extent Mask d9d2 67 01 dw 359 DSM Number of blocks on disk - 1 d9d4 7f 00 dw 127 DRM Number of directory entries - 1 d9d6 c0 db C0h AL0 Directory allocation bitmap, d9d7 00 db 0h AL1 Directory allocation bitmap, d9d8 20 00 dw 20h CKS Checksum vector size, 0 for a d9da 00 00 dw 0h OFF Offset, number of reserved tr
Забиваем квазидиск мусором (SAVE позволяет сохранять в файл максимум 255 блоков):
Последний раз редактировалось tnt23; 13.01.2024 в 18:39.
Эту тему просматривают: 1 (пользователей: 0 , гостей: 1)