Generator написаний на ТП4 для ТП4 uGenTR.pas unit uGenTR; interface type string4 = string[4]; TReg = record id : Byte; Name : string4; end;{ довге ім'я регістру (AA..JV) } { ---------- Константи регістрів (з полем Name) ---------- } const AA : TReg = (id: 0; Name:'AA'); AB : TReg = (id: 1; Name:'AB'); AC : TReg = (id: 2; Name:'AC'); AD : TReg = (id: 3; Name:'AD'); AE : TReg = (id: 4; Name:'AE'); AF : TReg = (id: 5; Name:'AF'); AG : TReg = (id: 6; Name:'AG'); AH_: TReg = (id: 7; Name:'AH_'); AI : TReg = (id: 8; Name:'AI'); AJ : TReg = (id: 9; Name:'AJ'); AK : TReg = (id: 10; Name:'AK'); AL_: TReg = (id: 11; Name:'AL_'); AM : TReg = (id: 12; Name:'AM'); AN : TReg = (id: 13; Name:'AN'); AO : TReg = (id: 14; Name:'AO'); AP : TReg = (id: 15; Name:'AP'); AQ : TReg = (id: 16; Name:'AQ'); AR : TReg = (id: 17; Name:'AR'); AS_: TReg = (id: 18; Name:'AS_'); AT_: TReg = (id: 19; Name:'AT_'); AU : TReg = (id: 20; Name:'AU'); AV : TReg = (id: 21; Name:'AV'); AW : TReg = (id: 22; Name:'AW'); AX_: TReg = (id: 23; Name:'AX_'); AY : TReg = (id: 24; Name:'AY'); AZ : TReg = (id: 25; Name:'AZ'); BA : TReg = (id: 26; Name:'BA'); BB : TReg = (id: 27; Name:'BB'); BC : TReg = (id: 28; Name:'BC'); BD : TReg = (id: 29; Name:'BD'); BE : TReg = (id: 30; Name:'BE'); BF : TReg = (id: 31; Name:'BF'); BG : TReg = (id: 32; Name:'BG'); BH_: TReg = (id: 33; Name:'BH_'); BI : TReg = (id: 34; Name:'BI'); BJ : TReg = (id: 35; Name:'BJ'); BK : TReg = (id: 36; Name:'BK'); BL_: TReg = (id: 37; Name:'BL_'); BM : TReg = (id: 38; Name:'BM'); BN : TReg = (id: 39; Name:'BN'); BO : TReg = (id: 40; Name:'BO'); BP_: TReg = (id: 41; Name:'BP_'); BQ : TReg = (id: 42; Name:'BQ'); BR : TReg = (id: 43; Name:'BR'); BS : TReg = (id: 44; Name:'BS'); BT_: TReg = (id: 45; Name:'BT_'); BU : TReg = (id: 46; Name:'BU'); BV : TReg = (id: 47; Name:'BV'); BW : TReg = (id: 48; Name:'BW'); BX_: TReg = (id: 49; Name:'BX_'); BY : TReg = (id: 50; Name:'BY'); BZ : TReg = (id: 51; Name:'BZ'); CA : TReg = (id: 52; Name:'CA'); CB : TReg = (id: 53; Name:'CB'); CC : TReg = (id: 54; Name:'CC'); CD : TReg = (id: 55; Name:'CD'); CE : TReg = (id: 56; Name:'CE'); CF : TReg = (id: 57; Name:'CF'); CG : TReg = (id: 58; Name:'CG'); CH_: TReg = (id: 59; Name:'CH_'); CI : TReg = (id: 60; Name:'CI'); CJ : TReg = (id: 61; Name:'CJ'); CK : TReg = (id: 62; Name:'CK'); CL_: TReg = (id: 63; Name:'CL_'); CM : TReg = (id: 64; Name:'CM'); CN : TReg = (id: 65; Name:'CN'); CO : TReg = (id: 66; Name:'CO'); CP : TReg = (id: 67; Name:'CP'); CQ : TReg = (id: 68; Name:'CQ'); CR : TReg = (id: 69; Name:'CR'); CS_: TReg = (id: 70; Name:'CS_'); CT : TReg = (id: 71; Name:'CT'); CU : TReg = (id: 72; Name:'CU'); CV : TReg = (id: 73; Name:'CV'); CW : TReg = (id: 74; Name:'CW'); CX_: TReg = (id: 75; Name:'CX_'); CY : TReg = (id: 76; Name:'CY'); CZ : TReg = (id: 77; Name:'CZ'); DA : TReg = (id: 78; Name:'DA'); DB_: TReg = (id: 79; Name:'DB_'); DC : TReg = (id: 80; Name:'DC'); DD_: TReg = (id: 81; Name:'DD_'); DE : TReg = (id: 82; Name:'DE'); DF_: TReg = (id: 83; Name:'DF_'); DG : TReg = (id: 84; Name:'DG'); DH_: TReg = (id: 85; Name:'DH_'); DI_: TReg = (id: 86; Name:'DI_'); DJ : TReg = (id: 87; Name:'DJ'); DK : TReg = (id: 88; Name:'DK'); DL_: TReg = (id: 89; Name:'DL_'); DM : TReg = (id: 90; Name:'DM'); DN : TReg = (id: 91; Name:'DN'); DO_ : TReg = (id: 92; Name:'DO'); DP_: TReg = (id: 93; Name:'DP_'); DQ_: TReg = (id: 94; Name:'DQ_'); DR : TReg = (id: 95; Name:'DR'); DS_: TReg = (id: 96; Name:'DS_'); DT_: TReg = (id: 97; Name:'DT_'); DU_: TReg = (id: 98; Name:'DU_'); DV : TReg = (id: 99; Name:'DV'); DW_: TReg = (id:100; Name:'DW_'); DX_: TReg = (id:101; Name:'DX_'); DY : TReg = (id:102; Name:'DY'); DZ : TReg = (id:103; Name:'DZ'); EA : TReg = (id:104; Name:'EA'); EB : TReg = (id:105; Name:'EB'); EC : TReg = (id:106; Name:'EC'); ED : TReg = (id:107; Name:'ED'); EE : TReg = (id:108; Name:'EE'); EF : TReg = (id:109; Name:'EF'); EG : TReg = (id:110; Name:'EG'); EH : TReg = (id:111; Name:'EH'); EI : TReg = (id:112; Name:'EI'); EJ : TReg = (id:113; Name:'EJ'); EK : TReg = (id:114; Name:'EK'); EL : TReg = (id:115; Name:'EL'); EM : TReg = (id:116; Name:'EM'); EN : TReg = (id:117; Name:'EN'); EO : TReg = (id:118; Name:'EO'); EP : TReg = (id:119; Name:'EP'); EQ_: TReg = (id:120; Name:'EQ_'); ER : TReg = (id:121; Name:'ER'); ES_: TReg = (id:122; Name:'ES_'); ET : TReg = (id:123; Name:'ET'); EU : TReg = (id:124; Name:'EU'); EV : TReg = (id:125; Name:'EV'); EW : TReg = (id:126; Name:'EW'); EX : TReg = (id:127; Name:'EX'); EY : TReg = (id:128; Name:'EY'); EZ : TReg = (id:129; Name:'EZ'); FA : TReg = (id:130; Name:'FA'); FB : TReg = (id:131; Name:'FB'); FC : TReg = (id:132; Name:'FC'); FD : TReg = (id:133; Name:'FD'); FE : TReg = (id:134; Name:'FE'); FF : TReg = (id:135; Name:'FF'); FG : TReg = (id:136; Name:'FG'); FH : TReg = (id:137; Name:'FH'); FI : TReg = (id:138; Name:'FI'); FJ : TReg = (id:139; Name:'FJ'); FK : TReg = (id:140; Name:'FK'); FL : TReg = (id:141; Name:'FL'); FM : TReg = (id:142; Name:'FM'); FN : TReg = (id:143; Name:'FN'); FO : TReg = (id:144; Name:'FO'); FP : TReg = (id:145; Name:'FP'); FQ : TReg = (id:146; Name:'FQ'); FR : TReg = (id:147; Name:'FR'); FS_: TReg = (id:148; Name:'FS_'); FT : TReg = (id:149; Name:'FT'); FU : TReg = (id:150; Name:'FU'); FV : TReg = (id:151; Name:'FV'); FW : TReg = (id:152; Name:'FW'); FX : TReg = (id:153; Name:'FX'); FY : TReg = (id:154; Name:'FY'); FZ : TReg = (id:155; Name:'FZ'); GA : TReg = (id:156; Name:'GA'); GB : TReg = (id:157; Name:'GB'); GC : TReg = (id:158; Name:'GC'); GD : TReg = (id:159; Name:'GD'); GE : TReg = (id:160; Name:'GE'); GF : TReg = (id:161; Name:'GF'); GG : TReg = (id:162; Name:'GG'); GH : TReg = (id:163; Name:'GH'); GI : TReg = (id:164; Name:'GI'); GJ : TReg = (id:165; Name:'GJ'); GK : TReg = (id:166; Name:'GK'); GL : TReg = (id:167; Name:'GL'); GM : TReg = (id:168; Name:'GM'); GN : TReg = (id:169; Name:'GN'); GO : TReg = (id:170; Name:'GO'); GP : TReg = (id:171; Name:'GP'); GQ : TReg = (id:172; Name:'GQ'); GR : TReg = (id:173; Name:'GR'); GS_: TReg = (id:174; Name:'GS_'); GT : TReg = (id:175; Name:'GT'); GU : TReg = (id:176; Name:'GU'); GV : TReg = (id:177; Name:'GV'); GW : TReg = (id:178; Name:'GW'); GX : TReg = (id:179; Name:'GX'); GY : TReg = (id:180; Name:'GY'); GZ : TReg = (id:181; Name:'GZ'); HA : TReg = (id:182; Name:'HA'); HB : TReg = (id:183; Name:'HB'); HC : TReg = (id:184; Name:'HC'); HD : TReg = (id:185; Name:'HD'); HE : TReg = (id:186; Name:'HE'); HF : TReg = (id:187; Name:'HF'); HG : TReg = (id:188; Name:'HG'); HH : TReg = (id:189; Name:'HH'); HI : TReg = (id:190; Name:'HI'); HJ : TReg = (id:191; Name:'HJ'); HK : TReg = (id:192; Name:'HK'); HL : TReg = (id:193; Name:'HL'); HM : TReg = (id:194; Name:'HM'); HN : TReg = (id:195; Name:'HN'); HO : TReg = (id:196; Name:'HO'); HP : TReg = (id:197; Name:'HP'); HQ : TReg = (id:198; Name:'HQ'); HR : TReg = (id:199; Name:'HR'); HS : TReg = (id:200; Name:'HS'); HT : TReg = (id:201; Name:'HT'); HU : TReg = (id:202; Name:'HU'); HV : TReg = (id:203; Name:'HV'); HW : TReg = (id:204; Name:'HW'); HX : TReg = (id:205; Name:'HX'); HY : TReg = (id:206; Name:'HY'); HZ : TReg = (id:207; Name:'HZ'); IA : TReg = (id:208; Name:'IA'); IB : TReg = (id:209; Name:'IB'); IC : TReg = (id:210; Name:'IC'); ID : TReg = (id:211; Name:'ID'); IE : TReg = (id:212; Name:'IE'); IF_: TReg = (id:213; Name:'IF_'); IG : TReg = (id:214; Name:'IG'); IH : TReg = (id:215; Name:'IH'); II : TReg = (id:216; Name:'II'); IJ : TReg = (id:217; Name:'IJ'); IK : TReg = (id:218; Name:'IK'); IL : TReg = (id:219; Name:'IL'); IM : TReg = (id:220; Name:'IM'); IN_: TReg = (id:221; Name:'IN_'); IO : TReg = (id:222; Name:'IO'); IP : TReg = (id:223; Name:'IP'); IQ : TReg = (id:224; Name:'IQ'); IR : TReg = (id:225; Name:'IR'); IS_ : TReg = (id:226; Name:'IS'); IT : TReg = (id:227; Name:'IT'); IU : TReg = (id:228; Name:'IU'); IV : TReg = (id:229; Name:'IV'); IW : TReg = (id:230; Name:'IW'); IX : TReg = (id:231; Name:'IX'); IY : TReg = (id:232; Name:'IY'); IZ : TReg = (id:233; Name:'IZ'); JA_: TReg = (id:234; Name:'JA_'); JB_: TReg = (id:235; Name:'JB_'); JC_: TReg = (id:236; Name:'JC_'); JD : TReg = (id:237; Name:'JD'); JE_: TReg = (id:238; Name:'JE_'); JF : TReg = (id:239; Name:'JF'); JG_: TReg = (id:240; Name:'JG_'); JH : TReg = (id:241; Name:'JH'); JI : TReg = (id:242; Name:'JI'); JJ : TReg = (id:243; Name:'JJ'); JK : TReg = (id:244; Name:'JK'); JL_: TReg = (id:245; Name:'JL_'); JM : TReg = (id:246; Name:'JM'); JN : TReg = (id:247; Name:'JN'); JO_: TReg = (id:248; Name:'JO_'); JP_: TReg = (id:249; Name:'JP_'); JQ : TReg = (id:250; Name:'JQ'); JR : TReg = (id:251; Name:'JR'); JS_: TReg = (id:252; Name:'JS_'); JT : TReg = (id:253; Name:'JT'); JU : TReg = (id:254; Name:'JU'); JV : TReg = (id:255; Name:'JV'); { Спеціальні регістри (EXTR) } YA : TReg = (id:232; Name:'YA'); YB : TReg = (id:233; Name:'YB'); YC : TReg = (id:234; Name:'YC'); YD : TReg = (id:235; Name:'YD'); YE : TReg = (id:236; Name:'YE'); YF : TReg = (id:237; Name:'YF'); YG : TReg = (id:238; Name:'YG'); YH : TReg = (id:239; Name:'YH'); ZA : TReg = (id:240; Name:'ZA'); ZB : TReg = (id:241; Name:'ZB'); ZC : TReg = (id:242; Name:'ZC'); ZD : TReg = (id:243; Name:'ZD'); ZE : TReg = (id:244; Name:'ZE'); ZF : TReg = (id:245; Name:'ZF'); ZG : TReg = (id:246; Name:'ZG'); ZH : TReg = (id:247; Name:'ZH'); CMP1 : TReg = (id:254; Name:'CMP1'); CMP2 : TReg = (id:255; Name:'CMP2'); { Короткі назви (A..Z) } A : TReg = (id:0; Name:'A'); B : TReg = (id:1; Name:'B'); C : TReg = (id:2; Name:'C'); D : TReg = (id:3; Name:'D'); E : TReg = (id:4; Name:'E'); F : TReg = (id:5; Name:'F'); G : TReg = (id:6; Name:'G'); H : TReg = (id:7; Name:'H'); I : TReg = (id:8; Name:'I'); J : TReg = (id:9; Name:'J'); K : TReg = (id:10; Name:'K'); L : TReg = (id:11; Name:'L'); M : TReg = (id:12; Name:'M'); N : TReg = (id:13; Name:'N'); O : TReg = (id:14; Name:'O'); P : TReg = (id:15; Name:'P'); Q : TReg = (id:16; Name:'Q'); R : TReg = (id:17; Name:'R'); S : TReg = (id:18; Name:'S'); T : TReg = (id:19; Name:'T'); U : TReg = (id:20; Name:'U'); V : TReg = (id:21; Name:'V'); W : TReg = (id:22; Name:'W'); X : TReg = (id:23; Name:'X'); Y : TReg = (id:24; Name:'Y'); Z : TReg = (id:25; Name:'Z'); implementation end. uGen0.pas unit uGen0; interface type string255 = string[255]; { ---------- Допоміжні функції ---------- } function IntToStr(N: Longint): string255; function IntToHex(N: Longint; Digits: Byte): string255; { ---------- Базові операції з файлом ---------- } procedure InitGen; procedure FinalGen; procedure AddStr(s: string255); procedure REM(s: string255); { коментар } procedure VK; { порожній рядок } procedure Label_(L: string255); { мітка } { ---------- Заголовок програми ---------- } procedure format_binary_as_bin; procedure include_Macros_asm; implementation var File_out: Text; { ---------- Допоміжні функції ---------- } function IntToStr(N: Longint): string255; var S: string; Neg: Boolean; begin S := ''; Neg := N < 0; if N = 0 then begin IntToStr := '0'; Exit; end; if Neg then N := -N; while N > 0 do begin S := Chr(Ord('0') + (N mod 10)) + S; N := N div 10; end; if Neg then S := '-' + S; IntToStr := S; end; function IntToHex(N: Longint; Digits: Byte): string255; const HexChars: array[0..15] of Char = '0123456789ABCDEF'; var S: string; b: array[0..3] of Byte absolute N; i: Integer; begin S := ''; for i := 3 downto 0 do S := HexChars[b[i] shr 4] + HexChars[b[i] and $F] + S; while Length(S) < Digits do S := '0' + S; IntToHex := S; end; { ---------- Робота з файлом ---------- } procedure InitGen;begin Assign(File_out, 'BOOT.asm'); Rewrite(File_out);end; procedure FinalGen;begin Close(File_out); end; procedure AddStr(s: string255);begin Writeln(File_out, s);end; procedure REM(s: string255);begin AddStr('; ' + s); end; procedure VK;begin AddStr(''); end; procedure Label_(L: string255);begin AddStr(L + ':'); end; procedure format_binary_as_bin;begin VK; AddStr('format binary as ''bin'''); end; procedure include_Macros_asm;begin VK; AddStr('include ''Macros.asm'''); end; end. uGenV.pas unit uGenV; interface uses uGenTR,uGen0; { ---------- Команди з числовими операндами (згідно Macros.asm) ---------- } procedure MOVrv(Rg: TReg; Value: Longint); procedure MOVrr(Rg1, Rg2: TReg); procedure MOVrm (Rg: TReg; Addr: Longint); procedure MOVrmr(Rg1, Rg2: TReg); procedure MOVmr (Addr: Longint; Rg: TReg); procedure MOVmrr(Rg1, Rg2: TReg); procedure MOV2rm(Rg: TReg; Addr: Longint); procedure MOV2mr(Addr: Longint; Rg: TReg); procedure MOV2rmr(Rg1, Rg2: TReg); procedure MOV2mrr(Rg1, Rg2: TReg); procedure MOV1rm(Rg: TReg; Addr: Longint); procedure MOV1mr(Addr: Longint; Rg: TReg); procedure MOV1rmr(Rg1, Rg2: TReg); procedure MOV1mrr(Rg1, Rg2: TReg); { ---------- Арифметика та логіка ---------- } procedure ADDrr(Rg1, Rg2: TReg); procedure SUBrr(Rg1, Rg2: TReg); procedure MULrr(Rg1, Rg2: TReg); procedure DIVrr(Rg1, Rg2: TReg); procedure MODrr(Rg1, Rg2: TReg); procedure INCr(Rg: TReg); procedure DECr(Rg: TReg); procedure ANDrr(Rg1, Rg2: TReg); procedure ORrr (Rg1, Rg2: TReg); procedure XORrr(Rg1, Rg2: TReg); procedure NOTr(Rg: TReg); procedure SHLrr(Rg1, Rg2: TReg); procedure SHRrr(Rg1, Rg2: TReg); procedure CMPrr(Rg1, Rg2: TReg); { ---------- Переходи та виклики ---------- } procedure CALLa(Addr: Longint); procedure CALLr(Rg: TReg); procedure RET_; procedure GOTOa(Addr: Longint); procedure GOTOr(Rg: TReg); procedure GOTOsaIs (Addr: Longint); procedure GOTOsaNotIs (Addr: Longint); procedure GOTOsaMoreIs(Addr: Longint); procedure GOTOsaLess (Addr: Longint); procedure GOTOsrIs (Rg: TReg); procedure GOTOsrNotIs (Rg: TReg); procedure GOTOsrMoreIs(Rg: TReg); procedure GOTOsrLess (Rg: TReg); { ---------- Стек ---------- } procedure PUSHr(Rg: TReg); procedure POPr(Rg: TReg); procedure PUSHrsvr(Rg1, Rg2: TReg); procedure POPrsvr (Rg1, Rg2: TReg); { ---------- Системні виклики EXTR ---------- } procedure EXTR(Value: Word); procedure EXTR_NOP; procedure CheckEXTR; procedure HALT_; procedure Writeln_GetTimeStr; procedure Readln0; procedure VersionEnotVM; procedure Writeln0; procedure CONT; procedure WritelnYA; procedure Wait00secTime_and_Writeln_GetTimeStr; procedure EndProgram; procedure TypeOfAmbience; procedure APM; procedure SizeOfRAMstack; procedure SizeOfRAM; procedure SizeOfRAMext; procedure MaxPagesOfRAMext; procedure EnotVMItIsCompiled; { ---------- Рядкові макроси ---------- } procedure WritelnStr; procedure WriteStr; procedure VarStrB (MaxSize: Byte; Text: string255); procedure VarStrW (MaxSize: Word; Text: string255); procedure VarStr3B(MaxSize: Longint; Text: string255); procedure VarStrDW(MaxSize: Longint; Text: string255); { ---------- Константні рядки (авторозмір) ---------- } procedure ConstStrB (Text: string255); procedure ConstStrW (Text: string255); procedure ConstStr3B(Text: string255); procedure ConstStrDW(Text: string255); { ---------- Копіювання пам'яті ---------- } procedure CopyMainToMain; procedure CopyMainToExt; procedure CopyExtToMain; procedure CopyExtToExt; { ---------- Беззнакові переходи (числові) ---------- } procedure GOTOuaMoreIs(Addr: Longint); procedure GOTOuaLess (Addr: Longint); procedure GOTOurMoreIs(Rg: TReg); procedure GOTOurLess (Rg: TReg); implementation { ---------- Команди з числовими операндами ---------- } procedure MOVrv(Rg: TReg; Value: Longint);begin AddStr(' MOVrv ' + Rg.Name + ', ' + IntToStr(Value)); end; procedure MOVrr(Rg1, Rg2: TReg);begin AddStr(' MOVrr ' + Rg1.Name + ', ' + Rg2.Name); end; procedure MOVrm(Rg: TReg; Addr: Longint);begin AddStr(' MOVrm ' + Rg.Name + ', ' + IntToStr(Addr)); end; procedure MOVrmr(Rg1, Rg2: TReg);begin AddStr(' MOVrmr ' + Rg1.Name + ', ' + Rg2.Name); end; procedure MOVmr(Addr: Longint; Rg: TReg);begin AddStr(' MOVmr ' + IntToStr(Addr) + ', ' + Rg.Name); end; procedure MOVmrr(Rg1, Rg2: TReg);begin AddStr(' MOVmrr ' + Rg1.Name + ', ' + Rg2.Name); end; procedure MOV2rm(Rg: TReg; Addr: Longint);begin AddStr(' MOV2rm ' + Rg.Name + ', ' + IntToStr(Addr)); end; procedure MOV2mr(Addr: Longint; Rg: TReg);begin AddStr(' MOV2mr ' + IntToStr(Addr) + ', ' + Rg.Name); end; procedure MOV2rmr(Rg1, Rg2: TReg);begin AddStr(' MOV2rmr ' + Rg1.Name + ', ' + Rg2.Name); end; procedure MOV2mrr(Rg1, Rg2: TReg);begin AddStr(' MOV2mrr ' + Rg1.Name + ', ' + Rg2.Name); end; procedure MOV1rm(Rg: TReg; Addr: Longint);begin AddStr(' MOV1rm ' + Rg.Name + ', ' + IntToStr(Addr)); end; procedure MOV1mr(Addr: Longint; Rg: TReg);begin AddStr(' MOV1mr ' + IntToStr(Addr) + ', ' + Rg.Name); end; procedure MOV1rmr(Rg1, Rg2: TReg);begin AddStr(' MOV1rmr ' + Rg1.Name + ', ' + Rg2.Name); end; procedure MOV1mrr(Rg1, Rg2: TReg);begin AddStr(' MOV1mrr ' + Rg1.Name + ', ' + Rg2.Name); end; { ---------- Арифметика/логіка ---------- } procedure ADDrr(Rg1, Rg2: TReg); begin AddStr(' ADDrr ' + Rg1.Name + ', ' + Rg2.Name); end; procedure SUBrr(Rg1, Rg2: TReg); begin AddStr(' SUBrr ' + Rg1.Name + ', ' + Rg2.Name); end; procedure MULrr(Rg1, Rg2: TReg); begin AddStr(' MULrr ' + Rg1.Name + ', ' + Rg2.Name); end; procedure DIVrr(Rg1, Rg2: TReg); begin AddStr(' DIVrr ' + Rg1.Name + ', ' + Rg2.Name); end; procedure MODrr(Rg1, Rg2: TReg); begin AddStr(' MODrr ' + Rg1.Name + ', ' + Rg2.Name); end; procedure INCr(Rg: TReg); begin AddStr(' INCr ' + Rg.Name); end; procedure DECr(Rg: TReg); begin AddStr(' DECr ' + Rg.Name); end; procedure ANDrr(Rg1, Rg2: TReg); begin AddStr(' ANDrr ' + Rg1.Name + ', ' + Rg2.Name); end; procedure ORrr (Rg1, Rg2: TReg); begin AddStr(' ORrr ' + Rg1.Name + ', ' + Rg2.Name); end; procedure XORrr(Rg1, Rg2: TReg); begin AddStr(' XORrr ' + Rg1.Name + ', ' + Rg2.Name); end; procedure NOTr(Rg: TReg); begin AddStr(' NOTr ' + Rg.Name); end; procedure SHLrr(Rg1, Rg2: TReg); begin AddStr(' SHLrr ' + Rg1.Name + ', ' + Rg2.Name); end; procedure SHRrr(Rg1, Rg2: TReg); begin AddStr(' SHRrr ' + Rg1.Name + ', ' + Rg2.Name); end; procedure CMPrr(Rg1, Rg2: TReg); begin AddStr(' CMPrr ' + Rg1.Name + ', ' + Rg2.Name); end; { ---------- Переходи та виклики (числові) ---------- } procedure CALLa(Addr: Longint); begin AddStr(' CALLa ' + IntToStr(Addr)); end; procedure CALLr(Rg: TReg); begin AddStr(' CALLr ' + Rg.Name); end; procedure RET_; begin AddStr(' RET_'); end; procedure GOTOa(Addr: Longint); begin AddStr(' GOTOa ' + IntToStr(Addr)); end; procedure GOTOr(Rg: TReg); begin AddStr(' GOTOr ' + Rg.Name); end; procedure GOTOsaIs(Addr: Longint); begin AddStr(' GOTOsaIs ' + IntToStr(Addr)); end; procedure GOTOsaNotIs(Addr: Longint); begin AddStr(' GOTOsaNotIs ' + IntToStr(Addr)); end; procedure GOTOsaMoreIs(Addr: Longint); begin AddStr(' GOTOsaMoreIs ' + IntToStr(Addr)); end; procedure GOTOsaLess(Addr: Longint); begin AddStr(' GOTOsaLess ' + IntToStr(Addr)); end; procedure GOTOsrIs(Rg: TReg); begin AddStr(' GOTOsrIs ' + Rg.Name); end; procedure GOTOsrNotIs(Rg: TReg); begin AddStr(' GOTOsrNotIs ' + Rg.Name); end; procedure GOTOsrMoreIs(Rg: TReg); begin AddStr(' GOTOsrMoreIs ' + Rg.Name); end; procedure GOTOsrLess(Rg: TReg); begin AddStr(' GOTOsrLess ' + Rg.Name); end; { ---------- Стек ---------- } procedure PUSHr(Rg: TReg); begin AddStr(' PUSHr ' + Rg.Name); end; procedure POPr(Rg: TReg); begin AddStr(' POPr ' + Rg.Name); end; procedure PUSHrsvr(Rg1, Rg2: TReg); begin AddStr(' PUSHrsvr ' + Rg1.Name + ', ' + Rg2.Name); end; procedure POPrsvr(Rg1, Rg2: TReg); begin AddStr(' POPrsvr ' + Rg1.Name + ', ' + Rg2.Name); end; { ---------- EXTR виклики ---------- } procedure EXTR(Value: Word); begin AddStr(' EXTR ' + IntToStr(Value)); end; procedure EXTR_NOP; begin EXTR(0); end; procedure CheckEXTR; begin EXTR(1); end; procedure HALT_; begin EXTR(2); end; procedure Writeln_GetTimeStr; begin EXTR(3); end; procedure Readln0; begin EXTR(4); end; procedure VersionEnotVM; begin EXTR(5); end; procedure Writeln0; begin EXTR(6); end; procedure CONT; begin EXTR(7); end; procedure WritelnYA; begin EXTR(8); end; procedure Wait00secTime_and_Writeln_GetTimeStr; begin EXTR(9); end; procedure EndProgram; begin EXTR(10); end; procedure TypeOfAmbience; begin EXTR(11); end; procedure APM; begin EXTR(12); end; procedure SizeOfRAMstack; begin EXTR(13); end; procedure SizeOfRAM; begin EXTR(14); end; procedure SizeOfRAMext; begin EXTR(15); end; procedure MaxPagesOfRAMext; begin EXTR(16); end; procedure EnotVMItIsCompiled; begin EXTR(17); end; { ---------- Рядкові макроси ---------- } procedure WritelnStr; begin EXTR(256); end; procedure WriteStr; begin EXTR(257); end; procedure VarStrB(MaxSize: Byte; Text: string255); begin AddStr(' VarStrB ' + IntToStr(MaxSize) + ', ''' + Text + ''''); end; procedure VarStrW(MaxSize: Word; Text: string255); begin AddStr(' VarStrW ' + IntToStr(MaxSize) + ', ''' + Text + ''''); end; procedure VarStr3B(MaxSize: Longint; Text: string255); begin AddStr(' VarStr3B ' + IntToStr(MaxSize) + ', ''' + Text + ''''); end; procedure VarStrDW(MaxSize: Longint; Text: string255); begin AddStr(' VarStrDW ' + IntToStr(MaxSize) + ', ''' + Text + ''''); end; { ---------- Константні рядки ---------- } procedure ConstStrB(Text: string255);begin AddStr(' ContStrB ''' + Text + ''''); end; procedure ConstStrW(Text: string255);begin AddStr(' ContStrW ''' + Text + ''''); end; procedure ConstStr3B(Text: string255);begin AddStr(' ContStr3B ''' + Text + ''''); end; procedure ConstStrDW(Text: string255);begin AddStr(' ContStrDW ''' + Text + ''''); end; { ---------- Копіювання пам'яті ---------- } procedure CopyMainToMain; begin EXTR(512); end; procedure CopyMainToExt; begin EXTR(513); end; procedure CopyExtToMain; begin EXTR(514); end; procedure CopyExtToExt; begin EXTR(515); end; { ---------- Беззнакові переходи (числові) ---------- } procedure GOTOuaMoreIs(Addr: Longint); begin AddStr(' GOTOuaMoreIs ' + IntToStr(Addr)); end; procedure GOTOuaLess(Addr: Longint); begin AddStr(' GOTOuaLess ' + IntToStr(Addr)); end; procedure GOTOurMoreIs(Rg: TReg); begin AddStr(' GOTOurMoreIs ' + Rg.Name); end; procedure GOTOurLess(Rg: TReg); begin AddStr(' GOTOurLess ' + Rg.Name); end; end. uGenL.pas unit uGenL; interface uses uGenTR,uGen0; { ---------- Команди з мітками (спеціальні назви) ---------- } procedure MOVrl (Rg: TReg; LabelName: string255); { MOVrv з міткою } procedure MOVrml (Rg: TReg; LabelName: string255); { MOVrm з міткою } procedure MOVrmlr (Rg1, Rg2: TReg; LabelName: string255); { не використовується, залишено для сумісності } procedure MOVmlr (LabelName: string255; Rg: TReg); { MOVmr з міткою } procedure MOVmlrr (Rg1: TReg; LabelName: string255); { MOVmrr з міткою? } procedure MOV2rml (Rg: TReg; LabelName: string255); { MOV2rm з міткою } procedure MOV2mlr (LabelName: string255; Rg: TReg); { MOV2mr з міткою } procedure MOV1rml (Rg: TReg; LabelName: string255); { MOV1rm з міткою } procedure MOV1mlr (LabelName: string255; Rg: TReg); { MOV1mr з міткою } procedure CALLl (LabelName: string255); { CALLa з міткою } procedure GOTOslIs (LabelName: string255); { GOTOsaIs з міткою } procedure GOTOslNotIs (LabelName: string255); { GOTOsaNotIs з міткою } procedure GOTOslMoreIs(LabelName: string255); { GOTOsaMoreIs з міткою } procedure GOTOslLess (LabelName: string255); { GOTOsaLess з міткою } procedure GOTOulMoreIs(LabelName: string255); { беззнаковий перехід за міткою } procedure GOTOulLess (LabelName: string255); { беззнаковий перехід за міткою } implementation { ---------- Команди з мітками ---------- } procedure MOVrl(Rg: TReg; LabelName: string255);begin AddStr(' MOVrv ' + Rg.Name + ', ' + LabelName); end; procedure MOVrml(Rg: TReg; LabelName: string255);begin AddStr(' MOVrm ' + Rg.Name + ', ' + LabelName); end; procedure MOVrmlr(Rg1, Rg2: TReg; LabelName: string255); begin AddStr(' MOVrmr ' + Rg1.Name + ', ' + Rg2.Name + ' ; ???'); end; { некоректний опкод } procedure MOVmlr(LabelName: string255; Rg: TReg);begin AddStr(' MOVmr ' + LabelName + ', ' + Rg.Name); end; procedure MOVmlrr(Rg1: TReg; LabelName: string255);begin AddStr(' MOVmrr ' + Rg1.Name + ', ' + LabelName); end; procedure MOV2rml(Rg: TReg; LabelName: string255);begin AddStr(' MOV2rm ' + Rg.Name + ', ' + LabelName); end; procedure MOV2mlr(LabelName: string255; Rg: TReg);begin AddStr(' MOV2mr ' + LabelName + ', ' + Rg.Name); end; procedure MOV1rml(Rg: TReg; LabelName: string255);begin AddStr(' MOV1rm ' + Rg.Name + ', ' + LabelName); end; procedure MOV1mlr(LabelName: string255; Rg: TReg);begin AddStr(' MOV1mr ' + LabelName + ', ' + Rg.Name); end; procedure CALLl(LabelName: string255);begin AddStr(' CALLa ' + LabelName); end; procedure GOTOl(LabelName: string255);begin AddStr(' GOTOa ' + LabelName); end; procedure GOTOslIs(LabelName: string255);begin AddStr(' GOTOsaIs ' + LabelName); end; procedure GOTOslNotIs(LabelName: string255);begin AddStr(' GOTOsaNotIs ' + LabelName); end; procedure GOTOslMoreIs(LabelName: string255);begin AddStr(' GOTOsaMoreIs ' + LabelName); end; procedure GOTOslLess(LabelName: string255);begin AddStr(' GOTOsaLess ' + LabelName); end; procedure GOTOulMoreIs(LabelName: string255);begin AddStr(' GOTOuaMoreIs ' + LabelName); end; procedure GOTOulLess(LabelName: string255);begin AddStr(' GOTOuaLess ' + LabelName); end; end. uGen.pas unit uGen; { Генератор асемблерного коду (FASM) для EnotVM32 } { Підтримує всі регістри, команди з числовими операндами та мітками } interface uses uGenTR,uGen0,uGenV,uGenL; procedure StartGenerator; implementation const {як мітки} hello1='hello1'; hello2='hello2'; procedure StartGenerator; begin InitGen; REM('Програма від https://chat.deepseek.com/'); REM('Hello, World!'); REM('Найпростіша програма, яка виводить рядок і завершується.'); format_binary_as_bin; include_Macros_asm; VK; MOVrl(YA, hello1); WritelnStr; VK; MOVrl(YA, hello2); WritelnStr; VK; Readln0; EndProgram; Label_(hello1); AddStr('db 1,13,13,''Hello, World!'''); Label_(hello2); ConstStrB('Hello, World!'); FinalGen; end; end. uMain.pas unit uMain; interface uses uGen; Procedure InitProgram; Procedure StartProgram; Procedure FinalProgram; implementation Procedure InitProgram; begin end; Procedure FinalProgram;begin end; procedure StartProgram;begin StartGenerator;end; end. ProjectP.pas Program ProjectP; uses Crt,uMain; Begin {Delay(500);} InitProgram; StartProgram; FinalProgram; end. { $ N + } Результат роботи Generator: BOOT.ASM ; Програма від https://chat.deepseek.com/ ; Hello, World! ; Найпростіша програма, яка виводить рядок і завершується. format binary as 'bin' include 'Macros.asm' MOVrv YA, hello1 EXTR 256 MOVrv YA, hello2 EXTR 256 EXTR 4 EXTR 10 hello1: db 1,13,13,'Hello, World!' hello2: ContStrB 'Hello, World!' -----------------------------------------------------------------