6502, 12 bytes (13 bytes if Apple II)
6502
The machine code assumes that a pair of zero page locations are connected to character input ($FE) and output (FF) hardware. Many 6502-based systems facilitate I/O in this fashion, albeit I/O address are usually not in zero page.
For simplicity, I used Py65, a 6502 microcomputer system simulator written in Python.
Hier ist ein Speicherauszug von Py65. Sie können den folgenden Code an einer beliebigen Stelle auf der Nullseite laden, sodass sich $ FE und $ FF nicht überschneiden.
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
In einem Windows-Befehlsfenster können Sie beliebigen Text einfügen (Strg + V) oder einfach eingeben. Drücken Sie bei der Eingabe Strg + J für eine neue Zeile (dasselbe ASCII-Zeichen). Drücken Sie Strg + C, um den Prozessor zu unterbrechen und zur Py65-Eingabeaufforderung zurückzukehren.
Assembler-Code ist natürlich einfacher zu lesen.
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
Der Übersichtlichkeit halber hier der Assembler-Code im CBA65- Format.
; 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
Der obige Code geht davon aus, dass eine Null angibt, dass keine Eingabe vorliegt, und setzt die Abfrage fort, bis ein Wert ungleich Null zurückgegeben wird.
Zum Vergleich signalisieren Apple I und Apple II die Verfügbarkeit eines neuen Zeichens durch Setzen von Bit 7 der Tastatur-E / A-Adresse, das nach dem Abrufen des Zeichens gelöscht werden muss. Auf diesen Systemen wird die Zeichen-E / A normalerweise durch Aufrufen von Systemüberwachungsroutinen ausgeführt, anstatt direkt auf die Hardware zuzugreifen.
Durch Aufrufen von RDKEY ($ FD0C) und COUT ($ FDED) kann das Apple II-Äquivalent des oben genannten in 13 Bytes codiert werden und kann überall im RAM ausgeführt werden. Hier ist der Code, den ich in einem Apple // e-Emulator ausgeführt habe, a2ix auf Android 9.
Das Drücken der Eingabetaste hat den gleichen Effekt wie eine neue Zeile.
*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
Haben Sie bemerkt, dass anstelle des normalen ASCII-Werts # $ 21 für das Ausrufezeichen # $ A1 verwendet wird? Das liegt daran, dass beim Senden von Standard-ASCII-Werten an COUT diese im "inversen Modus" (schwarz auf weiß) angezeigt werden. Um ASCII in normalem Weiß auf Schwarz anzuzeigen, müssen Sie dem Zeichenwert im Akkumulator vor dem Aufruf von COUT # $ 80 hinzufügen. Da RDKEY Zeichen mit dem Hi-Bit-Satz zurückgibt, löschten Assembly-Programme im Allgemeinen das Bit des Zeichens, um seinen ASCII-Wert zu erhalten, bevor sie es verwendeten.