6502, 12 bytes (13 bytes se Apple II)
6502
O código da máquina pressupõe que um par de locais de zero páginas esteja conectado ao hardware de entrada de caracteres ($ FE) e saída (FF). Muitos sistemas baseados no 6502 facilitam a E / S dessa maneira, embora o endereço de E / S normalmente não esteja na página zero.
Para simplificar, usei o Py65 , um simulador de sistema de microcomputador 6502 escrito em Python.
Aqui está um despejo de memória do Py65. Você pode carregar o código a seguir em qualquer lugar na página zero, para que não se sobreponha 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
Executando em uma janela de comando do Windows, você pode colar (Ctrl + V) qualquer texto que desejar ou simplesmente digitar. Se estiver digitando, pressione Ctrl + J para obter uma nova linha (o mesmo caractere ASCII). Pressione Ctrl + C para interromper o processador e retornar ao prompt de comando Py65.
Naturalmente, o código de montagem é mais fácil de ler.
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 maior clareza, aqui está o código de montagem no 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
O código acima assume que um nulo indica que não há entrada; portanto, continua a pesquisa até que um valor não nulo seja retornado.
Para comparação, o Apple I e o Apple II sinalizam a disponibilidade de um novo caractere, definindo o bit 7 do endereço de E / S do teclado, que precisa ser limpo após a busca do caractere. Nesses sistemas, a E / S de caracteres geralmente é executada chamando as rotinas do monitor do sistema em vez de acessar o hardware diretamente.
Ao chamar RDKEY ($ FD0C) e COUT ($ FDED), o equivalente do Apple II acima pode ser codificado em 13 bytes e é executável em qualquer lugar da RAM. Aqui está o código que eu corri em um emulador da Apple // e, a2ix no Android 9.
Pressionar Return tem o mesmo efeito que uma nova linha.
*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
Você notou que, em vez do valor ASCII normal # $ 21 para o ponto de exclamação, # $ A1 é usado? Isso ocorre porque o envio de valores ASCII padrão para COUT faz com que sejam exibidos no "modo inverso", em preto e branco. A exibição de ASCII em branco normal em preto requer a adição de $ 80 ao valor do caractere no acumulador antes de chamar COUT. Como RDKEY retorna caracteres com o conjunto de hi-bits, os programas de montagem geralmente limpam o bit do caractere para obter seu valor ASCII antes de usá-lo.