Rotinas da BIOS do MSX


  Descrição de cada item da instrução:

  1. Gerais


  CHKRAM
Ponteiro:  0000H
Endereço:  02D7H
Entrada:   Nada
Saída:     Nada
Modifica:  AF, BC, DE, HL, SP
  Rotina de inicialização do MSX.


  RDSLT
Ponteiro:  000CH
Endereço:  01B6H
Entrada:   A=Slot ID, HL=Endereço
Saída:     A=Byte lido
Modifica:  AF, BC, DE, DI
  Rotina para ler um byte em qualquer slot/subslot.

  Descrição do Slot ID:
     7       6       5       4       3       2       1       0
 ┌───────┬───────┬───────┬───────┬───────────────┬───────────────┐
 │ Flag  │   0   │   0   │   0   │Slot secundário│ Slot primário │
 └───────┴───────┴───────┴───────┴───────────────┴───────────────┘
  O flag, se 1, indica que o slot secundário é utilizado.
  Qualquer tentativa de leitura na área de trabalho (página 3) fará o sistema travar.


  WRSLT
Ponteiro:  0014H
Endereço:  01D1H
Entrada:   A=Slot ID, HL=Endereço, E=Byte a ser escrito
Saída:     Nada
Modifica:  AF, BC, D, DI
  Rotina para escrever um byte em qualquer slot/subslot. Funcionamento semelhante ao do RDSLT.

  Exemplo de como escrever o byte 07H no endereço 4000H do slot 1, subslot 2:
10 ORG &HC000
20 LD A,&B10001001  ; Slot: 01, Subslot: 10
30 LD HL,&H4000
40 LD E,7
50 CALL &H14
60 RET

  OUTDO
Ponteiro:  0018H
Endereço:  1B45H
Entrada:   A=Caractere a enviar
Saída:     Nada
Modifica:  EI
  Rotina utilizada pelo interpretador Basic para enviar um caracter ao dispositivo corrente.


  CALSLT
Ponteiro:  001CH
Endereço:  0217H
Entrada:   IY(Byte mais alto)=Slot ID, IX=Endereço
Saída:     Nada
Modifica:  AF', BC', DE', HL', DI
  Chama uma rotina em qualquer slot. Os parâmetros são passados pelos registradores.


  DCOMPR
Ponteiro:  0020H
Endereço:  146AH
Entrada:   HL, DE
Saída:     Flag NC se HL>DE, Flag Z se HL=DE, Flag C se HL<DE
Modifica:  AF
  Rotina utilizada pelo interpretador Basic para comparar os registradores HL e DE.


  ENASLT
Ponteiro:  0024H
Endereço:  025EH
Entrada:   A=Slot ID, HL=Endereço
Saída:     Nada
Modifica:  AF, BC, DE, DI
  Troca em definitivo a página correspondente ao endereço HL para o slot/subslot determinado.
  A tentativa de troca na página 0 fará com que o sistema trave.


  CALLF
Ponteiro:  0030H
Endereço:  0205H
Entrada:   Nada
Saída:     Nada
Modifica:  AF', BC', DE', HL', IX, IY, DI
  Chama uma rotina em qualquer slot. Nesse caso, os parâmetros são passados como linhas de modo a caber dentro de um hook.
  Exemplo [1]:
10 ORG &HC000
20 RST 30H
40 DEFB Slot ID
50 DEFW Address
70 RET

  KEYINT
Ponteiro:  0030H
Endereço:  0C3CH
Entrada:   Nada
Saída:     Nada
Modifica:  EI
  Rotina padrão para processar as interrupções do Z80.


  2. Inicializações de E/S


  INITIO
Ponteiro:  003BH
Endereço:  049DH
Entrada:   Nada
Saída:     Nada
Modifica:  AF, E, EI
  Rotina para inicialização do PSG.


  INIFNK
Ponteiro:  003EH
Endereço:  139DH
Entrada:   Nada
Saída:     Nada
Modifica:  BC, DE, HL
  Reinicializa as teclas de função F1-F10 para os valores padrão.

  A partir do endereço 13A9H da BIOS (MSX 1), estão contidas as strings para as 10 teclas de função, cada um contendo 16 bytes. Caracteres não usados possuem valor igual a 0.
10 EI=&H13A9
20 FOR K=1 TO 10
30 E=EI+(K-1)*16
40 PRINT "KEY";K;": ";
50 FOR P=0 TO 15
60 C=PEEK(E+P)
70 IF C=13 THEN PRINT "<CR>"; ELSE PRINT CHR$(C);
80 NEXT P:PRINT:NEXT K


  3. VDP - Gráficos


  DISSCR
Ponteiro:  0041H
Endereço:  0577H
Entrada:   Nada
Saída:     Nada
Modifica:  AF, BC, EI
  Desabilita a exibição do conteúdo da tela. Faz o bit 6 do resgitrador 1 do VDP igual a 0.


  ENASCR
Ponteiro:  0044H
Endereço:  0570H
Entrada:   Nada
Saída:     Nada
Modifica:  AF, BC, EI
  Habilita a exibição do conteúdo da tela. Faz o bit 6 do resgitrador 1 do VDP igual a 1.

  Exemplo - as duas rotinas em Assembly:
End.  Código     Mnemônicos
C000             10 ORG &HC000
C000  CD 41 00   20 CALL &H41
C003  C9         30 RET
C004  CD 44 00   40 CALL &H44
C007  C9         50 RET
  Um programa em Basic para testar:
10 SCREEN 2
20 DEFUSR1=&HC000 : DEFUSR2=&HC004
30 FOR I=0 TO 7
40 READ A$
50 POKE &HC000+I,VAL("&H"+A$)
60 NEXT
70 X=USR1(0) : ' Chama rotina DISSCR
80 CIRCLE(128,95),50,15
90 PAINT(128,95),15
100 A$=INPUT$(1)
110 X=USR2(0) : ' Chama rotina ENASCR
120 GOTO 120
130 DATA CD,41,00,C9,CD,44,00,C9
  O programa chama a rotina que desabilita a visualização da tela. Logo em seguida, desenha um círculo e o pinta. Então, o programa aguarda a tecla "enter" ser pressionada. Finalmente, a rotina que habilita a tela é chamada e o círculo torna-se visível.


  WRTVDP
Ponteiro:  0047H
Endereço:  057FH
Entrada:   B=Byte de dado, C=Número do registro de modo do VDP
Saída:     Nada
Modifica:  AF, B, EI
  Escreve um dado em um registro qualquer do VDP.


  RDVRM
Ponteiro:  004AH
Endereço:  07D7H
Entrada:   HL=Endereço VRAM
Saída:     A=Byte de dado
Modifica:  AF, EI
  Lê um dado da VRAM.


  WRTVRM
Ponteiro:  004DH
Endereço:  07CDH
Entrada:   A=Byte de dado, HL=Endereço VRAM
Saída:     Nada
Modifica:  EI
  Escreve um dado na VRAM.


  SETRD
Ponteiro:  0050H
Endereço:  07ECH
Entrada:   HL=Endereço VRAM
Saída:     Nada
Modifica:  AF, EI
  Habilita ao VDP leituras sucessivas pela porta de dados do VDP.


  SETWRT
Ponteiro:  0053H
Endereço:  07DFH
Entrada:   HL=Endereço VRAM
Saída:     Nada
Modifica:  AF, EI
  Habilita ao VDP escritas sucessivas pela porta de dados do VDP.


  FILVRM
Ponteiro:  0056H
Endereço:  0815H
Entrada:   A=Byte de dado, BC=Comprimento, HL=Endereço VRAM
Saída:     Nada
Modifica:  AF, BC, EI
  Preenche um bloco da VRAM com o mesmo valor.


  LDIRMV
Ponteiro:  0059H
Endereço:  070FH
Entrada:   BC=Comprimento, DE=Endereço RAM, HL=Endereço VRAM
Saída:     Nada
Modifica:  AF, BC, DE, EI
  Copia um bloco da VRAM para a RAM.


  LDIRVM
Ponteiro:  005CH
Endereço:  0744H
Entrada:   BC=Comprimento, DE=Endereço VRAM, HL=Endereço RAM
Saída:     Nada
Modifica:  AF, BC, DE, HL, EI
  Copia um bloco da RAM para a VRAM.


  CHGMOD
Ponteiro:  005FH
Endereço:  084FH
Entrada:   A=Screen (0-8)
Saída:     Nada
Modifica:  AF, BC, DE, HL, EI
  Muda o modo de tela do MSX 1 e 2.

  Teste em Basic para chamar a screen 8 e desenhar um círculo:
10 POKE &HC000,&H3E : ' LD A,8
20 POKE &HC001,&H08
30 POKE &HC002,&HCD : ' CALL &H5F
40 POKE &HC003,&H5F
50 POKE &HC004,0
60 POKE &HC005,&HC9 : ' RET
70 DEFUSR=&HC000:X=USR(0)
80 CIRCLE(128,95),50,255
90 GOTO 90

  CHGCLR
Ponteiro:  0062H
Endereço:  07F7H
Entrada:   Nada
Saída:     Nada
Modifica:  AF, BC, HL, EI
  Ajusta as cores do VDP. Ele verifica as variáveis de sistema FORCLR (F3E9H) e BAKCLR (F3EAH) para todos os modos e BDRCLR (F3EBH) para os modos graficos.

  Exemplo de como mudar as cores de frente para azul (5) e fundo cinza (14):
End.  Código     Mnemônicos
C000             10 ORG &HC000
C000  3E 05      20 LD A,5
C002  32 E9 F3   30 LD (&HF3E9),A  ; Frente
C005  3E 0E      40 LD A,14
C007  32 EA F3   50 LD (&HF3EA),A  ; Fundo
C00A  CD 62 00   60 CALL &H62
C00D  C9         70 RET

  NMI
Ponteiro:  0066H
Endereço:  1398H
Entrada:   Nada
Saída:     Nada
Modifica:  Nada
  Processa uma interrupção não mascarada do Z80.


  CLRSPR
Ponteiro:  0069H
Endereço:  06A8H
Entrada:   Nada
Saída:     Nada
Modifica:  AF, BC, DE, HL, EI
  Rotina para limpar todos os sprites.


  INITXT
Ponteiro:  006CH
Endereço:  050EH
Entrada:   Nada
Saída:     Nada
Modifica:  AF, BC, DE, HL, EI
  Rotina para inicialização da screen 0.


  INIT32
Ponteiro:  006FH
Endereço:  0538H
Entrada:   Nada
Saída:     Nada
Modifica:  AF, BC, DE, HL, EI
  Rotina para inicialização da screen 1.


  INIGRP
Ponteiro:  0072H
Endereço:  05D2H
Entrada:   Nada
Saída:     Nada
Modifica:  AF, BC, DE, HL, EI
  Rotina para inicialização da screen 2 (modo gráfico).


  INIMLT
Ponteiro:  0075H
Endereço:  061FH
Entrada:   Nada
Saída:     Nada
Modifica:  AF, BC, DE, HL, EI
  Rotina para inicialização da screen 3 (modo multicolor).


  SETTXT
Ponteiro:  0078H
Endereço:  0594H
Entrada:   Nada
Saída:     Nada
Modifica:  AF, BC, DE, HL, EI
  Rotina para ajuste parcial do VDP para a screen 0.


  SETT32
Ponteiro:  007BH
Endereço:  05B4H
Entrada:   Nada
Saída:     Nada
Modifica:  AF, BC, DE, HL, EI
  Rotina para ajuste parcial do VDP para a screen 1.


  SETGRP
Ponteiro:  007EH
Endereço:  05D2H
Entrada:   Nada
Saída:     Nada
Modifica:  AF, BC, DE, HL, EI
  Rotina para ajuste parcial do VDP para a screen 2 (modo gráfico).


  SETMLT
Ponteiro:  0081H
Endereço:  061FH
Entrada:   Nada
Saída:     Nada
Modifica:  AF, BC, DE, HL, EI
  Rotina para ajuste parcial do VDP para a screen 3 (modo multicolor).

  Programa em Basic para testar a rotina INIMLT:
10 POKE &HC000,&HCD : ' CALL &H75
20 POKE &HC001,&H75
30 POKE &HC002,0
40 POKE &HC003,&HC9 : ' RET
50 DEFUSR=&HC000:X=USR(0)
60 CIRCLE(128,95),50,15
70 GOTO 70
  O programa chama a rotina que inicia a screen 3 e depois desenha um círculo.


  CALPAT
Ponteiro:  0084H
Endereço:  06E4H
Entrada:   A=Número do padrão
Saída:     HL=Endereço dos padrões do sprite
Modifica:  AF, DE, HL
  Rotina para calcular o endereço dos padrões do sprite.

  O padrão do sprite é definido por 8 bytes no modo 8x8 e por 32 bytes no modo 16x16.
  Exemplo de padrão para um sprite 8x8 (valores em binário):
00111000 - Byte 0
01111100 - Byte 1
11111110 - Byte 2
11111110 - Byte 3
11111110 - Byte 4
01111100 - Byte 5
00111000 - Byte 6
00000000 - Byte 7

  CALATR
Ponteiro:  0087H
Endereço:  06F9H
Entrada:   A=Número do sprite
Saída:     HL=Endereço dos atributos do sprite
Modifica:  AF, DE, HL
  Rotina para calcular o endereço dos atributos do sprite.

  Os atributos de cada sprite são definidos por 4 bytes, onde:
Byte 0 - Coordenada Y (topo da tela = 255, Y=Y+1)
Byte 1 - Coordenada X
Byte 2 - Número do padrão (qual padrão usar)
Byte 3 - | EC | 0 | 0 | 0 | Código da cor |
  EC - Se 1, desloca o sprite 32 pontos à esquerda de X.


  GSPSIZ
Ponteiro:  008AH
Endereço:  0704H
Entrada:   Nada
Saída:     A=Bytes para o padrão do sprite (8 ou 32)
Modifica:  AF
  Obtém o tamanho do sprite.


  GRPPRT
Ponteiro:  008DH
Endereço:  1510H
Entrada:   A=Caractere
Saída:     Nada
Modifica:  EI
  Imprime um caratere em uma screen gráfica. Os caracteres menor que 20H são ignorados, exceto o return (0DH).
  As variáveis de sistema GRPACX (FCB7H) e GRPACY (FCB9H) definem a coordenada da tela.



  4. PSG - Sons


  GICINI
Ponteiro:  0090H
Endereço:  04BDH
Entrada:   Nada
Saída:     Nada
Modifica:  EI
  Rotina para inicialização do PSG, mais a área de trabalho do comando "PLAY".


  WRTPSG
Ponteiro:  0093H
Endereço:  1102H
Entrada:   A=Número do registro, E=Byte de dado
Saída:     Nada
Modifica:  EI
  Escreve um dado em um registro do PSG.


  RDPSG
Ponteiro:  0096H
Endereço:  110EH
Entrada:   A=Número do registro
Saída:     A=Dado lido do PSG
Modifica:  A
  Lê um dado de um registro do PSG.


  STRTMS
Ponteiro:  0099H
Endereço:  11C4H
Entrada:   Nada
Saída:     Nada
Modifica:  AF, HL
  Rotina utilizada pelo comando "PLAY" para desenfileirar o buffer da música.



  5. Teclado


  CHSNS
Ponteiro:  009CH
Endereço:  0D6AH
Entrada:   Nada
Saída:     Flag NZ se houver caracteres no buffer de teclado
Modifica:  AF, EI
  Testa o estado do buffer de teclado. Equivalente ao teste em Basic: INKEY$<>"".


  CHGET
Ponteiro:  009FH
Endereço:  10CBH
Entrada:   Nada
Saída:     A=Caracter do teclado
Modifica:  AF, EI
  Espera por um caractere do teclado. Equivalente ao comando em Basic: A$=INPUT$(1).


  CHPUT
Ponteiro:  00A2H
Endereço:  08BCH
Entrada:   A=Caracter
Saída:     Nada
Modifica:  EI
  Imprime um caracter no modo de tela de texto. A posição do cursor é definida por POSIT.


  LPTOUT
Ponteiro:  00A5H
Endereço:  085DH
Entrada:   A=Caracter a imprimir
Saída:     Flag C, se CONTROL+STOP foi pressionado
Modifica:  AF
  Imprime um caracter na impressora.


  LPTSTT
Ponteiro:  00A8H
Endereço:  0884H
Entrada:   Nada
Saída:     A=0 e Flag Z se a impressora estiver ocupada
Modifica:  AF
  Imprime um caracter na impressora.


  CNVCHR
Ponteiro:  00ABH
Endereço:  089DH
Entrada:   A=Caracter
Saída:     Flag Z,NC=Cabeçalho; Flag NZ,C=Gráfico; Flag Z,C=Normal
Modifica:  AF
  Rotina utilizada por outras para verificar se um código ASCII deve ser utilizado como gráfico em vez de controle (00H-20H). Por exemplo, o código 0DH é utilizado como return. Entretanto, a seqüência 01H 40H+código define que ele deve ser utilizado como gráfico. A rotina CNVCHR tem como por objetivo verificar essa seqüẽncia.

  Exemplo de como imprimir o return (13) como gráfico:
10 ORG &HC000
20 LD A,&H01
30 CALL &H2A  ; CALL CHPUT
40 LD A,&H4D
50 CALL &H2A  ; CALL CHPUT
60 RET

  PINLIN
Ponteiro:  00AEH
Endereço:  23BFH
Entrada:   Nada
Saída:     HL=Inicio do texto, Flag C se o CONTROL+STOP foi pressionado
Modifica:  AF, BC, DE, HL, EI
  Utilizado pelo interpretador Basic para coletar uma linha de texto do console.


  INLIN
Ponteiro:  00B1H
Endereço:  23D5H
Entrada:   Nada
Saída:     HL=Inicio do texto, Flag C se o CONTROL+STOP foi pressionado
Modifica:  AF, BC, DE, HL, EI
  Obtém linha do console (line input).


  QINLIN
Ponteiro:  00B1H
Endereço:  23CCH
Entrada:   Nada
Saída:     HL=Inicio do texto, Flag C se o CONTROL+STOP foi pressionado
Modifica:  AF, BC, DE, HL, EI
  Mostra "?", obtém linha do console (input).


  BREAKX
Ponteiro:  00B7H
Endereço:  046FH
Entrada:   Nada
Saída:     Flag C se CONTROL+STOP pressionado
Modifica:  AF
  Testa as linhas 6 e 7 do teclado de modo a verificar se as teclas CONTROL+STOP foram pressionadas.


  ISCNTC
Ponteiro:  00BAH
Endereço:  03FBH
Entrada:   Nada
Saída:     Nada
Modifica:  AF, EI
  Rotina utilizada pelo interpretador Basic para verificar se as teclas CONTROL+STOP foram pressionadas.


  CKCNTC
Ponteiro:  00BDH
Endereço:  10F9H
Entrada:   Nada
Saída:     Nada
Modifica:  AF, EI
  Rotina utilizada pelo interpretador Basic para verificar se as teclas CONTROL+STOP foram pressionadas.


  BEEP
Ponteiro:  00C0H
Endereço:  1113H
Entrada:   Nada
Saída:     Nada
Modifica:  AF, BC, E, EI
  Dá um BEEP.


  CLS
Ponteiro:  00C3H
Endereço:  0848H
Entrada:   Flag Z
Saída:     Nada
Modifica:  AF, BC, DE, EI
  Apaga a tela.


  POSIT
Ponteiro:  00C6H
Endereço:  088EH
Entrada:   H=Coluna, L=Linha
Saída:     Nada
Modifica:  AF, EI
  Define a posição do cursor.


  FNKSB
Ponteiro:  00C9H
Endereço:  0B26H
Entrada:   Nada
Saída:     Nada
Modifica:  AF, BC, DE, EI
  Verifica se as teclas de função estão ativas.


  ERAFNK
Ponteiro:  00CCH
Endereço:  0B15H
Entrada:   Nada
Saída:     Nada
Modifica:  AF, DE, EI
  Apaga a exibição das teclas de função.


  DSPFNK
Ponteiro:  00CFH
Endereço:  0B2BH
Entrada:   Nada
Saída:     Nada
Modifica:  AF, BC, DE, EI
  Mostra as teclas de função.


  TOTEXT
Ponteiro:  00D2H
Endereço:  083BH
Entrada:   Nada
Saída:     Nada
Modifica:  AF, BC, DE, HL, EI
  Rotina utilizada pelo interpretador Basic para retornar à tela no modo de texto.



  6. Joysticks


  GTSTCK
Ponteiro:  00D5H
Endereço:  11EEH
Entrada:   A=ID do joystick (0, 1 ou 2)
Saída:     A=Código de posição do joystick
Modifica:  AF, B, DE, HL, EI
  Lê o estado dos cursores do teclado (0) ou joystick (1 ou 2).

  Códigos do joystick:
    1
  8 │ 2
   ╲│╱
 7──0──3
   ╱│╲
  6 │ 4
    5

  GTTRIG
Ponteiro:  00D8H
Endereço:  1253H
Entrada:   A=ID do botão (0, 1, 2, 3 ou 4)
Saída:     A=Código de estado
Modifica:  AF, BC, EI
  Obtém o estado da barra de espaços ou botões dos joysticks.

  ID do botão:
0 - Barra de espaços
1 - Joystick 1, botão 1
2 - Joystick 1, botão 2
3 - Joystick 2, botão 1
4 - Joystick 2, botão 2
  Se o valor retornado for FFH, o botão/espaço foi pressionado. Senão, retorna 00H.


  GTPAD
Ponteiro:  00DBH
Endereço:  12ACH
Entrada:   A=Código de função (0 a 7)
Saída:     A=Estado ou valor
Modifica:  AF, BC, DE, HL, EI
  Obtém o estado do touch pad acoplado a uma porta de joystick.


  GTPDL
Ponteiro:  00DEH
Endereço:  1273H
Entrada:   A=ID do paddle (1 a 12)
Saída:     A=Valor do paddle (0 a 255)
Modifica:  AF, BC, DE, EI
  Obtém o estado do paddle acoplado a uma porta de joystick.



  7. Cassete


  TAPION
Ponteiro:  00E1H
Endereço:  1A63H
Entrada:   Nada
Saída:     Flag C, se CONTROL+STOP foi pressionado
Modifica:  AF, BC, DE, HL, DI
  Rotina para ligar o motor do gravador, ler a fita até encontrar o cabeçalho.


  TAPIN
Ponteiro:  00E4H
Endereço:  1ABCH
Entrada:   Nada
Saída:     A=Byte lido, Flag C, se CONTROL+STOP foi pressionado
Modifica:  AF, BC, DE, L
  Rotina para ligar o motor do gravador, ler a fita até encontrar o cabeçalho.


  TAPIN
Ponteiro:  00E4H
Endereço:  1ABCH
Entrada:   Nada
Saída:     A=Byte lido, Flag C, se CONTROL+STOP foi pressionado ou erro de E/S
Modifica:  AF, BC, DE, L
  Rotina para ler a fita byte a byte.


  TAPIOF
Ponteiro:  00E7H
Endereço:  19E9H
Entrada:   Nada
Saída:     Nada
Modifica:  EI
  Rotina para desligar o motor do gravador, após leitura dos dados.


  TAPOON
Ponteiro:  00EAH
Endereço:  19F1H
Entrada:   A=Comprimento do cabeçalho
Saída:     Flag C, se CONTROL+STOP foi pressionado
Modifica:  AF, BC, HL, DI
  Rotina para ligar o motor do gravador, esperar 550 ms para a fita funcionar e gravar o cabeçalho. Comprimento do cabeçalho: curto, se A=0, longo se A≠0.


  TAPOUT
Ponteiro:  00EDH
Endereço:  1A19H
Entrada:   A=Byte de dado
Saída:     Flag C, se CONTROL+STOP foi pressionado
Modifica:  AF, B, HL
  Rotina para gravar um byte no cassete.


  TAPOOF
Ponteiro:  00F0H
Endereço:  19DDH
Entrada:   Nada
Saída:     Nada
Modifica:  EI
  Rotina para desligar o motor do gravador, após a gravação de dados.


  STMOTR
Ponteiro:  00F3H
Endereço:  1384H
Entrada:   A=Código do motor ligado/desligado
Saída:     Nada
Modifica:  AF
  Rotina para ligar/desligar o motor do gravador. Valores: 00H = desliga, 01H = liga, FFH = inverte o estado.



  8. Fila da música


  LFTQ
Ponteiro:  00F6H
Endereço:  14EBH
Entrada:   A=Número da fila
Saída:     HL=Espaço livre na fila
Modifica:  AF, BC, HL
  Retorna o espaço livre em uma determinada fila de música.


  PUTQ
Ponteiro:  00F9H
Endereço:  1492H
Entrada:   A=Número da fila, E=Byte de dado
Saída:     Flag Z, se a fila estiver cheia
Modifica:  AF, BC, HL
  Coloca um dado em uma das três filas de música.



  9. Gráficas


  RIGHTC
Ponteiro:  00FCH
Endereço:  16C5H
Entrada:   Nada
Saída:     Nada
Modifica:  AF
  Move o cursor do pixel uma posição à direita, no modo gráfico.


  LEFTC
Ponteiro:  00FFH
Endereço:  16EEH
Entrada:   Nada
Saída:     Nada
Modifica:  AF
  Move o cursor do pixel uma posição à esquerda, no modo gráfico.


  UPC
Ponteiro:  0102H
Endereço:  175DH
Entrada:   Nada
Saída:     Nada
Modifica:  AF
  Move o cursor do pixel uma posição para cima, no modo gráfico.


  TUPC
Ponteiro:  0105H
Endereço:  173CH
Entrada:   Nada
Saída:     Flag C, se fora da tela
Modifica:  AF
  Move o cursor do pixel uma posição para cima, no modo gráfico. Se ultrapassar o limite da tela, o flag C indica e o valor da posição não é alterado.


  DOWNC
Ponteiro:  0108H
Endereço:  172AH
Entrada:   Nada
Saída:     Nada
Modifica:  AF
  Move o cursor do pixel uma posição para baixo, no modo gráfico.


  TDOWNC
Ponteiro:  010BH
Endereço:  170AH
Entrada:   Nada
Saída:     Flag C, se fora da tela
Modifica:  AF
  Move o cursor do pixel uma posição para baixo, no modo gráfico. Se ultrapassar o limite da tela, o flag C indica e o valor da posição não é alterado.


  SCALXY
Ponteiro:  010EH
Endereço:  1599H
Entrada:   BC=Coordenada X, DE=Coordenada Y
Saída:     Flag NC, se fora da tela
Modifica:  AF
  Ajusta um par de coordenadas X,Y para dentro da tela, caso caia fora dos limites dela.


  MAPXYC
Ponteiro:  0111H
Endereço:  15DFH
Entrada:   BC=Coordenada X, DE=Coordenada Y
Saída:     Nada
Modifica:  AF, D, HL
  Converte um par de coordenadas gráficas em endereço físico para o pixel corrente.

  Programa exemplo:
End   Código   Mnemônicos

                5 CHGMOD: EQU &H5F
                6 GRPPRT: EQU &H8D
                7 MAPXYC: EQU &H111
                8 CHGET: EQU &H9F
C000           10 ORG &HC000
C000 3E 02     20 LD A,2
C002 CD 5F 00  30 CALL CHGMOD  ; Screen 2
C005 01 0A 00  40 LD BC,10     ; X=10
C008 11 0A 00  50 LD DE,10     ; Y=10
C00B CD 11 01  60 CALL MAPXYC  ; PRESET(X,Y)
C00E 3E 41     70 LD A,65
C010 CD 8D 00  80 CALL GRPPRT  ; PRINT#1,"A"
C013 CD 9F 00  90 CALL CHGET
C016 AF        100 XOR A
C017 CD 5F 00  110 CALL CHGMOD
C01A C9        120 RET
  O programa chama a screen 2, ajusta o cursor para a posição 10,10 da tela e escreve a letra "A". Então, espera por uma tecla do usuário e por fim volta à screen 0.

  Obs: a rotina GRPPRT avança 8 pixels quando escreve um caractere na tela gráfica.


  FETCHC
Ponteiro:  0114H
Endereço:  1639H
Entrada:   Nada
Saída:     A=CMASK, HL=CLOC
Modifica:  A, HL
  Obtém o endereço físico do pixel corrente.

  A variável de sistema CLOC (F92AH, 2 bytes) contém o endereço físico do pixel, enquanto que CMASK (F92CH) é uma máscara que define a localização daquele pixel no byte.


  STOREC
Ponteiro:  0117H
Endereço:  1640H
Entrada:   A=CMASK, HL=CLOC
Saída:     Nada
Modifica:  Nada
  Altera o endereço físico do pixel corrente.


  SETATR
Ponteiro:  011AH
Endereço:  1676H
Entrada:   A=Código de cor
Saída:     Flag C, se código de cor ilegal
Modifica:  Flags
  Altera a cor de frente (ink).


  READC
Ponteiro:  011DH
Endereço:  1647H
Entrada:   Nada
Saída:     A=Código de cor do pixel corrente
Modifica:  AF, EI
  Lê a cor do pixel corrente.


  SETC
Ponteiro:  0120H
Endereço:  167EH
Entrada:   Nada
Saída:     Nada
Modifica:  AF, EI
  Seta a cor do pixel corrente, de acordo com a cor atual.


  NSETCX
Ponteiro:  0123H
Endereço:  1809H
Entrada:   HL=Número de pixels a serem pintados
Saída:     Nada
Modifica:  AF, BC, DE, HL, EI
  Seta a cor de N pixels a partir do pixel corrente, de acordo com a cor atual.


  GTASPC
Ponteiro:  0126H
Endereço:  18C7H
Entrada:   Nada
Saída:     DE=ASPCT1, HL=ASPCT2
Modifica:  DE, HL
  Retorna as proporções de um círculo, para a sentença "CIRCLE".


  PNTINI
Ponteiro:  0129H
Endereço:  18CFH
Entrada:   A=Cor de borda
Saída:     Flag C, se cor ilegal
Modifica:  AF
  Seta a cor de limite para o "PAINT".


  SCANR [3]
Ponteiro:  012CH
Endereço:  18E4H
Entrada:   B=00H, não preenche / FFH, preenche
           DE=Número de saltos
Saída:     DE=Número de saltos restantes
           HL=Número de pixels percorridos
Modifica:  AF, BC, DE, HL, EI
  Usado pelo "PAINT" para percorrer para a direita, a partir do pixel corrente, até que a cor seja igual a BDRATR (FCB2H) ou que a borda da tela seja atingida.


  SCANL [3]
Ponteiro:  012FH
Endereço:  197AH
Entrada:   Nada
Saída:     HL=Número de pixels percorridos
Modifica:  AF, BC, DE, HL, EI
  Usado pelo "PAINT" para percorrer para a esquerda, a partir do pixel corrente, até que a cor seja igual a BDRATR (FCB2H) ou que a borda da tela seja atingida.



  10. Misc


  CHGCAP
Ponteiro:  0132H
Endereço:  0F3DH
Entrada:   A=Liga/desliga
Saída:     Nada
Modifica:  AF
  Liga ou desliga a luz do CAPS LOCK. Quando A=00H, liga, e qualquer outro valor, desliga.


  CHGSND
Ponteiro:  0135H
Endereço:  0F7AH
Entrada:   A=Liga/desliga
Saída:     Nada
Modifica:  AF
  Liga ou desliga o click das teclas. Quando A=00H, desliga, e qualquer outro valor, liga.


  RSLREG
Ponteiro:  0138H
Endereço:  144CH
Entrada:   Nada
Saída:     A=Conteúdo do registro do slot primário
Modifica:  A
  Lê o registro do slot primário.


  WSLREG
Ponteiro:  013BH
Endereço:  144CH
Entrada:   A=Valor a escrever
Saída:     Nada
Modifica:  Nada
  Grava o registro do slot primário.


  RDVDP
Ponteiro:  013EH
Endereço:  1449H
Entrada:   Nada
Saída:     A=Conteúdo do registro de estado do VDP
Modifica:  A
  Lê o registro de estado do VDP.


  SNSMAT
Ponteiro:  0141H
Endereço:  1452H
Entrada:   A=Número da linha do teclado
Saída:     A=Dados da linha de teclado
Modifica:  AF, C, EI
  Rotina para leitura de uma linha da matrix de teclado.


  PHYDIO [3]
Ponteiro:  0144H
Endereço:  148AH
Entrada:   HL=Endereço inicial da RAM onde o setor é posto para E/S
           DE=Número do setor inicial para E/S
           B=Número de setores a ler ou gravar
           C=Tipo de formatação do disco
           A=Número do drive (0=A, 1=B, ...)
           Flag CY: 0=leitura, 1=gravação
Saída:     Flag CY: 0=sucesso, 1=erro
Modifica:  Todos
  Lê um ou mais setores em um disquete. Rotina para uso com o DISK Basic (ROM). Sem ela, nada acontece.

  Parâmetro de formatação do disco:
 F8H - 80 trilhas, face simples;
 F9H - 80 trilhas, face dupla;
 FCH - 40 trilhas, face simples;
 FDH - 40 trilhas, face dupla.

  FORMAT
Ponteiro:  0147H
Endereço:  148EH
Entrada:   Nada
Saída:     Nada
Modifica:  Todos
  Formata um disquete. Rotina para uso com o DISK Basic (ROM). Sem ela, nada acontece.

  Após o comando, uma série de perguntas são feitas, assim como ocorre no Basic.


  ISFLIO
Ponteiro:  014AH
Endereço:  145FH
Entrada:   Nada
Saída:     Flag NZ, se E/S está em curso
Modifica:  AF
  Verifica se uma operação de E/S está em curso. NZ=0, se sim, outro valor, se não.


  OUTDLP
Ponteiro:  014DH
Endereço:  1B63H
Entrada:   A=Caracter a enviar
Saída:     Nada
Modifica:  EI
  Envia um caractere para a impressora.


  GETVCP
Ponteiro:  0150H
Endereço:  1470H
Entrada:   A=Número de voz (0, 1, 2)
Saída:     HL=Endereço no buffer de voz
Modifica:  AF, HL
  Retorna o byte 2 em um determinado buffer de voz.


  GETVCP2
Ponteiro:  0153H
Endereço:  1474H
Entrada:   A=Número do byte (0 a 36)
Saída:     HL=Endereço no buffer de voz
Modifica:  AF, HL
  Retorna qualquer byte em um determinado buffer de voz, especificado pela variável de sistema VOICEN (FB38H).


  KILBUF
Ponteiro:  0156H
Endereço:  0468H
Entrada:   Nada
Saída:     Nada
Modifica:  HL
  Limpa o buffer de teclado.


  CALBAS
Ponteiro:  0159H
Endereço:  01FFH
Entrada:   IX=Endereço
Saída:     Nada
Modifica:  AF', BC', DE', HL', IY, DI
  Rotina que chama um endereço do interpretador Basic a partir de qualquer slot. Utilizado por programas que estejam rodando na página 1 de outro slot, como por exemplo um cartucho.




  Referências:

  [1] - O Livro Vermelho do MSX, Avalon Software, editora McGraw Hill.
  [2] - MSX2 Technical Handbook, ASCII Corporation, 1987.
  [3] - MSX Top Secret 2, Edison Moraes, 2004.


MarMSX 2019