Rotinas da BIOS do MSX
Você está em: MarMSX >> Cursos >> Assembly Z80
Descrição de cada item da instrução:
- Ponteiro - endereço que deverá ser chamado pelo CALL, padronizado em todos os MSXs.
- Endereço - o endereço real da sub-rotina na BIOS no MSX 1.
- Entrada - registradores que devem ser modificados de modo a passarem parâmetros de entrada para a sub-rotina.
- Saída - registradores que armazenam informações de saída da sub-rotina (retorno da função).
- Modifica - registradores modificados durante a execução da sub-rotina.
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.