Емуляція КР-580 розкладення "на пальцях"(1)
Емуляція КР-580 розкладення "на пальцях"(1)
Сообщений 1 страница 28 из 28
Поделиться32024-09-20 11:21:22
C:\_SEFA\_SEFA13\Program\Emulator\
Unit uEmulator_I8080;
Interface
const f_S=128;f_Z=64;f_5=32;f_A=16;f_3=8;f_P=4;f_1=2;f_C=1;
const flags: array [0..256]of Byte=(
70,2,2,6,2,6,6,2,2,6,6,2,6,2,2,6,2,6,6,2,6,2,2,6,6,2,2,6,2,6,6,2,2,6,6,2,6,2,2,
6,6,2,2,6,2,6,6,2,6,2,2,6,2,6,6,2,2,6,6,2,6,2,2,6,2,6,6,2,6,2,2,6,6,2,2,6,2,6,6,
2,6,2,2,6,2,6,6,2,2,6,6,2,6,2,2,6,6,2,2,6,2,6,6,2,2,6,6,2,6,2,2,6,2,6,6,2,6,2,2,
6,6,2,2,6,2,6,6,2,130,134,134,130,134,130,130,134,134,130,130,134,130,134,134,130,
134,130,130,134,130,134,134,130,130,134,134,130,134,130,130,134,134,130,130,134,130,
134,134,130,130,134,134,130,134,130,130,134,130,134,134,130,134,130,130,134,134,130,
130,134,130,134,134,130,134,130,130,134,130,134,134,130,130,134,134,130,134,130,130,
134,130,134,134,130,134,130,130,134,134,130,130,134,130,134,134,130,130,134,134,130,
134,130,130,134,134,130,130,134,130,134,134,130,134,130,130,134,130,134,134,130,130,
134,134,130,134,130,130,134,0);
var ports : array [0..256] of byte;
memory: array [0..65535] of byte;MemoryCardinal_:Array[0..16383] of Cardinal absolute memory;
RgA,RgB,RgC,RgD,RgE,RgH,RgL,RgF,RpPC,RpSP:Longint;
FlagChangeC1:Cardinal;{прапор зміни порту C1}
video,VideoDirty_ : array [0..16384] of byte;
FlagChangeVIDEO:Cardinal;{Прапор зміни ячейки в VRAM}
ChangeVIDEOadrMIN,ChangeVIDEOadrMAX:Cardinal;{мін и макс адреса які були "задіти" в VRAM}
Var ZoomY:Byte=2;ZoomX:Byte=2;{Zoom екрану}
OffSetX:Longint=32;OffSetY:Longint=-8;{Зміщення по екрану}
CT:Int64=0;{лічильник тактів}
CountCommand:Int64=0;
procedure ResetComp;
procedure ResetCompNotBIOS;{Без BIOS}
procedure i8080_do_opcodes(nb_cycles : longint);
procedure DrawScreen;
procedure DrawScreen1;
procedure DrawScreen2;
function do_read(addr : Cardinal): Cardinal;
procedure do_write(do_write_addr, do_write_bt:Cardinal);
procedure do_write2(a_lo,a_hi,bt:integer);
function do_read2(a_lo,a_hi:integer):integer;
procedure do_output(port,bt:integer);
function do_input(port:integer):integer;
implementation
uses uGraph,Stub,uEmulator_BIOS;
procedure ResetPorts;var i : word;begin i:=0;while (i<256) do begin ports[i]:=$FF;inc(i);end;end;
procedure load_bios;var i: word;begin i:=0;while (i<4096) do begin MemoryCardinal_[i+12288]:=BIOS1Cardinal[i];inc(i);end;end;
procedure ResetComp;begin ResetPorts;load_bios; ports[$C2]:=$FF;RpPC:=$C000;FlagChangeC1:=1;end;
procedure ResetCompNotBIOS;begin ResetPorts;ports[$C2]:=$FF;RpPC:=$C000;FlagChangeC1:=1;end;
function do_read(addr : Cardinal): Cardinal;// считаем значение из пямяти
begin addr:=(addr and $FFFF);
if ((ports[$C2] and 2)<>0) then begin do_read := memory[addr];end else
if (addr>$7FFF) then begin do_read := memory[addr];end else
if (addr<$4000) then begin do_read := 0;end else begin do_read := video[addr-$4000];end;
end;
procedure do_write(do_write_addr, do_write_bt:Cardinal);
var wremw:word;
begin if do_write_addr> $FFFF then do_write_addr:=$FFFF;
if (do_write_addr>=$C000) then begin exit;end;
if ((ports[$C2] and 2)<>0) then begin memory[do_write_addr]:=do_write_bt;
if do_write_addr=48669 then memory48669:=memory[48669]; end
else if (do_write_addr<$4000) then begin exit;end else
if (do_write_addr<$8000) then begin
{в VRAM} wremw:=do_write_addr-$4000;video[(wremw)]:=do_write_bt;
{порівнюємо чи є зміни}
if do_write_bt <> VideoDirty_[(wremw)] then begin FlagChangeVIDEO:=1;
If wremw < ChangeVIDEOadrMIN then ChangeVIDEOadrMIN:=wremw;
If wremw > ChangeVIDEOadrMAX then ChangeVIDEOadrMAX:=wremw;end;end
else begin memory[do_write_addr]:=do_write_bt;
if do_write_addr=48669 then memory48669:=memory[48669];end;end;
procedure do_write2(a_lo,a_hi,bt:integer);begin do_write(a_lo+(a_hi SHL 8),bt);end;
function do_read2(a_lo,a_hi:integer):integer;begin do_read2 := do_read(a_lo+(a_hi SHL 8));end;
procedure do_output(port,bt:integer);// out
begin port:=$C0+(port and $13);case port of
$c1: begin // зміна порту кольору {fillchar(VideoDirty,sizeof(VideoDirty),257);}
FlagChangeC1:=1;{прапор зміни порту $C1} end;end;ports[port]:=bt;end;
function do_input(port:integer):integer;
var i,r:integer;nD2,nD0:byte;
begin nD2:=0;nD0:=0;port:=$C0+(port and $13);
case port of
$C2:begin do_input:=ports[$C2];end;
$D1:begin nD0:=not ports[$D0];r:=0;i:=0;
while (i<8) do begin
if ((nD0 and (1 SHL i))<>0) then begin r:=(r or kbd_base[i]);end;
inc(i);end;
do_input := ((not r) and $FF);end;
$D2:begin nD2:= not ports[$D2];r:=0;i:=0;
while (i<4) do begin
if ((nD2 and (1 SHL i))<>0) then begin r:=(r or kbd_ext[i]);end;
inc(i);end;
do_input := not ((r SHL 4) or (nD2 and $0F)) and $FF;end
else begin do_input := $FF;end;end;end;
procedure i8080_do_opcodes(nb_cycles : longint);
var tmp3, tmp2, tmp1, opcode : Longint;
var cz:Cardinal;{після виконання команди, кількість тактів даної команди}
cz1:Cardinal;
begin cz:=0;tmp1:=0;tmp2:=0;tmp3:=0;cz1:=0;
while (cz1 < nb_cycles) do
begin
opcode:=do_read(RpPC);
case opcode of
$00: begin cz:=4;inc(RpPC);end;
$F3: begin cz:=4;inc(RpPC);end;
$FB: begin cz:=4;inc(RpPC);end;
$01: begin RgB:=do_read(RpPC+2);RgC:=do_read(RpPC+1);cz:=10;inc(RpPC,3);end;
$02: begin do_write2(RgC,RgB,RgA);cz:=7;inc(RpPC);end;
$03: begin RgC:=RgC+1;if (RgC>$FF) then begin RgC:=0;RgB:=RgB+1;
if (RgB>$FF) then begin RgB:=0;end;end;cz:=5;inc(RpPC);end;
$04: begin tmp2:=((RgB+1) and $FF);RgF:=(flags[tmp2] or (RgF and f_C));
if (((tmp2 xor RgB) and $10)<>0) then
begin RgF:=RgF or f_A;end;RgB:=tmp2;cz:=5;inc(RpPC);end;
$05: begin tmp2:=((RgB-1) and $FF);RgF:=(flags[tmp2] or (RgF and f_C));
if (((tmp2 xor RgB) and $10)<>0) then begin RgF:=(RgF or f_A);end;
RgB:=tmp2;cz:=5;inc(RpPC);end;
$06: begin RgB:=do_read(RpPC+1);cz:=7;inc(RpPC,2);end;
$07: begin RgA:=RgA SHL 1;if (RgA>$FF) then begin RgA:=RgA or 1;
RgF:=RgF or f_C;RgA:= RgA and $FF;end else
begin RgF:=(RgF and (not f_C));end;cz:=4;inc(RpPC);end;
$08: begin begin cz:=4;inc(RpPC);end;end;
$10: begin begin cz:=4;inc(RpPC);end;end;
$18: begin begin cz:=4;inc(RpPC);end;end;
$20: begin begin cz:=4;inc(RpPC);end;end;
$28: begin begin cz:=4;inc(RpPC);end;end;
$30: begin begin cz:=4;inc(RpPC);end;end;
$38: begin begin cz:=4;inc(RpPC);end;end;
$09: begin RgL:=RgL+RgC;RgH:=RgH+RgB;if (RgL>$FF) then
begin inc(RgH);RgL:=(RgL and $FF);end;if (RgH>$FF) then
begin RgH:=(RgH and $FF);RgF:=(RgF or f_C);end else
begin RgF:=(RgF and (not f_C));end;cz:=10;inc(RpPC);end;
$0A: begin RgA:=do_read2(RgC,RgB);cz:=7;inc(RpPC);end;
$0B: begin RgC:=RgC-1;if (RgC<0) then begin RgC:=$FF;RgB:=RgB-1;
if (RgB<0) then begin RgB:=$FF;end;end;
cz:=5;inc(RpPC);end;
$0C: begin tmp2:=((RgC+1) and $FF);RgF:=(flags[tmp2] or (RgF and f_C));
if (((tmp2 xor RgC) and $10)<>0) then begin RgF:=RgF or f_A;end;
RgC:=tmp2;cz:=5;inc(RpPC);end;
$0D: begin tmp2:=((RgC-1) and $FF);RgF:=flags[tmp2] or (RgF and f_C);
if (((tmp2 xor RgC) and $10)<>0) then begin RgF:=(RgF or f_A);end;
RgC:=tmp2;cz:=5;inc(RpPC);end;
$0E: begin RgC:=do_read(RpPC+1);cz:=7;inc(RpPC,2);end;
$0F: begin tmp1:=(RgA and 1);RgA:=(RgA shr 1);if (tmp1<>0) then
begin RgA:=(RgA or $80);RgF:=(RgF or f_C);end else
begin RgF:=(RgF and ( not f_C));end;cz:=4;inc(RpPC);end;
$11: begin RgD:=do_read(RpPC+2);RgE:=do_read(RpPC+1);cz:=10;inc(RpPC,3);end;
$12: begin do_write2(RgE,RgD,RgA);cz:=7;inc(RpPC);end;
$13: begin RgE:=RgE+1;if (RgE>$FF) then begin RgE:=0;RgD:=RgD+1;
if (RgD>$FF) then begin RgD:=0;end;end;cz:=5;inc(RpPC);end;
$14: begin tmp2:=((RgD+1)and $FF);RgF:=(flags[tmp2] or (RgF and f_C));
if (((tmp2 xor RgD) and $10)<>0) then begin RgF:=(RgF or f_A);end;
RgD:=tmp2;cz:=5;inc(RpPC);end;
$15: begin tmp2:=((RgD-1)and $FF);RgF:=(flags[tmp2] or (RgF and f_C));
if (((tmp2 xor RgD) and $10)<>0) then begin RgF:=(RgF or f_A);end;
RgD:=tmp2;cz:=5;inc(RpPC);end;
$16: begin RgD:=do_read(RpPC+1);cz:=7;inc(RpPC,2);end;
$17: begin RgA:=(RgA shl 1);if ((RgF and f_C)<>0) then begin RgA:=(RgA or 1);end;
if (RgA>$FF) then begin RgF:=(RgF or f_C);RgA:=(RgA and $FF);end else begin
RgF:=(RgF and (not f_C));end;cz:=4;inc(RpPC);end;
$19: begin RgL:=(RgL + RgE);RgH:=(RgH + RgD);if (RgL>$FF) then
begin inc(RgH);RgL:=(RgL and $FF);end;
if (RgH>$FF) then begin RgH:=(RgH and $FF);RgF:=(RgF or f_C);end else
begin RgF:=(RgF and not (f_C));end;cz:=10;inc(RpPC);end;
$1A: begin RgA:=do_read2(RgE,RgD);cz:=7;inc(RpPC);end;
$1B: begin RgE:=RgE-1;if (RgE<0) then begin RgE:=$FF;RgD:=RgD-1;
if (RgD<0) then begin RgD:=$FF;end;end;cz:=5;
inc(RpPC);end;
$1C: begin tmp2:=((RgE+1)and $FF);RgF:=(flags[tmp2] or (RgF and f_C));
if (((tmp2 xor RgE) and $10)<>0) then begin RgF:=(RgF or f_A);end;
RgE:=tmp2;cz:=5;inc(RpPC);end;
$1D: begin tmp2:=((RgE-1) and $FF);RgF:=(flags[tmp2] or (RgF and f_C));
if (((tmp2 xor RgE) and $10)<>0) then begin RgF:=(RgF or f_A);end;
RgE:=tmp2;cz:=5;inc(RpPC);end;
$1E: begin RgE:=do_read(RpPC+1);cz:=7;inc(RpPC,2);end;
$1F: begin tmp1:=(RgA and 1);RgA:=(RgA SHR 1);if ((RgF and f_C)<>0) then
begin RgA:=(RgA or $80);end;
if (tmp1<>0) then begin RgF:=(RgF or f_C);end else
begin RgF:=(RgF and not(f_C));end;cz:=4;inc(RpPC);end;
$21: begin RgH:=do_read(RpPC+2);RgL:=do_read(RpPC+1);cz:=10;inc(RpPC,3);end;
$22: begin tmp1:=do_read(RpPC+1)+(do_read(RpPC+2) shl 8);do_write(tmp1,RgL);
do_write(tmp1+1,RgH);cz:=16;inc(RpPC,3);end;
$23: begin RgL:=RgL+1;if (RgL>$FF) then begin RgL:=0;RgH:=RgH+1;
if (RgH>$FF) then begin RgH:=0;end;end;
cz:=5;inc(RpPC);end;
$24: begin tmp2:=((RgH+1) and $FF);RgF:=(flags[tmp2] or (RgF and f_C));
if (((tmp2 xor RgH) and $10)<>0) then begin RgF:=(RgF or f_A);end;
RgH:=tmp2;cz:=5;inc(RpPC);end;
$25: begin tmp2:=((RgH-1) and $FF);RgF:=(flags[tmp2] or (RgF and f_C));
if (((tmp2 xor RgH) and $10)<>0) then begin RgF:=(RgF or f_A);end;
RgH:=tmp2;cz:=5;inc(RpPC);end;
$26: begin RgH:=do_read(RpPC+1);cz:=7;inc(RpPC,2);end;
$27: begin tmp1:=0;if (((RgF and f_C)<>0) or (RgA>$99)) then begin
tmp1:=(tmp1 or $60);end;
if (((RgF and f_A)<>0) or ((RgA and $0F)>$09)) then begin
tmp1:=(tmp1 or $06);end;tmp2:=RgA+tmp1;RgF:=flags[tmp2 and $FF];
if (((tmp2 xor RgA xor tmp1) and $10)<>0) then begin RgF:=(RgF or f_A);end;
if (tmp2>$FF) then begin RgF:=(RgF or f_C);end;RgA:=tmp2 and $FF;
cz:=4;inc(RpPC);end;
$29: begin RgL:=RgL + RgL;RgH:=RgH + RgH;
if (RgL>$FF) then begin inc(RgH);RgL:=(RgL and $FF);end;
if (RgH>$FF) then begin RgH:=(RgH and $FF);RgF:=(RgF or f_C);end else begin
RgF:=(RgF and (not f_C));end;cz:=10;inc(RpPC);end;
$2A: begin tmp1:=do_read(RpPC+1)+(do_read(RpPC+2) shl 8);RgL:=do_read(tmp1);
RgH:=do_read(tmp1+1);cz:=16;inc(RpPC,3);end;
$2B: begin RgL:=RgL-1;if (RgL <0) then begin RgL:=$FF;
RgH:=RgH-1;if (RgH<0) then begin RgH:=$FF;end;end;
cz:=5;inc(RpPC);end;
$2C: begin tmp2:=((RgL+1) and $FF);RgF:=(flags[tmp2] or (RgF and f_C));
if (((tmp2 xor RgL) and $10)<>0) then begin RgF:=(RgF or f_A);end;
RgL:=tmp2;cz:=5;inc(RpPC);end;
$2D: begin tmp2:=((RgL-1) and $FF);RgF:=(flags[tmp2] or (RgF and f_C));
if (((tmp2 xor RgL) and $10)<>0) then begin RgF:=(RgF or f_A);end;
RgL:=tmp2;cz:=5;inc(RpPC);end;
$2E: begin RgL:=do_read(RpPC+1);cz:=7;inc(RpPC,2);end;
$2F: begin RgA:=(RgA xor $FF);cz:=4;inc(RpPC);end;
$31: begin RpSP:=(do_read(RpPC+2) shl 8)+do_read(RpPC+1);cz:=10;
inc(RpPC,3);end;
$32: begin do_write2(do_read(RpPC+1),do_read(RpPC+2),RgA);cz:=13;
inc(RpPC,3);end;
$33: begin if (RpSP=$FFFF) then begin RpSP:=0;end else
begin inc(RpSP);end;cz:=5;inc(RpPC);end;
$34: begin tmp1:=do_read2(RgL,RgH);tmp2:=((tmp1+1) and $FF);
RgF:=(flags[tmp2] or (RgF and f_C));if (((tmp2 xor tmp1) and $10)<>0) then
begin RgF:=(RgF or f_A);end;do_write2(RgL,RgH,tmp2);cz:=10;
inc(RpPC);end;
$35: begin tmp1:=do_read2(RgL,RgH);tmp2:=((tmp1-1) and $FF);RgF:=flags[tmp2] or (RgF and f_C);
if (((tmp2 xor tmp1) and $10)<>0) then begin RgF:=(RgF or f_A);end;
do_write2(RgL,RgH,tmp2);cz:=10;inc(RpPC);end;
$36: begin do_write2(RgL,RgH,do_read(RpPC+1));cz:=10;inc(RpPC,2);end;
$37: begin RgF:=(RgF or f_C);cz:=4;inc(RpPC);end;
$39: begin RgL:=(RgL + (RpSP and $FF));RgH:=(RgH + ((RpSP shr 8) and $FF));
if (RgL>$FF) then begin inc(RgH);RgL:=(RgL and $FF);end;
if (RgH>$FF) then begin RgH:=(RgH and $FF);RgF:=(RgF or f_C);
end else begin RgF:=(RgF and (not f_C));end;cz:=10;inc(RpPC);end;
$3A: begin RgA:=do_read2(do_read(RpPC+1),do_read(RpPC+2));cz:=13;
inc(RpPC,3);end;
$3B: begin if (RpSP<>0) then begin RpSP:=RpSP-1;end else
begin RpSP:=$FFFF;end;cz:=5;inc(RpPC);end;
$3C: begin tmp2:=((RgA+1) and $FF);RgF:=(flags[tmp2] or (RgF and f_C));
if (((tmp2 xor RgA) and $10)<>0) then begin RgF:=(RgF or f_A);end;
RgA:=tmp2;cz:=5;inc(RpPC);end;
$3D: begin tmp2:=((RgA-1) and $FF);RgF:=(flags[tmp2] or (RgF and f_C));
if (((tmp2 xor RgA) and $10)<>0) then begin RgF:=(RgF or f_A);end;
RgA:=tmp2;cz:=5;inc(RpPC);end;
$3E: begin RgA:=do_read(RpPC+1);cz:=7;inc(RpPC,2);end;
$3F: begin RgF:=RgF xor f_C;cz:=4;inc(RpPC);end;
$40: begin cz:=5;inc(RpPC);end;
$49: begin cz:=5;inc(RpPC);end;
$52: begin cz:=5;inc(RpPC);end;
$5B: begin cz:=5;inc(RpPC);end;
$64: begin cz:=5;inc(RpPC);end;
$6D: begin cz:=5;inc(RpPC);end;
$7F: begin cz:=5;inc(RpPC);end;
$41: begin RgB:=RgC;cz:=5;inc(RpPC);end;
$42: begin RgB:=RgD;cz:=5;inc(RpPC);end;
$43: begin RgB:=RgE;cz:=5;inc(RpPC);end;
$44: begin RgB:=RgH;cz:=5;inc(RpPC);end;
$45: begin RgB:=RgL;cz:=5;inc(RpPC);end;
$46: begin RgB:=do_read2(RgL,RgH);cz:=7;inc(RpPC);end;
$47: begin RgB:=RgA;cz:=5;inc(RpPC);end;
$48: begin RgC:=RgB;cz:=5;inc(RpPC);end;
$4A: begin RgC:=RgD;cz:=5;inc(RpPC);end;
$4B: begin RgC:=RgE;cz:=5;inc(RpPC);end;
$4C: begin RgC:=RgH;cz:=5;inc(RpPC);end;
$4D: begin RgC:=RgL;cz:=5;inc(RpPC);end;
$4E: begin RgC:=do_read2(RgL,RgH);cz:=7;inc(RpPC);end;
$4F: begin RgC:=RgA;cz:=5;inc(RpPC);end;
$50: begin RgD:=RgB;cz:=5;inc(RpPC);end;
$51: begin RgD:=RgC;cz:=5;inc(RpPC);end;
$53: begin RgD:=RgE;cz:=5;inc(RpPC);end;
$54: begin RgD:=RgH;cz:=5;inc(RpPC);end;
$55: begin RgD:=RgL;cz:=5;inc(RpPC);end;
$56: begin RgD:=do_read2(RgL,RgH);cz:=7;inc(RpPC);end;
$57: begin RgD:=RgA;cz:=5;inc(RpPC);end;
$58: begin RgE:=RgB;cz:=5;inc(RpPC);end;
$59: begin RgE:=RgC;cz:=5;inc(RpPC);end;
$5A: begin RgE:=RgD;cz:=5;inc(RpPC);end;
$5C: begin RgE:=RgH;cz:=5;inc(RpPC);end;
$5D: begin RgE:=RgL;cz:=5;inc(RpPC);end;
$5E: begin RgE:=do_read2(RgL,RgH);cz:=7;inc(RpPC);end;
$5F: begin RgE:=RgA;cz:=5;inc(RpPC);end;
$60: begin RgH:=RgB;cz:=5;inc(RpPC);end;
$61: begin RgH:=RgC;cz:=5;inc(RpPC);end;
$62: begin RgH:=RgD;cz:=5;inc(RpPC);end;
$63: begin RgH:=RgE;cz:=5;inc(RpPC);end;
$65: begin RgH:=RgL;cz:=5;inc(RpPC);end;
$66: begin RgH:=do_read2(RgL,RgH);cz:=7;inc(RpPC);end;
$67: begin RgH:=RgA;cz:=5;inc(RpPC);end;
$68: begin RgL:=RgB;cz:=5;inc(RpPC);end;
$69: begin RgL:=RgC;cz:=5;inc(RpPC);end;
$6A: begin RgL:=RgD;cz:=5;inc(RpPC);end;
$6B: begin RgL:=RgE;cz:=5;inc(RpPC);end;
$6C: begin RgL:=RgH;cz:=5;inc(RpPC);end;
$6E: begin RgL:=do_read2(RgL,RgH);cz:=7;inc(RpPC);end;
$6F: begin RgL:=RgA;cz:=5;inc(RpPC);end;
$70: begin do_write2(RgL,RgH,RgB);cz:=7;inc(RpPC);end;
$71: begin do_write2(RgL,RgH,RgC);cz:=7;inc(RpPC);end;
$72: begin do_write2(RgL,RgH,RgD);cz:=7;inc(RpPC);end;
$73: begin do_write2(RgL,RgH,RgE);cz:=7;inc(RpPC);end;
$74: begin do_write2(RgL,RgH,RgH);cz:=7;inc(RpPC);end;
$75: begin do_write2(RgL,RgH,RgL);cz:=7;inc(RpPC);end;
$76: begin cz:=4;inc(RpPC);end;
$77: begin do_write2(RgL,RgH,RgA);cz:=7;inc(RpPC);end;
$78: begin RgA:=RgB;cz:=5;inc(RpPC);end;
$79: begin RgA:=RgC;cz:=5;inc(RpPC);end;
$7A: begin RgA:=RgD;cz:=5;inc(RpPC);end;
$7B: begin RgA:=RgE;cz:=5;inc(RpPC);end;
$7C: begin RgA:=RgH;cz:=5;inc(RpPC);end;
$7D: begin RgA:=RgL;cz:=5;inc(RpPC);end;
$7E: begin RgA:=do_read2(RgL,RgH);cz:=7;inc(RpPC);end;
$80: begin tmp2:=RgA+RgB;RgF:=flags[tmp2 and $FF];
if (((tmp2 xor RgA xor RgB) and $10)<>0) then begin
RgF:=(RgF or f_A);end;if (tmp2>$FF) then
begin RgF:=(RgF or f_C);end;RgA:=(tmp2 and $FF);
cz:=4;inc(RpPC);end;
$81: begin tmp2:=RgA+RgC;RgF:=flags[tmp2 and $FF];
if (((tmp2 xor RgA xor RgC) and $10)<>0) then
begin RgF:=(RgF or f_A);end;
if (tmp2>$FF) then begin RgF:=(RgF or f_C);end;
RgA:=tmp2 and $FF;cz:=4;inc(RpPC);end;
$82: begin tmp2:=RgA+RgD;RgF:=flags[tmp2 and $FF];
if (((tmp2 xor RgA xor RgD) and $10)<>0) then begin
RgF:=(RgF or f_A);end;
if (tmp2>$FF) then begin RgF:=(RgF or f_C);end;
RgA:=tmp2 and $FF;cz:=4;inc(RpPC);end;
$83: begin tmp2:=RgA+RgE;RgF:=flags[tmp2 and $FF];
if (((tmp2 xor RgA xor RgE) and $10)<>0) then begin
RgF:=(RgF or f_A);end;if (tmp2>$FF) then
begin RgF:=(RgF or f_C);end;
RgA:=tmp2 and $FF;cz:=4;inc(RpPC);end;
$84: begin tmp2:=RgA+RgH;RgF:=flags[tmp2 and $FF];
if (((tmp2 xor RgA xor RgH) and $10)<>0) then
begin RgF:=(RgF or f_A);end;
if (tmp2>$FF) then begin RgF:=(RgF or f_C);end;
RgA:=tmp2 and $FF;cz:=4;inc(RpPC);end;
$85: begin tmp2:=RgA+RgL;RgF:=flags[tmp2 and $FF];
if (((tmp2 xor RgA xor RgL) and $10)<>0) then begin
RgF:=(RgF or f_A);end;
if (tmp2>$FF) then begin RgF:=(RgF or f_C);end;
RgA:=tmp2 and $FF;cz:=4;inc(RpPC);end;
$86: begin tmp1:=do_read2(RgL,RgH);tmp2:=RgA+tmp1;RgF:=flags[tmp2 and $FF];
if (((tmp2 xor RgA xor tmp1) and $10)<>0) then begin
RgF:=(RgF or f_A);end;
if (tmp2>$FF) then begin RgF:=(RgF or f_C);end;
RgA:=tmp2 and $FF;cz:=7;inc(RpPC);end;
$87: begin tmp2:=RgA+RgA;RgF:=flags[tmp2 and $FF];
if (((tmp2 xor RgA xor RgA) and $10)<>0) then begin
RgF:=(RgF or f_A);end;
if (tmp2>$FF) then begin RgF:=(RgF or f_C);end;
RgA:=tmp2 and $FF;cz:=4;inc(RpPC);end;
$88: begin tmp2:=RgA+RgB;if ((RgF and f_C)<>0) then tmp2:=tmp2+1 else tmp2:=tmp2+0;
RgF:=flags[tmp2 and $FF];if (((tmp2 xor RgA xor RgB) and $10)<>0) then
begin RgF:=(RgF or f_A);end;
if (tmp2>$FF) then begin RgF:=(RgF or f_C);end;
RgA:=tmp2 and $FF;cz:=4;inc(RpPC);end;
$89: begin tmp2:=RgA+RgC;
if ((RgF and f_C)<>0) then tmp2:=tmp2+1 else tmp2:=tmp2+0;
RgF:=flags[tmp2 and $FF];
if (((tmp2 xor RgA xor RgC) and $10)<>0) then
begin RgF:=(RgF or f_A);end;
if (tmp2>$FF) then begin RgF:=(RgF or f_C);end;
RgA:=tmp2 and $FF;cz:=4;inc(RpPC);end;
$8A: begin tmp2:=RgA+RgD;
if ((RgF and f_C)<>0) then tmp2:=tmp2+1 else tmp2:=tmp2+0;
RgF:=flags[tmp2 and $FF];
if (((tmp2 xor RgA xor RgD) and $10)<>0) then
begin RgF:=(RgF or f_A);end;
if (tmp2>$FF) then begin RgF:=(RgF or f_C);end;
RgA:=tmp2 and $FF;cz:=4;inc(RpPC);
end;
$8B: begin tmp2:=RgA+RgE;
if ((RgF and f_C)<>0) then tmp2:=tmp2+1 else tmp2:=tmp2+0;
RgF:=flags[tmp2 and $FF];
if (((tmp2 xor RgA xor RgE) and $10)<>0) then
begin RgF:=(RgF or f_A);end;
if (tmp2>$FF) then begin RgF:=(RgF or f_C);end;
RgA:=tmp2 and $FF;cz:=4;inc(RpPC);end;
$8C: begin tmp2:=RgA+RgH;
if ((RgF and f_C)<>0) then tmp2:=tmp2+1 else tmp2:=tmp2+0;
RgF:=flags[tmp2 and $FF];if (((tmp2 xor RgA xor RgH) and $10)<>0) then
begin RgF:=(RgF or f_A);end;
if (tmp2>$FF) then begin RgF:=RgF or f_C;end;
RgA:=tmp2 and $FF;cz:=4;inc(RpPC);end;
$8D: begin tmp2:=RgA+RgL;
if ((RgF and f_C)<>0) then tmp2:=tmp2+1 else tmp2:=tmp2+0;
RgF:=flags[tmp2 and $FF];
if (((tmp2 xor RgA xor RgL) and $10)<>0) then
begin RgF:=(RgF or f_A);end;
if (tmp2>$FF) then begin RgF:=(RgF or f_C);end;
RgA:=tmp2 and $FF;cz:=4;inc(RpPC);end;
$8E: begin tmp1:=do_read2(RgL,RgH);
tmp2:=RgA+tmp1;if ((RgF and f_C)<>0) then tmp2:=tmp2+1 else tmp2:=tmp2+0;
RgF:=flags[tmp2 and $FF];
if (((tmp2 xor RgA xor tmp1) and $10)<>0) then begin RgF:=(RgF or f_A);end;
if (tmp2>$FF) then begin RgF:=(RgF or f_C);end;
RgA:=tmp2 and $FF;cz:=7;inc(RpPC);end;
$8F: begin tmp2:=RgA+RgA;
if ((RgF and f_C)<>0) then tmp2:=tmp2+1 else tmp2:=tmp2+0;
RgF:=flags[tmp2 and $FF];
if (((tmp2 xor RgA xor RgA) and $10)<>0) then
begin RgF:=(RgF or f_A);end;
if (tmp2>$FF) then begin RgF:=(RgF or f_C);end;
RgA:=tmp2 and $FF;cz:=4;inc(RpPC);end;
$90: begin tmp2:=(RgA-RgB) and $FF;RgF:=flags[tmp2];
if (RgA<RgB) then begin RgF:=(RgF or f_C);end;
if (((tmp2 xor RgA xor RgB) and $10)<>0) then begin RgF:=(RgF or f_A);end;
RgA:=tmp2;cz:=4;inc(RpPC);end;
$91: begin tmp2:=(RgA-RgC) and $FF;RgF:=flags[tmp2];
if (RgA<RgC) then begin RgF:=(RgF or f_C);end;
if (((tmp2 xor RgA xor RgC) and $10)<>0) then begin RgF:=(RgF or f_A);end;
RgA:=tmp2;cz:=4;inc(RpPC);end;
$92: begin tmp2:=(RgA-RgD) and $FF;RgF:=flags[tmp2];
if (RgA<RgD) then begin RgF:=(RgF or f_C);end;
if (((tmp2 xor RgA xor RgD) and $10)<>0) then begin RgF:=(RgF or f_A);end;
RgA:=tmp2;cz:=4;inc(RpPC);end;
$93: begin tmp2:=(RgA-RgE) and $FF;RgF:=flags[tmp2];
if (RgA<RgE) then begin RgF:=(RgF or f_C);end;
if (((tmp2 xor RgA xor RgE) and $10)<>0) then begin RgF:=(RgF or f_A);end;
RgA:=tmp2;cz:=4;inc(RpPC);end;
$94: begin tmp2:=(RgA-RgH) and $FF;RgF:=flags[tmp2];
if (RgA<RgH) then begin RgF:=(RgF or f_C);end;
if (((tmp2 xor RgA xor RgH) and $10)<>0) then begin RgF:=(RgF or f_A);end;
RgA:=tmp2;cz:=4;inc(RpPC);end;
$95: begin tmp2:=(RgA-RgL) and $FF;RgF:=flags[tmp2];
if (RgA<RgL) then begin RgF:=RgF or f_C;end;
if (((tmp2 xor RgA xor RgL) and $10)<>0) then begin RgF:=(RgF or f_A);end;
RgA:=tmp2;cz:=4;inc(RpPC);end;
$96: begin tmp1:=do_read2(RgL,RgH);tmp2:=(RgA-tmp1) and $FF;RgF:=flags[tmp2];
if (RgA<tmp1) then begin RgF:=(RgF or f_C);end;
if (((tmp2 xor RgA xor tmp1) and $10)<>0) then begin RgF:=(RgF or f_A);end;
RgA:=tmp2;cz:=7;inc(RpPC);end;
$97: begin RgF:=flags[0];RgA:=0;cz:=4;inc(RpPC);end;
$98: begin if ((RgF and f_C)<>0) then tmp3:=1 else tmp3:=0;tmp2:=(RgA-RgB-tmp3) and $FF;
RgF:=flags[tmp2];if (RgA<RgB+tmp3) then begin RgF:=(RgF or f_C);end;
if (((tmp2 xor RgA xor RgB) and $10)<>0) then begin RgF:=(RgF or f_A);end;
RgA:=tmp2;cz:=4;inc(RpPC);end;
$99: begin if ((RgF and f_C)<>0) then tmp3:=1 else tmp3:=0;tmp2:=(RgA-RgC-tmp3) and $FF;
RgF:=flags[tmp2];if (RgA<(RgC+tmp3)) then begin RgF:=(RgF or f_C);end;
if (((tmp2 xor RgA xor RgC) and $10)<>0) then begin RgF:=(RgF or f_A);end;
RgA:=tmp2;cz:=4;inc(RpPC);end;
$9A: begin if ((RgF and f_C)<>0) then tmp3:=1 else tmp3:=0;tmp2:=(RgA-RgD-tmp3) and $FF;
RgF:=flags[tmp2];if (RgA<RgD+tmp3) then begin RgF:=(RgF or f_C);end;
if (((tmp2 xor RgA xor RgD) and $10)<>0) then begin RgF:=(RgF or f_A);end;
RgA:=tmp2;cz:=4;inc(RpPC);end;
$9B: begin if ((RgF and f_C)<>0) then tmp3:=1 else tmp3:=0;tmp2:=(RgA-RgE-tmp3) and $FF;
RgF:=flags[tmp2];if (RgA<RgE+tmp3) then begin RgF:=(RgF or f_C);end;
if (((tmp2 xor RgA xor RgE) and $10)<>0) then begin RgF:=(RgF or f_A);end;
RgA:=tmp2;cz:=4;inc(RpPC);end;
$9C: begin if ((RgF and f_C)<>0) then tmp3:=1 else tmp3:=0;
tmp2:=(RgA-RgH-tmp3) and $FF;RgF:=flags[tmp2];if (RgA<RgH+tmp3) then
begin RgF:=(RgF or f_C);end;
if (((tmp2 xor RgA xor RgH) and $10)<>0) then begin RgF:=(RgF or f_A);end;
RgA:=tmp2;cz:=4;inc(RpPC);end;
$9D: begin if ((RgF and f_C)<>0) then tmp3:=1 else tmp3:=0;
tmp2:=(RgA-RgL-tmp3) and $FF;RgF:=flags[tmp2];
if (RgA<RgL+tmp3) then begin RgF:=(RgF or f_C);end;
if (((tmp2 xor RgA xor RgL) and $10)<>0) then begin
RgF:=(RgF or f_A);end;
RgA:=tmp2;cz:=4;inc(RpPC);end;
$9E: begin tmp1:=do_read2(RgL,RgH);
if ((RgF and f_C)<>0) then tmp3:=1 else tmp3:=0;
tmp2:=(RgA-tmp1-tmp3) and $FF;RgF:=flags[tmp2];
if (RgA<tmp1+tmp3) then begin RgF:=(RgF or f_C);end;
if (((tmp2 xor RgA xor tmp1) and $10)<>0) then begin
RgF:=(RgF or f_A);end;
RgA:=tmp2;cz:=7;inc(RpPC);end;
$9F: begin if ((RgF and f_C)<>0) then tmp2:=$FF else tmp2:=0;
RgF:=flags[tmp2];if (tmp2<>0) then begin RgF:=RgF or (f_A or f_C);end;
RgA:=tmp2;cz:=4;inc(RpPC);end;
$A0: begin RgA:=RgA and RgB;RgF:=flags[RgA] or (RgF and f_A);
cz:=4;inc(RpPC);end;
$A1: begin RgA:=RgA and RgC;RgF:=flags[RgA] or (RgF and f_A);
cz:=4;inc(RpPC);end;
$A2: begin RgA:=RgA and RgD;RgF:=flags[RgA] or (RgF and f_A);
cz:=4;inc(RpPC);end;
$A3: begin RgA:=RgA and RgE;RgF:=flags[RgA] or (RgF and f_A);
cz:=4;inc(RpPC);end;
$A4: begin RgA:=RgA and RgH;RgF:=flags[RgA] or (RgF and f_A);
cz:=4;inc(RpPC);end;
$A5: begin RgA:=RgA and RgL;RgF:=flags[RgA] or (RgF and f_A);
cz:=4;inc(RpPC);end;
$A6: begin tmp1:=do_read2(RgL,RgH);
RgA:=RgA and tmp1;RgF:=flags[RgA] or (RgF and f_A);
cz:=7;inc(RpPC);end;
$A7: begin RgA:=RgA and RgA;RgF:=flags[RgA] or (RgF and f_A);
cz:=4;inc(RpPC);end;
$A8: begin RgA:=RgA xor RgB;RgF:=flags[RgA] or (RgF and f_A);
cz:=4;inc(RpPC);end;
$A9: begin RgA:=RgA xor RgC;RgF:=flags[RgA] or (RgF and f_A);
cz:=4;inc(RpPC);end;
$AA: begin RgA:=RgA xor RgD;RgF:=flags[RgA] or (RgF and f_A);
cz:=4;inc(RpPC);end;
$AB: begin RgA:=RgA xor RgE;RgF:=flags[RgA] or (RgF and f_A);
cz:=4;inc(RpPC);end;
$AC: begin RgA:=RgA xor RgH;RgF:=flags[RgA] or (RgF and f_A);
cz:=4;inc(RpPC);end;
$AD: begin RgA:=RgA xor RgL;RgF:=flags[RgA] or (RgF and f_A);
cz:=4;inc(RpPC);end;
$AE: begin tmp1:=do_read2(RgL,RgH);RgA:=RgA xor tmp1;
RgF:=flags[RgA] or (RgF and f_A);cz:=7;inc(RpPC);end;
$AF: begin RgA:=0;RgF:=flags[RgA] or (RgF and f_A);
cz:=4;inc(RpPC);end;
$B0: begin RgA:=RgA or RgB;RgF:=flags[RgA] or (RgF and f_A);
cz:=4;inc(RpPC);end;
$B1: begin RgA:=RgA or RgC;RgF:=flags[RgA] or (RgF and f_A);
cz:=4;inc(RpPC);end;
$B2: begin RgA:=RgA or RgD;
RgF:=flags[RgA] or (RgF and f_A);cz:=4;
inc(RpPC);end;
$B3: begin RgA:=RgA or RgE;RgF:=flags[RgA] or (RgF and f_A);
cz:=4;inc(RpPC);end;
$B4: begin RgA:=RgA or RgH;RgF:=flags[RgA] or (RgF and f_A);
cz:=4;inc(RpPC);end;
$B5: begin RgA:=RgA or RgL;RgF:=flags[RgA] or (RgF and f_A);
cz:=4;inc(RpPC);end;
$B6: begin tmp1:=do_read2(RgL,RgH);RgA:=RgA or tmp1;
RgF:=flags[RgA] or (RgF and f_A);cz:=7;
inc(RpPC);end;
$B7: begin RgA:=RgA or RgA;RgF:=flags[RgA] or (RgF and f_A);
cz:=4;inc(RpPC);end;
$B8: begin tmp2:=(RgA-RgB) and $FF;RgF:=flags[tmp2];
if (RgA<RgB) then begin RgF:=(RgF or f_C);end;
if (((tmp2 xor RgA xor RgB) and $10)<>0) then begin RgF:=(RgF or f_A);end;
cz:=4;inc(RpPC);end;
$B9: begin tmp2:=(RgA-RgC) and $FF;RgF:=flags[tmp2];if (RgA<RgC) then
begin RgF:=(RgF or f_C);end;
if (((tmp2 xor RgA xor RgC) and $10)<>0) then begin RgF:=(RgF or f_A);end;
cz:=4;inc(RpPC);end;
$BA: begin tmp2:=(RgA-RgD) and $FF;RgF:=flags[tmp2];
if (RgA<RgD) then begin RgF:=(RgF or f_C);end;
if (((tmp2 xor RgA xor RgD) and $10)<>0) then begin RgF:=(RgF or f_A);end;
cz:=4;inc(RpPC);end;
$BB: begin tmp2:=(RgA-RgE) and $FF;RgF:=flags[tmp2];
if (RgA<RgE) then begin RgF:=(RgF or f_C);end;
if (((tmp2 xor RgA xor RgE) and $10)<>0) then begin RgF:=(RgF or f_A);end;
cz:=4;inc(RpPC);end;
$BC: begin tmp2:=(RgA-RgH) and $FF;RgF:=flags[tmp2];
if (RgA<RgH) then begin RgF:=(RgF or f_C);end;
if (((tmp2 xor RgA xor RgH) and $10)<>0) then begin RgF:=(RgF or f_A);end;
cz:=4;inc(RpPC);end;
$BD: begin tmp2:=(RgA-RgL) and $FF;RgF:=flags[tmp2];
if (RgA<RgL) then begin RgF:=(RgF or f_C);end;
if (((tmp2 xor RgA xor RgL) and $10)<>0) then begin RgF:=(RgF or f_A);end;
cz:=4;inc(RpPC);end;
$BE: begin tmp1:=do_read2(RgL,RgH);tmp2:=(RgA-tmp1) and $FF;RgF:=flags[tmp2];
if (RgA<tmp1) then begin RgF:=(RgF or f_C);end;
if (((tmp2 xor RgA xor tmp1) and $10)<>0) then begin RgF:=(RgF or f_A);end;
cz:=7;inc(RpPC);end;
$BF: begin RgF:=flags[0];cz:=4;inc(RpPC);end;
$C0: begin if ((RgF and f_Z)<>0) then begin cz:=5;inc(RpPC);end else
begin RpPC:=do_read(RpSP);RpPC:=RpPC+(do_read(RpSP+1) shl 8);RpSP:=(RpSP+2) and $FFFF;
cz:=11;end;end;
$C1: begin RgC:=do_read(RpSP);RgB:=do_read(RpSP+1);RpSP:=(RpSP+2) and $FFFF;
cz:=10;inc(RpPC);end;
$C2: begin if ((RgF and f_Z)<>0) then begin cz:=10;inc(RpPC,3);end else
begin RpPC:=do_read(RpPC+1)+((do_read(RpPC+2) shl 8));cz:=10;end;end;
$C3: begin RpPC:=do_read(RpPC+1)+((do_read(RpPC+2) shl 8));cz:=10;end;
$C4: begin if ((RgF and f_Z)<>0) then begin cz:=11;
inc(RpPC,3);end else begin tmp1:=do_read(RpPC+1)+((do_read(RpPC+2) shl 8));
RpSP:=(RpSP-2) and $FFFF;inc(RpPC,3);do_write(RpSP,RpPC and $FF);
do_write(RpSP+1,(RpPC shr 8) and $FF);RpPC:=tmp1;cz:=17;end;end;
$C5: begin RpSP:=(RpSP-2) and $FFFF;do_write(RpSP,RgC);do_write(RpSP+1,RgB);
cz:=11;inc(RpPC);end;
$C6: begin tmp1:=do_read(RpPC+1);tmp2:=RgA+tmp1;RgF:=flags[tmp2 and $FF];
if (((tmp2 xor RgA xor tmp1) and $10)<>0) then begin RgF:=RgF or f_A;end;
if (tmp2>$FF) then begin RgF:=RgF or f_C;end;
RgA:=tmp2 and $FF;cz:=7;inc(RpPC,2);end;
$C7: begin RpSP:=(RpSP-2) and $FFFF;inc(RpPC);do_write(RpSP,RpPC and $FF);
do_write(RpSP+1,(RpPC shr 8) and $FF);RpPC:=0*8;cz:=11;end;
$C8: begin if ((RgF and f_Z)=0) then begin cz:=5;inc(RpPC);
end else begin RpPC:=do_read(RpSP);RpPC:=RpPC+(do_read(RpSP+1) shl 8);
RpSP:=(RpSP+2) and $FFFF;cz:=11;end;end;
$C9: begin RpPC:=do_read(RpSP);RpPC:=RpPC+(do_read(RpSP+1) shl 8);RpSP:=(RpSP+2) and $FFFF;
cz:=11;end;
$CA: begin if ((RgF and f_Z)=0) then begin cz:=10;
inc(RpPC,3);end else begin RpPC:=do_read(RpPC+1)+(do_read(RpPC+2) shl 8);
cz:=10;end;end;
$CB: begin begin RpPC:=do_read(RpPC+1)+(do_read(RpPC+2) shl 8);
cz:=10;end;end;
$CC: begin if ((RgF and f_Z)=0) then begin cz:=11;inc(RpPC,3);end else
begin tmp1:=do_read(RpPC+1)+(do_read(RpPC+2) shl 8);RpSP:=(RpSP-2) and $FFFF;
inc(RpPC,3);do_write(RpSP,RpPC and $FF);do_write(RpSP+1,(RpPC shr 8) and $FF);
RpPC:=tmp1;cz:=17;end end;
$CD: begin tmp1:=do_read(RpPC+1)+(do_read(RpPC+2) shl 8);RpSP:=(RpSP-2) and $FFFF;
inc(RpPC,3);do_write(RpSP,RpPC and $FF);do_write(RpSP+1,(RpPC shr 8) and $FF);
RpPC:=tmp1;cz:=17;end;
$CE: begin tmp1:=do_read(RpPC+1);tmp2:=RgA+tmp1;
if ((RgF and f_C)<>0) then tmp2:=tmp2+1 else tmp2:=tmp2+0;
RgF:=flags[tmp2 and $FF];
if (((tmp2 xor RgA xor tmp1) and $10)<>0) then begin RgF:=RgF or f_A;end;
if (tmp2>$FF) then begin RgF:=RgF or f_C;end;
RgA:=tmp2 and $FF;cz:=7;inc(RpPC,2);end;
$CF: begin RpSP:=(RpSP-2) and $FFFF;inc(RpPC);
do_write(RpSP,RpPC and $FF);do_write(RpSP+1,(RpPC shr 8) and $FF);
RpPC:=1*8;cz:=11;end;
$D0: begin if ((RgF and f_C)<>0) then begin cz:=5;inc(RpPC);end else
begin RpPC:=do_read(RpSP);RpPC:=RpPC+(do_read(RpSP+1) shl 8);
RpSP:=(RpSP+2) and $FFFF;cz:=11;end end;
$D1: begin RgE:=do_read(RpSP);RgD:=do_read(RpSP+1);RpSP:=(RpSP+2) and $FFFF;
cz:=10;inc(RpPC);end;
$D2: begin if ((RgF and f_C)<>0) then begin cz:=10;
inc(RpPC,3);end else begin
RpPC:=do_read(RpPC+1)+(do_read(RpPC+2) shl 8);cz:=10;end;end;
$D3: begin do_output(do_read(RpPC+1),RgA);cz:=10;inc(RpPC,2);end;
$D4: begin if ((RgF and f_C)<>0) then begin cz:=11;inc(RpPC,3);end
else begin tmp1:=do_read(RpPC+1)+(do_read(RpPC+2) shl 8);
RpSP:=(RpSP-2) and $FFFF;inc(RpPC,3);do_write(RpSP,RpPC and $FF);
do_write(RpSP+1,(RpPC shr 8) and $FF);RpPC:=tmp1;cz:=17;end;end;
$D5: begin RpSP:=(RpSP-2) and $FFFF;do_write(RpSP,RgE);do_write(RpSP+1,RgD);
cz:=11;inc(RpPC);end;
$D6: begin tmp1:=do_read(RpPC+1);tmp2:=(RgA-tmp1) and $FF;RgF:=flags[tmp2];
if (RgA<tmp1) then begin RgF:=RgF or f_C;end;
if (((tmp2 xor RgA xor tmp1) and $10)<>0) then begin RgF:=RgF or f_A;end;
RgA:=tmp2;cz:=7;inc(RpPC,2);end;
$D7: begin RpSP:=(RpSP-2) and $FFFF;inc(RpPC);do_write(RpSP,RpPC and $FF);
do_write(RpSP+1,(RpPC shr 8) and $FF);RpPC:=2*8;cz:=11;end;
$D8: begin if ((RgF and f_C)=0) then begin cz:=5;inc(RpPC);end
else begin RpPC:=do_read(RpSP);RpPC:=RpPC+do_read(RpSP+1) shl 8;
RpSP:=(RpSP+2) and $FFFF;cz:=11;end;end;
$D9: begin begin RpPC:=do_read(RpSP);RpPC:=RpPC+do_read(RpSP+1) shl 8;
RpSP:=(RpSP+2) and $FFFF;cz:=11;end;end;
$DA: begin if ((RgF and f_C)=0) then begin cz:=10;inc(RpPC,3);end
else begin RpPC:=do_read(RpPC+1)+(do_read(RpPC+2) shl 8);cz:=10;end;end;
$DB: begin RgA:=do_input(do_read(RpPC+1));cz:=10;inc(RpPC,2);end;
$DC: begin if ((RgF and f_C)=0) then begin cz:=11;inc(RpPC,3);end
else begin tmp1:=do_read(RpPC+1)+(do_read(RpPC+2) shl 8);RpSP:=(RpSP-2) and $FFFF;
inc(RpPC,3);do_write(RpSP,RpPC and $FF);do_write(RpSP+1,(RpPC shr 8) and $FF);
RpPC:=tmp1;cz:=17;end;end;
$DD: begin begin tmp1:=do_read(RpPC+1)+(do_read(RpPC+2) shl 8);
RpSP:=(RpSP-2) and $FFFF;inc(RpPC,3);do_write(RpSP,RpPC and $FF);
do_write(RpSP+1,(RpPC shr 8) and $FF);RpPC:=tmp1;
cz:=17;end;end;
$ED: begin begin tmp1:=do_read(RpPC+1)+(do_read(RpPC+2) shl 8);
RpSP:=(RpSP-2) and $FFFF;inc(RpPC,3);
do_write(RpSP,RpPC and $FF);do_write(RpSP+1,(RpPC shr 8) and $FF);
RpPC:=tmp1;cz:=17;end;end;
$FD: begin begin tmp1:=do_read(RpPC+1)+(do_read(RpPC+2) shl 8);RpSP:=(RpSP-2) and $FFFF;
inc(RpPC,3);do_write(RpSP,RpPC and $FF);do_write(RpSP+1,(RpPC shr 8) and $FF);
RpPC:=tmp1;cz:=17;end;end;
$DE: begin tmp1:=do_read(RpPC+1);if ((RgF and f_C)<>0) then tmp3:=1 else tmp3:=0;
tmp2:=(RgA-tmp1-tmp3) and $FF;RgF:=flags[tmp2];if (RgA<tmp1+tmp3) then
begin RgF:=RgF or f_C;end;
if (((tmp2 xor RgA xor tmp1) and $10)<>0) then begin RgF:=RgF or f_A;end;
RgA:=tmp2;cz:=7;inc(RpPC,2);end;
$DF: begin RpSP:=(RpSP-2) and $FFFF;inc(RpPC); do_write(RpSP,RpPC and $FF);
do_write(RpSP+1,(RpPC shr 8) and $FF); RpPC:=3*8; cz:=11; end;
$E0: begin if ((RgF and f_P)<>0) then begin cz:=5;inc(RpPC);end
else begin RpPC:=do_read(RpSP);RpPC:=RpPC+do_read(RpSP+1) shl 8;
RpSP:=(RpSP+2) and $FFFF;cz:=11;end ;end;
$E1: begin RgL:=do_read(RpSP);RgH:=do_read(RpSP+1);RpSP:=(RpSP+2) and $FFFF;
cz:=10;inc(RpPC);end;
$E2: begin if ((RgF and f_P)<>0) then begin cz:=10; inc(RpPC,3);end else begin
RpPC:=do_read(RpPC+1)+(do_read(RpPC+2) shl 8); cz:=10;end;end;
$E3: begin tmp1:=do_read(RpSP);do_write(RpSP,RgL);RgL:=tmp1;
tmp1:=do_read(RpSP+1);do_write(RpSP+1,RgH);RgH:=tmp1;
cz:=18;inc(RpPC);end;
$E4: begin if ((RgF and f_P)<>0) then
begin cz:=11;inc(RpPC,3);end else
begin tmp1:=do_read(RpPC+1)+(do_read(RpPC+2) shl 8);
RpSP:=(RpSP-2) and $FFFF;inc(RpPC,3);do_write(RpSP,RpPC and $FF);
do_write(RpSP+1,(RpPC shr 8) and $FF);RpPC:=tmp1;cz:=17;end;end;
$E5: begin RpSP:=(RpSP-2) and $FFFF;do_write(RpSP,RgL);
do_write(RpSP+1,RgH);cz:=11;inc(RpPC);end;
$E6: begin RgA:=RgA and do_read(RpPC+1);RgF:=flags[RgA] or (RgF and f_A);
cz:=7;inc(RpPC,2);end;
$E7: begin RpSP:=(RpSP-2) and $FFFF;inc(RpPC);
do_write(RpSP,RpPC and $FF);do_write(RpSP+1,(RpPC shr 8) and $FF);
RpPC:=4*8;cz:=11;end;
$E8: begin if ((RgF and f_P)=0) then begin
cz:=5;inc(RpPC);end else begin
RpPC:=do_read(RpSP);RpPC:=RpPC+do_read(RpSP+1) shl 8;
RpSP:=(RpSP+2) and $FFFF;cz:=11;end;end;
$E9: begin RpPC:=(RgH shl 8)+RgL;cz:=5;end;
$EA: begin if ((RgF and f_P)=0) then begin cz:=10;
inc(RpPC,3);end else begin
RpPC:=do_read(RpPC+1)+(do_read(RpPC+2) shl 8);
cz:=10;end;end;
$EB: begin tmp1:=RgD;RgD:=RgH;RgH:=tmp1;
tmp1:=RgE;RgE:=RgL;RgL:=tmp1;cz:=4;
inc(RpPC);end;
$EC: begin if ((RgF and f_P)=0) then begin cz:=11;
inc(RpPC,3);end else begin
tmp1:=do_read(RpPC+1)+(do_read(RpPC+2) shl 8);
RpSP:=(RpSP-2) and $FFFF;inc(RpPC,3);
do_write(RpSP,RpPC and $FF);do_write(RpSP+1,(RpPC shr 8) and $FF);
RpPC:=tmp1;cz:=17;end;end;
$EE: begin RgA:= RgA xor do_read(RpPC+1);RgF:=flags[RgA] or (RgF and f_A);
cz:=7;inc(RpPC,2);end;
$EF: begin RpSP:=(RpSP-2) and $FFFF;inc(RpPC);
do_write(RpSP,RpPC and $FF);do_write(RpSP+1,(RpPC shr 8) and $FF);
RpPC:=5*8;cz:=11;end;
$F0: begin if ((RgF and f_S)<>0) then begin
cz:=5;inc(RpPC);end
else begin RpPC:=do_read(RpSP);RpPC:=RpPC+(do_read(RpSP+1) shl 8);
RpSP:=(RpSP+2) and $FFFF;cz:=11;end;end;
$F1: begin RgF:=do_read(RpSP);RgA:=do_read(RpSP+1);
RpSP:=(RpSP+2) and $FFFF;cz:=10;inc(RpPC);end;
$F2: begin if ((RgF and f_S)<>0) then begin
cz:=10;inc(RpPC,3);end else
begin RpPC:=do_read(RpPC+1)+(do_read(RpPC+2) shl 8);cz:=10;end;end;
$F4: begin if ((RgF and f_S)<>0) then begin cz:=11;
inc(RpPC,3);end else begin
tmp1:=do_read(RpPC+1)+(do_read(RpPC+2) shl 8);
RpSP:=(RpSP-2) and $FFFF;inc(RpPC,3);
do_write(RpSP,RpPC and $FF);do_write(RpSP+1,(RpPC shr 8) and $FF);
RpPC:=tmp1;cz:=17;end;end;
$F5: begin RpSP:=(RpSP-2) and $FFFF;do_write(RpSP,RgF);
do_write(RpSP+1,RgA);cz:=11;inc(RpPC);end;
$F6: begin RgA:=RgA or do_read(RpPC+1);RgF:=flags[RgA] or (RgF and f_A);
cz:=7;inc(RpPC,2);end;
$F7: begin RpSP:=(RpSP-2) and $FFFF;inc(RpPC);
do_write(RpSP,RpPC and $FF);do_write(RpSP+1,(RpPC shr 8) and $FF);
RpPC:=6*8;cz:=11;end;
$F8: begin if ((RgF and f_S)=0) then begin cz:=5;
inc(RpPC);end else begin
RpPC:=do_read(RpSP);RpPC:=RpPC+(do_read(RpSP+1) shl 8);
RpSP:=(RpSP+2) and $FFFF;cz:=11;end;end;
$F9: begin RpSP:=(RgH shl 8)+RgL;cz:=5;inc(RpPC);end;
$FA: begin if ((RgF and f_S)=0) then begin cz:=10;
inc(RpPC,3);end else begin RpPC:=do_read(RpPC+1)+(do_read(RpPC+2) shl 8);
cz:=10;end;end;
$FC: begin if ((RgF and f_S)=0) then begin cz:=11;
inc(RpPC,3);end else begin tmp1:=do_read(RpPC+1)+(do_read(RpPC+2) shl 8);
RpSP:=(RpSP-2) and $FFFF;inc(RpPC,3);do_write(RpSP,RpPC and $FF);
do_write(RpSP+1,(RpPC shr 8) and $FF);RpPC:=tmp1;cz:=17;
end;end;
$FE: begin tmp1:=do_read(RpPC+1);tmp2:=(RgA-tmp1) and $FF;
RgF:=flags[tmp2];if (RgA<tmp1) then begin
RgF:=RgF or f_C;end;
if (((tmp2 xor RgA xor tmp1) and $10)<>0) then begin
RgF:=RgF or f_A;end;cz:=7;inc(RpPC,2);end;
$FF: begin RpSP:=(RpSP-2) and $FFFF;
inc(RpPC);do_write(RpSP,RpPC and $FF);do_write(RpSP+1,(RpPC shr 8) and $FF);
RpPC:=7*8;cz:=11;end
end;{<=case opcode of}
cz1:=cz1+cz; CT:=CT+cz;
end;{<=while (cz1 < nb_cycles) do}
end;
{ВИВЕДЕННЯ НА ЕКРАН}
function compute_color_index(port: byte;LVcolor: Byte): LongInt;
const clBlack=$000000;clLime=$00FF00;clBlue=$FF0000;clRed=$0000FF;
clAqua=$FFFF00;clYellow=$00FFFF;clFuchsia=$FF00FF;clWhite=$FFFFFF;
const pas_clBlack=0;pas_clLime=10;pas_clBlue=9;pas_clRed=12;pas_clAqua=11;
pas_clYellow=14;pas_clFuchsia=13;pas_clWhite=15;
var Res:LongInt;
begin
Res:=clBlack;
if ((port and $40)<>0) then Res:= (Res xor clBlue);
if ((port and $20)<>0) then Res:= (Res xor clLime);
if ((port and $10)<>0) then Res:= (Res xor clRed);
case LVcolor of
0: begin
if ((port and $08)=0) then begin Res:= (Res xor clRed);end;
if ((port and $04)=0) then begin Res:= (Res xor clBlue);end;end;
1: begin Res:= (Res xor clLime);end;
2: begin Res:= (Res xor clBlue);if ((port and $01)=0) then
begin Res:= (Res xor clRed);end;end;
3: begin Res:= (Res xor clRed);
if ((port and $02)=0) then begin Res:= (Res xor clLime);end;end;end;
iF Res<$FF0000 then begin
iF Res<$00FF00 then begin
iF Res=clBlack then res:=pas_clBlack else
If Res=clRed then res:=pas_clRed else end else begin
iF Res=clLime then res:=pas_clLime else
If Res=(clLime + clRed) then res:=pas_clYellow else
end end else
begin iF Res<$FFFF00 then begin
If Res=clBlue then res:=pas_clBlue else
If Res=(clBlue + clRed) then res:=pas_clFuchsia else end else begin
If Res=(clLime + clBlue ) then res:=pas_clAqua else
If Res=(clLime + clBlue+ clRed) then res:=pas_clWhite;end;
end;compute_color_index:=res;end;
Procedure PutPixelZoom(X,Y,clr:Longint);
begin
X:=X+OffSetX;Y:=Y+OffSetY;
If (ZoomX=1) and (ZoomY=1) then uGraph.uPutPixel(X,Y,clr) else
uBar((X*ZoomX),(Y*ZoomY),(X*ZoomX)+(ZoomX-1),(Y*ZoomY)+(ZoomY-1),Clr);
end;
procedure GamecanvasCanvasPixels(vertX,gorY,portsC1,video_i:Cardinal);
Var pix:byte;
begin
begin pix:=0;if (video_i and 128)=128 then pix:=pix+1;if (video_i and 8)=8 then pix:=pix+2;
PutPixelZoom(vertX,gorY,compute_color_index(portsC1,pix));end;
begin pix:=0;if (video_i and 64)=64 then pix:=pix+1;if (video_i and 4)=4 then pix:=pix+2;
PutPixelZoom(vertX+1,gorY,compute_color_index(portsC1,pix));end;
begin pix:=0;if (video_i and 32)=32 then pix:=pix+1;if (video_i and 2)=2 then pix:=pix+2;
PutPixelZoom(vertX+2,gorY,compute_color_index(portsC1,pix));end;
begin pix:=0;if (video_i and 16)=16 then pix:=pix+1;if (video_i and 1)=1 then pix:=pix+2;
PutPixelZoom(vertX+3,gorY,compute_color_index(portsC1,pix));end;
end;
procedure drawScreen1;// "жорстка перемальовка"
var i,vertX,gorY:Cardinal;
begin i:=0;vertX:=0;gorY:=0;
{$R-} while (i<$4000) do begin
GamecanvasCanvasPixels(vertX,gorY,ports[$C1],video[i]);
vertX:=vertX+4;if vertX>=256 then begin vertX:=0;gorY:=gorY+1;end;inc(i);end;{$R+}
{$R-}for I := 0 to $4000 do VideoDirty_[i]:= video[i];{$R+}
FlagChangeC1:=0;FlagChangeVIDEO:=0;ChangeVIDEOadrMIN:=16383;ChangeVIDEOadrMAX:=0;end;
procedure drawScreen2;// "м'яка перемальовка"
var i,vertX,gorY : Cardinal;
begin i:=ChangeVIDEOadrMIN;{vertX:=0;gorY:=0;}
{$R-}while (i <=ChangeVIDEOadrMAX) do Begin
if video[i]<>VideoDirty_[i] then
begin vertX:= (i mod 64)*4;gorY:=(i div 64);
GamecanvasCanvasPixels(vertX,gorY,ports[$C1],video[i]);
VideoDirty_[i]:=video[i];
end;inc(i);end;{$R+}
FlagChangeC1:=0;FlagChangeVIDEO:=0;ChangeVIDEOadrMIN:=16383;ChangeVIDEOadrMAX:=0;end;
procedure DrawScreen;
begin
If FlagChangeC1=1 then drawScreen1 // "жорстка перемальовка"
else if FlagChangeVIDEO=1 then drawScreen2;// "м'яка перемальовка"
end;
end.Поделиться42024-09-20 11:36:13
Видалено все окрім case opcode of а також
inc(RpPC); inc(RpPC,2); inc(RpPC,3);
cz:=4;cz:=10;cz:=7;cz:=5;cz:=16;cz:=17;cz:=18;
case opcode of
$00: begin end;
$F3: begin end;
$FB: begin end;
$01: begin RgB:=do_read(RpPC+2);RgC:=do_read(RpPC+1);end;
$02: begin do_write2(RgC,RgB,RgA);end;
$03: begin RgC:=RgC+1;if (RgC>$FF) then begin RgC:=0;RgB:=RgB+1;
if (RgB>$FF) then begin RgB:=0;end;end;end;
$04: begin tmp2:=((RgB+1) and $FF);RgF:=(flags[tmp2] or (RgF and f_C));
if (((tmp2 xor RgB) and $10)<>0) then
begin RgF:=RgF or f_A;end;RgB:=tmp2;end;
$05: begin tmp2:=((RgB-1) and $FF);RgF:=(flags[tmp2] or (RgF and f_C));
if (((tmp2 xor RgB) and $10)<>0) then begin RgF:=(RgF or f_A);end;
RgB:=tmp2;end;
$06: begin RgB:=do_read(RpPC+1);end;
$07: begin RgA:=RgA SHL 1;if (RgA>$FF) then begin RgA:=RgA or 1;
RgF:=RgF or f_C;RgA:= RgA and $FF;end else
begin RgF:=(RgF and (not f_C));end;end;
$08: begin begin end;end;
$10: begin begin end;end;
$18: begin begin end;end;
$20: begin begin end;end;
$28: begin begin end;end;
$30: begin begin end;end;
$38: begin begin end;end;
$09: begin RgL:=RgL+RgC;RgH:=RgH+RgB;if (RgL>$FF) then
begin inc(RgH);RgL:=(RgL and $FF);end;if (RgH>$FF) then
begin RgH:=(RgH and $FF);RgF:=(RgF or f_C);end else
begin RgF:=(RgF and (not f_C));end;end;
$0A: begin RgA:=do_read2(RgC,RgB);end;
$0B: begin RgC:=RgC-1;if (RgC<0) then begin RgC:=$FF;RgB:=RgB-1;
if (RgB<0) then begin RgB:=$FF;end;end;
end;
$0C: begin tmp2:=((RgC+1) and $FF);RgF:=(flags[tmp2] or (RgF and f_C));
if (((tmp2 xor RgC) and $10)<>0) then begin RgF:=RgF or f_A;end;
RgC:=tmp2;end;
$0D: begin tmp2:=((RgC-1) and $FF);RgF:=flags[tmp2] or (RgF and f_C);
if (((tmp2 xor RgC) and $10)<>0) then begin RgF:=(RgF or f_A);end;
RgC:=tmp2;end;
$0E: begin RgC:=do_read(RpPC+1);end;
$0F: begin tmp1:=(RgA and 1);RgA:=(RgA shr 1);if (tmp1<>0) then
begin RgA:=(RgA or $80);RgF:=(RgF or f_C);end else
begin RgF:=(RgF and ( not f_C));end;end;
$11: begin RgD:=do_read(RpPC+2);RgE:=do_read(RpPC+1);end;
$12: begin do_write2(RgE,RgD,RgA);end;
$13: begin RgE:=RgE+1;if (RgE>$FF) then begin RgE:=0;RgD:=RgD+1;
if (RgD>$FF) then begin RgD:=0;end;end;end;
$14: begin tmp2:=((RgD+1)and $FF);RgF:=(flags[tmp2] or (RgF and f_C));
if (((tmp2 xor RgD) and $10)<>0) then begin RgF:=(RgF or f_A);end;
RgD:=tmp2;end;
$15: begin tmp2:=((RgD-1)and $FF);RgF:=(flags[tmp2] or (RgF and f_C));
if (((tmp2 xor RgD) and $10)<>0) then begin RgF:=(RgF or f_A);end;
RgD:=tmp2;end;
$16: begin RgD:=do_read(RpPC+1);end;
$17: begin RgA:=(RgA shl 1);if ((RgF and f_C)<>0) then begin RgA:=(RgA or 1);end;
if (RgA>$FF) then begin RgF:=(RgF or f_C);RgA:=(RgA and $FF);end else begin
RgF:=(RgF and (not f_C));end;end;
$19: begin RgL:=(RgL + RgE);RgH:=(RgH + RgD);if (RgL>$FF) then
begin inc(RgH);RgL:=(RgL and $FF);end;
if (RgH>$FF) then begin RgH:=(RgH and $FF);RgF:=(RgF or f_C);end else
begin RgF:=(RgF and not (f_C));end;end;
$1A: begin RgA:=do_read2(RgE,RgD);end;
$1B: begin RgE:=RgE-1;if (RgE<0) then begin RgE:=$FF;RgD:=RgD-1;
if (RgD<0) then begin RgD:=$FF;end;end;
end;
$1C: begin tmp2:=((RgE+1)and $FF);RgF:=(flags[tmp2] or (RgF and f_C));
if (((tmp2 xor RgE) and $10)<>0) then begin RgF:=(RgF or f_A);end;
RgE:=tmp2;end;
$1D: begin tmp2:=((RgE-1) and $FF);RgF:=(flags[tmp2] or (RgF and f_C));
if (((tmp2 xor RgE) and $10)<>0) then begin RgF:=(RgF or f_A);end;
RgE:=tmp2;end;
$1E: begin RgE:=do_read(RpPC+1);end;
$1F: begin tmp1:=(RgA and 1);RgA:=(RgA SHR 1);if ((RgF and f_C)<>0) then
begin RgA:=(RgA or $80);end;
if (tmp1<>0) then begin RgF:=(RgF or f_C);end else
begin RgF:=(RgF and not(f_C));end;end;
$21: begin RgH:=do_read(RpPC+2);RgL:=do_read(RpPC+1);end;
$22: begin tmp1:=do_read(RpPC+1)+(do_read(RpPC+2) shl 8);do_write(tmp1,RgL);
do_write(tmp1+1,RgH);end;
$23: begin RgL:=RgL+1;if (RgL>$FF) then begin RgL:=0;RgH:=RgH+1;
if (RgH>$FF) then begin RgH:=0;end;end;
end;
$24: begin tmp2:=((RgH+1) and $FF);RgF:=(flags[tmp2] or (RgF and f_C));
if (((tmp2 xor RgH) and $10)<>0) then begin RgF:=(RgF or f_A);end;
RgH:=tmp2;end;
$25: begin tmp2:=((RgH-1) and $FF);RgF:=(flags[tmp2] or (RgF and f_C));
if (((tmp2 xor RgH) and $10)<>0) then begin RgF:=(RgF or f_A);end;
RgH:=tmp2;end;
$26: begin RgH:=do_read(RpPC+1);end;
$27: begin tmp1:=0;if (((RgF and f_C)<>0) or (RgA>$99)) then begin
tmp1:=(tmp1 or $60);end;
if (((RgF and f_A)<>0) or ((RgA and $0F)>$09)) then begin
tmp1:=(tmp1 or $06);end;tmp2:=RgA+tmp1;RgF:=flags[tmp2 and $FF];
if (((tmp2 xor RgA xor tmp1) and $10)<>0) then begin RgF:=(RgF or f_A);end;
if (tmp2>$FF) then begin RgF:=(RgF or f_C);end;RgA:=tmp2 and $FF;
end;
$29: begin RgL:=RgL + RgL;RgH:=RgH + RgH;
if (RgL>$FF) then begin inc(RgH);RgL:=(RgL and $FF);end;
if (RgH>$FF) then begin RgH:=(RgH and $FF);RgF:=(RgF or f_C);end else begin
RgF:=(RgF and (not f_C));end;end;
$2A: begin tmp1:=do_read(RpPC+1)+(do_read(RpPC+2) shl 8);RgL:=do_read(tmp1);
RgH:=do_read(tmp1+1);end;
$2B: begin RgL:=RgL-1;if (RgL <0) then begin RgL:=$FF;
RgH:=RgH-1;if (RgH<0) then begin RgH:=$FF;end;end;
end;
$2C: begin tmp2:=((RgL+1) and $FF);RgF:=(flags[tmp2] or (RgF and f_C));
if (((tmp2 xor RgL) and $10)<>0) then begin RgF:=(RgF or f_A);end;
RgL:=tmp2;end;
$2D: begin tmp2:=((RgL-1) and $FF);RgF:=(flags[tmp2] or (RgF and f_C));
if (((tmp2 xor RgL) and $10)<>0) then begin RgF:=(RgF or f_A);end;
RgL:=tmp2;end;
$2E: begin RgL:=do_read(RpPC+1);end;
$2F: begin RgA:=(RgA xor $FF);end;
$31: begin RpSP:=(do_read(RpPC+2) shl 8)+do_read(RpPC+1);
end;
$32: begin do_write2(do_read(RpPC+1),do_read(RpPC+2),RgA);
end;
$33: begin if (RpSP=$FFFF) then begin RpSP:=0;end else
begin inc(RpSP);end;end;
$34: begin tmp1:=do_read2(RgL,RgH);tmp2:=((tmp1+1) and $FF);
RgF:=(flags[tmp2] or (RgF and f_C));if (((tmp2 xor tmp1) and $10)<>0) then
begin RgF:=(RgF or f_A);end;do_write2(RgL,RgH,tmp2);
end;
$35: begin tmp1:=do_read2(RgL,RgH);tmp2:=((tmp1-1) and $FF);RgF:=flags[tmp2] or (RgF and f_C);
if (((tmp2 xor tmp1) and $10)<>0) then begin RgF:=(RgF or f_A);end;
do_write2(RgL,RgH,tmp2);end;
$36: begin do_write2(RgL,RgH,do_read(RpPC+1));end;
$37: begin RgF:=(RgF or f_C);end;
$39: begin RgL:=(RgL + (RpSP and $FF));RgH:=(RgH + ((RpSP shr 8) and $FF));
if (RgL>$FF) then begin inc(RgH);RgL:=(RgL and $FF);end;
if (RgH>$FF) then begin RgH:=(RgH and $FF);RgF:=(RgF or f_C);
end else begin RgF:=(RgF and (not f_C));end;end;
$3A: begin RgA:=do_read2(do_read(RpPC+1),do_read(RpPC+2));
end;
$3B: begin if (RpSP<>0) then begin RpSP:=RpSP-1;end else
begin RpSP:=$FFFF;end;end;
$3C: begin tmp2:=((RgA+1) and $FF);RgF:=(flags[tmp2] or (RgF and f_C));
if (((tmp2 xor RgA) and $10)<>0) then begin RgF:=(RgF or f_A);end;
RgA:=tmp2;end;
$3D: begin tmp2:=((RgA-1) and $FF);RgF:=(flags[tmp2] or (RgF and f_C));
if (((tmp2 xor RgA) and $10)<>0) then begin RgF:=(RgF or f_A);end;
RgA:=tmp2;end;
$3E: begin RgA:=do_read(RpPC+1);end;
$3F: begin RgF:=RgF xor f_C;end;
$40: begin end;
$49: begin end;
$52: begin end;
$5B: begin end;
$64: begin end;
$6D: begin end;
$7F: begin end;
$41: begin RgB:=RgC;end;
$42: begin RgB:=RgD;end;
$43: begin RgB:=RgE;end;
$44: begin RgB:=RgH;end;
$45: begin RgB:=RgL;end;
$46: begin RgB:=do_read2(RgL,RgH);end;
$47: begin RgB:=RgA;end;
$48: begin RgC:=RgB;end;
$4A: begin RgC:=RgD;end;
$4B: begin RgC:=RgE;end;
$4C: begin RgC:=RgH;end;
$4D: begin RgC:=RgL;end;
$4E: begin RgC:=do_read2(RgL,RgH);end;
$4F: begin RgC:=RgA;end;
$50: begin RgD:=RgB;end;
$51: begin RgD:=RgC;end;
$53: begin RgD:=RgE;end;
$54: begin RgD:=RgH;end;
$55: begin RgD:=RgL;end;
$56: begin RgD:=do_read2(RgL,RgH);end;
$57: begin RgD:=RgA;end;
$58: begin RgE:=RgB;end;
$59: begin RgE:=RgC;end;
$5A: begin RgE:=RgD;end;
$5C: begin RgE:=RgH;end;
$5D: begin RgE:=RgL;end;
$5E: begin RgE:=do_read2(RgL,RgH);end;
$5F: begin RgE:=RgA;end;
$60: begin RgH:=RgB;end;
$61: begin RgH:=RgC;end;
$62: begin RgH:=RgD;end;
$63: begin RgH:=RgE;end;
$65: begin RgH:=RgL;end;
$66: begin RgH:=do_read2(RgL,RgH);end;
$67: begin RgH:=RgA;end;
$68: begin RgL:=RgB;end;
$69: begin RgL:=RgC;end;
$6A: begin RgL:=RgD;end;
$6B: begin RgL:=RgE;end;
$6C: begin RgL:=RgH;end;
$6E: begin RgL:=do_read2(RgL,RgH);end;
$6F: begin RgL:=RgA;end;
$70: begin do_write2(RgL,RgH,RgB);end;
$71: begin do_write2(RgL,RgH,RgC);end;
$72: begin do_write2(RgL,RgH,RgD);end;
$73: begin do_write2(RgL,RgH,RgE);end;
$74: begin do_write2(RgL,RgH,RgH);end;
$75: begin do_write2(RgL,RgH,RgL);end;
$76: begin end;
$77: begin do_write2(RgL,RgH,RgA);end;
$78: begin RgA:=RgB;end;
$79: begin RgA:=RgC;end;
$7A: begin RgA:=RgD;end;
$7B: begin RgA:=RgE;end;
$7C: begin RgA:=RgH;end;
$7D: begin RgA:=RgL;end;
$7E: begin RgA:=do_read2(RgL,RgH);end;
$80: begin tmp2:=RgA+RgB;RgF:=flags[tmp2 and $FF];
if (((tmp2 xor RgA xor RgB) and $10)<>0) then begin
RgF:=(RgF or f_A);end;if (tmp2>$FF) then
begin RgF:=(RgF or f_C);end;RgA:=(tmp2 and $FF);
end;
$81: begin tmp2:=RgA+RgC;RgF:=flags[tmp2 and $FF];
if (((tmp2 xor RgA xor RgC) and $10)<>0) then
begin RgF:=(RgF or f_A);end;
if (tmp2>$FF) then begin RgF:=(RgF or f_C);end;
RgA:=tmp2 and $FF;end;
$82: begin tmp2:=RgA+RgD;RgF:=flags[tmp2 and $FF];
if (((tmp2 xor RgA xor RgD) and $10)<>0) then begin
RgF:=(RgF or f_A);end;
if (tmp2>$FF) then begin RgF:=(RgF or f_C);end;
RgA:=tmp2 and $FF;end;
$83: begin tmp2:=RgA+RgE;RgF:=flags[tmp2 and $FF];
if (((tmp2 xor RgA xor RgE) and $10)<>0) then begin
RgF:=(RgF or f_A);end;if (tmp2>$FF) then
begin RgF:=(RgF or f_C);end;
RgA:=tmp2 and $FF;end;
$84: begin tmp2:=RgA+RgH;RgF:=flags[tmp2 and $FF];
if (((tmp2 xor RgA xor RgH) and $10)<>0) then
begin RgF:=(RgF or f_A);end;
if (tmp2>$FF) then begin RgF:=(RgF or f_C);end;
RgA:=tmp2 and $FF;end;
$85: begin tmp2:=RgA+RgL;RgF:=flags[tmp2 and $FF];
if (((tmp2 xor RgA xor RgL) and $10)<>0) then begin
RgF:=(RgF or f_A);end;
if (tmp2>$FF) then begin RgF:=(RgF or f_C);end;
RgA:=tmp2 and $FF;end;
$86: begin tmp1:=do_read2(RgL,RgH);tmp2:=RgA+tmp1;RgF:=flags[tmp2 and $FF];
if (((tmp2 xor RgA xor tmp1) and $10)<>0) then begin
RgF:=(RgF or f_A);end;
if (tmp2>$FF) then begin RgF:=(RgF or f_C);end;
RgA:=tmp2 and $FF;end;
$87: begin tmp2:=RgA+RgA;RgF:=flags[tmp2 and $FF];
if (((tmp2 xor RgA xor RgA) and $10)<>0) then begin
RgF:=(RgF or f_A);end;
if (tmp2>$FF) then begin RgF:=(RgF or f_C);end;
RgA:=tmp2 and $FF;end;
$88: begin tmp2:=RgA+RgB;if ((RgF and f_C)<>0) then tmp2:=tmp2+1 else tmp2:=tmp2+0;
RgF:=flags[tmp2 and $FF];if (((tmp2 xor RgA xor RgB) and $10)<>0) then
begin RgF:=(RgF or f_A);end;
if (tmp2>$FF) then begin RgF:=(RgF or f_C);end;
RgA:=tmp2 and $FF;end;
$89: begin tmp2:=RgA+RgC;
if ((RgF and f_C)<>0) then tmp2:=tmp2+1 else tmp2:=tmp2+0;
RgF:=flags[tmp2 and $FF];
if (((tmp2 xor RgA xor RgC) and $10)<>0) then
begin RgF:=(RgF or f_A);end;
if (tmp2>$FF) then begin RgF:=(RgF or f_C);end;
RgA:=tmp2 and $FF;end;
$8A: begin tmp2:=RgA+RgD;
if ((RgF and f_C)<>0) then tmp2:=tmp2+1 else tmp2:=tmp2+0;
RgF:=flags[tmp2 and $FF];
if (((tmp2 xor RgA xor RgD) and $10)<>0) then
begin RgF:=(RgF or f_A);end;
if (tmp2>$FF) then begin RgF:=(RgF or f_C);end;
RgA:=tmp2 and $FF;
end;
$8B: begin tmp2:=RgA+RgE;
if ((RgF and f_C)<>0) then tmp2:=tmp2+1 else tmp2:=tmp2+0;
RgF:=flags[tmp2 and $FF];
if (((tmp2 xor RgA xor RgE) and $10)<>0) then
begin RgF:=(RgF or f_A);end;
if (tmp2>$FF) then begin RgF:=(RgF or f_C);end;
RgA:=tmp2 and $FF;end;
$8C: begin tmp2:=RgA+RgH;
if ((RgF and f_C)<>0) then tmp2:=tmp2+1 else tmp2:=tmp2+0;
RgF:=flags[tmp2 and $FF];if (((tmp2 xor RgA xor RgH) and $10)<>0) then
begin RgF:=(RgF or f_A);end;
if (tmp2>$FF) then begin RgF:=RgF or f_C;end;
RgA:=tmp2 and $FF;end;
$8D: begin tmp2:=RgA+RgL;
if ((RgF and f_C)<>0) then tmp2:=tmp2+1 else tmp2:=tmp2+0;
RgF:=flags[tmp2 and $FF];
if (((tmp2 xor RgA xor RgL) and $10)<>0) then
begin RgF:=(RgF or f_A);end;
if (tmp2>$FF) then begin RgF:=(RgF or f_C);end;
RgA:=tmp2 and $FF;end;
$8E: begin tmp1:=do_read2(RgL,RgH);
tmp2:=RgA+tmp1;if ((RgF and f_C)<>0) then tmp2:=tmp2+1 else tmp2:=tmp2+0;
RgF:=flags[tmp2 and $FF];
if (((tmp2 xor RgA xor tmp1) and $10)<>0) then begin RgF:=(RgF or f_A);end;
if (tmp2>$FF) then begin RgF:=(RgF or f_C);end;
RgA:=tmp2 and $FF;end;
$8F: begin tmp2:=RgA+RgA;
if ((RgF and f_C)<>0) then tmp2:=tmp2+1 else tmp2:=tmp2+0;
RgF:=flags[tmp2 and $FF];
if (((tmp2 xor RgA xor RgA) and $10)<>0) then
begin RgF:=(RgF or f_A);end;
if (tmp2>$FF) then begin RgF:=(RgF or f_C);end;
RgA:=tmp2 and $FF;end;
$90: begin tmp2:=(RgA-RgB) and $FF;RgF:=flags[tmp2];
if (RgA<RgB) then begin RgF:=(RgF or f_C);end;
if (((tmp2 xor RgA xor RgB) and $10)<>0) then begin RgF:=(RgF or f_A);end;
RgA:=tmp2;end;
$91: begin tmp2:=(RgA-RgC) and $FF;RgF:=flags[tmp2];
if (RgA<RgC) then begin RgF:=(RgF or f_C);end;
if (((tmp2 xor RgA xor RgC) and $10)<>0) then begin RgF:=(RgF or f_A);end;
RgA:=tmp2;end;
$92: begin tmp2:=(RgA-RgD) and $FF;RgF:=flags[tmp2];
if (RgA<RgD) then begin RgF:=(RgF or f_C);end;
if (((tmp2 xor RgA xor RgD) and $10)<>0) then begin RgF:=(RgF or f_A);end;
RgA:=tmp2;end;
$93: begin tmp2:=(RgA-RgE) and $FF;RgF:=flags[tmp2];
if (RgA<RgE) then begin RgF:=(RgF or f_C);end;
if (((tmp2 xor RgA xor RgE) and $10)<>0) then begin RgF:=(RgF or f_A);end;
RgA:=tmp2;end;
$94: begin tmp2:=(RgA-RgH) and $FF;RgF:=flags[tmp2];
if (RgA<RgH) then begin RgF:=(RgF or f_C);end;
if (((tmp2 xor RgA xor RgH) and $10)<>0) then begin RgF:=(RgF or f_A);end;
RgA:=tmp2;end;
$95: begin tmp2:=(RgA-RgL) and $FF;RgF:=flags[tmp2];
if (RgA<RgL) then begin RgF:=RgF or f_C;end;
if (((tmp2 xor RgA xor RgL) and $10)<>0) then begin RgF:=(RgF or f_A);end;
RgA:=tmp2;end;
$96: begin tmp1:=do_read2(RgL,RgH);tmp2:=(RgA-tmp1) and $FF;RgF:=flags[tmp2];
if (RgA<tmp1) then begin RgF:=(RgF or f_C);end;
if (((tmp2 xor RgA xor tmp1) and $10)<>0) then begin RgF:=(RgF or f_A);end;
RgA:=tmp2;end;
$97: begin RgF:=flags[0];RgA:=0;end;
$98: begin if ((RgF and f_C)<>0) then tmp3:=1 else tmp3:=0;tmp2:=(RgA-RgB-tmp3) and $FF;
RgF:=flags[tmp2];if (RgA<RgB+tmp3) then begin RgF:=(RgF or f_C);end;
if (((tmp2 xor RgA xor RgB) and $10)<>0) then begin RgF:=(RgF or f_A);end;
RgA:=tmp2;end;
$99: begin if ((RgF and f_C)<>0) then tmp3:=1 else tmp3:=0;tmp2:=(RgA-RgC-tmp3) and $FF;
RgF:=flags[tmp2];if (RgA<(RgC+tmp3)) then begin RgF:=(RgF or f_C);end;
if (((tmp2 xor RgA xor RgC) and $10)<>0) then begin RgF:=(RgF or f_A);end;
RgA:=tmp2;end;
$9A: begin if ((RgF and f_C)<>0) then tmp3:=1 else tmp3:=0;tmp2:=(RgA-RgD-tmp3) and $FF;
RgF:=flags[tmp2];if (RgA<RgD+tmp3) then begin RgF:=(RgF or f_C);end;
if (((tmp2 xor RgA xor RgD) and $10)<>0) then begin RgF:=(RgF or f_A);end;
RgA:=tmp2;end;
$9B: begin if ((RgF and f_C)<>0) then tmp3:=1 else tmp3:=0;tmp2:=(RgA-RgE-tmp3) and $FF;
RgF:=flags[tmp2];if (RgA<RgE+tmp3) then begin RgF:=(RgF or f_C);end;
if (((tmp2 xor RgA xor RgE) and $10)<>0) then begin RgF:=(RgF or f_A);end;
RgA:=tmp2;end;
$9C: begin if ((RgF and f_C)<>0) then tmp3:=1 else tmp3:=0;
tmp2:=(RgA-RgH-tmp3) and $FF;RgF:=flags[tmp2];if (RgA<RgH+tmp3) then
begin RgF:=(RgF or f_C);end;
if (((tmp2 xor RgA xor RgH) and $10)<>0) then begin RgF:=(RgF or f_A);end;
RgA:=tmp2;end;
$9D: begin if ((RgF and f_C)<>0) then tmp3:=1 else tmp3:=0;
tmp2:=(RgA-RgL-tmp3) and $FF;RgF:=flags[tmp2];
if (RgA<RgL+tmp3) then begin RgF:=(RgF or f_C);end;
if (((tmp2 xor RgA xor RgL) and $10)<>0) then begin
RgF:=(RgF or f_A);end;
RgA:=tmp2;end;
$9E: begin tmp1:=do_read2(RgL,RgH);
if ((RgF and f_C)<>0) then tmp3:=1 else tmp3:=0;
tmp2:=(RgA-tmp1-tmp3) and $FF;RgF:=flags[tmp2];
if (RgA<tmp1+tmp3) then begin RgF:=(RgF or f_C);end;
if (((tmp2 xor RgA xor tmp1) and $10)<>0) then begin
RgF:=(RgF or f_A);end;
RgA:=tmp2;end;
$9F: begin if ((RgF and f_C)<>0) then tmp2:=$FF else tmp2:=0;
RgF:=flags[tmp2];if (tmp2<>0) then begin RgF:=RgF or (f_A or f_C);end;
RgA:=tmp2;end;
$A0: begin RgA:=RgA and RgB;RgF:=flags[RgA] or (RgF and f_A);
end;
$A1: begin RgA:=RgA and RgC;RgF:=flags[RgA] or (RgF and f_A);
end;
$A2: begin RgA:=RgA and RgD;RgF:=flags[RgA] or (RgF and f_A);
end;
$A3: begin RgA:=RgA and RgE;RgF:=flags[RgA] or (RgF and f_A);
end;
$A4: begin RgA:=RgA and RgH;RgF:=flags[RgA] or (RgF and f_A);
end;
$A5: begin RgA:=RgA and RgL;RgF:=flags[RgA] or (RgF and f_A);
end;
$A6: begin tmp1:=do_read2(RgL,RgH);
RgA:=RgA and tmp1;RgF:=flags[RgA] or (RgF and f_A);
end;
$A7: begin RgA:=RgA and RgA;RgF:=flags[RgA] or (RgF and f_A);
end;
$A8: begin RgA:=RgA xor RgB;RgF:=flags[RgA] or (RgF and f_A);
end;
$A9: begin RgA:=RgA xor RgC;RgF:=flags[RgA] or (RgF and f_A);
end;
$AA: begin RgA:=RgA xor RgD;RgF:=flags[RgA] or (RgF and f_A);
end;
$AB: begin RgA:=RgA xor RgE;RgF:=flags[RgA] or (RgF and f_A);
end;
$AC: begin RgA:=RgA xor RgH;RgF:=flags[RgA] or (RgF and f_A);
end;
$AD: begin RgA:=RgA xor RgL;RgF:=flags[RgA] or (RgF and f_A);
end;
$AE: begin tmp1:=do_read2(RgL,RgH);RgA:=RgA xor tmp1;
RgF:=flags[RgA] or (RgF and f_A);end;
$AF: begin RgA:=0;RgF:=flags[RgA] or (RgF and f_A);
end;
$B0: begin RgA:=RgA or RgB;RgF:=flags[RgA] or (RgF and f_A);
end;
$B1: begin RgA:=RgA or RgC;RgF:=flags[RgA] or (RgF and f_A);
end;
$B2: begin RgA:=RgA or RgD;
RgF:=flags[RgA] or (RgF and f_A);
end;
$B3: begin RgA:=RgA or RgE;RgF:=flags[RgA] or (RgF and f_A);
end;
$B4: begin RgA:=RgA or RgH;RgF:=flags[RgA] or (RgF and f_A);
end;
$B5: begin RgA:=RgA or RgL;RgF:=flags[RgA] or (RgF and f_A);
end;
$B6: begin tmp1:=do_read2(RgL,RgH);RgA:=RgA or tmp1;
RgF:=flags[RgA] or (RgF and f_A);
end;
$B7: begin RgA:=RgA or RgA;RgF:=flags[RgA] or (RgF and f_A);
end;
$B8: begin tmp2:=(RgA-RgB) and $FF;RgF:=flags[tmp2];
if (RgA<RgB) then begin RgF:=(RgF or f_C);end;
if (((tmp2 xor RgA xor RgB) and $10)<>0) then begin RgF:=(RgF or f_A);end;
end;
$B9: begin tmp2:=(RgA-RgC) and $FF;RgF:=flags[tmp2];if (RgA<RgC) then
begin RgF:=(RgF or f_C);end;
if (((tmp2 xor RgA xor RgC) and $10)<>0) then begin RgF:=(RgF or f_A);end;
end;
$BA: begin tmp2:=(RgA-RgD) and $FF;RgF:=flags[tmp2];
if (RgA<RgD) then begin RgF:=(RgF or f_C);end;
if (((tmp2 xor RgA xor RgD) and $10)<>0) then begin RgF:=(RgF or f_A);end;
end;
$BB: begin tmp2:=(RgA-RgE) and $FF;RgF:=flags[tmp2];
if (RgA<RgE) then begin RgF:=(RgF or f_C);end;
if (((tmp2 xor RgA xor RgE) and $10)<>0) then begin RgF:=(RgF or f_A);end;
end;
$BC: begin tmp2:=(RgA-RgH) and $FF;RgF:=flags[tmp2];
if (RgA<RgH) then begin RgF:=(RgF or f_C);end;
if (((tmp2 xor RgA xor RgH) and $10)<>0) then begin RgF:=(RgF or f_A);end;
end;
$BD: begin tmp2:=(RgA-RgL) and $FF;RgF:=flags[tmp2];
if (RgA<RgL) then begin RgF:=(RgF or f_C);end;
if (((tmp2 xor RgA xor RgL) and $10)<>0) then begin RgF:=(RgF or f_A);end;
end;
$BE: begin tmp1:=do_read2(RgL,RgH);tmp2:=(RgA-tmp1) and $FF;RgF:=flags[tmp2];
if (RgA<tmp1) then begin RgF:=(RgF or f_C);end;
if (((tmp2 xor RgA xor tmp1) and $10)<>0) then begin RgF:=(RgF or f_A);end;
end;
$BF: begin RgF:=flags[0];end;
$C0: begin if ((RgF and f_Z)<>0) then begin end else
begin RpPC:=do_read(RpSP);RpPC:=RpPC+(do_read(RpSP+1) shl 8);RpSP:=(RpSP+2) and $FFFF;
end;end;
$C1: begin RgC:=do_read(RpSP);RgB:=do_read(RpSP+1);RpSP:=(RpSP+2) and $FFFF;
end;
$C2: begin if ((RgF and f_Z)<>0) then begin end else
begin RpPC:=do_read(RpPC+1)+((do_read(RpPC+2) shl 8));end;end;
$C3: begin RpPC:=do_read(RpPC+1)+((do_read(RpPC+2) shl 8));end;
$C4: begin if ((RgF and f_Z)<>0) then begin
end else begin tmp1:=do_read(RpPC+1)+((do_read(RpPC+2) shl 8));
RpSP:=(RpSP-2) and $FFFF;do_write(RpSP,RpPC and $FF);
do_write(RpSP+1,(RpPC shr 8) and $FF);RpPC:=tmp1;end;end;
$C5: begin RpSP:=(RpSP-2) and $FFFF;do_write(RpSP,RgC);do_write(RpSP+1,RgB);
end;
$C6: begin tmp1:=do_read(RpPC+1);tmp2:=RgA+tmp1;RgF:=flags[tmp2 and $FF];
if (((tmp2 xor RgA xor tmp1) and $10)<>0) then begin RgF:=RgF or f_A;end;
if (tmp2>$FF) then begin RgF:=RgF or f_C;end;
RgA:=tmp2 and $FF;end;
$C7: begin RpSP:=(RpSP-2) and $FFFF;do_write(RpSP,RpPC and $FF);
do_write(RpSP+1,(RpPC shr 8) and $FF);RpPC:=0*8;end;
$C8: begin if ((RgF and f_Z)=0) then begin
end else begin RpPC:=do_read(RpSP);RpPC:=RpPC+(do_read(RpSP+1) shl 8);
RpSP:=(RpSP+2) and $FFFF;end;end;
$C9: begin RpPC:=do_read(RpSP);RpPC:=RpPC+(do_read(RpSP+1) shl 8);RpSP:=(RpSP+2) and $FFFF;
end;
$CA: begin if ((RgF and f_Z)=0) then begin
end else begin RpPC:=do_read(RpPC+1)+(do_read(RpPC+2) shl 8);
end;end;
$CB: begin begin RpPC:=do_read(RpPC+1)+(do_read(RpPC+2) shl 8);
end;end;
$CC: begin if ((RgF and f_Z)=0) then begin end else
begin tmp1:=do_read(RpPC+1)+(do_read(RpPC+2) shl 8);RpSP:=(RpSP-2) and $FFFF;
do_write(RpSP,RpPC and $FF);do_write(RpSP+1,(RpPC shr 8) and $FF);
RpPC:=tmp1;end end;
$CD: begin tmp1:=do_read(RpPC+1)+(do_read(RpPC+2) shl 8);RpSP:=(RpSP-2) and $FFFF;
do_write(RpSP,RpPC and $FF);do_write(RpSP+1,(RpPC shr 8) and $FF);
RpPC:=tmp1;end;
$CE: begin tmp1:=do_read(RpPC+1);tmp2:=RgA+tmp1;
if ((RgF and f_C)<>0) then tmp2:=tmp2+1 else tmp2:=tmp2+0;
RgF:=flags[tmp2 and $FF];
if (((tmp2 xor RgA xor tmp1) and $10)<>0) then begin RgF:=RgF or f_A;end;
if (tmp2>$FF) then begin RgF:=RgF or f_C;end;
RgA:=tmp2 and $FF;end;
$CF: begin RpSP:=(RpSP-2) and $FFFF;
do_write(RpSP,RpPC and $FF);do_write(RpSP+1,(RpPC shr 8) and $FF);
RpPC:=1*8;end;
$D0: begin if ((RgF and f_C)<>0) then begin end else
begin RpPC:=do_read(RpSP);RpPC:=RpPC+(do_read(RpSP+1) shl 8);
RpSP:=(RpSP+2) and $FFFF;end end;
$D1: begin RgE:=do_read(RpSP);RgD:=do_read(RpSP+1);RpSP:=(RpSP+2) and $FFFF;
end;
$D2: begin if ((RgF and f_C)<>0) then begin
end else begin
RpPC:=do_read(RpPC+1)+(do_read(RpPC+2) shl 8);end;end;
$D3: begin do_output(do_read(RpPC+1),RgA);end;
$D4: begin if ((RgF and f_C)<>0) then begin end
else begin tmp1:=do_read(RpPC+1)+(do_read(RpPC+2) shl 8);
RpSP:=(RpSP-2) and $FFFF;do_write(RpSP,RpPC and $FF);
do_write(RpSP+1,(RpPC shr 8) and $FF);RpPC:=tmp1;end;end;
$D5: begin RpSP:=(RpSP-2) and $FFFF;do_write(RpSP,RgE);do_write(RpSP+1,RgD);
end;
$D6: begin tmp1:=do_read(RpPC+1);tmp2:=(RgA-tmp1) and $FF;RgF:=flags[tmp2];
if (RgA<tmp1) then begin RgF:=RgF or f_C;end;
if (((tmp2 xor RgA xor tmp1) and $10)<>0) then begin RgF:=RgF or f_A;end;
RgA:=tmp2;end;
$D7: begin RpSP:=(RpSP-2) and $FFFF;do_write(RpSP,RpPC and $FF);
do_write(RpSP+1,(RpPC shr 8) and $FF);RpPC:=2*8;end;
$D8: begin if ((RgF and f_C)=0) then begin end
else begin RpPC:=do_read(RpSP);RpPC:=RpPC+do_read(RpSP+1) shl 8;
RpSP:=(RpSP+2) and $FFFF;end;end;
$D9: begin begin RpPC:=do_read(RpSP);RpPC:=RpPC+do_read(RpSP+1) shl 8;
RpSP:=(RpSP+2) and $FFFF;end;end;
$DA: begin if ((RgF and f_C)=0) then begin end
else begin RpPC:=do_read(RpPC+1)+(do_read(RpPC+2) shl 8);end;end;
$DB: begin RgA:=do_input(do_read(RpPC+1));end;
$DC: begin if ((RgF and f_C)=0) then begin end
else begin tmp1:=do_read(RpPC+1)+(do_read(RpPC+2) shl 8);RpSP:=(RpSP-2) and $FFFF;
do_write(RpSP,RpPC and $FF);do_write(RpSP+1,(RpPC shr 8) and $FF);
RpPC:=tmp1;end;end;
$DD: begin begin tmp1:=do_read(RpPC+1)+(do_read(RpPC+2) shl 8);
RpSP:=(RpSP-2) and $FFFF;do_write(RpSP,RpPC and $FF);
do_write(RpSP+1,(RpPC shr 8) and $FF);RpPC:=tmp1;
end;end;
$ED: begin begin tmp1:=do_read(RpPC+1)+(do_read(RpPC+2) shl 8);
RpSP:=(RpSP-2) and $FFFF;
do_write(RpSP,RpPC and $FF);do_write(RpSP+1,(RpPC shr 8) and $FF);
RpPC:=tmp1;end;end;
$FD: begin begin tmp1:=do_read(RpPC+1)+(do_read(RpPC+2) shl 8);RpSP:=(RpSP-2) and $FFFF;
do_write(RpSP,RpPC and $FF);do_write(RpSP+1,(RpPC shr 8) and $FF);
RpPC:=tmp1;end;end;
$DE: begin tmp1:=do_read(RpPC+1);if ((RgF and f_C)<>0) then tmp3:=1 else tmp3:=0;
tmp2:=(RgA-tmp1-tmp3) and $FF;RgF:=flags[tmp2];if (RgA<tmp1+tmp3) then
begin RgF:=RgF or f_C;end;
if (((tmp2 xor RgA xor tmp1) and $10)<>0) then begin RgF:=RgF or f_A;end;
RgA:=tmp2;end;
$DF: begin RpSP:=(RpSP-2) and $FFFF; do_write(RpSP,RpPC and $FF);
do_write(RpSP+1,(RpPC shr 8) and $FF); RpPC:=3*8; end;
$E0: begin if ((RgF and f_P)<>0) then begin end
else begin RpPC:=do_read(RpSP);RpPC:=RpPC+do_read(RpSP+1) shl 8;
RpSP:=(RpSP+2) and $FFFF;end ;end;
$E1: begin RgL:=do_read(RpSP);RgH:=do_read(RpSP+1);RpSP:=(RpSP+2) and $FFFF;
end;
$E2: begin if ((RgF and f_P)<>0) then begin end else begin
RpPC:=do_read(RpPC+1)+(do_read(RpPC+2) shl 8); end;end;
$E3: begin tmp1:=do_read(RpSP);do_write(RpSP,RgL);RgL:=tmp1;
tmp1:=do_read(RpSP+1);do_write(RpSP+1,RgH);RgH:=tmp1;
end;
$E4: begin if ((RgF and f_P)<>0) then
begin end else
begin tmp1:=do_read(RpPC+1)+(do_read(RpPC+2) shl 8);
RpSP:=(RpSP-2) and $FFFF;do_write(RpSP,RpPC and $FF);
do_write(RpSP+1,(RpPC shr 8) and $FF);RpPC:=tmp1;end;end;
$E5: begin RpSP:=(RpSP-2) and $FFFF;do_write(RpSP,RgL);
do_write(RpSP+1,RgH);end;
$E6: begin RgA:=RgA and do_read(RpPC+1);RgF:=flags[RgA] or (RgF and f_A);
end;
$E7: begin RpSP:=(RpSP-2) and $FFFF;
do_write(RpSP,RpPC and $FF);do_write(RpSP+1,(RpPC shr 8) and $FF);
RpPC:=4*8;end;
$E8: begin if ((RgF and f_P)=0) then begin
end else begin
RpPC:=do_read(RpSP);RpPC:=RpPC+do_read(RpSP+1) shl 8;
RpSP:=(RpSP+2) and $FFFF;end;end;
$E9: begin RpPC:=(RgH shl 8)+RgL;end;
$EA: begin if ((RgF and f_P)=0) then begin
end else begin
RpPC:=do_read(RpPC+1)+(do_read(RpPC+2) shl 8);
end;end;
$EB: begin tmp1:=RgD;RgD:=RgH;RgH:=tmp1;
tmp1:=RgE;RgE:=RgL;RgL:=tmp1;
end;
$EC: begin if ((RgF and f_P)=0) then begin
end else begin
tmp1:=do_read(RpPC+1)+(do_read(RpPC+2) shl 8);
RpSP:=(RpSP-2) and $FFFF;
do_write(RpSP,RpPC and $FF);do_write(RpSP+1,(RpPC shr 8) and $FF);
RpPC:=tmp1;end;end;
$EE: begin RgA:= RgA xor do_read(RpPC+1);RgF:=flags[RgA] or (RgF and f_A);
end;
$EF: begin RpSP:=(RpSP-2) and $FFFF;
do_write(RpSP,RpPC and $FF);do_write(RpSP+1,(RpPC shr 8) and $FF);
RpPC:=5*8;end;
$F0: begin if ((RgF and f_S)<>0) then begin
end
else begin RpPC:=do_read(RpSP);RpPC:=RpPC+(do_read(RpSP+1) shl 8);
RpSP:=(RpSP+2) and $FFFF;end;end;
$F1: begin RgF:=do_read(RpSP);RgA:=do_read(RpSP+1);
RpSP:=(RpSP+2) and $FFFF;end;
$F2: begin if ((RgF and f_S)<>0) then begin
end else
begin RpPC:=do_read(RpPC+1)+(do_read(RpPC+2) shl 8);end;end;
$F4: begin if ((RgF and f_S)<>0) then begin
end else begin
tmp1:=do_read(RpPC+1)+(do_read(RpPC+2) shl 8);
RpSP:=(RpSP-2) and $FFFF;
do_write(RpSP,RpPC and $FF);do_write(RpSP+1,(RpPC shr 8) and $FF);
RpPC:=tmp1;end;end;
$F5: begin RpSP:=(RpSP-2) and $FFFF;do_write(RpSP,RgF);
do_write(RpSP+1,RgA);end;
$F6: begin RgA:=RgA or do_read(RpPC+1);RgF:=flags[RgA] or (RgF and f_A);
end;
$F7: begin RpSP:=(RpSP-2) and $FFFF;
do_write(RpSP,RpPC and $FF);do_write(RpSP+1,(RpPC shr 8) and $FF);
RpPC:=6*8;end;
$F8: begin if ((RgF and f_S)=0) then begin
end else begin
RpPC:=do_read(RpSP);RpPC:=RpPC+(do_read(RpSP+1) shl 8);
RpSP:=(RpSP+2) and $FFFF;end;end;
$F9: begin RpSP:=(RgH shl 8)+RgL;end;
$FA: begin if ((RgF and f_S)=0) then begin
end else begin RpPC:=do_read(RpPC+1)+(do_read(RpPC+2) shl 8);
end;end;
$FC: begin if ((RgF and f_S)=0) then begin
end else begin tmp1:=do_read(RpPC+1)+(do_read(RpPC+2) shl 8);
RpSP:=(RpSP-2) and $FFFF;do_write(RpSP,RpPC and $FF);
do_write(RpSP+1,(RpPC shr 8) and $FF);RpPC:=tmp1;
end;end;
$FE: begin tmp1:=do_read(RpPC+1);tmp2:=(RgA-tmp1) and $FF;
RgF:=flags[tmp2];if (RgA<tmp1) then begin
RgF:=RgF or f_C;end;
if (((tmp2 xor RgA xor tmp1) and $10)<>0) then begin
RgF:=RgF or f_A;end;end;
$FF: begin RpSP:=(RpSP-2) and $FFFF;
do_write(RpSP,RpPC and $FF);do_write(RpSP+1,(RpPC shr 8) and $FF);
RpPC:=7*8;end
end;{<=case opcode of}
cz1:=cz1+cz; CT:=CT+cz;
end;{<=while (cz1 < nb_cycles) do}
end;
Поделиться52024-09-20 12:00:46
Видалено все окрім case opcode of а також
inc(RpPC); inc(RpPC,2); inc(RpPC,3);
cz:=4;cz:=10;cz:=7;cz:=5;cz:=16;cz:=17;cz:=18;
сортування по камандах
'do_read2(RgL,RgH);' замінено на 'RgM;'
'do_write2(RgL,RgH,' замінено на 'RgM:=('
const f_S=128;f_Z=64;f_5=32;f_A=16;f_3=8;f_P=4;f_1=2;f_C=1;
const flags: array [0..256]of Byte=(
70,2,2,6,2,6,6,2,2,6,6,2,6,2,2,6,2,6,6,2,6,2,2,6,6,2,2,6,2,6,6,2,2,6,6,2,6,2,2,
6,6,2,2,6,2,6,6,2,6,2,2,6,2,6,6,2,2,6,6,2,6,2,2,6,2,6,6,2,6,2,2,6,6,2,2,6,2,6,6,
2,6,2,2,6,2,6,6,2,2,6,6,2,6,2,2,6,6,2,2,6,2,6,6,2,2,6,6,2,6,2,2,6,2,6,6,2,6,2,2,
6,6,2,2,6,2,6,6,2,130,134,134,130,134,130,130,134,134,130,130,134,130,134,134,130,
134,130,130,134,130,134,134,130,130,134,134,130,134,130,130,134,134,130,130,134,130,
134,134,130,130,134,134,130,134,130,130,134,130,134,134,130,134,130,130,134,134,130,
130,134,130,134,134,130,134,130,130,134,130,134,134,130,130,134,134,130,134,130,130,
134,130,134,134,130,134,130,130,134,134,130,130,134,130,134,134,130,130,134,134,130,
134,130,130,134,134,130,130,134,130,134,134,130,134,130,130,134,130,134,134,130,130,
134,134,130,134,130,130,134,0);
заміна 'RgF:=(RgF or f_A);' на '{уст fА}' - установка флагу A,
A - also called AC,Auxiliary Carry flag = додатковий перенос, 4 біт
заміна 'RgF:=(RgF or f_C);' на '{уст fC}' - установка флагу C,
C - Carry flag = призник переносу/займу, 0 біт
{NOP} $00, $08, $10, $18, $20, $28, $30, $38
{MOV}
$40, $49, $52, $5B, $64, $6D, $7F- пусто
$41:RgB:=RgC; $42:RgB:=RgD; $43:RgB:=RgE; $44:RgB:=RgH; $45:RgB:=RgL;
$46:RgB:=RgM; $47:RgB:=RgA;
$48:RgC:=RgB; $4A:RgC:=RgD; $4B:RgC:=RgE; $4C:RgC:=RgH; $4D:RgC:=RgL;
$4E:RgC:=RgM; $4F:RgC:=RgA;
$50:RgD:=RgB; $51:RgD:=RgC; $53:RgD:=RgE; $54:RgD:=RgH; $55:RgD:=RgL;
$56:RgD:=RgM; $57:RgD:=RgA;
$58:RgE:=RgB; $59:RgE:=RgC; $5A:RgE:=RgD; $5C:RgE:=RgH; $5D:RgE:=RgL;
$5E:RgE:=RgM; $5F:RgE:=RgA;
$60:RgH:=RgB; $61:RgH:=RgC; $62:RgH:=RgD; $63:RgH:=RgE; $65:RgH:=RgL;
$66:RgH:=RgM; $67:RgH:=RgA;
$68:RgL:=RgB; $69:RgL:=RgC; $6A:RgL:=RgD; $6B:RgL:=RgE; $6C:RgL:=RgH;
$6E:RgL:=RgM; $6F:RgL:=RgA;
$70:RgM:=RgB; $71:RgM:=RgC; $72:RgM:=RgD; $73:RgM:=RgE; $74:RgM:=RgH;
$75:RgM:=RgL; $76:{Стоп процесор} $77:RgM:=RgA;
$78:RgA:=RgB; $79:RgA:=RgC; $7A:RgA:=RgD; $7B:RgA:=RgE; $7C:RgA:=RgH;
$7D:RgA:=RgL; $7E:RgA:=RgM;
{MVI}
$06: RgB:=do_read(RpPC+1);
$0E: RgC:=do_read(RpPC+1);
$16: RgD:=do_read(RpPC+1);
$1E: RgE:=do_read(RpPC+1);
$26: RgH:=do_read(RpPC+1);
$2E: RgL:=do_read(RpPC+1);
$36: RgM:=(do_read(RpPC+1));
$3E: RgA:=do_read(RpPC+1);
{STA}$32: begin do_write2(do_read(RpPC+1),do_read(RpPC+2),RgA); end;
{LDA}$3A: begin RgA:=do_read2(do_read(RpPC+1),do_read(RpPC+2)); end;
{STAX B}$02: begin do_write2(RgC,RgB,RgA);end;
{STAX D}$12: begin do_write2(RgE,RgD,RgA);end;
{LDAX B} $0A: begin RgA:=do_read2(RgC,RgB);end;
{LDAX D}$1A: begin RgA:=do_read2(RgE,RgD);end;
Поделиться62024-09-20 12:14:34
{INR}
$04:tmp2:=((RgB+1) and $FF);RgF:=(flags[tmp2] or (RgF and f_C));
if (((tmp2 xor RgB) and $10)<>0) then {уст fА} RgB:=tmp2;
$0C:tmp2:=((RgC+1) and $FF);RgF:=(flags[tmp2] or (RgF and f_C));
if (((tmp2 xor RgC) and $10)<>0) then {уст fА} RgC:=tmp2;
$14:tmp2:=((RgD+1)and $FF);RgF:=(flags[tmp2] or (RgF and f_C));
if (((tmp2 xor RgD) and $10)<>0) then {уст fА} RgD:=tmp2;
$1C:tmp2:=((RgE+1)and $FF);RgF:=(flags[tmp2] or (RgF and f_C));
if (((tmp2 xor RgE) and $10)<>0) then {уст fА} RgE:=tmp2;
$24:tmp2:=((RgH+1) and $FF);RgF:=(flags[tmp2] or (RgF and f_C));
if (((tmp2 xor RgH) and $10)<>0) then {уст fА} RgH:=tmp2;
$2C:tmp2:=((RgL+1) and $FF);RgF:=(flags[tmp2] or (RgF and f_C));
if (((tmp2 xor RgL) and $10)<>0) then begin {уст fА} RgL:=tmp2;
$34:tmp1:=RgM;
tmp2:=((tmp1+1) and $FF); RgF:=(flags[tmp2] or (RgF and f_C));
if (((tmp2 xor tmp1) and $10)<>0) then {уст fА} RgM:=tmp2;
$3C: tmp2:=((RgA+1) and $FF);RgF:=(flags[tmp2] or (RgF and f_C));
if (((tmp2 xor RgA) and $10)<>0) then {уст fА} RgA:=tmp2;
{ADD}
$80:tmp2:=RgA+RgB;RgF:=flags[tmp2 and $FF];
if (((tmp2 xor RgA xor RgB) and $10)<>0) then {уст fА}
if (tmp2>$FF) then {уст fC}
RgA:=(tmp2 and $FF);
$81:tmp2:=RgA+RgC;RgF:=flags[tmp2 and $FF];
if (((tmp2 xor RgA xor RgC) and $10)<>0) then {уст fА}
if (tmp2>$FF) then {уст fC}
RgA:=tmp2 and $FF;
$82:tmp2:=RgA+RgD;RgF:=flags[tmp2 and $FF];
if (((tmp2 xor RgA xor RgD) and $10)<>0) then {уст fА}
if (tmp2>$FF) then {уст fC}
RgA:=tmp2 and $FF;
$83:tmp2:=RgA+RgE;RgF:=flags[tmp2 and $FF];
if (((tmp2 xor RgA xor RgE) and $10)<>0) then {уст fА}
if (tmp2>$FF) then {уст fC}
RgA:=tmp2 and $FF;
$84:tmp2:=RgA+RgH;RgF:=flags[tmp2 and $FF];
if (((tmp2 xor RgA xor RgH) and $10)<>0) then {уст fА}
if (tmp2>$FF) then {уст fC}
RgA:=tmp2 and $FF;
$85:tmp2:=RgA+RgL;RgF:=flags[tmp2 and $FF];
if (((tmp2 xor RgA xor RgL) and $10)<>0) then {уст fА}
if (tmp2>$FF) then {уст fC}
RgA:=tmp2 and $FF;
$86:tmp2:=RgA+RgM;RgF:=flags[tmp2 and $FF];
if (((tmp2 xor RgA xor RgM) and $10)<>0) then {уст fА}
if (tmp2>$FF) then {уст fC}
RgA:=tmp2 and $FF;
$87:tmp2:=RgA+RgA;RgF:=flags[tmp2 and $FF];
if (((tmp2 xor RgA xor RgA) and $10)<>0) then {уст fА}
if (tmp2>$FF) then {уст fC}
RgA:=tmp2 and $FF;
{ADI} $C6: begin tmp1:=do_read(RpPC+1);tmp2:=RgA+tmp1;RgF:=flags[tmp2 and $FF];
if (((tmp2 xor RgA xor tmp1) and $10)<>0) then begin RgF:=RgF or f_A;end;
if (tmp2>$FF) then begin RgF:=RgF or f_C;end;
RgA:=tmp2 and $FF;end;
Поделиться72024-09-20 13:31:09
{ADC}
$88: tmp2:=RgA+RgB;
if ((RgF and f_C)<>0) then tmp2:=tmp2+1
RgF:=flags[tmp2 and $FF];
if (((tmp2 xor RgA xor RgB) and $10)<>0) then {уст fА}
if (tmp2>$FF) then {уст fC}
RgA:=tmp2 and $FF;
$89: tmp2:=RgA+RgC;
if ((RgF and f_C)<>0) then tmp2:=tmp2+1
RgF:=flags[tmp2 and $FF];
if (((tmp2 xor RgA xor RgC) and $10)<>0) then {уст fА}
if (tmp2>$FF) then {уст fC}
RgA:=tmp2 and $FF;
$8A: tmp2:=RgA+RgD;
if ((RgF and f_C)<>0) then tmp2:=tmp2+1
RgF:=flags[tmp2 and $FF];
if (((tmp2 xor RgA xor RgD) and $10)<>0) then {уст fА}
if (tmp2>$FF) then {уст fC}
RgA:=tmp2 and $FF;
$8B: tmp2:=RgA+RgE;
if ((RgF and f_C)<>0) then tmp2:=tmp2+1
RgF:=flags[tmp2 and $FF];
if (((tmp2 xor RgA xor RgE) and $10)<>0) then {уст fА}
if (tmp2>$FF) then {уст fC}
RgA:=tmp2 and $FF;
$8C: tmp2:=RgA+RgH;
if ((RgF and f_C)<>0) then tmp2:=tmp2+1
RgF:=flags[tmp2 and $FF];
if (((tmp2 xor RgA xor RgH) and $10)<>0) then {уст fА}
if (tmp2>$FF) then {уст fC}
RgA:=tmp2 and $FF;
$8D: begin tmp2:=RgA+RgL;
if ((RgF and f_C)<>0) then tmp2:=tmp2+1
RgF:=flags[tmp2 and $FF];
if (((tmp2 xor RgA xor RgL) and $10)<>0) then {уст fА}
if (tmp2>$FF) then {уст fC}
RgA:=tmp2 and $FF;
$8E:
tmp2:=RgA+RgM;if ((RgF and f_C)<>0) then tmp2:=tmp2+1
RgF:=flags[tmp2 and $FF];
if (((tmp2 xor RgA xor RgM) and $10)<>0) then {уст fА}
if (tmp2>$FF) then {уст fC}
RgA:=tmp2 and $FF;
$8F: begin tmp2:=RgA+RgA;
if ((RgF and f_C)<>0) then tmp2:=tmp2+1
RgF:=flags[tmp2 and $FF];
if (((tmp2 xor RgA xor RgA) and $10)<>0) then {уст fА}
if (tmp2>$FF) then {уст fC}
RgA:=tmp2 and $FF;
{ACI} $CE: begin tmp1:=do_read(RpPC+1);tmp2:=RgA+tmp1;
if ((RgF and f_C)<>0) then tmp2:=tmp2+1 else tmp2:=tmp2+0;
RgF:=flags[tmp2 and $FF];
if (((tmp2 xor RgA xor tmp1) and $10)<>0) then begin RgF:=RgF or f_A;end;
if (tmp2>$FF) then begin RgF:=RgF or f_C;end;
RgA:=tmp2 and $FF;end;
Поделиться82024-09-20 13:51:19
{SUB}
$90:
tmp2:=(RgA-RgB) and $FF;RgF:=flags[tmp2];
if (RgA<RgB) then {уст fC}
if (((tmp2 xor RgA xor RgB) and $10)<>0) then {уст fА}
RgA:=tmp2;
$91:
tmp2:=(RgA-RgC) and $FF;RgF:=flags[tmp2];
if (RgA<RgC) then {уст fC}
if (((tmp2 xor RgA xor RgC) and $10)<>0) then {уст fА}
RgA:=tmp2;
$92:
tmp2:=(RgA-RgD) and $FF;RgF:=flags[tmp2];
if (RgA<RgD) then {уст fC}
if (((tmp2 xor RgA xor RgD) and $10)<>0) then {уст fА}
RgA:=tmp2;
$93:
tmp2:=(RgA-RgE) and $FF;RgF:=flags[tmp2];
if (RgA<RgE) then {уст fC}
if (((tmp2 xor RgA xor RgE) and $10)<>0) then {уст fА}
RgA:=tmp2;
$94:
tmp2:=(RgA-RgH) and $FF;RgF:=flags[tmp2];
if (RgA<RgH) then {уст fC}
if (((tmp2 xor RgA xor RgH) and $10)<>0) then {уст fА}
RgA:=tmp2;
$95:
tmp2:=(RgA-RgL) and $FF;RgF:=flags[tmp2];
if (RgA<RgL) then {уст fC}
if (((tmp2 xor RgA xor RgL) and $10)<>0) then {уст fА}
RgA:=tmp2;
$96:
tmp1:=RgM;tmp2:=(RgA-tmp1) and $FF;RgF:=flags[tmp2];
if (RgA<tmp1) then {уст fC}
if (((tmp2 xor RgA xor tmp1) and $10)<>0) then {уст fА}
RgA:=tmp2;
$97:
RgF:=flags[0];RgA:=0;
{SUI}$D6: begin tmp1:=do_read(RpPC+1);tmp2:=(RgA-tmp1) and $FF;RgF:=flags[tmp2];
if (RgA<tmp1) then begin RgF:=RgF or f_C;end;
if (((tmp2 xor RgA xor tmp1) and $10)<>0) then begin RgF:=RgF or f_A;end;
RgA:=tmp2;end;
Поделиться92024-09-20 14:08:08
{SBB}
$98:
if ((RgF and f_C)<>0) then tmp3:=1 else tmp3:=0;
tmp2:=(RgA-RgB-tmp3) and $FF;
RgF:=flags[tmp2];
if (RgA<RgB+tmp3) then {уст fC}
if (((tmp2 xor RgA xor RgB) and $10)<>0) then {уст fА}
RgA:=tmp2;
$99:
if ((RgF and f_C)<>0) then tmp3:=1 else tmp3:=0;
tmp2:=(RgA-RgC-tmp3) and $FF;
RgF:=flags[tmp2];
if (RgA<(RgC+tmp3)) then {уст fC}
if (((tmp2 xor RgA xor RgC) and $10)<>0) then {уст fА}
RgA:=tmp2;
$9A:
if ((RgF and f_C)<>0) then tmp3:=1 else tmp3:=0;
tmp2:=(RgA-RgD-tmp3) and $FF;
RgF:=flags[tmp2];
if (RgA<RgD+tmp3) then {уст fC}
if (((tmp2 xor RgA xor RgD) and $10)<>0) then {уст fА}
RgA:=tmp2;
$9B:
if ((RgF and f_C)<>0) then tmp3:=1 else tmp3:=0;
tmp2:=(RgA-RgE-tmp3) and $FF;
RgF:=flags[tmp2];
if (RgA<RgE+tmp3) then {уст fC}
if (((tmp2 xor RgA xor RgE) and $10)<>0) then {уст fА}
RgA:=tmp2;
$9C:
if ((RgF and f_C)<>0) then tmp3:=1 else tmp3:=0;
tmp2:=(RgA-RgH-tmp3) and $FF;
RgF:=flags[tmp2];
if (RgA<RgH+tmp3) then {уст fC}
if (((tmp2 xor RgA xor RgH) and $10)<>0) then {уст fА}
RgA:=tmp2;
$9D:
if ((RgF and f_C)<>0) then tmp3:=1 else tmp3:=0;
tmp2:=(RgA-RgL-tmp3) and $FF;
RgF:=flags[tmp2];
if (RgA<RgL+tmp3) then {уст fC}
if (((tmp2 xor RgA xor RgL) and $10)<>0) then {уст fА}
RgA:=tmp2;
$9E:
if ((RgF and f_C)<>0) then tmp3:=1 else tmp3:=0;
tmp2:=(RgA-RgM-tmp3) and $FF;RgF:=flags[tmp2];
if (RgA<RgM+tmp3) then {уст fC}
if (((tmp2 xor RgA xor RgM) and $10)<>0) then {уст fА}
RgA:=tmp2;
$9F:
if ((RgF and f_C)<>0) then tmp2:=$FF else tmp2:=0;
RgF:=flags[tmp2];
if (tmp2<>0) then begin RgF:=RgF or (f_A or f_C);
RgA:=tmp2;
{SBI}$DE: begin tmp1:=do_read(RpPC+1);if ((RgF and f_C)<>0) then tmp3:=1 else tmp3:=0;
tmp2:=(RgA-tmp1-tmp3) and $FF;RgF:=flags[tmp2];if (RgA<tmp1+tmp3) then
begin RgF:=RgF or f_C;end;
if (((tmp2 xor RgA xor tmp1) and $10)<>0) then begin RgF:=RgF or f_A;end;
RgA:=tmp2;end;
Поделиться102024-09-20 14:11:09
{ANA}
$A0: RgA:=RgA and RgB;RgF:=flags[RgA] or (RgF and f_A);
$A1: RgA:=RgA and RgC;RgF:=flags[RgA] or (RgF and f_A);
$A2: RgA:=RgA and RgD;RgF:=flags[RgA] or (RgF and f_A);
$A3: RgA:=RgA and RgE;RgF:=flags[RgA] or (RgF and f_A);
$A4: RgA:=RgA and RgH;RgF:=flags[RgA] or (RgF and f_A);
$A5: RgA:=RgA and RgL;RgF:=flags[RgA] or (RgF and f_A);
$A6: RgA:=RgA and RgM;RgF:=flags[RgA] or (RgF and f_A);
$A7: RgA:=RgA and RgA;RgF:=flags[RgA] or (RgF and f_A);
{ANI}$E6: begin RgA:=RgA and do_read(RpPC+1);RgF:=flags[RgA] or (RgF and f_A); end;
Поделиться112024-09-20 14:13:08
{XRA}
$A8:RgA:=RgA xor RgB;RgF:=flags[RgA] or (RgF and f_A);
$A9:RgA:=RgA xor RgC;RgF:=flags[RgA] or (RgF and f_A);
$AA:RgA:=RgA xor RgD;RgF:=flags[RgA] or (RgF and f_A);
$AB:RgA:=RgA xor RgE;RgF:=flags[RgA] or (RgF and f_A);
$AC:RgA:=RgA xor RgH;RgF:=flags[RgA] or (RgF and f_A);
$AD:RgA:=RgA xor RgL;RgF:=flags[RgA] or (RgF and f_A);
$AE:RgA:=RgA xor RgM;RgF:=flags[RgA] or (RgF and f_A);
$AF:RgA:=0;RgF:=flags[RgA] or (RgF and f_A);
{XRI}$EE: begin RgA:= RgA xor do_read(RpPC+1);RgF:=flags[RgA] or (RgF and f_A); end;
Поделиться122024-09-20 14:15:34
{ORA}
$B0:RgA:=RgA or RgB;RgF:=flags[RgA] or (RgF and f_A);
$B1:RgA:=RgA or RgC;RgF:=flags[RgA] or (RgF and f_A);
$B2:RgA:=RgA or RgD;RgF:=flags[RgA] or (RgF and f_A);
$B3:RgA:=RgA or RgE;RgF:=flags[RgA] or (RgF and f_A);
$B4:RgA:=RgA or RgH;RgF:=flags[RgA] or (RgF and f_A);
$B5:RgA:=RgA or RgL;RgF:=flags[RgA] or (RgF and f_A);
$B6:RgA:=RgA or RgM;RgF:=flags[RgA] or (RgF and f_A);
$B7:RgA:=RgA or RgA;RgF:=flags[RgA] or (RgF and f_A);
{ORI} $F6: begin RgA:=RgA or do_read(RpPC+1);RgF:=flags[RgA] or (RgF and f_A); end;
Поделиться132024-09-20 14:22:08
{CMP}
$B8:
tmp2:=(RgA-RgB) and $FF;
RgF:=flags[tmp2];
if (RgA<RgB) then {уст fC}
if (((tmp2 xor RgA xor RgB) and $10)<>0) then {уст fА}
$B9:
tmp2:=(RgA-RgC) and $FF;
RgF:=flags[tmp2];
if (RgA<RgC) then {уст fC}
if (((tmp2 xor RgA xor RgC) and $10)<>0) then {уст fА}
$BA:
tmp2:=(RgA-RgD) and $FF;
RgF:=flags[tmp2];
if (RgA<RgD) then {уст fC}
if (((tmp2 xor RgA xor RgD) and $10)<>0) then {уст fА}
$BB:
tmp2:=(RgA-RgE) and $FF;
RgF:=flags[tmp2];
if (RgA<RgE) then {уст fC}
if (((tmp2 xor RgA xor RgE) and $10)<>0) then {уст fА}
$BC:
tmp2:=(RgA-RgH) and $FF;
RgF:=flags[tmp2];
if (RgA<RgH) then {уст fC}
if (((tmp2 xor RgA xor RgH) and $10)<>0) then {уст fА}
$BD:
tmp2:=(RgA-RgL) and $FF;
RgF:=flags[tmp2];
if (RgA<RgL) then {уст fC}
if (((tmp2 xor RgA xor RgL) and $10)<>0) then {уст fА}
$BE:
tmp1:=RgM;tmp2:=(RgA-tmp1) and $FF;
RgF:=flags[tmp2];
if (RgA<tmp1) then {уст fC}
if (((tmp2 xor RgA xor tmp1) and $10)<>0) then {уст fА}
$BF: RgF:=flags[0];
{CPI} $FE: begin tmp1:=do_read(RpPC+1);tmp2:=(RgA-tmp1) and $FF;
RgF:=flags[tmp2];if (RgA<tmp1) then begin
RgF:=RgF or f_C;end;
if (((tmp2 xor RgA xor tmp1) and $10)<>0) then begin
RgF:=RgF or f_A;end;end;
{RLC}$07: begin RgA:=RgA SHL 1;if (RgA>$FF) then begin RgA:=RgA or 1;
RgF:=RgF or f_C;RgA:= RgA and $FF;end else
begin RgF:=(RgF and (not f_C));end;end;
{RRC}$0F: begin tmp1:=(RgA and 1);RgA:=(RgA shr 1);if (tmp1<>0) then
begin RgA:=(RgA or $80);{уст fC}end else
begin RgF:=(RgF and ( not f_C));end;end;
{RLC}$17: begin RgA:=(RgA shl 1);if ((RgF and f_C)<>0) then begin RgA:=(RgA or 1);end;
if (RgA>$FF) then begin {уст fC}RgA:=(RgA and $FF);end else begin
RgF:=(RgF and (not f_C));end;end;
{RAR}$1F: begin tmp1:=(RgA and 1);RgA:=(RgA SHR 1);if ((RgF and f_C)<>0) then
begin RgA:=(RgA or $80);end;
if (tmp1<>0) then begin {уст fC}end else
begin RgF:=(RgF and not(f_C));end;end;
{DAA}$27: begin tmp1:=0;if (((RgF and f_C)<>0) or (RgA>$99)) then begin
tmp1:=(tmp1 or $60);end;
if (((RgF and f_A)<>0) or ((RgA and $0F)>$09)) then begin
tmp1:=(tmp1 or $06);end;tmp2:=RgA+tmp1;RgF:=flags[tmp2 and $FF];
if (((tmp2 xor RgA xor tmp1) and $10)<>0) then begin {уст fА}end;
if (tmp2>$FF) then begin {уст fC}end;RgA:=tmp2 and $FF; end;
{CMA}$2F: begin RgA:=(RgA xor $FF);end;
{STC}$37: begin {уст fC}end;
{CMC}$3F: begin RgF:=RgF xor f_C;end;
Поделиться142024-09-21 11:07:27
{LXI}
$01: RgB:=do_read(RpPC+2);RgC:=do_read(RpPC+1);
$11: RgD:=do_read(RpPC+2);RgE:=do_read(RpPC+1);
$21: RgH:=do_read(RpPC+2);RgL:=do_read(RpPC+1);
$31: RpSP:=(do_read(RpPC+2) shl 8)+do_read(RpPC+1);
{SHLD}$22: begin tmp1:=do_read(RpPC+1)+(do_read(RpPC+2) shl 8);do_write(tmp1,RgL);
do_write(tmp1+1,RgH);end;
{LHLD}$2A: begin tmp1:=do_read(RpPC+1)+(do_read(RpPC+2) shl 8);RgL:=do_read(tmp1);
RgH:=do_read(tmp1+1);end;
Поделиться152024-09-21 11:13:55
{INX}
$03: RgC:=RgC+1;if (RgC>$FF) then begin RgC:=0;RgB:=RgB+1;if (RgB>$FF) then RgB:=0;end;
$13: RgE:=RgE+1;if (RgE>$FF) then begin RgE:=0;RgD:=RgD+1;if (RgD>$FF) then RgD:=0;end;
$23: RgL:=RgL+1;if (RgL>$FF) then begin RgL:=0;RgH:=RgH+1;if (RgH>$FF) then RgH:=0;end;
$33: if (RpSP=$FFFF) then RpSP:=0 else inc(RpSP);
Поделиться172024-09-21 11:35:16
{DCX}
$05: tmp2:=((RgB-1) and $FF);RgF:=(flags[tmp2] or (RgF and f_C));
if (((tmp2 xor RgB) and $10)<>0) then {уст fА} RgB:=tmp2;
$0D: tmp2:=((RgC-1) and $FF);RgF:=flags[tmp2] or (RgF and f_C);
if (((tmp2 xor RgC) and $10)<>0) then {уст fА} RgC:=tmp2;
$15: tmp2:=((RgD-1)and $FF);RgF:=(flags[tmp2] or (RgF and f_C));
if (((tmp2 xor RgD) and $10)<>0) then {уст fА} RgD:=tmp2;
$1D: tmp2:=((RgE-1) and $FF);RgF:=(flags[tmp2] or (RgF and f_C));
if (((tmp2 xor RgE) and $10)<>0) then {уст fА} RgE:=tmp2;
$25: tmp2:=((RgH-1) and $FF);RgF:=(flags[tmp2] or (RgF and f_C));
if (((tmp2 xor RgH) and $10)<>0) then {уст fА} RgH:=tmp2;
$2D: tmp2:=((RgL-1) and $FF);RgF:=(flags[tmp2] or (RgF and f_C));
if (((tmp2 xor RgL) and $10)<>0) then {уст fА} RgL:=tmp2;
$35: tmp1:=RgM;tmp2:=((tmp1-1) and $FF);RgF:=flags[tmp2] or (RgF and f_C);
if (((tmp2 xor tmp1) and $10)<>0) then {уст fА} RgM:=(tmp2);
$3D: tmp2:=((RgA-1) and $FF);RgF:=(flags[tmp2] or (RgF and f_C));
if (((tmp2 xor RgA) and $10)<>0) then {уст fА} RgA:=tmp2;
Поделиться192024-09-21 11:54:06
{DAD}
$09:RgL:=RgL+RgC;RgH:=RgH+RgB;if (RgL>$FF) then begin inc(RgH);RgL:=(RgL and $FF);end;
if (RgH>$FF) then begin RgH:=(RgH and $FF);{уст fC}end else RgF:=(RgF and (not f_C));
$19:RgL:=RgL+RgE;RgH:=RgH+RgD;if (RgL>$FF) then begin inc(RgH);RgL:=(RgL and $FF);end;
if (RgH>$FF) then begin RgH:=(RgH and $FF);{уст fC}end else RgF:=(RgF and not (f_C));
$29:RgL:=RgL+RgL;RgH:=RgH+RgH;if (RgL>$FF) then begin inc(RgH);RgL:=(RgL and $FF);end;
if (RgH>$FF) then begin RgH:=(RgH and $FF);{уст fC}end else RgF:=(RgF and (not f_C));
$39:RgL:=(RgL+(RpSP and $FF));RgH:=(RgH +((RpSP shr 8) and $FF)); if (RgL>$FF) then begin inc(RgH);RgL:=(RgL and $FF);end;
if (RgH>$FF) then begin RgH:=(RgH and $FF);{уст fC} end else RgF:=(RgF and (not f_C));
Поделиться202024-09-21 11:56:20
{DCX}
$0B: RgC:=RgC-1;if (RgC<0) then begin RgC:=$FF;RgB:=RgB-1; if (RgB<0) then RgB:=$FF;end;
$1B: RgE:=RgE-1;if (RgE<0) then begin RgE:=$FF;RgD:=RgD-1; if (RgD<0) then RgD:=$FF;end;
$2B: RgL:=RgL-1;if (RgL <0) then begin RgL:=$FF; RgH:=RgH-1;if (RgH<0) then RgH:=$FF;end;
$3B: if (RpSP<>0) then begin RpSP:=RpSP-1;end else RpSP:=$FFFF;
Поделиться212024-09-21 12:01:16
{XTHL}$E3: begin tmp1:=do_read(RpSP);do_write(RpSP,RgL);RgL:=tmp1;
tmp1:=do_read(RpSP+1);do_write(RpSP+1,RgH);RgH:=tmp1; end;
{PCHL}$E9: begin RpPC:=(RgH shl 8)+RgL;end;
{XCHG} $EB: begin tmp1:=RgD;RgD:=RgH;RgH:=tmp1; tmp1:=RgE;RgE:=RgL;RgL:=tmp1; end;
{SPHL} $F9: begin RpSP:=(RgH shl 8)+RgL;end;
Поделиться222024-09-21 12:44:27
{PUSH}
$C5: RpSP:=(RpSP-2) and $FFFF;do_write(RpSP,RgC);do_write(RpSP+1,RgB);
$D5: RpSP:=(RpSP-2) and $FFFF;do_write(RpSP,RgE);do_write(RpSP+1,RgD);
$E5: RpSP:=(RpSP-2) and $FFFF;do_write(RpSP,RgL);do_write(RpSP+1,RgH);
$F5: RpSP:=(RpSP-2) and $FFFF;do_write(RpSP,RgF);do_write(RpSP+1,RgA);
{POP}
$C1:RgC:=do_read(RpSP);RgB:=do_read(RpSP+1);RpSP:=(RpSP+2) and $FFFF;
$D1:RgE:=do_read(RpSP);RgD:=do_read(RpSP+1);RpSP:=(RpSP+2) and $FFFF;
$E1:RgL:=do_read(RpSP);RgH:=do_read(RpSP+1);RpSP:=(RpSP+2) and $FFFF;
$F1:RgF:=do_read(RpSP);RgA:=do_read(RpSP+1);RpSP:=(RpSP+2) and $FFFF;
Поделиться232024-09-21 12:47:06
{JMP} $C3,$CB: begin RpPC:=do_read(RpPC+1)+((do_read(RpPC+2) shl 8));end;
{JNZ,GotoUnNot0}$C2: begin if ((RgF and f_Z)<>0) then else {JMP}
{JZ,GotoUn0}$CA:if ((RgF and f_Z)=0) then else {JMP}
{JNC,GotoUnNotZaem}$D2: if ((RgF and f_C)<>0) then else {JMP}
{JC,GotoUnZaem}$DA:if ((RgF and f_C)=0) then else {JMP}
{JPO,GotoUnNotChet}$E2:if ((RgF and f_P)<>0) then else {JMP}
{JPE,GotoUnChet}$EA:if ((RgF and f_P)=0) then else {JMP}
{JP,GotoUnPlus}$F2:if ((RgF and f_S)<>0) then else {JMP}
{JM,GotoUnMinus}$FA:if ((RgF and f_S)=0) then else {JMP}
{RET}{POP PC}$C9,$ D9:RpPC:=do_read(RpSP);RpPC:=RpPC+(do_read(RpSP+1) shl 8);RpSP:=(RpSP+2) and $FFFF;
{RNZ,RetUnNot0}$C0:if ((RgF and f_Z)<>0) then else {RET}
{RZ,RetUn0}$C8:if ((RgF and f_Z)=0) then else {RET}
{RNC,RetUnNotZaem}$D0: if ((RgF and f_C)<>0) then else {RET}
{RC,RetUnZaem}$D8:if ((RgF and f_C)=0) then else {RET}
{RPO,RetUnNotChet}$E0:if ((RgF and f_P)<>0) then else {RET}
{RPE,RetUnChet}$E8:if ((RgF and f_P)=0) then else {RET}
{RP,RetUnPlus}$F0:if ((RgF and f_S)<>0) then else {RET}
{RM,RetUnMinus}$F8:if ((RgF and f_S)=0) then else {RET}
Поделиться252024-09-21 13:21:16
{Push PC} RpSP:=(RpSP-2) and $FFFF; do_write(RpSP,RpPC and $FF);do_write(RpSP+1,(RpPC shr 8) and $FF);
{Call}$CD, $DD, $ED, $FD: begin tmp1:=do_read(RpPC+1)+(do_read(RpPC+2) shl 8);
{Push PC} RpPC:=tmp1;end;
{CNZ,CallUnNot0}$C4: begin if ((RgF and f_Z)<>0) then begin end else {Call}
{CZ,CallUn0}$CC:if ((RgF and f_Z)=0) then else {Call}
{CNC,CallUnNotZaem}$D4: if ((RgF and f_C)<>0) then else {Call}
{CC,CallUnZaem}$DC:if ((RgF and f_C)=0) then else {Call}
{CPO,CallUnNotChet}$E4:if ((RgF and f_P)<>0) then else {Call}
{CPE,CallUnChet}$EC:if ((RgF and f_P)=0) then else {Call}
{CP,CallUnPlus}$F4:if ((RgF and f_S)<>0) then else {Call}
{CM,CallUnMinus}$FC:if ((RgF and f_S)=0) then else {Call}
Поделиться272024-09-21 13:41:52
{PUSHPCp1} RpSP:=(RpSP-2) and $FFFF;inc(RpPC);do_write(RpSP,RpPC and $FF);do_write(RpSP+1,(RpPC shr 8) and $FF)
{RST ...}
$C7:{PUSHPCp1} RpPC:=0*8;
$CF:{PUSHPCp1} RpPC:=1*8;
$D7:{PUSHPCp1} RpPC:=2*8;
$DF:{PUSHPCp1} RpPC:=3*8;
$E7:{PUSHPCp1} RpPC:=4*8;
$EF:{PUSHPCp1} RpPC:=5*8;
$F7:{PUSHPCp1} RpPC:=6*8;
$FF:{PUSHPCp1} RpPC:=7*8;
Поделиться282024-09-23 14:10:13
{OUT}$D3: begin do_output(do_read(RpPC+1),RgA);end;
{IN} $DB: begin RgA:=do_input(do_read(RpPC+1));end;
{DI}$F3: begin end;{не реалізовані}
{EI}$FB: begin end;{не реалізовані}
