6502, 12 octets (13 octets si Apple II)
6502
Le code machine suppose qu'une paire d'emplacements de page zéro est connectée au matériel d'entrée de caractères ($ FE) et de sortie (FF). De nombreux systèmes basés sur 6502 facilitent les E / S de cette manière, bien que les adresses d'E / S ne soient généralement pas à zéro page.
Pour plus de simplicité, j'ai utilisé Py65 , un simulateur de système de micro-ordinateur 6502 écrit en Python.
Voici un vidage de mémoire de Py65. Vous pouvez charger le code suivant n'importe où dans la page zéro de sorte qu'il ne chevauche pas $ FE et $ 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
En cours d'exécution dans une fenêtre de commande Windows, vous pouvez coller (Ctrl + V) tout texte que vous désirez, ou vous pouvez simplement taper. Si vous tapez, appuyez sur Ctrl + J pour une nouvelle ligne (même caractère ASCII). Appuyez sur Ctrl + C pour interrompre le processeur et revenir à l'invite de commande Py65.
Naturellement, le code assembleur est plus facile à lire.
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
Pour plus de clarté, voici le code assembleur au format 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
Le code ci-dessus suppose qu'un null indique qu'il n'y a pas d'entrée, donc continue l'interrogation jusqu'à ce qu'une valeur non nulle soit renvoyée.
À titre de comparaison, l'Apple I et l'Apple II signalent la disponibilité d'un nouveau caractère en définissant le bit 7 de l'adresse d'E / S du clavier, qui doit ensuite être effacé après la récupération du caractère. Sur ces systèmes, les E / S de caractères sont généralement effectuées en appelant des routines de surveillance du système au lieu d'accéder directement au matériel.
En appelant RDKEY ($ FD0C) et COUT ($ FDED), l'équivalent Apple II de ce qui précède peut être codé en 13 octets et peut être exécuté n'importe où dans la RAM. Voici le code que j'ai exécuté dans un émulateur Apple // e, aix sur Android 9.
Appuyez sur Retour a le même effet qu'une nouvelle ligne.
*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
Avez-vous remarqué qu'au lieu de la valeur ASCII normale # $ 21 pour le point d'exclamation, # $ A1 est utilisé à la place? En effet, l'envoi de valeurs ASCII standard à COUT provoque leur affichage en «mode inverse», noir sur blanc. L'affichage de l'ASCII en blanc normal sur noir nécessite d'ajouter # $ 80 à la valeur de caractère dans l'accumulateur avant d'appeler COUT. Parce que RDKEY renvoie des caractères avec le jeu de bits, les programmes d'assemblage ont généralement effacé le bit du caractère pour obtenir sa valeur ASCII avant de l'utiliser.