7Fermer9
chickendudeLe 23/02/2013 à 12:30
J'ai lu un comment de Kerm chez Cemetech qui disait que zStart patch l'OS pour l'exécuter après un RAM Clear. Et je crois que zStart/noshell auront obligatoirement à mettre au moins la table de vecteurs dans cmdShadow, sinon qu'est-ce qu'on va faire quand le programme fait un appel à l'un des routines d'ion ?

Je crois que j'ai vu ce que fait zStart. Regarde ces deux bouts de code :
	ld	b, 8					;ion a 8 routines
	ld	hl, cmdShadow+80		;la table de vecteurs d'ion commence à partir d'ici
makeVectorsLoop:
	ld	(hl), $CD				;c'est le HEX pour "call"
	inc	hl
	ld	(hl), cmdShadow&255		;LSB : tous les routines vont faire un appel à cmdShadow
	inc	hl
	ld	(hl), cmdShadow>>8		;MSB
	inc	hl
	djnz	makeVectorsLoop		;répéter
	
	ld	hl, ionFaker			;le code qui va exécuter la routine
	ld	de, cmdShadow			;sauvé dans au début de cmdShadow
	ld	bc, ionFakerEnd-ionFaker
	ldir

	in	a, (06)					;SMC la page de flash actuelle dans la routine ionFaker
	ld	(smc_ionFaker-ionFaker+cmdShadow+1), a
Ce code-ci crée la table de vecteur et charge un petit code pour exécuter les routines dans cmdShadow.

Puis quand on fait un appel à une des routines d'ion, le code d'ionFaker va s'exécuter :
;chargé dans cmdShadow
ionFaker:
	ex	(sp), hl				;hl = valeur dans la pile (le prochain octet après le call)
	push	de					;sauver de
	ld	de, cmdShadow+80+3		;début du vecteur + 3 (parce que hl = l'adresse de l'appel + 3)
	or	a						;reset carry
	sbc	hl, de					;(adresse de la routine appelée + 3) - (l'adresse du début du vecteur + 3)
								;hl = un numéro entre 0 et 21 (0 = la première routine, 21 = la 8ème)
	ld	de, myIonVectors		;une autre table qui contient des sauts aux routines d'ion dans zStart
	add	hl, de					;un numéro entre 0 et 21 + myIonVectors, l'offset de la routine appelée
	push	af					;sauver af
smc_ionFaker:
	ld	a, 00					;smc a remplacé $00 avec la page de FLASH où se trouve zStart (et donc les routines d'ion)
	out	(06), a					;charger la page FLASH
	pop	af						;restaurer a
	pop	de						;restaurer de
	ex	(sp), hl				;(sp) = l'adresse de la routine appelée
	ret							;sauter à la routine
ionRet:							;toutes les routines sautent ici, je suppose que l'on restaure la page FLASH actuelle
	push	af
	ld	a, $C2
	out	(06), a
	pop	af
	ret
Alors les routines mêmes il semble qu'elles restent dans zStart, on les met pas dans safeRAM/à la fin du programme.