+ implemented tcgz80.a_loadaddr_ref_reg for symbol references

git-svn-id: branches/z80@44682 -
This commit is contained in:
nickysn 2020-04-11 01:00:46 +00:00
parent 66ed58a51b
commit 4e5eb7fa4e
3 changed files with 50 additions and 34 deletions

View File

@ -107,6 +107,10 @@ interface
,addr_hi8 ,addr_hi8
,addr_hi8_gs ,addr_hi8_gs
{$ENDIF} {$ENDIF}
{$IFDEF Z80}
,addr_lo8
,addr_hi8
{$ENDIF}
{$IFDEF i8086} {$IFDEF i8086}
,addr_dgroup // the data segment group ,addr_dgroup // the data segment group
,addr_fardataseg // the far data segment of the current pascal module (unit or program) ,addr_fardataseg // the far data segment of the current pascal module (unit or program)

View File

@ -330,7 +330,25 @@ unit agsdasz80;
end; end;
top_ref: top_ref:
begin begin
if not assigned(o.ref^.symbol) and if assigned(o.ref^.symbol) and (o.ref^.refaddr in [addr_lo8,addr_hi8]) then
begin
{if SmartAsm then
AddSymbol(o.ref^.symbol.name,false);}
if (o.ref^.base<>NR_NO) or (o.ref^.index<>NR_NO) then
internalerror(2020041101);
writer.AsmWrite('#');
case o.ref^.refaddr of
addr_lo8:
writer.AsmWrite('<');
addr_hi8:
writer.AsmWrite('>');
end;
if o.ref^.offset<>0 then
writer.AsmWrite('('+o.ref^.symbol.name+'+'+tostr(o.ref^.offset)+')')
else
writer.AsmWrite(o.ref^.symbol.name);
end
else if not assigned(o.ref^.symbol) and
((o.ref^.base<>NR_NO) or (o.ref^.index<>NR_NO)) and ((o.ref^.base<>NR_NO) or (o.ref^.index<>NR_NO)) and
(o.ref^.offset<>0) then (o.ref^.offset<>0) then
begin begin

View File

@ -1820,39 +1820,33 @@ unit cgcpu;
var var
tmpref : treference; tmpref : treference;
begin begin
list.Concat(tai_comment.Create(strpnew('WARNING! not implemented: a_loadaddr_ref_reg'))); if assigned(ref.symbol) or (ref.offset<>0) then
// if ref.addressmode<>AM_UNCHANGED then begin
// internalerror(2011021701); reference_reset(tmpref,0,[]);
// tmpref.symbol:=ref.symbol;
//if assigned(ref.symbol) or (ref.offset<>0) then tmpref.offset:=ref.offset;
// begin
// reference_reset(tmpref,0,[]); tmpref.refaddr:=addr_lo8;
// tmpref.symbol:=ref.symbol; list.concat(taicpu.op_reg_ref(A_LD,r,tmpref));
// tmpref.offset:=ref.offset;
// tmpref.refaddr:=addr_hi8;
// if assigned(ref.symbol) and (ref.symbol.typ in [AT_FUNCTION,AT_LABEL]) then list.concat(taicpu.op_reg_ref(A_LD,GetNextReg(r),tmpref));
// tmpref.refaddr:=addr_lo8_gs
// else if (ref.base<>NR_NO) then
// tmpref.refaddr:=addr_lo8; begin
// list.concat(taicpu.op_reg_ref(A_LDI,r,tmpref)); list.Concat(tai_comment.Create(strpnew('WARNING! not implemented: a_loadaddr_ref_reg with symbol and ref.base')));
//
// if assigned(ref.symbol) and (ref.symbol.typ in [AT_FUNCTION,AT_LABEL]) then
// tmpref.refaddr:=addr_hi8_gs
// else
// tmpref.refaddr:=addr_hi8;
// list.concat(taicpu.op_reg_ref(A_LDI,GetNextReg(r),tmpref));
//
// if (ref.base<>NR_NO) then
// begin
//list.concat(taicpu.op_reg_reg(A_ADD,r,ref.base)); //list.concat(taicpu.op_reg_reg(A_ADD,r,ref.base));
//list.concat(taicpu.op_reg_reg(A_ADC,GetNextReg(r),GetNextReg(ref.base))); //list.concat(taicpu.op_reg_reg(A_ADC,GetNextReg(r),GetNextReg(ref.base)));
// end; end;
// if (ref.index<>NR_NO) then if (ref.index<>NR_NO) then
// begin begin
list.Concat(tai_comment.Create(strpnew('WARNING! not implemented: a_loadaddr_ref_reg with symbol and ref.index')));
//list.concat(taicpu.op_reg_reg(A_ADD,r,ref.index)); //list.concat(taicpu.op_reg_reg(A_ADD,r,ref.index));
//list.concat(taicpu.op_reg_reg(A_ADC,GetNextReg(r),GetNextReg(ref.index))); //list.concat(taicpu.op_reg_reg(A_ADC,GetNextReg(r),GetNextReg(ref.index)));
// end; end;
// end end
else
list.Concat(tai_comment.Create(strpnew('WARNING! not implemented: a_loadaddr_ref_reg')));
//else if (ref.base<>NR_NO)then //else if (ref.base<>NR_NO)then
// begin // begin
// emit_mov(list,r,ref.base); // emit_mov(list,r,ref.base);