sexta-feira, 18 de janeiro de 2008
Recepção RS-232 na porta de Joystick
O Sinal RTS serve para indicar ao dispositivo de recepção, que o dispositivo de transmissão quer enviar dados. Já o sinal CTS diz é a resposta que o dispositivo de recepção dá ao dispositivo de transmissão de que já pode receber os dados.
Pois bem, utilizando estes sinais é possível sincronizar o MSX com o PC criando assim uma rotina de recepção mais inteligente, de forma a sinalizar ao PC quando este deve aguardar antes de enviar os dados. Desta maneira pode-se perder um tempo salvando o caractere, ou mesmo movendo um buffer.
É possível, por exemplo redirecionar a entrada (de teclado) para ler a partir da RS232 (como no apple) utilizando o hook da interrupção externa do Z80, gerada pelo VDP, que ocorre a 60Hz. O funcionamento é o seguinte:
Quando o VDP gera uma interrupção, a BIOS chama o Hook HTIMI no endereço 0FD9Fh. Neste momento pode-se checar a entrada de joystick para ver se o PC ativou o sinal RTS. Se o sinal RTS não estiver ativo, então não há caracteres a serem enviados e a rotina termina, devolvendo o controle à BIOS.
Mas se o sinal RTS estiver ativo, as interrupções são desabilitadas, e a rotina de recepção de um caractere é chamada. Esta rotina ativa o sinal CTS para indicar ao PC que o MSX está pronto para receber os dados.
O MSX então aguarda pelo start bit, e em seguida recebe os 8 bits do dado, e o stop bit. Depois ela desativa novamente o sinal CTS e vai processar o caractere recebido.
O Stop bit é checado para garantir que é válido. Se for inválido (“0”), então o caractere recebido é ignorado, caso contrário, ele é colocado no buffer do teclado, que é incrementado. Se o buffer estiver cheio, então a rotina termina. Se não estiver, o MSX checa se o sinal RTS ainda está ativo, e se estiver, ele recebe o próximo caractere, caso contrário, retorna
segunda-feira, 14 de janeiro de 2008
Conversor TTL-232 testado
LPRINT na porta de Joystick - Código em BASIC
O programa ocupa apenas 83 na memória e é carregado a partir do endereço &HE000
A listagem abaixo foi capturada utilizando o lprint para o PC, após o programa ter sido executado:
5 '
10 ' Imprime na porta de Joystick B
20 ' via protocolo rs-232, 9600,N,8,1
30 '
40 ' danjovic@hotmail.com
50 '
60 FOR E=0 TO 82
70 READ B$:POKE &HE000+E,VAL("&H"+B$)
80 NEXT E
90 '
100 DEFUSR=&HE047: B=USR(0)
110 '
200 DATA F3,F5,C5,E5,4F,26,12,3E
210 DATA 0F,D3,A0,DB,A2,CB,F7,D3
220 DATA A1,CD,1C,E0,E1,C1,F1,A7
230 DATA FB,33,33,C9,6C,CD,34,E0
240 DATA 06,08,6C,CB,09,DC,3D,E0
250 DATA D4,34,E0,10,F5,2E,12,CD
260 DATA 3D,E0,47,C9,CB,97,D3,A1
270 DATA 2D,C2,38,E0,C9,CB,D7,D3
280 DATA A1,2D,C2,41,E0,C9,00,21
290 DATA 00,E0,22,B7,FF,3E,C3,32
300 DATA B6,FF,C9
domingo, 13 de janeiro de 2008
Conversor TTL-RS232

Fiz o "layout" de uma placa de circuito impresso em face simples, de forma que ficasse o menor possível. Segue abaixo uma imagem em 300 dpi

E a disposiçao dos componentes na placa fica como a figura abaixo:

Os dois conectores são do tipo para cabo (solda) mas são soldados diretamente na placa, um virado para cima e outro virado para baixo. Assim só foi necessário um Jumper para ligar o pino 5 do conector de joystick do MSX (Vcc) ao circuito.
LPRINT na porta de Joystick
;
; Impressao serial via
; porta de Joystick do MSX
;
; danjovic@hotmail.com
; http://hotbit.blogspot.com
;
; Versao 1.0 14/01/2008
;
; Licenca de uso: GNU GPL
;
;
; Compilado no ASMSX
; http://www.robsy.net/asmsx.htm
ORG 0E000H
.BASIC
.START INSTALA
; Bits do Registro 15 do PSG
BTXD EQU 2
ABSEL EQU 6
; Registros do PSG
PSGAD EQU 0A0H
PSGWR EQU 0A1H
PSGRD EQU 0A2H
; BaudRates
;BAUD EQU 6 ; 19200 Bauds, (6)
;BAUD EQU 10 ; 14400 Bauds, (10)
BAUD EQU 18 ; 9600 Bauds, (17-19)
;BAUD EQU 42 ; 4800 Bauds, (41-43)
;BAUD EQU 92 ; 2400 Bauds, (90-93)
;BAUD EQU 190 ; 1200 Bauds, (188-191)
;
; Envia o Caractere no reg A
; para a porta de B (Joystick)
; 9600,8,n,1
PRNTJ232:
;CALL 0a2h
DI
PUSH AF
PUSH BC
PUSH HL
LD C,A ; Caractere a ser impresso
LD H,BAUD ; define taxa Baud
LD A,15 ; Registro 15
OUT [PSGAD],A
IN A,[PSGRD]
;LD [PSGSAV],A
SET ABSEL,A ; Porta Joystick B
OUT [PSGWR],A
;LD B,A ; salva conteudo reg 15
CALL SND232
;LD A,[PSGSAV]
;OUT [PSGWR],A
POP HL
POP BC
POP AF
AND A
EI
INC SP ; descarta stack
INC SP
RET
SND232:
; Entradas:
; C: Byte a ser transmitido
; A: Estado atual do registrador 15 do PSG
; H: Constante para Baud Rate
;
;
; Envia Start bit (txd=0)
;
LD L,H ; 4+1
CALL SND0 ; 17+1 + (SEND0)
;
; 8 bits do dado, LSbit primeiro
;
LD B,08H ; 7+1
S20:
LD L,H ; 4+1
RRC C ; 8+2
CALL C,SND1 ; 17+1 + (SEND0)/ 10+1 F
CALL NC,SND0 ; 17+1 + (SEND0)/ 10+1 F
DJNZ S20 ; 13+1 b
;
; Stopbit - retorna linha txd para IDLE
;
LD L,BAUD ; 8
CALL SND1 ; 17+1 + (SEND1)
LD B,A ; 4+1
RET ; 10+1
;
; Envia um bit 0
;
SND0:
RES BTXD,A ; txd=0 8+2
OUT [PSGWR],A ; 11+1
S01: DEC L ; 4+1
JP NZ,S01 ; 10+1 ;
RET ; 10+1
;
; Envia um bit 1
;
SND1:
SET BTXD,A ; txd=1 8+2
OUT [PSGWR],A ; 11+1
S11: DEC L ; 4+1
JP NZ,S11 ; 10+1 ;
RET ; 10+1
PSGSAV:
DS 1
;
; Instala subrotina no
; HOOK da impressora
;
; Do livro +50 dicas para o MSX
;
HLPT EQU 0FFB6H
;
INSTALA:
LD HL,PRNTJ232
LD [HLPT+1],HL
LD A,0C3H
LD [HLPT],A
RET
sábado, 12 de janeiro de 2008
Serial Bitbang a 19200 bauds na porta de Joystick
19200 Bauds, (6)
14400 Bauds, (10)
9600 Bauds, (17-19)
4800 Bauds, (41-43)
2400 Bauds, (90-93)
1200 Bauds, (188-191)
Toda a temporização é feita por software. Os números em parênteses são o parâmetro de temporização. As velocidades de 14400 e 19200 são meio críticas, mas funcionam bem.
A conexão com o PC é através do pino 6 da porta de Joystick B. Eu utilizei um MAX232, alimentado pelo pino 5 (Vcc), mas há outras alternativas[1], [2], embora eu ainda não as tenha testado.
O código fonte encontra-se abaixo.
;
; Rotinas de impressão na porta
; de Joystick do MSX
;
; danjovic@hotmail.com
; http://hotbit.blogspot.com
;
; Versao 0.5 12/01/2008
;
; Licenca de uso: GNU GPL
;
;
ORG 09000H
; Compilado no ASMSX
; http://www.robsy.net/asmsx.htm
.BASIC
.START PRNTJ232
;
; Bits do Registro 15 do PSG
;
BTXD EQU 2
BPLS EQU 5
ABSEL EQU 6
;
; Registros do PSG
;
PSGAD EQU 0A0H
PSGWR EQU 0A1H
PSGRD EQU 0A2H
;
; Constantes
; BaudRates
;BAUD EQU 6 ; 19200 Bauds, (6)
;BAUD EQU 10 ; 14400 Bauds, (10)
BAUD EQU 18 ; 9600 Bauds, (17-19)
;BAUD EQU 42 ; 4800 Bauds, (41-43)
;BAUD EQU 92 ; 2400 Bauds, (90-93)
;BAUD EQU 190 ; 1200 Bauds, (188-191)
;
; Rotina de teste de impressão
; na porta de Joystick
;
PRNTJ232:
DI
LD A,15
OUT [PSGAD],A
IN A,[PSGRD]
LD [PSGSAV],A
SET ABSEL,A ; JOY B
SET BTXD,A ; SDA=1
SYNC:
SET BPLS,A ; start sync
OUT [PSGWR],A
NOP
NOP
NOP
NOP
RES BPLS,A ; stop sync
OUT [PSGWR],A
LD B,A ; B=conteudo reg 15
MUDABAUD:
LD H,BAUD
LD DE,MENSAGEM
REPETE:
LD A,[DE]
INC DE
OR A
JR Z,FIM
LD C,A
CALL SND232
JR REPETE
FIM:
EI
RET
MENSAGEM:
DB "THE QUICK BROWN FOX JUMPS OVER THE LAZY DOG 0123456789 ",0
PSGSAV:
DS 1
SND232:
; Entradas:
; C: Byte a ser transmitido
; B: Estado atual do registrador 15 do PSG
; H: Constante para Baud Rate
;
; Modifica A,F,B,C,L
LD A,B ; B=Estado registro 15 PSG
;
; Start bit (txd=0)
;
LD L,H ; 4+1
CALL SND0 ; 17+1 + (SEND0)
;
; 8 bits do dado, LSbit primeiro
;
LD B,08H ; 7+1
S20:
LD L,H ; 4+1
RRC C ; 8+2
CALL C,SND1 ; 17+1 + (SEND0)/ 10+1 F
CALL NC,SND0 ; 17+1 + (SEND0)/ 10+1 F
DJNZ S20 ; 13+1 b<>0/ 8+1 b=0
;
; Stopbit - retorna linha txd para IDLE
;
LD L,BAUD ; 8
CALL SND1 ; 17+1 + (SEND1)
LD B,A ; 4+1
RET ; 10+1
;
; Envia um bit 0
;
SND0:
RES BTXD,A ; txd=0 8+2
OUT [PSGWR],A ; 11+1
S01: DEC L ; 4+1
JP NZ,S01 ; 10+1 ;
RET ; 10+1
;
; Envia um bit 1
;
SND1:
SET BTXD,A ; txd=1 8+2
OUT [PSGWR],A ; 11+1
S11: DEC L ; 4+1
JP NZ,S11 ; 10+1 ;
RET ; 10+1
domingo, 9 de dezembro de 2007
Adaptador CF Interno

A interface IDE-CF pode ser alimentada pelo pino 20 a partir dos 5Vcc do micro.
O sinal Y7 é o /CS (Chip Select) na faixa de endereços 0B8h~0BFh, disponível no pino 7 de IC5 (74LS138) no HotBit (mesmo pino de IC29 no Expert).
Uma observação importante é que esta faixa de endereços é reservada para a "light pen" da SANYO, e para controle do "VHD".
sexta-feira, 16 de novembro de 2007
Pseudo DMA para o VDP
O princípio de funcionamento consiste na manipulação dos sinais de escrita e de leitura, tanto do periférico quanto do VDP de tal forma que quando o Z80 lê um determinado endereço, o sinal de decodificação aciona tanto o sinal de leitura do periférico quando o sinal de escrita do VDP, e vice-versa para uma transferência VDP->periférico. Em ambos os casos, é utilizada a instrução de leitura do Z80, de forma que não há a necessidade de resistores de isolação de barramento, como no exemplo com o AVR. Contudo,m é importante que tal como o VDP, o periférico também possa realizar transferência em modo "burst", como é o caso de um cartão SD/MMC.


A velocidade de transferência é igual à velocidade de acesso à memória ou de acesso de I/O do Z80, ou seja, praticamente a mesma velocidade que se obteria com um acesso direto à VRAM.
Uma estimativa desta velocidade, para uma transferência de 16K, com um clock de 3,579MHz é:
LD B,0
TRANSF:
IN A,(P_DMA) (64x) 12 x 64
DJNZ TRANSF 14 / 9
Ao todo são 256 * ( (12*64) +14 ) - 5 = 200187 ciclos.
Num Z80 a 3,579MHz, isso significa 55,933ms
Então temos uma taxa de pico de aproximadamente 16K/55,933ms = 286,05Kbytes/segundo.
quarta-feira, 14 de novembro de 2007
SPI na porta de Joystick
Este barramento constitui-se dos seguintes sinais
MOSI - Master Out, Slave In, ou seja (Saída, do ponto de vista do MASTER)
MISO - Master IN, Slave Out (Entrada)
SCLK - Serial Clock (Saída)
SS - Slave Select
Um inconveniente do SPI é a necessidade de se utilizar um sinal SS para cada periférico conectado. Principalmente porque na porta de Joystick do MSX temos apenas 3 pinos de saída, ou seja, apenas um pino disponível para Chip Select.
A solução foi utilizar esta saída livre para realizar ao mesmo tempo o 'reset' e o 'clock' de um contador. Para distinguir um evento do outro, foi utilizada uma rede RC, de forma que um pulso mais longo provoque o 'reset' do contador, e um pulso mais curto provoque uma contagem.
Na implementação para o MSX, o pino escolhido para RESET/COUNT foi o pino 8 (pulse), que fica normalmente em 0 (zero). Para prevenir que uma contagem aconteça durante um pulso de leitura de 'paddle', uma segunda constante RC foi adicionada.
O diagrama de blocos encontra-se na figura abaixo:

E o código de seleção de dispositivo pode ser visto abaixo.
;
; Seleciona dispositivo SPI
; Entrada:
; D: número do device SPI
; Saida:
; B: estado registro 15 do psg
; Modifica:
; A, D, DI,
SELDEV:
; seleciona e salva registro e 15 do PSG
CALL SAVEPSG
; saída PULS (p 8) nível 1 por 1ms
SET SHFT,A ; PULSE 1
RES ABSEL,A ; JOY 1
OUT [PSGWR],A
CALL WAIT1MS
RES SHFT,A
OUT [PSGWR],A
; gera D pulsos
; cada pulso tem 100us de largura
; para o circuito não se confundir
; com pulso de leitura de paddle
SLDV0:
CALL WAIT100US
SET SHFT,A
OUT [PSGWR],A
CALL WAIT100US
RES SHFT,A
OUT [PSGWR],A
DEC D
JR NZ,SLDV0
; salva valor reg 15 psg
LD B,A
EI
RET
sexta-feira, 9 de novembro de 2007
Enviando dados via RS232 na porta de Joystick
No MSX deve-se levar em consideração não somente os ciclos de máquina gastos com cada instrução, mas também o WAIT STATE inserido a cada ciclo M1.
O Ciclo M1 é gerado durante a busca de instruções do Z80 ("opcode fetch"), mas há algumas instruções onde esse ciclo ocorre mais de uma vez, ou seja, é necessário somar um ciclo a mais para cada ciclo M1 gerado.
Um exemplo é a instrução NEG:
Esta instrução gasta ao todo 10 ciclos de máquina para ser executada no MSX.
INSTR BYTES M1
NEG 2 OCF(4)/OCF(4)
Uma relação completa das instruções do Z80, bem como da quantidade de ciclos por instrução, e a quantidade de ciclos M1 pode ser encontrada neste link: http://www.z80.info/z80ins.txt
A rotina abaixo envia um byte recebido no registrador A pelo pino 6 da porta B de joystick.
;
; Bits do Registro 15 do PSG
;
BTXD EQU 2
ABSEL EQU 6
;
; Registros do PSG
;
PSGAD EQU 0A0H
PSGWR EQU 0A1H
PSGRD EQU 0A2H
;
; Constantes
; BaudRates
;BAUD EQU 8 ; 19200 Bauds, -0.32% erro
;BAUD EQU 14 ; 14400 Bauds, -1.8% erro
BAUD EQU 25 ; 9600 Bauds, -0.32% erro
;BAUD EQU 59 ; 4800 Bauds, -0.32% erro
;BAUD EQU 127; 2400 Bauds, -0.32% erro
;BAUD EQU 255 ;1200 Bauds, 2.6% erro
;
; A: Byte a ser transmitido
; B: Estado atual do registrador 15 do PSG
;
SND232:
LD C,A
LD A,B
; Start bit
LD L,BAUD
CALL SND0 ; 17+1 + (SEND0)
; 8 bits
LD B,08H ; 7+1
LD L,BAUD ; 8
S20:
RRC C ; 8+2
CALL C,SND1 ; 17+1 + (SEND0)/ 10+1 F
CALL NC,SND0 ; 17+1 + (SEND0)/ 10+1 F
DJNZ S20 ; 13+1 b<>0/ 8+1 b=0
; Stopbit - return line to IDLE state
LD L,BAUD ; 8
CALL SND1 ; 17+1 + (SEND0)
LD B,A ; 4+1
RET ; 10+1
SND0:
RES BTXD,A ; txd=0 8+2
OUT [PSGWR],A ; 11+1
S01: DEC L ; 4+1
JP NZ,S01 ; 10+1 ;
RET ; 10+1
SND1:
SET BTXD,A ; txd=1 8+2
OUT [PSGWR],A ; 11+1
S01: DEC L ; 4+1
JP NZ,S01 ; 10+1 ;
RET ; 10+1
E Antes de imprimir, é necessário desabilitar as interrupções e inicializar o registro 15:
PRNTJ232:
DI
LD A,15
OUT [PSGAD],A
IN A,[PSGRD]
LD [PSGSAV],A
SET ABSEL,A ; JOY B
SET BTXD,A ; SDA=1
OUT [PSGWR],A
LD B,A
domingo, 28 de outubro de 2007
Paddle do NES no Arkanoid do MSX? (update)
O pino 6 é utilizado como sinal de clock, o pino 8 como sinal de select/LOAD e os dados vêm pelo sinal UP do joystick.
O trecho de código abaixo ilustra o protocolo.
... 42fc 3e0e ld a,0eh 42fe d3a0 out (0a0h),a 4300 dba2 in a,(0a2h) 4302 67 ld h,a 4303 0608 ld b,08h ; 8 bits 4305 0e00 ld c,00h 4307 1e00 ld e,00h 4309 3e0f ld a,0fh 430b d3a0 out (0a0h),a 430d 3e1e ld a,1eh 430f d3a1 out (0a1h),a ; clock low 4311 3e1f ld a,1fh 4313 d3a1 out (0a1h),a ; clock high 4315 3e0e ld a,0eh 4317 d3a0 out (0a0h),a 4319 dba2 in a,(0a2h) 431b 5f ld e,a 431c cb3f srl a ; lê bit 431e cb11 rl c ; armazena em C 4320 10e7 djnz 4309h ; próximo bit 4322 79 ld a,c 4323 32c1e0 ld (0e0c1h),a ; armazena byte recebido 4326 7c ld a,h 4327 e601 and 01h 4329 32c2e0 ld (0e0c2h),a 432c 3e0f ld a,0fh 432e d3a0 out (0a0h),a 4330 3e1f ld a,1fh 4332 d3a1 out (0a1h),a ; pino8 high 4334 3e0f ld a,0fh 4336 d3a1 out (0a1h),a ; pino8 low 4338 3e1f ld a,1fh 433a d3a1 out (0a1h),a ; pino8 high 433c 3e0e ld a,0eh 433e d3a0 out (0a0h),a 4340 dba2 in a,(0a2h) 4342 5f ld e,a 4343 21c4e0 ld hl,0e0c4h 4346 7e ld a,(hl) 4347 73 ld (hl),e 4348 e60f and 0fh 434a a3 and e 434b ab xor e 434c 32c5e0 ld (0e0c5h),a 434f 47 ld b,a 4350 3a0be0 ld a,(0e00bh) 4353 b7 or a 4354 c0 ret nz 4355 cb48 bit 1,b 4357 c8 ret z 4358 3a0ae0 ld a,(0e00ah) 435b b7 or a 435c ca7043 jp z,4370h 435f af xor a 4360 320ae0 ld (0e00ah),a 4363 213ce5 ld hl,0e53ch 4366 113de5 ld de,0e53dh 4369 3600 ld (hl),00h 436b 010700 ld bc,0007h 436e edb0 ldir 4370 3e01 ld a,01h 4372 320ce0 ld (0e00ch),a 4375 c9 ret ...
quarta-feira, 3 de outubro de 2007
Copy 3
Este copiador foi o primeiro programa "sério" que fiz para o MSX em Assembly. Um detalhe interssante é que os caracteres em fundo inverso eram simulados com caracteres redefinidos.
Seguem abaixo 2 screenshots, rodando no BlueMSX:


domingo, 23 de setembro de 2007
Sistema de arquivos TIC-TAC
O sistema de arquivos TIC-TAC foi concebido para utilização com pequenas unidades de armazenamentos de memória, com capacidade de até 128Kbytes. Apesar de ter sido projetado inicialmente para os "picodrives" conectados via interface I2C no MSX, outros dispositivos de memoria podem ser utilizados, bem como outros processadores ou microcontroladores.
O nome TIC-TAC vem de:
TIC Tabela identificação de caracteres
TAC Tabela de alocação de cadeias
Estas tabelas são utilizadas para organizar o armazenamento dos arquivos de forma semelhante a uma FAT. Devido à limitação de espaço, o número máximo de arquivos que podem ser armazenados é de 64. Dessa forma os arquivos podem ter nome com 8 caracteres de comprimento e um byte de atributos.
A TIC ocupa os primeiros 768 bytes da memória serial. Compõe-se de um cabeçalho com 64 bytes de cabeçalho, e de 64 entradas de arquivos (com 11 bytes). A estrututa da TIC encontra-se na tabela abaixo:
Cabeçalho:
Bytes Função/descrição
02 Assinatura - "ST"
10 Nome do dispositivo (volume)
01 Bit 7: Flag de Boot
Bits 5..0: Entrada da TIC (bits 5..0) do programa de boot.
01 Tamanho em setores) do dispositivo (Máximo 128K)
01 Tamanho da página de escrita da Flash
49 Vazio. Reserva para expansões
-----
64 Total de bytes do cabeçalho da TIC
Entradas:
08 Nome do arquivo
01 Atributos
Bit 7: Indica uma entrada apagada
Bit 6: Indica proteção contra escrita/apagamento
Bits 1..0: Tipo de arquivo
00 - Basic
01 - Binário
10 - Dados
11 - Tela
01 Tamanho do arquivo (quantidade de entradas na TAC)
01 Ponto de entrada na TAC
------
11 x 64 = 704 bytes
Total 64+704=768 bytes
Para calcular a quantidade de setores ocupados por um arquivo, a seguinte fórmula é utilizada:
QUANT = 1 + [ ( TAMARQ - 1) DIV 512 ] , onde TAMARQ é o tamanho em bytes do arquivo.
Já a TAC ocupa 256 bytes e corresponde a um mapa de setores (512bytes) da memória serial. A posição da entrada na TAC (1 byte) corresponde à posição de um setor (512 bytes) no dispositivo. Assim, a primeira entrada na TAC corresponde aos Bytes (0..511), a segunda aos bytes (512..1023), a terceira aos bytes (1024-1535) e assim sucessivamente.
O conteúdo de uma entrada da TAC armazena a posição da próxima entrada, formando assim uma cadeia de entradas. A última entrada é utilizada para armazenar quantos bytes (em múltiplos de 4) são armazenados no último setor. Como uma entrada de valor "0" (zero) significa um setor vazio (não utilizado), o valor do último setor é acrescido de um, ficando então entre 01 e 128, representando de 04 a 512bytes.
Para calcular o valor do último byte da seqüencia a seguinte fórmula é utilizada:
VALOR = 1 + [ ( TAMARQ MOD 512 ) DIV 2)
Preâmbulo dos arquivos:
Os 16 primeiros bytes do arquivo são utilizados para armazenar algumas informações que não cabem nas entradas de arquivo, como data e hora, e configuração da máquina.
Os bytes 0 a 6 armazenam informações de data e hora:
Byte Conteúdo
0 Bits 6..0 Segundos (00..59) em BCD
1 Bits 6..0 Minutos (00..59) em BCD
2 Bits 5..0 Horas (00..23) em BCD
3 Bits 5..0 Dia do mês (00..31) em BCD
4 Bits 2..0 Dia da semana (0..6), Domingo=0
5 Bit 7: Século, 0=2000, 1=1900;
Bits 4..0: Mês (1..12) em BCD
6 Bits 7..0 Ano (dezena, 00..99) em BCD
O formato dos bytes 7 a 15 depende do tipo de arquivo. Para arquivos Basic ou de Dados, estes bytes ficam sem uso. Para arquivos binários e de tela, o formato encontra-se abaixo:
Para aquivos binários:
Byte Conteúdo
7,8 Endereço de de entrada (carga) do programa na memória
9,10 Endereço de execução do programa
11 Configuração de Slots primários para carga do programa
12 Configuração de Slots secundários para carga do programa
13..15 Reservado para uso futuro
Para aquivos de tela:
Byte Conteúdo
7,8 Endereço de entrada na VRAM
9 Modo de tela (screen)
10..15 Reservado para uso futuro
segunda-feira, 27 de agosto de 2007
Simple com FSAVE/FLOAD
Este cartucho me acompanha até hoje.
Titulador de Vídeo com TMS9128
A revista "Radio Electronics" publicou em novembro de 1985 a primeira parte de um artigo ensinando a construir um titulador de vídeo a partir de um TMS9128. Tenho somente a primeira parte, mas descobri que ao todo o projeto foi dividido em 4 artigos. A primeira parte explica os segredos para a sincronização do TMS9128 com um sinal de vídeo externo: quais as dificuldades envolvidas e como superá-las.
A sequência de artigos é a seguinte:
Video titler. Keyboard device is used to superimpose titles on video images. May also be interfaced with a home computer to superimpose computer-generated graphics or real-time animation on a standard video signal. Est. cost: $300. Part 1.
RADIO-ELECTRONICS Nov 1985 (v.56#11) pg. 45
Video titler. Part 2.
RADIO-ELECTRONICS Dec 1985 (v.56#12) pg. 65
Video titler. Part 3.
RADIO-ELECTRONICS Jan 1986 (v.57#1) pg. 57, 77, 79
RADIO-ELECTRONICS Mar 1986 (v.57#3) pg. 62
(fonte)
segunda-feira, 13 de agosto de 2007
MorseX
Um que merece destaque é o MorseX, de 1994, cujo código foi a adaptação para o Z80 do artigo "Designing with the 8080 microprocessor. Part 4. A typical program. Sample program converts Morse code to ASCII code", da autoria de Randy Carlstrom, publicado na revista Popular Electronics, volume.19 Número 12 (pg. 74) em dezembro de 1981. Infelizmente não consegui localizar ainda o artigo, mas pelo menos localizei a fonte, a partir dos comentários da versão desenvolvida em pascal para o PC.
A entrada de código morse é lida a partir do botão de tiro do joystick "A". O artigo também tinha
um detector de tom baseado num 556 (não tenho mais o esquema, infelizmente). O algoritmo de detecção se adaptava à velocidade, e o programa 'basic' permite alterar 2 parâmetros de funcionamento: 'Noise' e 'Delay'.
Abaixo alguma fotos:
Tela de Abertura em Basic:

Tela de abertura (pressione ENTER para avançar):

Eu tentando manipular alguma coisa:

O programa pode ser baixado neste link
quarta-feira, 8 de agosto de 2007
Layouts para Mapper Simplificada
domingo, 5 de agosto de 2007
Clock para Hotbit convertido em 2.0
Projetei então um adaptador pra ser colocado onde antes era colocado o VDP original, com um oscilador de 3,578MHz e um pull-up pra linha INT.
Eis abaixo a placa já roteada

E o circuito.

sábado, 4 de agosto de 2007
Mapper simplificada - Placas
sábado, 28 de julho de 2007
Mapper 256K simplificada (2)
A placa do mapeador tem um conector de entrada de 20 pinos cuja pinagem foi disposta de forma a poder ser interligada apenas com fios retos ao conector de 50 vias do slot (lateral no Hotbit, frontal no expert). Dessa placa saem 4 fios, sendo 2 com as linhas AA14 e AA15, que devem ir aos LS157 na placa do MSX, e 2 com as linhas AA16 e AA17 que devem ir à placa de memória.

Conector do mapeador:

No Hotbit a conexão fica mais ou menos como na figura abaixo (os LS157 podem não estar na posição certa pois não me lembro de cabeça da placa, e não estou com um Hotbit à mão agora).

A placa de memória foi roteada para ser plugada em cima do banco de memória. Ainda tenho que fazer um ajuste fino, para poder fazer a pinagem bater com o micro. É bem provável que o espaçamento seja diferente para o Hotbit e para o Expert (e para outros MSX), mas o 'layout' foi roteado para ser facilmente adaptável.
