segunda-feira, 12 de fevereiro de 2007

HB-7000: Código de inicialização

Segue abaixo uma amostra do código, capturado via circuito de captura de listagem de impressora. Ainda falta definir algumas constantes, e completar uma ou duas subrotinas, mas vamos em frente.


10 ; Leitor de MMC/SD
20 ;
30 ORG 0A000H
40 ;
50 INIT:
60 LD A,(SPIBASE)
70 LD C,A
80 INC C
90 ;
100 ; Inicia Hardware
110 LD A,ENARDA
120 OUT(C),A
130 LD A,ENAWRA
140 OUT(C),A
150 LD A,ALTCKL
160 OUT(C),A
170 LD A,CSLO
180 OUT(C),A
190 LD A,P3V3ON
200 OUT(C),A
210 LD A,DISDIN
220 OUT(C),A
230 ;
240 LD HL,(DLINIT)
250 LD B,80
260 ;
270 INI1:
280 LD A,ALTCKH
290 OUT (C),A
300 CALL DELAYHL
310 LD A,ALTCKL
320 OUT (C),A
330 CALL DELAYHL
340 DJNZ INI1
350 ;
360 LD A,ENADIN ;Habilida saida dados
370 OUT (C),A
380 LD A,CSLO
390 OUT (C),A
400 DEC C ; restaura C=SPIBASE
410 ;
420 ;Envia CMD0 (comum MMC/SD)
430 LD HL,CMD0
440 CALL SNDCMD
450 LD E,ECMD0
460 JP C,ERROR
470 LD E,ERSP0
480 CP 01
490 JP NZ,ERROR
500 ;
510 ;CALL PRTHEX
520 ;
530 ;Neste ponto CMD0 aceito
540 ;Agora tenta CMD1 ou ACMD41
550 ;
560 ;Tenta CMD1. Se rejeitado
570 ;ou timeout, tenta ACMD41
580 ;
590 LD B,255
600 ;
610 INI2:
620 LD D,B ; salva B
630 LD HL,CMD1
640 CALL SNDCMD
650 LD B,D ; restaura B
651 ;
660 JR C,INI4 ; Timeout? tenta ACMD41
670 BIT 2,A ; Comando ilegal?
680 JR NZ,INI4 ; Sim, tenta ACMD41
690 ;
700 CP 01 ; Ainda em IDLE?
710 JR NZ,INI3 ; Nao. Entao continua
720 DJNZ INI2 ; Sim, tenta novamente
730 ;
740 INI3:
750 OR A ; cartao respondeu OK?
760 LD E,ERSP1
770 JP NZ,ERROR ; Nao. sinaliza erro
780 JP INIOK ; Sim. Termina rotina
790 ;
800 INI4:
810 LD B,255
820 ;
830 INI5:
840 LD D,B ; salva B
850 LD HL,CMD55
860 CALL SNDCMD
870 LD B,D ; restaura B
871 ;
880 LD E,ECMD55
890 JP C,ERROR
900 CP 01
910 LD E,ERSP55
920 JP NZ,ERROR
930 ;
940 LD D,B ; salva B
950 LD HL,CMD41
960 CALL SNDCMD
970 LD B,D ; restaura B
980 LD E,ECMD41
990 JP C,ERROR ;timeout? sinal. erro
999 ;
1000 CP 01 ; ainda em IDLE?
1010 JR NZ,INI6 ; nao. prossegue
1020 DJNZ INI5 ; sim. tenta de novo
1030 ;
1040 LD E,ECMD41 ;nao saiu de idle
1050 JP ERROR ;entao sinal. erro
1060 ;
1070 INI6:
1080 OR A ; resposta OK?
1090 LD E,ERSP41
1100 JP NZ,ERROR ; nao. sinaliza erro
1110 ;
1120 INIOK:
1130 LD D,A ; D=resposta R1
1140 INC C ; C=SPIBASE + 1
1150 LD A,CSHI
1160 OUT (C),A ; desabilita CS
1170 DEC C ; retorna C=SPIBASE
1171 ;
1180 LD A,INITOK
1190 LD (STAT),A ; atualiza status
1200 ;
1210 XOR A
1220 LD E,A ; E= sem erro
1230 RET


Abaixo a saída do Simple Assembler, com as linhas onde os "labels" estão indefinidos.



<< Simple ASM Ver 2.1 Coral >> PAGE 1

60 U A000 3A0000 LD A,(SPIBASE)
110 U A005 3E00 LD A,ENARDA
130 U A009 3E00 LD A,ENAWRA
150 U A00D 3E00 LD A,ALTCKL
170 U A011 3E00 LD A,CSLO
190 U A015 3E00 LD A,P3V3ON
210 U A019 3E00 LD A,DISDIN
240 U A01D 2A0000 LD HL,(DLINIT)
280 U A022 3E00 LD A,ALTCKH
300 U A026 CD0000 CALL DELAYHL
310 U A029 3E00 LD A,ALTCKL
330 U A02D CD0000 CALL DELAYHL
360 U A032 3E00 LD A,ENADIN ;Habilida saida dados
380 U A036 3E00 LD A,CSLO
430 U A03B 210000 LD HL,CMD0
440 U A03E CD0000 CALL SNDCMD
450 U A041 1E00 LD E,ECMD0
460 U A043 DA0000 JP C,ERROR
470 U A046 1E00 LD E,ERSP0
490 U A04A C20000 JP NZ,ERROR
630 U A050 210000 LD HL,CMD1
640 U A053 CD0000 CALL SNDCMD
760 U A064 1E00 LD E,ERSP1
770 U A066 C20000 JP NZ,ERROR ; Nao. sinaliza erro
850 U A06F 210000 LD HL,CMD55
860 U A072 CD0000 CALL SNDCMD
880 U A076 1E00 LD E,ECMD55
890 U A078 DA0000 JP C,ERROR
910 U A07D 1E00 LD E,ERSP55
920 U A07F C20000 JP NZ,ERROR
950 U A083 210000 LD HL,CMD41
960 U A086 CD0000 CALL SNDCMD
980 U A08A 1E00 LD E,ECMD41
990 U A08C DA0000 JP C,ERROR ;timeout? sinal. erro
1040 U A095 1E00 LD E,ECMD41 ;nao saiu de idle
1050 U A097 C30000 JP ERROR ;entao sinal. erro
1090 U A09B 1E00 LD E,ERSP41
1100 U A09D C20000 JP NZ,ERROR ; nao. sinaliza erro
1150 U A0A2 3E00 LD A,CSHI
1180 U A0A7 3E00 LD A,INITOK
1190 U A0A9 320000 LD (STAT),A ; atualiza status




Nenhum comentário: