6502, 12 bajtów (13 bajtów, jeśli Apple II)
6502
Kod maszynowy zakłada, że para zerowych lokalizacji stron jest podłączona do sprzętu do wprowadzania znaków ($ FE) i wyjścia (FF). Wiele systemów opartych na 6502 ułatwia we / wy w ten sposób, chociaż adres We / Wy zwykle nie jest na zerowej stronie.
Dla uproszczenia użyłem Py65 , symulatora systemu mikrokomputerowego 6502 napisanego w języku Python.
Oto zrzut pamięci z Py65. Możesz załadować następujący kod w dowolnym miejscu na zerowej stronie, aby nie nakładał się na $ FE i $ 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
Działając w oknie poleceń systemu Windows, możesz wkleić (Ctrl + V) dowolny tekst lub po prostu wpisać. Podczas pisania naciśnij Ctrl + J, aby wstawić nową linię (ten sam znak ASCII). Naciśnij Ctrl + C, aby przerwać procesor i powrócić do wiersza polecenia Py65.
Oczywiście kod asemblera jest łatwiejszy do odczytania.
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
Dla jasności, oto kod zestawu w formacie 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
Powyższy kod zakłada, że null wskazuje, że nie ma danych wejściowych, więc kontynuuje odpytywanie, dopóki nie zostanie zwrócona wartość inna niż null.
Dla porównania, Apple I i Apple II sygnalizują dostępność nowego znaku, ustawiając bit 7 adresu We / Wy klawiatury, który następnie musi zostać wyczyszczony po pobraniu znaku. W tych systemach znakowe operacje we / wy są zwykle wykonywane przez wywoływanie procedur monitorowania systemu zamiast bezpośredniego dostępu do sprzętu.
Wywołując RDKEY ($ FD0C) i COUT ($ FDED), powyższy ekwiwalent Apple II można zakodować w 13 bajtach i można go uruchomić w dowolnym miejscu w pamięci RAM. Oto kod, który uruchomiłem w emulatorze Apple // e, a2ix na Androida 9.
Naciśnięcie klawisza Return ma taki sam efekt jak nowa linia.
*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
Czy zauważyłeś, że zamiast normalnej wartości ASCII # 21 $ dla wykrzyknika, zamiast tego użyto # $ A1? Jest tak, ponieważ wysyłanie standardowych wartości ASCII do COUT powoduje, że są one wyświetlane w „trybie odwrotnym”, czarno-białym. Wyświetlanie ASCII w normalnym kolorze białym na czarnym wymaga dodania # 80 $ do wartości znaku w akumulatorze przed wywołaniem COUT. Ponieważ RDKEY zwraca znaki z zestawem hi-bitowym, programy asemblacyjne zwykle wyczyściły bit znaku, aby uzyskać jego wartość ASCII przed jego użyciem.