
Сообщение от
worker_vl
Доброго всем дня!
Решил немного вернуться к теме и обратиться к автору, как к авторитету, но если кто-нибудь другой ответит, я тоже не обижусь:
поскольку меня CP/M задела своим крылом только чуть, да и то в качестве студента, работающего в терминальном классе, и, скорее всего, это была MP/M, то можно сказать, что я с нею совершенно не знаком. Поэтому вопрос: каким образом запускаются или адаптируются программы для этой ОСи, чтоб ввод-вывод ориентировался не на терминальный порт, а на видеоконсоль, состоящую из AVR и PIC контроллеров? Безусловно, сама ОСь работает с ними отлично, а вот прикладной софт так и норовит вывести всё куда-то в сторону.
Заранее благодарен!
Пишу по памяти.
Стандартное приложение CP/M не оперирует понятиями RS-232, оно пишет/читает консоль (есть разновидности консолей, об этом ниже), а также в ряд устройств - Printer/LPT (запись символа и чтение статуса), Puncher (только вывод), Reader (только чтение).
- Про Puncher/Reader (те самые бумажные карточки) сразу забудем, аппаратно их уже нет, остались только вектора BIOS как напоминание (к слову их использование под что-то другое не принято, тупо пропадает место в таблице векторов BIOS).
- Printer в BIOS встречается реализованным, и с ним всё понятно: байт туда, байт оттуда.
- С консолью (условно, экран+клавиатура) чуть сложнее это посимвольное устройство (тоже на запись/чтение байта) в CPM2.2 делится/переназначается на несколько подвидов в зависимости от того как установлен байт по адресу 3 (IOBYTE, он состоит из четырех 2-битных величин):
Код:
;The IOBYTE lives at address 3 (in the Zero Page) and should be changed using
;BDOS calls 7 and 8 (get/set IOBYTE). The value is bitmapped:
;
; Bits Bits 6,7 Bits 4,5 Bits 2,3 Bits 0,1
; Device LIST PUNCH READER CONSOLE
;
; Value
; 00 TTY: TTY: TTY: TTY:
; 01 CRT: PTP: PTR: CRT:
; 10 LPT: UP1: UR1: BAT:
; 11 UL1: UP2: UR2: UC1:
;
;* BAT = batch mode. Use the current Reader for console input, and the current
; List (printer) device as the console output.
;
; * CRT = Standard console (keyboard and terminal screen).
; * LPT = Standard line printer.
; * PTP = Standard Paper Tape Punch.
; * PTR = Standard Paper Tape Reader.
; * TTY = Teletype device, eg a serial port.
; * UC1 = User defined (ie implementation dependent) console device.
; * UL1 = User defined (ie implementation dependent) printer device.
; * UPn = User defined (ie implementation dependent) output device.
; * URn = User defined (ie implementation dependent) input device.
Соответственно, если пользовательское приложение хочет писать на экран (CRT) и читать какую-то физически подключенную клавиатуру, оно кладет в ячейку (3) значение 149, и весь дальнейший ввод-вывод в консоль (подпрограммы CONOUT/CONIN/CONST BIOS) идет на устройство CRT(TV). Для переключения вывода/чтения на TTY(RS232) нужно в ячеку (3) положить значение 148.
В свою очередь подпрограммы CONOUT/CONIN/CONST BIOS должны содержать код switch по значению ячейки (3) - в зависимости от ее содежримого гнать выводимый пользователем символ либо на TV, либо на RS232. Сделано ли это в BIOS Аюши - вопрос к авторам, в принципе оно просто делается (при наличии подпрограмм для устройств). Я у себя в клоне CP/M такое делал, и очень понравилось: чудесным образом начинают работать всякие терминальные вещи типа Кермита (который издревле имеет режим сборки под управление потоками через IOBYTE).
- - - Добавлено - - -
Штатно переключить iobyte можно классической утилиой STAT:
STAT DEV: - текущие назначения устройств
STAT CON:=CRT: - ввод/вывод с теминала CRT (TV)
STAT CON:=TTY: - система переключается на ввод/вывод по RS-232.
- - - Добавлено - - -
Вот тут еще обсуждали, читать начиная с этого поста:
https://zx-pk.ru/threads/12367-zhele...l=1#post537195