Sunteți pe pagina 1din 139

Fudeba Assembler

Manual e Referncia da Arquitetura MSX e

Felipe Bergo
bergo@seul.org Novembro, 2002

Copyright c 2002 Felipe Bergo. E permitido copiar, distribuir e/ou modicar este documento sob os termos da GNU Free Documentation License, verso 1.1 ou qualquer verso mais recente publicada pela a a Free Software Foundation; No h sees invariantes. Uma cpia da licena est inclusa no apndice A. a a co o c a e

Sumrio a
Introduo ca 1 Arquivos de Entrada e Uso do 1.4 Sintaxe de Chamada do FA . 1.4.1 Sintaxe do FA . . . . 1.4.2 Sintaxe do XFA . . . . Fudeba . . . . . . . . . . . . . . . Assembler . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1 2 4 4 5 6 7 31 36 37 38 39 40 47 47 48 49 49 51 53 55 57 57 57 57 57 58 59 59 61 81 88

2 Instrues Z80 co 2.1 Listagem Alfabtica Descritiva e 2.2 Temporizao das Instrues . ca co 2.3 Mapeamento dos Opcodes . . . 2.3.1 Grupo CB . . . . . . . . 2.3.2 Grupo ED . . . . . . . . 2.3.3 Grupos DD e FD . . . . 3 Diretivas

. . . . . .

. . . . . .

. . . . . .

. . . . . .

. . . . . .

. . . . . .

. . . . . .

. . . . . .

. . . . . .

. . . . . .

. . . . . .

. . . . . .

. . . . . .

. . . . . .

. . . . . .

. . . . . .

. . . . . .

. . . . . .

. . . . . .

. . . . . .

. . . . . .

. . . . . .

. . . . . .

. . . . . .

. . . . . .

. . . . . .

. . . . . .

. . . . . .

. . . . . .

. . . . . .

. . . . . .

. . . . . .

. . . . . .

. . . . . .

4 Programando para Uzix 4.1 Multi-Tarefa no Uzix . . . . . . . . . . . . . . . . 4.2 Modelo de memria . . . . . . . . . . . . . . . . o 4.3 Exemplo: Oi Mundo! . . . . . . . . . . . . . . . . 4.4 Stub . . . . . . . . . . . . . . . . . . . . . . . . . 4.5 Chamadas de Sistema . . . . . . . . . . . . . . . 4.6 Mdulos . . . . . . . . . . . . . . . . . . . . . . . o 4.7 Mdulo TCP/IP . . . . . . . . . . . . . . . . . . o 4.7.1 Estabelecimento de conexo . . . . . . . . a 4.7.2 Envio e recebimento de dados . . . . . . . 4.7.3 Esperando uma conexo ou pacotes UDP a 4.7.4 Ping . . . . . . . . . . . . . . . . . . . . . 4.7.5 Outras Operaes . . . . . . . . . . . . . co 4.8 Cdigos de erro . . . . . . . . . . . . . . . . . . . o 5 MSX-BIOS 5.1 Rotinas MSX-BIOS . . . . . . 5.2 Listagem Alfabtica Descritiva e 5.3 Variveis da rea de trabalho . a a 5.4 Ganchos . . . . . . . . . . . . .

. . . . . . . . . . . . .

. . . . . . . . . . . . .

. . . . . . . . . . . . .

. . . . . . . . . . . . .

. . . . . . . . . . . . .

. . . . . . . . . . . . .

. . . . . . . . . . . . .

. . . . . . . . . . . . .

. . . . . . . . . . . . .

. . . . . . . . . . . . .

. . . . . . . . . . . . .

. . . . . . . . . . . . .

. . . . . . . . . . . . .

. . . . . . . . . . . . .

. . . . . . . . . . . . .

. . . . . . . . . . . . .

. . . . . . . . . . . . .

. . . . . . . . . . . . .

. . . . . . . . . . . . .

. . . . . . . . . . . . .

. . . . . . . . . . . . .

. . . . . . . . . . . . .

. . . . . . . . . . . . .

. . . . . . . . . . . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . . 3

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

6 MSX-DOS e BDOS 6.1 BDOS . . . . . . . 6.2 FCB . . . . . . . . 6.3 BPB . . . . . . . . 6.4 Sequncias VT-52 . e

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . . . . . . . . . . . . . . . . . . . . .

. . . . . . . . . . . . . . . . . . . . . . .

. . . . . . . . . . . . . . . . . . . . . . .

. . . . . . . . . . . . . . . . . . . . . . .

. . . . . . . . . . . . . . . . . . . . . . .

. . . . . . . . . . . . . . . . . . . . . . .

. . . . . . . . . . . . . . . . . . . . . . .

. . . . . . . . . . . . . . . . . . . . . . .

. . . . . . . . . . . . . . . . . . . . . . .

. . . . . . . . . . . . . . . . . . . . . . .

. . . . . . . . . . . . . . . . . . . . . . .

. . . . . . . . . . . . . . . . . . . . . . .

. . . . . . . . . . . . . . . . . . . . . . .

. . . . . . . . . . . . . . . . . . . . . . .

. . . . . . . . . . . . . . . . . . . . . . .

. . . . . . . . . . . . . . . . . . . . . . .

. . . . . . . . . . . . . . . . . . . . . . .

. . . . . . . . . . . . . . . . . . . . . . .

. . . . . . . . . . . . . . . . . . . . . . .

. . . . . . . . . . . . . . . . . . . . . . .

. . . . . . . . . . . . . . . . . . . . . . .

. . . . . . . . . . . . . . . . . . . . . . .

. . . . . . . . . . . . . . . . . . . . . . .

. . . . . . . . . . . . . . . . . . . . . . .

. . . . . . . . . . . . . . . . . . . . . . .

. . . . . . . . . . . . . . . . . . . . . . .

. . . . . . . . . . . . . . . . . . . . . . .

92 92 100 101 102 103 103 104 104 104 106 107 107 109 109 110 110 111 113 113 113 113 116 118 118 118 119 120 121

7 PPI - Interface Programvel de Perifricos a e 7.1 Porta A ($A8) . . . . . . . . . . . . . . . . 7.2 Porta B ($A9) . . . . . . . . . . . . . . . . 7.3 Porta C ($AA) . . . . . . . . . . . . . . . . 7.4 Porta de Modo ($AB) . . . . . . . . . . . . 8 VDP 9929/9918 (MSX 1) 8.1 Registrador de Status . 8.2 Registradores de Modo . 8.3 Modo Texto 4024 . . . 8.4 Modo Texto 3224 . . . 8.5 Modo Grco 256192 . a 8.6 Modo Grco 6448 . . a 8.7 Sprites . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

9 PSG - Gerador de Som Programvel a 9.1 Porta de Endereo ($A0) . . . . . . c 9.2 Portas de Dados ($A1 e $A2) . . . . 9.3 Registradores do PSG . . . . . . . . 9.4 Escala Cromtica . . . . . . . . . . . a 10 MegaRAM e Memory Mapper 10.1 MegaRAM . . . . . . . . . . . . . 10.1.1 Programaao da MegaRAM c 10.1.2 MegaRAM Disk . . . . . . 10.2 Memory Mapper . . . . . . . . . . A GNU Free Documentation License . . . .

Introduo ca
O Fudeba Assembler o componente do sistema FOCA1 responsvel por traduzir mnemnicos de estrutura e a o relativamente r gida e invarivel em arquivos executveis. a a O fa direcionado ` arquitetura MSX, baseada no processador Zilog Z80 de 8 bits, popular no Brasil, e a Japo, Espanha, Holanda e alguns outros pa na dcada de 1980. a ses e O fa parte do projeto FOCA, que tem o objetivo de disponibilizar gratuitamente uma plataforma e de desenvolvimento para o sistema operacional Uzix2 , e disponibilizar o cdigo-fonte de um compilador o relativamente simples. Este documento explica a sintaxe de uso do fa , a sintaxe de seus arquivos de entrada e os formatos de sa da. Mas alm de ser uma referncia de uso do fa , este livro reune descries dos diversos componentes e e co de hardware e software do MSX: BIOS, BDOS, Uzix, MSX-DOS, PPI, VDP, PSG e MegaRAM. Os dados contidos neste livro resumem (e em alguns casos corrigem) dados presentes em livros publicados nas dcadas de 1980 e 1990 que hoje so verdadeiras raridades. e a Alm de resumir o contedo de vrios livros, documentamos boa parte do sistema operacional Uzix, que e u a surpreendeu a comunidade MSX ao implementar multi-tarefa (!), suporte a TCP/IP (!!) e acesso ` web a (!!!) em um microcomputador de 8 bits com 128 KB de RAM. Espero que este livro seja util e que fornea aos novatos (ou esquecidos) informaes sucientes para c co comear (ou retornar) a programar para a arquitetura MSX. c

Agradecimentos
Agradeo aos usurios que contribuiram para a realizao e aperfeioamento desta obra, seja fornecendo c a ca c informaes, emprestando livros de referncia, revisando o texto ou ainda fazendo comentrios e cr co e a ticas ao projeto: Adriano Camargo Rodrigues da Cunha, Ricardo Bittencourt, Marco Antnio Simon Dal o Poz, Daniel Caetano, Dante Nishida e Giovanni dos Reis Nunes. Agradeo aos leitores da lista de discusso MSXBR-L pelo suporte, ao Pink Floyd pela inspirao e ` c a ca a seo de Agradecimentos pela referncia recursiva. ca e Boa leitura!

1 Fudeba:

Otimizador, Compilador e Assembler

2 http://uzix.sourceforge.net

Cap tulo 1

Arquivos de Entrada e Uso do Fudeba Assembler


Programa Exemplo
Os arquivos de entrada do fa so arquivos texto simples, processados linha por linha. Linhas so separadas a a pelo caractere ASCII 10 (hexadecimal 0A), mas o caractere ASCII 13 (hexadecimal 0D) ignorado se e encontrado, permitindo o uso de arquivos gerados em plataformas errticas como o MS-DOS. a Cada linha no arquivo de entrada contm uma operao a ser interpretada pelo fa . As operaes so e ca co a divididas em dois grupos: diretivas e instrues. co Linhas vazias so permitidas, bem como comentrios e rtulos. a a o Caso o caractere ; (ponto-e-v rgula) ocorra em uma linha, todos os caracteres do ponto-e-v rgula ao nal da linha sero ignorados (comentrios). a a Instruoes so aquelas aceitas pelo processador Z80. c a Diretivas mudam o comportamento do fa , geram dados ou repetem macros de cdigo previamente o denidas. Diretivas so sempre iniciadas por um ponto e esto descritas no Cap a a tulo 3. Cada linha, independentemente de ter instruo, diretiva ou no ter operao, pode associar o endereo ca a ca c de montagem atual a um label (rtulo). o O exemplo abaixo um arquivo assembly vlido (os nmeros de linha no fazem parte do arquivo), que e a u a analisaremos a seguir.
1

; Oi, Mundo MSX! ; estas duas linhas sao comentarios .header basic .org $c000 ; rotinas do MSX BIOS usadas pelo programa .def INIT32 $6f ; muda tela para screen 1 .def CHPUT $a2 ; imprime caractere na tela, %a = caractere .def POSIT $c6 ; posiciona cursor %h = coluna, %l = linha INICIO: call INIT32 ld %de, MENSAGEM 2

10

15

LOOP:

20

25

FIM:

30

ld %ix, POSX ld %h, (%ix) ld %l, (%ix+1) call POSIT inc (%ix) ld %a, (%de) inc %de cp 0 jr z, FIM call CHPUT jr LOOP ld %l, (%ix+1) .repeat 2 inc %l .endr ld %h, 0 call POSIT ret

; (ix) = coluna (ix+1) = linha

; incrementa coluna ; carrega proximo caractere ; fim da string ?

; retorna ao basic

35

; dados MENSAGEM: .dz "Oi, Mundo MSX!" ; dz eh uma string tipo "C" POSX: .db 1 1 ; variaveis POSX e POSY INICIO, LOOP, FIM, MENSAGEM e POSX so labels. Note que INICIO est denida numa linha vazia, a a LOOP numa linha com instruo e MENSAGEM numa linha com diretiva. ca call, ld, inc so instrues do processador Z80, que sero descritas com maior detalhe no Cap a co a tulo 2. .header, .def, .dz so diretivas, descritas no Cap a tulo 3.

Nomes, Regras e Limites


Cada linha no arquivo de entrada no deve ultrapassar 255 caracteres. Linhas mais longas causaro erro a a na montagem. Para representar nmeros podem ser usadas 3 bases: 10, 2 e 16 (decimal, binrio e hexadecimal, respectiu a vamente). O padro decimal. Para indicar que um nmero hexadecimal ele deve ser precedido por $. a e u e Os caracteres permitidos em nmeros hexadecimais so 0-9, A-F e a-f. Nmeros binrios devem ser preu a u a cedidos por #. Exemplos: 27 $1b #11011. E poss tambm representar o valor ASCII de um caractere vel e colocando-o entre apstrofos: a. Alguns escapes so permitidos para representar caracteres especiais: o a Escape \0 \t \n \r \ \ \\ Valor Nil (ASCII 0) Tab (ASCII 9) Quebra de linha (ASCII 10) Retorno de carro (ASCII 13) Apstrofo o Aspas Barra invertida

O fa aceita alguns tipos pr-denidos de tokens como partes de seus comandos, a lista abaixo descreve os e tipos utilizados e as regras para cada tipo, tal como caracteres permitidos e comprimento mximo. a 3

Tipo byte

Uso constantes numricas e de 8 bits constantes numricas e de 16 bits constantes numricas e positivas de 16 bits identicadores (labels e macros) constantes string

num

Caracteres nmeros: +, - (menos), 0u 9 a-f A-F, $, # , ou qualquer caractere (ou escape) entre apstrofos. o idem

Limites -128 a 255

-32768 65535 0 a 65535

endereo c

idem

identicador

string

o primeiro caractere precisa ser uma letra ou underscore (A-Z,az, ). Os demais caracteres podem ser d gitos (0-9) tambm. e cadeias de caracteres entre aspas ou apstrofos, admitem eso capes

63 caracteres de comprimento n/a

Mai sculas e Min sculas u u


Nomes de labels e de macros (o tipo identicador ) so sens a veis ` diferena entre minsculas e maisculas, a c u u ou seja: LOOP, loop e LooP so diferentes. a Diretivas precisam estar necessariamente em minsculas. u Constantes caractere (a) e strings diferenciam minsculas de maisculas como seria de se esperar. u u O restante da entrada insens e vel a diferenas de maisculas e minsculas: mnemnicos de instrues, c u u o co nomes de registradores e ags de condio, constantes numricas hexadecimais. ca e

1.4

Sintaxe de Chamada do FA

O fa existe em duas verses independentes: o Fudeba Assembler original (fa), que bem limitado mas o e roda nativamente no Uzix, e o XFA (eXtended FA, xfa), ainda em desenvolvimento, que ser compat a vel com o FA porm destinado a ser um cross-assembler para ser executado em arquiteturas de maior porte e (PCs, workstations de 32 e 64 bits), oferecendo mensagens de erro menos resumidas e a opo de gerar ca maples com temporizao e endereamento do cdigo gerado. ca c o

1.4.1

Sintaxe do FA

A sintaxe de linha de comando do FA e fa [-q] [-t] [-o arquivo] arquivo1 [arquivo2 ...] A opo -q faz o fa operar em modo silencioso, suprimindo algumas mensagens de diagnstico no console. ca o A opo -t existe para depurar a conexo entre o fa e o fadb (o processo que serve de banco de dados de ca a labels e macros, usado para ultrapassar o limite de 32 KB por processo no Uzix). Esta opo no tem uso ca a a no ser que voc esteja modicando o fa ou depurando o Uzix. a e A opao -o seleciona o nome do arquivo de sa c da. Se for omitida, a sa do assembler gravada em a.out. da e 4

1.4.2

Sintaxe do XFA

Quando estiver dispon vel, o XFA aceitar todas as opes do fa , e mais a opo -m: a co ca xfa [-q] [-t] [-m arquivo] [-o arquivo] arquivo1 [arquivo2 ...] A opo -m solicita a gerao de um maple no arquivo especicado. As outras opes tm o mesmo ca ca co e signicado que no fa .

Cap tulo 2

Instrues Z80 co
Neste cap tulo usaremos a seguinte sintaxe para indicar os registradores e operandos permitidos em cada instruo: ca reg8 qualquer um entre A, B, C, D, E, H e L. reg16 BC, DE ou HL. IX/IY/HL IX, IY ou HL. Note que os registradores ndice IX e IY, quando usados como referncia e indireta (entre parnteses), permitem um deslocamento no formato IX + inc , com inc entre 128 e e 127. imm8 valor imediato de 8 bits (0 a 255 ou -128 a 127). imm16 valor imediato de 16 bits (0 a 65535 ou -32768 a 32767). ender endereo, seja como imm16ou nome de label. c relatender endereo relativo, seja como imm8ou nome de label. c cond Condio para a execuo da instruo, baseada no registrador de ags: C, NC, Z, NZ, PE, PO, M ca ca ca ou P. No fa os registradores podem estar tanto em maisculas como minsculas, e devem ser precedidos pelo u u caractere % (porcento). Cada instruo lista um ou mais diagramas representando o efeito da instruo sobre o registrador de ags ca ca (F). Quando sintaxes diversas afetarem os ags de forma diferente, o diagrama de ags indica o efeito do bloco de sintaxe logo acima. Os bits 3 e 5 do registrador F no so utilizados. Para os demais, usada a a a e seguinte notao: ca
S Z HC P/O N

?
6

1
4

p 0 2 1 0

S mbolo ? 1 0 o p E os 6 ags do Z80 so: a Flag S Z HC Bit 7 6 4

Signicado O valor do ag resultado da operao. e ca No est denido o que ocorre com o ag. a a O ag setado. e O ag zerado. e O ag no modicado. a e O ag P/O setado em caso de overow. e O ag P/O setado com a paridade. e

P/O N C

2 1 0

Descrio ca Sinal (1=negativo, 0=positivo) Zero (1=Zero, 0=No-Zero) a Half-Carry: Carry (vai-um) do bit 3 para o bit 4 em operaes de soma ou borrow (emprstimo) do bit 4 para co e o bit 3 em operaes de subtrao. co ca Paridade ou Overow, depende da instruo. ca Subtract Flag, indica se a ultima instruo foi subtrao ca ca (1) ou soma (0). Carry (vai-um)

O fa no monta as instrues no documentadas do Z80, descritas em [You01] e [RL87]. Os efeitos sobre a co a os ags foram obtidos a partir de [Lev79], [RL87] e [Zil01]. Seria de se esperar que este ultimo, publicado pelo fabricante do Z80, com data de reviso em 2001 (o Z80 foi lanado em 1976!), fosse a referncia ocial, a c e mas est repleto de erros e deve ser consultado com cautela. As tabelas de opcodes ao nal deste cap a tulo foram constru das a partir de [RL87]. O contedo de alguns ags em algumas instrues so descritos u co a como indenidos em [Zil01], mas [You01] testou a maioria das instrues e conseguiu chegar a alguma co descrio para o Z80. Neste manual mantemos a descrio indenida, pois CPUs mais novas que sejam ca ca backward-compatible com o Z80 podem tratar os ags indenidos de forma diferente.

2.1

Listagem Alfabtica Descritiva e

ADC
Adiciona usando valor do carry ag. dest dest + src + CF ADC %A , reg8/imm8 ADC %A , (%IX /%IY /%HL ) ADC %HL , reg16/%SP
S Z HC P/O N C

ADC dest, src

o 0
2 1

ADD
Adiao. c dest dest + src ADD %A , reg8/imm8 ADD %A , (%IX /%IY /%HL )
S Z HC P/O N C

ADD dest, src

o 0
2 1

ADD %IX , %BC /%DE /%IX /%SP ADD %IY , %BC /%DE /%IY /%SP ADD %HL , reg16/%SP
S Z HC P/O N C

- 7 6 5 4 3

o 0
2 1

AND
Operao E lgico. ca o %A %A src AND reg8/imm8 AND (%HL /%IX /%IY )
S Z HC P/O N

AND src

1
4

p 0 0
2 1 0

BIT
ZF bitn (src) BIT bitn, reg8/(%HL /%IX /%IY )
S Z HC P/O N C

BIT n, src

Testa um bit, resultado na ZF (Zero Flag). [You01] descreve o resultado dos ags S e P/V baseado em experimentos, mas [Zil01] descreve ambos como indenidos.

?
7

1
4

? 0 2 1 0

CALL
Chama subrotina. %SP %SP 2 (%SP ) P C + 3 P C dest CALL ender CALL cond, ender
S Z HC P/O N C

CALL [cond ,] dest

- 7 6 5

4 3

- - 2 1 0

CCF
Complementa (inverte) o carry ag (CF). O carry anterior copiado no ag HC. e CF CF CCF
S Z HC P/O N C

CCF

- 7 6 5 4 3

- 0
2 1

CP
Compara valor com o acumulador e ajusta ags de acordo com o resultado. %F (%A, src) CP reg8/imm8/(%HL /%IX /%IY )
S Z HC P/O N C

CP src

o 1
2 1

CPD
Equivale a CP %A , (%HL ) , DEC %HL , DEC %BC . %F (%A, (%HL)) %HL %HL 1 %BC %BC 1 CPD
S Z HC P/O N C

CPD

1 1 0

CPDR
Repete CPD at que %BC seja zero. e enquanto %BC = 0 { %F (%A, (%HL)) %HL %HL 1 %BC %BC 1 } CPDR
S Z HC P/O N C

CPDR

1 1 0

CPI
Equivale a CP %A , (%HL ) , INC %HL , DEC %BC . %F (%A, (%HL)) %HL %HL + 1 %BC %BC 1 CPI
S Z HC P/O N C

CPI

1 1 0

10

CPIR
Repete CPI at que %BC seja zero. e enquanto %BC = 0 { %F (%A, (%HL)) %HL %HL + 1 %BC %BC 1 } CPIR
S Z HC P/O N C

CPIR

1 1 0

CPL
Complementa o acumulador. %A %A CPL
S Z HC P/O N C

CPL

- 7 6 5

1
4

- 1 2 1 0

DAA

DAA

Ajusta o acumulador para que seus nibbles representem os d gitos decimais de seu valor inicial. %A03 %A mod 10 %A47 %A idiv 10 DAA
S Z HC P/O N

p 2 1

11

DEC
Decrementa valor em um. dest dest 1 DEC reg8/(%IX /%IY /%HL )
S Z HC P/O N C

DEC dest

o 1 2 1 0

DEC reg16/%IX /%IY /%SP


S Z HC P/O N C

- 7 6 5

4 3

- - 2 1 0

DI
Desabilita interrupoes. c DI
S Z HC P/O N C

DI

- 7 6 5

4 3

- - 2 1 0

DJNZ
Decrementa %B e salta para destino se %B no for zero. a %B %B 1 se %B = 0 { P C dest } DJNZ relatender
S Z HC P/O N C

DJNZ dest

- 7 6 5

4 3

- - 2 1 0

12

EI
Habilita interrupes. co EI
S Z HC P/O N C

EI

- 7 6 5

4 3

- - 2 1 0

EX

EX dest, src
Troca valores de registradores. A sintaxe EX %AF troca o par %AF com os registradoressombra AF. No fa , ao contrrio de vrios outros assemblers, a sintaxe apenas EX %AF a a e em vez de EX %AF , %AF. tmp src src dest dest tmp EX %DE , %HL EX (%SP ), %HL /%IX /%IY
S Z HC P/O N C

- 7 6 5

4 3

- - 2 1 0

EX %AF
S Z HC P/O N C

13

EXX
Troca os valores dos registradores %B , %C , sombra. troca(%B, %B ) troca(%C, %C ) troca(%D, %D ) troca(%E, %E ) troca(%H, %H ) troca(%L, %L ) onde troca(, ) tmp , , tmp. e EXX
S Z HC P/O N C %D

EXX
,
%E

%H

%L

com seus registradores-

- 7 6 5

4 3

- - 2 1 0

HALT
Pra o processamento do Z80. a HALT
S Z HC P/O N C

HALT
;-)

- 7 6 5

4 3

- - 2 1 0

IM

IM n
Muda o modo de interrupo do Z80. Existem 3 modos: 0, 1 e 2. No modo 0 o dispositivo ca deve fornecer (via pinagem do Z80) uma instruo RST para tratamento da interrupo, ca ca no modo 1 as interrues so sempre tratadas pelo RST $38 e no modo 2 o tratador de co a interrupo est em um endereo cujo MSB o valor do registrador especial %I e o LSB ca a c e e fornecido pelo dispositivo de forma semelhante ao modo 0. IM imm8
S Z HC P/O N C

- 7 6 5

4 3

- - 2 1 0

14

IN
L um byte na porta de I/O src para dest. e dest IO(src) IN %A , imm8
S Z HC P/O N C

IN dest, src

- 7 6 5

4 3

- - 2 1 0

IN reg8, (%C )
S Z HC P/O N

0
4

p 0 2 1 0

INC
Incrementa valor em um. dest dest + 1 INC reg8/(%IX /%IY /%HL )
S Z HC P/O N C

INC dest

o 0 2 1 0

INC reg16/%IX /%IY /%SP


S Z HC P/O N C

- 7 6 5

4 3

- - 2 1 0

IND
L byte em porta de I/O, decrementa %HL e %B . e (%HL) IO((%C)) %HL %HL 1 %B %B 1 IND
S Z HC P/O N C

IND

?
7

?
4

? 1 2 1 0

15

INDR
Repete IND at que %B seja zero. e enquanto %B = 0 { (%HL) IO((%C)) %HL %HL 1 %B %B 1 } INDR
S Z HC P/O N C

INDR

? 1
7 6

?
4

? 1 2 1 0

INI
L byte em porta de I/O, incrementa %HL e decrementa %B . e (%HL) IO((%C)) %HL %HL + 1 %B %B 1 INI
S Z HC P/O N C

INI

?
7

?
4

? 1 2 1 0

INIR
Repete INI at que %B seja zero. e enquanto %B = 0 { (%HL) IO((%C)) %HL %HL + 1 %B %B 1 } INIR
S Z HC P/O N C

INIR

? 1
7 6

?
4

? 1 2 1 0

16

JP
P C dest JP ender JP (%HL /%IX /%IY ) JP cond, ender
S Z HC P/O N C

JP [cond,] dest
Transfere a execuo para dest. Usa endereamento absoluto. O modo (%IX/Y ) no ca c a permite deslocamento em %IX/Y .

- 7 6 5

4 3

- - 2 1 0

JR

JR [cond,] dest
Transfere a execuo para dest. Usa endereamento relativo. Apenas as condies C, NC, ca c co Z e NZ podem ser usadas. P C dest JR relatender JR cond, relatender
S Z HC P/O N C

- 7 6 5

4 3

- - 2 1 0

17

LD
Transfere src para dest. dest src LD LD LD LD LD LD LD LD LD LD LD
S

LD dest, src

reg8, reg8 reg8, imm8 reg16/%SP /%IX /%IY , imm16/ender (%HL /%IX /%IY ), imm8/reg8 (reg16), %A %A , (reg16/%IX /%IY ) reg8, (%HL /%IX /%IY ) %A /reg16/%IX /%IY /%SP , (ender) (ender), %A /reg16/%IX /%IY /%SP %SP , %HL /%IX /%IY %I /%R , %A
Z HC P/O N C

- 7 6 5

4 3

- - 2 1 0

LD %A , %I /%R
S Z HC P/O N C

0
4

0 1 0

LDD
Carrega contedo de %HL para %DE , decrementa %DE , %HL e %BC . u (%DE) (%HL) %DE %DE 1 %HL %HL 1 %BC %BC 1 LDD
S Z HC P/O N C

LDD

- 7 6 5

0
4

0 1 0

18

LDDR
Repete LDD at que %BC seja zero. e enquanto %BC = 0 { (%DE) (%HL) %DE %DE 1 %HL %HL 1 %BC %BC 1 } LDDR
S Z HC P/O N C

LDDR

- 7 6 5

0
4

0 0 2 1 0

LDI
Carrega contedo de %HL para %DE , incrementa %DE , %HL , decrementa %BC . u (%DE) (%HL) %DE %DE + 1 %HL %HL + 1 %BC %BC 1 LDI
S Z HC P/O N C

LDI

- 7 6 5

0
4

0 1 0

LDIR
Repete LDI at que %BC seja zero. e enquanto %BC = 0 { (%DE) (%HL) %DE %DE + 1 %HL %HL + 1 %BC %BC 1 } LDIR
S Z HC P/O N C

LDIR

- 7 6 5

0
4

0 0 2 1 0

19

NEG
Inverte o sinal do acumulador. %A %A NEG
S Z HC P/O N C

NEG

o 1
2 1

NOP
No faz nada. a NOP
S Z HC P/O N C

NOP

- 7 6 5

4 3

- - 2 1 0

OR
Operao OU lgico. ca o %A %A src OR reg8/imm8 OR (%HL /%IX /%IY )
S Z HC P/O N

OR src

1
4

p 0 0
2 1 0

20

OTDR
Repete OUTD at que %B seja zero. e enquanto %B = 0 { IO((%C)) (%HL) %HL %HL 1 %B %B 1 } OTDR
S Z HC P/O N C

OTDR

? 1
7 6

?
4

? 1 2 1 0

OTIR
Repete OUTI at que %B seja zero. e enquanto %B = 0 { IO((%C)) (%HL) %HL %HL + 1 %B %B 1 } OTIR
S Z HC P/O N C

OTIR

? 1
7 6

?
4

? 1 2 1 0

OUT
Escreve src na porta de I/O dest. IO(dest) src OUT imm8, %A OUT (%C ), reg8
S Z HC P/O N C

OUT dest, src

- 7 6 5

4 3

- - 2 1 0

21

OUTD
Escreve (%HL ) na porta (%C ), decrementa %HL , decrementa %B . IO((%C)) (%HL) %HL %HL 1 %B %B 1 OUTD
S Z HC P/O N C

OUTD

?
7

?
4

? 1 2 1 0

OUTI
Escreve (%HL ) na porta (%C ), incrementa %HL , decrementa %B . IO((%C)) (%HL) %HL %HL + 1 %B %B 1 OUTI
S Z HC P/O N C

OUTI

?
7

?
4

? 1 2 1 0

POP
Desempilha para dest. dest (%SP ) %SP %SP + 2 POP reg16/%AF /%IX /%IY
S Z HC P/O N C

POP dest

- 7 6 5

4 3

- - 2 1 0

22

PUSH
Empilha src. %SP %SP 2 (%SP ) src PUSH reg16/%AF /%IX /%IY
S Z HC P/O N C

PUSH src

- 7 6 5

4 3

- - 2 1 0

RDL
Sinnimo para RLD. o

RDL

RES
Reseta bit n em dest. bitn (dest) 0 RES bitn, reg8/(%HL /%IX /%IY )
S Z HC P/O N C

RES n, dest

- 7 6 5

4 3

- - 2 1 0

RET
Retorna de sub-rotina. P C (%SP ) %SP %SP + 2 RET RET cond
S Z HC P/O N C

RET [cond]

- 7 6 5

4 3

- - 2 1 0

23

RETI

RETI

Retorna de tratador de interrupo mascarvel. Semelhante a RET mas comunica ao disca a positivo que o tratamento da interrupo terminou. RETI no habilita as interrupes, em ca a co geral necessria uma instruo EI antes de RETI em tratadores de interrupo. e a ca ca P C (%SP ) %SP %SP + 2 RETI
S Z HC P/O N C

- 7 6 5

4 3

- - 2 1 0

RETN
P C (%SP ) %SP %SP + 2 RETN
S Z HC P/O N C

RETN

Retorna de tratador de interrupo no-mascarvel (NMI). Restaura o estado das interca a a rupes mascarveis (EI ou DI) para o valor anterior ` ocorrncia da NMI. co a a e

- 7 6 5

4 3

- - 2 1 0

RL
Rotao ` esquerda com carry. ca a Veja Figura 2.1 RL reg8/(%HL /%IX /%IY )
S Z HC P/O N C

RL dest

0
4

p 0
2 1

24

RLA
RL sobre o acumulador. Veja Figura 2.1 RLA
S Z HC P/O N C

RLA

- 7 6 5

0
4

- 0
2 1

RLC
Rotao ` esquerda sem carry. ca a Veja Figura 2.1 RLC reg8/(%HL /%IX /%IY )
S Z HC P/O N C

RLC dest

0
4

p 0
2 1

RLCA
RLC sobre o acumulador. Veja Figura 2.1 RLCA
S Z HC P/O N C

RLCA

- 7 6 5

0
4

- 0
2 1

25

RLD
Rotao decimal (de nibbles) ` esquerda. ca a tmp %A03 %A03 (%HL)47 (%HL)47 (%HL)03 (%HL)03 tmp RLD
S Z HC P/O N

RLD

0
4

p 0 2 1 0

RR
Rotao ` direita com carry. ca a Veja Figura 2.1 RR reg8/(%HL /%IX /%IY )
S Z HC P/O N C

RR dest

0
4

p 0
2 1

RRA
RR sobre o acumulador. Veja Figura 2.1 RRA
S Z HC P/O N C

RRA

- 7 6 5

0
4

- 0
2 1

26

RRC
Rotao ` direita sem carry. ca a Veja Figura 2.1 RRC reg8/(%HL /%IX /%IY )
S Z HC P/O N C

RRC dest

0
4

p 0
2 1

RRCA
RRC sobre o acumulador. Veja Figura 2.1 RRCA
S Z HC P/O N C

RRCA

- 7 6 5

0
4

- 0
2 1

RRD
Rotao decimal (de nibbles) ` direita. ca a tmp %A03 %A03 (%HL)03 (%HL)03 (%HL)47 (%HL)47 tmp RRD
S Z HC P/O N

RRD

0
4

p 0 2 1 0

27

RST
Chama subrotina de sistema. Semelhante a CALL mas ocupa apenas um byte. %SP %SP 2 (%SP ) P C + 1 P C dest RST $0/$8/$10/$18/$20/$28/$30/$38
S Z HC P/O N C

RST dest

- 7 6 5

4 3

- - 2 1 0

SBC
Subtrao com Carry ca dest dest src CF SBC %A , reg8/imm8/(%HL /%IX /%IY ) SBC %HL , reg16/%SP
S Z HC P/O N C

SBC dest, src

o 1
2 1

SCF
Seta o carry ag (CF). CF 1 SCF
S Z HC P/O N C

SCF

- 7 6 5

0
4

- 0 1
2 1 0

28

SET
Seta bit n em dest. bitn (dest) 1 SET bitn, reg8/(%HL /%IX /%IY )
S Z HC P/O N C

SET n, dest

- 7 6 5

4 3

- - 2 1 0

SLA
Deslocamento aritmtico ` esquerda. e a Veja Figura 2.1 SLA reg8/(%HL /%IX /%IY )
S Z HC P/O N C

SLA dest

0
4

p 0
2 1

SRA
Deslocamento aritmtico ` direita. e a Veja Figura 2.1 SRA reg8/(%HL /%IX /%IY )
S Z HC P/O N C

SRA dest

0
4

p 0
2 1

SRL
Deslocamento lgico ` direita. o a Veja Figura 2.1 SRL reg8/(%HL /%IX /%IY )
S Z HC P/O N C

SRL dest

0
7

0
4

p 0
2 1

29

SUB
Subtrao ca dest dest src SUB %A , reg8/imm8/(%HL /%IX /%IY )
S Z HC P/O N C

SUB dest, src

o 1
2 1

XOR
Operao OU-exclusivo lgico. ca o %A %A src XOR reg8/imm8 XOR (%HL /%IX /%IY )
S Z HC P/O N

XOR src

1
4

p 0 0
2 1 0

30

RL
CF dest

RR
CF dest

RLC
CF dest

RRC
dest CF

SLA
CF dest

SRA
dest CF

SRL

0
dest CF

Figura 2.1: Instrues de Deslocamento e Rotao co ca

2.2

Temporizao das Instrues ca co

A Tabela 2.1 (abaixo) lista o tamanho de cada instruo montada (em bytes), o nmero de ciclos de CPU ca u necessrios para execuo, nmero de wait states no MSX (implementaes de MSX baseadas em clones a ca u co do Z80 podem no corresponder aos valores listados) e nmero total de ciclos para execuo, considerando a u ca os wait-states. Algumas instrues (em geral as condicionais) no tm nmero de ciclos xo. Nestes casos, o menor co a e u nmero indica o comportamento se a ao condicional no for executada. u ca a Tabela 2.1: Temporizao das Instrues do Z80 ca co Instruo ca ADC %A , ( %HL ) Tamanho 1 31 Ciclos 7 Wait-States 1 Total 8

Tabela 2.1: (cont.) Instruo ca ADC %A , ( %IX/Y + ss ) ADC %A , imm8 ADC %A , reg8 ADC %HL , reg16/ %SP ADD %A , ( %HL ) ADD %A , ( %IX/Y + ss ) ADD %A , imm8 ADD %A , reg8 ADD %HL , reg16/ %SP ADD %IX/Y , %BC /%DE /src AND ( %HL ) AND (%IX/Y + ss ) AND imm8 AND reg8 BIT b, ( %HL ) BIT b, ( %IX/Y + ss ) BIT b, reg8 CALL ender CALL cond, ender CCF CP ( %HL ) CP ( %IX/Y + ss ) CP imm8 CP reg8 CPD CPDR CPI CPIR CPL DAA DEC ( %HL ) DEC ( %IX/Y + ss ) DEC reg8 DEC reg16/ %SP DEC %IX/Y DI DJNZ ss EI EX ( %SP ) , %HL EX ( %SP ) , %IX/Y EX %AF EX %DE , %HL EXX HALT IM n IN A, imm8 Tamanho 3 2 1 2 1 3 2 1 1 2 1 3 2 1 2 4 2 3 3 1 1 3 2 1 2 2 2 2 1 1 1 3 1 1 2 1 2 1 1 2 1 1 1 1 2 2 Ciclos 19 7 4 15 7 19 7 4 11 15 7 19 7 4 12 20 8 17 17/10 4 7 19 7 4 16 21/21/16 16 21/21/16 4 4 11 23 4 6 10 4 13/8 4 19 23 4 4 4 4 8 11 Wait-States 2 1 1 2 1 2 1 1 1 2 1 2 1 1 2 3 2 1 1 1 1 2 1 1 2 2 2 2 1 1 1 2 1 1 2 1 1 1 1 2 1 1 1 1 2 1 Total 21 8 5 17 8 21 8 5 12 17 8 21 8 5 14 23 10 18 18/11 5 8 21 8 5 18 23/23/18 18 23/23/18 5 5 12 25 5 7 12 5 14/9 5 20 25 5 5 5 5 10 12

32

Tabela 2.1: (cont.) Instruo ca IN reg8, ( %C ) INC ( %HL ) INC ( %IX/Y + ss ) INC reg8 INC reg16/ %SP INC %IX/Y IND INDR INI INIR JP ( %HL ) JP ( %IX/Y ) JP ender JP COND, ender JR ss JR COND, ss LD ( ender), %A LD ( ender), %HL LD ( ender), %IX/Y LD ( reg16), %A LD ( %HL ), imm8 LD ( %HL ), reg8 LD ( %IX/Y + ss ), imm8 LD ( %IX/Y + ss ), reg8 LD %A , ( ender) LD %A , ( reg16) LD %A , %I / %R LD reg8, ( %HL ) LD reg8, ( %IX/Y + ss ) LD reg8, imm8 LD %I /%R , %A LD reg8, reg8 LD %BC /%DE /%SP , ( ender) LD reg16/%SP , imm16 LD %HL , ( ender) LD %IX/Y , ( ender) LD %IX/Y , imm16 LD %SP , %HL LD %SP , %IX/Y LDD LDDR LDI LDIR NEG NOP OR ( %HL ) Tamanho 2 1 3 1 1 2 2 2 2 2 1 2 3 3 2 2 3 3 4 1 2 1 4 3 3 1 2 1 3 2 2 1 4 3 3 4 4 1 2 2 2 2 2 2 1 1 Ciclos 12 11 23 4 6 10 16 21/21/16 16 21/21/16 4 8 10 10 12 12/7 13 16 20 7 10 7 19 19 13 7 9 7 19 7 9 4 20 10 16 20 14 6 10 16 21/21/16 16 21/21/16 8 4 7 Wait-States 2 1 2 1 1 2 2 2 2 2 1 2 1 1 1 1 1 1 2 1 1 1 2 2 1 1 2 1 2 1 2 1 1(2) 1 1 2 2 1 2 2 2 2 2 2 1 1 Total 14 12 25 5 7 12 18 23/23/18 18 23/23/18 5 10 11 11 13 13/8 14 17 22 8 11 8 21 21 14 8 11 8 21 8 11 5 21(22) 11 17 22 16 7 12 18 23/23/18 18 23/23/18 10 5 8

33

Tabela 2.1: (cont.) Instruo ca OR ( %IX/Y + ss ) OR imm8 OR reg8 OTDR OTIR OUT imm8, %A OUT ( %C ), reg8 OUTD OUTI POP reg16/%AF POP %IX/Y PUSH reg16/%AF PUSH %IX/Y RES b, ( %HL ) RES b, ( %IX/Y + ss ) RES b, reg8 RET RET COND RETI RETN RL ( %HL ) RL ( %IX/Y + ss ) RL reg8 RLA RLC ( %HL ) RLC ( %IX/Y + ss ) RLC reg8 RLCA RLD RR ( %HL ) RR ( %IX/Y + ss ) RR reg8 RRA RRC ( %HL ) RRC ( %IX/Y + ss ) RRC reg8 RRCA RRD RST nn SBC %A , ( %HL ) SBC %A , ( %IX/Y + ss ) SBC %A , imm8 SBC %A , reg8 SBC %HL , reg16/%SP SET b, ( %HL ) SET b, ( %IX/Y + ss ) Tamanho 3 2 1 2 2 2 2 2 2 1 2 1 2 2 4 2 1 1 2 2 2 4 2 1 2 4 2 1 2 2 4 2 1 2 4 2 1 2 1 1 3 2 1 2 2 4 Ciclos 19 7 4 21/21/16 21/21/16 11 12 21/21/16 21/21/16 10 14 11 15 15 23 8 10 11/5 14 14 15 23 8 4 15 23 8 4 18 15 23 8 4 15 23 8 4 18 11 7 19 7 4 15 15 23 Wait-States 2 1 1 2 2 1 2 2 2 1 2 1 2 2 3 2 1 1 2 2 2 3 2 1 2 3 2 1 2 2 3 2 1 2 3 2 1 2 1 1 2 1 1 2 2 3 Total 21 8 5 23/23/18 23/23/18 12 14 23/23/18 23/23/18 11 16 12 17 17 26 10 11 12/6 16 16 17 26 10 5 17 26 10 5 20 17 26 10 5 17 26 10 5 20 12 8 21 8 5 17 17 26

34

Tabela 2.1: (cont.) Instruo ca Tamanho Ciclos Wait-States SET b, reg8 2 8 2 SLA ( %HL ) 2 15 2 SLA ( %IX/Y + ss ) 4 23 3 SLA reg8 2 8 2 SRA ( %HL ) 2 15 2 SRA ( %IX/Y + ss ) 4 23 3 SRA reg8 2 8 2 SRL ( %HL ) 2 15 2 SRL ( %IX/Y + ss ) 4 23 3 SRL reg8 2 8 2 SUB %A , ( %HL ) 1 7 1 SUB %A , ( %IX/Y + ss ) 3 19 2 SUB %A , imm8 2 7 1 SUB %A , reg8 1 4 1 XOR ( %HL ) 1 7 1 XOR ( %IX/Y + ss ) 3 19 2 XOR imm8 2 7 1 XOR reg8 1 4 1 Tabela 2.1: Temporizao das Instrues do Z80 ca co Total 10 17 26 10 17 26 10 17 26 10 8 21 8 5 8 21 8 5

35

2.3

Mapeamento dos Opcodes

A sintaxe das instrues nas tabelas desta seo foi modicada para reduzir o tamanho da tabela. Os co ca parmetros ss, tt e qq so o segundo, terceiro e quarto bytes da instruo, respectivamente. ttss indica a a ca que o terceiro byte contem a parte mais signicativa do argumento de 16 bits. 0 0 1 2 3 4 5 6 7 8 9 A B C D E F
NOP DJNZ ss JR nz,ss JR nc,ss LD b,b LD d,b LD h,b LD (hl),b ADD a,b SUB a,b AND b OR b RET nz RET nc RET po RET p

1
LD bc, ttss LD de, ttss LD hl, ttss LD sp, ttss LD b,c LD d,c LD h,c LD (hl),c ADD a,c SUB a,c AND c OR c POP bc POP de POP hl POP af

2
LD (bc),a LD (de),a LD (ttss),hl LD (ttss),a LD b,d LD d,d LD h,d LD (hl),d ADD a,d SUB a,d AND d OR d JP nz,ttss JP nc,ttss JP po,ttss JP p,ttss

3
INC bc INC de INC hl INC sp LD b,e LD d,e LD h,e LD (hl),e ADD a,e SUB a,e AND e OR e JP ttss OUT ss,a EX (sp),hl DI

4
INC b INC d INC h INC (hl) LD b,h LD d,h LD h,h LD (hl),h ADD a,h SUB a,h AND h OR h CALL nz,ttss CALL nc,ttss CALL po,ttss CALL p,ttss

5
DEC b DEC d DEC h DEC (hl) LD b,l LD d,l LD h,l LD (hl),l ADD a,l SUB a,l AND l OR l PUSH bc PUSH de PUSH hl PUSH af

6
LD b,ss LD d,ss LD h,ss LD (hl),ss LD b,(hl) LD d,(hl) LD h,(hl) HALT ADD a,(hl) SUB a,(hl) AND (hl) OR (hl) ADD a,ss SUB a,ss AND ss OR ss

7
RLCA RLA DAA SCF LD b,a LD d,a LD h,a LD (hl),a ADD a,a SUB a,a AND a OR a RST 0 RST 16 RST 32 RST 48

Tabela 2.2: Opcodes simples, LSN (Least Signicant Nibble) 0-7 8 0 1 2 3 4 5 6 7 8 9 A B C D E F


EX af JR ss JR z,ss JR c,ss LD c,b LD e,b LD l,b LD a,b ADC a,b SBC a,b XOR b CP b RET z RET c RET pe RET m

9
ADD hl,bc ADD hl,de ADD hl,hl ADD hl,sp LD c,c LD e,c LD l,c LD a,c ADC a,c SBC a,c XOR c CP c RET EXX JP (hl) LD sp,hl

A
LD a,(bc) LD a,(de) LD hl,(ttss) LD a,(ttss) LD c,d LD e,d LD l,d LD a,d ADC a,d SBC a,d XOR d CP d JP z,ttss JP c,ttss JP pe,ttss JP m,ttss

B
DEC bc DEC de DEC hl DEC sp LD c,e LD e,e LD l,e LD a,e ADC a,e SBC a,e XOR e CP e Grupo CB IN a,ss EX de,hl EI

C
INC c INC e INC l INC a LD c,h LD e,h LD l,h LD a,h ADC a,h SBC a,h XOR h CP h CALL z,ttss CALL c,ttss CALL pe,ttss CALL m,ttss

D
DEC c DEC e DEC l DEC a LD c,l LD e,l LD l,l LD a,l ADC a,l SBC a,l XOR l CP l CALL ttss Grupo DD Grupo ED Grupo FD

E
LD c,ss LD e,ss LD l,ss LD a,ss LD c,(hl) LD e,(hl) LD l,(hl) LD a,(hl) ADC a,(hl) SBC a,(hl) XOR (hl) CP (hl) ADC a,ss SBC a,ss XOR ss CP ss

F
RRCA RRA CPL CCF LD c,a LD e,a LD l,a LD a,a ADC a,a SBC a,a XOR a CP a RST 8 RST 24 RST 40 RST 56

Tabela 2.3: Opcodes simples, LSN (Least Signicant Nibble) 8-F

36

2.3.1

Grupo CB

A partir do grupo CB existem opcodes no atribu a dos, que em princ pio no deveriam gerar instrues a co legais. Alguns autores testaram os opcodes secretos e descobriram um comportamento regular. Estas instrues no-ociais esto marcadas com . O fa no assembla estas instrues. co a a a co 0 0 1 2 3 4 5 6 7 8 9 A B C D E F
RLC b RL b SLA b SLI b BIT 0,b BIT 2,b BIT 4,b BIT 6,b RES 0,b RES 2,b RES 4,b RES 6,b SET 0,b SET 2,b SET 4,b SET 6,b

1
RLC c RL c SLA c SLI c BIT 0,c BIT 2,c BIT 4,c BIT 6,c RES 0,c RES 2,c RES 4,c RES 6,c SET 0,c SET 2,c SET 4,c SET 6,c

2
RLC d RL d SLA d SLI d BIT 0,d BIT 2,d BIT 4,d BIT 6,d RES 0,d RES 2,d RES 4,d RES 6,d SET 0,d SET 2,d SET 4,d SET 6,d

3
RLC e RL e SLA e SLI e BIT 0,e BIT 2,e BIT 4,e BIT 6,e RES 0,e RES 2,e RES 4,e RES 6,e SET 0,e SET 2,e SET 4,e SET 6,e

4
RLC h RL h SLA h SLI h BIT 0,h BIT 2,h BIT 4,h BIT 6,h RES 0,h RES 2,h RES 4,h RES 6,h SET 0,h SET 2,h SET 4,h SET 6,h

5
RLC l RL l SLA l SLI l BIT 0,l BIT 2,l BIT 4,l BIT 6,l RES 0,l RES 2,l RES 4,l RES 6,l SET 0,l SET 2,l SET 4,l SET 6,l

6
RLC (hl) RL (hl) SLA (hl) SLI (hl) BIT 0,(hl) BIT 2,(hl) BIT 4,(hl) BIT 6,(hl) RES 0,(hl) RES 2,(hl) RES 4,(hl) RES 6,(hl) SET 0,(hl) SET 2,(hl) SET 4,(hl) SET 6,(hl)

7
RLC a RL a SLA a SLI a BIT 0,a BIT 2,a BIT 4,a BIT 6,a RES 0,a RES 2,a RES 4,a RES 6,a SET 0,a SET 2,a SET 4,a SET 6,a

Tabela 2.4: Opcodes do grupo CB, LSN 0-7 8 0 1 2 3 4 5 6 7 8 9 A B C D E F


RRC b RR b SRA b SRL b BIT 1,b BIT 3,b BIT 5,b BIT 7,b RES 1,b RES 3,b RES 5,b RES 7,b SET 1,b SET 3,b SET 5,b SET 7,b

9
RRC c RR c SRA c SRL c BIT 1,c BIT 3,c BIT 5,c BIT 7,c RES 1,c RES 3,c RES 5,c RES 7,c SET 1,c SET 3,c SET 5,c SET 7,c

A
RRC d RR d SRA d SRL d BIT 1,d BIT 3,d BIT 5,d BIT 7,d RES 1,d RES 3,d RES 5,d RES 7,d SET 1,d SET 3,d SET 5,d SET 7,d

B
RRC e RR e SRA e SRL e BIT 1,e BIT 3,e BIT 5,e BIT 7,e RES 1,e RES 3,e RES 5,e RES 7,e SET 1,e SET 3,e SET 5,e SET 7,e

C
RRC h RR h SRA h SRL h BIT 1,h BIT 3,h BIT 5,h BIT 7,h RES 1,h RES 3,h RES 5,h RES 7,h SET 1,h SET 3,h SET 5,h SET 7,h

D
RRC l RR l SRA l SRL l BIT 1,l BIT 3,l BIT 5,l BIT 7,l RES 1,l RES 3,l RES 5,l RES 7,l SET 1,l SET 3,l SET 5,l SET 7,l

E
RRC (hl) RR (hl) SRA (hl) SRL (hl) BIT 1,(hl) BIT 3,(hl) BIT 5,(hl) BIT 7,(hl) RES 1,(hl) RES 3,(hl) RES 5,(hl) RES 7,(hl) SET 1,(hl) SET 3,(hl) SET 5,(hl) SET 7,(hl)

F
RRC a RR a SRA a SRL a BIT 1,a BIT 3,a BIT 5,a BIT 7,a RES 1,a RES 3,a RES 5,a RES 7,a SET 1,a SET 3,a SET 5,a SET 7,a

Tabela 2.5: Opcodes do grupo CB, LSN 8-F

37

2.3.2

Grupo ED
0 4 5 6 7 A B
IN b,(c) IN d,(c) IN h,(c) LDI LDIR

1
OUT (c),b OUT (c),d OUT (c),h CPI CPIR

2
SBC hl,bc SBC hl,de SBC hl,hl SBC hl,sp INI INIR

3
LD (qqtt),bc LD (qqtt),de LD (qqtt),sp OUTI OTIR

4
NEG

5
RETN

6
IM 0 IM 1

7
LD i,a LD a,i RRD

Tabela 2.6: Opcodes do grupo ED, LSN 0-7 8 4 5 6 7 A B


IN c,(c) IN e,(c) IN l,(c) IN a,(c) LDD LDDR

9
OUT (c),c OUT (c),e OUT (c),l OUT (c),a CPD CPDR

A
ADC hl,bc ADC hl,de ADC hl,hl ADC hl,sp IND INDR

B
LD bc,(qqtt) LD de,(qqtt) LD sp,(qqtt) OUTD OTDR

D
RETI

E
IM 2

F
LD r,a LD a,r RLD

Tabela 2.7: Opcodes do grupo ED, LSN 8-F

38

2.3.3

Grupos DD e FD

Os prexos DD e FD substituem o par HL por IX (DD) e IY (FD) em diversas instrues. Listamos co apenas a tabela do grupo DD, mas as instrues podem ter o par IX substitu por IY apenas trocando co do o prexo DD por FD. 0 2 3 7 E 1
LD ix, qqtt LD (ix+tt),b LD (ix+tt),c POP ix

2
LD (qqtt),ix LD (ix+tt),d

3
INC ix

4
INC (ix+tt)

5
DEC (ix+tt) LD (ix+tt),l PUSH ix

LD (ix+tt),e EX (sp),ix

LD (ix+tt),h

Tabela 2.8: Grupo DD, LSN (Least Signicant Nibble) 0-5 6 0 1 2 3 4 5 6 7 8 9 A B C E F 7 9


ADD ix,bc ADD ix,de ADD ix,ix LD (ix+tt), qq LD b,(ix+tt) LD d,(ix+tt) LD h,(ix+tt) LD (ix+tt),a ADD a,(ix+tt) SUB a,(ix+tt) AND (ix+tt) OR (ix+tt) Grupo CB JP (ix) LD sp,ix ADD ix,sp LD c,(ix+tt) LD e,(ix+tt) LD l,(ix+tt) LD a,(ix+tt) ADC a,(ix+tt) SBC a,(ix+tt) XOR a,(ix+tt) CP (ix+tt) LD ix,(qqtt) DEC ix

Tabela 2.9: Grupo DD, LSN (Least Signicant Nibble) 6-E Os grupos DD e FD podem ser combinados com todas as instrues com LSN 6 e E do grupo CB co (Tabelas 2.4 e 2.5) tomando a forma de instrues de 4 bytes. Exemplo: DD CB tt 46 a instruo co e ca BIT 0,(%IX + tt). A instruo no documentada SLI (Shift Left Inverted) opera de forma semelhante a SLA, porm insere 1 ca a e no bit mais baixo, em vez de 0. Os autores que pesquisaram os buracos nas tabelas de opcodes detectaram centenas de novas instrues, usando registradores esdrxulos como HX e HY. co u

39

Cap tulo 3

Diretivas
O fa aceita comandos especiais precedidos por um ponto (.) cujo objetivo no gerar uma instruo a e ca vlida do Z80, mas inserir dados ou modicar o estado do assembler. Neste cap a tulo listamos em ordem alfabtica todas as diretivas aceitas. e

.align
Sintaxe: .align num

.align imm16

Descricao: Preenche com zeros todas as posies entre o endereo atual e o prmixo mltiplo do co c o u alinhamento. No exemplo abaixo a instruo ld %hl, $40 montada no endereo ca e c $c100. Exemplo:
1

.org $c000 ld %a, $3e .align $100 ld %hl, $40ff

.append
Sintaxe: .append nomearq

.append nomearq

Descricao: Assembla um arquivo de entrada ao nal do conjunto de arquivos entrada atual. Util para incluir bibliotecas de funes pr-denidas. Se o arquivo indicado j estiver co e a na lista de arquivos a serem concatenados, este no lido duas vezes, portanto no a e a h problema em assemblar com fa arq1.s arq2.s mesmo que ambos arq1.s e arq2.s a contenham .append arq3.s. O arquivo procurado: no diretrio corrente e, caso o nomearq no seja um came o a inho absoluto (iniciado em /), procurado tambm nos seguintes diretrios, nesta e e o ordem: /include/asm , /usr/include/asm , /usr/local/include/asm , /foca/asm, /opt/foca/asm. No futuro ser permitido adicionar outros diretrios ao caminho a o de busca atravs de opes de linha de comando.. e co 40

.da
Sintaxe: .da identicador Descricao: Monta o valor de um label a partir da posio atual. ca

.da label

.db
Sintaxe: .db byte [byte ... ]

.db imm8 [imm8 ...]

Descricao: Monta um ou mais bytes de dados a partir da posio atual. Os parmetros podem ca a estar em formato numrico (decimal, hexadecimal ou binrio) ou como caractere e a entre apstrofos. o Exemplo:
1

; monta 11 bytes .db H e l l o \n 1 4 $7e #00110110 a

.dene
Sintaxe: .dene label endereo c Sintaxe: .def label endereo c Descricao: Declara um label com o endereo dado. c Exemplo:
1

.dene label imm16

.def INIT32 $6f .def CHPUT $00a2 call INIT32 ld %a, H; call CHPUT

.ds
Sintaxe: .ds string

.ds string

Descricao: Monta uma string ASCII de dados a partir do endereo atual. .ds no termina a c a string com delimitador algum. Para gerar strings terminadas em zero (como na linguagem C) use a diretiva .dz. Exemplo:
1

.ds .ds .ds .ds

"Tudo que sobe\ntem que descer" Tanto aspas como apostrofos sao aceitos para delimitar, mas voce precisa fechar a string " com o mesmo delimitador usado para abri-la" 41

.dw
Sintaxe: .dw num [num ...]

.dw imm16 [imm16 ...]

Descricao: Monta uma ou mais palavras de dados de 16 bits em formato little-endian (LSB no endereo mais baixo, MSB no endereo mais alto). c c

.dz
Sintaxe: .dz string

.dz string

Descricao: Monta uma string de dados ASCII a partir do endereo atual, e adiciona um byte 0 c ao nal, como usado pela linguagem C. Note que algumas rotinas CP/M esperam terminadores diferentes (um $, por exemplo) para strings.

.empty
Sintaxe: .empty num Descricao: Pula um nmero dado de bytes, preenchendo-os com zeros. u

.empty imm16

.endm
Sintaxe: .endm Descricao: Termina a denio de uma macro iniciada com .macro. ca

.endm

.endr
Sintaxe: .endr Descricao: Termina um bloco de repetio iniciado com .repeat ou .rept. ca

.endr

.forget
Sintaxe: .forget prexo de label

.forget prexo

Descricao: Torna labels (rtulos) invlidos a partir do ponto da diretiva, permitindo que os o a nomes de labels possam ser reutilizados. Todas os labels iniciados com o prexo dado so afetados. a Exemplo:
1

inicio:

ld %de, $e000 ld %hl, $d000 ld %b, $60 42

meuloop: ld %a, (%de) ld (%hl), %a inc %hl inc %de meufim: djnz meuloop .forget meu ; meuloop e meufim sao invalidas ; daqui em diante rotina2: ld %a, (%dhl) cp $55 jr z, meufim jr inicio ; a label inicio ainda eh valida meufim: ret ; eh permitido redefinir meufim pois ; ela havia sido esquecida com .forget

10

15

.header
Sintaxe: .header basic | msxdos | uzix | raw

.header tipo

Descricao: Dene o tipo de cabealho binrio a ser gerado e, em alguns dos casos, a origem c a (.origin). Deve ser especicado antes de qualquer instruo ou diretiva que avance ca o contador de programa. Idealmente deve estar na primeira linha do arquivo ou logo abaixo das linhas de comentrio iniciais. a basic Gera um arquivo binrio carregvel atravs do comando BLOAD do MSXa a e BASIC. O cabealho tem 7 bytes. No ajusta a origem, que precisa estar c a aps $8000 , de preferncia prxima de $c000 para evitar sobreposies com o e o co programas BASIC e variveis de sistema. a msxdos Gera um arquivo .COM compat vel com MSX-DOS (CP/M). A origem ajustada para $100, no h cabealho, o primeiro byte do arquivo j a e a a c a e primeira instruo. ca uzix Gera um binrio compat a vel com o sistema operacional UZIX. A origem e ajustada para $110 e h um cabealho de 16 bytes, mas recomendado usar o a c e stub genrico para programas UZIX disponibilizado com o fa , que inicializa e as variveis do processe adequadamente e chama o rtulo main. a o raw Apenas escreve as instrues no arquivo de sa sem qualquer cuidado especo da cial. Semelhante ao modo msxdos, porm sem ajustar a origem. e

.include
Sintaxe: .include nomearq

.include nomearq

43

Descricao: Monta o arquivo de entrada indicado a partir do ponto atual, semelhante ` diretiva a #include da linguagem C. O arquivo procurado: no diretrio corrente e, caso o nomearq no seja um came o a inho absoluto (iniciado em /), procurado tambm nos seguintes diretrios, nesta e e o ordem: /include/asm , /usr/include/asm , /usr/local/include/asm , /foca/asm, /opt/foca/asm. No futuro ser permitido adicionar outros diretrios ao caminho a o de busca atravs de opes de linha de comando.. e co

.origin
Sintaxe: .origin endereo c Sintaxe: .org endereo c

.origin imm16

Descricao: Ajusta a origem (endereo de montagem) para o endereo dado. Se utilizada em um c c ponto do arquivo onde algum dado ou instruo j tenha sido montado, preenche ca a com zeros o espao entre o contador de programa atual e a nova origem. S c o e poss redenir a origem para a frente. vel

.macro
Sintaxe: .macro identicador

.macro ident

Descricao: Inicia a denio de uma macro. Macros so denidas internamente ao assembler ca a e expandidas com a diretiva .x. Macros permitem que vrias instrues sejam a co abreviadas com apenas uma linha. Os nomes de macro so case-sensitive, ou seja, maisculas so diferentes de a u a minsculas. Os nomes de macro esto sujeitos `s mesmas regras sintticas dos u a a a nomes de labels, mas labels e macros esto em espaos diferentes: permitido ter a c e uma macro e uma label com o mesmo nome. Toda e qualquer label denida dentro de uma denio de macro local ` macro e ca e a pode ser referenciada apenas dentro da prpria macro. (Mas as macros podem usar o labels denidas externamente sem problema, desde que a label esteja dispon no vel contexto em que a macro estiver sendo expandida. Denies de macro so terminadas com a diretiva endm. Macros podem ter no co a mximo 1024 bytes (cada) em seu corpo, sendo que cada linha da macro tem os a comentrios removidos antes de ser armazenada. a Exemplo:
1

.macro inc4hl ; 4x inc %hl .repeat 4 inc %hl .endr .endm .macro push push push push pushall ; empilha todos os registradores %af %bc %de %hl 44

10

push %ix push %iy .endm


15

20

.macro popall ; desfaz pushall pop %iy pop %ix pop %hl pop %de pop %bc pop %af .endm .def rotina_obscura $015b .x pushall ; salva registradores call rotina_obscura .x popall ; recupera

25

30

35

ld %b, 64 ld %a, $c0 loop: ld (%hl), %a [inc4hl] ; sintaxe alternativa para .x inc4hl dec %a djnz loop ret

.repeat
Sintaxe: .repeat num Sintaxe: .rept num

.repeat imm8

Descricao: Inicia um bloco de repetio. Note que a repetio feita pelo assembler em tempo ca ca e de montagem, e no pela CPU em tempo de execuo do programa. O bloco a ca e terminado pela diretiva .endr. No permitido aninhar blocos de repetio. a e ca Exemplo:
1

.repeat 4 inc %hl .endr ; o codigo acima e o codigo abaixo geram as mesma instrucoes ; no arquivo de saida inc inc inc inc %hl %hl %hl %hl 45

10

.x
Sintaxe: .x nome de macro Sintaxe: [nome de macro]

.x ident

Descricao: Expande a macro indicada no ponto atual do programa. A sintaxe alternativa permite expandir macro escrevendo seu nome entre colchetes. Veja exemplo na descrio da diretiva .macro. ca

46

Cap tulo 4

Programando para Uzix


Uzix um sistema operacional para o MSX que implementa as funcionalidades do AT&T Unix Version 7. e O Uzix multi-tarefa, multi-usurio e oferece infra-estrutura de rede (TCP/IP). O fa oferece include les e a e cabealhos que facilitam a programao em ambiente Uzix. c ca Este cap tulo toma como base o Uzix 0.2.0, mas notas a respeito de verses anteriores sero feitas quando o a necessrio. a

4.1

Multi-Tarefa no Uzix

O Uzix implementa multi-tarefa preemptiva, mas a arquitetura MSX no possui um modo protegido, e a mesmo que tivesse, acessar o hardware via chamadas de sistema seria excessivamente lento para perifricos e como o VDP. Portanto, o funcionamento correto da multi-tarefa depende dos processos no se sabotarem a nem sabotarem o sistema. A multi-tarefa preemptiva consiste em manter uma tabela com os dados dos processos (em que bloco(s) da mapper eles esto, seus descritores de arquivo abertos, o estado dos registradores quando o processo a perdeu a CPU pela ultima vez) e dar a CPU a um processo por vez por um determinado tempo (este tempo denominado quantum. Quando o tempo de CPU do processo acaba, o kernel do Uzix (atravs do e e seu manipulador de interrupes) salva o estado do processo atual (todo o banco de registradores e o PC), co chaveia a expanso de memria1 para mapear o prximo processo, restaura os registradores do processo a o o que est recebendo a CPU e transfere o controle a ele. Toda multi-tarefa baseada na idia de chavear a a e e CPU entre vrios processos rapidamente, criando a iluso de que todos os processos executam ao mesmo a a tempo. Preemptiva signica que o kernel decide quando o processo j usou demais a CPU, e no o processo a a (isto seria multi-tarefa cooperativa). Este comportamento (preemptivo) apenas poss no Uzix porque o e vel manipulador de interrupes do kernel est sempre sendo chamado de forma transparente e pode contar co a h quanto tempo o processo atual detem a posse da CPU. a Os problemas so: a Se o processo desabilitar as interrupes (instruo DI), o kernel nunca vai tomar a CPU dele, e a co ca multi-tarefa vai para o vinagre; No execute DI nos seus programas. a Se o processo acessa o hardware diretamente (realizando INs e OUTs diretamente ou mudando o modo de v deo via BIOS, por exemplo), o kernel no tem como detectar os acessos e reverter o a estado ao chavear o processo. Com isso, um processo que use o modo grco rodando concomitana temente com um processo que use o v deo em modo texto causar desordem, pois poder acessar o a a
1 Em

geral a Memory Mapper, mas houve uma verso do Uzix 1 que usava a MegaRAM como banco de processos. a

47

v deo pensando que est em modo grco quando est em modo texto e vice-versa para o processo a a a em modo texto. A unica forma segura de garantir inter-operabilidade usar apenas as chamadas de e sistema do Uzix para realizar I/O, mas o Uzix no prov drivers do som e suas funes de v a e co deo se resumem a escrever bytes no terminal; Como os processos no esto impedidos de realizar INs, OUTs, ler memria fora de seu espao de a a o c endereamento, etc., eles podem alterar pores da mapper que contm dados do Uzix ou de outros c co e processos, corrompendo o sistema. Os problemas acima no so falhas do Uzix, so consequncias diretas da inexistncia de um modo protea a a e e gido no MSX. No h como resolver esses problemas sem a adio de hardware especializado. E poss a a ca vel amenizar o problema provendo drivers (chamadas de sistema ou mdulos padronizados) para acesso aos o perifricos, porm esta soluo lenta, consome memria e consome tempo do desenvolvedor do sistema, e e ca e o portanto a soluo resolve um problema e cria trs problemas novos. ca e

4.2

Modelo de memria o

A Figura 4.1 mostra o layout de memria de um processo no Uzix. Toda vez que um processo ganha um o quantum de CPU, sua imagem mapeada a partir do endereo $0000. e c

text

data

alocacao dinamica

uso da pilha

stack

$0000 $0100
tamanho do processo

Figura 4.1: Mapa de Memria de um Processo o A regio $0000-$00FF contm dados de controle do processo, que no devem ser acesados diretamente a e a pela aplicao. ca O segmento text contm as instrues do processo. No h proteo de memria no MSX, portanto o e co a a ca o processo pode se auto-modicar, embora isso seja extremamente no-recomendado. a Os 16 bytes entre $0100-$010f formam o cabealho do processo. A instruo em $0100 precisa ser um JP c ca $0110 (c3 10 01) para que o Uzix reconhea o arquivo como executvel. Os 13 bytes restantes contm ags c a e e so preenchidos com ponteiros para variveis de ambiente e parmetros de linha de comando. Assim, o a a a programa de verdade comea em $0110. Alguma inicializao recomendada (o fa oferece um cabealho c ca e c padro em arquivos de stub, como veremos ` frente). a a A regio de dados compreende o heap e a pilha. O heap cresce ` medida em que o processo realiza chamadas a a brk ao sistema. Em programas C essas chamadas so materializadas pela fam malloc(). A pilha cresce ` a lia a medida em que vai sendo usada. Uma operao que tipicamente consome pilha uma chamada recursiva, ca e em que vrios contextos so salvos na pilha. Se a pilha e a regio de dados se encontrarem, o resultado a a a e desastroso. Como o MSX no possui segmentos de memria protegidos, no poss isolar os segmentos a o a e vel de heap e pilha. A comprimento de $0000 ao fundo da pilha o comprimento do processo. At o Uzix 1.0 todos os processos e e recebiam 32 KB. A partir do Uzix 0.2.0 (verso beta que resultar no Uzix 2.0) Os processos podem receber a a 48

slots de 16, 32 ou 48 KB de memria. Dois bits no cabealho do executvel indicam ao Uzix o tipo de o c a slot que deve ser alocado. O processo pode requerer um slot de 16KB, 32KB, 48KB ou automtico. No a modo automtico alocado o menor slot que comporte o processo. O processo no pode crescer alm a e a e do slot que alocado no momento de sua execuo. e ca

4.3

Exemplo: Oi Mundo!

Nesta seo apresentamos um programa-exemplo extremamente original: ele escreve uma mensagem no ca console (sa da-padro) e sai com cdigo 0 (sucesso). a o
1

.header uzix .include uzix.stub


5

_main: ld %hl, 10 push %hl ld %bc,string push %bc ld %de,1 push %de ld %hl,36 push %hl call 8 pop %hl pop %de pop %bc pop %hl ret string: .dz "Oi Mundo!\n"

; ; ; ; ; ; ; ; ;

o stub chama _main comprimento da string endereco descritor 1 (stdout) syscall 36 (write) chama write(1,string,13) desempilha syscall# desempilha valor de retorno

10

15

retorna ao stub

20

A diretiva .header diz ao fa para gerar um executvel no formato Uzix. O arquivo de include uzix.stub, a que ser listado na prxima seo, parte do fa e implementa uma inicializao padro do processo, a o ca e ca a semelhante `quela necessria para programas na linguagem C. Tudo o que precisamos saber sobre o stub a a no momento que ele chamar o label main com uma instruo CALL e ao receber o controle de volta e a ca sair com o valor do registrador DE como status. a Este programa apenas empilha os parmetros para a chamada de sistema write(int descritor, char *text, a int comprimento) (na ordem inversa, pois o Uzix segue a conveno de chamada do C), empilha o nmero ca u da system call indicando que um write (36) e chama a rotina no endereo $8, que o ponto de entrada e c e das chamadas de sistema do Uzix. O programa responsvel por desempilhar os parmetros. e a a

4.4

Stub

O fa inclui um stub para o Uzix, com uma inicializao padro do processo. O stub um arquivo assembly ca a e do fa , e est listado abaixo. a
1

.define e_flags

$103 49

.define .define .define .define .define .define

e_text e_data e_bss e_heap e_stack e_env

$104 $106 $108 $10a $10c $10e

10

15

20

25

30

35

40

45

50

ld (___stktop), %sp ; Clear BSS ld %hl, (e_data) ex %de, %hl ld %hl, (e_bss) or %a ; CLC sbc %hl, %de ld %c, %l ld %b, %h dec %bc ; BC = counter-1 ld %l, %e ld %h, %d ; HL = e_data inc %de ; DE = e_data+1 ld (%hl), 0 ldir ; clear bss - always >= 10 bytes pop %bc ; drop retaddr ; now there is the next stack structure: ; +4 envp ; +2 argv ; %sp-> +0 argc ld %ix, 0 add %ix, %sp ld %l, (%ix+4) ld %h, (%ix+5) ld (_environ), %hl ld %l, (%ix+2) ld %h, (%ix+3) ld (__argv), %hl ld %l, (%ix+0) ld %h, (%ix+1) ld (__argc), %hl _start1: call _main pop %bc pop %bc pop %bc ex %de, %hl ; exit arg in DE _exit: push %de ld %hl, (___cleanup) ld %a, %l or %h call nz, _indirect ; (*__cleanup)(exitcode, ???) 50

pop jr
55

%de __exit

; to kernel - arg in DE

_indirect: jp __exit:

(%hl)

60

ld push push call ; area de dados

%hl, 11 %de %hl 8

65

etext: ;
70

variaveis de gerencia de memoria .da .da .da .dw ebss ebss ebss 0

___heapbase: ___brklvl: ___heaptop: ___stktop: edata: __argc: __argv: _environ: _errno: ___cleanup: ebss:

75

80

.empty .empty .empty .empty .empty

2 2 2 2 2

4.5

Chamadas de Sistema

O Uzix implementa todas as chamadas de sistema do AT&T Unix 7, embora algumas variantes de exec() sejam providas apenas pela biblioteca C. Uma chamada de sistema realizada empilhando os parmetros na ordem inversa da declarao, empile a ca hando o nmero da chamada e ento fazendo um CALL 8. E responsabilidade da aplicao desempilhar u a ca os parmetros aps o CALL. O valor de retorno, de 16 bits, colocado no registrador DE. A unica exa o e ceo a chamada lseek, cujo valor de retorno de 32 bits e colocado em HL:DE (HL a palavra mais ca e e e e signicativa). A tabela abaixo lista as chamadas diretas, seus parmetros e nmero de chamada. a u Tabela 4.1: Chamadas Diretas de Sistema. # 0 1 args 2 1 syscall access alarm Prottipo C o int access(char *path, int mode) int alarm(int secs) 51

Tabela 4.1: (cont.) # 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 args 1 1 2 3 1 N 1 2 3 1 0 2 2 N 2 2 3 3 3 0 1 3 1 3 2 2 1 0 1 1 1 1 2 3 3 2 2 1 2 1 4 4 3 syscall Prottipo C o brk int brk(char *addr) chdir int chdir(char *path) chmod int chmod(char *path, int mode) chown int chown(char *path, int owner, int group) close int close(int fd) getset int getset(int operacao, ...) dup int dup(int oldd) dup2 int dup2(int oldd, int newd) execve int execve(char *name, char **argv, char **envp) exit int exit(int status) fork int fork(void) fstat int fstat(int fd, void *buf) getfsys int getfsys(int dev, void *buf) ioctl int ioctl(int fd, int req, ...) kill int kill(int pid, int sig) link int link(char *oldname, char *newname) mknod int mknod(char *name, int mode, int dev) mount int mount(char *spec, char *dir, int rwflag) open int open(char *name, int flags, int mode) pause int pause(void) pipe int pipe(int *fd) read int read(int fd, void *buf, int bytes) sbrk int sbrk(int incr) lseek long lseek(int fd, long offset, int flag) signal int signal(char sig num, void (*func)(int) ) stat int stat(char *path, void *buf) stime int stime(int *tvec) sync int sync(void) time void time(int *t) times int times(struct tms *tvec) umount int umount(char *spec) unlink int unlink(char *path) utime int utime(char *path, struct utimbuf *buf) waitpid int waitpid(int pid, int *statloc, int options) write int write(int fd, void *buf, int nbytes) reboot int reboot(char p1, char p2) symlink int symlink(char *oldname, char *newname) chroot int chroot(char *path) mod reg int mod reg(int sig, int (*func)()) mod dereg int mod dereg(int sig) mod call int mod call(int sig, int fnc, char *args, int argsz) mod sendreply int mod sendreply(int pid, int fnc, char *r, int rsz) mod reply int mod reply(int sig, int fcn, char *r) Tabela 4.1: Chamadas Diretas de Sistema

52

As chamadas relativas a mdulos (mod *) permitem a extenso do kernel do Uzix com novas funcionalio a dades. A mais comum o mdulo TCP/IP que prov funes de rede e conexo com a Internet. e o e co a A chamada creat realizada como uma chamada para open: e Chamada Proxy creat(char *path, int mode) open(path, 0x301, mode)2 Tabela 4.2: Chamadas Indiretas de Sistema

As chamadas restantes so aquelas que apenas lm ou alteram o valor de uma varivel do sistema, como a e a getpid(). Estas so implementadas atravs da chamada 7, getset. A tabela seguinte lista as chamadas a e baseadas em getset 3 . Chamada getpid getppid getuid setuid geteuid getgid setgid getegid getprio setprio umask systrace Prottipo C o getpid(void) getppid(void) getuid(void) setuid(int uid) geteuid(void) getgid(void) setgid(int gid) getegid(void) getprio(void) setprio(int pid, char prio) umask(int mask) systrace(int onoff) Tabela 4.3: Chamadas via # Proxy 0 getset(0) 1 getset(1) 2 getset(2) 3 getset(3,uid) 4 getset(4) 5 getset(5) 6 getset(6,gid) 7 getset(7) 8 getset(8) 9 getset(9,pid,prio) 10 getset(10,mask) 11 getset(11,onoff) getset

4.6

Mdulos o

O Uzix permite a extenso de servios do sistema operacional atravs de mdulos que rodam como processos a c e o normais. Um mdulo um conjunto de funes, que recebem uma sequncia de no mximo 512 bytes como o e co e a entrada e devolvem uma sequncia tambm limitada a 512 bytes como resposta. Chamamos de requisio e e ca uma chamada de funo de um mdulo, e de reply a resposta de uma requisio. ca o ca Processos podem se registrar e desregistrar como mdulos com as chamadas mod reg e mod dereg. Em o e o o mod reg passada a assinatura (sig) do mdulo, que o identica dentre quaisquer outros mdulos, e um ponteiro para uma funo de callback, que chamada pelo kernel do Uzix quando h uma requisio ca e a ca para o mdulo. Esta funo de callback deve usar mod sendreply para enviar a resposta ` chamada (ver o ca a Figuras 4.2 e 4.3). A funo de callback deve ser escrita de acordo com o prottipo C abaixo: ca o int callback(int fcn, int pid, char *data, int datasize);
2 0x301 3 os

= O CREAT|O TRUNC|O WRONLY tipos de retorno, omitidos, so sempre int. a

53

A funo deve retornar 0 em caso de sucesso no enleiramento (ou processamento imediato) da requisio ca ca ou os cdigos de erro EINVFUNC ou ENOMEM em caso de falha (os valores numricos dos cdigos de o e o erro esto listados no nal deste cap a tulo).
system calls
Processo (Mdulo)

UZIX (kernel)

mod_reg(sig, callback)

callback

Figura 4.2: Registro de Mdulo o Para usar um mdulo, um processo deve realizar chamadas de funes com a chamada mod call (que tem o co a assinatura do mdulo, nmero da funo dentro do mdulo e os dados da chamada, que podem ter at o u ca o e 512 bytes de comprimento). Esta chamada no bloqueante (retorna imediatamente ainda que a operao a e ca no tenha sido completada). Para vericar o resultado da operao, o processo deve chamar mod reply a ca at que esta retorne 0 (sucesso). Tanto na chamada como na resposta, parmetros passados por referncia e a e (ponteiros) so linearizados (copiados) no buer de mod call antes da chamada. a
Processo (cliente)

system calls

mod_call(A,...)

UZIX (kernel)
Mdulo A

mod_reply(A,...) fila de respostas

A.callback(...)

callback
mod_sendreply(...)

Parmetros da chamada Retorno da chamada

Figura 4.3: Chamada de funo em mdulo. A chamada mod call retorna to logo o callback do mdulo ca o a o retorne indicando a aceitaao ou no da requisio. Quando o termina de processar a requisio, o mdulo c a ca ca o enleira a resposta no kernel com a chamada mod sendreply. O processo requisitante precisa perguntar ao kernel se j h resposta dispon com a chamada mod reply at que a resposta esteja dispon a a vel e vel. As requisies e os replies so implementados com entrega imediata de requisies e uma la interna (no co a co 54

kernel) para replies. Como a maioria das chamadas de sistema, as chamadas mod * retornam 0 em caso de sucesso, < 0 em caso de erro, ajustando errno com a identicao do erro ocorrido. O mdulo pode recusar ca o uma requisiao (por no ter memria para armazen-la, por exemplo), neste caso mod call retornar um c a o a a valor negativo.

4.7

Mdulo TCP/IP o

O mdulo TCP/IP implementa um subconjunto de IPv4 e permite que o Uzix se comunique com outros o sistemas que suportem o protocolo. A assinatura do mdulo TCP/IP $4950, e ele prov as funes listadas na Tabela 4.4. o e e co Tabela 4.4: Chamadas do Mdulo TCP/IP. o Chamada ipconnect ipgetc ipputc ipwrite ipread ipclose iplisten ipaccept ping setsocktimeout ipunlisten ipgetpingreply gettcpinfo getsockinfo Prottipo C o int ipconnect(char mode, ip struct t *ipstruct) int ipgetc(uchar socknum) int ipputc(uchar socknum, uchar byte) int ipwrite(uchar socknum, uchar *bytes, int len) int ipread(uchar socknum, uchar *bytes, int len) int ipclose(uchar socknum) int iplisten(int aport, uchar protocol) int ipaccept(ip struct t *ipstruct, int aport, uchar block) int ping(uchar *IP, unsigned long *unused, uint len) int setsocktimeout(uchar socknum, uint timeout) int ipunlisten(int aport) icmpdata t *ipgetpingreply(void) tcpinfo t *gettcpinfo(void) sockinfo t *getsockinfo(uchar socknum) Tabela 4.4: Chamadas do Mdulo TCP/IP. o FNC# 1 2 3 4 5 6 7 8 9 10 11 12 13 14

Os tipos de dados usados so: a


1

// numeros de ICMP_PROTOCOL TCP_PROTOCOL UDP_PROTOCOL

protocolo (protocolo para iplisten) = 1 = 6 = 17

// modos de abertura TCP_ACTIVE_OPEN = 255 TCP_PASSIVE_OPEN = 0


10

// protocolos (mode do ipconnect) IPV4_TCP = 1 IPV4_UDP = 2 IPV4_ICMP = 3

55

15

// modos UDP UDPMODE_ASC = 1 UDPMODE_CKSUM = 2 // codigos de ECONTIMEOUT = ECONREFUSED = ENOPERM = ENOPORT = ENOROUTE = ENOSOCK = ENOTIMP = EPROT = EPORTINUSE = erro $80 $81 $82 $83 $84 $85 $86 $87 $88

20

25

30

35

40

// estados permitidos para sockstatus em sockinfo_t TCP_CLOSED = $00 TCP_LISTEN = $01 TCP_SYN_SENT = $42 TCP_SYN_RECEIVED = $43 TCP_ESTABLISHED = $c4 TCP_FIN_WAIT1 = $45 TCP_FIN_WAIT2 = $46 TCP_CLOSE_WAIT = $87 TCP_CLOSING = $08 TCP_LAST_ACK = $09 TCP_TIMEWAIT = $0a UDP_LISTEN = $91 UDP_ESTABLISHED = $94 ip_struct_t = { uchar remote_ip[4], uint remote_port, uint local_port } icmpdata_t = { uchar type, uchar icmpcode, unsigned long unused, uchar data[28], /* pad para 64 bytes */ uint len; uchar sourceIP[4], uchar ttl } = { uchar IP[4], uchar dns1ip[4], uchar dns2ip[4], char datalink[5], char domainname[DOMSIZE=128], int used_sockets, int avail_sockets, int used_buffers, 56

45

50

55

tcpinfo_t

60

65

int avail_buffers, int IP_chksum_errors } sockinfo_t = { int localport, int remoteport, uchar remote_ip[4], char socketstatus, /* bit 7: permissao de escrita bit 6: estado de listen bits 3-0: estado */ char sockettype, /* TCP = 1, UDP = 2 */ char sockerr, /* codigo de erro */ int pid }

70

75

4.7.1

Estabelecimento de conexo a

Para estabelecer uma conexo utilizada a chamada ipconnect. O conceito de conexo aqui se refere a e a a ` criaao de estruturas internas no kernel (semelhante ` criao de sockets em sistemas Unix de maior c a ca porte, como BSD e Linux), portanto necessrio chamar ipconnect mesmo para transmitir pacotes UDP. e a ipconnect retorna o identicador da conexo. a

4.7.2

Envio e recebimento de dados

Para enviar e receber dados so usadas as chamadas ipread, ipwrite, ipgetc e ipputc. A conexo deve ser a a fechada com ipclose. Todas as conexes de um processo so fechadas quando o processo termina. o a

4.7.3

Esperando uma conexo ou pacotes UDP a

Para esperar uma conexo, deve-se chamar iplisten (equivalente ao bind de outros Unixes) para associar a uma porta ao processo. O processo ento deve aguardar uma conexo chamando ipaccept, que retornar a a a o identicador a ser usado para ler e escrever da conexo TCP ou do pacote UDP. A chamada ipunlisten a permite desassociar a porta do processo.

4.7.4

Ping

A operaao de ping (protocolo ICMP) realizada pela chamada ping, e o pacote de eco recebido pela c e e chamada ipgetpingreply (que retorna 0 caso tenha sucesso).

4.7.5

Outras Operaoes c

As demais operaes conguram o timeout para operaes (setsocktimeout) e obtm informaes sobre co co e co conexes e sobre o mdulo TCP/IP (getsockinfo e gettcpinfo). o o Ainda existem duas chamadas declaradas com nmeros de funo 15 e 16, rawclose e shutdown, mas elas u ca no esto declaradas nos cabealhos para usurios da biblioteca C e so chamadas no documentadas. a a c a a a As operaoes de resoluo de nomes (DNS) no esto implementadas no mdulo TCP/IP, e esto dispon c ca a a o a veis apenas em biblioteca C, ligada estaticamente com os programas que a utilizam, portanto no poss a e vel utiliz-la em programas assembly (pelo menos no de forma fcil). a a a 57

4.8

Cdigos de erro o

As chamadas de sistema do Uzix retornam um valor 0 em caso de sucesso e < 0 em caso de erro, e o cdigo de erro colocado na varivel global (denida no stub dos programas Uzix) errno. Abaixo esto o e a a relacionados os poss veis cdigos de erro. o
1

10

15

20

25

30

35

40

EPERM ENOENT ESRCH EINTR EIO ENXIO E2BIG ENOEXEC EBADF ECHILD EAGAIN ENOMEM EACCES EFAULT ENOTBLK EBUSY EEXIST EXDEV ENODEV ENOTDIR EISDIR EINVAL ENFILE EMFILE ENOTTY ETXTBSY EFBIG ENOSPC ESPIPE EROFS EMLINK EPIPE EDOM ERANGE EDEADLK ENAMETOOLONG ENOLCK EINVFNC ENOTEMPTY ELOOP ESHELL ENOSYS

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 EINVFNC

/*-*/

/*-*/ /*-*/ /*-*/ /*-*/

/*-*/ /*-*/ /*-*/ /*-*/ /*-*/ /*-*/ /*-*/ /*-*/ /*-*/ /*-*/

/* /* /* /* /* /* /* /* /* /* /* /* /* /* /* /* /* /* /* /* /* /* /* /* /* /* /* /* /* /* /* /* /* /* /* /* /* /* /* /* /*

1 Operation not permitted */ 2 No such file or directory */ 3 No such process */ 4 Interrupted system call */ 5 I/O error */ 6 No such device or address */ 7 Arg list too long */ 8 Exec format error */ 9 Bad file number */ 10 No child processes */ 11 Try again */ 12 Out of memory */ 13 Permission denied */ 14 Bad address */ 15 Block device required */ 16 Device or resource busy */ 17 File exists */ 18 Cross-device link */ 19 No such device */ 20 Not a directory */ 21 Is a directory */ 22 Invalid argument */ 23 File table overflow */ 24 Too many open files */ 25 Not a typewriter */ 26 Text file busy */ 27 File too large */ 28 No space left on device */ 29 Illegal seek */ 30 Read-only file system */ 31 Too many links */ 32 Broken pipe */ 33 Math argument out of domain of func */ 34 Math result not representable */ 35 Resource deadlock would occur */ 36 File name too long */ 37 No record locks available */ 38 Function not implemented */ 39 Directory not empty */ 40 Too many symbolic links encountered */ 41 Its a shell script */

58

Cap tulo 5

MSX-BIOS
5.1 Rotinas MSX-BIOS

A ROM do MSX mapeada nos primeiros 32K de memria ($0-$7FFF) e inclui a BIOS MSX e o MSX e o BASIC. Neste cap tulo documentamos as principais rotinas da BIOS. Mesmo quando a BIOS no est a a mapeada (dentro do MSX-DOS, por exemplo), poss chamar suas rotinas atravs de uma chamada e vel e CALSLT. Nos restringimos `s rotinas uteis em programas em Assembly, omitindo aquelas interdependentes do ina terpretador BASIC. A tabela resumida ordenada por endereo, e a lista descritiva ordenada pelo nome padronizado da e c e rotina. Lembre-se: nunca traduza slot como conector, isso di! o Para chamar uma rotina basta carregar os parmetros nos registradores e fazer um CALL para o endereo a c da rotina. A unica exceo CALLF ($0030) que usa um mtodo diferente para passagem de parmetros. ca e e a Os dados deste cap tulo foram obtidos de [Ava88]. Tabela 5.1: Rotinas MSX-BIOS, por endereo de chamada. c Endereo c $0000 $000C $0014 $001C $0020 $0024 $0030 $0038 $003B $003E $0041 $0044 $0047 $004A $004D $0050 $0053 Rotina CHKRAM RDSLT WRSLT CALSLT DCOMPR ENASLT CALLF KEYINT INITIO INIFNK DISSCR ENASCR WRTVDP RDVRM WRTVRM SETRD SETWRT Resumo Partida (boot) L dado de qualquer slot. e Escreve dado em qualquer slot. Chama rotina em qualquer slot. Compara DE e HL. Mapeia slot. Chama rotina em qualquer slot (inline). Manipulador de interrupo padro. ca a Inicializa PSG e porta de impressora. Inicializa strings das teclas de funo. ca Desativa tela. Ativa tela. Escreve em registrador do VDP. L byte da VRAM. e Escreve byte na VRAM. Prepara VDP para leitura. Prepara VDP para escrita. 59

Tabela 5.1: (cont.) Endereo c $0056 $0059 $005C $005F $0062 $0066 $0069 $006C $006F $0072 $0075 $0084 $0087 $008A $008D $0090 $0093 $0096 $0099 $009C $009F $00A2 $00A5 $00A8 $00AE $00B1 $00B4 $00B7 $00C0 $00C3 $00C6 $00CC $00CF $00D2 $00D5 $00D8 $00DB $00DE $00E1 $00E4 $00E7 $00EA $00ED $00F0 $00F3 $00F6 Rotina FILVRM LDIRMV LDIRVM CHGMOD CHGCLR NMI CLRSPR INITXT INIT32 INIGRP INIMLT CALPAT CALATR GSPSIZ GRPPRT GICINI WRTPSG RDPSG STRTMS CHSNS CHGET CHPUT LPTOUT LPTSTT PINLIN INLIN QINLIN BREAKX BEEP CLS POSIT ERAFNK DSPFNK TOTEXT GTSTCK GTTRIG GTPAD GTPDL TAPION TAPIN TAPIOF TAPOON TAPOUT TAPOOF STMOTR LFTQ Resumo Preenche bloco da VRAM. Copia bloco da VRAM para a RAM. Copia bloco da RAM para a VRAM. Altera modo do VDP. Altera cores do VDP. Manipulador da NMI. Limpa todos os sprites. Inicializa VDP em modo texto 40x24. Inicializa VDP em modo texto 32x24. Inicializa VDP em modo grco 256x192. a Inicializa VDP em modo multicolorido 64x48. Calcula endereo da imagem do sprite. c Calcula endereo do atributo do sprite. c Obtm tamanho do sprite. e Escreve caractere na tela grca. a Inicializa PSG. Escreve em registrador do PSG. L registrador do PSG. e Desempilha la musical. Verica buer do teclado. Obtm caractere do buer do teclado. e Escreve caractere na tela. Imprime caractere na porta de impressora. Teste de status da impressora. L uma linha do console. e L uma linha do console. e L uma linha do console. e Verica Ctrl+Stop. Emite beep. Limpa tela. Posiciona cursor. Apaga a linha das teclas de funo. ca Mostra a linha das teclas de funo. ca Retorna VDP ao modo texto. L status do joystick. e L status do boto do joystick. e a L status do tablet. e L status do paddle. e Aciona entrada de ta. L entrada de ta. e Desliga entrada de ta. Aciona sa de ta. da Escreve na sa de ta. da Desliga sa de ta. da Controla motor da unidade de ta. Verica espao em la musical. c 60

Tabela 5.1: (cont.) Endereo Rotina c Resumo $00F9 PUTQ Coloca byte em la musical. $00FC RIGHTC Move endereo de pixel ` direita. c a $00FF LEFTC Move endereo de pixel ` esquerda. c a $0102 UPC Move endereo de pixel acima. c $0105 TUPC Testa e move endereo de pixel acima. c $0108 DOWNC Move endereo de pixel abaixo. c $010B TDOWNC Testa e Move endereo de pixel abaixo. c $010E SCALXY Clipa coordenadas grcas. a $0111 MAPXYC Converte coordenadas do modo grco. a $0114 FETCHC Obtm endereo f e c sico do pixel atual. $0117 STOREC Armazena endereo f c sico do pixel atual. $011A SETATR Muda cor de desenho. $011D READC L atributo do pixel atual. e $0120 SETC Muda atributo do pixel atual. $0123 NSETCX Muda atributo de uma sequncia de pixels. e $0132 CHGCAP Altera LED do CAPS LOCK. $0135 CHGSND Altera o estado do click do teclado. $0138 RSLREG L registrador do slot primrio. e a $013B WSLREG Escreve registrador do slot primrio. a $013E RDVDP L registrador de status do VDP. e $0141 SNSMAT L linha da matriz de teclado. e $0156 KILBUF Limpa buer do teclado. $0159 CALBAS Chama rotina BASIC a partir de qualquer slot. Tabela 5.1: Rotinas MSX-BIOS, por endereo de chamada. c

5.2
3 3

Listagem Alfabtica Descritiva e


Parmetros de entrada. a Parmetros de sa a da.

Na listagem a seguir so usados os seguintes s a mbolos:

Registradores e estados modicados. EI indica que as interrupes so habilitadas. co a

BEEP
Emite um beep de 1316 Hz. 3 3 Nenhum. Nenhum. AF, BC, E, EI.

$00C0

61

BREAKX
Verica estado da combinao de teclas Ctrl+Stop. ca 3 3 Nenhum. Flag C=1 se Ctrl+Stop estiver pressionada. AF.

$00B7

CALATR
3 3

$0087

Calcula o endereo de um bloco de atributos de sprite, que AT RBAS + 4 numsprite, c e com o nmero do sprite entre 0 e 31. u A: nmero do sprite. u HL: endereo do atributo do sprite. c AF, DE, HL.

CALBAS
3 3

$0159

Chama um endereo no interpretador BASIC mesmo que este no esteja mapeado, apenas c a carrega IY com o valor correto de slot e chama CALSLT para realizar a chamada. IX=endereo a chamar. c Nenhum. AF, BC, DE, HL, IY, DI.

CALLF

$0030

Chama um endereo em qualquer slot. Tem a peculiaridade de usar parmetros inline, para c a permitir o uso dentro de hooks (ganchos). Exemplo: rst $30 ; chama callf .db 2 ; slot primario 2 (slot id) .dw $4555 ; endereco a chamar ret ; fim do hook 3 3 Slot e endereo passados inline. c Nenhum. AF, BC, DE, HL, IX, IY, DI.

62

CALPAT
3 3

$0084

Calcula o endereo de uma imagem de sprite, que P AT BAS + 8 numsprite para sprites c e 8 8 e P AT BAS + 32 numsprite para sprites 16 16. A: nmero do sprite. u HL: endereo da imagem do sprite. c AF, DE, HL.

SF

SUBSLOT

SLOT

1 se subslot estiver indicado (slot expandido)

Figura 5.1: Slot ID.

CALSLT
Chama rotina em qualquer slot. 3 3 IY: slot ID (ver Figura 5.1) no byte mais signicativo, IX: endereo a chamar. c Nenhum. AF, BC, DE, HL, DI.

$001C

CHGCAP
3 3 A: 0=desliga, 1-255=liga. Nenhum. AF.

$0132

Controla o LED do CAPS LOCK (apenas o LED, no o estado do CAPS LOCK para efeito a de entrada de caracteres).

63

CHGCLR
Muda as cores da tela de acordo com o contedo de FORCLR, BAKCLR e BDRCLR. u 3 3 Nenhum. Nenhum. AF, BC, HL, EI.

$0062

CHGET
3 3

$009F

Retorna o prximo caractere no buer de teclado ou aguarda at que uma tecla seja preso e sionada. Nenhum. A: caractere. AF, EI.

CHGMOD
Altera o modo de v deo. 3 3 A: modo de tela (0-3). Nenhum. AF, BC, DE, HL, EI.

$005F

CHGSND
Altera o estado do click sonoro do teclado. 3 3 A: 0=desliga, 1-255=liga. Nenhum. AF.

$0135

64

CHKRAM

$0000

3 3

Verica (de forma no destrutiva) a presena de RAM em todos os slots, prepara os slots a c primrio e secundrio para mapear a maior rea encontrada, reseta a rea de trabalho a a a a ($F380 a $FFC9), entra em modo de interrupo 1 (IM 1) e passa o controle para outras ca rotinas de inicializao da BIOS. ca Nenhum. Nenhum. AF, BC, DE, HL, SP.

CHPUT
Escreve um caractere na tela em modo texto e incrementa posio do cursor. ca 3 3 A: caractere. Nenhum. EI.

$00A2

CHSNS

$009C

3 3

Verica se um caractere do teclado est pronto. Em modo grco apenas compara os a a apontadores do buer de teclado (GETPNT e PUTPNT), em modo texto tambm atualiza e o display das teclas de funo. ca Nenhum. Flag Z=0 se houver caractere pronto. AF, EI.

CLRSPR
Limpa todos os sprites. 3 3 Nenhum. Nenhum. AF, BC, DE, HL, EI.

$0069

65

CLS
Limpa a tela (qualquer modo de tela). 3 3 A ag Z precisa estar setada. Nenhum. AF, BC, DE, EI.

$00C3

DCOMPR
Comparao aritmtica entre DE e HL. ca e 3 3

$0020

DE, HL. Flag C zerada se HL maior que DE, Flag Z setada se HL igual a DE, Flag C setada se HL menor que DE. AF.

DISSCR
Desativa a tela (desliga bit 6 do registrador de modo 1 do VDP). 3 3 Nenhum. Nenhum. AF, BC, EI.

$0041

DOWNC
3 3 .

$0108

Modica as variveis de sistema CLOC e CMASK para apontar para o pixel abaixo do pixel a atual. So produzidos endereos incorretos se o limite da tela for excedido. a c Nenhum. Nenhum. AF

DSPFNK
3 3 Nenhum. Nenhum. AF,BC,DE,EI.

$00CF

Mostra o display das teclas de funo na ultima linha dos modos texto (no faz nada nos ca a modos grcos). a

66

ENASCR
Ativa a tela (liga bit 6 do registrador de modo 1 do VDP). 3 3 Nenhum. Nenhum. AF, BC, EI.

$0044

ENASLT
3 3 A: slot ID (ver Figura 5.1), HL: endereo. c Nenhum. AF, BC, DE, DI.

$0024

Mapeia uma pgina (16K) de qualquer slot. A tentativa de remapaear a pgina 0 ($0000a a $3FFF, onde reside o BIOS) causa perda do sistema.

ERAFNK
3 3 Nenhum. Nenhum. AF,DE,EI.

$00CC

Apaga o display das teclas de funo na ultima linha dos modos texto (no faz nada nos ca a modos grcos). a

FETCHC
Obtm o endereo f e c sico do pixel atual (valores de CLOC e CMASK). 3 3 Nenhum. A: CMASK, HL: CLOC. A, HL.

$0114

FILVRM
Prenche uma rea da VRAM com um byte de dados. a 3 3 A: byte, BC: comprimento, HL: endereo VRAM. c Nenhum. AF, BC, EI.

$0056

67

GICINI

$0090

3 3

Inicializa o PSG e as variveis relacionadas ` la do comando PLAY do BASIC. Os rega a istradores 8, 9 e 10 do PSG so colocados em amplitude zero e o registrador 7 inicializado a e com $B8, ativando o gerador de sons e desativando o gerador de ru em cada canal. do Nenhum. Nenhum. EI.

GRPPRT
3 3

$008D

Escreve um caractere na tela grca, na posio determinada por GRPACX e GRPACY, a ca com cor FORCLR, e avana a posio. c ca A: caractere. Nenhum. EI.

GSPSIZ
3 3

$008A

Devolve o nmero de bytes ocupado por cada imagem de sprite, determinado a partir do u bit de tamanho no registrador de modo 1 do VDP. Nenhum. A: bytes por imagem (8 ou 32). AF.

GTPAD

$00DB

3 3

L o estado de um tablet ligado a uma das portas de joystick. O cdigo de funo pode estar e o ca entre 0 e 7, 0=l status ($FF se a caneta estiver tocando o tablet, $00 se no), 1=retorna e a coordenada X, 2=retorna coordenada Y, 3=l status da tecla ($00=solta, $FF pressionada), e e os valores 4 a 7 so as mesmas funes relativas ` segunda porta de joystick. a co a A: cdigo de funo. o ca A: status/valor lido. AF, BC, DE, HL, EI.

68

GTPDL

$00DE

L o valor de um paddle conectado a uma das portas de joystick. Cada uma das seis linhas e (4 direes + 2 botes) pode ser um paddle (gerador de pulso monoestvel controlado por co o a potencimetro: pense tele-jogo). Os 6 paddles o mpares esto associados ` primeira porta de a a joystick e os 6 paddles pares esto associados ` segunda porta. a a 3 3 A: nmero do paddle (1-12). u A: valor do paddle (0-255). AF, BC, DE, EI.

GTSTCK
L a posio do joystick ou das teclas de seta. e ca 3 3

$00D5

A: identicao do joystick (0=teclado, 1=joy 1. 2=joy 2). ca A: cdigo de posio, 0=centro, 1=norte at 8=noroeste, em sentido horrio (ver Figura 5.2). o ca e a AF, B, DE, HL, EI.

1 8 7 0 6 5 4 2 3

Figura 5.2: Cdigos de posio do Joystick. o ca

GTTRIG
Verica os botes dos joysticks ou a barra de espao. o c 3 3

$00D8

A: boto (0=espao, 1=joy 1 boto 1, 2=joy 2 boto 1, 3=joy 1 boto 2, 4=joy 2 boto 2). a c a a a a A: Estado ($00 = solto, $FF = pressionado). AF, BC, EI.

69

INIFNK
3 3 Nenhum. Nenhum. BC, DE, HL.

$003E

Inicializa as strings das teclas de funo com seus valores default (em ROM) (copia 160 ca bytes de $13A9 para FNKSTR).

INIGRP
Coloca o VDP em modo grco 256 192 (screen 2). a 3 3 Nenhum. Nenhum. AF, BC, DE, HL, EI.

$0072

INIMLT
Coloca o VDP em modo multicolorido 64 48 (screen 3). 3 3 Nenhum. Nenhum. AF, BC, DE, HL, EI.

$0075

INIT32
Coloca o VDP em modo texto 32 24 (screen 1). 3 3 Nenhum. Nenhum. AF, BC, DE, HL, EI.

$006F

70

INITIO

$003B

3 3

Inicializa o PSG e a porta de impressora. O registrador 7 do PSG colocado em $80 (fazendo e a porta A entrada e a porta B sa da), o registrador 15 colocado em $CF (para inicializar o e hardware das portas de joystick), e o registrador 14 tem o bit de modo de teclado colocado em modo KANAMD. Um valor $FF enviado ` porta de status da impressora ($90) para e a levantar o STROBE. O restante da inicializao realizado pela rotina GICINI. ca e Nenhum. Nenhum. AF, E, EI.

INITXT
Coloca o VDP em modo texto 40 24 (screen 0). 3 3 Nenhum. Nenhum. AF, BC, DE, HL, EI.

$006C

INLIN
Recebe caracteres do teclado at que Return ou Ctrl+Stop sejam pressionadas. e 3 3 Nenhum. HL: endereo do buer, Flag C=1 se terminado com Ctrl+Stop. c AF, BC, DE, HL, EI.

$00B1

KEYINT

$0038

3 3

Manipulador padro de interrupes do VDP. O bit 7 do registrador de status lido para a co e garantir que uma interrupo do VDP. Se no for, retorna imediatamente. Atualiza e ca a entradas de TRPTBL em caso de coliso de sprites, incrementa contadores INTCNT (ON a INTERVAL) e JIFFY (TIME), processa la do comando PLAY se necessrio, varre teclado a e atualiza estado dos botes dos joysticks. o Nenhum. Nenhum. EI.

71

KILBUF
3 3 Nenhum. Nenhum. HL.

$0156

Limpa KEYBUF, o buer de 40 caracteres do teclado, igualando GETPNT e PUTPNT.

LDIRMV
Copia um bloco de dados da VRAM para a RAM. 3 3 BC: comprimento, DE: endereo RAM (destino), HL: endereo VRAM (fonte). c c Nenhum. AF, BC, DE, EI.

$0059

LDIRVM
Copia um bloco de dados da memria principal para a VRAM. o 3 3

$005C

BC: comprimento, DE: endereo VRAM (destino), HL: endereo memria principal (fonte). c c o Nenhum. AF, BC, DE, HL, EI.

LEFTC
3 3 .

$00FF

Modica as variveis de sistema CLOC e CMASK para apontar para o pixel ` esquerda do a a pixel atual. So produzidos endereos incorretos se o limite da tela for excedido. a c Nenhum. Nenhum. AF

LFTQ
Retorna o nmero de bytes livres em uma das trs las musicais. u e 3 3 A: nmero da la u HL: espao livre c AF, BC, HL.

$00F6

72

LPTOUT
3 3

$00A5

Aguarda que a impressora esteja dispon (no BUSY), escreve um caractere na porta de vel a impressora e gera um pulso 0 no sinal de STROBE. Pode ser interrompido por Ctrl-Stop. A: caractere a imprimir. Flag C se houver interrupo por Ctrl-Stop. ca AF.

LPTSTT
L o sinal de BUSY na porta de impressora (porta $90). e 3 3 Nenhum. A=0 e Flag Z setado se a impressora estiver ocupada. AF.

$00A8

MAPXYC
3 3 BC: coordenada x, DE: coordenada y Endereo VRAM em CLOC ($F92A), Mscara de bit em CMASK ($F92C) c a AF, D, HL.

$0111

Converte uma coordenada de tela dos modos grcos no endereo VRAM correspondente. a c

NMI
Tratador padro para a interrupo no-mascarvel. No faz nada. a ca a a a 3 3 Nenhum. Nenhum. Nenhum.

$0066

NSETCX
3 3 HL: nmero de pixels. u Nenhum. AF, BC, DE, HL, EI.

$0123

Modica para ATRBYT o atributo de uma sequncia horizontal de pixels com o pixel atual e (CLOC/CMASK) como pixel mais ` esquerda. a

73

PINLIN
Recebe caracteres do teclado at que Return ou Ctrl+Stop sejam pressionadas. e 3 3 Nenhum. HL: endereo do buer, Flag C=1 se terminado com Ctrl+Stop. c AF, BC, DE, HL, EI.

$00AE

POSIT
Posiciona cursor (em modo texto). 3 3 H: coluna, L: linha (a origem da tela (1,1)). e Nenhum. AF, EI.

$00C6

PUTQ
Coloca um byte de dados em uma das trs las musicais. e 3 3 A: nmero da la, E: dado. u Flag Z=1 se a la estiver cheia. AF, BC, HL.

$00F9

QINLIN
3 3 Nenhum. HL: endereo do buer, Flag C=1 se terminado com Ctrl+Stop. c AF, BC, DE, HL, EI.

$00B4

Apresenta um caractere ? e um espao e transfere o controle para a rotina INLIN (usado c pelo manipulador do comando INPUT).

RDPSG
L um byte de dados de um dos 16 registradores do PSG. e 3 3 A: registrador. A: valor lido. A.

$0096

74

RDSLT
L um byte de qualquer slot. e 3 3 A: ID do slot (ver Figura 5.1), HL: endereo. c A: valor lido. AF, BC, DE, DI.

$000C

RDVDP
3 3

$013E

L o registrador de status do VDP pela porta de comando. O uso desta rotina pode confundir e o manipulador de interrupo. ca Nenhum. A: registrador de status do VDP. A.

RDVRM
L um byte da VRAM. e 3 3 HL: endereo VRAM. c A: byte lido. AF, EI.

$004A

READC
L atributo do pixel atual (CLOC/CMASK). e 3 3 Nenhum. A: cor do pixel atual. AF, EI.

$011D

RIGHTC
3 3 .

$00FC

Modica as variveis de sistema CLOC e CMASK para apontar para o pixel ` direita do a a pixel atual. So produzidos endereos incorretos se o limite da tela for excedido. a c Nenhum. Nenhum. AF

75

RSLREG
L o contedo do registrador de slot primrio pela porta A da PPI. e u a 3 3 Nenhum. A: valor lido. A.

$0138

SCALXY

$10E

Corta coordenadas fora da tela para coordenadas vlidas (coordenadas X negativas so a a transformadas em 0 e maiores que 255 so transformadas em 255, coordenadas Y negativas a so transformadas em 0 e maiores que 191 so transformadas em 191). a a 3 3 BC: coordenada X, DE: coordenada Y. BC: X, DE: Y, Flag C=1 se houve corte. AF.

SETATR
3 3 .

$011A

Muda o atributo corrente das rotinas SETC e NSETCX, copiando-o para a varivel ATRa BYT. A: cor. Flag C=1 se a cor for invlida. a F

SETC
Modica o atributo do pixel atual (CLOC/CMASK) para o valor de ATRBYT. 3 3 Nenhum. Nenhum. AF, EI.

$0120

SETRD
Prepara leitura da VRAM, escrevendo o endereo na porta de comando do VDP. c 3 3 HL: endereo. c Nenhum. AF, EI.

$0050

76

SETWRT
Prepara uma escrita na VRAM, escrevendo o endereo na porta de comando do VDP. c 3 3 HL: endereo. c Nenhum. AF, EI.

$0053

SNSMAT
3 3

$0141

L uma linha completa da matriz do teclado. A porta C da PPI lida e reescrita com e e nmero de linha nos bits apropriados, e a sa obtida da porta B da PPI. u da e A: Nmero de linha do teclado. u A: Colunas da linha do teclado. AF, C, EI.

STMOTR
Liga ou desliga o rel do motor do cassete pela porta C da PPI. e 3 3 A: 0=desligado, 1=ligado, 255=estado de corrente reversa. Nenhum. AF.

$00F3

STOREC
Muda o endereo do pixel atual (CLOC e CMASK). c 3 3 A: CMASK, HL: CLOC. Nenhum. Nada.

$0117

STRTMS
Verica as las musicais (PLAY) e inicia a execuo, se necessrio. ca a 3 3 Nenhum. Nenhum. Todos.

$0099

77

TAPIOF
Pra o motor do cassete. a 3 3 Nenhum. Nenhum. EI.

$00E7

TAPIN
L um byte do cassete. e 3 3 Nenhum. A: byte lido, ag C setado em caso de Ctrl-Stop ou erro de I/O. AF, BC, DE, L.

$00E4

TAPION
3 3 Nenhum. Flag C se interrompido por Ctrl-Stop. AF, BC, DE, HL, DI.

$00E1

Liga o motor da unidade de ta cassete e analisa o cabealho para preparar uma leitura. c

TAPOOF
3 3

$00F0

Chamada aps uma gravao. Aguarda 550 ms e interrompe o motor do cassete atravs da o ca e chamada TAPIOF. Nenhum. Nenhum. EI.

TAPOON

$00EA

3 3

Liga o motor do cassete, aguarda 550 ms (para que a unidade atinja a velocidade correta) e escreve um cabealho que servir para determinar a velocidade de gravao do bloco a ser c a ca gravado. A: 0=cabealho curto, 1-255=cabealho longo. c c Flag C em caso de interrupo por Ctrl-Stop. ca AF, BC, HL, DI.

78

TAPOUT
Escreve um byte de dados no cassete. 3 3 A: dado. Flag C se houver interrupo com Ctrl-Stop. ca AF, B, HL.

$00ED

TDOWNC
3 3 . Nenhum. Flag C=1 se o pixel atual estiver na ultima linha. AF

$010B

Testa se o pixel no est na ultima linha do v a a deo, e ento passa o controle para DOWNC. a

TOTEXT
3 3

$00D2

Se estiver em modo grco (screens 2 ou 3) volta ao modo texto anterior, seno no faz a a a nada. Nenhum. Nenhum. AF, BC, DE, HL, EI.

TUPC
3 3 . Nenhum. Flag C=1 se o pixel atual estiver na primeira linha. AF

$0105

Testa se o pixel no est na primeira linha do v a a deo, e ento passa o controle para UPC. a

UPC
3 3 .

$0102

Modica as variveis de sistema CLOC e CMASK para apontar para o pixel acima do pixel a atual. So produzidos endereos incorretos se o limite da tela for excedido. a c Nenhum. Nenhum. AF

79

WRSLT
Escreve um byte em qualquer slot. 3 3 A: slot ID (ver Figura 5.1), HL: endereo, E: byte de dado. c Nenhum. AF, BC, D, DI.

$0014

WRTPSG
Escreve um byte de dados em um dos 16 registradores do PSG. 3 3 A: registrador, E: valor. Nenhum. EI.

$0093

WRTVDP
3 3 B: byte de dado, C: registrador de modo. Nenhum. AF, B, EI.

$0047

Escreve um byte de dados em um dos registradores de modo do VDP, fazendo cpia na rea o a de trabalho (RG0SAV a RG7SAV).

WRTVRM
Escreve um byte na VRAM. 3 3 A: byte de dado, HL: endereo VRAM. c Nenhum. EI.

$004D

WSLREG
Escreve no registrador de slot primrio pela porta A da PPI. a 3 3 A: Valor a escrever. Nenhum. Nada.

$013B

80

5.3

Variveis da rea de trabalho a a

O bloco de RAM entre $F380 e $FD99 contm rotinas auxiliares `s rotinas de comutao de slot da e a ca BIOS (que no so chamadas diretamente) e diversas variveis que so consultadas e atualizadas tanto a a a a por rotinas da BIOS quanto pelo interpretador BASIC. Tabela 5.2: Variveis da rea de trabalho, por endereo. a a c Endereo c $F39A $F3AE $F3AF $F3B0 $F3B1 $F3B3 $F3B5 $F3B7 $F3B9 $F3BB $F3BD $F3BF $F3C1 $F3C3 $F3C5 $F3C7 $F3C9 $F3CB $F3CD $F3CF $F3D1 $F3D3 $F3D5 $F3D7 $F3D9 $F3DB $F3DC $F3DD $F3DE $F3DF $F3E7 $F3E8 $F3E9 $F3EA $F3EB $F3EC $F3EF Nome USRTAB LINL40 LINL32 LINLEN CRTCNT TXTNAM TXTCOL TXTCGP TXTATR TXTPAT T32NAM T32COL T32CGP T32ATR T32PAT GRPNAM GRPCOL GRPCGP GRPATR GRPPAT MLTNAM MLTCOL MLTCGP MLTATR MLTPAT CLIKSW CSRY CSRX CONSDFG RGnSAV STATFL TRGFLG FORCLR BAKCLR BDRCLR MAXUPD MINUPD Bytes 20 (102) 1 1 1 1 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 1 1 1 1 7 (71) 1 1 1 1 1 3 3 Resumo Endereos das funes USR0. . .USR9. c co Largura da screen 0. (comando WIDTH). Largura da screen 1. (comando WIDTH). Largura do modo de texto atual. Nmero de linhas nos modos texto. u Modo texto 4024: Base da tabela de nomes. Modo texto 4024: Base da tabela de cores. Modo texto 4024: Base da tabela de caracteres. Modo texto 4024: Base dos atributos de sprite. Modo texto 4024: Base das imagens de sprite. Modo texto 3224: Base da tabela de nomes. Modo texto 3224: Base da tabela de cores. Modo texto 3224: Base da tabela de caracteres. Modo texto 3224: Base dos atributos de sprite. Modo texto 3224: Base das imagens de sprite. Modo grco 256192: Base da tabela de nomes. a Modo grco 256192: Base da tabela de cores. a Modo grco 256192: Base da tabela de caracteres. a Modo grco 256192: Base dos atributos de sprite. a Modo grco 256192: Base das imagens de sprite. a Modo grco 6448: Base da tabela de nomes. a Modo grco 6448: Base da tabela de cores. a Modo grco 6448: Base da tabela de caracteres. a Modo grco 6448: Base dos atributos de sprite. a Modo grco 6448: Base das imagens de sprite. a Click do teclado: 0=desligado, 1-255: ligado. Coordenada Y do cursor em modo texto (1. . .CRTCNT). Coordenada X do cursor em modo texto (1. . .LINLEN). Apresentao das teclas de funo: 0=desligado. ca ca Cpia dos 8 registradores (n de 0 a 7) de modo (somente o escrita) do VDP. Cpia do registrador de status do VDP. o Estado dos botes dos joysticks e da barra de espao. o c Cor do primeiro plano. Cor do segundo plano (fundo). Cor da borda. (Cdigo automodicvel usado para traar retas). o a c (Cdigo automodicvel usado para traar retas). o a c 81

Tabela 5.2: (cont.) Endereo c $F3F2 $F3F3 $F3F5 $F3F6 $F3F7 $F3F8 $F3FA $F3FC $F401 $F406 $F408 $F40A $F40B $F40D $F40F $F414 $F415 $F416 $F417 $F418 $F419 $F41B $F41E $F41F $F55D $F55E $F661 $F662 $F663 $F664 $F665 $F666 $F668 $F669 $F66A $F674 $F676 Nome ATRBYT QUEUES FRCNEW SCNCNT REPCNT PUTPNT GETPNT CS1200 CS2400 LOW HIGH HEADER ASPCT1 ASPCT2 ENDPRG ERRFLG LPTPOS PRTFLG NTMSXP RAWPRT VLZADR VLZDAT KBFMIN KBUF BUFMIN BUF TTYPOS DIMFLG VALTYP DORES DONUM CONTXT CONSAV CONTYP CONLO STKTOP TXTTAB Bytes 1 2 1 1 1 2 2 5 5 2 2 1 2 2 5 1 1 1 1 1 2 1 1 318 1 259 1 1 1 1 1 2 1 1 8 2 2 Resumo Cor da tinta grca em funes grcas da BIOS. a co a Contm endereo do bloco de controle das las musie c cais. Indicador que distingue CLOAD (0) de CLOAD? (255). Contador usado para controlar a frequncia das e varreduras do teclado. Contador usado para controlar o nmero de repeties u co de uma tecla. Endereo de insero em KEYBUF (buer circular). c ca Endereo de remoo em KEYBUF (buer circular). c ca Parmetros do cassete para 1200 baud. a Parmetros do cassete para 2400 baud. a Parmetros do cassete atuais: ciclo LO. a Parmetros do cassete atuais: ciclo HI. a Parmetros do cassete atuais: ciclos no cabealho. a c Inverso da razo de aspecto do CIRCLE 256. a Razo de aspecto do CIRCLE 256. a Usado pelo interpretador BASIC para ON ERROR GOTO. Armazena o cdigo de erro do BASIC. o Usada por LPRINT, armazena posio da cabea de ca c impresso. a Determina se OUTDO deve direcionar sua sa para da a tela (0) ou impressora (1). Determina converso de caracteres grcos de OUTDO a a (0=sem converso, 1-255=espaos). a c Usada por OUTDO: 0=trata prexos grcos, 1=envia a dados para a impressora sem tratamento. Temporrio usado pela funo VAL do BASIC. a ca Temporrio usado pela funo VAL do BASIC. a ca Utilizado no tratamento de erros do BASIC. Utilizado no tratamento de erros do BASIC. Utilizado na entrada de linhas BASIC. Utilizado na entrada de linhas BASIC. Posio de tela atual, usada pelo PRINT. ca Usado pelo interpretador BASIC na instruo DIM. ca Usado pelo interpretador BASIC. Usada pelo interpretador BASIC (linhas DATA). Usada pelo interpretador BASIC. Usada pelo interpretador BASIC. Usada pelo interpretador BASIC. Usada pelo interpretador BASIC. Usada pelo interpretador BASIC. Contm o endereo do topo da pilha. e c Contm o endereo do texto de programa BASIC. e c 82

Tabela 5.2: (cont.) Endereo c $F678 $F67A $F698 $F69B $F69D $F69F $F6A1 $F6A3 $F6A5 $F6A6 $F6A7 $F6A9 $F6AA $F6AB $F6AD $F6AF $F6B3 $F6B5 $F6B7 $F6B9 $F6BB $F6BC $F6BE $F6C0 $F6C2 $F6C4 $F6C6 $F6C8 $F6CA $F6E4 $F6E6 $F6E8 $F74C $F74E $F750 $F7B4 $F7B5 Nome TEMPPT TEMPST DSCTMP FRETOP TEMP3 TEMP8 ENDFOR DATLIN SUBFLG FLGINP TEMP PTRFLG AUTFLG AUTLIN AUTINC SAVTXT ERRLIN DOT ERRTXT ONELIN ONEFLG TEMP2 OLDLIN OLDTXT VARTAB ARYTAB STREND DATPTR DEFTBL PRMSTK PRMLEN PARM1 PRMPRV PRMLN2 PARM2 PRMFLG ARYTA2 Bytes 2 30 3 2 2 2 2 2 1 1 2 1 1 2 2 2 2 2 2 2 1 2 2 2 2 2 2 2 26 2 2 100 2 2 100 1 2 Resumo Aponta para a prxima entrada livre de TEMPST. o Buer de descritores de string (BASIC). Buer temporrio para funes de string (BASIC). a co Aponta para a prxima posio livre no buer apontado o ca por MEMSIZ. Varivel temporria (interpretador BASIC). a a Varivel temporria (interpretador BASIC). a a Usada pelo interpretador BASIC (loops FOR). Linha do programa BASIC do item DATA atual. Usada pelo interpretador BASIC. BASIC: distingue INPUT (0) de READ (1-255). Varivel temporria (interpretador BASIC). a a Usada pelo interpretador BASIC. Flag do modo AUTO do BASIC. Nmero da linha AUTO atual (BASIC). u Incremento atual do AUTO (BASIC). Apontador de programa usado pelo manipulador de erro (BASIC). Nmero da linha que gerou o erro (BASIC). u Usada pelo interpretador BASIC. Usada pelo interpretador BASIC (RESUME). Usada pelo interpretador BASIC (ON ERROR GOTO). Usada pelo interpretador BASIC (ON ERROR GOTO). Varivel temporria (interpretador BASIC). a a Linha que terminou o programa BASIC, usada por CONT. Aponta a instruo que terminou o programa. ca Aponta para a rea de armazenamento de variveis a a (BASIC). Aponta para a rea de armazenamente de arrays (BAa SIC). Aponta para o byte seguinte ` rea de ARYTAB (BAaa SIC). Aponta para item DATA atual (BASIC). Tipos de varivel, por letra (BASIC), denidos por a DEFINT, DEFSTR, etc. Usada pelo interpretador BASIC. Usada pelo interpretador BASIC. Usada pelo interpretador BASIC (buer do FN). Usada pelo interpretador BASIC (FN). Usada pelo interpretador BASIC (FN). Usada pelo interpretador BASIC (buer do FN). Usada pelo interpretador BASIC. Usada pelo interpretador BASIC. 83

Tabela 5.2: (cont.) Endereo c $F7B7 $F7B8 $F7BA $F7BC $F7C4 $F7C5 $F7F2 $F7F4 $F7F6 $F806 $F847 $F857 $F85F $F860 $F862 $F864 $F866 $F871 $F87C $F87D $F87F $F91F $F922 $F924 $F926 $F928 $F92A $F92C $F92D $F92F $F931 $F933 $F935 $F936 $F938 $F939 $F93B $F93D $F93F $F941 $F942 $F944 Nome NOFUNS TEMP9 FUNACT SWPTMP TRCFLG FBUFFR DECTM2 DECCNT DAC HOLD8 ARG RNDX MAXFIL FILTAB NULBUF PTRFIL FILNAM FILNM2 NLONLY SAVEND FNKSTR CGPNT NAMBAS CGPBAS PATBAS ATRBAS CLOC CMASK MINDEL MAXDEL ASPECT CENCNT CLINEF CNPNTS CPLOTF CPCNT CPCNT8 CRCSUM CSTCNT CSCLXY CSAVEA CSAVEM Bytes 1 2 2 8 1 43 2 2 16 65 16 8 1 2 2 2 11 11 1 2 160 3 2 2 2 2 2 1 2 2 2 2 1 2 1 2 2 2 2 1 2 1 Resumo Usada pelo interpretador BASIC. Varivel temporria (interpretador BASIC). a a Usada pelo interpretador BASIC. Usada pelo interpretador BASIC (SWAP). Ativado quando TRON est ligado (BASIC). a Buer de converso numrica (BASIC). a e Varivel temporria (interpretador BASIC). a a Varivel temporria (interpretador BASIC). a a Buer de avaliao de expresso do BASIC. ca a Buer temporrio de multiplicao (BASIC). a ca Buer de avaliao de expresso do BASIC. ca a Contm o ultimo nmero aleatrio (preciso dupla). e u o a Nmero de buers de E/S alocados (BASIC). u Aponta para a tabela de FCBs dos buers de E/S (BASIC). Aponta para o buer de E/S. Aponta para o FCB do buer de E/S ativo. Buer de nome de arquivo. (BASIC). Buer de nome de arquivo. (BASIC). Usada pelo interpretador BASIC. Usada pelo interpretador BASIC. Buer com strings das teclas de funo. ca Aponta para a tabela de caracteres em ROM (Slot ID 0 seguido do endereo $1BBF). c Base da tabela de nomes no modo de v deo atual. Base da tabela de caracteres no modo de v deo atual. Base da tabela de imagens de sprites no modo de v deo atual. Base da tabela de atributos de sprites no modo de v deo atual. Endereo do pixel atual (funes grcas da BIOS). c co a Mscara do pixel atual. a Usado pela instruo LINE. ca Usado pela instruo LINE. ca Usado pela instruo CIRCLE. ca Usado pela instruo CIRCLE. ca Usado pela instruo CIRCLE. ca Usado pela instruo CIRCLE. ca Usado pela instruo CIRCLE. ca Usado pela instruo CIRCLE. ca Usado pela instruo CIRCLE. ca Usado pela instruo CIRCLE. ca Usado pela instruo CIRCLE. ca Usado pela instruo CIRCLE. ca Temporrio usado por funes grcas da BIOS. a co a Temporrio usado por funes grcas da BIOS. a co a 84

Tabela 5.2: (cont.) Endereo c $F945 $F947 $F949 $F94A $F94B $F94D $F94F $F951 $F953 $F954 $F955 $F958 $F959 $F971 $F975 $F9F5 $FA75 $FAF5 $FB35 $FB36 $FB38 $FB39 $FB3B $FB3C $FB3E $FB3F $FB40 $FB41 $FB66 $FB8B $FBB0 Nome CXOFF CYOFF LOHMSK LOHDIR LOHADR LOHCNT SKPCNT MOVCNT PDIREC LEPROG RTPROG MCLFLG QUETAB QUEBAK VOICAQ VOICBQ VOICCQ RS2IQ PRSCNT SAVSP VOICEN SAVVOL MCLLEN MCLPTR QUEUEN MUSICF PLACNT VCBA VCBB VCBC ENSTOP Bytes 2 2 1 1 2 2 2 2 1 1 1 1 24 4 128 128 128 64 1 2 1 2 1 2 1 1 1 37 37 37 1 Resumo Usado pela instruo CIRCLE. ca Usado pela instruo CIRCLE. ca Usado pela instruo PAINT. ca Usado pela instruo PAINT. ca Usado pela instruo PAINT. ca Usado pela instruo PAINT. ca Usado pela instruo PAINT. ca Usado pela instruo PAINT. ca Usado pela instruo PAINT. ca Usado pela instruo PAINT. ca Usado pela instruo PAINT. ca Linguagem de macro atual, 0=DRAW, 1-255=PLAY. Blocos de controle das las musicais. Usado pelo manipulador de la musical. Buer da la musical A. Buer da la musical B. Buer da la musical C. Buer da la RS232. Usado pelo interpretador BASIC (PLAY). Usado pelo interpretador BASIC (PLAY). Voz atual do interpretador PLAY. Usado pelo interpretador BASIC (PLAY). Comprimento do operando de macro-linguagem analisado. Aponta para caractere de macro-linguagem sendo analisado. Fila atual do interpretador PLAY. Usado pelo interpretador BASIC (PLAY). Usado pelo interpretador BASIC (PLAY). Buer com parmetros da voz A do PLAY. a Buer com parmetros da voz B do PLAY. a Buer com parmetros da voz C do PLAY. a Se diferente de 0, faz warm boot quando CODE+GRAPH+CTRL+SHIFT forem pressionadas. Ativa (0) ou desativa (1-255) manipulador de CTRL+STOP. Varivel interna de funes da BIOS. a co Usada internamente pelo editor de tela do BASIC. Armazena o caractere sob o cursor. Usada pela rotina CHSNS para determinar se SHIFT est pressionado (0) ou no (1) para apresentar as a a strings das teclas de funo. ca Usada pelo BASIC. (indicadores de KEY(n) ON). Usado pelo interpretador BASIC. Armazena o estado anterior da matriz de teclado. 85

$FBB1 $FBB2 $FBCA $FBCC $FBCD

BASROM LINTTB FSTPOS CURSAV FNKSWI

1 24 2 1 1

$FBCE $FBD8 $FBDA

FNKFLG ONGSBF OLDKEY

10 1 11

Tabela 5.2: (cont.) Endereo c $FBE5 $FBF0 $FC18 $FC40 $FC48 $FC4C $FC9A $FC9B $FC9C $FC9D $FC9E $FCA0 $FCA2 $FCA4 $FCA5 $FCA6 $FCA7 $FCA8 $FCAA $FCAB $FCAC $FCAD $FCAE $FCAF $FCB0 $FCB1 $FCB2 $FCB3 $FCB5 $FCB7 $FCB9 $FCBB $FCBC $FCBD $FCBE $FCBF $FCC1 $FCC5 $FCC9 Nome NEWKEY KEYBUF LINWRK PATWRK BOTTOM TRPTBL RTYCNT INTFLG PADY PADX JIFFY INTVAL INTCNT LOWLIM WINWID GRPHED ESCCNT INSFLG CSTYLE CAPST KANAST KANAMD FLBMEM SCRMOD OLDSCR CASPRV BDRATR GXPOS GYPOS GRPACX GRPACY DRWFLG DRWSCL DRWANG RUNBNF SAVENT EXPTBL SLTTBL SLTATR Bytes 11 40 40 8 2 78 (263) 1 1 1 1 2 2 2 1 1 1 1 1 1 1 1 1 1 1 1 1 1 2 2 2 2 1 1 1 1 2 4 4 64 Resumo Armazena o estado atual da matriz de teclado. Buer circular do teclado (caracteres decodicados). Buer de linha de tela, usado pelo BIOS. Buer usado pelo BIOS. Armazena o in cio da RAM usada pelo interpretador BASIC. Usado pelas instrues de interrupo (ON. . .) do BAco ca SIC. No-utilizada. a Flag de deteco de CTRL-STOP (3) e STOP (4). ca Ultima coordenada Y do tablet. Ultima coordenada X do tablet. Contador incrementado a cada interrupo do VDP. ca Durao do intervalo do ON INTERVAL (BASIC). ca Contador do ON INTERVAL (BASIC). Durao m ca nima do bit de partida no cassete (TAPION). Durao de discriminao LO/HI (TAPION). ca ca Varivel auxiliar da rotina CNVCHR do BIOS. a Varivel auxiliar da rotina CHPUT do BIOS. a Indica modo de insero do editor de tela. ca Estilo do cursor, bloco (0) ou sublinhado (1-255). Status do CAPS LOCK (0=desligado, 1-255=ligado). Status do KANA LOCK (0=desligado, 1-255=ligado). Modo kana (MSX japoneses). Usada pelo manipulador de erro de E/S. Modo de tela (SCREEN) atual. Ultimo modo de texto. Temporrio de E/S do cassete. a Usado pelas rotinas grcas do BIOS. a Temporrio das rotinas grcas do BIOS. a a Temporrio das rotinas grcas do BIOS. a a Temporrio das rotinas grcas do BIOS. a a Temporrio das rotinas grcas do BIOS. a a Usado pelo manipulador do DRAW. Usado pelo manipulador do DRAW. Usado pelo manipulador do DRAW. Usado pelo manipulador do BLOAD. Usado pelo manipulador do BLOAD. Indicadores de expanso dos 4 slots, ($00=no expandia a do, $80=expandido). Cpia dos registradores de slot primrio (vlidos apenas o a a nos slots expandidos). Atributos de ROM, 16 bytes por slot (desses, 4 por subslot). 86

Tabela 5.2: (cont.) Endereo c $FD09 $FD89 $FD99 Nome SLTWRK Resumo Dois bytes de trabalho local para cada uma das 64 extenses de ROM poss o veis. PROCNM 16 Buer para nome de dispositivo ou instruo a ser analca isado por uma ROM de extenso. a DEVICE 1 Usada para passar um nmero de dispositivo para uma u ROM de extenso. a Tabela 5.2: Variveis da rea de trabalho, por endereo. a a c Bytes 128

A rea entre $FD9A e $FFC9 s utilizada para ganchos de chamadas BIOS/BASIC para permitir a extenso a e a da ROM (Disk BASIC, por exemplo), listados na prxima seo.. A rea entre $FFCA e $FFFE (53 bytes) o ca a no utilizada. O endereo $FFFF utilizado por expansores de slot, como descrito no cap a e c e tulo 7. Tabela 5.3: Variveis da rea de trabalho, ordem alfabtica. a a e
Nome End. Nome End. Nome End. Nome End.

ARG ASPCT2 AUTFLG BASROM BUF CENCNT CLINEF CONLO CONTYP CRCSUM CSAVEA CSRY CXOFF DATPTR DEVICE DOT DSCTMP ERRFLG EXPTBL FILTAB FNKSTR FRETOP GRPACX GRPCOL GXPOS HOLD8 INTVAL KBFMIN

$F847 $F40D $F6AA $FBB1 $F55E $F933 $F935 $F66A $F669 $F93D $F942 $F3DC $F945 $F6C8 $FD99 $F6B5 $F698 $F414 $FCC1 $F860 $F87F $F69B $FCB7 $F3C9 $FCB3 $F806 $FCA0 $F41E

ARYTA2 ASPECT AUTINC BDRATR BUFMIN CGPBAS CLOC CONSAV CPCNT8 CRTCNT CSAVEM CSTCNT CYOFF DECCNT DIMFLG DRWANG ENDFOR ERRLIN FBUFFR FLBMEM FNKSWI FSTPOS GRPACY GRPHED GYPOS INSFLG JIFFY KBUF

$F7B5 $F931 $F6AD $FCB2 $F55D $F924 $F92A $F668 $F93B $F3B1 $F944 $F93F $F947 $F7F4 $F662 $FCBD $F6A1 $F6B3 $F7C5 $FCAE $FBCD $FBCA $FCB9 $FCA6 $FCB5 $FCA8 $FC9E $F41F

ARYTAB ATRBAS AUTLIN BDRCLR CAPST CGPNT CMASK CONSDFG CPCNT CS1200 CSCLXY CSTYLE DAC DECTM2 DONUM DRWFLG ENDPRG ERRTXT FILNAM FLGINP FORCLR FUNACT GRPATR GRPNAM HEADER INTCNT KANAMD KEYBUF

$F6C4 $F928 $F6AB $F3EB $FCAB $F91F $F92C $F3DE $F939 $F3FC $F941 $FCAA $F7F6 $F7F2 $F665 $FCBB $F40F $F6B7 $F866 $F6A6 $F3E9 $F7BA $F3CD $F3C7 $F40A $FCA2 $FCAD $FBF0

ASPCT1 ATRBYT BAKCLR BOTTOM CASPRV CLIKSW CNPNTS CONTXT CPLOTF CS2400 CSRX CURSAV DATLIN DEFTBL DORES DRWSCL ENSTOP ESCCNT FILNM2 FNKFLG FRCNEW GETPNT GRPCGP GRPPAT HIGH INTFLG KANAST LEPROG

$F40B $F3F2 $F3EA $FC48 $FCB1 $F3DB $F936 $F666 $F938 $F401 $F3DD $FBCC $F6A3 $F6CA $F664 $FCBC $FBB0 $FCA7 $F871 $FBCE $F3F5 $F3FA $F3CB $F3CF $F408 $FC9B $FCAC $F954

87

Tabela 5.3: (cont.)


Nome End. Nome End. Nome End. Nome End.

LINL32 LINWRK LOHMSK MAXDEL MCLLEN MLTATR MLTPAT NEWKEY NULBUF OLDTXT PADX PATBAS PRMFLG PRMSTK PTRFIL QUETAB REPCNT RTPROG SAVENT SCNCNT SLTTBL STREND T32CGP TEMP2 TEMP TRGFLG TXTCGP TXTTAB VCBA VLZDAT

$F3AF LINL40 $FC18 LOHADR $F949 LOW $F92F MAXFIL $FB3B MCLPTR $F3D7 MLTCGP $F3D9 MOVCNT $FBE5 NLONLY $F862 OLDKEY $F6C0 ONEFLG $FC9D PADY $F926 PATWRK $F7B4 PRMLEN $F6E4 PROCNM $F864 PTRFLG $F959 QUEUEN $F3F7 RGnSAV $F955 RTYCNT $FCBF SAVSP $F3F6 SCRMOD $FCC5 SLTWRK $F6C6 SUBFLG $F3C1 T32COL $F6BC TEMP3 $F6A7 TEMPPT $F3E8 TRPTBL $F3B7 TXTCOL $F676 USRTAB $FB41 VCBB $F41B VOICAQ Tabela 5.3: Variveis a

$F3AE $F94B $F406 $F85F $FB3C $F3D5 $F951 $F87C $FBDA $F6BB $FC9C $FC40 $F6E6 $FD89 $F6A9 $FB3E $F3DF $FC9A $FB36 $FCAF $FD09 $F6A5 $F3BF $F69D $F678 $FC4C $F3B5 $F39A $FB66 $F975 da rea a

LINLEN $F3B0 LINTTB LOHCNT $F94D LOHDIR LOWLIM $FCA4 LPTPOS MAXUPD $F3EC MCLFLG MINDEL $F92D MINUPD MLTCOL $F3D3 MLTNAM MUSICF $FB3F NAMBAS NOFUNS $F7B7 NTMSXP OLDLIN $F6BE OLDSCR ONELIN $F6B9 ONGSBF PARM1 $F6E8 PARM2 PDIREC $F953 PLACNT PRMLN2 $F74E PRMPRV PRSCNT $FB35 PRTFLG PUTPNT $F3F8 QUEBAK QUEUES $F3F3 RAWPRT RNDX $F857 RS2IQ RUNBNF $FCBE SAVEND SAVTXT $F6AF SAVVOL SKPCNT $F94F SLTATR STATFL $F3E7 STKTOP SWPTMP $F7BC T32ATR T32NAM $F3BD T32PAT TEMP8 $F69F TEMP9 TEMPST $F67A TRCFLG TTYPOS $F661 TXTATR TXTNAM $F3B3 TXTPAT VALTYP $F663 VARTAB VCBC $FB8B VLZADR VOICBQ $F9F5 VOICCQ de trabalho, ordem alfabtica. e

$FBB2 $F94A $F415 $F958 $F3EF $F3D1 $F922 $F417 $FCB0 $FBD8 $F750 $FB40 $F74C $F416 $F971 $F418 $FAF5 $F87D $FB39 $FCC9 $F674 $F3C3 $F3C5 $F7B8 $F7C4 $F3B9 $F3BB $F6C2 $F419 $FA75

5.4

Ganchos

A regio entre $FD9A e $FFC9 contem 112 ganchos, de 5 bytes cada, o que suciente para uma chamada a e para qualquer conector: rst $30 .db slotid .dw endereco ret ; ; ; ; $f7 CALLF $?? slotid $?? $?? endereco da rotina $c9 retorna

Na inicializao toda a regio inicializada com RETs ($c9). Os ganchos so chamados de partes esca a e a tratgicas da BIOS para permitir a extenso do software em ROM, como por exemplo a adio de rotinas e a ca de disco. 88

Tabela 5.4: Ganchos Endereo c $FD9A $FD9F $FDA4 $FDA9 $FDAE $FDB3 $FDB8 $FDBD $FDC2 $FDC7 $FDCC $FDD1 $FDD6 $FDDB $FDE0 $FDE5 $FDEA $FDEF $FDF4 $FDF9 $FDFE $FE03 $FE08 $FE0D $FE17 $FE1C $FE21 $FE26 $FE2B $FE30 $FE35 $FE3A $FE3F $FE44 $FE49 $FE4E $FE53 $FE58 $FE5D $FE62 $FE67 $FE6C $FE71 $FE76 $FE7B $FE80 Nome HKEYI HTIMI HCHPU HDSPC HERAC HDSPF HERAF HTOTE HCHGE HINIP HKEYC HKEYA HNMI HPINL HQINL HINLI HONGO HDSKO HSETS HNAME HKILL HIPL HCOPY HCMD HDSKI HATTR HLSET HRSET HFIEL HMKI HMKS HMKD HCVI HCVS HCVD HGETP HSETF HNOFO HNULO HNTFL HMERG HSAVE HBINS HBINL HFILE HDGET Resumo Manipulador de Interrupo ($0C4A). ca Manipulador de Interrupo ($0C53). ca Rotina CHPUT ($08C0). Mostra cursor ($09E6). Apaga cursor ($0A33). Rotina DSPFNK ($0B2B). Rotina ERAFNK ($0B15). Rotina TOTEXT ($0842). Rotina CHGET ($10CE). Cpia da tabela de caracteres (ROMVDP) ($071E). o Decodicador do teclado ($1025). Decodicador do teclado ($0F10). Rotina NMI ($1398). Rotina PINLIN ($23BF). Rotina QINLIN ($23CC). Rotina INLIN ($23D5). ON dispositivo GOSUB ($7810). DSKO$ ($7C16). SET ($7C1B). NAME ($7C20). KILL ($7C25). IPL ($7C2A). COPY ($7C2F). DSKF ($7C39). DSKI$ ($7C3E). ATTR$ ($7C43). LSET ($7C48). RSET ($7C4D). FIELD ($7C52). MKI$ ($7C57). MKS$ ($7C5C). MKD$ ($7C61). CVI ($7C66). CVS ($7C6B). CVS ($7C70). Localizar FCB ($6A93). Localizar FCB ($6AB3). OPEN: not found ($6AF6). OPEN ($6B0F). Fecha buer 0 de I/O ($6B3B). MERGE/LOAD ($6B63). SAVE ($6BA6). SAVE ($6BCE). MERGE/LOAD ($6BD4). FILES ($6C2F). GET/PUT ($6C3B).

89

Tabela 5.4: (cont.) Endereo c $FE85 $FE8A $FE8F $FE94 $FE99 $FE9E $FEA3 $FEA8 $FEAD $FEB2 $FEB7 $FEBC $FEC1 $FEC6 $FECB $FED0 $FED5 $FEDA $FEDF $FEE4 $FEE9 $FEEE $FEF3 $FEF8 $FEFD $FF02 $FF07 $FF0C $FF11 $FF16 $FF1B $FF20 $FF25 $FF2A $FF2F $FF34 $FF39 $FF3E $FF43 $FF48 $FF4D $FF52 $FF57 $FF5C $FF61 $FF66 Nome HFILO HINDS HRSLF HSAVD HLOC HLOF HEOF HFPOS HBAKU HPARD HNODE HPOSD HDEVN HGEND HRUNC HCLEA HLOPD HSTKE HISFL HOUTD HCRDO HDSKC HDOGR HPRGE HERRP HERRF HREAD HMAIN HDIRD HFINI HFINE HCRUN HCRUS HISRE HNTFN HNOTR HSNGF HNEWS HGONE HCHRG HRETU HPRTF HCOMP HFINP HTRMN HFRME Resumo Sa Sequencial ($6C51). da Entrada Sequencial ($6C79). INPUT$ ($6CD8). LOC ($6D03), LOF ($6D14), EOF ($6D25), FPOS ($6D39). LOC ($6D0F). LOF ($6D20). EOF ($6D33). FPOS ($6D43). LINE INPUT # ($6E36). Anlise de nome de dispositivo ($6F15). a Anlise de nome de dispositivo ($6F33). a Anlise de nome de dispositivo ($6F37). a No utilizado a Despachador de funo de I/O ($6F8F). ca Processar-Liberar ($629A). Processar-Liberar ($62A1). Processar-Liberar ($62AF). Limpar Pilha ($62F0). Rotina ISFLIO ($145F). Rotina OUTDO ($1B46). CR, LF para OUTDO ($7328). Entrada de linha no lao principal ($7274). c Traar linha ($593C). c Fim de programa ($4039). Manipulador de erro ($40DC). Manipulador de erro ($40FD). OK do lao principal ($4128). c Lao Principal ($4134). c Comando direto do lao principal ($41A8). c Fim do lao principal ($4237). c Fim do lao principal ($4247). c Tokenizao ($42B9). ca Tokenizao ($4353). ca Tokenizao ($437C). ca Tokenizao ($43A4). ca Tokenizao ($44EB). ca FOR ($45D1). lao de execuo: novo comando ($4601). c ca lao de execuo ($4646). c ca Rotina CHRGTR ($4666). RETURN ($4821). PRINT ($4A5E). PRINT ($4A94). PRINT ($4AFF). Erro READ/INPUT ($484D). Avaliador de expresses ($4C6D). o 90

Tabela 5.4: (cont.) Endereo c $FF6B $FF70 $FF75 $FF7A $FF7F $FF84 $FF89 $FF8E $FF93 $FF98 $FF9D $FFA2 $FFA7 $FFAC $FFB1 $FFB6 $FFBB $FFC0 $FFC5 Nome HNTPL HEVAL HOKNO HFING HISMI HWIDT HLIST HBUFL HFRQI HSCNE HFRET HPTRG HPHYD HFORM HERRO HLPTO HLPTS HSCRE HPLAY Resumo Avaliador de expresses ($4CA6). o Avaliador de fatores ($4DD9). Avaliador de fatores ($4F2C). Avaliador de fatores ($4F3E). lao de execuo ($51C3). c ca WIDTH ($51CC). LIST ($522E). Destokenizao ($532D). ca Converso para inteiro ($543F). a Converso de nmero de linha para ponteiro ($5514). a u Liberar descritor ($67EE). Busca de varivel ($5EA9). a Rotina PHYDIO ($148A). Rotina FORMAT ($148E). Manipulador de erro ($406F). Rotina LPTOUT ($085D). Rotina LPTSTT ($0884). SCREEN ($79CC). PLAY ($73E5). Tabela 5.4: Ganchos

91

Cap tulo 6

MSX-DOS e BDOS
O MSX-DOS o sistema de disco do MSX, que uma adaptao do CP/M da Digital Research para e e ca o padro MSX. O CP/M dene um conjunto padro de operaes que permitia que programas CP/M a a co executassem sem modicaao em qualquer encarnao de CP/M, permitindo o surgimento de aplicativos c ca como SuperCalc, dBASE e Turbo Pascal para a babel de microcomputadores de 8 bits lanados na dcada c e de 1980.

6.1

BDOS

O BDOS um conjunto de rotinas padronizadas dispon e veis em MSX com interface de disco. As rotinas podem ser chamadas do MSX-DOS ou do Disk BASIC, com a diferena que no MSX-DOS feito um c e CALL $0005, e no Disk BASIC feito um CALL $F37D. Embora o BIOS no esteja presente (o MSX-DOS e a mapeia 64 KB de RAM), ainda poss chamar a rotina CALSLT (Cap e vel tulo 5) no endereo $0030 (fora c do DOS seu endereo seria $001C). c O nmero da rotina carregado no registrador C, e os parmetros so carregados nos registradores DE u e a a e HL, de acordo com a especicao da rotina. ca As rotinas do BDOS no tm nome ocial, os nomes dados aqui so apenas descries resumidas de seu a e a co propsito. o

Boot
Provoca o rein do sistema. Quando chamada de dentro do MSX-DOS esta rotina limpa cio a casa e retorna ao prompt do DOS. Quando executada a partir do Disk BASIC, esta rotina provoca um rein total do sistema. cio Nenhum. Nenhum.

$00

3 3

92

GetCharAndEcho
L um caractere do teclado e o imprime na tela. e 3 3 Nenhum. A: caractere lido.

$01

PutChar
Imprime um caractere na tela. Aceita cdigos de controle VT-52. o 3 3 E: caractere a imprimir. Nenhum.

$02

ReadSerial
3 3 L um caractere da porta serial. Pode ser interrompida por Control+S. Praticamente nene hum modem ou interface serial de MSX permite a leitura de caracteres por esta rotina. Nenhum. A: caractere lido.

$03

WriteSerial
3 3 Escreve um caractere na porta serial. Os modems e seriais MSX no permitem o uso desta a rotina. E: caractere a escrever. Nenhum.

$04

WritePrinter
Envia um caractere para a impressora. Pode ser interrompida por Control+S. 3 3 E: caractere. Nenhum.

$05

93

ReadKey
3 3 L uma tecla do teclado (sem espera). Se o registrador E for diferente de 255, imprime o e contedo de A na tela antes de ler o teclado. u E: 255=sem eco, 0-254: com eco, A: caractere a ecoar. A: cdigo ASCII da tecla lida, ou 0 se no houve tecla pressionada. o a

$06

WaitKey
Espera um tecla ser pressionada. 3 3 Nenhum. A: cdigo ASCII da tecla pressionada. o

$07

GetChar
Semelhante ` rotina $01, porm sem eco. a e 3 3 Nenhum. A: caractere lido.

$08

PutString
Imprime uma string terminada com $ (ASCII 36) na tela. 3 3 DE: endereo da string. c Nenhum.

$09

GetString
L uma linha do teclado at que Enter/Return seja pressionado. O buer apontado por DE e e deve ter o limite de bytes a ler no primeiro byte, o nmero de caracteres efetivamente lidos u ser colocado no segundo byte e a string lida ser armazenada a partir de DE+2. a a DE: endereo do buer. c Nenhum.

$0A

3 3

94

KeyboardStatus
3 3 Verica o teclado e retorna indicando se alguma tecla (mesmo teclas de controle) foram pressionadas. Nenhum. A: 255 se houve tecla pressionada, 0 se no houve. a

$0B

GetSysVersion
Obtm a verso do DOS. No caso do MSX-DOS, retorna sempre $0022, indicando compate a ibilidade com o CP/M 2.2. 3 3 Nenhum. HL: verso do DOS. a

$0C

RefreshDiskInfo
Atualiza os dados do disquete (tipo, nmero de arquivos, etc.) e fecha todos os buers u (FCBs). 3 3 Nenhum. Nenhum.

$0D

SetCurrentDrive
Muda o drive corrente. 3 3 E: drive (1=A, 2=B, etc.) Nenhum.

$0E

OpenFile
Abre um arquivo. 3 3 DE: endereo do FCB. c A: 0=arquivo existe, 255=arquivo no existe. a

$0F

95

UpdateFile
Atualiza a entrada de diretrio de um arquivo aps a gravao de registros. o o ca 3 3 DE: endereo do FCB. c Nenhum.

$10

FindFirst
3 3 Procura o primeiro arquivo no diretrio que combine com a descrio contida no FCB dado, o ca que pode usar o caractere ? como coringa. DE: endereo do FCB. c A: 0=foi encontrado (FCB colocado na rea de transferncia), 1=no encontrado. a e a

$11

FindNext
Procura o prximo arquivo (aps o ultimo encontrado por FindFirst ou FindNext) no dio o retrio que combine com a descrio contida no FCB dado, que pode usar o caractere ? o ca como coringa. DE: endereo do FCB. c A: 0=foi encontrado (FCB na rea de transferncia), 1=no encontrado. a e a

$12

3 3

DeleteFile
Apaga o arquivo descrito pelo FCB dado, que pode ter coringas. 3 3 DE: endereo do FCB. c A: 0=sucesso, 255=erro.

$13

ReadBlock
L 128 bytes de um arquivo sequencial e os coloca na rea de transferncia. e a e 3 3 DE: endereo do FCB. c A: 0=sucesso, 1=sucesso+EOF, 2=erro.

$14

96

WriteBlock
Grava bloco de 128 bytes (da rea de transferncia) em arquivo sequencial. a e 3 3 DE: endereo do FCB. c A: 0=sucesso, 1=falta espao em disco, 2-255: outro erro. c

$15

CreateFile
Cria arquivo. 3 3 DE: endereo do FCB. c A: 0=sucesso, 255=erro.

$16

RenameFiles
Renomeia um ou mais arquivos. O FCB de entrada deve conter o drive em FCB+$00 e nome original em FCB+$01 (podendo ter coringas) e o novo nome a partir de FCB+$11. posio. ca DE: endereo do FCB c A: 0=sucesso, 255=erro.

$17

3 3

GetSysDrives
Devolve os drives presentes no sistema. 3 3 Nenhum. HL: bitmap de drives (bit 0 de L=drive A, bit 1 de L=drive B, . . ., bit 7 de H=drive P).

$18

GetCurrentDrive
Devolve o drive atual. 3 3 Nenhum. A: drive atual (1=A, 2=B, etc.)

$19

97

SetBuer
3 3 Ajusta o endereo inicial da rea de transferncia de dados. Na inicializao o valor default c a e ca $0080. e DE: endereo. c Nenhum.

$1A

GetDiskInfo
Retorna informaes do disquete em um drive. co 3 3

$1B

E: drive. A: 255 em erro, nmero de setores por cluster caso contrrio, BC: tamanho do setor em u a bytes, DE: nmero de clusters no disco, HL: nmero de clusters livres, IY: endereo da cpia u u c o da FAT em RAM, IX: endereo do BPB do disco. c

As rotinas $1C a $20 no esto implementadas no MSX-DOS. a a

ReadRecord
L um registro de arquivo de acesso aleatrio para a rea de transferncia. FCB+$0E (2 e o a e bytes) deve ter o tamanho do registro a ler e FCB+$21 (4 bytes) o nmero do registro a ser u lido. DE: endereo do FCB. c A: 0=sucesso, 1=sucesso+EOF, 2=erro.

$21

3 3

WriteRecord
Grava um registro (na rea de transferncia) em um arquivo de acesso aleatrio. FCB+$0E a e o (2 bytes) deve ter o tamanho do registro a escrever e FCB+$21 (4 bytes) o nmero do u registro a ser escrito. DE: endereo do FCB. c A: 0=sucesso, 1=faltou espao, 2-255: outro erro. c

$22

3 3

98

GetFileSize
Devolve o tamanho do arquivo como valor de 4 bytes a partir de FCB+$10. 3 3 DE: endereo do FCB. c A: 0=sucesso, 1=erro.

$23

ReadNextRecord
Incrementa o nmero do registro do FCB e l um registro em arquivo de acesso aleatrio. u e o 3 3 DE: endereo do FCB. c A: 0=sucesso, 255=erro.

$24

As rotinas $25 e $26 no esto implementadas no MSX-DOS. a a

ReadRecords
L uma sequncia de registros em arquivo de acesso aleatrio. e e o 3 3 DE: endereo do FCB, HL: nmero de registros a ler. c u A: 0=sucesso, 1=sucesso+EOF, 2-255=erro; HL: nmero de registros lidos. u

$27

WriteRecords
Grava uma sequncia de registros em arquivo de acesso aleatrio. e o 3 3 DE: endereo do FCB, HL: nmero de registros a gravar. c u A: 0=sucesso, 1=espao insuciente; HL: nmero de registros efetivamente gravados. c u

$28

A rotina $29 no est implementada no MSX-DOS. a a

GetDate
Devolve a data do sistema. 3 3 Nenhum. HL: ano, D: ms (1=Janeiro), E: dia, A: dia da semana (0=domingo). e

$2A

99

SetDate
Modica a data do sistema. 3 3 HL: ano, D: ms (1=Janeiro), E: dia. e Nenhum.

$2B

GetTime
Devolve a hora do sistema. 3 3 Nenhum. H: horas, L: minutos, D: segundos, E: centsimos de segundo. e

$2C

SetTime
Modica a hora do sistema. 3 3 H: horas, L: minutos, D: segundos, E: centsimos de segundo. e Nenhum.

$2D

A rotina $2E (WriteVerify) no est implementada (coerentemente) no MSX-DOS. a a

ReadSectors
Leitura direta de setores (para a rea de transferncia). a e 3 3 DE: primeiro setor, H: nmero de setores a ler, L: drive (1=A, 2=B, etc.) u Flag C=1 se houver erro.

$2F

WriteSectors
Gravao direta de setores (da rea de transferncia). ca a e 3 3 DE: primeiro setor, H: nmero de setores a ler, L: drive (1=A, 2=B, etc.) u Flag C=1 se houver erro.

$30

6.2

FCB

O FCB (File Control Block) a estrutura de dados bsica usada nas rotinas do BDOS. Sua estrutura e a mostrada abaixo. A unica rotina que usa o FCB desrespeitando seus campos a $17, que usa o e e 100

deslocamento $11 para armazenar o novo nome de arquivo. Tabela 6.1: FCB Desloc. $00 $01 $09 $0C $0E $10 $14 $16 $18 $20 $21 Tam. 1 8 3 2 2 4 2 2 8 1 4 Campo Drive (1=A, 2=B, etc.) Nome do arquivo. Extenso do arquivo. a Nmero do bloco corrente. u Tamanho do registro (em bytes). Tamanho do arquivo (em bytes). Data. Hora. Reservado. Registro corrente. Nmero do registro de acesso aleatrio. u o Tabela 6.1: FCB

6.3

BPB

O BPB (BIOS Parameter Block) retornado pela rotina $1B tem a estrutura abaixo. Tabela 6.2: BPB Desloc. $00 $01 $02 $04 $06 $07 $08 $0A $0B $0C $0E $10 $11 $13 Tam. 1 1 2 2 1 1 2 1 1 2 2 1 2 2 Campo Nmero do drive - 1 (0=A, 1=B, etc.) u Tipo de formatao. $F8,$F9,$FC,$FD = ca 3.5 SS, 3.5 DS, 5.25 SS e 5.25 DS. Bytes por setor. ?? (Barbosa no sabe) a Faces (0=simples, 1=dupla). Setores por cluster. Nmero de setores reservados. u Nmero de FATs. u Nmero mximo de entradas de diretrio. u a o Primeiro setor da rea de armazenamento. a Nmero de clusters no disco. u Setores por FAT. Primeiro setor do diretrio. o Endereo da cpia da FAT em RAM. c o Tabela 6.2: BPB

101

6.4

Sequncias VT-52 e

A rotina $02 permite o uso de sequncias VT-52 para controle da tela: e Tabela 6.3: Cdigos VT-52 o ASCII Ctrl-G Ctrl-H Ctrl-I Ctrl-J Ctrl-K Ctrl-L Ctrl-M Ctrl-\ Ctrl-] Ctrl- CtrlEsc Esc Esc Esc Esc Esc Esc Esc Esc Esc A B C D E H J j K L Hexa $07 $08 $09 $0A $0B $0C $0D $1C $1D $1E $1F $7F $1B $41 $1B $42 $1B $43 $1B $44 $1B $45 $1B $48 $1B $4A $1B $6A $1B $4B $1B $4C $1B $6C $1B $4D $1B $1B $1B $1B $1B $78 $78 $59 $79 $79 Ao ca Beep. Backspace. Tab. Avana uma linha. c Move cursor para o origem. Limpa a tela e move cursor para a origem. Retorno de carro. Avana cursor uma posio. c ca Retrocede cursor uma posio. ca Move cursor para cima. Move cursor para baixo. Deleta caractere e move cursor ` esquerda. a Move cursor para cima. Move cursor para baixo. Move cursor para a direita. Move cursor para a esquerda. Limpa a tela e coloca cursor na origem. Coloca cursor na origem. Apaga at o m da tela, no move cursor. e a Limpa a tela e coloca cursor na origem. Apaga at o m da linha, no move cursor. e a Insere linha acima do cursor, move o resto da tela para baixo, deixa cursor no in da nova linha. cio Apaga at o m da linha, no move cursor. e a Apaga linha do cursor, move o resto da tela para linha, coloca cursor no in da prxima linha. cio o $34 Seleciona cursor em bloco. $35 Desliga cursor. m n Move cursor para coluna m-32 e linha y-32. $34 Seleciona cursor sublinhado $35 Liga cursor. Tabela 6.3: Cdigos VT-52 o

Esc l Esc M Esc Esc Esc Esc Esc x4 x5 Yn m y4 y5

102

Cap tulo 7

PPI - Interface Programvel de a Perifricos e


A PPI 8255 est presente em todos os computadores padro MSX (desde o MSX 1). Seu papel controlar a a e o mapeamento de slots no espao de endereamento (64K) do Z80, ler o teclado, controlar o motor e sa c c da para a unidade de ta cassete (a entrada controlada pelo PSG), controlar o click de tecla e o led de caps e lock. A PPI acessada atravs de 4 portas de I/O do Z80 ($A8-$AB), representando as portas A, B, C e a e e porta de modo ($AB).

7.1

Porta A ($A8)

A porta A da PPI seleciona o slot primrio mapeado em cada uma das 4 pginas de 16 KB, conforme o a a mapa de bits abaixo.
PPI, Porta A ($A8) Slot Prim. Slot Prim. Slot Prim. Slot Prim. $C000-$FFFF $8000-$BFFF $4000-$7FFF $0000-$3FFF 7 6 5 4 3 2 1 0

A arquitetura MSX permite que dispositivos tenham 4 subslots (ou slots secundrios) por slot primrio. a a Neste caso, cada expansor (atravs da sua implementao de hardware) mapeia um registrador de sube ca slot no endereo $FFFF (pgina 3). Selecionar um subslot requer portanto mapear a pgina 3 do slot c a a expandido e alterar o endereo $FFFF de acordo com a seleo de subslots desejadas. A BIOS do MSX c ca j fornece rotinas para comutar slots e subslots. O mapa de bits abaixo mostra o formato do registrador a de subslot.
Registrador de Subslot ($FFFF) Subslot Subslot Subslot Subslot $C000-$FFFF $8000-$BFFF $4000-$7FFF $0000-$3FFF 7 6 5 4 3 2 1 0

103

7.2

Porta B ($A9)

A porta B da PPI (apenas para leitura) e contm as colunas da linha de teclado selecionada pela porta C. e O teclado MSX uma matriz de 11 linhas por 8 colunas, embora os MSX atuais usem apenas as 9 linhas e (0 a 8).
PPI, Porta B ($A9) Colunas do Teclado 7 6 5 4 3 2 1 0

7.3

Porta C ($AA)

A porta C controla o click de tecla, led do caps lock (o sinal est sempre presente, embora alguns MSX a no possuam um LED que o aproveite), sa e motor do cassete (a gerao de tom do cassete realizada a da ca e por rotinas do BIOS) e seleo de linha do teclado apresentada na porta B, conforme o formato abaixo. ca
PPI, Porta C ($AA) Click CAPS Sa da Motor Tecla LED Cas Cas 7 6 5 4 Seleo Linha Teclado ca 3 2 1 0

7.4

Porta de Modo ($AB)

A porta de modo pode operar em dois modos: normal (bit 7 setado) ou set/reset da porta C (bit 7 zerado). No modo normal a porta de modo controla a direo (leitura ou escrita) e modo de operao das portas ca ca A, B e C. O hardware do MSX est preparado para trabalhar apenas na sua congurao original. O a ca formato da porta de modo mostrado abaixo. e
PPI, Porta de Modo ($AB) 1 7 Modo A & C[4-7] 6 5 Dir A 4 Dir C 4-7 3
Modo B&C C[0-3]

Dir B 1

Dir C 0-3 0

Os ags de direo indicam se as portas operaro como entradas (1) ou sa ca a das (0). A congurao normal ca do MSX Portas A e C como sa e B como entrada. Os bits 6 e 5 determinam o modo de operao da e da ca porta A e dos 4 bits altos da porta C: 00=Normal (MSX), 01=Strobe e 10=bidirecional. O bit 2 controla o modo de operao da porta B e dos 4 bits baixos da porta C: 0=Normal (MSX) e 1=Strobe. ca Com o bit 7 zerado, a porta de modo permite ligar ou desligar bits individuais da porta C, conforme o formato abaixo.
PPI, Porta de Modo ($AB) 0 7 No utilizados a 6 5 4 Nmero do bit u 3 2 1 Set Reset 0

104

O bit 0 o inverso do efeito desejado no bit (0=set, 1=reset). Por exemplo, as instrues abaixo acendem e co o led do CAPS LOCK. LD %A, #1100 OUT $AB, %A

105

Cap tulo 8

VDP 9929/9918 (MSX 1)


O VDP (Video Display Processor) do MSX 1 usa duas portas de I/O do Z80 ($98 e $99) para comunicao ca com a CPU, enderea RAM prpria (16 KB de VRAM) e oferece 4 modos de v c o deo, 2 modos texto e 2 modos grcos. a A porta $98 (porta de dados) do VDP, usada para ler e escrever a VRAM. O endereo da VRAM e o c modo (escrita/leitura) controlado atravs da porta de comando. e e A porta $99 (porta de comando) permite preparar uma leitura ou escrita na VRAM, ler o regitrador de status ou escrever em um registrador de modo do VDP. Ler a porta de comando (instruo IN) retorna o registrador de status do VDP (status register). ca Para preparar um acesso ` VRAM so enviados dois bytes ` porta de comando, conforme o formato abaixo, a a a usando o bit 6 do segundo byte para selecionar leitura (0) ou escrita (1). Aps a seleo do endereo, o ca c bytes de dados podem ser lidos/escritos sequencialmente pela porta de dados (Aps cada leitura/escrita o o endereo automaticamente incrementado). c e
Porta de comando: Preparao de Leitura/Escrita na VRAM ca

byte 0 byte 1
0 7 Escrita 6

LSB do endereo VRAM c MSB do endereo VRAM c 5 4 3 2 1 0

Para escrever em um dos 8 registradores de modo (somente escrita) o usado o formato abaixo. E e recomendvel utilizar as rotinas BIOS para acesso ao VDP e ` VRAM. As rotinas BIOS mantm cpias a a e o dos registradores de modo do VDP a partir de RG0SAV (ver cap tulo 5).
Porta de comando: Escrita em registrador de modo

byte 0 byte 1
1 7 0 6

Byte de dados a escrever 0 5 0 4 0 3 2 Registrador 1 0

106

8.1

Registrador de Status
Registrador de Status do VDP Flag Flag Flag Quadro 5S Coliso a 7 6 5 4 Nmero do Quinto Sprite u 3 2 1 0

O ag de quadro setado ao nal da varredura do v e deo (uma vez a cada 50 Hz ou 60 Hz, dependendo do MSX) e zerado automaticamente aps a leitura do registrador de status, indicando portanto se esta ou o e no a primeira leitura do registrador aps a ultima varredura de tela. a o O ag de coliso setado se houver sobreposio de sprites. a e ca O ag 5S 1 se houver pixels de mais de 4 sprites em qualquer linha de pixels qualquer. Neste caso o nmero e u do quinto sprite colocado nos 5 bits mais baixos do registrador. Este ag zerado automaticamente e e aps a leitura do registrador, de forma semelhante ao ag de quadro. o

8.2

Registradores de Modo

Os registradores de modo so apenas para escrita e no podem ser lidos. Recomenda-se acessar o VDP a a atravs das rotinas BIOS, que garantem a integridade de uma cpia dos registradores de modo na rea de e o a trabalho (RG0SAV).
VDP: Registrador de Modo 0 0 7 0 6 0 5 0 4 0 3 0 2 M3 1 VE 0

O bit VE ativa (1) ou desativa (0) a entrada externa do VDP. O bit M3 usado para determinar o modo e de tela em conjunto com o registrador 1.
VDP: Registrador de Modo 1 4/16K Limpa 7 6 Int Enable 5 M1 4 M2 3 0 2 Tam. MAG Sprites 1 0

O bit MAG dene se os sprites devem ter tamanho normal (0) ou duplicado (1). O bit Tam.Sprites dene se os sprites so 88 (0) ou 1616 (1). Os bits M1, M2 e M3 determinam o modo de tela: a M1 0 0 0 1 M2 0 0 1 0 M3 0 1 0 0

Modo Modo Modo Modo

texto 3224 (screen 1) grco 256192 (screen 2) a grco 6448 (screen 3) a texto 4024 (screen 0)

O bit Int.Enable ativa (1) ou desativa (0) a gerao de interrupo do VDP. O bit Limpa ativa (1) ou ca ca desativa (0) a sa de v da deo: quando desativada a tela toda ter a mesma cor da borda. O bit 4/16K a muda as caracter sticas de endereamento da VRAM para que use chips de 4K (0) ou 16K (1). c 107

VDP: Registrador de Modo 2 0 7 0 6 0 5 0 4 Base da Tabela de Nomes (10-13) 3 2 1 0

Os 4 bits (0-3) representam os bits 10-13 do endereo base. O contedo $0F (15, #1111) representaria o c u endereo $3C00, por exemplo. c
VDP: Registrador de Modo 3 Base da Tabela de Cores (6-13) 7 6 5 4 3 2 1 0

O 8 bits (0-7) representam os bits 6-13 do endereo base. O contedo $FF (255) representaria o endereo c u c $3FC0, por exemplo. No modo grco 256192 apenas o bit 7 tem efeito (permitindo bases $0000 e $2000) a e os bits 0-6 devem estar setados.
VDP: Registrador de Modo 4 0 7 0 6 0 5 0 4 0 3 Base da Tabela de Caracteres (11-13) 2 1 0

Os 3 bits (0-2) representam os bits 11-13 do endereo base. O contedo $07 representaria o endereo c u c $3800, por exmeplo. No modo grco 256192 apenas o bit 2 efetivo e os bits 0 e 1 devem estar setados. a e
VDP: Registrador de Modo 5 0 7 6 Base de Atributos de Sprites (7-13) 5 4 3 2 1 0

Os 7 bits (0-6) representam os bits 7-13 do endereo base. O contedo $7F representaria o endereo $3F80, c u c por exemplo.
VDP: Registrador de Modo 6 0 7 0 6 0 5 0 4 0 3 Base de Imagens de Sprites (11-13) 2 1 0

Os 3 bits (0-2) representam os bits 11-13 do endereo base. O contedo $07 representaria o endereo c u c $3800, por exmeplo.
VDP: Registrador de Modo 7 Cor de texto 7 6 5 4 3 Cor de borda 2 1 0

108

A cor de borda determina a cor da borda da tela e dos pixels transparentes (cor 0) em todos os modos de v deo. Determina tambm a cor de fundo no modo texto 4024. e A cor de texto determina a cor dos caracteres no modo texto 4024. Nos outros modos no tem efeito a algum. As cores do VDP esto listadas na tabela abaixo, usando coecientes RGB entre 0 e 1 (para obter o valor a em RGB de 24 bits (8 + 8 + 8) multiplique por 255). # 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 Cor Transparente Preto Verde Mdio e Verde Claro Azul Escuro Azul Claro Vermelho Escuro Ciano Vermelho Mdio e Vermelho Claro Amarelo Escuro Amarelo Claro Verde Escuro Magenta Cinza Branco R N/A 0.00 0.13 0.37 0.33 0.49 0.83 0.26 0.99 1.00 0.83 0.90 0.13 0.79 0.80 1.00 G N/A 0.00 0.79 0.86 0.33 0.46 0.32 0.92 0.33 0.47 0.76 0.81 0.69 0.36 0.80 1.00 B N/A 0.00 0.26 0.47 0.93 0.99 0.30 0.96 0.33 0.47 0.33 0.50 0.23 0.73 0.80 1.00

8.3

Modo Texto 4024


Tabela Nomes Caracteres Endereo c $0000-$03BF $0800-$0FFF Tamanho 960 2048

A tabela de nomes contm caracteres ASCII e a tabela de caracteres contm as imagens dos 256 caracteres e e poss veis, usando 8 bytes por caractere, embora os 2 bits menos signicativos de cada byte da tabela de caracteres sejam desprezados, mostrando caracteres 68 em vez de 88. As cores dos caracteres so a denidas pelo registrador de modo 7.

8.4

Modo Texto 3224


Tabela Caracteres Nomes Cores Endereo c $0000-$07FF $1800-$1AFF $2000-$201F Tamanho 2048 768 32

O formato da tabela de caracteres semelhante ao modo anterior, porm todos os bits so utilizados, e e a formando caracteres 88. A cor da borda da tela denida pelo registrador de modo 7, mas a cor de cada e grupo de 8 caracteres denida pela tabela de cores. Cada byte da tabela de cores dene a cor de frente e e fundo para um grupo de 8 cdigos ASCII (0-7, 8-15, etc.), conforme o formato abaixo: o 109

Modo 3224: byte de dado na tabela de cores Cor de frente 7 6 5 4 3 Cor de fundo 2 1 0

8.5

Modo Grco 256192 a


Tabela Caracteres Nomes Cores Endereo c $0000-$17FF $1800-$1AFF $2000-$37FF Tamanho 6144 768 6144

A tabela de nomes semelhante ao modo texto 3224, com 768 bytes, cada um descrevendo o padro e a de um bloco 88. No entanto, as tabelas de caracteres e cores tm 6K (o triplo do modo 3224). Os e primeiros 2K de cada tabela denem imagem (Tabela de Caracteres) e cor (Tabela de Cores) dos caracteres 0-255 no tero superior da tela (8 linhas de texto ou 64 pixels), o segundo e o terceiro trechos de 2K so c a usados, analogamente, para formar o segundo e terceiro teros verticais da tela. Acender ou apagar um c pixel requer o clculo do endereco e do bit a ser modicado. O BIOS prov este clculo atravs da rotina a e a e MAPXYC (Cap tulo 5). Embora haja maior resoluo de cores que no modo 3224, cada grupo de 8 ca pixels adjacentes compartilha o mesmo atributo de cor, causando borramento.
256

64

T.Nomes: $1800-$18FF T.Cores: $2000-$27FF T.Caracteres: $0000-$07FF

192

64

T.Nomes: $1900-$19FF T.Cores: $2800-$2FFF T.Caracteres: $0800-$0FFF

64

T.Nomes: $1A00-$1AFF T.Cores: $3000-$37FF T.Caracteres: $1000-$17FF

Figura 8.1: Organizao do Modo Grco 256192. ca a

8.6

Modo Grco 6448 a


Tabela Caracteres Nomes Endereo c $0000-$05FF $0800-$0AFF 110 Tamanho 1536 768

A tabela de nomes inicializada com a sequncia 4 [$00 . . . $1F ], 4 [$20 . . . $3F ], . . . , 4 [$A0 . . . $BF ]. e e Cada linha de 32 bytes da tabela de nomes representa uma linha 642 da tela. As linhas so repetidas em a grupos de 4, mas cada repetio usa um dado diferente da tabela de caracteres para determinar sua cor. ca A tabela de caracteres representa as cores dos caracteres (os primeiro bloco de 8 bytes dene o caractere 0, o segundo bloco dene o caractere 1, etc., denindo os 192 caracteres usados, $00-$BF), mas cada caractere tem 4 padres de cores diferentes, dependendo da linha em que aparece. Cada entrada na tabela o de nomes representa 4 pixels na tela. Por exemplo, o bloco de 8 bytes (na tabela de caracteres) abaixo:

Bloco da tabela de caracteres (Modo 6448) byte 0 byte 1 byte 2 byte 3 byte 4 byte 5 byte 6 byte 7 7 6 A C E G I K M O 5 4 3 2 B D F H J L N P 1 0

Dene os seguintes grupos 22 de pixels:

A C

B D

E G

F H

I K

J L

M O

N P

Linhas 4n

Linhas 4n + 1 Linhas 4n + 2 Linhas 4n + 3

Onde A, B, . . . , P so cdigos de cor de 4 bits, e n um inteiro de 0 a 5. a o e

8.7

Sprites

Todos os modos de v deo (exceto o modo texto 4024) permitem a exibio de at 32 sprites, que so ca e a independentes dos pixels normais e no borram. a As duas tabelas que denem os sprites so a Tabela de Atributos de Sprite e a Tabela de Imagens de a Sprite. A Tabela de Atributos tem 128 bytes (32 blocos de atributos de 4 bytes cada) e inicializada no intervalo e $1B00-$1B7F da VRAM, em todos os modos de tela. 111

Bloco de Atributo de Sprite

byte 0 byte 1 byte 2 byte 3


Early Clock 7 0 6 0 5

Posio Vertical ca Posio Horizontal ca Nmero da Imagem u 0 4 3 Cor do sprite 2 1 0

A posiao vertical mapeia as 192 linhas da tela de -1 a 190 (ao contrrio das coordenadas normais, que c a variam de 0 a 191), mas pode receber valores fora do intervalo para representar sprites parcialmente fora da tela. A posiao horizontal mapeia as 256 colunas da tela de 0 a 255. Para permitir sprites entrando/saindo da c tela gradualmente, o bit Early Clock pode ser setado para deslocar o sprite 32 pixels ` esquerda. a O nmero da imagem seleciona uma das 256 imagens de sprite 88, ou se o VDP estiver usando sprites u 1616, os dois bits menos signicativos so ignorados (pois cada 4 imagens 88 consecutivas formam um a sprite 1616). A cor do sprite seleciona a cor dos bits 1 da imagem. Os bits 0 so sempre transparentes. a A Tabela de Imagens de Sprites ocupa 2048 bytes de VRAM, e inicializada no intervalo $3800-$3FFF. e Cada bloco de 8 bytes dene uma imagem de sprite 88, de forma semelhante ` formao de caracteres a ca na tabela de caracteres do modo texto 3224. Quando forem usados sprites 1616 (bit Tamanho do registrador de modo 1 setado) cada 4 blocos consecutivos A, B, C e D formam um sprite como na gura abaixo.
A B C D

112

Cap tulo 9

PSG - Gerador de Som Programvel a


O PSG (Programmable Sound Generator) AY-3-8910 (General Instruments), presente em todo MSX, prov e 3 canais de som, 3 geradores de tom, 1 gerador de ru do, gerador de envoltria e duas portas de controle o usadas para controlar as portas de joystick, a entrada de dados do cassete e o modo Kana dos teclados de MSX japoneses. O PSG tem 16 registradores internos, acessados atravs de 3 portas de I/O do Z80, $A0, $A1 e $A2. e

9.1

Porta de Endereo ($A0) c


PSG, Porta de Endereo ($A0) c 0 7 0 6 0 5 0 4 Nmero de Registrador u 3 2 1 0

A porta de endereo seleciona um dos 16 registradores internos. Uma vez selecionado, podem ser realizadas c leituras e/ou escritas atravs das porta de dados. e

9.2

Portas de Dados ($A1 e $A2)

A porta $A1 e porta de escrita de dados, escrever um byte nesta porta sobrescreve o registrador interno e selecionado atravs da porta de endereo. e c A porta $A2 a porta de leitura de dados, ler esta porta tem o efeito de ler o registrador selecionado e atravs da porta de endereo. e c

9.3

Registradores do PSG

Os 6 registradores de 0 a 5 controlam as frequncias dos 3 geradores de tom. e 113

PSG: Per odo do Gerador de Tom do Canal A

Registrador 0 Registrador 1
7 6

Per odo do Canal A (LSB) 5 4 3 Per odo do Canal A (MSB) 2 1 0

PSG: Per odo do Gerador de Tom do Canal B

Registrador 2 Registrador 3
7 6

Per odo do Canal B (LSB) 5 4 3 Per odo do Canal B (MSB) 2 1 0

PSG: Per odo do Gerador de Tom do Canal C

Registrador 4 Registrador 5
7 6

Per odo do Canal C (LSB) 5 4 3 Per odo do Canal C (MSB) 2 1 0

Os per odos so valores entre 1 e 4095 que dividem uma frequncia mestre do PSG. A frequncia mestre do a e e gerador de tom a frequncia do clock do PSG dividida por 16. A frequncia do clock do PSG metade e e e e da frequncia do clock do Z80, que de aproximadamente 3.57 MHz, variando um pouco em cada modelo e e de MSX. A tabela abaixo lista as frequncias dos MSX brasileiros. e Modelo Gradient Expert Epcom HotBit Freq. Z80 3575611 Hz 3579545 Hz Freq. PSG 1787805.5 Hz 1789772.5 Hz Freq. Gerador de Tom 111737.8 Hz ( 111738 Hz) 111860.8 Hz ( 111861 Hz)

A frequncias foram tomadas de [P+ 87]. Para obter a frequncia mestre de gerao de tons basta dividir e e ca a frequncia de clock do Z80 por 32. e Esta frequncia mestre permite tons entre 27 Hz (Per e odo 4095) e 111738 Hz (per odo 1). A faixa aud para seres humanos (aproximadamente) de 20 a 20000 Hz, e ainda assim o som gerado estar vel e a limitado pela resposta de frequncia do alto falante utilizado. Para tocar um L central (440 Hz) o valor e a do per odo seria 254.
PSG: Per odo do Gerador de Ru do

Registrador 6

Per odo do Gerador de Ru do 4 3 2 1 0

O per odo do gerador de ru um divisor entre 1 e 31 para a mesma frequncia mestre dos geradores do e e de tom.
PSG: Controle de Canais Ru do Ru do Ru Tom C Tom B Tom A do Dir B Dir A C O B O A O O O O 7 6 5 4 3 2 1 0

Registrador 7

114

O registrador 7 controla o mixer dos trs canais de som e a direo das duas portas de dados (usadas para e ca joystick e cassete). Nos bits 6 e 7 0=Entrada e 1=Sa da, e a congurao deve ser sempre Dir A=0, Dir ca B=1 (Reg.7 = 10) para evitar danos ao hardware. Os bits 0-5 controlam o mixer dos canais, 0=ativa, 1=desativa.

PSG: Amplitude dos Canais

Registrador 8 Registrador 9 Registrador 10

Modo Env A Modo Env B Modo Env C 4 3

Amplitude Canal A Amplitude Canal B Amplitude Canal C 2 1 0

Os registradores 8-10 controlam a amplitude (volume) de cada canal. A amplitude pode ser xa (Modo Env=0) com o valor entre 0 e 15 colocado nos bits 0-3 ou modulada pelo gerador de envoltria (Modo o Env=1). Quando Modo Env=1 os valores nos bits 0-3 so ignorados. a

PSG: Per odo da Envoltria o

Registrador 11 Registrador 12
7 6

Per odo da Envoltria (LSB) o Per odo da Envoltria (MSB) o 5 4 3 2 1 0

Os registradores 11 e 12 controlam o per odo da envoltria, um divisor entre 1 e 65535, pelo qual dividida o e a frequncia mestre do gerador de envoltria, que a frequncia do clock do Z80 dividida por 512 (ou a e o e e frequncia mestre do gerador de tom dividida por 16). e

Modelo Gradient Expert Epcom HotBit

Freq. Z80 3575611 Hz 3579545 Hz

Freq. PSG 1787805.5 Hz 1789772.5 Hz

Freq. Gerador de Envoltria o 6983.6 Hz ( 6984 Hz) 6991.3 Hz ( 6991 Hz)

PSG: Forma da Envoltria o

Registrador 13

4 3

Forma da Envoltria o 2 1 0

O registrador 13 controla a forma da envoltria conforme a tabela abaixo. o 115

Valor 00xx 01xx 1000 1001 1010 1011 1100 1101 1110 1111

Forma da Envoltria o d d d d d d d d d d d d d d d d d d d d d d d d d d d d d d d d d d d d d d d d d d d d d d
PSG: Leitura da Porta A Joy Joy Kana Joy Mode Bot.B Bot.A Right 6 5 4 3

Registrador 14

CAS In 7

Joy Left 2

Joy Down 1

Joy Up 0

O registrador 14 l a porta A do PSG. Os bits 0-5 lem o estado do joystick selecionado pelo registrador e e 15 (os bits 0-5 so invertidos, 0=acionado, 1=solto, recomendvel utilizar as rotinas BIOS para ler o a e a joystick). O bit 6 indica o modo kana em teclados de MSX japoneses. O bit 7 usado para ler a entrada e do gravador cassete.
PSG: Escrita na Porta B Joy Pulso Pulso 1 2 1 LED Select 7 6 5 4 3

Registrador 15

Kana

1 2

1 1

1 0

O registrador 15 usado para escrever na porta B do PSG. Os bits 0-3 esto ligados aos pinos 6 e 7 dos e a conectores de joystick, podendo servir como sa de dados (no faz sentido com joysticks, mas pode fazer da a sentido com tablets ou para usar os conectores de joystick como interface de rede). Os bits de pulso (4-5) so usados para controlar paddles. O bit 6 seleciona a porta de joystick a ser lida pela porta A/registrador a 14 (0=Joy A, 1=Joy B). O bit 7 usado para controlar o led Kana em MSXs japoneses. e

9.4

Escala Cromtica a

A tabela abaixo representa as 8 oitavas da escala cromtica (assumindo 440 Hz para o L central) e os a a valores de per odo apropriados para os registradores 0-5 em um MSX usando 11860.8 Hz como frequncia e mestre do gerador de tom.1
1 Para subir uma oitava multiplica-se a frequncia por 2, para descer uma oitava divide-se a frequncia por 2; Para subir e e e um semitom multiplica-se a frequncia por 12 2 1.05946309436; Para descer um semitom divide-se a frequncia por 12 2. e =

116

Nota/8a C C# D D# E F F# G G# A A# B

1
32.70 Hz

2
65.41 Hz

3
130.81 Hz

4
261.63 Hz

5
523.25 Hz

6
1046.50 Hz

7
2093.00 Hz

8
4186.01 Hz

$0D5C
34.65 Hz

$06AE
69.30 Hz

$0357
138.59 Hz

$01AC
277.18 Hz

$00D6
554.37 Hz

$006B
1108.73 Hz

$0035
2217.46 Hz

$001B
4434.92 Hz

$0C9D
36.71 Hz

$064E
73.42 Hz

$0327
146.83 Hz

$0194
293.66 Hz

$00CA
587.33 Hz

$0065
1174.66 Hz

$0032
2349.32 Hz

$0019
4698.64 Hz

$0BE7
38.89 Hz

$05F4
77.78 Hz

$02FA
155.56 Hz

$017D
311.13 Hz

$00BE
622.25 Hz

$005F
1244.51 Hz

$0030
2489.02 Hz

$0018
4978.03 Hz

$0B3C
41.20 Hz

$059E
82.41 Hz

$02CF
164.81 Hz

$0168
329.63 Hz

$00B4
659.26 Hz

$005A
1318.51 Hz

$002D
2637.02 Hz

$0016
5274.04 Hz

$0A9B
43.65 Hz

$054D
87.31 Hz

$02A7
174.61 Hz

$0153
349.23 Hz

$00AA
698.46 Hz

$0055
1396.91 Hz

$002A
2793.83 Hz

$0015
5587.65 Hz

$0A02
46.25 Hz

$0501
92.50 Hz

$0281
185.00 Hz

$0140
369.99 Hz

$00A0
739.99 Hz

$0050
1479.98 Hz

$0028
2959.96 Hz

$0014
5919.91 Hz

$0973
49.00 Hz

$04B9
98.00 Hz

$025D
196.00 Hz

$012E
392.00 Hz

$0097
783.99 Hz

$004C
1567.98 Hz

$0026
3135.96 Hz

$0013
6271.93 Hz

$08EB
51.91 Hz

$0475
103.83 Hz

$023B
207.65 Hz

$011D
415.30 Hz

$008F
830.61 Hz

$0047
1661.22 Hz

$0024
3322.44 Hz

$0012
6644.88 Hz

$086B
55.00 Hz

$0435
110.00 Hz

$021B
220.00 Hz

$010D
440.00 Hz

$0087
880.00 Hz

$0043
1760.00 Hz

$0022
3520.00 Hz

$0011
7040.00 Hz

$07F2
58.27 Hz

$03F9
116.54 Hz

$01FC
233.08 Hz

$00FE
466.16 Hz

$007F
932.33 Hz

$0040
1864.66 Hz

$0020
3729.31 Hz

$0010
7458.62 Hz

$0780
61.74 Hz

$03C0
123.47 Hz

$01E0
246.94 Hz

$00F0
493.88 Hz

$0078
987.77 Hz

$003C
1975.53 Hz

$001E
3951.07 Hz

$000F
7902.13 Hz

$0714

$038A

$01C5

$00E2

$0071

$0039

$001C

$000E

117

Cap tulo 10

MegaRAM e Memory Mapper


10.1 MegaRAM

A MegaRAM uma fam de cartuchos para MSX desenvolvida no Brasil por Ademir Carchano (da e lia ACVS) e comercializada pela ACVS e pela DDX. A MegaRAM uma expanso de memria desenvolvida com o objetivo permitir a execuo de jogos e a o ca MegaROM (jogos de 128K, como Nemesis) a partir de disquetes.

10.1.1

Programao da MegaRAM ca

A memria da MegaRAM dividida em blocos de 8 KB, que podem ser mapeados no slot em que se o e encontra a MegaRAM. Operar a MegaRAM consiste em realizar duas operaes: selecionar blocos a co serem mapeados e ler/escrever normalmente no slot da MegaRAM para modicar a rea de memria a o mapeada. Para mapear um bloco da MegaRAM, deve-se chavear a MegaRAM para o modo BLOCK-SELECT realizando uma instruo OUT para a porta $8E (o dado escrito ignorado) e escrevendo o nmero ca e u do bloco desejado na rea onde desejamos mapear o bloco. Embora seja poss a vel escrever em qualquer endereo da rea destino, boa prtica d programao escrever no primeiro endereo da rea. Em uma c a e a ca c a MegaRAM de 256 KB h 32 blocos, numerados de 0 a 31. A maior MegaRAM comercial produzida foi de a 768 KB, mas h registro de construes amadoras de 1 MB, e o mximo terico 2 MB (256 blocos de a co a o e 8KB). Os blocos so sempre mapeados em regies mltiplas de $2000 (8KB) no slot da MegaRAM, mas apenas a o u as 4 regies $4000-$5FFF, $6000-$7FFF, $8000-$9FFF e $A000-$BFFF podem ser usadas conavelmente o em qualquer MegaRAM. Nas MegaRAMs DDX as reas $0000-$1FFF, $2000-$3FFF, $C000-$DFFF e $E000-$FFFF simplesmente a no so utilizveis (sempre contm lixo), e nas MegaRAMs ACVS ocorre o mirror-eect , em que h a a a e a espelhamento de regies, ignorando o bit mais alto do endereo (a rea $0000 espelho da rea $8000, a o c a e a aea $2000 espelho da rea $A000, e assim sucessivamente). r e a Uma vez mapeado o bloco desejado, deve-se colocar a MegaRAM em modo WRITE-ENABLE para acessar a regio mapeada, realizando uma instruo IN na porta $8E. a ca O trecho de cdigo abaixo mapeia a segunda pgina da MegaRAM em $8000 e l o terceiro byte da o a e pgina, assumindo que a MegaRAM esteja no slot 1. Em situaes reais, deve ser realizada uma busca a co pela MegaRAM antes de utiliz-la. a
1

.define WRSLT $0014 .define RDSLT $000C 118

Slot da MegaRAM
$0000-$1FFF $2000-$3FFF $4000-$5FFF $6000-$7FFF $8000-$9FFF $A000-$BFFF $C000-$DFFF $E000-$FFFF $0000-$1FFF $2000-$3FFF $4000-$5FFF $6000-$7FFF $8000-$9FFF $A000-$BFFF $C000-$DFFF $E000-$FFFF

Slot da MegaRAM
LIXO LIXO

LIXO LIXO

ACVS (com Mirror-Effect)


Figura 10.1: Mirror-Eect na MegaRAM

DDX (sem Mirror-Effect)

10

ld push out ld ld ld call in ld pop call

%b, $01 %bc $8e, %a %e, 2 %a, %b %hl, $8000 WRSLT %a, $8e %hl, $8002 %af RDSLT

; ; ; ; ; ; ; ; ; ; ;

slot id da MegaRAM salva slot id modo block-select pagina 2 slot id endereco de mapeamento escreve %e no endereco %hl do slot %a modo write-enable terceiro byte da pagina %a <- slot id le^ endereco %hl do slot %a e retorna em %a

Se for selecionado um nmero de pgina invlido, a MegaRAM faz wrap mdulo-nmero de pginas, ou u a a o u a seja, selecionar a pgina 35 em uma MegaRam de 256 KB o mesmo que selecionar a pgina 3 (35 mod a e a 32).

10.1.2

MegaRAM Disk

A DDX comercializou a MegaRAM Disk, que pode atuar como uma MegaRAM normal ou como um RAM disk. O modo MegaRAM selecionado com uma instruo IN na porta $8F. O modo Disk selecionado com e ca e uma instruo OUT na porta $8F. No modo disk a MegaRAM aparece como uma nova letra de drive e ca pode ser acessada como uma unidade de discos com as rotinas do BDOS. 119

10.2

Memory Mapper

A memory mapper, presente nos MSX 2, organizada em blocos de 16 KB que podem ser mapeados em e uma das 4 pginas de 16 KB do slot onde est instalada. a a O nmero da pgina escrito com uma instruo OUT nas portas $FC, $FD, $FE e $FF. (a porta $FC u a e ca controla o bloco mapeado em $0000-$3FFF, a porta $FD controla o bloco mapeado em $4000-$7FFF, a porta $FE controla o bloco mapeado em $8000-$BFFF e a porta $FF controla o bloco mapeado em $C000-$FFFF) No recomendvel ler (instruo IN) as portas de controle da mapper. Nem todas mappers tm o a e a ca e circuito de tratamento do IN (as mappers externas da ACVS, por exemplo, no tm), e se houver diversas a e mappers de tamanhos diferentes no mesmo micro, a operao pode danicar o micro ao gerar conitos no ca barramento.

120

Apndice A e

GNU Free Documentation License


Este livro est sob a licena GNU Free Documentation License, inclu neste apndice. No existe a c da e a traduo ocial da licena para o portugus, e por isso preferi colocar o texto original em ingls. De forma ca c e e bem resumida: voc pode fazer quantas cpias quiser deste documento, seja em forma digital ou rvores e o a A mortas, e voc pode obter o cdigo-fonte L TEX deste livro em http://foca.sf.net. e o

GNU Free Documentation License


Version 1.1, March 2000 Copyright c 2000 Free Software Foundation, Inc. 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA Everyone is permitted to copy and distribute verbatim copies of this license document, but changing it is not allowed. Preamble. The purpose of this License is to make a manual, textbook, or other written document free in the sense of freedom: to assure everyone the eective freedom to copy and redistribute it, with or without modifying it, either commercially or noncommercially. Secondarily, this License preserves for the author and publisher a way to get credit for their work, while not being considered responsible for modications made by others. This License is a kind of copyleft, which means that derivative works of the document must themselves be free in the same sense. It complements the GNU General Public License, which is a copyleft license designed for free software. We have designed this License in order to use it for manuals for free software, because free software needs free documentation: a free program should come with manuals providing the same freedoms that the software does. But this License is not limited to software manuals; it can be used for any textual work, regardless of subject matter or whether it is published as a printed book. We recommend this License principally for works whose purpose is instruction or reference. Applicability and Denitions. This License applies to any manual or other work that contains a notice placed by the copyright holder saying it can be distributed under the terms of this License. The Document, below, refers to any such manual or work. Any member of the public is a licensee, and is addressed as you. A Modied Version of the Document means any work containing the Document or a portion of it, either copied verbatim, or with modications and/or translated into another language. A Secondary Section is a named appendix or a front-matter section of the Document that deals exclusively with the relationship of the publishers or authors of the Document to the Documents overall subject (or to related matters) and contains nothing that could fall directly within that overall subject. (For example, if the Document is in part a textbook of mathematics, a Secondary Section may not explain any mathematics.) The relationship could

121

be a matter of historical connection with the subject or with related matters, or of legal, commercial, philosophical, ethical or political position regarding them. The Invariant Sections are certain Secondary Sections whose titles are designated, as being those of Invariant Sections, in the notice that says that the Document is released under this License. The Cover Texts are certain short passages of text that are listed, as Front-Cover Texts or Back-Cover Texts, in the notice that says that the Document is released under this License. A Transparent copy of the Document means a machine-readable copy, represented in a format whose specication is available to the general public, whose contents can be viewed and edited directly and straightforwardly with generic text editors or (for images composed of pixels) generic paint programs or (for drawings) some widely available drawing editor, and that is suitable for input to text formatters or for automatic translation to a variety of formats suitable for input to text formatters. A copy made in an otherwise Transparent le format whose markup has been designed to thwart or discourage subsequent modication by readers is not Transparent. A copy that is not Transparent is called Opaque. Examples of suitable formats for Transparent copies include plain ASCII without markup, Texinfo input format, A L TEX input format, SGML or XML using a publicly available DTD, and standard-conforming simple HTML designed for human modication. Opaque formats include PostScript, PDF, proprietary formats that can be read and edited only by proprietary word processors, SGML or XML for which the DTD and/or processing tools are not generally available, and the machine-generated HTML produced by some word processors for output purposes only. The Title Page means, for a printed book, the title page itself, plus such following pages as are needed to hold, legibly, the material this License requires to appear in the title page. For works in formats which do not have any title page as such, Title Page means the text near the most prominent appearance of the works title, preceding the beginning of the body of the text. Verbatim Copying. You may copy and distribute the Document in any medium, either commercially or noncommercially, provided that this License, the copyright notices, and the license notice saying this License applies to the Document are reproduced in all copies, and that you add no other conditions whatsoever to those of this License. You may not use technical measures to obstruct or control the reading or further copying of the copies you make or distribute. However, you may accept compensation in exchange for copies. If you distribute a large enough number of copies you must also follow the conditions in section 3. You may also lend copies, under the same conditions stated above, and you may publicly display copies. Copying in Quantity. If you publish printed copies of the Document numbering more than 100, and the Documents license notice requires Cover Texts, you must enclose the copies in covers that carry, clearly and legibly, all these Cover Texts: Front-Cover Texts on the front cover, and Back-Cover Texts on the back cover. Both covers must also clearly and legibly identify you as the publisher of these copies. The front cover must present the full title with all words of the title equally prominent and visible. You may add other material on the covers in addition. Copying with changes limited to the covers, as long as they preserve the title of the Document and satisfy these conditions, can be treated as verbatim copying in other respects. If the required texts for either cover are too voluminous to t legibly, you should put the rst ones listed (as many as t reasonably) on the actual cover, and continue the rest onto adjacent pages. If you publish or distribute Opaque copies of the Document numbering more than 100, you must either include a machine-readable Transparent copy along with each Opaque copy, or state in or with each Opaque copy a publicly-accessible computer-network location containing a complete Transparent copy of the Document, free of added material, which the general network-using public has access to download anonymously at no charge using public-standard network protocols. If you use the latter option, you must take reasonably prudent steps, when you begin distribution of Opaque copies in quantity, to ensure that this Transparent copy will remain thus accessible at the stated location until at least one year after the last time you distribute an Opaque copy (directly or through your agents or retailers) of that edition to the public. It is requested, but not required, that you contact the authors of the Document well before redistributing any large number of copies, to give them a chance to provide you with an updated version of the Document. Modications. You may copy and distribute a Modied Version of the Document under the conditions of sections

122

2 and 3 above, provided that you release the Modied Version under precisely this License, with the Modied Version lling the role of the Document, thus licensing distribution and modication of the Modied Version to whoever possesses a copy of it. In addition, you must do these things in the Modied Version: Use in the Title Page (and on the covers, if any) a title distinct from that of the Document, and from those of previous versions (which should, if there were any, be listed in the History section of the Document). You may use the same title as a previous version if the original publisher of that version gives permission. List on the Title Page, as authors, one or more persons or entities responsible for authorship of the modications in the Modied Version, together with at least ve of the principal authors of the Document (all of its principal authors, if it has less than ve). State on the Title page the name of the publisher of the Modied Version, as the publisher. Preserve all the copyright notices of the Document. Add an appropriate copyright notice for your modications adjacent to the other copyright notices. Include, immediately after the copyright notices, a license notice giving the public permission to use the Modied Version under the terms of this License, in the form shown in the Addendum below. Preserve in that license notice the full lists of Invariant Sections and required Cover Texts given in the Documents license notice. Include an unaltered copy of this License. Preserve the section entitled History, and its title, and add to it an item stating at least the title, year, new authors, and publisher of the Modied Version as given on the Title Page. If there is no section entitled History in the Document, create one stating the title, year, authors, and publisher of the Document as given on its Title Page, then add an item describing the Modied Version as stated in the previous sentence. Preserve the network location, if any, given in the Document for public access to a Transparent copy of the Document, and likewise the network locations given in the Document for previous versions it was based on. These may be placed in the History section. You may omit a network location for a work that was published at least four years before the Document itself, or if the original publisher of the version it refers to gives permission. In any section entitled Acknowledgements or Dedications, preserve the sections title, and preserve in the section all the substance and tone of each of the contributor acknowledgements and/or dedications given therein. Preserve all the Invariant Sections of the Document, unaltered in their text and in their titles. Section numbers or the equivalent are not considered part of the section titles. Delete any section entitled Endorsements. Such a section may not be included in the Modied Version. Do not retitle any existing section as Endorsements or to conict in title with any Invariant Section. If the Modied Version includes new front-matter sections or appendices that qualify as Secondary Sections and contain no material copied from the Document, you may at your option designate some or all of these sections as invariant. To do this, add their titles to the list of Invariant Sections in the Modied Versions license notice. These titles must be distinct from any other section titles. You may add a section entitled Endorsements, provided it contains nothing but endorsements of your Modied Version by various parties for example, statements of peer review or that the text has been approved by an organization as the authoritative denition of a standard. You may add a passage of up to ve words as a Front-Cover Text, and a passage of up to 25 words as a Back-Cover Text, to the end of the list of Cover Texts in the Modied Version. Only one passage of Front-Cover Text and one of Back-Cover Text may be added by (or through arrangements made by) any one entity. If the Document already includes a cover text for the same cover, previously added by you or by arrangement made by the same entity you are acting on behalf of, you may not add another; but you may replace the old one, on explicit permission from the previous publisher that added the old one. The author(s) and publisher(s) of the Document do not by this License give permission to use their names for publicity for or to assert or imply endorsement of any Modied Version.

123

Combining Documents. You may combine the Document with other documents released under this License, under the terms dened in section 4 above for modied versions, provided that you include in the combination all of the Invariant Sections of all of the original documents, unmodied, and list them all as Invariant Sections of your combined work in its license notice. The combined work need only contain one copy of this License, and multiple identical Invariant Sections may be replaced with a single copy. If there are multiple Invariant Sections with the same name but dierent contents, make the title of each such section unique by adding at the end of it, in parentheses, the name of the original author or publisher of that section if known, or else a unique number. Make the same adjustment to the section titles in the list of Invariant Sections in the license notice of the combined work. In the combination, you must combine any sections entitled History in the various original documents, forming one section entitled History; likewise combine any sections entitled Acknowledgements, and any sections entitled Dedications. You must delete all sections entitled Endorsements. Collections of Documents. You may make a collection consisting of the Document and other documents released under this License, and replace the individual copies of this License in the various documents with a single copy that is included in the collection, provided that you follow the rules of this License for verbatim copying of each of the documents in all other respects. You may extract a single document from such a collection, and distribute it individually under this License, provided you insert a copy of this License into the extracted document, and follow this License in all other respects regarding verbatim copying of that document. Aggregation With Independent Works. A compilation of the Document or its derivatives with other separate and independent documents or works, in or on a volume of a storage or distribution medium, does not as a whole count as a Modied Version of the Document, provided no compilation copyright is claimed for the compilation. Such a compilation is called an aggregate, and this License does not apply to the other self-contained works thus compiled with the Document, on account of their being thus compiled, if they are not themselves derivative works of the Document. If the Cover Text requirement of section 3 is applicable to these copies of the Document, then if the Document is less than one quarter of the entire aggregate, the Documents Cover Texts may be placed on covers that surround only the Document within the aggregate. Otherwise they must appear on covers around the whole aggregate. Translation. Translation is considered a kind of modication, so you may distribute translations of the Document under the terms of section 4. Replacing Invariant Sections with translations requires special permission from their copyright holders, but you may include translations of some or all Invariant Sections in addition to the original versions of these Invariant Sections. You may include a translation of this License provided that you also include the original English version of this License. In case of a disagreement between the translation and the original English version of this License, the original English version will prevail. Termination. You may not copy, modify, sublicense, or distribute the Document except as expressly provided for under this License. Any other attempt to copy, modify, sublicense or distribute the Document is void, and will automatically terminate your rights under this License. However, parties who have received copies, or rights, from you under this License will not have their licenses terminated so long as such parties remain in full compliance. Future Revisions of This License. The Free Software Foundation may publish new, revised versions of the GNU Free Documentation License from time to time. Such new versions will be similar in spirit to the present version, but may dier in detail to address new problems or concerns. See http://www.gnu.org/copyleft/. Each version of the License is given a distinguishing version number. If the Document species that a particular numbered version of this License or any later versionapplies to it, you have the option of following the terms and conditions either of that specied version or of any later version that has been published (not as a draft) by the Free Software Foundation. If the Document does not specify a version number of this License, you may choose any version ever published (not as a draft) by the Free Software Foundation.

124

ADDENDUM: How to use this License for your documents. To use this License in a document you have written, include a copy of the License in the document and put the following copyright and license notices just after the title page: Copyright c YEAR YOUR NAME. Permission is granted to copy, distribute and/or modify this document under the terms of the GNU Free Documentation License, Version 1.1 or any later version published by the Free Software Foundation; with the Invariant Sections being LIST THEIR TITLES, with the Front-Cover Texts being LIST, and with the Back-Cover Texts being LIST. A copy of the license is included in the section entitled GNU Free Documentation License. If you have no Invariant Sections, write with no Invariant Sections instead of saying which ones are invariant. If you have no Front-Cover Texts, write no Front-Cover Texts instead of Front-Cover Texts being LIST; likewise for Back-Cover Texts. If your document contains nontrivial examples of program code, we recommend releasing these examples in parallel under your choice of free software license, such as the GNU General Public License, to permit their use in free software.

125

Referncias Bibliogrcas e a
[Ava88] Avalon. O Livro Vermelho do MSX. Ed. McGraw-Hill, So Paulo, SP, Brasil, 1988. a [Bar90] Eduardo A. Barbosa. Guia do Programador MSX. Editora Cincia Moderna, 1990. e [Lev79] Lance A. Leventhal. Z80 Assembly Language Programming. Osborne/McGraw-Hill, Berkeley, CA, EUA, 1979. [NW91] Peter Norton e Richard Wilton. Novo Guia Peter Norton para Programadores do PC e PS/2. Editora Campus, 1991. [P+ 87] Pierluigi Piazzi et al. Aprofundando-se no MSX. Ed. Aleph, So Paulo, SP, Brasil, 5a ediao, 1987. a c [RL87] Flvio Rossini e Henrique Figueredo Luz. Linguagem de Mquina: MSX. Ed. Aleph, So Paulo, SP, a a a Brasil, 1987. [You01] Sean Young. The Undocumented Z80 Documented. http://www.msxnet.org/tech/, Setembro 2001. v0.4, GNU FDL. [Zil01] Zilog, San Jose, CA, EUA. Z80 Family CPU Users Manual, 2001. UM008002-0202, http://www.zilog.com.

126

Indice Remissivo
.align (diretiva), 40 .append (diretiva), 40 .da (diretiva), 41 .db (diretiva), 41 .dene (diretiva), 41 .ds (diretiva), 41 .dw (diretiva), 42 .dz (diretiva), 42 .empty (diretiva), 42 .endm (diretiva), 42 .endr (diretiva), 42 .forget (diretiva), 42 .header (diretiva), 43 .include (diretiva), 43 .macro (diretiva), 44 .origin (diretiva), 44 .repeat (diretiva), 45 .x (diretiva), 46 access (chamada Uzix), 51 ADC (opcode), 7 ADD (opcode), 8 alarm (chamada Uzix), 51 AND (opcode), 8 ARG (varivel de sistema), 84 a ARYTA2 (varivel de sistema), 83 a ARYTAB (varivel de sistema), 83 a ASPCT1 (varivel de sistema), 82 a ASPCT2 (varivel de sistema), 82 a ASPECT (varivel de sistema), 84 a ATRBAS (varivel de sistema), 84 a ATRBYT (varivel de sistema), 82 a AUTFLG (varivel de sistema), 83 a AUTINC (varivel de sistema), 83 a AUTLIN (varivel de sistema), 83 a BAKCLR (varivel de sistema), 81 a BASROM (varivel de sistema), 85 a BDRATR (varivel de sistema), 86 a BDRCLR (varivel de sistema), 81 a BEEP (rotina BIOS), 61 binrio, 3 a BIT (opcode), 8 Boot (rotina BDOS), 92 BOTTOM (varivel de sistema), 86 a BPB, 101 BREAKX (rotina BIOS), 62 brk (chamada Uzix), 52 BUF (varivel de sistema), 82 a BUFMIN (varivel de sistema), 82 a CALATR (rotina BIOS), 62 CALBAS (rotina BIOS), 62 CALL (opcode), 9 CALLF (rotina BIOS), 62 CALPAT (rotina BIOS), 63 CALSLT (rotina BIOS), 63 CAPST (varivel de sistema), 86 a CASPRV (varivel de sistema), 86 a CCF (opcode), 9 CENCNT (varivel de sistema), 84 a CGPBAS (varivel de sistema), 84 a CGPNT (varivel de sistema), 84 a chdir (chamada Uzix), 52 CHGCAP (rotina BIOS), 63 CHGCLR (rotina BIOS), 64 CHGET (rotina BIOS), 64 CHGMOD (rotina BIOS), 64 CHGSND (rotina BIOS), 64 CHKRAM (rotina BIOS), 65 chmod (chamada Uzix), 52 chown (chamada Uzix), 52 CHPUT (rotina BIOS), 65 chroot (chamada Uzix), 52 CHSNS (rotina BIOS), 65 CLIKSW (varivel de sistema), 81 a CLINEF (varivel de sistema), 84 a CLOC (varivel de sistema), 84 a close (chamada Uzix), 52 CLRSPR (rotina BIOS), 65 CLS (rotina BIOS), 66 CMASK (varivel de sistema), 84 a CNPNTS (varivel de sistema), 84 a CONLO (varivel de sistema), 82 a CONSAV (varivel de sistema), 82 a CONSDFG (varivel de sistema), 81 a CONTXT (varivel de sistema), 82 a CONTYP (varivel de sistema), 82 a

127

CP (opcode), 9 CPCNT (varivel de sistema), 84 a CPCNT8 (varivel de sistema), 84 a CPD (opcode), 10 CPDR (opcode), 10 CPI (opcode), 10 CPIR (opcode), 11 CPL (opcode), 11 CPLOTF (varivel de sistema), 84 a CRCSUM (varivel de sistema), 84 a creat (chamada Uzix), 53 CreateFile (rotina BDOS), 97 CRTCNT (varivel de sistema), 81 a CS1200 (varivel de sistema), 82 a CS2400 (varivel de sistema), 82 a CSAVEA (varivel de sistema), 84 a CSAVEM (varivel de sistema), 84 a CSCLXY (varivel de sistema), 84 a CSRX (varivel de sistema), 81 a CSRY (varivel de sistema), 81 a CSTCNT (varivel de sistema), 84 a CSTYLE (varivel de sistema), 86 a CURSAV (varivel de sistema), 85 a CXOFF (varivel de sistema), 85 a CYOFF (varivel de sistema), 85 a DAA (opcode), 11 DAC (varivel de sistema), 84 a DATLIN (varivel de sistema), 83 a DATPTR (varivel de sistema), 83 a DCOMPR (rotina BIOS), 66 DEC (opcode), 12 DECCNT (varivel de sistema), 84 a decimal, 3 DECTM2 (varivel de sistema), 84 a DEFTBL (varivel de sistema), 83 a DeleteFile (rotina BDOS), 96 DEVICE (varivel de sistema), 87 a DI (opcode), 12 DIMFLG (varivel de sistema), 82 a DISSCR (rotina BIOS), 66 DJNZ (opcode), 12 DONUM (varivel de sistema), 82 a DORES (varivel de sistema), 82 a DOT (varivel de sistema), 83 a DOWNC (rotina BIOS), 66 DRWANG (varivel de sistema), 86 a DRWFLG (varivel de sistema), 86 a DRWSCL (varivel de sistema), 86 a DSCTMP (varivel de sistema), 83 a DSPFNK (rotina BIOS), 66 dup (chamada Uzix), 52 dup2 (chamada Uzix), 52 EI (opcode), 13

ENASCR (rotina BIOS), 67 ENASLT (rotina BIOS), 67 ENDFOR (varivel de sistema), 83 a ENDPRG (varivel de sistema), 82 a ENSTOP (varivel de sistema), 85 a ERAFNK (rotina BIOS), 67 ERRFLG (varivel de sistema), 82 a ERRLIN (varivel de sistema), 83 a ERRTXT (varivel de sistema), 83 a escapes, 3 ESCCNT (varivel de sistema), 86 a EX (opcode), 13 execve (chamada Uzix), 52 exit (chamada Uzix), 52 EXPTBL (varivel de sistema), 86 a EXX (opcode), 14 FBUFFR (varivel de sistema), 84 a FCB, 100 FETCHC (rotina BIOS), 67 FILNAM (varivel de sistema), 84 a FILNM2 (varivel de sistema), 84 a FILTAB (varivel de sistema), 84 a FILVRM (rotina BIOS), 67 FindFirst (rotina BDOS), 96 FindNext (rotina BDOS), 96 FLBMEM (varivel de sistema), 86 a FLGINP (varivel de sistema), 83 a FNKFLG (varivel de sistema), 85 a FNKSTR (varivel de sistema), 84 a FNKSWI (varivel de sistema), 85 a FORCLR (varivel de sistema), 81 a fork (chamada Uzix), 52 FRCNEW (varivel de sistema), 82 a FRETOP (varivel de sistema), 83 a fstat (chamada Uzix), 52 FSTPOS (varivel de sistema), 85 a FUNACT (varivel de sistema), 84 a GetChar (rotina BDOS), 94 GetCharAndEcho (rotina BDOS), 93 GetCurrentDrive (rotina BDOS), 97 GetDate (rotina BDOS), 99 GetDiskInfo (rotina BDOS), 98 getegid (chamada Uzix), 53 geteuid (chamada Uzix), 53 GetFileSize (rotina BDOS), 99 getfsys (chamada Uzix), 52 getgid (chamada Uzix), 53 getpid (chamada Uzix), 53 GETPNT (varivel de sistema), 82 a getppid (chamada Uzix), 53 getprio (chamada Uzix), 53 getset (chamada Uzix), 52 getsockinfo (chamada Uzix), 55

128

GetString (rotina BDOS), 94 GetSysDrives (rotina BDOS), 97 GetSysVersion (rotina BDOS), 95 gettcpinfo (chamada Uzix), 55 GetTime (rotina BDOS), 100 getuid (chamada Uzix), 53 GICINI (rotina BIOS), 68 GRPACX (varivel de sistema), 86 a GRPACY (varivel de sistema), 86 a GRPATR (varivel de sistema), 81 a GRPCGP (varivel de sistema), 81 a GRPCOL (varivel de sistema), 81 a GRPHED (varivel de sistema), 86 a GRPNAM (varivel de sistema), 81 a GRPPAT (varivel de sistema), 81 a GRPPRT (rotina BIOS), 68 GSPSIZ (rotina BIOS), 68 GTPAD (rotina BIOS), 68 GTPDL (rotina BIOS), 69 GTSTCK (rotina BIOS), 69 GTTRIG (rotina BIOS), 69 GXPOS (varivel de sistema), 86 a GYPOS (varivel de sistema), 86 a HALT (opcode), 14 HATTR (gancho), 89 HBAKU (gancho), 90 HBINL (gancho), 89 HBINS (gancho), 89 HBUFL (gancho), 91 HCHGE (gancho), 89 HCHPU (gancho), 89 HCHRG (gancho), 90 HCLEA (gancho), 90 HCMD (gancho), 89 HCOMP (gancho), 90 HCOPY (gancho), 89 HCRDO (gancho), 90 HCRUN (gancho), 90 HCRUS (gancho), 90 HCVD (gancho), 89 HCVI (gancho), 89 HCVS (gancho), 89 HDEVN (gancho), 90 HDGET (gancho), 89 HDIRD (gancho), 90 HDOGR (gancho), 90 HDSKC (gancho), 90 HDSKI (gancho), 89 HDSKO (gancho), 89 HDSPC (gancho), 89 HDSPF (gancho), 89 HEADER (varivel de sistema), 82 a HEOF (gancho), 90

HERAC (gancho), 89 HERAF (gancho), 89 HERRF (gancho), 90 HERRO (gancho), 91 HERRP (gancho), 90 HEVAL (gancho), 91 hexadecimal, 3 HFIEL (gancho), 89 HFILE (gancho), 89 HFILO (gancho), 90 HFINE (gancho), 90 HFING (gancho), 91 HFINI (gancho), 90 HFINP (gancho), 90 HFORM (gancho), 91 HFPOS (gancho), 90 HFRET (gancho), 91 HFRME (gancho), 90 HFRQI (gancho), 91 HGEND (gancho), 90 HGETP (gancho), 89 HGONE (gancho), 90 HIGH (varivel de sistema), 82 a HINDS (gancho), 90 HINIP (gancho), 89 HINLI (gancho), 89 HIPL (gancho), 89 HISFL (gancho), 90 HISMI (gancho), 91 HISRE (gancho), 90 HKEYA (gancho), 89 HKEYC (gancho), 89 HKEYI (gancho), 89 HKILL (gancho), 89 HLIST (gancho), 91 HLOC (gancho), 90 HLOF (gancho), 90 HLOPD (gancho), 90 HLPTO (gancho), 91 HLPTS (gancho), 91 HLSET (gancho), 89 HMAIN (gancho), 90 HMERG (gancho), 89 HMKD (gancho), 89 HMKI (gancho), 89 HMKS (gancho), 89 HNAME (gancho), 89 HNEWS (gancho), 90 HNMI (gancho), 89 HNODE (gancho), 90 HNOFO (gancho), 89 HNOTR (gancho), 90 HNTFL (gancho), 89 HNTFN (gancho), 90

129

HNTPL (gancho), 91 HNULO (gancho), 89 HOKNO (gancho), 91 HOLD8 (varivel de sistema), 84 a HONGO (gancho), 89 HOUTD (gancho), 90 HPARD (gancho), 90 HPHYD (gancho), 91 HPINL (gancho), 89 HPLAY (gancho), 91 HPOSD (gancho), 90 HPRGE (gancho), 90 HPRTF (gancho), 90 HPTRG (gancho), 91 HQINL (gancho), 89 HREAD (gancho), 90 HRETU (gancho), 90 HRSET (gancho), 89 HRSLF (gancho), 90 HRUNC (gancho), 90 HSAVD (gancho), 90 HSAVE (gancho), 89 HSCNE (gancho), 91 HSCRE (gancho), 91 HSETF (gancho), 89 HSETS (gancho), 89 HSNGF (gancho), 90 HSTKE (gancho), 90 HTIMI (gancho), 89 HTOTE (gancho), 89 HTRMN (gancho), 90 HWIDT (gancho), 91 IM (opcode), 14 IN (opcode), 15 INC (opcode), 15 IND (opcode), 15 INDR (opcode), 16 INI (opcode), 16 INIFNK (rotina BIOS), 70 INIGRP (rotina BIOS), 70 INIMLT (rotina BIOS), 70 INIR (opcode), 16 INIT32 (rotina BIOS), 70 INITIO (rotina BIOS), 71 INITXT (rotina BIOS), 71 INLIN (rotina BIOS), 71 INSFLG (varivel de sistema), 86 a INTCNT (varivel de sistema), 86 a INTFLG (varivel de sistema), 86 a INTVAL (varivel de sistema), 86 a ioctl (chamada Uzix), 52 ipaccept (chamada Uzix), 55 ipclose (chamada Uzix), 55

ipconnect (chamada Uzix), 55 ipgetc (chamada Uzix), 55 ipgetpingreply (chamada Uzix), 55 iplisten (chamada Uzix), 55 ipputc (chamada Uzix), 55 ipread (chamada Uzix), 55 ipunlisten (chamada Uzix), 55 ipwrite (chamada Uzix), 55 JIFFY (varivel de sistema), 86 a JP (opcode), 17 JR (opcode), 17 KANAMD (varivel de sistema), 86 a KANAST (varivel de sistema), 86 a KBFMIN (varivel de sistema), 82 a KBUF (varivel de sistema), 82 a KeyboardStatus (rotina BDOS), 95 KEYBUF (varivel de sistema), 86 a KEYINT (rotina BIOS), 71 KILBUF (rotina BIOS), 72 kill (chamada Uzix), 52 LD (opcode), 18 LDD (opcode), 18 LDDR (opcode), 19 LDI (opcode), 19 LDIR (opcode), 19 LDIRMV (rotina BIOS), 72 LDIRVM (rotina BIOS), 72 LEFTC (rotina BIOS), 72 LEPROG (varivel de sistema), 85 a LFTQ (rotina BIOS), 72 link (chamada Uzix), 52 LINL32 (varivel de sistema), 81 a LINL40 (varivel de sistema), 81 a LINLEN (varivel de sistema), 81 a LINTTB (varivel de sistema), 85 a LINWRK (varivel de sistema), 86 a LOHADR (varivel de sistema), 85 a LOHCNT (varivel de sistema), 85 a LOHDIR (varivel de sistema), 85 a LOHMSK (varivel de sistema), 85 a LOW (varivel de sistema), 82 a LOWLIM (varivel de sistema), 86 a LPTOUT (rotina BIOS), 73 LPTPOS (varivel de sistema), 82 a LPTSTT (rotina BIOS), 73 lseek (chamada Uzix), 52 mdulos, 53 o MAPXYC (rotina BIOS), 73 MAXDEL (varivel de sistema), 84 a MAXFIL (varivel de sistema), 84 a MAXUPD (varivel de sistema), 81 a

130

MCLFLG (varivel de sistema), 85 a MCLLEN (varivel de sistema), 85 a MCLPTR (varivel de sistema), 85 a MegaRAM, 118 Memory Mapper, 120 MINDEL (varivel de sistema), 84 a MINUPD (varivel de sistema), 81 a mirror-eect, 118 mknod (chamada Uzix), 52 MLTATR (varivel de sistema), 81 a MLTCGP (varivel de sistema), 81 a MLTCOL (varivel de sistema), 81 a MLTNAM (varivel de sistema), 81 a MLTPAT (varivel de sistema), 81 a mod call (chamada Uzix), 52 mod dereg (chamada Uzix), 52 mod reg (chamada Uzix), 52 mod reply (chamada Uzix), 52 mod sendreply (chamada Uzix), 52 mount (chamada Uzix), 52 MOVCNT (varivel de sistema), 85 a MSX-DOS, 92 MUSICF (varivel de sistema), 85 a NAMBAS (varivel de sistema), 84 a NEG (opcode), 20 NEWKEY (varivel de sistema), 86 a NLONLY (varivel de sistema), 84 a NMI (rotina BIOS), 73 NOFUNS (varivel de sistema), 84 a NOP (opcode), 20 NSETCX (rotina BIOS), 73 NTMSXP (varivel de sistema), 82 a NULBUF (varivel de sistema), 84 a OLDKEY (varivel de sistema), 85 a OLDLIN (varivel de sistema), 83 a OLDSCR (varivel de sistema), 86 a OLDTXT (varivel de sistema), 83 a ONEFLG (varivel de sistema), 83 a ONELIN (varivel de sistema), 83 a ONGSBF (varivel de sistema), 85 a open (chamada Uzix), 52 OpenFile (rotina BDOS), 95 OR (opcode), 20 OTDR (opcode), 21 OTIR (opcode), 21 OUT (opcode), 21 OUTD (opcode), 22 OUTI (opcode), 22 PADX (varivel de sistema), 86 a PADY (varivel de sistema), 86 a PARM1 (varivel de sistema), 83 a PARM2 (varivel de sistema), 83 a

PATBAS (varivel de sistema), 84 a PATWRK (varivel de sistema), 86 a pause (chamada Uzix), 52 PDIREC (varivel de sistema), 85 a ping (chamada Uzix), 55 PINLIN (rotina BIOS), 74 pipe (chamada Uzix), 52 PLACNT (varivel de sistema), 85 a POP (opcode), 22 POSIT (rotina BIOS), 74 preemptiva, 47 PRMFLG (varivel de sistema), 83 a PRMLEN (varivel de sistema), 83 a PRMLN2 (varivel de sistema), 83 a PRMPRV (varivel de sistema), 83 a PRMSTK (varivel de sistema), 83 a PROCNM (varivel de sistema), 87 a PRSCNT (varivel de sistema), 85 a PRTFLG (varivel de sistema), 82 a PTRFIL (varivel de sistema), 84 a PTRFLG (varivel de sistema), 83 a PUSH (opcode), 23 PutChar (rotina BDOS), 93 PUTPNT (varivel de sistema), 82 a PUTQ (rotina BIOS), 74 PutString (rotina BDOS), 94 QINLIN (rotina BIOS), 74 quantum, 47 QUEBAK (varivel de sistema), 85 a QUETAB (varivel de sistema), 85 a QUEUEN (varivel de sistema), 85 a QUEUES (varivel de sistema), 82 a RAWPRT (varivel de sistema), 82 a RDL (opcode), 23 RDPSG (rotina BIOS), 74 RDSLT (rotina BIOS), 75 RDVDP (rotina BIOS), 75 RDVRM (rotina BIOS), 75 read (chamada Uzix), 52 ReadBlock (rotina BDOS), 96 READC (rotina BIOS), 75 ReadKey (rotina BDOS), 94 ReadNextRecord (rotina BDOS), 99 ReadRecord (rotina BDOS), 98 ReadRecords (rotina BDOS), 99 ReadSectors (rotina BDOS), 100 ReadSerial (rotina BDOS), 93 reboot (chamada Uzix), 52 RefreshDiskInfo (rotina BDOS), 95 RenameFiles (rotina BDOS), 97 REPCNT (varivel de sistema), 82 a reply, 53 requisiao, 53 c

131

RES (opcode), 23 RET (opcode), 23 RETI (opcode), 24 RETN (opcode), 24 RGnSAV (varivel de sistema), 81 a RIGHTC (rotina BIOS), 75 RL (opcode), 24 RLA (opcode), 25 RLC (opcode), 25 RLCA (opcode), 25 RLD (opcode), 26 RNDX (varivel de sistema), 84 a RR (opcode), 26 RRA (opcode), 26 RRC (opcode), 27 RRCA (opcode), 27 RRD (opcode), 27 RS2IQ (varivel de sistema), 85 a RSLREG (rotina BIOS), 76 RST (opcode), 28 RTPROG (varivel de sistema), 85 a RTYCNT (varivel de sistema), 86 a RUNBNF (varivel de sistema), 86 a SAVEND (varivel de sistema), 84 a SAVENT (varivel de sistema), 86 a SAVSP (varivel de sistema), 85 a SAVTXT (varivel de sistema), 83 a SAVVOL (varivel de sistema), 85 a SBC (opcode), 28 sbrk (chamada Uzix), 52 SCALXY (rotina BIOS), 76 SCF (opcode), 28 SCNCNT (varivel de sistema), 82 a SCRMOD (varivel de sistema), 86 a SET (opcode), 29 SETATR (rotina BIOS), 76 SetBuer (rotina BDOS), 98 SETC (rotina BIOS), 76 SetCurrentDrive (rotina BDOS), 95 SetDate (rotina BDOS), 100 setgid (chamada Uzix), 53 setprio (chamada Uzix), 53 SETRD (rotina BIOS), 76 setsocktimeout (chamada Uzix), 55 SetTime (rotina BDOS), 100 setuid (chamada Uzix), 53 SETWRT (rotina BIOS), 77 signal (chamada Uzix), 52 SKPCNT (varivel de sistema), 85 a SLA (opcode), 29 SLTATR (varivel de sistema), 86 a SLTTBL (varivel de sistema), 86 a SLTWRK (varivel de sistema), 87 a

SNSMAT (rotina BIOS), 77 SRA (opcode), 29 SRL (opcode), 29 stat (chamada Uzix), 52 STATFL (varivel de sistema), 81 a stime (chamada Uzix), 52 STKTOP (varivel de sistema), 82 a STMOTR (rotina BIOS), 77 STOREC (rotina BIOS), 77 STREND (varivel de sistema), 83 a STRTMS (rotina BIOS), 77 SUB (opcode), 30 SUBFLG (varivel de sistema), 83 a SWPTMP (varivel de sistema), 84 a symlink (chamada Uzix), 52 sync (chamada Uzix), 52 systrace (chamada Uzix), 53 T32ATR (varivel de sistema), 81 a T32CGP (varivel de sistema), 81 a T32COL (varivel de sistema), 81 a T32NAM (varivel de sistema), 81 a T32PAT (varivel de sistema), 81 a TAPIN (rotina BIOS), 78 TAPIOF (rotina BIOS), 78 TAPION (rotina BIOS), 78 TAPOOF (rotina BIOS), 78 TAPOON (rotina BIOS), 78 TAPOUT (rotina BIOS), 79 TCP/IP, 55 TDOWNC (rotina BIOS), 79 TEMP (varivel de sistema), 83 a TEMP2 (varivel de sistema), 83 a TEMP3 (varivel de sistema), 83 a TEMP8 (varivel de sistema), 83 a TEMP9 (varivel de sistema), 84 a TEMPPT (varivel de sistema), 83 a TEMPST (varivel de sistema), 83 a time (chamada Uzix), 52 times (chamada Uzix), 52 TOTEXT (rotina BIOS), 79 TRCFLG (varivel de sistema), 84 a TRGFLG (varivel de sistema), 81 a TRPTBL (varivel de sistema), 86 a TTYPOS (varivel de sistema), 82 a TUPC (rotina BIOS), 79 TXTATR (varivel de sistema), 81 a TXTCGP (varivel de sistema), 81 a TXTCOL (varivel de sistema), 81 a TXTNAM (varivel de sistema), 81 a TXTPAT (varivel de sistema), 81 a TXTTAB (varivel de sistema), 82 a umask (chamada Uzix), 53 umount (chamada Uzix), 52

132

unlink (chamada Uzix), 52 UPC (rotina BIOS), 79 UpdateFile (rotina BDOS), 96 USRTAB (varivel de sistema), 81 a utime (chamada Uzix), 52 VALTYP (varivel de sistema), 82 a VARTAB (varivel de sistema), 83 a VCBA (varivel de sistema), 85 a VCBB (varivel de sistema), 85 a VCBC (varivel de sistema), 85 a VLZADR (varivel de sistema), 82 a VLZDAT (varivel de sistema), 82 a VOICAQ (varivel de sistema), 85 a VOICBQ (varivel de sistema), 85 a VOICCQ (varivel de sistema), 85 a VOICEN (varivel de sistema), 85 a WaitKey (rotina BDOS), 94 waitpid (chamada Uzix), 52 WINWID (varivel de sistema), 86 a write (chamada Uzix), 52 WriteBlock (rotina BDOS), 97 WritePrinter (rotina BDOS), 93 WriteRecord (rotina BDOS), 98 WriteRecords (rotina BDOS), 99 WriteSectors (rotina BDOS), 100 WriteSerial (rotina BDOS), 93 WRSLT (rotina BIOS), 80 WRTPSG (rotina BIOS), 80 WRTVDP (rotina BIOS), 80 WRTVRM (rotina BIOS), 80 WSLREG (rotina BIOS), 80 XOR (opcode), 30

133

S-ar putea să vă placă și