diff --git a/compiler/cgbase.pas b/compiler/cgbase.pas index 40c94f753f..a77b57465a 100644 --- a/compiler/cgbase.pas +++ b/compiler/cgbase.pas @@ -107,6 +107,10 @@ interface ,addr_hi8 ,addr_hi8_gs {$ENDIF} + {$IFDEF Z80} + ,addr_lo8 + ,addr_hi8 + {$ENDIF} {$IFDEF i8086} ,addr_dgroup // the data segment group ,addr_fardataseg // the far data segment of the current pascal module (unit or program) diff --git a/compiler/z80/agsdasz80.pas b/compiler/z80/agsdasz80.pas index 10fd4127ad..01e1b1b58d 100644 --- a/compiler/z80/agsdasz80.pas +++ b/compiler/z80/agsdasz80.pas @@ -330,7 +330,25 @@ unit agsdasz80; end; top_ref: 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^.offset<>0) then begin diff --git a/compiler/z80/cgcpu.pas b/compiler/z80/cgcpu.pas index 2b665e4806..2883062a19 100644 --- a/compiler/z80/cgcpu.pas +++ b/compiler/z80/cgcpu.pas @@ -1820,39 +1820,33 @@ unit cgcpu; var tmpref : treference; begin - list.Concat(tai_comment.Create(strpnew('WARNING! not implemented: a_loadaddr_ref_reg'))); - // if ref.addressmode<>AM_UNCHANGED then - // internalerror(2011021701); - // - //if assigned(ref.symbol) or (ref.offset<>0) then - // begin - // reference_reset(tmpref,0,[]); - // tmpref.symbol:=ref.symbol; - // tmpref.offset:=ref.offset; - // - // if assigned(ref.symbol) and (ref.symbol.typ in [AT_FUNCTION,AT_LABEL]) then - // tmpref.refaddr:=addr_lo8_gs - // else - // tmpref.refaddr:=addr_lo8; - // list.concat(taicpu.op_reg_ref(A_LDI,r,tmpref)); - // - // 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_ADC,GetNextReg(r),GetNextReg(ref.base))); - // end; - // if (ref.index<>NR_NO) then - // begin - // list.concat(taicpu.op_reg_reg(A_ADD,r,ref.index)); - // list.concat(taicpu.op_reg_reg(A_ADC,GetNextReg(r),GetNextReg(ref.index))); - // end; - // end + if assigned(ref.symbol) or (ref.offset<>0) then + begin + reference_reset(tmpref,0,[]); + tmpref.symbol:=ref.symbol; + tmpref.offset:=ref.offset; + + tmpref.refaddr:=addr_lo8; + list.concat(taicpu.op_reg_ref(A_LD,r,tmpref)); + + tmpref.refaddr:=addr_hi8; + list.concat(taicpu.op_reg_ref(A_LD,GetNextReg(r),tmpref)); + + if (ref.base<>NR_NO) then + begin + list.Concat(tai_comment.Create(strpnew('WARNING! not implemented: a_loadaddr_ref_reg with symbol and 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))); + end; + if (ref.index<>NR_NO) then + 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_ADC,GetNextReg(r),GetNextReg(ref.index))); + end; + end + else + list.Concat(tai_comment.Create(strpnew('WARNING! not implemented: a_loadaddr_ref_reg'))); //else if (ref.base<>NR_NO)then // begin // emit_mov(list,r,ref.base);