6502, 12 bytes (13 bytes si Apple II)
6502
El código de máquina supone que un par de ubicaciones de página cero están conectadas al hardware de entrada de caracteres ($ FE) y de salida (FF). Muchos sistemas basados en 6502 facilitan la E / S de esta manera, aunque la dirección de E / S generalmente no está en la página cero.
Para simplificar, usé Py65 , un simulador de sistema de microordenador 6502 escrito en Python.
Aquí hay un volcado de memoria de Py65. Puede cargar el siguiente código en cualquier lugar de la página cero para que no se superponga $ FE y $ 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
Al ejecutarse en una ventana de comandos de Windows, puede pegar (Ctrl + V) cualquier texto que desee, o simplemente puede escribir. Si escribe, presione Ctrl + J para una nueva línea (mismo carácter ASCII). Presione Ctrl + C para interrumpir el procesador y volver al símbolo del sistema Py65.
Naturalmente, el código de ensamblaje es más fácil de leer.
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
Para mayor claridad, aquí está el código de ensamblaje en 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
Manzana II
El código anterior supone que un valor nulo indica que no hay entrada, por lo que continúa sondeando hasta que se devuelve un valor no nulo.
A modo de comparación, Apple I y Apple II señalan la disponibilidad de un nuevo carácter al configurar el bit 7 de la dirección de E / S del teclado, que luego debe borrarse después de recuperar el carácter. En esos sistemas, la E / S de caracteres generalmente se realiza llamando a rutinas de monitoreo del sistema en lugar de acceder directamente al hardware.
Al llamar a RDKEY ($ FD0C) y COUT ($ FDED), el equivalente de Apple II de lo anterior se puede codificar en 13 bytes y se puede ejecutar en cualquier lugar de la RAM. Aquí está el código que ejecuté en un emulador Apple // e, a2ix en Android 9.
Presionar Retorno tiene el mismo efecto que una nueva línea.
*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
¿Notó que en lugar del valor ASCII normal # $ 21 para el signo de exclamación, en su lugar se usa # $ A1? Esto se debe a que enviar valores ASCII estándar a COUT hace que se muestren en "modo inverso", negro sobre blanco. Mostrar ASCII en blanco normal sobre negro requiere agregar # $ 80 al valor de caracteres en el acumulador antes de llamar a COUT. Debido a que RDKEY devuelve caracteres con el conjunto hi-bit, los programas de ensamblaje generalmente borran el bit del carácter para obtener su valor ASCII antes de usarlo.