sexta-feira, 26 de agosto de 2022

Teclado

No hardware

<SHIFT>+<RESET>
Conecta-se ao pino ¬RESET ao Z80, reiniciando o MC1000. Isto é implementado diretamente em hardware. A tecla <RESET>, sozinha ou em combinação, é visível na malha do teclado que o MC1000 lê pelo PSG AY-3-8910.

Na rotina SKEY? da ROM

Esta é a rotina padrão de leitura do teclado. Ela tem um comportamento durante o modo BASIC (variável do sistema HEAD = $FF/255) e outro no modo de jogo (HEAD ≠ $FF/255).

Modo BASIC

No teclado do MC1000 nota-se que as teclas <0>, <@>, <↑>, <RETURN>, <SPACE> e <RUBOUT> não têm uso previsto com a tecla <SHIFT>. E <CTRL> provavelmente só deveria ser combinada com letras, <@> e <↑>. Combinações com <SHIFT>+<CTRL> são completamente imprevistas. Os valores retornados nos casos imprevistos são meros efeitos colaterais do cálculo para os casos previstos.

Tecla Código +SHIFT +CTRL +SHIFT +CTRL Tecla Código +SHIFT +CTRL +SHIFT +CTRL Tecla Código +SHIFT +CTRL +SHIFT +CTRL
@ $40/64:@ $60/96:` $00/0:nul $20/32: P $50/80:P $70/112:p $10/16:dle $30/48:0 0 $30/48:0 $20/32: $60/96:` $50/80:P
A $41/65:A $61/97:a $01/1:soh $21/33:! Q $51/81:Q $71/113:q $11/17:dc1 $31/49:1 1 $31/49:1 $21/33:! $61/97:a $51/81:Q
B $42/66:B $62/98:b $02/2:stx $22/34:" R $52/82:R $72/114:r $12/18:dc2 $32/50:2 2 $32/50:2 $22/34:" $62/98:b $52/82:R
C $43/67:C $63/99:c $03/3:etx $23/35:# S $53/83:S $73/115:s $13/19:dc3 $33/51:3 3 $33/51:3 $23/35:# $63/99:c $53/83:S
D $44/68:D $64/100:d $04/4:eot $24/36:$ T $54/84:T $74/116:t $14/20:dc4 $34/52:4 4 $34/52:4 $24/36:$ $64/100:d $54/84:T
E $45/69:E $65/101:e $05/5:enq $25/37:% U $55/85:U $75/117:u $15/21:nak $35/53:5 5 $35/53:5 $25/37:% $65/101:e $55/85:U
F $46/70:F $66/102:f $06/6:ack $26/38:& V $56/86:V $76/118:v $16/22:syn $36/54:6 6 $36/54:6 $26/38:& $66/102:f $56/86:V
G $47/71:G $67/103:g $07/7:bel $27/39:' W $57/87:W $77/119:w $17/23:etb $37/55:7 7 $37/55:7 $27/39:' $67/103:g $57/87:W
H $48/72:H $68/104:h $08/8:bs $28/40:( X $58/88:X $78/120:x $18/24:can $38/56:8 8 $38/56:8 $28/40:( $68/104:h $58/88:X
I $49/73:I $69/105:i $09/9:tab $29/41:) Y $59/89:Y $79/121:y $19/25:em $39/57:9 9 $39/57:9 $29/41:) $69/105:i $59/89:Y
J $4A/74:J $6A/106:j $0A/10:lf $2A/42:* Z $5A/90:Z $7A/122:z $1A/26:sub $3A/58:: : $3A/58:: $2A/42:* $6A/106:j $5A/90:Z
K $4B/75:K $6B/107:k $0B/11:vt $2B/43:+ RETURN $0D/13:cr $7B/123:{ $1B/27:esc $3B/59:; ; $3B/59:; $2B/43:+ $6B/107:k $0D/13:cr
L $4C/76:L $6C/108:l $0C/12:ff $3C/60:< SPACE $20/32: $7C/124:| $1C/28:fs $2C/44:, , $2C/44:, $3C/60:< $6C/108:l $20/32:
M $4D/77:M $6D/109:m $0D/13:cr $3D/61:= RUBOUT $7F/127:del $7D/125:} $1D/29:gs $2D/45:- - $2D/45:- $3D/61:= $6D/109:m $7F/127:del
N $4E/78:N $6E/110:n $0E/14:so $3E/62:> $5E/94: $7E/126:~ $1E/30:rs $2E/46:. . $2E/46:. $3E/62:> $6E/110:n $5E/94:
O $4F/79:O $6F/111:o $0F/15:si $3F/63:? / $2F/47:/ $3F/63:? $6F/111:o $5F/95:

Modo de jogo

As seguintes teclas e combinações retornam valores diferentes:

Tecla Código +SHIFT +CTRL +SHIFT +CTRL Tecla Código +SHIFT +CTRL +SHIFT +CTRL Tecla Código +SHIFT +CTRL +SHIFT +CTRL
RETURN $5B/91:[ ; $5B/91:[
L $2C/44:, SPACE $5C/92:\ $3C/60:< , $3C/60:< $2C/44:, $5C/92:\
M $2D/45:- RUBOUT $5D/93:] $3D/61:= - $3D/61:= $2D/45:- $5D/93:]
N $2E/46:. $3E/62:> . $3E/62:> $2E/46:.
O $2F/47:/ / $3F/63:? $2F/47:/

(Onde não houver valor indicado, o valor é o mesmo da tabela anterior.)

Note-se que a combinação <CTRL>+<H> é automaticamente capturada por SKEY?, disparando a rotina de alteração do "tópico do jogo".

Na rotina GETL da ROM

Esta rotina é usada pelo interpretador BASIC para ler uma linha de comando e para obter resposta a comando INPUT.

Internamente os caracteres vão sendo armazenados no buffer de linha ($0100–$01FF).

A teclas e combinações de teclas abaixo são "consumidas" pela rotina e acabam não fazendo parte da linha digitada.

<RETURN> ou <CTRL>+<M>
Insere um caracter CHR$(0) no buffer de linha na posição do cursor, emite uma quebra de linha e termina a rotina GETL. O caracter CHR$(0) marca o fim da linha digitada, portanto, se o cursor foi movido com as teclas de movimento abaixo, tudo o que foi digitado e que ficou da posição do cursor até o fim da linha será descartado.
<CTRL>+<H>, <CTRL>+<J>, <CTRL>+<K> e <CTRL>+<L>
Durante a digitação de uma linha no modo direto ou resposta a um comando INPUT, movimentam o cursor dentro do espaço dos caracteres já digitados, respectivamente para a esquerda, para baixo, para cima e para a direita. Devido ao bug na impressão do caracter de controle CHR$(12), o cursor não anda para a direita, consequentemente este recurso para a digitação da linha não funciona a contento e nem é mencionado no manual do BASIC.
<RUBOUT>
Embora a tecla gere um código diferente, seu comportamento aqui é igual à combinação <CTRL>+<H>: movimenta o cursor para a esquerda sem apagar os caracteres na tela.
<CTRL>+<C>
Emite uma quebra de linha, desativa a geração automática de número de linhas (instrução AUTO do BASIC), ativa o flag de carry do Z80 (para sinalizar o cancelamento da digitação) e termina a rotina GETL e emite uma quebra de linha. Diferentemente de <RETURN>, devolve o flag de carry do Z80 ligado para indicar que foi pressionado <CTRL>+<C>. Também desliga a geração automática de número de linhas do comando AUTO.
<@> ou <CTRL>+<U>

Durante a digitação de uma linha em modo direto ou resposta a um comando INPUT, descarta o que já foi digitado, emite uma quebra de linha e aguarda nova digitação.

Esse uso da tecla <@> remonta ao BASIC da Microsoft para Altair 8800. Vide http://www.altair32.com/pdf/Altair_8800_BASIC_Reference_Manual_1975.PDF, página 41.

<CTRL>+<↑>
Limpa a tela e move o cursor para o canto superior esquerdo da tela.
<CTRL>+<@>
Esta combinação de teclas gera CHR$(0). Como GETL usa CHR$(0) para marcar o fim da linha digitada, a rotina substitui o <CTRL>+<@> digitado pelo usuário pelo caracter "8" (aparentemente, uma escolha arbitrária).

No interpretador BASIC

Note-se que ao ler uma linha do teclado (linha entrada em modo direto, resposta a comando INPUT) o interpretador BASIC usa a rotina GETL, então as combinações de tecla acima valem nessas situações. Além disso:

<CTRL>+<C>
  • Durante a execução de um programa, interrompe a execução com a mensagem "PAUSA EM <número de linha>" e volta ao modo direto. A execução do programa pode ser retomada de onde parou com o comando CONT.
  • Durante a execução de uma linha de comandos em modo direto, interrompe a execução com a mensagem "PAUSA".
  • Durante a execução de um comando LIST, interrompe a listagem com a mensagem "PAUSA".
<CTRL>+<S>
Durante a execução de um programa, execução de uma linha de comandos em modo direto ou execução de um comando LIST, inicia uma pausa até que outra tecla seja pressionada.

Nenhum comentário:

Postar um comentário

"MC-1000", "MC 1000" ou "MC1000"?

No gabinete do computador, nos acessórios e nos materiais impressos (caixa, capas dos manuais, rótulos e capas das fitas, propagandas etc.) ...