salut,
suite à ce
sujet, j'ai commencé a compléter la rom de test (taito) que l'on trouve sur le net. je voudrai ajouter au moins 4 fonctions:
- le test des crc32 des ROMs
- le test des shifters video
- le test des sons de la version midway
- une mire pour régler l'écran
J'ai déjà fait le crc32, au début j'utilisais as8085, aslink et make, mais j'ai pas trouvé de debuggeur compatible pour charger le hex.
Du coup, j'ai adapté le programme pour GNUSim8085, mais il est vraiment limité (on ne peut pas charger du code ou des data depuis des fichiers, pas de MACRO...) et il est pas très stable.
Quelqu'un a t'il des outils corrects (simulateur ou mieux : un bon compilateur C (pas SmallC)), car là je perd vraiment du temps et je peux pas faire de bons tests (calcul de crc de 2K par exemple).
Ca fait 17 ans que j'ai plus fait d'asm sur i8080 (1ere année d'IUT GEII). Si vous voyez des optimisations (sur la taille du code et des data), n’hésitez pas.
merci
exemple: lxi sp,2400H
lxi H, ADDR
lxi B, 01234h
lxi D, 04567h
mvi A, 001h
sta 01000h
mvi A, 080h
sta 01001h
call crc32
end: jmp end
ADDR: db 00H, 10H
num: db 2H, 0H
crc: db 0,0,0,0
; crc32:
;
; crc = 0xffffffff
; for (;size > 0; size--) {
; crc = crc ^ *data++
; for (i = 8; i > 0; i--) {
; if (crc & 1)
; crc = (crc >> 1) ^ 0xEDB88320
; else
; crc = crc >> 1;
; }
; }
; crc = crc ^ 0xffffffff;
;
; HL => address of the parameters's list
; data addrL (+0), AddrH (+1)
; data SizeL (+2), SizeH (+3)
; crc dataL (+4), dataML(+5)
; crc dataMH(+6), dataH (+7)
crc32: push PSW; save context
push B
push D
push H
; load and push rom's address
mov A,M
mov E,A
inx H
mov A,M
mov D,A
inx H
; load and push rom's size
mov A,M
mov C,A
inx H
mov A,M
mov B,A
inx H
push H; save CRC address
push B; store size
xchg; put rom's address in H
; set crc to 0xffffffff
mvi B,0FFh
mvi C,0FFh
mvi D,0FFh
mvi E,0FFh
bytelp: mov A,M; read rom's data
inx H
push H
mvi H,8; rotate 8 times, i = 8
xra E; CRC = CRC ^ data
mov E,A
bitlp: mov A,E; if (crc & 1 == 0)
ani 1
jz rot1; goto rot1
; CRC = (CRC >> 1) ^ 0EDB88320h
; BBCCEEDD
mov A,B
rar
push PSW
xri 0EDh
mov B,A
pop PSW
mov A,C
rar
push PSW
xri 0B8h
mov C,A
pop PSW
mov A,D
rar
push PSW
xri 083h
mov D,A
pop PSW
mov A,E
rar
xri 020h
mov E,A
jmp ebitlp
; CRC = (CRC >> 1)
rot1: mov A,B
rar
mov B,A
mov A,C
rar
mov C,A
mov A,D
rar
mov D,A
mov A,E
rar
mov E,A
ebitlp: dcr H; if (--i > 0)
jnz bitlp; goto bitlp
pop H
xthl
dcx H
mov A,H; if (--size > 0)
ora L
xthl
jnz bytelp; goto bytelp
pop H; restore dummy
pop H; restore CRC address
; CRC = CRC ^ 0FFFFFFFFh
mov A,B;
xri 0FFh;
mov M,A;
inx H;
mov A,C;
xri 0FFh;
mov M,A;
inx H;
mov A,D;
xri 0FFh;
mov M,A;
inx H;
mov A,E;
xri 0FFh;
mov M,A;
pop H; restore context
pop D
pop B
pop PSW
ret