Fudeba Assembler

Embed Size (px)

Citation preview

Fudeba AssemblerManual e Referncia da Arquitetura MSX e

Felipe [email protected] 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

1

2

Sumrio aIntroduo 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 . . . .

4

Introduo caO 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

AgradecimentosAgradeo 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

1

Cap tulo 1

Arquivos de Entrada e Uso do Fudeba AssemblerPrograma ExemploOs 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

5

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 LimitesCada 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

a

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 uNomes 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 .

5

Cap tulo 2

Instrues Z80 coNeste 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: caS Z HC P/O N

7

?6

5

14

3

p 0 2 1 0

C

6

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

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

ADC dest, src

7

6

5

4

3

o 02 1

0

7

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

ADD dest, src

7

6

5

4

3

o 02 1

0

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

- 7 6 5 4 3

o 02 1

0

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

AND src

7

6

5

14

3

p 0 02 1 0

C

BITZF 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

6

5

14

3

? 0 2 1 0

8

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

CALL [cond ,] dest

- 7 6 5

4 3

- - 2 1 0

CCFComplementa (inverte) o carry ag (CF). O carry anterior copiado no ag HC. e CF CF CCFS Z HC P/O N C

CCF

- 7 6 5 4 3

- 02 1

0

CPCompara 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

7

6

5

4

3

o 12 1

0

9

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

CPD

7

6

5

4

3

2

1 1 0

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

CPDR

7

6

5

4

3

2

1 1 0

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

CPI

7

6

5

4

3

2

1 1 0

10

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

CPIR

7

6

5

4

3

2

1 1 0

CPLComplementa o acumulador. %A %A CPLS Z HC P/O N C

CPL

- 7 6 5

14

3

- 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 DAAS Z HC P/O N

p 2 1

C

7

6

5

4

3

0

11

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

DEC dest

7

6

5

4

3

o 1 2 1 0

DEC reg16/%IX /%IY /%SPS Z HC P/O N C

- 7 6 5

4 3

- - 2 1 0

DIDesabilita interrupoes. c DIS Z HC P/O N C

DI

- 7 6 5

4 3

- - 2 1 0

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

DJNZ dest

- 7 6 5

4 3

- - 2 1 0

12

EIHabilita interrupes. co EIS Z HC P/O N C

EI

- 7 6 5

4 3

- - 2 1 0

EX

EX dest, srcTroca 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 /%IYS Z HC P/O N C

- 7 6 5

4 3

- - 2 1 0

EX %AFS Z HC P/O N C

7

6

5

4

3

2

1

0

13

EXXTroca 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 EXXS Z HC P/O N C %D

EXX,%E

,

%H

,

%L

com seus registradores-

- 7 6 5

4 3

- - 2 1 0

HALTPra o processamento do Z80. a HALTS Z HC P/O N C

HALT;-)

- 7 6 5

4 3

- - 2 1 0

IM

IM nMuda 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 imm8S Z HC P/O N C

- 7 6 5

4 3

- - 2 1 0

14

INL um byte na porta de I/O src para dest. e dest IO(src) IN %A , imm8S 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

7

6

5

04

3

p 0 2 1 0

C

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

INC dest

7

6

5

4

3

o 0 2 1 0

INC reg16/%IX /%IY /%SPS Z HC P/O N C

- 7 6 5

4 3

- - 2 1 0

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

IND

?7

6

5

?4

3

? 1 2 1 0

15

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

INDR

? 17 6

5

?4

3

? 1 2 1 0

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

INI

?7

6

5

?4

3

? 1 2 1 0

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

INIR

? 17 6

5

?4

3

? 1 2 1 0

16

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

JP [cond,] destTransfere 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,] destTransfere 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, relatenderS Z HC P/O N C

- 7 6 5

4 3

- - 2 1 0

17

LDTransfere src para dest. dest src LD LD LD LD LD LD LD LD LD LD LDS

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 , %AZ HC P/O N C

- 7 6 5

4 3

- - 2 1 0

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

7

6

5

04

3

2

0 1 0

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

LDD

- 7 6 5

04

3

2

0 1 0

18

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

LDDR

- 7 6 5

04

3

0 0 2 1 0

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

LDI

- 7 6 5

04

3

2

0 1 0

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

LDIR

- 7 6 5

04

3

0 0 2 1 0

19

NEGInverte o sinal do acumulador. %A %A NEGS Z HC P/O N C

NEG

7

6

5

4

3

o 12 1

0

NOPNo faz nada. a NOPS Z HC P/O N C

NOP

- 7 6 5

4 3

- - 2 1 0

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

OR src

7

6

5

14

3

p 0 02 1 0

C

20

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

OTDR

? 17 6

5

?4

3

? 1 2 1 0

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

OTIR

? 17 6

5

?4

3

? 1 2 1 0

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

OUT dest, src

- 7 6 5

4 3

- - 2 1 0

21

OUTDEscreve (%HL ) na porta (%C ), decrementa %HL , decrementa %B . IO((%C)) (%HL) %HL %HL 1 %B %B 1 OUTDS Z HC P/O N C

OUTD

?7

6

5

?4

3

? 1 2 1 0

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

OUTI

?7

6

5

?4

3

? 1 2 1 0

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

POP dest

- 7 6 5

4 3

- - 2 1 0

22

PUSHEmpilha src. %SP %SP 2 (%SP ) src PUSH reg16/%AF /%IX /%IYS Z HC P/O N C

PUSH src

- 7 6 5

4 3

- - 2 1 0

RDLSinnimo para RLD. o

RDL

RESReseta 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

RETRetorna de sub-rotina. P C (%SP ) %SP %SP + 2 RET RET condS 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 RETIS Z HC P/O N C

- 7 6 5

4 3

- - 2 1 0

RETNP C (%SP ) %SP %SP + 2 RETNS 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

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

RL dest

7

6

5

04

3

p 02 1

0

24

RLARL sobre o acumulador. Veja Figura 2.1 RLAS Z HC P/O N C

RLA

- 7 6 5

04

3

- 02 1

0

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

RLC dest

7

6

5

04

3

p 02 1

0

RLCARLC sobre o acumulador. Veja Figura 2.1 RLCAS Z HC P/O N C

RLCA

- 7 6 5

04

3

- 02 1

0

25

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

RLD

7

6

5

04

3

p 0 2 1 0

C

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

RR dest

7

6

5

04

3

p 02 1

0

RRARR sobre o acumulador. Veja Figura 2.1 RRAS Z HC P/O N C

RRA

- 7 6 5

04

3

- 02 1

0

26

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

RRC dest

7

6

5

04

3

p 02 1

0

RRCARRC sobre o acumulador. Veja Figura 2.1 RRCAS Z HC P/O N C

RRCA

- 7 6 5

04

3

- 02 1

0

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

RRD

7

6

5

04

3

p 0 2 1 0

C

27

RSTChama 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/$38S Z HC P/O N C

RST dest

- 7 6 5

4 3

- - 2 1 0

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

SBC dest, src

7

6

5

4

3

o 12 1

0

SCFSeta o carry ag (CF). CF 1 SCFS Z HC P/O N C

SCF

- 7 6 5

04

3

- 0 12 1 0

28

SETSeta 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

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

SLA dest

7

6

5

04

3

p 02 1

0

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

SRA dest

7

6

5

04

3

p 02 1

0

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

SRL dest

07

6

5

04

3

p 02 1

0

29

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

SUB dest, src

7

6

5

4

3

o 12 1

0

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

XOR src

7

6

5

14

3

p 0 02 1 0

C

30

RLCF dest

RRCF dest

RLCCF dest

RRCdest CF

SLACF dest

0

SRAdest CF

SRL

0dest 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 FNOP 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

1LD 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

2LD (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

3INC 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

4INC 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

5DEC 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

6LD 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

7RLCA 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 FEX 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

9ADD 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

ALD 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

BDEC 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

CINC 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

DDEC 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

ELD 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

FRRCA 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 FRLC 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

1RLC 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

2RLC 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

3RLC 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

4RLC 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

5RLC 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

6RLC (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)

7RLC 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 FRRC 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

9RRC 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

ARRC 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

BRRC 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

CRRC 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

DRRC 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

ERRC (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)

FRRC 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 ED0 4 5 6 7 A BIN b,(c) IN d,(c) IN h,(c) LDI LDIR

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

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

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

4NEG

5RETN

6IM 0 IM 1

7LD i,a LD a,i RRD

Tabela 2.6: Opcodes do grupo ED, LSN 0-7 8 4 5 6 7 A BIN c,(c) IN e,(c) IN l,(c) IN a,(c) LDD LDDR

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

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

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

C

DRETI

EIM 2

FLD 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 1LD ix, qqtt LD (ix+tt),b LD (ix+tt),c POP ix

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

3INC ix

4INC (ix+tt)

5DEC (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 9ADD 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

A

B

E

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

DiretivasO 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

.alignSintaxe: .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

.appendSintaxe: .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

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

.da label

.dbSintaxe: .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

.deneSintaxe: .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

5

.dsSintaxe: .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

.dwSintaxe: .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

.dzSintaxe: .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.

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

.empty imm16

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

.endm

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

.endr

.forgetSintaxe: .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

5

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

.headerSintaxe: .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

.includeSintaxe: .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

.originSintaxe: .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

.macroSintaxe: .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

5

.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 .endm15

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

.repeatSintaxe: .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

5

10

.xSintaxe: .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 UzixUzix 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 a1 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 $0100tamanho 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 o1

.header uzix .include uzix.stub5

_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. a1

.define e_flags

$103 49

5

.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 jr55

%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 callsProcesso (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. aProcesso (cliente)

system calls

mod_call(A,...)

UZIX (kernel)Mdulo A

mod_reply(A,...) fila de respostas

A.callback(...)

callbackmod_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: a1

// numeros de ICMP_PROTOCOL TCP_PROTOCOL UDP_PROTOCOL

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

5

// modos de abertura TCP_ACTIVE_OPEN = 255 TCP_PASSIVE_OPEN = 010

// 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. o1

5

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-BIOS5.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.23 3

Listagem Alfabtica Descritiva eParmetros 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

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

$00C0

61

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

$00B7

CALATR3 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.

CALBAS3 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

CALPAT3 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.

7

6

5

4

3

2

1

0

SF

0

0

0

SUBSLOT

SLOT

1 se subslot estiver indicado (slot expandido)

Figura 5.1: Slot ID.

CALSLTChama 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

CHGCAP3 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

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

$0062

CHGET3 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.

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

$005F

CHGSNDAltera 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.

CHPUTEscreve 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.

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

$0069

65

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

$00C3

DCOMPRComparao 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.

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

$0041

DOWNC3 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

DSPFNK3 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

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

$0044

ENASLT3 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.

ERAFNK3 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

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

$0114

FILVRMPrenche 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.

GRPPRT3 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.

GSPSIZ3 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.

GTSTCKL 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

GTTRIGVerica 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

INIFNK3 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).

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

$0072

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

$0075

INIT32Coloca 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.

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

$006C

INLINRecebe 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

KILBUF3 3 Nenhum. Nenhum. HL.

$0156

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

LDIRMVCopia 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

LDIRVMCopia 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.

LEFTC3 3 .

$00FF

Modica as variveis de sistema CLOC e CMASK para apontar para o pixel ` esquerda do a a pixel atual. So produzidos endereos incorre