Отлично, шрифты 5x7 можно дернуть с Ориона :)
Вид для печати
А вот еще интересное из мира Корвета: 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).
В Мониторе неизвестной версии, который подогнали коллеги из Североморска, процедуры уже пропатчены:
Код: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
В версии "ОКЕАН-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
Вложение 80036
Взял на посмотреть Rel.6. Подправил константы в DPB и у встроенной команды DIR для 128К.
Вложение 80038
Но как XDIR умудряется нащупать 256К?
При прописанных в DPT для квазидиска А: 447 1-килобайтных блоках имеем следующую картину:
Вложение 80095
Встроенный 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
Вложение 80099
Забиваем квазидиск мусором (SAVE позволяет сохранять в файл максимум 255 блоков):
Вложение 80100
Может кто нибудь знает? Как CP/M bios должен обрабатывать нажатие "break" при печати на принтер?
Как bios должен сообщать об этом "наверх" ?
A = FFh или как-то иначе?
Например, так?Код:list:
ld e,a ; bios+0Fh
$1: call tbrk
ccf
ret c ; здесь A точно <> 0
in a,(0fbh) ; FBh, теневое озу включено
rla
jr c,$1 ; ждём busy =0
ld a,e
out (0fbh),a ; strobe =1
ds 2
out (7bh),a ; strobe =0
ds 3
out (0fbh),a
prstat: ; bios+2Dh
xor a ; здесь надо возвращать статус busy ?
ret
tbrk:
ld a,7fh ; вернёт CF=0 если нажат break
in a,(0feh)
rra
ret c
ld a,0feh
in a,(0feh)
rra
ret