Je fais un émulateur Z80 dans Ada. Je suis le JR de mise en œuvre (saut relatif) de la famille, mais je ne suis pas satisfait de mon code:Trop de conversions de types dans un émulateur Z80 dans Ada
with Ada.Text_IO;
procedure main is
type UInt16 is mod 2 ** 16;
type UInt8 is mod 2 ** 8;
type Int8 is range -128 .. 127;
package UInt16_IO is new Ada.Text_IO.Modular_IO (UInt16);
function Two_Complement(N : UInt8) return Int8 is
begin
if N <= 127 then
return Int8 (N);
end if;
return Int8 (Integer (N) - 256);
end Two_Complement;
-- Relative jump
function Jr (Address : UInt16; D: UInt8) return UInt16 is
begin
return UInt16 (Integer (Address) + Integer (Two_Complement (D) + 2));
end Jr;
Address : UInt16;
begin
Address := 16#683#;
UInt16_IO.Put (Item => Jr (Address, 16#F1#), Base => 16); -- Get 16#676# which is good !
end main;
Il semble fonctionner, mais je trouve qu'il ya trop de conversions de types. Avez-vous un conseil?
Merci,
Olivier.
Avec: retour Adresse + UInt16 (Two_Complement (D) + 2); J'ai un CONSTRAINT_ERROR, ce qui est normal car Two_Complement peut retourner des nombres négatifs. "Trop": parce que j'ai un fond C/C++ et j'essaye d'écrire du bon Ada! – ols
Je n'ai pas remarqué qu'il renvoie int8. –
Note de côté: si vous utilisez le type 'Integer' de la bibliothèque standard Ada et non votre propre type (de préférence avec range et' 'Size' spécifié), alors le premier type pourrait bien être un type 16 bits. Avec Janus/Ada, il est, et donc une tentative de conversion à partir de 'UInt16' pourrait soulever une erreur de contrainte de plage. – B98