
soh para constar: este topic comecou em 14 de outubro de 2006, tem 225 replies e jah foi visualizado 9273 vezes. a maquina com 68030 do enigmabox nao fica muito atras e a minha ainda nem comecou a funcionar...
soh para constar: este topic comecou em 14 de outubro de 2006, tem 225 replies e jah foi visualizado 9273 vezes. a maquina com 68030 do enigmabox nao fica muito atras e a minha ainda nem comecou a funcionar...
Marcelo Samsoniuk
uma outra solucao seria imitar o chip de audio do msx, que gerava uma serie de ruidos e sons pre-programados, mas a qualidade da musica fica meio baixa, fica parecendo msx hehehe
enigmabox escreveu:Marcelo Sam,
Já que tu tem mais experiencia em motorola que eu, gostaria de saber se tu pode me dar uma ajuda, pergunto:
Fiz um programa em assembly com rotinas para interrupções para minha placa com mc68030, mas usando somente opcodes do mc68000 para poder simular no Easy68K. O programa funcionou sem problemas no simulador, sem simular o ativamento da INT5 da cpu.
Quando fui rodar este programa na placa com MC68030 aconteceu alguns problemas quando a interrupção era ativa. Não sei se a cpu reconheceu a interrupção ou ficou rodando em algum loop de software.
Lendo o "pai dos burros" parece que o hardware do mc68030 tem que programar o master stack, supervisor stack, user stack e ISP.
Então um programa com interrupções feito para mc68000 é incompativel diretamente se for rodado em um hardware com mc68030?
Grato
mas se nao usa o AVEC, tem que implementar a rotina de busca de vetor da respectiva interrupcao acionada, o que complica a coisa, certo?
enigmabox escreveu:Caro Marcelo,
No inicio do codigo coloquei:
org 0
DC.L $00080040 ;sp
DC.L $00000400 ;pc
DC.L $00003100 ;bus error
DC.L $00003200 ;address error
DC.L $00003300 ;illegal instruction
org $74
DC.L $00003000 ;desvio da INT5 serial recepcao
A subrotina para interrupção serial:
org $3000
movem.w D0/A0,$80200 ;guarda valor dos registros D0 e A0
clr D0
move.l #$200001,A0 ;A0 com endereço do SRA
move.b (A0),D0 ;D0 tem valor SRA do 68681
movea.l #$80110,A0 ;Carrega A0 com endereço srabit
move.b D0,(A0) ;guarda valor SRA em srabit
movem.w $80200,D0/A0 ;restaura registros D0 e A0
rte
interrupcao:
movem.l d0-d7/a0-a6,-(sp)
codigo
movem.l (sp)+,d0-d7/a0-a6
rte
move.l uart_ring_buffer_ptr,a0
move.b uart_rx_fifo_ptr,(a0)+
move.l a0,uart_ring_buffer_ptr
************************************
;* subrotina BUS ERROR
org $3100 ;bus error msg linha 12
movea.l #$100180,A5 :end ram de video
move #$45,D5 ;e
move.b D5,(A5)
adda #1,A5
move #$52,D5 ;r
move.b D5,(A5)
adda #1,A5
move #$52,D5 ;r
move.b D5,(A5)
adda #1,A5
move #$20,D5 ;espace
move.b D5,(A5)
adda #1,A5
move #$42,D5 ;b
move.b D5,(A5)
adda #1,A5
move #$55,D5 ;u
move.b D5,(A5)
adda #1,A5
move #$53,D5 ;s
move.b D5,(A5)
adda #1,A5
paracpu nop
jmp paracpu
******************************************
Será tb porque quando uso o MOVEM, que é uma instrução previlegiada, dentro da interrupção, pode haver algum problema, se não definir a area do ISP? Será que a cpu pega por engano o ultimo dado do registro A7?
Outra diferença entre o 68000 e o 68010/20/30 quando retorna de um RTE:
68000
retorna com novo conteudo de SR
retorna com novo conteudo de PC
680x0
retorna com novo conteudo de SR
retorna com novo conteudo de PC
Format | vector offset
Em relação ao hardware, acho que está tudo em ordem, pois se recebo algo via serial, automaticamente é ativada a INT5. Posso simular via microswich as outras interrupções, como o BUS error, Address error, etc, mas ativando manualmente não acontece nada, teria que apresentar na tela a msg de erro.
Por segurança tb, tenho uma subrotina que zera o espaço ocupado pelas variaveis do sistema, tais como, as variaveis de linha, coluna, contadores hexa, srabit, etc
Tb não estou usando o AVEC .
Acho que todo o erro é porque não defini a area do ISP, pois quando aparece alguma interrupção ele deve ter pego o valor de A7 e desviou para algum canto da memoria, apos ter recebido o RTE da subrrotina.
Vou ver se consigo hoje ou amanhã fazer mais alguns testes.
enigmabox escreveu:Mastk,mas se nao usa o AVEC, tem que implementar a rotina de busca de vetor da respectiva interrupcao acionada, o que complica a coisa, certo?
Acho que não. É só definir o desvio no endereço $74, como citei, que quando ocorrer a INT5 a cpu vai para o endereço indicado, e depois retornar com RTE.
No databook do mc68030 mostra uma tabela dos endereços para desvio no primeiro 1k da memoria, começando pelo endereço $00 que é o endereço do SP.
Os endereços iniciais de $0000 a $03FF são destinados a desvios por interrupção, erros, vetores, etc.
Se for usar interrupção que não seja por vetor, é só ver na tabela o endereço correspondente a interrupção e deixar ali o endereço do desvio para subrotina de tratamento da interrupção.
Por ex. TRAP#xx tb tem os endereços definidos no primeiro 1k da memoria onde podem ser colocados os endereços de desvios.
Sendo TRAP #xx uma interrupção forçada via software, o restante é via hardware.
Voltar para NXP (ex-FreeScale (ex-Motorola))
Usuários navegando neste fórum: Nenhum usuário registrado e 1 visitante