6502, 12 байт (13 байт, если Apple II)
6502
Машинный код предполагает, что пара местоположений нулевой страницы подключена к аппаратному обеспечению ввода ($ FE) и вывода (FF). Многие системы на основе 6502 облегчают ввод-вывод таким способом, хотя адрес ввода-вывода обычно не находится на нулевой странице.
Для простоты я использовал Py65 , симулятор микрокомпьютерной системы 6502, написанный на Python.
Вот дамп памяти от Py65. Вы можете загрузить следующий код в любом месте нулевой страницы, чтобы он не перекрывал $ FE и $ FF.
PC AC XR YR SP NV-BDIZC
6502: 0000 00 00 00 ff 00110010
.mem 0:b
0000: a9 21 85 ff a5 fe f0 fc 85 ff d0 f4
Запустив в командном окне Windows, вы можете вставить (Ctrl + V) любой текст, который вы хотите, или вы можете просто напечатать. Если вы печатаете, нажмите Ctrl + J для новой строки (тот же символ ASCII). Нажмите Ctrl + C, чтобы прервать работу процессора и вернуться в командную строку Py65.
Естественно, ассемблерный код легче читать.
PC AC XR YR SP NV-BDIZC
6502: 0000 00 00 00 ff 00110010
.d 00:0b
$0000 a9 21 LDA #$21
$0002 85 ff STA $ff
$0004 a5 fe LDA $fe
$0006 f0 fc BEQ $0004
$0008 85 ff STA $ff
$000a d0 f4 BNE $0000
Для наглядности вот код сборки в формате CBA65 .
; ASSEMBLE:
; cba65 bangit
;
; LOAD/RUN
; python3 py65/monitor.py -i 00fe -o 00ff -l bangit.bin
; goto 0000
.FILES BIN=256
; I/O LOCATIONS
GETC .EQU $FE ; (1) MOVING PY65'S GETC TO ZP SHAVES 1 BYTE
PUTC .EQU $FF ; (1) MOVING PY65'S PUTC TO ZP SHAVES 2 BYTES
.ORG $0000
VROOM LDA #'!'
STA PUTC
VROOM2 LDA GETC
BEQ VROOM2
STA PUTC
BNE VROOM
.END
Apple II
Приведенный выше код предполагает, что нулевое значение указывает на отсутствие ввода, поэтому продолжает опрос, пока не будет возвращено ненулевое значение.
Для сравнения, Apple I и Apple II сигнализируют о доступности нового символа, устанавливая бит 7 адреса ввода-вывода клавиатуры, который затем необходимо очистить после извлечения символа. В этих системах символьный ввод-вывод обычно выполняется путем вызова процедур системного монитора вместо прямого доступа к оборудованию.
Вызывая RDKEY ($ FD0C) и COUT ($ FDED), Apple II эквивалент вышеупомянутого может быть закодирован в 13 байтов и может быть запущен где угодно в оперативной памяти. Вот код, который я запускал в эмуляторе Apple // e, a2ix на Android 9.
Нажатие Return имеет тот же эффект, что и перевод строки.
*300L
0300- A9 A1 LDA #$A1
0302- 20 ED FD JSR $FDED
0305- 20 0C FD JSR $FD0C
0308- 20 ED FD JSR $FDED
030B- F0 F3 BEQ $0300
Вы заметили, что вместо нормального значения ASCII # $ 21 для восклицательного знака вместо него используется # $ A1? Это происходит потому, что отправка стандартных значений ASCII в COUT приводит к их отображению в «инверсном режиме», черным по белому. Отображение ASCII обычным белым на черном требует добавления $ 80 к значению символа в аккумуляторе перед вызовом COUT. Поскольку RDKEY возвращает символы с установленным hi-bit, программы сборки обычно очищают бит символа, чтобы получить его значение ASCII перед его использованием.