6502, 12 byte (13 byte se Apple II)
6502
Il codice macchina presuppone che una coppia di posizioni di pagina zero siano collegate all'hardware di input caratteri ($ FE) e output (FF). Molti sistemi basati su 6502 facilitano l'I / O in questo modo, anche se gli indirizzi I / O di solito non sono nella pagina zero.
Per semplicità, ho usato Py65 , un simulatore di sistema per microcomputer 6502 scritto in Python.
Ecco un dump della memoria da Py65. È possibile caricare il codice seguente in qualsiasi punto della pagina zero in modo che non si sovrapponga a $ FE e $ 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
In esecuzione in una finestra di comando di Windows, puoi incollare (Ctrl + V) tutto il testo che desideri, oppure puoi semplicemente digitare. Se si digita, premere Ctrl + J per una nuova riga (stesso carattere ASCII). Premi Ctrl + C per interrompere il processore e tornare al prompt dei comandi di Py65.
Naturalmente, il codice assembly è più facile da leggere.
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
Per chiarezza, ecco il codice assembly in formato 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
Il codice sopra presuppone che un valore nullo indichi l'assenza di input, quindi continua il polling fino a quando non viene restituito un valore non nullo.
Per fare un confronto, Apple I e Apple II segnalano la disponibilità di un nuovo carattere impostando il bit 7 dell'indirizzo I / O della tastiera, che quindi deve essere cancellato dopo aver recuperato il carattere. Su tali sistemi, l'I / O dei caratteri viene in genere eseguito chiamando le routine di monitoraggio del sistema anziché accedere direttamente all'hardware.
Chiamando RDKEY ($ FD0C) e COUT ($ FDED), l'equivalente Apple II di quanto sopra può essere codificato in 13 byte ed è eseguibile ovunque nella RAM. Ecco il codice che ho eseguito in un emulatore di Apple // e, a2ix su Android 9.
La pressione di Return ha lo stesso effetto di una nuova riga.
*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
Hai notato che al posto del normale valore ASCII # $ 21 per il punto esclamativo, viene utilizzato # $ A1? Questo perché l'invio di valori ASCII standard a COUT li fa visualizzare in "modalità inversa", nero su bianco. La visualizzazione di ASCII in bianco normale su nero richiede l'aggiunta di # $ 80 al valore del carattere nell'accumulatore prima di chiamare COUT. Poiché RDKEY restituisce caratteri con il set hi-bit, i programmi di assemblaggio generalmente hanno cancellato il bit del carattere per ottenere il suo valore ASCII prima di usarlo.