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 повертає символи з набором бітів, програми монтажу, як правило, очищають біт символу, щоб отримати його значення ASCII перед його використанням.