From f86e69648b9c3a876072ac90d17d88a3d6ac31d4 Mon Sep 17 00:00:00 2001 From: "Terry A. Davis" Date: Tue, 18 Jul 2006 12:28:32 +0200 Subject: [PATCH] LTCD_060719.ISO --- 0000BOOT/BOOT.BIC | Bin 0 -> 176192 bytes 0000BOOT/CDBOOT.BIZ | Bin 0 -> 2045 bytes LT/ACCOUNTS/ADAM3.CPZ | 121 + LT/ACCOUNTS/FAULT.CPZ | Bin 0 -> 1253 bytes LT/ACCOUNTS/FAVOR.MUZ | Bin 0 -> 738 bytes LT/ACCOUNTS/INSTALL/USER.CPZ | 84 + LT/ACCOUNTS/SERVANT.CPZ | Bin 0 -> 255 bytes LT/ACCOUNTS/SYSTEM.CPZ | Bin 0 -> 220 bytes LT/ACCOUNTS/TOUR/TOUR.AUZ | 114 + LT/ACCOUNTS/TOUR/TOUR1.AUZ | 101 + LT/ACCOUNTS/TOUR/TOUR2.AUZ | 76 + LT/ACCOUNTS/TOUR/TOUR3.AUZ | 95 + LT/ACCOUNTS/TOUR/TOUR4.AUZ | 58 + LT/ACCOUNTS/TOUR/USER.CPZ | 10 + LT/ACCOUNTS/UPGRADE/USER.CPZ | 71 + LT/ACCOUNTS/USER.CPZ | 47 + LT/ACCOUNTS/USER.MUZ | 27 + LT/ADAM/ADAM2.CPZ | 67 + LT/ADAM/ADAMASM.ASZ | Bin 0 -> 242 bytes LT/ADAM/ADAMASM.BIZ | Bin 0 -> 1443 bytes LT/ADAM/ADAMASM.HPZ | 10 + LT/ADAM/ADAMASM.MPZ | Bin 0 -> 1036 bytes LT/ADAM/AdamExt.CPZ | 32 + LT/ADAM/COMM.CPZ | 800 +++++++ LT/ADAM/DISK10.CPZ | 821 +++++++ LT/ADAM/EDIT.CPZ | 3346 ++++++++++++++++++++++++++ LT/ADAM/EDIT.MUZ | 69 + LT/ADAM/FIFO.CPZ | 172 ++ LT/ADAM/GRELEM.CPZ | 834 +++++++ LT/ADAM/GRMODE2.ASZ | 425 ++++ LT/ADAM/GRMODE3.CPZ | 1228 ++++++++++ LT/ADAM/INPTR.CPZ | 14 + LT/ADAM/IncCompress.CPZ | 304 +++ LT/ADAM/JOY.CPZ | 136 ++ LT/ADAM/LOGIN.CPZ | 58 + LT/ADAM/LTF.CPZ | 2240 ++++++++++++++++++ LT/ADAM/MATH.CPZ | 72 + LT/ADAM/MOUSE.CPZ | 189 ++ LT/ADAM/MUSIC.CPZ | 82 + LT/ADAM/ODE.CPZ | 171 ++ LT/ADAM/TEST.TXZ | Bin 0 -> 5 bytes LT/ADAM/UTILS.CPZ | 442 ++++ LT/ADAM/WINDOW.CPZ | 1043 ++++++++ LT/ADAM/WORDSTAT.CPZ | 769 ++++++ LT/APPS/TIMECLK.CPZ | 164 ++ LT/APPS/WARGAME.CPZ | Bin 0 -> 7348 bytes LT/APPS/WARGAME.MUZ | 15 + LT/COMPILE/ASM.CPZ | 1411 +++++++++++ LT/COMPILE/ASM.TXZ | 881 +++++++ LT/COMPILE/CMP.ASZ | Bin 0 -> 466 bytes LT/COMPILE/CMP.BIZ | Bin 0 -> 244199 bytes LT/COMPILE/CMP.HPZ | Bin 0 -> 1714 bytes LT/COMPILE/CMP.MPZ | 1126 +++++++++ LT/COMPILE/CODE.ASZ | 4083 ++++++++++++++++++++++++++++++++ LT/COMPILE/COMPILE.CPZ | 2651 +++++++++++++++++++++ LT/COMPILE/DoTest.CPZ | Bin 0 -> 42 bytes LT/COMPILE/LEX.CPZ | 1687 +++++++++++++ LT/COMPILE/LoadCmp2.CPZ | Bin 0 -> 39 bytes LT/COMPILE/OPT.CPZ | 3045 ++++++++++++++++++++++++ LT/COMPILE/PARSE.CPZ | 773 ++++++ LT/COMPILE/SPRINTF2.CPZ | 759 ++++++ LT/COMPILE/Test.CPZ | 34 + LT/COMPILE/Test2.CPZ | Bin 0 -> 69 bytes LT/DEMO/AutoFile/Demo1.AUZ | 15 + LT/DEMO/AutoFile/Demo2.AUZ | 9 + LT/DEMO/AutoFile/Demo3.AUZ | 26 + LT/DEMO/AutoFile/Demo3.TXZ | Bin 0 -> 6069 bytes LT/DEMO/AutoFile/Demo4.CPZ | 12 + LT/DEMO/Caller.CPZ | 23 + LT/DEMO/CircleTrace.CPZ | Bin 0 -> 2251 bytes LT/DEMO/CommTerminal.CPZ | 19 + LT/DEMO/DateTime.CPZ | 9 + LT/DEMO/Dawg.CPZ | 145 ++ LT/DEMO/Debug/Test.CPZ | Bin 0 -> 1673 bytes LT/DEMO/DemoDoc.TXZ | 4 + LT/DEMO/Doodle.CPZ | Bin 0 -> 1354 bytes LT/DEMO/Doodle2.CPZ | Bin 0 -> 1814 bytes LT/DEMO/Exceptions.CPZ | Bin 0 -> 939 bytes LT/DEMO/FPrintF.CPZ | Bin 0 -> 652 bytes LT/DEMO/GetInput.CPZ | Bin 0 -> 1384 bytes LT/DEMO/Graphics/BSpline.CPZ | Bin 0 -> 875 bytes LT/DEMO/Graphics/Blot.CPZ | 29 + LT/DEMO/Graphics/Box.CPZ | 60 + LT/DEMO/Graphics/DotNet.CPZ | 12 + LT/DEMO/Graphics/Sprite1.CPZ | Bin 0 -> 1916 bytes LT/DEMO/Graphics/Sprite2.CPZ | Bin 0 -> 1236 bytes LT/DEMO/Graphics/Sprite3.CPZ | Bin 0 -> 928 bytes LT/DEMO/Graphics/StarTrek1.CPZ | Bin 0 -> 3811 bytes LT/DEMO/Graphics/StarTrek2.CPZ | Bin 0 -> 7424 bytes LT/DEMO/Graphics/StarTrek3.CPZ | Bin 0 -> 8191 bytes LT/DEMO/MsgLoop.CPZ | 15 + LT/DEMO/Music.CPZ | 20 + LT/DEMO/Sound.CPZ | 15 + LT/DEMO/Spy.CPZ | 15 + LT/DEMO/TreeDemo.CPZ | Bin 0 -> 968 bytes LT/DEMO/TreeDemoJoin.CPZ | 22 + LT/DEMO/WinMgr2.CPZ | 183 ++ LT/DOC/CtrlL.MUZ | 39 + LT/DOC/Dollar.TXZ | 151 ++ LT/DOC/Graphics.TXZ | 19 + LT/DOC/GuideLines.TXZ | 88 + LT/DOC/Help.TXZ | 78 + LT/DOC/Install.TXZ | 31 + LT/DOC/Mysteries.TXZ | 31 + LT/DOC/News.TXZ | 133 ++ LT/DOC/OSGlossary.GLZ | 169 ++ LT/DOC/Quirks.TXZ | 9 + LT/DOC/StartUp.TXZ | Bin 0 -> 899 bytes LT/DOC/Tips.TXZ | 78 + LT/OSMain/ADAMK.CPZ | 8 + LT/OSMain/ADAMK.HPZ | 2336 ++++++++++++++++++ LT/OSMain/ADAMK2.HPZ | Bin 0 -> 7725 bytes LT/OSMain/ADAMK3.HPZ | 290 +++ LT/OSMain/CHARIO.ASZ | Bin 0 -> 2595 bytes LT/OSMain/CMD.CPZ | 547 +++++ LT/OSMain/COMPRESS.CPZ | 209 ++ LT/OSMain/CRT.CPZ | Bin 0 -> 4678 bytes LT/OSMain/DATE.CPZ | 191 ++ LT/OSMain/DISK1.CPZ | Bin 0 -> 3674 bytes LT/OSMain/DISK2.CPZ | 901 +++++++ LT/OSMain/DISK3.CPZ | 1984 ++++++++++++++++ LT/OSMain/DISK4.CPZ | 1014 ++++++++ LT/OSMain/END.CPZ | 345 +++ LT/OSMain/FONT8x8.ASZ | 259 ++ LT/OSMain/IRQHAND.ASZ | 887 +++++++ LT/OSMain/MEM.ASZ | Bin 0 -> 5570 bytes LT/OSMain/MEM.CPZ | 62 + LT/OSMain/MISC.CPZ | 877 +++++++ LT/OSMain/OS.ASZ | 30 + LT/OSMain/OS.MPZ | 2369 ++++++++++++++++++ LT/OSMain/OSINC.ASZ | 287 +++ LT/OSMain/OSMAIN.ASZ | 360 +++ LT/OSMain/QSORT.CPZ | 29 + LT/OSMain/SCHED.ASZ | Bin 0 -> 5320 bytes LT/OSMain/SPRINTF.CPZ | Bin 0 -> 6017 bytes LT/OSMain/START.CPZ | 78 + LT/OSMain/STRINGS.CPZ | 707 ++++++ LT/OSMain/SYSTEXT.CPZ | 93 + LT/OSMain/SYSUTILS.ASZ | 1175 +++++++++ LT/UTILS/BMP.CPZ | 245 ++ LT/UTILS/BOOTCD2.ASZ | 298 +++ LT/UTILS/BOOTCD2.BIZ | Bin 0 -> 1270 bytes LT/UTILS/BOOTFD.ASZ | Bin 0 -> 1924 bytes LT/UTILS/BOOTFD.BIZ | Bin 0 -> 373 bytes LT/UTILS/BOOTHD.ASZ | 185 ++ LT/UTILS/BOOTHD.BIZ | Bin 0 -> 433 bytes LT/UTILS/BOOTINS.CPZ | Bin 0 -> 5478 bytes LT/UTILS/BOOTRAM.BIZ | Bin 0 -> 2020 bytes LT/UTILS/BOOTRAM.CPZ | Bin 0 -> 991 bytes LT/UTILS/DBG.CPZ | 1078 +++++++++ LT/UTILS/DIFF.CPZ | Bin 0 -> 5749 bytes LT/UTILS/GREP.CPZ | 270 +++ LT/UTILS/HASHUTIL.CPZ | Bin 0 -> 6122 bytes LT/UTILS/IDE.CPZ | 207 ++ LT/UTILS/S2T.CPZ | Bin 0 -> 1408 bytes LT/UTILS/TEXT.CPZ | Bin 0 -> 909 bytes 156 files changed, 49537 insertions(+) create mode 100644 0000BOOT/BOOT.BIC create mode 100644 0000BOOT/CDBOOT.BIZ create mode 100644 LT/ACCOUNTS/ADAM3.CPZ create mode 100644 LT/ACCOUNTS/FAULT.CPZ create mode 100644 LT/ACCOUNTS/FAVOR.MUZ create mode 100644 LT/ACCOUNTS/INSTALL/USER.CPZ create mode 100644 LT/ACCOUNTS/SERVANT.CPZ create mode 100644 LT/ACCOUNTS/SYSTEM.CPZ create mode 100644 LT/ACCOUNTS/TOUR/TOUR.AUZ create mode 100644 LT/ACCOUNTS/TOUR/TOUR1.AUZ create mode 100644 LT/ACCOUNTS/TOUR/TOUR2.AUZ create mode 100644 LT/ACCOUNTS/TOUR/TOUR3.AUZ create mode 100644 LT/ACCOUNTS/TOUR/TOUR4.AUZ create mode 100644 LT/ACCOUNTS/TOUR/USER.CPZ create mode 100644 LT/ACCOUNTS/UPGRADE/USER.CPZ create mode 100644 LT/ACCOUNTS/USER.CPZ create mode 100644 LT/ACCOUNTS/USER.MUZ create mode 100644 LT/ADAM/ADAM2.CPZ create mode 100644 LT/ADAM/ADAMASM.ASZ create mode 100644 LT/ADAM/ADAMASM.BIZ create mode 100644 LT/ADAM/ADAMASM.HPZ create mode 100644 LT/ADAM/ADAMASM.MPZ create mode 100644 LT/ADAM/AdamExt.CPZ create mode 100644 LT/ADAM/COMM.CPZ create mode 100644 LT/ADAM/DISK10.CPZ create mode 100644 LT/ADAM/EDIT.CPZ create mode 100644 LT/ADAM/EDIT.MUZ create mode 100644 LT/ADAM/FIFO.CPZ create mode 100644 LT/ADAM/GRELEM.CPZ create mode 100644 LT/ADAM/GRMODE2.ASZ create mode 100644 LT/ADAM/GRMODE3.CPZ create mode 100644 LT/ADAM/INPTR.CPZ create mode 100644 LT/ADAM/IncCompress.CPZ create mode 100644 LT/ADAM/JOY.CPZ create mode 100644 LT/ADAM/LOGIN.CPZ create mode 100644 LT/ADAM/LTF.CPZ create mode 100644 LT/ADAM/MATH.CPZ create mode 100644 LT/ADAM/MOUSE.CPZ create mode 100644 LT/ADAM/MUSIC.CPZ create mode 100644 LT/ADAM/ODE.CPZ create mode 100644 LT/ADAM/TEST.TXZ create mode 100644 LT/ADAM/UTILS.CPZ create mode 100644 LT/ADAM/WINDOW.CPZ create mode 100644 LT/ADAM/WORDSTAT.CPZ create mode 100644 LT/APPS/TIMECLK.CPZ create mode 100644 LT/APPS/WARGAME.CPZ create mode 100644 LT/APPS/WARGAME.MUZ create mode 100644 LT/COMPILE/ASM.CPZ create mode 100644 LT/COMPILE/ASM.TXZ create mode 100644 LT/COMPILE/CMP.ASZ create mode 100644 LT/COMPILE/CMP.BIZ create mode 100644 LT/COMPILE/CMP.HPZ create mode 100644 LT/COMPILE/CMP.MPZ create mode 100644 LT/COMPILE/CODE.ASZ create mode 100644 LT/COMPILE/COMPILE.CPZ create mode 100644 LT/COMPILE/DoTest.CPZ create mode 100644 LT/COMPILE/LEX.CPZ create mode 100644 LT/COMPILE/LoadCmp2.CPZ create mode 100644 LT/COMPILE/OPT.CPZ create mode 100644 LT/COMPILE/PARSE.CPZ create mode 100644 LT/COMPILE/SPRINTF2.CPZ create mode 100644 LT/COMPILE/Test.CPZ create mode 100644 LT/COMPILE/Test2.CPZ create mode 100644 LT/DEMO/AutoFile/Demo1.AUZ create mode 100644 LT/DEMO/AutoFile/Demo2.AUZ create mode 100644 LT/DEMO/AutoFile/Demo3.AUZ create mode 100644 LT/DEMO/AutoFile/Demo3.TXZ create mode 100644 LT/DEMO/AutoFile/Demo4.CPZ create mode 100644 LT/DEMO/Caller.CPZ create mode 100644 LT/DEMO/CircleTrace.CPZ create mode 100644 LT/DEMO/CommTerminal.CPZ create mode 100644 LT/DEMO/DateTime.CPZ create mode 100644 LT/DEMO/Dawg.CPZ create mode 100644 LT/DEMO/Debug/Test.CPZ create mode 100644 LT/DEMO/DemoDoc.TXZ create mode 100644 LT/DEMO/Doodle.CPZ create mode 100644 LT/DEMO/Doodle2.CPZ create mode 100644 LT/DEMO/Exceptions.CPZ create mode 100644 LT/DEMO/FPrintF.CPZ create mode 100644 LT/DEMO/GetInput.CPZ create mode 100644 LT/DEMO/Graphics/BSpline.CPZ create mode 100644 LT/DEMO/Graphics/Blot.CPZ create mode 100644 LT/DEMO/Graphics/Box.CPZ create mode 100644 LT/DEMO/Graphics/DotNet.CPZ create mode 100644 LT/DEMO/Graphics/Sprite1.CPZ create mode 100644 LT/DEMO/Graphics/Sprite2.CPZ create mode 100644 LT/DEMO/Graphics/Sprite3.CPZ create mode 100644 LT/DEMO/Graphics/StarTrek1.CPZ create mode 100644 LT/DEMO/Graphics/StarTrek2.CPZ create mode 100644 LT/DEMO/Graphics/StarTrek3.CPZ create mode 100644 LT/DEMO/MsgLoop.CPZ create mode 100644 LT/DEMO/Music.CPZ create mode 100644 LT/DEMO/Sound.CPZ create mode 100644 LT/DEMO/Spy.CPZ create mode 100644 LT/DEMO/TreeDemo.CPZ create mode 100644 LT/DEMO/TreeDemoJoin.CPZ create mode 100644 LT/DEMO/WinMgr2.CPZ create mode 100644 LT/DOC/CtrlL.MUZ create mode 100644 LT/DOC/Dollar.TXZ create mode 100644 LT/DOC/Graphics.TXZ create mode 100644 LT/DOC/GuideLines.TXZ create mode 100644 LT/DOC/Help.TXZ create mode 100644 LT/DOC/Install.TXZ create mode 100644 LT/DOC/Mysteries.TXZ create mode 100644 LT/DOC/News.TXZ create mode 100644 LT/DOC/OSGlossary.GLZ create mode 100644 LT/DOC/Quirks.TXZ create mode 100644 LT/DOC/StartUp.TXZ create mode 100644 LT/DOC/Tips.TXZ create mode 100644 LT/OSMain/ADAMK.CPZ create mode 100644 LT/OSMain/ADAMK.HPZ create mode 100644 LT/OSMain/ADAMK2.HPZ create mode 100644 LT/OSMain/ADAMK3.HPZ create mode 100644 LT/OSMain/CHARIO.ASZ create mode 100644 LT/OSMain/CMD.CPZ create mode 100644 LT/OSMain/COMPRESS.CPZ create mode 100644 LT/OSMain/CRT.CPZ create mode 100644 LT/OSMain/DATE.CPZ create mode 100644 LT/OSMain/DISK1.CPZ create mode 100644 LT/OSMain/DISK2.CPZ create mode 100644 LT/OSMain/DISK3.CPZ create mode 100644 LT/OSMain/DISK4.CPZ create mode 100644 LT/OSMain/END.CPZ create mode 100644 LT/OSMain/FONT8x8.ASZ create mode 100644 LT/OSMain/IRQHAND.ASZ create mode 100644 LT/OSMain/MEM.ASZ create mode 100644 LT/OSMain/MEM.CPZ create mode 100644 LT/OSMain/MISC.CPZ create mode 100644 LT/OSMain/OS.ASZ create mode 100644 LT/OSMain/OS.MPZ create mode 100644 LT/OSMain/OSINC.ASZ create mode 100644 LT/OSMain/OSMAIN.ASZ create mode 100644 LT/OSMain/QSORT.CPZ create mode 100644 LT/OSMain/SCHED.ASZ create mode 100644 LT/OSMain/SPRINTF.CPZ create mode 100644 LT/OSMain/START.CPZ create mode 100644 LT/OSMain/STRINGS.CPZ create mode 100644 LT/OSMain/SYSTEXT.CPZ create mode 100644 LT/OSMain/SYSUTILS.ASZ create mode 100644 LT/UTILS/BMP.CPZ create mode 100644 LT/UTILS/BOOTCD2.ASZ create mode 100644 LT/UTILS/BOOTCD2.BIZ create mode 100644 LT/UTILS/BOOTFD.ASZ create mode 100644 LT/UTILS/BOOTFD.BIZ create mode 100644 LT/UTILS/BOOTHD.ASZ create mode 100644 LT/UTILS/BOOTHD.BIZ create mode 100644 LT/UTILS/BOOTINS.CPZ create mode 100644 LT/UTILS/BOOTRAM.BIZ create mode 100644 LT/UTILS/BOOTRAM.CPZ create mode 100644 LT/UTILS/DBG.CPZ create mode 100644 LT/UTILS/DIFF.CPZ create mode 100644 LT/UTILS/GREP.CPZ create mode 100644 LT/UTILS/HASHUTIL.CPZ create mode 100644 LT/UTILS/IDE.CPZ create mode 100644 LT/UTILS/S2T.CPZ create mode 100644 LT/UTILS/TEXT.CPZ diff --git a/0000BOOT/BOOT.BIC b/0000BOOT/BOOT.BIC new file mode 100644 index 0000000000000000000000000000000000000000..aec64fcceaf8a026c6b298c03874764ba2acd652 GIT binary patch literal 176192 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 literal 0 HcmV?d00001 diff --git a/LT/ACCOUNTS/ADAM3.CPZ b/LT/ACCOUNTS/ADAM3.CPZ new file mode 100644 index 0000000..b899615 --- /dev/null +++ b/LT/ACCOUNTS/ADAM3.CPZ @@ -0,0 +1,121 @@ +/* This file gets included once into the +"Adam" task's memory by $LK,"LoadAdam3","MN:LoadAdam3"$() placed in +$LK,"HOME/USER.CPZ","FI:HOME/USER.CPZ"$. The declarations from this file +are available to all tasks, since all tasks +chain back to Adam. + +If you modify this file, you should place it +into your HOME directory. This version is the +default for accounts without a version in HOME. +*/ + +class RenameSymbolStruct +{ + I1 find[256] fmtstr "$$DA -P ,255 \"Find :%s\"$$\r\n"; + I1 replace[256] fmtstr "$$DA -P ,255 \"Replace:%s\"$$\r\n"; +}; + +void RenameCurSymbol() +{ + I1 *buf; + RenameSymbolStruct r; + BoolU4 old_preempt=Preempt(OFF); + StrCpy(r.find,ws_cur_word); + StrCpy(r.replace,ws_cur_word); + Preempt(old_preempt); + if (PopUpDoForm(&r,"RenameSymbolStruct")) { + buf=MSPrintF("R(\"%s\",\"%s\",\"+r+l+a\");",r.find,r.replace); + PopUp(buf,Fs); + Free(buf); + } +} + +void RenameFile() +{ + I1 *buf; + RenameSymbolStruct r; + BoolU4 old_preempt=Preempt(OFF); + StrCpy(r.find,ws_cur_word); + StrCpy(r.replace,ws_cur_word); + Preempt(old_preempt); + if (PopUpDoForm(&r,"RenameSymbolStruct")) { + buf=MSPrintF("R(\"%s\",\"%s\",\"+r+l+a\");",r.find,r.replace); + PopUp(buf,Fs); + Free(buf); + } + Move(r.find,r.replace); +} + +void FillinTime() +{ + LTDate ltdt; + ltdt=GetCurTimeLTDate; + PrintF("$$IV 1$$----%D %T----$$IV 0$$\r",ltdt.date,ltdt.time); +} + + +BoolU4 My_EditPlugIns(Ltf *l,I8 ch,U8 sc) +{ //You can customize these + U8 sc2,ms=0; + l;ch; //Ref, So not unused Warn + sc2=sc.u1[0]; + if (sc2>=SC_F1 && sc2<=SC_F10 && + (sc & SCF_ALT) && + !(sc & SCF_CTRL)) { + if (sc2==SC_F1) { + if ((sc & SCF_SHIFT)) + PutS("$$FG LTPURPLE$$"); + else + PutS("$$FG PURPLE$$"); + } else if (sc2==SC_F2) { + if ((sc & SCF_SHIFT)) + PutS("$$FG LTRED$$"); + else + PutS("$$FG RED$$"); + } else if (sc2==SC_F3) { + if ((sc & SCF_SHIFT)) + PutS("$$FG LTGREEN$$"); + else + PutS("$$FG GREEN$$"); + } else if (sc2==SC_F4) { + if ((sc & SCF_SHIFT)) + PutS("$$FG LTBLUE$$"); + else + PutS("$$FG$$"); + } else if (sc2==SC_F6) { + if (!(sc & SCF_SHIFT)) + PopUp("WsInit(\"/LT\");"); + } else if (sc2==SC_F7) { + if ((sc & SCF_SHIFT)) + LtfSafeInsert(Fs->cur_ltf, + "$$HS+C$$$$FG$$$$HE$$"); + else + FillinTime(); + } else if (sc2==SC_F8) { + if ((sc & SCF_SHIFT)) + RenameFile(); + else + RenameCurSymbol(); + } else if (sc2==SC_F9) + PopUp("PunchIn;"); + else if (sc2==SC_F10) + PopUp("PunchOut;"); + return TRUE; + } + return FALSE; +} + + +Cd("/LT/UTILS");; +#include "BOOTINS" +#include "DBG" +#include "DIFF" +#include "GREP" +#include "S2T" +#include "HASHUTIL" +#include "IDE" +#include "BMP" +LoadMapFile("::/LT/OSMain/OS.MPZ"); //Enable Man() +LoadMapFile("::/LT/COMPILE/CMP.MPZ"); //Enable Man() +LoadMapFile("::/LT/ADAM/ADAMASM.MPZ"); //Enable Man() + diff --git a/LT/ACCOUNTS/FAULT.CPZ b/LT/ACCOUNTS/FAULT.CPZ new file mode 100644 index 0000000000000000000000000000000000000000..770a19451a4f7f028f6b77dac02349a3edbf8d69 GIT binary patch literal 1253 zcmdPbQV7pT%~MEJNJ}iuDN)EzPA)Af)=@}QNY2R2Nl_>$%1=%$E>_4a=H)6bNG#7w zO;IQ+&CAQoOIIk#$ShV!%gjktNX$!7D9K1wC`c?y%`4&MN>42*RwynlE=bKwNlnpH zP>9SgRY*?EQ^?Iv$xN$MD9=bNQ2;68dS+g_9xoR!muH$nWqv8lAh;8Bz@o(&`K2I7=OiYlDrA=Ma%JX~QWT@_L?i&B$I@{20<6cj>0t}jb1D$dN$Q^+g^xu2ISB^7MFLRx;2LSk}qeraAw zu|j!fNk)EYi9(_RTzMYYJUw16Eq#!qLW+xnONvU9OBA$9ii>UCigoQEK@ne4Tx`wD z6>6fOm0Da7Urv{ExsRAquxWfnkHWfoY2Y%4C$ zEJ@B#&;VIeTAW%GpIBO9pvlWs4KgA*u{c%1z)C@1KQm1sC9^CuB~>A{B00671SG4V zps!z0TAZPfnpvQbSPY7=#9UBVhh!Axm%D(KL)4`f7wFnrSVK4ldVXSQ`*iA42qgY!5xE7dCkc@`PIh7P?K!Twpu{b+EEhjO(SSKVnI4wRnG&sQ3 z&&Ab66ROm;BC`a{g!rq%(9#Oxqyh4WTTXsrNoHO;*i8xwr2C{66odL&yj($v!$I=ATx2*=U*9(|IU_SKH7GT`I4BjAZh}h^le2?T3p7%T z3qa<=OjS|w@z#k^3QkQ0XDfX-$55XTJ?DU^7$uz;B{xqiQ07GzRZ&s0=H&`02AQi- eQd|r&%q6inS0gpEK-Zwc$Up}~fJ8x|%>V!+iG7R! literal 0 HcmV?d00001 diff --git a/LT/ACCOUNTS/FAVOR.MUZ b/LT/ACCOUNTS/FAVOR.MUZ new file mode 100644 index 0000000000000000000000000000000000000000..7da417aef2b3b424c8a8d4c77ff69526169d053f GIT binary patch literal 738 zcmY!h57#kN3CYMTR>&+?NL0v3%uA_MNXyJgRVdHMOwLe9PRvtCN>xZqPEIW@PEAoL z&n(GMa1IIb(GB+SbPLgS(^1II%P-GUNCat5ODxMT$}CAO1{8Vg!oT`vnqL7wf zq>z)DmtCxon3tlU6yopVucS~?S&*twTvD2rrjVJZkXs3|CBHPUM30w?m&-Fvp)$Wz zAvZrIGp$mg1mr@Hvvk0s#TogfIVlPSIf=<2<9WF<^GfnTGDQj={=TjXDVas7$tC$k zm3j&aV9%AM78Pga=Yc#~l99^Gm6Dp4SegTIS7LH9$kt-8-||aK6cQES%JabH=_!C* zq~hbP9jv3|o?nu$;2*3ITv=R_T2Z2;qvYmjWo4!B6Qb`Q?3{9O4=gqURhC zrQ;tQ59KPU@N%j6ctZ_v&d)8#%t4m#J$D}rd(mVu jwTEODV6_)6j;X~ZKPM-#2%BS(WK_V><>szqs=@#Ow*T8w literal 0 HcmV?d00001 diff --git a/LT/ACCOUNTS/INSTALL/USER.CPZ b/LT/ACCOUNTS/INSTALL/USER.CPZ new file mode 100644 index 0000000..67a1fa7 --- /dev/null +++ b/LT/ACCOUNTS/INSTALL/USER.CPZ @@ -0,0 +1,84 @@ +//This is the startup file for new local users +UseConsoleLtf("USER.MUZ"); +Fs->answers_displayed=2; //from 0-8 + +LoadAdam3; + +U8 F(I1 *pattern,I1 *flags="+r+i") +{ + return Grep(pattern,"/LT/"TEXT_FILE_MASK,flags); +} + +U8 R(I1 *pattern,I1 *replace_text=NULL,I1 *flags="+r+l") +{ + return Grep(pattern,"/LT/"TEXT_FILE_MASK,flags,replace_text); +} + +U8 FD(I1 *pattern,I1 *flags="+r+i") +{ + return Grep(pattern,TEXT_FILE_MASK,flags); +} + +U8 RD(I1 *pattern,I1 *replace_text=NULL,I1 *flags="+r+l") +{ + return Grep(pattern,TEXT_FILE_MASK,flags,replace_text); +} + + +PutSysText("ST_USER_STARTUP"); +Type("/LT/DOC/Help.TXZ"); +Fs->scroll_speed=10; +Bts(&Fs->crt_flags,CRTf_SHOW); + + +Type("/LT/DOC/StartUp.TXZ"); + +I1 src,dst,*st1,*st2; +I4 i; + +if (Fs->user_num==1) { + for (i=0;i<10;i++) CrLf; + coutln "This will reformat or delete old installations, " + "copy files onto a partition, recompile " + "and modify the boot sector. For this " + "to work, your hard disk partition must " + "already be bootable with a boot loader like LILO. " + "Obviously, the partition " + "you select will lose data and be destroyed. "; + cout "Continue "; + if (YorN) { + cout "\r\nWould you like to view notes on installation, first"; + if (YorN) + Edit("/LT/DOC/Install.TXZ"); + coutln "\r\n$$BK,1$$$$FG,PURPLE$$Add Drives so you can install.$$FG$$$$BK,0$$"; + AddDrives; + src=default_drive; + cout "\r\n\r\n\r\n$$BK,1$$$$FG,PURPLE$$Destination Drive:$$FG$$$$BK,0$$"; + dst=GetChar; + coutln; + st1=MSPrintF("%c:/LT",src); + st2=MSPrintF("%c:/LT",dst); + + PrintF("Format %c drive ",dst); + if (YorN) { + coutln; + Format(dst,TRUE,FALSE,PT_LT); + } else { + cout "\r\n$$BK 1$$WARNING$$BK 0$$ if you answer yes to the following " + "you will lose all files in your /LT directory.\r\n"; + cout "Delete ",st2," Directory "; + if (YorN) + DelTree(st2); + coutln; + } + CopyTree(st1,st2); + st2=MSPrintF("%c:/0000BOOT",dst); + MkDir(st2); + Free(st2); + st2=MSPrintF("%c:/TEMP",dst); + MkDir(st2); + Free(st2); + InstallBoot(dst); + } + +} \ No newline at end of file diff --git a/LT/ACCOUNTS/SERVANT.CPZ b/LT/ACCOUNTS/SERVANT.CPZ new file mode 100644 index 0000000000000000000000000000000000000000..8f733e8724a6382190428d4b6d9b8cddd2eed5b4 GIT binary patch literal 255 zcmdPb;^hj-$ShXKELJGVNL45k z8ZsLU@_$jwj5OsiBV0ci%Q)&YwaXXKaWq$m{RBqpaSWR~!9W#*OSgJg;nJp6rK z6;d*bQj<&aiz@XL6u|bDr4|)u=I24}=jBRCO-n4zDFNG^n4FwnnpaY+P@Y+mkzZP( zkf;Dxo(DEhkC#hJALOXe;#BASyyElK8Zo U#Pnhv=b(_Z_+StJaF9F$0R78TrT_o{ literal 0 HcmV?d00001 diff --git a/LT/ACCOUNTS/SYSTEM.CPZ b/LT/ACCOUNTS/SYSTEM.CPZ new file mode 100644 index 0000000000000000000000000000000000000000..faa52ecf85d4388142918d4872640be236400c9a GIT binary patch literal 220 zcmdPb;^hj-$ShXKELJGVNL45cpt5hff=>;j)0gD!A`KSUs|G& pr~p@<2R2WSmrF~Zmn*b5)j2<}I6o)VrzB0oFVx3J)0&ry0RY^$NY4NO literal 0 HcmV?d00001 diff --git a/LT/ACCOUNTS/TOUR/TOUR.AUZ b/LT/ACCOUNTS/TOUR/TOUR.AUZ new file mode 100644 index 0000000..4347517 --- /dev/null +++ b/LT/ACCOUNTS/TOUR/TOUR.AUZ @@ -0,0 +1,114 @@ +while (!initial_user_tasks_startup_complete) + SwapInNext; + +void ASCIIKeys(I1 *st) +{ + U8 ch; + I1 buf[80]; + do { + ch=GetKey; + if (ch==*st) { + PutChar(ch); + st++; + } else { + if (*st==CH_CR) + SPrintF(buf,"Press the '$$FG GREEN$$ENTER$$FG$$' key"); + else + SPrintF(buf,"Press the '$$FG GREEN$$%c$$FG$$' key",*st); + PopUpOk(buf); + } + } while (*st); +} + +void SlowASCIIAutoType(I1 *st) +{ + U8 ch; + do { + if (ch=*st++) { + PutChar(ch); + Sleep(100); + } + } while (ch); +} + +void SpecialKey(U8 scancode,I1 *name) +{ + U8 sc,ch; + I1 buf[80]; + do { + ch=GetChar2(&sc); + if (sc&0xFF!=SC_PRTSCRN1) { + if (sc&0xFF!=scancode&0xFF) { + SPrintF(buf,"Press the '$$FG GREEN$$%s$$FG$$' key",name); + PopUpOk(buf); + } + } + } while (sc&0xFF!=scancode&0xFF); + Msg(MSG_KEY_DOWN,ch,sc); +} + +void SpecialASCIIKey(U8 ch1,I1 *name,U8 flag_mask=0,U8 flags=0) +{ + U8 sc,ch; + I1 buf[80]; + do { + ch=GetChar2(&sc); + if (ch && ch!=ch1) { + SPrintF(buf,"Press the '$$FG GREEN$$%s$$FG$$' key",name); + PopUpOk(buf); + } + } while (ch!=ch1 || (sc&flag_mask!=flags)); + Msg(MSG_KEY_DOWN,ch,sc); +} + +void UntilSpecialKey(U8 scancode) +{ + U8 sc,ch; + do { + ch=GetChar2(&sc); + Msg(MSG_KEY_DOWN,ch,sc); + } while (sc&0xFF!=scancode&0xFF); +} + +void UntilASCIIKey(U8 ch1) +{ + U8 sc,ch; + do { + ch=GetChar2(&sc); + Msg(MSG_KEY_DOWN,ch,sc); + } while (ch!=ch1); +} + +public I8 PopUpTourPart() +{ + I8 i; + Ltf *l=LtfNew; + LtfPutS(l,"$$FG PURPLE$$LoseThos Tours$$FG$$\r\n\r\n"); + LtfPutS(l,"$$CM +LX, 4,4$$$$BT, \"Part 1: The basics\",1$$"); + LtfPutS(l,"$$CM +LX, 4,4$$$$BT, \"Part 2: Editing and running programs\",2$$"); + LtfPutS(l,"$$CM +LX, 4,4$$$$BT, \"Part 3: Adding macros to your start menu\",3$$"); + LtfPutS(l,"$$CM +LX, 4,4$$$$BT, \"Part 4: WordStat\",4$$"); + LtfPutS(l,"$$CM +LX, 4,4$$$$BT, \"Done\",-1$$"); + i=PopUpMenu(l); + LtfDel(l); + return i; +} + +I8 i; +do { + switch (i=PopUpTourPart) + { + case 1: + ExecuteFile("::/LT/ACCOUNTS/TOUR/TOUR1.AUZ"); + break; + case 2: + ExecuteFile("::/LT/ACCOUNTS/TOUR/TOUR2.AUZ"); + break; + case 3: + ExecuteFile("::/LT/ACCOUNTS/TOUR/TOUR3.AUZ"); + break; + case 4: + ExecuteFile("::/LT/ACCOUNTS/TOUR/TOUR4.AUZ"); + break; + } +} while (i>=1); diff --git a/LT/ACCOUNTS/TOUR/TOUR1.AUZ b/LT/ACCOUNTS/TOUR/TOUR1.AUZ new file mode 100644 index 0000000..181960f --- /dev/null +++ b/LT/ACCOUNTS/TOUR/TOUR1.AUZ @@ -0,0 +1,101 @@ +//This puts the cursor at the bottom +Msg(MSG_KEY_DOWN,0,SC_CURSOR_DOWN|SCF_CTRL); +PutS("\r"); + +PopUpOk( +"After clicking 'OKAY', you will be at the\r\n" +"command line.\r\n\r\n" +"Type \"$$FG GREEN$$Dir;$$FG$$\" and press $$FG GREEN$$ENTER$$FG$$.\r\n\r\n" +"You must remember the semicolon.\r\n" +); + +ASCIIKeys("Dir;\r"); +Sleep(1000); //allow user time to see dir +PutChar(CH_CR); + +PopUpOk( +"After clicking 'OKAY', you will be at the\r\n" +"command line.\r\n\r\n" +"Press the $$FG GREEN$$WINDOW$$FG$$s key.\r\n\r\n" +"This will access your macro/menu/help area.\r\n" +"You can customize it. It's like your\r\n" +"START menu.\r\n"); + +SpecialKey(SC_GUI,"WINDOWS KEY"); +Sleep(1000); +PopUpOk( +"For future reference, you can get to the\r\n" +"menu/macro/help area by clicking the left\r\n" +"mouse button when the mouse cursor is on\r\n" +"the word \"MENU\" in the upper-left border\r\n" +"of the window.\r\n"); + +PopUpOk( +"After clicking 'OKAY', you will be back at\r\n" +"the menu/macro/help area.\r\n\r\n" +"Press $$FG GREEN$$CURSOR-DOWN$$FG$$ five times.\r\n"); + +//This puts the cursor at the top +Msg(MSG_KEY_DOWN,0,SC_CURSOR_UP|SCF_CTRL); + +I8 i; +for (i=0;i<5;i++) + SpecialKey(SC_CURSOR_DOWN,"CURSOR-DOWN"); + +PopUpOk( +"After clicking 'OKAY', the cursor will be\r\n" +"on top of a macro we wish to run. Usually,\r\n" +"underlined text will do something.\r\n\r\n" +"Macros are normally $$FG LTBLUE$$BLUE$$FG$$ and you run\r\n" +"them by left-clicking the mouse. You can\r\n" +"simulate a left-mouse with a $$FG GREEN$$SPACE$$FG$$\r\n" +"key.\r\n\r\n" +"After clicking OKAY, press $$FG GREEN$$SPACE$$FG$$.\r\n"); +ASCIIKeys(" "); +Sleep(1000); + +PopUpOk( +"The macro changed directories and did\r\n" +"a $$FG GREEN$$Dir;$$FG$$ command.\r\n\r\n" +"The $$FG RED$$RED$$FG$$ filenames listed are file\r\n" +"links. Left-clicking will edit/view them.\r\n" +"Right-clicking or pressing $$FG GREEN$$ENTER$$FG$$\r\n" +"when the cursor is on top will bring-up a\r\n" +"menu of options.\r\n\r\n" +"The $$FG LTBLUE$$BLUE$$FG$$ underline entries \"$$FG LTBLUE$$.$$FG$$\" and \"$$FG LTBLUE$$..$$FG$$\"\r\n" +"are macros and will change directories.\r\n"); + +PopUpOk( +"As you can see, the command line is not\r\n" +"different from the help/menu/macro area.\r\n" +"Both use the same commands and have the same\r\n" +"'Widgets' available.\r\n\r\n" +"Both utilize the same underlying document format\r\n" +"known as LoseThos rich text. It is similar to\r\n" +"html because it has ASCII behind it.\r\n\r\n" +"Press \"$$FG GREEN$$CTRL-T$$FG$$\" after clicking 'OKAY' to toggle\r\n" +"to plain text mode.\r\n"); +SpecialASCIIKey(20,"CTRL-T"); +Sleep(1000); + +PopUpOk( +"The widgets are bracketed with dollar sign\r\n" +"characters. \"LK\" stands \"link\" and \"MA\"\r\n" +"stands for \"macro\".\r\n\r\n" +"Now, press \"$$FG GREEN$$CTRL-T$$FG$$\" to toggle back to\r\n" +"regular mode.\r"); +SpecialASCIIKey(20,"CTRL-T"); +Sleep(1000); + +PopUpOk( +"In summary, you left-click on underlined\r\n" +"text or press $$FG GREEN$$SPACE$$FG$$ when the cursor\r\n" +"is on top, to perform the primary action.\r\n" +"You right-click or press $$FG GREEN$$ENTER$$FG$$\r\n" +"to perform a secondary action.\r\n\r\n" + +"The $$FG GREEN$$WINDOW$$FG$$'s key will bring-up the help/macro/menus\r\n" +"as will clicking on the word \"MENU\" in the\r\n" +"upper-left corner of a window's border.\r\n\r\n" + +"The $$FG GREEN$$CTRL-T$$FG$$ key will toggle plain-text mode.\r\n"); diff --git a/LT/ACCOUNTS/TOUR/TOUR2.AUZ b/LT/ACCOUNTS/TOUR/TOUR2.AUZ new file mode 100644 index 0000000..1410a39 --- /dev/null +++ b/LT/ACCOUNTS/TOUR/TOUR2.AUZ @@ -0,0 +1,76 @@ +//This puts the cursor at the bottom +Msg(MSG_KEY_DOWN,0,SC_CURSOR_DOWN|SCF_CTRL); +PutS("\r"); + +PopUpOk( +"Now, we're going to demonstrate how to work\r\n" +"with programs. We'll change to the \LT\DEMO\r\n" +"directory. The change directory command\r\n" +"will be typed for you and you just need\r\n" +"to press $$FG GREEN$$ENTER$$FG$$.\r\n\r\n" +"Note, that directories are specified with\r\n" +"a forward slash, not a backslash.\r\n" +"Drives can be specified in a $$FG GREEN$$Cd()$$FG$$ command\r\n" +"and the boot drive is specified with \"$$FG GREEN$$::$$FG$$\"."); + +PutS("Cd(\"::/LT/DEMO\");Dir;"); +ASCIIKeys("\r"); + + +PopUpOk( +"Now, we're going to edit a file. Normally,\r\n" +"you'll probably left-click on a directory\r\n" +"listing to edit a file, but we're going to\r\n" +"type it on the command line.\r\n\r\n" +"Press $$FG GREEN$$ENTER$$FG$$ to complete the command.\r\n"); + +PutS("Edit(\"Sound.CPZ\");"); +ASCIIKeys("\r"); + +Sleep(1000); +PopUpOk( +"This program gets keys and plays frequencies.\r\n" +"It quits when you press $$FG GREEN$$ESC$$FG$$.\r\n\r\n" +"There is no \"$$FG GREEN$$main()$$FG$$\" function in LoseThos\r\n" +"programs. Any program statements outside\r\n" +"functions get executed when you $$FG GREEN$$#include$$FG$$\r\n" +"them at the command line.\r\n\r\n" +"The \"$$FG GREEN$$Organ;$$FG$$\" statement at the bottom\r\n" +"will run the program when we $$FG GREEN$$#include$$FG$$ it.\r\n"); + +PopUpOk( +"The editor and most things exit when you press\r\n" +"$$FG GREEN$$ESC$$FG$$. $$FG GREEN$$CTRL-Q$$FG$$ will abort (cancel) most things.\r\n\r\n" +"The $$FG GREEN$$ESC$$FG$$ key can be simulated with a left\r\n" +"double-click, while the $$FG GREEN$$CTRL-Q$$FG$$ key can be\r\n" +"simulated with a right double-click. When\r\n" +"you browse documentation, you'll left-click\r\n" +"on links and right double-click to go back,\r\n" +"unless you want to save changes to documents\r\n" +"using left double-click.\r\n\r\n" +"Press $$FG GREEN$$CTRL-Q$$FG$$ to quit out of the editor.\r\n" +); + +SpecialASCIIKey(CH_CTRLQ,"CTRL-Q"); + +PopUpOk( +"Now, we'll run the Sound.CPZ program.\r\n" +"Press $$FG GREEN$$ENTER$$FG$$ at the command line to\r\n" +"$$FG GREEN$$#include$$FG$$ it. Then press keys to\r\n" +"cause sounds and press $$FG GREEN$$ESC$$FG$$ when\r\n" +"you are done.\r\n"); + +PutS("#include \"Sound.CPZ\";"); +ASCIIKeys("\r"); +UntilASCIIKey(CH_ESC); + +PopUpOk( +"The program is still in memory and we\r\n" +"can start it again by typing \"$$FG GREEN$$Organ;$$FG$$\".\r\n\r\n" +"Press $$FG GREEN$$ENTER$$FG$$ at the command line to\r\n" +"run it again.\r\n"); + +PutS("Organ;"); +ASCIIKeys("\r"); +UntilASCIIKey(27); + diff --git a/LT/ACCOUNTS/TOUR/TOUR3.AUZ b/LT/ACCOUNTS/TOUR/TOUR3.AUZ new file mode 100644 index 0000000..7e383a9 --- /dev/null +++ b/LT/ACCOUNTS/TOUR/TOUR3.AUZ @@ -0,0 +1,95 @@ +//This puts the cursor at the bottom +Msg(MSG_KEY_DOWN,0,SC_CURSOR_DOWN|SCF_CTRL); +PutS("\rCd(\"::/LT/DEMO\");Dir;\r"); + +PopUpOk( +"Now, we're going to add the Sound.CPZ\r\n" +"program to your start menu.\r\n\r\n" +"Press the $$FG GREEN$$WINDOW$$FG$$s key\r\n" +"to get to your menu/macro/help area.\r\n"); +SpecialKey(SC_GUI,"WINDOWS KEY"); +Msg(MSG_KEY_DOWN,0,SC_CURSOR_UP|SCF_CTRL); +Sleep(1000); + +PopUpOk( +"Press $$FG GREEN$$CTRL-L$$FG$$ to invoke the\r\n" +"rich-text resource editor.\r\n"); +SpecialASCIIKey(12,"CTRL-L"); + +PopUpOk( +"Press $$FG GREEN$$CURSOR-DOWN$$FG$$ until you reach\r\n" +"\"Macro\".\r\n"); +I8 i; +for (i=0;i<8;i++) + SpecialKey(SC_CURSOR_DOWN,"CURSOR-DOWN"); + +PopUpOk( +"Press $$FG GREEN$$SPACE$$FG$$.\r\n"); +ASCIIKeys(" "); +Sleep(1000); + + +PopUpOk( +"Now, we'll fill-in the visible text\r\n" +"of the macro.\r\n"); +SlowASCIIAutoType("Click Here"); + +Msg(MSG_KEY_DOWN,0,SC_CURSOR_DOWN); +PopUpOk("Now, we'll fill-in the macro text.\r\n"); +SlowASCIIAutoType("Cd(\\\"::/LT/DEMO\\\");;#include \\\"Sound.CPZ\\\";\\r"); + +PopUpOk("Press $$FG GREEN$$ESC$$FG$$ to exit the form.\r\n"); +SpecialASCIIKey(CH_ESC,"ESC"); +Sleep(1000); + +PopUpOk("Press $$FG GREEN$$CTRL-SHIFT-ENTER$$FG$$ to insert a line feed.\r\n"); +SpecialASCIIKey(CH_CR,"CTRL-SHIFT-ENTER",SCF_CTRL|SCF_SHIFT,SCF_CTRL|SCF_SHIFT); +Sleep(1000); + +Msg(MSG_KEY_DOWN,0,SC_CURSOR_UP|SCF_CTRL); +PopUpOk( +"Press $$FG GREEN$$SPACE$$FG$$ to test it.\r\n"); +ASCIIKeys(" "); +UntilASCIIKey(CH_ESC); + +PopUpOk( +"Now, we'll do a fancier macro that pops-up\r\n" +"a new window which dies when finished,\r\n" +"returning memory to the system.\r\n"); +Msg(MSG_KEY_DOWN,0,SC_GUI); +Msg(MSG_KEY_DOWN,0,SC_CURSOR_UP|SCF_CTRL); +Msg(MSG_KEY_DOWN,12,0); //CTRL-L +for (i=0;i<8;i++) + Msg(MSG_KEY_DOWN,0,SC_CURSOR_DOWN); +SlowASCIIAutoType(" Click here for Pop-up version"); +Msg(MSG_KEY_DOWN,0,SC_CURSOR_DOWN); +SlowASCIIAutoType("Cd(\\\"::/LT/DEMO\\\");;#include \\\"Sound.CPZ\\\"\\r"); + +PopUpOk( +"Press $$FG GREEN$$CURSOR-DOWN$$FG$$ until you reach\r\n" +"the \"Pop-Up\" check-box.\r\n"); +for (i=0;i<2;i++) + SpecialKey(SC_CURSOR_DOWN,"CURSOR-DOWN"); +PopUpOk( +"Press $$FG GREEN$$SPACE$$FG$$ to\r\n" +"check the box.\r\n"); +ASCIIKeys(" "); +Sleep(500); + +PopUpOk("Press $$FG GREEN$$ESC$$FG$$ to exit the form.\r\n"); +SpecialASCIIKey(CH_ESC,"ESC"); +Sleep(500); + +PopUpOk("Press $$FG GREEN$$CTRL-SHIFT-ENTER$$FG$$ to insert a line feed.\r\n"); +SpecialASCIIKey(CH_CR,"CTRL-SHIFT-ENTER",SCF_CTRL|SCF_SHIFT,SCF_CTRL|SCF_SHIFT); +Sleep(500); + +Msg(MSG_KEY_DOWN,0,SC_CURSOR_UP|SCF_CTRL); +PopUpOk( +"Press $$FG GREEN$$SPACE$$FG$$ to test it.\r\n"); +ASCIIKeys(" "); +Sleep(5000); + +PopUpOk( +"Press $$FG GREEN$$CTRL-S$$FG$$ to save your\r\n" +"macro/menu/help area file, if you wish.\r\n"); diff --git a/LT/ACCOUNTS/TOUR/TOUR4.AUZ b/LT/ACCOUNTS/TOUR/TOUR4.AUZ new file mode 100644 index 0000000..3f09b1c --- /dev/null +++ b/LT/ACCOUNTS/TOUR/TOUR4.AUZ @@ -0,0 +1,58 @@ +PopUp("WsInit(\"::/LT\");"); +if (!ws_task) + ws_task=Spawn(&WsTsk,"WORDSTAT"); + +//This puts the cursor at the bottom +Msg(MSG_KEY_DOWN,0,SC_CURSOR_DOWN|SCF_CTRL); +PutS("\rCd(\"::/LT/DEMO\");\r"); + +PopUpOk( +"WordStat is an autocomplete feature\r\n" +"which will also jump to source code.\r\n\r\n" +"We will now place some text on the command\r\n" +"line and jump to source code.\r\n"); +PutS("InstallB"); +Sleep(1000); + +PopUpOk( +"After clicking $$FG GREEN$$OKAY$$FG$$, look at\r\n" +"the $$FG GREEN$$InstallBoot$$FG$$ entry in the WordStat\r\n" +"window. Notice it has a '$$FG GREEN$$*$$FG$$' by it.\r\n" +"This means a source code link is available.\r\n"); +sys_cur_focus_task=Fs->parent_tss; +Sleep(2000); + +PopUpOk( +"Press $$FG GREEN$$CTRL-SHIFT-F1$$FG$$ to jump to source code.\r\n"); +sys_cur_focus_task=Fs->parent_tss; +UntilSpecialKey(SC_F1|SCF_CTRL|SCF_SHIFT); +Sleep(2000); + +PopUpOk( +"Press $$FG GREEN$$CTRL-Q$$FG$$ to quit the source code.\r\n"); +UntilASCIIKey(CH_CTRLQ); + +PopUpOk( +"Press $$FG GREEN$$CTRL-F1$$FG$$ to autocomplete.\r\n"); +sys_cur_focus_task=Fs->parent_tss; +UntilSpecialKey(SC_F1|SCF_CTRL); +Sleep(500); + +Msg(MSG_KEY_DOWN,CH_CR,SCF_CTRL|SCF_SHIFT); +PutS("\r"); + +PopUpOk( +"Tip: You can restart the WordStat window if you\r\n" +"have closed it by pressing $$FG GREEN$$CTRL-F1$$FG$$.\r\n"); + +PopUpOk( +"You can also use the $$FG GREEN$$Man()$$FG$$ function\r\n" +"to jump to source code.\r\n"); +SlowASCIIAutoType("Man(\"InstallBoot\");"); +Sleep(1000); +PutS("\r"); + +Sleep(2000); +PopUpOk( +"Press $$FG GREEN$$CTRL-Q$$FG$$ to quit the source code.\r\n"); +UntilASCIIKey(CH_CTRLQ); diff --git a/LT/ACCOUNTS/TOUR/USER.CPZ b/LT/ACCOUNTS/TOUR/USER.CPZ new file mode 100644 index 0000000..abdda26 --- /dev/null +++ b/LT/ACCOUNTS/TOUR/USER.CPZ @@ -0,0 +1,10 @@ +//This is the startup file for new local users +UseConsoleLtf("USER.MUZ"); +Fs->answers_displayed=2; //from 0-8 +LoadAdam3; +PutSysText("ST_USER_STARTUP"); +Type("/LT/DOC/Help.TXZ"); +Bts(&Fs->crt_flags,CRTf_SHOW); + +if (Fs->user_num==1) + AutoFile("TOUR"); diff --git a/LT/ACCOUNTS/UPGRADE/USER.CPZ b/LT/ACCOUNTS/UPGRADE/USER.CPZ new file mode 100644 index 0000000..9addeff --- /dev/null +++ b/LT/ACCOUNTS/UPGRADE/USER.CPZ @@ -0,0 +1,71 @@ +//This is the startup file for new local users +UseConsoleLtf("USER.MUZ"); +Fs->answers_displayed=2; //from 0-8 + +LoadAdam3; + +U8 F(I1 *pattern,I1 *flags="+r+i") +{ + return Grep(pattern,"/LT/"TEXT_FILE_MASK,flags); +} + +U8 R(I1 *pattern,I1 *replace_text=NULL,I1 *flags="+r+l") +{ + return Grep(pattern,"/LT/"TEXT_FILE_MASK,flags,replace_text); +} + +U8 FD(I1 *pattern,I1 *flags="+r+i") +{ + return Grep(pattern,TEXT_FILE_MASK,flags); +} + +U8 RD(I1 *pattern,I1 *replace_text=NULL,I1 *flags="+r+l") +{ + return Grep(pattern,TEXT_FILE_MASK,flags,replace_text); +} + + +PutSysText("ST_USER_STARTUP"); +Type("/LT/DOC/Help.TXZ"); +Fs->scroll_speed=10; +Bts(&Fs->crt_flags,CRTf_SHOW); + + +Type("/LT/DOC/StartUp.TXZ"); + +I1 src,dst,*st1,*st2; +I4 i; + +if (Fs->user_num==1) { + for (i=0;i<10;i++) CrLf; + coutln "This will copy the /LT directory from " + "the CD-ROM onto a harddisk overwriting old files. " + "It will then recompile " + "and modify the boot sector. If your old " + "installation is the right disk format and " + "you have created your own ACCOUNTS directory " + "that directory will be left intact."; + cout "Continue "; + if (YorN) { + cout "\r\nWould you like to view notes on installation, first"; + if (YorN) + Edit("/LT/DOC/Install.TXZ"); + coutln "\r\n$$BK,1$$$$FG,PURPLE$$Add Drives so you can upgrade.$$FG$$$$BK,0$$"; + AddDrives; + src=default_drive; + cout "\r\n\r\n$$BK,1$$$$FG,PURPLE$$Destination Drive:$$FG$$$$BK,0$$"; + dst=GetChar; + coutln; + st1=MSPrintF("%c:/LT",src); + st2=MSPrintF("%c:/LT",dst); + + CopyTree(st1,st2); + st2=MSPrintF("%c:/0000BOOT",dst); + MkDir(st2); + Free(st2); + st2=MSPrintF("%c:/TEMP",dst); + MkDir(st2); + Free(st2); + InstallBoot(dst); + } +} \ No newline at end of file diff --git a/LT/ACCOUNTS/USER.CPZ b/LT/ACCOUNTS/USER.CPZ new file mode 100644 index 0000000..3bb7379 --- /dev/null +++ b/LT/ACCOUNTS/USER.CPZ @@ -0,0 +1,47 @@ +/* +This is the startup file for new local users. + +If you modify this file, you should place it +into your HOME directory. This version is the +default for accounts without a version in HOME. +*/ + +UseConsoleLtf("USER.MUZ"); +Fs->answers_displayed=2; //from 0-8 + +LoadAdam3; + +Fs->EditPlugIns=&My_EditPlugIns; +Ltf *l=Fs->cur_ltf; +l->EditPlugIns=&My_EditPlugIns; +if (l=l->menu_ltf) + l->EditPlugIns=&My_EditPlugIns; + +U8 F(I1 *pattern,I1 *flags="+r+i") +{ + return Grep(pattern,"/LT/"TEXT_FILE_MASK,flags); +} + +U8 R(I1 *pattern,I1 *replace_text=NULL,I1 *flags="+r+l") +{ + return Grep(pattern,"/LT/"TEXT_FILE_MASK,flags,replace_text); +} + +U8 FD(I1 *pattern,I1 *flags="+r+i") +{ + return Grep(pattern,TEXT_FILE_MASK,flags); +} + +U8 RD(I1 *pattern,I1 *replace_text=NULL,I1 *flags="+r+l") +{ + return Grep(pattern,TEXT_FILE_MASK,flags,replace_text); +} + +PutSysText("ST_USER_STARTUP"); +Type("/LT/DOC/Help.TXZ"); +Fs->scroll_speed=10; +Bts(&Fs->crt_flags,CRTf_SHOW); + + +Type("/LT/DOC/StartUp.TXZ"); + diff --git a/LT/ACCOUNTS/USER.MUZ b/LT/ACCOUNTS/USER.MUZ new file mode 100644 index 0000000..a999967 --- /dev/null +++ b/LT/ACCOUNTS/USER.MUZ @@ -0,0 +1,27 @@ +If you modify this file, you should place it +into your HOME directory. This version is the +default for accounts without a version in HOME. + +$MA,"Cd(\"HOME\");Dir;\r"$ +$MA,"Cd(\"::/LT/OSMain\");Dir;\r"$ +$MA,"Cd(\"::/LT/ADAM\");Dir;\r"$ +$MA,"Cd(\"::/LT/APPS\");Dir;\r"$ +$MA,"Cd(\"::/LT/DEMO\");Dir;\r"$ +$MA,"Cd(\"::/LT/UTILS\");Dir;\r"$ +$MA,"Drive('A');\r"$ +$MA+A,"Recompile Floppy OS Drive A:","InstallBoot('A');\r"$ + +$WW,1$$MA+A-X+PU,"Play WarGame","Cd(\"::/LT/APPS\");;#include \"WARGAME\"\r"$ +$MA+A-X+PU,"DO-TELL (A fractel-like thing)","Cd(\"::/LT/DEMO\");;#include \"Dawg\"\r"$ +$MA+A-X+PU,"StarTrek Game","#include \"::/LT/DEMO/Graphics/StarTrek2\"\r"$ + +$MA+A,"Tour","Cd(\"::/LT/ACCOUNTS/TOUR\");;AutoFile(\"TOUR\");\r"$ + +The following can be used if you recompile, adding hard disk support. +$MA,"Drive('D');\r"$ +$MA,"Drive('E');\r"$ +$MA+A,"Recompile Hard Drive D:","InstallBoot(':','D');\r"$ + + +$MA+A-X+PU,"List functions in alphabetic order","HFunsRep;View;"$ +$MA+A-X+PU,"List functions in numeric address order","HMapRep;View;"$ \ No newline at end of file diff --git a/LT/ADAM/ADAM2.CPZ b/LT/ADAM/ADAM2.CPZ new file mode 100644 index 0000000..9f4abdb --- /dev/null +++ b/LT/ADAM/ADAM2.CPZ @@ -0,0 +1,67 @@ +#include "AdamExt" +#include "IncCompress" +#include "MATH" +#include "ODE" +Load("ADAMASM"); +#include "ADAMASM.HPZ" +#include "GRMODE3" +#include "MUSIC" +#include "DISK10" +#include "FIFO" +#include "COMM" +#include "INPTR" +#include "GRELEM" +#include "LTF" +#include "UTILS" +#include "MOUSE" +#include "JOY" +#include "WINDOW" +#include "EDIT" +#include "LOGIN" +#include "WORDSTAT" + +BoolU4 initial_user_tasks_startup_complete=FALSE; +public void DuelUsers() +{ + I1 buf[80]; + TssStruct *tss,*tss1; + + tss=Spawn(&UserCmdLine); + while (!Bt(&tss->task_flags,TSSf_IDLE)) + SwapInNext; + tss->window_top=2; + tss->window_right=(SCREEN_COLS-2)<<1; + tss1=tss; + + tss=Spawn(&UserCmdLine); + while (!Bt(&tss->task_flags,TSSf_IDLE)) + SwapInNext; + tss->window_top=2; + tss->window_left=SCREEN_COLS<<2>>1; + + WindowToTop(tss1); + ws_task=Spawn(&WsTsk,"WORDSTAT"); + + SPrintF(buf,"Boot Time:%h17Ts\r\n",BootTime); + AdamLog(buf); + initial_user_tasks_startup_complete=TRUE; +} + +Preempt(ON); + +UseConsoleLtf(NULL); +adam_tss->window_top=2; +adam_tss->window_bottom=10; +update_screen_tss=Spawn(&WindowManagerTsk,"WINDOW MANAGER"); +CollectAccntList; + +Bts(&Fs->crt_flags,CRTf_SHOW); +if (!(Fs->account=FindSysAccnt(sys_startup_account))) + Fs->account=PopUpGetSysAccnt; +WsInit(wordstat_mask); + + +//This must be spawned because start-up files +// may invoke the Adam() cmd. +Spawn(&DuelUsers,"SPAWNUSERS"); +coutln "\r\nOS Compile Time:",sys_compile_time; diff --git a/LT/ADAM/ADAMASM.ASZ b/LT/ADAM/ADAMASM.ASZ new file mode 100644 index 0000000000000000000000000000000000000000..295913b73f789248c0d1c5383aa40896993faa44 GIT binary patch literal 242 zcmYeTNL8rzPE9QcD9S8LEJ@Yy_tUhl<>gY&%uCKGO-WTy($mxT5B5#W%+q&tarE`p z^9YDi;^j&#&Q++!uFOB!)6ZGYF&Lx_(|9*Gu=$?80scWDoWYU7@gc4eAx@6Lt~wx& zn~$S=unsR5SjIUtDBjKAIW#yv#4*@g$Ia8vCEhh6#5KsznwJaY8pmMY_}~!7pb#r7 aWVg5n`TD!K8Yv+Zx%#<)l+^NaF#rG+V?>(( literal 0 HcmV?d00001 diff --git a/LT/ADAM/ADAMASM.BIZ b/LT/ADAM/ADAMASM.BIZ new file mode 100644 index 0000000000000000000000000000000000000000..f7bbaccd8081a04af7f665cdf4aba8c8e735e48b GIT binary patch literal 1443 zcmaFK%fMjA!oaYOfgw)pLnT9l!vTc_2@eD&1Y9uKQ1F4H!{da;ii{T$Ga_zS?5Oy` z(&BPNWl72tktrcpOtzGK;py=?qq8RGjm(^wJ2rc2{xCH;9a379^hjt@&?TcyMW493 zyiRGY%6cU=E9#cjuBu;bZEnZZmZd!tn-+G>Y+KnkzCOQmdh7Du$<2$qXSc8JA7i8A zLB)lM4+SR%UNqcT_>r^I^Q7j=%$JfgBX3&nto+&PdQ^33>Qm9Fp;t|}mVV{!^*yV* zHutUU+}OLedu#tPH#;9zUYz_`cyjP%3JEj>H>w)O7n-|X$~$JLjo zKNp`Ke%*X~`FH+)|MU9m^WQ7XkH2rfzy7~VQDS*WVsW-peo;zl5kqJ}N@7W>e@bdG z!vru0?S9i8E70vK!F{{JnEOD5eu}m1A4Ud-TD25w1||lETG^EEx*!2&1_lNO<{RCv z9G%Ru#+P<5GB7Y4jy1kyeBkhe3CN~Ir!dQMFflNsSj+M-F)-A7bKkCThnZ@}eW1cB zg;@YBF9MR*;yzG8o?W~C{Qv*o`c_Q_%))L_kcG{MSgdc=2Xo)9@Q2yzw(CDg>7g21 zsMXz~AiJHc57m=seL_mNsSOhYL-)VeR^9FqeGkI+@iQ_oyy*G+|9=V7|7&q6{JT^w zm>3wCiq*pQF@U5BVN(3NR6$|LS)`b<@C73S1NVUvrvDe}u9?oy7{P=OMywH)lszd6*Ie;+&{0Apekd#$tf`vnDd=HChs zwJ;`jQRZ5Wi;tRr36#zNImZIxhzZ~X7rsk?fq|hrRss|}7RCo!Lpe$qJv!K#f8)c< zwF(y>HU0v{OzCNm$1LJw4=aEZw;VGALmLwVLpBow1G^6+14D3RaD0esM2M4Puqy-m z9+0ou?U)!C7}%#XL1f*09NmK%*w=yt86Ge*Ft`WB2l)7h#5*}Ud%Fkuhx)lNFeorG zFgOQ5#DkrKTwVR*Jq;NcBACF+LjznKLtNv-J^ft#!-GLF!@%I^;^^xb>>D2(;usVH zaw-FZQ$R?(pKC-210xRugcoYaz;FU$MudM*ypN}!D+417R1)Gah6p4lIeRz;F|ZXd zF)+A!`nklrMufNq`7y9{gWS%@0oCW|;u7Q<40T43YnW?Luxq@NXGm~-h@+E_D+9v~ lB+oec2f4Tgfjy(gf^fAf$kQ1}>L7jtsr%2sV9CJ1002}8@Bsh- literal 0 HcmV?d00001 diff --git a/LT/ADAM/ADAMASM.HPZ b/LT/ADAM/ADAMASM.HPZ new file mode 100644 index 0000000..ddb3df1 --- /dev/null +++ b/LT/ADAM/ADAMASM.HPZ @@ -0,0 +1,10 @@ +public LTextern CP_PLOT_SCREEN_I1 BoolU4 PlotScreenChar(U8 w,I8 x,I8 y); +public LTextern CP_PLOT_WINDOW_I1 BoolU4 PlotWindowChar(U8 w,I8 x,I8 y); +public LTextern CP_PLOT_BORDER_I1 BoolU4 PlotBorderChar(U8 w,I8 x,I8 y); + +LTextern REVERSE_BITS_TABLE U1 reverse_bits_table[256]; +LTextern GR_XOR_LINE void GrXorLine(U4 **dst3,U4 **src,U4 **src2,U8 d5,U4 **vga); +LTextern GR_PLOT_CHAR void GrPlotChar(U1 *font_ptr,U1 attr,U1 **dst2,U8 d1,U8 d2); +LTextern GR_PLOT_BACKGROUND void GrPlotBackground(U1 attr,U1 **dst,U8 d1,U8 d2); +LTextern GR_UPDATE_WINDOWS void GrUpdateWindows(); +//The callback is void Plot(aux_data,x,y,z) diff --git a/LT/ADAM/ADAMASM.MPZ b/LT/ADAM/ADAMASM.MPZ new file mode 100644 index 0000000000000000000000000000000000000000..b385402a95af689faec3be56f2068de4f242cbba GIT binary patch literal 1036 zcmY%K@m5fBbaC``4EBw8^>a~x0woRLT80Ut2`nmXr z6E@b&66RVne6Dp5f`)>lv$uPYf2f}e{!lQsFoBwD?26C1Fms(f9D^WHM!;MHSm+v? z5^!&5fQw^@Ydj<%f(gZ%DJ&d}2$>t<9~AH7>E{Y{E`IkK8JI)E!N?h(dwql5<6VLr z!{b97gT0|?4Zq38W>A9-A<5SemMNgQ0c0XH2>e}KgF&vvn{JI^4mC7z10`E@^MYK% hT!VsLy` literal 0 HcmV?d00001 diff --git a/LT/ADAM/AdamExt.CPZ b/LT/ADAM/AdamExt.CPZ new file mode 100644 index 0000000..a6788f6 --- /dev/null +++ b/LT/ADAM/AdamExt.CPZ @@ -0,0 +1,32 @@ +extern I8 PopUp(I1 *msg,TssStruct *parent=NULL); +extern U8 LtfPutChar(Ltf *l,I8 ch, U8 sc,BoolU4 old_preempt); +extern void LeftClickLink(Ltf *l,LtfEntry *cl,BoolU4 old_preempt2); +extern void RightClickLink(Ltf *l,LtfEntry *cl,BoolU4 old_preempt2); +extern U8 GetMsg(I8 *param1,I8 *param2,U8 mask=-2,TssStruct *tss=NULL); +extern U8 GetMsgNoWait(I8 *param1,I8 *param2,U8 mask=-2,TssStruct *tss=NULL); +extern void LtfInsert(Ltf *l,LtfEntry *ll); +extern LtfEntry *LtfPutS(Ltf *l,I1 *st); +extern I8 PopUpMenu(Ltf *l,I1 *help=NULL); +extern Ltf *LtfNew(); +extern void LtfDel(Ltf *l,BoolU4 root_mem=FALSE); +extern LtfEntry *LtfPrintF(Ltf *l,I1 *src,...); +extern void DrawBorder(BoolU4 solid,I8 l,I8 r,I8 t,I8 b,U1 attr,BoolU4 clip); +extern void EditInsertLtf(Ltf *l,Ltf *b); +extern Ltf *LtfRead(I1 *name,U8 flags=0); +extern BoolU4 View(); +extern BoolU4 IsPixelCovered(TssStruct *tss,I8 x,I8 y); +extern void PlotInputPointer(); +extern void GrCircle(GrBitMap *base,I8 cx,I8 cy,I8 radius, + I8 step=1,double start_rad=0,double len_rad=pi2); +extern void GrPlot0(GrBitMap *base,I8 x,I8 y); +extern void ClearAllBpts(Ltf *l); +extern void ToggleBpt(Ltf *l,I8 line_offset=0,U8 flags=SBPTF_BPT); +extern void LtfGo(); +extern void LtfStep(Ltf *l); +extern void Lpt1PutChar(U1 ch); +extern void WsFillin(I8 n); +extern void WsMan(I8 n,TssStruct *parent=NULL); +extern void WsTsk(); +extern TssStruct *ws_task; +extern void Edit(I1 *filename); + diff --git a/LT/ADAM/COMM.CPZ b/LT/ADAM/COMM.CPZ new file mode 100644 index 0000000..b68b37b --- /dev/null +++ b/LT/ADAM/COMM.CPZ @@ -0,0 +1,800 @@ +#define CH_XOFF 0x13 +#define CH_XON 0x11 + +#define UART_THR 0 +#define UART_RDR 0 +#define UART_BRDL 0 +#define UART_IER 1 +#define UART_BRDH 1 +#define UART_IIR 2 +#define UART_LCR 3 +#define UART_MCR 4 +#define UART_LSR 5 +#define UART_MSR 6 + +#define COMMf_INCOMING_XOFFED 0 +#define COMMf_OUTGOING_XOFFED 1 +#define COMMf_TX_XOFF 2 +#define COMMf_TX_XON 3 + +#define RMT_MAX_PKT_LEN 64 //Must be less then PKT_SYNC +#define RMT_PKT_ACK 0xA5 +#define RMT_PKT_NACK 0x5A +#define RMT_PKT_SYNC 0xA3 +#define RMT_PKT_SYNC2 0xA7 +#define RMT_PKT_CHAR 0xA4 +#define RMT_PKT_REQUEST 0xA6 +#define RMT_PKT_CLOSE 0xA8 + +#define RMT_RQST_NONE 0x00 +#define RMT_RQST_GETMSG 0x01 +#define RMT_RQST_TX_FILE 0x02 +#define RMT_RQST_RX_FILE 0x03 +#define RMT_RQST_TX_BUF 0x04 +#define RMT_RQST_RX_BUF 0x05 +#define RMT_RQST_EXE_LOCAL 0x06 +#define RMT_RQST_PUTS_CNT 0x07 + +#define RMT_RQST_MAX 0x07 + +U8 comm_base[5]={0,0x3F8,0x2F8,0x3E8,0x2E8}; +U1Fifo *comm_Rx_fifos[5]={NULL,NULL,NULL,NULL,NULL}; +U1Fifo *comm_Tx_fifos[5]={NULL,NULL,NULL,NULL,NULL}; +U8 comm_flags[5]={0,0,0,0,0}; +LTChnl *comm_chnls[5]={NULL,NULL,NULL,NULL,NULL}; + +public void RxClose(LTChnl *chnl) +{ + U8 base; + U8 old_flags=GetFlags; + if (!chnl || !chnl->type) return; + if (chnl->type==LCT_COMM) { + base=comm_base[chnl->port]; + OutP(base+UART_IER,0); + Cli; + if (comm_Rx_fifos[chnl->port]) { + DelU1Fifo(comm_Rx_fifos[chnl->port]); + comm_Rx_fifos[chnl->port]=NULL; + } + if (comm_Tx_fifos[chnl->port]) { + DelU1Fifo(comm_Tx_fifos[chnl->port]); + comm_Tx_fifos[chnl->port]=NULL; + } + comm_chnls[chnl->port]=NULL; + SetFlags(old_flags); + } + AFree(chnl); +} + +public void CommPutChar(U8 port,U1 b) +{ + U8 old_flags=GetFlags; + U8 base=comm_base[port]; + Cli; + if (b==CH_XOFF) + Bts(&comm_flags[port],COMMf_TX_XOFF); + else if (b==CH_XON) + Bts(&comm_flags[port],COMMf_TX_XON); + else { + if (U1FifoCnt(comm_Tx_fifos[port])>comm_Tx_fifos[port]->mask-4) { + SetFlags(old_flags); + while (U1FifoCnt(comm_Tx_fifos[port])>comm_Tx_fifos[port]->mask-4) + SwapInNext; + Cli; + } + if (Bt(&comm_flags[port],COMMf_OUTGOING_XOFFED)) { + SetFlags(old_flags); + while (Bt(&comm_flags[port],COMMf_OUTGOING_XOFFED)) + SwapInNext; + Cli; + } + if (comm_Tx_fifos[port]) + U1FifoInsert(comm_Tx_fifos[port],b); + } + OutP(base+UART_IER,3); //Enable TX & RX IRQ + SetFlags(old_flags); + BusyWait(300); +} + +public void RmtFlushRxFifo(LTChnl *chnl) +{ + if (!chnl || !chnl->type) return; + U1FifoFlush(comm_Rx_fifos[chnl->port]); + if (Bt(&comm_flags[chnl->port],COMMf_INCOMING_XOFFED)) + chnl->PutChar(chnl,CH_XON); +} + +public void RmtFlushTxFifo(LTChnl *chnl) +{ + U8 base=comm_base[chnl->port]; + if (!chnl || !chnl->type) return; + U1FifoFlush(comm_Tx_fifos[chnl->port]); + while (!(InP(base+UART_LSR) & 0x20)) + SwapInNext; +} + + +public void RmtPrintF(LTChnl *chnl,I1 *src,...) +{ + I1 *buf,*ptr; + if (!chnl || !chnl->type) return; + buf=SPrintFJoin(NULL,src,argc,argv); + ptr=buf; + while (*ptr) + chnl->PutChar(chnl,*ptr++); + Free(buf); +} + +public void CommPrintF(U8 port,I1 *src,...) +{ + RmtPrintF(comm_chnls[port],src,argc,argv); +} + + +void CommRxTxChar(U8 port) +{ + U8 ch=0,irq,base=comm_base[port]; + BoolU4 have_one; + if (comm_Rx_fifos[port] && + comm_Tx_fifos[port]) { + while (TRUE) { + irq=InP(base+UART_IIR); + if ((irq & 0x07)==4) { //RX IRQ + ch=InP(base+UART_RDR); + if (ch==CH_XOFF) + Bts(&comm_flags[port],COMMf_OUTGOING_XOFFED); + else if (ch==CH_XON) + Btr(&comm_flags[port],COMMf_OUTGOING_XOFFED); + else { + U1FifoInsert(comm_Rx_fifos[port],ch); + if (U1FifoCnt(comm_Rx_fifos[port])>comm_Rx_fifos[port]->mask>>1) + CommPutChar(port,CH_XOFF); + } + } else if ((irq & 0x07)==2) { //TX IRQ + have_one=TRUE; + if (Btr(&comm_flags[port],COMMf_TX_XOFF)) + ch=CH_XOFF; + else if (Btr(&comm_flags[port],COMMf_TX_XON)) + ch=CH_XON; + else if (!U1FifoRemove(comm_Tx_fifos[port],&ch)) + have_one=FALSE; + if (have_one) { + if (ch==CH_XOFF) + Bts(&comm_flags[port],COMMf_INCOMING_XOFFED); + else if (ch==CH_XON) + Btr(&comm_flags[port],COMMf_INCOMING_XOFFED); + OutP(base+UART_THR,ch); + } + if (!U1FifoCnt(comm_Tx_fifos[port])) + OutP(base+UART_IER,1); //Enable RX IRQ + } else + break; + } + } +} + +public I8 RmtRxFifoCnt(LTChnl *chnl) +{ + if (!chnl || !chnl->type) return 0; + return U1FifoCnt(comm_Rx_fifos[chnl->port]); +} + +public I8 RmtTxFifoCnt(LTChnl *chnl) +{ + if (!chnl || !chnl->type) return 0; + return U1FifoCnt(comm_Tx_fifos[chnl->port]); +} + +public void RmtWaitTxDone(LTChnl *chnl) +{ + U8 base=comm_base[chnl->port]; + if (!chnl || !chnl->type) return; + while (RmtTxFifoCnt(chnl)) + SwapInNext; + while (!(InP(base+UART_LSR) & 0x20)) + SwapInNext; +} + +void Irq03Handler() +{ + CommRxTxChar(2); + CommRxTxChar(4); +} + +void Irq04Handler() +{ + CommRxTxChar(1); + CommRxTxChar(3); +} + +public U1 CommGetChar(U8 port) +{ + U8 ch=0; + while (!U1FifoRemove(comm_Rx_fifos[port],&ch)) + SwapInNext; + if (Bt(&comm_flags[port],COMMf_INCOMING_XOFFED) && + U1FifoCnt(comm_Rx_fifos[port])mask>>2) + CommPutChar(port,CH_XON); + return ch; +} + +public U1 RmtGetChar(LTChnl *chnl) +{ + if (!chnl || !chnl->type) + return 0; + return CommGetChar(chnl->port); +} + +public BoolU4 CommScanChar(U8 port,U1 *ch) +{ + U8 ch1=0; + if (U1FifoPeek(comm_Rx_fifos[port],&ch1)) { + U1FifoRemove(comm_Rx_fifos[port],&ch1); + *ch=ch1; + if (Bt(&comm_flags[port],COMMf_INCOMING_XOFFED) && + U1FifoCnt(comm_Rx_fifos[port])mask>>2) + CommPutChar(port,CH_XON); + return TRUE; + } else + return FALSE; +} + +public BoolU4 RmtScanChar(LTChnl *chnl,U1 *ch) +{ + if (!chnl || !chnl->type) + return 0; + return CommScanChar(chnl->port,ch); +} + +void CommRmtPutChar(LTChnl *chnl,U1 b) +{ + CommPutChar(chnl->port,b); +} + +U1 CommRmtGetChar(LTChnl *chnl) +{ + return CommGetChar(chnl->port); +} + +BoolU4 CommRmtScanChar(LTChnl *chnl,U1 *ch) +{ + return CommScanChar(chnl->port,ch); +} + +public LTChnl *CommOpen8N1(U8 port=1,U8 baud=38400) +{ + LTChnl *chnl=NULL; + U8 old_flags=GetFlags,base=comm_base[port]; + Cli; + if (!port || port>4 || comm_chnls[port]) + goto co_exit; + chnl=AMAllocZ(sizeof(LTChnl)); + comm_chnls[port]=chnl; + chnl->type=LCT_COMM; + base=comm_base[port]; + chnl->port=port; + chnl->baud=baud; + chnl->PutChar=&CommRmtPutChar; + chnl->GetChar=&CommRmtGetChar; + chnl->ScanChar=&CommRmtScanChar; + if (comm_Rx_fifos[chnl->port]) + DelU1Fifo(comm_Rx_fifos[chnl->port]); + if (comm_Tx_fifos[chnl->port]) + DelU1Fifo(comm_Tx_fifos[chnl->port]); + comm_flags[chnl->port]=0; + comm_Rx_fifos[chnl->port]=NewU1Fifo(0x2000); //must be power of 2 + comm_Tx_fifos[chnl->port]=NewU1Fifo(0x2000); //must be power of 2 + OutP(base+UART_LCR,0); //Set for IER + OutP(base+UART_IER,0); + OutP(base+UART_LCR,0x80); //Enable baud rate control + OutP(base+UART_BRDL,(0x180/(baud/300)) & 0xFF); //LSB + OutP(base+UART_BRDH,(0x180/(baud/300)) / 256); //MSB + OutP(base+UART_LCR,3); // 8-none-1 + + InP(base+UART_RDR); //read garbage + InP(base+UART_LSR); + + OutP(base+UART_MCR,4); + OutP(base+UART_IER,0); //DIsable all IRQ + OutP(base+UART_MCR,0xA); //out2 and rts + OutP(base+UART_IER,1); //Enable RX IRQ +co_exit: + SetFlags(old_flags); + return chnl; +} + +public void CommClose(U8 port) +{ + LTChnl *chnl=comm_chnls[port]; + RxClose(chnl); +} + +ext[EXT_IRQ03]=&Irq03Handler; +ext[EXT_IRQ04]=&Irq04Handler; + +U8 RmtTxPktU1(LTChnl *chnl,U1 b) +{ + if (!chnl || !chnl->type) return 0; + if (b==CH_XOFF || b==CH_XON || + b==CH_ESC || b==RMT_PKT_CHAR || + b==RMT_PKT_REQUEST || + b==RMT_PKT_CLOSE) { + chnl->PutChar(chnl,CH_ESC); + chnl->PutChar(chnl,b^0x80); + return 2; + } else { + chnl->PutChar(chnl,b); + return 1; + } +} + +BoolU4 RmtRxPktU1(LTChnl *chnl,U1 *b, + U8 timeout_jiffies,BoolU4 *esc=NULL) +{ + U1 b1; + U8 timeout; + *b=RMT_PKT_NACK; + if (esc) + *esc=FALSE; + if (!chnl || !chnl->type) + return FALSE; + timeout=jiffies+timeout_jiffies; + while (jiffiesScanChar(chnl,&b1)) { + if (b1==CH_ESC) { + timeout=jiffies+timeout_jiffies; + while (jiffiesScanChar(chnl,&b1)) { + *b=b1^0x80; + if (esc) *esc=TRUE; + return TRUE; + } + SwapInNext; + } + return FALSE; + } else { + if (b1==RMT_PKT_CLOSE) { + Fs->rmt_chnl=NULL; + throw; + } + *b=b1; + return TRUE; + } + } + SwapInNext; + } + return FALSE; +} + +void RmtTxPkt(LTChnl *chnl,U1 *p,U8 size,U8 rqst=RMT_RQST_NONE) +{ + U1 b,xsum; + U8 i; + if (!chnl || !chnl->type) return; + if (rqst) { +rt_err1: + RmtFlushTxFifo(chnl); + chnl->PutChar(chnl,RMT_PKT_REQUEST); + RmtWaitTxDone(chnl); + RmtFlushRxFifo(chnl); + RmtTxPktU1(chnl,rqst); + RmtWaitTxDone(chnl); + RmtRxPktU1(chnl,&b,JIFFY_FREQ/50); + if (b!=RMT_PKT_ACK) + goto rt_err1; + } else if (size==1) { +rt_err2: + RmtFlushTxFifo(chnl); + chnl->PutChar(chnl,RMT_PKT_CHAR); + RmtWaitTxDone(chnl); + RmtFlushRxFifo(chnl); + RmtTxPktU1(chnl,p[0]); + RmtWaitTxDone(chnl); + RmtRxPktU1(chnl,&b,JIFFY_FREQ/50); + if (b!=RMT_PKT_ACK) + goto rt_err2; + } else { +rt_err3: + RmtFlushTxFifo(chnl); + RmtTxPktU1(chnl,RMT_PKT_SYNC); + RmtWaitTxDone(chnl); + RmtFlushRxFifo(chnl); + RmtTxPktU1(chnl,RMT_PKT_SYNC2); + RmtWaitTxDone(chnl); + RmtRxPktU1(chnl,&b,JIFFY_FREQ/50); + if (b!=RMT_PKT_ACK) + goto rt_err3; + RmtTxPktU1(chnl,size); + RmtWaitTxDone(chnl); + RmtRxPktU1(chnl,&b,JIFFY_FREQ/50); + if (b!=RMT_PKT_ACK) + goto rt_err3; + xsum=0x3A; + for (i=0;itype) { + if (size) *size=0; + if (rqst) *rqst=0; + return; + } +rr_start: + RmtFlushTxFifo(chnl); + if (RmtRxFifoCnt(chnl)>2) + RmtFlushRxFifo(chnl); + s=0; + r=0; + RmtRxPktU1(chnl,&b,JIFFY_FREQ); + RmtRxPktU1(chnl,&b1,JIFFY_FREQ/50,&esc); +rr_cont: + if (b==RMT_PKT_REQUEST) { + if (b1>RMT_RQST_MAX) { + if (b1==RMT_PKT_REQUEST && !esc) + goto rr_cont; + else + goto rr_err; + } + r=b1; + s=0; + goto rr_exit; + } else if (b==RMT_PKT_CHAR) { + if (b1==RMT_PKT_CHAR && !esc) + goto rr_cont; + *p=b1; + s=1; + goto rr_exit; + } else if (b==RMT_PKT_SYNC) { + if (b1!=RMT_PKT_SYNC2) { + if (b1==RMT_PKT_SYNC) + goto rr_cont; + else + goto rr_err; + } + RmtTxPktU1(chnl,RMT_PKT_ACK); + RmtWaitTxDone(chnl); + RmtRxPktU1(chnl,&s,JIFFY_FREQ/50); + if (s>RMT_MAX_PKT_LEN) + goto rr_err; + RmtTxPktU1(chnl,RMT_PKT_ACK); + RmtWaitTxDone(chnl); + xsum=0x3A; + for (i=0;itype) return; + while (cnt>0) { + if (cnttype) return NULL; + result=MAlloc(cnt); + buf=result; + while (cnt>0) { + RmtRxPkt(chnl,b,&size); + MemCpy(buf,b,size); + cnt-=size; + buf+=size; + progress1=cnt; + } + return result; +} + +public U8 RmtGetMsg(LTChnl *chnl,I8 *p1,I8 *p2) +{ + U8 cmd,d,size; + U1 b[RMT_MAX_PKT_LEN]; + *p1=0; + *p2=0; + if (!chnl || !chnl->type) + return 0; + if (jiffiesnull_msg_jiffy) + return 0; + else { + RmtTxPkt(chnl,NULL,0,RMT_RQST_GETMSG); + RmtRxPkt(chnl,b,&size); + if (size!=sizeof(U8)*3) + return 0; + cmd=b[0]><(U8); + *p1=b[8]><(U8); + *p2=b[16]><(U8); + if (!cmd) + chnl->null_msg_jiffy=jiffies+JIFFY_FREQ/50; + } + return cmd; +} + +public void RmtSendMsg(LTChnl *chnl,U8 cmd,I8 p1,I8 p2) +{ + U1 b[RMT_MAX_PKT_LEN]; + if (!chnl || !chnl->type) return; + if (cmd) { + b[0]><(U8)=cmd; + b[8]><(U8)=p1; + b[16]><(U8)=p2; + RmtTxPkt(chnl,b,sizeof(U8)*3); + } else + RmtTxPkt(chnl,b,1); +} + +public void RmtPutCharSC(LTChnl *chnl,I8 ch,U8 sc) +{ + if (!chnl || !chnl->type) return; + if (ch) + RmtTxPkt(chnl,&ch,1); +} + +public void RmtTxBuf(LTChnl *chnl,U1 *buf,U8 size) +{ + if (!chnl || !chnl->type) return; + if (buf) { + RmtTxBlk(chnl,&size,sizeof(U8)); + RmtTxBlk(chnl,buf,size); + } +} + +public U1 *RmtRxBuf(LTChnl *chnl,U8 *size=NULL) +{ + U1 *buf; + U8 *size2; + if (size) *size=0; + if (!chnl || !chnl->type) return NULL; + size2=RmtRxBlk(chnl,sizeof(U8)); + buf=RmtRxBlk(chnl,*size2); + if (size) *size=*size2; + Free(size2); + return buf; +} + +public void RmtTxFile(LTChnl *chnl,I1 *filename, + BoolU4 raw=TRUE) +{ + U8 size; + U1 *buf; + if (!chnl || !chnl->type) return; + buf=ReadFile(filename,&size,NULL,raw); + if (buf) { + RmtTxBuf(chnl,buf,size); + Free(buf); + } +} + +public U8 RmtRxFile(LTChnl *chnl,I1 *filename, + BoolU4 raw=TRUE) +{ + U8 size; + U1 *buf; + if (!chnl || !chnl->type) return 0; + if (buf=RmtRxBuf(chnl,&size)) { + WriteFile(filename,buf,size,0,0,raw); + Free(buf); + } + return size; +} + +public void RmtTxPutS(LTChnl *chnl,I1 *st) +{ + U8 len; + if (!chnl || !chnl->type) return; + if (st) { + len=StrLen(st); + if (len) { + if (len>RMT_MAX_PKT_LEN) { + RmtTxPkt(chnl,NULL,0,RMT_RQST_PUTS_CNT); + RmtTxBuf(chnl,st,len+1); + } else + RmtTxBlk(chnl,st,len); + } + } +} + +public void RmtTxPutChar(LTChnl *chnl,I8 ch) +{ + if (!chnl || !chnl->type) return; + if (ch) + RmtTxPkt(chnl,&ch,1); +} + +public I1 *RmtRxPutS(LTChnl *chnl,U8 *rqst=NULL) +{ + U1 b[RMT_MAX_PKT_LEN]; + U8 size; + U1 *buf=NULL; + if (!chnl || !chnl->type) return NULL; + if (RmtRxFifoCnt(chnl)>=2) { + RmtRxPkt(chnl,b,&size,rqst); + if (size) { + buf=MAlloc(size+1); + MemCpy(buf,b,size); + buf[size]=0; + } else + buf=MAllocZ(1); + } + return buf; +} + +/*************** +public U1 *RmtRqstTxBuf(U8 *size=NULL) +{ + LTChnl *chnl=Fs->rmt_chnl; + if (!chnl || !chnl->type) return NULL; + RmtTxPkt(chnl,NULL,0,RMT_RQST_TX_BUF); + return RmtRxBuf(chnl,size); +} + +public void RmtRqstRxBuf(U1 *buf,U8 size) +{ + LTChnl *chnl=Fs->rmt_chnl; + if (!chnl || !chnl->type) return; + RmtTxPkt(chnl,NULL,0,RMT_RQST_RX_BUF); + RmtTxBuf(chnl,buf,size); +} +*************/ + +public void RmtRqstTxFile(I1 *dst_local_filename,I1 *src_remote_filename) +{ + LTChnl *chnl=Fs->rmt_chnl; + if (!chnl || !chnl->type) return; + RmtTxPkt(chnl,NULL,0,RMT_RQST_TX_FILE); + RmtTxBuf(chnl,src_remote_filename,StrLen(src_remote_filename)+1); + RmtRxFile(chnl,dst_local_filename); +} + +public void RmtRqstRxFile(I1 *src_local_filename,I1 *dst_remote_filename) +{ + LTChnl *chnl=Fs->rmt_chnl; + if (!chnl || !chnl->type) return; + RmtTxPkt(chnl,NULL,0,RMT_RQST_RX_FILE); + RmtTxBuf(chnl,dst_remote_filename,StrLen(dst_remote_filename)+1); + RmtTxFile(chnl,src_local_filename); +} + +public void RmtRqstExeLocal(I1 *st) +{ + LTChnl *chnl=Fs->rmt_chnl; + if (!chnl || !chnl->type) return; + RmtTxPkt(chnl,NULL,0,RMT_RQST_EXE_LOCAL); + RmtTxBuf(chnl,st,StrLen(st)+1); +} + +void TelnetHostOpen(LTChnl *chnl) +{ + if (!chnl || !chnl->type) return; + Fs->rmt_chnl=chnl; +} + +void TelnetHostClose(LTChnl *chnl) +{ + Fs->rmt_chnl=NULL; +} + +void TelnetGuestOpen(LTChnl *chnl) +{ + U8 i,cmd,p1,p2,rqst; + U1 *st,*st2; + if (!chnl || !chnl->type) return; + coutln "CTRL-ALT-C to exit"; + try + while (TRUE) { + if (st2=RmtRxPutS(chnl,&rqst)) { + switch (rqst) { + case RMT_RQST_NONE: + PutS(st2); + break; + case RMT_RQST_GETMSG: + cmd=GetMsgNoWait(&p1,&p2, + 1<catch_except=TRUE; + for (i=0;i<5;i++) { + chnl->PutChar(chnl,RMT_PKT_CLOSE); + chnl->PutChar(chnl,RMT_PKT_CLOSE); + Sleep(50); + } +} + +ext[EXT_RMT_PUTCHAR]=&RmtTxPutChar; +ext[EXT_RMT_PUTS]=&RmtTxPutS; +ext[EXT_RMT_LTFPUTCHAR]=&RmtPutCharSC; +ext[EXT_RMT_GETMSG]=&RmtGetMsg; + \ No newline at end of file diff --git a/LT/ADAM/DISK10.CPZ b/LT/ADAM/DISK10.CPZ new file mode 100644 index 0000000..fb981b6 --- /dev/null +++ b/LT/ADAM/DISK10.CPZ @@ -0,0 +1,821 @@ + +public BoolU4 Copy(I1 *f1,I1 *f2=".") +{ + BoolU4 result=TRUE; + LTFileAccess *fa; + LTDirEntry *tempm,*tempm1; + U8 my_flags=0; + if (!(tempm=FindFiles(f1,&my_flags))) + return FALSE; + if (IsDir(f2)) { + fa=NewLTFileAccess(f2,TRUE); + if (fa) { + while (tempm) { + tempm1=tempm->next; + if (!(tempm->attr & LT_ATTR_DIR)) { + if (!CopySingle(tempm->full_name,tempm->name)) + result=FALSE; + } + DelLTDirEntry(tempm); + tempm=tempm1; + } + DelLTFileAccess(fa); + } + return result; + } else + return CopySingle(f1,f2); +} + +public BoolU4 Move(I1 *f1,I1 *f2) +{ + if (Copy(f1,f2)) { + Del(f1); + return TRUE; + } + return FALSE; +} + + +U8 PutCopyTree(LTDirEntry *tempm,U8 src_dir_len,U8 dst_dir_len,I1 *dst_dir) +{ + U8 result=0; + I1 *st; + while (tempm) { + st=MAlloc(StrLen(tempm->full_name)+dst_dir_len+2); + MemCpy(st,dst_dir,dst_dir_len); + StrCpy(st+dst_dir_len,tempm->full_name+src_dir_len); + if (tempm->attr & LT_ATTR_DIR) { + MkDir(st); + if (IsDir(st) && tempm->sub) + result+=PutCopyTree(tempm->sub,src_dir_len,dst_dir_len,dst_dir); + } else + if (CopySingle(tempm->full_name,st)) + result++; + Free(st); + tempm=tempm->next; + } + return result; +} + +public U8 CopyTree(I1 *src_mask,I1 *dst_mask) +{ //returns count of copied files (not dirs) + LTFileAccess *fa; + LTDirEntry *tempm=NULL; + U8 result=0,i1,i2,my_flags=(1<mask,&my_flags); + st1=CurDir; + DelLTFileAccess(fa); + i1=StrLen(st1); + if (i1==3) i1--; + + fa=NewLTFileAccess(dst_mask,TRUE,TRUE); + if (fa) { + st2=CurDir; + i2=StrLen(st2); + if (i2==3) i2--; + result=PutCopyTree(tempm,i1,i2,st2); + DelLTFileAccess(fa); + Free(st2); + } + DelLTDirList(tempm); + Free(st1); + } + return result; +} + +void DoDelTree(LTDirEntry *tempm1) +{ + U8 result=0; + LTDirEntry *tempm2; + while (tempm1) { + tempm2=tempm1->next; + if (tempm1->attr & LT_ATTR_DIR) { + if (tempm1->sub) + result+=DoDelTree(tempm1->sub); + SysDel(tempm1->full_name,TRUE); + } + DelLTDirEntry(tempm1); + tempm1=tempm2; + } +} + +public BoolU4 DelTree(I1 *mask) +{ + U8 my_flags=(1<next; + if (tempm1->attr & LT_ATTR_DIR) { + if (tempm1->sub) + DoDelMask(tempm1->sub); + } else + Del(tempm1->full_name); + DelLTDirEntry(tempm1); + tempm1=tempm2; + } +} + +public BoolU4 DelMask(I1 *mask) +{ //Purges select filetypes from tree + U8 my_flags=(1<next; + if (tempm1->attr & LT_ATTR_DIR) { + if (tempm1->sub) { + coutln SysText("ST_SCANNING_DIRECTORY"),tempm1->full_name; + TouchList(tempm1->sub,attr); + } + } else + TouchFile(tempm1->full_name,attr); + DelLTDirEntry(tempm1); + tempm1=tempm2; + } +} + +//Attr "+?" =show +// "+T" = resident +//flags "+r"=recurse +public void Touch(I1 *wild,I1 *attr="+?",I1 *flags="") +{ + FlagsStruct f; + GetFFlags(&f,"ST_FILE_UTIL_FLAGS",flags); + TouchList(FindFiles(wild,&f.on),attr); +} + +void FillBigEndianU2(U2 *dst,U2 w) +{ + U2 *src=&w; + dst->u1[0]=src->u1[1]; + dst->u1[1]=src->u1[0]; +} + +void FillBigEndianU4(U4 *dst,U8 d) +{ + U8 *src=&d; + dst->u1[0]=src->u1[3]; + dst->u1[1]=src->u1[2]; + dst->u1[2]=src->u1[1]; + dst->u1[3]=src->u1[0]; +} + +void FillU2Palindrome(U2Palindrome *dst,U2 w) +{ + FillBigEndianU2(&dst->big,w); + dst->little=w; +} + +void FillU4Palindrome(U4Palindrome *dst,U8 d) +{ + FillBigEndianU4(&dst->big,d); + dst->little=d; +} + + +class CCdUserData +{ + U8 location,path_entry_num, + short_dir_blks,long_dir_blks; +}; + +U8 DoCreateCDFile(LTFile *out_file,LTDirEntry *tempm, + ISODirEntry *tempi,ISODirEntry *tempi2, + U8 *cur_blk, + LTDirEntry *parent,BoolU4 write) +{ + CCdUserData *tempc; + LTDirEntry *tempm1,*tempm2; + LTFile *in_file; + U1 *buf=MAlloc(CD_BLK_SIZE),*ptr1,*ptr2; + ISODirEntry *dir_blk_buf=MAllocZ(CD_BLK_SIZE*128), + *de=dir_blk_buf,*de1; + ISODirEntry *dir_blk_buf2=MAllocZ(CD_BLK_SIZE*128), + *de2=dir_blk_buf2,*de12; + U8 i,l; + + tempc=parent->user_data; + + de->length=sizeof(ISODirEntry)-1; + de->ext_attr_length=0; + FillU2Palindrome(&de->volume_sequence_num,1); + LTDateToISO(&de->date,tempm->datetime); + de->flags=ISO_ATTR_DIR; + de->name_len=1; + de->name=0; + de->length+=de->name_len; + de+=de->length; + + de->length=sizeof(ISODirEntry)-1; + de->ext_attr_length=0; + FillU4Palindrome(&de->location,tempc->location); + FillU4Palindrome(&de->size,tempc->short_dir_blks*CD_BLK_SIZE); + FillU2Palindrome(&de->volume_sequence_num,1); + LTDateToISO(&de->date,parent->datetime); + de->flags=ISO_ATTR_DIR; + de->name_len=1; + de->name=1; + de->length+=de->name_len; + de+=de->length; + + de2->length=sizeof(ISODirEntry)-1; + de2->ext_attr_length=0; + FillU2Palindrome(&de2->volume_sequence_num,1); + LTDateToISO(&de2->date,tempm->datetime); + de2->flags=ISO_ATTR_DIR; + de2->name_len=1; + de2->name=0; + de2->length=de2->length+de2->name_len; + de2+=de2->length; + + de2->length=sizeof(ISODirEntry)-1; + de2->ext_attr_length=0; + FillU4Palindrome(&de2->location,tempc->location+tempc->short_dir_blks); + FillU4Palindrome(&de2->size,tempc->long_dir_blks*CD_BLK_SIZE); + FillU2Palindrome(&de2->volume_sequence_num,1); + LTDateToISO(&de2->date,parent->datetime); + de2->flags=ISO_ATTR_DIR; + de2->name_len=1; + de2->name=1; + de2->length+=de2->name_len; + de2+=de2->length; + + tempm1=tempm->sub; + while (tempm1) { + tempm2=tempm1->next; + if (!write) tempm1->user_data=MAllocZ(sizeof(CCdUserData)); + de1=de; + de12=de2; + if (tempm1->attr & LT_ATTR_DIR) { + l=DoCreateCDFile(out_file,tempm1,de,de2,cur_blk,tempm,write); + de+=sizeof(ISODirEntry)-1+l; + de2+=sizeof(ISODirEntry)-1+l<<1; + } else { + tempc=tempm1->user_data; + de->length=sizeof(ISODirEntry)-1; + de->ext_attr_length=0; + FillU4Palindrome(&de->location,*cur_blk); + tempc->location=*cur_blk; + if (write) + coutln *cur_blk,":",tempm1->full_name; + FillU4Palindrome(&de->size,tempm1->size); + FillU2Palindrome(&de->volume_sequence_num,1); + LTDateToISO(&de->date,tempm1->datetime); + de->flags=0; + de->name_len=StrLen(tempm1->name); + StrCpy(&de->name,tempm1->name); + de->length=de->length+de->name_len; + de+=de->length; + + de2->length=sizeof(ISODirEntry)-1; + de2->ext_attr_length=0; + FillU4Palindrome(&de2->location,*cur_blk); + FillU4Palindrome(&de2->size,tempm1->size); + FillU2Palindrome(&de2->volume_sequence_num,1); + LTDateToISO(&de2->date,tempm1->datetime); + de2->flags=0; + de2->name_len=StrLen(tempm1->name)<<1; + ptr1=&de2->name; + ptr2=&tempm1->name; + for (i=0;iname_len;i=i+2) { + ptr1++; + *ptr1++=*ptr2++; + } + de2->length+=de2->name_len; + de2+=de2->length; + + in_file=FOpen(tempm1->full_name,"r"); + for (i=0;i<(FSize(in_file)+CD_BLK_SIZE-1)/CD_BLK_SIZE;i++) { + l=4; + if ((i+1)<<2>(FSize(in_file)+BLK_SIZE-1)/BLK_SIZE) { + l=((FSize(in_file)+BLK_SIZE-1)/BLK_SIZE)%4; + MemSet(buf,0,CD_BLK_SIZE); + } + if (write) { + FRBlks(in_file,buf,i<<2,l); + FWBlks(out_file,buf,(*cur_blk)<<2,l); + } + *cur_blk+=1; + } + FClose(in_file); + } + if ((de1-dir_blk_buf)/CD_BLK_SIZE!= + (de -dir_blk_buf)/CD_BLK_SIZE) { + i=de1->length; + MemCpy(buf,de1,i); + MemSet(de1,0,i); + de=dir_blk_buf+((de-dir_blk_buf)/CD_BLK_SIZE)*CD_BLK_SIZE; + MemCpy(de,buf,i); + de+=i; + } + if ((de12-dir_blk_buf2)/CD_BLK_SIZE!= + (de2 -dir_blk_buf2)/CD_BLK_SIZE) { + i=de12->length; + MemCpy(buf,de12,i); + MemSet(de12,0,i); + de2=dir_blk_buf2+((de2-dir_blk_buf2)/CD_BLK_SIZE)*CD_BLK_SIZE; + MemCpy(de2,buf,i); + de2+=i; + } + tempm1=tempm2; + } + + tempc=tempm->user_data; + + tempi->length=sizeof(ISODirEntry)-1; + tempi->ext_attr_length=0; + tempi->flags=ISO_ATTR_DIR; + if (!tempm->name[0]) { + tempi->name_len=1; + tempi->name=1; + } else { + tempi->name_len=StrLen(tempm->name); + StrCpy(&tempi->name,tempm->name); + } + tempi->length+=tempi->name_len; + + l=de+1-dir_blk_buf; + l=(l+CD_BLK_SIZE-1)/CD_BLK_SIZE; + FillU4Palindrome(&tempi->size,l*CD_BLK_SIZE); + FillU4Palindrome(&tempi->location,*cur_blk); + tempc->short_dir_blks=l; + tempc->location=*cur_blk; + FillU4Palindrome(&dir_blk_buf->size,l*CD_BLK_SIZE); + FillU4Palindrome(&dir_blk_buf->location,*cur_blk); + FillU2Palindrome(&tempi->volume_sequence_num,1); + LTDateToISO(&tempi->date,tempm->datetime); + if (write) + coutln *cur_blk,":",tempm->full_name; + if (write) + FWBlks(out_file,dir_blk_buf,(*cur_blk)<<2,l<<2); + *cur_blk+=l; + + tempi2->length=sizeof(ISODirEntry)-1; + tempi2->ext_attr_length=0; + tempi2->flags=ISO_ATTR_DIR; + if (!tempm->name[0]) { + tempi2->name_len=1; + tempi->name=1; + } else { + tempi2->name_len=StrLen(tempm->name)<<1; + ptr1=&tempi2->name; + ptr2=&tempm->name; + for (i=0;iname_len;i=i+2) { + ptr1++; + *ptr1++=*ptr2++; + } + } + tempi2->length+=tempi2->name_len; + l=de2+1-dir_blk_buf2; + l=(l+CD_BLK_SIZE-1)/CD_BLK_SIZE; + FillU4Palindrome(&tempi2->size,l*CD_BLK_SIZE); + FillU4Palindrome(&tempi2->location,*cur_blk); + tempc->long_dir_blks=l; + FillU4Palindrome(&dir_blk_buf2->size,l*CD_BLK_SIZE); + FillU4Palindrome(&dir_blk_buf2->location,*cur_blk); + FillU2Palindrome(&tempi2->volume_sequence_num,1); + LTDateToISO(&tempi2->date,tempm->datetime); + if (write) + coutln *cur_blk,":",tempm->full_name; + if (write) + FWBlks(out_file,dir_blk_buf2,(*cur_blk)<<2,l<<2); + *cur_blk+=l; + + Free(dir_blk_buf); + Free(dir_blk_buf2); + Free(buf); + return tempi->name_len; +} + +U8 CDTableLength(LTDirEntry *tempm,U8 *size1,U8 *size2,U8 cur_depth) +//returns depth +{ + LTDirEntry *tempm1=tempm->sub; + U8 max_depth=cur_depth,i; + while (tempm1) { + if (tempm1->attr & LT_ATTR_DIR) { + *size1+=sizeof(ISOPathTableEntry)-2+((StrLen(tempm1->name)+1) & -0x2); + *size2+=sizeof(ISOPathTableEntry)-2+StrLen(tempm1->name)<<1; + i=CDTableLength(tempm1,size1,size2,cur_depth+1); + if (i>max_depth) max_depth=i; + } + tempm1=tempm1->next; + } + return max_depth; +} + +void CDFillPathTable(LTDirEntry *tempm, + ISOPathTableEntry *itabbuf,ISOPathTableEntry *itabbuf2, + U8 parent_entry_num,BoolU4 big_endian,U8 *first_free,I8 cur_level,I8 output_level) +{ + I1 *ptr1,*ptr2; + U8 i; + ISOPathTableEntry *tabbuf=*itabbuf; + ISOPathTableEntry *tabbuf2=*itabbuf2; + LTDirEntry *tempm1=tempm->sub,*tempm2; + CCdUserData *tempc; + + if (cur_level==output_level) { + while (tempm1) { + if (tempm1->attr & LT_ATTR_DIR) { + tempc=tempm1->user_data; + tempc->path_entry_num=*first_free; + tabbuf->name_len=StrLen(tempm1->name); + if (big_endian) { + FillBigEndianU4(&tabbuf->blk,tempc->location); + FillBigEndianU2(&tabbuf->parent_entry_num,parent_entry_num); + } else { + tabbuf->blk=tempc->location; + tabbuf->parent_entry_num=parent_entry_num; + } + StrCpy(&tabbuf->name,tempm1->name); + + tabbuf+=sizeof(ISOPathTableEntry)-2+ + ((StrLen(tempm1->name)+1) & -0x2); + + tabbuf2->name_len=StrLen(tempm1->name)<<1; + if (big_endian) { + FillBigEndianU4(&tabbuf2->blk,tempc->location+tempc->short_dir_blks); + FillBigEndianU2(&tabbuf2->parent_entry_num,parent_entry_num); + } else { + tabbuf2->blk=tempc->location+tempc->short_dir_blks; + tabbuf2->parent_entry_num=parent_entry_num; + } + ptr1=&tabbuf2->name; + ptr2=&tempm1->name; + for (i=0;iname_len;i=i+2) { + ptr1++; + *ptr1++=*ptr2++; + } + tabbuf2+=sizeof(ISOPathTableEntry)-2+ + StrLen(tempm1->name)<<1; + *first_free+=1; + } + tempm1=tempm1->next; + } + *itabbuf=tabbuf; + *itabbuf2=tabbuf2; + } + tempm1=tempm->sub; + while (tempm1) { + tempm2=tempm1->next; + if (tempm1->attr & LT_ATTR_DIR) { + tempc=tempm1->user_data; + CDFillPathTable(tempm1,itabbuf,itabbuf2,tempc->path_entry_num, + big_endian,first_free,cur_level+1,output_level); + } + tempm1=tempm2; + } +} + +class ElTorito +{ + U2 w[16]; + U1 bootable; //88=bootable 00=not bootable + U1 media_type; //0=no emulation 4=hard disk + U2 load_seg; //0000->07C0 + U1 sys_type; + U1 zero; + U2 sector_cnt; + U4 load_rba; //start address of virtual disk + U1 zero2[20]; +}; + +public U8 CreateCDFile(I1 *filename,I1 src_drive, + I1 *bootfile=NULL) +{ + ISOPrimaryDescriptor *iso =MAllocZ(CD_BLK_SIZE), + *iso1=MAllocZ(CD_BLK_SIZE), + *iso2=MAllocZ(CD_BLK_SIZE), + *iso3=MAllocZ(CD_BLK_SIZE); + LTDirEntry *rootdir=MAllocZ(sizeof(LTDirEntry)); + U8 my_flags=(1<attr=LT_ATTR_DIR; + rootdir->sub=FindFiles(mask,&my_flags); + rootdir->datetime=GetCurTimeLTDate; + rootdir->user_data=MAllocZ(sizeof(CCdUserData)); + tempc=rootdir->user_data; + tempc->path_entry_num=1; + + if (okay) { + cur_blk=CD_FILE_OFFSET>>2; + if (bootfile_buf) + cur_blk+=2; + DoCreateCDFile(out_file,rootdir, + &iso->root_directory_record, + &iso2->root_directory_record, + &cur_blk,rootdir,FALSE); + tabsize=sizeof(ISOPathTableEntry); + tabsize2=sizeof(ISOPathTableEntry); + max_depth=CDTableLength(rootdir,&tabsize,&tabsize2,1); + FillU4Palindrome(&iso->path_table_size,tabsize); + FillU4Palindrome(&iso2->path_table_size,tabsize2); + tabsize=(tabsize+CD_BLK_SIZE-1)/CD_BLK_SIZE; + cur_blk+=tabsize<<1; + tabsize2=(tabsize2+CD_BLK_SIZE-1)/CD_BLK_SIZE; + cur_blk+=tabsize2<<1; + } + if (okay) { + if (FileAttr(filename2) & LT_ATTR_CONTIGUOUS) + out_file=FOpen(filename2,"wc",cur_blk<<2); + else + out_file=FOpen(filename2,"w",cur_blk<<2); + if (!out_file) + okay=FALSE; + } + if (okay) { + cur_blk=0; + while (cur_blk>2) { + FWBlks(out_file,buf,cur_blk<<2,4); + cur_blk++; + } + iso->type=ISOT_PRIMARY_VOLUME_DESC; + StrCpy(iso->id,"CD001"); + iso->version=1; + FillU2Palindrome(&iso->volume_set_size,1); + FillU2Palindrome(&iso->volume_sequence_number,1); + FillU2Palindrome(&iso->logical_block_size,CD_BLK_SIZE); + iso->file_structure_version=1; + + iso2->type=ISOT_SUPPLEMENTARY_DESC; + StrCpy(iso2->id,"CD001"); + iso2->version=1; + FillU2Palindrome(&iso2->volume_set_size,1); + FillU2Palindrome(&iso2->volume_sequence_number,1); + FillU2Palindrome(&iso2->logical_block_size,CD_BLK_SIZE); + iso2->file_structure_version=1; + + iso1->type=ISOT_BOOT_RECORD; + StrCpy(iso1->id,"CD001"); + iso1->version=1; + StrCpy(iso1+7,"EL TORITO SPECIFICATION"); + + cur_blk=CD_FILE_OFFSET>>2; + + if (bootfile_buf) { + d=iso1+0x47; + *d=cur_blk; + et->w[0]=1; + StrCpy(&et->w[2],"LoseThos"); + et->w[15]=0xAA55; + j=0; + for (i=0;i<16;i++) //Checksum + j+=et->w[i]; + et->w[14]=-j; + if (bootfile_buf) + et->bootable=0x88; + et->media_type=0; //0=no emu 2=1.44meg 4=hard drive + et->sector_cnt=4; + et->load_rba=cur_blk+1; + coutln cur_blk,": Pre Boot Blk"; + FWBlks(out_file,et,cur_blk<<2,4); + cur_blk++; + + coutln cur_blk,": Boot Blk"; + FWBlks(out_file,bootfile_buf,cur_blk<<2,4); + cur_blk++; + } + + DoCreateCDFile(out_file,rootdir, + &iso->root_directory_record, + &iso2->root_directory_record, + &cur_blk,rootdir,TRUE); + + tabbuf=MAllocZ(tabsize*CD_BLK_SIZE); + iso->type_l_path_table=cur_blk; + tabbuf->name_len=2; //Fill-in adam entry + tempi=&iso->root_directory_record; + tabbuf->blk=tempi->location.little; + tabbuf->parent_entry_num=1; + tabbuf2=MAllocZ(tabsize2*CD_BLK_SIZE); + iso2->type_l_path_table=cur_blk+tabsize; + tabbuf2->name_len=2; //Fill-in adam entry + tempi=&iso2->root_directory_record; + tabbuf2->blk=tempi->location.little; + tabbuf2->parent_entry_num=1; + itabbuf=tabbuf+sizeof(ISOPathTableEntry); + itabbuf2=tabbuf2+sizeof(ISOPathTableEntry); + first_free=2; + for (i=1;i<=max_depth;i++) + CDFillPathTable(rootdir,&itabbuf,&itabbuf2, + 1,FALSE,&first_free,1,i); + coutln cur_blk,": Path Table 0"; + FWBlks(out_file,tabbuf,cur_blk<<2,tabsize<<2); + cur_blk+=tabsize; + coutln cur_blk,": Path Table 1"; + FWBlks(out_file,tabbuf2,cur_blk<<2,tabsize2<<2); + cur_blk+=tabsize2; + + + MemSet(tabbuf,0,tabsize*CD_BLK_SIZE); + FillBigEndianU4(&iso->type_m_path_table,cur_blk); + tabbuf->name_len=2; //Fill-in adam entry + tempi=&iso->root_directory_record; + tabbuf->blk=tempi->location.big; + FillBigEndianU2(&tabbuf->parent_entry_num,1); + MemSet(tabbuf2,0,tabsize2*CD_BLK_SIZE); + FillBigEndianU4(&iso2->type_m_path_table,cur_blk+tabsize); + tabbuf2->name_len=2; //Fill-in adam entry + tempi=&iso2->root_directory_record; + tabbuf2->blk=tempi->location.big; + FillBigEndianU2(&tabbuf2->parent_entry_num,1); + itabbuf=tabbuf+sizeof(ISOPathTableEntry); + itabbuf2=tabbuf2+sizeof(ISOPathTableEntry); + first_free=2; + for (i=1;i<=max_depth;i++) + CDFillPathTable(rootdir,&itabbuf,&itabbuf2, + 1,TRUE,&first_free,1,i); + coutln cur_blk,": Path Table 2"; + FWBlks(out_file,tabbuf,cur_blk<<2,tabsize<<2); + cur_blk+=tabsize; + coutln cur_blk,": Path Table 3"; + FWBlks(out_file,tabbuf2,cur_blk<<2,tabsize2<<2); + cur_blk+=tabsize2; + + DelLTDirList(rootdir); //TODO: Free user_data + FillU4Palindrome(&iso->volume_space_size,cur_blk); + FillU4Palindrome(&iso2->volume_space_size,cur_blk); + FWBlks(out_file,iso,16<<2,4); + + iso3->type=ISOT_TERMINATOR; + StrCpy(iso3->id,"CD001"); + iso3->version=1; + if (bootfile_buf) { + FWBlks(out_file,iso1,17<<2,4); + FWBlks(out_file,iso2,18<<2,4); + FWBlks(out_file,iso3,19<<2,4); + } else { + FWBlks(out_file,iso2,17<<2,4); + FWBlks(out_file,iso3,18<<2,4); + } + } else + cur_blk=0; + + FClose(out_file); + Free(tabbuf); + Free(tabbuf2); + Free(et); + Free(bootfile_buf); + Free(iso); + Free(iso1); + Free(iso2); + Free(iso3); + Free(filename2); + return cur_blk; +} + + +public void SetDriveTextAttr(I1 drive=0,U1 attr) +{ + LTPartition *p; + try { + p=DriveToPartition(drive); + p->text_attr=attr; + } catch { + Fs->catch_except=TRUE; + } +} + +public void PrintFDriveTextAttr(I1 drive=0) +{ + LTPartition *p=DriveToPartition(drive); + U1 fg=p->text_attr&0xF,bg=p->text_attr>>4; + if (fg!=bg) + PrintF("$$FG,%d$$$$BG,%d$$",fg,bg); +} + +U8 SizeFlattenLTDirTree(LTDirEntry *tempm) +{ + U8 result=0; + while (tempm) { + result+=sizeof(LTDirEntry)-offset(LTDirEntry.start)+1; + if (tempm->attr & LT_ATTR_DIR) + result+=SizeFlattenLTDirTree(tempm->sub); + tempm=tempm->next; + } + return result+1; +} + +U8 FillFlattenLTDirTree(LTDirEntry *tempm,U1 *dst) +{ + U8 result=0,i; + while (tempm) { + *dst++=1; + result++; + i=sizeof(LTDirEntry)-offset(LTDirEntry.start); + MemCpy(dst,&tempm->start,i); + dst+=i; + result+=i; + if (tempm->attr & LT_ATTR_DIR) { + i=FillFlattenLTDirTree(tempm->sub,dst); + dst+=i; + result+=i; + } + tempm=tempm->next; + } + *dst=0; + return result+1; +} + +public U1 *FlattenLTDirTree(LTDirEntry *tempm,U8 *size=NULL) +{ + U8 i=SizeFlattenLTDirTree(tempm); + U1 *buf=MAlloc(i); + FillFlattenLTDirTree(tempm,buf); + if (*size) *size=i; + return buf; +} + +U1 *DoUnflattenLTDirTree(U1 *src,LTDirEntry **tempm) +{ + U8 i; + LTDirEntry *tempm1; + if (*src++) { + tempm1=MAllocZ(sizeof(LTDirEntry)); + *tempm=tempm1; + i=sizeof(LTDirEntry)-offset(LTDirEntry.start); + MemCpy(&tempm1->start,src,i); + src+=i; + if (tempm1->attr & LT_ATTR_DIR) + src=DoUnflattenLTDirTree(src,&tempm1->sub); + src=DoUnflattenLTDirTree(src,&tempm1->next); + } else + *tempm=NULL; + return src; +} + +public LTDirEntry *UnflattenLTDirTree(U1 *src) +{ + LTDirEntry *tempm=NULL; + DoUnflattenLTDirTree(src,&tempm); + return tempm; +} + \ No newline at end of file diff --git a/LT/ADAM/EDIT.CPZ b/LT/ADAM/EDIT.CPZ new file mode 100644 index 0000000..c45d0e5 --- /dev/null +++ b/LT/ADAM/EDIT.CPZ @@ -0,0 +1,3346 @@ +#define EDIT_MENU_NAME "::/LT/ADAM/EDIT.MUZ" +public void LtfUpdateCurLtfWindow() +{ + LTPartition *p; + U1 attr=0; + Ltf *main=Fs->cur_ltf,*aux=Fs->aux_ltf; + ClearWindowText; + LtfUpdateWindowJoin(main,TRUE,TRUE,FALSE,FALSE); + if (main->flags & LTFF_ATTR_BY_PARTITION) { + p=Fs->cur_partition; + attr=p->text_attr; + } + if (main->flags & LTFF_ATTR_BY_FILENAME) { + try { + p=DriveToPartition(main->filename.name[0]); + } catch { + p=NULL; + Fs->catch_except=TRUE; + } + if (p) + attr=p->text_attr; + } + if ((attr & 0xF)!=(attr>>4)) + Fs->border_attribute=attr; + if (aux) { + if ((attr & 0xF)!=(attr>>4)) + aux->text_attribute=attr; + LtfUpdateWindowJoin(aux,TRUE,FALSE,FALSE,FALSE); + } +} + +public LtfEntry *LtfFindAnchor(Ltf *l,I1 *pattern) +{ + LtfEntry *ll=l->dummy.next; + while (ll!=l) { + if (ll->btype==LTFT_ANCHOR) { + if (!StrCmp(pattern,ll->aux_string)) { + l->cur_entry=ll; + l->cur_data_col=ll->min_col; + return ll; + } + } + ll=ll->next; + } + return NULL; +} + +void EditCursorLeft(Ltf *l,U8 sc) +{ + I1 *dst; + BoolU4 old_preempt=Preempt(OFF); + LtfEntry *cl=l->cur_entry,*original_cl=cl,*nl; + I8 cc=l->cur_data_col,y=cl->y; + if (sc & SCF_CTRL) { + while (cl->last!=l && (cl->last->y==y || + cl->last->flags & LTFLF_SKIP)) + cl=cl->last; //TODO: select? recurse? + cc=cl->min_col; + } else { + if (cc>cl->min_col) { + if (cl->btype==LTFT_TEXT && ccmax_col) { + nl=MAllocZ(sizeof(LtfEntryBase)+4,l->mem_tss); + nl->type=cl->type; + nl->flags=cl->flags; + dst=cl->display+cc; + nl->display=NewString(dst,l->mem_tss); + nl->max_col=StrLen(dst); + nl->x=cl->x; + nl->y=cl->y; + nl->indent=cl->indent; + nl->page_line_num=cl->page_line_num; + nl->left_margin=cl->left_margin; + nl->right_margin=cl->right_margin; + *dst=0; + cl->max_col=cc; + InsQue(nl,cl); + } + cc--; + if (cl->btype==LTFT_TEXT && cc>cl->min_col) { + nl=MAllocZ(sizeof(LtfEntryBase)+4,l->mem_tss); + nl->type=cl->type; + nl->flags=cl->flags; + dst=cl->display+cc; + nl->display=NewString(dst,l->mem_tss); + nl->max_col=StrLen(dst); + nl->x=cl->x; + nl->y=cl->y; + nl->indent=cl->indent; + nl->page_line_num=cl->page_line_num; + nl->left_margin=cl->left_margin; + nl->right_margin=cl->right_margin; + *dst=0; + cl->max_col=cc; + InsQue(nl,cl); + cl=nl; + cc=cl->min_col; + } + if ((sc & SCF_SHIFT)) + cl->type|=LTFLT_SELECTED; + else + cl->type&=~LTFLT_SELECTED; + } else { + cc=cl->min_col; + while (cl->last!=l && + (cl->last->btype==LTFT_SOFT_CR || + cl->last->flags & LTFLF_SKIP)) { + cl=cl->last; + if ((sc & SCF_SHIFT)) + cl->type|=LTFLT_SELECTED; + else + cl->type&=~LTFLT_SELECTED; + } + if (cl->last!=l) { + cl=cl->last; + if (cl->max_col>cl->min_col) { + cc=cl->max_col-1; + if (cl->btype==LTFT_TEXT && cc>cl->min_col) { + nl=MAllocZ(sizeof(LtfEntryBase)+4,l->mem_tss); + nl->type=cl->type; + nl->flags=cl->flags; + dst=cl->display+cc; + nl->display=NewString(dst,l->mem_tss); + nl->max_col=StrLen(dst); + nl->x=cl->x; + nl->y=cl->y; + nl->indent=cl->indent; + nl->page_line_num=cl->page_line_num; + nl->left_margin=cl->left_margin; + nl->right_margin=cl->right_margin; + *dst=0; + cl->max_col=cc; + InsQue(nl,cl); + cl=nl; + cc=cl->min_col; + } + } else + cc=cl->max_col; + if ((sc & SCF_SHIFT)) + cl->type|=LTFLT_SELECTED; + else + cl->type&=~LTFLT_SELECTED; + } + } + } + l->cur_data_col=cc; + l->cur_entry=cl; + if (cl!=original_cl) + LtfFormBackward(l); + l->recalc_start=l->cur_entry->last; + Preempt(old_preempt); +} + +void EditCursorRight(Ltf *l,U8 sc) +{ + BoolU4 old_preempt=Preempt(OFF); + I1 *dst; + LtfEntry *cl=l->cur_entry,*original_cl=cl,*nl; + I8 cc=l->cur_data_col,y=cl->y,old_flags,old_color; + l->recalc_start=cl->last; + if (sc & SCF_CTRL) { + while (cl!=l && ((cl->next->y==y && + cl->next->btype!=LTFT_SOFT_CR) || + cl->flags & LTFLF_SKIP)) + cl=cl->next; + if (cl->max_col>cl->min_col) + cc=cl->max_col-1; + else + cc=cl->min_col; + } else { + if (ccmax_col) { + if (cl->btype==LTFT_TEXT && cc>cl->min_col) { + nl=MAllocZ(sizeof(LtfEntryBase)+4,l->mem_tss); + nl->type=cl->type; + nl->flags=cl->flags; + nl->x=cl->x; + nl->y=cl->y; + nl->indent=cl->indent; + nl->page_line_num=cl->page_line_num; + nl->left_margin=cl->left_margin; + nl->right_margin=cl->right_margin; + dst=cl->display+cc; + nl->display=NewString(dst,l->mem_tss); + nl->max_col=StrLen(dst); + *dst=0; + cl->max_col=cc; + InsQue(nl,cl); + cl=nl; + cc=cl->min_col; + } + cc++; + old_flags=cl->flags; + old_color=cl->type; + if ((sc & SCF_SHIFT)) + cl->type|=LTFLT_SELECTED; + else + cl->type&=~LTFLT_SELECTED; + if (cl->btype==LTFT_TEXT && ccmax_col) { + nl=MAllocZ(sizeof(LtfEntryBase)+4,l->mem_tss); + nl->type=LTFT_TEXT | old_color & -0x100; + nl->flags=old_flags; + dst=cl->display+cc; + nl->display=NewString(dst,l->mem_tss); + nl->max_col=StrLen(dst); + cl->max_col=cc; + *dst=0; + nl->x=cl->x; + nl->y=cl->y; + nl->indent=cl->indent; + nl->page_line_num=cl->page_line_num; + nl->left_margin=cl->left_margin; + nl->right_margin=cl->right_margin; + InsQue(nl,cl); + cl=nl; + cc=cl->min_col; + } else if (cc>=cl->max_col) { + cl=cl->next; + cc=cl->min_col; + } + } else { + if (cl!=l) { + if (cc<=cl->min_col) { + if ((sc & SCF_SHIFT)) + cl->type|=LTFLT_SELECTED; + else + cl->type&=~LTFLT_SELECTED; + } + cl=cl->next; + while (cl!=l && cl->flags & LTFLF_SKIP) { + if ((sc & SCF_SHIFT)) + cl->type|=LTFLT_SELECTED; + else + cl->type&=~LTFLT_SELECTED; + cl=cl->next; + } + cc=cl->min_col; + if (cl->btype==LTFT_SOFT_CR) { + if ((sc & SCF_SHIFT)) + cl->type|=LTFLT_SELECTED; + else + cl->type&=~LTFLT_SELECTED; + cl=cl->next; + cc=cl->min_col; + } + } + } + } + l->cur_data_col=cc; + l->cur_entry=cl; + if (cl!=original_cl) + LtfFormForward(l); + Preempt(old_preempt); +} + +void EditLineUp(Ltf *l,U8 sc) +{ + BoolU4 old_preempt=Preempt(OFF); + I1 *dst; + I8 y,x; + LtfEntry *cl=l->cur_entry,*nl; + if (cl->btype==LTFT_HEX_EDIT) { + l->cur_data_col=l->cur_data_col-cl->display*3; + if (l->cur_data_col>=0) + return; + else { + y=cl->y; + l->cur_data_col=0; + } + } + x=l->x; y=l->y; + if (cl->btype==LTFT_TEXT) { + if (l->cur_data_col>cl->min_col && l->cur_data_colmax_col-1) { + nl=MAllocZ(sizeof(LtfEntryBase)+4,l->mem_tss); + nl->type=cl->type; + nl->flags=cl->flags; + dst=cl->display+l->cur_data_col; + nl->display=NewString(dst,l->mem_tss); + nl->max_col=StrLen(dst); + nl->y=cl->y; + nl->x=cl->x+l->cur_data_col<<2; + nl->indent=cl->indent; + nl->page_line_num=cl->page_line_num; + nl->left_margin=cl->left_margin; + nl->right_margin=cl->right_margin; + *dst=0; + cl->max_col=l->cur_data_col; + InsQue(nl,cl); + } else + if (l->cur_data_col==cl->min_col && cl->last!=l) + cl=cl->last; + } else + if (cl->last!=l) + cl=cl->last; + if ((sc & SCF_SHIFT)) + cl->type|=LTFLT_SELECTED; + else + cl->type&=~LTFLT_SELECTED; + l->cur_entry=cl; + LtfFormBackward(l); + cl=l->cur_entry; + while (cl->last!=l && (cl->y>=y || cl->flags & LTFLF_SKIP)) { + cl=cl->last; + if ((sc & SCF_SHIFT)) + cl->type|=LTFLT_SELECTED; + else + cl->type&=~LTFLT_SELECTED; + } + y=cl->y; + l->y=y; + while (cl!=l && (cl->y>=y && cl->x>=x || cl->flags & LTFLF_SKIP)) { + if ((sc & SCF_SHIFT)) + cl->type|=LTFLT_SELECTED; + else + cl->type&=~LTFLT_SELECTED; + cl=cl->last; + } + + if (cl==l || cl->ynext; + else { + if (cl->btype!=LTFT_TEXT) { + if (sc & SCF_SHIFT) + cl->type|=LTFLT_SELECTED; + else + cl->type&=~LTFLT_SELECTED; + } else { + if (cl->next->x==x) + cl=cl->next; + } + } + if (Bt(ltf_display_types,cl->btype)) { + l->cur_data_col=(x-cl->x)>>2; + if (cl->btype==LTFT_TEXT) { + if (l->cur_data_col>cl->max_col) + l->cur_data_col=cl->max_col; + } else { + if (l->cur_data_col>=cl->max_col) + l->cur_data_col=cl->max_col-1; + } + if (l->cur_data_colmin_col) + l->cur_data_col=cl->min_col; + } else + l->cur_data_col=cl->min_col; + if (cl->btype==LTFT_TEXT && cl->xcur_data_colmax_col-1) { + nl=MAllocZ(sizeof(LtfEntryBase)+4,l->mem_tss); + nl->type=cl->type; + nl->flags=cl->flags; + if ((sc & SCF_SHIFT)) + nl->type=cl->type | LTFLT_SELECTED; + else + nl->type=cl->type & ~LTFLT_SELECTED; + dst=cl->display+l->cur_data_col; + nl->display=NewString(dst,l->mem_tss); + nl->max_col=StrLen(dst); + nl->indent=cl->indent; + nl->page_line_num=cl->page_line_num; + nl->left_margin=cl->left_margin; + nl->right_margin=cl->right_margin; + nl->y=cl->y; + nl->x=cl->x+l->cur_data_col<<2; + *dst=0; + cl->max_col=l->cur_data_col; + InsQue(nl,cl); + cl=nl; + l->cur_data_col=cl->min_col; + } + } + l->cur_entry=cl; + LtfFormBackward(l); + l->recalc_start=l->cur_entry->last; + Preempt(old_preempt); +} + +void EditLineDown(Ltf *l,U8 sc) +{ + BoolU4 old_preempt=Preempt(OFF); + I1 *dst; + I8 y,x,old_flags=0,old_color; + LtfEntry *cl=l->cur_entry,*nl; + if (cl->btype==LTFT_HEX_EDIT) { + l->cur_data_col=l->cur_data_col+cl->display*3; + if (l->cur_data_col/3>=cl->len) { + if (cl->next!=l) + l->cur_entry=cl->next; + l->cur_data_col=l->cur_entry->min_col; + } + return; + } + if (cl==l) + l->recalc_start=cl; + else + l->recalc_start=cl->last; + x=l->x; y=l->y; + if (cl->btype==LTFT_TEXT) { + if (l->cur_data_col>cl->min_col && l->cur_data_colmax_col-1) { + nl=MAllocZ(sizeof(LtfEntryBase)+4,l->mem_tss); + nl->type=cl->type; + nl->flags=cl->flags; + if ((sc & SCF_SHIFT)) + nl->type=cl->type | LTFLT_SELECTED; + else + nl->type=cl->type & ~LTFLT_SELECTED; + dst=cl->display+l->cur_data_col; + nl->display=NewString(dst,l->mem_tss); + nl->max_col=StrLen(dst); + nl->indent=cl->indent; + nl->page_line_num=cl->page_line_num; + nl->left_margin=cl->left_margin; + nl->right_margin=cl->right_margin; + nl->y=cl->y; + nl->x=cl->x+l->cur_data_col<<2; + *dst=0; + cl->max_col=l->cur_data_col; + InsQue(nl,cl); + cl=nl; + l->cur_data_col=cl->min_col; + } + } + while (cl!=l && (cl->y<=y || cl->flags & LTFLF_SKIP)) { + if ((sc & SCF_SHIFT)) + cl->type|=LTFLT_SELECTED; + else + cl->type&=~LTFLT_SELECTED; + cl=cl->next; + } + y=cl->y; + l->y=y; + while (cl!=l && (cl->y<=y && cl->x<=x || cl->flags & LTFLF_SKIP)) { + old_flags=cl->flags; + old_color=cl->type; + if (cl->xflags & LTFLF_SKIP || + cl->x==x && !cl->max_col && + Bt(ltf_nondisplay_invisible_types,cl->btype)) { + if ((sc & SCF_SHIFT)) + cl->type|=LTFLT_SELECTED; + else + cl->type&=~LTFLT_SELECTED; + } + cl=cl->next; + } + + if (cl->last!=l && (cl->x>x || cl->y>y)) { + cl=cl->last; + l->cur_entry=cl; + LtfFormBackward(l); + cl=l->cur_entry; + } + if (Bt(ltf_display_types,cl->btype)) { + l->cur_data_col=(x-cl->x)>>2; + if (cl->btype==LTFT_TEXT) { + if (l->cur_data_col>cl->max_col) + l->cur_data_col=cl->max_col; + } else { + if (l->cur_data_col>=cl->max_col) + l->cur_data_col=cl->max_col-1; + } + if (l->cur_data_colmin_col) + l->cur_data_col=cl->min_col; + } else + l->cur_data_col=cl->min_col; + if (cl->btype==LTFT_TEXT) { + if (l->cur_data_col>cl->min_col && l->cur_data_colmax_col-1) { + nl=MAllocZ(sizeof(LtfEntryBase)+4,l->mem_tss); + nl->type=LTFT_TEXT | old_color & -0x100; + nl->flags=old_flags; + dst=cl->display+l->cur_data_col; + nl->display=NewString(dst,l->mem_tss); + nl->max_col=StrLen(dst); + *dst=0; + cl->max_col=l->cur_data_col; + nl->y=cl->y; + nl->indent=cl->indent; + nl->page_line_num=cl->page_line_num; + nl->left_margin=cl->left_margin; + nl->right_margin=cl->right_margin; + nl->x=cl->x+l->cur_data_col<<2; + InsQue(nl,cl); + cl=nl; + l->cur_data_col=cl->min_col; + } + } + l->cur_entry=cl; + LtfFormForward(l); + Preempt(old_preempt); +} + +void EditDelChar(Ltf *l) +{ + BoolU4 old_preempt=Preempt(OFF); + LtfEntry *cl=l->cur_entry; + + if (cl==l) { + Preempt(old_preempt); + return; + } else + l->recalc_start=cl->last; + if (cl->max_col!=0 && (cl->btype==LTFT_TEXT || cl->btype==LTFT_DATA)) { + if (cl->btype==LTFT_DATA) { + if (cl->flags & LTFLF_HAS_TERMINATOR && l->cur_data_col==cl->max_col-1) { + Preempt(old_preempt); + return; + } + } + if (l->cur_data_colmax_col) + StrCpy(cl->display+l->cur_data_col,cl->display+l->cur_data_col+1); + if (l->cur_data_col>=cl->max_col-1) { + l->cur_entry=cl->next; + l->cur_data_col=l->cur_entry->min_col; + } + LtfRemoveSoftCRs(l,l->cur_entry); + Preempt(old_preempt); + return; + } + l->cur_entry=cl->next; + l->cur_data_col=l->cur_entry->min_col; + RemQue(cl); + LtfDelEntry(cl,l->mem_tss); + LtfRemoveSoftCRs(l,l->cur_entry); + Preempt(old_preempt); +} + +void CheckDollarBufSize(Ltf *l) +{ + U1 *b; + if (l->dollar_buf_ptr>=l->dollar_buf_size-2) { + l->dollar_buf_size*=2; + b=MAlloc(l->dollar_buf_size,l->mem_tss); + MemCpy(b,l->dollar_buf,l->dollar_buf_ptr); + Free(l->dollar_buf,l->mem_tss); + l->dollar_buf=b; + } +} + + +public I8 LtfRunLine(Ltf *l,LtfEntry *cl,BoolU4 exited,BoolU4 old_preempt) +{ //Call with preempt off + I8 result=-1; + I1 ch=l->cmd_I1,*st; + I8 cb(Ltf *l,U1 *user,LtfEntry *ll); + + if (!exited) { + if (cl->flags & LTFLF_ESC) { + Msg(MSG_KEY_DOWN,CH_ESC,0,1<flags & LTFLF_QUIT) { + Msg(MSG_KEY_DOWN,CH_CTRLQ,0,1<btype==LTFT_LINK) { + if (ch==CH_SPACE) + LeftClickLink(l,cl,old_preempt); + else if (ch==CH_CR) + RightClickLink(l,cl,old_preempt); + return 0; + } + if (ch==CH_SPACE && cl->flags & LTFLF_TREE || cl->btype==LTFT_HIDE_START) + cl->flags^=LTFLF_COLLAPSED; + + if ((cl->btype>=LTFT_BUTTON && cl->btype<=LTFT_MENU_VALUE) || cl->btype==LTFT_PICTURE) { + if (cl->btype==LTFT_CHECK_BOX) + cl->flags^=LTFLF_CHECKED; + if (ch==CH_SPACE) { + if (cl->flags & LTFLF_LEFT_EXP) { + result=cl->left_exp; + Msg(MSG_CMD,result,0,1<flags & LTFLF_LEFT_CB) { + cb=cl->left_cb; + Preempt(old_preempt); + result=cb(l,l->user_data,cl); + Preempt(OFF); + Msg(MSG_CMD,result,0,1<flags & LTFLF_LEFT_MACRO) { + if (cl->flags & LTFLF_POPUP) { + st=NewString(cl->left_macro); + Preempt(old_preempt); + PopUp(st); + Preempt(OFF); + Free(st); + } else { + if (cl->flags & LTFLF_LEFT_AUTO) + AutoString("%s",cl->left_macro); + else + Auto(cl->left_macro); + } + } + } else if (ch==CH_CR) { + if (cl->flags & LTFLF_RIGHT_EXP) { + result=cl->right_exp; + Msg(MSG_CMD,result,0,1<flags & LTFLF_RIGHT_CB) { + cb=cl->right_cb; + Preempt(old_preempt); + result=cb(l,l->user_data,cl); + Preempt(OFF); + Msg(MSG_CMD,result,0,1<flags & LTFLF_RIGHT_MACRO) { + if (cl->flags & LTFLF_POPUP) { + st=NewString(cl->right_macro); + Preempt(old_preempt); + PopUp(st); + Preempt(OFF); + Free(st); + } else { + if (cl->flags & LTFLF_RIGHT_AUTO) + AutoString("%s",cl->right_macro); + else + Auto(cl->right_macro); + } + } + } + } + l->cmd_I1=CH_SPACE; + return result; +} + +void EditInsertChar(I8 ch,U8 sc,Ltf *l,BoolU4 old_preempt) +{ + BoolU4 old_preempt2=Preempt(OFF); + I1 *b,*src,*dst; + LtfEntry *cl=l->cur_entry,*nl; + I8 i,j,m,x=cl->x,y=cl->y; + + l->recalc_start=cl->last; + + if (l->flags & LTFF_IN_DOLLAR) { + if (!Bt(printable_chars_bitmap,ch)) + goto done; + CheckDollarBufSize(l); + l->dollar_buf[l->dollar_buf_ptr++]=ch; + if (ch!='$$') { + goto done; + } else { + l->dollar_buf[l->dollar_buf_ptr]=0; + LtfPutS(l,l->dollar_buf); + l->flags&=~LTFF_IN_DOLLAR; + l->dollar_buf_ptr=0; + goto done; + } + } else { + if (ch=='$$') { + if (!(l->flags & (LTFF_PLAIN_TEXT | LTFF_PLAIN_TEXT_WITH_TABS))) { + l->flags|=LTFF_IN_DOLLAR; + l->dollar_buf_ptr=0; + l->dollar_buf[l->dollar_buf_ptr++]=ch; + goto done; + } + } + } + + if (ch==CH_SPACE || ch==CH_CR) { + if (!(sc & SCF_CTRL) && !(sc & SCF_SHIFT)) { + if (cl->btype>=LTFT_BUTTON && cl->btype<=LTFT_MENU_VALUE || + cl->btype==LTFT_LINK || cl->flags & LTFLF_TREE || + cl->btype==LTFT_HIDE_START) { + l->cmd_I1=ch; + LtfRunLine(l,cl,FALSE,old_preempt); + goto done; + } + } + } + if (cl->btype==LTFT_HEX_EDIT) { + if (cl->flags & LTFLF_DATA_IS_PTR) + b=cl->data; + else + b=&cl->data; + i=l->cur_data_col; + j=i%(cl->display*3); + m=i/(cl->display*3)*cl->display; + if (j>=cl->display<<1) + b[j-cl->display<<1+m]=ch; + else { + ch=ToUpper(ch)-'0'; + if (ch>9) ch=ch+'0'-'A'+10; + if (ch>15) goto done; + m=j>>1+m; + if (j & 1) + b[m]=b[m] & 0xF0| ch; + else + b[m]=b[m] & 0xF | ch<<4; + } + l->cur_data_col++; + goto done; + } + if (cl->btype==LTFT_DATA && cl->flags & LTFLF_REFRESH_DATA) + goto done; + if (l->flags & LTFF_OVERSTRIKE) { + if (ch==13) { + while (l->cur_entry->next!=l && l->cur_entry->y==y) + l->cur_entry=l->cur_entry->next; + l->cur_data_col=l->cur_entry->min_col; + } else { + if (Bt(displayable_chars_bitmap,ch)) { + if (cl->btype==LTFT_TEXT) { + if (cl->display[l->cur_data_col]) { + cl->display[l->cur_data_col++]=ch; + goto done; + } + } else if (cl->btype==LTFT_DATA) { + if (cl->flags & LTFLF_HAS_TERMINATOR) { + if (cl->display[l->cur_data_col] && + l->cur_data_colmin_col+cl->len) { + cl->display[l->cur_data_col++]=ch; + if ( !(cl->display[l->cur_data_col])) { + cl->display[l->cur_data_col]='_'; + cl->display[l->cur_data_col+1]=0; + } + } + } else { + if (cl->display[l->cur_data_col]) + cl->display[l->cur_data_col++]=ch; + } + goto done; + } + b=MAlloc(2,l->mem_tss); + b[0]=ch; + b[1]=0; + nl=MAllocZ(sizeof(LtfEntryBase)+4,l->mem_tss); + nl->type=LTFT_TEXT | l->text_attribute << 8; + nl->display=b; + nl->max_col=1; + nl->x=cl->x; + nl->y=cl->y; + nl->indent=cl->indent; + nl->page_line_num=cl->page_line_num; + nl->left_margin=cl->left_margin; + nl->right_margin=cl->right_margin; + InsQue(nl,cl->last); + } + } + goto done; + } + if (ch==CH_CR || ch==CH_TAB) { + nl=MAllocZ(sizeof(LtfEntryBase),l->mem_tss); + if (ch==CH_CR) { + if (sc & SCF_CTRL && !(sc & SCF_SHIFT)) + nl->type=LTFT_PAGE_BREAK | l->text_attribute << 8; + else + nl->type=LTFT_CR | l->text_attribute << 8; + } else + nl->type=LTFT_TAB | l->text_attribute << 8; + LtfInsert(l,nl); + } else { + if (ch>=CH_SHIFT_SPACE && ch<=0x7E) { + if (cl->btype==LTFT_DATA) { + i=cl->len+cl->min_col; + if (cl->flags & LTFLF_HAS_TERMINATOR) + i++; + if (i>cl->max_col) { + b=cl->display; + cl->max_col++; + for (i=cl->max_col;i>l->cur_data_col;i--) + b[i]=b[i-1]; + b[l->cur_data_col++]=ch; + } + } else if (cl->btype==LTFT_TEXT) { + b=MAlloc(cl->max_col+2,l->mem_tss); + dst=b; + src=cl->display; + i=l->cur_data_col; + while (i-->0) + *dst++=*src++; + *dst++=ch; + while (*dst++=*src++); + Free(cl->display,l->mem_tss); + cl->display=b; + cl->max_col++; + l->cur_data_col++; + } else { + b=MAlloc(2,l->mem_tss); + b[0]=ch; + b[1]=0; + nl=MAllocZ(sizeof(LtfEntryBase)+4,l->mem_tss); + nl->type=LTFT_TEXT | l->text_attribute << 8; + nl->display=b; + nl->max_col=1; + nl->x=cl->x+4; + nl->y=cl->y; + nl->indent=cl->indent; + nl->page_line_num=cl->page_line_num; + nl->left_margin=cl->left_margin; + nl->right_margin=cl->right_margin; + InsQue(nl,cl->last); + } + } + } +done: + LtfRemoveSoftCRs(l,l->cur_entry); + Preempt(old_preempt2); +} + +void EditDelLine(Ltf *l) +{ + LtfEntry *cl=l->cur_entry,*cl2; + I8 y; + y=l->y; + while (cl!=l && cl->y==y) + cl=cl->next; + l->cur_entry=cl; + l->cur_data_col=cl->min_col; + cl=cl->last; + while (cl!=l && cl->y==y) { + cl2=cl->last; + RemQue(cl); + LtfDelEntry(cl,l->mem_tss); + cl=cl2; + } + if (cl==l) + l->recalc_start=cl; + else + l->recalc_start=cl->last; +} + +public void LtfLoad(Ltf *l,I1 *src2,U8 size) +{ + I8 i; + I1 *src; + LtfBinEntry *tempb; + if (src2) { + LtfPutS(l,src2); + src=src2+StrLen(src2)+1; + i=size-(offset(LtfBinEntry.data)-offset(LtfBinEntry.start)); + while (src<=src2+i) { + tempb=MAllocZ(sizeof(LtfBinEntry)); + MemCpy(&tempb->start,src,offset(LtfBinEntry.data)-offset(LtfBinEntry.start)); + src+=offset(LtfBinEntry.data)-offset(LtfBinEntry.start); + tempb->data=MAlloc(tempb->size); + if (tempb->size) { + MemCpy(tempb->data,src,tempb->size); + src+=tempb->size; + } + InsQue(tempb,l->bin_root.last); + if (tempb->num>=l->cur_bin_num) + l->cur_bin_num=tempb->num+1; + } + } + if (!(l->flags & (LTFF_PLAIN_TEXT|LTFF_PLAIN_TEXT_WITH_TABS))) + LtfValidateBins(l); + l->recalc_start=l; + LtfRecalc(l); +} + +public Ltf *LtfRead(I1 *name,U8 flags=0) +{ + Ltf *l=LtfNew; + I1 *src,*name2; + U8 size=0; + l->flags|=flags; + name2=AbsoluteFileName(name); + StrCpy(l->filename.name,name2); + src=ReadFile(name2,&size,&l->file_attr); + Free(name2); + + if (src) { + LtfLoad(l,src,size); + Free(src); + } + return l; +} + +public I1 *LtfSave(Ltf *l,U8 *size=NULL) +{ + LtfEntry *cl; + LtfBinEntry *b; + I1 *st; + U8 cnt=2; //cursor + terminator + I1 *result,*dst,*src,ch; + I8 i; + if (!(l->flags & (LTFF_PLAIN_TEXT|LTFF_PLAIN_TEXT_WITH_TABS))) + LtfValidateBins(l); + l->recalc_start=l; + LtfRecalc(l); + for (cl=l->dummy.next;cl!=l;cl=cl->next) { + if (!Bt(ltf_data_types,cl->btype)) { + if (cl->btype==LTFT_TEXT && + !(cl->flags & ~(LTFLF_WORD_WRAP |LTFLF_UNDERLINED | + LTFLF_INVERTED | LTFLF_BLINK | LTFLF_SKIP))) { + cnt+=StrLen(cl->display); + if (!(l->flags & (LTFF_PLAIN_TEXT | LTFF_PLAIN_TEXT_WITH_TABS))) + cnt+=Occurrences(cl->display,'$$'); + } else if (cl->btype==LTFT_TAB || cl->btype==LTFT_PAGE_BREAK) + cnt++; + else if (cl->btype==LTFT_CR) + cnt+=2; + else if (cl->btype!=LTFT_SOFT_CR && + cl->btype!=LTFT_CURSOR && + cl->btype!=LTFT_BPT) { + st=cl->plain_text; + cl->plain_text=LtfToPlainText(cl); + Free(st); + cnt+=StrLen(cl->plain_text)+2; + } + } + } + for (b=l->bin_root.next;b!=&l->bin_root;b=b->next) + cnt+=offset(LtfBinEntry.data)- + offset(LtfBinEntry.start)+b->size; + result=MAlloc(cnt); + dst=result; + for (cl=l->dummy.next;cl!=l;cl=cl->next) { + if (!Bt(ltf_data_types,cl->btype)) { + if (cl->btype==LTFT_TEXT && + !(cl->flags & ~(LTFLF_WORD_WRAP |LTFLF_UNDERLINED | + LTFLF_INVERTED | LTFLF_BLINK | LTFLF_SKIP))) { + src=cl->display; + i=0; + while (ch=*src++) { + if (cl==l->cur_entry && i++==l->cur_data_col) + *dst++=CH_CURSOR; + *dst++=ch; + if (ch=='$$') { + if (!(l->flags & (LTFF_PLAIN_TEXT | LTFF_PLAIN_TEXT_WITH_TABS))) + *dst++=ch; + } + } + if (cl==l->cur_entry && i++==l->cur_data_col) + *dst++=CH_CURSOR; + } else { + if (cl==l->cur_entry) + *dst++=CH_CURSOR; + if (cl->btype==LTFT_TAB) + *dst++=CH_TAB; + else if (cl->btype==LTFT_PAGE_BREAK) + *dst++=CH_FORM_FEED; + else if (cl->btype==LTFT_CR) { + *dst++=CH_CR; + *dst++=CH_LINE_FEED; + } else if (cl->btype!=LTFT_SOFT_CR && + cl->btype!=LTFT_CURSOR && + cl->btype!=LTFT_BPT) { + *dst++='$$'; + StrCpy(dst,cl->plain_text); + dst+=StrLen(cl->plain_text); + *dst++='$$'; + } + } + } + } + *dst++=0; + b=l->bin_root.next; + if (b!=&l->bin_root) { + while (b!=&l->bin_root) { + MemCpy(dst,&b->type,offset(LtfBinEntry.data)-offset(LtfBinEntry.start)); + dst+=offset(LtfBinEntry.data)-offset(LtfBinEntry.start); + MemCpy(dst,b->data,b->size); + dst+=b->size; + b=b->next; + } + } else + cnt--; + if (size) *size=cnt; + return result; +} + +I1 *EditOverStrikeCB(Ltf *l,Ltf *user_data,LtfEntry *ll,TssStruct *mem_tss) +{ + I1 *st=MAlloc(2,mem_tss); + st[0]=(user_data->flags & LTFF_OVERSTRIKE) ? 'O':130; + st[1]=0; + return st; +} + +I1 *EditDollarCB(Ltf *l,Ltf *user_data,LtfEntry *ll,TssStruct *mem_tss) +{ + I1 *st=MAlloc(2,mem_tss); + st[0]=(user_data->flags & LTFF_IN_DOLLAR) ? '$$':130; + st[1]=0; + return st; +} + +I1 *EditQuotesCB(Ltf *l,Ltf *user_data,LtfEntry *ll,TssStruct *mem_tss) +{ + LexStruct *lx=mem_tss->last_lex; + I1 *st=MAlloc(2,mem_tss); + st[0]=(lx->flags & LF_IN_QUOTES) ? '"':130; + st[1]=0; + return st; +} + +I1 *EditBracesCB(Ltf *l,Ltf *user_data,LtfEntry *ll,TssStruct *mem_tss) +{ + LexStruct *lx=mem_tss->last_lex; + I1 *st=MAlloc(2,mem_tss); + st[0]=(lx->braces_cnt) ? '}':130; + st[1]=0; + return st; +} + +I1 *EditSemicolonCB(Ltf *l,Ltf *user_data,LtfEntry *ll,TssStruct *mem_tss) +{ + LexStruct *lx=mem_tss->last_lex; + I1 *st=MAlloc(2,mem_tss); + st[0]=(lx->statement_cnt) ? ';':130; + st[1]=0; + return st; +} + +I1 *EditDollarTypeCB(Ltf *l,Ltf *user_data,LtfEntry *ll,TssStruct *mem_tss) +{ + I1 *src=SysTextSub(user_data->cur_entry->btype,"ST_LTF_CMDS"); + I1 *st=MAllocZ(4,mem_tss); + if (user_data->cur_entry==user_data) { + StrCpy(st,"EOF"); + } else if (src) StrCpy(st,src); + return st; +} + +public BoolU4 DoLtf(Ltf *l,BoolU4 home=TRUE,I1 *help=NULL,BoolU4 help_is_file=FALSE) +{ + Ltf *menu=NULL,*old_ltf=Fs->cur_ltf,*old_aux=Fs->aux_ltf,*aux; + U8 sc=0; + I8 old_attribute=Fs->text_attribute; + I8 ch=0; + LtfEntry *ll; + U8 my_LtfPutChar(LTChnl *chnl,I8 ch,U8 sc); + BoolU4 old_update=Fs->update_window; + + if (help && !l->menu_ltf) { + if (help_is_file) + menu=LtfRead(help); + else { + menu=LtfNew; + menu->text_attribute=l->text_attribute; + LtfPutS(menu,help); + } + l->menu_ltf=menu; + } + + l->tss=Fs; + aux=LtfNew; + aux->text_attribute=Fs->border_attribute; + LtfPutS(aux,"$$CM +TY,0,-1$$"); + if (Bt(&Fs->crt_flags,CRTf_HAS_CLOSE_WINDOW)) + LtfPutS(aux,"$$TX+RX+BD,\"[X]\"$$"); + if (l->menu_ltf) + LtfPutS(aux,"$$TX+LX+BD,\"MENU\"$$"); + + ll=LtfPutS(aux,"$$DA-T-P+BD+RD+CX+SCX+IV,256,\"%s...\",16$$"); + ll->data=&l->filename.name; + LtfFormatData(ll); + + LtfPutS(aux,"$$CM+BY+RX,-24,1$$"); + ll=LtfPutS(aux,"$$TX+BD+DC+RD,\" \"$$"); + ll->display_cb=&EditDollarTypeCB; + LtfPutS(aux,"$$CM+BY+RX,-21,1$$"); + ll=LtfPutS(aux,"$$TX+BD+DC+RD,\" \"$$"); + ll->display_cb=&EditOverStrikeCB; + LtfPutS(aux,"$$CM+BY+RX,-20,1$$"); //gets merged without this + ll=LtfPutS(aux,"$$TX+BD+DC+RD,\" \"$$"); + ll->display_cb=&EditDollarCB; + + ll=LtfPutS(aux,"$$DA+BD+RD-T,32,\"Line:%04d \"$$"); + ll->data=&l->line; + LtfFormatData(ll); + ll=LtfPutS(aux,"$$DA+BD+RD-T,32,\"Col:%04d\"$$\r\n"); + ll->data=&l->col; + LtfFormatData(ll); + aux->user_data=l; + Fs->aux_ltf=aux; + + l->recalc_start=l; + LtfRecalc(l); + + if (home) + LtfHome(l); + Fs->cur_ltf=l; + Fs->text_attribute=l->text_attribute; + AssignBit(&Fs->crt_flags,CRTf_HAS_MENU,l->menu_ltf); + Fs->update_window=&LtfUpdateCurLtfWindow; + Bts(&Fs->crt_flags,CRTf_SHOW); + do { + ch=GetChar2(&sc); + LtfPutChar(l,ch,sc,Bt(&sys_flags,SYSf_PREEMPTIVE)); + if (Fs->rmt_chnl) { + my_LtfPutChar=ext[EXT_RMT_LTFPUTCHAR]; + my_LtfPutChar(Fs->rmt_chnl,ch,sc); + } + LtfRecalc(l); + } while (ch!=CH_ESC && ch!=CH_CTRLQ); + Fs->cur_ltf=old_ltf; + Fs->aux_ltf=old_aux; + AssignBit(&Fs->crt_flags,CRTf_HAS_MENU,old_ltf->menu_ltf); + Fs->text_attribute=old_attribute; + Fs->update_window=old_update; + LtfDel(aux); + if (menu) { + l->menu_ltf=NULL; + LtfDel(menu); + } + return ch==CH_ESC; +} + + +public BoolU4 DoForm(U1 *D,I1 *class_name, + I1 *help=NULL,BoolU4 help_is_file=FALSE, + I1 *header=NULL,I1 *footer=NULL) +{ + BoolU4 result=FALSE; + MemberListStruct *ml; + LtfEntry *ll; + I8 ch=0; + ClassStruct *cl=FindLocalHash(class_name,HTT_CLASS); + Ltf *l; + if (!cl) return FALSE; + l=LtfNew; + if (header) LtfPutS(l,header); + l->flags|=LTFF_OVERSTRIKE | LTFF_FORM; + ml=cl->member_list; + while (ml) { + if (ml->fmtstr) { + ll=LtfPutS(l,ml->fmtstr); + ll->data=D+ml->offset; + ll->my_format_data=ml->fmtdata; + LtfFormatData(ll); + } + ml=ml->next; + } + if (footer) LtfPutS(l,footer); + if (l->dummy.next!=l) { + l->flags&=~(LTFF_ATTR_BY_PARTITION | LTFF_ATTR_BY_FILENAME); + LtfRecalc(l); + if (DoLtf(l,TRUE,help,help_is_file)) { + ll=l->dummy.next; + while (ll!=l) { + if (ll->btype==LTFT_DATA || ll->btype==LTFT_CHECK_BOX) + LtfGetData(ll); + ll=ll->next; + } + result=TRUE; + } + } + LtfDel(l); + return result; +} + + +public I8 DoMenu(Ltf *m,I1 *help=NULL) +{ + LtfEntry *ll; + I8 result=-1; + BoolU4 old_preempt=Preempt(OFF); + if (m) { + m->flags&=~(LTFF_ATTR_BY_PARTITION | LTFF_ATTR_BY_FILENAME); +//TODO: preempt is off and popup in ltf could be run with preempt off + if (DoLtf(m,TRUE,help)) { + ll=m->cur_entry; + if (ll!=m) + result=LtfRunLine(m,ll,TRUE,old_preempt); + } + } + Preempt(old_preempt); + return result; +} + +public void LtfWrite(Ltf *l,BoolU4 prompt=FALSE) +{ + U8 size; + I1 *buf=LtfSave(l,&size); + if (prompt) { + if (DoForm(&l->filename,"EditFileNameStruct")) + WriteFile(l->filename.name,buf,size,0,l->file_attr); + } else + WriteFile(l->filename.name,buf,size,0,l->file_attr); + Free(buf); +} + +public void DelClipboard() +{ + LtfReset(sys_clipboard_ltf,TRUE,TRUE); +} + + +public void EditCopyToClipboard(Ltf *l) +{ + Ltf *b=sys_clipboard_ltf; + LtfEntry *cl=l->dummy.next,*nl; + LtfBinEntry *tempb; + DelClipboard(); + while (cl!=l) { + if (cl->type & LTFLT_SELECTED) { + cl->type&=~LTFLT_SELECTED; + if (!Bt(ltf_data_types,cl->btype)) { + nl=LtfCopyEntry(b,cl); + InsQue(nl,b->dummy.last); + } + } + cl=cl->next; + } +} + +public void EditCutToClipboard(Ltf *l) +{ + Ltf *b=sys_clipboard_ltf; + LtfEntry *cl=l->dummy.next,*cl1,*nl,*cl2=NULL; + LtfBinEntry *tempb; + DelClipboard(); + while (cl!=l) { + cl1=cl->next; + if (cl->type & LTFLT_SELECTED) { + cl->type&=~LTFLT_SELECTED; + if (!Bt(ltf_data_types,cl->btype)) { + nl=LtfCopyEntry(b,cl); + InsQue(nl,b->dummy.last); + } + if (cl==l->cur_entry || cl==cl2) + cl2=cl->next; + RemQue(cl); + LtfDelEntry(cl,l->mem_tss); + } + cl=cl1; + } + if (cl2) { + l->cur_entry=cl2; + l->cur_data_col=cl2->min_col; + } + l->recalc_start=l; + LtfRemoveSoftCRs(l,NULL); +} + +public void EditInsertLtf(Ltf *l,Ltf *b) +{ //TODO: $LK,"LtfReset","MN:LtfReset"$ + I1 *dst; + LtfEntry *nl,*cl=b->dummy.next; + LtfBinEntry *tempb; + LtfRemoveSoftCRs(l,NULL); + if ((l->cur_entry->btype)==LTFT_TEXT && + l->cur_data_col>l->cur_entry->min_col) { + if (l->cur_data_colcur_entry->max_col) { + nl=MAllocZ(sizeof(LtfEntryBase)+4,l->mem_tss); + nl->type=LTFT_TEXT | l->cur_entry->type & 0xFFFFFF00; + nl->flags=l->cur_entry->flags; + nl->x=l->cur_entry->x; + nl->y=l->cur_entry->y; + nl->indent=l->cur_entry->indent; + nl->page_line_num=l->cur_entry->page_line_num; + nl->left_margin=l->cur_entry->left_margin; + nl->right_margin=l->cur_entry->right_margin; + dst=l->cur_entry->display+l->cur_data_col; + nl->display=NewString(dst,l->mem_tss); + nl->max_col=StrLen(dst); + *dst=0; + l->cur_entry->max_col=l->cur_data_col; + InsQue(nl,l->cur_entry); + l->cur_entry=nl; + l->cur_data_col=nl->min_col; + } else + if (l->cur_entry!=l) + l->cur_entry=l->cur_entry->next; + } + while (cl!=b) { + if (cl->btype!=LTFT_SOFT_CR) { + nl=LtfCopyEntry(l,cl); + InsQue(nl,l->cur_entry->last); + } + cl=cl->next; + } + l->recalc_start=l; +} + +void Irq07Handler() +{ + Bts(&sys_irq_flags,7); +} +ext[EXT_IRQ07]=&Irq07Handler; + +#define LPT_INIT 0x09 +#define LPT_ON 0x1D +#define LPT_STROBE (LPT_ON ^ 1) +#define LPT_OFF 0x05 + +I8 lpt1_col=0; + +public void Lpt1On() +{ + lpt1_col=0; + OutP(0x77A,0); //Standard Mode + OutP(0x37A,LPT_INIT); + OutP(0x37A,LPT_ON); +} + +public void Lpt1Off() +{ + Sleep(1000); + OutP(0x37A,LPT_OFF); +} + +void Lpt1LineFeed() +{ + Lpt1PutChar(CH_CR); + Lpt1PutChar(CH_LINE_FEED); +} + +public void Lpt1PutChar(U1 *ch) +{ + U8 timeout_jiffies; + if (ch==CH_CURSOR) return; + do { + do { + if (InP(0x379)!=0x5F) + SwapInNext; + else + break; + } while (TRUE); + + OutP(0x378,ch); + Btr(&sys_irq_flags,7); + OutP(0x37A,LPT_STROBE); + OutP(0x37A,LPT_ON); + timeout_jiffies=jiffies+JIFFY_FREQ/100; + while (!Btr(&sys_irq_flags,7) && + jiffies=timeout_jiffies); + if (ch>=CH_SHIFT_SPACE && ch<=0x7F) { + lpt1_col++; + if (lpt1_col>=80) + Lpt1LineFeed; + } else if (ch==CH_CR) + lpt1_col=0; + else if (ch==CH_TAB) { + lpt1_col=(lpt1_col+8) & 0xFFFFFFF8; + if (lpt1_col>=80) + Lpt1LineFeed; + } +} + +public void Lpt1PrintF(I1 *src,...) +{ + I1 *buf=SPrintFJoin(NULL,src,argc,argv),*ptr=buf; + while (*ptr) + Lpt1PutChar(*ptr++); + Free(buf); +} + +public void Lpt1PrintLtf(Ltf *l) +{ + U1 t; + BoolU4 just_did_crlf=TRUE; + I8 i; + LtfEntry *ll; + LtfRecalc(l); + ll=l->dummy.next; + Lpt1On; + while (ll!=l) { + if (just_did_crlf) { + for (i=0;iindent>>2;i++) + Lpt1PutChar(CH_SPACE); + just_did_crlf=FALSE; + } + t=ll->btype; + if (Bt(ltf_display_types,t)) + Lpt1PrintF("%s",ll->display); + else if (t==LTFT_TAB) + Lpt1PutChar(CH_TAB); + else if (t==LTFT_CR || t==LTFT_SOFT_CR) { + Lpt1LineFeed; + just_did_crlf=TRUE; + } + ll=ll->next; + } + Lpt1PutChar(CH_FORM_FEED); + Lpt1Off; +} + +public void Lpt1PrintFile(I1 *name) +{ + Lpt1On; + Lpt1PrintF("%F",name); + Lpt1PutChar(CH_FORM_FEED); + Lpt1Off; +} + +public void EditFindNext(Ltf *l) +{ + I1 *ptr; + LtfEntry *ll,*cl=l->cur_entry; + U8 ss_flags; + if (l->find_replace->match_case) + ss_flags=0; + else + ss_flags=SS_IGNORE_CASE; + if (l->find_replace->whole_labels) + ss_flags|=SS_WHOLE_LABELS; + + ll=(l->find_replace->scan_forward)?cl->next:cl->last; + while (ll!=cl) { + if (ll!=l) { + if (Bt(ltf_display_types,ll->btype)) { + if ((ll->type & LTFLT_SELECTED) || !l->find_replace->scan_selected_text) { + if (ptr=SearchString(ll->display,l->find_replace->find_text,ss_flags)) { + l->cur_entry=ll; + l->cur_data_col=ptr-ll->display; + if (l->cur_data_colmin_col) + l->cur_data_col=ll->min_col; + if (l->cur_data_col>ll->max_col) + l->cur_data_col=ll->max_col; + LtfCenter(l); + return; + } + } + } + } + ll=(l->find_replace->scan_forward) ?ll->next:ll->last; + } +} + +public I8 PopUp(I1 *msg,TssStruct *parent=NULL) +{ + U8 result=0; + TssCmdStruct *tempc; + TssStruct *tss; + tss=Spawn(&ServantUserCmdLine,"SYSTEM TASK",parent); + while (!Bt(&tss->task_flags,TSSf_IDLE)) + SwapInNext; + Bts(&tss->crt_flags,CRTf_SHOW); + if (!parent) { + QueueTaskRequest(tss,parent,msg,(1<popup_tss=tss; + tempc=QueueTaskRequest(tss,parent,msg, + 1<popup_tss=NULL; + Kill(tss); + return result; + } +} + +public I8 PopUpMenu(Ltf *l,I1 *help=NULL) +{ + l->flags|=LTFF_MIN_SIZE | LTFF_FORM; + return ServantUser("DoMenu(0x%X,0x%X);",l,help); +} + +void PickFileSub(Ltf *l,LTDirEntry *tempm) +{ + while (tempm) { + if (tempm->attr & LT_ATTR_DIR) { + LtfPrintF(l,"$$TR \"%s\"$$\r\n",tempm->name); + LtfPutS(l,"$$ID,+2$$"); + if (tempm->sub) + PickFileSub(l,tempm->sub); + LtfPutS(l,"$$ID,-2$$"); + } else + LtfPrintF(l,"$$MU,\"%s\",0x%08X$$\r\n", + tempm->name,tempm->full_name); + tempm=tempm->next; + } +} + +public I1 *PopUpPickFile(I1 *mask="/*",I1 *flags="+r") +{ + I1 *st,*result=NULL; + LTDirEntry *tempm; + FlagsStruct f; + Ltf *l=LtfNew; + GetFFlags(&f,"ST_FILE_UTIL_FLAGS",flags); + tempm=FindFiles(mask,&f.on); + LtfPutS(l,"$$TR -C+AL,\"\"$$\r\n"); + LtfPutS(l,"$$ID,+2$$"); + PickFileSub(l,tempm); + LtfPutS(l,"$$ID,-2$$"); + st=PopUpMenu(l); + if (st>0) + result=NewString(st); + LtfDel(l); + DelLTDirList(tempm); + return result; +} + +void PickDirSub(Ltf *l,LTDirEntry *tempm) +{ + while (tempm) { + LtfPrintF(l,"$$TR \"\"$$"); + LtfPrintF(l,"$$MU,\"%s\",0x%08X$$\r\n", + tempm->name,tempm->full_name); + LtfPutS(l,"$$ID,+2$$"); + if (tempm->sub) + PickDirSub(l,tempm->sub); + LtfPutS(l,"$$ID,-2$$"); + tempm=tempm->next; + } +} + +public I1 *PopUpPickDir(I1 *mask="/*",I1 *flags="+r+D") +{ //+r=recurse +D=just dirs + I1 *st,*result=NULL; + LTDirEntry *tempm; + FlagsStruct f; + Ltf *l=LtfNew; + GetFFlags(&f,"ST_FILE_UTIL_FLAGS",flags); + tempm=FindFiles(mask,&f.on); + LtfPutS(l,"$$TR -C+AL,\"\"$$\r\n"); + LtfPutS(l,"$$ID,+2$$"); + PickDirSub(l,tempm); + LtfPutS(l,"$$ID,-2$$"); + st=PopUpMenu(l); + if (st>0) + result=NewString(st); + LtfDel(l); + DelLTDirList(tempm); + return result; +} + + + +public BoolU4 PopUpDoForm(U1 *d,I1 *class_name, + I1 *help=NULL,BoolU4 help_is_file=FALSE) +{ //TODO: add header/footer + BoolU4 result; + result=ServantUser("DoForm(0x%X,\"%s\",0x%X,%d);",d,class_name,help,help_is_file); + return result; +} + +PasswordStruct *PopUpPassword() +{ + PasswordStruct *pwr=MAlloc(sizeof(PasswordStruct)); + pwr->pw[0]=0; +//TODO: password within file operations locks on servant startup +// if (!PopUpDoForm(pwr,"PasswordStruct")) { + if (!DoForm(pwr,"PasswordStruct")) { + Free(pwr); + pwr=NULL; + } + return pwr; +} + +public I8 PopUpOk(I1 *header=NULL,I1 *footer=NULL) +{ + I8 i; + Ltf *l=LtfNew; + if (header) LtfPutS(l,header); + LtfPutS(l,"$$CM +CX,0,4$$$$BT, \"OKAY\" 1$$"); + if (footer) LtfPutS(l,footer); + i=PopUpMenu(l); + LtfDel(l); + return i; +} + +public I8 PopUpNoYes(I1 *header=NULL,I1 *footer=NULL) +{ + I8 i; + Ltf *l=LtfNew; + if (header) LtfPutS(l,header); + LtfPutS(l,"$$CM +LX, 2,4$$$$BT, \"YES\",1$$"); + LtfPutS(l,"$$CM +LX, 18,0$$$$BT, \"NO\",0$$"); + if (footer) LtfPutS(l,footer); + i=PopUpMenu(l); + LtfDel(l); + return i; +} + +public I8 PopUpCancelOk(I1 *header=NULL,I1 *footer=NULL) +{ + I8 i; + Ltf *l=LtfNew; + if (header) LtfPutS(l,header); + LtfPutS(l,"$$CM +LX, 2,4$$$$BT, \"OK\",1$$"); + LtfPutS(l,"$$CM +LX, 18,0$$$$BT, \"CANCEL\",0$$"); + if (footer) LtfPutS(l,footer); + i=PopUpMenu(l); + LtfDel(l); + return i; +} + +public I8 PopUpReplaceSkipAllCancel(I1 *header=NULL,I1 *footer=NULL) +{ + I8 i; + Ltf *l=LtfNew; + if (header) LtfPutS(l,header); + LtfPutS(l,"$$CM +LX,2,4$$$$BT, \"REPLACE\",0$$"); + LtfPutS(l,"$$CM +LX, 18,0$$$$BT, \"SKIP\",1$$"); + LtfPutS(l,"$$CM +LX, 2,3$$$$BT, \"ALL\",2$$"); + LtfPutS(l,"$$CM +LX, 18,0$$$$BT, \"CANCEL\",3$$"); + if (footer) LtfPutS(l,footer); + i=PopUpMenu(l); + LtfDel(l); + return i; +} + +public void EditReplace(Ltf *l) +{ + BoolU4 first=TRUE,old_preempt; + I8 cmd=0,i,j,plen,rlen,dlen; + I1 *src,*dst,*dst2; + LtfEntry *cl=l->cur_entry,*ll; + U8 ss_flags; + if (DoForm(l->find_replace,"EditFindTextStruct")) { + if (l->find_replace->match_case) + ss_flags=0; + else + ss_flags=SS_IGNORE_CASE; + if (l->find_replace->whole_labels) + ss_flags|=SS_WHOLE_LABELS; + if (!(l->find_replace->replace)) { + EditFindNext(l); + return; + } + plen=StrLen(l->find_replace->find_text); + if (!plen) return; + rlen=StrLen(l->find_replace->replace_text); + ll=cl; + while ((ll!=cl || first) && cmd!=3) { + first=FALSE; + if (ll->btype==LTFT_TEXT && + ((ll->type & LTFLT_SELECTED) || !l->find_replace->scan_selected_text)) { + src=ll->display; + while (src && cmd!=3) { + src=SearchString(src,l->find_replace->find_text,ss_flags); + if (src) { + l->cur_data_col=src-ll->display; + l->cur_entry=ll; + l->recalc_start=l; + if (cmd!=2) + LtfCenter(l); + ll=l->cur_entry; + src=l->cur_data_col+ll->display; + if (cmd!=2) { + cmd=PopUpReplaceSkipAllCancel(""); + if (cmd==2) + old_preempt=Preempt(OFF); + } + if (cmd==0 || cmd==2) { + dlen=StrLen(ll->display); + dst=MAlloc(dlen+1+rlen-plen,l->mem_tss); + dst2=dst; + j=src-ll->display; + for (i=0;idisplay[i]; + for (i=0;ifind_replace->replace_text[i]; + src=dst; + for (i=j+plen;i<=dlen;i++) + *dst++=ll->display[i]; + Free(ll->display,l->mem_tss); + ll->display=dst2; + l->cur_data_col=src-ll->display; + l->cur_entry=ll; + if (cmd!=2) { + l->recalc_start=l; + LtfRemoveSoftCRs(l,l->cur_entry); + LtfRecalc(l); + } + ll=l->cur_entry; + src=l->cur_data_col+ll->display; + } else + src++; + } + } + } + if (l->find_replace->scan_forward) { + ll=ll->next; + if (ll==l) { + if (cl==l) break; + ll=ll->next; + } + } else { + ll=ll->last; + if (ll==l) { + if (cl==l) break; + ll=ll->last; + } + } + } + } + if (cmd==2) { + l->recalc_start=l; + LtfRemoveSoftCRs(l,NULL); + LtfRecalc(l); + Preempt(old_preempt); + } +} + +class EditGoToLineStruct +{ + I8 line fmtstr "$$DA -T, 256, \"Go to Line:%04d\"$$"; +}; + +public void EditGoToLine(Ltf *l) +{ + EditGoToLineStruct gtl; + gtl.line=1; + if (DoForm(>l,"EditGoToLineStruct")) { + l->x=0; + l->y=gtl.line-1; + LtfUpdateWindowJoin(l,FALSE,FALSE,FALSE,TRUE); + LtfCenter(l); + } +} + +void TogglePlainTextMode(Ltf *l) +{ + U8 size; + I1 *st=LtfSave(l,&size); + BoolU4 old_preempt=Preempt(OFF); + U8 flags=l->flags ^ LTFF_PLAIN_TEXT; + Ltf *menu=l->menu_ltf; + LtfReset(l,TRUE); + l->menu_ltf=menu; + l->flags=flags & ~(LTFF_WORD_WRAP|LTFF_INVERTED|LTFF_UNDERLINED|LTFF_BLINK); + LtfLoad(l,st,size); + LtfCenter(l); + Preempt(old_preempt); + Free(st); +} + +#define LK_FILE 0 +#define LK_FILE_ANCHOR 1 +#define LK_FILE_FIND 2 +#define LK_FILE_LINE 3 +#define LK_MAN_PAGE 4 +#define LK_PLAIN 5 +#define LK_PLAIN_FIND 6 +#define LK_PLAIN_LINE 7 +#define LK_PLACE_ANCHOR 8 + +I8 PopUpLinkType() +{ + I8 i; + Ltf *l=LtfNew; + LtfPutS(l,"$$MU,\"To file\" LK_FILE$$\r\n"); + LtfPutS(l,"$$MU,\"To anchor in file\" LK_FILE_ANCHOR$$\r\n"); + LtfPutS(l,"$$MU,\"To string in file\" LK_FILE_FIND$$\r\n"); + LtfPutS(l,"$$MU,\"To line in file\" LK_FILE_LINE$$\r\n"); + LtfPutS(l,"$$MU,\"To man page\" LK_MAN_PAGE$$\r\n"); + LtfPutS(l,"$$MU,\"To plain-text file\" LK_PLAIN$$\r\n"); + LtfPutS(l,"$$MU,\"To string in plain-text file\" LK_PLAIN_FIND$$\r\n"); + LtfPutS(l,"$$MU,\"To line in plain-text file\" LK_PLAIN_LINE$$\r\n"); + LtfPutS(l,"$$MU,\"Place Anchor\" LK_PLACE_ANCHOR$$\r\n"); + LtfPutS(l,"$$MU,\"CANCEL\" -1$$"); + i=PopUpMenu(l); + LtfDel(l); + return i; +} + +class EditFileLinkStruct +{ + I1 display[132] fmtstr "$$DA -P 131 \"Displayed Text:%s\"$$\r\n"; + I1 file[132] fmtstr "$$DA -P 131 \"File :%s\"$$\r\n"; + I1 aux[132]; + I8 num; + BoolU4 hide; +}; + +class EditFileAnchorLinkStruct +{ + I1 display[132] fmtstr "$$DA -P 131 \"Displayed Text:%s\"$$\r\n"; + I1 file[132] fmtstr "$$DA -P 131 \"File :%s\"$$\r\n"; + I1 aux[132] fmtstr "$$DA -P 131 \"Anchor Label :%s\"$$\r\n"; + I8 num; + BoolU4 hide; +}; + +class EditFileFindLinkStruct +{ + I1 display[132] fmtstr "$$DA -P 131 \"Displayed Text:%s\"$$\r\n"; + I1 file[132] fmtstr "$$DA -P 131 \"File :%s\"$$\r\n"; + I1 aux[132] fmtstr "$$DA -P 131 \"String :%s\"$$\r\n"; + I8 num fmtstr "$$DA -T 131 \"Occurrence Num:%04d\"$$\r\n"; + BoolU4 hide; +}; + +class EditFileLineLinkStruct +{ + I1 display[132] fmtstr "$$DA -P 131 \"Displayed Text:%s\"$$\r\n"; + I1 file[132] fmtstr "$$DA -P 131 \"File :%s\"$$\r\n"; + I1 aux[132]; + I8 num fmtstr "$$DA -T 131 \"Line Num :%04d\"$$\r\n"; + BoolU4 hide; +}; + +class EditManPageLinkStruct +{ + I1 display[132] fmtstr "$$DA -P 131 \"Displayed Text:%s\"$$\r\n"; + I1 file[132]; + I1 aux[132] fmtstr "$$DA -P 131 \"Label :%s\"$$\r\n"; + I8 num; + BoolU4 hide; +}; + +class EditPlaceAnchorStruct +{ + I1 display[132] fmtstr "$$DA -P 131 \"Displayed Text:%s\"$$\r\n"; + I1 file[132]; + I1 aux[132] fmtstr "$$DA -P 131 \"Anchor Label :%s\"$$\r\n"; + I8 num; + BoolU4 hide fmtstr "$$CB \"Hide\"$$\r\n"; +}; + + +#define CTRL_L_HELP "::/LT/DOC/CtrlL.MUZ" +I1 *ctrl_L_header="Press WINDOW's key for help\r\n\r\n"; +void EditInsertLink() +{ + EditFileLinkStruct *el=MAllocZ(sizeof(EditFileLinkStruct)); + I8 type=PopUpLinkType; + if (type>=0) { + el->num=1; + switch (type) { + case LK_FILE: + if (DoForm(el,"EditFileLinkStruct",CTRL_L_HELP,TRUE,ctrl_L_header)) { + if (!el->display[0]) + PrintF("$$LK \"%s\",\"FI:%s\"$$",el->file,el->file); + else + PrintF("$$LK \"%s\",\"FI:%s\"$$",el->display,el->file); + } + break; + case LK_PLAIN: + if (DoForm(el,"EditFileLinkStruct",CTRL_L_HELP,TRUE,ctrl_L_header)) { + if (!el->display[0]) + PrintF("$$LK \"%s\",\"PI:%s\"$$",el->file,el->file); + else + PrintF("$$LK \"%s\",\"PI:%s\"$$",el->display,el->file); + } + break; + case LK_FILE_ANCHOR: + if (DoForm(el,"EditFileAnchorLinkStruct",CTRL_L_HELP,TRUE,ctrl_L_header)) { + if (!el->display[0]) + PrintF("$$LK \"%s\",\"FA:%s,%s\"$$",el->aux,el->file,el->aux); + else + PrintF("$$LK \"%s\",\"FA:%s,%s\"$$",el->display,el->file,el->aux); + } + break; + case LK_FILE_FIND: + if (DoForm(el,"EditFileFindLinkStruct",CTRL_L_HELP,TRUE,ctrl_L_header)) { + if (el->num==1) { + if (!el->display[0]) + PrintF("$$LK \"%s\",\"FF:%s,%s\"$$",el->aux,el->file,el->aux); + else + PrintF("$$LK \"%s\",\"FF:%s,%s\"$$",el->display,el->file,el->aux); + } else { + if (!el->display[0]) + PrintF("$$LK \"%s\",\"FF:%s,%s:%d\"$$",el->aux,el->file,el->aux,el->num); + else + PrintF("$$LK \"%s\",\"FF:%s,%s:%d\"$$",el->display,el->file,el->aux,el->num); + } + } + break; + case LK_PLAIN_FIND: + if (DoForm(el,"EditFileFindLinkStruct",CTRL_L_HELP,TRUE,ctrl_L_header)) { + if (el->num==1) { + if (!el->display[0]) + PrintF("$$LK \"%s\",\"PF:%s,%s\"$$",el->aux,el->file,el->aux); + else + PrintF("$$LK \"%s\",\"PF:%s,%s\"$$",el->display,el->file,el->aux); + } else { + if (!el->display[0]) + PrintF("$$LK \"%s\",\"PF:%s,%s:%d\"$$",el->aux,el->file,el->aux,el->num); + else + PrintF("$$LK \"%s\",\"PF:%s,%s:%d\"$$",el->display,el->file,el->aux,el->num); + } + } + break; + case LK_FILE_LINE: + if (DoForm(el,"EditFileLineLinkStruct",CTRL_L_HELP,TRUE,ctrl_L_header)) { + if (!el->display[0]) + PrintF("$$LK \"%s\",\"FL:%s,%d\"$$",el->file,el->file,el->num); + else + PrintF("$$LK \"%s\",\"FL:%s,%d\"$$",el->display,el->file,el->num); + } + break; + case LK_PLAIN_LINE: + if (DoForm(el,"EditFileLineLinkStruct",CTRL_L_HELP,TRUE,ctrl_L_header)) { + if (!el->display[0]) + PrintF("$$LK \"%s\",\"PL:%s,%d\"$$",el->file,el->file,el->num); + else + PrintF("$$LK \"%s\",\"PL:%s,%d\"$$",el->display,el->file,el->num); + } + break; + case LK_MAN_PAGE: + if (DoForm(el,"EditManPageLinkStruct",CTRL_L_HELP,TRUE,ctrl_L_header)) { + if (!el->display[0]) + PrintF("$$LK \"%s\",\"MN:%s\"$$",el->aux,el->aux); + else + PrintF("$$LK \"%s\",\"MN:%s\"$$",el->display,el->aux); + } + break; + case LK_PLACE_ANCHOR: + if (DoForm(el,"EditPlaceAnchorStruct",CTRL_L_HELP,TRUE,ctrl_L_header)) { + if (!el->display[0]) { + if (el->hide) + PrintF("$$AN \"\",\"%s\"$$",el->aux); + else + PrintF("$$AN \"%s\",\"%s\"$$",el->aux,el->aux); + } else + PrintF("$$AN \"%s\",\"%s\"$$",el->display,el->aux); + } + break; + } + } + Free(el); +} + +I8 PopUpColorType() +{ + I8 i; + Ltf *l=LtfNew; + LtfPutS(l,"$$MU,\"Foreground\" LTFT_FOREGROUND_COLOR$$\r\n"); + LtfPutS(l,"$$MU,\"Background\" LTFT_BACKGROUND_COLOR$$\r\n"); + LtfPutS(l,"$$MU,\"Default Foreground\" LTFT_DEFAULT_FOREGROUND_COLOR$$\r\n"); + LtfPutS(l,"$$MU,\"Default Background\" LTFT_DEFAULT_BACKGROUND_COLOR$$\r\n"); + LtfPutS(l,"$$MU,\"Link Foreground\" LTFT_LINK_FOREGROUND$$\r\n"); + LtfPutS(l,"$$MU,\"Link Background\" LTFT_LINK_BACKGROUND$$\r\n"); + LtfPutS(l,"$$MU,\"Macro Foreground\" LTFT_MACRO_FOREGROUND$$\r\n"); + LtfPutS(l,"$$MU,\"Macro Background\" LTFT_MACRO_BACKGROUND$$\r\n"); + LtfPutS(l,"$$MU,\"Anchor Foreground\" LTFT_ANCHOR_FOREGROUND$$\r\n"); + LtfPutS(l,"$$MU,\"Anchor Background\" LTFT_ANCHOR_BACKGROUND$$\r\n"); + LtfPutS(l,"$$MU,\"Hidden Foreground\" LTFT_HIDDEN_FOREGROUND$$\r\n"); + LtfPutS(l,"$$MU,\"Hidden Background\" LTFT_HIDDEN_BACKGROUND$$\r\n"); + LtfPutS(l,"$$MU,\"Tree Foreground\" LTFT_TREE_FOREGROUND$$\r\n"); + LtfPutS(l,"$$MU,\"Tree Background\" LTFT_TREE_BACKGROUND$$\r\n"); + LtfPutS(l,"$$MU,\"User Foreground\" LTFT_USER_FOREGROUND$$\r\n"); + LtfPutS(l,"$$MU,\"User Background\" LTFT_USER_BACKGROUND$$\r\n"); + LtfPutS(l,"$$MU,\"CANCEL\" -1$$"); + i=PopUpMenu(l); + LtfDel(l); + return i; +} + + +public I8 PopUpPageSettingType() +{ + I8 i; + Ltf *l=LtfNew; + LtfPutS(l,"$$MU,\"Page Length\",LTFT_PAGE_LENGTH$$\r\n"); + LtfPutS(l,"$$MU,\"Page Header\",LTFT_HEADER$$\r\n"); + LtfPutS(l,"$$MU,\"Page Footer\",LTFT_FOOTER$$\r\n"); + LtfPutS(l,"$$MU,\"Left Margin\",LTFT_LEFT_MARGIN$$\r\n"); + LtfPutS(l,"$$MU,\"Right Margin\",LTFT_RIGHT_MARGIN$$\r\n"); + i=PopUpMenu(l); + LtfDel(l); + return i; +} + +void EditInsertColor() +{ + I8 type=PopUpColorType,col=LTF_DEFAULT; + if (type>=0) { + col=PopUpColor; + if (col!=LTF_DEFAULT) + PrintF("$$%Z %d$$",type,"ST_LTF_CMDS",col); + else + PrintF("$$%Z$$",type,"ST_LTF_CMDS"); + } +} + +class EditPageSettingStruct +{ + I1 value[132] fmtstr "$$DA -P 131 \"Setting Value:%s\"$$\r\n"; +}; + + +void EditInsertPageSetting() +{ + I8 type=PopUpPageSettingType; + EditPageSettingStruct *el=MAllocZ(sizeof(EditPageSettingStruct)); + if (type>=0) { + if (DoForm(el,"EditPageSettingStruct")) { + if (*el->value) + PrintF("$$%Z,%s$$",type,"ST_LTF_CMDS",el->value); + else + PrintF("$$%Z$$",type,"ST_LTF_CMDS"); + } + } + Free(el); +} + +I8 PopUpDollarType() +{ + I8 i; + Ltf *l=LtfNew; + LtfPutS(l,"$$MU,\"Link\" LTFT_LINK$$\r\n"); + LtfPutS(l,"$$MU,\"Text\" LTFT_TEXT$$\r\n"); + LtfPutS(l,"$$MU,\"Tree Branch\" LTFT_TREE$$\r\n"); + LtfPutS(l,"$$MU,\"Color\" LTFT_FOREGROUND_COLOR$$\r\n"); + LtfPutS(l,"$$MU,\"Page Settings\" LTFT_PAGE_LENGTH$$\r\n"); + LtfPutS(l,"$$MU,\"Cursor Movement\" LTFT_CURSOR_MOVEMENT$$\r\n"); + LtfPutS(l,"$$MU,\"Button\" LTFT_BUTTON$$\r\n"); + LtfPutS(l,"$$MU,\"Check Box\" LTFT_CHECK_BOX$$\r\n"); + LtfPutS(l,"$$MU,\"Macro\" LTFT_MACRO$$\r\n"); + LtfPutS(l,"$$MU,\"Menu Value\" LTFT_MENU_VALUE$$\r\n"); + LtfPutS(l,"$$MU,\"Button\" LTFT_BUTTON$$\r\n"); + LtfPutS(l,"$$MU,\"Data\" LTFT_DATA$$\r\n"); + LtfPutS(l,"$$MU,\"Hex Edit\" LTFT_HEX_EDIT$$\r\n"); + LtfPutS(l,"$$MU,\"Hidden Widget\" LTFT_HIDE_START$$\r\n"); + LtfPutS(l,"$$MU,\"Song\" LTFT_SONG$$\r\n"); + LtfPutS(l,"$$MU,\"CANCEL\" -1$$"); + i=PopUpMenu(l); + LtfDel(l); + return i; +} + +class EditDollarTextStruct +{ + I1 display[132] fmtstr "$$DA-P,131,\"Displayed Text:%s\"$$\r\n"; + BoolU4 left_x fmtstr "$$CB \"Left X\"$$\r\n"; + BoolU4 center_x fmtstr "$$CB \"Center X\"$$\r\n"; + BoolU4 right_x fmtstr "$$CB \"Right X\"$$\r\n"; + BoolU4 margin_rel fmtstr "$$CB \"Margin Rel X\"$$\r\n"; + BoolU4 blink fmtstr "$$CB \"Blink\"$$\r\n"; + BoolU4 invert fmtstr "$$CB \"Invert\"$$\r\n"; + BoolU4 underline fmtstr "$$CB \"Underline\"$$\r\n"; + BoolU4 tree fmtstr "$$CB \"Tree\"$$\r\n"; + BoolU4 collapsed fmtstr "$$CB \"Collapsed\"$$\r\n"; + BoolU4 alias fmtstr "$$CB \"Alias\"$$\r\n"; + I1 scroll_x [132] fmtstr "$$DA-P,131,\"Scroll X Length Expression:%s\"$$\r\n"; + I1 shift_x [132] fmtstr "$$DA-P,131,\"X Offset Expression :%s\"$$\r\n"; + I1 shift_y [132] fmtstr "$$DA-P,131,\"Y Offset Expression :%s\"$$\r\n"; +}; + +void EditInsertDollarText() +{ + I1 buf[132]; + EditDollarTextStruct *dt=MAllocZ(sizeof(EditDollarTextStruct)); + if (DoForm(dt,"EditDollarTextStruct",CTRL_L_HELP,TRUE,ctrl_L_header)) { + *buf=0; + if (dt->left_x ) StrCat(buf,"+LX"); + if (dt->center_x) StrCat(buf,"+CX"); + if (dt->right_x ) StrCat(buf,"+RX"); + if (dt->margin_rel) StrCat(buf,"+MRX"); + if (dt->blink) StrCat(buf,"+BK"); + if (dt->invert) StrCat(buf,"+IV"); + if (dt->underline) StrCat(buf,"+UL"); + if (dt->tree) StrCat(buf,"+TR"); + if (dt->collapsed) StrCat(buf,"+C"); + if (dt->alias) StrCat(buf,"+AL"); + if (*dt->scroll_x) StrCat(buf,"+SCX"); + if (*dt->shift_x) StrCat(buf,"+SX"); + if (*dt->shift_y) StrCat(buf,"+SY"); + PrintF("$$TX %s,\"%s\"",buf,dt->display); + if (*dt->shift_x) + PrintF(",%s",dt->shift_x); + if (*dt->shift_y) + PrintF(",%s",dt->shift_y); + if (*dt->scroll_x) + PrintF(",%s",dt->scroll_x); + PrintF("$$"); + } + Free(dt); +} + +class EditSongStruct +{ + I1 display[132] fmtstr "$$DA-P,131,\"Displayed Text:%s\"$$\r\n"; + I1 song[512] fmtstr "$$DA-P,511,\"Song :%s\"$$\r\n"; +}; + +void EditInsertSong() +{ + EditSongStruct *dt=MAllocZ(sizeof(EditSongStruct)); + if (DoForm(dt,"EditSongStruct",CTRL_L_HELP,TRUE,ctrl_L_header)) + PrintF("$$SO,\"%s\",\"%s\"$$",dt->display,dt->song); + Free(dt); +} + +class EditMacroMenuStruct +{ + I1 display[132] fmtstr "$$DA-P,131,\"Displayed Text :%s\"$$\r\n"; + I1 left_macro[512] fmtstr "$$DA-P,511,\"Left Click Macro :%s\"$$\r\n"; + I1 left_exp[132] fmtstr "$$DA-P,131,\"Left Click Expression :%s\"$$\r\n"; + BoolU4 popup fmtstr "$$CB \"PopUp\"$$\r\n"; + BoolU4 left_is_auto fmtstr "$$CB \"Left is AutoString\"$$\r\n"; + BoolU4 left_x fmtstr "$$CB \"Left X \"$$\r\n"; + BoolU4 center_x fmtstr "$$CB \"Center X \"$$\r\n"; + BoolU4 right_x fmtstr "$$CB \"Right X \"$$\r\n"; + BoolU4 margin_rel fmtstr "$$CB \"Margin Rel X\"$$\r\n"; + BoolU4 blink fmtstr "$$CB \"Blink\"$$\r\n"; + BoolU4 invert fmtstr "$$CB \"Invert\"$$\r\n"; + BoolU4 underline fmtstr "$$CB \"Underline\"$$\r\n"; + BoolU4 escape fmtstr "$$CB \"Escape\"$$\r\n"; + I1 scroll_x[132] fmtstr "$$DA-P,131,\"Scroll X Length Expression:%s\"$$\r\n"; + I1 shift_x[132] fmtstr "$$DA-P,131,\"X Offset Expression :%s\"$$\r\n"; + I1 shift_y[132] fmtstr "$$DA-P,131,\"Y Offset Expression :%s\"$$\r\n"; +}; + +void EditInsertMacroMenu(BoolU4 is_macro) +{ + I1 buf[132]; + EditMacroMenuStruct *dt=MAllocZ(sizeof(EditMacroMenuStruct)); + dt->underline=TRUE; + dt->escape=TRUE; + if (DoForm(dt,"EditMacroMenuStruct",CTRL_L_HELP,TRUE,ctrl_L_header)) { + *buf=0; + if (is_macro && *dt->display) StrCat(buf,"+A "); + if (dt->popup) StrCat(buf,"+PU-X"); + if (dt->left_x ) StrCat(buf,"+LX"); + if (dt->center_x) StrCat(buf,"+CX"); + if (dt->right_x ) StrCat(buf,"+RX"); + if (dt->margin_rel) StrCat(buf,"+MRX"); + if (dt->blink) StrCat(buf,"+BK"); + if (dt->invert) StrCat(buf,"+IV"); + if (!dt->underline) StrCat(buf,"-UL"); + if (!dt->escape) StrCat(buf,"-X"); + if (*dt->scroll_x) StrCat(buf,"+SCX"); + if (*dt->shift_x) StrCat(buf,"+SX"); + if (*dt->shift_y) StrCat(buf,"+SY"); + if (is_macro) { + if (*dt->left_exp) StrCat(buf,"+LE"); + if (!*dt->left_macro) StrCat(buf,"-LM"); + } else { + if (!*dt->left_exp) StrCat(buf,"-LE"); + if (*dt->left_macro) StrCat(buf,"+LM"); + } + if (dt->left_is_auto) StrCat(buf,"+LA"); + if (dt->display[0] || is_macro) { + if (is_macro) { + if (*dt->display) + PrintF("$$MA %s,\"%s\"",buf,dt->display); + else + PrintF("$$MA %s,",buf); + } else + PrintF("$$MU %s,\"%s\"",buf,dt->display); + if (*dt->left_exp) + PrintF(",%s",dt->left_exp); + if (*dt->left_macro) + PrintF(",\"%s\"",dt->left_macro); + if (*dt->shift_x) + PrintF(",%s",dt->shift_x); + if (*dt->shift_y) + PrintF(",%s",dt->shift_y); + if (*dt->scroll_x) + PrintF(",%s",dt->scroll_x); + PrintF("$$"); + } + } + Free(dt); +} + +class EditButtonStruct +{ + I1 display[132] fmtstr "$$DA -P 131 \"Displayed Text:%s\"$$\r\n"; + BoolU4 popup fmtstr "$$CB \"PopUp\"$$\r\n"; + BoolU4 left_x fmtstr "$$CB \"Left X \"$$\r\n"; + BoolU4 center_x fmtstr "$$CB \"Center X \"$$\r\n"; + BoolU4 right_x fmtstr "$$CB \"Right X \"$$\r\n"; + BoolU4 margin_rel fmtstr "$$CB \"Margin Rel X\"$$\r\n"; + BoolU4 escape fmtstr "$$CB \"Escape\"$$\r\n"; + I1 left_macro [132] fmtstr "$$DA -P 131 \"Left Click Macro:%s\"$$\r\n"; + BoolU4 left_is_auto fmtstr "$$CB \"Left is AutoString\"$$\r\n"; + I1 left_exp [132] fmtstr "$$DA -P 131 \"Left Click Expression:%s\"$$\r\n"; + BoolU4 quote fmtstr "$$CB \"Quote\"$$\r\n"; +}; + +void EditInsertButton() +{ + I1 buf[132]; + EditButtonStruct *dt=MAllocZ(sizeof(EditButtonStruct)); + dt->escape=TRUE; + if (DoForm(dt,"EditButtonStruct",CTRL_L_HELP,TRUE,ctrl_L_header)) { + *buf=0; + if (dt->popup) StrCat(buf,"+PU-X"); + if (dt->left_x ) StrCat(buf,"+LX"); + if (dt->center_x) StrCat(buf,"+CX"); + if (dt->right_x ) StrCat(buf,"+RX"); + if (dt->margin_rel) StrCat(buf,"+MRX"); + if (!dt->escape) StrCat(buf,"-X"); + if (!*dt->left_exp) StrCat(buf,"-LE"); + if (*dt->left_macro) StrCat(buf,"+LM"); + if (dt->left_is_auto) StrCat(buf,"+LA"); + if (dt->display[0]) { + if (dt->quote) { + PrintF("$$$$BT %s,\\\"%s\\\"",buf,dt->display); + if (*dt->left_exp) + PrintF(",%s",dt->left_exp); + if (*dt->left_macro) + PrintF(",\\\"%s\\\"",dt->left_macro); + PrintF("$$$$"); + } else { + PrintF("$$BT %s,\"%s\"",buf,dt->display); + if (*dt->left_exp) + PrintF(",%s",dt->left_exp); + if (*dt->left_macro) + PrintF(",\"%s\"",dt->left_macro); + PrintF("$$"); + } + } + } + Free(dt); +} + + +class EditCursorMovementStruct +{ + I1 left_exp[132] fmtstr "$$DA -P 131 \"X Expression:%s\"$$\r\n"; + I1 right_exp[132] fmtstr "$$DA -P 131 \"Y Expression:%s\"$$\r\n"; + BoolU4 left_x fmtstr "$$CB \"Left X \"$$\r\n"; + BoolU4 center_x fmtstr "$$CB \"Center X \"$$\r\n"; + BoolU4 right_x fmtstr "$$CB \"Right X \"$$\r\n"; + BoolU4 margin_rel fmtstr "$$CB \"Margin Rel X\"$$\r\n"; + BoolU4 top_y fmtstr "$$CB \"Top Y \"$$\r\n"; + BoolU4 center_y fmtstr "$$CB \"Center Y \"$$\r\n"; + BoolU4 bottom_y fmtstr "$$CB \"Bottom Y \"$$\r\n"; + BoolU4 page_rel fmtstr "$$CB \"Page Rel Y\"$$\r\n"; + BoolU4 quote fmtstr "$$CB \"Quote\"$$\r\n"; +}; + +void EditInsertCursorMovement() +{ + I1 buf[132]; + EditCursorMovementStruct *dt=MAllocZ(sizeof(EditCursorMovementStruct)); + if (DoForm(dt,"EditCursorMovementStruct",CTRL_L_HELP,TRUE,ctrl_L_header)) { + *buf=0; + if (dt->left_x ) StrCat(buf,"+LX"); + if (dt->center_x) StrCat(buf,"+CX"); + if (dt->right_x ) StrCat(buf,"+RX"); + if (dt->margin_rel) StrCat(buf,"+MRX"); + if (dt->top_y ) StrCat(buf,"+TY"); + if (dt->center_y) StrCat(buf,"+CY"); + if (dt->bottom_y) StrCat(buf,"+BY"); + if (dt->page_rel) StrCat(buf,"+PRY"); + if (!*dt->left_exp) StrCat(buf,"-LE"); + if (!*dt->right_exp) StrCat(buf,"-RE"); + if (dt->quote) + PrintF("$$"); + PrintF("$$CM %s",buf); + if (*dt->left_exp) + PrintF(",%s",dt->left_exp); + if (*dt->right_exp) + PrintF(",%s",dt->right_exp); + PrintF("$$"); + if (dt->quote) + PrintF("$$"); + } + Free(dt); +} + +class EditDataStruct +{ + I1 format_str [132] fmtstr "$$DA -P 131 \"Format String:%s\"$$\r\n"; + U8 len fmtstr "$$DA 256 \"Length:%d\"$$\r\n"; + BoolU4 term fmtstr "$$CB \"Terminator\"$$\r\n"; + BoolU4 string fmtstr "$$CB \"String\"$$\r\n"; + BoolU4 refresh fmtstr "$$CB \"Refresh Data\"$$\r\n"; + BoolU4 password fmtstr "$$CB \"Password\"$$\r\n"; +}; + +void EditInsertData() +{ + I1 buf[132]; + EditDataStruct *dt=MAllocZ(sizeof(EditDataStruct)); + dt->term=TRUE; + dt->len=256; + if (DoForm(dt,"EditDataStruct",CTRL_L_HELP,TRUE,ctrl_L_header)) { + *buf=0; + if (dt->string) StrCat(buf,"-P"); + if (!dt->term) StrCat(buf,"-T"); + if (dt->refresh) StrCat(buf,"+RD"); + if (dt->password) StrCat(buf,"+PW"); + PrintF("$$$$DA%s,%d,\\\"%s\\\"$$$$", + buf,dt->len,dt->format_str); + } + Free(dt); +} + +class EditCheckBoxStruct +{ + I1 label [132] fmtstr "$$DA -P 131 \"Displayed Text:%s\"$$\r\n"; + BoolU4 refresh fmtstr "$$CB \"Refresh Data\"$$\r\n"; +}; + +void EditInsertCheckBox() +{ + I1 buf[132]; + EditCheckBoxStruct *dt=MAllocZ(sizeof(EditCheckBoxStruct)); + if (DoForm(dt,"EditCheckBoxStruct",CTRL_L_HELP,TRUE)) { + *buf=0; + if (dt->refresh) StrCat(buf,"+RD"); + PrintF("$$$$CB %s,\\\"%s\\\"$$$$", + buf,dt->label); + } + Free(dt); +} + +class EditHexEditStruct +{ + U8 cnt fmtstr "$$DA ,256 \"Count:%d\"$$\r\n"; + U8 cols fmtstr "$$DA ,256 \"Columns:%d\"$$\r\n"; + BoolU4 zero fmtstr "$$CB \"Zero Based\"$$\r\n"; + BoolU4 refresh fmtstr "$$CB \"Refresh Data\"$$\r\n"; +}; + +void EditInsertHexEdit() +{ + I1 buf[132]; + EditHexEditStruct *dt=MAllocZ(sizeof(EditHexEditStruct)); + dt->cnt=128; + dt->cols=16; + dt->zero=TRUE; + if (DoForm(dt,"EditHexEditStruct",CTRL_L_HELP,TRUE,ctrl_L_header)) { + *buf=0; + if (!dt->zero) StrCat(buf,"-Z"); + if (dt->refresh) StrCat(buf,"+RD"); + PrintF("$$$$HX %s,%d,%d$$$$", + buf,dt->cnt,dt->cols); + } + Free(dt); +} + +class EditTreeStruct +{ + I1 label[132] fmtstr "$$DA-P,131,\"Displayed Text:%s\"$$\r\n"; + I8 indent fmtstr "$$DA,131,\"Indention:%d\"$$\r\n"; + BoolU4 collapsed fmtstr "$$CB,\"Collapsed\"$$\r\n"; +}; + +void EditInsertTree() +{ + I1 buf[132],*st; + EditTreeStruct *dt=MAllocZ(sizeof(EditTreeStruct)); + dt->collapsed=TRUE; + dt->indent=2; + if (DoForm(dt,"EditTreeStruct",CTRL_L_HELP,TRUE,ctrl_L_header)) { + *buf=0; + if (!dt->collapsed) StrCat(buf,"-C"); + st=MSPrintF("$$TR %s,\"%s\"$$\r\n$$ID,%d$$*\r\n$$ID,%d$$", + buf,dt->label,dt->indent,-dt->indent); + LtfSafeInsert(Fs->cur_ltf,st); + Free(st); + } + Free(dt); +} + +void EditInsertHidden() +{ + LtfSafeInsert(Fs->cur_ltf,"$$HS$$*$$HE$$"); +} + + +void EditInsertDollarCmd() +{ + I8 type=PopUpDollarType; + switch (type) { + case LTFT_FOREGROUND_COLOR: + EditInsertColor; + break; + case LTFT_PAGE_LENGTH: + EditInsertPageSetting; + break; + case LTFT_LINK: + EditInsertLink; + break; + case LTFT_TEXT: + EditInsertDollarText; + break; + case LTFT_TREE: + EditInsertTree; + break; + case LTFT_MACRO: + EditInsertMacroMenu(TRUE); + break; + case LTFT_MENU_VALUE: + EditInsertMacroMenu(FALSE); + break; + case LTFT_CURSOR_MOVEMENT: + EditInsertCursorMovement; + break; + case LTFT_BUTTON: + EditInsertButton; + break; + case LTFT_DATA: + EditInsertData; + break; + case LTFT_CHECK_BOX: + EditInsertCheckBox; + break; + case LTFT_HEX_EDIT: + EditInsertHexEdit; + break; + case LTFT_HIDE_START: + EditInsertHidden; + break; + case LTFT_SONG: + EditInsertSong; + break; + } +} + +I1 *FavoritesFileName() +{ + return MSPrintF("::/LT/ACCOUNTS/%s/FAVOR.MUZ", + Fs->account->name); +} + +public void DoFavorites() +{ + I1 *name=FavoritesFileName; + Edit(name); + Free(name); +} + +I1 captured_macro_name[128]; +*captured_macro_name=0; + +I8 PopUpExitRecordPlayStopInsert() +{ + I8 result=0; + I1 buf[80]; + TssCmdStruct *tempc; + Ltf *l=LtfNew; + LtfEntry *ll; + ll=LtfPutS(l,"$$DA -P ,127 \"Name:%s\"$$"); + ll->data=captured_macro_name; + LtfFormatData(ll); + LtfPutS(l,"$$CM +LX +TY, 2,4$$$$BT, \"RECORD\" 1$$"); + LtfPutS(l,"$$CM +LX +TY, 18,4$$$$BT, \"PLAY\" 2$$"); + LtfPutS(l,"$$CM +LX +TY, 2,7$$$$BT, \"STOP\" 3$$"); + LtfPutS(l,"$$CM +LX +TY, 18,7$$$$BT, \"EXIT\" 0$$"); + LtfPutS(l,"$$CM +LX +TY, 2,10$$$$BT, \"INSERT\" 4$$"); + l->flags|=LTFF_MIN_SIZE | LTFF_FORM; + SPrintF(buf,"DoMenu(0x%X);",l); + macro_util_tss=Spawn(&ServantUserCmdLine,"MACRO POPUP",Fs); + Fs->popup_tss=macro_util_tss; + tempc=QueueTaskRequest(macro_util_tss,Fs,buf, + 1<popup_tss=NULL; + Kill(macro_util_tss); + macro_util_tss=NULL; + SwapInNext; //Kill task + LtfGetData(ll); + LtfDel(l); + return result; +} + + +void DelSysMacro() +{ + TssCmdStruct *tempc,*tempc1; + tempc=sys_macro_queue.next; + while (tempc!=&sys_macro_queue) { + tempc1=tempc->next; + RemQue(tempc); + AFree(tempc); + tempc=tempc1; + } +} + +I1 *SysMacro2Str() +{ + TssCmdStruct *tempc; + I8 cnt=0; + I1 *ptr,*m; + Btr(&sys_flags,SYSf_RECORD_MACRO); + tempc=sys_macro_queue.next; + while (tempc!=&sys_macro_queue) { + cnt++; + tempc=tempc->next; + } + m=MAlloc(cnt*54+1); + ptr=m; + + tempc=sys_macro_queue.next; + while (tempc!=&sys_macro_queue) { + SPrintF(ptr,"Msg(0x%08X,0x%016X,0x%016X);", + tempc->code,tempc->p1,tempc->p2); + ptr+=54; + tempc=tempc->next; + } + return m; +} + +void PlaySysMacro() +{ + I1 *m=SysMacro2Str; + while (sys_cur_focus_task==Fs) + SwapInNext; + XTalkString(sys_cur_focus_task,m); + Free(m); +} + +void MacroTask() +{ + I8 i; + StrCpy(captured_macro_name,"Click Here"); + do { + i=PopUpExitRecordPlayStopInsert; + RefocusWindow; + switch (i) { + case 1: + Btr(&sys_flags,SYSf_RECORD_MACRO); + DelSysMacro; + Bts(&sys_flags,SYSf_RECORD_MACRO); + break; + case 2: + PlaySysMacro; + break; + case 3: + Btr(&sys_flags,SYSf_RECORD_MACRO); + break; + case 4: + if (sys_cur_focus_task) + QueueMsg(sys_cur_focus_task,0, + MSG_KEY_DOWN,0,SC_F2|SCF_SHIFT,0); + break; + } + } while (i>0); +} + +void EditMacroUtil() +{ + if (!macro_util_tss) + Spawn(&MacroTask,"MACRO TASK"); +} + +void EditInsertCapturedMacro() +{ + BoolU4 old_preempt=Preempt(OFF); + I1 *st=SysMacro2Str; + PrintF("$$MA+A+LM+LA,\"%s\",\"%s\"$$", + captured_macro_name,st); + Free(st); + Preempt(old_preempt); +} + +public U8 LtfPutChar(Ltf *l,I8 ch,U8 sc,BoolU4 old_preempt) +{ + U8 sc2; + BoolU4 old_preempt2=Preempt(OFF); + LtfEntry *cl; + I8 i,x,y,ms=0; + I1 *st; + if (ch!=CH_ESC && ch!=CH_CTRLQ) { + cl=l->cur_entry; + x=l->x; y=l->y; + + sc2=sc.u1[0]; + if (sc2==SC_GUI) { + if (l->menu_ltf) { + ms=DoMenu(l->menu_ltf); + sc=0; sc2=0; ch=0; + } + } + + if (l->EditPlugIns) { + if (l->EditPlugIns(l,ch,sc)) { + sc=0; sc2=0; ch=0; + } + } + + if (Bt(printable_chars_bitmap,ch)) + EditInsertChar(ch,sc,l,old_preempt); + else if (sc2>=SC_F1 && sc2<=SC_F10 && sc & SCF_CTRL && !(sc & SCF_ALT)) { + if (!ws_task) + ws_task=Spawn(&WsTsk,"WORDSTAT"); + else { + if ((sc & SCF_SHIFT)) + WsMan(sc2-SC_F1+1,Fs); + else + WsFillin(sc2-SC_F1+1); + } + } else if (sc2==SC_CURSOR_DOWN||sc2==SC_END) { + if (sc2==SC_END || sc & SCF_CTRL) { + while (l->cur_entry!=l) { + if ((sc & SCF_SHIFT)) + l->cur_entry->type|=LTFLT_SELECTED; + else + l->cur_entry->type&=~LTFLT_SELECTED; + l->cur_entry=l->cur_entry->next; + } + l->cur_data_col=l->cur_entry->min_col; + l->recalc_start=l; + } else + EditLineDown(l,sc); + } else if (sc2==SC_CURSOR_UP||sc2==SC_HOME) { + if (sc2==SC_HOME || sc & SCF_CTRL) { + while (l->cur_entry!=l) { + if ((sc & SCF_SHIFT)) + l->cur_entry->type|=LTFLT_SELECTED; + else + l->cur_entry->type&=~LTFLT_SELECTED; + l->cur_entry=l->cur_entry->last; + } + l->cur_entry=l->dummy.next; + l->cur_data_col=l->cur_entry->min_col; + l->recalc_start=l; + } else + EditLineUp(l,sc); + } else if (sc2==SC_PAGE_DOWN) { + if (cl!=l) + cl=cl->last; + for (i=Fs->window_top;iwindow_bottom;i++) { + EditLineDown(l,sc); + l->y=l->cur_entry->y; + } + l->recalc_start=cl; + } else if (sc2==SC_PAGE_UP) { + for (i=Fs->window_top;iwindow_bottom;i++) { + EditLineUp(l,sc); + l->y=l->cur_entry->y; + } + cl=l->cur_entry; + if (cl==l) + l->recalc_start=cl; + else + l->recalc_start=cl->last; + } else if (sc2==SC_CURSOR_LEFT) + EditCursorLeft(l,sc); + else if (sc2==SC_CURSOR_RIGHT) + EditCursorRight(l,sc); + else if (sc2==SC_DELETE) { + if ((sc & SCF_SHIFT)) + EditCutToClipboard(l); + else + EditDelChar(l); + } else if (ch==CH_BACKSPACE) { + if (l->cur_data_col<=l->cur_entry->min_col) { + l->cur_entry=l->cur_entry->last; + if (l->cur_entry!=l && l->cur_entry->btype==LTFT_SOFT_CR) + l->cur_entry=l->cur_entry->last; + if (l->cur_entry==l || + (l->cur_entry->btype==LTFT_USER_FOREGROUND || + l->cur_entry->btype==LTFT_USER_BACKGROUND)) { + l->cur_entry=l->cur_entry->next; + l->cur_data_col=l->cur_entry->min_col; + } else { + l->cur_data_col=l->cur_entry->max_col; + if (l->cur_data_col>l->cur_entry->min_col) + l->cur_data_col--; + EditDelChar(l); + } + } else { + l->cur_data_col--; + EditDelChar(l); + } + } else if (ch==25) //ctrl Y + EditDelLine(l); + else if (ch==12) //ctrl L + EditInsertDollarCmd; + else if (ch==20) + TogglePlainTextMode(l); + else if (sc2==SC_INSERT) { + if ((sc & SCF_SHIFT)) + EditInsertLtf(l,sys_clipboard_ltf); + else if (sc & SCF_CTRL) + EditCopyToClipboard(l); + else + l->flags^=LTFF_OVERSTRIKE; + } else if (ch==6) { //CTRL F + if ((sc & SCF_SHIFT)) + DoFavorites; + else + EditReplace(l); + } else if (ch==18) { //CTRL R + if (cl->btype==LTFT_PICTURE) + EditExistingGraphic(l, + ((x-l->line_start_col)>>2+cl->max_col)*FONT_WIDTH, + (y-l->cur_top_line_num)*FONT_HEIGHT); + else + EditInsertGraphic(l, + (x-l->line_start_col)>>2*FONT_WIDTH, + (y-l->cur_top_line_num)*FONT_HEIGHT); + } else if (sc2==SC_F2 && !(sc & SCF_CTRL) && !(sc & SCF_ALT)) { + if ((sc & SCF_SHIFT)) + EditInsertCapturedMacro; + else + EditMacroUtil; + } else if (sc2==SC_F9 && !(sc & SCF_CTRL) && !(sc & SCF_ALT)) { + if ((sc & SCF_SHIFT)) + ClearAllBpts(l); + else + ToggleBpt(l); + } else if (sc2==SC_F5 && !(sc & SCF_CTRL) && !(sc & SCF_ALT)) { + if ((sc & SCF_SHIFT)) + LtfStep(l); + else + LtfGo; + } else if (sc2==SC_F3 && !(sc & SCF_CTRL) && !(sc & SCF_ALT)) { + l->find_replace->scan_forward=!(sc & SCF_SHIFT); + EditFindNext(l); + } else if (sc2==SC_F4 && !(sc & SCF_CTRL) && !(sc & SCF_ALT)) { + if ((sc & SCF_SHIFT)) + st=PopUpPickDir; + else + st=PopUpPickFile; + if (st) { + PrintF("\"%s\"",st); + Free(st); + } + } else if (ch==7) //CTRL G + EditGoToLine(l); + else if (ch==19) // CTRL S + LtfWrite(l); + else if (ch==1) //CTRL A + LtfWrite(l,TRUE); + else if (ch==14) { //CTRL N + if ((sc & SCF_SHIFT)) + PrintF("$$ID,-2$$"); + else + PrintF("$$ID,2$$"); + } else if (ch==23) { //CTRL W + if ((sc & SCF_SHIFT)) + PrintF("$$WW 0$$"); + else + PrintF("$$WW 1$$"); + } else if (ch==2) { //CTRL B + if ((sc & SCF_SHIFT)) + PrintF("$$BK 0$$"); + else + PrintF("$$BK 1$$"); + } else if (ch==21) { //CTRL U + if ((sc & SCF_SHIFT)) + PrintF("$$UL 0$$"); + else + PrintF("$$UL 1$$"); + } else if (ch==26) { //CTRL Z + if ((sc & SCF_SHIFT)) + PrintF("$$IV 0$$"); + else + PrintF("$$IV 1$$"); + } else if (ch==16) { //CTRL P + if ((sc & SCF_SHIFT)) + PrintF("$$SY 0$$"); + else if ((sc & SCF_ALT)) + PrintF("$$SY 3$$"); + else + PrintF("$$SY,-3$$"); + } else if (sc2==SC_PRTSCRN2) + Lpt1PrintLtf(l); + + if (!l->recalc_start) + l->recalc_start=l->cur_entry->last; + } + Preempt(old_preempt2); + + SwapInNext; + return ms; +} + +public void LtfPutSPartial(Ltf *l,I1 *st) +{ + U1 ch; + I1 *b,*src,*dst,*ptr=st,*ptr2; + BoolU4 old_preempt=Preempt(OFF); + LtfEntry *cl,*nl; + I8 i,j; + if (!st) { + Preempt(old_preempt); + return; + } + while (ch=*ptr) { + if (!Bt(displayable_chars_bitmap,ch) || ch=='$$' || + l->flags & (LTFF_OVERSTRIKE | LTFF_IN_DOLLAR)) { + LtfPutChar(l,ch,0,old_preempt); + ptr++; + } else { + ptr2=ptr++; + while (TRUE) { + ch=*ptr++; + if (!Bt(displayable_chars_bitmap,ch) || ch=='$$') + break; + } + ptr--; + *ptr=0; + cl=l->cur_entry; + l->recalc_start=cl->last; + j=StrLen(ptr2); + if (cl->btype==LTFT_TEXT) { + b=MAlloc(cl->max_col+j+1,l->mem_tss); + dst=b; + src=cl->display; + i=l->cur_data_col; + l->cur_data_col=i+j; + cl->max_col+=j; + while (i-->0) + *dst++=*src++; + while (j-->0) + *dst++=*ptr2++; + while (*dst++=*src++); + Free(cl->display,l->mem_tss); + cl->display=b; + } else { + nl=MAllocZ(sizeof(LtfEntryBase)+4,l->mem_tss); + nl->type=LTFT_TEXT | l->text_attribute << 8; + nl->display=NewString(ptr2,l->mem_tss); + nl->x=cl->x; + nl->y=cl->y; + nl->max_col=StrLen(ptr2); + nl->indent=cl->indent; + nl->page_line_num=cl->page_line_num; + nl->left_margin=cl->left_margin; + nl->right_margin=cl->right_margin; + InsQue(nl,cl->last); + l->cur_entry=nl; + l->cur_data_col=StrLen(ptr2); + } + *ptr=ch; + LtfRemoveSoftCRs(l,l->cur_entry); + } + SwapInNext; + } + Preempt(old_preempt); + +} + +public void LtfEditFile(I8 type,I1 *filename, + I1 *pattern=NULL,I8 num=1) +{ + I1 *ptr; + I8 i,j,flags=0; + LtfEntry *ll; + Ltf *l,*m; + + if (type==LK_PLAIN) { + type=LK_FILE; + flags=LTFF_PLAIN_TEXT; + } else if (type==LK_PLAIN_FIND) { + type=LK_FILE_FIND; + flags=LTFF_PLAIN_TEXT; + } else if (type==LK_PLAIN_LINE) { + type=LK_FILE_LINE; + flags=LTFF_PLAIN_TEXT; + } + if (!*filename) + l=Fs->cur_ltf; + else { + l=LtfRead(filename,flags); + l->flags|=LTFF_ATTR_BY_FILENAME; + m=LtfRead(EDIT_MENU_NAME); + m->text_attribute=(WHITE<<4)+LTBLUE; + l->menu_ltf=m; + } + if (type==LK_FILE) { + if (l->y) + LtfCenter(l); + } else if (type==LK_FILE_LINE) { + l->y=num-1; + l->x=0; + LtfUpdateWindowJoin(l,FALSE,FALSE,FALSE,TRUE); + LtfCenter(l); + } else if (type==LK_FILE_ANCHOR) { + if (ll=LtfFindAnchor(l,pattern)) + LtfCenter(l); + } else if (type==LK_FILE_FIND) { + i=num; + ll=l->dummy.next; + while (ll!=l) { + if (Bt(ltf_display_types,ll->btype)) { + if (ptr=StrIStr(ll->display,pattern)) { + j=ptr-ll->display; + i--; + if (i==0) { + l->cur_entry=ll; + if (jmin_col) j=ll->min_col; + if (j>ll->max_col) j=ll->max_col; + l->cur_data_col=j; + LtfCenter(l); + break; + } + } + } + ll=ll->next; + } + } + if (DoLtf(l,FALSE)) + LtfWrite(l); + if (Fs->cur_ltf!=l) + LtfDel(l); +} + +public void Edit(I1 *filename) +{ + I1 *buf=NewString(filename), + *buf2=NewString(filename); + U8 num=1; + I1 *temp_filename=NewString(filename), + *tfn_ptr=temp_filename; + SysHashEntry *temph; + Ltf *cur; + I8 i; + + i=LK_FILE; + StrCpy(temp_filename,filename); + if (StrLen(filename)>3 && filename[2]==':') { + buf[2]=0; + i=MatchSysTextEntry(buf,"ST_LINK_TYPES",MLE_IGNORE_CASE); + tfn_ptr=temp_filename+3; + if (i==LK_MAN_PAGE) { + temph=FindLocalHash(tfn_ptr, + HTT_GLBL_VAR|HTT_CLASS|HTT_FUNCTION| + HTT_STRING_CONSTANT|HTT_SYS_SYMBOL); + if (temph) + Edit(temph->source_link); + Free(temp_filename); + Free(buf); + Free(buf2); + return; + } + if (i==LK_FILE_LINE||i==LK_PLAIN_LINE) { + if (Occurrences(tfn_ptr,',')) { + RemoveLastSeg(tfn_ptr,",",buf); + num=AtoI(buf); + } + } else if (i==LK_FILE_ANCHOR) { + *buf=0; + if (Occurrences(tfn_ptr,',')) + RemoveLastSeg(tfn_ptr,",",buf); + } else if (i==LK_FILE_FIND||i==LK_PLAIN_FIND) { + *buf=0; + *buf2=0; + if (Occurrences(tfn_ptr,',')) + RemoveLastSeg(tfn_ptr,",",buf); + if (Occurrences(buf,':')) { + RemoveLastSeg(buf,":",buf2); + num=AtoI(buf2); + } + } + } + tfn_ptr=NewString(tfn_ptr); + LtfEditFile(i,tfn_ptr,buf,num); + ClearWindowText; + CursorHome; + Free(tfn_ptr); + Free(temp_filename); + Free(buf); + Free(buf2); +} + +public void Plain(I1 *filename) +{ + I1 *buf=MSPrintF("PI:%s",filename); + Edit(buf); + Free(buf); +} + +public void UseConsoleLtf(I1 *menu_file) +{ + BoolU4 old_preempt; + LtfEntry *ll; + Ltf *l=LtfNew,*m,*aux=LtfNew; + l->max_entries=4096; + l->flags|=LTFF_ATTR_BY_PARTITION; + + LtfPutS(aux,"$$CM+BY+RX,-6,1$$"); + ll=LtfPutS(aux,"$$TX+BD+DC+RD,\" \"$$"); + ll->display_cb=&EditOverStrikeCB; + LtfPutS(aux,"$$CM+BY+RX,-5,1$$"); //gets merged without this + ll=LtfPutS(aux,"$$TX+BD+DC+RD,\" \"$$"); + ll->display_cb=&EditDollarCB; + LtfPutS(aux,"$$CM+BY+RX,-4,1$$"); //gets merged without this + ll=LtfPutS(aux,"$$TX+BD+DC+RD,\" \"$$"); + ll->display_cb=&EditQuotesCB; + LtfPutS(aux,"$$CM+BY+RX,-3,1$$"); //gets merged without this + ll=LtfPutS(aux,"$$TX+BD+DC+RD,\" \"$$"); + ll->display_cb=&EditBracesCB; + LtfPutS(aux,"$$CM+BY+RX,-2,1$$"); //gets merged without this + ll=LtfPutS(aux,"$$TX+BD+DC+RD,\" \"$$"); + ll->display_cb=&EditSemicolonCB; + LtfPutS(aux,"$$CM+BY+RX,-10,1$$"); + ll=LtfPutS(aux,"$$TX+BD+DC+RD,\" \"$$"); + ll->display_cb=&EditDollarTypeCB; + aux->user_data=l; + + LtfPutS(aux,"$$CM+TY,0,-1$$"); + ll=LtfPutS(aux,"$$DA-T-P+BD+RD+CX+SCX+IV,140,\"%s...\",16$$"); + ll->data=&Fs->task_descriptor; + LtfFormatData(ll); + LtfPrintF(aux,"$$CM,1,0$$$$TX+BD+IV,\"%X\"$$",Fs); + aux->text_attribute=Fs->border_attribute; + if (Bt(&Fs->crt_flags,CRTf_HAS_CLOSE_WINDOW)) + LtfPutS(aux,"$$TX+RX+BD,\"[X]\"$$"); + if (menu_file) { + LtfPutS(aux,"$$TX+LX+BD,\"MENU\"$$"); + m=LtfRead(menu_file); + m->flags|=LTFF_ATTR_BY_PARTITION; + l->menu_ltf=m; + Bts(&Fs->crt_flags,CRTf_HAS_MENU); + } + + old_preempt=Preempt(OFF); + Fs->update_window=&LtfUpdateCurLtfWindow; + Fs->cur_ltf=l; + Fs->aux_ltf=aux; + Fs->scroll_speed=7; + Preempt(old_preempt); +} + +public I1 *LtfGetLine(Ltf *l,LtfEntry *cl,I8 *cur_col=NULL) +{ + LtfEntry *cl2=cl; + BoolU4 old_preempt=Preempt(OFF); + I1 *result,*dst,*src,*start; + U8 i=0; + if (*cur_col) + *cur_col=-1; + while (cl2!=l && cl2->btype!=LTFT_CR) { + if (Bt(ltf_display_types,cl2->btype)) + i+=StrLen(cl2->display); + else if (cl2->btype==LTFT_TAB) + i++; + cl2=cl2->next; + } + result=MAlloc(i+1); + dst=result; + while (cl!=l && cl->btype!=LTFT_CR) { + start=dst; + if (Bt(ltf_display_types,cl->btype)) { + src=cl->display; + while (*src) + *dst++=*src++; + } else if (cl->btype==LTFT_TAB) + *dst++=9; + if (cl==l->cur_entry && cur_col) + *cur_col=start-result+l->cur_data_col; + cl=cl->next; + } + *dst++=0; + if (cl==l->cur_entry && cur_col && !l->cur_data_col) + *cur_col=dst-1-result; + Preempt(old_preempt); + return result; +} + +public BoolU4 View() +{ + I8 ch=0; + U8 sc=0; + Ltf *l=Fs->cur_ltf; + U8 my_LtfPutChar(LTChnl *chnl,I8 ch,U8 sc); + while (ch!=CH_ESC && ch!=CH_CTRLQ) { + ch=GetChar2(&sc); + LtfPutChar(l,ch,sc,Bt(&sys_flags,SYSf_PREEMPTIVE)); + if (Fs->rmt_chnl) { + my_LtfPutChar=ext[EXT_RMT_LTFPUTCHAR]; + my_LtfPutChar(Fs->rmt_chnl,ch,sc); + } + LtfRecalc(l); + } + return ch==CH_ESC; +} + + +public LtfEntry *LtfPutLine(LtfEntry *cl) +{ + while (cl->btype!=LTFT_ERROR && cl->btype!=LTFT_CR) { + if (Bt(ltf_display_types,cl->btype)) + PutS(cl->display); + else if (cl->btype==LTFT_TAB) + PutChar(CH_TAB); + cl=cl->next; + } + CrLf; + return (cl->btype==LTFT_ERROR) ? cl:cl->next; +} + +I1 *SysGetS() +{ + Ltf *l=Fs->cur_ltf; + LtfEntry *cl; + BoolU4 old_preempt; + I1 *result; + U8 ch,sc; + U8 my_LtfPutChar(LTChnl *chnl,I8 ch,U8 sc); + old_preempt=Preempt(OFF); + PutS("$$FU$$$$BU$$"); + do { + Preempt(old_preempt); + ch=GetChar2(&sc); + Preempt(OFF); + cl=l->cur_entry; + if (ch==CH_ESC) { + LtfBottom(l); + LtfRunLine(l,cl,TRUE,old_preempt); + } if (ch==CH_CTRLQ) + Exit; + else { + LtfPutChar(l,ch,sc,old_preempt); + if (Fs->rmt_chnl) { + my_LtfPutChar=ext[EXT_RMT_LTFPUTCHAR]; + my_LtfPutChar(Fs->rmt_chnl,ch,sc); + } + LtfRecalc(l); + } +//Ctrl shift is a blank line without entry + } while (ch!=CH_CR || sc & SCF_CTRL && (sc & SCF_SHIFT)); + + cl=l->cur_entry; + do cl=cl->last; + while (cl!=l && cl->btype!=LTFT_CR && + cl->btype!=LTFT_USER_FOREGROUND && cl->btype!=LTFT_USER_BACKGROUND); + + + do cl=cl->last; + while (cl!=l && cl->btype!=LTFT_CR && + cl->btype!=LTFT_USER_FOREGROUND && cl->btype!=LTFT_USER_BACKGROUND); + + cl=cl->next; + result=LtfGetLine(l,cl,NULL); + PutS("$$FU$$$$FG$$$$BG$$"); + Preempt(old_preempt); + return result; +} + +I1 *SysPrompt(BoolU4 double_semicolon=FALSE) +{ + I8 i; + I1 *s,*result; + + for (i=Fs->answers_displayed;i>0;i--) { + if (Fs->answers_types[i-1]==IT_DOUBLE) + PrintF("ansd%d=%15.7g=%15e\r\n",i-1, + Fs->double_answers[i-1],Fs->double_answers[i-1]); + else + PrintF("ans%d=0x%016X=%d\r\n",i-1, + Fs->answers[i-1],Fs->answers[i-1]); + } + PrintFDriveTextAttr(PartitionToDrive); + s=CurDir; + PutS(s); + Free(s); + PutChar('>'); + s=SysGetS; + if (double_semicolon) { + i=StrLen(s); + result=MAlloc(i+4); + MemCpy(result,s,i+1); + i--; + while (i>=0 && (result[i]==CH_SPACE || result[i]==CH_SHIFT_SPACE || result[i]==CH_TAB)) + i--; + i++; + if (i>0 && result[i-1]==';') + result[i++]=';'; //The Lex goes one beyond + result[i++]=13;//#define goes to + result[i++]=10; + result[i]=0; + } else + result=NewString(s); + Free(s); + return result; +} + +public I8 PmtI8(I1 *msg,I8 default,I8 lo=MIN_I8,I8 hi=MAX_I8) +{ + I8 result; + I1 *st; + while (TRUE) { + PrintF(msg,default); + st=SysGetS; + if (!*st) { + Free(st); + return default; + } + result=AtoI(st); + Free(st); + if (result>=lo && result<=hi) + return result; + } +} + +public double PmtDouble(I1 *msg,double default,double lo=MIN_double,double hi=MAX_double) +{ + double result; + I1 *st; + while (TRUE) { + PrintF(msg,default); + st=SysGetS; + if (!*st) { + Free(st); + return default; + } + result=A2Double(st); + Free(st); + if (result>=lo && result<=hi) + return result; + } +} + +public I1 *PmtStr(I1 *msg,I1 *default) +{ + I1 *st; + PrintF(msg,default); + st=SysGetS; + if (!*st) { + Free(st); + return NewString(default); + } + return st; +} + +public LTDate PmtLTDate(I1 *msg,LTDate default,LTDate lo=MIN_I8,LTDate hi=MAX_I8) +{ + LTDate result; + I1 *st; + while (TRUE) { + PrintF(msg,default.date,default.time); + st=SysGetS; + if (!*st) { + Free(st); + return default; + } + result=A2LTDate(st); + Free(st); + if (result>=lo && result<=hi) + return result; + } +} + +I8 PopUpCancelIncludeDelAuto(I1 *header=NULL,I1 *footer=NULL) +{ + I8 i; + Ltf *l=LtfNew; + if (header) LtfPutS(l,header); + LtfPutS(l,"$$CM +LX,2,4 $$$$BT, \"INCLUDE\" 1$$"); + LtfPutS(l,"$$CM +LX,18,0$$$$BT, \"DELETE\" 2$$"); + LtfPutS(l,"$$CM +LX,2,3 $$$$BT, \"AUTOFILE\" 3$$"); + LtfPutS(l,"$$CM +LX,18,0$$$$BT, \"COMPILE\" 5$$"); + LtfPutS(l,"$$CM +LX,2,3 $$$$BT, \"ADAM_INCLUDE\" 4$$"); + LtfPutS(l,"$$CM +LX,18,0$$$$BT, \"CANCEL\" 0$$"); + LtfPutS(l,"$$CM +LX,2,3 $$$$BT, \"LOAD\" 6$$"); + if (footer) LtfPutS(l,footer); + i=PopUpMenu(l); + LtfDel(l); + return i; +} + +void LeftClickLink(Ltf *l,LtfEntry *cl,U2 old_preempt2) +{ + BoolU4 old_preempt=Bt(&sys_flags,SYSf_PREEMPTIVE); + I1 *st; + l;//ref to prevent warning + if (cl->flags & LTFLF_AUX_STRING) + st=NewString(cl->aux_string); + else + st=NewString(cl->display); + Preempt(old_preempt2); + Edit(st); + Preempt(old_preempt); + Free(st); +} + +void LeftDoubleClickLink(Ltf *l,LtfEntry *cl,BoolU4 old_preempt2) +{ //TODO come-up with new uses. + l;cl;old_preempt2;//ref to prevent warning +} + +void RightClickLink(Ltf *l,LtfEntry *cl,BoolU4 old_preempt2) +{ + BoolU4 send_cr=FALSE,old_preempt=Bt(&sys_flags,SYSf_PREEMPTIVE); + I1 *st2,*st; + I8 i; + if (cl->flags & LTFLF_AUX_STRING) + st2=NewString(cl->aux_string); + else + st2=NewString(cl->display); + st=(st2[2]==':') ? st2+3:st2; + i=PopUpCancelIncludeDelAuto(st); + Preempt(old_preempt2); + if (i>0) { + LtfBottom(l); + switch (i) { + case 1: + if (Occurrences(st,'.') && !WildCardMatch("*.CP?",st)) { + if (!PopUpNoYes("WARNING: Not .CP? File\r\n" + "Proceed anyway?\r\n\r\n")) { + send_cr=TRUE; + break; + } + } + cout "#include \"",st,"\";\r\n$$FU$$$$FG$$$$BG$$"; + ExecuteFile(st); + break; + case 2: + Del(st); + break; + case 3: + if (Occurrences(st,'.') && !WildCardMatch("*.AU?",st)) { + if (!PopUpNoYes("WARNING: Not .AU? File\r\n" + "Proceed anyway?\r\n\r\n")) { + send_cr=TRUE; + break; + } + } + cout "AutoFile(\"",st,"\");\r\n$$FU$$$$FG$$$$BG$$"; + AutoString("%F\r",st); + break; + case 4: + if (Occurrences(st,'.') && !WildCardMatch("*.CP?",st)) { + if (!PopUpNoYes("WARNING: Not .CP? File\r\n" + "Proceed anyway?\r\n\r\n")) { + send_cr=TRUE; + break; + } + } + cout "Adam(\"#include \\\"",st,"\\\"\" );\r\n$$FU$$$$FG$$$$BG$$"; + Adam(";#include \"%s\"",st); + break; + case 5: + if (Occurrences(st,'.') && !WildFileNameList("*.CP?;*.AS?",st)) { + if (!PopUpNoYes("WARNING: Not .CP? or .AS? File\r\n" + "Proceed anyway?\r\n\r\n")) { + send_cr=TRUE; + break; + } + } + cout "CompileFile(\"",st,"\");\r\n$$FU$$$$FG$$$$BG$$"; + CompileFile(st); + break; + case 6: + if (Occurrences(st,'.') && !WildCardMatch("*.BI?",st)) { + if (!PopUpNoYes("WARNING: Not .BI? File\r\n" + "Proceed anyway?\r\n\r\n")) { + send_cr=TRUE; + break; + } + } + cout "Load(\"",st,"\");\r\n$$FU$$$$FG$$$$BG$$"; + Load(st); + break; + } + } else + send_cr=TRUE; + LtfBottom(l); + cout "$$FU$$$$FG$$$$BG$$"; + if (send_cr) + PutChar(CH_CR); + Preempt(old_preempt); + Free(st2); +} + +void RightDoubleClickLink(Ltf *l,LtfEntry *cl,BoolU4 old_preempt2) +{ //TODO come-up with new uses. + l;cl;old_preempt2;//ref to prevent warning +} + +public void Man(I1 *st) +{ + I1 *name=MAlloc(3+StrLen(st)+1); + StrCpy(name,"MN:"); + StrCat(name,st); + Edit(name); + Free(name); +} + +ext[EXT_LTF_PUT_I1]=&LtfPutChar; +ext[EXT_LTF_PUTS]=&LtfPutSPartial; +ext[EXT_LTF_READ]=&LtfRead; +ext[EXT_LTF_WRITE]=&LtfWrite; +ext[EXT_LTF_NEW]=&LtfNew; +ext[EXT_LTF_RESET]=&LtfReset; +ext[EXT_LTF_DEL]=&LtfDel; + + \ No newline at end of file diff --git a/LT/ADAM/EDIT.MUZ b/LT/ADAM/EDIT.MUZ new file mode 100644 index 0000000..c195bae --- /dev/null +++ b/LT/ADAM/EDIT.MUZ @@ -0,0 +1,69 @@ +$FG,2$$WW,1$'^'$FG$ Means the Control Key + +$MA+A+LA+S,"Toggle Plain Text ^T","Msg(2,0x14,0x41400000414);"$ + +Select Text SHIFT CURSOR +$MA+A+LA,"Cut to Clipboard SHIFT DEL","Msg(2,0,0x3D300000253);"$ +$MA+A+LA,"Copy to Clipboard ^INS","Msg(2,0,0x4D200000452);"$ +$MA+A+LA,"Paste from Clipboard SHIFT INS","Msg(2,0,0x2D200000252);"$ +$MA+A+LA,"Del Line ^Y","Msg(2,0x19,0x41500000415);"$ + +Begin/End of Line ^Left/^Right +Begin/End of File ^Up/^Down + +$MA+A+LA,"Indent In ^N","Msg(2,0xE,0x43100000431);"$ +$MA+A+LA,"Indent Out ^SHIFT N","Msg(2,0xE,0x63100000631);"$ + +$MA+A+LA,"Word Wrap On ^W","Msg(2,0x17,0x41100000411);"$ +$MA+A+LA,"Word Wrap Off ^SHIFT W","Msg(2,0x17,0x61100000611);"$ + +$MA+A+LA,"Underline On ^U","Msg(2,0x15,0x41600000416);"$ +$MA+A+LA,"Underline Off ^SHIFT U","Msg(2,0x15,0x61600000616);"$ + +$MA+A+LA,"Blink On ^B","Msg(2,2,0x43000000430);"$ +$MA+A+LA,"Blink Off ^SHIFT B","Msg(2,2,0x63000006300);"$ + +$MA+A+LA,"Invert Color On ^Z","Msg(2,0x1A,0x42C0000042C);"$ +$MA+A+LA,"Invert Color Off ^SHIFT Z","Msg(2,0x1A,0x62C0000062C);"$ + +$MA+A+LA,"Superscript ^P","Msg(2,0x10,0x41900000419);"$ +$MA+A+LA,"Normal ^SHIFT P","Msg(2,0x10,0x61900000619);"$ +$MA+A+LA,"Subscript ^ALT P","Msg(2,0x10,0xC1900000C19);"$ + +$MA+A+LA,"Insert Dollar Cmd ^L","Msg(2,0xC,0x42600000426);"$ +$MA+A+LA,"Insert Graphic Cmd ^R","Msg(2,0x12,0x41300000413);"$ +$MA+A+LA,"Macro Capture and Play F2","Msg(2,0,0x3C0000003C);"$ + +$MA+A+LA,"Page Break ^ENTER","Msg(2,0xD,0x41C0000041C);"$ +$MA+A+LA,"Print PrintScreen","Msg(2,0,0xB7000000B7);"$ +$MA+A+LA,"Goto Favorites ^SHIFT F","Msg(2,6,0x62100000621);"$ + +$MA+A+LA,"Find/Replace ^F","Msg(2,6,0x42100000421);"$ +$MA+A+LA,"Find Next F3","Msg(2,0,0x3D0000003D);"$ +$MA+A+LA,"Go to Line ^G","Msg(2,7,0x42200000422);"$ +$MA+A+LA,"Save ^S","Msg(2,0x13,0x41F0000041F);"$ +$MA+A+LA,"Save As ^A","Msg(2,1,0x41E0000041E);"$ +$MA+A+LA,"Quit No Save ^Q","Msg(2,0x11,0x41000000410);"$ +$MA+A+LA,"Quit and Save ESC","Msg(2,0x1B,0x0100000001);"$ + +$TR,"Cmd Line Issues"$ +$ID,2$$FG$* CTRL-SHIFT-ENTER can be used to insert a carriage return without issuing a cmd. This is useful when you have scrolled-up and wish to enter a cmd on a blank line. +* The last semicolon on the line is converted to a double semicolon because the compiler looks ahead before doing a cmd. This normally has no negative effect, but when entering "if" statements with "else" clauses it presents problems. + + +$ID,-2$$TR,"Hot Keys"$ +$ID,2$$FG,9$CTRL ALT DEL$FG$ Reboots +$FG,9$CTRL ALT ESC$FG$ Spawns new task +$FG,9$CTRL ALT TAB$FG$ Switches tasks +$FG,9$CTRL ALT X$FG$ Kills current task +$FG,9$$FG,9$CTRL ALT C$FG$ Breaks current program +$FG,9$WINDOWS KEY$FG$ Activates Menu/Help/Macro area +$FG,9$CTRL FUNCTION KEY$FG$ Enters autocomplete word +$FG,9$CTRL SHIFT-FUNCTION KEY$FG$ Does man page on symbol +$ID,-2$$TR,"Debugging"$ +$ID,2$F9 Toggle Breakpoint +SHIFT-F9 Clear ALL Breakpoints +F5 Go +SHIFT-F5 Single-Step +$ID,-2$ +* If "MENU" appears on the title bar, you can click it with a mouse. \ No newline at end of file diff --git a/LT/ADAM/FIFO.CPZ b/LT/ADAM/FIFO.CPZ new file mode 100644 index 0000000..c2e638a --- /dev/null +++ b/LT/ADAM/FIFO.CPZ @@ -0,0 +1,172 @@ +public class U1Fifo +{ + U1 *buf; + U8 mask,in_ptr,out_ptr; +}; + +public U1Fifo *NewU1Fifo(U8 size) +{ + U1Fifo *f; + f=MAlloc(sizeof(U1Fifo)); + f->buf=MAlloc(size); + f->mask=size-1; + f->in_ptr=0; + f->out_ptr=0; + return f; +} + +public void DelU1Fifo(U1Fifo *f) +{ + Free(f->buf); + Free(f); +} + +public BoolU4 U1FifoInsert(U1Fifo *f,U1 ch) +{ + U8 old_flags=GetFlags, + new_in_ptr; + Cli; + new_in_ptr=(f->in_ptr+1)&f->mask; + if (new_in_ptr==f->out_ptr) { + SetFlags(old_flags); + return FALSE; + } else { + f->buf[f->in_ptr]=ch; + f->in_ptr=new_in_ptr; + SetFlags(old_flags); + return TRUE; + } +} + +public BoolU4 U1FifoRemove(U1Fifo *f,U1 *ch) +{ + U8 old_flags=GetFlags; + Cli; + if (f->in_ptr==f->out_ptr) { + SetFlags(old_flags); + return FALSE; + } else { + *ch=f->buf[f->out_ptr]; + f->out_ptr=(f->out_ptr+1)&f->mask; + SetFlags(old_flags); + return TRUE; + } +} + +public BoolU4 U1FifoPeek(U1Fifo *f,U1 *ch) +{ + U8 old_flags=GetFlags; + Cli; + if (f->in_ptr==f->out_ptr) { + SetFlags(old_flags); + return FALSE; + } else { + *ch=f->buf[f->out_ptr]; + SetFlags(old_flags); + return TRUE; + } +} + +public void U1FifoFlush(U1Fifo *f) +{ + f->out_ptr=f->in_ptr; +} + +public U8 U1FifoCnt(U1Fifo *f) +{ + U8 result,old_flags=GetFlags; + Cli; + if (f->out_ptr>f->in_ptr) + result=f->mask+1-(f->out_ptr-f->in_ptr); + else + result=f->in_ptr-f->out_ptr; + SetFlags(old_flags); + return result; +} + +public class U4Fifo +{ + U4 *buf; + U8 mask,in_ptr,out_ptr; +}; + +public U4Fifo *NewU4Fifo(U8 size) +{ + U4Fifo *f; + f=MAlloc(sizeof(U4Fifo)); + f->buf=MAlloc(size*sizeof(U4)); + f->mask=size-1; + f->in_ptr=0; + f->out_ptr=0; + return f; +} + +public void DelU4Fifo(U4Fifo *f) +{ + Free(f->buf); + Free(f); +} + +public BoolU4 U4FifoInsert(U4Fifo *f,U4 d) +{ + U8 old_flags=GetFlags, + new_in_ptr; + Cli; + new_in_ptr=(f->in_ptr+1)&f->mask; + if (new_in_ptr==f->out_ptr) { + SetFlags(old_flags); + return FALSE; + } else { + f->buf[f->in_ptr]=d; + f->in_ptr=new_in_ptr; + SetFlags(old_flags); + return TRUE; + } +} + +public BoolU4 U4FifoRemove(U4Fifo *f,U4 *d) +{ + U8 old_flags=GetFlags; + Cli; + if (f->in_ptr==f->out_ptr) { + SetFlags(old_flags); + return FALSE; + } else { + *d=f->buf[f->out_ptr]; + f->out_ptr=(f->out_ptr+1)&f->mask; + SetFlags(old_flags); + return TRUE; + } +} + +public BoolU4 U4FifoPeek(U1Fifo *f,U4 *d) +{ + U8 old_flags=GetFlags; + Cli; + if (f->in_ptr==f->out_ptr) { + SetFlags(old_flags); + return FALSE; + } else { + *d=f->buf[f->out_ptr]; + SetFlags(old_flags); + return TRUE; + } +} + +public void U4FifoFlush(U4Fifo *f) +{ + f->out_ptr=f->in_ptr; +} + +public U8 U4FifoCnt(U4Fifo *f) +{ + U8 result,old_flags=GetFlags; + Cli; + if (f->out_ptr>f->in_ptr) + result=f->mask+1-(f->out_ptr-f->in_ptr); + else + result=f->in_ptr-f->out_ptr; + SetFlags(old_flags); + return result; +} + diff --git a/LT/ADAM/GRELEM.CPZ b/LT/ADAM/GRELEM.CPZ new file mode 100644 index 0000000..e31a734 --- /dev/null +++ b/LT/ADAM/GRELEM.CPZ @@ -0,0 +1,834 @@ +I8 PopUpGrElemType(BoolU4 new_picture) +{ + I8 i; + Ltf *l=LtfNew; + LtfPutS(l,"$$MU,\"Color (4-bit)\" GRET_COLOR4$$\r\n"); + LtfPutS(l,"$$MU,\"Width\" GRET_WIDTH$$\r\n"); + LtfPutS(l,"$$MU,\"Point\" GRET_POINT$$\r\n"); + LtfPutS(l,"$$MU,\"Line\" GRET_LINE$$\r\n"); + LtfPutS(l,"$$MU,\"PolyLine\" GRET_POLYLINE$$\r\n"); + LtfPutS(l,"$$MU,\"PolyPoint\" GRET_POLYPOINT$$\r\n"); + LtfPutS(l,"$$MU,\"BSpline2\" GRET_BSPLINE2$$\r\n"); + LtfPutS(l,"$$MU,\"BSpline3\" GRET_BSPLINE3$$\r\n"); + LtfPutS(l,"$$MU,\"BSpline2 Closed\" GRET_BSPLINE2_CLOSED$$\r\n"); + LtfPutS(l,"$$MU,\"BSpline3 Closed\" GRET_BSPLINE3_CLOSED$$\r\n"); + LtfPutS(l,"$$MU,\"End\" GRET_END$$\r\n"); + if (new_picture) + LtfPutS(l,"$$MU,\"Cancel\" -1$$\r\n"); + LtfPutS(l,"\r\nNote: Right-Click to get back to this menu.\r\n" + "Press ESC to Exit, CTRL-Q to abort.\r\n"); + i=PopUpMenu(l); + LtfDel(l); + return i; +} + +public I8 PopUpColor() +{ + I8 i; + Ltf *l=LtfNew; + for (i=0;i<16;i++) + LtfPrintF(l,"$$BM %d$$$$MU,\"________________\" %d$$\r\n",i,i); + LtfPutS(l,"$$BM WHITE$$$$MU,\"DEFAULT\" -1$$"); + i=PopUpMenu(l); + LtfDel(l); + return i; +} + +public I8 PopUpWidth() +{ + I8 i; + Ltf *l=LtfNew; + for (i=0;i<16;i++) + LtfPrintF(l,"$$MU,\"%d\" %d$$\r\n",i,i); + i=PopUpMenu(l); + LtfDel(l); + return i; +} + +I8 GrXOffsets[8]={-1,0,1,-1,1,-1,0,1}, + GrYOffsets[8]={-1,-1,-1,0,0,1,1,1}; + +U8 GrElemBaseSize(I8 type,BoolU4 queue=TRUE) +{ + U8 i=(queue) ? offset(GrElem.start):0; + switch (type) { + case GRET_COLOR4: + i+=1+offset(GrElem.color4)-offset(GrElem.start); + break; + case GRET_COLOR24: + i+=3+offset(GrElem.color24)-offset(GrElem.start); + break; + case GRET_WIDTH: + i+=offset(GrElem.y1)-offset(GrElem.start); + break; + case GRET_POINT: + i+=offset(GrElem.x2)-offset(GrElem.start); + break; + case GRET_LINE: + i+=sizeof(GrElem)-offset(GrElem.start); + break; + case GRET_POLYLINE: + case GRET_POLYPOINT: + case GRET_BSPLINE2: + case GRET_BSPLINE3: + case GRET_BSPLINE2_CLOSED: + case GRET_BSPLINE3_CLOSED: + i+=offset(GrElem.y1)-offset(GrElem.start); + break; + case GRET_SHIFT: + i+=offset(GrElem.x2)-offset(GrElem.start); + break; + case GRET_END: + i+=offset(GrElem.x1)-offset(GrElem.start); + break; + } + return i; +} + +U8 GrElemSize(GrElem *tempg,BoolU4 queue=TRUE) +{ + U8 i=GrElemBaseSize(tempg->type,queue); + switch (tempg->type) { + case GRET_POLYLINE: + i+=tempg->num<<1*sizeof(I4); + break; + case GRET_POLYPOINT: + i+=sizeof(I4)<<1+(tempg->num*3+7)>>3; + break; + case GRET_BSPLINE2: + case GRET_BSPLINE3: + case GRET_BSPLINE2_CLOSED: + case GRET_BSPLINE3_CLOSED: + i+=tempg->num*sizeof(P3I4); + break; + } + return i; +} + + +//If you do not enter a color or width into +//a GrElem, you can pass a color and width +//when you plot it. "colorbase" is the color of +//the background you are drawing on. +public void GrElemsPlot(GrBitMap *base,I8 x,I8 y,I8 z,U1 *elems,U8 colorbase) +{ + GrElem *tempg=elems-offset(GrElem.start); + U8 i,j; + I8 x1,y1,x2,y2; + I4 *ptr; + I8 cur_sub_GrElem_num=0; + P3I4 *p; + while (tempg->type) { + base->cur_sub_GrElem=cur_sub_GrElem_num++; + switch (tempg->type) { + case GRET_COLOR4: + base->color=colorbase^tempg->color4; + break; + case GRET_COLOR24: + base->color=colorbase^tempg->color24; + break; + case GRET_WIDTH: + base->pen_width=tempg->width; + break; + case GRET_POINT: + GrPlot3(base,tempg->x1+x,tempg->y1+y,0); + break; + case GRET_SHIFT: + x+=tempg->x1; + y+=tempg->y1; + break; + case GRET_LINE: + GrLine3(base,tempg->x1+x,tempg->y1+y,0,tempg->x2+x,tempg->y2+y,0); + break; + case GRET_POLYLINE: + ptr=&tempg->y1; + x1=ptr[0]; + y1=ptr[1]; + for (i=1;inum;i++) { + x2=ptr[i<<1]; + y2=ptr[i<<1+1]; + GrLine3(base,x1+x,y1+y,0,x2+x,y2+y,0); + x1=x2;y1=y2; + } + break; + case GRET_POLYPOINT: + ptr=&tempg->y1; + x1=ptr[0]; + y1=ptr[1]; + ptr=ptr+sizeof(I4)<<1; + for (i=0;inum;i++) { + GrPlot3(base,x1+x,y1+y,0); + j=Bt(ptr,i*3)+Bt(ptr,i*3+1)<<1+Bt(ptr,i*3+2)<<2; + x1+=GrXOffsets[j]; + y1+=GrYOffsets[j]; + } + break; + case GRET_BSPLINE2: + p=&tempg->y1; + for (i=0;inum;i++) { + p[i].x+=x; + p[i].y+=y; + } + Gr2BSpline3(base,p,tempg->num,FALSE); + for (i=0;inum;i++) { + p[i].x-=x; + p[i].y-=y; + } + break; + case GRET_BSPLINE3: + p=&tempg->y1; + for (i=0;inum;i++) { + p[i].x+=x; + p[i].y+=y; + } + Gr3BSpline3(base,p,tempg->num,FALSE); + for (i=0;inum;i++) { + p[i].x-=x; + p[i].y-=y; + } + break; + case GRET_BSPLINE2_CLOSED: + p=&tempg->y1; + for (i=0;inum;i++) { + p[i].x+=x; + p[i].y+=y; + } + Gr2BSpline3(base,p,tempg->num,TRUE); + for (i=0;inum;i++) { + p[i].x-=x; + p[i].y-=y; + } + break; + case GRET_BSPLINE3_CLOSED: + p=&tempg->y1; + for (i=0;inum;i++) { + p[i].x+=x; + p[i].y+=y; + } + Gr3BSpline3(base,p,tempg->num,TRUE); + for (i=0;inum;i++) { + p[i].x-=x; + p[i].y-=y; + } + break; + } + tempg+=GrElemSize(tempg,FALSE); + } +} + +public void GrSetOrigin(GrElem *root,I8 dx,I8 dy,I8 dz) +{ + U8 i; + I4 *ptr; + P3I4 *p; + GrElem *tempg=root->next; + while (tempg!=root) { + switch (tempg->type) { + case GRET_POINT: + tempg->x1+=dx; + tempg->y1+=dy; + break; + case GRET_LINE: + tempg->x1+=dx; + tempg->y1+=dy; + tempg->x2+=dx; + tempg->y2+=dy; + break; + case GRET_POLYLINE: + ptr=&tempg->y1; + ptr[0]+=dx; + ptr[1]+=dy; + for (i=1;inum;i++) { + ptr[i<<1]+=dx; + ptr[i<<1+1]+=dy; + } + break; + case GRET_POLYPOINT: + ptr=&tempg->y1; + ptr[0]+=dx; + ptr[1]+=dy; + break; + case GRET_BSPLINE2: + case GRET_BSPLINE3: + case GRET_BSPLINE2_CLOSED: + case GRET_BSPLINE3_CLOSED: + p=&tempg->y1; + for (i=0;inum;i++) { + p[i].x+=dx; + p[i].y+=dy; + } + break; + } + tempg=tempg->next; + } +} + +void GrPolyPointPlot(GrElem *root,I8 x,I8 y,I8 z) +{ + GrElem *tempg; + tempg=MAllocZ(GrElemBaseSize(GRET_POINT)); + tempg->type=GRET_POINT; + tempg->x1=x; + tempg->y1=y; + InsQue(tempg,root->last); +} + +void GrElemsDel(GrElem *root) +{ + GrElem *tempg,*tempg1; + tempg=root->next; + while (tempg!=root) { + tempg1=tempg->next; + Free(tempg); + tempg=tempg1; + } +} + +GrElem *GrElemsFromQueue(GrElem *root,U4 *size=NULL) +{ + U8 s,my_size=GrElemBaseSize(GRET_END,FALSE); + GrElem *tempg,*result,*dst; + + tempg=root->next; + while (tempg!=root) { + my_size+=GrElemSize(tempg,FALSE); + tempg=tempg->next; + } + result=MAlloc(my_size); + dst=result; + tempg=root->next; + while (tempg!=root) { + s=GrElemSize(tempg,FALSE); + MemCpy(dst,&tempg->type,s); + dst+=s; + tempg=tempg->next; + } + *dst=GRET_END; + if (size) *size=my_size; + return result; +} + +GrElem *GrElemsToQueue(GrElem *elems) +{ + U8 s; + GrElem *result=MAllocZ(sizeof(GrElem)), + *tempg=elems-offset(GrElem.start), + *tempg1; + result->next=result; + result->last=result; + while (tempg->type) { + tempg1=MAlloc(GrElemSize(tempg,TRUE)); + s=GrElemSize(tempg,FALSE); + MemCpy(&tempg1->type,&tempg->type,s); + InsQue(tempg1,result->last); + tempg+=s; + } + return result; +} + +public I4 PopUpPickGrElem(GrElem *root) +{ + Ltf *l=LtfNew; + GrElem *tempg; + I4 cur_num=0; + + tempg=root->next; + while (tempg!=root) { + LtfPrintF(l,"$$MU,\"%Z\",%d$$\r\n", + tempg->type,"ST_GRELEM_TYPES",cur_num++); + tempg=tempg->next; + } + LtfPrintF(l,"$$MU,\"END\",%d$$\r\n",cur_num); + cur_num=PopUpMenu(l); + LtfDel(l); + return cur_num; +} + +#define GED_PICK_TEXT 1 +#define GED_PICK_GRAPHICALLY 2 +#define GED_SET_ORIGIN 3 +#define GED_SHIFT_ORIGIN 4 +#define GED_INSERT 5 +#define GED_DELETE 6 +#define GED_EDIT 7 +#define GED_END 8 +#define GED_CANCEL -1 + +I8 PopUpGrElemsEditChoice() +{ + I8 i; + Ltf *l=LtfNew; + LtfPutS(l,"$$MU,\"Pick from text\",GED_PICK_TEXT$$\r\n"); + LtfPutS(l,"$$MU,\"Pick graphically\",GED_PICK_GRAPHICALLY$$\r\n"); + LtfPutS(l,"$$MU,\"Set Origin\",GED_SET_ORIGIN$$\r\n"); + LtfPutS(l,"$$MU,\"Insert Shift Origin\",GED_SHIFT_ORIGIN$$\r\n"); + LtfPutS(l,"$$MU,\"Insert\",GED_INSERT$$\r\n"); + LtfPutS(l,"$$MU,\"Delete\",GED_DELETE$$\r\n"); +// LtfPutS(l,"$$MU,\"Edit\",GED_EDIT$$\r\n"); + LtfPutS(l,"$$MU,\"End\",GED_END$$\r\n"); + LtfPutS(l,"$$MU,\"Cancel\",GED_CANCEL$$\r\n"); + i=PopUpMenu(l); + LtfDel(l); + return i; +} + +GrElem *GrNumToQueue(GrElem *root,I8 num,I8 *x=NULL,I8 *y=NULL) +{ + I8 xx=0,yy=0; + GrElem *result=root->next; + while (result!=root && num--) { + if (result->type==GRET_SHIFT) { + xx+=result->x1; + yy+=result->y1; + } + result=result->next; + } + if (x) *x=xx; + if (y) *y=yy; + return result; +} + +void GrEditUpdate(LtfBinEntry *tempb,GrElem *root) +{ + BoolU4 old_preempt=Preempt(OFF); + Free(tempb->data); + tempb->data=GrElemsFromQueue(root,&tempb->size); + Preempt(old_preempt); +} + +I4 GrElOffset[9]={0,1,2,3,0,4,5,6,7}; + +BoolU4 GrElemsInsert(LtfBinEntry *tempb,I8 *cur_num,GrElem *root,I8 x,I8 y,BoolU4 new_picture) +{ + I8 i,j,cmd,x1,y1,x2,y2,x3,y3,p1,p2; + I4 *ptr; + U8 color=ROP_EQU^GR_BLACK^((Fs->text_attribute>>4)&15); + BoolU4 old_ip_double=Bts(&Fs->crt_flags,CRTf_NO_DOUBLE_CLICK); + I8 eletype=-2; + GrElem root2,*tempg,*tempg1,*tempg2,*insert_point; + U8 num; + BoolU4 old_inhibit=ip_inhibit_win_operations; + GrBitMap *base=GrNew(grbase); + I8 width=1; + P3I4 *p; + + insert_point=GrNumToQueue(root,*cur_num,&x1,&y1); + x+=x1; y+=y1; + + ip_inhibit_win_operations=TRUE; + while (TRUE) { + GrClear; + if (eletype==-2) { + ip_inhibit_win_operations=FALSE; + i=PopUpGrElemType(new_picture); + if (i>=-1) + eletype=i; + ip_inhibit_win_operations=TRUE; + } + switch (eletype) { + case GRET_COLOR4: + ip_inhibit_win_operations=FALSE; + i=PopUpColor; + if (i>=0) { + color=ROP_EQU|i; + tempg=MAlloc(GrElemBaseSize(GRET_COLOR4)); + tempg->type=GRET_COLOR4; + tempg->color4=color; + InsQue(tempg,insert_point->last); + GrEditUpdate(tempb,root); + *cur_num=*cur_num+1; + } + ip_inhibit_win_operations=TRUE; + eletype=-2; + color^=((Fs->text_attribute>>4)&15); + base->color=color; + break; + case GRET_COLOR24: + eletype=-2; + break; + case GRET_WIDTH: + ip_inhibit_win_operations=FALSE; + i=PopUpWidth; + if (i>=1) { + width=i; + tempg=MAlloc(GrElemBaseSize(GRET_WIDTH)); + tempg->type=GRET_WIDTH; + tempg->width=width; + InsQue(tempg,insert_point->last); + GrEditUpdate(tempb,root); + *cur_num=*cur_num+1; + base->pen_width=width; + } + ip_inhibit_win_operations=TRUE; + eletype=-2; + break; + } + if (eletype!=-2) { + cmd=0;p1=0;p2=0; + if (eletype!=GRET_END && eletype!=-1) { + cmd=GetMsg(&p1,&p2, + (1<crt_flags,CRTf_NO_DOUBLE_CLICK,old_ip_double); + ip_inhibit_win_operations=old_inhibit; + GrDel(base); + return eletype==GRET_END || p1==CH_ESC; + } + } else { + switch (eletype) { + case GRET_LINE: + x1=p1; y1=p2; + x2=p1; y2=p2; + do { + base->color=color&0xFFFFFF|ROP_OR; + GrLine3(base,x1,y1,0,x2,y2,0); + cmd=GetMsg(&p1,&p2, + (1<color=color&0xFFFFFF|ROP_NAND; + GrLine3(base,x1,y1,0,x2,y2,0); + x2=p1; y2=p2; + } while (cmd!=MSG_IP_L_UP); + base->color=color&0xFFFFFF|ROP_EQU; + GrLine3(base,x1,y1,0,x2,y2,0); + tempg=MAlloc(GrElemBaseSize(GRET_LINE)); + tempg->type=GRET_LINE; + tempg->x1=x1-x; + tempg->y1=y1-y; + tempg->x2=x2-x; + tempg->y2=y2-y; + InsQue(tempg,insert_point->last); + GrEditUpdate(tempb,root); + *cur_num=*cur_num+1; + break; + case GRET_POINT: + x1=p1; y1=p2; + base->color=color; + GrPlot3(base,x1,y1,0); + + tempg=MAlloc(GrElemBaseSize(GRET_POINT)); + tempg->type=GRET_POINT; + tempg->x1=x1-x; + tempg->y1=y1-y; + InsQue(tempg,insert_point->last); + GrEditUpdate(tempb,root); + *cur_num=*cur_num+1; + break; + case GRET_POLYLINE: + root2.next=&root2; + root2.last=&root2; + num=0; + x3=p1-x; y3=p2-y; + x1=p1; y1=p2; + x2=p1; y2=p2; + do { + do { + base->color=color&0xFFFFFF|ROP_OR; + GrLine3(base,x1,y1,0,x2,y2,0); + cmd=GetMsg(&p1,&p2, + (1<color=color&0xFFFFFF|ROP_NAND; + GrLine3(base,x1,y1,0,x2,y2,0); + x2=p1; y2=p2; + } while (cmd!=MSG_IP_L_UP && cmd!=MSG_IP_R_UP); + base->color=color&0xFFFFFF|ROP_EQU; + if (cmd==MSG_IP_L_UP) { + GrLine3(base,x1,y1,0,x2,y2,0); + tempg=MAlloc(GrElemBaseSize(GRET_POINT)); + tempg->type=GRET_POINT; + tempg->x1=x2-x; + tempg->y1=y2-y; + InsQue(tempg,root2.last); + x1=x2;y1=y2; + num++; + } + } while (cmd!=MSG_IP_R_UP); + if (num) { + tempg2=MAllocZ(GrElemBaseSize(GRET_POLYLINE)+ + (num+1)<<1*sizeof(I4)); + ptr=&tempg2->y1; + tempg=root2.next; + ptr[0]=x3; + ptr[1]=y3; + ptr+=sizeof(I4)<<1; + for (i=0;inext; + ptr[i<<1]=tempg->x1; + ptr[i<<1+1]=tempg->y1; + Free(tempg); + tempg=tempg1; + } + tempg2->type=GRET_POLYLINE; + tempg2->num=num+1; + InsQue(tempg2,insert_point->last); + GrEditUpdate(tempb,root); + *cur_num=*cur_num+1; + } + break; + case GRET_POLYPOINT: + root2.next=&root2; + root2.last=&root2; + x3=p1-x; y3=p2-y; + x1=p1; y1=p2; + x2=p1; y2=p2; + base->color=color&0xFFFFFF|ROP_EQU; + do { + cmd=GetMsg(&p1,&p2, + (1<next; + if (tempg->x1==x1 && tempg->y1==y1) { + RemQue(tempg); + Free(tempg); + } else { + num++; + x1=tempg->x1; + y1=tempg->y1; + } + tempg=tempg1; + } + + tempg2=MAllocZ(GrElemBaseSize(GRET_POLYPOINT)+ + sizeof(I4)*2+(num*3+7)>>3); + ptr=&tempg2->y1; + tempg=root2.next; + ptr[0]=x3; + ptr[1]=y3; + ptr+=sizeof(I4)<<1; + x1=x3;y1=y3; + for (i=0;inext; + j=GrElOffset[SignI8(tempg->x1-x1)+1+3*(SignI8(tempg->y1-y1)+1)]; + x1=tempg->x1;y1=tempg->y1; + if (j&1) Bts(ptr,i*3); + if (j&2) Bts(ptr,i*3+1); + if (j&4) Bts(ptr,i*3+2); + Free(tempg); + tempg=tempg1; + } + tempg2->type=GRET_POLYPOINT; + tempg2->num=num+1; + InsQue(tempg2,insert_point->last); + GrEditUpdate(tempb,root); + *cur_num=*cur_num+1; + break; + case GRET_BSPLINE2: + case GRET_BSPLINE3: + case GRET_BSPLINE2_CLOSED: + case GRET_BSPLINE3_CLOSED: + root2.next=&root2; + root2.last=&root2; + num=0; + x3=p1-x; y3=p2-y; + x1=p1; y1=p2; + x2=p1; y2=p2; + do { + do { + base->color=color&0xFFFFFF|ROP_OR; + GrLine3(base,x1,y1,0,x2,y2,0); + cmd=GetMsg(&p1,&p2, + (1<color=color&0xFFFFFF|ROP_NAND; + GrLine3(base,x1,y1,0,x2,y2,0); + x2=p1; y2=p2; + } while (cmd!=MSG_IP_L_UP && cmd!=MSG_IP_R_UP); + base->color=color&0xFFFFFF|ROP_EQU; + if (cmd==MSG_IP_L_UP) { + GrLine3(base,x1,y1,0,x2,y2,0); + tempg=MAlloc(GrElemBaseSize(GRET_POINT)); + tempg->type=GRET_POINT; + tempg->x1=x2-x; + tempg->y1=y2-y; + InsQue(tempg,root2.last); + x1=x2;y1=y2; + num++; + } + } while (cmd!=MSG_IP_R_UP); + if (num) { + tempg2=MAllocZ(GrElemBaseSize(GRET_POLYLINE)+ + (num+1)*sizeof(P3I4)); + p=&tempg2->y1; + tempg=root2.next; + p[0].x=x3; + p[0].y=y3; + p+=sizeof(P3I4); + for (i=0;inext; + p[i].x=tempg->x1; + p[i].y=tempg->y1; + Free(tempg); + tempg=tempg1; + } + tempg2->type=eletype; + tempg2->num=num+1; + InsQue(tempg2,insert_point->last); + GrEditUpdate(tempb,root); + *cur_num=*cur_num+1; + } + break; + } + } + } + } +} + +void EditInsertGraphic(Ltf *l,I8 x,I8 y) +{ + BoolU4 old_preempt=Preempt(OFF); + LtfEntry *ll; + LtfBinEntry *tempb; + I8 cur_num=0; + GrElem *root; + tempb=MAllocZ(sizeof(LtfBinEntry)); + tempb->type=LTFBT_ELEMENT_GRAPH; + tempb->size=GrElemBaseSize(GRET_END,FALSE); + tempb->data=MAllocZ(tempb->size); + ll=MAllocZ(sizeof(LtfEntry)); + ll->display=NewString(""); + ll->plain_text=MSPrintF("PI %d",l->cur_bin_num); + ll->bin_num=l->cur_bin_num; + tempb->num=l->cur_bin_num++; + ll->type=LTFT_PICTURE; + ll->flags=LTFLF_HAS_BIN; + ll->bin_data=tempb; + InsQue(tempb,l->bin_root.last); + LtfInsert(l,ll); + Preempt(old_preempt); + root=GrElemsToQueue(tempb->data); + if (!GrElemsInsert(tempb,&cur_num,root,x,y,TRUE)) { + Preempt(OFF); + RemQue(ll); + Free(ll); + Free(ll->display); + Free(ll->plain_text); + RemQue(tempb); + Free(tempb->data); + Preempt(old_preempt); + } + GrElemsDel(root); +} + +public void LtfPutGrElem(Ltf *l,U1 *elems,U8 size) +{ + BoolU4 old_preempt=Preempt(OFF); + LtfEntry *ll; + LtfBinEntry *tempb; + tempb=MAllocZ(sizeof(LtfBinEntry),l->mem_tss); + tempb->type=LTFBT_ELEMENT_GRAPH; + tempb->size=size; + tempb->data=MAlloc(size,l->mem_tss); + MemCpy(tempb->data,elems,size); + ll=MAllocZ(sizeof(LtfEntry),l->mem_tss); + ll->display=NewString("",l->mem_tss); + ll->plain_text=MSPrintF("PI %d",l->cur_bin_num); //TODO:mem_tss + ll->bin_num=l->cur_bin_num; + tempb->num=l->cur_bin_num++; + ll->type=LTFT_PICTURE; + ll->flags=LTFLF_HAS_BIN; + ll->bin_data=tempb; + InsQue(tempb,l->bin_root.last); + LtfInsert(l,ll); + Preempt(old_preempt); +} + +public void PutGrElem(U1 *elems,U8 size) +{ + Ltf *l=Fs->cur_ltf; + if (l) + LtfPutGrElem(l,elems,size); +} + +void EditExistingGraphic(Ltf *l,I8 x,I8 y) +{ + BoolU4 *old_preempt=Preempt(OFF); + LtfEntry *ll=l->cur_entry; + LtfBinEntry *tempb=ll->bin_data; + I8 i,cur_num=0,cmd,p1,p2,old_size=tempb->size,xx,yy; + GrElem *cur_elem,*old_GrElem=tempb->data, + *root=GrElemsToQueue(old_GrElem),*tempg,*insert_point; + BoolU4 old_inhibit=ip_inhibit_win_operations; + BoolU4 old_ip_double=Bt(&Fs->crt_flags,CRTf_NO_DOUBLE_CLICK); + tempb->data=MAllocIdentical(old_GrElem); + Preempt(old_preempt); + do { + i=PopUpGrElemsEditChoice; + switch (i) { + case GED_PICK_TEXT: + cur_num=PopUpPickGrElem(root); + break; + case GED_PICK_GRAPHICALLY: + l->cur_GrElem=tempb->data; + GetMsg(&p1,&p2,1<cur_sub_GrElem; + l->cur_GrElem=NULL; + break; + case GED_SET_ORIGIN: + GetMsg(&p1,&p2,1<crt_flags,CRTf_NO_DOUBLE_CLICK); + insert_point=GrNumToQueue(root,cur_num); + tempg=MAlloc(GrElemBaseSize(GRET_SHIFT)); + tempg->type=GRET_SHIFT; + tempg->x1=0; + tempg->y1=0; + InsQue(tempg,insert_point->last); + GetMsg(&p1,&p2,1<x1=p1-xx; + tempg->y1=p2-yy; + GrEditUpdate(tempb,root); + } while (cmd!=MSG_IP_L_UP); + AssignBit(&Fs->crt_flags,CRTf_NO_DOUBLE_CLICK,old_ip_double); + ip_inhibit_win_operations=old_inhibit; + break; + case GED_INSERT: + GrElemsInsert(tempb,&cur_num,root,x,y,FALSE); + break; + case GED_DELETE: + cur_elem=GrNumToQueue(root,cur_num); + if (cur_elem!=root) { + RemQue(cur_elem); + Free(cur_elem); + GrEditUpdate(tempb,root); + } + break; + case GED_EDIT: + break; + } + } while (i!=GED_CANCEL && i!=GED_END); + Preempt(OFF); + if (i==GED_END) + Free(old_GrElem); + else { + Free(tempb->data); + tempb->data=old_GrElem; + tempb->size=old_size; + } + Preempt(old_preempt); + GrElemsDel(root); +} diff --git a/LT/ADAM/GRMODE2.ASZ b/LT/ADAM/GRMODE2.ASZ new file mode 100644 index 0000000..f409f15 --- /dev/null +++ b/LT/ADAM/GRMODE2.ASZ @@ -0,0 +1,425 @@ + ALIGN 8,0x90 +REVERSE_BITS_TABLE:: +$FG$$BG$ DU1 0x00,0x80,0x40,0xC0,0x20,0xA0,0x60,0xE0; + DU1 0x10,0x90,0x50,0xD0,0x30,0xB0,0x70,0xF0; + DU1 0x08,0x88,0x48,0xC8,0x28,0xA8,0x68,0xE8; + DU1 0x18,0x98,0x58,0xD8,0x38,0xB8,0x78,0xF8; + DU1 0x04,0x84,0x44,0xC4,0x24,0xA4,0x64,0xE4; + DU1 0x14,0x94,0x54,0xD4,0x34,0xB4,0x74,0xF4; + DU1 0x0C,0x8C,0x4C,0xCC,0x2C,0xAC,0x6C,0xEC; + DU1 0x1C,0x9C,0x5C,0xDC,0x3C,0xBC,0x7C,0xFC; + DU1 0x02,0x82,0x42,0xC2,0x22,0xA2,0x62,0xE2; + DU1 0x12,0x92,0x52,0xD2,0x32,0xB2,0x72,0xF2; + DU1 0x0A,0x8A,0x4A,0xCA,0x2A,0xAA,0x6A,0xEA; + DU1 0x1A,0x9A,0x5A,0xDA,0x3A,0xBA,0x7A,0xFA; + DU1 0x06,0x86,0x46,0xC6,0x26,0xA6,0x66,0xE6; + DU1 0x16,0x96,0x56,0xD6,0x36,0xB6,0x76,0xF6; + DU1 0x0E,0x8E,0x4E,0xCE,0x2E,0xAE,0x6E,0xEE; + DU1 0x1E,0x9E,0x5E,0xDE,0x3E,0xBE,0x7E,0xFE; + DU1 0x01,0x81,0x41,0xC1,0x21,0xA1,0x61,0xE1; + DU1 0x11,0x91,0x51,0xD1,0x31,0xB1,0x71,0xF1; + DU1 0x09,0x89,0x49,0xC9,0x29,0xA9,0x69,0xE9; + DU1 0x19,0x99,0x59,0xD9,0x39,0xB9,0x79,0xF9; + DU1 0x05,0x85,0x45,0xC5,0x25,0xA5,0x65,0xE5; + DU1 0x15,0x95,0x55,0xD5,0x35,0xB5,0x75,0xF5; + DU1 0x0D,0x8D,0x4D,0xCD,0x2D,0xAD,0x6D,0xED; + DU1 0x1D,0x9D,0x5D,0xDD,0x3D,0xBD,0x7D,0xFD; + DU1 0x03,0x83,0x43,0xC3,0x23,0xA3,0x63,0xE3; + DU1 0x13,0x93,0x53,0xD3,0x33,0xB3,0x73,0xF3; + DU1 0x0B,0x8B,0x4B,0xCB,0x2B,0xAB,0x6B,0xEB; + DU1 0x1B,0x9B,0x5B,0xDB,0x3B,0xBB,0x7B,0xFB; + DU1 0x07,0x87,0x47,0xC7,0x27,0xA7,0x67,0xE7; + DU1 0x17,0x97,0x57,0xD7,0x37,0xB7,0x77,0xF7; + DU1 0x0F,0x8F,0x4F,0xCF,0x2F,0xAF,0x6F,0xEF; + DU1 0x1F,0x9F,0x5F,0xDF,0x3F,0xBF,0x7F,0xFF; +$FU$$FG$$BG$$FU$$FG$$BG$ +MSG_DRAW_TASK_BORDER: DU1 "DrawTaskBorder",0; +MSG_UPDATE_ODES: DU1 "UpdateOdes",0; +////**************************PROCEDURE************************* + ALIGN 8,0x90 +CP_PLOT_SCREEN_I1:: + PUSH EBP + MOV EBP,ESP + MOV EBX,SF_PARAM2[EBP] + MOV EAX,SF_PARAM3[EBP] + OR EBX,EBX + JS @@100 + OR EAX,EAX + JS @@100 + CMP EBX,U4 FS:[TSS_CRT_WIDTH] + JGE @@100 + CMP EAX,U4 FS:[TSS_CRT_HEIGHT] + JGE @@100 + IMUL U4 FS:[TSS_CRT_WIDTH] + ADD EAX,U4 [SYS_TEXTBASE] + ADD EBX,EAX + MOV EAX,U4 SF_PARAM1[EBP] + MOV U4 [EBX],EAX + + POP EBP + XOR EDX,EDX + MOV EAX,1 + RET +@@100: POP EBP + XOR EDX,EDX + XOR EAX,EAX + RET +////**************************PROCEDURE************************* + ALIGN 8,0x90 +CP_PLOT_WINDOW_I1:: + PUSH EBP + MOV EBP,ESP + MOV EBX,U4 SF_PARAM2[EBP] + MOV EAX,U4 SF_PARAM3[EBP] + + OR EBX,EBX + JS @@100 + ADD EBX,U4 FS:[TSS_WINDOW_LEFT] + CMP EBX,U4 FS:[TSS_WINDOW_RIGHT] + JG @@100 + OR EBX,EBX + JS @@100 + CMP EBX,U4 FS:[TSS_CRT_WIDTH] + JGE @@100 + + OR EAX,EAX + JS @@100 + ADD EAX,U4 FS:[TSS_WINDOW_TOP] + CMP EAX,U4 FS:[TSS_WINDOW_BOTTOM] + JG @@100 + OR EAX,EAX + JS @@100 + CMP EAX,U4 FS:[TSS_CRT_HEIGHT] + JGE @@100 + + IMUL U4 FS:[TSS_CRT_WIDTH] + ADD EAX,U4 [SYS_TEXTBASE] + ADD EBX,EAX + MOV EAX,U4 SF_PARAM1[EBP] + MOV U4 [EBX],EAX + + POP EBP + XOR EDX,EDX + MOV EAX,1 + RET +@@100: POP EBP + XOR EDX,EDX + XOR EAX,EAX + RET +////**************************PROCEDURE************************* + ALIGN 8,0x90 +CP_PLOT_BORDER_I1:: + PUSH EBP + MOV EBP,ESP + MOV EBX,U4 SF_PARAM2[EBP] + MOV EAX,U4 SF_PARAM3[EBP] + + MOV EDX,-4 + CMP EBX,EDX + JL @@100 + ADD EBX,U4 FS:[TSS_WINDOW_LEFT] + MOV EDX,U4 FS:[TSS_WINDOW_RIGHT] + ADD EDX,4 + CMP EBX,EDX + JG @@100 + OR EBX,EBX + JS @@100 + CMP EBX,U4 FS:[TSS_CRT_WIDTH] + JGE @@100 + + MOV EDX,-1 + CMP EAX,EDX + JL @@100 + ADD EAX,U4 FS:[TSS_WINDOW_TOP] + MOV EDX,U4 FS:[TSS_WINDOW_BOTTOM] + INC EDX + CMP EAX,EDX + JG @@100 + OR EAX,EAX + JS @@100 + CMP EAX,U4 FS:[TSS_CRT_HEIGHT] + JGE @@100 + + IMUL U4 FS:[TSS_CRT_WIDTH] + ADD EAX,U4 [SYS_TEXTBASE] + ADD EBX,EAX + MOV EAX,U4 SF_PARAM1[EBP] + MOV U4 [EBX],EAX + + POP EBP + XOR EDX,EDX + MOV EAX,1 + RET +@@100: POP EBP + XOR EDX,EDX + XOR EAX,EAX + RET +////**************************PROCEDURE************************* + ALIGN 8,0x90 +GR_UPDATE_WINDOWS:: + PUSHAD //-**** + MOV ESI,U4 FS:[TSS_ABSOLUTE_ADDRESS] + MOV EDI,ESI + JMP @@1 + +@@10: MOV EAX,U4 TSS_FS[EDI] + MOV FS,AX + PUSH ESI + MOV ESI,MSG_UPDATE_ODES + CALL FIND_EXTERN + JZ @@11 + CALL ESI +@@11: POP ESI + BT U4 FS:[TSS_CRT_FLAGS],CRTf_SHOW + JNC @@2 + PUSH ESI + MOV ESI,MSG_DRAW_TASK_BORDER + CALL FIND_EXTERN + JZ @@12 + CALL ESI +@@12: POP ESI + BT U4 [SYS_FLAGS],SYSf_TASK_LINKS_ALTERED + JC @@100 +@@1: MOV EAX,U4 FS:[TSS_UPDATE_WINDOW] + OR EAX,EAX + JZ @@2 + CALL EAX +@@2: BT U4 [SYS_FLAGS],SYSf_TASK_LINKS_ALTERED + JC @@100 + MOV EDI,U4 FS:[TSS_NEXT_TSS] + CMP ESI,EDI + JNE @@10 +@@100: MOV EAX,U4 TSS_FS[ESI] + MOV FS,AX + POPAD //+**** + RET +////**************************PROCEDURE************************* + ALIGN 8,0x90 +/* + GrXorLine(&dst3,&src,&src2,d5,vga_image); + for (col=0;col=ady) + d=(adx>=adz) ? adx:adz; + else + d=(ady>=adz) ? ady:adz; + if (d) { + dx=DivI8(dx<<32,d); + dy=DivI8(dy<<32,d); + dz=DivI8(dz<<32,d); + } + x1<<=32; y1<<=32; z1<<=32; + for (j=0;j>32; + y1=(MulI8(r[3],*x)+MulI8(r[4],*y)+MulI8(r[5],*z))>>32; + z1=(MulI8(r[6],*x)+MulI8(r[7],*y)+MulI8(r[8],*z))>>32; + *x=x1;*y=y1;*z=z1; +} + +public void GrTransform(GrBitMap *base,I8 *x,I8 *y,I8 *z) +{ + GrRotate(base->r,x,y,z); + *x+=base->x; + *y+=base->y; + *z+=base->z; +} + + +public I8 *GrTheta(double theta) +{ + double my_cos,my_sin; + I8 *r=MAllocZ(sizeof(I8)*9); + + my_cos=Cos(theta)*GrScale; + my_sin=Sin(theta)*GrScale; + r[0]=my_cos; + r[4]=my_cos; + r[3]=my_sin; + r[1]=-my_sin; + r[8]=GrScale; + return r; +} + +public I8 *GrPhi(double phi) +{ + double my_cos,my_sin; + I8 *r=MAllocZ(sizeof(I8)*9); + + my_cos=Cos(phi)*GrScale; + my_sin=Sin(phi)*GrScale; + r[4]=my_cos; + r[8]=my_cos; + r[7]=my_sin; + r[5]=-my_sin; + r[0]=GrScale; + return r; +} + +public I4 *GrScaleMat(I8 *m1,double s) +{ + I8 i,*r=MAllocZ(sizeof(I8)*9); + for (i=0;i<9;i++) + r[i]=m1[i]*s; + return r; +} + +public I4 *GrMulMat(I8 *m1,I8 *m2) +{ //TODO convert to I4 arith + I8 *r=MAllocZ(sizeof(I8)*9); + I8 i,j,k; + double d; + for (i=0;i<3;i++) { + for (j=0;j<3;j++) { + for (k=0;k<3;k++) { + d=m1[k+3*j]; + d*=m2[i+3*k]; + d/=GrScale; + r[i+3*j]+=d; + } + } + } + return r; +} + +void GrSetIdent(I8 *r) +{ + MemSet(r,0,9<<3); + r[0].u4[1]=1; + r[4].u4[1]=1; + r[8].u4[1]=1; +} + + +public void Circle(U1 *aux_data, + I8 cx,I8 cy,I8 cz, + I8 radius, + U1 *plot_cb(U1 *aux,I8 x,I8 y,I8 z), + I8 step=1, + double start_rad=0, + double len_rad=pi2) +{ + I8 i,j,len=len_rad*radius; + I8 x,y,x1,y1,s1,s2,c; + double t; + if (radius<0) return; + if (!radius) { + plot_cb(aux_data,cx,cy,cz); + return; + } + t=1.0/radius; + s1=(1<<24)*Sin(t); + s2=-s1; + c=(1<<24)*Cos(t); + if (start_rad) { + x=radius*Cos(start_rad); + y=-radius*Sin(start_rad); + } else { + x=radius; + y=0; + } + x<<=8; + y<<=8; + for (i=0;i<=len;i+=step) { + plot_cb(aux_data,cx+x>>8,cy+y>>8,cz); + for (j=0;j>24; + y1=(MulI8(s2,x)+MulI8(c,y))>>24; + x=x1; y=y1; + } + } +} + +I8 DistP3I4(P3I4 *p1,P3I4 *p2) +{ + return Sqrt(SqrI8(p1->x-p2->x)+SqrI8(p1->y-p2->y)+SqrI8(p1->z-p2->z)); +} + +void Bezier2(U1 *aux_data,P3I4 *ctrl,U1 *plot_cb(U1 *aux,I8 x,I8 y,I8 z)) +{//2nd order + I8 x,y,z,xx,yy,zz,dx,dy,dz,d_max; + double x0=ctrl[0].x,y0=ctrl[0].y,z0=ctrl[0].z; + double x1=ctrl[1].x-x0,y1=ctrl[1].y-y0,z1=ctrl[1].z-z0; + double x2=ctrl[2].x-x0,y2=ctrl[2].y-y0,z2=ctrl[2].z-z0; + double t,d=DistP3I4(&ctrl[0],&ctrl[1])+ + DistP3I4(&ctrl[1],&ctrl[2])+ + DistP3I4(&ctrl[2],&ctrl[0]), + s=1.0/d,t1,t2; + xx=x0; yy=y0; zz=z0; + for (t=0.0;t<=1.0;t+=s) { + t1=t*(1.0-t); + t2=t*t; + x=x0+x1*t1+x2*t2; + y=y0+y1*t1+y2*t2; + z=z0+z1*t1+z2*t2; + dx=AbsI8(x-xx); + dy=AbsI8(y-yy); + dz=AbsI8(z-zz); + if (dx>dy) + d_max=dx; + else + d_max=dy; + if (dz>d_max) + d_max=dz; + if (!d_max) + s*=1.1; + else { + s*=0.9; + plot_cb(aux_data,x,y,z); + xx=x;yy=y;zz=z; + } + } +} + +void Bezier3(U1 *aux_data,P3I4 *ctrl,U1 *plot_cb(U1 *aux,I8 x,I8 y,I8 z)) +{ //3rd order + I8 x,y,z,xx,yy,zz,dx,dy,dz,d_max; + double x0=ctrl[0].x,y0=ctrl[0].y,z0=ctrl[0].z; + double x1=ctrl[1].x-x0,y1=ctrl[1].y-y0,z1=ctrl[1].z-z0; + double x2=ctrl[2].x-x0,y2=ctrl[2].y-y0,z2=ctrl[2].z-z0; + double x3=ctrl[3].x-x0,y3=ctrl[3].y-y0,z3=ctrl[3].z-z0; + double t,d=DistP3I4(&ctrl[0],&ctrl[1])+ + DistP3I4(&ctrl[1],&ctrl[2])+ + DistP3I4(&ctrl[2],&ctrl[3])+ + DistP3I4(&ctrl[3],&ctrl[0]), + s=1.0/d,nt,t1,t2,t3; + xx=x0; yy=y0; zz=z0; + for (t=0.0;t<=1.0;t+=s) { + nt=1.0-t; + t1=t*nt*nt; + t2=t*t*nt; + t3=t*t*t; + x=x0+x1*t1+x2*t2+x3*t3; + y=y0+y1*t1+y2*t2+y3*t3; + z=z0+z1*t1+z2*t2+z3*t3; + dx=AbsI8(x-xx); + dy=AbsI8(y-yy); + dz=AbsI8(z-zz); + if (dx>dy) + d_max=dx; + else + d_max=dy; + if (dz>d_max) + d_max=dz; + if (!d_max) + s*=1.1; + else { + s*=0.9; + plot_cb(aux_data,x,y,z); + xx=x;yy=y;zz=z; + } + } +} + +void BSpline2(U1 *aux_data,P3I4 *ctrl,I8 cnt,U1 *plot_cb(U1 *aux,I8 x,I8 y,I8 z),BoolU4 closed=FALSE) +{ //2nd order + I8 i,j; + P3I4 *c; + if (cnt<3) return; + if (closed) { + cnt++; + c=MAlloc(sizeof(P3I4)*(cnt*2-1)); + j=1; + for (i=0;icolor=GR_BLACK; + base->pen_width=1; +} + +GrBitMap *GrNew(GrBitMap *base) +{ + GrBitMap *result=MAlloc(sizeof(GrBitMap)); + MemCpy(result,base,sizeof(GrBitMap)); + result->r=MAlloc(9<<1<<2); + GrSetIdent(result->r); + GrReset(result); + result->flags|=BMF_ALIAS; + return result; +} + + +void GrDel(GrBitMap *base) +{ + Free(base->r); + if (!(base->flags & BMF_ALIAS)) + Free(base->body); + Free(base); +} + + +I4 gr_table[1024]; +BoolU4 gr_table_initialized=FALSE; + +#define GR_NUM_PEN_BRUSHES 64 +GrBitMap *gr_pen_brushes[GR_NUM_PEN_BRUSHES]; + +void GrSetupTable(GrBitMap *hidden) +{ + GrBitMap *b; + I8 i,j,k; + for (i=-16;i<16;i++) { + for (j=-16;j<16;j++) { + k=((i>=0) ? i:32+i)<<5+((j>=0) ? j:32+j); + gr_table[k]=(MulI8(i,hidden->internal_width)+j)>>3; + } + } + for (i=0;i<(256*FONT_HEIGHT*FONT_WIDTH)>>3;i++) + grfont[i]=reverse_bits_table[grfont[i]]; + + for (i=0;i>3)<<3; + if (!j) + b=GrBitMapNew(BMT_MONO,8,1); + else + b=GrBitMapNew(BMT_MONO,j,i); + gr_pen_brushes[i]=b; + b->color=GR_WHITE; + if (i<2) + GrPlot0(b,0,0); + else { + GrPlot0(b,i>>1,i>>1); + for (j=1;j<=i;j+=2) + GrCircle(b,i>>1+1,i>>1,j>>1); + for (j=1;j<=i;j+=2) + GrCircle(b,i>>1,i>>1+1,j>>1); + for (j=2;j<=i;j+=2) + GrCircle(b,i>>1,i>>1,j>>1); + } + } + + OutP(VGA_SC_INDEX,VGA_MAP_MASK); + OutP(VGA_SC_DATA,0x0F); + MemSet(0xA0000,0,grheight*grwidth>>3); + MemSet(vga_image,0,grwidth*grheight>>1); + + gr_table_initialized=TRUE; +} + +////**************************PROCEDURE************************* +// Format of U4 text entry +// Bits 0-7 ASCII +// Bits 8-11 Foreground color +// Bits 12-15 Background color +// Bits 16-20 Signed X position shift value +// Bits 21-25 Signed Y position shift value +// Bit 28 Blink +// Bit 29 Inverted (Swap foreground and background) +// Bit 30 Selected (XOR colors with FF) +// Bit 31 Underline + +void GrUpdateScreen(GrBitMap *b1,GrBitMap *b2, + U4 *my_textbase) +{ + U4 *src,*src2,cur_ch,u; +//U8 d; + U8 row,col,plane,ch_line,i, + d0=(b2->internal_width+1)<<2, + d1=(b2->internal_width)>>3, + d2=(b2->internal_width*b2->height-FONT_HEIGHT*b2->width)>>3, + d3=(b2->internal_width*b2->height<<2)>>3, + d4=(b2->internal_width*FONT_HEIGHT-b1->width)>>3, + d5=(b1->internal_width)>>5, + d6=(b2->internal_width)<<2, + num_cols=b1->width/FONT_WIDTH, + num_rows=b1->height/FONT_HEIGHT; + BoolU4 old_preempt; + U2 *dst2; + U4 *dst3,*dst4=vga_image; + BoolU4 GrBlinkFlag=(jiffies/(JIFFY_FREQ/5))&1; + U1 *dst,*font_ptr,*font_ptr2,saved_font_line; + + if (!gr_table_initialized) GrSetupTable(b2); + +//Update Text Background + src=my_textbase; + dst=b2->body+d0; + for (row=0;row>4); + if (cur_ch & LTFLT_BLINK) + if (GrBlinkFlag) + cur_ch.u1[1]=(cur_ch.u1[1]<<4)+(cur_ch.u1[1]>>4); + GrPlotBackground(cur_ch.u1[1],&dst,d1,d2); +/* + for (plane=0x10;plane!=0x100;plane=plane<<1) { + d=(cur_ch.u1[1] & plane) ? 0xFF:0x00; + for (ch_line=0;ch_linebody+d0; + for (row=0;row>4); + if (cur_ch & LTFLT_BLINK) + if (GrBlinkFlag) + cur_ch.u1[1]=(cur_ch.u1[1]<<4)+(cur_ch.u1[1]>>4); + font_ptr=&grfont[FONT_WIDTH*FONT_HEIGHT>>3*cur_ch.u1[0]]; + if (cur_ch & LTFLT_UNDERLINED) { + saved_font_line=font_ptr[7]; + font_ptr[7]=0xFF; + } + i=cur_ch.u2[1]&0x3FF; + dst2=dst+gr_table[i]; + if (i) { + i&=7; + for (plane=0x01;plane!=0x10;plane<<=1) { + font_ptr2=font_ptr; + if (cur_ch.u1[1] & plane) { + for (ch_line=0;ch_linebody; + src2=b2->body; + for (plane=1;plane<0x10;plane<<=1) { + OutP(VGA_SC_INDEX,VGA_MAP_MASK); + OutP(VGA_SC_DATA,plane); + dst3=0xA0000; + src2+=d6; + for (row=0;rowheight;row++) { + src2+=32>>3; + GrXorLine(&dst3,&src,&src2,d5,&dst4); +/* + for (col=0;col>3; + } + src2+=d6; + } + Preempt(old_preempt); + + if (gr_screen_capture) { + MemCpy(gr_screen_capture,vga_image,grheight*grwidth>>1); + gr_screen_capture=NULL; + } +} + +public void GrPlot0(GrBitMap *base,I8 x,I8 y) +{ //No clipping or transformation or pen width + U8 d,c; + U1 *dst,bit,not_bit; + U8 color=base->color; + double dist; + + if (base->flags & BMF_LOCATE_NEAREST) { + dist=DistI8(x,y,base->cur_x,base->cur_y); + if (distnearest_dist) { + base->nearest_sub_GrElem=base->cur_sub_GrElem; + base->nearest_dist=dist; + } + } + if (base->flags & BMF_DONT_DRAW) + return; + switch (base->type) { + case BMT_COLOR4: + d=base->plane_size; + dst=base->body+(base->left_margin+ + (y+base->top_margin)*base->internal_width)>>3+(x>>3); + bit=1<<(x&7); + not_bit=~bit; + c=color.u1[0]; + switch (color.u1[3]) { + case ROPB_EQU: + case ROPB_TRANSPARENT: + if (c & 1) + *dst|=bit; + else + *dst&=not_bit; + dst+=d; + if (c & 2) + *dst|=bit; + else + *dst&=not_bit; + dst+=d; + if (c & 4) + *dst|=bit; + else + *dst&=not_bit; + dst+=d; + if (c & 8) + *dst|=bit; + else + *dst&=not_bit; + break; + case ROPB_XOR: + if (c & 1) *dst^=bit; + dst+=d; + if (c & 2) *dst^=bit; + dst+=d; + if (c & 4) *dst^=bit; + dst+=d; + if (c & 8) *dst^=bit; + break; + case ROPB_OR: + if (c & 1) *dst|=bit; + dst+=d; + if (c & 2) *dst|=bit; + dst+=d; + if (c & 4) *dst|=bit; + dst+=d; + if (c & 8) *dst|=bit; + break; + case ROPB_NAND: + if (c & 1) *dst&=not_bit; + dst+=d; + if (c & 2) *dst&=not_bit; + dst+=d; + if (c & 4) *dst&=not_bit; + dst+=d; + if (c & 8) *dst&=not_bit; + break; + } + break; + case BMT_MONO: + d=base->internal_width*y+x; + c=color.u1[0]; + switch (color.u1[3]) { + case ROPB_EQU: + case ROPB_TRANSPARENT: + AssignBit(base->body,d,c); + break; + case ROPB_XOR: + if (c) + Btc(base->body,d); + break; + case ROPB_OR: + if (c) + Bts(base->body,d); + break; + case ROPB_NAND: + if (c) + Btr(base->body,d); + break; + } + break; + } +} + + +public BoolU4 GrBlot(GrBitMap *base,I8 x,I8 y,GrBitMap *img) +{ //Clipping but not transformation + I8 i,i1,i2,i3,j,k,k1,w1,h1,w2,h2,plane,plane1,bit_mask,bit_shift,p; + U1 *ptr; + U2 *ptr1; + I8 color,color_byte,plane_size,plane_size1,plane_limit; + BoolU4 draw=TRUE,color_bit; + + w1= (x<0)?-x:0; + h1= (y<0)?-y:0; + w2=img->width; + h2=img->height; + + if (base->flags & BMF_SCREEN_BITMAP) { + x+=Fs->window_pixel_left; + if (x+w1<0) w1=-x; + if (x+w2>Fs->window_pixel_right) + w2=Fs->window_pixel_right-x; + + y+=Fs->window_pixel_top; + if (y+h1<0) h1=-y; + if (y+h2>Fs->window_pixel_bottom) + h2=Fs->window_pixel_bottom-y; + + if (IsPixelCovered(Fs,x+w1,y+h1)) + draw=FALSE; + else if (IsPixelCovered(Fs,x+w2,y+h2)) + draw=FALSE; + x+=base->left_margin; + y+=base->top_margin; + } + if (x+w2>base->width) + w2=base->width-x; + if (y+h2>base->height) + h2=base->height-y; + if (draw && w1width && h2<=img->height) { + if (base->flags & BMF_DONT_DRAW) + return TRUE; + color=base->color; + p=0; + plane_size=img->plane_size<<3; + plane_size1=base->plane_size<<3; + switch (base->type) { + case BMT_COLOR4: plane_limit=plane_size*4; break; + case BMT_MONO: plane_limit=plane_size; break; + } + i1=(-w1)&7; + if (i1>w2) i1=w2; + i2=(w2-w1-i1)>>3; + i3=w2-w1-i2<<3-i1; + bit_shift=(x+w1)&7; + bit_mask=-1-255<type) { + case BMT_COLOR4: + k=j*img->internal_width+w1+plane; + k1=(j+y)*base->internal_width+x+w1+plane1; + switch (color.u1[3]) { + case ROPB_EQU: + case ROPB_TRANSPARENT: + for (i=0;ibody,k1++,Bt(img->body,k++)); + break; + case ROPB_XOR: + for (i=0;ibody,k++)) + Btc(base->body,k1++); + break; + case ROPB_OR: + for (i=0;ibody,k++)) + Bts(base->body,k1++); + break; + case ROPB_NAND: + for (i=0;ibody,k++)) + Btr(base->body,k1++); + break; + } + ptr=k>>3+img->body; + ptr1=k1>>3+base->body; + switch (color.u1[3]) { + case ROPB_EQU: + case ROPB_TRANSPARENT: + for (i=0;ibody,k1++,Bt(img->body,k++)); + break; + case ROPB_XOR: + for (i=0;ibody,k++)) + Btc(base->body,k1++); + break; + case ROPB_OR: + for (i=0;ibody,k++)) + Bts(base->body,k1++); + break; + case ROPB_NAND: + for (i=0;ibody,k++)) + Btr(base->body,k1++); + break; + } + break; + case BMT_MONO: + k=j*img->internal_width+w1; + k1=(j+y)*base->internal_width+x+w1+plane1; + switch (color.u1[3]) { + case ROPB_EQU: + for (i=0;ibody,k1++,color_bit && Bt(img->body,k++)); + break; + case ROPB_TRANSPARENT: + for (i=0;ibody,k++)) + AssignBit(base->body,k1++,color_bit); + break; + case ROPB_XOR: + if (color_bit) + for (i=0;ibody,k++)) + Btc(base->body,k1++); + break; + case ROPB_OR: + if (color_bit) + for (i=0;ibody,k++)) + Bts(base->body,k1++); + break; + case ROPB_NAND: + if (color_bit) + for (i=0;ibody,k++)) + Btr(base->body,k1++); + break; + } + ptr=k>>3+img->body; + ptr1=k1>>3+base->body; + switch (color.u1[3]) { + case ROPB_EQU: + for (i=0;ibody,k1++,color_bit && Bt(img->body,k++)); + break; + case ROPB_TRANSPARENT: + for (i=0;ibody,k++)) + AssignBit(base->body,k1++,color_bit); + break; + case ROPB_XOR: + if (color_bit) + for (i=0;ibody,k++)) + Btc(base->body,k1++); + break; + case ROPB_OR: + if (color_bit) + for (i=0;ibody,k++)) + Bts(base->body,k1++); + break; + case ROPB_NAND: + if (color_bit) + for (i=0;ibody,k++)) + Btr(base->body,k1++); + break; + } + break; + } + } + } + return TRUE; + } + return FALSE; +} + +public void GrPlot(GrBitMap *base,I8 x,I8 y) +{ //Clipping but No transformation or pen width + BoolU4 draw=TRUE; + if (base->brush) { + GrBlot(base,x,y,base->brush); + return; + } + if (base->flags & BMF_SCREEN_BITMAP) { + if (x<0) draw=FALSE; + x+=Fs->window_pixel_left; + if (x>Fs->window_pixel_right) draw=FALSE; + + if (y<0) draw=FALSE; + y+=Fs->window_pixel_top; + if (y>Fs->window_pixel_bottom) draw=FALSE; + if (x>=base->width) draw=FALSE; + if (y>=base->height) draw=FALSE; + if (IsPixelCovered(Fs,x,y)) draw=FALSE; + } else { + if (x<0) draw=FALSE; + if (x>=base->width) draw=FALSE; + if (y<0) draw=FALSE; + if (y>=base->height) draw=FALSE; + } + if (draw) + GrPlot0(base,x,y); +} + + +public void GrPlot2(GrBitMap *base,I8 x,I8 y,I8 z) +{ //Clipping and transformation but no pen_width + if (base->flags & BMF_TRANSFORMATION) { + GrRotate(base->r,&x,&y,&z); + x+=base->x; + y+=base->y; + z+=base->z; + } + GrPlot(base,x,y); +} + +public void GrPlot3(GrBitMap *base,I8 x,I8 y,I8 z) +{ //clipping and transformation and pen width + + I8 i,j,w,old_color; + double dist; + if (base->flags & BMF_TRANSFORMATION) { + GrRotate(base->r,&x,&y,&z); + x+=base->x; + y+=base->y; + z+=base->z; + } + w=base->pen_width>>1; + if (w<=0) + GrPlot(base,x,y); + else if (base->pen_widthcolor; + if (base->color.u1[3]==ROPB_EQU) + base->color.u1[3]=ROPB_TRANSPARENT; + if (GrBlot(base,x-w,y-w,gr_pen_brushes[base->pen_width])) { + if (base->flags & BMF_SCREEN_BITMAP) { + x+=Fs->window_pixel_left; + y+=Fs->window_pixel_top; + } + if (base->flags & BMF_LOCATE_NEAREST) { + dist=DistI8(x,y,base->cur_x,base->cur_y); + if (distnearest_dist) { + base->nearest_sub_GrElem=base->cur_sub_GrElem; + base->nearest_dist=dist; + } + } + } + base->color=old_color; + } else if (base->pen_width & 1) { + for (i=-w;i<=w;i++) + for (j=-w;j<=w;j++) + GrPlot(base,x+i,y+j); + } else { + for (i=-w;iwindow_pixel_left; + if (x>Fs->window_pixel_right) draw=FALSE; + + if (y<0) draw=FALSE; + y+=Fs->window_pixel_top; + if (y>Fs->window_pixel_bottom) draw=FALSE; + + if (x>=base->width) draw=FALSE; + if (y>=base->height) draw=FALSE; + + if (draw) { + if (base->brush) + GrBlot(base,x,y,base->brush); + else + GrPlot0(base,x,y); + } +} + +void GrLinePlot(GrBitMap *base,I8 x,I8 y,I8 z) +{ + GrPlot(base,x,y); +} + +public void GrLine(GrBitMap *base,I8 x1,I8 y1,I8 x2,I8 y2,I8 step=1,I8 start=0) +{ + Line(base,x1,y1,0,x2,y2,0,&GrLinePlot,step,start); +} + +public void GrCircle(GrBitMap *base,I8 cx,I8 cy,I8 radius, + I8 step=1,double start_rad=0,double len_rad=pi2) +{ + Circle(base,cx,cy,0,radius,&GrLinePlot,step,start_rad,len_rad); +} + +public void Gr2Bezier(GrBitMap *base,P3I4 *ctrl) +{ + Bezier2(base,ctrl,&GrLinePlot); +} + +public void Gr3Bezier(GrBitMap *base,P3I4 *ctrl) +{ + Bezier3(base,ctrl,&GrLinePlot); +} + +public void Gr2BSpline(GrBitMap *base,P3I4 *ctrl,I8 cnt,BoolU4 closed=FALSE) +{ + BSpline2(base,ctrl,cnt,&GrLinePlot,closed); +} + +public void Gr3BSpline(GrBitMap *base,P3I4 *ctrl,I8 cnt,BoolU4 closed=FALSE) +{ + BSpline3(base,ctrl,cnt,&GrLinePlot,closed); +} + +public void GrLine2(GrBitMap *base,I8 x1,I8 y1,I8 z1,I8 x2,I8 y2,I8 z2,I8 step=1,I8 start=0) +{ //tarnsformation but not pen width + if (base->flags & BMF_TRANSFORMATION) { + GrRotate(base->r,&x1,&y1,&z1); + x1+=base->x; + y1+=base->y; + z1+=base->z; + } + if (base->flags & BMF_TRANSFORMATION) { + GrRotate(base->r,&x2,&y2,&z2); + x2+=base->x; + y2+=base->y; + z2+=base->z; + } + Line(base,x1,y1,0,x2,y2,0,&GrLinePlot,step,start); +} + +void GrLine3Plot(GrBitMap *base,I8 x,I8 y,I8 z) +{ + GrPlot3(base,x,y,z); +} + +public void GrLine3(GrBitMap *base,I8 x1,I8 y1,I8 z1,I8 x2,I8 y2,I8 z2,I8 step=1,I8 start=0) +{ //transformation with pen width + U8 old_flags=base->flags; + + if (base->flags & BMF_TRANSFORMATION) { + GrRotate(base->r,&x1,&y1,&z1); + x1+=base->x; + y1+=base->y; + z1+=base->z; + GrRotate(base->r,&x2,&y2,&z2); + x2+=base->x; + y2+=base->y; + z2+=base->z; + } + base->flags&=~BMF_TRANSFORMATION; + Line(base,x1,y1,z1,x2,y2,z2,&GrLine3Plot,step,start); + base->flags=old_flags; +} + +public void Gr2Bezier3(GrBitMap *base,P3I4 *ctrl) +{ + Bezier2(base,ctrl,&GrLine3Plot); +} + +public void Gr3Bezier3(GrBitMap *base,P3I4 *ctrl) +{ + Bezier3(base,ctrl,&GrLine3Plot); +} + +public void Gr2BSpline3(GrBitMap *base,P3I4 *ctrl,I8 cnt,BoolU4 closed=FALSE) +{ + BSpline2(base,ctrl,cnt,&GrLine3Plot,closed); +} + +public void Gr3BSpline3(GrBitMap *base,P3I4 *ctrl,I8 cnt,BoolU4 closed=FALSE) +{ + BSpline3(base,ctrl,cnt,&GrLine3Plot,closed); +} + + +void GrLinePlot4(GrBitMap *base,I8 x,I8 y,I8 z) +{ + GrPlot4(base,x,y); +} + +public void GrLine4(GrBitMap *base,I8 x1,I8 y1,I8 x2,I8 y2,I8 step=1,I8 start=0) +{ + Line(base,x1,y1,0,x2,y2,0,&GrLinePlot4,step,start); +} + + +void PlotScreenString(I1 *s,U8 attr,I8 x,I8 y) +{ + U1 ch; + attr<<=8; + while (ch=*s++) { + PlotScreenChar(ch+attr,x,y); + x+=4; + } +} + +void PlotWindowString(I1 *s,U8 attr,I8 x,I8 y) +{ + U1 ch; + attr<<=8; + while (ch=*s++) { + PlotWindowChar(ch+attr,x,y); + x+=4; + } +} + +void PlotBorderString(I1 *s,U8 attr,I8 x,I8 y) +{ + U1 ch; + attr<<=8; + while (ch=*s++) { + PlotBorderChar(ch+attr,x,y); + x+=4; + } +} + diff --git a/LT/ADAM/INPTR.CPZ b/LT/ADAM/INPTR.CPZ new file mode 100644 index 0000000..1135f98 --- /dev/null +++ b/LT/ADAM/INPTR.CPZ @@ -0,0 +1,14 @@ +#define IP_NULL 0 +#define IP_JOYSTICK0 1 +#define IP_JOYSTICK1 2 +#define IP_MOUSE 3 + +public I8 ipx=-100,ipy=-100,ipz=0; +public I8 ip_speed=0; +public I8 ip_pointer_type=IP_NULL; +public I8 iptx=ipx/FONT_WIDTH,ipty=ipy/FONT_HEIGHT; +public BoolU4 ip_on=TRUE, //Show or hide cursor + ip_lb_last=FALSE,ip_rb_last=FALSE, + ip_lb=FALSE,ip_cb=FALSE,ip_rb=FALSE; //Left/center/right buttons +public BoolU4 ip_has_wheel=FALSE; +public LTDate last_ip_move_time=BootTime; diff --git a/LT/ADAM/IncCompress.CPZ b/LT/ADAM/IncCompress.CPZ new file mode 100644 index 0000000..85fbf15 --- /dev/null +++ b/LT/ADAM/IncCompress.CPZ @@ -0,0 +1,304 @@ +#define ICT_U2 1 +#define ICT_U4 2 +#define ICT_U8 3 + +class IncCompressStructU2 +{ + U2 match_start; + U2 match_size; + U2 diff_size; + U0 diff_data; +}; + +class IncCompressStructU4 +{ + U4 match_start; + U2 match_size; + U2 diff_size; + U0 diff_data; +}; + +class IncCompressStructU8 +{ + U8 match_start; + U2 match_size; + U2 diff_size; + U0 diff_data; +}; + +class IntermediateIncCompressStruct +{ + IntermediateIncCompressStruct *next,*last; + U8 match_start_ref,match_start,match_size; +}; + +void IncCompressRange(U1 *ref,U8 ref_size,U1 *b,U8 range_start,U8 range_end, + IntermediateIncCompressStruct *root,U8 type_size) +{ + I8 i,j,k,l,best_k=0,best_j,best_i; + IntermediateIncCompressStruct *tempc; + +//$BK,1$TODO: improve this algorithm$BK,0$ + + for (i=range_start;ibest_k) { + best_k=k; + best_j=j; + best_i=i; + } + } + } + if (best_k>type_size) { + if (range_start+type_sizematch_start_ref=best_j; + tempc->match_start=best_i; + tempc->match_size=best_k; + InsQue(tempc,root->last); + if (best_i+best_k+type_sizematch_size-sizeof(IncCompressStructU2); + tempc=tempc->next; + } + } + } else if (ref_size<=0xFFFFFFFF && size<=0xFFFFFFFF) { + ic_type=ICT_U4; + i=sizeof(U1)+size+2*sizeof(U4); + IncCompressRange(ref,ref_size,b,0,size,&root,sizeof(IncCompressStructU4)); + if (root.next==&root) + i+=sizeof(IncCompressStructU4); + else { + tempc=root.next; + while (tempc!=&root) { + i-=tempc->match_size-sizeof(IncCompressStructU4); + tempc=tempc->next; + } + } + } else { + ic_type=ICT_U8; + i=sizeof(U1)+size+2*sizeof(U8); + IncCompressRange(ref,ref_size,b,0,size,&root,sizeof(IncCompressStructU8)); + if (root.next==&root) + i+=sizeof(IncCompressStructU8); + else { + tempc=root.next; + while (tempc!=&root) { + i-=tempc->match_size-sizeof(IncCompressStructU8); + tempc=tempc->next; + } + } + } + result=MAlloc(i); + u1=result; + *u1=ic_type; + switch (ic_type) { + case ICT_U2: + u2=result+sizeof(U1); + *u2=i; + u2+=sizeof(U2); + *u2=size; + tempi2=u2+sizeof(U2); + + tempc=root.next; + while (tempc!=&root) { + tempc1=tempc->next; + if (l || tempc->match_start-(j+l)) { + tempi2->match_start=m; + tempi2->match_size=l; + tempi2->diff_size=tempc->match_start-(j+l); + if (tempi2->diff_size) + MemCpy(&tempi2->diff_data,b+j+l,tempi2->diff_size); + tempi2+=sizeof(IncCompressStructU2)+tempi2->diff_size; + } + m=tempc->match_start_ref; + j=tempc->match_start; + l=tempc->match_size; + Free(tempc); + tempc=tempc1; + } + tempi2->match_start=m; + tempi2->match_size=l; + tempi2->diff_size=size-(j+l); + if (tempi2->diff_size) + MemCpy(&tempi2->diff_data,b+j+l,tempi2->diff_size); + break; + case ICT_U4: + u4=result+sizeof(U1); + *u4=i; + u4+=sizeof(U4); + *u4=size; + tempi4=u4+sizeof(U4); + +//$BK,1$TODO: deal with >65536 matches and differences$BK,0$ + tempc=root.next; + while (tempc!=&root) { + tempc1=tempc->next; + if (l || tempc->match_start-(j+l)) { + tempi4->match_start=m; + tempi4->match_size=l; + tempi4->diff_size=tempc->match_start-(j+l); + if (tempi4->diff_size) + MemCpy(&tempi4->diff_data,b+j+l,tempi4->diff_size); + tempi4+=sizeof(IncCompressStructU4)+tempi4->diff_size; + } + m=tempc->match_start_ref; + j=tempc->match_start; + l=tempc->match_size; + Free(tempc); + tempc=tempc1; + } + tempi4->match_start=m; + tempi4->match_size=l; + tempi4->diff_size=size-(j+l); + if (tempi4->diff_size) + MemCpy(&tempi4->diff_data,b+j+l,tempi4->diff_size); + break; + case ICT_U8: + u8=result+sizeof(U1); + *u8=i; + u8+=sizeof(U8); + *u8=size; + tempi8=u8+sizeof(U8); + +//$BK,1$TODO: deal with >65536 matches and differences$BK,0$ + tempc=root.next; + while (tempc!=&root) { + tempc1=tempc->next; + if (l || tempc->match_start-(j+l)) { + tempi8->match_start=m; + tempi8->match_size=l; + tempi8->diff_size=tempc->match_start-(j+l); + if (tempi8->diff_size) + MemCpy(&tempi8->diff_data,b+j+l,tempi8->diff_size); + tempi8+=sizeof(IncCompressStructU8)+tempi8->diff_size; + } + m=tempc->match_start_ref; + j=tempc->match_start; + l=tempc->match_size; + Free(tempc); + tempc=tempc1; + } + tempi8->match_start=m; + tempi8->match_size=l; + tempi8->diff_size=size-(j+l); + if (tempi8->diff_size) + MemCpy(&tempi8->diff_data,b+j+l,tempi8->diff_size); + break; + } + return result; +} + +public U1 *IncExpand(U1 *ref,IncCompressStructU2 *b,U8 *size=NULL) +{ + U1 *result,*dst,*u1=b,*b_end; + U2 *u2; + U4 *u4; + U8 *u8=b,s,ic_type; + IncCompressStructU2 *tempi2; + IncCompressStructU4 *tempi4; + IncCompressStructU8 *tempi8; + + ic_type=*u1; + + switch (ic_type) { + case ICT_U2: + u2=b+sizeof(U1); + b_end=b+*u2; + u2+=sizeof(U2); + s=*u2; + break; + case ICT_U4: + u4=b+sizeof(U1); + b_end=b+*u4; + u4+=sizeof(U4); + s=*u4; + break; + case ICT_U8: + u8=b+sizeof(U1); + b_end=b+*u8; + u8+=sizeof(U8); + s=*u8; + break; + } + result=MAlloc(s); + if (size) *size=s; + dst=result; + + switch (ic_type) { + case ICT_U2: + tempi2=b+sizeof(U1)+2*sizeof(U2); + while (tempi2match_size) { + MemCpy(dst,ref+tempi2->match_start,tempi2->match_size); + dst+=tempi2->match_size; + } + if (tempi2->diff_size) { + MemCpy(dst,&tempi2->diff_data,tempi2->diff_size); + dst+=tempi2->diff_size; + } + tempi2+=sizeof(IncCompressStructU2)+tempi2->diff_size; + } + break; + case ICT_U4: + tempi4=b+sizeof(U1)+2*sizeof(U4); + while (tempi4match_size) { + MemCpy(dst,ref+tempi4->match_start,tempi4->match_size); + dst+=tempi4->match_size; + } + if (tempi4->diff_size) { + MemCpy(dst,&tempi4->diff_data,tempi4->diff_size); + dst+=tempi4->diff_size; + } + tempi4+=sizeof(IncCompressStructU4)+tempi4->diff_size; + } + break; + case ICT_U8: + tempi8=b+sizeof(U1)+2*sizeof(U8); + while (tempi8match_size) { + MemCpy(dst,ref+tempi8->match_start,tempi8->match_size); + dst+=tempi8->match_size; + } + if (tempi8->diff_size) { + MemCpy(dst,&tempi8->diff_data,tempi8->diff_size); + dst+=tempi8->diff_size; + } + tempi8+=sizeof(IncCompressStructU8)+tempi8->diff_size; + } + break; + } + return result; +} diff --git a/LT/ADAM/JOY.CPZ b/LT/ADAM/JOY.CPZ new file mode 100644 index 0000000..7c7f00e --- /dev/null +++ b/LT/ADAM/JOY.CPZ @@ -0,0 +1,136 @@ +#define JOY_CAL_FILE "::/LT/ADAM/JOY.DTZ" +#define LTPORT 0x201 +#define CMAX 0x800 + +public I8 joyv[4],joymax[4],joymin[4],joyrest[4]; +public BoolU4 joyb[4],joy_calibrated=FALSE,joy_being_calibrated=FALSE; +public I8 joysat=100,joynx=0,joyny=0; //Normalized +public I8 joycx=grwidth>>1,joycy=grheight>>1,joycvx=0,joycvy=0; +public I8 joytx=0,joyty=0; //Text row & col + +void PollJoystick() +{ + I8 i, j; + I8 mask = 15; + I8 scale2=24; + BoolU4 old_preempt=Preempt(OFF); + + for (i=0;i<4;i++) + joyv[i]=0; + OutP(LTPORT, 0); + for (i=1; mask && i < CMAX; i++) { + j = InP(LTPORT) ^ mask; + if (j & 1) { joyv[0] = i; mask = mask ^ 1; } + if (j & 2) { joyv[1] = i; mask = mask ^ 2; } + if (j & 4) { joyv[2] = i; mask = mask ^ 4; } + if (j & 8) { joyv[3] = i; mask = mask ^ 8; } + } + Preempt(old_preempt); + j = InP(LTPORT); + joyb[0] = !(j & 0x10); + joyb[1] = !(j & 0x20); + joyb[2] = !(j & 0x40); + joyb[3] = !(j & 0x80); + + if (joy_calibrated) { + joynx=joysat*(joyv[0]-joyrest[0])/(joymax[0]-joymin[0]+1); + if (AbsI8(joynx)<15) + joycvx=0; + else + joycvx+=joynx-SignI8(joynx)*15; + joyny=joysat*(joyv[1]-joyrest[1])/(joymax[1]-joymin[1]+1); + if (AbsI8(joyny)<15) + joycvy=0; + else + joycvy+=joyny-SignI8(joyny)*15; + joycx+=joycvx/scale2; + joycvx=70*joycvx/100; + joycy+=joycvy/scale2; + joycvy=70*joycvy/100; + if (joycx < 0) joycx=0; + if (joycx>=grwidth) joycx=grwidth-1; + if (joycy < 0) joycy=0; + if (joycy>=grheight) joycy=grheight-1; + joytx=joycx/FONT_WIDTH; + joyty=joycy/FONT_HEIGHT; + } +} + + +public void JoyCalibration() +{ + I8 i,x,y; + I8 buf[3<<2]; + I8 old_ip=ip_pointer_type; + joy_calibrated=FALSE; + ip_pointer_type=IP_JOYSTICK0; + GrBitMap *base=GrNew(grbase); + base->color=ROP_XOR|GR_WHITE; + for (i=0;i<4;i++) + joyb[i]=0; + coutln "$$CL$$Leave joystick and throttle centered\r\n and press button."; + while (!(joyb[0] || joyb[1])) { + SwapInNext; + } + for (i=0;i<4;i++) { + joyrest[i]=joyv[i]; + joymax[i]=joyv[i]; + joymin[i]=joyv[i]; + } + while (joyb[0] || joyb[1]) { + SwapInNext; + } + coutln "$$CL$$Move all about including throttle and press button."; + while (!(joyb[0] || joyb[1])) { + x=joyv[0]>>1; y=joyv[1]>>1; + if (x<3) x=3; + if (y<3) y=3; + GrLine3(base,x-3,y-3,0,x+3,y+3,0); + GrLine3(base,x+3,y-3,0,x-3,y+3,0); + x=joyv[2]>>1; y=joyv[3]>>1; + if (x<3) x=3; + if (y<3) y=3; + GrLine3(base,x-3,y-3,0,x+3,y+3,0); + GrLine3(base,x+3,y-3,0,x-3,y+3,0); + for (i=0;i<4;i++) { + if (joyv[i]>joymax[i]) joymax[i]=joyv[i]; + if (joyv[i]attr & LT_ATTR_DIR) && tempm1->name[0]!='.') { + tempa=MAlloc(sizeof(SysAccntStruct)); + StrCpy(tempa->name,tempm1->name); + tempa->flags=0; + InsQue(tempa,sys_accounts.last); + } + tempm1=tempm1->next; + } + DelLTDirList(tempm1); +} + +public SysAccntStruct *FindSysAccnt(I1 *name) +{ + SysAccntStruct *tempa; + tempa=sys_accounts.next; + while (tempa!=&sys_accounts) { + if (!StrCmp(tempa->name,name)) + return tempa; + tempa=tempa->next; + } + return NULL; +} + + +public SysAccntStruct *PopUpGetSysAccnt() +{ + Ltf *l=LtfNew; + SysAccntStruct *tempa; + + LtfPutS(l,"Select Account.\r\nCursor down and press SPACE.\r\n"); + + tempa=sys_accounts.next; + while (tempa!=&sys_accounts) { + LtfPrintF(l,"$$CM +LX 2,3$$$$BT, \"%s\" %d$$",tempa->name,tempa); + tempa=tempa->next; + } + tempa=PopUpMenu(l); + LtfDel(l); + return tempa; +} + +void LoadAdam3() +{ + SysAccntStruct *tempa=Fs->account; + if (!Bts(&tempa->flags,SACTf_ADAM3_LOADED)) { + Adam("ExecuteFile(\"::/LT/ACCOUNTS/%s/ADAM3.CPZ\");;", + tempa->name); + } +} diff --git a/LT/ADAM/LTF.CPZ b/LT/ADAM/LTF.CPZ new file mode 100644 index 0000000..cab6e97 --- /dev/null +++ b/LT/ADAM/LTF.CPZ @@ -0,0 +1,2240 @@ +U8 ltf_display_types[1],ltf_nondisplay_invisible_types[1], + ltf_form_types[1],ltf_data_types[1]; + +ltf_display_types[0]=1<bin_root.next; + while (b!=&l->bin_root) { + if (b->num==num) + return b; + b=b->next; + } + return NULL; +} + +void LtfValidateBins(Ltf *l) +{ + LtfBinEntry *b=l->bin_root.next,*b1; + LtfEntry *cl=l->dummy.next; + while (b!=&l->bin_root) { + b->use_cnt=0; + b=b->next; + } + while (cl!=l) { + if (cl->flags & LTFLF_HAS_BIN) { + if (cl->bin_data) + cl->bin_data->use_cnt++; + else { + cl->bin_data=LtfFindBin(l,cl->bin_num); + if (cl->bin_data) + cl->bin_data->use_cnt++; + } + } + cl=cl->next; + } + b=l->bin_root.next; + l->cur_bin_num=1; + while (b!=&l->bin_root) { + b1=b->next; + if (!b->use_cnt) { + RemQue(b); + Free(b->data,l->mem_tss); + Free(b,l->mem_tss); + } else { + if (b->num>=l->cur_bin_num) + l->cur_bin_num=b->num+1; + } + b=b1; + } +} + + +void LtfDelBin(LtfBinEntry *b,TssStruct *tss) +{ + b->use_cnt--; + if (!b->use_cnt) { + RemQue(b); + Free(b->data,tss); + Free(b,tss); + } +} + +void LtfDelEntry(LtfEntry *cl,TssStruct *tss) +{ + if (Bt(ltf_display_types,cl->btype)) + Free(cl->display,tss); + if (cl->btype>=LTFT_DATA) + Free(cl->plain_text,tss); + if (cl->flags & LTFLF_LEFT_MACRO) + Free(cl->left_macro,tss); + if (cl->flags & LTFLF_RIGHT_MACRO) + Free(cl->right_macro,tss); + if (cl->flags & LTFLF_AUX_STRING) + Free(cl->aux_string,tss); + if (cl->flags & LTFLF_HAS_BIN) + LtfDelBin(cl->bin_data,tss); + Free(cl,tss); +} + + +LtfEntry *LtfCopyEntry(Ltf *l,LtfEntry *cl) +{ + LtfEntry *nl; + LtfBinEntry *tempb; + TssStruct *tss=l->mem_tss; + nl=MAllocIdentical(cl,tss); + if (Bt(ltf_display_types,cl->btype)) + nl->display=MAllocIdentical(cl->display,tss); + if (cl->btype>=LTFT_DATA) + nl->plain_text=NewString(cl->plain_text,tss); + if (cl->flags & LTFLF_AUX_STRING) + nl->aux_string=NewString(cl->aux_string,tss); + if (cl->flags & LTFLF_LEFT_MACRO) + nl->left_macro=MAllocIdentical(cl->left_macro,tss); + if (cl->flags & LTFLF_RIGHT_MACRO) + nl->right_macro=MAllocIdentical(cl->right_macro,tss); + if (cl->flags & LTFLF_HAS_BIN) { + tempb=MAllocIdentical(cl->bin_data,tss); + tempb->data=MAllocIdentical(cl->bin_data->data,tss); + nl->bin_num=l->cur_bin_num; + tempb->num=l->cur_bin_num++; + nl->bin_data=tempb; + InsQue(tempb,l->bin_root.last); + } + return nl; +} + +void LtfFormForward(Ltf *l) +{ + LtfEntry *cl=l->cur_entry,*cl1=cl->last; + if (l->flags & LTFF_FORM) { + while (cl!=cl1 && !Bt(ltf_form_types,cl->btype)) { + cl=cl->next; + } + l->cur_data_col=cl->min_col; + l->cur_entry=cl; + } +} + +void LtfFormBackward(Ltf *l) +{ + LtfEntry *cl=l->cur_entry,*cl1=cl->next; + if (l->flags & LTFF_FORM) { + while (cl!=cl1 && !Bt(ltf_form_types,cl->btype)) { + cl=cl->last; + } + l->cur_data_col=cl->min_col; + l->cur_entry=cl; + } +} + +public void LtfHome(Ltf *l) +{ + if (!l) return; + l->cur_entry=l->dummy.next; + l->cur_data_col=l->cur_entry->min_col; + l->x=0; + l->y=0; + l->line_start_col=0; + l->cur_top_line_num=0; + LtfFormForward(l); +} + + +public void LtfReset(Ltf *l,BoolU4 is_old,BoolU4 adam_mem=FALSE) +{ + LtfEntry *cl,*cl1; + if (!l) return; + if (is_old) { + cl=l->dummy.next; + while (cl!=l) { + cl1=cl->next; + if (adam_mem) + LtfDelEntry(cl,adam_tss); + else + LtfDelEntry(cl,l->mem_tss); + cl=cl1; + } + } +//Check $LK,"EditInsertLtf","MN:EditInsertLtf"$ + l->text_attribute=(WHITE<<4)+BLUE; + l->link_attribute=(WHITE<<4)+RED; + l->macro_attribute=(WHITE<<4)+LTBLUE; + l->anchor_attribute=(WHITE<<4)+BLACK; + l->hidden_attribute=(WHITE<<4)+BLACK; + l->tree_attribute=(WHITE<<4)+PURPLE; + l->user_attribute=(WHITE<<4)+GREEN; + l->flags=0; + l->dummy.next=l; + l->dummy.last=l; + l->bin_root.next=&l->bin_root; + l->bin_root.last=&l->bin_root; + l->cur_bin_num=1; + l->recalc_start=l; + l->menu_ltf=NULL; + l->dollar_buf_ptr=0; + l->cmd_I1=CH_SPACE; + l->indent=0; + l->page_line_num=0; + l->page_length=66; + l->left_margin=LTF_DEFAULT; + l->right_margin=LTF_DEFAULT; + l->header=LTF_DEFAULT; + l->footer=LTF_DEFAULT; + + cl=&l->dummy; + cl->type=LTFT_ERROR; + cl->flags=0; + cl->x=0; + cl->y=0; + cl->min_col=0; + cl->max_col=0; + cl->indent=l->indent; + cl->page_line_num=l->page_line_num; + cl->left_margin=l->left_margin; + cl->right_margin=l->right_margin; + + LtfHome(l); +} + + +public void LtfDel(Ltf *l,BoolU4 adam_mem=FALSE) +{ + Ltf *m; + + if (!l) return; + m=l->menu_ltf; + LtfReset(l,TRUE,adam_mem); + Free(l->find_replace,l->mem_tss); + Free(l->dollar_buf,l->mem_tss); + LtfDel(m,adam_mem); + Free(l,l->mem_tss); +} + + +void LtfFormatData(LtfEntry *cl) +{ + BoolU4 *b; + U8 *d; + I8 i; + if (cl->btype==LTFT_DATA) { + d=cl->data; + if (cl->flags & LTFLF_DATA_IS_PTR) + SPrintF(cl->display,cl->aux_string,*d,cl->my_format_data); + else + SPrintF(cl->display,cl->aux_string,d,cl->my_format_data); + if (cl->flags & LTFLF_HAS_TERMINATOR) { + i=StrLen(cl->display); + cl->display[i++]='_'; + cl->display[i]=0; + } + } else if (cl->btype==LTFT_CHECK_BOX) { + if (cl->flags & LTFLF_DATA_IS_PTR) + b=cl->data; + else + b=&cl->data; + if (*b) + cl->flags|=LTFLF_CHECKED; + else + cl->flags&=~LTFLF_CHECKED; + } +} + +void LtfGetData(LtfEntry *cl) +{ + BoolU4 *b; + I8 i; + if (cl->btype==LTFT_DATA) { + i=StrLen(cl->display); + if (cl->flags & LTFLF_HAS_TERMINATOR) + cl->display[--i]=0; + if (i>cl->len+cl->min_col) + cl->display[cl->len+cl->min_col]=0; + if (cl->flags & LTFLF_DATA_IS_PTR) + GetF(cl->display,cl->aux_string,cl->data,cl->my_format_data); + else + GetF(cl->display,cl->aux_string,&cl->data,cl->my_format_data); + if (cl->flags & LTFLF_HAS_TERMINATOR) + cl->display[i]='_'; + } else if (cl->btype==LTFT_CHECK_BOX) { + if (cl->flags & LTFLF_DATA_IS_PTR) + b=cl->data; + else + b=&cl->data; + if (cl->flags & LTFLF_CHECKED) + *b=TRUE; + else + *b=FALSE; + } +} + + +I8 LtfCharDist(Ltf *l,I8 x,I8 y) +{ + I8 dx=(l->x-x)*FONT_WIDTH>>2,dy=(l->y-y)*FONT_HEIGHT; + return MulI8(dx,dx)+MulI8(dy,dy); +} + + +public void LtfUpdateWindowJoin(Ltf *l,BoolU4 to_screen,BoolU4 has_cursor, + BoolU4 recalc,BoolU4 find_cur_entry, + LtfEntry *pg_found=NULL,I8 num_del_entries=0) +{ + I8 i,ii,j,k,x,x0,y,y0,D,d2,col,col2,best_col=0,best_d=MAX_I8; + I8 num_entries=0,cursor_y=MIN_I8; + LtfEntry *cl,*cl2,*best_cl=l->cur_entry,*alias,*next_pg_found=NULL; + I8 ijif; + U8 w,w1; + U1 *bptr; + U1 ch,*ptr,buf[16]; + BoolU4 del_cl,skipped_update,tree_collapsed; + U8 hide_collapsed[2]; + TssStruct *tss=l->tss,*mem_tss=l->mem_tss; + BoolU4 resize=FALSE; + BoolU4 extra_processing,same_window; + BoolU4 revert_default_color_eol=FALSE; + GrBitMap *base=GrNew(grbase2); + I8 left_margin=tss->window_left,right_margin=tss->window_right; + + if (!l) return; + if (to_screen || find_cur_entry) { + recalc=TRUE; + l->recalc_start=l; + } + + if (has_cursor) { + if (Btr(&tss->crt_flags,CRTf_HAS_BEEN_RESIZED)) + resize=TRUE; + + if (Btr(&tss->crt_flags,CRTf_SCROLL_X)) + l->line_start_col=(DivI8(MulI8(tss->scroll_x,l->max_x-l->min_x+1), + right_margin-left_margin+4)+l->min_x) & -4; + if (Btr(&tss->crt_flags,CRTf_SCROLL_Y)) + l->cur_top_line_num=DivI8(MulI8(tss->scroll_y,l->max_y-l->min_y+1), + tss->window_bottom-tss->window_top+1)+l->min_y; + } + x=0; y=0; + l->indent=0; + l->page_line_num=0; + l->left_margin=LTF_DEFAULT; + l->right_margin=LTF_DEFAULT; + l->header=LTF_DEFAULT; + l->footer=LTF_DEFAULT; + same_window=tss->window_top==l->old_window_top && + tss->window_bottom==l->old_window_bottom && + tss->window_left==l->old_window_left && + tss->window_right==l->old_window_right; + w=l->text_attribute<<8; + if (!find_cur_entry) { + l->x=0; + l->y=0; + } + l->flags&=~(LTFF_WORD_WRAP|LTFF_UNDERLINED|LTFF_INVERTED|LTFF_BLINK); + l->shifted_x=0; + l->shifted_y=0; + if (recalc) { + if (l->cur_data_col<=l->cur_entry->min_col) + l->cur_data_col=l->cur_entry->min_col; + if (!l->recalc_start) + cl=l; //skip update + else { + cl=l->recalc_start; + if (cl!=l) { + i=l->ww_lines_back; + ii=i/2; //Threshold for stopping on SOFT_CR + while (i-- && cl->btype!=LTFT_CR && + (i>ii || cl->btype!=LTFT_SOFT_CR) && + cl->flags & LTFLF_WORD_WRAP && + cl->last!=l) + cl=cl->last; + if (cl->flags & LTFLF_WORD_WRAP) + l->flags|=LTFF_WORD_WRAP; + else + l->flags&=~LTFF_WORD_WRAP; + if (cl->flags & LTFLF_UNDERLINED) { + l->flags|=LTFF_UNDERLINED; + w|=LTFLT_UNDERLINED; + } else + l->flags&=~LTFF_UNDERLINED; + if (cl->flags & LTFLF_INVERTED) { + l->flags|=LTFF_INVERTED; + w|=LTFLT_INVERTED; + } else + l->flags&=~LTFF_INVERTED; + if (cl->flags & LTFLF_BLINK) { + l->flags|=LTFF_BLINK; + w|=LTFLT_BLINK; + } else + l->flags&=~LTFF_BLINK; + w|=(cl->type & 0x0C00FF00); + x=cl->x; y=cl->y; + l->indent=cl->indent; + l->page_line_num=cl->page_line_num; + l->left_margin=cl->left_margin; + l->right_margin=cl->right_margin; + } else + cl=l->dummy.next; + } + } else + cl=l->dummy.next; + x0=l->line_start_col; + y0=l->cur_top_line_num; + if (l->dummy.next==l) { + best_cl=l; + best_col=0; + l->cur_entry=l; + l->cur_data_col=0; + cl=l; + + } + skipped_update=(cl==l && l->dummy.next!=l); + + extra_processing=recalc||find_cur_entry||resize; + + l->min_x=0x7FFFFFFC; l->min_y=MAX_I4; + l->max_x=-0x7FFFFFFF; l->max_y=MIN_I4; + + while (cl!=l) { + del_cl=FALSE; + if (cl->flags & LTFLF_SKIP) { + cl=cl->last; //for consistency handle skips the same + goto skip; + } + if (cl->flags & LTFLF_DISPLAY_CB) { + if (recalc || cl->flags & LTFLF_REFRESH_DATA) { + Free(cl->display,mem_tss); + cl->display=cl->display_cb(l,l->user_data,cl,mem_tss); + cl->max_col=StrLen(cl->display); + if (l->cur_entry==cl) { + if (l->cur_data_col>=cl->max_col && cl->max_col) + l->cur_data_col=cl->max_col-1; + } + } + } + if (extra_processing) { +word_wrap_start: + cl2=cl->next; + if (cl2->btype==LTFT_SOFT_CR) { + if (!same_window) { + if (l->cur_entry==cl2) { + l->cur_entry=cl2->next; + l->cur_data_col=l->cur_entry->min_col; + } + if (best_cl==cl2) { + best_cl=cl2->next; + best_col=0; + } + RemQue(cl2); + LtfDelEntry(cl2,mem_tss); + goto word_wrap_start; + } + } + if (cl->btype==LTFT_TEXT) { + if (cl->flags==cl2->flags && + cl->type==cl2->type) { + i=StrLen(cl->display); + j=StrLen(cl2->display); + ptr=MAlloc(i+j+1,mem_tss); + MemCpy(ptr,cl->display,i); + MemCpy(ptr+i,cl2->display,j+1); + Free(cl->display,mem_tss); + cl->display=ptr; + if (l->cur_entry==cl2) { + l->cur_entry=cl; + l->cur_data_col+=i; + } + if (best_cl==cl2) { + best_cl=cl; + best_col=0; + } + RemQue(cl2); + LtfDelEntry(cl2,mem_tss); + goto word_wrap_start; + } + } + } + if (cl->flags & LTFLF_SCROLLING_X) + k=cl->scroll_len; + else if (Bt(ltf_display_types,cl->btype)) + k=StrLen(cl->display); + else + k=0; + if (cl->flags & + (LTFLF_LEFT_X|LTFLF_RIGHT_X|LTFLF_CENTER_X| + LTFLF_TOP_Y|LTFLF_BOTTOM_Y|LTFLF_CENTER_Y)) { + if (cl->flags & LTFLF_MARGIN_REL_X) { + if (cl->flags & LTFLF_LEFT_X) + x=left_margin-tss->window_left; + else if (cl->flags & LTFLF_RIGHT_X) + x=right_margin-(k-1)<<2-tss->window_left; + else if (cl->flags & LTFLF_CENTER_X) + x=((right_margin+left_margin)>>1-k>>1-tss->window_left) & -4; + } else { + if (cl->flags & LTFLF_LEFT_X) + x=x0; + else if (cl->flags & LTFLF_RIGHT_X) + x=tss->window_right-tss->window_left+x0-(k-1)<<2; + else if (cl->flags & LTFLF_CENTER_X) + x=((tss->window_right-tss->window_left+x0)>>1-k<<1) & -4; + } + if (cl->flags & LTFLF_PAGE_REL_Y) { + if (cl->flags & LTFLF_TOP_Y) + y-=cl->page_line_num; + else if (cl->flags & LTFLF_BOTTOM_Y) + y+=l->page_length-cl->page_line_num; + else if (cl->flags & LTFLF_CENTER_Y) + y+=l->page_length>>1-cl->page_line_num; + } else { + if (cl->flags & LTFLF_TOP_Y) + y=y0; + else if (cl->flags & LTFLF_BOTTOM_Y) + y=tss->window_bottom-tss->window_top+y0; + else if (cl->flags & LTFLF_CENTER_Y) + y=(tss->window_bottom-tss->window_top)>>1+y0; + } + } + + if (extra_processing && k>0) { + if (l->flags & LTFF_WORD_WRAP) { + i=(right_margin+4-(x+tss->window_left))>>2; //Space left ON line + ii=(x+4-l->left_margin)>>2; + if (cl->btype==LTFT_TEXT) { +/* + if (l->cur_entry==cl->next && l->cur_data_col==0 + && k==i) + i--; + if (l->cur_entry==cl) { + if (l->cur_data_col==i || + (l->cur_data_col==i+1 && (cl->display[i]==CH_SPACE ||cl->display[i]==CH_SHIFT_SPACE))) + i--; + } +*/ + if (k>i) { + for (j=i;j>8-ii && j>=0;j--) + if (cl->display[j]==CH_SPACE || cl->display==CH_SHIFT_SPACE) { + i=j+1; + break; + } + if (k>i && i>0) { + cl2=MAllocIdentical(cl,mem_tss); + cl2->display=NewString(cl->display+i,mem_tss); + InsQue(cl2,cl); + if (l->cur_entry==cl && l->cur_data_col>=i) { + l->cur_entry=cl2; + l->cur_data_col=l->cur_data_col-i; + } + cl->display[i]=0; + ptr=NewString(cl->display,mem_tss); + Free(cl->display,mem_tss); + cl->display=ptr; + cl2=MAllocZ(sizeof(LtfEntryBase),mem_tss); + cl2->type=LTFT_SOFT_CR | cl->type & 0xFFFFFF00; + cl2->flags=cl->flags; + cl2->x=x; + cl2->y=y; + cl2->indent=l->indent; + cl2->page_line_num=l->page_line_num; + cl2->left_margin=l->left_margin; + cl2->right_margin=l->right_margin; + InsQue(cl2,cl); + goto skip_soft_cr; + } + } + if (k==i) + goto skip_soft_cr; + } + if (k>=i && cl->btype!=LTFT_SOFT_CR && cl->btype!=LTFT_CR + && cl->btype!=LTFT_CURSOR_MOVEMENT) { + if (cl->last->btype!=LTFT_SOFT_CR && + cl->last->btype!=LTFT_CR && + cl->last->btype!=LTFT_CURSOR_MOVEMENT) { + cl2=MAllocZ(sizeof(LtfEntryBase),mem_tss); + cl2->type=LTFT_SOFT_CR | cl->type & 0xFFFFFF00; + cl2->flags=LTFLF_WORD_WRAP | + cl->flags & (LTFLF_INVERTED|LTFLF_UNDERLINED| + LTFLF_BLINK|LTFLF_SKIP); + cl2->x=x; + cl2->y=y; + cl2->indent=l->indent; + cl2->page_line_num=l->page_line_num; + cl2->left_margin=l->left_margin; + cl2->right_margin=l->right_margin; + InsQue(cl2,cl->last); + if (l->left_margin==LTF_DEFAULT) + x=l->indent; + else + x=l->left_margin+l->indent; + y++; + } + } +skip_soft_cr: + } + } + if (cl==l->cur_entry) + cursor_y=y; + cl->x=x; + cl->y=y; + cl->indent=l->indent; + cl->page_line_num=l->page_line_num; + cl->left_margin=l->left_margin; + cl->right_margin=l->right_margin; + cl->type=w & 0xFF00 | cl->type & 0xFFFF00FF; + if (l->flags & LTFF_WORD_WRAP) + cl->flags|=LTFLF_WORD_WRAP; + else + cl->flags&=~LTFLF_WORD_WRAP; + + if (l->flags & LTFF_UNDERLINED) { + cl->flags|=LTFLF_UNDERLINED; + w|=LTFLT_UNDERLINED; + } else { + cl->flags&=~LTFLF_UNDERLINED; + w&=~LTFLT_UNDERLINED; + } + + if (l->flags & LTFF_INVERTED) { + cl->flags|=LTFLF_INVERTED; + w|=LTFLT_INVERTED; + } else { + cl->flags&=~LTFLF_INVERTED; + w&=~LTFLT_INVERTED; + } + if (l->flags & LTFF_BLINK) { + cl->flags|=LTFLF_BLINK; + w|=LTFLT_BLINK; + } else { + cl->flags&=~LTFLF_BLINK; + w&=~LTFLT_BLINK; + } + + if (xmin_x) l->min_x=x; + if (ymin_y) l->min_y=y; + + if (find_cur_entry) { + D=LtfCharDist(l,x,y); + col=0; + } + col2=0; + w=w&0xFC00FF00|(l->shifted_x & 0x1F)<<16|(l->shifted_y & 0x1F)<<21; + switch (cl->btype) { + case LTFT_LINK: + w1=w & 0xFFFF0000 | l->link_attribute<<8; + break; + case LTFT_MACRO: + case LTFT_MENU_VALUE: + w1=w & 0xFFFF0000 | l->macro_attribute<<8; + break; + case LTFT_ANCHOR: + w1=w & 0xFFFF0000 | l->anchor_attribute<<8; + break; + case LTFT_TREE: + w1=w & 0xFFFF0000 | l->tree_attribute<<8; + break; + case LTFT_HIDE_START: + case LTFT_HIDE_END: + w1=w & 0xFFFF0000 | l->hidden_attribute<<8; + break; + default: + w1=w; + } + w1=w1 & 0xFFFFFF00 | cl->type & 0xF3FF0000; + if (cl==l->cur_entry && cl->btype!=LTFT_TEXT) + w1^=0xFF00; + + if (cl->flags & LTFLF_REFRESH_DATA) { + if (cl->btype==LTFT_DATA || cl->btype==LTFT_CHECK_BOX) { + LtfFormatData(cl); + if (cl->btype==LTFT_DATA) + cl->max_col=StrLen(cl->display); + } + } + + ptr=cl->display; + if (cl->flags & LTFLF_TREE) { + if (StrLen(ptr)>=2) { + if (cl->flags & LTFLF_COLLAPSED) + *ptr++='+'; + else + *ptr++='-'; + *ptr++=']'; + } + } + if (cl->btype==LTFT_CHECK_BOX) { + if (StrLen(ptr)>=3) { + *ptr++='['; + if (cl->flags & LTFLF_CHECKED) + *ptr++='X'; + else + *ptr++=' '; + *ptr++=']'; + } + } else if (cl->btype==LTFT_HIDE_START) { + if (StrLen(ptr)>=2) { + *ptr++='<'; + if (cl->flags & LTFLF_COLLAPSED) + *ptr++='+'; + else + *ptr++='-'; + } + } else if (cl->btype==LTFT_HIDE_END) { + if (StrLen(ptr)>=1) + *ptr++='>'; + } + + if (Bt(ltf_display_types,cl->btype)) { + if (cl->flags & LTFLF_SCROLLING_X) { + j=StrLen(cl->display); + if (j && cl->scroll_len) { + ijif=DivU8(MulU8(jiffies,MulU8(FONT_WIDTH,tss->scroll_speed)),JIFFY_FREQ); + ijif=ModU8(ijif,j*FONT_WIDTH); + w1=w1 & 0xFFE0FF00| + ((FONT_WIDTH-1-ModU8(ijif,FONT_WIDTH))<<16); + ijif=DivU8(ijif,FONT_WIDTH); + ptr=cl->display; + for (k=0;kscroll_len;k++) { + ch=ptr[ModU8(ijif+k,j)]; + if (!Bt(displayable_chars_bitmap,ch)) ch='.'; + if (to_screen) { + if (cl->flags & LTFLF_BORDER_PLOT) + PlotBorderChar(w1+ch,x-x0,y-y0); + else + PlotWindowChar(w1+ch,x-x0,y-y0); + } + x+=4; + } + } + if (find_cur_entry) { + D=LtfCharDist(l,cl->x,cl->y); + col=cl->min_col; + } + col2=cl->scroll_len; //TODO This is flawed + } else { + ptr=cl->display; + if (cl->flags & LTFLF_PASSWORD) { + while (ch=*ptr++) { + if (ch!=CH_TAB) { + if (ptr-1-cl->display>=cl->min_col) { + if (!(cl->flags & LTFLF_HAS_TERMINATOR) || + ptr-cl->display!=StrLen(cl->display)) + ch='*'; + } + if (to_screen) { + if (cl->flags & LTFLF_BORDER_PLOT) + PlotBorderChar(w1+ch,x-x0,y-y0); + else + PlotWindowChar(w1+ch,x-x0,y-y0); + } + if (find_cur_entry) { + d2=LtfCharDist(l,x,y); + if (d2flags & LTFLF_BORDER_PLOT) + PlotBorderChar(w1+CH_SPACE,x-x0,y-y0); + else + PlotWindowChar(w1+CH_SPACE,x-x0,y-y0); + } + if (find_cur_entry) { + d2=LtfCharDist(l,x,y); + if (d2flags & LTFLF_BORDER_PLOT) { + while (ch=*ptr++) { + if (ch!=CH_TAB) { + if (to_screen) + PlotBorderChar(w1+ch,x-x0,y-y0); + if (find_cur_entry) { + d2=LtfCharDist(l,x,y); + if (d2btype) { + case LTFT_TEXT: + if (!col2) { + if (!(cl->flags & LTFLF_TREE) && recalc) + del_cl=TRUE; + } + break; + case LTFT_HEX_EDIT: + if (cl->flags & LTFLF_DATA_IS_PTR) + bptr=cl->data; + else + bptr=&cl->data; + k=cl->display; //columns + for (i=0;ilen;i=i+k) { + if (cl->flags & LTFLF_ZERO_BASED) + SPrintF(buf,"%08X ",i); + else + SPrintF(buf,"%08X ",bptr); + ptr=buf; + while (ch=*ptr++) { + if (to_screen) { + if (cl->flags & LTFLF_BORDER_PLOT) + PlotBorderChar(w1+ch,x-x0,y-y0); + else + PlotWindowChar(w1+ch,x-x0,y-y0); + } + if (find_cur_entry) { + d2=LtfCharDist(l,x,y); + if (d2cl->len) k=cl->len-i; + for (j=0;jflags & LTFLF_BORDER_PLOT) + PlotBorderChar(w1+ch,x-x0,y-y0); + else + PlotWindowChar(w1+ch,x-x0,y-y0); + } + if (find_cur_entry) { + d2=LtfCharDist(l,x,y); + if (d2display-k)*12; + for (j=0;jflags & LTFLF_BORDER_PLOT) + PlotBorderChar(w1+ch,x-x0,y-y0); + else + PlotWindowChar(w1+ch,x-x0,y-y0); + } + if (find_cur_entry) { + d2=LtfCharDist(l,x,y); + if (d2display*12+k<<2+36; + } + break; + case LTFT_TAB: + i=(x+32) & -0x20; + if (cl->flags & LTFLF_BORDER_PLOT) { + while (xtext_attribute<<8 & 0xF00; + } + if (l->left_margin==LTF_DEFAULT) + x=l->indent; + else + x=l->indent+l->left_margin; + y++; + l->page_line_num++; + if (l->footer==LTF_DEFAULT) { + if (l->page_line_num>=l->page_length) { + if (l->header==LTF_DEFAULT) + l->page_line_num=0; + else { + l->page_line_num=l->header; + y+=l->header; + } + } + } else { + if (l->page_line_num>=l->page_length-l->footer) { + y+=l->footer; + if (l->header==LTF_DEFAULT) + l->page_line_num=0; + else { + l->page_line_num=l->header; + y+=l->header; + } + } + } + break; + case LTFT_CURSOR_MOVEMENT: + x+=cl->cursor_x_offset<<2; + y+=cl->cursor_y_offset; + if (cl->flags & LTFLF_PAGE_REL_Y) { + if (cl->flags & LTFLF_TOP_Y) + l->page_line_num=0; + else if (cl->flags & LTFLF_BOTTOM_Y) + l->page_line_num=l->page_length; + else if (cl->flags & LTFLF_CENTER_Y) + l->page_line_num=l->page_length>>1; + } //TODO: else + l->page_line_num=(l->page_line_num+ + cl->cursor_y_offset)%l->page_length; + break; + case LTFT_PAGE_BREAK: + x=0; + y+=l->page_length-cl->page_line_num; + l->page_line_num=0; + if (l->header!=LTF_DEFAULT) { + y+=l->header; + l->page_line_num=l->header; + } + break; + case LTFT_INDENT: + if (cl->flags & LTFLF_LEFT_X) + l->indent=cl->attr<<2; + else + l->indent=l->indent+cl->attr<<2; + x=l->indent; + cl->indent=l->indent; + cl->x=0; + if (l->left_margin!=LTF_DEFAULT) { + x+=l->left_margin; + cl->x+=l->left_margin; + } + break; + case LTFT_PAGE_LENGTH: + l->page_length=cl->attr; + break; + case LTFT_LEFT_MARGIN: + l->left_margin=cl->attr<<2; + cl->left_margin=l->left_margin; + left_margin=tss->window_left+l->left_margin; + break; + case LTFT_RIGHT_MARGIN: + l->right_margin=cl->attr<<2; + cl->right_margin=l->right_margin; + right_margin=tss->window_left+l->right_margin; + break; + case LTFT_HEADER: + l->header=cl->attr; + break; + case LTFT_FOOTER: + l->footer=cl->attr; + break; + case LTFT_FOREGROUND_COLOR: + if (cl->attr==LTF_DEFAULT) + w=w & 0xF000 | l->text_attribute<<8 & 0xF00; + else + w=w & 0xF000 | cl->attr<<8; + break; + case LTFT_BACKGROUND_COLOR: + if (cl->attr==LTF_DEFAULT) + w=w & 0xF00 | l->text_attribute<<8 & 0xF000; + else + w=w & 0xF00 | cl->attr<<12; + break; + case LTFT_DEFAULT_FOREGROUND_COLOR: + if (cl->attr==LTF_DEFAULT) + w=w & 0xF000 | l->text_attribute<<8 & 0xF00; + else + w=w & 0xF000 | cl->attr <<8; + l->text_attribute=l->text_attribute & 0xF0 | cl->attr; + break; + case LTFT_DEFAULT_BACKGROUND_COLOR: + if (cl->attr==LTF_DEFAULT) + w=w & 0xF00 | l->text_attribute<<8 & 0xF000; + else + w=w & 0xF00 | cl->attr <<12; + l->text_attribute=l->text_attribute & 0xF | cl->attr<<4; + break; + case LTFT_LINK_FOREGROUND: + l->link_attribute=l->link_attribute & 0xF0 | cl->attr; + break; + case LTFT_LINK_BACKGROUND: + l->link_attribute=l->link_attribute & 0xF | cl->attr<<4; + break; + case LTFT_MACRO_FOREGROUND: + l->macro_attribute=l->macro_attribute & 0xF0 | cl->attr; + break; + case LTFT_MACRO_BACKGROUND: + l->macro_attribute=l->macro_attribute & 0xF | cl->attr<<4; + break; + case LTFT_ANCHOR_FOREGROUND: + l->anchor_attribute=l->anchor_attribute & 0xF0 | cl->attr; + break; + case LTFT_ANCHOR_BACKGROUND: + l->anchor_attribute=l->anchor_attribute & 0xF | cl->attr<<4; + break; + case LTFT_HIDDEN_FOREGROUND: + l->hidden_attribute=l->hidden_attribute & 0xF0 | cl->attr; + break; + case LTFT_HIDDEN_BACKGROUND: + l->hidden_attribute=l->hidden_attribute & 0xF | cl->attr<<4; + break; + case LTFT_TREE_FOREGROUND: + l->tree_attribute=l->tree_attribute & 0xF0 | cl->attr; + break; + case LTFT_TREE_BACKGROUND: + l->tree_attribute=l->tree_attribute & 0xF | cl->attr<<4; + break; + case LTFT_USER_FOREGROUND: + if (cl->attr==LTF_DEFAULT) { + w=w & 0xF000 | l->user_attribute<<8 & 0xF00; + if (y==cursor_y) { + l->cur_entry=cl->next; + l->cur_data_col=l->cur_entry->min_col; + } + } else + l->user_attribute=l->user_attribute & 0xF0 | cl->attr; + break; + case LTFT_USER_BACKGROUND: + if (cl->attr==LTF_DEFAULT) { + w=w & 0xF00 | l->user_attribute<<8 & 0xF000; + if (y==cursor_y) { + l->cur_entry=cl->next; + l->cur_data_col=l->cur_entry->min_col; + } + } else + l->user_attribute=l->user_attribute & 0xF | cl->attr<<4; + break; + case LTFT_WORD_WRAP: + if (cl->attr) + l->flags|=LTFF_WORD_WRAP; + else + l->flags&=~LTFF_WORD_WRAP; + break; + case LTFT_UNDERLINED: + if (cl->attr) + l->flags|=LTFF_UNDERLINED; + else + l->flags&=~LTFF_UNDERLINED; + break; + case LTFT_INVERTED: + if (cl->attr) + l->flags|=LTFF_INVERTED; + else + l->flags&=~LTFF_INVERTED; + break; + case LTFT_BLINK: + if (cl->attr) + l->flags|=LTFF_BLINK; + else + l->flags&=~LTFF_BLINK; + break; + case LTFT_SHIFTED_X: + l->shifted_x=cl->attr; + break; + case LTFT_SHIFTED_Y: + l->shifted_y=cl->attr; + break; + case LTFT_CURSOR: + if (!find_cur_entry && !(l->flags & LTFF_NO_CURSOR)) { + l->cur_entry=cl->next; + l->cur_data_col=l->cur_entry->min_col; + } + del_cl=TRUE; + break; + case LTFT_PICTURE: + if (!cl->bin_data) + cl->bin_data=LtfFindBin(l,cl->bin_num); + if (cl->bin_data) { + GrReset(base); + base->flags&=~(BMF_DONT_DRAW|BMF_LOCATE_NEAREST|BMF_TRANSFORMATION); + if (!to_screen) + base->flags|=BMF_DONT_DRAW; + i=((w1>>12)&0xF)^0xF; + if (w1 & LTFLT_SELECTED) + i^=0xF; + if (w1 & LTFLT_INVERTED) + i^=0xF; + base->color^=i; + if (find_cur_entry) + base->flags|=BMF_LOCATE_NEAREST; + base->nearest_sub_GrElem=0; + base->nearest_dist=MAX_I8; + if (to_screen && (l->cur_GrElem==cl->bin_data->data)) { + base->flags|=BMF_LOCATE_NEAREST; + base->cur_x=ipx; + base->cur_y=ipy; + } else { + base->cur_x=(l->x-x0)>>2*FONT_WIDTH; + base->cur_y=(l->y-y0)*FONT_HEIGHT; + } + base->cur_z=0; + GrElemsPlot(base,(x-x0)>>2*FONT_WIDTH, + (y-y0)*FONT_HEIGHT,0,cl->bin_data->data,i); + if (to_screen && (l->cur_GrElem==cl->bin_data->data)) + l->cur_sub_GrElem=base->nearest_sub_GrElem; + base->flags&=~(BMF_LOCATE_NEAREST|BMF_DONT_DRAW); + D=base->nearest_dist; + col=cl->min_col; + } + break; + case LTFT_BPT: + w=w & 0xF000 | RED<<8; + revert_default_color_eol=TRUE; + break; + case LTFT_SONG: + if (sys_cur_focus_task==tss && to_screen) { + if (StrCmp(cur_song,cl->song)) { + AFree(cur_song); + ResetMusicSettings; + cur_song=ANewString(cl->song); + } + } + Bts(&tss->task_flags,TSSf_HAS_SONG); + break; + case LTFT_CLEAR: + if (recalc && pg_found==cl) { + del_cl=TRUE; + pg_found=FALSE; + } else + next_pg_found=cl; + break; + } + + if (cl->flags & LTFLF_HAS_BORDER) { + if (cl->flags & LTFLF_SOLID_BORDER) + DrawBorder(1,cl->x-x0,x-x0-4,cl->y-y0,y-y0,w1.u1[1],TRUE); + else + DrawBorder(0,cl->x-x0,x-x0-4,cl->y-y0,y-y0,w1.u1[1],TRUE); + } + switch (cl->btype) { + case LTFT_CHECK_BOX: + case LTFT_HIDE_START: + cl->max_col=2; + break; + case LTFT_TREE: + case LTFT_BUTTON: + case LTFT_LINK: + case LTFT_MENU_VALUE: + case LTFT_MACRO: + case LTFT_HIDE_END: + cl->max_col=1; + break; + default: + cl->max_col=(cl->flags & LTFLF_TREE) ? 1:col2; + } + + if (x>l->max_x) l->max_x=x; + if (y>l->max_y) l->max_y=y; + if (Dflags & LTFLF_TREE) { + if (cl->flags & LTFLF_ALIAS) + alias=cl; + else + alias=NULL; + if (cl->flags & LTFLF_COLLAPSED) + tree_collapsed=TRUE; + else + tree_collapsed=FALSE; + cl2=cl->next; + while (cl2!=l && cl2->btype!=LTFT_INDENT && !(cl2->flags & LTFLF_TREE)) + cl2=cl2->next; + if (cl2->btype==LTFT_INDENT) { + i=l->indent; + j=i; + do { + if (tree_collapsed) + cl2->flags|=LTFLF_SKIP; + else + cl2->flags&=~LTFLF_SKIP; + if (alias && cl2==l->cur_entry && Bt(ltf_display_types,cl2->btype)) { + Free(alias->display,mem_tss); + alias->display=MAlloc(StrLen(cl2->display)+4,mem_tss); + alias->display[0]='+'; + alias->display[1]=']'; + alias->display[2]=CH_SPACE; + StrCpy(alias->display+3,cl2->display); + alias->max_col=cl2->max_col+3; + } + if (cl2->btype==LTFT_INDENT) { + if (cl2->flags & LTFLF_LEFT_X) + j=cl2->attr; + else + j+=cl2->attr; + } + cl2=cl2->next; + } while (cl2!=l && j>i); + } + } + if (cl->btype == LTFT_HIDE_START) { + if (cl->flags & LTFLF_ALIAS) + alias=cl; + else + alias=NULL; + cl2=cl->next; + Btr(hide_collapsed,0); + j=1; + AssignBit(hide_collapsed,j,cl->flags & LTFLF_COLLAPSED); + while (cl2!=l && j>0) { + if (Bt(hide_collapsed,j)) + cl2->flags|=LTFLF_SKIP; + else + cl2->flags&=~LTFLF_SKIP; + if (cl2->btype==LTFT_HIDE_START) { + j++; + AssignBit(hide_collapsed,j,cl2->flags & LTFLF_COLLAPSED); + if (Bt(hide_collapsed,j-1)) + Bts(hide_collapsed,j); + } else if (cl2->btype==LTFT_HIDE_END) { + j--; + if (Bt(hide_collapsed,j)) + cl2->flags|=LTFLF_SKIP; + else + cl2->flags&=~LTFLF_SKIP; + } + cl2=cl2->next; + } + } + +skip: + cl2=cl->next; + while (cl2!=l && cl2->flags & LTFLF_SKIP) { +/* + if (cl2==l->cur_entry) { + l->cur_entry=cl2->next; + l->cur_data_col=l->cur_entry->min_col; + } +*/ + cl2->x=x; + cl2->y=y; + cl2->indent=l->indent; + cl2->page_line_num=l->page_line_num; + cl2->left_margin=l->left_margin; + cl2->right_margin=l->right_margin; + cl2->type=w & 0xFF00 | cl2->type & 0xFFFF00FF; + if (l->flags & LTFF_WORD_WRAP) + cl2->flags|=LTFLF_WORD_WRAP; + else + cl2->flags&=~LTFLF_WORD_WRAP; + + if (l->flags & LTFF_UNDERLINED) { + cl2->flags|=LTFLF_UNDERLINED; + w|=LTFLT_UNDERLINED; + } else { + cl2->flags&=~LTFLF_UNDERLINED; + w&=~LTFLT_UNDERLINED; + } + + if (l->flags & LTFF_INVERTED) { + cl2->flags|=LTFLF_INVERTED; + w|=LTFLT_INVERTED; + } else { + cl2->flags&=~LTFLF_INVERTED; + w&=~LTFLT_INVERTED; + } + if (l->flags & LTFF_BLINK) { + cl2->flags|=LTFLF_BLINK; + w|=LTFLT_BLINK; + } else { + cl2->flags&=~LTFLF_BLINK; + w&=~LTFLT_BLINK; + } + cl2=cl2->next; + } + + if (del_cl || pg_found || num_entriesflags & LTFLF_HOLD)) { + if (cl==l->cur_entry) { + l->cur_entry=cl2; + l->cur_data_col=cl2->min_col; + } + if (best_cl==cl) { + best_cl=cl2; + best_col=0; + } + RemQue(cl); + LtfDelEntry(cl,mem_tss); + } + } + num_entries++; + cl=cl2; + } + + //Update header + if (!skipped_update) { + cl->x=x; + cl->y=y; + cl->indent=l->indent; + cl->page_line_num=l->page_line_num; + cl->left_margin=l->left_margin; + cl->right_margin=l->right_margin; + cl->type=w & 0xFF00 | cl->type & 0xFFFF00FF; + if (find_cur_entry) { + D=LtfCharDist(l,x,y); + if (Dflags & LTFF_MIN_SIZE) { + if (tss->window_right!=tss->window_left+l->max_x+4) { + tss->window_right=tss->window_left+l->max_x-l->min_x+4; + Bts(&sys_flags,SYSf_CLEAR_SCREEN_TEXT); + } + if (tss->window_bottom!=tss->window_top+l->max_y+1) { + tss->window_bottom=tss->window_top+l->max_y-l->min_y+1; + Bts(&sys_flags,SYSf_CLEAR_SCREEN_TEXT); + } + } + if (find_cur_entry) { + l->cur_entry=best_cl; + l->cur_data_col=best_col; + } + if ((l->cur_entry->btype)!=LTFT_HEX_EDIT) { + l->y=l->cur_entry->y; + l->x=l->cur_entry->x+l->cur_data_col<<2; + } else { + l->y=l->cur_entry->y+l->cur_data_col/3/l->cur_entry->display; + x=l->cur_data_col%(l->cur_entry->display*3); + i=x/l->cur_entry->display; + l->x=l->cur_entry->x+36; + if (i<2) + l->x+=x>>1*12+(x&1)<<2; + else + l->x+=l->cur_entry->display*12+(x-l->cur_entry->display<<1)<<2; + } + l->line=l->y+1; + l->col=l->x>>2+1; + if (has_cursor) { + if (l->cur_top_line_num+tss->window_bottom-tss->window_top>l->max_y) + l->cur_top_line_num=l->max_y-(tss->window_bottom-tss->window_top); + if (l->cur_top_line_nummin_y) + l->cur_top_line_num=l->min_y; + + if (l->y-l->cur_top_line_num>tss->window_bottom-tss->window_top) + l->cur_top_line_num=l->y-(tss->window_bottom-tss->window_top); + if (l->y-l->cur_top_line_num<0) + l->cur_top_line_num=l->y; + + if (l->line_start_col+tss->window_right-tss->window_left>l->max_x) + l->line_start_col=l->max_x-(tss->window_right-tss->window_left); + if (l->line_start_colmin_x) + l->line_start_col=l->min_x; + + if (l->x-l->line_start_col>tss->window_right-tss->window_left) + l->line_start_col=l->x-(tss->window_right-tss->window_left); + if (l->x-l->line_start_col<0) + l->line_start_col=l->x; + } + if (recalc) + l->recalc_start=NULL; + if (to_screen && has_cursor) { + tss->cursor_vert=l->y-l->cur_top_line_num+tss->window_top; + tss->cursor_hor=l->x-l->line_start_col+tss->window_left; + if (jiffies % (JIFFY_FREQ>>2) > (JIFFY_FREQ>>2)>>1) { + Btr(&Fs->crt_flags,CRTf_CURSOR_ON); + CursorOn; + } + + i=l->max_x-l->min_x+1; + tss->scroll_x=DivI8(MulI8(l->line_start_col-l->min_x, + tss->window_right-tss->window_left+4)+i-1,i)&-4; + + i=l->max_y-l->min_y+1; + tss->scroll_y=DivI8(MulI8(l->cur_top_line_num-l->min_y, + tss->window_bottom-tss->window_top+1)+i-1,i); + + PlotBorderChar(140+(tss->border_attribute<<8), + (tss->window_right-tss->window_left+4),tss->scroll_y); + PlotBorderChar(140+(tss->border_attribute<<8), + tss->scroll_x,(tss->window_bottom-tss->window_top+1)); + } + if (!same_window && extra_processing) { + l->old_window_top=tss->window_top; + l->old_window_bottom=tss->window_bottom; + l->old_window_left=tss->window_left; + l->old_window_right=tss->window_right; + } + GrDel(base); + if (recalc) { + i=num_entries-l->max_entries; + if (i>1024 && !num_del_entries || next_pg_found) + LtfUpdateWindowJoin(l,to_screen,has_cursor,recalc,find_cur_entry,next_pg_found,i); + } +} + +void LtfRemoveSoftCRs(Ltf *l,LtfEntry *cl=NULL) +{ + LtfEntry *cl2,*saved_cl=cl; + BoolU4 old_preempt=Preempt(OFF); + if (!cl) cl=l->dummy.next; + while (cl!=l) { + cl2=cl->next; + if (cl->btype==LTFT_SOFT_CR) { + if (l->cur_entry==cl) { + l->cur_entry=cl2; + l->cur_data_col=l->cur_entry->min_col; + } + RemQue(cl); + LtfDelEntry(cl,l->mem_tss); + } else if (saved_cl && cl->btype==LTFT_CR) + break; + cl=cl2; + } + Preempt(old_preempt); +} + +public void LtfRecalc(Ltf *l) +{ + if (l->recalc_start!=l && l->recalc_start) + LtfRemoveSoftCRs(l,l->recalc_start); + LtfUpdateWindowJoin(l,FALSE,FALSE,TRUE,FALSE); +} +ext[EXT_LTF_RECALC]=&LtfRecalc; + + +public void LtfCenter(Ltf *l) +{ + TssStruct *tss=l->tss; + LtfRecalc(l); + l->cur_top_line_num=l->y-(tss->window_bottom-tss->window_top)>>1; +} + +public void LtfBottom(Ltf *l) +{ + l->cur_entry=l; + l->cur_data_col=0; + l->recalc_start=l; + LtfRecalc(l); +} + +public Ltf *LtfNew() +{ + Ltf *l; + l=MAllocZ(sizeof(Ltf)); + StrCpy(l->filename.name,sys_temp_filename); + l->file_attr=0; + l->find_replace=MAllocZ(sizeof(EditFindTextStruct)); + l->find_replace->scan_forward=1; + l->find_replace->match_case=1; + l->EditPlugIns=Fs->EditPlugIns; + l->dollar_buf_size=84; + l->dollar_buf=MAlloc(l->dollar_buf_size); + l->max_entries=MAX_I4; + l->ww_lines_back=32; + l->tss=Fs; + l->mem_tss=Fs; + LtfReset(l,FALSE,FALSE); + return l; +} + +void ParseLtfFlags(LexStruct *l,U8 *flags,U4 *type) +{ + I8 i; + BoolU4 turn_on; + while (l->token=='+' || l->token=='-') { + turn_on=(l->token=='+'); + if (Lex(l)==TK_IDENT) { + i=MatchSysTextEntry(l->ident,"ST_LTF_FLAGS",MLE_EXACT); + if (i<0) + *type=LTFT_ERROR; + else { + AssignBit(flags,i,turn_on); + if (i==LTFLf_SELECTED) + AssignBit(type,30,turn_on); + else if (i==LTFLf_UNDERLINED) + AssignBit(type,31,turn_on); + else if (i==LTFLf_INVERTED) + AssignBit(type,29,turn_on); + else if (i==LTFLf_BLINK) + AssignBit(type,28,turn_on); + } + Lex(l); //skip flag + } + } +} + +void LtfDefaultFlags(U4 *type,U8 *f1) +{ + switch (*type & 255) {$AN,"default_flags","default_flags"$ + case LTFT_TREE: + *f1=LTFLF_COLLAPSED|LTFLF_TREE; + *type=*type | LTFLT_UNDERLINED; + break; + case LTFT_DATA: + *f1=LTFLF_DATA_IS_PTR | LTFLF_HAS_TERMINATOR | LTFLF_AUX_STRING; + break; + case LTFT_CURSOR_MOVEMENT: + *f1=LTFLF_LEFT_EXP | LTFLF_RIGHT_EXP; + break; + case LTFT_LINK: + *f1=LTFLF_AUX_STRING; + *type=*type | LTFLT_UNDERLINED; + break; + case LTFT_ANCHOR: + *f1=LTFLF_AUX_STRING; + break; + case LTFT_BUTTON: + *f1=LTFLF_ESC | LTFLF_LEFT_EXP | LTFLF_HAS_BORDER; + break; + case LTFT_CHECK_BOX: + *f1=LTFLF_DATA_IS_PTR; + break; + case LTFT_MACRO: + *f1=LTFLF_ESC | LTFLF_LEFT_MACRO; + *type=*type | LTFLT_UNDERLINED; + break; + case LTFT_MENU_VALUE: + *f1=LTFLF_ESC | LTFLF_LEFT_EXP; + *type=*type | LTFLT_UNDERLINED; + break; + case LTFT_HEX_EDIT: + *f1=LTFLF_DATA_IS_PTR | LTFLF_ZERO_BASED; + break; + case LTFT_PICTURE: + *f1=LTFLF_HAS_BIN; + break; + case LTFT_INSERT_BINARY: + case LTFT_INSERT_BINARY_TYPE: + case LTFT_INSERT_BINARY_SIZE: + *f1=LTFLF_HAS_BIN; + break; + case LTFT_HIDE_START: + *f1=LTFLF_COLLAPSED; + *type=*type | LTFLT_UNDERLINED; + break; + case LTFT_SONG: + *f1=LTFLF_LEFT_MACRO; + break; + } +} + +I1 *LtfToPlainText(LtfEntry *ll) +{ + I8 i,j; + U8 type=ll->btype,f1=0,flags; + I1 *buf,*buf2; + + if (ll->btype==LTFT_ERROR) + return NewString(ll->plain_text); + + LtfDefaultFlags(&type,&f1); + + buf=NewString(SysTextSub(ll->btype,"ST_LTF_CMDS")); + flags=ll->flags & ~(LTFLF_WORD_WRAP |LTFLF_UNDERLINED | + LTFLF_INVERTED | LTFLF_BLINK | LTFLF_SKIP); + for (i=0;i<64;i++) + if (Bt(&f1,i)!=Bt(&flags,i)) { + if (Bt(&flags,i)) + buf=Add2String(buf,"+"); + else + buf=Add2String(buf,"-"); + buf=Add2String(buf,SysTextSub(i,"ST_LTF_FLAGS")); + } + + for (i=28;i<32;i++) + if (Bt(&type,i)!=Bt(&ll->type,i)) { + if (Bt(&ll->type,i)) + buf=Add2String(buf,"+"); + else + buf=Add2String(buf,"-"); + switch (i) { + case 28: j=LTFLf_BLINK; break; + case 29: j=LTFLf_INVERTED; break; + case 30: j=LTFLf_SELECTED; break; + case 31: j=LTFLf_UNDERLINED; break; + } + buf=Add2String(buf,SysTextSub(j,"ST_LTF_FLAGS")); + } + buf=Add2String(buf,","); + switch (ll->btype) { + case LTFT_TEXT: + case LTFT_LINK: + case LTFT_ANCHOR: + case LTFT_MENU_VALUE: + case LTFT_BUTTON: + case LTFT_CHECK_BOX: + case LTFT_TREE: + case LTFT_PICTURE: + case LTFT_INSERT_BINARY: + case LTFT_INSERT_BINARY_TYPE: + case LTFT_INSERT_BINARY_SIZE: + case LTFT_SONG: + buf=Add2String(buf,"\""); + if (i==LTFT_CHECK_BOX) { + buf=Add2String(buf,ll->display+4); + } else { + if (ll->flags & LTFLF_TREE) + buf=Add2String(buf,ll->display+3); + else + buf=Add2String(buf,ll->display); + } + buf=Add2String(buf,"\","); + break; + case LTFT_DATA: + buf2=MSPrintF("%s%d,",buf,ll->len); + Free(buf); buf=buf2; + break; + case LTFT_HEX_EDIT: + buf2=MSPrintF("%s%d,",buf,ll->len); + Free(buf); buf=buf2; + buf2=MSPrintF("%s%d,",buf,ll->display); + Free(buf); buf=buf2; + break; + case LTFT_PAGE_LENGTH: + case LTFT_LEFT_MARGIN: + case LTFT_RIGHT_MARGIN: + case LTFT_HEADER: + case LTFT_FOOTER: + case LTFT_INDENT: + case LTFT_FOREGROUND_COLOR: + case LTFT_BACKGROUND_COLOR: + case LTFT_DEFAULT_FOREGROUND_COLOR: + case LTFT_DEFAULT_BACKGROUND_COLOR: + case LTFT_LINK_FOREGROUND: + case LTFT_LINK_BACKGROUND: + case LTFT_MACRO_FOREGROUND: + case LTFT_MACRO_BACKGROUND: + case LTFT_ANCHOR_FOREGROUND: + case LTFT_ANCHOR_BACKGROUND: + case LTFT_HIDDEN_FOREGROUND: + case LTFT_HIDDEN_BACKGROUND: + case LTFT_TREE_FOREGROUND: + case LTFT_TREE_BACKGROUND: + case LTFT_USER_FOREGROUND: + case LTFT_USER_BACKGROUND: + case LTFT_WORD_WRAP: + case LTFT_UNDERLINED: + case LTFT_INVERTED: + case LTFT_BLINK: + case LTFT_SHIFTED_X: + case LTFT_SHIFTED_Y: + if (ll->attr!=LTF_DEFAULT) { + buf2=MSPrintF("%s%d,",buf,ll->attr); + Free(buf); buf=buf2; + } + break; + } + flags=ll->flags& (LTFLF_SCROLLING_X|LTFLF_SHIFTED_X|LTFLF_SCROLLING_Y| + LTFLF_AUX_STRING|LTFLF_LEFT_EXP|LTFLF_LEFT_MACRO| + LTFLF_HAS_BIN|LTFLF_RIGHT_EXP|LTFLF_RIGHT_MACRO); + while (flags) { + j=Bsf(flags); + Btr(&flags,j); + switch (j) { + case LTFLf_SCROLLING_X: + buf2=MSPrintF("%s%d",buf,ll->scroll_len); + Free(buf); buf=buf2; + break; + case LTFLf_SHIFTED_X: + j=(ll->type.u2[1])&0x1F; + if (j&0x10) j|=0xFFFFFFF0; + buf2=MSPrintF("%s%d",buf,j); + Free(buf); buf=buf2; + break; + case LTFLf_SHIFTED_Y: + j=(ll->type>>21)&0x1F; + if (j&0x10) j|=0xFFFFFFF0; + buf2=MSPrintF("%s%d",buf,j); + Free(buf); buf=buf2; + break; + case LTFLf_AUX_STRING: + buf2=MSPrintF("%s\"%Q\"",buf,ll->aux_string); + Free(buf); buf=buf2; + break; + case LTFLf_LEFT_EXP: + buf2=MSPrintF("%s%d",buf,ll->left_exp); + Free(buf); buf=buf2; + break; + case LTFLf_LEFT_MACRO: + buf2=MSPrintF("%s\"%Q\"",buf,ll->left_macro); + Free(buf); buf=buf2; + break; + case LTFLf_RIGHT_EXP: + buf2=MSPrintF("%s%d",buf,ll->right_exp); + Free(buf); buf=buf2; + break; + case LTFLf_RIGHT_MACRO: + buf2=MSPrintF("%s\"%Q\"",buf,ll->right_macro); + Free(buf); buf=buf2; + break; + case LTFLf_HAS_BIN: + buf2=MSPrintF("%s%d",buf,ll->bin_num); + Free(buf); buf=buf2; + break; + } + buf=Add2String(buf,","); + } + buf[StrLen(buf)-1]=0; //Kill last comma + buf2=NewString(buf); //exact allocation + Free(buf); + return buf2; +} + + +LtfEntry *ParseDollarCmd(I1 *st,TssStruct *tss) +{ + I8 i,j,size,flags; + I1 *ptr; + LtfEntry *ll=NULL; + LexStruct *l=LexNew(st,LF_DONT_FREE_BUFFER,NULL); + Lex(l); + if (l->token==TK_IDENT) { + i=MatchSysTextEntry(l->ident,"ST_LTF_CMDS",MLE_IGNORE_CASE); + if (i<0) + i=LTFT_ERROR; + Lex(l); //skip cmd code + ll=MAllocZ(sizeof(LtfEntry),tss); + ll->type=i; + ll->plain_text=NewString(st,tss); + LtfDefaultFlags(&ll->type,&ll->flags); + ParseLtfFlags(l,&ll->flags,&ll->type); + + if (l->token==',') + Lex(l); + switch (i) { + case LTFT_TEXT: + case LTFT_LINK: + case LTFT_ANCHOR: + case LTFT_MENU_VALUE: + case LTFT_BUTTON: + case LTFT_CHECK_BOX: + case LTFT_TREE: + case LTFT_PICTURE: + case LTFT_INSERT_BINARY: + case LTFT_INSERT_BINARY_TYPE: + case LTFT_INSERT_BINARY_SIZE: + case LTFT_SONG: + if (l->token==TK_STRING) { + st=LexExtendString(l,&size); + if (i==LTFT_CHECK_BOX) { + ll->display=MSPrintF("[X] %s",st); + ll->min_col=1; + } else { + if (ll->flags & LTFLF_TREE) { + ll->display=MSPrintF("+] %s",st); + ll->min_col=1; + } else + ll->display=st; + } + } else { + if (i>=LTFT_PICTURE && i<=LTFT_INSERT_BINARY_SIZE || + i==LTFT_SONG) + ll->display=NewString(""); + else { + ll->display=0; + ll->type=LTFT_ERROR; + } + } + break; + case LTFT_HIDE_START: + ll->display=NewString("<-"); + ll->min_col=1; + break; + case LTFT_HIDE_END: + ll->display=NewString(">"); + break; + case LTFT_DATA: + ll->flags|=LTFLF_AUX_STRING; //don't allow switched off + ll->len=Expression(l); + break; + case LTFT_HEX_EDIT: + ll->len=Expression(l); + if (l->token==',') + Lex(l); + ll->display=Expression(l); //TODO union + break; + case LTFT_PAGE_LENGTH: + case LTFT_LEFT_MARGIN: + case LTFT_RIGHT_MARGIN: + case LTFT_HEADER: + case LTFT_FOOTER: + case LTFT_INDENT: + case LTFT_FOREGROUND_COLOR: + case LTFT_BACKGROUND_COLOR: + case LTFT_DEFAULT_FOREGROUND_COLOR: + case LTFT_DEFAULT_BACKGROUND_COLOR: + case LTFT_LINK_FOREGROUND: + case LTFT_LINK_BACKGROUND: + case LTFT_MACRO_FOREGROUND: + case LTFT_MACRO_BACKGROUND: + case LTFT_ANCHOR_FOREGROUND: + case LTFT_ANCHOR_BACKGROUND: + case LTFT_HIDDEN_FOREGROUND: + case LTFT_HIDDEN_BACKGROUND: + case LTFT_TREE_FOREGROUND: + case LTFT_TREE_BACKGROUND: + case LTFT_USER_FOREGROUND: + case LTFT_USER_BACKGROUND: + case LTFT_WORD_WRAP: + case LTFT_UNDERLINED: + case LTFT_INVERTED: + case LTFT_BLINK: + case LTFT_SHIFTED_X: + case LTFT_SHIFTED_Y: + if (!l->token) + ll->attr=LTF_DEFAULT; + else + ll->attr=Expression(l); + break; + case LTFT_ERROR: + ll->flags=0; + ll->type=LTFT_ERROR; + break; + } + + flags=ll->flags& (LTFLF_SCROLLING_X|LTFLF_SHIFTED_X|LTFLF_SCROLLING_Y| + LTFLF_AUX_STRING|LTFLF_LEFT_EXP|LTFLF_LEFT_MACRO| + LTFLF_HAS_BIN|LTFLF_RIGHT_EXP|LTFLF_RIGHT_MACRO); + while (flags) { + j=Bsf(flags); + Btr(&flags,j); + while (l->token==',') + Lex(l); + switch (j) { //TODO: Might check for expression errors + case LTFLf_SCROLLING_X: + ll->scroll_len=Expression(l); + break; + case LTFLf_SHIFTED_X: + ll->type|=((Expression(l) & 0x1F)<<16); + break; + case LTFLf_SHIFTED_Y: + ll->type|=((Expression(l) & 0x1F)<<21); + break; + case LTFLf_AUX_STRING: + if (l->token==TK_STRING) { + ll->aux_string=LexExtendString(l,&size); + if (i==LTFT_MACRO && !ll->display) + ll->display=NewString(ll->aux_string,tss); + if (i==LTFT_DATA) { + if (ptr=StrStr(ll->aux_string,":")) + ll->min_col=ptr-ll->aux_string+1; + ll->display=MAlloc(ll->len+ll->min_col+2,tss); + } + } else + ll->type=LTFT_ERROR; + break; + case LTFLf_LEFT_EXP: + ll->left_exp=Expression(l); + break; + case LTFLf_LEFT_MACRO: + if (l->token==TK_STRING) { + ll->left_macro=LexExtendString(l,&size); + if (i==LTFT_MACRO && !ll->display) + ll->display=NewString(ll->left_macro,tss); + } else + ll->type=LTFT_ERROR; + break; + case LTFLf_RIGHT_EXP: + ll->right_exp=Expression(l); + break; + case LTFLf_RIGHT_MACRO: + if (l->token==TK_STRING) { + ll->right_macro=LexExtendString(l,&size); + if (i==LTFT_MACRO && !ll->display) + ll->display=NewString(ll->right_macro,tss); + } else + ll->type=LTFT_ERROR; + break; + case LTFLf_HAS_BIN: + if (!l->token) + ll->bin_num=0; + else + ll->bin_num=Expression(l); + break; + } + } + } else if (!ll) { + ll=MAllocZ(sizeof(LtfEntry),tss); + ll->type=LTFT_ERROR; + ll->plain_text=NewString(st,tss); + } + LexDel(l); + return ll; +} + +void LtfInsert(Ltf *l,LtfEntry *ll) +{ + I1 *dst; + LtfEntry *cl=l->cur_entry,*nl; + + ll->x=cl->x; + ll->y=cl->y; + ll->indent=cl->indent; + ll->page_line_num=cl->page_line_num; + ll->left_margin=cl->left_margin; + ll->right_margin=cl->right_margin; + if (l->cur_data_col>0 && + cl->btype==LTFT_TEXT && + l->cur_data_colmax_col) { + nl=MAllocZ(sizeof(LtfEntryBase)+4,l->mem_tss); + nl->type=LTFT_TEXT|cl->type&-0x100; + nl->x=cl->x; + nl->y=cl->y; + nl->indent=cl->indent; + nl->page_line_num=cl->page_line_num; + nl->left_margin=cl->left_margin; + nl->right_margin=cl->right_margin; + nl->flags=cl->flags; + dst=cl->display+l->cur_data_col; + nl->display=NewString(dst,l->mem_tss); + *dst=0; + cl->max_col=l->cur_data_col; + InsQue(nl,cl); + l->cur_data_col=0; + cl=nl; + cl->max_col=StrLen(cl->display); + } + if (cl->btype==LTFT_TEXT && l->cur_data_col>=cl->max_col) { + InsQue(ll,cl); + l->cur_entry=ll->next; + } else { + InsQue(ll,cl->last); + l->cur_entry=cl; + } + l->cur_data_col=l->cur_entry->min_col; + LtfRemoveSoftCRs(l,l->cur_entry); +} + + +public LtfEntry *LtfPutS(Ltf *l,I1 *st) +{ + I1 ch,*ptr=st,*ptr2,*st2,*ptr3,*ptr4,*src; + BoolU4 old_preempt=Preempt(OFF); + LtfEntry *ll=NULL,*result=NULL,*cl=l->cur_entry; + l->recalc_start=l; //TODO:This might be optimized + if (!st) { + Preempt(old_preempt); + return NULL; + } + while (*ptr) { + ptr2=ptr; + ch=*ptr++; + while (TRUE) { + if (l->flags & LTFF_PLAIN_TEXT_WITH_TABS) + while (ch && ch!=CH_CR && ch!=CH_LINE_FEED && ch!=CH_CURSOR) + ch=*ptr++; + else if (l->flags & LTFF_PLAIN_TEXT) + while (ch && ch!=CH_CR && ch!=CH_LINE_FEED && ch!=CH_TAB && ch!=CH_CURSOR && ch!=CH_FORM_FEED) + ch=*ptr++; + else + while (ch && ch!=CH_CR && ch!=CH_LINE_FEED && ch!=CH_TAB && ch!=CH_CURSOR && ch!=CH_FORM_FEED && ch!='$$') + ch=*ptr++; + if (ch==CH_CURSOR) { + if (l->flags & LTFF_NO_CURSOR) + ch=*ptr++; + else + break; + } else + break; + } + ptr--; + if (!ch) { + if (ptr!=ptr2) { + ll=MAllocZ(sizeof(LtfEntryBase)+4,l->mem_tss); + ll->type=LTFT_TEXT | l->text_attribute << 8; + if (l->flags & LTFF_NO_CURSOR) { + src=NewString(ptr2); + StringUtil(src,SU_REMOVE_CTRL_CHARS); + } else + src=ptr2; + ll->display=NewString(src,l->mem_tss); + ll->max_col=StrLen(src); + LtfInsert(l,ll); + if (l->flags & LTFF_NO_CURSOR) + Free(src); + } + } else { + if (ptr!=ptr2) { + *ptr=0; + ll=MAllocZ(sizeof(LtfEntryBase)+4,l->mem_tss); + ll->type=LTFT_TEXT | l->text_attribute << 8; + if (l->flags & LTFF_NO_CURSOR) { + src=NewString(ptr2); + StringUtil(src,SU_REMOVE_CTRL_CHARS); + } else + src=ptr2; + ll->display=NewString(src,l->mem_tss); + ll->max_col=StrLen(src); + LtfInsert(l,ll); + if (l->flags & LTFF_NO_CURSOR) + Free(src); + *ptr=ch; + } + if (ch==CH_CURSOR) { //cursor + ll=MAllocZ(sizeof(LtfEntryBase),l->mem_tss); + ll->type=LTFT_CURSOR | l->text_attribute << 8; + LtfInsert(l,ll); + ptr++; + } else if (ch==CH_FORM_FEED) { + ll=MAllocZ(sizeof(LtfEntryBase),l->mem_tss); + ll->type=LTFT_PAGE_BREAK | l->text_attribute << 8; + LtfInsert(l,ll); + ptr++; + } else if (ch==CH_TAB) { + ll=MAllocZ(sizeof(LtfEntryBase),l->mem_tss); + ll->type=LTFT_TAB | l->text_attribute << 8; + LtfInsert(l,ll); + ptr++; + } else if (ch=='$$') { + ptr++; //skip first dollar + ptr2=ptr; + while (*ptr && *ptr!='$$') + ptr++; + if (*ptr) { + *ptr=0; //zero second dollar + if (ptr==ptr2) { + ll=MAllocZ(sizeof(LtfEntryBase)+4,l->mem_tss); + ll->type=LTFT_TEXT | l->text_attribute << 8; + ll->max_col=1; + if (l->flags & LTFF_DOUBLE_DOLLARS) + ll->display=NewString("$$$$",l->mem_tss); + else + ll->display=NewString("$$",l->mem_tss); + LtfInsert(l,ll); + } else { + st2=MAlloc(ptr-ptr2+1); + ptr3=ptr2; + ptr4=st2; + while (*ptr3) { + ch=*ptr3++; + if (ch==CH_CURSOR) { + ll=MAllocZ(sizeof(LtfEntryBase),l->mem_tss); + ll->type=LTFT_CURSOR | l->text_attribute << 8; + LtfInsert(l,ll); + } else if (ch==CH_FORM_FEED) { + ll=MAllocZ(sizeof(LtfEntryBase),l->mem_tss); + ll->type=LTFT_PAGE_BREAK | l->text_attribute << 8; + LtfInsert(l,ll); + } else + *ptr4++=ch; + } + *ptr4=0; + if (ll=ParseDollarCmd(st2,l->mem_tss)) { + result=ll; + LtfInsert(l,ll); + } + Free(st2); + } + *ptr++='$$'; + } + } else { + ll=MAllocZ(sizeof(LtfEntryBase),l->mem_tss); + ll->type=LTFT_CR | l->text_attribute << 8; + LtfInsert(l,ll); + if (ch==CH_CR) + while (*ptr==CH_CR) + ptr++; + if (*ptr==CH_LINE_FEED) + ptr++; + while (*ptr==CH_CR) + ptr++; + } + } + } + Preempt(old_preempt); + return result; +} + + +public LtfEntry *LtfPrintF(Ltf *l,I1 *src,...) +{ + LtfEntry *result; + I1 *buf=SPrintFJoin(NULL,src,argc,argv); + result=LtfPutS(l,buf); + Free(buf); + return result; +} + +public void LtfSetMax(U8 i) +{ + Ltf *l=Fs->cur_ltf; + l->max_entries=i; +} + +public void LtfSafeInsert(Ltf *l,I1 *st) +{ //This is necessary when hidden text might screw-up + //inserts. It does them all-at-once. + BoolU4 old_preempt=Preempt(OFF); + U8 old_flags=l->flags; + l->flags|=LTFF_NO_CURSOR; + LtfPutS(l,st); + LtfRecalc(l); + l->flags=old_flags; + Preempt(old_preempt); +} + +public void Type(I1 *name) +{ + Ltf *l=LtfRead(name); + EditInsertLtf(Fs->cur_ltf,l); + LtfDel(l); +} + +sys_clipboard_ltf=LtfNew; diff --git a/LT/ADAM/MATH.CPZ b/LT/ADAM/MATH.CPZ new file mode 100644 index 0000000..6f5a05a --- /dev/null +++ b/LT/ADAM/MATH.CPZ @@ -0,0 +1,72 @@ +public double Abs(double i) +{ + if (i<0) + return -i; + else + return i; +} + +public double Sign(double i) +{ + if (i<0) + return -1.0; + else if (!i) + return 0.0; + else + return 1.0; +} + +public double Sqr(double d) +{ + return d*d; +} + +public void R2P(double *mag,double *arg,double x,double y) +{ //Rect to polar + *arg=Arg(x,y); + *mag=Sqrt(x*x+y*y); +} + +public void P2R(double *x,double *y,double mag,double arg) +{ //Polar to Rect + *x=mag*Cos(arg); + *y=mag*Sin(arg); +} + +public double Unwrap(double theta,double base=-pi) +{ + double result=theta%pi2; + if (resultbase+pi2) result-=pi2; + return result; +} + + +public I8 AbsI8(I8 i) +{ + if (i<0) + return -i; + else + return i; +} + +public I8 SignI8(I8 i) +{ + if (i<0) + return -1; + else if (!i) + return 0; + else + return 1; +} + +public I8 SqrI8(I8 i) +{ + return MulI8(i,i); +} + +public I8 DistI8(I8 x1,I8 y1,I8 x2,I8 y2) +{ + I8 dx=x1-x2,dy=y1-y2; + return MulI8(dx,dx)+MulI8(dy,dy); +} diff --git a/LT/ADAM/MOUSE.CPZ b/LT/ADAM/MOUSE.CPZ new file mode 100644 index 0000000..0a61ce8 --- /dev/null +++ b/LT/ADAM/MOUSE.CPZ @@ -0,0 +1,189 @@ +I8 mxx=grwidth>>1, + myy=grheight>>1, + mzz=0; +BoolU4 mouse_buttons[5]; +U8 last_mouse_jiffy=0; + +BoolU4 mouse_installed=FALSE; +BoolU4 mouse_has_wheel=FALSE; +BoolU4 mouse_has_ext_buttons=FALSE; +BoolU4 mouse_evt=FALSE; +BoolU4 mouse_irqs_working=FALSE; +U8 mouse_evt_time; + + +void MouseGetDeviceType() +{ + U1 b; + KbdMouseCmdAck(0xF2); + b=KbdCmdRead; + if (b==3) + mouse_has_wheel=TRUE; + else if (b==4) + mouse_has_ext_buttons=TRUE; +} + +void MouseReset() +{ + KbdCmdFlush; + KbdCmdSend(KEYB_CTRL,0xA8); //Enable Mouse + KbdCmdFlush; + KbdCmdSend(KEYB_CTRL,0xA9); //check for mouse + KbdCmdFlush; + + KbdMouseCmdAck(0xFF); //Reset + KbdCmdRead; + KbdCmdRead; + KbdMouseCmdAck(0xFF); //Reset + KbdCmdRead; + KbdCmdRead; + KbdMouseCmdAck(0xF3); + KbdMouseCmdAck(200); + KbdMouseCmdAck(0xF3); // enable Mouse + KbdMouseCmdAck(100); // Set Rate + KbdMouseCmdAck(0xF3); + KbdMouseCmdAck(80); //Resolution + MouseGetDeviceType; // enable Mouse + + KbdMouseCmdAck(0xF3); + KbdMouseCmdAck(10); + MouseGetDeviceType; // enable Mouse + + KbdMouseCmdAck(0xE8); //Resolution + KbdMouseCmdAck(0x03); + KbdMouseCmdAck(0xE6); + + KbdMouseCmdAck(0xF3); // Set Rate +//if your mouse doesn't work, try this +// KbdMouseCmdAck(40); + KbdMouseCmdAck(100); + + KbdMouseCmdAck(0xF4); // enable Mouse +} + + +void MouseHandler() +{ + I8 i,j,dx,dy,dz, + old_mxx=mxx,old_myy=myy,old_mzz=mzz; + BoolU4 evt=FALSE,old_buttons[5]; + U1 mouse_buf[4]; + U8 evt_time=BootTime; + + try { + for (i=0;i<5;i++) + old_buttons[i]=mouse_buttons[i]; + for (i=0;i<3;i++) { + j=KbdCmdRead; + if (j<0) + throw; + else + mouse_buf[i]=j; + } + if (mouse_has_wheel || mouse_has_ext_buttons) { + j=KbdCmdRead; + if (j<0) + throw; + else + mouse_buf[3]=j; + } else + mouse_buf[3]=0; + Sti; + mouse_buttons[0] = mouse_buf[0] & 1; + mouse_buttons[1] = (mouse_buf[0] & 2) >> 1; + mouse_buttons[2] = (mouse_buf[0] & 4) >> 2; + mouse_buttons[3] = (mouse_buf[3] & 0x10) >> 4; + mouse_buttons[4] = (mouse_buf[3] & 0x20) >> 5; + if (mouse_buf[0] & 0x10) + dx=mouse_buf[1]-256; + else + dx=mouse_buf[1]; + if (mouse_buf[0] & 0x20) + dy=256-mouse_buf[2]; + else + dy=-mouse_buf[2]; + if (mouse_buf[3] & 0x08) + dz=(mouse_buf[3]&7)-8; + else + dz=mouse_buf[3]&7; + + mxx+=dx; + myy+=dy; + mzz+=dz; + + if (mxx < 0) mxx=0; + if (mxx>=grwidth) mxx=grwidth-1; + if (myy < 0) myy=0; + if (myy>=grheight) myy=grheight-1; + } catch { + Fs->catch_except=TRUE; + KbdCmdFlush; + } + for (i=0;i<5;i++) + if (old_buttons[i]!=mouse_buttons[i]) + evt=TRUE; + if (old_mxx!=mxx || old_myy!=myy || old_mzz!=mzz) + evt=TRUE; + if (evt) { + mouse_evt_time=evt_time; + last_mouse_jiffy=jiffies; + mouse_evt=TRUE; + } +} + +void MouseIrqHandler() +{ + mouse_irqs_working=TRUE; + MouseHandler; +} + + +void PollMouse() +{ //I can't get IRQ's working on some computers + U8 old_flags=GetFlags; + if (mouse_irqs_working) return; + +// Cli; + if (!Bt(&sys_irq_flags,1)) {//not in keybd IRQ + if (InP(KEYB_CTRL) & 1) { + KbdCmdSend(KEYB_CTRL,0x60); + KbdCmdSend(KEYB_PORT,0x51); //disable kbd + + MouseHandler; + + KbdCmdSend(KEYB_CTRL,0x60); + KbdCmdSend(KEYB_PORT,0x41); //enable kbd + } + } + SetFlags(old_flags); +} + + +BoolU4 InstallMouseDriver() +{ + BoolU4 result; + I8 i; +// U8 old_flags=GetFlags; +// Cli; + ext[EXT_IRQ0C]=NULL; + mouse_evt=FALSE; + for(i=0;i<5;i++) + mouse_buttons[i]=0; + mouse_has_wheel=FALSE; + mouse_has_ext_buttons=FALSE; + try { + MouseReset; + result=TRUE; + mouse_evt=TRUE; + ext[EXT_IRQ0C]=&MouseIrqHandler; + } catch { + Fs->catch_except=TRUE; + result=FALSE; + } + mouse_installed=result; +// SetFlags(old_flags); + return result; +} + + +Spawn(&InstallMouseDriver); diff --git a/LT/ADAM/MUSIC.CPZ b/LT/ADAM/MUSIC.CPZ new file mode 100644 index 0000000..9d40156 --- /dev/null +++ b/LT/ADAM/MUSIC.CPZ @@ -0,0 +1,82 @@ +I1 *cur_song=NULL; +TssStruct *cur_song_tss=NULL; +U8 music_octive; +double music_note_len; +U1 music_note_map[7]={0,2,3,5,7,8,10}; + +public double music_tempo,music_stacatto_factor=1.0; + +I1 *MusicSetOctive(I1 *st) +{ + I1 ch=*st++; + while (ch>='0' && ch<='9') { + music_octive=ch-'0'; + ch=*st++; + } + return --st; +} + +I1 *MusicSetNoteLen(I1 *st) +{ + BoolU4 cont=TRUE; + do { + switch (*st++) { + case 'w': music_note_len=4.0; break; + case 'h': music_note_len=2.0; break; + case 'q': music_note_len=1.0; break; + case 'e': music_note_len=0.5; break; + case 's': music_note_len=0.25; break; + case 't': music_note_len=2.0*music_note_len/3.0; break; + case '.': music_note_len=1.5*music_note_len; break; + default: + st--; + cont=FALSE; + } + } while (cont); + return st; +} + +public void Play(I1 *st,I1 *words=NULL) +{ + I1 *word; + U8 note,i=0; + double f; + while (*st) { + st=MusicSetOctive(st); + st=MusicSetNoteLen(st); + st=MusicSetOctive(st); + if (!*st) break; + note=*st++-'A'; + if (note<7) { + note=music_note_map[note]; + if (*st=='b') { + note--; + st++; + } else if (*st=='#') { + note++; + st++; + } + f=2.0`(6+music_octive+(note-3)/12.0); + } else + f=0; + if (words) { + if (word=PointAtListEntry(i++,words)) + if (StrCmp(word," ")) + PutS(word); + } + Sound(f); + Sleep(1000*music_stacatto_factor*music_note_len/music_tempo); + Sound(0); + Sleep(1000*(1.0-music_stacatto_factor)*music_note_len/music_tempo); + } +} + +void ResetMusicSettings() +{ + music_stacatto_factor=1.0; + music_tempo=2.5; + music_octive=3; + music_note_len=1.0; +} + +ResetMusicSettings; \ No newline at end of file diff --git a/LT/ADAM/ODE.CPZ b/LT/ADAM/ODE.CPZ new file mode 100644 index 0000000..aee49ba --- /dev/null +++ b/LT/ADAM/ODE.CPZ @@ -0,0 +1,171 @@ +//This is taken from the book, $UL,1$Numeric Recipies in C$UL,0$ + +Ode *OdeNew(U8 n) +{ + Ode *o=MAllocZ(sizeof(Ode)); + o->n=n; + o->state=MAllocZ(n*sizeof(double)); + o->base_t=ReadSysTimer*1.0/SYS_TIMER_FREQ; + o->h=1.0e-6; + o->DstateDt=MAllocZ(n*sizeof(double)); + o->state_scale=MAllocZ(n*sizeof(double)); + o->initial_state=MAllocZ(n*sizeof(double)); + o->tolerance_start=1.0e-6; + o->temp0=MAllocZ(n*sizeof(double)); + o->temp1=MAllocZ(n*sizeof(double)); + o->temp2=MAllocZ(n*sizeof(double)); + o->temp3=MAllocZ(n*sizeof(double)); + o->temp4=MAllocZ(n*sizeof(double)); + o->temp5=MAllocZ(n*sizeof(double)); + o->temp6=MAllocZ(n*sizeof(double)); + o->temp7=MAllocZ(n*sizeof(double)); + return o; +} + +void OdeDel(Ode *o) +{ + Free(o->state); + Free(o->DstateDt); + Free(o->state_scale); + Free(o->initial_state); + Free(o->temp0); + Free(o->temp1); + Free(o->temp2); + Free(o->temp3); + Free(o->temp4); + Free(o->temp5); + Free(o->temp6); + Free(o->temp7); + Free(o); +} + +void OdeOneStep(Ode *o) +{ + I8 i; + o->derivative(o,o->t+o->base_t,o->state,o->DstateDt); + for (i=0;in;i++) + o->state[i]+=o->h*o->DstateDt[i]; + o->t+=o->h; +} + +void OdeRK4OneStep(Ode *o) +{ + I8 i,n=o->n; + double xh,hh,h6; + double *dym,*dyt,*yt,*DstateDt; + + dym =o->temp0; + dyt =o->temp1; + yt =o->temp2; + DstateDt=o->temp3; + hh =0.5*o->h; + h6 =o->h / 6.0; + xh =o->t +o->base_t+ hh; + + o->derivative(o,o->t+o->base_t,o->state,o->DstateDt); + for (i=0;istate[i]+hh*DstateDt[i]; + o->derivative(o,xh,yt,dyt); + for (i=0;istate[i]+hh*dyt[i]; + o->derivative(o,xh,yt,dym); + for (i=0;istate[i]+o->h*dym[i]; + dym[i]+=dyt[i]; + } + o->t+=o->h; + o->derivative(o,o->t+o->base_t,yt,dyt); + for (i=0;istate[i]+=h6*(DstateDt[i]+dyt[i]+2.0*dym[i]); +} + + +double ODEa2=0.2, ODEa3=0.3, ODEa4=0.6, ODEa5=1.0, ODEa6=0.875, ODEb21=0.2, + ODEb31=3.0/40.0, ODEb32=9.0/40.0, ODEb41=0.3, ODEb42=-0.9, ODEb43=1.2, + ODEb51=-11.0/54.0, ODEb52=2.5, ODEb53=-70.0/27.0, ODEb54=35.0/27.0, + ODEb61=1631.0/55296.0, ODEb62=175.0/512.0, ODEb63=575.0/13824.0, + ODEb64=44275.0/110592.0, ODEb65=253.0/4096.0, ODEc1=37.0/378.0, + ODEc3=250.0/621.0, ODEc4=125.0/594.0, ODEc6=512.0/1771.0, + ODEdc1=37.0/378.0 -2825.0/27648.0, + ODEdc3=250.0/621.0-18575.0/48384.0, + ODEdc4=125.0/594.0-13525.0/55296.0, + ODEdc5=-277.0/14336.0, + ODEdc6=512.0/1771.0-0.25; + + + +void OdeCashKarp(Ode *o) +{ + I8 i,n=o->n; + double h=o->h,*state=o->state,*DstateDt=o->DstateDt,*ak2,*ak3,*ak4,*ak5,*ak6,*tempstate,*stateerr,*outstate; + + ak2=o->temp0; + ak3=o->temp1; + ak4=o->temp2; + ak5=o->temp3; + ak6=o->temp4; + tempstate=o->temp5; + outstate=o->temp6; + stateerr=o->temp7; + + for (i=0;iderivative(o,o->t+o->base_t+ODEa2*h,tempstate,ak2); + for (i=0;iderivative(o,o->t+o->base_t+ODEa3*h,tempstate,ak3); + for (i=0;iderivative(o,o->t+o->base_t+ODEa4*h,tempstate,ak4); + for (i=0;iderivative(o,o->t+o->base_t+ODEa5*h,tempstate,ak5); + for (i=0;iderivative(o,o->t+o->base_t+ODEa6*h,tempstate,ak6); + for (i=0;itemp6,*stateerr=o->temp7; + while (TRUE) { + OdeCashKarp(o); + errmax=0.0; + for (i=0;in;i++) { + temp=Abs(stateerr[i]/o->state_scale[i]); + if (temp>errmax) + errmax=temp; + } + errmax/=o->tolerance; + if (errmax>1.0 && o->h>1.0e-64) { + temp=o->h*SAFETY*errmax`PSHRNK; + if (temp<0.1*o->h) + o->h*=0.1; + else + o->h=temp; + } else { + o->t+=o->h; + if (errmax>ERRCON) + o->h*=SAFETY*errmax`PGROW; + else + o->h*=5.0; + if (o->h>1.0e32) + o->h=1.0e32; + MemCpy(o->state,tempstate,sizeof(double)*o->n); + break; + } + } +} diff --git a/LT/ADAM/TEST.TXZ b/LT/ADAM/TEST.TXZ new file mode 100644 index 0000000000000000000000000000000000000000..a9263e06d015ff85d0c5982a51350457a86ad179 GIT binary patch literal 5 McmXR(EiPdI00tfb!2kdN literal 0 HcmV?d00001 diff --git a/LT/ADAM/UTILS.CPZ b/LT/ADAM/UTILS.CPZ new file mode 100644 index 0000000..001122b --- /dev/null +++ b/LT/ADAM/UTILS.CPZ @@ -0,0 +1,442 @@ +public void LtfDm(U1 *buf,U8 cnt=0x80) +{ + LtfEntry *ll; + BoolU4 old_preempt=Preempt(OFF); + Ltf *l=Fs->cur_ltf; + ll=LtfPrintF(l,"$$HX -Z %d 16$$",cnt); + ll->data=buf; + l->cur_entry=ll->next; + LtfRecalc(l); + Preempt(old_preempt); +} + +public void LtfD(U1 *buf,U8 cnt=0x80) +{ + LtfEntry *ll; + BoolU4 old_preempt=Preempt(OFF); + Ltf *l=Fs->cur_ltf; + ll=LtfPrintF(l,"$$HX %d 16$$",cnt); + ll->data=buf; + l->cur_entry=ll->next; + LtfRecalc(l); + Preempt(old_preempt); +} + +public U1 *PatchBlk(U8 blk,BoolU4 write=FALSE) +{ + U1 *buf=MAlloc(BLK_SIZE); + + RBlks(Fs->cur_partition,buf,blk,1,TRUE); + LtfD(buf,BLK_SIZE); + if (write) { + coutln "Edit and press ESC to write or ^Q"; + if (View) { + coutln "Write"; + WBlks(Fs->cur_partition,buf,blk,1,TRUE); + } + } + return buf; +} + +public U1 *Patch(U8 c,U8 cnt=0,BoolU4 write=FALSE) +{ + U1 *buf=MAlloc(BLK_SIZE*Fs->cur_partition->spc); + + if (cnt) + c=NextClusterNum(Fs->cur_partition,c,cnt,TRUE); + RClusters(Fs->cur_partition,buf,c,1,TRUE); + coutln "Cluster:",c; + LtfD(buf,BLK_SIZE*Fs->cur_partition->spc); + if (write) { + coutln "Edit and press ESC to write or ^Q"; + if (View) { + coutln "Write"; + WClusters(Fs->cur_partition,buf,c,1,TRUE); + } + } + return buf; +} + + +public U8 UnusedSysMem() +{ + MemBlk *tempm; + U8 i,result=0,old_flags=GetFlags; + Cli; + tempm=mem_free_list; + while (tempm) { + result=result+tempm->pages; + tempm=tempm->next; + } + for (i=0;ipages; + tempm=tempm->next; + } + } + for (i=0;i<32;i++) { + tempm=free_page_hash2[i]; + while (tempm) { + result+=tempm->pages; + tempm=tempm->next; + } + } + SetFlags(old_flags); + return result*PAGE_SIZE; +} + +public U8 TaskAllocatedMem(TssStruct *tss=NULL) +{ + MemBlk *m; + U8 result=0,old_flags=GetFlags; + if (!tss) tss=Fs; + m=tss->next_mem_blk; + Cli; + while (m!=&tss->next_mem_blk) { + result+=m->pages*PAGE_SIZE-sizeof(MemBlk); + m=m->next; + } + SetFlags(old_flags); + return result; +} + +public U8 TaskUnusedAllocatedMem(TssStruct *tss=NULL) +{ + U8 result=0,i,old_flags=GetFlags; + UnusedAllocatedMem *u; + if (!tss) tss=Fs; + Cli; + for (i=0;i>2;i++) { + u=tss->heap_hash[i]; + while (u) { + result+=u->size; + u=u->next; + } + } + u=tss->malloc_free_list; + while (u) { + result+=u->size; + u=u->next; + } + SetFlags(old_flags); + return result; +} + +I8 CompareUamPtrs(UnusedAllocatedMem **e1, + UnusedAllocatedMem **e2) +{ + return *e1-*e2; +} + +I8 CompareUamSize(UnusedAllocatedMem **e1, + UnusedAllocatedMem **e2) +{ + return (*e2)->size-(*e1)->size; +} + + +public void HeapRep(TssStruct *tss=NULL) +{ + I8 i,cnt; + UnusedAllocatedMem *u; + U8 old_flags=GetFlags; + + if (!tss) tss=Fs; + Cli; + for (i=0;i>2;i++) { + cnt=0; + u=tss->heap_hash[i]; + while (u) { + cnt+=u->size; + u=u->next; + } + if (cnt) + PrintF("%03X:%08X\r\n",i<<2,cnt); + } + u=tss->malloc_free_list; + while (u) { + PrintF("%08X\r\n",u->size); + u=u->next; + } + SetFlags(old_flags); +} + +public BoolU4 IsInHeap(U1 *a,TssStruct *tss=NULL) +{ + MemBlk *m; + U8 old_flags=GetFlags; + if (!tss) tss=Fs; + m=tss->next_mem_blk; + Cli; + while (m!=&tss->next_mem_blk) { + if (a>=m && apages*PAGE_SIZE) { + SetFlags(old_flags); + return TRUE; + } + m=m->next; + } + SetFlags(old_flags); + return FALSE; +} + +public BoolU4 HeapChk(TssStruct *tss=NULL) +//This just detects one type of error-- +// when a freed value is not valid. +{ + I8 i; + UnusedAllocatedMem *u; + BoolU4 result=TRUE; + U8 old_flags=GetFlags; + + if (!tss) tss=Fs; + Cli; + for (i=0;i>2;i++) { + u=tss->heap_hash[i]; + while (u) { + if (!IsInHeap(u,tss)) + result=FALSE; + u=u->next; + } + } + u=tss->malloc_free_list; + while (u) { + if (!IsInHeap(u,tss)) + result=FALSE; + u=u->next; + } + SetFlags(old_flags); + return result; +} + + + +//TODO:Crashes +///More of a heap check at the moment +void CollectFreedAllocatedMem(TssStruct *tss=NULL) +{ + I8 i,cnt; +//I8 j; + UnusedAllocatedMem *u,**sort_buf; + U8 old_flags=GetFlags; +// U4 *dd; + + if (!tss) tss=Fs; + Cli; + cnt=0; + for (i=0;i>2;i++) { + u=tss->heap_hash[i]; + while (u) { + cnt++; + u=u->next; + } + } + u=tss->malloc_free_list; + while (u) { + cnt++; + u=u->next; + } + SetFlags(old_flags); + + //We might disturb the Free list and irq's might Free some + sort_buf=MAlloc(((cnt+512)&-0x100)*PTR_SIZE); + + Cli; + cnt=0; + + for (i=0;i>2;i++) { + u=tss->heap_hash[i]; + while (u) { + sort_buf[cnt++]=u; + u=u->next; + } + tss->heap_hash[i]=NULL; + } + + u=tss->malloc_free_list; + while (u) { + sort_buf[cnt++]=u; + u=u->next; + } + tss->malloc_free_list=NULL; + + for (i=0;isize>sort_buf[i+1]) + cout "****"; + coutln sort_buf[i]," ",sort_buf[i]->size; + } +/* + j=0; + for (i=0;isize && + sort_buf[j]->size+sort_buf[i]->sizesize=sort_buf[j]->size+ + sort_buf[i]->size; + else + sort_buf[++j]=sort_buf[i]; + } + if (cnt) { + j++; + QSort(sort_buf,j,PTR_SIZE,&CompareUamSize); + for (i=0;inext=sort_buf[i]->size; + Free(sort_buf[i]+4,tss); + } + } +*/ + Free(sort_buf); +} + +void TaskRepTask(TssStruct *tss,I8 indent) +{ + TssStruct *tss1; + I1 *st,*desc=MSPrintF("%Q",tss->task_descriptor); + st=MSPrintF("$$MA+A,\"%08X\",\"Kill(0x%X);\r\",$$",tss,tss,tss); + PrintF("%*s%s $$TX+SCX,\"%Q...\",16$$ %08X %04X %04X %02X\r\n", + indent,"",st,desc, + TaskAllocatedMem(tss), + tss->task_flags,tss->crt_flags, + ExceptDepth(tss)); + Free(st); + Free(desc); + tss1=tss->next_child_tss; + while (tss1!=tss+&tss->next_child_tss-&tss->next_sibling_tss) { + TaskRepTask(tss1,indent+2); + tss1=tss1->next_sibling_tss; + } +} + +public void TaskRep() +{ + U8 old_flags=GetFlags; + Cli; + TaskRepTask(adam_tss,0); + SetFlags(old_flags); +} + +SysBpt *FindBpt(TssStruct *tss,U1 *a,U8 flags=-1,BoolU4 remove=FALSE) +{//Removes + SysBpt *result=NULL; + U8 old_flags=GetFlags; + SysBpt *tempb,*tempb1,*tempb2; + Cli; + tempb1=&tss->bpt_list; + tempb=tss->bpt_list; + while (tempb) { + tempb2=tempb->next; + if (tempb->address==a && tempb->flags & flags) { + result=tempb; + if (remove) + tempb1->next=tempb2; + else + tempb1=&tempb->next; + } else + tempb1=&tempb->next; + tempb=tempb2; + } + SetFlags(old_flags); + return result; +} + +public BoolU4 SBpt(TssStruct *tss,U1 *a,U8 flags=SBPTF_BPT) //set Bpt +{ + U8 old_flags=GetFlags; + BoolU4 result=TRUE; + SysBpt *tempb; + Cli; + if (!(tempb=FindBpt(tss,a,flags,FALSE))) { + tempb=MAlloc(sizeof(SysBpt),tss); + tempb->address=a; + tempb->b=*a; + tempb->flags=flags; + result=FALSE; + tempb->next=tss->bpt_list; + tss->bpt_list=tempb; + if (tss==Fs) + *a=0xCC; + } + SetFlags(old_flags); + return result; +} + +public BoolU4 RBpt(TssStruct *tss,U1 *a,U8 flags=-1) +{ //remove one Bpt + U8 old_flags=GetFlags; + BoolU4 result=FALSE; + SysBpt *tempb; + Cli; + if (tempb=FindBpt(tss,a,flags,TRUE)) { + result=TRUE; + Free(tempb,tss); + } + SetFlags(old_flags); + return result; +} + +BoolU4 DBpt(TssStruct *tss,U1 *a,U8 flags=-1) //disable one Bpt +{ //used for continuing after a bpt + U8 old_flags=GetFlags; + BoolU4 result=FALSE; + SysBpt *tempb; + Cli; + if (tempb=FindBpt(tss,a,flags,FALSE)) { + Bts(&tempb->flags,SBPTf_DISABLE); + result=TRUE; + } + SetFlags(old_flags); + return result; +} + +public void CBpt(TssStruct *tss,U8 flags=-1) //clear Bpts +{ + U1 *a; + U8 old_flags=GetFlags; + SysBpt *tempb,*tempb1,*tempb2; + Cli; + tempb=tss->bpt_list; + tempb1=&tss->bpt_list; + while (tempb) { + tempb2=tempb->next; + if (tempb->flags & flags) { + a=tempb->address; + if (tss==Fs) + *a=tempb->b; + Free(tempb,tss); + tempb1->next=tempb2; + } else + tempb1=&tempb->next; + tempb=tempb2; + } + SetFlags(old_flags); +} + +public BoolU4 IsTextFile(I1 *filename) +{ + return WildFileNameList(TEXT_FILE_MASK,filename); +} + +public BoolU4 IsSourceFile(I1 *filename) +{ + return WildFileNameList(SOURCE_FILE_MASK,filename); +} + +public BoolU4 IsCFile(I1 *filename) +{ + return WildFileNameList(C_FILE_MASK,filename); +} + +public BoolU4 IsAsmFile(I1 *filename) +{ + return WildFileNameList(ASM_FILE_MASK,filename); +} + + diff --git a/LT/ADAM/WINDOW.CPZ b/LT/ADAM/WINDOW.CPZ new file mode 100644 index 0000000..a93a8f0 --- /dev/null +++ b/LT/ADAM/WINDOW.CPZ @@ -0,0 +1,1043 @@ +GrBitMap *WIN_base=GrNew(grbase2); +TssStruct *update_screen_tss; + +public void DrawBorder(BoolU4 solid,I8 l,I8 r,I8 t,I8 b,U8 attr,BoolU4 clip_to_window) +{ + I8 i; + solid=solid+(attr<<8); + if (clip_to_window) { + PlotWindowChar(132+solid,l-4,t-1); + PlotWindowChar(134+solid,r+4,t-1); + PlotWindowChar(136+solid,l-4,b+1); + PlotWindowChar(138+solid,r+4,b+1); + for (i=l;i<=r;i=i+4) { + PlotWindowChar(130+solid,i,t-1); + PlotWindowChar(130+solid,i,b+1); + } + for (i=t;i<=b;i=i+1) { + PlotWindowChar(128+solid,l-4,i); + PlotWindowChar(128+solid,r+4,i); + } + } else { + PlotScreenChar(132+solid,l-4,t-1); + PlotScreenChar(134+solid,r+4,t-1); + PlotScreenChar(136+solid,l-4,b+1); + PlotScreenChar(138+solid,r+4,b+1); + for (i=l;i<=r;i=i+4) { + PlotScreenChar(130+solid,i,t-1); + PlotScreenChar(130+solid,i,b+1); + } + for (i=t;i<=b;i=i+1) { + PlotScreenChar(128+solid,l-4,i); + PlotScreenChar(128+solid,r+4,i); + } + } +} + +void DrawTaskBorder() +{ + DrawBorder(Fs==sys_cur_focus_task, + Fs->window_left,Fs->window_right, + Fs->window_top,Fs->window_bottom, + Fs->border_attribute,FALSE); +} + + +#define SC_FIFO_SIZE 64 +I8 sc_fifo_in=0,sc_fifo_out=0; +U8 scan_code_fifo[SC_FIFO_SIZE]; +U8 keyboard_evt_time; + +void Irq01Handler() +{ + keyboard_evt_time=BootTime; + if (Btr(&sys_cur_scan_code,SCf_NEW_KEY)) { + Btr(&sys_cur_raw_scan_code,SCf_NEW_KEY); + scan_code_fifo[sc_fifo_in++ & (SC_FIFO_SIZE-1)]=sys_cur_scan_code|sys_cur_raw_scan_code<<32; + } +} +ext[EXT_IRQ01]=&Irq01Handler; + + +public void RefocusWindow() +{ + TssStruct *tss_focus=sys_cur_focus_task; + if (!tss_focus) { + tss_focus=update_screen_tss->last_tss; + while (tss_focus!=update_screen_tss) { + if (Bt(&tss_focus->task_flags,TSSf_LOCAL_USER)) { + sys_cur_focus_task=tss_focus; + break; + } + tss_focus=tss_focus->last_tss; + } + } +} + + +I8 old_ipx=-1000,old_ipy=-1000,old_ipz=0; +BoolU4 old_ip_lb=FALSE,old_ip_rb=FALSE; +U8 left_ip_double_time=0; +BoolU4 left_double=FALSE,left_down_sent=FALSE; +U8 right_ip_double_time=0; +BoolU4 right_double=FALSE,right_down_sent=FALSE; +public U8 double_click_mS=350; + +I8 win_min_refresh=5, + win_max_refresh=75, + win_updates=0; +double win_refresh, + win_refresh_duty_cycle=0.50, + win_average_swap_time; +U8 win_refresh_start,win_refresh_end; + + +void PlotInputPointer() +{ + if (ip_on && ip_pointer_type!=IP_NULL) { + WIN_base->color=ROP_XOR+GR_WHITE; + GrLine4(WIN_base,ipx,ipy,ipx+10,ipy+10); + GrLine4(WIN_base,ipx+2,ipy+1,ipx+11,ipy+10); + GrLine4(WIN_base,ipx+1,ipy+2,ipx+10,ipy+11); + GrLine4(WIN_base,ipx,ipy,ipx+5,ipy); + GrLine4(WIN_base,ipx,ipy,ipx,ipy+5); + } +} + + +void UpdateOdes() +{ + I8 i,timeout_jiffies=jiffies+JIFFY_FREQ/win_min_refresh; + double t_desired=ReadSysTimer*1.0/SYS_TIMER_FREQ, + t_initial,interpolation; + Ode *o=Fs->next_ode; + while (o!=&Fs->next_ode) { + o->tolerance=o->tolerance_start; + o->derivative(o,o->t+o->base_t,o->state,o->DstateDt); + for (i=0;in;i++) + o->state_scale[i]=Abs(o->state[i])+Abs(o->DstateDt[i]*o->h)+1e-4; + t_initial=o->t+o->base_t; + MemCpy(o->initial_state,o->state,o->n*sizeof(double)); + do { + while (o->t+o->base_ttimeout_jiffies) + o->base_t=t_desired-o->t; + } + if (interpolation=(o->t+o->base_t-t_initial)) + interpolation=(t_desired-t_initial)/interpolation; + else + interpolation=1.0; + if (interpolation>.1 || o->tolerance<1e-64) + break; + else { + MemCpy(o->state,o->initial_state,sizeof(double)*o->n); + o->t=t_initial-o->base_t; + o->tolerance/=10; + } + } while (TRUE); + for (i=0;in;i++) + o->state[i]=(o->state[i]-o->initial_state[i])*interpolation+o->initial_state[i]; + o->t=t_desired-o->base_t; + o=o->next; + } +} + +void EndCurSong() +{ + Sound(0); + Exit; +} + +void CurSongTsk() +{ + Fs->end_task_cb=&EndCurSong; + while (TRUE) + Play(cur_song); +} + +U8 WinPointAndSleep() +{ + U8 timeout_jiffies; + I8 p1,p2; + TssStruct *tss_focus=sys_cur_focus_task; + BoolU4 old_preempt=Preempt(OFF); + U8 cmd=0,dd; + LTDate temp,ip_move_time,u; + U8 refresh_time,total_time,new_time; + double average_swap_time; + + new_time=ReadSysTimer; + if (win_updates) { + total_time=new_time-win_refresh_start; + win_refresh=SYS_TIMER_FREQ*1.0/total_time; + refresh_time=win_refresh_end-win_refresh_start; + if (sys_swap_cnter) { + average_swap_time=Exp((new_time-win_refresh_end)*1.0/sys_swap_cnter); + win_refresh_duty_cycle*=win_average_swap_time/average_swap_time; + if (win_refresh_duty_cycle>0.9) + win_refresh_duty_cycle=0.9; + if (win_refresh_duty_cycle<0.1) + win_refresh_duty_cycle=0.1; + win_average_swap_time=average_swap_time; + + win_refresh*=win_refresh_duty_cycle*total_time/refresh_time; + } + if (win_refreshwin_max_refresh) win_refresh=win_max_refresh; + } else //first time + win_refresh=win_min_refresh; + win_refresh_start=new_time; + timeout_jiffies=jiffies+JIFFY_FREQ/win_refresh; + + if (tss_focus) { + while (sc_fifo_in!=sc_fifo_out) { + p2=scan_code_fifo[sc_fifo_out++ & (SC_FIFO_SIZE-1)]; + p1=TranslateScanCode(p2); + if (p2 & SCF_KEY_UP) { + QueueMsg(tss_focus,0, + MSG_KEY_UP,p1,p2,0); + cmd=MSG_KEY_UP; + } else { + QueueMsg(tss_focus,0, + MSG_KEY_DOWN,p1,p2,0); + cmd=MSG_KEY_DOWN; + } + } + + p1=ipx-tss_focus->window_left>>2*FONT_WIDTH; + p2=ipy-tss_focus->window_top*FONT_HEIGHT; + if (old_ipx!=ipx || old_ipy!=ipy) { + QueueMsg(tss_focus,0, + MSG_IP_MOVE,p1,p2,0); + cmd=MSG_IP_MOVE; + } + //TODO queue msg for ipz? + if (left_ip_double_time) { + if (jiffies>left_ip_double_time) { + if (left_double) { + if (!left_down_sent) { + QueueMsg(tss_focus,0, + MSG_IP_L_D_DOWN,p1,p2,0); + left_down_sent=TRUE; + cmd=MSG_IP_L_D_DOWN; + } + if (!ip_lb) { + QueueMsg(tss_focus,0, + MSG_IP_L_D_UP,p1,p2,0); + left_ip_double_time=0; + cmd=MSG_IP_L_D_UP; + } + } else { + if (!left_down_sent) { + QueueMsg(tss_focus,0, + MSG_IP_L_DOWN,p1,p2,0); + left_down_sent=TRUE; + cmd=MSG_IP_L_DOWN; + } + if (!ip_lb) { + QueueMsg(tss_focus,0, + MSG_IP_L_UP,p1,p2,0); + left_ip_double_time=0; + cmd=MSG_IP_L_UP; + } + } + } else { + if (ip_lb && !ip_lb_last) { + left_ip_double_time=jiffies; + left_double=TRUE; + } + } + } else { + if (Bt(&tss_focus->crt_flags,CRTf_NO_DOUBLE_CLICK)) { + if (ip_lb && !ip_lb_last) { + QueueMsg(tss_focus,0, + MSG_IP_L_DOWN,p1,p2,0); + cmd=MSG_IP_L_DOWN; + } else if (!ip_lb && ip_lb_last) { + QueueMsg(tss_focus,0, + MSG_IP_L_UP,p1,p2,0); + cmd=MSG_IP_L_UP; + } + } else { + if (ip_lb && !ip_lb_last) { + left_double=FALSE; + left_down_sent=FALSE; + left_ip_double_time=jiffies+ + double_click_mS*JIFFY_FREQ/1000; + } + } + } + + if (right_ip_double_time) { + if (jiffies>right_ip_double_time) { + if (right_double) { + if (!right_down_sent) { + QueueMsg(tss_focus,0, + MSG_IP_R_D_DOWN,p1,p2,0); + right_down_sent=TRUE; + cmd=MSG_IP_R_D_DOWN; + } + if (!ip_rb) { + QueueMsg(tss_focus,0, + MSG_IP_R_D_UP,p1,p2,0); + right_ip_double_time=0; + cmd=MSG_IP_R_D_UP; + } + } else { + if (!right_down_sent) { + QueueMsg(tss_focus,0, + MSG_IP_R_DOWN,p1,p2,0); + right_down_sent=TRUE; + cmd=MSG_IP_R_DOWN; + } + if (!ip_rb) { + QueueMsg(tss_focus,0, + MSG_IP_R_UP,p1,p2,0); + right_ip_double_time=0; + cmd=MSG_IP_R_UP; + } + } + } else { + if (ip_rb && !ip_rb_last) { + right_ip_double_time=jiffies; + right_double=TRUE; + } + } + } else { + if (Bt(&tss_focus->crt_flags,CRTf_NO_DOUBLE_CLICK)) { + if (ip_rb && !ip_rb_last) { + QueueMsg(tss_focus,0, + MSG_IP_R_DOWN,p1,p2,0); + cmd=MSG_IP_R_DOWN; + } else if (!ip_rb && ip_rb_last) { + QueueMsg(tss_focus,0, + MSG_IP_R_UP,p1,p2,0); + cmd=MSG_IP_R_UP; + } + } else { + if (ip_rb && !ip_rb_last) { + right_double=FALSE; + right_down_sent=FALSE; + right_ip_double_time=jiffies+ + double_click_mS*JIFFY_FREQ/1000; + } + } + } + } else { + RefocusWindow; + if (!sys_cur_focus_task) + sc_fifo_out=sc_fifo_in; + } + ip_lb_last=ip_lb; + ip_rb_last=ip_rb; + old_ip_lb=ip_lb; + old_ip_rb=ip_rb; + old_ipx=ipx; + old_ipy=ipy; + old_ipz=ipz; + if (ip_pointer_type==IP_MOUSE) { + ip_has_wheel=mouse_has_wheel; + PollMouse; //Not all computers IRQ's work + if (mouse_evt) { + ipx=mxx; + ipy=myy; + ipz=mzz; + ip_lb=mouse_buttons[0]; + ip_rb=mouse_buttons[1]; + mouse_evt=FALSE; + } + } else if (ip_pointer_type==IP_JOYSTICK0) { + ip_has_wheel=FALSE; + PollJoystick; + ipx=joycx; + ipy=joycy; + ipz=0; //TODO + ip_lb=joyb[0]; + ip_rb=joyb[1]; + } else if (ip_pointer_type==IP_NULL && mouse_installed) + ip_pointer_type=IP_MOUSE; + + dd=(old_ipx-ipx)*(old_ipx-ipx)+ + (old_ipy-ipy)*(old_ipy-ipy); + if (dd) { + ip_move_time=BootTime; + temp=ip_move_time-last_ip_move_time; + last_ip_move_time=ip_move_time; + ip_speed=Sqrt(dd)/temp*(0x10000*JIFFY_FREQ*SYS_TIMER0_PERIOD); + } + + iptx=(ipx/FONT_WIDTH)<<2; + ipty=ipy/FONT_HEIGHT; + + if (sys_cur_focus_task) + Btr(&sys_cur_focus_task->task_flags,TSSf_HAS_SONG); + + GrUpdateScreen(grbase,grbase2,textbase); + + if (sys_cur_focus_task) { + if (!Bt(&sys_cur_focus_task->task_flags,TSSf_HAS_SONG)) { + AFree(cur_song); + cur_song=NULL; + } + } + if (cur_song) { + if (!cur_song_tss) + cur_song_tss=Spawn(&CurSongTsk); + } else { + if (cur_song_tss) { + Kill(cur_song_tss); + cur_song_tss=NULL; + } + } + + Preempt(old_preempt); + + win_updates++; + win_refresh_end=ReadSysTimer; + sys_swap_cnter=0; + while (jiffiestask_flags,TSSf_INPUT_FILTER_TASK); + old_filter=Bts(&Fs->parent_tss->task_flags,TSSf_FILTER_INPUT); + while (TRUE) { + tempc=Fs->next_servant_cmd; + while (tempc!=&Fs->next_servant_cmd && + !Bt(&tempc->flags,TSSCf_TEXT)) + tempc=tempc->next; + if (tempc!=&Fs->next_servant_cmd) { + RemQue(tempc); + st=tempc->data; + AFree(tempc); + Preempt(ON); + try + ExecuteString(st); + catch + Fs->catch_except=TRUE; + Preempt(OFF); + AFree(st); + } else + break; + } + Fs->parent_tss->input_filter_tss=Fs->input_filter_tss; + if (!old_filter) + Btr(&Fs->parent_tss->task_flags,TSSf_FILTER_INPUT); +} + +U8 MsgJoin(TssCmdStruct **tempc,I8 *param1,I8 *param2,TssStruct *tss=NULL) +{ + U8 result; + TssCmdStruct *tempc1=*tempc; + if (!tss) tss=Fs; + while (tempc1!=&tss->next_servant_cmd && Bt(&tempc1->flags,TSSCf_TEXT)) + tempc1=tempc1->next; + if (tempc1!=&tss->next_servant_cmd) { + *param1=tempc1->p1; + *param2=tempc1->p2; + result=tempc1->code; + tempc1=tempc1->next; + } else { + *param1=0; + *param2=0; + result=0; + } + *tempc=tempc1; + return result; +} + +public U8 PeekMsg(I8 *param1,I8 *param2,U8 mask=-2,TssStruct *tss=NULL) +{ + U8 result; + TssCmdStruct *tempc; + BoolU4 old_preempt=Preempt(OFF); + I8 p1,p2; + if (!tss) tss=Fs; + *param1=0; + *param2=0; + tempc=tss->next_servant_cmd; + while (TRUE) { + result=MsgJoin(&tempc,&p1,&p2,tss); + if (Bt(&mask,result)) { + *param1=p1; + *param2=p2; + break; + } + if (!result) + break; + } + if (!result && tss->parent_tss) { + if (tss->parent_tss->popup_tss==tss) + result=PeekMsg(param1,param2,mask,tss->parent_tss); + } + Preempt(old_preempt); + if (old_preempt) + SwapInNext; + return result; +} + +public U8 GetMsgNoWait(I8 *param1,I8 *param2,U8 mask=-2,TssStruct *tss=NULL) +{ + U8 result,old_flags=GetFlags; + TssCmdStruct *tempc,*tempc1,*tempc2; + I8 p1,p2; + U8 my_GetMsg(LTChnl *chnl,I8 *p1,I8 *p2); + BoolU4 old_preempt,cont; + if (!tss) tss=Fs; + *param1=0; + *param2=0; + + do { + cont=FALSE; + if (tss->rmt_chnl) { + if (jiffies>=tss->rmt_chnl->null_msg_jiffy) { + if (my_GetMsg=ext[EXT_RMT_GETMSG]) { + if (result=my_GetMsg(tss->rmt_chnl,&p1,&p2)) { + if (Bt(&mask,result)) { + *param1=p1; + *param2=p2; + return result; + } else + cont=TRUE; + } + } + } + } + } while (cont); + + old_preempt=Preempt(OFF); + while (TRUE) { + tempc=tss->next_servant_cmd; + tempc1=tempc; + result=MsgJoin(&tempc,&p1,&p2,tss); + while (tempc1!=tempc) { + Cli;//TODO: this would seem to get stuck if a non_input was encntered + if (!Bt(&tempc1->flags,TSSCf_TEXT)) { + tempc2=tempc1->next; + RemQue(tempc1); + AFree(tempc1); + tempc1=tempc2; + } else + tempc1=tempc1->next; + SetFlags(old_flags); + } + if (!result) + break; + if (Bt(&mask,result)) { + *param1=p1; + *param2=p2; + break; + } + } + if (!result && tss->parent_tss) { + if (tss->parent_tss->popup_tss==tss) + result=GetMsgNoWait(param1,param2,mask,tss->parent_tss); + } + Preempt(old_preempt); + if (old_preempt) + SwapInNext; + return result; +} + +public U8 FlushMsgs(TssStruct *tss=NULL) +{ + U8 result=0,p1,p2; + while (GetMsgNoWait(&p1,&p2,tss)) + result++; + return result; +} + +public U8 GetMsg(I8 *param1,I8 *param2,U8 mask=-2,TssStruct *tss=NULL) +{ + U8 result; + if (!tss) tss=Fs; + Bts(&tss->task_flags,TSSf_IDLE); + while (!(result=GetMsgNoWait(param1,param2,mask,tss))) + SwapInNext; + Btr(&tss->task_flags,TSSf_IDLE); + return result; +} + +public BoolU4 WindowToTop(TssStruct *tss) +{ + BoolU4 result=FALSE,old_flags=GetFlags; + TssStruct *next,*last; + //REMOVE + Cli; + if (update_screen_tss->last_tss!=tss) { + next=tss->next_tss; + last=tss->last_tss; + next->last_tss=last; + last->next_tss=next; + AddTaskToQueue(tss,update_screen_tss); + result=TRUE; + } + if (Bt(&tss->task_flags,TSSf_LOCAL_USER)) + sys_cur_focus_task=tss; + SetFlags(old_flags); + return result; +} +ext[EXT_WINDOW_TO_TOP]=&WindowToTop; + +void SetWindowHor(TssStruct *tss,I8 i,I8 j) +{ + I8 d=j-i; + if (d<0) d=0; + if (i>=tss->crt_width) { + i=tss->crt_width-4; + j=i+d; + } + if (j<0) { + j=0; + i=j-d; + } + if (i>j) { + if (i>0) + j=i; + else + i=j; + } + if (tss->window_left!=i || tss->window_right!=j) { + Bts(&tss->crt_flags,CRTf_HAS_BEEN_RESIZED); + Bts(&tss->crt_flags,CRTf_HAS_BEEN_RESIZED2); + } + tss->window_left=i; + tss->window_right=j; +} + +void SetWindowVert(TssStruct *tss,I8 i,I8 j) +{ + I8 d=j-i; + if (d<0) d=0; + if (i>=tss->crt_height) { + i=tss->crt_height-1; + j=i+d; + } + if (j<=0) { + j=1; + i=j-d; + } + if (i>j) { + if (i>=0) + j=i; + else + i=j; + } + if (tss->window_top!=i || tss->window_bottom!=j) { + Bts(&tss->crt_flags,CRTf_HAS_BEEN_RESIZED); + Bts(&tss->crt_flags,CRTf_HAS_BEEN_RESIZED2); + } + tss->window_top=i; + tss->window_bottom=j; +} + +BoolU4 SetCursorPosition(TssStruct *tss,I8 iptx,I8 ipty,BoolU4 set_cursor=TRUE) +{ + Ltf *l; + if (tss->window_top<=ipty && tss->window_bottom>=ipty && + tss->window_left<=iptx && tss->window_right>=iptx) { + if (tss->cur_ltf) { + l=tss->cur_ltf; + if (set_cursor) { + l->x=iptx-tss->window_left+l->line_start_col; + l->y=ipty-tss->window_top+l->cur_top_line_num; + LtfUpdateWindowJoin(l,FALSE,FALSE,FALSE,TRUE); + } + WindowToTop(tss); + return TRUE; + } + WindowToTop(tss); + return TRUE; + } + return FALSE; +} + +void UpdateDerivedTssValues(TssStruct *tss) +{ + tss->window_pixel_left=FONT_WIDTH*tss->window_left>>2; + tss->window_pixel_right=FONT_WIDTH*(tss->window_right+4)>>2-1; + tss->window_pixel_top=FONT_HEIGHT*tss->window_top; + tss->window_pixel_bottom=FONT_HEIGHT*(tss->window_bottom+1)-1; + tss->window_border_pixel_left=tss->window_pixel_left-FONT_WIDTH; + tss->window_border_pixel_right=tss->window_pixel_right+FONT_WIDTH; + tss->window_border_pixel_top=tss->window_pixel_top-FONT_HEIGHT; + tss->window_border_pixel_bottom=tss->window_pixel_bottom+FONT_HEIGHT; +} + +BoolU4 IsPixelCovered(TssStruct *tss,I8 x,I8 y) +{ + if (tss==update_screen_tss) return FALSE; + tss=tss->next_tss; + while (tss!=update_screen_tss) { + if (Bt(&tss->crt_flags,CRTf_SHOW)) { //no I2 circuit logic + if (x>=tss->window_border_pixel_left) { + if (x<=tss->window_border_pixel_right) { + if (y>=tss->window_border_pixel_top) { + if (y<=tss->window_border_pixel_bottom) { + return TRUE; + }}}}} + tss=tss->next_tss; + } + return FALSE; +} + +public void MaximizeWindow() +{ + Fs->window_right=SCREEN_COLS<<2-8; + Fs->window_left=4; + Fs->window_top=2; + Fs->window_bottom=SCREEN_LINES-2; + UpdateDerivedTssValues(Fs); +} + +void WallPaper() +{ + I8 p1,min_stack_size=MAX_I8,l=grheight/FONT_HEIGHT-1,um; + TssStruct *tss; + LTDate ltdt; + I1 buf[256]; + BoolU4 stk_aligned=TRUE; + + um=UnusedSysMem; + ltdt=GetCurTimeLTDate; + SPrintF(buf,"%h2D %h4T Refresh:%4.1f Mem:%08tX" + ltdt.date,ltdt.time,win_refresh,um); + buf[SCREEN_COLS]=0; + if (um>sys_heap_limit) + PlotScreenString(buf,RED,0,0); //Corruption + else + PlotScreenString(buf,WHITE,0,0); + + tss=Fs; + do { + p1=tss->esp-tss->stack_base; + if (tss->esp&3) stk_aligned=FALSE; + if (p1next_tss; + } while (tss!=Fs); + + SPrintF(buf,"Disk:%08tX Stk:%08tX %c compiled_lines=%d", + disk_status_display,min_stack_size,(stk_aligned)?CH_SPACE:'!', + compiled_lines); + buf[SCREEN_COLS]=0; + PlotScreenString(buf,WHITE,0,l--); + + SPrintF(buf,"progress1=%016tX progress2=%016tX", + progress1,progress2); + buf[SCREEN_COLS]=0; + PlotScreenString(buf,WHITE,0,l--); + + SPrintF(buf,"progress3=%016tX progress4=%016tX", + progress3,progress4); + buf[SCREEN_COLS]=0; + PlotScreenString(buf,WHITE,0,l--); +} + + +void WindowManagerTsk() +{ + TssStruct *tss=Fs; + I8 x,y,cmd; + Ltf *l; + LtfEntry *ll; + I8 my_ipz=0; + + Preempt(OFF); + InitCrt; + Fs->window_left=0; + Fs->window_right=Fs->crt_width-4; + Fs->window_top=0; + Fs->window_bottom=Fs->crt_height-1; + UpdateDerivedTssValues(Fs); + Fs->update_window=&WallPaper; + + Bts(&sys_flags,SYSf_CLEAR_SCREEN_TEXT); + Raw(OFF); + while (TRUE) { + UpdateDerivedTssValues(tss); + do { + if (Btr(&sys_flags,SYSf_TASK_LINKS_ALTERED)) + tss=Fs->last_tss; + else + tss=tss->last_tss; + if (tss==Fs) + WinPointAndSleep; + } while (tss==Fs || !Bt(&tss->crt_flags,CRTf_SHOW)); + UpdateDerivedTssValues(tss); + + if (!old_ip_lb && ip_lb && !ip_inhibit_win_operations) { + if (SetCursorPosition(tss,iptx,ipty)) { + if (tss->cur_ltf) { + l=tss->cur_ltf; + ll=l->cur_entry; + if (ll!=l) { + if (ll->btype==LTFT_LINK || + ll->btype==LTFT_CHECK_BOX || + (ll->flags & + (LTFLF_LEFT_CB | LTFLF_LEFT_EXP | LTFLF_LEFT_MACRO))) + ll->flags|=LTFLF_SOLID_BORDER; + } + } + old_ip_lb=TRUE; + } + } + if (old_ip_lb && !ip_lb&& !ip_inhibit_win_operations) { + if (ipty==tss->window_top-1) { + if (iptx>=tss->window_left && iptxwindow_left+16) { + if (Bt(&tss->crt_flags,CRTf_HAS_MENU)) { + QueueMsg(tss,0,MSG_KEY_DOWN,0,SC_GUI,0); + old_ip_lb=FALSE; + } + } else if (iptx>=tss->window_right-8 && iptx<=tss->window_right) { + if (Bt(&tss->crt_flags,CRTf_HAS_CLOSE_WINDOW)) { + if (tss->cur_ltf) + QueueMsg(tss,0,MSG_KEY_DOWN,CH_CTRLQ,0,0); + else + Bts(&tss->task_flags,TSSf_KILL_TASK); + old_ip_lb=FALSE; + } + } + } else if (SetCursorPosition(tss,iptx,ipty,FALSE)) { + if (tss->cur_ltf) { + do cmd=WinPointAndSleep; + while (cmd!=MSG_IP_L_UP && cmd!=MSG_IP_L_D_UP); + if (cmd==MSG_IP_L_UP) { + l=tss->cur_ltf; + ll=l->cur_entry; + if (ll!=l) { + if (ll->btype==LTFT_LINK || ll->btype==LTFT_TREE || + ll->btype==LTFT_CHECK_BOX || ll->flags & LTFLF_TREE || + ll->btype==LTFT_HIDE_START || + (ll->flags & + (LTFLF_LEFT_CB | LTFLF_LEFT_MACRO | LTFLF_LEFT_EXP))) + QueueMsg(tss,0,MSG_KEY_DOWN,CH_SPACE,0,0); + } + } else + QueueMsg(tss,0,MSG_KEY_DOWN,CH_ESC,0,0); + } + old_ip_lb=FALSE; + } + } + + if (ip_has_wheel) { + if (my_ipz!=ipz && tss==sys_cur_focus_task&& !ip_inhibit_win_operations) { + tss->scroll_y+=ipz-my_ipz; + my_ipz=ipz; + if (tss->scroll_y<0) + tss->scroll_y=0; + if (tss->scroll_y>tss->window_bottom+1-tss->window_top) + tss->scroll_y=tss->window_bottom+1-tss->window_top; + Bts(&tss->crt_flags,CRTf_SCROLL_Y); + if (tss->cur_ltf) { + while (Bt(&tss->crt_flags,CRTf_SCROLL_Y)) + WinPointAndSleep; + } + SetCursorPosition(tss, + ((tss->window_left+tss->window_right)>>1) & -4, + (tss->window_top+tss->window_bottom)>>1); + } + } + if (old_ip_rb && !ip_rb&& !ip_inhibit_win_operations) { + if (SetCursorPosition(tss,iptx,ipty,FALSE)) { + if (tss->cur_ltf) { + do cmd=WinPointAndSleep; + while (cmd!=MSG_IP_R_UP && cmd!=MSG_IP_R_D_UP); + if (cmd==MSG_IP_R_UP) { + if (SetCursorPosition(tss,iptx,ipty)) { + if (tss->cur_ltf) { + l=tss->cur_ltf; + ll=l->cur_entry; + if (ll!=l) { + if (ll->btype==LTFT_LINK || + (ll->flags & + (LTFLF_RIGHT_CB | LTFLF_RIGHT_MACRO | LTFLF_RIGHT_EXP))) + QueueMsg(tss,0,MSG_KEY_DOWN,CH_CR,0,0); + } + } + } + } else + QueueMsg(tss,0,MSG_KEY_DOWN,CH_CTRLQ,0,0); + } + old_ip_rb=FALSE; + } + } + if (ip_lb && !old_ip_lb&& !ip_inhibit_win_operations) { + if (tss->window_top==ipty+1 && + iptx>=tss->window_left-4 && iptx<=tss->window_right+4) { + if (iptx>=tss->window_left && iptxwindow_left+16 && + Bt(&tss->crt_flags,CRTf_HAS_MENU)) + old_ip_lb=TRUE; + else if (iptx>=tss->window_right-8 && iptx<=tss->window_right && + Bt(&tss->crt_flags,CRTf_HAS_CLOSE_WINDOW)) + old_ip_lb=TRUE; + else { + x=iptx-tss->window_left; + while (ip_lb && !Bt(&sys_flags,SYSf_TASK_LINKS_ALTERED)) { + SetWindowHor(tss,iptx-x,tss->window_right+(iptx-x)-tss->window_left); + SetWindowVert(tss,ipty+1,tss->window_bottom+ipty+1-tss->window_top); + Bts(&sys_flags,SYSf_CLEAR_SCREEN_TEXT); + WindowToTop(tss); + UpdateDerivedTssValues(tss); + WinPointAndSleep; + } + old_ip_lb=FALSE; + } + } + if (!Bt(&sys_flags,SYSf_TASK_LINKS_ALTERED) && tss->window_left==iptx+4 && + (ipty>=tss->window_top-1 && ipty<=tss->window_bottom+1)) { + y=ipty-tss->window_top; + while (ip_lb && !Bt(&sys_flags,SYSf_TASK_LINKS_ALTERED)) { + SetWindowHor(tss,iptx+4,tss->window_right+iptx+4-tss->window_left); + SetWindowVert(tss,ipty-y,tss->window_bottom+(ipty-y)-tss->window_top); + Bts(&sys_flags,SYSf_CLEAR_SCREEN_TEXT); + WindowToTop(tss); + UpdateDerivedTssValues(tss); + WinPointAndSleep; + } + old_ip_lb=FALSE; + } + if (!Bt(&sys_flags,SYSf_TASK_LINKS_ALTERED) && + tss->window_right+4==iptx && tss->window_bottom+1==ipty) { + while (ip_lb && !Bt(&sys_flags,SYSf_TASK_LINKS_ALTERED)) { + SetWindowHor(tss,tss->window_left,iptx-4); + SetWindowVert(tss,tss->window_top,ipty-1); + Bts(&sys_flags,SYSf_CLEAR_SCREEN_TEXT); + WindowToTop(tss); + UpdateDerivedTssValues(tss); + WinPointAndSleep; + } + old_ip_lb=FALSE; + } + if (!Bt(&sys_flags,SYSf_TASK_LINKS_ALTERED) && + tss->window_bottom==ipty-1 && + (iptx>=tss->window_left && iptx<=tss->window_right)) { + if (iptx==(tss->scroll_x+tss->window_left)) { + while (ip_lb && !Bt(&sys_flags,SYSf_TASK_LINKS_ALTERED)) { + tss->scroll_x=iptx-tss->window_left; + Bts(&tss->crt_flags,CRTf_SCROLL_X); + WinPointAndSleep; + SetCursorPosition(tss, + ((tss->window_left+tss->window_right)>>1) & -4, + (tss->window_top+tss->window_bottom)>>1); + } + } else { + while (ip_lb && !Bt(&sys_flags,SYSf_TASK_LINKS_ALTERED)) { + SetWindowVert(tss,tss->window_top,ipty-1); + Bts(&sys_flags,SYSf_CLEAR_SCREEN_TEXT); + WindowToTop(tss); + UpdateDerivedTssValues(tss); + WinPointAndSleep; + } + } + old_ip_lb=FALSE; + } + if (!Bt(&sys_flags,SYSf_TASK_LINKS_ALTERED) && + tss->window_right==iptx-4 && + (ipty>=tss->window_top && ipty<=tss->window_bottom)) { + if (ipty==(tss->scroll_y+tss->window_top)) { + while (ip_lb && !Bt(&sys_flags,SYSf_TASK_LINKS_ALTERED)) { + tss->scroll_y=ipty-tss->window_top; + Bts(&tss->crt_flags,CRTf_SCROLL_Y); + WinPointAndSleep; + SetCursorPosition(tss, + ((tss->window_left+tss->window_right)>>1) & -4, + (tss->window_top+tss->window_bottom)>>1); + } + } else { + while (ip_lb && !Bt(&sys_flags,SYSf_TASK_LINKS_ALTERED)) { + SetWindowHor(tss,tss->window_left,iptx-4); + Bts(&sys_flags,SYSf_CLEAR_SCREEN_TEXT); + WindowToTop(tss); + UpdateDerivedTssValues(tss); + WinPointAndSleep; + } + } + old_ip_lb=FALSE; + } + } + } +} + +public I8 GetChar(U8 *scancode=NULL) +{ //waits for key with nonzero ASCII + U8 ch,sc; + + void my_PutChar(LTChnl *chnl,I8 ch); + void my_PutS(LTChnl *chnl,I1 *st); + + if (Fs->rmt_chnl) { + my_PutS=ext[EXT_RMT_PUTS]; + my_PutS(Fs->rmt_chnl,"$$FU$$$$BU$$"); + } else + PutS("$$FU$$$$BU$$"); + do GetMsg(&ch,&sc,(1<rmt_chnl) { + my_PutChar=ext[EXT_RMT_PUTCHAR]; + my_PutChar(Fs->rmt_chnl,ch); + } else + PutChar(ch); + if (Fs->rmt_chnl) { + my_PutS=ext[EXT_RMT_PUTS]; + my_PutS(Fs->rmt_chnl,"$$FG$$$$BG$$"); + } else + PutS("$$FG$$$$BG$$"); + return ch; +} + +public I8 GetCharNoEcho(U8 *scancode=NULL) +//use GetKey() unless you need the scancode +{ //waits for key with nonzero ASCII + U8 ch,sc; + do GetMsg(&ch,&sc,(1<n; + for (i=0;iside[i]; + coutln "col:",i," rhits:",ms->row_hits," chits:",ms->col_hits; + tempw=ms->next; + while (tempw!=ms) { + coutln " substructs:",tempw->substructs, + " entries:",tempw->entries; + for (j=0;jsubstructs;j++) { + PrintF("(%04X %04X) ", + tempw->subs[j].hits, + tempw->subs[j].repeats); + } + CrLf; + tempw=tempw->next; + } + } + + View; +} + +WsHashEntry *WsAddHash(I1 *w) +{ + WsHashEntry **tempw1,*tempw=FindHashEntry(w,ws_hash_table,HTT_WORD); + if (tempw) { + tempw->hits++; + return tempw; + } + tempw1=FindHashBucket(w,ws_hash_table); + tempw=AMAllocZ(sizeof(WsHashEntry)); + tempw->word=ANewString(w); + tempw->type=HTT_WORD; + tempw->use_cnt=1; + tempw->hits=1; + tempw->num=-1; + tempw->next=*tempw1; + *tempw1=tempw; + ws_num_words++; + return tempw; +} + +void WsInitSides(WsMatrix *m) +{ + I8 i; + WsStruct *tempa; + m->n=0; + for (i=0;iside[i].next=&m->side[i].next; + m->side[i].last=&m->side[i].next; + m->side[i].const_minus_one=-1; + m->side[i].row_hits=0; + m->side[i].col_hits=0; + tempa=AMAlloc(sizeof(WsStruct)); + tempa->subs[0].hits=0; + tempa->subs[0].repeats=ws_num_matrix_words; + tempa->entries=ws_num_matrix_words; + tempa->substructs=1; + InsQue(tempa,m->side[i].last); + } +} + +WsStruct *WsFindStruct(WsMatrix *m,I8 col,I8 row, + I4 *row_base,I4 *substruct) +{ + WsStruct *tempa; + if (row>=ws_num_matrix_words || + col>=ws_num_matrix_words) + return NULL; + if (row>1) { + tempa=m->side[col].next; + *row_base=0; + while (row>=tempa->entries) { + row-=tempa->entries; + *row_base+=tempa->entries; + tempa=tempa->next; + } + for (*substruct=0;row>=tempa->subs[*substruct].repeats;*substruct=*substruct+1) { + row-=tempa->subs[*substruct].repeats; + *row_base+=tempa->subs[*substruct].repeats; + } + } else { + row=ws_num_matrix_words-row; + tempa=m->side[col].last; + *row_base=ws_num_matrix_words; + while (row>tempa->entries) { + row-=tempa->entries; + *row_base-=tempa->entries; + tempa=tempa->last; + } + for (*substruct=tempa->substructs-1;row>tempa->subs[*substruct].repeats; + *substruct=*substruct-1) { + row-=tempa->subs[*substruct].repeats; + *row_base-=tempa->subs[*substruct].repeats; + } + *row_base-=tempa->subs[*substruct].repeats; + } + return tempa; +} + +public I8 WsGetHits(WsMatrix *m,I8 col,I8 row) +{ + I8 row_base,substruct; + if (row>=ws_num_matrix_words || + col>=ws_num_matrix_words) + return 0; + WsStruct *tempa=WsFindStruct(m,col,row, + &row_base,&substruct); + return tempa->subs[substruct].hits; +} + +WsSubstruct *WsNext(WsSubstruct *s,WsStruct **parent) +{ + I8 i=(s-&(*parent)->subs)/sizeof(WsSubstruct)+1; + if (i>=(*parent)->substructs) { + i=0; + *parent=(*parent)->next; + if ((*parent)->substructs==-1) + return NULL; + } + return (*parent)->subs+i*sizeof(WsSubstruct); +} + +WsSubstruct *WsLast(WsSubstruct *s,WsStruct **parent) +{ + I8 i=(s-&(*parent)->subs)/sizeof(WsSubstruct)-1; + if (i<0) { + *parent=(*parent)->last; + if ((*parent)->substructs==-1) + return NULL; + i=(*parent)->substructs-1; + } + return (*parent)->subs+i*sizeof(WsSubstruct); +} + +void WsRemove(WsSubstruct *s,WsStruct *parent) +{ + I8 i=(s-&parent->subs)/sizeof(WsSubstruct); + if (i<0 || i>=WS_SUBSTRUCTS_PER_STRUCT || parent->substructs<1) + return; + if (parent->substructs==1) { + RemQue(parent); + AFree(parent); + } else { + parent->entries-=s->repeats; + parent->substructs--; + MemCpy(&parent->subs[i],&parent->subs[i+1], + (parent->substructs-i)*sizeof(WsSubstruct)); + } +} + +WsSubstruct *WsInsert(WsSubstruct *s,WsStruct **parent,WsSubstruct *last) +{ + WsStruct *tempa,*p=*parent; + I8 j,k,i=(last-&p->subs)/sizeof(WsSubstruct)+1; + if (i>=WS_SUBSTRUCTS_PER_STRUCT) { + i=0; + p=p->next; + *parent=p; + if (p->substructs==-1) { + tempa=AMAlloc(sizeof(WsStruct)); + InsQue(tempa,p->last); + p=tempa; + *parent=p; + tempa->entries=0; + tempa->substructs=0; + } + } + if (p->substructs==WS_SUBSTRUCTS_PER_STRUCT) { + tempa=p->next; + if (tempa->substructs==-1 || tempa->substructs==WS_SUBSTRUCTS_PER_STRUCT) { + tempa=AMAlloc(sizeof(WsStruct)); + tempa->entries=0; + tempa->substructs=0; + InsQue(tempa,p); + k=0; + for (j=i;jsubstructs;j++) { + MemCpy(&tempa->subs[k],&p->subs[j],sizeof(WsSubstruct)); + tempa->entries+=tempa->subs[k++].repeats; + tempa->substructs++; + } + p->entries-=tempa->entries; + p->substructs-=tempa->substructs; + } else { + for (j=tempa->substructs-1;j>=0;j--) + MemCpy(&tempa->subs[j+1],&tempa->subs[j],sizeof(WsSubstruct)); + MemCpy(&tempa->subs[0], + &p->subs[WS_SUBSTRUCTS_PER_STRUCT-1], + sizeof(WsSubstruct)); + p->entries-=tempa->subs[0].repeats; + p->substructs--; + tempa->entries+=tempa->subs[0].repeats; + tempa->substructs++; + for (j=WS_SUBSTRUCTS_PER_STRUCT-2;j>=i;j--) + MemCpy(&p->subs[j+1], + &p->subs[j],sizeof(WsSubstruct)); + } + } else { + for (j=p->substructs-1;j>=i;j--) + MemCpy(&p->subs[j+1], + &p->subs[j],sizeof(WsSubstruct)); + } + p->entries+=s->repeats; + p->substructs++; + MemCpy(&p->subs[i],s,sizeof(WsSubstruct)); + return &p->subs[i]; +} + +WsSubstruct *WsCondense(WsSubstruct *s,WsStruct **parent) +{ + WsSubstruct *temps,*temps_l,*temps_n; + WsStruct *tempa_l,*tempa_n; + if ((*parent)->substructs==-1) + return NULL; + temps=s; + tempa_l=*parent; + temps_l=WsLast(temps,&tempa_l); + if (temps_l && temps_l->hits==temps->hits) { + temps_l->repeats+=temps->repeats; + tempa_l->entries+=temps->repeats; + WsRemove(temps,*parent); + *parent=tempa_l; + temps=temps_l; + } + tempa_n=*parent; + temps_n=WsNext(temps,&tempa_n); + if (temps_n && temps_n->hits==temps->hits) { + temps->repeats=temps->repeats+temps_n->repeats; + (*parent)->entries=(*parent)->entries+temps_n->repeats; + WsRemove(temps_n,tempa_n); + } + return temps; +} + +I8 WsIncHits(WsMatrix *m,I8 col,I8 row) +{ + I8 row_base,substruct,repeats; + WsSubstruct sn,*temps,*temps1,*temps_l; + WsStruct *tempa,*tempa1,*tempa_l; + + if (row>=ws_num_matrix_words || + col>=ws_num_matrix_words) + return 0; + tempa=WsFindStruct(m,col,row,&row_base,&substruct); + temps=&tempa->subs[substruct]; + repeats=temps->repeats; + if (repeats==1) { + temps->hits++; + temps=WsCondense(temps,&tempa); + } else { + if (row==row_base) { + temps->repeats--; + tempa->entries--; + sn.hits=1; + sn.repeats=1; + tempa_l=tempa; + if (!(temps_l=WsLast(&tempa->subs[substruct],&tempa_l))) { + tempa_l=tempa->last; //header + temps_l=&tempa_l->subs[WS_SUBSTRUCTS_PER_STRUCT-1]; + } + temps=WsInsert(&sn,&tempa_l,temps_l); + temps=WsCondense(temps,&tempa_l); + } else if (row==repeats-1+row_base) { + temps->repeats--; + tempa->entries--; + sn.hits=1; + sn.repeats=1; + temps=WsInsert(&sn,&tempa,temps); + temps=WsCondense(temps,&tempa); + } else { + tempa->entries-=repeats; + sn.hits=temps->hits+1; + sn.repeats=1; + tempa1=tempa; + temps1=temps; + temps=WsInsert(&sn,&tempa1,temps1); + temps1->repeats=row-row_base; + tempa->entries+=temps1->repeats; + sn.repeats=row_base+repeats-(row+1); + sn.hits=temps1->hits; + WsInsert(&sn,&tempa1,temps); + } + } + m->n++; + m->side[col].col_hits++; + m->side[row].row_hits++; + return temps->hits; +} + +#define WS_FIFO_SIZE 2048 +void WsAddSingleFile(LTDirEntry *tempd,BoolU4 compile) +{ + I1 ch,ch1,*buf,*ptr,*ptr2; + WsHashEntry **f_ptr,**f_ptr2, + **fifo=MAllocZ(WS_FIFO_SIZE*sizeof(U4)); + I8 i,j,fp=0,k=0; + buf=ReadTextFile(tempd->full_name); + ptr=buf; + + while (ch=*ptr++) { + while (ch && !Bt(alpha_numeric_bitmap,ch)) + ch=*ptr++; + if (!ch) break; + ptr--; + ptr2=ptr; + do ch=*ptr2++; + while (Bt(alpha_numeric_bitmap,ch)); + ptr2--; + ch1=*ptr2; + *ptr2=0; + + if (*ptr) { + if (!compile) + WsAddHash(ptr); + else { + f_ptr=fifo+fp<<2; + *f_ptr=FindHashEntry(ptr,ws_hash_table,HTT_WORD); + if ((*f_ptr)->num<0) + *f_ptr=NULL; + else { + for (i=0;inum,(*f_ptr)->num); + } + } + } + fp=(fp+1)&(WS_FIFO_SIZE-1); + } + ptr=ptr2+1; + } + if (!ch1) break; + *ptr2=ch1; + } + Free(fifo); + Free(buf); +} + +void WsAddGlossFile(LTDirEntry *tempd) +{ + LtfEntry *ll; + WsHashEntry *temph; + Ltf *l=LtfRead(tempd->full_name); + I1 *temp; + + ll=l->dummy.next; + while (ll!=l) { + if (ll->btype==LTFT_ANCHOR) { + if (temph=FindHashEntry(ll->aux_string, + ws_hash_table,HTT_WORD)) { + temp=MSPrintF("FA:%s,%s", + tempd->full_name,ll->aux_string); + AFree(temph->glossary); + temph->glossary=ANewString(temp); + Free(temp); + } + } + ll=ll->next; + } + LtfDel(l); +} + +I8 WsSort(WsHashEntry **e1,WsHashEntry **e2) +{ + I8 r; + if (!(r=(*e2)->hits - (*e1)->hits)) + r=StrCmp((*e1)->word,(*e2)->word); + return r; +} + + +void WsAddFileList(LTDirEntry *tempm1,BoolU4 compile,BoolU4 gloss) +{ + while (tempm1) { + coutln tempm1->full_name; + if (tempm1->attr & LT_ATTR_DIR) { + if (tempm1->sub) + WsAddFileList(tempm1->sub,compile,gloss); + } else { + if (gloss) + WsAddGlossFile(tempm1); + else + WsAddSingleFile(tempm1,compile); + } + tempm1=tempm1->next; + } +} + +I8 WsSkipCrap(I1 *src,I8 len) +{ + I8 j; + j=len-1; + while (j>=0) { + if (Bt(alpha_numeric_bitmap,src[j])) + break; + else + j--; + } + return j+1; +} + +I8 WsPriorWordInString(I1 *src,I1 *dst,I8 len,I8 buf_size) +{ + I8 i,j=0,k; + BoolU4 cont=TRUE; + i=len-1; + while (i>=0 && cont) { + if (!Bt(alpha_numeric_bitmap,src[i])) + cont=FALSE; + else + i--; + } + if (i>=-1 && len>0) + for (k=i+1;k=0 && nword; + len=StrLen(s); + if (len>ws_partial_len) + Auto(s+ws_partial_len); + } +} + +void WsMan(I8 n,TssStruct *parent=NULL) +{ + I1 *buf; + WsHashEntry *tempw; + SysHashEntry *temph; + BoolU4 old_preempt=Preempt(OFF); + n--; + if (n>=0 && nglossary; + if (temph=FindHashEntry(tempw->word,Fs->hash_table,HTT_ALL)) { + if (temph->source_link) + buf=temph->source_link; + } + if (buf) { + buf=MSPrintF("Edit(\"%s\");",buf); + Preempt(old_preempt); + PopUp(buf,parent); + Free(buf); + } + } + } + Preempt(old_preempt); +} + +void WsAddFillin(I8 i,I8 j,I8 old_num_fillins) +{ + BoolU4 cont; + I8 k; + if (ws_num_fillinsfillin_scores[ws_num_fillins-1] || + i==fillin_scores[ws_num_fillins-1] && ws_sorted_words[j]->hits>fillin_hits[ws_num_fillins-1]) { + cont=TRUE; + for (k=ws_num_fillins-1;k>=old_num_fillins && cont;k--) + if (i<=fillin_scores[k] || i==fillin_scores[k] && ws_sorted_words[j]->hits<=fillin_hits[k]) { + cont=FALSE; + k++; //offset k-- + } else { + fillin_scores[k+1]=fillin_scores[k]; + fillin_matches[k+1]=fillin_matches[k]; + fillin_hits[k+1]=fillin_hits[k]; + } + if (ws_num_fillinshits; + fillin_matches[k+1]=j; + } +} + +void WsPutChoices(Ltf *l,Ltf *aux,Ltf *focus_l,LtfEntry *ll) +{ + I8 i,j,k,data_col; + I1 ch=0,*buf,*buf1,*src=NULL,*st; + WsHashEntry *w2; + U8 timeout_jiffies=jiffies+JIFFY_FREQ*20/1000; + SysHashEntry *temph; + TssStruct *tss; + + src=LtfGetLine(focus_l,ll,&data_col); + i=StrLen(src); + buf=MAlloc(i+1); + buf1=MAlloc(i+1); + if (data_col==-1) + data_col=StrLen(i); + data_col=WsPriorWordInString(src,buf,data_col,256); + ws_partial_len=StrLen(buf); + data_col=WsSkipCrap(src,data_col); + data_col=WsPriorWordInString(src,buf1,data_col,256); + AFree(ws_cur_word); + ws_cur_word=ANewString(buf); + if (StrLen(buf1)) + w2=FindHashEntry(buf1,ws_hash_table,HTT_WORD); + else + w2=NULL; + Free(src); + ws_num_fillins=0; + if (w2 && w2->numword)) { + i=WsGetHits(&ws_matrices[0],w2->num,ws_sorted_words[j]->num); + WsAddFillin(i,j,0); + } + k=ws_num_fillins; + for (j=0;jword)) + WsAddFillin(0,j,k); + if (ws_num_fillins) { + LtfReset(l,TRUE); + l->flags|=LTFF_MIN_SIZE; + l->text_attribute=(LTBLUE<<4)+BLACK; + aux->text_attribute=(LTBLUE<<4)+BLACK; + Fs->text_attribute=l->text_attribute; + Fs->border_attribute=l->text_attribute; + + LtfPrintF(l,"Word:%-20ts\r\n",ws_cur_word); + for (i=0;iword; + if (ws_sorted_words[fillin_matches[i]]->glossary) + ch='#'; + else + ch=CH_SPACE; + if (tss=sys_cur_focus_task) { + temph=FindHashEntry(st,tss->hash_table,HTT_ALL); + if (temph) { + if (temph->source_link) + ch='*'; + } + } + LtfPrintF(l,"%cF%02d %-20ts\r\n",ch,i+1,st); + } + LtfRecalc(l); + Bts(&Fs->crt_flags,CRTf_SHOW); + WindowToTop(Fs); + } + Free(buf); + Free(buf1); +} + +void WsTsk() +{ + TssStruct *focus_tss; + U8 sc,ch; + Ltf *l; + LtfEntry *ll; + Preempt(OFF); + InitLocalTask; + UseConsoleLtf(NULL); + Fs->window_left=200; + Fs->window_bottom=30; + do { + Sleep(500); + if (!ws_disable) { + focus_tss=sys_cur_focus_task; + if (focus_tss) { + l=focus_tss->cur_ltf; + if (l && focus_tss!=Fs) { + LtfRecalc(l); //TODO: is this needed? + ll=l->cur_entry; + if (ll) { + if (ll==l) ll=ll->last; + while (ll->last!=l && (ll->btype==LTFT_CR || + ll->btype==LTFT_SOFT_CR)) + ll=ll->last; + while ((ll->last->btype)!=LTFT_CR && ll->last!=l) + ll=ll->last; + if (!ws_disable) + WsPutChoices(Fs->cur_ltf,Fs->aux_ltf,l,ll); + } + } + } + } + } while (!ScanChar(&sc,&ch)); + ws_task=NULL; +} + + + +void WsAdd(I1 *wild=TEXT_FILE_MASK,BoolU4 gloss) +{ + WsFilemaskEntry *tempfm=AMAlloc(sizeof(WsFilemaskEntry)); + if (gloss) { + tempfm->next=ws_gloss_filemask_list; + ws_gloss_filemask_list=tempfm; + } else { + tempfm->next=ws_filemask_list; + ws_filemask_list=tempfm; + } + tempfm->mask=ANewString(wild); + tempfm->flist=NULL; +} + +void WsTraverseFilelist(BoolU4 compile,BoolU4 gloss) +{ + WsFilemaskEntry *tempfm; + U8 my_flags=(1<flist=FindFiles(tempfm->mask,&my_flags); + WsAddFileList(tempfm->flist,compile,gloss); + tempfm=tempfm->next; + } +} + +public void WsInit(I1 *mask) +{ + I1 *buf,buf2[512]; + I8 i,j=0; + WsHashEntry *tempw; + + ws_disable=TRUE; + +//TODO:free old wordstat data + ws_num_words=0; + ws_num_matrix_words=0; + MemSet(&ws_hash_table->body,0,sizeof(U4)*(ws_hash_table->mask+1)); + ws_cur_word=NULL; + ws_filemask_list=NULL; + ws_gloss_filemask_list=NULL; + + buf=NewString(mask); + do { + RemoveFirstSeg(buf,";",buf2); + if (*buf2) { + StrCat(buf2,"/" TEXT_FILE_MASK); + WsAdd(buf2,FALSE); + } + } while (*buf2); + Free(buf); + + coutln "\r\n\r\nPass #1"; + WsTraverseFilelist(FALSE,FALSE); + ws_sorted_words=AMAlloc(PTR_SIZE*ws_num_words); + + for (i=0;i<=ws_hash_table->mask;i++) { + tempw=ws_hash_table->body[i]; + while (tempw) { + ws_sorted_words[j++]=tempw; + tempw=tempw->next; + } + } + QSort(ws_sorted_words,ws_num_words,PTR_SIZE,&WsSort); + for (i=0;inum=i; + if (ws_num_words<=WS_MAX_MATRIX_WORDS) + ws_num_matrix_words=ws_num_words; + else + ws_num_matrix_words=WS_MAX_MATRIX_WORDS; + + for (i=0;inext=header; + header->last=header; + ptr=buf; + while (type=*ptr++) { + tempt=MAllocZ(sizeof(TimeEntry)); + tempt->type=type; + d=ptr; + ptr+=sizeof(LTDate); + tempt->d=*d; + tempt->desc=NewString(ptr); + ptr+=StrLen(ptr)+1; + InsQue(tempt,header->last); + } + Free(buf); +} + +void WriteTimeFile(TimeEntry *header) +{ + U1 *buf,*ptr; + TimeEntry *tempt; + LTDate *d; + U8 size=1; //for eof + + tempt=header->next; + while (tempt!=header) { + size+=sizeof(U1)+sizeof(LTDate)+StrLen(tempt->desc)+1; + tempt=tempt->next; + } + buf=MAlloc(size); + + ptr=buf; + tempt=header->next; + while (tempt!=header) { + *ptr++=tempt->type; + d=ptr; + *d=tempt->d; + ptr+=sizeof(LTDate); + StrCpy(ptr,tempt->desc); + ptr+=StrLen(tempt->desc)+1; + tempt=tempt->next; + } + *ptr=TET_EOF; + WriteFile(TIME_FILENAME,buf,size); + Free(buf); +} + +void DelTimeEntries(TimeEntry *header) +{ + TimeEntry *tempt=header->next,*tempt1; + while (tempt!=header) { + tempt1=tempt->next; + Free(tempt->desc); + Free(tempt); + tempt=tempt1; + } + Free(header); +} + +public BoolU4 TimeRep(TimeEntry **header=NULL) +{ + BoolU4 is_in=FALSE; + TimeEntry *tempt; + U8 week,cur_week,week_total=0; + TimeEntry *my_header=MAlloc(sizeof(TimeEntry)); + if (header) + *header=my_header; + ReadTimeFile(my_header); + tempt=my_header->next; + while (tempt!=my_header) { + week=DivU8(tempt->d.date,7); //TODO + if (week!=cur_week) { + if (is_in) + week_total=week_total+GetCurTimeLTDate; + PrintF("Week Total:%h2T\r\n",week_total); + cur_week=week; + week_total=0; + } + if (tempt->type==TET_PUNCH_IN) { + PutS("$$FG RED$$IN "); + if (!is_in) + week_total=week_total-tempt->d; + is_in=TRUE; + } else { + PutS("$$FG RED$$OUT"); + if (is_in) + week_total=week_total+tempt->d; + is_in=FALSE; + } + PrintF(" %h2D %T:$$FG$$\r\n%s\r\n", + tempt->d.date,tempt->d.time,tempt->desc); + tempt=tempt->next; + } + if (is_in) + week_total=week_total+GetCurTimeLTDate; + PrintF("$$FG RED$$Week Total:%h2T$$FG$$\r\n",week_total); + if (!header) + DelTimeEntries(my_header); + return is_in; +} + +public void PunchOut() +{ + BoolU4 is_in; + TimeEntry *tempt,*header; + is_in=TimeRep(&header); + if (!is_in) { + PutS("$$BK 1$$Already Punched-Out$$BK 0$$\r\n"); + View; + } else { + tempt=MAlloc(sizeof(TimeEntry)); + tempt->type=TET_PUNCH_OUT; + tempt->d=GetCurTimeLTDate; + PrintF("\r\nEnter Description:\r\n"); + if (!(tempt->desc=SysGetS)) + tempt->desc=MAllocZ(1); + InsQue(tempt,header->last); + WriteTimeFile(header); + } + DelTimeEntries(header); +} + +public void PunchIn() +{ + U4 is_in; + TimeEntry *tempt,*header; + is_in=TimeRep(&header); + if (is_in) { + PutS("$$BK 1$$Already Punched-In$$BK 0$$\r\n"); + View; + } else { + tempt=MAlloc(sizeof(TimeEntry)); + tempt->type=TET_PUNCH_IN; + tempt->d=GetCurTimeLTDate; + PrintF("\r\nEnter Description:\r\n"); + if (!(tempt->desc=SysGetS)) + tempt->desc=MAllocZ(1); + InsQue(tempt,header->last); + WriteTimeFile(header); + } + DelTimeEntries(header); +} diff --git a/LT/APPS/WARGAME.CPZ b/LT/APPS/WARGAME.CPZ new file mode 100644 index 0000000000000000000000000000000000000000..801397bbb714a82e5137d388a3707e93ad4338ca GIT binary patch literal 7348 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 zG~0ltS70MqUSQWKuPsro7{?0Q;~+?L9wQwfLlast_in_member_list=&tempc->member_list; + tempc->type=HTT_CLASS; + tempc->sub_type=IT_I4; + tempc->pointer_cnt=0; + + tempc+=sizeof(ClassStruct); + tempc->type=HTT_CLASS; + tempc->sub_type=IT_I4; + tempc->size=4; + tempc->pointer_cnt=1; + + tempc+=sizeof(ClassStruct); + tempc->type=HTT_CLASS; + tempc->sub_type=IT_I4; + tempc->size=4; + tempc->pointer_cnt=2; + + tempc+=sizeof(ClassStruct); + tempc->type=HTT_CLASS; + tempc->sub_type=IT_I4; + tempc->size=4; + tempc->pointer_cnt=3; + + return result; +} + +void LoadAsmHash(BoolU4 first) +{ + U8 i,type; + U4 *dd; + LexStruct *l; + I8 size,size1; + SysHashEntry *temph,**temph1; + ClassStruct *tempc; + OpcodeHashEntry *tempo,*tempo1; + InstructionEntry *tempi; + + asm_hash=NewHashTable(2048); + size1=offset(OpcodeHashEntry.ins)+sizeof(InstructionEntry)<<5; + tempo=MAlloc(size1); + + l=LexNew(ReadTextFile("ASM.TXZ"),0,NewString("ASM.TXZ")); + l->hash_table_list=NULL; + Lex(l); + while (l->token) { + if (l->token!=TK_IDENT) + PutAsmError(l,"ST_EXPECTING_IDENTIFIER"); + else { + i=MatchListEntry(l->ident,"OPCODE\0KEYWORD\0R8\0R16\0R32\0SEG\0\0",MLE_IGNORE_CASE); + Lex(l); //skip keyword + if (!i) { //OPCODE + MemSet(tempo,0,size1); + tempo->type=HTT_OPCODE; + tempo->instruction_entry_cnt=0; + tempo->string=l->ident; + l->ident=0; + Lex(l); //Skip OPCODE + while (l->token && l->token!=';') { + tempi=&tempo->ins[tempo->instruction_entry_cnt]; + tempi->ins_entry_num=tempo->instruction_entry_cnt++; + tempi->opcode_cnt=0; + while (l->token==TK_INTEGER) { + tempi->opcode[tempi->opcode_cnt++]=l->cur_i; + Lex(l); + } + if (l->token=='+') { + tempi->plus_opcode=1; + Lex(l); + } else + tempi->plus_opcode=0; + if (l->token=='/') { + if (Lex(l)==TK_INTEGER) { + tempi->slash_value=l->cur_i; + Lex(l); + } else if (l->token==TK_IDENT) { + tempi->slash_value=8; + Lex(l); + } + } else + tempi->slash_value=9; + if (l->token=='*') { + tempi->operand_size16=1; + Lex(l); + } else + tempi->operand_size16=0; + if (l->token=='%') { + tempi->operand_size32=1; + Lex(l); + } else + tempi->operand_size32=0; + if (l->token=='!') { + tempi->dont_switch_modes=1; + Lex(l); + } else + tempi->dont_switch_modes=0; + if (l->token=='&') { + tempi->default=1; + Lex(l); + } else + tempi->default=0; + if (l->token!=TK_IDENT) + PutAsmError(l,"ST_EXPECTING_IDENTIFIER"); + else { + tempi->opcode_modifier=MatchSysTextEntry(l->ident, + "ST_OPCODE_MODIFIERS",MLE_IGNORE_CASE); + tempi->arg1=0; + tempi->arg2=0; + if (Lex(l)==TK_IDENT) { + tempi->arg1=MatchSysTextEntry(l->ident, + "ST_ARGUMENT_TYPES",MLE_IGNORE_CASE); + if (Lex(l)==TK_IDENT) { + tempi->arg2=MatchSysTextEntry(l->ident, + "ST_ARGUMENT_TYPES",MLE_IGNORE_CASE); + Lex(l); + } + } + } + } + if (l->token==';') { + Lex(l); //Skip ';' + size=offset(OpcodeHashEntry.ins)+ + sizeof(InstructionEntry)*tempo->instruction_entry_cnt; + tempo1=MAlloc(size); + MemCpy(tempo1,tempo,size); + temph1=FindHashBucket(tempo1->string,asm_hash); + tempo1->use_cnt=0; + SetSourceFileInfo(l,tempo1); + tempo1->next=*temph1; + *temph1=tempo1; + } else + PutAsmError(l,"ST_MISSING_SEMICOLON"); + } else if (i>=1 && i<=5) { //KEYWORD,R8,R16,R32,SEG + if (l->token!=TK_IDENT) + PutAsmError(l,"ST_EXPECTING_IDENTIFIER"); + else { + temph=MAllocZ(sizeof(SysHashEntry)); + temph->string=l->ident; + l->ident=NULL; + temph->use_cnt=0; + SetSourceFileInfo(l,temph); + Lex(l); //skip keyword name + if (l->token!=TK_INTEGER) + PutAsmError(l,"ST_EXPECTING_INTEGER"); + else { + temph->user0=l->cur_i; + if (Lex(l)!=';') + PutAsmError(l,"ST_MISSING_SEMICOLON"); + else { + Lex(l); //skip ';' + temph1=FindHashBucket(temph->string,asm_hash); + temph->next=*temph1; + *temph1=temph; + } + } + switch (i) { + case 1: + temph->type=HTT_KEYWORD; + if (first) { + temph=MAllocIdentical(temph); + temph1=FindHashBucket(temph->string,adam_tss->hash_table); + temph->next=*temph1; + *temph1=temph; + } + break; + case 2: temph->type=HTT_R8; break; + case 3: temph->type=HTT_R16; break; + case 4: temph->type=HTT_R32; break; + case 5: temph->type=HTT_SEG; break; + } + } + } else + PutAsmError(l,"Unknown Statement"); + } + } + Free(tempo); + LexDel(l); + dd=internal_types_table; + while (*dd!=HTT_INVALID) { + tempc=CmpClassNew; + tempc->type=*dd; dd+=4; + tempc->use_cnt=0; + tempc->source_link=NULL; + tempc->sub_type=*dd; dd+=4; + tempc->size=*dd; dd+=4; + tempc->string=ANewString(dd); + dd+=StrLen(tempc->string)+1; + temph1=FindHashBucket(tempc->string,asm_hash); + tempc->next=*temph1; + *temph1=tempc; + sys_internal_types[tempc->sub_type]=tempc; + + if (first) { + tempc=MAllocIdentical(tempc); + temph1=FindHashBucket(tempc->string,adam_tss->hash_table); + tempc->next=*temph1; + *temph1=tempc; + } + } +} + +void AddUnresolved(AsmCtrlStruct *a,U1 *exp,I8 type,U8 ip,U8 rel_ip, + LexUndefEntry *undef_hash,I8 line_num,BoolU4 U1_avail,BoolU4 glbl) +{ + AsmUnresolvedRef *tempu=MAlloc(sizeof(AsmUnresolvedRef)); + tempu->exp=exp; + tempu->type=type; + tempu->ip=ip; + tempu->rel_ip=rel_ip; + tempu->undef_hash=undef_hash; + tempu->literal=FALSE; + tempu->line_num=line_num; + tempu->U1_avail=U1_avail; + tempu->string=NULL; + if (glbl) { + tempu->next=a->glbl_unresolved; + a->glbl_unresolved=tempu; + if (undef_hash->hash->type & HTT_IMPORT) { + tempu->string=NewString(undef_hash->hash->string); + if (undef_hash->hash->type & HTT_LITERAL) + tempu->literal=TRUE; + } + } else { + tempu->next=a->local_unresolved; + a->local_unresolved=tempu; + a->has_locals=TRUE; + } +} + +void AsmListLine(LexStruct *l) +{ + I8 i; + AsmCtrlStruct *a=l->a; + LexFileStruct *tempf=l->cur_lfn; + LtfEntry *cl=tempf->line_start,*cl3; + if (a->list && a->last_lfn==tempf && cl) { + if (cl3=a->last_line_listed) { + while (cl3->yy) { + for (i=a->display_col;i<8;i++) + cout " "; + a->display_col=0; + PrintF("%08X ",a->last_ip); + cl3=LexPutLine(l,cl3); + } + a->last_line_listed=cl3; + } else + a->last_line_listed=cl; + } else { + a->last_line_listed=NULL; + a->last_lfn=tempf; + } + a->last_ip=a->ip; +} + +exe {NoRegVar(ON);} +void AsmStoreCodeU1(LexStruct *l,U1 b) +{ + AsmCtrlStruct *a=l->a; + I8 i=a->ip>>ASM_CODE_BLK_BITS; + AsmCodeBlk *tempc=a->code; + while (i--) + if (!(tempc=tempc->next)) { + i=a->ip>>ASM_CODE_BLK_BITS+1; + tempc=&a->code; + while (i--) { + if (!*tempc) + *tempc=MAllocZ(sizeof(AsmCodeBlk)); + tempc=tempc->next; + } + break; + } + tempc->body[a->ip++ & (ASM_CODE_BLK_SIZE-1)]=b; + if (a->list) { + PrintF("%02X ",b); + a->display_col++; + if (a->display_col>8) { + a->display_col=0; + AsmListLine(l); + } + } + if (a->ip>a->num_code_U1s) + a->num_code_U1s=a->ip; +} +exe {NoRegVar(OFF);} + +void AsmStoreCodeU1At(LexStruct *l,U1 b,I8 ip) +{ + AsmCtrlStruct *a=l->a; + I8 i=ip>>ASM_CODE_BLK_BITS+1; + AsmCodeBlk *tempc=&a->code; + while (i--) { + if (!*tempc) { + *tempc=MAlloc(sizeof(AsmCodeBlk)); + **tempc=NULL; + } + tempc=tempc->next; + } + tempc->body[ip & (ASM_CODE_BLK_SIZE-1)]=b; + if (ip+1>a->num_code_U1s) + a->num_code_U1s=ip+1; +} + + +I8 AsmEvalExpression(LexStruct *l) +{ + U1 *exp; + I8 result=0; + l->undef_hash_entry=NULL; + l->flags&=~(LF_UNRESOLVED_LOCAL+LF_UNRESOLVED_GLBL); + l->absolute_address_cnt=0; + if (!GetExpression(l,&exp)) + LexSkipEol(l); + else { + if (!(l->flags & (LF_UNRESOLVED_LOCAL|LF_UNRESOLVED_GLBL))) { + result=Run(exp); + DelExpression(exp); + } else + PutAsmError(l,"ST_UNDEFINED_SYMBOL"); + } + return result; +} + +void ResolveLocals(LexStruct *l) +{ + AsmCtrlStruct *a=l->a; + AsmUnresolvedRef *tempu=a->local_unresolved,*tempu1; + I8 result=0; + LexUndefEntry *templu; + BoolU4 undefined; + I1 *label=NULL; + + if (!a->has_locals) + return; + while (tempu) { + undefined=FALSE; + tempu1=tempu->next; + templu=tempu->undef_hash; + while (templu) { + if (templu->hash->type & (HTT_UNRESOLVED_LOCAL | HTT_UNRESOLVED_GLBL)) { + cout SysText("ST_ERROR"),SysText("ST_UNDEFINED_SYMBOL"),SysText("ST_LINE"); + PrintF("%04d ",tempu->line_num); + if (a->last_label) cout a->last_label," "; + coutln templu->hash->string; + l->error_cnt++; + undefined=TRUE; + } else + label=templu->hash->string; + templu=templu->next; + } + if (!undefined) { + result=Run(tempu->exp); + if (!(tempu->type & 1)) { + result-=tempu->rel_ip; + if (tempu->type==EIE_REL_U1 && (result<-128 || result>127) || + tempu->type==EIE_REL_U2 && (result<-0x8000 || result>0x7FFF) ) { + cout SysText("ST_ERROR"),SysText("ST_BRANCH_OUT_OF_RANGE"),SysText("ST_LINE"); + PrintF("%04d ",tempu->line_num); + if (a->last_label) + PrintF("%s ",a->last_label); + if (label) cout label; + CrLf; + l->error_cnt++; + } + if (tempu->U1_avail && tempu->type>EIE_LIT_U1 && (result>=-124 && result<=123)) { + cout SysText("ST_WARNING"),SysText("ST_COULD_USE_U1_DISP"),SysText("ST_LINE"); + PrintF("%04d ",tempu->line_num); + if (a->last_label) + PrintF("%s ",a->last_label); + if (label) cout label; + CrLf; + } + } + AsmStoreCodeU1At(l,result.u1[0],tempu->ip); + if (tempu->type>=EIE_REL_U2) + AsmStoreCodeU1At(l,result.u1[1],tempu->ip+1); + if (tempu->type>=EIE_REL_U4) { + AsmStoreCodeU1At(l,result.u1[2],tempu->ip+2); + AsmStoreCodeU1At(l,result.u1[3],tempu->ip+3); + } + } + DelExpression(tempu->exp); + DelLinkedList(tempu->undef_hash); + Free(tempu); + tempu=tempu1; + } + DelHashTable(a->local_hash); + a->local_hash=NewHashTable(16); + a->local_hash->next=a->glbl_hash; + l->hash_table_list=a->local_hash; + l->local_hash_table=a->local_hash; + a->local_unresolved=NULL; + a->has_locals=FALSE; +} + +void ResolveGlbls(LexStruct *l,ExeStruct *e) +{ + AsmCtrlStruct *a=l->a; + ClassStruct *tempc; + GlblVarStruct *tempg; + AsmUnresolvedRef *tempu=a->glbl_unresolved,*tempu1; + I8 result=0; + ExeImportExportStruct *tempe,*tempe1; + LexUndefEntry *templu; + I8 i; + SysHashEntry *temph; + I1 *label; + BoolU4 undefined; + l;//Ref so no warning + while (tempu) { + label=NULL; + undefined=FALSE; + tempu1=tempu->next; + templu=tempu->undef_hash; + while (templu) { + if (templu->hash->type & (HTT_UNRESOLVED_LOCAL | HTT_UNRESOLVED_GLBL)) { + if (!(templu->hash->type & HTT_IMPORT)) { + cout SysText("ST_ERROR"),SysText("ST_UNDEFINED_SYMBOL"),SysText("ST_LINE"); + PrintF("%04d ",tempu->line_num); + cout templu->hash->string,"\r\n"; + l->error_cnt++; + } + undefined=TRUE; + } else + label=templu->hash->string; + templu=templu->next; + } + if (undefined) { + templu=tempu->undef_hash; + if (templu->hash->type & HTT_IMPORT) { + tempe=MAllocZ(sizeof(ExeImportExportStruct)); + tempe->next=templu->hash->user1; + tempe->string=NULL; + templu->hash->user1=tempe; + tempe->ip=tempu->ip; + tempe->type=tempu->type; + } + } else { + result=Run(tempu->exp); + if (!(tempu->type & 1)) { + result=result-tempu->rel_ip; + if ((tempu->type==EIE_REL_U1 && (result<-128 || result>127)) || + tempu->type==EIE_REL_U2 && (result<-0x8000 || result>0x7FFF)) { + cout SysText("ST_ERROR"),SysText("ST_BRANCH_OUT_OF_RANGE"),SysText("ST_LINE"); + PrintF("%04d ",tempu->line_num); + if (label) cout label; + CrLf; + l->error_cnt++; + } + if (tempu->U1_avail && tempu->type>EIE_LIT_U1 && (result>=-124 && result<=123)) { + cout SysText("ST_WARNING"),SysText("ST_COULD_USE_U1_DISP"),SysText("ST_LINE"); + PrintF("%04d ",tempu->line_num); + if (a->last_label) + PrintF("%s ",a->last_label); + if (label) cout label; + CrLf; + } + } + AsmStoreCodeU1At(l,result.u1[0],tempu->ip); + if (tempu->type>=EIE_REL_U2) + AsmStoreCodeU1At(l,result.u1[1],tempu->ip+1); + if (tempu->type>=EIE_REL_U4) { + AsmStoreCodeU1At(l,result.u1[2],tempu->ip+2); + AsmStoreCodeU1At(l,result.u1[3],tempu->ip+3); + } + } + DelExpression(tempu->exp); + DelLinkedList(tempu->undef_hash); + Free(tempu); + tempu=tempu1; + } + + tempe1=&e->ie; + while (tempe1->next) + tempe1=tempe1->next; + + for (i=0;i<=a->glbl_hash->mask;i++) { + temph=a->glbl_hash->body[i]; + while (temph) { + if (temph->type & HTT_IMPORT && temph->use_cnt) { + if (temph->type & HTT_FUNCTION) { + tempe=MAllocZ(sizeof(ExeImportExportStruct)); + tempe->type=EIE_LIT_U4; + tempc=temph; + tempe->string=(tempc->import_name) ? + NewString(tempc->import_name):NewString(tempc->string); + tempe->ip=tempc->executable_address; + tempe1->next=tempe; + tempe1=tempe; + } else if (temph->type & HTT_GLBL_VAR) { + tempe=MAllocZ(sizeof(ExeImportExportStruct)); + tempe->type=EIE_LIT_U4; + tempg=temph; + if (tempg->import_name) + tempe->string=NewString(tempg->import_name); + else + tempe->string=NewString(tempg->string); + tempe->ip=tempg->data_address; + tempe1->next=tempe; + tempe1=tempe; + } else { + tempe=temph->user1; + if (tempe) { + tempe1->next=tempe; + tempe->string=NewString(temph->string); + while (tempe1->next) + tempe1=tempe1->next; + } + } + } else if (temph->type & HTT_EXPORT) { + if (temph->type & HTT_UNRESOLVED_GLBL) { + coutln SysText("ST_ERROR"),SysText("ST_UNDEFINED_SYMBOL"),temph->string; + l->error_cnt++; + } else { + tempe=MAlloc(sizeof(ExeImportExportStruct)); + tempe->type=EIE_REL_EXPORT; + if (temph->type & HTT_FUNCTION) { + tempc=temph; + tempe->ip=tempc->executable_address; + } else if (temph->type & HTT_GLBL_VAR) { + tempg=temph; + tempe->ip=tempg->data_address; + } else + tempe->ip=temph->user0; + if (temph->type & HTT_LITERAL) + tempe->type++; + *tempe1=tempe; + tempe->next=NULL; + tempe1=tempe; + tempe->string=NewString(temph->string); + } + } + temph=temph->next; + } + } +} + +BoolU4 ParseAsmImm(LexStruct *l,AsmCtrlStruct *aa,AsmArgStruct *a,U8 ip) +{ + if (a->imm_or_off_present) { + PutAsmError(l,"ST_ALREADY_ONE_IMMEDIATE"); + return FALSE; + } else { + a->imm_or_off_present=TRUE; + a->undef_local=NULL; + a->undef_glbl=NULL; + l->instruction_pointer=ip; + l->undef_hash_entry=NULL; + l->absolute_address_cnt=0; + l->flags&=~(LF_UNRESOLVED_LOCAL+LF_UNRESOLVED_GLBL); + if (!GetExpression(l,&a->exp)) + LexSkipEol(l); + else { + if (!(l->flags & (LF_UNRESOLVED_LOCAL|LF_UNRESOLVED_GLBL))) { + a->imm=Run(a->exp); + a->undef_glbl=l->undef_hash_entry; + l->undef_hash_entry=NULL; + DelExpression(a->exp); + a->exp=NULL; + } else { + if (l->flags & LF_UNRESOLVED_GLBL) { + a->undef_glbl=l->undef_hash_entry; + l->undef_hash_entry=NULL; + aa->has_locals=TRUE; + } else if (l->flags & LF_UNRESOLVED_LOCAL) { + a->undef_local=l->undef_hash_entry; + l->undef_hash_entry=NULL; + } + } + } + } + return TRUE; +} + +void ParseAsmArg(LexStruct *l,AsmCtrlStruct *aa,AsmArgStruct *a,U8 ip) +{ + I8 i,temp; + a->size=0; + a->absolute_address_cnt=0; + a->seg=8; + a->reg1=8; + a->reg2=8; + a->imm=0; + a->scale=1; + a->indirect=FALSE; + a->imm_or_off_present=FALSE; + a->undef_local=NULL; + a->undef_glbl=NULL; + a->just_seg=FALSE; + a->exp=NULL; + while (TRUE) { + if (l->token==TK_IDENT) { + if (l->hash_entry) { + if (l->hash_entry->type==HTT_R8) { + a->size=1; + a->reg1=l->hash_entry->user0; + Lex(l); + return; + } else if (l->hash_entry->type==HTT_R16) { + a->size=2; + a->reg1=l->hash_entry->user0; + Lex(l); + return; + } else if (l->hash_entry->type==HTT_R32) { + a->size=4; + a->reg1=l->hash_entry->user0; + Lex(l); + return; + } else if (l->hash_entry->type==HTT_SEG) { + a->seg=l->hash_entry->user0; + if (Lex(l)!=':') { + a->just_seg=TRUE; + return; + } else + Lex(l); //skip ":" + } else if (l->hash_entry->type==HTT_KEYWORD) { + i=l->hash_entry->user0; + if (i==AKW_U1) { + Lex(l); //skip keyword + a->size=1; + } else if (i==AKW_U2) { + Lex(l); //skip keyword + a->size=2; + } else if (i==AKW_U4) { + Lex(l); //skip keyword + a->size=4; + } else { + PutAsmError(l,"ST_SYNTAX_ERROR"); + return; + } + } else { + ParseAsmImm(l,aa,a,ip); + a->absolute_address_cnt=l->absolute_address_cnt; + if (l->token!='[') + return; + } + } else { + ParseAsmImm(l,aa,a,ip); + a->absolute_address_cnt=l->absolute_address_cnt; + if (l->token!='[') + return; + } + } else if (l->token=='[') { + a->indirect=TRUE; + Lex(l); // skip [ + while (l->token && l->token!=']') { + if (l->token==TK_IDENT) { + if (l->hash_entry) { + if (l->hash_entry->type==HTT_R16 || l->hash_entry->type==HTT_R32) { + if (a->reg1==8) + a->reg1=l->hash_entry->user0; + else + a->reg2=l->hash_entry->user0; + Lex(l); + } else { + ParseAsmImm(l,aa,a,ip); + a->absolute_address_cnt=l->absolute_address_cnt; + } + } else { + ParseAsmImm(l,aa,a,ip); + a->absolute_address_cnt=l->absolute_address_cnt; + } + } else if (l->token=='*') { + if (Lex(l)!=TK_INTEGER) + PutAsmError(l,"ST_EXPECTING_SCALE_FACTOR"); + else { + a->scale=l->cur_i; + Lex(l); //skip scale + if (a->reg2!=8) { + temp=a->reg1; + a->reg1=a->reg2; + a->reg2=temp; + } + } + } else if (l->token=='+') { + Lex(l); //skip '+' + } else { + ParseAsmImm(l,aa,a,ip); + a->absolute_address_cnt=l->absolute_address_cnt; + } + } + if (l->token==']') { + Lex(l); //skip ] + return; + } else + PutAsmError(l,"ST_MISSING_RIGHT_BRACKET"); + } else { + ParseAsmImm(l,aa,a,ip); + a->absolute_address_cnt=l->absolute_address_cnt; + if (l->token!='[') + return; + } + } +} + +void AsmMakeArgMask(AsmArgStruct *a,U8 *mask) +{ + if (a->just_seg) { + mask->u4[0]=0; + if (!a->seg) + mask->u4[1]=0x24; + else if (a->seg==1) + mask->u4[1]=0x60; + else if (a->seg==2) + mask->u4[1]=0x21; + else if (a->seg==3) + mask->u4[1]=0x22; + else if (a->seg==4) + mask->u4[1]=0x28; + else + mask->u4[1]=0x30; + return; + } + mask->u4[1]=0; + + if (!a->size) + mask->u4[0]=0xFF07FFFE; + else if (a->size==1) + mask->u4[0]=0x19012492; + else if (a->size==2) + mask->u4[0]=0xA2024924; + else if (a->size==4) + mask->u4[0]=0x44049248; + + if (a->reg1!=8 && a->imm_or_off_present && !a->imm) { + if (!a->undef_glbl && !a->undef_local) + a->imm_or_off_present=FALSE; //Zero displacement + } + + if (a->reg2!=8 || a->scale!=1) { + mask->u4[0]&=0x0000E000; + return; + } + + if (a->indirect) { + if (a->imm_or_off_present) { + mask->u4[0]&=0x07FFE000; + } else + mask->u4[0]&=0x00FFE000; + } else { + if (a->imm_or_off_present) + mask->u4[0]&=0x00F81C7E; + else + mask->u4[0]&=0xF8F8E380; + } + if (a->seg!=8) + mask->u4[0]&=0x07FFE000; + if (a->reg1==8) { + if (a->indirect) + mask->u4[0]&=0x07FFE000; + else if (a->imm>=-128 && a->imm<=127) + mask->u4[0]&=0x00001C7E; + else if (a->imm>=-128 && a->imm<=255) + mask->u4[0]&=0x0000187E; + else if (a->imm>=-0x8000 && a->imm<=0x7FFF) + mask->u4[0]&=0x0000186E; + else if (a->imm>=-0x8000 && a->imm<=0xFFFF) + mask->u4[0]&=0x0000106E; + else + mask->u4[0]&=0x0000104E; + } else + mask->u4[0]&=0xF807E380; + if (a->reg1!=0) + mask->u4[0]&=0x8FFFFFFF; + if (a->reg1!=1) + mask->u4[0]&=0xF7FFFFFF; + if (a->reg1!=2) + mask->u4[0]&=0x7FFFFFFF; +// coutln "MASK:",mask->u4[0]; +} + +BoolU4 AsmStoreNum(LexStruct *l,AsmCtrlStruct *a,I8 num,BoolU4 is_question,I8 num_U1s,I8 cnt, + I8 num_ip_rel,I8 num_lit, + U1 *num_exp,LexUndefEntry *num_local_hash,LexUndefEntry *num_glbl_hash, + BoolU4 U1_avail,U8 abs_add_cnt) +{ + I8 i,j; + ExeAbsoluteAddressStruct *tempa; + if (!num_lit) + num=num-num_ip_rel; + for (i=0;iip,num_ip_rel, + num_local_hash,LexLineNum(l),U1_avail,FALSE); + else if (num_glbl_hash) + AddUnresolved(a,num_exp,EIE_REL_U1+num_lit,a->ip,num_ip_rel, + num_glbl_hash,LexLineNum(l),U1_avail,TRUE); + else { + if (!num_lit && (num<-128 || num>127)) { + LexPop(l); + PutAsmError(l,"ST_BRANCH_OUT_OF_RANGE"); + a->ip++; + return FALSE; + } + } + if (is_question) + a->ip++; + else + AsmStoreCodeU1(l,num.u1[0]); + + } else if (num_U1s==2) { + if (num_local_hash) + AddUnresolved(a,num_exp,EIE_REL_U2+num_lit,a->ip,num_ip_rel, + num_local_hash,LexLineNum(l),U1_avail,FALSE); + else if (num_glbl_hash) + AddUnresolved(a,num_exp,EIE_REL_U2+num_lit,a->ip,num_ip_rel, + num_glbl_hash,LexLineNum(l),U1_avail,TRUE); + else { + if (!num_lit && (num <-0x8000 || num>0x7FFF)) { + LexPop(l); + PutAsmError(l,"ST_BRANCH_OUT_OF_RANGE"); + a->ip+=2; + return FALSE; + } + } + if (is_question) + a->ip+=2; + else { + AsmStoreCodeU1(l,num.u1[0]); + AsmStoreCodeU1(l,num.u1[1]); + } + if (U1_avail && !num_local_hash && !num_glbl_hash && + !num_lit && num>=-124 && num<=123) { + LexPop(l); + PutAsmWarning(l,"ST_COULD_USE_U1_DISP"); + return FALSE; + } + } else if (num_U1s==4) { + if (num_local_hash) + AddUnresolved(a,num_exp,EIE_REL_U4+num_lit,a->ip,num_ip_rel, + num_local_hash,LexLineNum(l),U1_avail,FALSE); + else if (num_glbl_hash) + AddUnresolved(a,num_exp,EIE_REL_U4+num_lit,a->ip,num_ip_rel, + num_glbl_hash,LexLineNum(l),U1_avail,TRUE); + if (num_lit && abs_add_cnt & 1) { + tempa=MAllocZ(sizeof(ExeAbsoluteAddressStruct)); + tempa->next=a->absolutes; + a->absolutes=tempa; + tempa->ip=a->ip; + } + if (is_question) + a->ip+=4; + else + for (j=0;j=-124 && num<=123) { + LexPop(l); + PutAsmWarning(l,"ST_COULD_USE_U1_DISP"); + return FALSE; + } + } else if (num_U1s==8) { +//dbgo + if (num_local_hash) + AddUnresolved(a,num_exp,EIE_REL_U4+num_lit,a->ip,num_ip_rel, + num_local_hash,LexLineNum(l),U1_avail,FALSE); + else if (num_glbl_hash) + AddUnresolved(a,num_exp,EIE_REL_U4+num_lit,a->ip,num_ip_rel, + num_glbl_hash,LexLineNum(l),U1_avail,TRUE); + if (num_lit && abs_add_cnt & 1) { + tempa=MAllocZ(sizeof(ExeAbsoluteAddressStruct)); + tempa->next=a->absolutes; + a->absolutes=tempa; + tempa->ip=a->ip; + } + if (is_question) + a->ip+=8; + else + for (j=0;j=-124 && num<=123) { + LexPop(l); + PutAsmWarning(l,"ST_COULD_USE_U1_DISP"); + return FALSE; + } + } + } + return TRUE; +} + + +BoolU4 AsmCodeInstruction(LexStruct *l,AsmCtrlStruct *a, + OpcodeHashEntry *tempo,I8 argcnt) +{ + I8 i,j,a1,a2,om,seg; + U8 arg1mask,arg2mask; + AsmArgStruct *tempa1,*tempa2; + BoolU4 ModrM_complete,U1_avail=FALSE,found_second_possible=FALSE; + + I8 U1_cnt; + U1 last_opcode_U1; + InstructionEntry *tempi; + BoolU4 has_ModrM; + U1 ModrM; + BoolU4 has_SIB; + U1 SIB; + BoolU4 has_address_prefix; + BoolU4 has_operand_prefix; + BoolU4 is_default; + I8 disp,disp_U1s,disp_ip_rel,disp_lit,disp_abs_cnt; + I8 imm, imm_U1s, imm_ip_rel, imm_lit,imm_abs_cnt; + U1 *disp_exp,*imm_exp; + LexUndefEntry *disp_local_hash,*disp_glbl_hash; + LexUndefEntry *imm_local_hash,*imm_glbl_hash; + + I8 best_U1_cnt=255; + U1 blast_opcode_U1; + InstructionEntry *btempi; + BoolU4 bhas_ModrM; + U1 bModrM; + BoolU4 bhas_SIB; + U1 bSIB; + BoolU4 bhas_address_prefix; + BoolU4 bhas_operand_prefix; + BoolU4 bis_default; + I8 bdisp,bdisp_U1s,bdisp_ip_rel,bdisp_lit,bdisp_abs_cnt; + I8 bimm, bimm_U1s, bimm_ip_rel, bimm_lit,bimm_abs_cnt; + U1 *bdisp_exp,*bimm_exp; + LexUndefEntry *bdisp_local_hash,*bdisp_glbl_hash; + LexUndefEntry *bimm_local_hash,*bimm_glbl_hash; + + + if (argcnt>0) + AsmMakeArgMask(&a->arg1,&arg1mask); + else + arg1mask=1; + if (argcnt>1) + AsmMakeArgMask(&a->arg2,&arg2mask); + else + arg2mask=1; + + for (i=0;iinstruction_entry_cnt;i++) { + tempi=&tempo->ins[i]; + if (tempi->arg1==ARGT_REL8 || tempi->arg2==ARGT_REL8) + U1_avail=TRUE; + if (Bt(&arg1mask,tempi->arg1) && Bt(&arg2mask,tempi->arg2)) { + ModrM_complete=FALSE; + last_opcode_U1=0; + has_ModrM=FALSE; + ModrM=0; + has_SIB=FALSE; + SIB=0; + has_address_prefix=FALSE; + has_operand_prefix=FALSE; + if (tempi->default) + is_default=TRUE; + else + is_default=FALSE; + disp=0; disp_U1s=0; disp_ip_rel=0; disp_lit=1; + imm=0; imm_U1s=0; imm_ip_rel=0; imm_lit=1; + disp_exp=NULL; imm_exp=NULL; + disp_local_hash=NULL; disp_glbl_hash=NULL; + disp_abs_cnt=0; + imm_local_hash=NULL; imm_glbl_hash=NULL; + imm_abs_cnt=0; + om=tempi->opcode_modifier; + a1=tempi->arg1; + a2=tempi->arg2; + tempa1=&a->arg1; + tempa2=&a->arg2; + last_opcode_U1=tempi->opcode[tempi->opcode_cnt-1]; + + if (tempi->slash_value<8) { + ModrM+=tempi->slash_value<<3; + has_ModrM=TRUE; + } + + if ((a->use16 && tempi->operand_size32) || + (!a->use16 && tempi->operand_size16)) + has_operand_prefix=TRUE; + + if (om==OM_IB) imm_U1s=1; + else if (om==OM_IW) imm_U1s=2; + else if (om==OM_ID) imm_U1s=4; + + if (om==OM_CB) { + imm_U1s=1; + imm_lit=0; + } else if (om==OM_CW) { + imm_U1s=2; + imm_lit=0; + } else if (om==OM_CD) { + imm_U1s=4; + imm_lit=0; + } + + if (argcnt==1) { + if (best_U1_cnt!=255 && !found_second_possible && !bis_default) { + found_second_possible=TRUE; + if (!a->arg1.size) { + cout SysText("ST_WARNING"),SysText("ST_NO_SIZE_SPECIFIED"); + PrintF("%s,%04d\r\n",l->cur_lfn->name,l->cur_lfn->line_num-1); + } + } + if (tempi->plus_opcode) + last_opcode_U1=last_opcode_U1+tempa1->reg1; + if (a1>=ARGT_RM8 && a1<=ARGT_RM32) { + if (a->use16) + has_address_prefix=TRUE; + + has_ModrM=TRUE; + if (tempa1->imm_or_off_present && tempa1->indirect && tempa1->reg1==8) { + ModrM=ModrM+5; + disp=tempa1->imm; + disp_exp=tempa1->exp; + disp_local_hash=tempa1->undef_local; + disp_glbl_hash=tempa1->undef_glbl; + disp_U1s=4; + disp_abs_cnt=tempa1->absolute_address_cnt; + } else { + if (tempa1->reg2==8 && tempa1->scale==1) + ModrM+=tempa1->reg1; + else { + ModrM+=4; + has_SIB=TRUE; + if (tempa1->scale==1) + SIB=0; + else if (tempa1->scale==2) + SIB=0x40; + else if (tempa1->scale==4) + SIB=0x80; + else if (tempa1->scale==8) + SIB=0xC0; + if (tempa1->reg2==8) { + ModrM_complete=TRUE; + SIB=SIB+(tempa1->reg1<<3)+5; + disp=tempa1->imm; + disp_exp=tempa1->exp; + disp_local_hash=tempa1->undef_local; + disp_glbl_hash=tempa1->undef_glbl; + disp_U1s=4; + disp_abs_cnt=tempa1->absolute_address_cnt; + } else { + SIB=SIB+(tempa1->reg1<<3)+tempa1->reg2; + if (tempa1->reg2==5 && !tempa1->imm_or_off_present && tempa1->indirect) { + ModrM+=0x40; + disp_U1s=1; + ModrM_complete=TRUE; + } + } + } + if (!ModrM_complete) { + if (tempa1->imm_or_off_present) { + disp=tempa1->imm; + disp_exp=tempa1->exp; + disp_local_hash=tempa1->undef_local; + disp_glbl_hash=tempa1->undef_glbl; + disp_abs_cnt=tempa1->absolute_address_cnt; + if (!disp_exp && disp>=-128 && disp<=127) { + ModrM+=0x40; + disp_U1s=1; + } else if (a->use16) { + ModrM+=0x80; + disp_U1s=2; + } else { + ModrM+=0x80; + disp_U1s=4; + } + } else if (!tempa1->indirect) { + has_address_prefix=FALSE; + ModrM+=0xC0; + } else { + if (tempa1->reg1==5) { + ModrM+=0x40; + disp_U1s=1; + } + } + } + } + } else if (a1>=ARGT_REL8 && a1<=ARGT_REL32 || + a1>=ARGT_IMM8 && a1<=ARGT_IMM32 || + a1>=ARGT_UIMM8 && a1<=ARGT_UIMM32) { + imm=tempa1->imm; + imm_exp=tempa1->exp; + imm_local_hash=tempa1->undef_local; + imm_glbl_hash=tempa1->undef_glbl; + imm_abs_cnt=tempa1->absolute_address_cnt; + } + } else if (argcnt==2) { + if (best_U1_cnt!=255 && !found_second_possible && !bis_default) { + found_second_possible=TRUE; + if (a->arg1.size==0 && a->arg2.size==0) { + cout SysText("ST_WARNING"),SysText("ST_NO_SIZE_SPECIFIED"); + PrintF("%s,%04d\r\n",l->cur_lfn->name,l->cur_lfn->line_num-1); + } + } + if (tempi->plus_opcode) { + if (om>=OM_RB && om<=OM_RD) + last_opcode_U1+=tempa1->reg1; + else if (tempi->slash_value==8) { + if (a1>=ARGT_AL && a1<=ARGT_EAX) + last_opcode_U1+=tempa2->reg1; + else if (a2>=ARGT_AL && a2<=ARGT_EAX) + last_opcode_U1+=tempa1->reg1; + } + } + if (a1>=ARGT_RM8 && a1<=ARGT_RM32 ||a2>=ARGT_RM8 && a2<=ARGT_RM32) { + if (a->use16) + has_address_prefix=TRUE; + has_ModrM=TRUE; + if (a2>=ARGT_RM8 && a2<=ARGT_RM32) { + tempa1=&a->arg2; + tempa2=&a->arg1; + } + if (tempi->slash_value==8) { + if (tempa2->just_seg) + ModrM+=(tempa2->seg<<3); + else { + if (tempa2->reg1==8) + ModrM+=(tempa1->reg1<<3); + else + ModrM+=(tempa2->reg1<<3); + } + } + if (tempa1->reg2==8 && tempa1->scale==1) { + if (tempa1->reg1!=8) + ModrM+=tempa1->reg1; + } else { + ModrM+=4; + has_SIB=TRUE; + if (tempa1->scale==1) + SIB=0; + else if (tempa1->scale==2) + SIB=0x40; + else if (tempa1->scale==4) + SIB=0x80; + else if (tempa1->scale==8) + SIB=0xC0; + if (tempa1->reg2==8) { + ModrM_complete=TRUE; + SIB+=(tempa1->reg1<<3)+5; + disp=tempa1->imm; + disp_exp=tempa1->exp; + disp_local_hash=tempa1->undef_local; + disp_glbl_hash=tempa1->undef_glbl; + disp_U1s=4; + disp_abs_cnt=tempa1->absolute_address_cnt; + } else { + SIB+=(tempa1->reg1<<3)+tempa1->reg2; + if (tempa1->reg2==5 && !tempa1->imm_or_off_present && tempa1->indirect) { + ModrM+=0x40; + disp_U1s=1; + ModrM_complete=TRUE; + } + } + } + if (!ModrM_complete) { + if (tempa1->imm_or_off_present && tempa1->indirect && tempa1->reg1==8) { + ModrM=(ModrM & 0xF8)+5; + disp=tempa1->imm; + disp_exp=tempa1->exp; + disp_local_hash=tempa1->undef_local; + disp_glbl_hash=tempa1->undef_glbl; + disp_U1s=4; + disp_abs_cnt=tempa1->absolute_address_cnt; + } else { + if (tempa1->imm_or_off_present) { + disp=tempa1->imm; + disp_exp=tempa1->exp; + disp_local_hash=tempa1->undef_local; + disp_glbl_hash=tempa1->undef_glbl; + disp_abs_cnt=tempa1->absolute_address_cnt; + if (!disp_exp && disp>=-128 && disp<=127) { + ModrM+=0x40; + disp_U1s=1; + } else if (a->use16) { + ModrM+=0x80; + disp_U1s=2; + } else { + ModrM+=0x80; + disp_U1s=4; + } + } else if (!tempa1->indirect) { + has_address_prefix=FALSE; + ModrM+=0xC0; + } else { + if (tempa1->reg1==5) { + ModrM+=0x40; + disp_U1s=1; + } + } + } + } + } else if (a1>=ARGT_MOFFS8 && a1<=ARGT_MOFFS32) { + disp=tempa1->imm; + disp_exp=tempa1->exp; + disp_local_hash=tempa1->undef_local; + disp_glbl_hash=tempa1->undef_glbl; + disp_abs_cnt=tempa1->absolute_address_cnt; + if (a->use16) + disp_U1s=2; + else + disp_U1s=4; + has_address_prefix=FALSE; + } else if (a2>=ARGT_MOFFS8 && a2<=ARGT_MOFFS32) { + disp=tempa2->imm; + disp_exp=tempa2->exp; + disp_local_hash=tempa2->undef_local; + disp_glbl_hash=tempa2->undef_glbl; + disp_abs_cnt=tempa2->absolute_address_cnt; + if (a->use16) + disp_U1s=2; + else + disp_U1s=4; + has_address_prefix=FALSE; + } else if (a1>=ARGT_IMM8 && a1<=ARGT_IMM32 || + a1>=ARGT_UIMM8 && a1<=ARGT_UIMM32) { + imm=tempa1->imm; + imm_exp=tempa1->exp; + imm_local_hash=tempa1->undef_local; + imm_glbl_hash=tempa1->undef_glbl; + imm_abs_cnt=tempa1->absolute_address_cnt; + if (a1==ARGT_IMM8 || a1==ARGT_UIMM8) imm_U1s=1; + else if (a1==ARGT_IMM16 || a1==ARGT_UIMM16) imm_U1s=2; + else imm_U1s=4; + } + if (a2>=ARGT_IMM8 && a2<=ARGT_IMM32 || + a2>=ARGT_UIMM8 && a2<=ARGT_UIMM32) { + imm=tempa2->imm; + imm_exp=tempa2->exp; + imm_local_hash=tempa2->undef_local; + imm_glbl_hash=tempa2->undef_glbl; + imm_abs_cnt=tempa2->absolute_address_cnt; + if (a2==ARGT_IMM8 || a2==ARGT_UIMM8) imm_U1s=1; + else if (a2==ARGT_IMM16 || a2==ARGT_UIMM16) imm_U1s=2; + else imm_U1s=4; + } + } + U1_cnt=tempi->opcode_cnt+disp_U1s+imm_U1s; + if (has_ModrM) U1_cnt++; + if (has_SIB) U1_cnt++; + + if (U1_cntdont_switch_modes && + (has_address_prefix || has_operand_prefix))) { + best_U1_cnt=U1_cnt; + blast_opcode_U1=last_opcode_U1; + btempi=tempi; + bhas_ModrM=has_ModrM; + bModrM=ModrM; + bhas_SIB=has_SIB; + bSIB=SIB; + bhas_address_prefix=has_address_prefix; + bhas_operand_prefix=has_operand_prefix; + bis_default=is_default; + bdisp=disp; + bdisp_U1s=disp_U1s; + bdisp_ip_rel=disp_ip_rel; + bdisp_lit=disp_lit; + bdisp_abs_cnt=disp_abs_cnt; + bimm=imm; + bimm_U1s=imm_U1s; + bimm_ip_rel=imm_ip_rel; + bimm_lit=imm_lit; + bimm_abs_cnt=imm_abs_cnt; + bdisp_exp=disp_exp; + bimm_exp=imm_exp; + bdisp_local_hash=disp_local_hash; + bdisp_glbl_hash=disp_glbl_hash; + bimm_local_hash=imm_local_hash; + bimm_glbl_hash=imm_glbl_hash; + } + } + } + if (best_U1_cnt<255) { + if (bhas_operand_prefix) + AsmStoreCodeU1(l,0x66); //Operand size override + if (bhas_address_prefix || a->use16 && has_SIB) + AsmStoreCodeU1(l,0x67); //Operand size override + + seg=8; + if (argcnt>1 && a->arg2.seg!=8 && !a->arg2.just_seg) + seg=a->arg2.seg; + else if (argcnt>0 && a->arg1.seg!=8 && !a->arg1.just_seg) + seg=a->arg1.seg; + if (seg!=8) { + if (seg==0) + AsmStoreCodeU1(l,0x26); //ES: + else if (seg==1) + AsmStoreCodeU1(l,0x2E); //CS: + else if (seg==2) + AsmStoreCodeU1(l,0x36); //SS: + else if (seg==3) + AsmStoreCodeU1(l,0x3E); //DS: + else if (seg==4) + AsmStoreCodeU1(l,0x64); //FS: + else + AsmStoreCodeU1(l,0x65); //GS: + } + + for (j=0;jopcode_cnt-1;j++) + AsmStoreCodeU1(l,btempi->opcode[j]); + AsmStoreCodeU1(l,blast_opcode_U1); + + if (bhas_ModrM) + AsmStoreCodeU1(l,bModrM); + if (bhas_SIB) + AsmStoreCodeU1(l,bSIB); + + if (bdisp_U1s) { + bdisp_ip_rel=a->ip+bdisp_U1s+bimm_U1s; + if (!AsmStoreNum(l,a,bdisp,FALSE,bdisp_U1s,1,bdisp_ip_rel,bdisp_lit, + bdisp_exp,bdisp_local_hash,bdisp_glbl_hash,U1_avail,bdisp_abs_cnt)) + return FALSE; + } + + if (bimm_U1s) { + bimm_ip_rel=a->ip+bimm_U1s; + if (!AsmStoreNum(l,a,bimm,FALSE,bimm_U1s,1,bimm_ip_rel,bimm_lit, + bimm_exp,bimm_local_hash,bimm_glbl_hash,U1_avail,bimm_abs_cnt)) + return FALSE; + } + return TRUE; + } + LexPop(l); + PutAsmError(l,"ST_INVALID_INSTRUCTION"); + return FALSE; +} + + +void DefineU1s(LexStruct *l,AsmCtrlStruct *a,I8 num_U1s) +{ + BoolU4 is_question,is_dup; + I8 i,dup_value; + U1 *exp; + I1 *ptr; + LexUndefEntry *undef_locals,*undef_glbls; + + while (l->token && l->token!=';') { + undef_locals=NULL; + undef_glbls=NULL; + if (l->token==TK_STRING) { + ptr=l->ident; + i=l->ident_len-1; + while (i--) + AsmStoreCodeU1(l,*ptr++); + Lex(l); //SKip STRING + } else { + is_question=FALSE; + is_dup=FALSE; + l->absolute_address_cnt=0; + if (l->token=='?') { + is_question=TRUE; + Lex(l); + } else { + l->undef_hash_entry=NULL; + l->flags=l->flags & ~(LF_UNRESOLVED_LOCAL+LF_UNRESOLVED_GLBL); + if (!GetExpression(l,&exp)) + LexSkipEol(l); + else { + if (l->flags & (LF_UNRESOLVED_LOCAL | LF_UNRESOLVED_GLBL)) { + if (l->flags & LF_UNRESOLVED_LOCAL) { + undef_locals=l->undef_hash_entry; + l->undef_hash_entry=NULL; + a->has_locals=TRUE; + } else if (l->flags & LF_UNRESOLVED_GLBL) { + undef_glbls=l->undef_hash_entry; + l->undef_hash_entry=NULL; + } + } else { + i=Run(exp); + DelExpression(exp); + } + } + } + if (l->token==TK_IDENT && l->hash_entry) { + if (l->hash_entry->type & HTT_KEYWORD && l->hash_entry->user0==AKW_DUP) { + if (is_question) + PutAsmError(l,"ST_QUESTION_NOT_ALLOWED"); + else { + is_dup=TRUE; + if (Lex(l)!='(') + PutAsmError(l,"ST_EXPECTING_LEFT_PAREN"); + else { + if (Lex(l)=='?') { + is_question=TRUE; + Lex(l); //SKIP "?" + } else + dup_value=AsmEvalExpression(l); + if (l->token!=')') + PutAsmError(l,"ST_EXPECTING_RIGHT_PAREN"); + else + Lex(l); //SKIP ')' + } + } + } + } + if (is_dup) { + if (undef_locals || undef_glbls) + PutAsmError(l,"ST_UNDEFINED_DUP_CNT"); + else + AsmStoreNum(l,a,dup_value,is_question,num_U1s,i,0,1,exp,undef_locals,undef_glbls,FALSE,l->absolute_address_cnt); + } else + AsmStoreNum(l,a,i,is_question,num_U1s,1,0,1,exp,undef_locals,undef_glbls,FALSE,l->absolute_address_cnt); + } + if (l->token==',') + Lex(l); + } + if (l->token==';') + Lex(l); + else + PutAsmError(l,"ST_MISSING_SEMICOLON"); +} + + \ No newline at end of file diff --git a/LT/COMPILE/ASM.TXZ b/LT/COMPILE/ASM.TXZ new file mode 100644 index 0000000..5730ad2 --- /dev/null +++ b/LT/COMPILE/ASM.TXZ @@ -0,0 +1,881 @@ +/* + '%'= 32 bit + '*'= 16 bit + '!'= don't switch modes + '&'= default +*/ +R8 AL 0; +R8 CL 1; +R8 DL 2; +R8 BL 3; +R8 AH 4; +R8 CH 5; +R8 DH 6; +R8 BH 7; +R16 AX 0; +R16 CX 1; +R16 DX 2; +R16 BX 3; +R16 SP 4; +R16 BP 5; +R16 SI 6; +R16 DI 7; +R32 EAX 0; +R32 ECX 1; +R32 EDX 2; +R32 EBX 3; +R32 ESP 4; +R32 EBP 5; +R32 ESI 6; +R32 EDI 7; +SEG ES 0; +SEG CS 1; +SEG SS 2; +SEG DS 3; +SEG FS 4; +SEG GS 5; +KEYWORD include 0; +KEYWORD define 1; +KEYWORD union 2; +KEYWORD catch 3; +KEYWORD class 4; +KEYWORD try 5; +KEYWORD if 6; +KEYWORD else 7; +KEYWORD for 8; +KEYWORD while 9; +KEYWORD extern 10; +KEYWORD LTextern 11; +KEYWORD return 12; +KEYWORD sizeof 13; +KEYWORD LTintern 14; +KEYWORD fmtstr 15; +KEYWORD fmtdata 16; +KEYWORD output_fun 17; +KEYWORD input_fun 18; +KEYWORD cout 19; +KEYWORD dbgo 19; /*used for debugging*/ +KEYWORD do 20; +KEYWORD asm 21; +KEYWORD goto 22; +KEYWORD exe 23; +KEYWORD break 24; +KEYWORD continue 25; +KEYWORD switch 26; +KEYWORD case 27; +KEYWORD default 28; +KEYWORD public 29; +KEYWORD offset 30; +KEYWORD typeof 31; +KEYWORD import 32; +KEYWORD LTimport 33; +KEYWORD coutln 34; +KEYWORD dbgoln 34; + +KEYWORD ALIGN 64; +KEYWORD END 65; +KEYWORD U1 66; +KEYWORD U2 67; +KEYWORD U4 68; +KEYWORD U8 68; /*ALIAS*/ +KEYWORD DU1 69; +KEYWORD DU2 70; +KEYWORD DU4 71; +KEYWORD DUP 72; +KEYWORD ORG 73; +KEYWORD STRUC 74; +KEYWORD ENDS 75; +KEYWORD USE16 76; +KEYWORD USE32 77; +KEYWORD IMPORT 78; +KEYWORD EXPORT 79; +KEYWORD INSERT 80; +KEYWORD LIST 81; +KEYWORD NOLIST 82; +KEYWORD INSERT_COMPRESSED 83; +KEYWORD DU8 84; + +OPCODE PUSH + 0x0E NO CS + 0x16 NO SS + 0x1E NO DS + 0x06 NO ES + 0x0F 0xA0 NO FS + 0x0F 0xA8 NO GS + 0x6A &IB IMM8 + 0x68 *!IW IMM16 + 0x68 %!ID IMM32 + 0x50 +/R *NO R16 + 0x50 +/R %NO R32 + 0xFF /6 *NO RM16 + 0xFF /6 %NO RM32; +OPCODE PUSHA 0x60 NO; +OPCODE PUSHAW 0x60 *NO; +OPCODE PUSHAD 0x60 %NO; +OPCODE PUSHF 0x9C NO; +OPCODE PUSHFW 0x9C *NO; +OPCODE PUSHFD 0x9C %NO; +OPCODE POP + 0x1F NO DS + 0x07 NO ES + 0x17 NO SS + 0x0F 0xA1 NO FS + 0x0F 0xA9 NO GS + 0x58 +*RW R16 + 0x58 +%RD R32 + 0x8F /0 *NO RM16 + 0x8F /0 %NO RM32; +OPCODE POPA 0x61 NO; +OPCODE POPAW 0x61 *NO; +OPCODE POPAD 0x61 %NO; +OPCODE POPF 0x9D NO; +OPCODE POPFW 0x9D *NO; +OPCODE POPFD 0x9D %NO; +OPCODE MOV +// 0xA0 NO AL MOFFS8 + 0xA1 *NO AX MOFFS16 + 0xA1 %NO EAX MOFFS32 +// 0xA2 NO MOFFS8 AL + 0xA3 *NO MOFFS16 AX + 0xA3 %NO MOFFS32 EAX + 0x8A /R NO R8 RM8 + 0x8B /R *NO R16 RM16 + 0x8B /R %NO R32 RM32 + 0x88 /R NO RM8 R8 + 0x89 /R *NO RM16 R16 + 0x89 /R %NO RM32 R32 + 0x8C /R %NO RM16 SREG + 0x8E /R %NO SREG RM16 + 0xB0 +RB R8 UIMM8 + 0xB8 +*RW R16 UIMM16 + 0xB8 +%RD R32 UIMM32 + 0xC6 NO RM8 UIMM8 + 0xC7 *NO RM16 UIMM16 + 0xC7 %NO RM32 UIMM32; + +OPCODE ADC + 0x14 IB AL UIMM8 + 0x15 *IW AX UIMM16 + 0x15 %ID EAX UIMM32 + 0x80 /2 IB RM8 UIMM8 + 0x83 /2 *IB RM16 IMM8 + 0x83 /2 %IB RM32 IMM8 + 0x81 /2 *IW RM16 UIMM16 + 0x81 /2 %ID RM32 UIMM32 + 0x12 /R NO R8 RM8 + 0x13 /R *NO R16 RM16 + 0x13 /R %NO R32 RM32 + 0x10 /R NO RM8 R8 + 0x11 /R *NO RM16 R16 + 0x11 /R %NO RM32 R32; +OPCODE ADD + 0x04 IB AL UIMM8 + 0x05 *IW AX UIMM16 + 0x05 %ID EAX UIMM32 + 0x80 /0 IB RM8 UIMM8 + 0x83 /0 *IB RM16 IMM8 + 0x83 /0 %IB RM32 IMM8 + 0x81 /0 *IW RM16 UIMM16 + 0x81 /0 %ID RM32 UIMM32 + 0x02 /R NO R8 RM8 + 0x03 /R *NO R16 RM16 + 0x03 /R %NO R32 RM32 + 0x00 /R NO RM8 R8 + 0x01 /R *NO RM16 R16 + 0x01 /R %NO RM32 R32; +OPCODE AND + 0x24 IB AL UIMM8 + 0x25 *IW AX UIMM16 + 0x25 %ID EAX UIMM32 + 0x80 /4 IB RM8 UIMM8 + 0x83 /4 *IB RM16 IMM8 + 0x83 /4 %IB RM32 IMM8 + 0x81 /4 *IW RM16 UIMM16 + 0x81 /4 %ID RM32 UIMM32 + 0x22 /R NO R8 RM8 + 0x23 /R *NO R16 RM16 + 0x23 /R %NO R32 RM32 + 0x20 /R NO RM8 R8 + 0x21 /R *NO RM16 R16 + 0x21 /R %NO RM32 R32; +OPCODE CMP + 0x3C IB AL UIMM8 + 0x3D *IW AX UIMM16 + 0x3D %ID EAX UIMM32 + 0x80 /7 IB RM8 UIMM8 + 0x83 /7 *IB RM16 IMM8 + 0X83 /7 %IB RM32 IMM8 + 0x81 /7 *IW RM16 UIMM16 + 0x81 /7 %ID RM32 UIMM32 + 0x3A /R NO R8 RM8 + 0x3B /R *NO R16 RM16 //ERROR? + 0x3B /R %NO R32 RM32 + 0x38 /R NO RM8 R8 + 0x39 /R *NO RM16 R16 + 0x39 /R %NO RM32 R32; +OPCODE OR + 0x0C IB AL UIMM8 + 0x0D *IW AX UIMM16 + 0x0D %ID EAX UIMM32 + 0x80 /1 IB RM8 UIMM8 + 0x83 /1 *IB RM16 IMM8 + 0x83 /1 %IB RM32 IMM8 + 0x81 /1 *IW RM16 UIMM16 + 0x81 /1 %ID RM32 UIMM32 + 0x0A /R NO R8 RM8 + 0x0B /R *NO R16 RM16 + 0x0B /R %NO R32 RM32 + 0x08 /R NO RM8 R8 + 0x09 /R *NO RM16 R16 + 0x09 /R %NO RM32 R32; +OPCODE SBB + 0x1C IB AL UIMM8 + 0x1D *IW AX UIMM16 + 0x1D %ID EAX UIMM32 + 0x80 /3 IB RM8 UIMM8 + 0x83 /3 *IB RM16 IMM8 + 0x83 /3 %IB RM32 IMM8 + 0x81 /3 *IW RM16 UIMM16 + 0x81 /3 %ID RM32 UIMM32 + 0x1A /R NO R8 RM8 + 0x1B /R *NO R16 RM16 + 0x1B /R %NO R32 RM32 + 0x18 /R NO RM8 R8 + 0x19 /R *NO RM16 R16 + 0x19 /R %NO RM32 R32; +OPCODE SUB + 0x2C IB AL UIMM8 + 0x2D *IW AX UIMM16 + 0x2D %ID EAX UIMM32 + 0x80 /5 IB RM8 UIMM8 + 0x83 /5 *IB RM16 IMM8 + 0x83 /5 %IB RM32 IMM8 + 0x81 /5 *IW RM16 UIMM16 + 0x81 /5 %ID RM32 UIMM32 + 0x2A /R NO R8 RM8 + 0x2B /R *NO R16 RM16 + 0x2B /R %NO R32 RM32 + 0x28 /R NO RM8 R8 + 0x29 /R *NO RM16 R16 + 0x29 /R %NO RM32 R32; +OPCODE TEST + 0xA8 IB AL UIMM8 + 0xA9 *IW AX UIMM16 + 0xA9 %ID EAX UIMM32 + 0xF6 /0 IB RM8 UIMM8 + 0xF7 /0 *IW RM16 UIMM16 + 0xF7 /0 %ID RM32 UIMM32 + 0x84 /R NO RM8 R8 + 0x85 /R *NO RM16 R16 + 0x85 /R %NO RM32 R32; +OPCODE NOP 0x90 NO; +OPCODE XCHG + 0x90 +/R *NO R16 AX + 0x90 +/R *NO AX R16 + 0x90 +/R %NO R32 EAX + 0x90 +/R %NO EAX R32 + 0x86 /R NO R8 RM8 + 0x87 /R *NO R16 RM16 + 0x87 /R %NO R32 RM32 + 0x86 /R NO RM8 R8 + 0x87 /R *NO RM16 R16 + 0x87 /R %NO RM32 R32; +OPCODE XOR + 0x34 IB AL UIMM8 + 0x35 *IW AX UIMM16 + 0x35 %ID EAX UIMM32 + 0x80 /6 IB RM8 UIMM8 + 0x83 /6 *IB RM16 IMM8 + 0x83 /6 %IB RM32 IMM8 + 0x81 /6 *IW RM16 UIMM16 + 0x81 /6 %ID RM32 UIMM32 + 0x32 /R NO R8 RM8 + 0x33 /R *NO R16 RM16 + 0x33 /R %NO R32 RM32 + 0x30 /R NO RM8 R8 + 0x31 /R *NO RM16 R16 + 0x31 /R %NO RM32 R32; + +OPCODE CALL + 0xE8 *!&CW REL16 + 0xFF /2 *!NO RM16 + 0xE8 %!&CD REL32 + 0xFF /2 %!NO RM32 +// 0x9A CD PTR1616 +// 0xFF /3 *NO M1616 +// 0x9A *CP PTR1632 +// 0x9A %CP PTR3232 +// 0xFF /3 %NO M1632 + ; + +OPCODE JMP + 0xEB &CB REL8 + 0xE9 *!CW REL16 + 0xE9 %!CD REL32 + 0xFF /4 *!NO RM16 + 0xFF /4 %!NO RM32; +OPCODE JA + 0x77 &CB REL8 + 0x0F 0x87 *!CW REL16 + 0x0F 0x87 %!CD REL32; +OPCODE JAE + 0x73 &CB REL8 + 0x0F 0x83 *!CW REL16 + 0x0F 0x83 %!CD REL32; +OPCODE JB + 0x72 &CB REL8 + 0x0F 0x82 *!CW REL16 + 0x0F 0x82 %!CD REL32; +OPCODE JBE + 0x76 &CB REL8 + 0x0F 0x86 *!CW REL16 + 0x0F 0x86 %!CD REL32; +OPCODE JC + 0x72 &CB REL8 + 0x0F 0x82 *!CW REL16 + 0x0F 0x82 %!CD REL32; +OPCODE JCXZ + 0xE3 CB REL8; +OPCODE JECXZ + 0xE3 CB REL8; +OPCODE JE + 0x74 &CB REL8 + 0x0F 0x84 *!CW REL16 + 0x0F 0x84 %!CD REL32; +OPCODE JZ + 0x74 &CB REL8 + 0x0F 0x84 *!CW REL16 + 0x0F 0x84 %!CD REL32; +OPCODE JG + 0x7F &CB REL8 + 0x0F 0x8F *!CW REL16 + 0x0F 0x8F %!CD REL32; +OPCODE JGE + 0x7D &CB REL8 + 0x0F 0x8D *!CW REL16 + 0x0F 0x8D %!CD REL32; +OPCODE JL + 0x7C &CB REL8 + 0x0F 0x8C *!CW REL16 + 0x0F 0x8C %!CD REL32; +OPCODE JLE + 0x7E &CB REL8 + 0x0F 0x8E *!CW REL16 + 0x0F 0x8E %!CD REL32; +OPCODE JNA + 0x76 &CB REL8 + 0x0F 0x86 *!CW REL16 + 0x0F 0x86 %!CD REL32; +OPCODE JNAE + 0x72 &CB REL8 + 0x0F 0x82 *!CW REL16 + 0x0F 0x82 %!CD REL32; +OPCODE JNB + 0x73 &CB REL8 + 0x0F 0x83 *!CW REL16 + 0x0F 0x83 %!CD REL32; +OPCODE JNBE + 0x77 &CB REL8 + 0x0F 0x87 *!CW REL16 + 0x0F 0x87 %!CD REL32; +OPCODE JNC + 0x73 &CB REL8 + 0x0F 0x83 *!CW REL16 + 0x0F 0x83 %!CD REL32; +OPCODE JNE + 0x75 &CB REL8 + 0x0F 0x85 *!CW REL16 + 0x0F 0x85 %!CD REL32; +OPCODE JNG + 0x7E &CB REL8 + 0x0F 0x8E *!CW REL16 + 0x0F 0x8E %!CD REL32; +OPCODE JNGE + 0x7C &CB REL8 + 0x0F 0x8C *!CW REL16 + 0x0F 0x8C %!CD REL32; +OPCODE JNL + 0x7D &CB REL8 + 0x0F 0x8D *!CW REL16 + 0x0F 0x8D %!CD REL32; +OPCODE JNLE + 0x7F &CB REL8 + 0x0F 0x8F *!CW REL16 + 0x0F 0x8F %!CD REL32; +OPCODE JNO + 0x71 &CB REL8 + 0x0F 0x81 *!CW REL16 + 0x0F 0x81 %!CD REL32; +OPCODE JNP + 0x7B &CB REL8 + 0x0F 0x8B *!CW REL16 + 0x0F 0x8B %!CD REL32; +OPCODE JNS + 0x79 &CB REL8 + 0x0F 0x89 *!CW REL16 + 0x0F 0x89 %!CD REL32; +OPCODE JNZ + 0x75 &CB REL8 + 0x0F 0x85 *!CW REL16 + 0x0F 0x85 %!CD REL32; +OPCODE JO + 0x70 &CB REL8 + 0x0F 0x80 *!CW REL16 + 0x0F 0x80 %!CD REL32; +OPCODE JP + 0x7A &CB REL8 + 0x0F 0x8A *!CW REL16 + 0x0F 0x8A %!CD REL32; +OPCODE JPE + 0x7A &CB REL8 + 0x0F 0x8A *!CW REL16 + 0x0F 0x8A %!CD REL32; +OPCODE JPO + 0x7B &CB REL8 + 0x0F 0x8B *!CW REL16 + 0x0F 0x8B %!CD REL32; +OPCODE JS + 0x78 &CB REL8 + 0x0F 0x88 *!CW REL16 + 0x0F 0x88 %!CD REL32; +OPCODE JZ + 0x74 &CB REL8 + 0x0F 0x84 *!CW REL16 + 0x0F 0x84 %!CD REL32; + + +OPCODE INC + 0x40 +*RW R16 + 0x40 +%RD R32 + 0xFE /0 NO RM8 + 0xFF /0 *NO RM16 + 0xFF /0 %NO RM32; +OPCODE DEC + 0x48 +*RW R16 + 0x48 +%RD R32 + 0xFE /1 NO RM8 + 0xFF /1 *NO RM16 + 0xFF /1 %NO RM32; +OPCODE NOT + 0xF6 /2 NO RM8 + 0xF7 /2 *NO RM16 + 0xF7 /2 %NO RM32; +OPCODE NEG + 0xF6 /3 NO RM8 + 0xF7 /3 *NO RM16 + 0xF7 /3 %NO RM32; +OPCODE MUL + 0xF6 /4 NO RM8 + 0xF7 /4 *NO RM16 + 0xF7 /4 %NO RM32; +OPCODE IMUL + 0xF6 /5 NO RM8 + 0xF7 /5 *NO RM16 + 0xF7 /5 %NO RM32; +OPCODE IMUL2 + 0x0F 0xAF /R *NO R16 RM16 + 0x0F 0xAF /R *NO R32 RM32 + 0x6B /R *IB RM16 IMM8 + 0x6B /R %IB RM32 IMM8 + 0x69 /R *IW RM16 UIMM16 + 0x69 /R %ID RM32 UIMM32; +OPCODE DIV + 0xF6 /6 NO RM8 + 0xF7 /6 *NO RM16 + 0xF7 /6 %NO RM32; +OPCODE IDIV + 0xF6 /7 NO RM8 + 0xF7 /7 *NO RM16 + 0xF7 /7 %NO RM32; + +OPCODE AAA 0x37 NO; +OPCODE AAD 0xD5 0x0A NO; +OPCODE AAM 0xD4 0x0A NO; +OPCODE AAS 0x3F NO; +OPCODE ARPL 0x63 /R NO RM16 R16; +OPCODE BOUND + 0x62 /R *NO RM16 R16 + 0x62 /R %NO RM32 R32; +OPCODE BSF + 0x0F 0xBC /R *NO R16 RM16 + 0x0F 0xBC /R %NO R32 RM32; +OPCODE BSR + 0x0F 0xBD /R *NO R16 RM16 + 0x0F 0xBD /R %NO R32 RM32; +OPCODE BSWAP + 0x0F 0xC8 /R %NO R32; +OPCODE BT + 0x0F 0xA3 /R *NO RM16 R16 + 0x0F 0xA3 /R %NO RM32 R32 + 0x0F 0xBA /4 *IB RM16 UIMM8 + 0x0F 0xBA /4 %IB RM32 UIMM8; +OPCODE BTC + 0x0F 0xBB /R *NO RM16 R16 + 0x0F 0xBB /R %NO RM32 R32 + 0x0F 0xBA /7 *IB RM16 UIMM8 + 0x0F 0xBA /7 %IB RM32 UIMM8; +OPCODE BTR + 0x0F 0xB3 /R *NO RM16 R16 + 0x0F 0xB3 /R %NO RM32 R32 + 0x0F 0xBA /6 *IB RM16 UIMM8 + 0x0F 0xBA /6 %IB RM32 UIMM8; +OPCODE BTS + 0x0F 0xAB /R *NO RM16 R16 + 0x0F 0xAB /R %NO RM32 R32 + 0x0F 0xBA /5 *IB RM16 UIMM8 + 0x0F 0xBA /5 %IB RM32 UIMM8; +OPCODE CBW 0x98 NO; +OPCODE CDQ 0x99 NO; +OPCODE CLC 0xF8 NO; +OPCODE CLD 0xFC NO; +OPCODE CLI 0xFA NO; +OPCODE CLTS 0x0F 0x06 NO; +OPCODE CMC 0xF5 NO; +OPCODE CMPSB 0xA6 NO; +OPCODE CMPSW 0xA7 *NO; +OPCODE CMPSD 0xA7 %NO; +OPCODE CMPXCHG + 0x0F 0xB0 /R NO RM8 R8 + 0x0F 0xB1 /R *NO RM16 R16 + 0x0F 0xB1 /R %NO RM32 R32; +//OPCODE CHPXCHG8B 0x0F 0xC7 NO RM64 +OPCODE CPUID 0x0F 0xA2 NP; +OPCODE CWD 0x99 NO; +OPCODE CWDE 0x98 NO; +OPCODE DAA 0x27 NO; +OPCODE DAS 0x2F NO; +//OPCODE ENTER 0xC8 IW IB IMM16 IMM8; +OPCODE HLT 0xF4 NO; +OPCODE IN + 0xE4 IB AL UIMM8 + 0xE5 *IB AX UIMM8 + 0xE5 %IB EAX UIMM8 + 0xEC NO AL DX + 0xED *NO AX DX + 0xED %NO EAX DX; +OPCODE INS + 0x6C NO RM8 DX + 0x6D *NO RM16 DX + 0x6D %NO RM32 DX; +OPCODE INSB 0x6C NO; +OPCODE INSW 0x6D *NO; +OPCODE INSD 0x6D %NO; +OPCODE INTO 0xCE NO; +OPCODE INT3 0xCC NO; +OPCODE INT 0xCD IB IMM8; +OPCODE INVD 0x0F 0x08 NO; +//OPCODE INVLPG 0x0F 0x07 /7 M; +OPCODE IRET 0xCF NO; +OPCODE LAHF 0x9F NO; +OPCODE LAR + 0x0F 0x02 /R *NO R16 RM16 + 0x0F 0x02 /R %NO R32 RM32; +OPCODE LEA + 0x8D /R *NO R16 RM16 + 0x8D /R %NO R32 RM32; +OPCODE LEAVE 0xC9 NO; +OPCODE LGDT + 0x0F 0x01 /2 *NO M16 + 0x0F 0x01 /2 %NO M32; +OPCODE LIDT + 0x0F 0x01 /3 *NO M16 + 0x0F 0x01 /3 %NO M32; +//OPCODE LGS LSS LFS LDS LES +OPCODE LLDT + 0x0F 0x00 /2 *NO RM16 + 0x0F 0x00 /2 %NO RM32; +OPCODE LMSW + 0x0F 0x01 /6 *NO RM16 + 0x0F 0x01 /6 %NO RM32; +OPCODE LOCK 0xF0 NO; +OPCODE LODSB 0xAC NO; +OPCODE LODSW 0xAD *NO; +OPCODE LODSD 0xAD %NO; +OPCODE LOOP 0xE2 CB REL8; +OPCODE LOOPE 0xE1 CB REL8; +OPCODE LOOPZ 0xE1 CB REL8; +OPCODE LOOPNE 0xE0 CB REL8; +OPCODE LOOPNZ 0xE0 CB REL8; +OPCODE LSL + 0x0F 0x03 /R *NO R16 RM16 + 0x0F 0x03 /R %NO R32 RM32; +OPCODE LTR + 0x0F 0x00 /3 *NO RM16 + 0x0F 0x00 /3 %NO RM32; +OPCODE MOVSB 0xA4 NO; +OPCODE MOVSW 0xA5 *NO; +OPCODE MOVSD 0xA5 %NO; +OPCODE MOVSX + 0x0F 0xBE /R *NO R16 RM8 + 0x0F 0xBE /R %NO R32 RM8 + 0x0F 0xBF /R %NO R32 RM16; +OPCODE MOVZX + 0x0F 0xB6 /R *NO R16 RM8 + 0x0F 0xB6 /R %NO R32 RM8 + 0x0F 0xB7 /R %NO R32 RM16; +OPCODE OUT + 0xE6 IB UIMM8 AL + 0xE7 *IB UIMM8 AX + 0xE7 %IB UIMM8 EAX + 0xEE NO DX AL + 0xEF *NO DX AX + 0xEF %NO DX EAX; +OPCODE OUTSB 0x6E NO; +OPCODE OUTSW 0x6F *NO; +OPCODE OUTSD 0x6F %NO; +OPCODE RDMSR 0x0F 0x32 NO; +OPCODE REP_INSB 0xF3 0x6C NO; +OPCODE REP_INSW 0xF3 0x6D *NO; +OPCODE REP_INSD 0xF3 0x6D %NO; +OPCODE REP_MOVSB 0xF3 0xA4 NO; +OPCODE REP_MOVSW 0xF3 0xA5 *NO; +OPCODE REP_MOVSD 0xF3 0xA5 %NO; +OPCODE REP_OUTSB 0xF3 0x6E NO; +OPCODE REP_OUTSW 0xF3 0x6F *NO; +OPCODE REP_OUTSD 0xF3 0x6F %NO; +OPCODE REP_LODSB 0xF2 0xAC NO; +OPCODE REP_LODSW 0xF2 0xAD *NO; +OPCODE REP_LODSD 0xF2 0xAD %NO; +OPCODE REP_STOSB 0xF3 0xAA NO; +OPCODE REP_STOSW 0xF3 0xAB *NO; +OPCODE REP_STOSD 0xF3 0xAB %NO; +OPCODE REPE_CMPSB 0xF3 0xA6 NO; +OPCODE REPE_CMPSW 0xF3 0xA7 *NO; +OPCODE REPE_CMPSD 0xF3 0xA7 %NO; +OPCODE REPE_SCASB 0xF3 0xAE NO; +OPCODE REPE_SCASW 0xF3 0xAF *NO; +OPCODE REPE_SCASD 0xF3 0xAF %NO; +OPCODE REPNE_CMPSB 0xF2 0xA6 NO; +OPCODE REPNE_CMPSW 0xF2 0xA7 *NO; +OPCODE REPNE_CMPSD 0xF2 0xA7 %NO; +OPCODE REPNE_SCASB 0xF2 0xAE NO; +OPCODE REPNE_SCASW 0xF2 0xAF *NO; +OPCODE REPNE_SCASD 0xF2 0xAF %NO; +OPCODE RET 0xC3 NO; +OPCODE RET2 0xC2 IW UIMM16; +OPCODE RETF 0xCB NO; +OPCODE RETF2 0xCA IW UIMM16; +OPCODE RSM 0x0F 0xAA NO; +OPCODE SAHF 0x9E NO; +OPCODE SCASB 0xAE NO; +OPCODE SCASW 0xAF *NO; +OPCODE SCASD 0xAF %NO; +OPCODE SEGCS 0x2E NO; +OPCODE SEGSS 0x36 NO; +OPCODE SEGDS 0x3E NO; +OPCODE SEGES 0x26 NO; +OPCODE SEGFS 0x64 NO; +OPCODE SEGGS 0x65 NO; +OPCODE SETA 0x0F 0x97 NO RM8; +OPCODE SETAE 0x0F 0x93 NO RM8; +OPCODE SETB 0x0F 0x92 NO RM8; +OPCODE SETBE 0x0F 0x96 NO RM8; +OPCODE SETC 0x0F 0x92 NO RM8; +OPCODE SETE 0x0F 0x94 NO RM8; +OPCODE SETG 0x0F 0x9F NO RM8; +OPCODE SETGE 0x0F 0x9D NO RM8; +OPCODE SETL 0x0F 0x9C NO RM8; +OPCODE SETLE 0x0F 0x9E NO RM8; +OPCODE SETNA 0x0F 0x96 NO RM8; +OPCODE SETNAE 0x0F 0x92 NO RM8; +OPCODE SETNB 0x0F 0x93 NO RM8; +OPCODE SETNBE 0x0F 0x97 NO RM8; +OPCODE SETNC 0x0F 0x93 NO RM8; +OPCODE SETNE 0x0F 0x95 NO RM8; +OPCODE SETNG 0x0F 0x9E NO RM8; +OPCODE SETNGE 0x0F 0x9C NO RM8; +OPCODE SETNL 0x0F 0x9D NO RM8; +OPCODE SETNLE 0x0F 0x9F NO RM8; +OPCODE SETNO 0x0F 0x91 NO RM8; +OPCODE SETNP 0x0F 0x9B NO RM8; +OPCODE SETNS 0x0F 0x99 NO RM8; +OPCODE SETNZ 0x0F 0x95 NO RM8; +OPCODE SETO 0x0F 0x90 NO RM8; +OPCODE SETP 0x0F 0x9A NO RM8; +OPCODE SETPE 0x0F 0x9A NO RM8; +OPCODE SETPO 0x0F 0x9B NO RM8; +OPCODE SETS 0x0F 0x98 NO RM8; +OPCODE SETZ 0x0F 0x94 NO RM8; +//OPCODE SGDT 0x0F 0x01 /0 m +//OPCODE SIDT 0x0F 0x01 /0 m +OPCODE SHLD + 0x0F 0xA5 /R *NO RM16 R16 + 0x0F 0xA5 /R %NO RM32 R32; +OPCODE SHRD + 0x0F 0xAD /R *NO RM16 R16 + 0x0F 0xAD /R %NO RM32 R32; +OPCODE SLDT + 0x0F 0x00 /0 *NO RM16 + 0x0F 0x00 /0 %NO RM32; +OPCODE SMSW + 0x0F 0x01 /4 *NO RM16 + 0x0F 0x01 /4 %NO RM32; +OPCODE STC 0xF9 NO; +OPCODE STD 0xFD NO; +OPCODE STI 0xFB NO; +OPCODE STOSB 0xAA NO; +OPCODE STOSW 0xAB *NO; +OPCODE STOSD 0xAB %NO; +OPCODE STR + 0x0F 0x00 /1 *NO RM16 + 0x0F 0x00 /1 %NO RM32; +OPCODE VERR + 0x0F 0x00 /4 *NO RM16 + 0x0F 0x00 /4 %NO RM32; +OPCODE VERW + 0x0F 0x00 /5 *NO RM16 + 0x0F 0x00 /5 %NO RM32; +OPCODE WAIT 0x9B NO; +OPCODE WBINVD 0x0F 0x09 NO; +OPCODE WRMSR 0x0F 0x30 NO; +OPCODE XADD + 0x0F 0xC0 /R NO RM8 R8 + 0x0F 0xC1 /R *NO RM16 R16 + 0x0F 0xC1 /R %NO RM32 R32; +OPCODE XLATB 0xD7 NO; + + +OPCODE RCL + 0xD2 /2 NO RM8 CL + 0xD3 /2 *NO RM16 CL + 0xD3 /2 %NO RM32 CL + 0xC0 /2 IB RM8 UIMM8 + 0xC1 /2 *IB RM16 UIMM8 + 0xC1 /2 %IB RM32 UIMM8; +OPCODE RCL1 + 0xD0 /2 NO RM8 + 0xD1 /2 *NO RM16 + 0xD1 /2 %NO RM32; +OPCODE RCR + 0xD2 /3 NO RM8 CL + 0xD3 /3 *NO RM16 CL + 0xD3 /3 %NO RM32 CL + 0xC0 /3 IB RM8 UIMM8 + 0xC1 /3 *IB RM16 UIMM8 + 0xC1 /3 %IB RM32 UIMM8; +OPCODE RCR1 + 0xD0 /3 NO RM8 + 0xD1 /3 *NO RM16 + 0xD1 /3 %NO RM32; +OPCODE ROL + 0xD2 /0 NO RM8 CL + 0xD3 /0 *NO RM16 CL + 0xD3 /0 %NO RM32 CL + 0xC0 /0 IB RM8 UIMM8 + 0xC1 /0 *IB RM16 UIMM8 + 0xC1 /0 %IB RM32 UIMM8; +OPCODE ROL1 + 0xD0 /0 NO RM8 + 0xD1 /0 *NO RM16 + 0xD1 /0 %NO RM32; +OPCODE ROR + 0xD2 /1 NO RM8 CL + 0xD3 /1 *NO RM16 CL + 0xD3 /1 %NO RM32 CL + 0xC0 /1 IB RM8 UIMM8 + 0xC1 /1 *IB RM16 UIMM8 + 0xC1 /1 %IB RM32 UIMM8; +OPCODE ROR1 + 0xD0 /1 NO RM8 + 0xD1 /1 *NO RM16 + 0xD1 /1 %NO RM32; + +OPCODE SAL + 0xD2 /4 NO RM8 CL + 0xD3 /4 *NO RM16 CL + 0xD3 /4 %NO RM32 CL + 0xC0 /4 IB RM8 UIMM8 + 0xC1 /4 *IB RM16 UIMM8 + 0xC1 /4 %IB RM32 UIMM8; +OPCODE SAL1 + 0xD0 /4 NO RM8 + 0xD1 /4 *NO RM16 + 0xD1 /4 %NO RM32; + +OPCODE SAR + 0xD2 /7 NO RM8 CL + 0xD3 /7 *NO RM16 CL + 0xD3 /7 %NO RM32 CL + 0xC0 /7 IB RM8 UIMM8 + 0xC1 /7 *IB RM16 UIMM8 + 0xC1 /7 %IB RM32 UIMM8; +OPCODE SAR1 + 0xD0 /7 NO RM8 + 0xD1 /7 *NO RM16 + 0xD1 /7 %NO RM32; + +OPCODE SHL + 0xD2 /4 NO RM8 CL + 0xD3 /4 *NO RM16 CL + 0xD3 /4 %NO RM32 CL + 0xC0 /4 IB RM8 UIMM8 + 0xC1 /4 *IB RM16 UIMM8 + 0xC1 /4 %IB RM32 UIMM8; +OPCODE SHL1 + 0xD0 /4 NO RM8 + 0xD1 /4 *NO RM16 + 0xD1 /4 %NO RM32; + +OPCODE SHR + 0xD2 /5 NO RM8 CL + 0xD3 /5 *NO RM16 CL + 0xD3 /5 %NO RM32 CL + 0xC0 /5 IB RM8 UIMM8 + 0xC1 /5 *IB RM16 UIMM8 + 0xC1 /5 %IB RM32 UIMM8; +OPCODE SHR1 + 0xD0 /5 NO RM8 + 0xD1 /5 *NO RM16 + 0xD1 /5 %NO RM32; + +OPCODE FILD + 0xDF /5 NO RM32; //Load 64 bit I4 +OPCODE FISTP + 0xDF /7 NO RM32; //Store 64 bit I4 +OPCODE FLD + 0xDD /0 NO RM32; //Load 64 bit double +OPCODE FSTP + 0xDD /3 NO RM32; //Store 64 bit double +OPCODE FST + 0xDD /2 NO RM32; //Store 64 bit double +OPCODE FRSTOR + 0xDD /4 NO RM32; +OPCODE FSAVE + 0x9B 0xDD /6 NO RM32; + +OPCODE FYL2X 0xD9 0xF1 NO; +OPCODE FYL2XP1 0xD9 0xF9 NO; +OPCODE F2XM1 0xD9 0xF0 NO; +OPCODE FABS 0xD9 0xE1 NO; +OPCODE FCHS 0xD9 0xE0 NO; +OPCODE FSIN 0xD9 0xFE NO; +OPCODE FCOS 0xD9 0xFF NO; +OPCODE FPTAN 0xD9 0xF2 NO; +OPCODE FPATAN 0xD9 0xF3 NO; +OPCODE FSQRT 0xD9 0xFA NO; +OPCODE FMULP 0xDE 0xC9 NO; +OPCODE FDIVP 0xDE 0xF9 NO; +OPCODE FDIVRP 0xDE 0xF1 NO; +OPCODE FPREM 0xD9 0xF8 NO; +OPCODE FADDP 0xDE 0xC1 NO; +OPCODE FSUBP 0xDE 0xE9 NO; +OPCODE FSUBRP 0xDE 0xE1 NO; +OPCODE FCOMIP 0xDF 0xF1 NO; +OPCODE FCLEX 0x9B 0xDB 0xE2 NO; +OPCODE FSTSW 0x98 0xDF 0xE0 NO; +OPCODE FDECSTP 0xD9 0xF6 NO; +OPCODE FINCSTP 0xD9 0xF7 NO; +OPCODE FFREE 0xDD 0xC0 NO; +OPCODE FRNDINT 0xD9 0xFC NO; +OPCODE FSCALE 0xD9 0xFD NO; +OPCODE FXTRACT 0xD9 0xF4 NO; +OPCODE FLD1 0xD9 0xE8 NO; +OPCODE FLDL2T 0xD9 0xE9 NO; +OPCODE FLDL2E 0xD9 0xEA NO; +OPCODE FLDPI 0xD9 0xEB NO; +OPCODE FLDLG2 0xD9 0xEC NO; +OPCODE FLDLN2 0xD9 0xED NO; +OPCODE FLDZ 0xD9 0xEE NO; +OPCODE FXCH 0xD9 0xC9 NO; +OPCODE FSTCW 0x9B 0xD9 /7 NO RM32; +OPCODE FLDCW 0xD9 /5 NO RM32; diff --git a/LT/COMPILE/CMP.ASZ b/LT/COMPILE/CMP.ASZ new file mode 100644 index 0000000000000000000000000000000000000000..b7ec6b5f98a2fa76ae5c836bdfc8eefc323215bc GIT binary patch literal 466 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

a zaSif=rhN7W6>xy~Waee3LUS}I6g>SviX467Lm~rQgJFuFC^0aE!pys)!oUy!x+B@K z1Q9e0a?YRA_n#k zkU)0x0o|118|)s;zWz{w`K1XOWuVFXn|p?Qf#mA?5Yp!{w`-k2HyA_eQ-+sE z7{R(Sb5fBSPV6zDA_JV*WF~{d5gaoisYSUA>=RTN7)mmV^2-?*5>7KR_!pFbD{cmc z0!DD17Z4N-I_`~up+TL2Aq8C6qP8O$G9b-mP)!MH|1!8cgDXPc#OzeZqIBQH;%o*6 zv0aFi3~4K#tAr%`633hz&twLMkD6frxuoVWFl=0mNCx1{$-n?Q1soI`7_HbpDxfBB zZhl!RxWN>hn$Ey}0@^%JttbgDO#(MwAY+wK_anFZ=1MR!IHsf^E+J-MSfdVh3b;h* zJOvID-^}9T%)E34hBGS>PIH4@{mTG4^A1#BhT^g?<8yrJM=1hug|5toiLFtmW;p)@ro-qSF?1k}m|)m)(CUsF&7 zjTjg}=bfSo8Z$6#hSu<)Yn+Q27!=yU2?AWkA}1Npsddc@r z4AgFP&P@SDJ_AGTV?^MD6jg%DqAe>J82n2il?B7qm0%7m`F0?Zn128R`vqlCAr)Fs zkXppRuxTm6ELcE;3Nr=<>nc!iI;Nz6dOR;w7#RGMlS?6GLNNn-1SGA4D<=luGvL^B z%}ZfmFi~ey`49S-fZVCopP0YY>`!qrf+Mjee&B%~nP!gX9Y7R&KL&zgFh-z)Y=>uAd`jn)B zLX?3aDHGjIGav;=a7d7!vu^+c!(wM}!vRvyLn_G}a8?4PKhHc!Ytpj_Tub<*RzNB~ zb_G=i258%l{RhNE#~|l;XAf6r@A%+QUk3ISY77j1spX(LA6#5AFwAcPg|l;hZW6dx z{O1@WgIi`rX@L{ijs69O3=A_*potkVFswO=CT7gQuoT=;ax5rF1;xaEU9jJs5|gt_ z3qZXiaAdJhfw(I;Bna%$n^s^|!P%JwuK76(>`M^R0g(*sHfjtEj!DJ&Ina)aAE-IQ zegzWy@b;_>q*39WS{a^Sl)}KUO$XFEh1`c7TAW%G0xq4HdZ9iAwU`;$kDwGE3=E)4 Qqrlw=P%rX7co2^P0Dyoy>i_@% literal 0 HcmV?d00001 diff --git a/LT/COMPILE/CMP.HPZ b/LT/COMPILE/CMP.HPZ new file mode 100644 index 0000000000000000000000000000000000000000..03bcafa7cd9b4f371d9645df4bfdab571b1eb2c7 GIT binary patch literal 1714 zcmXRYP0GnkR!FTVNiE7#@JX!*E-5NaE>Y0(Nv-fpE!XfgRM1K)P16arP)N&3OfS{} z38ZD_q~;~&rfORAa-kYfmYQ92_cxQ%i#LON)|I-7<4hJ@eA?Q8eiU zR~CCD7H7ETl@wJfXl39q#3!{PptK|;KRY!KMLVYQPz#XT+*3=OGZKpksD=3?I6Jez zHJ>QoxTNN|RumMa78hsc=V^o*DrhC=r(g-BPzwduvP5LHLVVR`R;s48g1)|+ zqffA_ZC<`YYEcooA)XcrI84B1B{;lYD^deWOM;>445SQ8!2?oMl$lrJ22oa&tfQx= zhpE=nLcuvdw;(eIT z1AFQ1oLG{a;h2-7futWC1)h1CCD3py(s0Vp&j~eANXslL24^SqC{D>QP0C4Ca5QoO pGr*22E=mT6uU2YaN_;^{5sq~36XKFs0@4a$z_c2H+{4So0002;Ksf*a literal 0 HcmV?d00001 diff --git a/LT/COMPILE/CMP.MPZ b/LT/COMPILE/CMP.MPZ new file mode 100644 index 0000000..49d0557 --- /dev/null +++ b/LT/COMPILE/CMP.MPZ @@ -0,0 +1,1126 @@ +$LK +BI,"A2Double ","FL:::/LT/COMPILE/SPRINTF2.CPZ,520",1$0000F10F 0001 Funct Export +$LK +BI,"A2LTDate ","FL:::/LT/COMPILE/SPRINTF2.CPZ,585",2$0000F6E9 0001 Funct Export +$LK "ADAM_STARTUP_NAME ","FL:::/LT/COMPILE/COMPILE.CPZ,2633"$"/LT/OSM 0002 StrConst +$LK +BI,"AdamStartUpFile ","FL:::/LT/COMPILE/COMPILE.CPZ,2634",3$000369E6 0000 Funct Export +$LK +BI,"AddUnresolved ","FL:::/LT/COMPILE/ASM.CPZ,207",4$0001189D 0008 Funct Export +$LK +BI,"AsmCodeInstruction ","FL:::/LT/COMPILE/ASM.CPZ,888",5$0001550D 0001 Funct Export +$LK +BI,"AsmEvalExpression ","FL:::/LT/COMPILE/ASM.CPZ,309",6$00012047 0003 Funct Export +$LK +BI,"AsmListLine ","FL:::/LT/COMPILE/ASM.CPZ,235",7$00011A92 0002 Funct Export +$LK +BI,"AsmMakeArgMask ","FL:::/LT/COMPILE/ASM.CPZ,700",8$00014347 0002 Funct Export +$LK +BI,"AsmStoreCodeU1 ","FL:::/LT/COMPILE/ASM.CPZ,261",9$00011CA3 0020 Funct Export +$LK +BI,"AsmStoreCodeU1At ","FL:::/LT/COMPILE/ASM.CPZ,291",10$00011F1A 000D Funct Export +$LK +BI,"AsmStoreNum ","FL:::/LT/COMPILE/ASM.CPZ,776",11$0001494D 0004 Funct Export +$LK "CODE_TABLE ","FL:::/LT/COMPILE/CODE.ASZ,153"$000001A0 0001 SysSym Export +$LK "COMPILER_END ","FL:::/LT/COMPILE/CMP.ASZ,23"$00036B9D 0000 SysSym Export +$LK "COMPILER_START ","FL:::/LT/COMPILE/CMP.ASZ,6"$00000000 0000 SysSym Export +$LK "CP_OPTNEXT ","FL:::/LT/COMPILE/CODE.ASZ,62"$00000110 0001 SysSym Export +$LK "CP_PRSPOP ","FL:::/LT/COMPILE/CODE.ASZ,138"$00000188 0001 SysSym Export +$LK "CP_PRSPUSH ","FL:::/LT/COMPILE/CODE.ASZ,124"$00000170 0001 SysSym Export +$LK +BI,"CatchAll ","FL:::/LT/COMPILE/COMPILE.CPZ,376",12$0002AF16 0002 Funct Export +$LK +BI,"CbAddIc ","FL:::/LT/COMPILE/LEX.CPZ,1115",13$00007A3B 0083 Funct Export +$LK +BI,"CbAppend ","FL:::/LT/COMPILE/LEX.CPZ,1227",14$000081A5 0003 Funct Export +$LK +BI,"CbCombine ","FL:::/LT/COMPILE/LEX.CPZ,1247",15$0000829F 0001 Funct Export +$LK +BI,"CbCompile ","FL:::/LT/COMPILE/LEX.CPZ,1357",16$00008D02 0004 Funct Export +$LK +BI,"CbCountCode ","FL:::/LT/COMPILE/LEX.CPZ,1272",17$0000844C 0002 Funct Export +$LK +BI,"CbFindGotoLabel ","FL:::/LT/COMPILE/LEX.CPZ,1175",18$00007E3E 0002 Funct Export +$LK +BI,"CbGetIc1 ","FL:::/LT/COMPILE/LEX.CPZ,1142",19$00007C22 0003 Funct Export +$LK +BI,"CbInitInPtrs ","FL:::/LT/COMPILE/LEX.CPZ,1096",20$0000796C 0005 Funct Export +$LK +BI,"CbInitOutPtrs ","FL:::/LT/COMPILE/LEX.CPZ,1083",21$000078A4 0008 Funct Export +$LK +BI,"CbMiscNew ","FL:::/LT/COMPILE/LEX.CPZ,1188",22$00007ED1 0014 Funct Export +$LK +BI,"CbPop ","FL:::/LT/COMPILE/LEX.CPZ,1166",23$00007D96 0007 Funct Export +$LK +BI,"CbPopNoFree ","FL:::/LT/COMPILE/LEX.CPZ,1218",24$00008104 0001 Funct Export +$LK +BI,"CbPush ","FL:::/LT/COMPILE/LEX.CPZ,1157",25$00007CDF 000C Funct Export +$LK +BI,"CbPutAllIc ","FL:::/LT/COMPILE/LEX.CPZ,1104",26$000079CE 0005 Funct Export +$LK +BI,"CbPutClass ","FL:::/LT/COMPILE/LEX.CPZ,1032",27$0000752E 0001 Funct Export +$LK +BI,"CbPutIc ","FL:::/LT/COMPILE/LEX.CPZ,1057",28$000076A6 0003 Funct Export +$LK +BI,"CmpClassNew ","FL:::/LT/COMPILE/ASM.CPZ,2",29$000108C0 0003 Funct Export +$LK +BI,"CmpKeyWord ","FL:::/LT/COMPILE/COMPILE.CPZ,1",30$0002921C 0008 Funct Export +$LK +BI,"CmpOptPass1 ","FL:::/LT/COMPILE/OPT.CPZ,108",31$0001CD04 0000 Funct Export +$LK +BI,"CmpOptPass2 ","FL:::/LT/COMPILE/OPT.CPZ,1228",32$00021D80 0000 Funct Export +$LK +BI,"CmpOptPass3 ","FL:::/LT/COMPILE/OPT.CPZ,1750",33$00024542 0000 Funct Export +$LK +BI,"CmpOptPass4 ","FL:::/LT/COMPILE/OPT.CPZ,2526",34$000279BD 0000 Funct Export +$LK +BI,"CmpParseAsmBlk ","FL:::/LT/COMPILE/COMPILE.CPZ,1021",35$0002E906 0001 Funct Export +$LK +BI,"CmpParseClass ","FL:::/LT/COMPILE/COMPILE.CPZ,216",36$0002A3B1 0004 Funct Export +$LK +BI,"CmpParseCout ","FL:::/LT/COMPILE/COMPILE.CPZ,869",37$0002DBF9 0002 Funct Export +$LK +BI,"CmpParseDoWhile ","FL:::/LT/COMPILE/COMPILE.CPZ,719",38$0002CDCF 0001 Funct Export +$LK +BI,"CmpParseExeBlk ","FL:::/LT/COMPILE/COMPILE.CPZ,907",39$0002DF06 0001 Funct Export +$LK +BI,"CmpParseFor ","FL:::/LT/COMPILE/COMPILE.CPZ,741",40$0002CFEF 0001 Funct Export +$LK +BI,"CmpParseFunction ","FL:::/LT/COMPILE/COMPILE.CPZ,319",41$0002A9CC 0001 Funct Export +$LK +BI,"CmpParseFunctionJoin ","FL:::/LT/COMPILE/COMPILE.CPZ,247",42$0002A5B2 0005 Funct Export +$LK +BI,"CmpParseGlblVarList ","FL:::/LT/COMPILE/COMPILE.CPZ,491",43$0002BA54 0006 Funct Export +$LK +BI,"CmpParseIf ","FL:::/LT/COMPILE/COMPILE.CPZ,668",44$0002C94B 0001 Funct Export +$LK +BI,"CmpParseStatement ","FL:::/LT/COMPILE/COMPILE.CPZ,1295",45$0002FE59 0002 Funct Export +$LK +BI,"CmpParseSwitch ","FL:::/LT/COMPILE/COMPILE.CPZ,787",46$0002D363 0001 Funct Export +$LK +BI,"CmpParseTryBlk ","FL:::/LT/COMPILE/COMPILE.CPZ,966",47$0002E37D 0001 Funct Export +$LK +BI,"CmpParseVarList ","FL:::/LT/COMPILE/COMPILE.CPZ,16",48$000292B1 0004 Funct Export +$LK +BI,"CmpParseWhile ","FL:::/LT/COMPILE/COMPILE.CPZ,697",49$0002CBDB 0001 Funct Export +$LK +BI,"CompileBuf ","FL:::/LT/COMPILE/COMPILE.CPZ,1635",50$000318A7 0001 Funct Export +$LK +BI,"CompileExpression ","FL:::/LT/COMPILE/PARSE.CPZ,736",51$0001C4E9 0004 Funct Export +$LK +BI,"CompileFile ","FL:::/LT/COMPILE/COMPILE.CPZ,1731",52$00032037 0000 Funct Export +$LK +BI,"CompileStatement ","FL:::/LT/COMPILE/COMPILE.CPZ,1597",53$000315FC 0002 Funct Export +$LK +BI,"ContinueUserTask ","FL:::/LT/COMPILE/COMPILE.CPZ,1870",54$00032CB6 0000 Funct Export +$LK "DCT_ABSOLUTE_ADDRESS ","FL:::/LT/COMPILE/CODE.ASZ,3351"$00001FE8 0001 SysSym +$LK "DCT_ADD32 ","FL:::/LT/COMPILE/CODE.ASZ,3322"$00001FE8 0001 SysSym +$LK "DCT_ADD64 ","FL:::/LT/COMPILE/CODE.ASZ,3321"$00001FE8 0001 SysSym +$LK "DCT_ADD8 ","FL:::/LT/COMPILE/CODE.ASZ,3323"$00001FE8 0001 SysSym +$LK "DCT_ADDITION ","FL:::/LT/COMPILE/CODE.ASZ,3248"$00001EE0 0001 SysSym +$LK "DCT_ADDRESS ","FL:::/LT/COMPILE/CODE.ASZ,3165"$00001E04 0001 SysSym +$LK "DCT_ADD_EQUAL_U1 ","FL:::/LT/COMPILE/CODE.ASZ,3296"$00001FD0 0001 SysSym +$LK "DCT_ADD_EQUAL_U2 ","FL:::/LT/COMPILE/CODE.ASZ,3295"$00001FD0 0001 SysSym +$LK "DCT_ADD_EQUAL_U4 ","FL:::/LT/COMPILE/CODE.ASZ,3294"$00001FD0 0001 SysSym +$LK "DCT_ADD_EQUAL_U4_CONSTANT_U1 ","FL:::/LT/COMPILE/CODE.ASZ,3427"$00002100 0001 SysSym +$LK "DCT_ADD_EQUAL_U8 ","FL:::/LT/COMPILE/CODE.ASZ,3293"$00001FB8 0001 SysSym +$LK "DCT_ADD_EQUAL_U8_CONSTANT_U1 ","FL:::/LT/COMPILE/CODE.ASZ,3425"$00002100 0001 SysSym +$LK "DCT_ADD_ESP32 ","FL:::/LT/COMPILE/CODE.ASZ,3335"$00001FE8 0001 SysSym +$LK "DCT_ADD_ESP8 ","FL:::/LT/COMPILE/CODE.ASZ,3336"$00001FE8 0001 SysSym +$LK "DCT_AND ","FL:::/LT/COMPILE/CODE.ASZ,3245"$00001EE0 0001 SysSym +$LK "DCT_AND_AND ","FL:::/LT/COMPILE/CODE.ASZ,3256"$00001F88 0001 SysSym +$LK "DCT_AND_AND_SKIPNZ ","FL:::/LT/COMPILE/CODE.ASZ,3393"$00002100 0001 SysSym +$LK "DCT_AND_AND_SKIPNZ2 ","FL:::/LT/COMPILE/CODE.ASZ,3394"$00002100 0001 SysSym +$LK "DCT_AND_AND_SKIPZ ","FL:::/LT/COMPILE/CODE.ASZ,3391"$00002100 0001 SysSym +$LK "DCT_AND_AND_SKIPZ2 ","FL:::/LT/COMPILE/CODE.ASZ,3392"$00002100 0001 SysSym +$LK "DCT_AND_EQUAL_U1 ","FL:::/LT/COMPILE/CODE.ASZ,3284"$00001FB8 0001 SysSym +$LK "DCT_AND_EQUAL_U2 ","FL:::/LT/COMPILE/CODE.ASZ,3283"$00001FB8 0001 SysSym +$LK "DCT_AND_EQUAL_U4 ","FL:::/LT/COMPILE/CODE.ASZ,3282"$00001FB8 0001 SysSym +$LK "DCT_AND_EQUAL_U8 ","FL:::/LT/COMPILE/CODE.ASZ,3281"$00001FB8 0001 SysSym +$LK "DCT_ASSIGN_U1 ","FL:::/LT/COMPILE/CODE.ASZ,3264"$00001F88 0001 SysSym +$LK "DCT_ASSIGN_U2 ","FL:::/LT/COMPILE/CODE.ASZ,3263"$00001F88 0001 SysSym +$LK "DCT_ASSIGN_U4 ","FL:::/LT/COMPILE/CODE.ASZ,3262"$00001F88 0001 SysSym +$LK "DCT_ASSIGN_U8 ","FL:::/LT/COMPILE/CODE.ASZ,3261"$00001F88 0001 SysSym +$LK "DCT_BSF ","FL:::/LT/COMPILE/CODE.ASZ,3358"$00001FE8 0001 SysSym +$LK "DCT_BSR ","FL:::/LT/COMPILE/CODE.ASZ,3359"$00001FE8 0001 SysSym +$LK "DCT_BT ","FL:::/LT/COMPILE/CODE.ASZ,3354"$00001FE8 0001 SysSym +$LK "DCT_BTC ","FL:::/LT/COMPILE/CODE.ASZ,3357"$00001FE8 0001 SysSym +$LK "DCT_BTC_CONSTANT ","FL:::/LT/COMPILE/CODE.ASZ,3422"$00002100 0001 SysSym +$LK "DCT_BTR ","FL:::/LT/COMPILE/CODE.ASZ,3356"$00001FE8 0001 SysSym +$LK "DCT_BTR_CONSTANT ","FL:::/LT/COMPILE/CODE.ASZ,3421"$00002100 0001 SysSym +$LK "DCT_BTS ","FL:::/LT/COMPILE/CODE.ASZ,3355"$00001FE8 0001 SysSym +$LK "DCT_BTS_CONSTANT ","FL:::/LT/COMPILE/CODE.ASZ,3420"$00002100 0001 SysSym +$LK "DCT_BT_CONSTANT ","FL:::/LT/COMPILE/CODE.ASZ,3419"$00002100 0001 SysSym +$LK "DCT_CALL ","FL:::/LT/COMPILE/CODE.ASZ,3338"$00001FE8 0001 SysSym +$LK "DCT_CALL_INDIRECT ","FL:::/LT/COMPILE/CODE.ASZ,3339"$00001FE8 0001 SysSym +$LK "DCT_CALL_INDIRECT2 ","FL:::/LT/COMPILE/CODE.ASZ,3340"$00001FE8 0001 SysSym +$LK "DCT_CLI ","FL:::/LT/COMPILE/CODE.ASZ,3342"$00001FE8 0001 SysSym +$LK "DCT_COLON ","FL:::/LT/COMPILE/CODE.ASZ,3259"$00001F88 0001 SysSym +$LK "DCT_COM ","FL:::/LT/COMPILE/CODE.ASZ,3162"$00001DF4 0001 SysSym +$LK "DCT_DEC ","FL:::/LT/COMPILE/CODE.ASZ,3328"$00001FE8 0001 SysSym +$LK "DCT_DEREF_U1 ","FL:::/LT/COMPILE/CODE.ASZ,3197"$00001E04 0001 SysSym +$LK "DCT_DEREF_U2 ","FL:::/LT/COMPILE/CODE.ASZ,3196"$00001E04 0001 SysSym +$LK "DCT_DEREF_U4 ","FL:::/LT/COMPILE/CODE.ASZ,3195"$00001E04 0001 SysSym +$LK "DCT_DEREF_U8 ","FL:::/LT/COMPILE/CODE.ASZ,3194"$00001E04 0001 SysSym +$LK "DCT_DIVISION ","FL:::/LT/COMPILE/CODE.ASZ,3243"$00001EA7 0001 SysSym +$LK "DCT_DIV_EQUAL_U1 ","FL:::/LT/COMPILE/CODE.ASZ,3280"$00001FB8 0001 SysSym +$LK "DCT_DIV_EQUAL_U2 ","FL:::/LT/COMPILE/CODE.ASZ,3279"$00001FB8 0001 SysSym +$LK "DCT_DIV_EQUAL_U4 ","FL:::/LT/COMPILE/CODE.ASZ,3278"$00001FB8 0001 SysSym +$LK "DCT_DIV_EQUAL_U8 ","FL:::/LT/COMPILE/CODE.ASZ,3277"$00001FA0 0001 SysSym +$LK "DCT_DOUBLE ","FL:::/LT/COMPILE/CODE.ASZ,3154"$00001DF4 0001 SysSym +$LK "DCT_EBP ","FL:::/LT/COMPILE/CODE.ASZ,3156"$00001DF4 0001 SysSym +$LK "DCT_EDI ","FL:::/LT/COMPILE/CODE.ASZ,3159"$00001DF4 0001 SysSym +$LK "DCT_EDI_ADD_EQUAL_U4 ","FL:::/LT/COMPILE/CODE.ASZ,3319"$00001FE8 0001 SysSym +$LK "DCT_EDI_ADD_EQUAL_U4_CONSTANT_U1 ","FL:::/LT/COMPILE/CODE.ASZ,3429"$00002100 0001 SysSym +$LK "DCT_EDI_AND_EQUAL_U4 ","FL:::/LT/COMPILE/CODE.ASZ,3316"$00001FE8 0001 SysSym +$LK "DCT_EDI_ASSIGN_U4 ","FL:::/LT/COMPILE/CODE.ASZ,3311"$00001FE8 0001 SysSym +$LK "DCT_EDI_DEREF_U1 ","FL:::/LT/COMPILE/CODE.ASZ,3205"$00001E04 0001 SysSym +$LK "DCT_EDI_DEREF_U2 ","FL:::/LT/COMPILE/CODE.ASZ,3204"$00001E04 0001 SysSym +$LK "DCT_EDI_DEREF_U4 ","FL:::/LT/COMPILE/CODE.ASZ,3203"$00001E04 0001 SysSym +$LK "DCT_EDI_DEREF_U8 ","FL:::/LT/COMPILE/CODE.ASZ,3202"$00001E04 0001 SysSym +$LK "DCT_EDI_DIV_EQUAL_U4 ","FL:::/LT/COMPILE/CODE.ASZ,3315"$00001FE8 0001 SysSym +$LK "DCT_EDI_MM_U4 ","FL:::/LT/COMPILE/CODE.ASZ,3229"$00001E3C 0001 SysSym +$LK "DCT_EDI_MUL_EQUAL_U4 ","FL:::/LT/COMPILE/CODE.ASZ,3314"$00001FE8 0001 SysSym +$LK "DCT_EDI_NEXT_EQUAL_U4 ","FL:::/LT/COMPILE/CODE.ASZ,3424"$00002100 0001 SysSym +$LK "DCT_EDI_OR_EQUAL_U4 ","FL:::/LT/COMPILE/CODE.ASZ,3317"$00001FE8 0001 SysSym +$LK "DCT_EDI_PP_U4 ","FL:::/LT/COMPILE/CODE.ASZ,3228"$00001E3C 0001 SysSym +$LK "DCT_EDI_SHL_EQUAL_U4 ","FL:::/LT/COMPILE/CODE.ASZ,3312"$00001FE8 0001 SysSym +$LK "DCT_EDI_SHR_EQUAL_U4 ","FL:::/LT/COMPILE/CODE.ASZ,3313"$00001FE8 0001 SysSym +$LK "DCT_EDI_SUB_EQUAL_U4 ","FL:::/LT/COMPILE/CODE.ASZ,3320"$00001FE8 0001 SysSym +$LK "DCT_EDI_U1_DISP32 ","FL:::/LT/COMPILE/CODE.ASZ,3189"$00001E04 0001 SysSym +$LK "DCT_EDI_U1_DISP8 ","FL:::/LT/COMPILE/CODE.ASZ,3193"$00001E04 0001 SysSym +$LK "DCT_EDI_U2_DISP32 ","FL:::/LT/COMPILE/CODE.ASZ,3188"$00001E04 0001 SysSym +$LK "DCT_EDI_U2_DISP8 ","FL:::/LT/COMPILE/CODE.ASZ,3192"$00001E04 0001 SysSym +$LK "DCT_EDI_U4_DISP32 ","FL:::/LT/COMPILE/CODE.ASZ,3187"$00001E04 0001 SysSym +$LK "DCT_EDI_U4_DISP8 ","FL:::/LT/COMPILE/CODE.ASZ,3191"$00001E04 0001 SysSym +$LK "DCT_EDI_U4_MM ","FL:::/LT/COMPILE/CODE.ASZ,3227"$00001E3C 0001 SysSym +$LK "DCT_EDI_U4_PP ","FL:::/LT/COMPILE/CODE.ASZ,3226"$00001E3C 0001 SysSym +$LK "DCT_EDI_U8_DISP32 ","FL:::/LT/COMPILE/CODE.ASZ,3186"$00001E04 0001 SysSym +$LK "DCT_EDI_U8_DISP8 ","FL:::/LT/COMPILE/CODE.ASZ,3190"$00001E04 0001 SysSym +$LK "DCT_EDI_XOR_EQUAL_U4 ","FL:::/LT/COMPILE/CODE.ASZ,3318"$00001FE8 0001 SysSym +$LK "DCT_END_EXP ","FL:::/LT/COMPILE/CODE.ASZ,3148"$00001DF4 0001 SysSym +$LK "DCT_ENTER ","FL:::/LT/COMPILE/CODE.ASZ,3329"$00001FE8 0001 SysSym +$LK "DCT_ENTER1 ","FL:::/LT/COMPILE/CODE.ASZ,3331"$00001FE8 0001 SysSym +$LK "DCT_ENTER2 ","FL:::/LT/COMPILE/CODE.ASZ,3333"$00001FE8 0001 SysSym +$LK "DCT_EQUAL_EQUAL ","FL:::/LT/COMPILE/CODE.ASZ,3250"$00001F0C 0001 SysSym +$LK "DCT_EQUAL_EQUAL_SKIPZ ","FL:::/LT/COMPILE/CODE.ASZ,3379"$00001FE8 0001 SysSym +$LK "DCT_EQUAL_EQUAL_SKIPZ2 ","FL:::/LT/COMPILE/CODE.ASZ,3380"$00001FE8 0001 SysSym +$LK "DCT_ESI ","FL:::/LT/COMPILE/CODE.ASZ,3158"$00001DF4 0001 SysSym +$LK "DCT_ESI_ADD_EQUAL_U4 ","FL:::/LT/COMPILE/CODE.ASZ,3309"$00001FE8 0001 SysSym +$LK "DCT_ESI_ADD_EQUAL_U4_CONSTANT_U1 ","FL:::/LT/COMPILE/CODE.ASZ,3428"$00002100 0001 SysSym +$LK "DCT_ESI_AND_EQUAL_U4 ","FL:::/LT/COMPILE/CODE.ASZ,3306"$00001FE8 0001 SysSym +$LK "DCT_ESI_ASSIGN_U4 ","FL:::/LT/COMPILE/CODE.ASZ,3301"$00001FE8 0001 SysSym +$LK "DCT_ESI_DEREF_U1 ","FL:::/LT/COMPILE/CODE.ASZ,3201"$00001E04 0001 SysSym +$LK "DCT_ESI_DEREF_U2 ","FL:::/LT/COMPILE/CODE.ASZ,3200"$00001E04 0001 SysSym +$LK "DCT_ESI_DEREF_U4 ","FL:::/LT/COMPILE/CODE.ASZ,3199"$00001E04 0001 SysSym +$LK "DCT_ESI_DEREF_U8 ","FL:::/LT/COMPILE/CODE.ASZ,3198"$00001E04 0001 SysSym +$LK "DCT_ESI_DIV_EQUAL_U4 ","FL:::/LT/COMPILE/CODE.ASZ,3305"$00001FE8 0001 SysSym +$LK "DCT_ESI_MM_U4 ","FL:::/LT/COMPILE/CODE.ASZ,3225"$00001E3C 0001 SysSym +$LK "DCT_ESI_MUL_EQUAL_U4 ","FL:::/LT/COMPILE/CODE.ASZ,3304"$00001FE8 0001 SysSym +$LK "DCT_ESI_NEXT_EQUAL_U4 ","FL:::/LT/COMPILE/CODE.ASZ,3423"$00002100 0001 SysSym +$LK "DCT_ESI_OR_EQUAL_U4 ","FL:::/LT/COMPILE/CODE.ASZ,3307"$00001FE8 0001 SysSym +$LK "DCT_ESI_PP_U4 ","FL:::/LT/COMPILE/CODE.ASZ,3224"$00001E3C 0001 SysSym +$LK "DCT_ESI_SHL_EQUAL_U4 ","FL:::/LT/COMPILE/CODE.ASZ,3302"$00001FE8 0001 SysSym +$LK "DCT_ESI_SHR_EQUAL_U4 ","FL:::/LT/COMPILE/CODE.ASZ,3303"$00001FE8 0001 SysSym +$LK "DCT_ESI_SUB_EQUAL_U4 ","FL:::/LT/COMPILE/CODE.ASZ,3310"$00001FE8 0001 SysSym +$LK "DCT_ESI_U1_DISP32 ","FL:::/LT/COMPILE/CODE.ASZ,3181"$00001E04 0001 SysSym +$LK "DCT_ESI_U1_DISP8 ","FL:::/LT/COMPILE/CODE.ASZ,3185"$00001E04 0001 SysSym +$LK "DCT_ESI_U2_DISP32 ","FL:::/LT/COMPILE/CODE.ASZ,3180"$00001E04 0001 SysSym +$LK "DCT_ESI_U2_DISP8 ","FL:::/LT/COMPILE/CODE.ASZ,3184"$00001E04 0001 SysSym +$LK "DCT_ESI_U4_DISP32 ","FL:::/LT/COMPILE/CODE.ASZ,3179"$00001E04 0001 SysSym +$LK "DCT_ESI_U4_DISP8 ","FL:::/LT/COMPILE/CODE.ASZ,3183"$00001E04 0001 SysSym +$LK "DCT_ESI_U4_MM ","FL:::/LT/COMPILE/CODE.ASZ,3223"$00001E3C 0001 SysSym +$LK "DCT_ESI_U4_PP ","FL:::/LT/COMPILE/CODE.ASZ,3222"$00001E3C 0001 SysSym +$LK "DCT_ESI_U8_DISP32 ","FL:::/LT/COMPILE/CODE.ASZ,3178"$00001E04 0001 SysSym +$LK "DCT_ESI_U8_DISP8 ","FL:::/LT/COMPILE/CODE.ASZ,3182"$00001E04 0001 SysSym +$LK "DCT_ESI_XOR_EQUAL_U4 ","FL:::/LT/COMPILE/CODE.ASZ,3308"$00001FE8 0001 SysSym +$LK "DCT_FS ","FL:::/LT/COMPILE/CODE.ASZ,3157"$00001DF4 0001 SysSym +$LK "DCT_FS_U1_DISP32 ","FL:::/LT/COMPILE/CODE.ASZ,3177"$00001E04 0001 SysSym +$LK "DCT_FS_U2_DISP32 ","FL:::/LT/COMPILE/CODE.ASZ,3176"$00001E04 0001 SysSym +$LK "DCT_FS_U4_DISP32 ","FL:::/LT/COMPILE/CODE.ASZ,3175"$00001E04 0001 SysSym +$LK "DCT_FS_U8_DISP32 ","FL:::/LT/COMPILE/CODE.ASZ,3174"$00001E04 0001 SysSym +$LK "DCT_GET_BASE_PTR ","FL:::/LT/COMPILE/CODE.ASZ,3346"$00001FE8 0001 SysSym +$LK "DCT_GET_FLAGS ","FL:::/LT/COMPILE/CODE.ASZ,3344"$00001FE8 0001 SysSym +$LK "DCT_GET_LABEL ","FL:::/LT/COMPILE/CODE.ASZ,3350"$00001FE8 0001 SysSym +$LK "DCT_GET_STACK_PTR ","FL:::/LT/COMPILE/CODE.ASZ,3348"$00001FE8 0001 SysSym +$LK "DCT_GREATER_OR_EQUAL ","FL:::/LT/COMPILE/CODE.ASZ,3255"$00001F69 0001 SysSym +$LK "DCT_GREATER_OR_EQUAL_SKIPZ ","FL:::/LT/COMPILE/CODE.ASZ,3389"$000020BA 0002 SysSym +$LK "DCT_GREATER_OR_EQUAL_SKIPZ2 ","FL:::/LT/COMPILE/CODE.ASZ,3390"$000020DB 0001 SysSym +$LK "DCT_GREATER_THAN ","FL:::/LT/COMPILE/CODE.ASZ,3253"$00001F2B 0001 SysSym +$LK "DCT_GREATER_THAN_SKIPZ ","FL:::/LT/COMPILE/CODE.ASZ,3385"$0000202E 0002 SysSym +$LK "DCT_GREATER_THAN_SKIPZ2 ","FL:::/LT/COMPILE/CODE.ASZ,3386"$0000204F 0001 SysSym +$LK "DCT_INC ","FL:::/LT/COMPILE/CODE.ASZ,3324"$00001FE8 0001 SysSym +$LK "DCT_INP ","FL:::/LT/COMPILE/CODE.ASZ,3368"$00001FE8 0001 SysSym +$LK "DCT_INPD ","FL:::/LT/COMPILE/CODE.ASZ,3366"$00001FE8 0001 SysSym +$LK "DCT_INPW ","FL:::/LT/COMPILE/CODE.ASZ,3367"$00001FE8 0001 SysSym +$LK "DCT_INSQUE ","FL:::/LT/COMPILE/CODE.ASZ,3360"$00001FE8 0001 SysSym +$LK "DCT_INSQUE_REV ","FL:::/LT/COMPILE/CODE.ASZ,3361"$00001FE8 0001 SysSym +$LK "DCT_IRQ ","FL:::/LT/COMPILE/CODE.ASZ,3341"$00001FE8 0001 SysSym +$LK "DCT_JMP ","FL:::/LT/COMPILE/CODE.ASZ,3372"$00001FE8 0001 SysSym +$LK "DCT_LABEL ","FL:::/LT/COMPILE/CODE.ASZ,3352"$00001FE8 0001 SysSym +$LK "DCT_LEAVE ","FL:::/LT/COMPILE/CODE.ASZ,3330"$00001FE8 0001 SysSym +$LK "DCT_LEAVE1 ","FL:::/LT/COMPILE/CODE.ASZ,3332"$00001FE8 0001 SysSym +$LK "DCT_LEAVE2 ","FL:::/LT/COMPILE/CODE.ASZ,3334"$00001FE8 0001 SysSym +$LK "DCT_LEA_DISP32_EBP ","FL:::/LT/COMPILE/CODE.ASZ,3230"$00001E3C 0001 SysSym +$LK "DCT_LEA_DISP32_EDI ","FL:::/LT/COMPILE/CODE.ASZ,3401"$00002100 0001 SysSym +$LK "DCT_LEA_DISP32_ESI ","FL:::/LT/COMPILE/CODE.ASZ,3399"$00002100 0001 SysSym +$LK "DCT_LEA_DISP8_EBP ","FL:::/LT/COMPILE/CODE.ASZ,3231"$00001E3C 0001 SysSym +$LK "DCT_LEA_DISP8_EDI ","FL:::/LT/COMPILE/CODE.ASZ,3402"$00002100 0001 SysSym +$LK "DCT_LEA_DISP8_ESI ","FL:::/LT/COMPILE/CODE.ASZ,3400"$00002100 0001 SysSym +$LK "DCT_LESS_OR_EQUAL ","FL:::/LT/COMPILE/CODE.ASZ,3254"$00001F4A 0001 SysSym +$LK "DCT_LESS_OR_EQUAL_SKIPZ ","FL:::/LT/COMPILE/CODE.ASZ,3387"$00002074 0002 SysSym +$LK "DCT_LESS_OR_EQUAL_SKIPZ2 ","FL:::/LT/COMPILE/CODE.ASZ,3388"$00002095 0001 SysSym +$LK "DCT_LESS_THAN ","FL:::/LT/COMPILE/CODE.ASZ,3252"$00001F0C 0001 SysSym +$LK "DCT_LESS_THAN_SKIPZ ","FL:::/LT/COMPILE/CODE.ASZ,3383"$00001FE8 0002 SysSym +$LK "DCT_LESS_THAN_SKIPZ2 ","FL:::/LT/COMPILE/CODE.ASZ,3384"$00002009 0001 SysSym +$LK "DCT_MEMCPY ","FL:::/LT/COMPILE/CODE.ASZ,3364"$00001FE8 0001 SysSym +$LK "DCT_MEMSET ","FL:::/LT/COMPILE/CODE.ASZ,3365"$00001FE8 0001 SysSym +$LK "DCT_MM_U1 ","FL:::/LT/COMPILE/CODE.ASZ,3221"$00001E3C 0001 SysSym +$LK "DCT_MM_U2 ","FL:::/LT/COMPILE/CODE.ASZ,3220"$00001E3C 0001 SysSym +$LK "DCT_MM_U4 ","FL:::/LT/COMPILE/CODE.ASZ,3219"$00001E3C 0001 SysSym +$LK "DCT_MM_U8 ","FL:::/LT/COMPILE/CODE.ASZ,3218"$00001E2F 0001 SysSym +$LK "DCT_MULTIPLICATION ","FL:::/LT/COMPILE/CODE.ASZ,3242"$00001E91 0001 SysSym +$LK "DCT_MUL_EQUAL_U1 ","FL:::/LT/COMPILE/CODE.ASZ,3276"$00001FA0 0001 SysSym +$LK "DCT_MUL_EQUAL_U2 ","FL:::/LT/COMPILE/CODE.ASZ,3275"$00001FA0 0001 SysSym +$LK "DCT_MUL_EQUAL_U4 ","FL:::/LT/COMPILE/CODE.ASZ,3274"$00001FA0 0001 SysSym +$LK "DCT_MUL_EQUAL_U8 ","FL:::/LT/COMPILE/CODE.ASZ,3273"$00001F88 0001 SysSym +$LK "DCT_NOP ","FL:::/LT/COMPILE/CODE.ASZ,3147"$00001DF4 0001 SysSym +$LK "DCT_NOT ","FL:::/LT/COMPILE/CODE.ASZ,3163"$00001DF4 0001 SysSym +$LK "DCT_NOT_EQUAL_TO ","FL:::/LT/COMPILE/CODE.ASZ,3251"$00001F0C 0001 SysSym +$LK "DCT_NOT_EQUAL_TO_SKIPZ ","FL:::/LT/COMPILE/CODE.ASZ,3381"$00001FE8 0001 SysSym +$LK "DCT_NOT_EQUAL_TO_SKIPZ2 ","FL:::/LT/COMPILE/CODE.ASZ,3382"$00001FE8 0001 SysSym +$LK "DCT_NULL ","FL:::/LT/COMPILE/CODE.ASZ,3146"$00001DF4 0001 SysSym +$LK "DCT_OR ","FL:::/LT/COMPILE/CODE.ASZ,3246"$00001EE0 0001 SysSym +$LK "DCT_OR_EQUAL_U1 ","FL:::/LT/COMPILE/CODE.ASZ,3288"$00001FB8 0001 SysSym +$LK "DCT_OR_EQUAL_U2 ","FL:::/LT/COMPILE/CODE.ASZ,3287"$00001FB8 0001 SysSym +$LK "DCT_OR_EQUAL_U4 ","FL:::/LT/COMPILE/CODE.ASZ,3286"$00001FB8 0001 SysSym +$LK "DCT_OR_EQUAL_U8 ","FL:::/LT/COMPILE/CODE.ASZ,3285"$00001FB8 0001 SysSym +$LK "DCT_OR_OR ","FL:::/LT/COMPILE/CODE.ASZ,3257"$00001F88 0001 SysSym +$LK "DCT_OR_OR_SKIPNZ ","FL:::/LT/COMPILE/CODE.ASZ,3397"$00002100 0001 SysSym +$LK "DCT_OR_OR_SKIPNZ2 ","FL:::/LT/COMPILE/CODE.ASZ,3398"$00002100 0001 SysSym +$LK "DCT_OR_OR_SKIPZ ","FL:::/LT/COMPILE/CODE.ASZ,3395"$00002100 0001 SysSym +$LK "DCT_OR_OR_SKIPZ2 ","FL:::/LT/COMPILE/CODE.ASZ,3396"$00002100 0001 SysSym +$LK "DCT_OUTP ","FL:::/LT/COMPILE/CODE.ASZ,3371"$00001FE8 0001 SysSym +$LK "DCT_OUTPD ","FL:::/LT/COMPILE/CODE.ASZ,3369"$00001FE8 0001 SysSym +$LK "DCT_OUTPW ","FL:::/LT/COMPILE/CODE.ASZ,3370"$00001FE8 0001 SysSym +$LK "DCT_POWER ","FL:::/LT/COMPILE/CODE.ASZ,3241"$00001E3C 0001 SysSym +$LK "DCT_PP_U1 ","FL:::/LT/COMPILE/CODE.ASZ,3217"$00001E2F 0001 SysSym +$LK "DCT_PP_U2 ","FL:::/LT/COMPILE/CODE.ASZ,3216"$00001E2F 0001 SysSym +$LK "DCT_PP_U4 ","FL:::/LT/COMPILE/CODE.ASZ,3215"$00001E2F 0001 SysSym +$LK "DCT_PP_U8 ","FL:::/LT/COMPILE/CODE.ASZ,3214"$00001E22 0001 SysSym +$LK "DCT_PUSH_DEREF_U8 ","FL:::/LT/COMPILE/CODE.ASZ,3417"$00002100 0001 SysSym +$LK "DCT_PUSH_DOUBLE ","FL:::/LT/COMPILE/CODE.ASZ,3410"$00002100 0001 SysSym +$LK "DCT_PUSH_EDI_U8_DISP32 ","FL:::/LT/COMPILE/CODE.ASZ,3415"$00002100 0001 SysSym +$LK "DCT_PUSH_EDI_U8_DISP8 ","FL:::/LT/COMPILE/CODE.ASZ,3416"$00002100 0001 SysSym +$LK "DCT_PUSH_ESI_U8_DISP32 ","FL:::/LT/COMPILE/CODE.ASZ,3413"$00002100 0001 SysSym +$LK "DCT_PUSH_ESI_U8_DISP8 ","FL:::/LT/COMPILE/CODE.ASZ,3414"$00002100 0001 SysSym +$LK "DCT_PUSH_NEG_U1 ","FL:::/LT/COMPILE/CODE.ASZ,3409"$00002100 0001 SysSym +$LK "DCT_PUSH_NEG_U2 ","FL:::/LT/COMPILE/CODE.ASZ,3408"$00002100 0001 SysSym +$LK "DCT_PUSH_NEG_U4 ","FL:::/LT/COMPILE/CODE.ASZ,3407"$00002100 0001 SysSym +$LK "DCT_PUSH_U1 ","FL:::/LT/COMPILE/CODE.ASZ,3406"$00002100 0001 SysSym +$LK "DCT_PUSH_U2 ","FL:::/LT/COMPILE/CODE.ASZ,3405"$00002100 0001 SysSym +$LK "DCT_PUSH_U4 ","FL:::/LT/COMPILE/CODE.ASZ,3404"$00002100 0001 SysSym +$LK "DCT_PUSH_U8 ","FL:::/LT/COMPILE/CODE.ASZ,3403"$00002100 0001 SysSym +$LK "DCT_PUSH_U8_DISP32 ","FL:::/LT/COMPILE/CODE.ASZ,3411"$00002100 0001 SysSym +$LK "DCT_PUSH_U8_DISP32_SCALED ","FL:::/LT/COMPILE/CODE.ASZ,3418"$00002100 0001 SysSym +$LK "DCT_PUSH_U8_DISP8 ","FL:::/LT/COMPILE/CODE.ASZ,3412"$00002100 0001 SysSym +$LK "DCT_QUESTION ","FL:::/LT/COMPILE/CODE.ASZ,3260"$00001F88 0001 SysSym +$LK "DCT_REMAINDER ","FL:::/LT/COMPILE/CODE.ASZ,3244"$00001EBD 0001 SysSym +$LK "DCT_REMQUE ","FL:::/LT/COMPILE/CODE.ASZ,3362"$00001FE8 0001 SysSym +$LK "DCT_RET ","FL:::/LT/COMPILE/CODE.ASZ,3337"$00001FE8 0001 SysSym +$LK "DCT_SET_BASE_PTR ","FL:::/LT/COMPILE/CODE.ASZ,3347"$00001FE8 0001 SysSym +$LK "DCT_SET_FLAGS ","FL:::/LT/COMPILE/CODE.ASZ,3345"$00001FE8 0001 SysSym +$LK "DCT_SET_STACK_PTR ","FL:::/LT/COMPILE/CODE.ASZ,3349"$00001FE8 0001 SysSym +$LK "DCT_SHL ","FL:::/LT/COMPILE/CODE.ASZ,3235"$00001E3C 0001 SysSym +$LK "DCT_SHL_CONSTANT1 ","FL:::/LT/COMPILE/CODE.ASZ,3237"$00001E3C 0001 SysSym +$LK "DCT_SHL_CONSTANT2 ","FL:::/LT/COMPILE/CODE.ASZ,3238"$00001E3C 0001 SysSym +$LK "DCT_SHL_EQUAL_U1 ","FL:::/LT/COMPILE/CODE.ASZ,3268"$00001F88 0001 SysSym +$LK "DCT_SHL_EQUAL_U2 ","FL:::/LT/COMPILE/CODE.ASZ,3267"$00001F88 0001 SysSym +$LK "DCT_SHL_EQUAL_U4 ","FL:::/LT/COMPILE/CODE.ASZ,3266"$00001F88 0001 SysSym +$LK "DCT_SHL_EQUAL_U8 ","FL:::/LT/COMPILE/CODE.ASZ,3265"$00001F88 0001 SysSym +$LK "DCT_SHORT_JMP ","FL:::/LT/COMPILE/CODE.ASZ,3373"$00001FE8 0001 SysSym +$LK "DCT_SHR ","FL:::/LT/COMPILE/CODE.ASZ,3236"$00001E3C 0001 SysSym +$LK "DCT_SHR_CONSTANT1 ","FL:::/LT/COMPILE/CODE.ASZ,3239"$00001E3C 0001 SysSym +$LK "DCT_SHR_CONSTANT2 ","FL:::/LT/COMPILE/CODE.ASZ,3240"$00001E3C 0001 SysSym +$LK "DCT_SHR_EQUAL_U1 ","FL:::/LT/COMPILE/CODE.ASZ,3272"$00001F88 0001 SysSym +$LK "DCT_SHR_EQUAL_U2 ","FL:::/LT/COMPILE/CODE.ASZ,3271"$00001F88 0001 SysSym +$LK "DCT_SHR_EQUAL_U4 ","FL:::/LT/COMPILE/CODE.ASZ,3270"$00001F88 0001 SysSym +$LK "DCT_SHR_EQUAL_U8 ","FL:::/LT/COMPILE/CODE.ASZ,3269"$00001F88 0001 SysSym +$LK "DCT_SKIPNZ ","FL:::/LT/COMPILE/CODE.ASZ,3377"$00001FE8 0001 SysSym +$LK "DCT_SKIPNZ2 ","FL:::/LT/COMPILE/CODE.ASZ,3378"$00001FE8 0001 SysSym +$LK "DCT_SKIPZ ","FL:::/LT/COMPILE/CODE.ASZ,3375"$00001FE8 0001 SysSym +$LK "DCT_SKIPZ2 ","FL:::/LT/COMPILE/CODE.ASZ,3376"$00001FE8 0001 SysSym +$LK "DCT_STI ","FL:::/LT/COMPILE/CODE.ASZ,3343"$00001FE8 0001 SysSym +$LK "DCT_STRING_CONSTANT ","FL:::/LT/COMPILE/CODE.ASZ,3155"$00001DF4 0001 SysSym +$LK "DCT_STRLEN ","FL:::/LT/COMPILE/CODE.ASZ,3363"$00001FE8 0001 SysSym +$LK "DCT_SUB32 ","FL:::/LT/COMPILE/CODE.ASZ,3326"$00001FE8 0001 SysSym +$LK "DCT_SUB64 ","FL:::/LT/COMPILE/CODE.ASZ,3325"$00001FE8 0001 SysSym +$LK "DCT_SUB8 ","FL:::/LT/COMPILE/CODE.ASZ,3327"$00001FE8 0001 SysSym +$LK "DCT_SUBTRACTION ","FL:::/LT/COMPILE/CODE.ASZ,3249"$00001EF6 0001 SysSym +$LK "DCT_SUB_EQUAL_U1 ","FL:::/LT/COMPILE/CODE.ASZ,3300"$00001FE8 0001 SysSym +$LK "DCT_SUB_EQUAL_U2 ","FL:::/LT/COMPILE/CODE.ASZ,3299"$00001FE8 0001 SysSym +$LK "DCT_SUB_EQUAL_U4 ","FL:::/LT/COMPILE/CODE.ASZ,3298"$00001FE8 0001 SysSym +$LK "DCT_SUB_EQUAL_U8 ","FL:::/LT/COMPILE/CODE.ASZ,3297"$00001FD0 0001 SysSym +$LK "DCT_SUB_EQUAL_U8_CONSTANT_U1 ","FL:::/LT/COMPILE/CODE.ASZ,3426"$00002100 0001 SysSym +$LK "DCT_SWITCH ","FL:::/LT/COMPILE/CODE.ASZ,3374"$00001FE8 0001 SysSym +$LK "DCT_TABLE_END ","FL:::/LT/COMPILE/CODE.ASZ,3430"$00002100 0001 SysSym +$LK "DCT_TO_DOUBLE ","FL:::/LT/COMPILE/CODE.ASZ,3160"$00001DF4 0001 SysSym +$LK "DCT_TO_INT ","FL:::/LT/COMPILE/CODE.ASZ,3161"$00001DF4 0001 SysSym +$LK "DCT_TYPE ","FL:::/LT/COMPILE/CODE.ASZ,3353"$00001FE8 0001 SysSym +$LK "DCT_U1 ","FL:::/LT/COMPILE/CODE.ASZ,3153"$00001DF4 0001 SysSym +$LK "DCT_U1_DISP32 ","FL:::/LT/COMPILE/CODE.ASZ,3169"$00001E04 0001 SysSym +$LK "DCT_U1_DISP8 ","FL:::/LT/COMPILE/CODE.ASZ,3173"$00001E04 0001 SysSym +$LK "DCT_U1_MM ","FL:::/LT/COMPILE/CODE.ASZ,3213"$00001E22 0001 SysSym +$LK "DCT_U1_PP ","FL:::/LT/COMPILE/CODE.ASZ,3209"$00001E13 0001 SysSym +$LK "DCT_U2 ","FL:::/LT/COMPILE/CODE.ASZ,3152"$00001DF4 0001 SysSym +$LK "DCT_U2_DISP32 ","FL:::/LT/COMPILE/CODE.ASZ,3168"$00001E04 0001 SysSym +$LK "DCT_U2_DISP32_SCALED ","FL:::/LT/COMPILE/CODE.ASZ,3234"$00001E3C 0001 SysSym +$LK "DCT_U2_DISP8 ","FL:::/LT/COMPILE/CODE.ASZ,3172"$00001E04 0001 SysSym +$LK "DCT_U2_MM ","FL:::/LT/COMPILE/CODE.ASZ,3212"$00001E22 0001 SysSym +$LK "DCT_U2_PP ","FL:::/LT/COMPILE/CODE.ASZ,3208"$00001E13 0001 SysSym +$LK "DCT_U4 ","FL:::/LT/COMPILE/CODE.ASZ,3151"$00001DF4 0001 SysSym +$LK "DCT_U4_DISP32 ","FL:::/LT/COMPILE/CODE.ASZ,3167"$00001E04 0001 SysSym +$LK "DCT_U4_DISP32_SCALED ","FL:::/LT/COMPILE/CODE.ASZ,3233"$00001E3C 0001 SysSym +$LK "DCT_U4_DISP8 ","FL:::/LT/COMPILE/CODE.ASZ,3171"$00001E04 0001 SysSym +$LK "DCT_U4_MM ","FL:::/LT/COMPILE/CODE.ASZ,3211"$00001E22 0001 SysSym +$LK "DCT_U4_PP ","FL:::/LT/COMPILE/CODE.ASZ,3207"$00001E13 0001 SysSym +$LK "DCT_U8 ","FL:::/LT/COMPILE/CODE.ASZ,3150"$00001DF4 0001 SysSym +$LK "DCT_U8_DISP32 ","FL:::/LT/COMPILE/CODE.ASZ,3166"$00001E04 0001 SysSym +$LK "DCT_U8_DISP32_SCALED ","FL:::/LT/COMPILE/CODE.ASZ,3232"$00001E3C 0001 SysSym +$LK "DCT_U8_DISP8 ","FL:::/LT/COMPILE/CODE.ASZ,3170"$00001E04 0001 SysSym +$LK "DCT_U8_MM ","FL:::/LT/COMPILE/CODE.ASZ,3210"$00001E13 0001 SysSym +$LK "DCT_U8_PP ","FL:::/LT/COMPILE/CODE.ASZ,3206"$00001E04 0001 SysSym +$LK "DCT_UNARY_MINUS ","FL:::/LT/COMPILE/CODE.ASZ,3164"$00001DF4 0001 SysSym +$LK "DCT_XOR ","FL:::/LT/COMPILE/CODE.ASZ,3247"$00001EE0 0001 SysSym +$LK "DCT_XOR_EQUAL_U1 ","FL:::/LT/COMPILE/CODE.ASZ,3292"$00001FB8 0001 SysSym +$LK "DCT_XOR_EQUAL_U2 ","FL:::/LT/COMPILE/CODE.ASZ,3291"$00001FB8 0001 SysSym +$LK "DCT_XOR_EQUAL_U4 ","FL:::/LT/COMPILE/CODE.ASZ,3290"$00001FB8 0001 SysSym +$LK "DCT_XOR_EQUAL_U8 ","FL:::/LT/COMPILE/CODE.ASZ,3289"$00001FB8 0001 SysSym +$LK "DCT_XOR_XOR ","FL:::/LT/COMPILE/CODE.ASZ,3258"$00001F88 0001 SysSym +$LK "DCT_ZERO ","FL:::/LT/COMPILE/CODE.ASZ,3149"$00001DF4 0001 SysSym +$LK "DOUBLE_CODE_TABLE ","FL:::/LT/COMPILE/CODE.ASZ,3145"$00001980 0001 SysSym Export +$LK +BI,"DefineU1s ","FL:::/LT/COMPILE/ASM.CPZ,1327",55$000180F5 0004 Funct Export +$LK +BI,"DelCbMiscList ","FL:::/LT/COMPILE/LEX.CPZ,1199",56$00007F76 0001 Funct Export +$LK +BI,"DelExpression ","FL:::/LT/COMPILE/LEX.CPZ,336",57$00003B6F 0009 Funct Export +$LK +BI,"DelHashTable ","FL:::/LT/COMPILE/LEX.CPZ,1651",58$0000A694 0003 Funct Export +$LK +BI,"DelMemberList ","FL:::/LT/COMPILE/LEX.CPZ,478",59$000043A3 0002 Funct Export +$LK +BI,"EvalExpression ","FL:::/LT/COMPILE/LEX.CPZ,342",60$00003BA0 0000 Funct Export +$LK +BI,"ExePrintF ","FL:::/LT/COMPILE/COMPILE.CPZ,959",61$0002E313 0000 Funct Export +$LK +BI,"ExePutS ","FL:::/LT/COMPILE/COMPILE.CPZ,949",62$0002E26C 0001 Funct Export +$LK +BI,"ExecuteCmdLine ","FL:::/LT/COMPILE/COMPILE.CPZ,1818",63$00032790 0003 Funct Export +$LK +BI,"ExecuteFile ","FL:::/LT/COMPILE/COMPILE.CPZ,1914",64$00032F5B 0001 Funct Export +$LK +BI,"ExecuteString ","FL:::/LT/COMPILE/COMPILE.CPZ,1887",65$00032D85 0002 Funct Export +$LK +BI,"Expression ","FL:::/LT/COMPILE/PARSE.CPZ,763",66$0001C66B 0003 Funct Export +$LK "FAR_AWAY ","FL:::/LT/COMPILE/CODE.ASZ,2"$00000000 0015 SysSym +$LK "FUT_32_4 ","FL:::/LT/COMPILE/LEX.CPZ,41"$8 001A StrConst +$LK "FUT_32_4P10_4 ","FL:::/LT/COMPILE/LEX.CPZ,55"$22 0002 StrConst +$LK "FUT_32_4P11_4 ","FL:::/LT/COMPILE/LEX.CPZ,50"$17 0001 StrConst +$LK "FUT_32_4_ABS ","FL:::/LT/COMPILE/LEX.CPZ,43"$10 0004 StrConst +$LK "FUT_32_4_ABS2 ","FL:::/LT/COMPILE/LEX.CPZ,44"$11 0006 StrConst +$LK "FUT_32_4_CALL ","FL:::/LT/COMPILE/LEX.CPZ,42"$9 0002 StrConst +$LK "FUT_32_4_ENTER ","FL:::/LT/COMPILE/LEX.CPZ,49"$16 0000 StrConst +$LK "FUT_32_5 ","FL:::/LT/COMPILE/LEX.CPZ,45"$12 0010 StrConst +$LK "FUT_32_6 ","FL:::/LT/COMPILE/LEX.CPZ,46"$13 0006 StrConst +$LK "FUT_32_7 ","FL:::/LT/COMPILE/LEX.CPZ,47"$14 0003 StrConst +$LK "FUT_32_9 ","FL:::/LT/COMPILE/LEX.CPZ,48"$15 0009 StrConst +$LK "FUT_32_JMP_4 ","FL:::/LT/COMPILE/LEX.CPZ,51"$18 001E StrConst +$LK "FUT_64_H9_L4 ","FL:::/LT/COMPILE/LEX.CPZ,52"$19 0005 StrConst +$LK "FUT_8_1 ","FL:::/LT/COMPILE/LEX.CPZ,34"$1 0013 StrConst +$LK "FUT_8_10 ","FL:::/LT/COMPILE/LEX.CPZ,39"$6 0003 StrConst +$LK "FUT_8_2 ","FL:::/LT/COMPILE/LEX.CPZ,35"$2 000A StrConst +$LK "FUT_8_4 ","FL:::/LT/COMPILE/LEX.CPZ,36"$3 0007 StrConst +$LK "FUT_8_5 ","FL:::/LT/COMPILE/LEX.CPZ,37"$4 0006 StrConst +$LK "FUT_8_6 ","FL:::/LT/COMPILE/LEX.CPZ,38"$5 000E StrConst +$LK "FUT_8_JMP_1 ","FL:::/LT/COMPILE/LEX.CPZ,40"$7 001F StrConst +$LK "FUT_ENTER1 ","FL:::/LT/COMPILE/LEX.CPZ,53"$20 0002 StrConst +$LK "FUT_ENTER2 ","FL:::/LT/COMPILE/LEX.CPZ,54"$21 0002 StrConst +$LK "FUT_NULL ","FL:::/LT/COMPILE/LEX.CPZ,33"$0 0000 StrConst +$LK +BI,"FillCompilerTables ","FL:::/LT/COMPILE/COMPILE.CPZ,2294",67$00034FFC 0001 Funct Export +$LK +BI,"FindMember ","FL:::/LT/COMPILE/LEX.CPZ,465",68$0000431E 0003 Funct Export +$LK +BI,"FixupBinaryOp1 ","FL:::/LT/COMPILE/OPT.CPZ,1",69$0001C6FC 0013 Funct Export +$LK +BI,"FixupBinaryOp2 ","FL:::/LT/COMPILE/OPT.CPZ,21",70$0001C899 0001 Funct Export +$LK +BI,"FixupBinaryOp3 ","FL:::/LT/COMPILE/OPT.CPZ,37",71$0001C9AC 0004 Funct Export +$LK +BI,"GetExpression ","FL:::/LT/COMPILE/PARSE.CPZ,754",72$0001C602 0000 Funct Export +$LK +BI,"GetFJoin2 ","FL:::/LT/COMPILE/SPRINTF2.CPZ,649",73$0000FD2D 0001 Funct Export +$LK "ICT_ABSOLUTE_ADDRESS ","FL:::/LT/COMPILE/CODE.ASZ,359"$000009BC 0001 SysSym +$LK "ICT_ADD32 ","FL:::/LT/COMPILE/CODE.ASZ,330"$000009BC 0001 SysSym +$LK "ICT_ADD64 ","FL:::/LT/COMPILE/CODE.ASZ,329"$000009BC 0001 SysSym +$LK "ICT_ADD8 ","FL:::/LT/COMPILE/CODE.ASZ,331"$000009BC 0001 SysSym +$LK "ICT_ADDITION ","FL:::/LT/COMPILE/CODE.ASZ,256"$000007E7 0001 SysSym +$LK "ICT_ADDRESS ","FL:::/LT/COMPILE/CODE.ASZ,173"$00000626 0001 SysSym +$LK "ICT_ADD_EQUAL_U1 ","FL:::/LT/COMPILE/CODE.ASZ,304"$00000922 0001 SysSym +$LK "ICT_ADD_EQUAL_U2 ","FL:::/LT/COMPILE/CODE.ASZ,303"$00000917 0001 SysSym +$LK "ICT_ADD_EQUAL_U4 ","FL:::/LT/COMPILE/CODE.ASZ,302"$0000090E 0001 SysSym +$LK "ICT_ADD_EQUAL_U4_CONSTANT_U1 ","FL:::/LT/COMPILE/CODE.ASZ,435"$00000A1A 0001 SysSym +$LK "ICT_ADD_EQUAL_U8 ","FL:::/LT/COMPILE/CODE.ASZ,301"$0000090E 0001 SysSym +$LK "ICT_ADD_EQUAL_U8_CONSTANT_U1 ","FL:::/LT/COMPILE/CODE.ASZ,433"$00000A1A 0001 SysSym +$LK "ICT_ADD_ESP32 ","FL:::/LT/COMPILE/CODE.ASZ,343"$000009BC 0001 SysSym +$LK "ICT_ADD_ESP8 ","FL:::/LT/COMPILE/CODE.ASZ,344"$000009BC 0001 SysSym +$LK "ICT_AND ","FL:::/LT/COMPILE/CODE.ASZ,253"$000007E7 0001 SysSym +$LK "ICT_AND_AND ","FL:::/LT/COMPILE/CODE.ASZ,264"$00000827 0001 SysSym +$LK "ICT_AND_AND_SKIPNZ ","FL:::/LT/COMPILE/CODE.ASZ,401"$00000A0C 0001 SysSym +$LK "ICT_AND_AND_SKIPNZ2 ","FL:::/LT/COMPILE/CODE.ASZ,402"$00000A0C 0001 SysSym +$LK "ICT_AND_AND_SKIPZ ","FL:::/LT/COMPILE/CODE.ASZ,399"$00000A0C 0001 SysSym +$LK "ICT_AND_AND_SKIPZ2 ","FL:::/LT/COMPILE/CODE.ASZ,400"$00000A0C 0001 SysSym +$LK "ICT_AND_EQUAL_U1 ","FL:::/LT/COMPILE/CODE.ASZ,292"$0000090E 0001 SysSym +$LK "ICT_AND_EQUAL_U2 ","FL:::/LT/COMPILE/CODE.ASZ,291"$0000090E 0001 SysSym +$LK "ICT_AND_EQUAL_U4 ","FL:::/LT/COMPILE/CODE.ASZ,290"$0000090E 0001 SysSym +$LK "ICT_AND_EQUAL_U8 ","FL:::/LT/COMPILE/CODE.ASZ,289"$0000090E 0001 SysSym +$LK "ICT_ASSIGN_U1 ","FL:::/LT/COMPILE/CODE.ASZ,272"$00000827 0001 SysSym +$LK "ICT_ASSIGN_U2 ","FL:::/LT/COMPILE/CODE.ASZ,271"$00000827 0001 SysSym +$LK "ICT_ASSIGN_U4 ","FL:::/LT/COMPILE/CODE.ASZ,270"$00000827 0001 SysSym +$LK "ICT_ASSIGN_U8 ","FL:::/LT/COMPILE/CODE.ASZ,269"$00000827 0001 SysSym +$LK "ICT_BSF ","FL:::/LT/COMPILE/CODE.ASZ,366"$000009BC 0001 SysSym +$LK "ICT_BSR ","FL:::/LT/COMPILE/CODE.ASZ,367"$000009BC 0001 SysSym +$LK "ICT_BT ","FL:::/LT/COMPILE/CODE.ASZ,362"$000009BC 0001 SysSym +$LK "ICT_BTC ","FL:::/LT/COMPILE/CODE.ASZ,365"$000009BC 0001 SysSym +$LK "ICT_BTC_CONSTANT ","FL:::/LT/COMPILE/CODE.ASZ,430"$00000A0C 0001 SysSym +$LK "ICT_BTR ","FL:::/LT/COMPILE/CODE.ASZ,364"$000009BC 0001 SysSym +$LK "ICT_BTR_CONSTANT ","FL:::/LT/COMPILE/CODE.ASZ,429"$00000A0C 0001 SysSym +$LK "ICT_BTS ","FL:::/LT/COMPILE/CODE.ASZ,363"$000009BC 0001 SysSym +$LK "ICT_BTS_CONSTANT ","FL:::/LT/COMPILE/CODE.ASZ,428"$00000A0C 0001 SysSym +$LK "ICT_BT_CONSTANT ","FL:::/LT/COMPILE/CODE.ASZ,427"$00000A0C 0001 SysSym +$LK "ICT_CALL ","FL:::/LT/COMPILE/CODE.ASZ,346"$000009BC 0001 SysSym +$LK "ICT_CALL_INDIRECT ","FL:::/LT/COMPILE/CODE.ASZ,347"$000009BC 0001 SysSym +$LK "ICT_CALL_INDIRECT2 ","FL:::/LT/COMPILE/CODE.ASZ,348"$000009BC 0001 SysSym +$LK "ICT_CLI ","FL:::/LT/COMPILE/CODE.ASZ,350"$000009BC 0001 SysSym +$LK "ICT_COLON ","FL:::/LT/COMPILE/CODE.ASZ,267"$00000827 0001 SysSym +$LK "ICT_COM ","FL:::/LT/COMPILE/CODE.ASZ,170"$00000626 0001 SysSym +$LK "ICT_DEC ","FL:::/LT/COMPILE/CODE.ASZ,336"$000009BC 0001 SysSym +$LK "ICT_DEREF_U1 ","FL:::/LT/COMPILE/CODE.ASZ,205"$000006DF 0001 SysSym +$LK "ICT_DEREF_U2 ","FL:::/LT/COMPILE/CODE.ASZ,204"$000006DB 0001 SysSym +$LK "ICT_DEREF_U4 ","FL:::/LT/COMPILE/CODE.ASZ,203"$000006D8 0001 SysSym +$LK "ICT_DEREF_U8 ","FL:::/LT/COMPILE/CODE.ASZ,202"$000006D8 0001 SysSym +$LK "ICT_DIVISION ","FL:::/LT/COMPILE/CODE.ASZ,251"$000007D7 0001 SysSym +$LK "ICT_DIV_EQUAL_U1 ","FL:::/LT/COMPILE/CODE.ASZ,288"$000008FC 0001 SysSym +$LK "ICT_DIV_EQUAL_U2 ","FL:::/LT/COMPILE/CODE.ASZ,287"$000008E9 0001 SysSym +$LK "ICT_DIV_EQUAL_U4 ","FL:::/LT/COMPILE/CODE.ASZ,286"$000008DB 0001 SysSym +$LK "ICT_DIV_EQUAL_U8 ","FL:::/LT/COMPILE/CODE.ASZ,285"$000008C8 0001 SysSym +$LK "ICT_DOUBLE ","FL:::/LT/COMPILE/CODE.ASZ,162"$0000061C 0001 SysSym +$LK "ICT_EBP ","FL:::/LT/COMPILE/CODE.ASZ,164"$0000061C 0001 SysSym +$LK "ICT_EDI ","FL:::/LT/COMPILE/CODE.ASZ,167"$00000621 0001 SysSym +$LK "ICT_EDI_ADD_EQUAL_U4 ","FL:::/LT/COMPILE/CODE.ASZ,327"$000009B2 0001 SysSym +$LK "ICT_EDI_ADD_EQUAL_U4_CONSTANT_U1 ","FL:::/LT/COMPILE/CODE.ASZ,437"$00000A28 0001 SysSym +$LK "ICT_EDI_AND_EQUAL_U4 ","FL:::/LT/COMPILE/CODE.ASZ,324"$000009A3 0001 SysSym +$LK "ICT_EDI_ASSIGN_U4 ","FL:::/LT/COMPILE/CODE.ASZ,319"$00000983 0001 SysSym +$LK "ICT_EDI_DEREF_U1 ","FL:::/LT/COMPILE/CODE.ASZ,213"$000006FF 0001 SysSym +$LK "ICT_EDI_DEREF_U2 ","FL:::/LT/COMPILE/CODE.ASZ,212"$000006F9 0001 SysSym +$LK "ICT_EDI_DEREF_U4 ","FL:::/LT/COMPILE/CODE.ASZ,211"$000006F4 0001 SysSym +$LK "ICT_EDI_DEREF_U8 ","FL:::/LT/COMPILE/CODE.ASZ,210"$000006F4 0001 SysSym +$LK "ICT_EDI_DIV_EQUAL_U4 ","FL:::/LT/COMPILE/CODE.ASZ,323"$00000998 0001 SysSym +$LK "ICT_EDI_MM_U4 ","FL:::/LT/COMPILE/CODE.ASZ,237"$00000783 0001 SysSym +$LK "ICT_EDI_MUL_EQUAL_U4 ","FL:::/LT/COMPILE/CODE.ASZ,322"$00000991 0001 SysSym +$LK "ICT_EDI_NEXT_EQUAL_U4 ","FL:::/LT/COMPILE/CODE.ASZ,432"$00000A13 0001 SysSym +$LK "ICT_EDI_OR_EQUAL_U4 ","FL:::/LT/COMPILE/CODE.ASZ,325"$000009A8 0001 SysSym +$LK "ICT_EDI_PP_U4 ","FL:::/LT/COMPILE/CODE.ASZ,236"$0000077D 0001 SysSym +$LK "ICT_EDI_SHL_EQUAL_U4 ","FL:::/LT/COMPILE/CODE.ASZ,320"$00000983 0001 SysSym +$LK "ICT_EDI_SHR_EQUAL_U4 ","FL:::/LT/COMPILE/CODE.ASZ,321"$0000098A 0001 SysSym +$LK "ICT_EDI_SUB_EQUAL_U4 ","FL:::/LT/COMPILE/CODE.ASZ,328"$000009B7 0001 SysSym +$LK "ICT_EDI_U1_DISP32 ","FL:::/LT/COMPILE/CODE.ASZ,197"$000006BA 0001 SysSym +$LK "ICT_EDI_U1_DISP8 ","FL:::/LT/COMPILE/CODE.ASZ,201"$000006D1 0001 SysSym +$LK "ICT_EDI_U2_DISP32 ","FL:::/LT/COMPILE/CODE.ASZ,196"$000006B0 0001 SysSym +$LK "ICT_EDI_U2_DISP8 ","FL:::/LT/COMPILE/CODE.ASZ,200"$000006CA 0001 SysSym +$LK "ICT_EDI_U4_DISP32 ","FL:::/LT/COMPILE/CODE.ASZ,195"$000006A7 0001 SysSym +$LK "ICT_EDI_U4_DISP8 ","FL:::/LT/COMPILE/CODE.ASZ,199"$000006C4 0001 SysSym +$LK "ICT_EDI_U4_MM ","FL:::/LT/COMPILE/CODE.ASZ,235"$00000777 0001 SysSym +$LK "ICT_EDI_U4_PP ","FL:::/LT/COMPILE/CODE.ASZ,234"$00000771 0001 SysSym +$LK "ICT_EDI_U8_DISP32 ","FL:::/LT/COMPILE/CODE.ASZ,194"$000006A7 0001 SysSym +$LK "ICT_EDI_U8_DISP8 ","FL:::/LT/COMPILE/CODE.ASZ,198"$000006C4 0001 SysSym +$LK "ICT_EDI_XOR_EQUAL_U4 ","FL:::/LT/COMPILE/CODE.ASZ,326"$000009AD 0001 SysSym +$LK "ICT_END_EXP ","FL:::/LT/COMPILE/CODE.ASZ,156"$00000614 0001 SysSym +$LK "ICT_ENTER ","FL:::/LT/COMPILE/CODE.ASZ,337"$000009BC 0001 SysSym +$LK "ICT_ENTER1 ","FL:::/LT/COMPILE/CODE.ASZ,339"$000009BC 0001 SysSym +$LK "ICT_ENTER2 ","FL:::/LT/COMPILE/CODE.ASZ,341"$000009BC 0001 SysSym +$LK "ICT_EQUAL_EQUAL ","FL:::/LT/COMPILE/CODE.ASZ,258"$000007E7 0001 SysSym +$LK "ICT_EQUAL_EQUAL_SKIPZ ","FL:::/LT/COMPILE/CODE.ASZ,387"$000009BC 0001 SysSym +$LK "ICT_EQUAL_EQUAL_SKIPZ2 ","FL:::/LT/COMPILE/CODE.ASZ,388"$000009BC 0001 SysSym +$LK "ICT_ESI ","FL:::/LT/COMPILE/CODE.ASZ,166"$0000061C 0001 SysSym +$LK "ICT_ESI_ADD_EQUAL_U4 ","FL:::/LT/COMPILE/CODE.ASZ,317"$00000979 0001 SysSym +$LK "ICT_ESI_ADD_EQUAL_U4_CONSTANT_U1 ","FL:::/LT/COMPILE/CODE.ASZ,436"$00000A20 0001 SysSym +$LK "ICT_ESI_AND_EQUAL_U4 ","FL:::/LT/COMPILE/CODE.ASZ,314"$0000096A 0001 SysSym +$LK "ICT_ESI_ASSIGN_U4 ","FL:::/LT/COMPILE/CODE.ASZ,309"$0000094A 0001 SysSym +$LK "ICT_ESI_DEREF_U1 ","FL:::/LT/COMPILE/CODE.ASZ,209"$000006EE 0001 SysSym +$LK "ICT_ESI_DEREF_U2 ","FL:::/LT/COMPILE/CODE.ASZ,208"$000006E8 0001 SysSym +$LK "ICT_ESI_DEREF_U4 ","FL:::/LT/COMPILE/CODE.ASZ,207"$000006E3 0001 SysSym +$LK "ICT_ESI_DEREF_U8 ","FL:::/LT/COMPILE/CODE.ASZ,206"$000006E3 0001 SysSym +$LK "ICT_ESI_DIV_EQUAL_U4 ","FL:::/LT/COMPILE/CODE.ASZ,313"$0000095F 0001 SysSym +$LK "ICT_ESI_MM_U4 ","FL:::/LT/COMPILE/CODE.ASZ,233"$0000076B 0001 SysSym +$LK "ICT_ESI_MUL_EQUAL_U4 ","FL:::/LT/COMPILE/CODE.ASZ,312"$00000958 0001 SysSym +$LK "ICT_ESI_NEXT_EQUAL_U4 ","FL:::/LT/COMPILE/CODE.ASZ,431"$00000A0C 0001 SysSym +$LK "ICT_ESI_OR_EQUAL_U4 ","FL:::/LT/COMPILE/CODE.ASZ,315"$0000096F 0001 SysSym +$LK "ICT_ESI_PP_U4 ","FL:::/LT/COMPILE/CODE.ASZ,232"$00000765 0001 SysSym +$LK "ICT_ESI_SHL_EQUAL_U4 ","FL:::/LT/COMPILE/CODE.ASZ,310"$0000094A 0001 SysSym +$LK "ICT_ESI_SHR_EQUAL_U4 ","FL:::/LT/COMPILE/CODE.ASZ,311"$00000951 0001 SysSym +$LK "ICT_ESI_SUB_EQUAL_U4 ","FL:::/LT/COMPILE/CODE.ASZ,318"$0000097E 0001 SysSym +$LK "ICT_ESI_U1_DISP32 ","FL:::/LT/COMPILE/CODE.ASZ,189"$00000689 0001 SysSym +$LK "ICT_ESI_U1_DISP8 ","FL:::/LT/COMPILE/CODE.ASZ,193"$000006A0 0001 SysSym +$LK "ICT_ESI_U2_DISP32 ","FL:::/LT/COMPILE/CODE.ASZ,188"$0000067F 0001 SysSym +$LK "ICT_ESI_U2_DISP8 ","FL:::/LT/COMPILE/CODE.ASZ,192"$00000699 0001 SysSym +$LK "ICT_ESI_U4_DISP32 ","FL:::/LT/COMPILE/CODE.ASZ,187"$00000676 0001 SysSym +$LK "ICT_ESI_U4_DISP8 ","FL:::/LT/COMPILE/CODE.ASZ,191"$00000693 0001 SysSym +$LK "ICT_ESI_U4_MM ","FL:::/LT/COMPILE/CODE.ASZ,231"$0000075F 0001 SysSym +$LK "ICT_ESI_U4_PP ","FL:::/LT/COMPILE/CODE.ASZ,230"$00000759 0001 SysSym +$LK "ICT_ESI_U8_DISP32 ","FL:::/LT/COMPILE/CODE.ASZ,186"$00000676 0001 SysSym +$LK "ICT_ESI_U8_DISP8 ","FL:::/LT/COMPILE/CODE.ASZ,190"$00000693 0001 SysSym +$LK "ICT_ESI_XOR_EQUAL_U4 ","FL:::/LT/COMPILE/CODE.ASZ,316"$00000974 0001 SysSym +$LK "ICT_FS ","FL:::/LT/COMPILE/CODE.ASZ,165"$0000061C 0001 SysSym +$LK "ICT_FS_U1_DISP32 ","FL:::/LT/COMPILE/CODE.ASZ,185"$0000066B 0001 SysSym +$LK "ICT_FS_U2_DISP32 ","FL:::/LT/COMPILE/CODE.ASZ,184"$00000660 0001 SysSym +$LK "ICT_FS_U4_DISP32 ","FL:::/LT/COMPILE/CODE.ASZ,183"$00000657 0001 SysSym +$LK "ICT_FS_U8_DISP32 ","FL:::/LT/COMPILE/CODE.ASZ,182"$00000657 0001 SysSym +$LK "ICT_GET_BASE_PTR ","FL:::/LT/COMPILE/CODE.ASZ,354"$000009BC 0001 SysSym +$LK "ICT_GET_FLAGS ","FL:::/LT/COMPILE/CODE.ASZ,352"$000009BC 0001 SysSym +$LK "ICT_GET_LABEL ","FL:::/LT/COMPILE/CODE.ASZ,358"$000009BC 0001 SysSym +$LK "ICT_GET_STACK_PTR ","FL:::/LT/COMPILE/CODE.ASZ,356"$000009BC 0001 SysSym +$LK "ICT_GREATER_OR_EQUAL ","FL:::/LT/COMPILE/CODE.ASZ,263"$00000817 0001 SysSym +$LK "ICT_GREATER_OR_EQUAL_SKIPZ ","FL:::/LT/COMPILE/CODE.ASZ,397"$000009F8 0002 SysSym +$LK "ICT_GREATER_OR_EQUAL_SKIPZ2 ","FL:::/LT/COMPILE/CODE.ASZ,398"$00000A00 0001 SysSym +$LK "ICT_GREATER_THAN ","FL:::/LT/COMPILE/CODE.ASZ,261"$000007F7 0001 SysSym +$LK "ICT_GREATER_THAN_SKIPZ ","FL:::/LT/COMPILE/CODE.ASZ,393"$000009D0 0002 SysSym +$LK "ICT_GREATER_THAN_SKIPZ2 ","FL:::/LT/COMPILE/CODE.ASZ,394"$000009D8 0001 SysSym +$LK "ICT_INC ","FL:::/LT/COMPILE/CODE.ASZ,332"$000009BC 0001 SysSym +$LK "ICT_INP ","FL:::/LT/COMPILE/CODE.ASZ,376"$000009BC 0001 SysSym +$LK "ICT_INPD ","FL:::/LT/COMPILE/CODE.ASZ,374"$000009BC 0001 SysSym +$LK "ICT_INPW ","FL:::/LT/COMPILE/CODE.ASZ,375"$000009BC 0001 SysSym +$LK "ICT_INSQUE ","FL:::/LT/COMPILE/CODE.ASZ,368"$000009BC 0001 SysSym +$LK "ICT_INSQUE_REV ","FL:::/LT/COMPILE/CODE.ASZ,369"$000009BC 0001 SysSym +$LK "ICT_IRQ ","FL:::/LT/COMPILE/CODE.ASZ,349"$000009BC 0001 SysSym +$LK "ICT_JMP ","FL:::/LT/COMPILE/CODE.ASZ,380"$000009BC 0001 SysSym +$LK "ICT_LABEL ","FL:::/LT/COMPILE/CODE.ASZ,360"$000009BC 0001 SysSym +$LK "ICT_LEAVE ","FL:::/LT/COMPILE/CODE.ASZ,338"$000009BC 0001 SysSym +$LK "ICT_LEAVE1 ","FL:::/LT/COMPILE/CODE.ASZ,340"$000009BC 0001 SysSym +$LK "ICT_LEAVE2 ","FL:::/LT/COMPILE/CODE.ASZ,342"$000009BC 0001 SysSym +$LK "ICT_LEA_DISP32_EBP ","FL:::/LT/COMPILE/CODE.ASZ,238"$00000789 0001 SysSym +$LK "ICT_LEA_DISP32_EDI ","FL:::/LT/COMPILE/CODE.ASZ,409"$00000A0C 0001 SysSym +$LK "ICT_LEA_DISP32_ESI ","FL:::/LT/COMPILE/CODE.ASZ,407"$00000A0C 0001 SysSym +$LK "ICT_LEA_DISP8_EBP ","FL:::/LT/COMPILE/CODE.ASZ,239"$00000789 0001 SysSym +$LK "ICT_LEA_DISP8_EDI ","FL:::/LT/COMPILE/CODE.ASZ,410"$00000A0C 0001 SysSym +$LK "ICT_LEA_DISP8_ESI ","FL:::/LT/COMPILE/CODE.ASZ,408"$00000A0C 0001 SysSym +$LK "ICT_LESS_OR_EQUAL ","FL:::/LT/COMPILE/CODE.ASZ,262"$00000807 0001 SysSym +$LK "ICT_LESS_OR_EQUAL_SKIPZ ","FL:::/LT/COMPILE/CODE.ASZ,395"$000009E4 0002 SysSym +$LK "ICT_LESS_OR_EQUAL_SKIPZ2 ","FL:::/LT/COMPILE/CODE.ASZ,396"$000009EC 0001 SysSym +$LK "ICT_LESS_THAN ","FL:::/LT/COMPILE/CODE.ASZ,260"$000007E7 0001 SysSym +$LK "ICT_LESS_THAN_SKIPZ ","FL:::/LT/COMPILE/CODE.ASZ,391"$000009BC 0002 SysSym +$LK "ICT_LESS_THAN_SKIPZ2 ","FL:::/LT/COMPILE/CODE.ASZ,392"$000009C4 0001 SysSym +$LK "ICT_MEMCPY ","FL:::/LT/COMPILE/CODE.ASZ,372"$000009BC 0001 SysSym +$LK "ICT_MEMSET ","FL:::/LT/COMPILE/CODE.ASZ,373"$000009BC 0001 SysSym +$LK "ICT_MM_U1 ","FL:::/LT/COMPILE/CODE.ASZ,229"$00000753 0001 SysSym +$LK "ICT_MM_U2 ","FL:::/LT/COMPILE/CODE.ASZ,228"$0000074C 0001 SysSym +$LK "ICT_MM_U4 ","FL:::/LT/COMPILE/CODE.ASZ,227"$00000747 0001 SysSym +$LK "ICT_MM_U8 ","FL:::/LT/COMPILE/CODE.ASZ,226"$00000747 0001 SysSym +$LK "ICT_MULTIPLICATION ","FL:::/LT/COMPILE/CODE.ASZ,250"$000007D1 0001 SysSym +$LK "ICT_MUL_EQUAL_U1 ","FL:::/LT/COMPILE/CODE.ASZ,284"$000008BD 0001 SysSym +$LK "ICT_MUL_EQUAL_U2 ","FL:::/LT/COMPILE/CODE.ASZ,283"$000008B1 0001 SysSym +$LK "ICT_MUL_EQUAL_U4 ","FL:::/LT/COMPILE/CODE.ASZ,282"$000008A7 0001 SysSym +$LK "ICT_MUL_EQUAL_U8 ","FL:::/LT/COMPILE/CODE.ASZ,281"$0000089A 0001 SysSym +$LK "ICT_NOP ","FL:::/LT/COMPILE/CODE.ASZ,155"$00000614 0001 SysSym +$LK "ICT_NOT ","FL:::/LT/COMPILE/CODE.ASZ,171"$00000626 0001 SysSym +$LK "ICT_NOT_EQUAL_TO ","FL:::/LT/COMPILE/CODE.ASZ,259"$000007E7 0001 SysSym +$LK "ICT_NOT_EQUAL_TO_SKIPZ ","FL:::/LT/COMPILE/CODE.ASZ,389"$000009BC 0001 SysSym +$LK "ICT_NOT_EQUAL_TO_SKIPZ2 ","FL:::/LT/COMPILE/CODE.ASZ,390"$000009BC 0001 SysSym +$LK "ICT_NULL ","FL:::/LT/COMPILE/CODE.ASZ,154"$00000614 0001 SysSym +$LK "ICT_OR ","FL:::/LT/COMPILE/CODE.ASZ,254"$000007E7 0001 SysSym +$LK "ICT_OR_EQUAL_U1 ","FL:::/LT/COMPILE/CODE.ASZ,296"$0000090E 0001 SysSym +$LK "ICT_OR_EQUAL_U2 ","FL:::/LT/COMPILE/CODE.ASZ,295"$0000090E 0001 SysSym +$LK "ICT_OR_EQUAL_U4 ","FL:::/LT/COMPILE/CODE.ASZ,294"$0000090E 0001 SysSym +$LK "ICT_OR_EQUAL_U8 ","FL:::/LT/COMPILE/CODE.ASZ,293"$0000090E 0001 SysSym +$LK "ICT_OR_OR ","FL:::/LT/COMPILE/CODE.ASZ,265"$00000827 0001 SysSym +$LK "ICT_OR_OR_SKIPNZ ","FL:::/LT/COMPILE/CODE.ASZ,405"$00000A0C 0001 SysSym +$LK "ICT_OR_OR_SKIPNZ2 ","FL:::/LT/COMPILE/CODE.ASZ,406"$00000A0C 0001 SysSym +$LK "ICT_OR_OR_SKIPZ ","FL:::/LT/COMPILE/CODE.ASZ,403"$00000A0C 0001 SysSym +$LK "ICT_OR_OR_SKIPZ2 ","FL:::/LT/COMPILE/CODE.ASZ,404"$00000A0C 0001 SysSym +$LK "ICT_OUTP ","FL:::/LT/COMPILE/CODE.ASZ,379"$000009BC 0001 SysSym +$LK "ICT_OUTPD ","FL:::/LT/COMPILE/CODE.ASZ,377"$000009BC 0001 SysSym +$LK "ICT_OUTPW ","FL:::/LT/COMPILE/CODE.ASZ,378"$000009BC 0001 SysSym +$LK "ICT_POWER ","FL:::/LT/COMPILE/CODE.ASZ,249"$000007D1 0001 SysSym +$LK "ICT_PP_U1 ","FL:::/LT/COMPILE/CODE.ASZ,225"$00000741 0001 SysSym +$LK "ICT_PP_U2 ","FL:::/LT/COMPILE/CODE.ASZ,224"$0000073A 0001 SysSym +$LK "ICT_PP_U4 ","FL:::/LT/COMPILE/CODE.ASZ,223"$00000735 0001 SysSym +$LK "ICT_PP_U8 ","FL:::/LT/COMPILE/CODE.ASZ,222"$00000735 0001 SysSym +$LK "ICT_PUSH_DEREF_U8 ","FL:::/LT/COMPILE/CODE.ASZ,425"$00000A0C 0001 SysSym +$LK "ICT_PUSH_DOUBLE ","FL:::/LT/COMPILE/CODE.ASZ,418"$00000A0C 0001 SysSym +$LK "ICT_PUSH_EDI_U8_DISP32 ","FL:::/LT/COMPILE/CODE.ASZ,423"$00000A0C 0001 SysSym +$LK "ICT_PUSH_EDI_U8_DISP8 ","FL:::/LT/COMPILE/CODE.ASZ,424"$00000A0C 0001 SysSym +$LK "ICT_PUSH_ESI_U8_DISP32 ","FL:::/LT/COMPILE/CODE.ASZ,421"$00000A0C 0001 SysSym +$LK "ICT_PUSH_ESI_U8_DISP8 ","FL:::/LT/COMPILE/CODE.ASZ,422"$00000A0C 0001 SysSym +$LK "ICT_PUSH_NEG_U1 ","FL:::/LT/COMPILE/CODE.ASZ,417"$00000A0C 0001 SysSym +$LK "ICT_PUSH_NEG_U2 ","FL:::/LT/COMPILE/CODE.ASZ,416"$00000A0C 0001 SysSym +$LK "ICT_PUSH_NEG_U4 ","FL:::/LT/COMPILE/CODE.ASZ,415"$00000A0C 0001 SysSym +$LK "ICT_PUSH_U1 ","FL:::/LT/COMPILE/CODE.ASZ,414"$00000A0C 0001 SysSym +$LK "ICT_PUSH_U2 ","FL:::/LT/COMPILE/CODE.ASZ,413"$00000A0C 0001 SysSym +$LK "ICT_PUSH_U4 ","FL:::/LT/COMPILE/CODE.ASZ,412"$00000A0C 0001 SysSym +$LK "ICT_PUSH_U8 ","FL:::/LT/COMPILE/CODE.ASZ,411"$00000A0C 0001 SysSym +$LK "ICT_PUSH_U8_DISP32 ","FL:::/LT/COMPILE/CODE.ASZ,419"$00000A0C 0001 SysSym +$LK "ICT_PUSH_U8_DISP32_SCALED ","FL:::/LT/COMPILE/CODE.ASZ,426"$00000A0C 0001 SysSym +$LK "ICT_PUSH_U8_DISP8 ","FL:::/LT/COMPILE/CODE.ASZ,420"$00000A0C 0001 SysSym +$LK "ICT_QUESTION ","FL:::/LT/COMPILE/CODE.ASZ,268"$00000827 0001 SysSym +$LK "ICT_REMAINDER ","FL:::/LT/COMPILE/CODE.ASZ,252"$000007DE 0001 SysSym +$LK "ICT_REMQUE ","FL:::/LT/COMPILE/CODE.ASZ,370"$000009BC 0001 SysSym +$LK "ICT_RET ","FL:::/LT/COMPILE/CODE.ASZ,345"$000009BC 0001 SysSym +$LK "ICT_SET_BASE_PTR ","FL:::/LT/COMPILE/CODE.ASZ,355"$000009BC 0001 SysSym +$LK "ICT_SET_FLAGS ","FL:::/LT/COMPILE/CODE.ASZ,353"$000009BC 0001 SysSym +$LK "ICT_SET_STACK_PTR ","FL:::/LT/COMPILE/CODE.ASZ,357"$000009BC 0001 SysSym +$LK "ICT_SHL ","FL:::/LT/COMPILE/CODE.ASZ,243"$0000079A 0001 SysSym +$LK "ICT_SHL_CONSTANT1 ","FL:::/LT/COMPILE/CODE.ASZ,245"$000007B9 0002 SysSym +$LK "ICT_SHL_CONSTANT2 ","FL:::/LT/COMPILE/CODE.ASZ,246"$000007B9 0001 SysSym +$LK "ICT_SHL_EQUAL_U1 ","FL:::/LT/COMPILE/CODE.ASZ,276"$0000083F 0001 SysSym +$LK "ICT_SHL_EQUAL_U2 ","FL:::/LT/COMPILE/CODE.ASZ,275"$00000832 0001 SysSym +$LK "ICT_SHL_EQUAL_U4 ","FL:::/LT/COMPILE/CODE.ASZ,274"$00000827 0001 SysSym +$LK "ICT_SHL_EQUAL_U8 ","FL:::/LT/COMPILE/CODE.ASZ,273"$00000827 0001 SysSym +$LK "ICT_SHORT_JMP ","FL:::/LT/COMPILE/CODE.ASZ,381"$000009BC 0001 SysSym +$LK "ICT_SHR ","FL:::/LT/COMPILE/CODE.ASZ,244"$0000079A 0001 SysSym +$LK "ICT_SHR_CONSTANT1 ","FL:::/LT/COMPILE/CODE.ASZ,247"$000007B9 0001 SysSym +$LK "ICT_SHR_CONSTANT2 ","FL:::/LT/COMPILE/CODE.ASZ,248"$000007C0 0001 SysSym +$LK "ICT_SHR_EQUAL_U1 ","FL:::/LT/COMPILE/CODE.ASZ,280"$0000088E 0001 SysSym +$LK "ICT_SHR_EQUAL_U2 ","FL:::/LT/COMPILE/CODE.ASZ,279"$00000881 0001 SysSym +$LK "ICT_SHR_EQUAL_U4 ","FL:::/LT/COMPILE/CODE.ASZ,278"$00000876 0001 SysSym +$LK "ICT_SHR_EQUAL_U8 ","FL:::/LT/COMPILE/CODE.ASZ,277"$0000084B 0001 SysSym +$LK "ICT_SKIPNZ ","FL:::/LT/COMPILE/CODE.ASZ,385"$000009BC 0001 SysSym +$LK "ICT_SKIPNZ2 ","FL:::/LT/COMPILE/CODE.ASZ,386"$000009BC 0001 SysSym +$LK "ICT_SKIPZ ","FL:::/LT/COMPILE/CODE.ASZ,383"$000009BC 0001 SysSym +$LK "ICT_SKIPZ2 ","FL:::/LT/COMPILE/CODE.ASZ,384"$000009BC 0001 SysSym +$LK "ICT_STI ","FL:::/LT/COMPILE/CODE.ASZ,351"$000009BC 0001 SysSym +$LK "ICT_STRING_CONSTANT ","FL:::/LT/COMPILE/CODE.ASZ,163"$0000061C 0001 SysSym +$LK "ICT_STRLEN ","FL:::/LT/COMPILE/CODE.ASZ,371"$000009BC 0001 SysSym +$LK "ICT_SUB32 ","FL:::/LT/COMPILE/CODE.ASZ,334"$000009BC 0001 SysSym +$LK "ICT_SUB64 ","FL:::/LT/COMPILE/CODE.ASZ,333"$000009BC 0001 SysSym +$LK "ICT_SUB8 ","FL:::/LT/COMPILE/CODE.ASZ,335"$000009BC 0001 SysSym +$LK "ICT_SUBTRACTION ","FL:::/LT/COMPILE/CODE.ASZ,257"$000007E7 0001 SysSym +$LK "ICT_SUB_EQUAL_U1 ","FL:::/LT/COMPILE/CODE.ASZ,308"$00000940 0001 SysSym +$LK "ICT_SUB_EQUAL_U2 ","FL:::/LT/COMPILE/CODE.ASZ,307"$00000935 0001 SysSym +$LK "ICT_SUB_EQUAL_U4 ","FL:::/LT/COMPILE/CODE.ASZ,306"$0000092C 0001 SysSym +$LK "ICT_SUB_EQUAL_U8 ","FL:::/LT/COMPILE/CODE.ASZ,305"$0000092C 0001 SysSym +$LK "ICT_SUB_EQUAL_U8_CONSTANT_U1 ","FL:::/LT/COMPILE/CODE.ASZ,434"$00000A1A 0001 SysSym +$LK "ICT_SWITCH ","FL:::/LT/COMPILE/CODE.ASZ,382"$000009BC 0001 SysSym +$LK "ICT_TABLE_END ","FL:::/LT/COMPILE/CODE.ASZ,438"$00000A30 0001 SysSym +$LK "ICT_TO_DOUBLE ","FL:::/LT/COMPILE/CODE.ASZ,168"$00000626 0001 SysSym +$LK "ICT_TO_INT ","FL:::/LT/COMPILE/CODE.ASZ,169"$00000626 0001 SysSym +$LK "ICT_TYPE ","FL:::/LT/COMPILE/CODE.ASZ,361"$000009BC 0001 SysSym +$LK "ICT_U1 ","FL:::/LT/COMPILE/CODE.ASZ,161"$0000061C 0001 SysSym +$LK "ICT_U1_DISP32 ","FL:::/LT/COMPILE/CODE.ASZ,177"$00000639 0001 SysSym +$LK "ICT_U1_DISP8 ","FL:::/LT/COMPILE/CODE.ASZ,181"$00000650 0001 SysSym +$LK "ICT_U1_MM ","FL:::/LT/COMPILE/CODE.ASZ,221"$0000072D 0001 SysSym +$LK "ICT_U1_PP ","FL:::/LT/COMPILE/CODE.ASZ,217"$00000715 0001 SysSym +$LK "ICT_U2 ","FL:::/LT/COMPILE/CODE.ASZ,160"$0000061C 0001 SysSym +$LK "ICT_U2_DISP32 ","FL:::/LT/COMPILE/CODE.ASZ,176"$0000062F 0001 SysSym +$LK "ICT_U2_DISP32_SCALED ","FL:::/LT/COMPILE/CODE.ASZ,242"$00000791 0001 SysSym +$LK "ICT_U2_DISP8 ","FL:::/LT/COMPILE/CODE.ASZ,180"$00000649 0001 SysSym +$LK "ICT_U2_MM ","FL:::/LT/COMPILE/CODE.ASZ,220"$00000724 0001 SysSym +$LK "ICT_U2_PP ","FL:::/LT/COMPILE/CODE.ASZ,216"$0000070C 0001 SysSym +$LK "ICT_U4 ","FL:::/LT/COMPILE/CODE.ASZ,159"$00000614 0001 SysSym +$LK "ICT_U4_DISP32 ","FL:::/LT/COMPILE/CODE.ASZ,175"$00000626 0001 SysSym +$LK "ICT_U4_DISP32_SCALED ","FL:::/LT/COMPILE/CODE.ASZ,241"$00000789 0001 SysSym +$LK "ICT_U4_DISP8 ","FL:::/LT/COMPILE/CODE.ASZ,179"$00000643 0001 SysSym +$LK "ICT_U4_MM ","FL:::/LT/COMPILE/CODE.ASZ,219"$0000071D 0001 SysSym +$LK "ICT_U4_PP ","FL:::/LT/COMPILE/CODE.ASZ,215"$00000705 0001 SysSym +$LK "ICT_U8 ","FL:::/LT/COMPILE/CODE.ASZ,158"$00000614 0001 SysSym +$LK "ICT_U8_DISP32 ","FL:::/LT/COMPILE/CODE.ASZ,174"$00000626 0001 SysSym +$LK "ICT_U8_DISP32_SCALED ","FL:::/LT/COMPILE/CODE.ASZ,240"$00000789 0001 SysSym +$LK "ICT_U8_DISP8 ","FL:::/LT/COMPILE/CODE.ASZ,178"$00000643 0001 SysSym +$LK "ICT_U8_MM ","FL:::/LT/COMPILE/CODE.ASZ,218"$0000071D 0001 SysSym +$LK "ICT_U8_PP ","FL:::/LT/COMPILE/CODE.ASZ,214"$00000705 0001 SysSym +$LK "ICT_UNARY_MINUS ","FL:::/LT/COMPILE/CODE.ASZ,172"$00000626 0001 SysSym +$LK "ICT_XOR ","FL:::/LT/COMPILE/CODE.ASZ,255"$000007E7 0001 SysSym +$LK "ICT_XOR_EQUAL_U1 ","FL:::/LT/COMPILE/CODE.ASZ,300"$0000090E 0001 SysSym +$LK "ICT_XOR_EQUAL_U2 ","FL:::/LT/COMPILE/CODE.ASZ,299"$0000090E 0001 SysSym +$LK "ICT_XOR_EQUAL_U4 ","FL:::/LT/COMPILE/CODE.ASZ,298"$0000090E 0001 SysSym +$LK "ICT_XOR_EQUAL_U8 ","FL:::/LT/COMPILE/CODE.ASZ,297"$0000090E 0001 SysSym +$LK "ICT_XOR_XOR ","FL:::/LT/COMPILE/CODE.ASZ,266"$00000827 0001 SysSym +$LK "ICT_ZERO ","FL:::/LT/COMPILE/CODE.ASZ,157"$00000614 0001 SysSym +$LK "INTERNAL_TYPES_TABLE ","FL:::/LT/COMPILE/CODE.ASZ,5"$00000000 0001 SysSym Export +$LK "I_OPT_NOP ","FL:::/LT/COMPILE/CODE.ASZ,43"$00000108 0001 SysSym +$LK +BI,"InitCompiler ","FL:::/LT/COMPILE/COMPILE.CPZ,2623",74$0003697A 0001 Funct Export +$LK +BI,"Lex ","FL:::/LT/COMPILE/LEX.CPZ,566",75$00004C7D 00D7 Funct Export +$LK +BI,"LexBackupLastChar ","FL:::/LT/COMPILE/LEX.CPZ,147",76$00002DBF 0003 Funct Export +$LK +BI,"LexDel ","FL:::/LT/COMPILE/LEX.CPZ,95",77$000029F1 0004 Funct Export +$LK +BI,"LexExtendString ","FL:::/LT/COMPILE/LEX.CPZ,925",78$00006DD8 0004 Funct Export +$LK +BI,"LexGetChar ","FL:::/LT/COMPILE/LEX.CPZ,158",79$00002E64 0020 Funct Export +$LK +BI,"LexInString ","FL:::/LT/COMPILE/LEX.CPZ,501",80$00004504 0001 Funct Export +$LK +BI,"LexIncludeLtf ","FL:::/LT/COMPILE/LEX.CPZ,377",81$00003D7D 0001 Funct Export +$LK +BI,"LexIncludeString ","FL:::/LT/COMPILE/LEX.CPZ,355",82$00003C43 0003 Funct Export +$LK +BI,"LexLineNum ","FL:::/LT/COMPILE/LEX.CPZ,968",83$00007168 0008 Funct Export +$LK +BI,"LexNew ","FL:::/LT/COMPILE/LEX.CPZ,65",84$000027AC 0005 Funct Export +$LK +BI,"LexPop ","FL:::/LT/COMPILE/LEX.CPZ,453",85$00004225 0007 Funct Export +$LK +BI,"LexPush ","FL:::/LT/COMPILE/LEX.CPZ,441",86$0000411C 0002 Funct Export +$LK +BI,"LexPutLine ","FL:::/LT/COMPILE/LEX.CPZ,950",87$00006FF0 0003 Funct Export +$LK +BI,"LexPutLink ","FL:::/LT/COMPILE/LEX.CPZ,973",88$000071A0 0002 Funct Export +$LK +BI,"LexPutToken ","FL:::/LT/COMPILE/LEX.CPZ,128",89$00002BF2 0003 Funct Export +$LK +BI,"LexSkipEol ","FL:::/LT/COMPILE/LEX.CPZ,329",90$00003AD9 0007 Funct Export +$LK +BI,"LoadAsmHash ","FL:::/LT/COMPILE/ASM.CPZ,33",91$00010A40 0001 Funct Export +$LK +BI,"LoadCompileSysText ","FL:::/LT/COMPILE/COMPILE.CPZ,1925",92$00033027 0001 Funct Export +$LK +BI,"MSPrintFDate ","FL:::/LT/COMPILE/SPRINTF2.CPZ,117",93$0000BA16 0001 Funct Export +$LK +BI,"MSPrintFPSect ","FL:::/LT/COMPILE/SPRINTF2.CPZ,39",94$0000AC33 0002 Funct Export +$LK +BI,"MSPrintFTime ","FL:::/LT/COMPILE/SPRINTF2.CPZ,57",95$0000AD93 0001 Funct Export +$LK +BI,"OptEnd ","FL:::/LT/COMPILE/OPT.CPZ,99",96$0001CC4D 0004 Funct Export +$LK +BI,"OptMissing ","FL:::/LT/COMPILE/OPT.CPZ,58",97$0001CA89 0004 Funct Export +$LK "OptNext ","FL:::/LT/COMPILE/OPT.CPZ,80"$00000110 0004 Funct +$LK +BI,"OptStart ","FL:::/LT/COMPILE/OPT.CPZ,66",98$0001CB60 0004 Funct Export +$LK +BI,"OutChar ","FL:::/LT/COMPILE/SPRINTF2.CPZ,1",99$0000A8B4 0016 Funct Export +$LK +BI,"OutString ","FL:::/LT/COMPILE/SPRINTF2.CPZ,19",100$0000A9D5 0008 Funct Export +$LK "PASS2_OFFSETS ","FL:::/LT/COMPILE/OPT.CPZ,1226"$4 0013 StrConst +$LK "PG_EXTERN ","FL:::/LT/COMPILE/COMPILE.CPZ,488"$4 0005 StrConst +$LK "PG_IMPORT ","FL:::/LT/COMPILE/COMPILE.CPZ,489"$5 0004 StrConst +$LK "PG_LTEXTERN ","FL:::/LT/COMPILE/COMPILE.CPZ,485"$1 0004 StrConst +$LK "PG_LTIMPORT ","FL:::/LT/COMPILE/COMPILE.CPZ,487"$3 0006 StrConst +$LK "PG_LTINTERN ","FL:::/LT/COMPILE/COMPILE.CPZ,486"$2 0002 StrConst +$LK "PG_NULL ","FL:::/LT/COMPILE/COMPILE.CPZ,484"$0 0001 StrConst +$LK "PRST_CHECK_BINARY_OPS ","FL:::/LT/COMPILE/PARSE.CPZ,18"$3 000E StrConst +$LK "PRST_DEREFERRENCE ","FL:::/LT/COMPILE/PARSE.CPZ,17"$2 0004 StrConst +$LK "PRST_UNARY_MODIFIERS ","FL:::/LT/COMPILE/PARSE.CPZ,16"$1 0009 StrConst +$LK "PRST_UNARY_TERM ","FL:::/LT/COMPILE/PARSE.CPZ,15"$0 0005 StrConst +$LK "PVLM_CLASS ","FL:::/LT/COMPILE/COMPILE.CPZ,14"$2 0001 StrConst +$LK "PVLM_FUNCTION_PARAM ","FL:::/LT/COMPILE/COMPILE.CPZ,13"$1 0003 StrConst +$LK "PVLM_LOCAL_VAR ","FL:::/LT/COMPILE/COMPILE.CPZ,12"$0 0004 StrConst +$LK "PVLM_UNION ","FL:::/LT/COMPILE/COMPILE.CPZ,15"$3 0000 StrConst +$LK +BI,"ParseAsmArg ","FL:::/LT/COMPILE/ASM.CPZ,579",101$00013A7E 0002 Funct Export +$LK +BI,"ParseAsmImm ","FL:::/LT/COMPILE/ASM.CPZ,542",102$0001381C 0006 Funct Export +$LK +BI,"PrsDereferrence ","FL:::/LT/COMPILE/PARSE.CPZ,693",103$0001C1D5 0000 Funct Export +$LK +BI,"PrsExcept ","FL:::/LT/COMPILE/LEX.CPZ,1025",104$000074D4 0064 Funct Export +$LK +BI,"PrsParseExpression ","FL:::/LT/COMPILE/PARSE.CPZ,20",105$00018720 000F Funct Export +$LK +BI,"PrsParseGlblInit ","FL:::/LT/COMPILE/COMPILE.CPZ,464",106$0002B832 0001 Funct Export +$LK "PrsPop ","FL:::/LT/COMPILE/PARSE.CPZ,13"$00000188 006A Funct +$LK "PrsPush ","FL:::/LT/COMPILE/PARSE.CPZ,12"$00000170 00E1 Funct +$LK +BI,"PrsUnaryModifier ","FL:::/LT/COMPILE/PARSE.CPZ,545",107$0001B4F5 0000 Funct Export +$LK +BI,"PrsUnaryTerm ","FL:::/LT/COMPILE/PARSE.CPZ,165",108$0001931C 0000 Funct Export +$LK +BI,"PrsVarInit ","FL:::/LT/COMPILE/COMPILE.CPZ,405",109$0002B293 0002 Funct Export +$LK +BI,"PutAsmError ","FL:::/LT/COMPILE/LEX.CPZ,1011",110$0000742A 0023 Funct Export +$LK +BI,"PutAsmWarning ","FL:::/LT/COMPILE/LEX.CPZ,1018",111$00007481 0003 Funct Export +$LK +BI,"PutLexError ","FL:::/LT/COMPILE/LEX.CPZ,980",112$00007249 0002 Funct Export +$LK +BI,"PutLexWarning ","FL:::/LT/COMPILE/LEX.CPZ,998",113$0000736D 0001 Funct Export +$LK +BI,"ResolveGlbls ","FL:::/LT/COMPILE/ASM.CPZ,400",114$000129A9 0001 Funct Export +$LK +BI,"ResolveLocals ","FL:::/LT/COMPILE/ASM.CPZ,328",115$0001216F 0004 Funct Export +$LK +BI,"SPrintFJoin2 ","FL:::/LT/COMPILE/SPRINTF2.CPZ,237",116$0000CFFD 0001 Funct Export +$LK +BI,"SetSourceFileInfo ","FL:::/LT/COMPILE/LEX.CPZ,120",117$00002B52 0009 Funct Export +$LK +BI,"ShiftNoPush ","FL:::/LT/COMPILE/OPT.CPZ,42",118$0001C9F0 0027 Funct Export +$LK "SwitchCaseEntry ","FL:::/LT/COMPILE/COMPILE.CPZ,781"$00000003 0003 Class +$LK "UCT_ABSOLUTE_ADDRESS ","FL:::/LT/COMPILE/CODE.ASZ,1483"$0000163B 0001 SysSym +$LK "UCT_ADD32 ","FL:::/LT/COMPILE/CODE.ASZ,1454"$00001576 0001 SysSym +$LK "UCT_ADD64 ","FL:::/LT/COMPILE/CODE.ASZ,1453"$0000156E 0001 SysSym +$LK "UCT_ADD8 ","FL:::/LT/COMPILE/CODE.ASZ,1455"$0000157E 0001 SysSym +$LK "UCT_ADDITION ","FL:::/LT/COMPILE/CODE.ASZ,1380"$00001209 0001 SysSym +$LK "UCT_ADDRESS ","FL:::/LT/COMPILE/CODE.ASZ,1297"$00000F2B 0001 SysSym +$LK "UCT_ADD_EQUAL_U1 ","FL:::/LT/COMPILE/CODE.ASZ,1428"$000014AC 0001 SysSym +$LK "UCT_ADD_EQUAL_U2 ","FL:::/LT/COMPILE/CODE.ASZ,1427"$000014A0 0001 SysSym +$LK "UCT_ADD_EQUAL_U4 ","FL:::/LT/COMPILE/CODE.ASZ,1426"$00001496 0001 SysSym +$LK "UCT_ADD_EQUAL_U4_CONSTANT_U1 ","FL:::/LT/COMPILE/CODE.ASZ,1559"$00001966 0001 SysSym +$LK "UCT_ADD_EQUAL_U8 ","FL:::/LT/COMPILE/CODE.ASZ,1425"$00001488 0001 SysSym +$LK "UCT_ADD_EQUAL_U8_CONSTANT_U1 ","FL:::/LT/COMPILE/CODE.ASZ,1557"$0000194A 0001 SysSym +$LK "UCT_ADD_ESP32 ","FL:::/LT/COMPILE/CODE.ASZ,1467"$000015EF 0001 SysSym +$LK "UCT_ADD_ESP8 ","FL:::/LT/COMPILE/CODE.ASZ,1468"$000015F5 0001 SysSym +$LK "UCT_AND ","FL:::/LT/COMPILE/CODE.ASZ,1377"$000011F7 0001 SysSym +$LK "UCT_AND_AND ","FL:::/LT/COMPILE/CODE.ASZ,1388"$00001276 0001 SysSym +$LK "UCT_AND_AND_SKIPNZ ","FL:::/LT/COMPILE/CODE.ASZ,1525"$000017FE 0002 SysSym +$LK "UCT_AND_AND_SKIPNZ2 ","FL:::/LT/COMPILE/CODE.ASZ,1526"$00001808 0002 SysSym +$LK "UCT_AND_AND_SKIPZ ","FL:::/LT/COMPILE/CODE.ASZ,1523"$000017E6 0002 SysSym +$LK "UCT_AND_AND_SKIPZ2 ","FL:::/LT/COMPILE/CODE.ASZ,1524"$000017F0 0001 SysSym +$LK "UCT_AND_EQUAL_U1 ","FL:::/LT/COMPILE/CODE.ASZ,1416"$0000141F 0001 SysSym +$LK "UCT_AND_EQUAL_U2 ","FL:::/LT/COMPILE/CODE.ASZ,1415"$00001413 0001 SysSym +$LK "UCT_AND_EQUAL_U4 ","FL:::/LT/COMPILE/CODE.ASZ,1414"$00001409 0001 SysSym +$LK "UCT_AND_EQUAL_U8 ","FL:::/LT/COMPILE/CODE.ASZ,1413"$000013FB 0001 SysSym +$LK "UCT_ASSIGN_U1 ","FL:::/LT/COMPILE/CODE.ASZ,1396"$000012DC 0001 SysSym +$LK "UCT_ASSIGN_U2 ","FL:::/LT/COMPILE/CODE.ASZ,1395"$000012D5 0001 SysSym +$LK "UCT_ASSIGN_U4 ","FL:::/LT/COMPILE/CODE.ASZ,1394"$000012CF 0001 SysSym +$LK "UCT_ASSIGN_U8 ","FL:::/LT/COMPILE/CODE.ASZ,1393"$000012C6 0001 SysSym +$LK "UCT_BSF ","FL:::/LT/COMPILE/CODE.ASZ,1490"$0000168D 0001 SysSym +$LK "UCT_BSR ","FL:::/LT/COMPILE/CODE.ASZ,1491"$00001695 0001 SysSym +$LK "UCT_BT ","FL:::/LT/COMPILE/CODE.ASZ,1486"$0000164D 0001 SysSym +$LK "UCT_BTC ","FL:::/LT/COMPILE/CODE.ASZ,1489"$0000167D 0001 SysSym +$LK "UCT_BTC_CONSTANT ","FL:::/LT/COMPILE/CODE.ASZ,1554"$0000192D 0001 SysSym +$LK "UCT_BTR ","FL:::/LT/COMPILE/CODE.ASZ,1488"$0000166D 0001 SysSym +$LK "UCT_BTR_CONSTANT ","FL:::/LT/COMPILE/CODE.ASZ,1553"$00001920 0001 SysSym +$LK "UCT_BTS ","FL:::/LT/COMPILE/CODE.ASZ,1487"$0000165D 0001 SysSym +$LK "UCT_BTS_CONSTANT ","FL:::/LT/COMPILE/CODE.ASZ,1552"$00001913 0001 SysSym +$LK "UCT_BT_CONSTANT ","FL:::/LT/COMPILE/CODE.ASZ,1551"$00001906 0001 SysSym +$LK "UCT_CALL ","FL:::/LT/COMPILE/CODE.ASZ,1470"$000015F9 0002 SysSym +$LK "UCT_CALL_INDIRECT ","FL:::/LT/COMPILE/CODE.ASZ,1471"$00001600 0001 SysSym +$LK "UCT_CALL_INDIRECT2 ","FL:::/LT/COMPILE/CODE.ASZ,1472"$0000160A 0001 SysSym +$LK "UCT_CLI ","FL:::/LT/COMPILE/CODE.ASZ,1474"$00001614 0001 SysSym +$LK "UCT_COLON ","FL:::/LT/COMPILE/CODE.ASZ,1391"$000012B2 0001 SysSym +$LK "UCT_COM ","FL:::/LT/COMPILE/CODE.ASZ,1294"$00000F13 0001 SysSym +$LK "UCT_DEC ","FL:::/LT/COMPILE/CODE.ASZ,1460"$0000159E 0001 SysSym +$LK "UCT_DEREF_U1 ","FL:::/LT/COMPILE/CODE.ASZ,1329"$00001054 0001 SysSym +$LK "UCT_DEREF_U2 ","FL:::/LT/COMPILE/CODE.ASZ,1328"$0000104F 0001 SysSym +$LK "UCT_DEREF_U4 ","FL:::/LT/COMPILE/CODE.ASZ,1327"$0000104B 0001 SysSym +$LK "UCT_DEREF_U8 ","FL:::/LT/COMPILE/CODE.ASZ,1326"$00001046 0001 SysSym +$LK "UCT_DIVISION ","FL:::/LT/COMPILE/CODE.ASZ,1375"$000011E5 0001 SysSym +$LK "UCT_DIV_EQUAL_U1 ","FL:::/LT/COMPILE/CODE.ASZ,1412"$000013E7 0001 SysSym +$LK "UCT_DIV_EQUAL_U2 ","FL:::/LT/COMPILE/CODE.ASZ,1411"$000013D2 0001 SysSym +$LK "UCT_DIV_EQUAL_U4 ","FL:::/LT/COMPILE/CODE.ASZ,1410"$000013C2 0001 SysSym +$LK "UCT_DIV_EQUAL_U8 ","FL:::/LT/COMPILE/CODE.ASZ,1409"$000013AE 0001 SysSym +$LK "UCT_DOUBLE ","FL:::/LT/COMPILE/CODE.ASZ,1286"$00000EC6 0001 SysSym +$LK "UCT_EBP ","FL:::/LT/COMPILE/CODE.ASZ,1288"$00000EDB 0001 SysSym +$LK "UCT_EDI ","FL:::/LT/COMPILE/CODE.ASZ,1291"$00000EF1 0001 SysSym +$LK "UCT_EDI_ADD_EQUAL_U4 ","FL:::/LT/COMPILE/CODE.ASZ,1451"$00001562 0001 SysSym +$LK "UCT_EDI_ADD_EQUAL_U4_CONSTANT_U1 ","FL:::/LT/COMPILE/CODE.ASZ,1561"$00001976 0001 SysSym +$LK "UCT_EDI_AND_EQUAL_U4 ","FL:::/LT/COMPILE/CODE.ASZ,1448"$00001550 0001 SysSym +$LK "UCT_EDI_ASSIGN_U4 ","FL:::/LT/COMPILE/CODE.ASZ,1443"$0000152A 0001 SysSym +$LK "UCT_EDI_DEREF_U1 ","FL:::/LT/COMPILE/CODE.ASZ,1337"$00001088 0001 SysSym +$LK "UCT_EDI_DEREF_U2 ","FL:::/LT/COMPILE/CODE.ASZ,1336"$00001081 0001 SysSym +$LK "UCT_EDI_DEREF_U4 ","FL:::/LT/COMPILE/CODE.ASZ,1335"$0000107B 0001 SysSym +$LK "UCT_EDI_DEREF_U8 ","FL:::/LT/COMPILE/CODE.ASZ,1334"$00001074 0001 SysSym +$LK "UCT_EDI_DIV_EQUAL_U4 ","FL:::/LT/COMPILE/CODE.ASZ,1447"$00001544 0001 SysSym +$LK "UCT_EDI_MM_U4 ","FL:::/LT/COMPILE/CODE.ASZ,1361"$0000115E 0001 SysSym +$LK "UCT_EDI_MUL_EQUAL_U4 ","FL:::/LT/COMPILE/CODE.ASZ,1446"$0000153C 0001 SysSym +$LK "UCT_EDI_NEXT_EQUAL_U4 ","FL:::/LT/COMPILE/CODE.ASZ,1556"$00001942 0001 SysSym +$LK "UCT_EDI_OR_EQUAL_U4 ","FL:::/LT/COMPILE/CODE.ASZ,1449"$00001556 0001 SysSym +$LK "UCT_EDI_PP_U4 ","FL:::/LT/COMPILE/CODE.ASZ,1360"$00001157 0001 SysSym +$LK "UCT_EDI_SHL_EQUAL_U4 ","FL:::/LT/COMPILE/CODE.ASZ,1444"$0000152C 0001 SysSym +$LK "UCT_EDI_SHR_EQUAL_U4 ","FL:::/LT/COMPILE/CODE.ASZ,1445"$00001534 0001 SysSym +$LK "UCT_EDI_SUB_EQUAL_U4 ","FL:::/LT/COMPILE/CODE.ASZ,1452"$00001568 0001 SysSym +$LK "UCT_EDI_U1_DISP32 ","FL:::/LT/COMPILE/CODE.ASZ,1321"$0000101A 0001 SysSym +$LK "UCT_EDI_U1_DISP8 ","FL:::/LT/COMPILE/CODE.ASZ,1325"$0000103E 0001 SysSym +$LK "UCT_EDI_U2_DISP32 ","FL:::/LT/COMPILE/CODE.ASZ,1320"$0000100F 0001 SysSym +$LK "UCT_EDI_U2_DISP8 ","FL:::/LT/COMPILE/CODE.ASZ,1324"$00001036 0001 SysSym +$LK "UCT_EDI_U4_DISP32 ","FL:::/LT/COMPILE/CODE.ASZ,1319"$00001005 0001 SysSym +$LK "UCT_EDI_U4_DISP8 ","FL:::/LT/COMPILE/CODE.ASZ,1323"$0000102F 0001 SysSym +$LK "UCT_EDI_U4_MM ","FL:::/LT/COMPILE/CODE.ASZ,1359"$00001150 0001 SysSym +$LK "UCT_EDI_U4_PP ","FL:::/LT/COMPILE/CODE.ASZ,1358"$00001149 0001 SysSym +$LK "UCT_EDI_U8_DISP32 ","FL:::/LT/COMPILE/CODE.ASZ,1318"$00000FF8 0001 SysSym +$LK "UCT_EDI_U8_DISP8 ","FL:::/LT/COMPILE/CODE.ASZ,1322"$00001025 0001 SysSym +$LK "UCT_EDI_XOR_EQUAL_U4 ","FL:::/LT/COMPILE/CODE.ASZ,1450"$0000155C 0001 SysSym +$LK "UCT_END_EXP ","FL:::/LT/COMPILE/CODE.ASZ,1280"$00000EA4 0001 SysSym +$LK "UCT_ENTER ","FL:::/LT/COMPILE/CODE.ASZ,1461"$000015A4 0001 SysSym +$LK "UCT_ENTER1 ","FL:::/LT/COMPILE/CODE.ASZ,1463"$000015B5 0001 SysSym +$LK "UCT_ENTER2 ","FL:::/LT/COMPILE/CODE.ASZ,1465"$000015CE 0001 SysSym +$LK "UCT_EQUAL_EQUAL ","FL:::/LT/COMPILE/CODE.ASZ,1382"$00001218 0001 SysSym +$LK "UCT_EQUAL_EQUAL_SKIPZ ","FL:::/LT/COMPILE/CODE.ASZ,1511"$00001766 0003 SysSym +$LK "UCT_EQUAL_EQUAL_SKIPZ2 ","FL:::/LT/COMPILE/CODE.ASZ,1512"$00001770 0001 SysSym +$LK "UCT_ESI ","FL:::/LT/COMPILE/CODE.ASZ,1290"$00000EEB 0001 SysSym +$LK "UCT_ESI_ADD_EQUAL_U4 ","FL:::/LT/COMPILE/CODE.ASZ,1441"$0000151E 0001 SysSym +$LK "UCT_ESI_ADD_EQUAL_U4_CONSTANT_U1 ","FL:::/LT/COMPILE/CODE.ASZ,1560"$0000196D 0001 SysSym +$LK "UCT_ESI_AND_EQUAL_U4 ","FL:::/LT/COMPILE/CODE.ASZ,1438"$0000150C 0001 SysSym +$LK "UCT_ESI_ASSIGN_U4 ","FL:::/LT/COMPILE/CODE.ASZ,1433"$000014E6 0001 SysSym +$LK "UCT_ESI_DEREF_U1 ","FL:::/LT/COMPILE/CODE.ASZ,1333"$0000106D 0001 SysSym +$LK "UCT_ESI_DEREF_U2 ","FL:::/LT/COMPILE/CODE.ASZ,1332"$00001066 0001 SysSym +$LK "UCT_ESI_DEREF_U4 ","FL:::/LT/COMPILE/CODE.ASZ,1331"$00001060 0001 SysSym +$LK "UCT_ESI_DEREF_U8 ","FL:::/LT/COMPILE/CODE.ASZ,1330"$00001059 0001 SysSym +$LK "UCT_ESI_DIV_EQUAL_U4 ","FL:::/LT/COMPILE/CODE.ASZ,1437"$00001500 0001 SysSym +$LK "UCT_ESI_MM_U4 ","FL:::/LT/COMPILE/CODE.ASZ,1357"$00001142 0001 SysSym +$LK "UCT_ESI_MUL_EQUAL_U4 ","FL:::/LT/COMPILE/CODE.ASZ,1436"$000014F8 0001 SysSym +$LK "UCT_ESI_NEXT_EQUAL_U4 ","FL:::/LT/COMPILE/CODE.ASZ,1555"$0000193A 0001 SysSym +$LK "UCT_ESI_OR_EQUAL_U4 ","FL:::/LT/COMPILE/CODE.ASZ,1439"$00001512 0001 SysSym +$LK "UCT_ESI_PP_U4 ","FL:::/LT/COMPILE/CODE.ASZ,1356"$0000113B 0001 SysSym +$LK "UCT_ESI_SHL_EQUAL_U4 ","FL:::/LT/COMPILE/CODE.ASZ,1434"$000014E8 0001 SysSym +$LK "UCT_ESI_SHR_EQUAL_U4 ","FL:::/LT/COMPILE/CODE.ASZ,1435"$000014F0 0001 SysSym +$LK "UCT_ESI_SUB_EQUAL_U4 ","FL:::/LT/COMPILE/CODE.ASZ,1442"$00001524 0001 SysSym +$LK "UCT_ESI_U1_DISP32 ","FL:::/LT/COMPILE/CODE.ASZ,1313"$00000FCC 0001 SysSym +$LK "UCT_ESI_U1_DISP8 ","FL:::/LT/COMPILE/CODE.ASZ,1317"$00000FF0 0001 SysSym +$LK "UCT_ESI_U2_DISP32 ","FL:::/LT/COMPILE/CODE.ASZ,1312"$00000FC1 0001 SysSym +$LK "UCT_ESI_U2_DISP8 ","FL:::/LT/COMPILE/CODE.ASZ,1316"$00000FE8 0001 SysSym +$LK "UCT_ESI_U4_DISP32 ","FL:::/LT/COMPILE/CODE.ASZ,1311"$00000FB7 0001 SysSym +$LK "UCT_ESI_U4_DISP8 ","FL:::/LT/COMPILE/CODE.ASZ,1315"$00000FE1 0001 SysSym +$LK "UCT_ESI_U4_MM ","FL:::/LT/COMPILE/CODE.ASZ,1355"$00001134 0001 SysSym +$LK "UCT_ESI_U4_PP ","FL:::/LT/COMPILE/CODE.ASZ,1354"$0000112D 0001 SysSym +$LK "UCT_ESI_U8_DISP32 ","FL:::/LT/COMPILE/CODE.ASZ,1310"$00000FAA 0001 SysSym +$LK "UCT_ESI_U8_DISP8 ","FL:::/LT/COMPILE/CODE.ASZ,1314"$00000FD7 0001 SysSym +$LK "UCT_ESI_XOR_EQUAL_U4 ","FL:::/LT/COMPILE/CODE.ASZ,1440"$00001518 0001 SysSym +$LK "UCT_FS ","FL:::/LT/COMPILE/CODE.ASZ,1289"$00000EE1 0001 SysSym +$LK "UCT_FS_U1_DISP32 ","FL:::/LT/COMPILE/CODE.ASZ,1309"$00000F9E 0001 SysSym +$LK "UCT_FS_U2_DISP32 ","FL:::/LT/COMPILE/CODE.ASZ,1308"$00000F92 0001 SysSym +$LK "UCT_FS_U4_DISP32 ","FL:::/LT/COMPILE/CODE.ASZ,1307"$00000F88 0001 SysSym +$LK "UCT_FS_U8_DISP32 ","FL:::/LT/COMPILE/CODE.ASZ,1306"$00000F79 0001 SysSym +$LK "UCT_GET_BASE_PTR ","FL:::/LT/COMPILE/CODE.ASZ,1478"$00001622 0001 SysSym +$LK "UCT_GET_FLAGS ","FL:::/LT/COMPILE/CODE.ASZ,1476"$0000161A 0001 SysSym +$LK "UCT_GET_LABEL ","FL:::/LT/COMPILE/CODE.ASZ,1482"$00001632 0001 SysSym +$LK "UCT_GET_STACK_PTR ","FL:::/LT/COMPILE/CODE.ASZ,1480"$0000162A 0001 SysSym +$LK "UCT_GREATER_OR_EQUAL ","FL:::/LT/COMPILE/CODE.ASZ,1387"$00001266 0001 SysSym +$LK "UCT_GREATER_OR_EQUAL_SKIPZ ","FL:::/LT/COMPILE/CODE.ASZ,1521"$000017D2 0002 SysSym +$LK "UCT_GREATER_OR_EQUAL_SKIPZ2 ","FL:::/LT/COMPILE/CODE.ASZ,1522"$000017DA 0001 SysSym +$LK "UCT_GREATER_THAN ","FL:::/LT/COMPILE/CODE.ASZ,1385"$00001246 0001 SysSym +$LK "UCT_GREATER_THAN_SKIPZ ","FL:::/LT/COMPILE/CODE.ASZ,1517"$000017AA 0002 SysSym +$LK "UCT_GREATER_THAN_SKIPZ2 ","FL:::/LT/COMPILE/CODE.ASZ,1518"$000017B2 0001 SysSym +$LK "UCT_INC ","FL:::/LT/COMPILE/CODE.ASZ,1456"$00001584 0001 SysSym +$LK "UCT_INP ","FL:::/LT/COMPILE/CODE.ASZ,1500"$00001719 0001 SysSym +$LK "UCT_INPD ","FL:::/LT/COMPILE/CODE.ASZ,1498"$0000170C 0001 SysSym +$LK "UCT_INPW ","FL:::/LT/COMPILE/CODE.ASZ,1499"$00001711 0001 SysSym +$LK "UCT_INSQUE ","FL:::/LT/COMPILE/CODE.ASZ,1492"$0000169D 0001 SysSym +$LK "UCT_INSQUE_REV ","FL:::/LT/COMPILE/CODE.ASZ,1493"$000016AD 0001 SysSym +$LK "UCT_IRQ ","FL:::/LT/COMPILE/CODE.ASZ,1473"$00001612 0001 SysSym +$LK "UCT_JMP ","FL:::/LT/COMPILE/CODE.ASZ,1504"$00001736 0001 SysSym +$LK "UCT_LABEL ","FL:::/LT/COMPILE/CODE.ASZ,1484"$00001644 0001 SysSym +$LK "UCT_LEAVE ","FL:::/LT/COMPILE/CODE.ASZ,1462"$000015AD 0001 SysSym +$LK "UCT_LEAVE1 ","FL:::/LT/COMPILE/CODE.ASZ,1464"$000015C5 0001 SysSym +$LK "UCT_LEAVE2 ","FL:::/LT/COMPILE/CODE.ASZ,1466"$000015E5 0001 SysSym +$LK "UCT_LEA_DISP32_EBP ","FL:::/LT/COMPILE/CODE.ASZ,1362"$00001165 0001 SysSym +$LK "UCT_LEA_DISP32_EDI ","FL:::/LT/COMPILE/CODE.ASZ,1533"$00001857 0001 SysSym +$LK "UCT_LEA_DISP32_ESI ","FL:::/LT/COMPILE/CODE.ASZ,1531"$00001846 0001 SysSym +$LK "UCT_LEA_DISP8_EBP ","FL:::/LT/COMPILE/CODE.ASZ,1363"$0000116F 0001 SysSym +$LK "UCT_LEA_DISP8_EDI ","FL:::/LT/COMPILE/CODE.ASZ,1534"$00001861 0001 SysSym +$LK "UCT_LEA_DISP8_ESI ","FL:::/LT/COMPILE/CODE.ASZ,1532"$00001850 0001 SysSym +$LK "UCT_LESS_OR_EQUAL ","FL:::/LT/COMPILE/CODE.ASZ,1386"$00001256 0001 SysSym +$LK "UCT_LESS_OR_EQUAL_SKIPZ ","FL:::/LT/COMPILE/CODE.ASZ,1519"$000017BE 0002 SysSym +$LK "UCT_LESS_OR_EQUAL_SKIPZ2 ","FL:::/LT/COMPILE/CODE.ASZ,1520"$000017C6 0001 SysSym +$LK "UCT_LESS_THAN ","FL:::/LT/COMPILE/CODE.ASZ,1384"$00001236 0002 SysSym +$LK "UCT_LESS_THAN_SKIPZ ","FL:::/LT/COMPILE/CODE.ASZ,1515"$00001796 0002 SysSym +$LK "UCT_LESS_THAN_SKIPZ2 ","FL:::/LT/COMPILE/CODE.ASZ,1516"$0000179E 0001 SysSym +$LK "UCT_MEMCPY ","FL:::/LT/COMPILE/CODE.ASZ,1496"$000016D6 0001 SysSym +$LK "UCT_MEMSET ","FL:::/LT/COMPILE/CODE.ASZ,1497"$000016F2 0001 SysSym +$LK "UCT_MM_U1 ","FL:::/LT/COMPILE/CODE.ASZ,1353"$00001126 0001 SysSym +$LK "UCT_MM_U2 ","FL:::/LT/COMPILE/CODE.ASZ,1352"$0000111E 0001 SysSym +$LK "UCT_MM_U4 ","FL:::/LT/COMPILE/CODE.ASZ,1351"$00001118 0001 SysSym +$LK "UCT_MM_U8 ","FL:::/LT/COMPILE/CODE.ASZ,1350"$00001106 0001 SysSym +$LK "UCT_MULTIPLICATION ","FL:::/LT/COMPILE/CODE.ASZ,1374"$000011DF 0001 SysSym +$LK "UCT_MUL_EQUAL_U1 ","FL:::/LT/COMPILE/CODE.ASZ,1408"$0000139E 0001 SysSym +$LK "UCT_MUL_EQUAL_U2 ","FL:::/LT/COMPILE/CODE.ASZ,1407"$0000138D 0001 SysSym +$LK "UCT_MUL_EQUAL_U4 ","FL:::/LT/COMPILE/CODE.ASZ,1406"$00001381 0001 SysSym +$LK "UCT_MUL_EQUAL_U8 ","FL:::/LT/COMPILE/CODE.ASZ,1405"$00001374 0001 SysSym +$LK "UCT_NOP ","FL:::/LT/COMPILE/CODE.ASZ,1279"$00000EA4 0001 SysSym +$LK "UCT_NOT ","FL:::/LT/COMPILE/CODE.ASZ,1295"$00000F17 0001 SysSym +$LK "UCT_NOT_EQUAL_TO ","FL:::/LT/COMPILE/CODE.ASZ,1383"$00001227 0002 SysSym +$LK "UCT_NOT_EQUAL_TO_SKIPZ ","FL:::/LT/COMPILE/CODE.ASZ,1513"$0000177E 0002 SysSym +$LK "UCT_NOT_EQUAL_TO_SKIPZ2 ","FL:::/LT/COMPILE/CODE.ASZ,1514"$00001788 0001 SysSym +$LK "UCT_NULL ","FL:::/LT/COMPILE/CODE.ASZ,1278"$00000EA4 0001 SysSym +$LK "UCT_OR ","FL:::/LT/COMPILE/CODE.ASZ,1378"$000011FD 0001 SysSym +$LK "UCT_OR_EQUAL_U1 ","FL:::/LT/COMPILE/CODE.ASZ,1420"$0000144E 0001 SysSym +$LK "UCT_OR_EQUAL_U2 ","FL:::/LT/COMPILE/CODE.ASZ,1419"$00001442 0001 SysSym +$LK "UCT_OR_EQUAL_U4 ","FL:::/LT/COMPILE/CODE.ASZ,1418"$00001438 0001 SysSym +$LK "UCT_OR_EQUAL_U8 ","FL:::/LT/COMPILE/CODE.ASZ,1417"$0000142A 0001 SysSym +$LK "UCT_OR_OR ","FL:::/LT/COMPILE/CODE.ASZ,1389"$00001289 0001 SysSym +$LK "UCT_OR_OR_SKIPNZ ","FL:::/LT/COMPILE/CODE.ASZ,1529"$0000182E 0002 SysSym +$LK "UCT_OR_OR_SKIPNZ2 ","FL:::/LT/COMPILE/CODE.ASZ,1530"$00001838 0001 SysSym +$LK "UCT_OR_OR_SKIPZ ","FL:::/LT/COMPILE/CODE.ASZ,1527"$00001816 0003 SysSym +$LK "UCT_OR_OR_SKIPZ2 ","FL:::/LT/COMPILE/CODE.ASZ,1528"$00001820 0001 SysSym +$LK "UCT_OUTP ","FL:::/LT/COMPILE/CODE.ASZ,1503"$0000172F 0001 SysSym +$LK "UCT_OUTPD ","FL:::/LT/COMPILE/CODE.ASZ,1501"$00001720 0001 SysSym +$LK "UCT_OUTPW ","FL:::/LT/COMPILE/CODE.ASZ,1502"$00001727 0001 SysSym +$LK "UCT_POWER ","FL:::/LT/COMPILE/CODE.ASZ,1373"$000011DF 0001 SysSym +$LK "UCT_PP_U1 ","FL:::/LT/COMPILE/CODE.ASZ,1349"$000010FF 0001 SysSym +$LK "UCT_PP_U2 ","FL:::/LT/COMPILE/CODE.ASZ,1348"$000010F7 0001 SysSym +$LK "UCT_PP_U4 ","FL:::/LT/COMPILE/CODE.ASZ,1347"$000010F1 0001 SysSym +$LK "UCT_PP_U8 ","FL:::/LT/COMPILE/CODE.ASZ,1346"$000010E3 0001 SysSym +$LK "UCT_PUSH_DEREF_U8 ","FL:::/LT/COMPILE/CODE.ASZ,1549"$000018F5 0001 SysSym +$LK "UCT_PUSH_DOUBLE ","FL:::/LT/COMPILE/CODE.ASZ,1542"$000018A4 0001 SysSym +$LK "UCT_PUSH_EDI_U8_DISP32 ","FL:::/LT/COMPILE/CODE.ASZ,1547"$000018DE 0001 SysSym +$LK "UCT_PUSH_EDI_U8_DISP8 ","FL:::/LT/COMPILE/CODE.ASZ,1548"$000018EB 0001 SysSym +$LK "UCT_PUSH_ESI_U8_DISP32 ","FL:::/LT/COMPILE/CODE.ASZ,1545"$000018C7 0001 SysSym +$LK "UCT_PUSH_ESI_U8_DISP8 ","FL:::/LT/COMPILE/CODE.ASZ,1546"$000018D4 0001 SysSym +$LK "UCT_PUSH_NEG_U1 ","FL:::/LT/COMPILE/CODE.ASZ,1541"$0000189E 0001 SysSym +$LK "UCT_PUSH_NEG_U2 ","FL:::/LT/COMPILE/CODE.ASZ,1540"$00001895 0001 SysSym +$LK "UCT_PUSH_NEG_U4 ","FL:::/LT/COMPILE/CODE.ASZ,1539"$0000188C 0001 SysSym +$LK "UCT_PUSH_U1 ","FL:::/LT/COMPILE/CODE.ASZ,1538"$00001886 0001 SysSym +$LK "UCT_PUSH_U2 ","FL:::/LT/COMPILE/CODE.ASZ,1537"$0000187D 0001 SysSym +$LK "UCT_PUSH_U4 ","FL:::/LT/COMPILE/CODE.ASZ,1536"$00001874 0001 SysSym +$LK "UCT_PUSH_U8 ","FL:::/LT/COMPILE/CODE.ASZ,1535"$00001868 0001 SysSym +$LK "UCT_PUSH_U8_DISP32 ","FL:::/LT/COMPILE/CODE.ASZ,1543"$000018B0 0001 SysSym +$LK "UCT_PUSH_U8_DISP32_SCALED ","FL:::/LT/COMPILE/CODE.ASZ,1550"$000018FA 0001 SysSym +$LK "UCT_PUSH_U8_DISP8 ","FL:::/LT/COMPILE/CODE.ASZ,1544"$000018BD 0001 SysSym +$LK "UCT_QUESTION ","FL:::/LT/COMPILE/CODE.ASZ,1392"$000012C6 0001 SysSym +$LK "UCT_REMAINDER ","FL:::/LT/COMPILE/CODE.ASZ,1376"$000011ED 0001 SysSym +$LK "UCT_REMQUE ","FL:::/LT/COMPILE/CODE.ASZ,1494"$000016BE 0001 SysSym +$LK "UCT_RET ","FL:::/LT/COMPILE/CODE.ASZ,1469"$000015F8 0001 SysSym +$LK "UCT_SET_BASE_PTR ","FL:::/LT/COMPILE/CODE.ASZ,1479"$00001628 0001 SysSym +$LK "UCT_SET_FLAGS ","FL:::/LT/COMPILE/CODE.ASZ,1477"$00001620 0001 SysSym +$LK "UCT_SET_STACK_PTR ","FL:::/LT/COMPILE/CODE.ASZ,1481"$00001630 0001 SysSym +$LK "UCT_SHL ","FL:::/LT/COMPILE/CODE.ASZ,1367"$00001195 0001 SysSym +$LK "UCT_SHL_CONSTANT1 ","FL:::/LT/COMPILE/CODE.ASZ,1369"$000011C1 0002 SysSym +$LK "UCT_SHL_CONSTANT2 ","FL:::/LT/COMPILE/CODE.ASZ,1370"$000011C8 0001 SysSym +$LK "UCT_SHL_EQUAL_U1 ","FL:::/LT/COMPILE/CODE.ASZ,1400"$0000131E 0001 SysSym +$LK "UCT_SHL_EQUAL_U2 ","FL:::/LT/COMPILE/CODE.ASZ,1399"$00001310 0001 SysSym +$LK "UCT_SHL_EQUAL_U4 ","FL:::/LT/COMPILE/CODE.ASZ,1398"$00001304 0001 SysSym +$LK "UCT_SHL_EQUAL_U8 ","FL:::/LT/COMPILE/CODE.ASZ,1397"$000012E2 0001 SysSym +$LK "UCT_SHORT_JMP ","FL:::/LT/COMPILE/CODE.ASZ,1505"$0000173B 0002 SysSym +$LK "UCT_SHR ","FL:::/LT/COMPILE/CODE.ASZ,1368"$000011AB 0002 SysSym +$LK "UCT_SHR_CONSTANT1 ","FL:::/LT/COMPILE/CODE.ASZ,1371"$000011D0 0001 SysSym +$LK "UCT_SHR_CONSTANT2 ","FL:::/LT/COMPILE/CODE.ASZ,1372"$000011D7 0001 SysSym +$LK "UCT_SHR_EQUAL_U1 ","FL:::/LT/COMPILE/CODE.ASZ,1404"$00001367 0001 SysSym +$LK "UCT_SHR_EQUAL_U2 ","FL:::/LT/COMPILE/CODE.ASZ,1403"$00001359 0001 SysSym +$LK "UCT_SHR_EQUAL_U4 ","FL:::/LT/COMPILE/CODE.ASZ,1402"$0000134D 0001 SysSym +$LK "UCT_SHR_EQUAL_U8 ","FL:::/LT/COMPILE/CODE.ASZ,1401"$0000132B 0001 SysSym +$LK "UCT_SKIPNZ ","FL:::/LT/COMPILE/CODE.ASZ,1509"$00001759 0003 SysSym +$LK "UCT_SKIPNZ2 ","FL:::/LT/COMPILE/CODE.ASZ,1510"$0000175D 0001 SysSym +$LK "UCT_SKIPZ ","FL:::/LT/COMPILE/CODE.ASZ,1507"$0000174C 0003 SysSym +$LK "UCT_SKIPZ2 ","FL:::/LT/COMPILE/CODE.ASZ,1508"$00001750 0001 SysSym +$LK "UCT_STI ","FL:::/LT/COMPILE/CODE.ASZ,1475"$00001617 0001 SysSym +$LK "UCT_STRING_CONSTANT ","FL:::/LT/COMPILE/CODE.ASZ,1287"$00000ED2 0001 SysSym +$LK "UCT_STRLEN ","FL:::/LT/COMPILE/CODE.ASZ,1495"$000016C8 0001 SysSym +$LK "UCT_SUB32 ","FL:::/LT/COMPILE/CODE.ASZ,1458"$00001590 0001 SysSym +$LK "UCT_SUB64 ","FL:::/LT/COMPILE/CODE.ASZ,1457"$00001588 0002 SysSym +$LK "UCT_SUB8 ","FL:::/LT/COMPILE/CODE.ASZ,1459"$00001598 0001 SysSym +$LK "UCT_SUBTRACTION ","FL:::/LT/COMPILE/CODE.ASZ,1381"$0000120F 0001 SysSym +$LK "UCT_SUB_EQUAL_U1 ","FL:::/LT/COMPILE/CODE.ASZ,1432"$000014DB 0001 SysSym +$LK "UCT_SUB_EQUAL_U2 ","FL:::/LT/COMPILE/CODE.ASZ,1431"$000014CF 0001 SysSym +$LK "UCT_SUB_EQUAL_U4 ","FL:::/LT/COMPILE/CODE.ASZ,1430"$000014C5 0001 SysSym +$LK "UCT_SUB_EQUAL_U8 ","FL:::/LT/COMPILE/CODE.ASZ,1429"$000014B7 0001 SysSym +$LK "UCT_SUB_EQUAL_U8_CONSTANT_U1 ","FL:::/LT/COMPILE/CODE.ASZ,1558"$00001958 0001 SysSym +$LK "UCT_SWITCH ","FL:::/LT/COMPILE/CODE.ASZ,1506"$0000173D 0001 SysSym +$LK "UCT_TABLE_END ","FL:::/LT/COMPILE/CODE.ASZ,1562"$0000197F 0001 SysSym +$LK "UCT_TO_DOUBLE ","FL:::/LT/COMPILE/CODE.ASZ,1292"$00000EF7 0001 SysSym +$LK "UCT_TO_INT ","FL:::/LT/COMPILE/CODE.ASZ,1293"$00000F05 0001 SysSym +$LK "UCT_TYPE ","FL:::/LT/COMPILE/CODE.ASZ,1485"$00001644 0001 SysSym +$LK "UCT_U1 ","FL:::/LT/COMPILE/CODE.ASZ,1285"$00000EBF 0001 SysSym +$LK "UCT_U1_DISP32 ","FL:::/LT/COMPILE/CODE.ASZ,1301"$00000F4D 0001 SysSym +$LK "UCT_U1_DISP8 ","FL:::/LT/COMPILE/CODE.ASZ,1305"$00000F71 0001 SysSym +$LK "UCT_U1_MM ","FL:::/LT/COMPILE/CODE.ASZ,1345"$000010DA 0001 SysSym +$LK "UCT_U1_PP ","FL:::/LT/COMPILE/CODE.ASZ,1341"$000010AF 0001 SysSym +$LK "UCT_U2 ","FL:::/LT/COMPILE/CODE.ASZ,1284"$00000EBF 0001 SysSym +$LK "UCT_U2_DISP32 ","FL:::/LT/COMPILE/CODE.ASZ,1300"$00000F42 0001 SysSym +$LK "UCT_U2_DISP32_SCALED ","FL:::/LT/COMPILE/CODE.ASZ,1366"$0000118B 0001 SysSym +$LK "UCT_U2_DISP8 ","FL:::/LT/COMPILE/CODE.ASZ,1304"$00000F69 0001 SysSym +$LK "UCT_U2_MM ","FL:::/LT/COMPILE/CODE.ASZ,1344"$000010D0 0001 SysSym +$LK "UCT_U2_PP ","FL:::/LT/COMPILE/CODE.ASZ,1340"$000010A5 0001 SysSym +$LK "UCT_U4 ","FL:::/LT/COMPILE/CODE.ASZ,1283"$00000EB6 0001 SysSym +$LK "UCT_U4_DISP32 ","FL:::/LT/COMPILE/CODE.ASZ,1299"$00000F38 0001 SysSym +$LK "UCT_U4_DISP32_SCALED ","FL:::/LT/COMPILE/CODE.ASZ,1365"$00001182 0001 SysSym +$LK "UCT_U4_DISP8 ","FL:::/LT/COMPILE/CODE.ASZ,1303"$00000F62 0001 SysSym +$LK "UCT_U4_MM ","FL:::/LT/COMPILE/CODE.ASZ,1343"$000010C8 0001 SysSym +$LK "UCT_U4_PP ","FL:::/LT/COMPILE/CODE.ASZ,1339"$0000109D 0002 SysSym +$LK "UCT_U8 ","FL:::/LT/COMPILE/CODE.ASZ,1282"$00000EAA 0001 SysSym +$LK "UCT_U8_DISP32 ","FL:::/LT/COMPILE/CODE.ASZ,1298"$00000F2B 0001 SysSym +$LK "UCT_U8_DISP32_SCALED ","FL:::/LT/COMPILE/CODE.ASZ,1364"$00001176 0001 SysSym +$LK "UCT_U8_DISP8 ","FL:::/LT/COMPILE/CODE.ASZ,1302"$00000F58 0001 SysSym +$LK "UCT_U8_MM ","FL:::/LT/COMPILE/CODE.ASZ,1342"$000010B8 0001 SysSym +$LK "UCT_U8_PP ","FL:::/LT/COMPILE/CODE.ASZ,1338"$0000108F 0001 SysSym +$LK "UCT_UNARY_MINUS ","FL:::/LT/COMPILE/CODE.ASZ,1296"$00000F24 0001 SysSym +$LK "UCT_XOR ","FL:::/LT/COMPILE/CODE.ASZ,1379"$00001203 0001 SysSym +$LK "UCT_XOR_EQUAL_U1 ","FL:::/LT/COMPILE/CODE.ASZ,1424"$0000147D 0001 SysSym +$LK "UCT_XOR_EQUAL_U2 ","FL:::/LT/COMPILE/CODE.ASZ,1423"$00001471 0001 SysSym +$LK "UCT_XOR_EQUAL_U4 ","FL:::/LT/COMPILE/CODE.ASZ,1422"$00001467 0001 SysSym +$LK "UCT_XOR_EQUAL_U8 ","FL:::/LT/COMPILE/CODE.ASZ,1421"$00001459 0001 SysSym +$LK "UCT_XOR_XOR ","FL:::/LT/COMPILE/CODE.ASZ,1390"$0000129A 0001 SysSym +$LK "UCT_ZERO ","FL:::/LT/COMPILE/CODE.ASZ,1281"$00000EA4 0001 SysSym +$LK "UNSIGNED_CODE_TABLE ","FL:::/LT/COMPILE/CODE.ASZ,1277"$00000A30 0001 SysSym Export +$LK +BI,"UndefinedExtern ","FL:::/LT/COMPILE/COMPILE.CPZ,240",119$0002A569 0001 Funct Export +$LK "asm_hash ","FL:::/LT/COMPILE/LEX.CPZ,27"$00002734 0005 GlbVar Export +$LK "assign_bitmap ","FL:::/LT/COMPILE/LEX.CPZ,61"$0000279C 0005 GlbVar Export +$LK "binary_ops_table ","FL:::/LT/COMPILE/LEX.CPZ,60"$00002790 0002 GlbVar Export +$LK "code_table ","FL:::/LT/COMPILE/LEX.CPZ,22"$000001A0 0008 GlbVar Export +$LK "deref_bitmap ","FL:::/LT/COMPILE/LEX.CPZ,61"$00002798 0005 GlbVar Export +$LK "double_code_table ","FL:::/LT/COMPILE/LEX.CPZ,24"$00001980 0008 GlbVar Export +$LK "double_fix_up_table ","FL:::/LT/COMPILE/LEX.CPZ,57"$00002780 0002 GlbVar Export +$LK "duel_I1_tokens1 ","FL:::/LT/COMPILE/LEX.CPZ,59"$00002784 0002 GlbVar Export +$LK "duel_I1_tokens2 ","FL:::/LT/COMPILE/LEX.CPZ,59"$00002788 0002 GlbVar Export +$LK "duel_I1_tokens3 ","FL:::/LT/COMPILE/LEX.CPZ,59"$0000278C 0002 GlbVar Export +$LK "internal_types_table ","FL:::/LT/COMPILE/LEX.CPZ,25"$00000000 0001 GlbVar Export +$LK "is_first_compiler ","FL:::/LT/COMPILE/LEX.CPZ,28"$00002738 0002 GlbVar Export +$LK "it_to_ec_offset ","FL:::/LT/COMPILE/LEX.CPZ,30"$0000276C 0006 GlbVar Export +$LK "lex_line_feed ","FL:::/LT/COMPILE/LEX.CPZ,145"$00002DB7 0001 GlbVar Export +$LK "lex_zeros ","FL:::/LT/COMPILE/LEX.CPZ,145"$00002DB3 000A GlbVar Export +$LK "opt_nop ","FL:::/LT/COMPILE/OPT.CPZ,65"$0001CB44 0003 GlbVar Export +$LK "push_bitmap ","FL:::/LT/COMPILE/LEX.CPZ,62"$000027A0 0004 GlbVar Export +$LK "push_map ","FL:::/LT/COMPILE/LEX.CPZ,63"$000027A4 0003 GlbVar Export +$LK "signed_fix_up_table ","FL:::/LT/COMPILE/LEX.CPZ,57"$00002778 0002 GlbVar Export +$LK "sys_internal_types ","FL:::/LT/COMPILE/LEX.CPZ,29"$0000273C 0037 GlbVar Export +$LK "unary_ops_table ","FL:::/LT/COMPILE/LEX.CPZ,60"$00002794 0002 GlbVar Export +$LK "unsigned_code_table ","FL:::/LT/COMPILE/LEX.CPZ,23"$00000A30 000F GlbVar Export +$LK "unsigned_fix_up_table ","FL:::/LT/COMPILE/LEX.CPZ,57"$0000277C 0002 GlbVar Export +  Iñ&ñ;ñwñˆñîñ ò(ò:òOò]ò~òºò¿ò4óZó_ótó…ó¤ó²ó×óô"ô'ô·ôþôõõ2õGõ]õsõˆõœõªõËõö öZö_ötöyö”öÛöJ‰éö÷÷4÷K÷\÷~÷ ÷É÷ò÷øø/øTø_øqø–ø¡ø³øØøãøõøùù\ù“ù®ù³ùÐùûùú4ú_úŒú¡úÆúËúøúû1ûQûvû{û«ûµûåûïû ü)üYü—üÐüåüùü ýHK +Z +æiïiôi>j[jj£jÇjëj÷j k.k‚_‚}‚‘‚làøŸ‚¶‚Í‚ø‚ÿ‚ƒƒ5ƒdƒsƒŠƒœƒ¨ƒ»ƒêƒ„„„>„œOs��G�X�t�‚���»�É�â�ý�Ž)Ž>ŽYŽwŽ…ŽšŽµŽÓŽáŽöŽ�/�=�[�Š�±��[�o�‰���¡�§�½�ß�‘‘'‘J‘e‘}‘�‘µ‘Ø‘ +’@’i’˜’²’Ö’ì’&“‚“´“ê“”B”Ó”•;•d•“•²•ŕؕé•–%–…–¶–ä–è–B—s—€—«—Á—Ü—á—÷—˜˜-˜H˜M˜c˜~˜ƒ˜™˜´˜¹˜Ï˜ê˜ï˜ ™™S™�™¦™º™¿™Ê™ä™é™í™Hšzš…š˜š�š¨šÂš›!›<›T›Ž›“›¯›³›ë›œ%œ8œwœ—œ²œÊœ� ��.�3�>�X�]�h�‚�‡�’�¬�±�¼�Ö�á�žžž+ž6žVž[žwž{ž¿žüžŸŸ Ÿ*ŸCŸNŸmŸrŸ}Ÿ—Ÿ¢Ÿ¼ŸÁŸÌŸæŸñŸ   0 5 Y z › Ä ã ö  ¡8¡E¡i¡Š¡«¡Ô¡ó¡¢¢H¢U¢`¢‡¢”¢·¢ £5£l£¡£Ô£á£¤¤4¤n¤�¤Ç¤ß¤ó¤¥,¥L¥k¥—¥¥¥\ùML„c„w„¡„·„΄ï„…!…+…@…“…®…¸…Ô…ü…9†e†È†Ù†ô† +‡;‡Ž‡ú‡}ˆîˆ ‰‰4‰O‰]‰‘‰£‰º‰Õ‰ã‰Š)Š@ŠtЉХнŠÎŠíŠ0‹R‹c‹‚‹ˆ‹¤‹°‹Æ‹Û‹ø‹Œ(ŒLŒQŒqŒŒÁŒâŒôŒ<˜¤>~U~h~o~…~š~«~°~Ã~Dw…"|9|S|_|{|ˆ|�|§|®|Ã|Ñ|(IPlyƒy‰y™y®yÀy<<H¤x»xÓxâxòxyy%y:yLy^y4¥¯Ñ~è~ý~2F[h,�—–}­}¶}ã}î}~0~,ÃË��$�Q�\�Š�—�,†Žß|ö| }8}Y}u}ˆ}4Q[Îyåy÷y +zz"z(z-zl !.u>uNucu’u—u¡u¦uÐuÝu +vv!v&vDvIvSvXvevp";¦v½vÕvîvw:wLwbwpw‚w˜wªwÀwÒwèwúwx"x8x>x„!À×ïô  * ; A S e w ‰ � ¡ ³ Å × Ý ï  + +% +2 +D’3’I’V’f’v’•’§’ ˆmÌÍÍ,ÍNÍSÍn͋͜ͰÍÖÍéÍîÍ Î'ÎJÎZÎyΊÎ�΢νÎÛÎêÎÏÏ,ÏKÏ\ÏoÏtÏ�Ï ÏÀÏÓÏØÏòÏ+ÐpЎЭÐÌÐÜÐûÐ Ñ Ñ$Ñ0ÑCÑHÑXÑsÑ�ўѾÑ×ÑíÑþÑÒ9ÒOÒoÒ…Ò¥Ò¸Ò½ÒÍÒèÒÓÓ=ÓUÓ‹Ó�Ó¯ÓÇÓýÓ Ô9ÔJÔZÔuÔ‹Ô›Ô°ÔÈÔØÔÝÔûÔ ÕÕ#Õ3ÕNÕvÕ„Õ£Õ»ÕñÕöÕÖ-ÖlÖ|Ö¨Ö¹ÖÉÖäÖúÖ +× ×7×G×L×j×z×�×’×¢×½×××èר!Ø7ØHØl؂اؽØÝØðØõØÙ+ÙJÙbÙ‹Ù�Ù¯ÙÇÙðÙÚ,Ú=ÚMÚ`ÚeÚƒÚµÚÐÚáÚñÚÛ +Û)Û:ÛOÛ_ÛrÛwÛ–Û§Û¼ÛÌÛßÛäÛÜÜ)Ü9ÜLÜQÜpÜ�ܖܦܹܾÜÝÜîÜÝÝ&Ý+Ý>Ý`݋ݳÝÃÝÓÝçÝìÝÞÞ'Þ7ÞJÞOÞeÞuÞŠÞšÞ­Þ²ÞÈÞØÞíÞýÞßß+ß;ßPß`ßsßxߎߞ߳ßÃßÖßÛßîßà àà6àPàaà�àšà°àÁàåàûà á6áVáiáná–á¿áÍáìáâ-â2âQâiâ’â¢âÎâßâïâãã$ãOãwã‡ã—ã«ã°ãÅãÕãèãíãää%ä*ä?äOäbägä|äŒäŸä¤ä¹äÉäÜäáäôä åå!å<åVågå‡å å¶åÇåëåæ*æ@æ`æsæxæ æÎæÜæûæç<çAç`çxç¡ç±çÝçîçþçèè&èAèièˆè èÆèÖèéé#é6é;éKéféŽé­éÅéëéûé'ê8êHê[ê`êpê‹ê³êÒêêêë ëLë]ëmë€ë…ë•ë°ëÊëÛëûëì*ì;ì_ìuìžì´ìØìëìðìí7íOíuí…í±íÂíÒíåíêí5îaîrî‚î•îÝîïï%ï9ïQïVïfï�ï›ï¬ïÌïéïÿïð4ðJðsð‰ð­ðÀðÅðíð ñ$ñMñ]ñ‰ñšñªñ½ñÂñò-ò=òMòcòwò�ò”ò¤ò¿òÙòêò +ó'ó=óNóróˆó±óÇóëóôô1ô6ô^ô}ô•ôÄôÔôõõ!õ>õQõVõfõ�õ›õ¬õÌõéõÿõö4öJösö‰ö­öÃöàöóöøö ÷?÷W÷†÷–÷Â÷Ó÷ã÷øøø(øCø]ønøŽø«øÁøÒøöø ù5ùKùoù…ù¢ùµùºùâùðùú'úWú\ú{ú“úÃúÓúÿúû û%û?û\ûoûtû„ûŸû¹ûÊûêûüü.üRühü‘ü§üËüáüþüýý>ýLýkýƒý³ý¸ý×ýïý þ/þ[þlþ|þ�þ þ½þÐþÕþåþÿÿ+ÿKÿhÿ~ÿ�ÿ³ÿÉÿòÿ,B_rwŸ­Ìä8P€�¼ÍÝâ16Fa{Œ¬Éßð*Si�£ÀÓØ-Euz™±áñ.>Cb’—§Âê !Td�¡±Îáæö9Xp¡±Ýîþ.3C^†¥½õ 1 B R o ‚ ‡ — ² Ì Ý ý  +0 +A +e +{ +¤ +º +Þ +é +ü +  , = a r ˆ ¬ ±  Ø ü   $ ? P f Š � ¢ Æ Ë î  F o Š � ¢ µ º Æ Ù Þ î  (6˜ÅÖäü)<ALQ\ot€�»ÍÝî1KZis…Šœ¡³¸ÊÏáæøý&+J[q�”™¥µàò%5Vp’œ®³ÅÊÜáóø +!&8=OTs„šª½ÂÍàåêöû/4>[x† 0ÍÖ€—¨¿ìKyž¸Åßa Ž Î ÿ Q � í !!&!>!R!W!n!!“!¹!Ë!Ð!Û!í!ò! "*"W"‰"Â"Ú"#,#u#�#«#Ô#ä#$Z$u$�$¹$É$î$6%%š%µ%Þ%î%&F&†&ž&°&µ&Ï&í&'L'…'�'Ç'ï'8(S(n(—(§(Ô()8)S)|)Œ)±)ù)B*]*x*¡*±*Þ* +I+a+s+x+’+°+Ý+,H,`,Š,²,û,-1-Z-j-—-à-û-.?.O.t.¼./ /;/d/t/¡/Ì/ 0$060;0U0s0 0Ò0 1#1M1u1¾1Ù1ô12-2Z2£2¾2Ù233$3)3C3a3Ž3À3ù324z4§4ã4545F5K5V5h5m5w5‰5Ž5®5¸5Ê5Ï5é56"6O6`6n6�6Ÿ6±6¶6Ö6à6ò6÷67+7B7o7€7Ž7­7¿7Ñ7Ö7à7ò7÷788828L8\8—8É89,919;9M9R9]9o9t9y9›9­9²9Ä9É9Û9à9ë9ý9:::$:6:;:M:R:]:o:t:†:‹:�:¢:¬:¾:Ã:Î:à:å:ï:;;;#;(;2;D;I;T;f;k;u;‡;Œ;–;›;¦;¸;½;Ç;Ù;Þ;<"<a<†<¥<ä< ====#=:=d=Œ=Ä=ß=ú='>c>š>²>¶>Ê>Ð>é>!?N?r?Î?ÿ?0@e@Š@�@®@Í@ä@!( ×Þ BEYE]E{E‰E«EÂEÓEçE F F%F8F=FPFUFaFtFyF�FªFÆFàFóFøF GGG/G4GGGLG\GyGšG¾GÎGÛGëGH5HEHRHbHŒH´HýHI3I\IlI”IÝIøIJWNWaWfWvW“W¸WÜWìWùW X3XWXgXtX„X—XœX¨X»XÀXËXÞXãXîXYY!Y1YNYsY—Y§Y´YÆYðYZ$Z1ZCZVZ[ZvZ†Z£ZÈZìZüZ [[E[i[y[†[˜[«[°[Ë[Û[ø[\A\Q\^\p\š\¾\Î\Û\í\]] ]0]M]r]–]¦]³]Å]ï]^#^0^B^U^Z^u^…^¢^Ç^ë^û^__D_h_x_…_—_ª_¯_Ê_Ú_÷_`@`P`]`o`™`½`Í`Ú`ì`ÿ`a a/aLaqa•a¥a²aÄaîab"b/bAbTbYbtb„b¡bÆbêbúbccCcgcwc„c–c©c®cÉcÙcøcd:d^dnd{d�d�d eeëKëaë|ë†ë­ë°ëÈëÔëéëúë ì ì0ìAìRìdì�ì¡ì°ì½ìèìúì%í*íOícízíí•íší¬íÌíÞíãíðíîî`îtî‹î¦îÜîñîï5ï:ï?ïeï{ï€ï—ïœï³ï¸ïÏïÔïëïðïýïð"ðQð^ðŽð¶ðãðððõðñ"ñ'ñVñcñ�ñžñÏñ÷ñ$ò9òFòKòdòiò�ò†ò¥òªòÅòãòóó!ó=óBó[ó`óxó}ó“ó˜óÃóÔóáóõóô&ôUôsô†ô“ô³ô¸ôÅôôôõ>õYõzõ›õÁõÝõýõö1öCönö‹ö¥öªöÊöêö÷÷K÷o÷t÷�÷¬÷¹÷Ñ÷ó÷øø8øSøXøsøˆø™øªø¼ø×øóøùù1ùBùOù—ùçù ú%úUúgúvú‘ú²ú¿ú×úäúéú û;ûHû`ûmûrûˆû�û±ûÌûÞûùûüü$hÙð±£È£Õ£û£¤¤#¤4¤E¤W¤h¤o¤¡¤ȤÚ¤é¤ö¤6¥C¥% f‹ùÛÜ$Ü?ÜRÜeÜ~ܜܫÜÁÜØÜÜÜæÜûÜÝKÝeÝ™ÝÓÝêÝïÝüÝ"ÞXÞ]Þ…Þ®ÞåÞ&`ÐåÏÍæÍûÍÎ@ÎkÎΥιÎßÎìÎýÎÏ#ÏIÏVÏ{Ï¡Ï'°Œµßß1ßBßSßkß�ߥ߹ßÍßòßàà1àEàYàtàŒà à­àÄàåà á!á:áKá\ápáˆá¼áÉáÖáÞáââ2â?â(¨æ ïÏÐÐ9ÐFÐrВиÐÉÐâÐ÷ÐÑ)ÑOÑ\ÑiÑ{Ñ›ÑÁÑïÑÒ!Ò;ÒHÒUÒ{ÒˆÒ³ÒÆÒìÒÓ)èAxÌ©ã©÷©ª#ªIª\ªiª{ª¡ª̪òª«.«;«Y«m«ˆ«¥«Ыÿ«.¬C¬[¬ެŸ¬¬¬ج­-­2­e­v­ˆ­•­©­º­Ç­Þ­$®`®·®Ë®Ю*$ù?²¥É¥Ý¥ê¥¦)¦3¦6¦e¦j¦~¦ަ°¦ĦΦަᦧ§§,§;§O§`§m§ˆ§–§¶§ѧé§ ¨¨/¨B¨U¨n¨€¨…¨š¨¯¨¼¨Á¨ݨù¨ +©©-©J©^©o©w©‡©›©±©¾©+ÈíœTºkºº�ºšº«ºúÛºòºÿº +»»B»¡»À»Þ»ó»¼"¼G¼]¼g¼м—¼¾¼Ô¼Þ¼ï¼½"½=½p½н¡½¸½½â½¾/¾F¾P¾l¾�¾š¾ç¾ë¾ ¿¿C¿`¿m¿ ¿Ì¿Ö¿Û¿û¿ÀÀ4ÀHÀ]ÀÀŒÀ²À¿ÀÜÀÁ Á4ÁIÁMÁeÁ|ÁÉÁÍÁíÁòÁÂÂ(ÂVÂ}˜¬ÂÁÂÞÂýÂÃ<ÃQÃbÃfÃ|ÕÚçôÃéÃÄÄ2ÄaÄrÄ’ÄÂÄÕÄòÄÅ+Å=ÅXÅžÅ¯ÅÆÅËÅçÅùÅ ÆÆ-ÆBÆWÆhÆzÆ´ÆÖÆãÆÇÇaÇsÇ‚Ç�ǪǼÇÉÇÛÇÈGÈ_ÈzȇȱȾÈÈÈÍÈ,xž¹KÉbÉoɕɢɳÉÌÉÙÉÿÉ Ê!ÊFÊrÊ�ʪʷÊ×ÊýÊ"ËNËtËžË-¸=Yþpþ�þ£þ´þÅþÖþèþûþÿ ÿ?ÿRÿ_ÿlÿ¢ÿ¼ÿÑÿÞÿùÿ3@E`oŠŸÊ×þ!<MR_z‹��¸ÉÎÛö +4Agm�Ÿ¿Ôè4FfjНÀÒ×äñ(9Msy™«ËÏï&7IN[h’ª¾èî%JNs˜©»ÀÍßèõ %J\�…ªÍÞðõ9?dv›ŸÄæ÷   ( 9 K P ] ƒ ™ ª ¯ ¼ × è í ú þ # +I +N +[ +_ +„ +ª +¯ +¼ +× +è +  D | « Ñ ð   # J z š ¡ ª Ù Þ  + > b z ~ ­ Ø Ý ê ÷ !Jh~�µÂÇÔçìù +6;H`er„–§¬¾Ããç:K]ty€› Éçý4Hc„•¬ºËéöJWr“¥Öå.PecÓzÓ‹ÓŸÓ°ÓäÓñÓÔ$ÔDÔdÔ‚Ô•Ô®ÔÝÔûÔ*ÕYÕwÕ�ÕÃÕÐÕöÕ +Ö0Ö=Öo֌ִ֧ÖÉÖéÖ×,×9×_×lל×Ì×ä×óר#Ø7ØNØt؆طØÁØëØÙÙDÙQÙ~Ù»ÙáÙÚ>ÚeÚšÚ·Ú½ÚÉÚÜÚÛ(Û.ÛIÛfÛ/äÇý}ã”ã¦ãÒãþãä:äZäzäŸäÄäéäå.å5ågå—åÊåíåùå5ælæ’æ²æ¹æëæçNçqç—ç«çÑçÞçèèLèŒè±è×è0$ر’È’ “G“^“l“�“Ù“æ“ð“ ”-”O”\”q”„”¡”Æ”à”•.•C•V•y•ž•°•ʕٕ–R–i–s–”–µ–Æ–Ý–î– ——/—F—S—~—ƒ—”—¯—Ï—Ü—é—ý—˜'˜4˜A˜T˜f˜Œ˜¡˜²˜ØÔ˜î˜ý˜™&™H™`™‚™‘™¬™¹™Ò™ß™ä™ñ™ š š=š\šiš�šœš¿šÒšùš +›'›^›z›”›±›Ù› œCœ]œxœ…œ’œ£œ¼œМðœ �"�I�q�v��� �»�È�à�û�žž2žQžfžxž„ž©žÁžëžúžÿžŸ1Ÿ[Ÿ�Ÿ”Ÿ®ŸËŸÜŸùŸ ( R s “ § Ñ ò :¡I¡d¡ª¡·¡¼¡ ¢¢ ¢@¢M¢ˆ¢œ¢¡¢¢ТÕ¢1`ºÏÛËòËÿË%Ì2ÌGÌlÌ}Ì–Ì£ÌÉÌÖÌöÌÍGÍlÍ’Í2„eç°ÂÓÞ ?d�¤Îí4Ph� ¹Øæ2Vs“ªÄÚê 5N^l‡®¿Îö,0`qvz»ÉÚñGi…™¶Ã׿ L i � • š ´ Õ ê ö 3PáòéÄÅÅÅ0ÅJÅpŕžÅÉÅÖÅëÅøÅ4dÄ7 N � • ¸ ô !B!F!o!š!¦!¬!½!Å!Ø!ì!""#"7"="M"^"k""�"©"¯"Ä"Õ"Ú"ë"ø" #'#7#Q#W#m#˜#Ô#ò#$$-$>$V$Œ$µ$Ù$%O%b%%™%²%Û%ð%ô%&G&v&‹&¢&¶&Ë&à&õ& +'C'U'5 >cü0A]o¡Çì+Fd�·ãíò+?HVwŒ™6LO_¶,¿,Í,ò,-8-F-T-i-x-}-7L0€õ€ �>�D�U�p���Ÿ�´�×�é�î�ÿ�‚'‚>‚P‚]‚b‚v‚š‚¯‚À‚Å‚ã‚ü‚ƒƒ2ƒPƒdƒxƒ}ƒœƒªƒÚƒ)„.„H„M„_„s„“„˜„¶„ȄՄ÷„…$…6…D…M…m…Ð…/†<†S†e†|†8T°Âv� ¬¿Ëü€\€w€Œ€¡€¶€Ê€Ð€Õ€9 QVo;;“;:Œt””¦«¦¼¦é¦ +§§)§>§C§[§p§ˆ§˜§¶§Ô§â§ù§¨-¨=¨[¨o¨u¨z¨;dßõ£CºCÀCÌCßCôC DD+D^DD“D™D¯DÁDÒDäDöD<<Wc ;·;Ë;à;ñ;ö;<#<5<=$ÀÆã*ãNã[ãoã>0¶¿lâƒâŒâ•â¢âÎâñâ?ØN�'§'»'Ã'"(4(F(n(‹(¨(ê(D)^)�)§)±)Â)Ç)Û)à)*/*P*k*Š*·*+{+Ù+,(,L,l,�,˜,@4{…[/r/Œ/©/Ì/à/ô/0At`z…-Ž- -¤-¿-ï- .5.C.a.q..ž.Û.ø. //,/1/C/S/B,ükƂƑƘƶÆÃÆÜÆC,÷? +üOP5PWPyPžP½PòPQ0QDQsQ§QâQñQ1RWRŠRœR±RÆRÛRðRSS&S8SMS_SqSƒS•SªS¼SÎSàSòSTT.TCTUTgTyT‹T TµTÊTßTôT UU3UHU]UoU�U“U¥UºUÏUäUùUV#V8VMVbVwVŒV¡V¶VËVàVõV +W W1WCWUWgW|WŽW W²WÄWÙWëWýWX!X6XHXZXlX~X�X¥XºXÏXáXóXYY/YDYVYkY€Y•YªY¿YÔYéYþYZ(Z=ZRZgZ|Z‘Z¦Z»ZÐZåZúZ[$[9[N[c[x[�[¢[º[Ì[á[ó[\\)\;\M\_\q\ƒ\•\§\¼\Ñ\æ\ø\ +]].]@]R]d]v]ˆ]š]¬]¾]Ð]â]ô]^^0^E^Z^o^„^™^®^Ã^Ø^í^__,_A_V_k_€_•_ª_¿_Ô_é_þ_`(`=`U`g`|`‘`¦`»`Ð`å`ú`a$aJa`a}aša·aÔaña b)bFbcb€bŸb¾bäbúbc4cQclc‰c¦cÅcäc +d d=dZdwd�d¡d¸dÌdàd÷de%efRfif€f—f®fÅfÜfóf +g!g8gOgfg~g�g§g¾gÕgìghh0hehšhÙhîhi8iD<ÒÞC5CDCKCcCpC}C‚C•CEPüÆÇÇ3ÇMÇmdžǜǢÇùÇ ÈÈ.È>È‹ÈFH%™È°È¹ÈÂÈÑÈÉÉ)ÉcÉrÉ�É�ÉžÉG&*¬É¼ÉãÉH,óûÆÆ1Æ7ÆJÆ]ÆI¨�ô-ýDýUý}ý…ý£ý½ýÕýáýåýêýþþþ.þBþ€þÃþàþäþ ÿ4ÿ^ÿoÿ™ÿ¯ÿ×ÿÜÿöÿ +H‹¨¬çü&R~¶Þ.3k„± 9�”ÁÓ"{˜Å×4m¦Óð/_~Ïì$GLy¦«ÀÑJ4@ +J +ziƒi—iœiÄiÉiÎiÚiK¤7�}L”L¢L¿LáL M MSMbMoMtM‘MšMŸMÁMøMýMNN,N[NaNlNtN—N°NÊNÔN÷NO;OTOgOkO›O O°OÅOëOPPPMPkPˆPÐPÞPQ1Q>Q{Q»QÀQØQôQ RRR!RCR‚R‡RÿRS3SHSMSjS|S£S·SËSÙST?TRTWTçT0UHUdUyU~U›U½UÒUíUV V4VBVdV¨V­VûVW/WDWIWfW‹W§W¸WÌWX5XBXpX…X–XØXÝXîX Y=YKY`Y„Y²YÇYßYúYZZ4ZQZ£ZÃZàZíZ [[=[O[n[€[Ÿ[±[Ô[æ[ \\>\^\r\€\¨\Ó\à\!]a]k]Œ]Û]ù]^R^•^ß^û^__1_Q_n_ƒ_�_º_×_ô_`+`C`X`]`}`’`¡`§`°`Â`Ë`à`ú`aa3aaa‹a¤aÀaóab(bBbebzb‹bœb­b¿bÑbåbcac«cÞcùcd1dNdid†dee e;eWeÉe +fffHfnf�f¢f±fÌfàfgNgfgkg‹g¨gògh h'hlKlplŒl­lÅlÊl m'mEmJmfm~mƒmˆmšm°mÂmL4”ž¿-Ö-ß-ó- .!.@.V.Ml`xñ)**,*A*^*„*¡*¸*Í*Ó*í*++0+D+Nlž¶Ømïmn nn9nInanƒn›n¬n½nénooLo�o¤o¹oÕoâoO´ŸId.{.”.³.Å.á.//8/T/e/v/Š/¢/³/Ä/ï/0>0C0U0i0n0‚0®0Â0å0ý01111@1T1€1¡1¶1Ç1Ü1ë1ÿ1+2N2c2t2‰2˜2¬2Ø2ù23 333I3~3”3é3ú3!484I4]4‰4–4Á4Ú4û45#575c5p5›5´5Õ5ì5ý56#616N6p6–6³6Ï6ä6õ6ú6ÿ67#787I7`7o77•7©7Ã7â7ô78898P8o8w8¹8¾8Ò8ì8ú8ÿ89 9 969;9N9f9w9Œ9¡9³9Á9P÷6EE/E@EbEE¼EæEøEF5FBFwF‰F¾FÐFGGLG^G“G¥GÚGìG!HAHUHcH‹H¶HÃHI@IJI}I™IèIJ#J_JžJèJK2K7KSK~KžK»KæKóKLLLaLsLQz¹}=”=¢=¹=Ð=ä=ý=><>g>k>�>†>—> >·>Ã>Ò>ß>î>û> +??&?3?B?O?^?c??�?§?½?Í?Ü?í?ò?@@)@:@Q@m@{@�@¢@¶@Ë@å@ö@AR\eyC<Z<g<v<‰<˜<©<¾<Ï<à<é<== =G=[=o=SÉÍhqxq“qT€B_¬'Ã'Û'å'("(2(J(d(~(”(¨(¼(Ï(ç(ÿ()/)E)X)|)‹)œ)­)Â)Ö)ã)U8ÆÑ%B1Y1t1�1ª1Å1à1û1212L2g2‚2�2¸2Ó2î2 3$3?3Z3u3�3«3Æ3á3ü3424M4h4ƒ4ž4¹4Ô4ï4 +5%5@5[5v5‘5¬5Ç5â5ý5636N6i6„6Ÿ6º6Õ6ð6 7#7]èvíº º3ºNºfº‘ºÐº*»¤»ó»]¼«¼½r½ë½9¾¢¾¿y¿Ø¿ÀqÀëÀ:Á¤ÁòÁ[¹Â2ÀÃéÃGÄÀÄ ÅnÅÍÅÆ{ÆÊÆÇ6ÇrÇ®ÇúÇFÈ¢ÈþÈJÉ–ÉòÉNʉʴÊË^P(93¬C¬f¬�¬Ž¬Ó¬­ ­@­l­_ø:u“­œ­´­ß­®5®”®ê®¯N¯’¯©¯°^°u°Â°±h±Ü±+²Œ²ÿ²…³3´Î´Tµ½µ9¶Ý¶n·ê·;¸`,dlMÌdÌz̡̽ÌÑÌa$;A‰Ê ÊáÊîÊ +Ëb@CP`ËwË�ˡ˰ËÃËìËÌ;ÌcP´¨Ë¨Ô¨á¨ê¨ ©-©S©ƒ©˜©§©¸©Ç©dT'թ쩪5ªWªeª‘ªµª +« «=«z«�«é« ¬%¬eìD¼~:•:¦:·:Ç:Ù:ë:ü:; ;0;A;R;c;t;‚;�;ª;Ë;Ý;ø;<<5<G<b<o<y<Ÿ<±<Ì<Ù<ã< =&=D=V=`=r=š=¸=Ï=Ü=î= +>>)>E>R>d>i>>‰>Ž>®>Æ>Ó>ç>ì> ?$?1?E?e?w?„?¶?Ñ?Þ?:@E@j@Š@—@œ@¼@Ô@Ù@ù@A1AEAeAjAAŒA¥A¹AÊAßAûAB B-BEBaBnBxB“B˜B¸BÐBÝBñBöBfœ C838<8R8`8e8w8ˆ8™8±8Å8Ü8÷8 99"9@9\9p9„9’9£9¨9Á9Õ9é9: :4:H:W:g´¶àÕÁìÁÂ#Â3ÂHÂ[Âyާ¼ÂËÂäÂÿÂÃ2ÃMÃbÀÛðÃÎÃéÃþÃÄÄ&Ä=ÄpÄœÄÌÄÛÄh$Ôtëtu u uiL¥ ‡)‡L‡n‡‘‡¡‡µ‡ɇò‡ˆ7ˆMˆZˆ‰ˆ›ˆºˆ؈óˆ0‰R‰n‰ˆ‰ɉà‰í‰ Š+ŠjІЋЦŠÍпЋ)‹:‹Q‹y‹‹‹�‹¤‹º‹Ù‹ŒŒ7ŒSŒXŒpŒ†ŒšŒ«Œ¼ŒÁŒÏŒúŒ�6�O�q�’�£�°�Î�î�/Ž}ޛ޶ŽÇŽØŽ�7�h�„�«�Å�Ê�û���*�L�f�z���¡�³�¸�Æ�Ô�â�ð�‘)‘1‘b‘l‘�‘›‘¼‘Õ‘î‘ÿ‘’2’L’z’•’¹’ã’ð’jtÑë2¸I¸[¸l¸}¸Џ¨¸и縹t¹¢¹ݹô¹/ºFºkX"µõ´ µ!µ4µOµmµ†µ›µÀµÕµ¶;¶J¶_¶i¶{¶›¶¯¶Õ¶õ¶·"·B·n·‰·›·¦··ç·û·¸6¸Y¸h¸…¸™¸¿¸Ó¸ù¸ÿ¸0¹V¹j¹z¹…¹£¹¸¹Źë¹ø¹º"º/ºMºkº€º¥ºµºƺ»"»H»M»\»q»{»‘»¼»Ï»è»õ»¼(¼J¼l¼‡¼–¼×¼õ¼½(½M½R½w½}½›½©½Á½ν۽セ!¾.¾E¾W¾j¾ƒ¾¨¾µ¾Ǿñ¾þ¾¿%¿9¿F¿Z¿n¿{¿�¿¢¿³¿è¿ÀQÀ`À{ÀˆÀ¤À³ÀÎÀÛÀ÷ÀÁÁlø¦!“3“N“Z“““ɓ֓哔”F”S”b”}”¡”¶”ñ”ö”•I•f•€•œ•«•ȕܕô•––'–b–g–…–º–×–ñ– ——+—d—•—¢—±—Ì—Ù—ì—˜˜8˜E˜x˜‡˜¼˜Õ˜â˜*™9™V™q™~™™™ ™¤™Ö™Û™ š:š?šFšJš|š�š°š¿šÒšèšöš ››(›C›Z›g›ƒ›‘›¨›µ›Ñ›ß› œ-œ^œmœ‰œ¦œÁœÖœûœ�+�J�\�x�~� �Ë�í�ú� ž#ž8žXžxžŽžŸž·žŸŸEŸJŸcŸŽŸ¤Ÿ·ŸÊŸÚŸðŸ > j Š ° Рæ ù  ¡*¡J¡k¡ ¡Ï¡Ô¡¢Q¢�¢œ¢«¢Ñ¢Þ¢ë¢ÿ¢££/£@£T£a£|£�£Ž£ £¾£Ë£â£ô£ +¤S¤˜¤°¤ɤΤÛ¤¥'¥4¥N¥[¥~¥�¥ª¥Í¥è¥¦G¦b¦˜¦Á¦æ¦ó¦§<§N§z§˜§½§ʧا󧨨)¨<¨U¨z¨‡¨š¨µ¨ݨë¨ø¨"©/©C©V©j©w©‹©Ÿ©¬©À©Ó©ä©û©)ªIªPªª«ªèªíª«P«ƒ«’«¶«Ç«Ü«÷«¬¬0¬U¬q¬�¬¦¬άð¬õ¬$­@­k­p­•­½­ß­®®,®G®l®�®Í®á® ¯(¯7¯€¯¿¯įʯû¯%°T°h°’°Ÿ°®°Ö°±(±R±f±~±ƒ±‰±º±ä±²²#²7²a²u²Ÿ²¿²ä²³0³Z³g³v³’³mô–Г²ª²¾²ϲÓ²ݲü² ³/³<³I³u³Œ³Õ³æ³<´}´Š´¡´å´ü´µ"µHµUµZµfµžµþµ=¶^¶Œ¶¤¶¶¶»¶Ó¶î¶· ·%·D·Y·k·˜·¬·Ö·æ·õ·n$ôú*tAtYtftsto$û�t˜t°t½tÊtpPÕæIr`rrrˆr¨r¯r½rØràrïr ss%sDsq<çóms„s–s¬s¯sÁsÅsØsåsòstr@‘©)À)Ü)í)***"*3*F*W*d*“*Â*%+A+€+š+¬+Ô+è+û+ ,;,P,r,ƒ,¡,³,Ä,É,è,-(-¥-4.—.³.Ö.Ü.ö.‹/î/ +00D0g0m0Š0•0Æ0Ý0 +171E1T1h1n1Š1‘1©1í1'242o2•2ª2¼2Í2á2;3U3d3t3�3²3Ä3Õ3â34A4\4k4{4€4�4œ4«4Ö4Ý4õ4ú4%5K5©5Ã5È5Ý5î56 6:6^6o6Š6ª6Ç6Ù6è6÷6727F7K7c7s(I�o!†!—! !´!Å!Í!Û!ç!ø! "")"X"»"×"#?#Y#k#“#§#º#Ù#ó# $w$%|%˜%Ÿ%Â%å%ë%&š&ý&' 'C'f'l'‰'”'Å'Ü' (6(D(S(g(m(‚( (²(Ê(â(ö( +)ttîýÏÐ%Ð9ÐAÐIÐOÐTÐwÐ~Ð�СпÐÙÐñÐÑÑÑ5ÑGÑKÑaÑuѳÑöÑÒÒRÒfÒ‚Ò†ÒÄÒÓ$Ó(ÓcÓ{ÓÓ‘Ó§Ó»Ó×ÓÛÓÔ\ÔyÔ}Ô¸ÔÉÔÝÔÕ@ÕoÕtÕ·ÕæÕëÕ4ÖAÖpÖ…ÖŠÖÂÖèÖþÖ×2×M×d×{×–×­×Ä×ã×úרØNØo؉ؓØñØÙ>ÙC١ٿÙîÙóÙ3Ú8Ú‚Ú±ÚÆÚËÚÛDÛYÛ^ÛcÛ¶ÛÜ2ÜGÜL܇ܟܱÜÐÜýÜCÝhÝmÝ£ÝÚÝ ÞÞHÞ_Þ©ÞÀÞÝÞøÞ.ß_ß~߹߿ß,àQà[àŽà§àæàøà á8áá á¾á`â¬â¹âòâ”ãàãñãöãäJäcä¢ä´äÜä-åNå~å½ååå÷å ææUæ‡æŒæÇæþæ:çlçqç¬çãçøçšèæèééOéé¾éÃéäéê0êoê�ê©êúêë½ëÌëÖëì>ìwìÏìâìííUí‚í»íî&îTî^î™îÆî +ï8ïBïYï^ï}ï›ï©ïu(y€R+i+r+¨+º+Û+vH+:ðÉÊÊ$Ê,Ê9ÊRÊhÊqÊwÊ|Êw$ñ÷i¥r¥„¥’¥ \ No newline at end of file diff --git a/LT/COMPILE/CODE.ASZ b/LT/COMPILE/CODE.ASZ new file mode 100644 index 0000000..009eb85 --- /dev/null +++ b/LT/COMPILE/CODE.ASZ @@ -0,0 +1,4083 @@ + ALIGN 8,0x90 +FAR_AWAY: //(FOR DUMMY U4 JMPS) + + ALIGN 4 +INTERNAL_TYPES_TABLE:: + DU4 HTT_INTERNAL_TYPE,IT_I4,4; + DU1 "void",0; + DU4 HTT_INTERNAL_TYPE,IT_DOUBLE,8; + DU1 "double",0; + + DU4 HTT_INTERNAL_TYPE,IT_I0,0; + DU1 "I0i",0; + DU4 HTT_INTERNAL_TYPE,IT_U0,0; + DU1 "U0i",0; + DU4 HTT_INTERNAL_TYPE,IT_I0,0; + DU1 "I0",0; + DU4 HTT_INTERNAL_TYPE,IT_U0,0; + DU1 "U0",0; + DU4 HTT_INTERNAL_TYPE,IT_I1,1; + DU1 "I1i",0; + DU4 HTT_INTERNAL_TYPE,IT_U1,1; + DU1 "U1i",0; + DU4 HTT_INTERNAL_TYPE,IT_I1,1; + DU1 "I1",0; + DU4 HTT_INTERNAL_TYPE,IT_U1,1; + DU1 "U1",0; + DU4 HTT_INTERNAL_TYPE,IT_I2,2; + DU1 "I2i",0; + DU4 HTT_INTERNAL_TYPE,IT_U2,2; + DU1 "U2i",0; + DU4 HTT_INTERNAL_TYPE,IT_I4,4; + DU1 "I4i",0; + DU4 HTT_INTERNAL_TYPE,IT_U4,4; + DU1 "U4i",0; + DU4 HTT_INTERNAL_TYPE,IT_I8,8; + DU1 "I8i",0; + DU4 HTT_INTERNAL_TYPE,IT_U8,8; + DU1 "U8i",0; + + DU4 HTT_INVALID; +//******************************************************* + ALIGN 8,0x90 +I_OPT_NOP: + DU4 EC_NOP; //Must be at IC_CODE offset + +/********** +void OptNext(IntermediateCode *tempi, + IntermediateCode **temp_lag) +{ + I8 i,j=0; + for (i=3;i>0;i--) + temp_lag[i]=temp_lag[i-1]; + temp_lag[0]=tempi; + for (i=0;i<4;i++) //TODO: move end_exp + if (temp_lag[i]->ic_code.u2[0]>EC_END_EXP) + temp_lag[j++]=temp_lag[i]; + while (j<4) + temp_lag[j++]=&opt_nop; +} +************/ + ALIGN 8,0x90 +CP_OPTNEXT:: + PUSH EBP + MOV EBP,ESP + PUSH EDI + MOV ECX,U4 SF_PARAM1[EBP] + MOV EDX,U4 SF_PARAM2[EBP] + + MOV EAX,U4 8[EDX] + MOV U4 12[EDX],EAX + MOV EAX,U4 4[EDX] + MOV U4 8[EDX],EAX + MOV EAX,U4 [EDX] + MOV U4 4[EDX],EAX + MOV U4 [EDX],ECX + + MOV EDI,EDX + + MOV EAX,U4 [EDX] + CMP U2 IC_CODE[EAX],EC_END_EXP + JBE @@10 + STOSD + +@@10: MOV EAX,U4 4[EDX] + CMP U2 IC_CODE[EAX],EC_END_EXP + JBE @@11 + STOSD + +@@11: MOV EAX,U4 8[EDX] + CMP U2 IC_CODE[EAX],EC_END_EXP + JBE @@12 + STOSD + +@@12: MOV EAX,U4 12[EDX] + CMP U2 IC_CODE[EAX],EC_END_EXP + JBE @@13 + STOSD + +@@13: MOV EAX,I_OPT_NOP + ADD EDX,16 + JMP @@15 + +@@14: STOSD +@@15: CMP EDI,EDX + JB @@14 + +@@100: MOV EAX,1 + XOR EDX,EDX + POP EDI + POP EBP + RET +//******************************************************* +/**** +void PrsPush(ParseStack *ps,U4 val) +{ + ps->stk[ps->ptr++]=val; +} +U8 PrsPop(ParseStack *ps) +{ + return ps->stk[--ps->ptr]; +} +******/ + ALIGN 8,0x90 +CP_PRSPUSH:: + PUSH EBP + MOV EBP,ESP + MOV ECX,U4 SF_PARAM1[EBP] + MOV EAX,U4 [ECX] + LEA EBX,U4 4[ECX+EAX*4] + INC EAX + MOV EDX,U4 SF_PARAM2[EBP] + MOV U4 [ECX],EAX + MOV U4 [EBX],EDX + POP EBP + RET + + ALIGN 8,0x90 +CP_PRSPOP:: + PUSH EBP + MOV EBP,ESP + MOV ECX,U4 SF_PARAM1[EBP] + MOV EAX,U4 [ECX] + DEC EAX + MOV U4 [ECX],EAX + MOV EAX,U4 4[ECX+EAX*4] + XOR EDX,EDX + POP EBP + RET + +//******************************************************* + + ALIGN 8,0x90 +CODE_TABLE:: + DU4 ICT_NULL; + DU4 ICT_NOP; + DU4 ICT_END_EXP; + DU4 ICT_ZERO; + DU4 ICT_U8; + DU4 ICT_U4; + DU4 ICT_U2; + DU4 ICT_U1; + DU4 ICT_DOUBLE; + DU4 ICT_STRING_CONSTANT; + DU4 ICT_EBP; + DU4 ICT_FS; + DU4 ICT_ESI; + DU4 ICT_EDI; + DU4 ICT_TO_DOUBLE; + DU4 ICT_TO_INT; + DU4 ICT_COM; + DU4 ICT_NOT; + DU4 ICT_UNARY_MINUS; + DU4 ICT_ADDRESS; + DU4 ICT_U8_DISP32; + DU4 ICT_U4_DISP32; + DU4 ICT_U2_DISP32; + DU4 ICT_U1_DISP32; + DU4 ICT_U8_DISP8; + DU4 ICT_U4_DISP8; + DU4 ICT_U2_DISP8; + DU4 ICT_U1_DISP8; + DU4 ICT_FS_U8_DISP32; + DU4 ICT_FS_U4_DISP32; + DU4 ICT_FS_U2_DISP32; + DU4 ICT_FS_U1_DISP32; + DU4 ICT_ESI_U8_DISP32; + DU4 ICT_ESI_U4_DISP32; + DU4 ICT_ESI_U2_DISP32; + DU4 ICT_ESI_U1_DISP32; + DU4 ICT_ESI_U8_DISP8; + DU4 ICT_ESI_U4_DISP8; + DU4 ICT_ESI_U2_DISP8; + DU4 ICT_ESI_U1_DISP8; + DU4 ICT_EDI_U8_DISP32; + DU4 ICT_EDI_U4_DISP32; + DU4 ICT_EDI_U2_DISP32; + DU4 ICT_EDI_U1_DISP32; + DU4 ICT_EDI_U8_DISP8; + DU4 ICT_EDI_U4_DISP8; + DU4 ICT_EDI_U2_DISP8; + DU4 ICT_EDI_U1_DISP8; + DU4 ICT_DEREF_U8; + DU4 ICT_DEREF_U4; + DU4 ICT_DEREF_U2; + DU4 ICT_DEREF_U1; + DU4 ICT_ESI_DEREF_U8; + DU4 ICT_ESI_DEREF_U4; + DU4 ICT_ESI_DEREF_U2; + DU4 ICT_ESI_DEREF_U1; + DU4 ICT_EDI_DEREF_U8; + DU4 ICT_EDI_DEREF_U4; + DU4 ICT_EDI_DEREF_U2; + DU4 ICT_EDI_DEREF_U1; + DU4 ICT_U8_PP; + DU4 ICT_U4_PP; + DU4 ICT_U2_PP; + DU4 ICT_U1_PP; + DU4 ICT_U8_MM; + DU4 ICT_U4_MM; + DU4 ICT_U2_MM; + DU4 ICT_U1_MM; + DU4 ICT_PP_U8; + DU4 ICT_PP_U4; + DU4 ICT_PP_U2; + DU4 ICT_PP_U1; + DU4 ICT_MM_U8; + DU4 ICT_MM_U4; + DU4 ICT_MM_U2; + DU4 ICT_MM_U1; + DU4 ICT_ESI_U4_PP; + DU4 ICT_ESI_U4_MM; + DU4 ICT_ESI_PP_U4; + DU4 ICT_ESI_MM_U4; + DU4 ICT_EDI_U4_PP; + DU4 ICT_EDI_U4_MM; + DU4 ICT_EDI_PP_U4; + DU4 ICT_EDI_MM_U4; + DU4 ICT_LEA_DISP32_EBP; + DU4 ICT_LEA_DISP8_EBP; + DU4 ICT_U8_DISP32_SCALED; + DU4 ICT_U4_DISP32_SCALED; + DU4 ICT_U2_DISP32_SCALED; + DU4 ICT_SHL; + DU4 ICT_SHR; + DU4 ICT_SHL_CONSTANT1; + DU4 ICT_SHL_CONSTANT2; + DU4 ICT_SHR_CONSTANT1; + DU4 ICT_SHR_CONSTANT2; + DU4 ICT_POWER; + DU4 ICT_MULTIPLICATION; + DU4 ICT_DIVISION; + DU4 ICT_REMAINDER; + DU4 ICT_AND; + DU4 ICT_OR; + DU4 ICT_XOR; + DU4 ICT_ADDITION; + DU4 ICT_SUBTRACTION; + DU4 ICT_EQUAL_EQUAL; + DU4 ICT_NOT_EQUAL_TO; + DU4 ICT_LESS_THAN; + DU4 ICT_GREATER_THAN; + DU4 ICT_LESS_OR_EQUAL; + DU4 ICT_GREATER_OR_EQUAL; + DU4 ICT_AND_AND; + DU4 ICT_OR_OR; + DU4 ICT_XOR_XOR; + DU4 ICT_COLON; + DU4 ICT_QUESTION; + DU4 ICT_ASSIGN_U8; + DU4 ICT_ASSIGN_U4; + DU4 ICT_ASSIGN_U2; + DU4 ICT_ASSIGN_U1; + DU4 ICT_SHL_EQUAL_U8; + DU4 ICT_SHL_EQUAL_U4; + DU4 ICT_SHL_EQUAL_U2; + DU4 ICT_SHL_EQUAL_U1; + DU4 ICT_SHR_EQUAL_U8; + DU4 ICT_SHR_EQUAL_U4; + DU4 ICT_SHR_EQUAL_U2; + DU4 ICT_SHR_EQUAL_U1; + DU4 ICT_MUL_EQUAL_U8; + DU4 ICT_MUL_EQUAL_U4; + DU4 ICT_MUL_EQUAL_U2; + DU4 ICT_MUL_EQUAL_U1; + DU4 ICT_DIV_EQUAL_U8; + DU4 ICT_DIV_EQUAL_U4; + DU4 ICT_DIV_EQUAL_U2; + DU4 ICT_DIV_EQUAL_U1; + DU4 ICT_AND_EQUAL_U8; + DU4 ICT_AND_EQUAL_U4; + DU4 ICT_AND_EQUAL_U2; + DU4 ICT_AND_EQUAL_U1; + DU4 ICT_OR_EQUAL_U8; + DU4 ICT_OR_EQUAL_U4; + DU4 ICT_OR_EQUAL_U2; + DU4 ICT_OR_EQUAL_U1; + DU4 ICT_XOR_EQUAL_U8; + DU4 ICT_XOR_EQUAL_U4; + DU4 ICT_XOR_EQUAL_U2; + DU4 ICT_XOR_EQUAL_U1; + DU4 ICT_ADD_EQUAL_U8; + DU4 ICT_ADD_EQUAL_U4; + DU4 ICT_ADD_EQUAL_U2; + DU4 ICT_ADD_EQUAL_U1; + DU4 ICT_SUB_EQUAL_U8; + DU4 ICT_SUB_EQUAL_U4; + DU4 ICT_SUB_EQUAL_U2; + DU4 ICT_SUB_EQUAL_U1; + DU4 ICT_ESI_ASSIGN_U4; + DU4 ICT_ESI_SHL_EQUAL_U4; + DU4 ICT_ESI_SHR_EQUAL_U4; + DU4 ICT_ESI_MUL_EQUAL_U4; + DU4 ICT_ESI_DIV_EQUAL_U4; + DU4 ICT_ESI_AND_EQUAL_U4; + DU4 ICT_ESI_OR_EQUAL_U4; + DU4 ICT_ESI_XOR_EQUAL_U4; + DU4 ICT_ESI_ADD_EQUAL_U4; + DU4 ICT_ESI_SUB_EQUAL_U4; + DU4 ICT_EDI_ASSIGN_U4; + DU4 ICT_EDI_SHL_EQUAL_U4; + DU4 ICT_EDI_SHR_EQUAL_U4; + DU4 ICT_EDI_MUL_EQUAL_U4; + DU4 ICT_EDI_DIV_EQUAL_U4; + DU4 ICT_EDI_AND_EQUAL_U4; + DU4 ICT_EDI_OR_EQUAL_U4; + DU4 ICT_EDI_XOR_EQUAL_U4; + DU4 ICT_EDI_ADD_EQUAL_U4; + DU4 ICT_EDI_SUB_EQUAL_U4; + DU4 ICT_ADD64; + DU4 ICT_ADD32; + DU4 ICT_ADD8; + DU4 ICT_INC; + DU4 ICT_SUB64; + DU4 ICT_SUB32; + DU4 ICT_SUB8; + DU4 ICT_DEC; + DU4 ICT_ENTER; + DU4 ICT_LEAVE; + DU4 ICT_ENTER1; + DU4 ICT_LEAVE1; + DU4 ICT_ENTER2; + DU4 ICT_LEAVE2; + DU4 ICT_ADD_ESP32; + DU4 ICT_ADD_ESP8; + DU4 ICT_RET; + DU4 ICT_CALL; + DU4 ICT_CALL_INDIRECT; + DU4 ICT_CALL_INDIRECT2; + DU4 ICT_IRQ; + DU4 ICT_CLI; + DU4 ICT_STI; + DU4 ICT_GET_FLAGS; + DU4 ICT_SET_FLAGS; + DU4 ICT_GET_BASE_PTR; + DU4 ICT_SET_BASE_PTR; + DU4 ICT_GET_STACK_PTR; + DU4 ICT_SET_STACK_PTR; + DU4 ICT_GET_LABEL; + DU4 ICT_ABSOLUTE_ADDRESS; + DU4 ICT_LABEL; + DU4 ICT_TYPE; + DU4 ICT_BT; + DU4 ICT_BTS; + DU4 ICT_BTR; + DU4 ICT_BTC; + DU4 ICT_BSF; + DU4 ICT_BSR; + DU4 ICT_INSQUE; + DU4 ICT_INSQUE_REV; + DU4 ICT_REMQUE; + DU4 ICT_STRLEN; + DU4 ICT_MEMCPY; + DU4 ICT_MEMSET; + DU4 ICT_INPD; + DU4 ICT_INPW; + DU4 ICT_INP; + DU4 ICT_OUTPD; + DU4 ICT_OUTPW; + DU4 ICT_OUTP; + DU4 ICT_JMP; + DU4 ICT_SHORT_JMP; + DU4 ICT_SWITCH; + DU4 ICT_SKIPZ; + DU4 ICT_SKIPZ2; + DU4 ICT_SKIPNZ; + DU4 ICT_SKIPNZ2; + DU4 ICT_EQUAL_EQUAL_SKIPZ; + DU4 ICT_EQUAL_EQUAL_SKIPZ2; + DU4 ICT_NOT_EQUAL_TO_SKIPZ; + DU4 ICT_NOT_EQUAL_TO_SKIPZ2; + DU4 ICT_LESS_THAN_SKIPZ; + DU4 ICT_LESS_THAN_SKIPZ2; + DU4 ICT_GREATER_THAN_SKIPZ; + DU4 ICT_GREATER_THAN_SKIPZ2; + DU4 ICT_LESS_OR_EQUAL_SKIPZ; + DU4 ICT_LESS_OR_EQUAL_SKIPZ2; + DU4 ICT_GREATER_OR_EQUAL_SKIPZ; + DU4 ICT_GREATER_OR_EQUAL_SKIPZ2; + DU4 ICT_AND_AND_SKIPZ; + DU4 ICT_AND_AND_SKIPZ2; + DU4 ICT_AND_AND_SKIPNZ; + DU4 ICT_AND_AND_SKIPNZ2; + DU4 ICT_OR_OR_SKIPZ; + DU4 ICT_OR_OR_SKIPZ2; + DU4 ICT_OR_OR_SKIPNZ; + DU4 ICT_OR_OR_SKIPNZ2; + DU4 ICT_LEA_DISP32_ESI; + DU4 ICT_LEA_DISP8_ESI; + DU4 ICT_LEA_DISP32_EDI; + DU4 ICT_LEA_DISP8_EDI; + DU4 ICT_PUSH_U8; + DU4 ICT_PUSH_U4; + DU4 ICT_PUSH_U2; + DU4 ICT_PUSH_U1; + DU4 ICT_PUSH_NEG_U4; + DU4 ICT_PUSH_NEG_U2; + DU4 ICT_PUSH_NEG_U1; + DU4 ICT_PUSH_DOUBLE; + DU4 ICT_PUSH_U8_DISP32; + DU4 ICT_PUSH_U8_DISP8; + DU4 ICT_PUSH_ESI_U8_DISP32; + DU4 ICT_PUSH_ESI_U8_DISP8; + DU4 ICT_PUSH_EDI_U8_DISP32; + DU4 ICT_PUSH_EDI_U8_DISP8; + DU4 ICT_PUSH_DEREF_U8; + DU4 ICT_PUSH_U8_DISP32_SCALED; + DU4 ICT_BT_CONSTANT; + DU4 ICT_BTS_CONSTANT; + DU4 ICT_BTR_CONSTANT; + DU4 ICT_BTC_CONSTANT; + DU4 ICT_ESI_NEXT_EQUAL_U4; + DU4 ICT_EDI_NEXT_EQUAL_U4; + DU4 ICT_ADD_EQUAL_U8_CONSTANT_U1; + DU4 ICT_SUB_EQUAL_U8_CONSTANT_U1; + DU4 ICT_ADD_EQUAL_U4_CONSTANT_U1; + DU4 ICT_ESI_ADD_EQUAL_U4_CONSTANT_U1; + DU4 ICT_EDI_ADD_EQUAL_U4_CONSTANT_U1; + DU4 ICT_TABLE_END; +ICT_NULL: +ICT_NOP: +ICT_END_EXP: +ICT_ZERO: +ICT_U8: +ICT_U4: + PUSH EDX + PUSH EAX + MOV EAX,0x12345678 + CDQ +ICT_U2: +ICT_U1: +ICT_DOUBLE: +ICT_STRING_CONSTANT: +ICT_EBP: +ICT_FS: +ICT_ESI: + PUSH EDX + PUSH EAX + MOV EAX,ESI + CDQ +ICT_EDI: + PUSH EDX + PUSH EAX + MOV EAX,EDI + CDQ +ICT_TO_DOUBLE: +ICT_TO_INT: +ICT_COM: +ICT_NOT: +ICT_UNARY_MINUS: +ICT_ADDRESS: +ICT_U8_DISP32: +ICT_U4_DISP32: + PUSH EDX + PUSH EAX + MOV EAX,U4 0x12345678[EBP] + CDQ +ICT_U2_DISP32: + PUSH EDX + PUSH EAX + MOVSX EAX,U2 0x12345678[EBP] + CDQ +ICT_U1_DISP32: + PUSH EDX + PUSH EAX + MOVSX EAX,U1 0x12345678[EBP] + CDQ +ICT_U8_DISP8: +ICT_U4_DISP8: + PUSH EDX + PUSH EAX + MOV EAX,U4 0x12[EBP] + CDQ +ICT_U2_DISP8: + PUSH EDX + PUSH EAX + MOVSX EAX,U2 0x12[EBP] + CDQ +ICT_U1_DISP8: + PUSH EDX + PUSH EAX + MOVSX EAX,U1 0x12[EBP] + CDQ +ICT_FS_U8_DISP32: +ICT_FS_U4_DISP32: + PUSH EDX + PUSH EAX + MOV EAX,U4 FS:[0x12345678] + CDQ +ICT_FS_U2_DISP32: + PUSH EDX + PUSH EAX + MOVSX EAX,U2 FS:[0x12345678] + CDQ +ICT_FS_U1_DISP32: + PUSH EDX + PUSH EAX + MOVSX EAX,U1 FS:[0x12345678] + CDQ +ICT_ESI_U8_DISP32: +ICT_ESI_U4_DISP32: + PUSH EDX + PUSH EAX + MOV EAX,U4 0x12345678[ESI] + CDQ +ICT_ESI_U2_DISP32: + PUSH EDX + PUSH EAX + MOVSX EAX,U2 0x12345678[ESI] + CDQ +ICT_ESI_U1_DISP32: + PUSH EDX + PUSH EAX + MOVSX EAX,U1 0x12345678[ESI] + CDQ +ICT_ESI_U8_DISP8: +ICT_ESI_U4_DISP8: + PUSH EDX + PUSH EAX + MOV EAX,U4 0x12[ESI] + CDQ +ICT_ESI_U2_DISP8: + PUSH EDX + PUSH EAX + MOVSX EAX,U2 0x12[ESI] + CDQ +ICT_ESI_U1_DISP8: + PUSH EDX + PUSH EAX + MOVSX EAX,U1 0x12[ESI] + CDQ +ICT_EDI_U8_DISP32: +ICT_EDI_U4_DISP32: + PUSH EDX + PUSH EAX + MOV EAX,U4 0x12345678[EDI] + CDQ +ICT_EDI_U2_DISP32: + PUSH EDX + PUSH EAX + MOVSX EAX,U2 0x12345678[EDI] + CDQ +ICT_EDI_U1_DISP32: + PUSH EDX + PUSH EAX + MOVSX EAX,U1 0x12345678[EDI] + CDQ +ICT_EDI_U8_DISP8: +ICT_EDI_U4_DISP8: + PUSH EDX + PUSH EAX + MOV EAX,U4 0x12[EDI] + CDQ +ICT_EDI_U2_DISP8: + PUSH EDX + PUSH EAX + MOVSX EAX,U2 0x12[EDI] + CDQ +ICT_EDI_U1_DISP8: + PUSH EDX + PUSH EAX + MOVSX EAX,U1 0x12[EDI] + CDQ +ICT_DEREF_U8: +ICT_DEREF_U4: + MOV EAX,U4 [EAX] + CDQ +ICT_DEREF_U2: + MOVSX EAX,U2 [EAX] + CDQ +ICT_DEREF_U1: + MOVSX EAX,U1 [EAX] + CDQ +ICT_ESI_DEREF_U8: +ICT_ESI_DEREF_U4: + PUSH EDX + PUSH EAX + MOV EAX,U4 [ESI] + CDQ +ICT_ESI_DEREF_U2: + PUSH EDX + PUSH EAX + MOVSX EAX,U2 [ESI] + CDQ +ICT_ESI_DEREF_U1: + PUSH EDX + PUSH EAX + MOVSX EAX,U1 [ESI] + CDQ +ICT_EDI_DEREF_U8: +ICT_EDI_DEREF_U4: + PUSH EDX + PUSH EAX + MOV EAX,U4 [EDI] + CDQ +ICT_EDI_DEREF_U2: + PUSH EDX + PUSH EAX + MOVSX EAX,U2 [EDI] + CDQ +ICT_EDI_DEREF_U1: + PUSH EDX + PUSH EAX + MOVSX EAX,U1 [EDI] + CDQ +ICT_U8_PP: +ICT_U4_PP: + MOV EBX,EAX + MOV EAX,U4 [EBX] + INC U4 [EBX] + CDQ +ICT_U2_PP: + MOV EBX,EAX + MOVSX EAX,U2 [EBX] + INC U2 [EBX] + CDQ +ICT_U1_PP: + MOV EBX,EAX + MOVSX EAX,U1 [EBX] + INC U1 [EBX] + CDQ +ICT_U8_MM: +ICT_U4_MM: + MOV EBX,EAX + MOV EAX,U4 [EBX] + DEC U4 [EBX] + CDQ +ICT_U2_MM: + MOV EBX,EAX + MOVSX EAX,U2 [EBX] + DEC U2 [EBX] + CDQ +ICT_U1_MM: + MOV EBX,EAX + MOVSX EAX,U1 [EBX] + DEC U1 [EBX] + CDQ +ICT_PP_U8: +ICT_PP_U4: + INC U4 [EAX] + MOV EAX,U4 [EAX] + CDQ +ICT_PP_U2: + INC U2 [EAX] + MOVSX EAX,U2 [EAX] + CDQ +ICT_PP_U1: + INC U1 [EAX] + MOVSX EAX,U1 [EAX] + CDQ +ICT_MM_U8: +ICT_MM_U4: + DEC U4 [EAX] + MOV EAX,U4 [EAX] + CDQ +ICT_MM_U2: + DEC U2 [EAX] + MOVSX EAX,U2 [EAX] + CDQ +ICT_MM_U1: + DEC U1 [EAX] + MOVSX EAX,U1 [EAX] + CDQ +ICT_ESI_U4_PP: + PUSH EDX + PUSH EAX + MOV EAX,ESI + INC ESI + CDQ +ICT_ESI_U4_MM: + PUSH EDX + PUSH EAX + MOV EAX,ESI + DEC ESI + CDQ +ICT_ESI_PP_U4: + PUSH EDX + PUSH EAX + INC ESI + MOV EAX,ESI + CDQ +ICT_ESI_MM_U4: + PUSH EDX + PUSH EAX + DEC ESI + MOV EAX,ESI + CDQ +ICT_EDI_U4_PP: + PUSH EDX + PUSH EAX + MOV EAX,EDI + INC EDI + CDQ +ICT_EDI_U4_MM: + PUSH EDX + PUSH EAX + MOV EAX,EDI + DEC EDI + CDQ +ICT_EDI_PP_U4: + PUSH EDX + PUSH EAX + INC EDI + MOV EAX,EDI + CDQ +ICT_EDI_MM_U4: + PUSH EDX + PUSH EAX + DEC EDI + MOV EAX,EDI + CDQ +ICT_LEA_DISP32_EBP: +ICT_LEA_DISP8_EBP: +ICT_U8_DISP32_SCALED: +ICT_U4_DISP32_SCALED: + MOV EAX,U4 0x12345678[EAX*4] + CDQ +ICT_U2_DISP32_SCALED: + MOVSX EAX,U2 0x12345678[EAX*2] + CDQ +ICT_SHL: +ICT_SHR: + MOV ECX,EAX + POP EAX + POP EDX + SUB CL,32 + JNC @@SR7 + SHRD EAX,EDX + SAR EDX,CL + JMP ICT_SHL_CONSTANT1 +@@SR7: MOV EAX,EDX + OR EDX,EDX + MOV EDX,0 + JNS @@SR6 + DEC EDX +@@SR6: SHRD EAX,EDX +ICT_SHL_CONSTANT1: +ICT_SHL_CONSTANT2: +ICT_SHR_CONSTANT1: + MOV CL,0x12 + SHRD EAX,EDX + SAR EDX,CL +ICT_SHR_CONSTANT2: + MOV EAX,EDX + OR EDX,EDX + MOV EDX,0 + JNS @@SC1 + DEC EDX +@@SC1: MOV CL,0x12 + SHRD EAX,EDX +ICT_POWER: +ICT_MULTIPLICATION: + POP EBX + ADD ESP,4 + IMUL EBX +ICT_DIVISION: + MOV EBX,EAX + POP EAX + POP EDX + IDIV EBX + CDQ +ICT_REMAINDER: + MOV EBX,EAX + POP EAX + POP EDX + IDIV EBX + MOV EAX,EDX + CDQ +ICT_AND: +ICT_OR: +ICT_XOR: +ICT_ADDITION: +ICT_SUBTRACTION: +ICT_EQUAL_EQUAL: +ICT_NOT_EQUAL_TO: +ICT_LESS_THAN: + POP EBX + POP ECX + SUB EBX,EAX + SBB ECX,EDX + MOV EAX,0 + JGE @@LT1 + INC EAX +@@LT1: XOR EDX,EDX +ICT_GREATER_THAN: + POP EBX + POP ECX + SUB EAX,EBX + SBB EDX,ECX + MOV EAX,0 + JGE @@GT1 + INC EAX +@@GT1: XOR EDX,EDX +ICT_LESS_OR_EQUAL: + POP EBX + POP ECX + SUB EAX,EBX + SBB EDX,ECX + MOV EAX,0 + JL @@LE1 + INC EAX +@@LE1: XOR EDX,EDX +ICT_GREATER_OR_EQUAL: + POP EBX + POP ECX + SUB EBX,EAX + SBB ECX,EDX + MOV EAX,0 + JL @@GE1 + INC EAX +@@GE1: XOR EDX,EDX +ICT_AND_AND: +ICT_OR_OR: +ICT_XOR_XOR: +ICT_COLON: +ICT_QUESTION: +ICT_ASSIGN_U8: +ICT_ASSIGN_U4: +ICT_ASSIGN_U2: +ICT_ASSIGN_U1: +ICT_SHL_EQUAL_U8: +ICT_SHL_EQUAL_U4: + POP EBX + ADD ESP,4 + MOV CL,AL + SAL U4 [EBX],CL + MOV EAX,U4 [EBX] + CDQ +ICT_SHL_EQUAL_U2: + POP EBX + ADD ESP,4 + MOV CL,AL + SAL U2 [EBX],CL + MOVSX EAX,U2 [EBX] + CDQ +ICT_SHL_EQUAL_U1: + POP EBX + ADD ESP,4 + MOV CL,AL + SAL U1 [EBX],CL + MOVSX EAX,U1 [EBX] + CDQ +ICT_SHR_EQUAL_U8: + POP EBX + ADD ESP,4 + MOV ECX,EAX + MOV EAX,U4 [EBX] + MOV EDX,U4 4[EBX] + SUB ECX,32 + JNC @@SR9 + SHRD EAX,EDX + SAR EDX,CL + JMP @@SR10 +@@SR9: MOV EAX,EDX + OR EDX,EDX + MOV EDX,0 + JNS @@SR8 + DEC EDX +@@SR8: SHRD EAX,EDX +@@SR10: MOV U4 [EBX],EAX + MOV U4 4[EBX],EDX +ICT_SHR_EQUAL_U4: + POP EBX + ADD ESP,4 + MOV CL,AL + SAR U4 [EBX],CL + MOV EAX,U4 [EBX] + CDQ +ICT_SHR_EQUAL_U2: + POP EBX + ADD ESP,4 + MOV CL,AL + SAR U2 [EBX],CL + MOVSX EAX,U2 [EBX] + CDQ +ICT_SHR_EQUAL_U1: + POP EBX + ADD ESP,4 + MOV CL,AL + SAR U1 [EBX],CL + MOVSX EAX,U1 [EBX] + CDQ +ICT_MUL_EQUAL_U8: + POP EBX + ADD ESP,4 + MOV EDX,U4 [EBX] + IMUL EDX + MOV U4 [EBX],EAX + MOV U4 4[EBX],EDX +ICT_MUL_EQUAL_U4: + POP EBX + ADD ESP,4 + MOV EDX,U4 [EBX] + IMUL EDX + MOV U4 [EBX],EAX +ICT_MUL_EQUAL_U2: + POP EBX + ADD ESP,4 + MOVSX EDX,U2 [EBX] + IMUL EDX + MOV U2 [EBX],AX +ICT_MUL_EQUAL_U1: + POP EBX + ADD ESP,4 + MOVSX EDX,U1 [EBX] + IMUL EDX + MOV U1 [EBX],AL +ICT_DIV_EQUAL_U8: + POP EBX + ADD ESP,4 + MOV ECX,EAX + MOV EAX,U4 [EBX] + MOV EDX,U4 4[EBX] + IDIV ECX + MOV U4 [EBX],EAX + CDQ + MOV U4 4[EBX],EDX +ICT_DIV_EQUAL_U4: + POP EBX + ADD ESP,4 + MOV ECX,EAX + MOV EAX,U4 [EBX] + CDQ + IDIV ECX + MOV U4 [EBX],EAX + CDQ +ICT_DIV_EQUAL_U2: + POP EBX + ADD ESP,4 + MOV ECX,EAX + MOVSX EAX,U2 [EBX] + CDQ + IDIV ECX + MOV U2 [EBX],AX + MOVSX EAX,AX + CDQ +ICT_DIV_EQUAL_U1: + POP EBX + ADD ESP,4 + MOV ECX,EAX + MOVSX EAX,U1 [EBX] + CDQ + IDIV ECX + MOV U1 [EBX],AL + MOVSX EAX,AL + CDQ +ICT_AND_EQUAL_U8: +ICT_AND_EQUAL_U4: +ICT_AND_EQUAL_U2: +ICT_AND_EQUAL_U1: +ICT_OR_EQUAL_U8: +ICT_OR_EQUAL_U4: +ICT_OR_EQUAL_U2: +ICT_OR_EQUAL_U1: +ICT_XOR_EQUAL_U8: +ICT_XOR_EQUAL_U4: +ICT_XOR_EQUAL_U2: +ICT_XOR_EQUAL_U1: +ICT_ADD_EQUAL_U8: +ICT_ADD_EQUAL_U4: + POP EBX + ADD ESP,4 + ADD U4 [EBX],EAX + MOV EAX,U4 [EBX] + CDQ +ICT_ADD_EQUAL_U2: + POP EBX + ADD ESP,4 + ADD U2 [EBX],AX + MOVSX EAX,U2 [EBX] + CDQ +ICT_ADD_EQUAL_U1: + POP EBX + ADD ESP,4 + ADD U1 [EBX],AL + MOVSX EAX,U1 [EBX] + CDQ +ICT_SUB_EQUAL_U8: +ICT_SUB_EQUAL_U4: + POP EBX + ADD ESP,4 + SUB U4 [EBX],EAX + MOV EAX,U4 [EBX] + CDQ +ICT_SUB_EQUAL_U2: + POP EBX + ADD ESP,4 + SUB U2 [EBX],AX + MOVSX EAX,U2 [EBX] + CDQ +ICT_SUB_EQUAL_U1: + POP EBX + ADD ESP,4 + SUB U1 [EBX],AL + MOVSX EAX,U1 [EBX] + CDQ +ICT_ESI_ASSIGN_U4: +ICT_ESI_SHL_EQUAL_U4: + MOV ECX,EAX + SHL ESI,CL + MOV EAX,ESI + CDQ +ICT_ESI_SHR_EQUAL_U4: + MOV ECX,EAX + SAR ESI,CL + MOV EAX,ESI + CDQ +ICT_ESI_MUL_EQUAL_U4: + MOV EDX,ESI + IMUL EDX + MOV ESI,EAX + CDQ +ICT_ESI_DIV_EQUAL_U4: + MOV ECX,EAX + MOV EAX,ESI + XOR EDX,EDX + IDIV ECX + MOV ESI,EAX + CDQ +ICT_ESI_AND_EQUAL_U4: + AND ESI,EAX + MOV EAX,ESI + CDQ +ICT_ESI_OR_EQUAL_U4: + OR ESI,EAX + MOV EAX,ESI + CDQ +ICT_ESI_XOR_EQUAL_U4: + XOR ESI,EAX + MOV EAX,ESI + CDQ +ICT_ESI_ADD_EQUAL_U4: + ADD ESI,EAX + MOV EAX,ESI + CDQ +ICT_ESI_SUB_EQUAL_U4: + SUB ESI,EAX + MOV EAX,ESI + CDQ +ICT_EDI_ASSIGN_U4: +ICT_EDI_SHL_EQUAL_U4: + MOV ECX,EAX + SHL EDI,CL + MOV EAX,EDI + CDQ +ICT_EDI_SHR_EQUAL_U4: + MOV ECX,EAX + SAR EDI,CL + MOV EAX,EDI + CDQ +ICT_EDI_MUL_EQUAL_U4: + MOV EDX,EDI + IMUL EDX + MOV EDI,EAX + CDQ +ICT_EDI_DIV_EQUAL_U4: + MOV ECX,EAX + MOV EAX,EDI + XOR EDX,EDX + IDIV ECX + MOV EDI,EAX + CDQ +ICT_EDI_AND_EQUAL_U4: + AND EDI,EAX + MOV EAX,EDI + CDQ +ICT_EDI_OR_EQUAL_U4: + OR EDI,EAX + MOV EAX,EDI + CDQ +ICT_EDI_XOR_EQUAL_U4: + XOR EDI,EAX + MOV EAX,EDI + CDQ +ICT_EDI_ADD_EQUAL_U4: + ADD EDI,EAX + MOV EAX,EDI + CDQ +ICT_EDI_SUB_EQUAL_U4: + SUB EDI,EAX + MOV EAX,EDI + CDQ +ICT_ADD64: +ICT_ADD32: +ICT_ADD8: +ICT_INC: +ICT_SUB64: +ICT_SUB32: +ICT_SUB8: +ICT_DEC: +ICT_ENTER: +ICT_LEAVE: +ICT_ENTER1: +ICT_LEAVE1: +ICT_ENTER2: +ICT_LEAVE2: +ICT_ADD_ESP32: +ICT_ADD_ESP8: +ICT_RET: +ICT_CALL: +ICT_CALL_INDIRECT: +ICT_CALL_INDIRECT2: +ICT_IRQ: +ICT_CLI: +ICT_STI: +ICT_GET_FLAGS: +ICT_SET_FLAGS: +ICT_GET_BASE_PTR: +ICT_SET_BASE_PTR: +ICT_GET_STACK_PTR: +ICT_SET_STACK_PTR: +ICT_GET_LABEL: +ICT_ABSOLUTE_ADDRESS: +ICT_LABEL: +ICT_TYPE: +ICT_BT: +ICT_BTS: +ICT_BTR: +ICT_BTC: +ICT_BSF: +ICT_BSR: +ICT_INSQUE: +ICT_INSQUE_REV: +ICT_REMQUE: +ICT_STRLEN: +ICT_MEMCPY: +ICT_MEMSET: +ICT_INPD: +ICT_INPW: +ICT_INP: +ICT_OUTPD: +ICT_OUTPW: +ICT_OUTP: +ICT_JMP: +ICT_SHORT_JMP: +ICT_SWITCH: +ICT_SKIPZ: +ICT_SKIPZ2: +ICT_SKIPNZ: +ICT_SKIPNZ2: +ICT_EQUAL_EQUAL_SKIPZ: +ICT_EQUAL_EQUAL_SKIPZ2: +ICT_NOT_EQUAL_TO_SKIPZ: +ICT_NOT_EQUAL_TO_SKIPZ2: +ICT_LESS_THAN_SKIPZ: + POP EBX + POP ECX + SUB EBX,EAX + SBB ECX,EDX + JGE ICT_LESS_THAN_SKIPZ +ICT_LESS_THAN_SKIPZ2: + POP EBX + POP ECX + SUB EBX,EAX + SBB ECX,EDX + JGE U4 FAR_AWAY +ICT_GREATER_THAN_SKIPZ: + POP EBX + POP ECX + SUB EAX,EBX + SBB EDX,ECX + JGE ICT_GREATER_THAN_SKIPZ +ICT_GREATER_THAN_SKIPZ2: + POP EBX + POP ECX + SUB EAX,EBX + SBB EDX,ECX + JGE U4 FAR_AWAY +ICT_LESS_OR_EQUAL_SKIPZ: + POP EBX + POP ECX + SUB EAX,EBX + SBB EDX,ECX + JL ICT_LESS_OR_EQUAL_SKIPZ +ICT_LESS_OR_EQUAL_SKIPZ2: + POP EBX + POP ECX + SUB EAX,EBX + SBB EDX,ECX + JL U4 FAR_AWAY +ICT_GREATER_OR_EQUAL_SKIPZ: + POP EBX + POP ECX + SUB EBX,EAX + SBB ECX,EDX + JL ICT_GREATER_OR_EQUAL_SKIPZ +ICT_GREATER_OR_EQUAL_SKIPZ2: + POP EBX + POP ECX + SUB EBX,EAX + SBB ECX,EDX + JL U4 FAR_AWAY +ICT_AND_AND_SKIPZ: +ICT_AND_AND_SKIPZ2: +ICT_AND_AND_SKIPNZ: +ICT_AND_AND_SKIPNZ2: +ICT_OR_OR_SKIPZ: +ICT_OR_OR_SKIPZ2: +ICT_OR_OR_SKIPNZ: +ICT_OR_OR_SKIPNZ2: +ICT_LEA_DISP32_ESI: +ICT_LEA_DISP8_ESI: +ICT_LEA_DISP32_EDI: +ICT_LEA_DISP8_EDI: +ICT_PUSH_U8: +ICT_PUSH_U4: +ICT_PUSH_U2: +ICT_PUSH_U1: +ICT_PUSH_NEG_U4: +ICT_PUSH_NEG_U2: +ICT_PUSH_NEG_U1: +ICT_PUSH_DOUBLE: +ICT_PUSH_U8_DISP32: +ICT_PUSH_U8_DISP8: +ICT_PUSH_ESI_U8_DISP32: +ICT_PUSH_ESI_U8_DISP8: +ICT_PUSH_EDI_U8_DISP32: +ICT_PUSH_EDI_U8_DISP8: +ICT_PUSH_DEREF_U8: +ICT_PUSH_U8_DISP32_SCALED: +ICT_BT_CONSTANT: +ICT_BTS_CONSTANT: +ICT_BTR_CONSTANT: +ICT_BTC_CONSTANT: +ICT_ESI_NEXT_EQUAL_U4: + PUSH EDX + PUSH EAX + MOV ESI,U4 [ESI] + MOV EAX,ESI + CDQ +ICT_EDI_NEXT_EQUAL_U4: + PUSH EDX + PUSH EAX + MOV EDI,U4 [EDI] + MOV EAX,EDI + CDQ +ICT_ADD_EQUAL_U8_CONSTANT_U1: +ICT_SUB_EQUAL_U8_CONSTANT_U1: +ICT_ADD_EQUAL_U4_CONSTANT_U1: + ADD U4 [EAX],0x12 + MOV EAX,U4 [EAX] + CDQ +ICT_ESI_ADD_EQUAL_U4_CONSTANT_U1: + PUSH EDX + PUSH EAX + ADD ESI,0x12 + MOV EAX,ESI + CDQ +ICT_EDI_ADD_EQUAL_U4_CONSTANT_U1: + PUSH EDX + PUSH EAX + ADD EDI,0x12 + MOV EAX,EDI + CDQ +ICT_TABLE_END: + + ALIGN 8,0x90 +UNSIGNED_CODE_TABLE:: + DU4 UCT_NULL; + DU4 UCT_NOP; + DU4 UCT_END_EXP; + DU4 UCT_ZERO; + DU4 UCT_U8; + DU4 UCT_U4; + DU4 UCT_U2; + DU4 UCT_U1; + DU4 UCT_DOUBLE; + DU4 UCT_STRING_CONSTANT; + DU4 UCT_EBP; + DU4 UCT_FS; + DU4 UCT_ESI; + DU4 UCT_EDI; + DU4 UCT_TO_DOUBLE; + DU4 UCT_TO_INT; + DU4 UCT_COM; + DU4 UCT_NOT; + DU4 UCT_UNARY_MINUS; + DU4 UCT_ADDRESS; + DU4 UCT_U8_DISP32; + DU4 UCT_U4_DISP32; + DU4 UCT_U2_DISP32; + DU4 UCT_U1_DISP32; + DU4 UCT_U8_DISP8; + DU4 UCT_U4_DISP8; + DU4 UCT_U2_DISP8; + DU4 UCT_U1_DISP8; + DU4 UCT_FS_U8_DISP32; + DU4 UCT_FS_U4_DISP32; + DU4 UCT_FS_U2_DISP32; + DU4 UCT_FS_U1_DISP32; + DU4 UCT_ESI_U8_DISP32; + DU4 UCT_ESI_U4_DISP32; + DU4 UCT_ESI_U2_DISP32; + DU4 UCT_ESI_U1_DISP32; + DU4 UCT_ESI_U8_DISP8; + DU4 UCT_ESI_U4_DISP8; + DU4 UCT_ESI_U2_DISP8; + DU4 UCT_ESI_U1_DISP8; + DU4 UCT_EDI_U8_DISP32; + DU4 UCT_EDI_U4_DISP32; + DU4 UCT_EDI_U2_DISP32; + DU4 UCT_EDI_U1_DISP32; + DU4 UCT_EDI_U8_DISP8; + DU4 UCT_EDI_U4_DISP8; + DU4 UCT_EDI_U2_DISP8; + DU4 UCT_EDI_U1_DISP8; + DU4 UCT_DEREF_U8; + DU4 UCT_DEREF_U4; + DU4 UCT_DEREF_U2; + DU4 UCT_DEREF_U1; + DU4 UCT_ESI_DEREF_U8; + DU4 UCT_ESI_DEREF_U4; + DU4 UCT_ESI_DEREF_U2; + DU4 UCT_ESI_DEREF_U1; + DU4 UCT_EDI_DEREF_U8; + DU4 UCT_EDI_DEREF_U4; + DU4 UCT_EDI_DEREF_U2; + DU4 UCT_EDI_DEREF_U1; + DU4 UCT_U8_PP; + DU4 UCT_U4_PP; + DU4 UCT_U2_PP; + DU4 UCT_U1_PP; + DU4 UCT_U8_MM; + DU4 UCT_U4_MM; + DU4 UCT_U2_MM; + DU4 UCT_U1_MM; + DU4 UCT_PP_U8; + DU4 UCT_PP_U4; + DU4 UCT_PP_U2; + DU4 UCT_PP_U1; + DU4 UCT_MM_U8; + DU4 UCT_MM_U4; + DU4 UCT_MM_U2; + DU4 UCT_MM_U1; + DU4 UCT_ESI_U4_PP; + DU4 UCT_ESI_U4_MM; + DU4 UCT_ESI_PP_U4; + DU4 UCT_ESI_MM_U4; + DU4 UCT_EDI_U4_PP; + DU4 UCT_EDI_U4_MM; + DU4 UCT_EDI_PP_U4; + DU4 UCT_EDI_MM_U4; + DU4 UCT_LEA_DISP32_EBP; + DU4 UCT_LEA_DISP8_EBP; + DU4 UCT_U8_DISP32_SCALED; + DU4 UCT_U4_DISP32_SCALED; + DU4 UCT_U2_DISP32_SCALED; + DU4 UCT_SHL; + DU4 UCT_SHR; + DU4 UCT_SHL_CONSTANT1; + DU4 UCT_SHL_CONSTANT2; + DU4 UCT_SHR_CONSTANT1; + DU4 UCT_SHR_CONSTANT2; + DU4 UCT_POWER; + DU4 UCT_MULTIPLICATION; + DU4 UCT_DIVISION; + DU4 UCT_REMAINDER; + DU4 UCT_AND; + DU4 UCT_OR; + DU4 UCT_XOR; + DU4 UCT_ADDITION; + DU4 UCT_SUBTRACTION; + DU4 UCT_EQUAL_EQUAL; + DU4 UCT_NOT_EQUAL_TO; + DU4 UCT_LESS_THAN; + DU4 UCT_GREATER_THAN; + DU4 UCT_LESS_OR_EQUAL; + DU4 UCT_GREATER_OR_EQUAL; + DU4 UCT_AND_AND; + DU4 UCT_OR_OR; + DU4 UCT_XOR_XOR; + DU4 UCT_COLON; + DU4 UCT_QUESTION; + DU4 UCT_ASSIGN_U8; + DU4 UCT_ASSIGN_U4; + DU4 UCT_ASSIGN_U2; + DU4 UCT_ASSIGN_U1; + DU4 UCT_SHL_EQUAL_U8; + DU4 UCT_SHL_EQUAL_U4; + DU4 UCT_SHL_EQUAL_U2; + DU4 UCT_SHL_EQUAL_U1; + DU4 UCT_SHR_EQUAL_U8; + DU4 UCT_SHR_EQUAL_U4; + DU4 UCT_SHR_EQUAL_U2; + DU4 UCT_SHR_EQUAL_U1; + DU4 UCT_MUL_EQUAL_U8; + DU4 UCT_MUL_EQUAL_U4; + DU4 UCT_MUL_EQUAL_U2; + DU4 UCT_MUL_EQUAL_U1; + DU4 UCT_DIV_EQUAL_U8; + DU4 UCT_DIV_EQUAL_U4; + DU4 UCT_DIV_EQUAL_U2; + DU4 UCT_DIV_EQUAL_U1; + DU4 UCT_AND_EQUAL_U8; + DU4 UCT_AND_EQUAL_U4; + DU4 UCT_AND_EQUAL_U2; + DU4 UCT_AND_EQUAL_U1; + DU4 UCT_OR_EQUAL_U8; + DU4 UCT_OR_EQUAL_U4; + DU4 UCT_OR_EQUAL_U2; + DU4 UCT_OR_EQUAL_U1; + DU4 UCT_XOR_EQUAL_U8; + DU4 UCT_XOR_EQUAL_U4; + DU4 UCT_XOR_EQUAL_U2; + DU4 UCT_XOR_EQUAL_U1; + DU4 UCT_ADD_EQUAL_U8; + DU4 UCT_ADD_EQUAL_U4; + DU4 UCT_ADD_EQUAL_U2; + DU4 UCT_ADD_EQUAL_U1; + DU4 UCT_SUB_EQUAL_U8; + DU4 UCT_SUB_EQUAL_U4; + DU4 UCT_SUB_EQUAL_U2; + DU4 UCT_SUB_EQUAL_U1; + DU4 UCT_ESI_ASSIGN_U4; + DU4 UCT_ESI_SHL_EQUAL_U4; + DU4 UCT_ESI_SHR_EQUAL_U4; + DU4 UCT_ESI_MUL_EQUAL_U4; + DU4 UCT_ESI_DIV_EQUAL_U4; + DU4 UCT_ESI_AND_EQUAL_U4; + DU4 UCT_ESI_OR_EQUAL_U4; + DU4 UCT_ESI_XOR_EQUAL_U4; + DU4 UCT_ESI_ADD_EQUAL_U4; + DU4 UCT_ESI_SUB_EQUAL_U4; + DU4 UCT_EDI_ASSIGN_U4; + DU4 UCT_EDI_SHL_EQUAL_U4; + DU4 UCT_EDI_SHR_EQUAL_U4; + DU4 UCT_EDI_MUL_EQUAL_U4; + DU4 UCT_EDI_DIV_EQUAL_U4; + DU4 UCT_EDI_AND_EQUAL_U4; + DU4 UCT_EDI_OR_EQUAL_U4; + DU4 UCT_EDI_XOR_EQUAL_U4; + DU4 UCT_EDI_ADD_EQUAL_U4; + DU4 UCT_EDI_SUB_EQUAL_U4; + DU4 UCT_ADD64; + DU4 UCT_ADD32; + DU4 UCT_ADD8; + DU4 UCT_INC; + DU4 UCT_SUB64; + DU4 UCT_SUB32; + DU4 UCT_SUB8; + DU4 UCT_DEC; + DU4 UCT_ENTER; + DU4 UCT_LEAVE; + DU4 UCT_ENTER1; + DU4 UCT_LEAVE1; + DU4 UCT_ENTER2; + DU4 UCT_LEAVE2; + DU4 UCT_ADD_ESP32; + DU4 UCT_ADD_ESP8; + DU4 UCT_RET; + DU4 UCT_CALL; + DU4 UCT_CALL_INDIRECT; + DU4 UCT_CALL_INDIRECT2; + DU4 UCT_IRQ; + DU4 UCT_CLI; + DU4 UCT_STI; + DU4 UCT_GET_FLAGS; + DU4 UCT_SET_FLAGS; + DU4 UCT_GET_BASE_PTR; + DU4 UCT_SET_BASE_PTR; + DU4 UCT_GET_STACK_PTR; + DU4 UCT_SET_STACK_PTR; + DU4 UCT_GET_LABEL; + DU4 UCT_ABSOLUTE_ADDRESS; + DU4 UCT_LABEL; + DU4 UCT_TYPE; + DU4 UCT_BT; + DU4 UCT_BTS; + DU4 UCT_BTR; + DU4 UCT_BTC; + DU4 UCT_BSF; + DU4 UCT_BSR; + DU4 UCT_INSQUE; + DU4 UCT_INSQUE_REV; + DU4 UCT_REMQUE; + DU4 UCT_STRLEN; + DU4 UCT_MEMCPY; + DU4 UCT_MEMSET; + DU4 UCT_INPD; + DU4 UCT_INPW; + DU4 UCT_INP; + DU4 UCT_OUTPD; + DU4 UCT_OUTPW; + DU4 UCT_OUTP; + DU4 UCT_JMP; + DU4 UCT_SHORT_JMP; + DU4 UCT_SWITCH; + DU4 UCT_SKIPZ; + DU4 UCT_SKIPZ2; + DU4 UCT_SKIPNZ; + DU4 UCT_SKIPNZ2; + DU4 UCT_EQUAL_EQUAL_SKIPZ; + DU4 UCT_EQUAL_EQUAL_SKIPZ2; + DU4 UCT_NOT_EQUAL_TO_SKIPZ; + DU4 UCT_NOT_EQUAL_TO_SKIPZ2; + DU4 UCT_LESS_THAN_SKIPZ; + DU4 UCT_LESS_THAN_SKIPZ2; + DU4 UCT_GREATER_THAN_SKIPZ; + DU4 UCT_GREATER_THAN_SKIPZ2; + DU4 UCT_LESS_OR_EQUAL_SKIPZ; + DU4 UCT_LESS_OR_EQUAL_SKIPZ2; + DU4 UCT_GREATER_OR_EQUAL_SKIPZ; + DU4 UCT_GREATER_OR_EQUAL_SKIPZ2; + DU4 UCT_AND_AND_SKIPZ; + DU4 UCT_AND_AND_SKIPZ2; + DU4 UCT_AND_AND_SKIPNZ; + DU4 UCT_AND_AND_SKIPNZ2; + DU4 UCT_OR_OR_SKIPZ; + DU4 UCT_OR_OR_SKIPZ2; + DU4 UCT_OR_OR_SKIPNZ; + DU4 UCT_OR_OR_SKIPNZ2; + DU4 UCT_LEA_DISP32_ESI; + DU4 UCT_LEA_DISP8_ESI; + DU4 UCT_LEA_DISP32_EDI; + DU4 UCT_LEA_DISP8_EDI; + DU4 UCT_PUSH_U8; + DU4 UCT_PUSH_U4; + DU4 UCT_PUSH_U2; + DU4 UCT_PUSH_U1; + DU4 UCT_PUSH_NEG_U4; + DU4 UCT_PUSH_NEG_U2; + DU4 UCT_PUSH_NEG_U1; + DU4 UCT_PUSH_DOUBLE; + DU4 UCT_PUSH_U8_DISP32; + DU4 UCT_PUSH_U8_DISP8; + DU4 UCT_PUSH_ESI_U8_DISP32; + DU4 UCT_PUSH_ESI_U8_DISP8; + DU4 UCT_PUSH_EDI_U8_DISP32; + DU4 UCT_PUSH_EDI_U8_DISP8; + DU4 UCT_PUSH_DEREF_U8; + DU4 UCT_PUSH_U8_DISP32_SCALED; + DU4 UCT_BT_CONSTANT; + DU4 UCT_BTS_CONSTANT; + DU4 UCT_BTR_CONSTANT; + DU4 UCT_BTC_CONSTANT; + DU4 UCT_ESI_NEXT_EQUAL_U4; + DU4 UCT_EDI_NEXT_EQUAL_U4; + DU4 UCT_ADD_EQUAL_U8_CONSTANT_U1; + DU4 UCT_SUB_EQUAL_U8_CONSTANT_U1; + DU4 UCT_ADD_EQUAL_U4_CONSTANT_U1; + DU4 UCT_ESI_ADD_EQUAL_U4_CONSTANT_U1; + DU4 UCT_EDI_ADD_EQUAL_U4_CONSTANT_U1; + DU4 UCT_TABLE_END; +UCT_NULL: +UCT_NOP: +UCT_END_EXP: +UCT_ZERO: + PUSH EDX + PUSH EAX + XOR EAX,EAX + XOR EDX,EDX +UCT_U8: + PUSH EDX + PUSH EAX + MOV EDX,0x12345678 + MOV EAX,0x9ABCDEF0 +UCT_U4: + PUSH EDX + PUSH EAX + XOR EDX,EDX + MOV EAX,0x12345678 +UCT_U2: //not used +UCT_U1: + PUSH EDX + PUSH EAX + XOR EDX,EDX + LEA EAX,0x12[EDX] +UCT_DOUBLE: + PUSH EDX + PUSH EAX + MOV EDX,0x12345678 + MOV EAX,0x9ABCDEF0 +UCT_STRING_CONSTANT: + PUSH EDX + PUSH EAX + XOR EDX,EDX + MOV EAX,0x12345678 +UCT_EBP: + PUSH EDX + PUSH EAX + XOR EDX,EDX + MOV EAX,EBP +UCT_FS: + PUSH EDX + PUSH EAX + XOR EDX,EDX + MOV EAX,U4 FS:[TSS_ABSOLUTE_ADDRESS] +UCT_ESI: + PUSH EDX + PUSH EAX + MOV EAX,ESI + XOR EDX,EDX +UCT_EDI: + PUSH EDX + PUSH EAX + MOV EAX,EDI + XOR EDX,EDX +UCT_TO_DOUBLE: + PUSH EDX + PUSH EAX + PUSH EBP + MOV EBP,ESP + FILD U4 4[EBP] + FSTP U4 4[EBP] + POP EBP + POP EAX + POP EDX +UCT_TO_INT: + PUSH EDX + PUSH EAX + PUSH EBP + MOV EBP,ESP + FLD U4 4[EBP] + FISTP U4 4[EBP] + POP EBP + POP EAX + POP EDX +UCT_COM: + NOT EAX + NOT EDX +UCT_NOT: + OR EAX,EDX + MOV EAX,1 + JZ @@N1 + XOR EAX,EAX +@@N1: XOR EDX,EDX +UCT_UNARY_MINUS: + NEG EAX + JC @@UM2 + DEC EDX +@@UM2: NOT EDX +UCT_ADDRESS: +UCT_U8_DISP32: + PUSH EDX + PUSH EAX + LEA EAX,U4 0x12345678[EBP] + MOV EDX,U4 4[EAX] + MOV EAX,U4 [EAX] +UCT_U4_DISP32: + PUSH EDX + PUSH EAX + XOR EDX,EDX + MOV EAX,U4 0x12345678[EBP] +UCT_U2_DISP32: + PUSH EDX + PUSH EAX + XOR EDX,EDX + MOVZX EAX,U2 0x12345678[EBP] +UCT_U1_DISP32: + PUSH EDX + PUSH EAX + XOR EDX,EDX + MOVZX EAX,U1 0x12345678[EBP] +UCT_U8_DISP8: + PUSH EDX + PUSH EAX + LEA EAX,U4 0x12[EBP] + MOV EDX,U4 4[EAX] + MOV EAX,U4 [EAX] +UCT_U4_DISP8: + PUSH EDX + PUSH EAX + XOR EDX,EDX + MOV EAX,U4 0x12[EBP] +UCT_U2_DISP8: + PUSH EDX + PUSH EAX + XOR EDX,EDX + MOVZX EAX,U2 0x12[EBP] +UCT_U1_DISP8: + PUSH EDX + PUSH EAX + XOR EDX,EDX + MOVZX EAX,U1 0x12[EBP] +UCT_FS_U8_DISP32: + PUSH EDX + PUSH EAX + MOV EDX,U4 FS:[0x12345678+4] + MOV EAX,U4 FS:[0x12345678] +UCT_FS_U4_DISP32: + PUSH EDX + PUSH EAX + XOR EDX,EDX + MOV EAX,U4 FS:[0x12345678] +UCT_FS_U2_DISP32: + PUSH EDX + PUSH EAX + XOR EDX,EDX + MOVZX EAX,U2 FS:[0x12345678] +UCT_FS_U1_DISP32: + PUSH EDX + PUSH EAX + XOR EDX,EDX + MOVZX EAX,U1 FS:[0x12345678] +UCT_ESI_U8_DISP32: + PUSH EDX + PUSH EAX + LEA EAX,U4 0x12345678[ESI] + MOV EDX,U4 4[EAX] + MOV EAX,U4 [EAX] +UCT_ESI_U4_DISP32: + PUSH EDX + PUSH EAX + XOR EDX,EDX + MOV EAX,U4 0x12345678[ESI] +UCT_ESI_U2_DISP32: + PUSH EDX + PUSH EAX + XOR EDX,EDX + MOVZX EAX,U2 0x12345678[ESI] +UCT_ESI_U1_DISP32: + PUSH EDX + PUSH EAX + XOR EDX,EDX + MOVZX EAX,U1 0x12345678[ESI] +UCT_ESI_U8_DISP8: + PUSH EDX + PUSH EAX + LEA EAX,U4 0x12[ESI] + MOV EDX,U4 4[EAX] + MOV EAX,U4 [EAX] +UCT_ESI_U4_DISP8: + PUSH EDX + PUSH EAX + XOR EDX,EDX + MOV EAX,U4 0x12[ESI] +UCT_ESI_U2_DISP8: + PUSH EDX + PUSH EAX + XOR EDX,EDX + MOVZX EAX,U2 0x12[ESI] +UCT_ESI_U1_DISP8: + PUSH EDX + PUSH EAX + XOR EDX,EDX + MOVZX EAX,U1 0x12[ESI] +UCT_EDI_U8_DISP32: + PUSH EDX + PUSH EAX + LEA EAX,U4 0x12345678[EDI] + MOV EDX,U4 4[EAX] + MOV EAX,U4 [EAX] +UCT_EDI_U4_DISP32: + PUSH EDX + PUSH EAX + XOR EDX,EDX + MOV EAX,U4 0x12345678[EDI] +UCT_EDI_U2_DISP32: + PUSH EDX + PUSH EAX + XOR EDX,EDX + MOVZX EAX,U2 0x12345678[EDI] +UCT_EDI_U1_DISP32: + PUSH EDX + PUSH EAX + XOR EDX,EDX + MOVZX EAX,U1 0x12345678[EDI] +UCT_EDI_U8_DISP8: + PUSH EDX + PUSH EAX + LEA EAX,U4 0x12[EDI] + MOV EDX,U4 4[EAX] + MOV EAX,U4 [EAX] +UCT_EDI_U4_DISP8: + PUSH EDX + PUSH EAX + XOR EDX,EDX + MOV EAX,U4 0x12[EDI] +UCT_EDI_U2_DISP8: + PUSH EDX + PUSH EAX + XOR EDX,EDX + MOVZX EAX,U2 0x12[EDI] +UCT_EDI_U1_DISP8: + PUSH EDX + PUSH EAX + XOR EDX,EDX + MOVZX EAX,U1 0x12[EDI] +UCT_DEREF_U8: + MOV EDX,U4 4[EAX] + MOV EAX,U4 [EAX] +UCT_DEREF_U4: + XOR EDX,EDX + MOV EAX,U4 [EAX] +UCT_DEREF_U2: + XOR EDX,EDX + MOVZX EAX,U2 [EAX] +UCT_DEREF_U1: + XOR EDX,EDX + MOVZX EAX,U1 [EAX] +UCT_ESI_DEREF_U8: + PUSH EDX + PUSH EAX + MOV EDX,U4 4[ESI] + MOV EAX,U4 [ESI] +UCT_ESI_DEREF_U4: + PUSH EDX + PUSH EAX + XOR EDX,EDX + MOV EAX,U4 [ESI] +UCT_ESI_DEREF_U2: + PUSH EDX + PUSH EAX + XOR EDX,EDX + MOVZX EAX,U2 [ESI] +UCT_ESI_DEREF_U1: + PUSH EDX + PUSH EAX + XOR EDX,EDX + MOVZX EAX,U1 [ESI] +UCT_EDI_DEREF_U8: + PUSH EDX + PUSH EAX + MOV EDX,U4 4[EDI] + MOV EAX,U4 [EDI] +UCT_EDI_DEREF_U4: + PUSH EDX + PUSH EAX + XOR EDX,EDX + MOV EAX,U4 [EDI] +UCT_EDI_DEREF_U2: + PUSH EDX + PUSH EAX + XOR EDX,EDX + MOVZX EAX,U2 [EDI] +UCT_EDI_DEREF_U1: + PUSH EDX + PUSH EAX + XOR EDX,EDX + MOVZX EAX,U1 [EDI] +UCT_U8_PP: + MOV EBX,EAX + MOV EAX,U4 [EBX] + MOV EDX,U4 4[EBX] + INC U4 [EBX] + JNZ UCT_U4_PP + INC U4 4[EBX] +UCT_U4_PP: + MOV EBX,EAX + MOV EAX,U4 [EBX] + INC U4 [EBX] + XOR EDX,EDX +UCT_U2_PP: + MOV EBX,EAX + MOVZX EAX,U2 [EBX] + INC U2 [EBX] + XOR EDX,EDX +UCT_U1_PP: + MOV EBX,EAX + MOVZX EAX,U1 [EBX] + INC U1 [EBX] + XOR EDX,EDX +UCT_U8_MM: + MOV EBX,EAX + MOV EAX,U4 [EBX] + MOV EDX,U4 4[EBX] + OR EAX,EAX + JNZ @@U8M + DEC U4 4[EBX] +@@U8M: DEC U4 [EBX] +UCT_U4_MM: + MOV EBX,EAX + MOV EAX,U4 [EBX] + DEC U4 [EBX] + XOR EDX,EDX +UCT_U2_MM: + MOV EBX,EAX + MOVZX EAX,U2 [EBX] + DEC U2 [EBX] + XOR EDX,EDX +UCT_U1_MM: + MOV EBX,EAX + MOVZX EAX,U1 [EBX] + DEC U1 [EBX] + XOR EDX,EDX +UCT_PP_U8: + MOV EBX,EAX + INC U4 [EBX] + JNZ @@UP8 + INC U4 4[EBX] +@@UP8: MOV EAX,U4 [EBX] + MOV EDX,U4 4[EBX] +UCT_PP_U4: + INC U4 [EAX] + MOV EAX,U4 [EAX] + XOR EDX,EDX +UCT_PP_U2: + INC U2 [EAX] + MOVZX EAX,U2 [EAX] + XOR EDX,EDX +UCT_PP_U1: + INC U1 [EAX] + MOVZX EAX,U1 [EAX] + XOR EDX,EDX +UCT_MM_U8: + MOV EBX,EAX + MOV EAX,U4 [EBX] + MOV EDX,U4 4[EBX] + OR EAX,EAX + JNZ @@UM8 + DEC EDX +@@UM8: DEC EAX + MOV U4 [EBX],EAX + MOV U4 4[EBX],EDX +UCT_MM_U4: + DEC U4 [EAX] + MOV EAX,U4 [EAX] + XOR EDX,EDX +UCT_MM_U2: + DEC U2 [EAX] + MOVZX EAX,U2 [EAX] + XOR EDX,EDX +UCT_MM_U1: + DEC U1 [EAX] + MOVZX EAX,U1 [EAX] + XOR EDX,EDX +UCT_ESI_U4_PP: + PUSH EDX + PUSH EAX + MOV EAX,ESI + INC ESI + XOR EDX,EDX +UCT_ESI_U4_MM: + PUSH EDX + PUSH EAX + MOV EAX,ESI + DEC ESI + XOR EDX,EDX +UCT_ESI_PP_U4: + PUSH EDX + PUSH EAX + INC ESI + MOV EAX,ESI + XOR EDX,EDX +UCT_ESI_MM_U4: + PUSH EDX + PUSH EAX + DEC ESI + MOV EAX,ESI + XOR EDX,EDX +UCT_EDI_U4_PP: + PUSH EDX + PUSH EAX + MOV EAX,EDI + INC EDI + XOR EDX,EDX +UCT_EDI_U4_MM: + PUSH EDX + PUSH EAX + MOV EAX,EDI + DEC EDI + XOR EDX,EDX +UCT_EDI_PP_U4: + PUSH EDX + PUSH EAX + INC EDI + MOV EAX,EDI + XOR EDX,EDX +UCT_EDI_MM_U4: + PUSH EDX + PUSH EAX + DEC EDI + MOV EAX,EDI + XOR EDX,EDX +UCT_LEA_DISP32_EBP: + PUSH EDX + PUSH EAX + XOR EDX,EDX + LEA EAX,0x12345678[EBP] +UCT_LEA_DISP8_EBP: + PUSH EDX + PUSH EAX + XOR EDX,EDX + LEA EAX,0x12[EBP] +UCT_U8_DISP32_SCALED: + LEA EAX,U4 0x12345678[EAX*8] + MOV EDX,U4 4[EAX] + MOV EAX,U4 [EAX] +UCT_U4_DISP32_SCALED: + MOV EAX,U4 0x12345678[EAX*4] + XOR EDX,EDX +UCT_U2_DISP32_SCALED: + MOVZX EAX,U2 0x12345678[EAX*2] + XOR EDX,EDX +UCT_SHL: + MOV ECX,EAX + POP EAX + POP EDX + SUB ECX,32 + JNC @@SL5 + SHLD EDX,EAX + SHL EAX,CL + JMP UCT_SHR +@@SL5: MOV EDX,EAX + XOR EAX,EAX + SHL EDX,CL +UCT_SHR: + MOV ECX,EAX + POP EAX + POP EDX + SUB CL,32 + JNC @@SR5 + SHRD EAX,EDX + SHR EDX,CL + JMP UCT_SHL_CONSTANT1 +@@SR5: MOV EAX,EDX + XOR EDX,EDX + SHR EAX,CL +UCT_SHL_CONSTANT1: + MOV CL,0x12 + SHLD EDX,EAX + SHL EAX,CL +UCT_SHL_CONSTANT2: + MOV EDX,EAX + MOV CL,0x12 + XOR EAX,EAX + SHL EDX,CL +UCT_SHR_CONSTANT1: + MOV CL,0x12 + SHRD EAX,EDX + SHR EDX,CL +UCT_SHR_CONSTANT2: + MOV EAX,EDX + MOV CL,0x12 + XOR EDX,EDX + SHR EAX,CL +UCT_POWER: +UCT_MULTIPLICATION: + POP EBX + ADD ESP,4 + MUL EBX +UCT_DIVISION: + MOV EBX,EAX + POP EAX + POP EDX + DIV EBX + XOR EDX,EDX +UCT_REMAINDER: + MOV EBX,EAX + POP EAX + POP EDX + DIV EBX + MOV EAX,EDX + XOR EDX,EDX +UCT_AND: + POP EBX + POP ECX + AND EAX,EBX + AND EDX,ECX +UCT_OR: + POP EBX + POP ECX + OR EAX,EBX + OR EDX,ECX +UCT_XOR: + POP EBX + POP ECX + XOR EAX,EBX + XOR EDX,ECX +UCT_ADDITION: + POP EBX + POP ECX + ADD EAX,EBX + ADC EDX,ECX +UCT_SUBTRACTION: + POP EBX + POP ECX + XCHG EAX,EBX + XCHG EDX,ECX + SUB EAX,EBX + SBB EDX,ECX +UCT_EQUAL_EQUAL: + POP EBX + POP ECX + SUB EBX,EAX + SBB ECX,EDX + XOR EDX,EDX + XOR EAX,EAX + OR EBX,ECX + JNZ UCT_NOT_EQUAL_TO + INC EAX +UCT_NOT_EQUAL_TO: + POP EBX + POP ECX + SUB EBX,EAX + SBB ECX,EDX + XOR EDX,EDX + XOR EAX,EAX + OR EBX,ECX + JZ UCT_LESS_THAN + INC EAX +UCT_LESS_THAN: + POP EBX + POP ECX + SUB EBX,EAX + SBB ECX,EDX + MOV EAX,0 + ADC EAX,0 + XOR EDX,EDX +UCT_GREATER_THAN: + POP EBX + POP ECX + SUB EAX,EBX + SBB EDX,ECX + MOV EAX,0 + ADC EAX,0 + XOR EDX,EDX +UCT_LESS_OR_EQUAL: + POP EBX + POP ECX + SUB EAX,EBX + SBB EDX,ECX + MOV EAX,1 + SBB EAX,0 + XOR EDX,EDX +UCT_GREATER_OR_EQUAL: + POP EBX + POP ECX + SUB EBX,EAX + SBB ECX,EDX + MOV EAX,1 + SBB EAX,0 + XOR EDX,EDX +UCT_AND_AND: + POP EBX + POP ECX + OR EAX,EDX + OR EBX,ECX + AND EAX,EAX + JZ @@AA2 + XOR EAX,EAX + AND EBX,EBX + JZ @@AA2 + INC EAX +@@AA2: XOR EDX,EDX +UCT_OR_OR: + POP EBX + POP ECX + OR EDX,ECX + OR EAX,EBX + OR EAX,EDX + JZ @@OO2 + MOV EAX,1 +@@OO2: XOR EDX,EDX +UCT_XOR_XOR: + POP EBX + POP ECX + OR EAX,EDX + JZ @@XX1 + MOV EAX,1 +@@XX1: OR EBX,ECX + JZ @@XX2 + MOV EBX,1 +@@XX2: XOR EAX,EBX + XOR EDX,EDX +UCT_COLON: + PUSH EBP + MOV EBP,ESP + MOV EBX,12[EBP] + OR EBX,EBX + JZ @@C2 + MOV EAX,4[EBP] + MOV EDX,8[EBP] +@@C2: POP EBP + ADD ESP,16 +UCT_QUESTION: +UCT_ASSIGN_U8: + POP EBX + ADD ESP,4 + MOV U4 [EBX],EAX + MOV U4 4[EBX],EDX +UCT_ASSIGN_U4: + POP EBX + ADD ESP,4 + MOV U4 [EBX],EAX +UCT_ASSIGN_U2: + POP EBX + ADD ESP,4 + MOV U2 [EBX],AX +UCT_ASSIGN_U1: + POP EBX + ADD ESP,4 + MOV U1 [EBX],AL +UCT_SHL_EQUAL_U8: + POP EBX + ADD ESP,4 + MOV ECX,EAX + MOV EAX,U4 [EBX] + MOV EDX,U4 4[EBX] + SUB ECX,32 + JNC @@SL6 + SHLD EDX,EAX + SHL EAX,CL + JMP @@SL7 +@@SL6: MOV EDX,EAX + XOR EAX,EAX + SHL EDX,CL +@@SL7: MOV U4 [EBX],EAX + MOV U4 4[EBX],EDX +UCT_SHL_EQUAL_U4: + POP EBX + ADD ESP,4 + MOV CL,AL + SHL U4 [EBX],CL + MOV EAX,U4 [EBX] + XOR EDX,EDX +UCT_SHL_EQUAL_U2: + POP EBX + ADD ESP,4 + MOV CL,AL + SHL U2 [EBX],CL + MOVZX EAX,U2 [EBX] + XOR EDX,EDX +UCT_SHL_EQUAL_U1: + POP EBX + ADD ESP,4 + MOV CL,AL + SHL U1 [EBX],CL + MOVZX EAX,U1 [EBX] + XOR EDX,EDX +UCT_SHR_EQUAL_U8: + POP EBX + ADD ESP,4 + MOV ECX,EAX + MOV EAX,U4[EBX] + MOV EDX,U4 4[EBX] + SUB ECX,32 + JNC @@SR8 + SHRD EAX,EDX + SHR EDX,CL + JMP @@SR9 +@@SR8: MOV EAX,EDX + XOR EDX,EDX + SHR EAX,CL +@@SR9: MOV U4 [EBX],EAX + MOV U4 4[EBX],EDX +UCT_SHR_EQUAL_U4: + POP EBX + ADD ESP,4 + MOV CL,AL + SHR U4 [EBX],CL + MOV EAX,U4 [EBX] + XOR EDX,EDX +UCT_SHR_EQUAL_U2: + POP EBX + ADD ESP,4 + MOV CL,AL + SHR U2 [EBX],CL + MOVZX EAX,U2 [EBX] + XOR EDX,EDX +UCT_SHR_EQUAL_U1: + POP EBX + ADD ESP,4 + MOV CL,AL + SHR U1 [EBX],CL + MOVZX EAX,U1 [EBX] + XOR EDX,EDX +UCT_MUL_EQUAL_U8: + POP EBX + ADD ESP,4 + MOV EDX,U4 [EBX] + MUL EDX + MOV U4 [EBX],EAX + MOV U4 4[EBX],EDX +UCT_MUL_EQUAL_U4: + POP EBX + ADD ESP,4 + MOV EDX,U4 [EBX] + MUL EDX + MOV U4 [EBX],EAX + XOR EDX,EDX +UCT_MUL_EQUAL_U2: + POP EBX + ADD ESP,4 + MOVZX EDX,U2 [EBX] + MUL EDX + MOV U2 [EBX],AX + MOVZX EAX,AX + XOR EDX,EDX +UCT_MUL_EQUAL_U1: + POP EBX + ADD ESP,4 + MOVZX EDX,U1 [EBX] + MUL EDX + MOV U1 [EBX],AL + MOVZX EAX,AL + XOR EDX,EDX +UCT_DIV_EQUAL_U8: + POP EBX + ADD ESP,4 + MOV ECX,EAX + MOV EAX,U4 [EBX] + MOV EDX,U4 4[EBX] + DIV ECX + MOV U4 [EBX],EAX + XOR EDX,EDX + MOV U4 4[EBX],EDX +UCT_DIV_EQUAL_U4: + POP EBX + ADD ESP,4 + MOV ECX,EAX + MOV EAX,U4 [EBX] + XOR EDX,EDX + DIV ECX + MOV U4 [EBX],EAX + XOR EDX,EDX +UCT_DIV_EQUAL_U2: + POP EBX + ADD ESP,4 + MOV ECX,EAX + MOVZX EAX,U2 [EBX] + XOR EDX,EDX + DIV ECX + MOV U2 [EBX],AX + MOVZX EAX,AX + XOR EDX,EDX +UCT_DIV_EQUAL_U1: + POP EBX + ADD ESP,4 + MOV ECX,EAX + MOVZX EAX,U1 [EBX] + XOR EDX,EDX + DIV ECX + MOV U1 [EBX],AL + MOVZX EAX,AL + XOR EDX,EDX +UCT_AND_EQUAL_U8: + POP EBX + ADD ESP,4 + AND U4 [EBX],EAX + MOV EAX,U4 [EBX] + AND U4 4[EBX],EDX + MOV EDX,U4 4[EBX] +UCT_AND_EQUAL_U4: + POP EBX + ADD ESP,4 + AND U4 [EBX],EAX + MOV EAX,U4 [EBX] + XOR EDX,EDX +UCT_AND_EQUAL_U2: + POP EBX + ADD ESP,4 + AND U2 [EBX],AX + MOVZX EAX,U2 [EBX] + XOR EDX,EDX +UCT_AND_EQUAL_U1: + POP EBX + ADD ESP,4 + AND U1 [EBX],AL + MOVZX EAX,U1 [EBX] + XOR EDX,EDX +UCT_OR_EQUAL_U8: + POP EBX + ADD ESP,4 + OR U4 [EBX],EAX + MOV EAX,U4 [EBX] + OR U4 4[EBX],EDX + MOV EDX,U4 4[EBX] +UCT_OR_EQUAL_U4: + POP EBX + ADD ESP,4 + OR U4 [EBX],EAX + MOV EAX,U4 [EBX] + XOR EDX,EDX +UCT_OR_EQUAL_U2: + POP EBX + ADD ESP,4 + OR U2 [EBX],AX + MOVZX EAX,U2 [EBX] + XOR EDX,EDX +UCT_OR_EQUAL_U1: + POP EBX + ADD ESP,4 + OR U1 [EBX],AL + MOVZX EAX,U1 [EBX] + XOR EDX,EDX +UCT_XOR_EQUAL_U8: + POP EBX + ADD ESP,4 + XOR U4 [EBX],EAX + MOV EAX,U4 [EBX] + XOR U4 4[EBX],EDX + MOV EDX,U4 4[EBX] +UCT_XOR_EQUAL_U4: + POP EBX + ADD ESP,4 + XOR U4 [EBX],EAX + MOV EAX,U4 [EBX] + XOR EDX,EDX +UCT_XOR_EQUAL_U2: + POP EBX + ADD ESP,4 + XOR U2 [EBX],AX + MOVZX EAX,U2 [EBX] + XOR EDX,EDX +UCT_XOR_EQUAL_U1: + POP EBX + ADD ESP,4 + XOR U1 [EBX],AL + MOVZX EAX,U1 [EBX] + XOR EDX,EDX +UCT_ADD_EQUAL_U8: + POP EBX + ADD ESP,4 + ADD U4 [EBX],EAX + MOV EAX,U4 [EBX] + ADC U4 4[EBX],EDX + MOV EDX,U4 4[EBX] +UCT_ADD_EQUAL_U4: + POP EBX + ADD ESP,4 + ADD U4 [EBX],EAX + MOV EAX,U4 [EBX] + XOR EDX,EDX +UCT_ADD_EQUAL_U2: + POP EBX + ADD ESP,4 + ADD U2 [EBX],AX + MOVZX EAX,U2 [EBX] + XOR EDX,EDX +UCT_ADD_EQUAL_U1: + POP EBX + ADD ESP,4 + ADD U1 [EBX],AL + MOVZX EAX,U1 [EBX] + XOR EDX,EDX +UCT_SUB_EQUAL_U8: + POP EBX + ADD ESP,4 + SUB U4 [EBX],EAX + MOV EAX,U4 [EBX] + SBB U4 4[EBX],EDX + MOV EDX,U4 4[EBX] +UCT_SUB_EQUAL_U4: + POP EBX + ADD ESP,4 + SUB U4 [EBX],EAX + MOV EAX,U4 [EBX] + XOR EDX,EDX +UCT_SUB_EQUAL_U2: + POP EBX + ADD ESP,4 + SUB U2 [EBX],AX + MOVZX EAX,U2 [EBX] + XOR EDX,EDX +UCT_SUB_EQUAL_U1: + POP EBX + ADD ESP,4 + SUB U1 [EBX],AL + MOVZX EAX,U1 [EBX] + XOR EDX,EDX +UCT_ESI_ASSIGN_U4: + MOV ESI,EAX +UCT_ESI_SHL_EQUAL_U4: + MOV ECX,EAX + SHL ESI,CL + MOV EAX,ESI + XOR EDX,EDX +UCT_ESI_SHR_EQUAL_U4: + MOV ECX,EAX + SHR ESI,CL + MOV EAX,ESI + XOR EDX,EDX +UCT_ESI_MUL_EQUAL_U4: + MOV EDX,ESI + MUL EDX + MOV ESI,EAX + XOR EDX,EDX +UCT_ESI_DIV_EQUAL_U4: + MOV ECX,EAX + MOV EAX,ESI + XOR EDX,EDX + DIV ECX + MOV ESI,EAX + XOR EDX,EDX +UCT_ESI_AND_EQUAL_U4: + AND ESI,EAX + MOV EAX,ESI + XOR EDX,EDX +UCT_ESI_OR_EQUAL_U4: + OR ESI,EAX + MOV EAX,ESI + XOR EDX,EDX +UCT_ESI_XOR_EQUAL_U4: + XOR ESI,EAX + MOV EAX,ESI + XOR EDX,EDX +UCT_ESI_ADD_EQUAL_U4: + ADD ESI,EAX + MOV EAX,ESI + XOR EDX,EDX +UCT_ESI_SUB_EQUAL_U4: + SUB ESI,EAX + MOV EAX,ESI + XOR EDX,EDX +UCT_EDI_ASSIGN_U4: + MOV EDI,EAX +UCT_EDI_SHL_EQUAL_U4: + MOV ECX,EAX + SHL EDI,CL + MOV EAX,EDI + XOR EDX,EDX +UCT_EDI_SHR_EQUAL_U4: + MOV ECX,EAX + SHR EDI,CL + MOV EAX,EDI + XOR EDX,EDX +UCT_EDI_MUL_EQUAL_U4: + MOV EDX,EDI + MUL EDX + MOV EDI,EAX + XOR EDX,EDX +UCT_EDI_DIV_EQUAL_U4: + MOV ECX,EAX + MOV EAX,EDI + XOR EDX,EDX + DIV ECX + MOV EDI,EAX + XOR EDX,EDX +UCT_EDI_AND_EQUAL_U4: + AND EDI,EAX + MOV EAX,EDI + XOR EDX,EDX +UCT_EDI_OR_EQUAL_U4: + OR EDI,EAX + MOV EAX,EDI + XOR EDX,EDX +UCT_EDI_XOR_EQUAL_U4: + XOR EDI,EAX + MOV EAX,EDI + XOR EDX,EDX +UCT_EDI_ADD_EQUAL_U4: + ADD EDI,EAX + MOV EAX,EDI + XOR EDX,EDX +UCT_EDI_SUB_EQUAL_U4: + SUB EDI,EAX + MOV EAX,EDI + XOR EDX,EDX +UCT_ADD64: + ADD EAX,0x12345678 + ADC EDX,0 //TODO +UCT_ADD32: + ADD EAX,0x12345678 + ADC EDX,0 +UCT_ADD8: + ADD EAX,0x12 + ADC EDX,0 +UCT_INC: + INC EAX + JNZ UCT_SUB64 + INC EDX +UCT_SUB64: + SUB EAX,0x12345678 + SBB EDX,0 //TODO +UCT_SUB32: + SUB EAX,0x12345678 + SBB EDX,0 +UCT_SUB8: + SUB EAX,0x12 + SBB EDX,0 +UCT_DEC: + OR EAX,EAX + JNZ @@UD2 + DEC EDX +@@UD2: DEC EAX +UCT_ENTER: + PUSH EBP + MOV EBP,ESP + SUB ESP,0x012345678 +UCT_LEAVE: + ADD ESP,0x012345678 + POP EBP + RET +UCT_ENTER1: + PUSH EBP + MOV EBP,ESP + SUB ESP,0x012345678 + PUSH ESI + MOV ESI,U4 0x12345678[EBP] +UCT_LEAVE1: + POP ESI + ADD ESP,0x012345678 + POP EBP + RET +UCT_ENTER2: + PUSH EBP + MOV EBP,ESP + SUB ESP,0x012345678 + PUSH ESI + PUSH EDI + MOV ESI,U4 0x12345678[EBP] + MOV EDI,U4 0x12345678[EBP] +UCT_LEAVE2: + POP EDI + POP ESI + ADD ESP,0x012345678 + POP EBP + RET +UCT_ADD_ESP32: + ADD ESP,0x12345678 +UCT_ADD_ESP8: + ADD ESP,0x12 +UCT_RET: + RET +UCT_CALL: + PUSH EDX + PUSH EAX + CALL UCT_CALL +UCT_CALL_INDIRECT: + PUSH EDX + PUSH EAX + MOV EAX,ESP + CALL U4 0x12345678[EAX] +UCT_CALL_INDIRECT2: + PUSH EDX + PUSH EAX + CALL U4 [0x12345678] +UCT_IRQ: + INT I_COUT //Gets patched +UCT_CLI: + PUSH EDX + PUSH EAX + CLI +UCT_STI: + PUSH EDX + PUSH EAX + STI +UCT_GET_FLAGS: + PUSH EDX + PUSH EAX + PUSHFD + POP EAX + XOR EDX,EDX +UCT_SET_FLAGS: + PUSH EAX + POPFD +UCT_GET_BASE_PTR: + PUSH EDX + PUSH EAX + MOV EAX,EBP + XOR EDX,EDX +UCT_SET_BASE_PTR: + MOV EBP,EAX +UCT_GET_STACK_PTR: + PUSH EDX + PUSH EAX + MOV EAX,ESP + XOR EDX,EDX +UCT_SET_STACK_PTR: + MOV ESP,EAX +UCT_GET_LABEL: + PUSH EDX + PUSH EAX + XOR EDX,EDX + MOV EAX,0x12345678 +UCT_ABSOLUTE_ADDRESS: + PUSH EDX + PUSH EAX + XOR EDX,EDX + MOV EAX,0x12345678 +UCT_LABEL: +UCT_TYPE: + PUSH EDX + PUSH EAX + XOR EDX,EDX + MOV EAX,0x12345678 +UCT_BT: + MOV EBX,EAX + POP EDX + ADD ESP,4 + XOR EAX,EAX + BT U4 [EBX],EDX + ADC EAX,0 + XOR EDX,EDX +UCT_BTS: + MOV EBX,EAX + POP EDX + ADD ESP,4 + XOR EAX,EAX + BTS U4 [EBX],EDX + ADC EAX,0 + XOR EDX,EDX +UCT_BTR: + MOV EBX,EAX + POP EDX + ADD ESP,4 + XOR EAX,EAX + BTR U4 [EBX],EDX + ADC EAX,0 + XOR EDX,EDX +UCT_BTC: + MOV EBX,EAX + POP EDX + ADD ESP,4 + XOR EAX,EAX + BTC U4 [EBX],EDX + ADC EAX,0 + XOR EDX,EDX +UCT_BSF: + BSF EAX,EAX + JNZ @@BSF1 + NOT EAX +@@BSF1: CDQ +UCT_BSR: + BSR EAX,EAX + JNZ @@BSR1 + NOT EAX +@@BSR1: CDQ +UCT_INSQUE: + POP EDX + ADD ESP,4 + MOV EBX,[EDX] + MOV [EDX],EAX + MOV [EAX],EBX + MOV 4[EAX],EDX + MOV 4[EBX],EAX +UCT_INSQUE_REV: + POP EDX + ADD ESP,4 + MOV EBX,4[EDX] + MOV [EBX],EAX + MOV [EAX],EDX + MOV 4[EAX],EBX + MOV 4[EDX],EAX +UCT_REMQUE: + MOV EBX,[EAX] + MOV EDX,4[EAX] + MOV [EDX],EBX + MOV 4[EBX],EDX +UCT_STRLEN: + MOV EDX,EAX +@@SL3: MOV BL,U1 [EAX] + INC EAX + OR BL,BL + JNZ @@SL3 + SUB EAX,EDX + DEC EAX + XOR EDX,EDX +UCT_MEMCPY: + PUSH EDX + PUSH EAX + PUSH EBP + MOV EBP,ESP + PUSH ESI + PUSH EDI + MOV EDI,4[EBP] + MOV ESI,12[EBP] + MOV ECX,20[EBP] + OR ECX,ECX + JZ @@1 + REP_MOVSB +@@1: POP EDI + POP ESI + POP EBP + ADD ESP,24 +UCT_MEMSET: + PUSH EDX + PUSH EAX + PUSH EBP + MOV EBP,ESP + PUSH EDI + MOV EDI,4[EBP] + MOV ECX,20[EBP] + MOV EAX,12[EBP] + OR ECX,ECX + JZ @@2 + REP_STOSB +@@2: POP EDI + POP EBP + ADD ESP,24 +UCT_INPD: + MOV EDX,EAX + IN EAX,DX + XOR EDX,EDX +UCT_INPW: + MOV EDX,EAX + XOR EAX,EAX + IN AX,DX + XOR EDX,EDX +UCT_INP: + MOV EDX,EAX + XOR EAX,EAX + IN AL,DX + XOR EDX,EDX +UCT_OUTPD: + MOV EDX,EAX + POP EAX + ADD ESP,4 + OUT DX,EAX +UCT_OUTPW: + MOV EDX,EAX + POP EAX + ADD ESP,4 + OUT DX,AX +UCT_OUTP: + MOV EDX,EAX + POP EAX + ADD ESP,4 + OUT DX,AL +UCT_JMP: + JMP U4 FAR_AWAY +UCT_SHORT_JMP: + JMP UCT_SHORT_JMP +UCT_SWITCH: + POP EBX + ADD ESP,12 + CMP EBX,EAX + JAE UCT_SKIPZ + JMP U4 0x12345678[EBX*4] +UCT_SKIPZ: + OR EAX,EDX + JZ UCT_SKIPZ +UCT_SKIPZ2: + OR EAX,EDX + JNZ UCT_SKIPNZ + JMP U4 FAR_AWAY +UCT_SKIPNZ: + OR EAX,EDX + JNZ UCT_SKIPNZ +UCT_SKIPNZ2: + OR EAX,EDX + JZ UCT_EQUAL_EQUAL_SKIPZ + JMP U4 FAR_AWAY +UCT_EQUAL_EQUAL_SKIPZ: + POP EBX + POP ECX + CMP ECX,EDX + JNE @@EE2B + CMP EBX,EAX +@@EE2B: JNE UCT_EQUAL_EQUAL_SKIPZ +UCT_EQUAL_EQUAL_SKIPZ2: + POP EBX + POP ECX + CMP ECX,EDX + JNE @@EE2C + CMP EBX,EAX +@@EE2C: JNE U4 FAR_AWAY +UCT_NOT_EQUAL_TO_SKIPZ: + POP EBX + POP ECX + CMP ECX,EDX + JNE @@NE2B + CMP EBX,EAX +@@NE2B: JE UCT_NOT_EQUAL_TO_SKIPZ +UCT_NOT_EQUAL_TO_SKIPZ2: + POP EBX + POP ECX + CMP ECX,EDX + JNE @@NE2C + CMP EBX,EAX +@@NE2C: JE U4 FAR_AWAY +UCT_LESS_THAN_SKIPZ: + POP EBX + POP ECX + SUB EBX,EAX + SBB ECX,EDX + JNC UCT_LESS_THAN_SKIPZ +UCT_LESS_THAN_SKIPZ2: + POP EBX + POP ECX + SUB EBX,EAX + SBB ECX,EDX + JNC U4 FAR_AWAY +UCT_GREATER_THAN_SKIPZ: + POP EBX + POP ECX + SUB EAX,EBX + SBB EDX,ECX + JNC UCT_GREATER_THAN_SKIPZ +UCT_GREATER_THAN_SKIPZ2: + POP EBX + POP ECX + SUB EAX,EBX + SBB EDX,ECX + JNC U4 FAR_AWAY +UCT_LESS_OR_EQUAL_SKIPZ: + POP EBX + POP ECX + SUB EAX,EBX + SBB EDX,ECX + JC UCT_LESS_OR_EQUAL_SKIPZ +UCT_LESS_OR_EQUAL_SKIPZ2: + POP EBX + POP ECX + SUB EAX,EBX + SBB EDX,ECX + JC U4 FAR_AWAY +UCT_GREATER_OR_EQUAL_SKIPZ: + POP EBX + POP ECX + SUB EBX,EAX + SBB ECX,EDX + JC UCT_GREATER_OR_EQUAL_SKIPZ +UCT_GREATER_OR_EQUAL_SKIPZ2: + POP EBX + POP ECX + SUB EBX,EAX + SBB ECX,EDX + JC U4 FAR_AWAY +UCT_AND_AND_SKIPZ: + POP EBX + POP ECX + OR EAX,EDX + JZ @@AAZ1 + OR EBX,ECX +@@AAZ1: JZ UCT_AND_AND_SKIPZ +UCT_AND_AND_SKIPZ2: + POP EBX + POP ECX + OR EAX,EDX + JZ @@AAZ2 + OR EBX,ECX +@@AAZ2: JZ U4 FAR_AWAY +UCT_AND_AND_SKIPNZ: + POP EBX + POP ECX + OR EAX,EDX + JZ UCT_AND_AND_SKIPNZ2 + OR EBX,ECX + JNZ UCT_AND_AND_SKIPNZ +UCT_AND_AND_SKIPNZ2: + POP EBX + POP ECX + OR EAX,EDX + JZ UCT_OR_OR_SKIPZ + OR EBX,ECX + JNZ U4 FAR_AWAY +UCT_OR_OR_SKIPZ: + POP EBX + POP ECX + OR EAX,EDX + OR EBX,ECX + OR EAX,EBX + JZ UCT_OR_OR_SKIPZ +UCT_OR_OR_SKIPZ2: + POP EBX + POP ECX + OR EAX,EDX + OR EBX,ECX + OR EAX,EBX + JZ U4 FAR_AWAY +UCT_OR_OR_SKIPNZ: + POP EBX + POP ECX + OR EAX,EDX + OR EBX,ECX + OR EAX,EBX + JNZ UCT_OR_OR_SKIPNZ +UCT_OR_OR_SKIPNZ2: + POP EBX + POP ECX + OR EAX,EDX + OR EBX,ECX + OR EAX,EBX + JNZ U4 FAR_AWAY +UCT_LEA_DISP32_ESI: + PUSH EDX + PUSH EAX + XOR EDX,EDX + LEA EAX,0x12345678[ESI] +UCT_LEA_DISP8_ESI: + PUSH EDX + PUSH EAX + XOR EDX,EDX + LEA EAX,0x12[ESI] +UCT_LEA_DISP32_EDI: + PUSH EDX + PUSH EAX + XOR EDX,EDX + LEA EAX,0x12345678[EDI] +UCT_LEA_DISP8_EDI: + PUSH EDX + PUSH EAX + XOR EDX,EDX + LEA EAX,0x12[EDI] +UCT_PUSH_U8: + PUSH EDX + PUSH EAX + PUSH U4 0x12345678 + PUSH U4 0x9ABCDEF0 +UCT_PUSH_U4: + PUSH EDX + PUSH EAX + PUSH 0 + PUSH U4 0x9ABCDEF0 +UCT_PUSH_U2: + PUSH EDX + PUSH EAX + PUSH 0 + PUSH U4 0x9ABCDEF0 +UCT_PUSH_U1: + PUSH EDX + PUSH EAX + PUSH 0 + PUSH 0x12 +UCT_PUSH_NEG_U4: + PUSH EDX + PUSH EAX + PUSH -1 + PUSH U4 0x9ABCDEF0 +UCT_PUSH_NEG_U2: + PUSH EDX + PUSH EAX + PUSH -1 + PUSH U4 0x9ABCDEF0 +UCT_PUSH_NEG_U1: + PUSH EDX + PUSH EAX + PUSH -1 + PUSH 0x12 +UCT_PUSH_DOUBLE: + PUSH EDX + PUSH EAX + PUSH U4 0x12345678 + PUSH U4 0x9ABCDEF0 +UCT_PUSH_U8_DISP32: + PUSH EDX + PUSH EAX + LEA EAX,U4 0x12345678[EBP] + PUSH U4 4[EAX] + PUSH U4 [EAX] +UCT_PUSH_U8_DISP8: + PUSH EDX + PUSH EAX + LEA EAX,U4 0x12[EBP] + PUSH U4 4[EAX] + PUSH U4 [EAX] +UCT_PUSH_ESI_U8_DISP32: + PUSH EDX + PUSH EAX + LEA EAX,U4 0x12345678[ESI] + PUSH U4 4[EAX] + PUSH U4 [EAX] +UCT_PUSH_ESI_U8_DISP8: + PUSH EDX + PUSH EAX + LEA EAX,U4 0x12[ESI] + PUSH U4 4[EAX] + PUSH U4 [EAX] +UCT_PUSH_EDI_U8_DISP32: + PUSH EDX + PUSH EAX + LEA EAX,U4 0x12345678[EDI] + PUSH U4 4[EAX] + PUSH U4 [EAX] +UCT_PUSH_EDI_U8_DISP8: + PUSH EDX + PUSH EAX + LEA EAX,U4 0x12[EDI] + PUSH U4 4[EAX] + PUSH U4 [EAX] +UCT_PUSH_DEREF_U8: + PUSH U4 4[EAX] + PUSH U4 [EAX] +UCT_PUSH_U8_DISP32_SCALED: + LEA EAX,U4 0x12345678[EAX*8] + PUSH U4 4[EAX] + PUSH U4 [EAX] +UCT_BT_CONSTANT: + MOV EBX,EAX + XOR EAX,EAX + BT U4 [EBX],0x12 + ADC EAX,0 + XOR EDX,EDX +UCT_BTS_CONSTANT: + MOV EBX,EAX + XOR EAX,EAX + BTS U4 [EBX],0x12 + ADC EAX,0 + XOR EDX,EDX +UCT_BTR_CONSTANT: + MOV EBX,EAX + XOR EAX,EAX + BTR U4 [EBX],0x12 + ADC EAX,0 + XOR EDX,EDX +UCT_BTC_CONSTANT: + MOV EBX,EAX + XOR EAX,EAX + BTC U4 [EBX],0x12 + ADC EAX,0 + XOR EDX,EDX +UCT_ESI_NEXT_EQUAL_U4: + PUSH EDX + PUSH EAX + MOV ESI,U4 [ESI] + MOV EAX,ESI + XOR EDX,EDX +UCT_EDI_NEXT_EQUAL_U4: + PUSH EDX + PUSH EAX + MOV EDI,U4 [EDI] + MOV EAX,EDI + XOR EDX,EDX +UCT_ADD_EQUAL_U8_CONSTANT_U1: + MOV EBX,EAX + ADD U4 [EBX],0x12 + ADC U4 4[EBX],0 + MOV EAX,U4 [EBX] + MOV EDX,U4 4[EBX] +UCT_SUB_EQUAL_U8_CONSTANT_U1: + MOV EBX,EAX + SUB U4 [EBX],0x12 + SBB U4 4[EBX],0 + MOV EAX,U4 [EBX] + MOV EDX,U4 4[EBX] +UCT_ADD_EQUAL_U4_CONSTANT_U1: + ADD U4 [EAX],0x12 + MOV EAX,U4 [EAX] + XOR EDX,EDX +UCT_ESI_ADD_EQUAL_U4_CONSTANT_U1: + PUSH EDX + PUSH EAX + ADD ESI,0x12 + MOV EAX,ESI + XOR EDX,EDX +UCT_EDI_ADD_EQUAL_U4_CONSTANT_U1: + PUSH EDX + PUSH EAX + ADD EDI,0x12 + MOV EAX,EDI + XOR EDX,EDX +UCT_TABLE_END: + ALIGN 8,0x90 +DOUBLE_CODE_TABLE:: + DU4 DCT_NULL; + DU4 DCT_NOP; + DU4 DCT_END_EXP; + DU4 DCT_ZERO; + DU4 DCT_U8; + DU4 DCT_U4; + DU4 DCT_U2; + DU4 DCT_U1; + DU4 DCT_DOUBLE; + DU4 DCT_STRING_CONSTANT; + DU4 DCT_EBP; + DU4 DCT_FS; + DU4 DCT_ESI; + DU4 DCT_EDI; + DU4 DCT_TO_DOUBLE; + DU4 DCT_TO_INT; + DU4 DCT_COM; + DU4 DCT_NOT; + DU4 DCT_UNARY_MINUS; + DU4 DCT_ADDRESS; + DU4 DCT_U8_DISP32; + DU4 DCT_U4_DISP32; + DU4 DCT_U2_DISP32; + DU4 DCT_U1_DISP32; + DU4 DCT_U8_DISP8; + DU4 DCT_U4_DISP8; + DU4 DCT_U2_DISP8; + DU4 DCT_U1_DISP8; + DU4 DCT_FS_U8_DISP32; + DU4 DCT_FS_U4_DISP32; + DU4 DCT_FS_U2_DISP32; + DU4 DCT_FS_U1_DISP32; + DU4 DCT_ESI_U8_DISP32; + DU4 DCT_ESI_U4_DISP32; + DU4 DCT_ESI_U2_DISP32; + DU4 DCT_ESI_U1_DISP32; + DU4 DCT_ESI_U8_DISP8; + DU4 DCT_ESI_U4_DISP8; + DU4 DCT_ESI_U2_DISP8; + DU4 DCT_ESI_U1_DISP8; + DU4 DCT_EDI_U8_DISP32; + DU4 DCT_EDI_U4_DISP32; + DU4 DCT_EDI_U2_DISP32; + DU4 DCT_EDI_U1_DISP32; + DU4 DCT_EDI_U8_DISP8; + DU4 DCT_EDI_U4_DISP8; + DU4 DCT_EDI_U2_DISP8; + DU4 DCT_EDI_U1_DISP8; + DU4 DCT_DEREF_U8; + DU4 DCT_DEREF_U4; + DU4 DCT_DEREF_U2; + DU4 DCT_DEREF_U1; + DU4 DCT_ESI_DEREF_U8; + DU4 DCT_ESI_DEREF_U4; + DU4 DCT_ESI_DEREF_U2; + DU4 DCT_ESI_DEREF_U1; + DU4 DCT_EDI_DEREF_U8; + DU4 DCT_EDI_DEREF_U4; + DU4 DCT_EDI_DEREF_U2; + DU4 DCT_EDI_DEREF_U1; + DU4 DCT_U8_PP; + DU4 DCT_U4_PP; + DU4 DCT_U2_PP; + DU4 DCT_U1_PP; + DU4 DCT_U8_MM; + DU4 DCT_U4_MM; + DU4 DCT_U2_MM; + DU4 DCT_U1_MM; + DU4 DCT_PP_U8; + DU4 DCT_PP_U4; + DU4 DCT_PP_U2; + DU4 DCT_PP_U1; + DU4 DCT_MM_U8; + DU4 DCT_MM_U4; + DU4 DCT_MM_U2; + DU4 DCT_MM_U1; + DU4 DCT_ESI_U4_PP; + DU4 DCT_ESI_U4_MM; + DU4 DCT_ESI_PP_U4; + DU4 DCT_ESI_MM_U4; + DU4 DCT_EDI_U4_PP; + DU4 DCT_EDI_U4_MM; + DU4 DCT_EDI_PP_U4; + DU4 DCT_EDI_MM_U4; + DU4 DCT_LEA_DISP32_EBP; + DU4 DCT_LEA_DISP8_EBP; + DU4 DCT_U8_DISP32_SCALED; + DU4 DCT_U4_DISP32_SCALED; + DU4 DCT_U2_DISP32_SCALED; + DU4 DCT_SHL; + DU4 DCT_SHR; + DU4 DCT_SHL_CONSTANT1; + DU4 DCT_SHL_CONSTANT2; + DU4 DCT_SHR_CONSTANT1; + DU4 DCT_SHR_CONSTANT2; + DU4 DCT_POWER; + DU4 DCT_MULTIPLICATION; + DU4 DCT_DIVISION; + DU4 DCT_REMAINDER; + DU4 DCT_AND; + DU4 DCT_OR; + DU4 DCT_XOR; + DU4 DCT_ADDITION; + DU4 DCT_SUBTRACTION; + DU4 DCT_EQUAL_EQUAL; + DU4 DCT_NOT_EQUAL_TO; + DU4 DCT_LESS_THAN; + DU4 DCT_GREATER_THAN; + DU4 DCT_LESS_OR_EQUAL; + DU4 DCT_GREATER_OR_EQUAL; + DU4 DCT_AND_AND; + DU4 DCT_OR_OR; + DU4 DCT_XOR_XOR; + DU4 DCT_COLON; + DU4 DCT_QUESTION; + DU4 DCT_ASSIGN_U8; + DU4 DCT_ASSIGN_U4; + DU4 DCT_ASSIGN_U2; + DU4 DCT_ASSIGN_U1; + DU4 DCT_SHL_EQUAL_U8; + DU4 DCT_SHL_EQUAL_U4; + DU4 DCT_SHL_EQUAL_U2; + DU4 DCT_SHL_EQUAL_U1; + DU4 DCT_SHR_EQUAL_U8; + DU4 DCT_SHR_EQUAL_U4; + DU4 DCT_SHR_EQUAL_U2; + DU4 DCT_SHR_EQUAL_U1; + DU4 DCT_MUL_EQUAL_U8; + DU4 DCT_MUL_EQUAL_U4; + DU4 DCT_MUL_EQUAL_U2; + DU4 DCT_MUL_EQUAL_U1; + DU4 DCT_DIV_EQUAL_U8; + DU4 DCT_DIV_EQUAL_U4; + DU4 DCT_DIV_EQUAL_U2; + DU4 DCT_DIV_EQUAL_U1; + DU4 DCT_AND_EQUAL_U8; + DU4 DCT_AND_EQUAL_U4; + DU4 DCT_AND_EQUAL_U2; + DU4 DCT_AND_EQUAL_U1; + DU4 DCT_OR_EQUAL_U8; + DU4 DCT_OR_EQUAL_U4; + DU4 DCT_OR_EQUAL_U2; + DU4 DCT_OR_EQUAL_U1; + DU4 DCT_XOR_EQUAL_U8; + DU4 DCT_XOR_EQUAL_U4; + DU4 DCT_XOR_EQUAL_U2; + DU4 DCT_XOR_EQUAL_U1; + DU4 DCT_ADD_EQUAL_U8; + DU4 DCT_ADD_EQUAL_U4; + DU4 DCT_ADD_EQUAL_U2; + DU4 DCT_ADD_EQUAL_U1; + DU4 DCT_SUB_EQUAL_U8; + DU4 DCT_SUB_EQUAL_U4; + DU4 DCT_SUB_EQUAL_U2; + DU4 DCT_SUB_EQUAL_U1; + DU4 DCT_ESI_ASSIGN_U4; + DU4 DCT_ESI_SHL_EQUAL_U4; + DU4 DCT_ESI_SHR_EQUAL_U4; + DU4 DCT_ESI_MUL_EQUAL_U4; + DU4 DCT_ESI_DIV_EQUAL_U4; + DU4 DCT_ESI_AND_EQUAL_U4; + DU4 DCT_ESI_OR_EQUAL_U4; + DU4 DCT_ESI_XOR_EQUAL_U4; + DU4 DCT_ESI_ADD_EQUAL_U4; + DU4 DCT_ESI_SUB_EQUAL_U4; + DU4 DCT_EDI_ASSIGN_U4; + DU4 DCT_EDI_SHL_EQUAL_U4; + DU4 DCT_EDI_SHR_EQUAL_U4; + DU4 DCT_EDI_MUL_EQUAL_U4; + DU4 DCT_EDI_DIV_EQUAL_U4; + DU4 DCT_EDI_AND_EQUAL_U4; + DU4 DCT_EDI_OR_EQUAL_U4; + DU4 DCT_EDI_XOR_EQUAL_U4; + DU4 DCT_EDI_ADD_EQUAL_U4; + DU4 DCT_EDI_SUB_EQUAL_U4; + DU4 DCT_ADD64; + DU4 DCT_ADD32; + DU4 DCT_ADD8; + DU4 DCT_INC; + DU4 DCT_SUB64; + DU4 DCT_SUB32; + DU4 DCT_SUB8; + DU4 DCT_DEC; + DU4 DCT_ENTER; + DU4 DCT_LEAVE; + DU4 DCT_ENTER1; + DU4 DCT_LEAVE1; + DU4 DCT_ENTER2; + DU4 DCT_LEAVE2; + DU4 DCT_ADD_ESP32; + DU4 DCT_ADD_ESP8; + DU4 DCT_RET; + DU4 DCT_CALL; + DU4 DCT_CALL_INDIRECT; + DU4 DCT_CALL_INDIRECT2; + DU4 DCT_IRQ; + DU4 DCT_CLI; + DU4 DCT_STI; + DU4 DCT_GET_FLAGS; + DU4 DCT_SET_FLAGS; + DU4 DCT_GET_BASE_PTR; + DU4 DCT_SET_BASE_PTR; + DU4 DCT_GET_STACK_PTR; + DU4 DCT_SET_STACK_PTR; + DU4 DCT_GET_LABEL; + DU4 DCT_ABSOLUTE_ADDRESS; + DU4 DCT_LABEL; + DU4 DCT_TYPE; + DU4 DCT_BT; + DU4 DCT_BTS; + DU4 DCT_BTR; + DU4 DCT_BTC; + DU4 DCT_BSF; + DU4 DCT_BSR; + DU4 DCT_INSQUE; + DU4 DCT_INSQUE_REV; + DU4 DCT_REMQUE; + DU4 DCT_STRLEN; + DU4 DCT_MEMCPY; + DU4 DCT_MEMSET; + DU4 DCT_INPD; + DU4 DCT_INPW; + DU4 DCT_INP; + DU4 DCT_OUTPD; + DU4 DCT_OUTPW; + DU4 DCT_OUTP; + DU4 DCT_JMP; + DU4 DCT_SHORT_JMP; + DU4 DCT_SWITCH; + DU4 DCT_SKIPZ; + DU4 DCT_SKIPZ2; + DU4 DCT_SKIPNZ; + DU4 DCT_SKIPNZ2; + DU4 DCT_EQUAL_EQUAL_SKIPZ; + DU4 DCT_EQUAL_EQUAL_SKIPZ2; + DU4 DCT_NOT_EQUAL_TO_SKIPZ; + DU4 DCT_NOT_EQUAL_TO_SKIPZ2; + DU4 DCT_LESS_THAN_SKIPZ; + DU4 DCT_LESS_THAN_SKIPZ2; + DU4 DCT_GREATER_THAN_SKIPZ; + DU4 DCT_GREATER_THAN_SKIPZ2; + DU4 DCT_LESS_OR_EQUAL_SKIPZ; + DU4 DCT_LESS_OR_EQUAL_SKIPZ2; + DU4 DCT_GREATER_OR_EQUAL_SKIPZ; + DU4 DCT_GREATER_OR_EQUAL_SKIPZ2; + DU4 DCT_AND_AND_SKIPZ; + DU4 DCT_AND_AND_SKIPZ2; + DU4 DCT_AND_AND_SKIPNZ; + DU4 DCT_AND_AND_SKIPNZ2; + DU4 DCT_OR_OR_SKIPZ; + DU4 DCT_OR_OR_SKIPZ2; + DU4 DCT_OR_OR_SKIPNZ; + DU4 DCT_OR_OR_SKIPNZ2; + DU4 DCT_LEA_DISP32_ESI; + DU4 DCT_LEA_DISP8_ESI; + DU4 DCT_LEA_DISP32_EDI; + DU4 DCT_LEA_DISP8_EDI; + DU4 DCT_PUSH_U8; + DU4 DCT_PUSH_U4; + DU4 DCT_PUSH_U2; + DU4 DCT_PUSH_U1; + DU4 DCT_PUSH_NEG_U4; + DU4 DCT_PUSH_NEG_U2; + DU4 DCT_PUSH_NEG_U1; + DU4 DCT_PUSH_DOUBLE; + DU4 DCT_PUSH_U8_DISP32; + DU4 DCT_PUSH_U8_DISP8; + DU4 DCT_PUSH_ESI_U8_DISP32; + DU4 DCT_PUSH_ESI_U8_DISP8; + DU4 DCT_PUSH_EDI_U8_DISP32; + DU4 DCT_PUSH_EDI_U8_DISP8; + DU4 DCT_PUSH_DEREF_U8; + DU4 DCT_PUSH_U8_DISP32_SCALED; + DU4 DCT_BT_CONSTANT; + DU4 DCT_BTS_CONSTANT; + DU4 DCT_BTR_CONSTANT; + DU4 DCT_BTC_CONSTANT; + DU4 DCT_ESI_NEXT_EQUAL_U4; + DU4 DCT_EDI_NEXT_EQUAL_U4; + DU4 DCT_ADD_EQUAL_U8_CONSTANT_U1; + DU4 DCT_SUB_EQUAL_U8_CONSTANT_U1; + DU4 DCT_ADD_EQUAL_U4_CONSTANT_U1; + DU4 DCT_ESI_ADD_EQUAL_U4_CONSTANT_U1; + DU4 DCT_EDI_ADD_EQUAL_U4_CONSTANT_U1; + DU4 DCT_TABLE_END; +DCT_NULL: +DCT_NOP: +DCT_END_EXP: +DCT_ZERO: +DCT_U8: +DCT_U4: +DCT_U2: +DCT_U1: +DCT_DOUBLE: +DCT_STRING_CONSTANT: +DCT_EBP: +DCT_FS: +DCT_ESI: +DCT_EDI: +DCT_TO_DOUBLE: +DCT_TO_INT: +DCT_COM: +DCT_NOT: +DCT_UNARY_MINUS: + PUSH EDX + PUSH EAX + PUSH EBP + MOV EBP,ESP + FLD U4 4[EBP] + FCHS + FSTP U4 4[EBP] + POP EBP + POP EAX + POP EDX +DCT_ADDRESS: +DCT_U8_DISP32: +DCT_U4_DISP32: +DCT_U2_DISP32: +DCT_U1_DISP32: +DCT_U8_DISP8: +DCT_U4_DISP8: +DCT_U2_DISP8: +DCT_U1_DISP8: +DCT_FS_U8_DISP32: +DCT_FS_U4_DISP32: +DCT_FS_U2_DISP32: +DCT_FS_U1_DISP32: +DCT_ESI_U8_DISP32: +DCT_ESI_U4_DISP32: +DCT_ESI_U2_DISP32: +DCT_ESI_U1_DISP32: +DCT_ESI_U8_DISP8: +DCT_ESI_U4_DISP8: +DCT_ESI_U2_DISP8: +DCT_ESI_U1_DISP8: +DCT_EDI_U8_DISP32: +DCT_EDI_U4_DISP32: +DCT_EDI_U2_DISP32: +DCT_EDI_U1_DISP32: +DCT_EDI_U8_DISP8: +DCT_EDI_U4_DISP8: +DCT_EDI_U2_DISP8: +DCT_EDI_U1_DISP8: +DCT_DEREF_U8: +DCT_DEREF_U4: +DCT_DEREF_U2: +DCT_DEREF_U1: +DCT_ESI_DEREF_U8: +DCT_ESI_DEREF_U4: +DCT_ESI_DEREF_U2: +DCT_ESI_DEREF_U1: +DCT_EDI_DEREF_U8: +DCT_EDI_DEREF_U4: +DCT_EDI_DEREF_U2: +DCT_EDI_DEREF_U1: +DCT_U8_PP: + MOV EBX,EAX + MOV EDX,U4 4[EAX] + MOV EAX,U4 [EAX] + FLD U4 [EBX] + FLD1 + FADDP + FSTP U4 [EBX] +DCT_U4_PP: +DCT_U2_PP: +DCT_U1_PP: +DCT_U8_MM: + MOV EBX,EAX + MOV EDX,U4 4[EAX] + MOV EAX,U4 [EAX] + FLD U4 [EBX] + FLD1 + FSUBP + FSTP U4 [EBX] +DCT_U4_MM: +DCT_U2_MM: +DCT_U1_MM: +DCT_PP_U8: + FLD U4 [EAX] + FLD1 + FADDP + FSTP U4 [EAX] + MOV EDX,U4 4[EAX] + MOV EAX,U4 [EAX] +DCT_PP_U4: +DCT_PP_U2: +DCT_PP_U1: +DCT_MM_U8: + FLD U4 [EAX] + FLD1 + FSUBP + FSTP U4 [EAX] + MOV EDX,U4 4[EAX] + MOV EAX,U4 [EAX] +DCT_MM_U4: +DCT_MM_U2: +DCT_MM_U1: +DCT_ESI_U4_PP: +DCT_ESI_U4_MM: +DCT_ESI_PP_U4: +DCT_ESI_MM_U4: +DCT_EDI_U4_PP: +DCT_EDI_U4_MM: +DCT_EDI_PP_U4: +DCT_EDI_MM_U4: +DCT_LEA_DISP32_EBP: +DCT_LEA_DISP8_EBP: +DCT_U8_DISP32_SCALED: +DCT_U4_DISP32_SCALED: +DCT_U2_DISP32_SCALED: +DCT_SHL: +DCT_SHR: +DCT_SHL_CONSTANT1: +DCT_SHL_CONSTANT2: +DCT_SHR_CONSTANT1: +DCT_SHR_CONSTANT2: +DCT_POWER: + PUSH EDX + PUSH EAX + PUSH 0 + PUSH EBP + MOV EBP,ESP + FSTCW U4 4[EBP] + MOV AX,U2 4[EBP] + MOV U2 6[EBP],AX + OR AX,0x0C00 + MOV U2 4[EBP],AX + FLDCW U4 4[EBP] + FLD U4 8[EBP] + FLD U4 16[EBP] + FYL2X // y*log2(x) + FST U4 16[EBP] + FRNDINT + FLD U4 16[EBP] + FSUBRP + F2XM1 + FLD1 + FADDP + FSTP U4 8[EBP] + FFREE + FINCSTP + FLD U4 16[EBP] + FLD U4 8[EBP] + FSCALE // ST0<token==TK_IDENT) + if (temph=l->hash_entry) + if (temph->type == HTT_KEYWORD) + result=temph->user0; + return result; +} + +#define PVLM_LOCAL_VAR 0 +#define PVLM_FUNCTION_PARAM 1 +#define PVLM_CLASS 2 +#define PVLM_UNION 3 +void CmpParseVarList(LexStruct *l,ClassStruct *tempc, + I8 mode,U8 union_base=MAX_I4) +{ + I8 i,j,k,old_flags; + U8 ptr_cnt,size; + ClassStruct *tempc1,*tempc2; + SysHashEntry *temph; + MemberListStruct *tempm; + U1 *e; + if (mode!=PVLM_LOCAL_VAR || union_base!=MAX_I4) { + if (l->token=='(' || l->token=='{') + Lex(l); + } + while (TRUE) { + while (l->token==';') Lex(l); + if (l->token==')' || l->token=='}') { + Lex(l); + return; + } + if (l->token=='.') { + if (Lex(l)=='.') { + if (Lex(l)=='.') { + Lex(l); + tempm=MAllocZ(sizeof(MemberListStruct)); + tempm->flags=MLF_DOT_DOT_DOT; + tempm->member_class=sys_internal_types[IT_U4]; + tempm->string=NewString("argc"); + tempc2=tempc->last_in_member_list; + tempc2->next=tempm; + tempc->last_in_member_list=tempm; + tempm->offset=tempc->size; + tempc->size+=8; + + tempm=MAllocZ(sizeof(MemberListStruct)); + tempm->flags=MLF_DOT_DOT_DOT; + tempm->member_class=sys_internal_types[IT_I8]+sizeof(ClassStruct); + tempm->string=NewString("argv"); + tempm->cnt=127; //nonzero + tempc2=tempc->last_in_member_list; + tempc2->next=tempm; + tempc->last_in_member_list=tempm; + tempm->offset=tempc->size; + tempc->size+=8; + + if (l->token==')' || l->token=='}') + Lex(l); + return; + } else + PrsExcept(l,"ST_EXPECTING_TYPE"); + } else + PrsExcept(l,"ST_EXPECTING_TYPE"); + } + temph=NULL; + if (l->token==TK_IDENT) { + temph=l->hash_entry; + k=CmpKeyWord(l); + } + if (!temph) + PrsExcept(l,"ST_EXPECTING_TYPE"); + if (k==KW_UNION) { + Lex(l); + CmpParseVarList(l,tempc,mode,tempc->size); + } else { + tempc1=temph; + if (!(tempc1->type & (HTT_CLASS | HTT_INTERNAL_TYPE))) + PrsExcept(l,"ST_EXPECTING_TYPE"); + do { + LexPush(l); + Lex(l); //skip type + ptr_cnt=0; + while (l->token=='*') { + l->stack_ptr--; //grows up + LexPush(l); + Lex(l); + ptr_cnt++; + } + if (l->token!=TK_IDENT) + PrsExcept(l,"ST_EXPECTING_IDENTIFIER"); + tempm=MAllocZ(sizeof(MemberListStruct)); + tempm->member_class=tempc1; + tempm->string=l->ident; + l->ident=NULL; + tempc2=tempc->last_in_member_list; + tempc2->next=tempm; + tempc->last_in_member_list=tempm; + tempc->member_cnt++; + + if (Lex(l)=='(') { + tempm->flags|=MLF_FUNCTION; + if (Lex(l)!=')') { + tempm->parameter_cnt++; + while (l->token!=')') { + if (l->token==',') + tempm->parameter_cnt++; + Lex(l); + } + } + Lex(l); //skip ) + } + + if (l->token=='[') { + if (Lex(l)==']) + ptr_cnt++; + else + tempm->cnt=Expression(l); + if (l->token!=']') + PrsExcept(l,"ST_MISSING_RIGHT_BRACKET"); + Lex(l); + } + tempm->member_class+=ptr_cnt*sizeof(ClassStruct); + if (tempm->flags & MLF_FUNCTION) + tempm->member_class=sys_internal_types[IT_U4]+sizeof(ClassStruct); + tempc2=tempm->member_class; + i=tempc2->size; + j=(tempm->cnt)? tempm->cnt:1; + i*=j; + if (mode==PVLM_LOCAL_VAR) { + if (union_base!=0x7FFFFFFF) { + if (union_base-tempc->sizesize=union_base-i; + } else + tempc->size=tempc->size-i; + tempm->offset=tempc->size; + if (l->token=='=') { + LexPop(l); + Lex(l); + if (!PrsParseExpression(l,TRUE)) + throw(EXCEPT_COMPILER,7); + } else + l->stack_ptr--; + } else if (mode==PVLM_FUNCTION_PARAM) { + if (union_base!=0x7FFFFFFF) { + tempm->offset=union_base; + if (tempc->size-union_base<8) + tempc->size=8+union_base; + } else { + tempm->offset=tempc->size; + tempc->size+=8; + } + if (l->token=='=') { + Lex(l); + old_flags=l->flags; + l->flags&=~LF_HAS_MISC_DATA; + e=CompileExpression(l); + if (!e) + throw(EXCEPT_COMPILER,8); + tempm->default_value=Run(e); //TODO: if l->a + if (!(l->flags & LF_HAS_MISC_DATA)) + DelExpression(e); + else if (l->a) + PrsExcept(l,"ST_STRING_DEFAULT"); + tempm->flags|=MLF_DEFAULT_AVAILABLE; + l->flags|=old_flags&LF_HAS_MISC_DATA; + } + l->stack_ptr--; + } else { //CLASS + if (union_base!=MAX_I4) { + tempm->offset=union_base; + if (tempc->size-union_basesize=i+union_base; + } else { + tempm->offset=tempc->size; + tempc->size+=i; + } + do { + temph=NULL; + k=CmpKeyWord(l); + if (k==KW_FMTSTR) { + if (Lex(l)!=TK_STRING) + PrsExcept(l,"ST_EXPECTING_STRING"); + tempm->fmtstr=LexExtendString(l,&size); + } else if (k==KW_FMTDATA) { + if (Lex(l)!=TK_STRING) + PrsExcept(l,"ST_EXPECTING_STRING"); + tempm->fmtdata=LexExtendString(l,&size); + } + } while (k==KW_FMTSTR || k==KW_FMTDATA); + l->stack_ptr--; + } + + if (l->token==',') { + if (mode==PVLM_FUNCTION_PARAM && union_base==MAX_I4) { + Lex(l); + break; + } + } else if (l->token==')' || l->token=='}') { + Lex(l); + return; + } else if (l->token==';') { + Lex(l); + if (mode==PVLM_LOCAL_VAR && union_base==MAX_I4) + return; + break; + } else + PrsExcept(l,"ST_MISSING_SEMICOLON"); + } while (TRUE); + } + } +} + +ClassStruct *CmpParseClass(LexStruct *l,BoolU4 is_union,BoolU4 is_public) +{ + SysHashEntry *temph1; + ClassStruct *tempc; + if (l->token!=TK_IDENT) + PrsExcept(l,"ST_EXPECTING_IDENTIFIER"); + tempc=CmpClassNew; + if (is_public) + tempc->type|=HTT_PUBLIC; + tempc->string=l->ident; + l->ident=NULL; + SetSourceFileInfo(l,tempc); + tempc->use_cnt=0; + if (l->a) + temph1=FindHashBucket(tempc->string,l->a->glbl_hash); + else + temph1=FindHashBucket(tempc->string,l->hash_table_list); + tempc->next=temph1->next; + temph1->next=tempc; + Lex(l); + CmpParseVarList(l,tempc,PVLM_CLASS,(is_union)?0:0x7FFFFFFF); + return tempc; +} + +void UndefinedExtern() +{ + PutSysText("ST_UNDEFINED_EXTERN"); + throw(EXCEPT_UNDEF_EXTERN); +} + + +ClassStruct *CmpParseFunctionJoin(LexStruct *l, + ClassStruct *temp_return,I1 *name,BoolU4 is_public,BoolU4 needs_abs) +{ + MemberListStruct *tempm; + AsmCtrlStruct *a=l->a; + SysHashEntry *temph1; + SysHashTable *tempht; + ClassStruct *tempc; + ExeAbsoluteAddressStruct *tempa; + if (a) { + if (tempc=FindHashEntry(name,a->glbl_hash,HTT_ALL)) { + if (!(tempc->type & HTT_FUNCTION)) + tempc=NULL; + } + if (!tempc) + temph1=FindHashBucket(name,a->glbl_hash); + } else { + tempht=l->hash_table_list->next; + l->hash_table_list->next=NULL; + if (tempc=FindHashEntry(name,l->hash_table_list,HTT_ALL)) { + if (!(tempc->type & HTT_FUNCTION)) + tempc=NULL; + } + l->hash_table_list->next=tempht; + if (!tempc) + temph1=FindHashBucket(name,l->hash_table_list); + } + if (!tempc) { + tempc=CmpClassNew; + tempc->next=temph1->next; + temph1->next=tempc; + tempc->type=HTT_FUNCTION; + tempc->string=name; + if (a) { + tempc->executable_address=a->ip; + if (needs_abs) { + tempa=MAllocZ(sizeof(ExeAbsoluteAddressStruct)); + tempa->next=a->absolutes; + a->absolutes=tempa; + tempa->ip=a->ip; + } + AsmStoreCodeU1(l,0); + AsmStoreCodeU1(l,0); + AsmStoreCodeU1(l,0); + AsmStoreCodeU1(l,0); + } else + tempc->executable_address=&UndefinedExtern; + Bts(&tempc->flags,Cf_EXTERN); + } else { + Free(tempc->source_link); + Free(name); + DelMemberList(tempc); + } + if (is_public) + tempc->type|=HTT_PUBLIC; + else + tempc->type&=~HTT_PUBLIC; + tempc->return_class=temp_return; + tempc->use_cnt=0; + SetSourceFileInfo(l,tempc); + CmpParseVarList(l,tempc,PVLM_FUNCTION_PARAM); + tempc->parameter_cnt=tempc->member_cnt; + tempm=tempc->member_list; + while (tempm) { + tempm->offset+=8; //EBP+RETURN + tempm=tempm->next; + } + + tempc->size=0; + return tempc; +} + +void CmpParseFunction(LexStruct *l, + ClassStruct *temp_return,I1 *name,BoolU4 is_public) +{ + U1 *result; + AsmCtrlStruct *a=l->a; + ClassStruct *tempc; + MemberListStruct *tempm; + U8 i,j,size; + DbgInfo *dbg=NULL; + + l->flags&=~LF_NO_REG_OPT; + tempc=CmpParseFunctionJoin(l,temp_return,name,is_public,TRUE); + l->local_var_list=tempc; + CbPush(l); + CbInitOutPtrs(&l->cb); + CbAddIc(l,EC_ENTER,0,0); + CmpParseStatement(l,tempc,0,NULL,NULL,FALSE); + CbAddIc(l,EC_LEAVE,0,0); + CbAddIc(l,0,0,0); + tempc->size&=-8; + if (a) { + i=a->ip; + j=tempc->executable_address; + if (Bt(&tempc->flags,Cf_EXTERN)) { + AsmStoreCodeU1At(l,i.u1[0],j); + AsmStoreCodeU1At(l,i.u1[1],j+1); + AsmStoreCodeU1At(l,i.u1[2],j+2); + AsmStoreCodeU1At(l,i.u1[3],j+3); + } + tempc->executable_address=i; + tempc->type|=HTT_EXPORT; + result=CbCompile(l,tempc,&size,&dbg); + tempc->debug=dbg; + if (result) { + for (i=0;iexecutable_address=CbCompile(l,tempc,&size,&dbg); + tempc->debug=dbg; + } + Btr(&tempc->flags,Cf_EXTERN); + CbPop(l); + l->local_var_list=NULL; + tempm=tempc->member_list; + while (tempm) { + if (!tempm->use_cnt) { + coutln SysText("ST_WARNING"),SysText("ST_UNUSED_VAR"); + PrintF(" $$LK -A \"FL:%s,%d\"$$ '", + l->cur_lfn->name,l->cur_lfn->line_num); + coutln tempm->string,"' in '",tempc->string,"'"; + } + tempm=tempm->next; + } +} + +void CatchAll() +{ + I8 i; + if (Fs->except_argc>0) { + if (Fs->except_argv[0]except_argv[0],"ST_EXCEPT_TYPES"); + if (Fs->except_argv[0]==EXCEPT_UNDEF_SYSTEXT) + PrintF("Name:'%s'\r\n",Fs->except_argv[1]); + else if (Fs->except_argv[0]==EXCEPT_ARITHMETIC) + PrintF("Address:%P\r\n",Fs->except_argv[1]); + else if (Fs->except_argv[0]==EXCEPT_FLOATING) + PrintF("Address:%P\r\n",Fs->except_argv[1]); + else { + for (i=1;iexcept_argc;i++) + cout Fs->except_argv[i]," "; + CrLf; + } + } else { + cout "Exception:"; + for (i=1;iexcept_argc;i++) + cout Fs->except_argv[i]," "; + CrLf; + } + } else + PrintF("Generic Exception\r\n"); + Fs->catch_except=TRUE; +} + + +BoolU4 PrsVarInit(LexStruct *l,U1 **dd,ClassStruct *cl,U8 cnt) +{ + U1 *d=*dd,*e; + U8 i,j,r,old_flags; + BoolU4 result=FALSE,stop; + MemberListStruct *ml; + + while (cl->return_class) + cl=cl->return_class; + if (ml=cl->member_list) { + if (l->token!='{') + PrsExcept(l,"ST_EXPECTING_LEFT_BRACE"); + Lex(l); + + while (ml) { + if (ml->cnt && l->token=='{') + Lex(l); + j=(ml->cnt) ? ml->cnt:1; + stop=FALSE; + for (i=0;imember_class,ml->cnt); + if (l->token==',') + Lex(l); + } + if (ml->cnt && l->token=='}') + Lex(l); + ml=ml->next; + } + if (l->token!='}') + PrsExcept(l,"ST_MISSING_RIGHT_BRACE"); + Lex(l); + } else { + if (cl->type & HTT_INTERNAL_TYPE && + !cl->pointer_cnt && cnt && + (cl->sub_type==IT_I1 || cl->sub_type==IT_U1) && + l->token==TK_STRING) { + e=LexExtendString(l,&i); + MemCpy(d,e,i); + d+=cnt; + result=TRUE; + } else { + old_flags=l->flags; + l->flags&=~LF_HAS_MISC_DATA; + e=CompileExpression(l); + if (!e) + throw(EXCEPT_COMPILER,10); + r=Run(e); + if (!(l->flags & LF_HAS_MISC_DATA)) + DelExpression(e); + + MemCpy(d,&r,cl->size); + d+=cl->size; + l->flags|=old_flags&LF_HAS_MISC_DATA; + } + } + *dd=d; + return result; +} + +void PrsParseGlblInit(LexStruct *l,GlblVarStruct *tempg) +{ + U1 *dd=&tempg->data; + U8 i,j; + ClassStruct *cl=tempg->var_class; + BoolU4 stop=FALSE; + while (cl->return_class) + cl=cl->return_class; + if (tempg->cnt && l->token=='{') + Lex(l); + j=(tempg->cnt) ? tempg->cnt:1; + for (i=0;icnt); + if (j>1 && l->token==',') + Lex(l); + } + if (tempg->cnt && l->token=='}') + Lex(l); +} + +#define PG_NULL 0 +#define PG_LTEXTERN 1 +#define PG_LTINTERN 2 +#define PG_LTIMPORT 3 +#define PG_EXTERN 4 +#define PG_IMPORT 5 + +void CmpParseGlblVarList(LexStruct *l,I8 saved_mode,ClassStruct *saved_tempc, + U8 saved_val,BoolU4 is_public) +{ + I8 i,j,mode; + U8 k,val; + I1 *st; + SysHashEntry *temph,*temph1; + GlblVarStruct *tempg,*tempg1; + AsmCtrlStruct *a=l->a; + ClassStruct *tempc,*tempc1; + U1 *u1; + while (TRUE) { + Lex(l); + tempc=saved_tempc; + val=saved_val; + mode=saved_mode; + while (l->token=='*') { + Lex(l); + tempc+=sizeof(ClassStruct); + } + if (l->token!=TK_IDENT) + PrsExcept(l,"ST_EXPECTING_IDENTIFIER"); + if ((temph=l->hash_entry) && mode==PG_EXTERN && !a) { + if (temph->type & HTT_SYS_SYMBOL) { + val=temph->user0; + mode=PG_LTEXTERN; + } + } + if (CmpKeyWord(l)==KW_UNION) { + Lex(l); + tempc1=CmpParseClass(l,TRUE,is_public); + tempc1->return_class=tempc; + return; + } else if (CmpKeyWord(l)==KW_CLASS) { + Lex(l); + tempc1=CmpParseClass(l,FALSE,is_public); + tempc1->return_class=tempc; + return; + } + st=l->ident; + l->ident=NULL; + if (Lex(l)=='(') { + if (mode==PG_LTINTERN) { + tempc1=CmpParseFunctionJoin(l,tempc,st,is_public,FALSE); + tempc1->executable_address=val; + Bts(&tempc1->flags,Cf_INTERNAL); + Btr(&tempc1->flags,Cf_EXTERN); + return; + } else if (mode==PG_LTEXTERN) { + tempc1=CmpParseFunctionJoin(l,tempc,st,is_public,FALSE); + tempc1->executable_address=val; + Btr(&tempc1->flags,Cf_EXTERN); + return; + } else if (mode==PG_EXTERN) { + CmpParseFunctionJoin(l,tempc,st,is_public,TRUE); + return; + } else if (mode==PG_IMPORT || mode==PG_LTIMPORT) { + if (!a) + PrsExcept(l,"ST_IMPORT_NOT_NEEDED"); + else { + tempc1=CmpParseFunctionJoin(l,tempc,st,is_public,FALSE); + tempc1->type|=HTT_IMPORT; + if (mode==PG_LTIMPORT) + tempc1->import_name=NewString(val); + else + tempc1->import_name=NewString(st); + } + return; + } else { + CmpParseFunction(l,tempc,st,is_public); + return; + } + } + i=0; + if (l->token=='[') { + if (Lex(l)==']') + tempc+=sizeof(ClassStruct); + else + i=Expression(l); + if (l->token!=']') + PrsExcept(l,"ST_MISSING_RIGHT_BRACKET"); + Lex(l); + } + j=tempc->size; + if (i) j*=i; + if (mode==PG_LTEXTERN) { + tempg=MAllocZ(sizeof(GlblVarStruct)-4); + tempg->data_address=val; + if (a) + tempg->type=HTT_GLBL_VAR | HTT_EXPORT; + else + tempg->type=HTT_GLBL_VAR; + } else if (mode==PG_LTIMPORT || mode==PG_IMPORT) { + if (!a) + PrsExcept(l,"ST_IMPORT_NOT_NEEDED"); + else { + tempg=MAllocZ(sizeof(GlblVarStruct)-4); + tempg->type=HTT_GLBL_VAR | HTT_IMPORT; + if (mode==PG_LTIMPORT) + tempg->import_name=NewString(val); + else + tempg->import_name=NewString(st); + tempg->data_address=a->ip; + k=0; + AsmStoreCodeU1(l,k.u1[0]); + AsmStoreCodeU1(l,k.u1[1]); + AsmStoreCodeU1(l,k.u1[2]); + AsmStoreCodeU1(l,k.u1[3]); + } + } else if (mode==PG_EXTERN) { + tempg=MAllocZ(sizeof(GlblVarStruct)-4); + tempg->data_address=0; + if (a) + tempg->type=HTT_GLBL_VAR; + else + tempg->type=HTT_GLBL_VAR|HTT_UNRESOLVED_GLBL; + } else { + if (a) { + if (l->token=='=') + tempg=MAllocZ(j+sizeof(GlblVarStruct)-4); + else + tempg=MAllocZ(sizeof(GlblVarStruct)-4); + tempg->data_address=a->ip; + tempg->type=HTT_GLBL_VAR | HTT_EXPORT; + if (temph && (temph->type & HTT_GLBL_VAR)) { + tempg1=temph; + tempg1->data_address=a->ip; + } + for (k=0;kdata_address=&tempg->data; + tempg->type=HTT_GLBL_VAR; + if (temph && temph->type&HTT_GLBL_VAR && + temph->type&HTT_UNRESOLVED_GLBL) { + tempg1=temph; //TODO: do not resolve extern variables in parent tasks + tempg1->data_address=&tempg->data; + } + } + } + if (is_public) + tempg->type|=HTT_PUBLIC; + tempg->flags=0; + tempg->parameter_cnt=0; + tempg->var_class=tempc; + tempg->string=st; + tempg->size=j; + tempg->cnt=i; + tempg->use_cnt=0; + SetSourceFileInfo(l,tempg); + if (mode==PG_IMPORT || mode==PG_LTIMPORT) + tempg->flags|=GVAF_IMPORT; + if (mode==PG_EXTERN) + tempg->flags|=GVAF_EXTERN; + temph1=(a) ?FindHashBucket(st,a->glbl_hash): + FindHashBucket(st,l->hash_table_list); + tempg->next=temph1->next; + temph1->next=tempg; + if (l->token=='=') { + Lex(l); + PrsParseGlblInit(l,tempg); + if (a) { + u1=&tempg->data; + for (k=0;ksize;k++) + AsmStoreCodeU1At(l,u1[k],tempg->data_address+k); + } + } + if (l->token!=',') { + if (l->token!=';') + PrsExcept(l,"ST_MISSING_SEMICOLON"); + Lex(l); + return; + } + } +} + +void CmpParseIf(LexStruct *l,ClassStruct *locals,I8 try_count, + CbMiscStruct *break_label,CbMiscStruct *continue_label) +{ + CbMiscStruct *templ,*templ1; + I8 k; + + if (l->token!='(') + PrsExcept(l,"ST_EXPECTING_LEFT_PAREN"); + Lex(l); + if (!PrsParseExpression(l,TRUE)) + throw(EXCEPT_COMPILER,11); + if (l->token!=')') + PrsExcept(l,"ST_MISSING_RIGHT_PAREN"); + Lex(l); + templ=CbMiscNew(l,CBMT_LABEL); + CbAddIc(l,EC_SKIPZ2,templ,0); + CmpParseStatement(l,locals,try_count,break_label,continue_label); + k=CmpKeyWord(l); + if (k==KW_ELSE) { + Lex(l); + templ1=CbMiscNew(l,CBMT_LABEL); + CbAddIc(l,EC_JMP,templ1,0); + CbAddIc(l,EC_LABEL,templ,0); + CmpParseStatement(l,locals,try_count,break_label,continue_label); + CbAddIc(l,EC_LABEL,templ1,0); + } else + CbAddIc(l,EC_LABEL,templ,0); +} + +void CmpParseWhile(LexStruct *l,ClassStruct *locals,I8 try_count) +{ + CbMiscStruct *templ,*templ1; + + if (l->token!='(') + PrsExcept(l,"ST_EXPECTING_LEFT_PAREN"); + Lex(l); + templ=CbMiscNew(l,CBMT_LABEL); + CbAddIc(l,EC_LABEL,templ,0); + if (!PrsParseExpression(l,TRUE)) + throw(EXCEPT_COMPILER,12); + if (l->token!=')') + PrsExcept(l,"ST_MISSING_RIGHT_PAREN"); + Lex(l); + + templ1=CbMiscNew(l,CBMT_LABEL); + CbAddIc(l,EC_SKIPZ2,templ1,0); + CmpParseStatement(l,locals,try_count,templ1,templ); + CbAddIc(l,EC_JMP,templ,0); + CbAddIc(l,EC_LABEL,templ1,0); +} + +void CmpParseDoWhile(LexStruct *l,ClassStruct *locals,I8 try_count) +{ + CbMiscStruct *templ,*templ1; + + templ=CbMiscNew(l,CBMT_LABEL); + templ1=CbMiscNew(l,CBMT_LABEL); + CbAddIc(l,EC_LABEL,templ,0); + CmpParseStatement(l,locals,try_count,templ1,templ); + if (CmpKeyWord(l)!=KW_WHILE) + PrsExcept(l,"ST_MISSING_WHILE"); + if (Lex(l)!='(') + PrsExcept(l,"ST_EXPECTING_LEFT_PAREN"); + Lex(l); + if (!PrsParseExpression(l,TRUE)) + throw(EXCEPT_COMPILER,13); + if (l->token!=')') + PrsExcept(l,"ST_MISSING_RIGHT_PAREN"); + Lex(l); + CbAddIc(l,EC_SKIPNZ2,templ,0); + CbAddIc(l,EC_LABEL,templ1,0); +} + +void CmpParseFor(LexStruct *l,ClassStruct *locals,I8 try_count) +{ + LexCbStack *templs; + CbMiscStruct *templ,*templ1,*templ2; + + if (l->token!='(') + PrsExcept(l,"ST_EXPECTING_LEFT_PAREN"); + Lex(l); + CmpParseStatement(l,locals,try_count); + + templ=CbMiscNew(l,CBMT_LABEL); + CbAddIc(l,EC_LABEL,templ,0); + if (!PrsParseExpression(l,TRUE)) + throw(EXCEPT_COMPILER,14); + templ1=CbMiscNew(l,CBMT_LABEL); + CbAddIc(l,EC_SKIPZ2,templ1,0); + if (l->token!=';') + PrsExcept(l,"ST_MISSING_SEMICOLON"); + Lex(l); + + CbPush(l); + CbInitOutPtrs(&l->cb); + templ2=CbMiscNew(l,CBMT_LABEL); + CbAddIc(l,EC_LABEL,templ2,0); + CmpParseStatement(l,locals,try_count,NULL,NULL,FALSE); + CbAddIc(l,0,0,0); + CbPush(l); + templs=CbPopNoFree(l); + CbPop(l); + if (l->token!=')') + PrsExcept(l,"ST_MISSING_RIGHT_PAREN"); + Lex(l); + + CmpParseStatement(l,locals,try_count,templ1,templ2); + CbAppend(l,templs); + CbAddIc(l,EC_JMP,templ,0); + CbAddIc(l,EC_LABEL,templ1,0); +} + + +class SwitchCaseEntry { + SwitchCaseEntry *next; + CbMiscStruct *label; + U8 value; +}; + +void CmpParseSwitch(LexStruct *l,ClassStruct *locals,I8 try_count) +{ + SwitchCaseEntry *header=NULL,*temps,*temps1; + CbMiscStruct *templ_break,*templ_default,*templ_jmp; + IntermediateCode *tempi_sub,*tempi_cmp; + AsmCtrlStruct *a=l->a; + BoolU4 default_found=FALSE; + I8 i,k; + I8 lo=MAX_I8,hi=MIN_I8,range; + U4 *jmp_table; + + if (l->token!='(') + PrsExcept(l,"ST_EXPECTING_LEFT_PAREN"); + Lex(l); + templ_break=CbMiscNew(l,CBMT_LABEL); + templ_default=CbMiscNew(l,CBMT_LABEL); + templ_jmp=CbMiscNew(l,CBMT_JMP_TABLE); + if (!PrsParseExpression(l,FALSE)) + throw(EXCEPT_COMPILER,15); + CbAddIc(l,EC_U8,0,sys_internal_types[IT_I4]); + tempi_sub=l->cb.cb_last_out_ptr; + CbAddIc(l,EC_SUBTRACTION,0,sys_internal_types[IT_I4]); + CbAddIc(l,EC_U8,0,sys_internal_types[IT_I4]); + tempi_cmp=l->cb.cb_last_out_ptr; + CbAddIc(l,EC_SWITCH,templ_jmp,0); + CbAddIc(l,EC_JMP,templ_default,0); + if (l->token!=')') + PrsExcept(l,"ST_MISSING_RIGHT_PAREN"); + if (Lex(l)!='{') + PrsExcept(l,"ST_EXPECTING_LEFT_BRACE"); + Lex(l); + while (l->token && l->token!='}') { + k=CmpKeyWord(l); + if (k==KW_CASE) { + Lex(l); + temps=MAlloc(sizeof(SwitchCaseEntry)); + temps->label=CbMiscNew(l,CBMT_LABEL); + CbAddIc(l,EC_LABEL,temps->label,0); + k=Expression(l); + if (l->token!=':') + PrsExcept(l,"ST_EXPECTING_COLON"); + Lex(l); + if (khi) hi=k; + temps->value=k; + temps->next=header; + header=temps; + } else if (k==KW_DEFAULT) { + if (Lex(l)==':') + Lex(l); + CbAddIc(l,EC_LABEL,templ_default,0); + default_found=TRUE; + } else + CmpParseStatement(l,locals,try_count,templ_break,NULL); + } + if (!default_found) + CbAddIc(l,EC_LABEL,templ_default,0); + CbAddIc(l,EC_LABEL,templ_break,0); + if (l->token!='}') + PrsExcept(l,"ST_MISSING_RIGHT_BRACE"); + Lex(l); + + range=hi-lo+1; + if (range<=0 || range>0x4000) + PrsExcept(l,"ST_CASE_RANGE_ERROR"); + jmp_table=MAlloc(PTR_SIZE*range); + for (i=0;iic_data=lo; + tempi_cmp->ic_data=range; + temps=header; + while (temps) { + temps1=temps->next; + jmp_table[temps->value-lo]=temps->label; + Free(temps); + temps=temps1; + } + templ_jmp->jmp_table=jmp_table; + templ_jmp->st_len=range; +} + + +void CmpParseCout(LexStruct *l,BoolU4 linefeed) +{ + ClassStruct *tempc; + SysHashEntry *temph; + IntermediateCode *tempi; + I8 cnt=0,i,j; + + while (l->token!=';') { + cnt++; + if (!PrsParseExpression(l,FALSE)) + throw(EXCEPT_COMPILER,16); + tempi=l->cb.cb_last_out_ptr; + tempc=tempi->ic_class; + j=tempc->pointer_cnt; + tempc-=sizeof(ClassStruct)*j; + while (tempc->return_class) + tempc=tempc->return_class; + temph=tempc; + if (temph->type & HTT_INTERNAL_TYPE) + i=tempc->sub_type+j*IT_NUM_IT; + else + i=IT_U4; + CbAddIc(l,EC_TYPE,i,sys_internal_types[IT_U4]); + if (l->token==',' || l->token==TK_SHL) + Lex(l); + else { + if (l->token!=';') + PrsExcept(l,"ST_EXPECTING_COMMA"); + } + } + CbAddIc(l,EC_U8,cnt,sys_internal_types[IT_U4]); + if (linefeed) + CbAddIc(l,EC_IRQ,I_COUTLN,0); + else + CbAddIc(l,EC_IRQ,I_COUT,0); + CbAddIc(l,EC_ADD_ESP32,cnt<<4+8,0); +} + +void CmpParseExeBlk(LexStruct *l) +{ + AsmCtrlStruct *a=l->a; + SysHashTable *ht1=l->hash_table_list, + *ht2=l->define_hash_table; + U8 old_hash_mask=l->hash_mask; + U8 old_flags=l->flags & (LF_ASM_EXPRESSIONS | LF_EXE_BLK); + ExeBlkStruct *tempe=MAlloc(sizeof(ExeBlkStruct)); + U4 *old_var_list=l->local_var_list; + l->local_var_list=NULL; + + tempe->body=NewString(""); + InsQue(tempe,l->last_exe_blk); + CbPush(l); //TODO Misc lists + l->hash_mask=HTT_ALL; + l->hash_table_list=Fs->hash_table; + l->define_hash_table=Fs->hash_table; + l->flags=(l->flags & ~LF_ASM_EXPRESSIONS) | + LF_EXE_BLK; + l->a=NULL; + if (l->token=='{') + Lex(l); + else + PrsExcept(l,"ST_MISSING_RIGHT_BRACE"); + while (l->token && l->token!='}') + ExecuteCmdLine(l); + l->a=a; + l->hash_table_list=ht1, + l->define_hash_table=ht2; + l->local_var_list=old_var_list; + l->hash_mask=old_hash_mask; + l->flags=(l->flags&~LF_EXE_BLK) | old_flags; + CbPop(l); + RemQue(tempe); + if (*tempe->body) + LexIncludeString(l,"ExeBlk",tempe->body,FALSE); + else + Free(tempe->body); + Free(tempe); + Lex(l); //Skip "}" +} + +void ExePutS(I1 *st) +{ + LexStruct *l=Fs->last_lex; + ExeBlkStruct *tempe=l->last_exe_blk; + if (tempe!=&l->next_exe_blk) + tempe->body=Add2String(tempe->body,st); + else + coutln "Error: No exe{} blk"; +} + +void ExePrintF(I1 *src,...) +{ + I1 *buf=SPrintFJoin(NULL,src,argc,argv); + ExePutS(buf); + Free(buf); +} + +void CmpParseTryBlk(LexStruct *l,ClassStruct *locals,I8 try_count) +{ + CbMiscStruct *templ,*templ1,*templ2; + ClassStruct *d=sys_internal_types[IT_U4], + *temp_try=FindHashEntry("SysTry",l->hash_table_list,HTT_FUNCTION), + *temp_catch=FindHashEntry("SysCatch",l->hash_table_list,HTT_FUNCTION); + + l->flags|=LF_NO_REG_OPT; + + templ=CbMiscNew(l,CBMT_LABEL); + templ1=CbMiscNew(l,CBMT_LABEL); + templ2=CbMiscNew(l,CBMT_LABEL); + CbAddIc(l,EC_GET_STACK_PTR,0,d); + CbAddIc(l,EC_GET_BASE_PTR,0,d); + CbAddIc(l,EC_GET_LABEL,templ2,d); + CbAddIc(l,EC_GET_LABEL,templ,d); + if (Bt(&temp_try->flags,Cf_EXTERN)) { + if (l->a) + CbAddIc(l,EC_CALL_INDIRECT2,temp_try->executable_address,d); + else + CbAddIc(l,EC_CALL_INDIRECT2,&temp_try->executable_address,d); + } else + CbAddIc(l,EC_CALL,temp_try->executable_address,d); + CbAddIc(l,EC_ADD_ESP32,40,d); + + if (try_count<0) + CmpParseStatement(l,locals,try_count-1); + else + CmpParseStatement(l,locals,try_count+1); + + CbAddIc(l,EC_LABEL,templ2,0); + if (Bt(&temp_catch->flags,Cf_EXTERN)) { + if (l->a) + CbAddIc(l,EC_CALL_INDIRECT2,temp_catch->executable_address,d); + else + CbAddIc(l,EC_CALL_INDIRECT2,&temp_catch->executable_address,d); + } else + CbAddIc(l,EC_CALL,temp_catch->executable_address,d); + CbAddIc(l,EC_ADD_ESP32,8,d); + + CbAddIc(l,EC_JMP,templ1,0); + + if (CmpKeyWord(l)!=KW_CATCH) + PrsExcept(l,"ST_MISSING_CATCH"); + Lex(l); + + CbAddIc(l,EC_LABEL,templ,0); + if (try_count<0) + CmpParseStatement(l,locals,try_count-1); + else + CmpParseStatement(l,locals,-try_count-1); + CbAddIc(l,EC_RET,0,d); + CbAddIc(l,EC_LABEL,templ1,0); +} + +void CmpParseAsmBlk(LexStruct *l) +{ + AsmCtrlStruct *a=l->a; + I8 i,j; + OpcodeHashEntry *tempo; + SysHashEntry *temph,**temph1; + U8 argcnt,saved_ip; + BoolU4 is_literal; + U1 *file_buf,*b; + U8 file_size; + U8 old_hash_mask=l->hash_mask; + I1 *next_last_label; + ArcCompressStruct *ac; + void my_CmpParseExeBlk(LexStruct *l); + + if (!a) + PutAsmError(l,"ST_ASM_NOT_ALLOWED"); + + a->use16=FALSE; + l->flags|=LF_ASM_EXPRESSIONS; + l->hash_mask&=~(HTT_INTERNAL_TYPE|HTT_CLASS|HTT_PUBLIC| + HTT_WORD|HTT_LOCAL_VAR|HTT_GLBL_VAR|HTT_FUNCTION|HTT_FILE| + HTT_MODULE|HTT_PRIVATE|HTT_EXPORT|HTT_IMPORT); + if (l->token=='{') + Lex(l); + else + PrsExcept(l,"ST_MISSING_RIGHT_BRACE"); + while (l->token && l->token!='}') { + AsmListLine(l); + if (l->token==TK_IDENT && l->hash_entry) { + if (l->hash_entry->type==HTT_KEYWORD) { + i=l->hash_entry->user0; + Lex(l); //skip keyword + switch (i) { + case AKW_IMPORT: + case AKW_EXPORT: + while (l->token && l->token!=';') { + if (l->token=='#') { + is_literal=TRUE; + Lex(l); + } else + is_literal=FALSE; + if (l->token==TK_IDENT) { + if (temph=l->hash_entry) { + temph=FindHashEntry(l->ident,a->glbl_hash,HTT_ALL); + if (temph) + temph->type=HTT_SYS_SYMBOL+HTT_UNRESOLVED_GLBL; + } + if (!temph) { + temph=MAllocZ(sizeof(SysHashEntry)); + temph->string=l->ident; + l->ident=0; + temph->type=HTT_SYS_SYMBOL+HTT_UNRESOLVED_GLBL; + temph->use_cnt=0; + temph->user0=0; + temph->user1=NULL; + SetSourceFileInfo(l,temph); + temph1=FindHashBucket(temph->string,a->glbl_hash); + temph->next=*temph1; + *temph1=temph; + } + if (i==AKW_IMPORT) + temph->type=temph->type | HTT_IMPORT; + else if (i==AKW_EXPORT) + temph->type=temph->type | HTT_EXPORT; + if (is_literal) + temph->type=temph->type | HTT_LITERAL; + if (Lex(l)==',') + Lex(l); //skip ',' + } else { + PutAsmError(l,"ST_EXPECTING_IDENTIFIER"); + break; + } + } + if (l->token!=';') + PutAsmError(l,"ST_MISSING_SEMICOLON"); + else + Lex(l); //skip ';'; + break; + case AKW_ALIGN: + if (l->token!=TK_INTEGER) + PutAsmError(l,"ST_EXPECTING_INTEGER"); + else { + i=(a->ip+l->cur_i-1) & -l->cur_i; + if (Lex(l)==',') + Lex(l); + if (l->token==TK_INTEGER) { + for (j=a->ip;jcur_i); + Lex(l); + } else + a->ip=i; + } + break; + case AKW_END: + break; //TODO + case KW_EXE: + my_CmpParseExeBlk=ext[EXT_CMP_EXE_BLK]; + my_CmpParseExeBlk(l); + break; + case AKW_DU1: + DefineU1s(l,a,1); + break; + case AKW_DU2: + DefineU1s(l,a,2); + break; + case AKW_DU4: + DefineU1s(l,a,4); + break; + case AKW_DU8: + DefineU1s(l,a,8); + break; + case AKW_INSERT: + if (l->token!=TK_STRING) + PutAsmError(l,"ST_EXPECTING_STRING"); + else { + file_buf=ReadFile(l->ident,&file_size); + if (file_buf) { + for (i=0;itoken!=TK_STRING) + PutAsmError(l,"ST_EXPECTING_STRING"); + else { + file_buf=ReadFile(l->ident,&file_size); + if (file_buf) { + ac=CompressBuf(file_buf,file_size); + b=ac; + for (i=0;icompressed_size;i++) + AsmStoreCodeU1(l,b[i]); + Free(file_buf); + Free(ac); + } + Lex(l); + } + break; + case AKW_LIST: + a->list=TRUE; + break; + case AKW_NOLIST: + a->list=FALSE; + break; + case AKW_ORG: + a->ip=AsmEvalExpression(l); + break; + case AKW_STRUC: + a->flags|=ACSF_IN_STRUCT; + saved_ip=a->ip; + a->ip=AsmEvalExpression(l); + break; + case AKW_ENDS: + a->ip=saved_ip; + a->flags&=~ACSF_IN_STRUCT; + break; + case AKW_USE16: + a->use16=TRUE; + break; + case AKW_USE32: + a->use16=FALSE; + break; + default: + PutAsmError(l,"ST_SYNTAX_ERROR"); + break; + } + } else if (l->hash_entry->type & HTT_OPCODE) { + tempo=l->hash_entry; + Lex(l); //skip opcode + argcnt=0; + if (tempo->ins[0].arg1) { + argcnt++; + ParseAsmArg(l,a,&a->arg1,a->ip); + if (tempo->ins[0].arg2) { + argcnt++; + if (l->token!=',') + PutAsmError(l,"ST_EXPECTING_COMMA"); + else { + Lex(l); //skip ',' + ParseAsmArg(l,a,&a->arg2,a->ip); + } + } + } + AsmCodeInstruction(l,a,tempo,argcnt); + } else if (l->hash_entry->type & HTT_SYS_SYMBOL) { + if (a->flags & ACSF_IN_STRUCT) + l->hash_entry->type|=HTT_LITERAL; + else + l->hash_entry->type&=~HTT_LITERAL; + if (l->hash_entry->type & HTT_UNRESOLVED_LOCAL) { + l->hash_entry->type&=~HTT_UNRESOLVED_LOCAL; + l->hash_entry->user0=a->ip; + if (Lex(l)!=':') + PutAsmError(l,"ST_EXPECTING_COLON"); + else + Lex(l); + } else if (l->hash_entry->type & HTT_UNRESOLVED_GLBL) { + if (l->hash_entry->type & HTT_IMPORT) + PutAsmError(l,"ST_ATTEMPT_DEFINE_IMPORT"); + else { + l->hash_entry->type&=~HTT_UNRESOLVED_GLBL; + l->hash_entry->user0=a->ip; + next_last_label=l->hash_entry->string; + Lex(l); //Skip ident + if (l->token!=':' && l->token!=TK_DOUBLE_COLON) + PutAsmError(l,"ST_EXPECTING_COLON"); + else { + if (l->token==TK_DOUBLE_COLON) { + l->hash_entry->type|=HTT_EXPORT; + ResolveLocals(l); + a->last_label=next_last_label; + } + if (Lex(l)=='#') { + Lex(l); + l->hash_entry->type|=HTT_LITERAL | HTT_EXPORT; + } + } + } + } else + PutAsmError(l,"ST_REDEFINITION"); + } else + PutAsmError(l,"ST_SYNTAX_ERROR"); + } else { + if (l->token==TK_IDENT) { + temph=MAllocZ(sizeof(SysHashEntry)); + temph->string=l->ident; + l->ident=0; + temph->type=HTT_SYS_SYMBOL; + if (a->flags & ACSF_IN_STRUCT) + temph->type|=HTT_LITERAL; + temph->use_cnt=0; + SetSourceFileInfo(l,temph); + temph->user0=a->ip; + temph->user1=NULL; + Lex(l); //Skip ident + if (l->token==':' || l->token==TK_DOUBLE_COLON) { + if (temph->string[0]=='@' && temph->string[1]=='@') { + temph1=FindHashBucket(temph->string,a->local_hash); + a->has_locals=TRUE; + } else + temph1=FindHashBucket(temph->string,a->glbl_hash); + temph->next=*temph1; + *temph1=temph; + if (l->token==TK_DOUBLE_COLON) { + temph->type=temph->type | HTT_EXPORT; //Export + ResolveLocals(l); + a->last_label=temph->string; + Lex(l); + } else { + if (Lex(l)=='#') { + temph->type=temph->type | HTT_EXPORT | HTT_LITERAL; //Export + ResolveLocals(l); + a->last_label=temph->string; + Lex(l); + } + } + } else { + PutAsmError(l,"ST_EXPECTING_COLON"); + Free(temph->string); + Free(temph); + } + } else + PutAsmError(l,"ST_SYNTAX_ERROR"); + } + } + ResolveLocals(l); + l->flags&=~LF_ASM_EXPRESSIONS; + l->hash_mask=old_hash_mask; + Lex(l); //Skip "}" +} + +BoolU4 CmpParseStatement(LexStruct *l,ClassStruct *locals,I8 try_count=0, + CbMiscStruct *break_label=NULL,CbMiscStruct *continue_label=NULL, + BoolU4 saved_prs_semicolon=TRUE) +{ + BoolU4 prs_exp,cont,prs_semicolon,is_asm=FALSE, + is_public=FALSE,last_is_public=FALSE; + U8 i; + SysHashEntry *temph; + CbMiscStruct *templ; + I1 *import_name; + ClassStruct *d,*temp_catch; + void my_CmpParseExeBlk(LexStruct *l); + do { + is_public=FALSE; + cont=FALSE; + prs_exp=FALSE; + prs_semicolon=saved_prs_semicolon; + l->statement_cnt++; + while (l->token==',') + Lex(l); + if (l->token=='{') { + l->braces_cnt++; + Lex(l); + while (l->token!='}') + CmpParseStatement(l,locals,try_count,break_label,continue_label); + l->braces_cnt--; + l->statement_cnt--; + Lex(l); + } else if (l->token==TK_EOF) ; + else if (l->token==';') { + if (prs_semicolon) { + l->statement_cnt--; + Lex(l); + } + } else { + if (l->token==TK_IDENT) { + if (temph=l->hash_entry) { + if (temph->type & HTT_KEYWORD) { + i=temph->user0; + switch (i) { + case KW_IF: + Lex(l); + CmpParseIf(l,locals,try_count,break_label,continue_label); + prs_semicolon=FALSE; + break; + case KW_FOR: + Lex(l); + CmpParseFor(l,locals,try_count); + prs_semicolon=FALSE; + break; + case KW_WHILE: + Lex(l); + CmpParseWhile(l,locals,try_count); + prs_semicolon=FALSE; + break; + case KW_DO: + Lex(l); + CmpParseDoWhile(l,locals,try_count); + prs_semicolon=FALSE; + break; + case KW_SWITCH: + Lex(l); + CmpParseSwitch(l,locals,try_count); + prs_semicolon=FALSE; + break; + case KW_LTEXTERN: + Lex(l); + if (Bt(&l->flags,LFf_EXTERNS_TO_IMPORTS)) + goto keyword_LTimport; + if (l->token!=TK_IDENT) + PrsExcept(l,"ST_EXPECTING_SYS_SYMBOL"); + if (!(temph=l->hash_entry)) + PrsExcept(l,"ST_EXPECTING_SYS_SYMBOL"); + if (!(temph->type & HTT_SYS_SYMBOL)) + PrsExcept(l,"ST_EXPECTING_SYS_SYMBOL"); + i=temph->user0; + if (Lex(l)!=TK_IDENT) + PrsExcept(l,"ST_EXPECTING_TYPE"); + if (!(temph=l->hash_entry)) + PrsExcept(l,"ST_EXPECTING_TYPE"); + if (!(temph->type & (HTT_CLASS|HTT_INTERNAL_TYPE))) + PrsExcept(l,"ST_EXPECTING_TYPE"); + if (locals) + PrsExcept(l,"ST_NOT_ALLOWED_IN_FUNCTION"); + CmpParseGlblVarList(l,PG_LTEXTERN,temph,i,last_is_public); + prs_semicolon=FALSE; + cont=TRUE; + break; + case KW_LTIMPORT: + Lex(l); +keyword_LTimport: + if (l->token!=TK_IDENT) + PrsExcept(l,"ST_EXPECTING_SYS_SYMBOL"); + import_name=l->ident; + l->ident=0; + if (Lex(l)!=TK_IDENT) + PrsExcept(l,"ST_EXPECTING_TYPE"); + if (!(temph=l->hash_entry)) + PrsExcept(l,"ST_EXPECTING_TYPE"); + if (!(temph->type & (HTT_CLASS|HTT_INTERNAL_TYPE))) + PrsExcept(l,"ST_EXPECTING_TYPE"); + if (locals) + PrsExcept(l,"ST_NOT_ALLOWED_IN_FUNCTION"); + CmpParseGlblVarList(l,PG_LTIMPORT,temph,import_name,FALSE); + Free(import_name); + prs_semicolon=FALSE; + cont=TRUE; + break; + case KW_INTERNAL: + Lex(l); + if (l->token!=TK_INTEGER) + PrsExcept(l,"ST_EXPECTING_INTEGER"); + i=l->cur_i; + if (Lex(l)!=TK_IDENT) + PrsExcept(l,"ST_EXPECTING_TYPE"); + if (!(temph=l->hash_entry)) + PrsExcept(l,"ST_EXPECTING_TYPE"); + if (!(temph->type & (HTT_CLASS|HTT_INTERNAL_TYPE))) + PrsExcept(l,"ST_EXPECTING_TYPE"); + if (locals) + PrsExcept(l,"ST_NOT_ALLOWED_IN_FUNCTION"); + CmpParseGlblVarList(l,PG_LTINTERN,temph,i,last_is_public); + prs_semicolon=FALSE; + cont=TRUE; + break; + case KW_EXTERN: + Lex(l); + if (Bt(&l->flags,LFf_EXTERNS_TO_IMPORTS)) + goto keyword_import; + if (l->token!=TK_IDENT) + PrsExcept(l,"ST_EXPECTING_TYPE"); + if (!(temph=l->hash_entry)) + PrsExcept(l,"ST_EXPECTING_TYPE"); + if (!(temph->type & (HTT_CLASS|HTT_INTERNAL_TYPE))) + PrsExcept(l,"ST_EXPECTING_TYPE"); + if (locals) + PrsExcept(l,"ST_NOT_ALLOWED_IN_FUNCTION"); + CmpParseGlblVarList(l,PG_EXTERN,temph,0,last_is_public); + prs_semicolon=FALSE; + cont=TRUE; + break; + case KW_IMPORT: + Lex(l); +keyword_import: + if (l->token!=TK_IDENT) + PrsExcept(l,"ST_EXPECTING_TYPE"); + if (!(temph=l->hash_entry)) + PrsExcept(l,"ST_EXPECTING_TYPE"); + if (!(temph->type & (HTT_CLASS|HTT_INTERNAL_TYPE))) + PrsExcept(l,"ST_EXPECTING_TYPE"); + if (locals) + PrsExcept(l,"ST_NOT_ALLOWED_IN_FUNCTION"); + CmpParseGlblVarList(l,PG_IMPORT,temph,0,FALSE); + prs_semicolon=FALSE; + cont=TRUE; + break; + case KW_ASM: + Lex(l); + CmpParseAsmBlk(l); + prs_semicolon=FALSE; + is_asm=TRUE; + break; + case KW_EXE: + Lex(l); + my_CmpParseExeBlk=ext[EXT_CMP_EXE_BLK]; + my_CmpParseExeBlk(l); + prs_semicolon=FALSE; + break; + case KW_TRY: + Lex(l); + CmpParseTryBlk(l,locals,try_count); + prs_semicolon=FALSE; + break; + case KW_BREAK: + Lex(l); + if (!break_label) + PrsExcept(l,"ST_BREAK_NOT_ALLOWED"); + CbAddIc(l,EC_JMP,break_label,0); + break; + case KW_CONTINUE: + Lex(l); + if (!continue_label) + PrsExcept(l,"ST_CONTINUE_NOT_ALLOWED"); + CbAddIc(l,EC_JMP,continue_label,0); + break; + case KW_RETURN: + Lex(l); + if (l->token!=';') { + if (!PrsParseExpression(l,TRUE)) + throw(EXCEPT_COMPILER,17); + } + if (try_count<0) {//inside catch{} + CbAddIc(l,EC_GET_BASE_PTR,0,0); + CbAddIc(l,EC_U8,locals->size,sys_internal_types[IT_U8]); + CbAddIc(l,EC_ADDITION,0,sys_internal_types[IT_U8]); + CbAddIc(l,EC_SET_STACK_PTR,0,0); + try_count=-try_count; //force removal from queue + } + if (try_count) { + d=sys_internal_types[IT_U4]; + temp_catch=FindHashEntry("SysCatch", + l->hash_table_list,HTT_FUNCTION); + for (i=0;iflags,Cf_EXTERN)) { + if (l->a) + CbAddIc(l,EC_CALL_INDIRECT2, + temp_catch->executable_address,d); + else + CbAddIc(l,EC_CALL_INDIRECT2, + &temp_catch->executable_address,d); + } else + CbAddIc(l,EC_CALL,temp_catch->executable_address,d); + CbAddIc(l,EC_ADD_ESP32,8,d); + } + } + if (locals) + CbAddIc(l,EC_LEAVE,0,0); + else + CbAddIc(l,EC_RET,0,0); + break; + case KW_GOTO: + Lex(l); + if (l->token!=TK_IDENT) + PrsExcept(l,"ST_EXPECTING_IDENTIFIER"); + if (!(templ=CbFindGotoLabel(l,l->ident))) { + templ=CbMiscNew(l,CBMT_GOTO_LABEL); + templ->string=l->ident; + l->ident=NULL; + } + CbAddIc(l,EC_JMP,templ,0); + Lex(l); + break; + case KW_COUT: + Lex(l); + CmpParseCout(l,FALSE); + break; + case KW_COUTLN: + Lex(l); + CmpParseCout(l,TRUE); + break; + case KW_CLASS: + Lex(l); + CmpParseClass(l,FALSE,last_is_public); + break; + case KW_UNION: + Lex(l); + CmpParseClass(l,TRUE,last_is_public); + break; + case KW_PUBLIC: + Lex(l); + is_public=TRUE; + cont=TRUE; + prs_semicolon=FALSE; + break; + default: + prs_exp=TRUE; + break; + } + } else if (temph->type & (HTT_CLASS|HTT_INTERNAL_TYPE)) { + if (locals) + CmpParseVarList(l,locals,PVLM_LOCAL_VAR); + else + CmpParseGlblVarList(l,PG_NULL,temph,0,last_is_public); + prs_semicolon=FALSE; + cont=TRUE; + } else prs_exp=TRUE; + } else { + if (l->local_var_entry) + prs_exp=TRUE; + else { + if (!(templ=CbFindGotoLabel(l,l->ident))) { + templ=CbMiscNew(l,CBMT_GOTO_LABEL); + templ->string=l->ident; + l->ident=NULL; + } + CbAddIc(l,EC_LABEL,templ,0); + if (Lex(l)==':') //skip ident + Lex(l); //skip colon + else + PrsExcept(l,"ST_UNDEFINED_IDENTIFIER"); + prs_semicolon=FALSE; + } + } + } else prs_exp=TRUE; + if (prs_exp) { + if (!PrsParseExpression(l,TRUE)) + throw(EXCEPT_COMPILER,18); + } + if (l->token!=',') + l->statement_cnt--; + if (prs_semicolon && l->token!=',') { + if (l->token==';') + Lex(l); + else + PrsExcept(l,"ST_MISSING_SEMICOLON"); + } + } + last_is_public=is_public; + } while (l->token==',' || cont); + return is_asm; +} + +U1 *CompileStatement(LexStruct *l,U8 *type=NULL) +{ + U1 *result=INVALID_PTR; + AsmCtrlStruct *a=l->a; + U8 size,i,j; + DbgInfo *dbg=NULL; + if (type) *type=IT_U8; + CbInitOutPtrs(&l->cb); + if (!CmpParseStatement(l,NULL)) { + CbAddIc(l,EC_RET,0,0); + CbAddIc(l,0,0,0); + if (result=CbCompile(l,NULL,&size,&dbg,type)) { + if (a) { + if (size!=1) {//not just RET + j=a->ip; + for (i=0;icb.cb_out_first); + Free(dbg); + return result; +} + + +ExeStruct *CompileBuf(U1 *buf,I1 *map_name=NULL, + I8 *error_cnt=NULL, I8 *warning_cnt=NULL,I1 mapfile_drive=0) +{ + BoolU4 okay=TRUE; + LexStruct *l; + AsmCtrlStruct *a; + U8 i,j; + ExeStruct *result=NULL; + AsmCodeBlk *tempc; + ExeImportExportStruct *tempe,*tempe1; + void my_HashRep(SysHashTable *h,U8 mask,I1 *outname,I1 *flags,I1 drive); + + if (!is_first_compiler) + coutln "$$FG PURPLE$$**** Not First Compiler ****$$FG$$"; + + my_HashRep=FindExtern("HashRep"); + result=MAllocZ(sizeof(ExeStruct)); + l=LexNew(buf,LF_DONT_FREE_BUFFER,NULL); + InsQue(l,Fs->last_lex); + + a=MAllocZ(sizeof(AsmCtrlStruct)); + a->code=MAllocZ(sizeof(AsmCodeBlk)); + a->local_hash=NewHashTable(16); + a->glbl_hash=NewHashTable(2048); + a->glbl_hash->next=asm_hash; + a->local_hash->next=a->glbl_hash; + + l->a=a; + l->hash_table_list=a->local_hash; + l->define_hash_table=a->glbl_hash; + l->local_hash_table=a->local_hash; + l->glbl_hash_table=a->glbl_hash; + Lex(l); +try { + while (l->token!=TK_EOF) { + i=CompileStatement(l); + if (i!=INVALID_PTR) { + tempe=MAlloc(sizeof(ExeImportExportStruct)); + tempe->type=EIE_MAIN; + tempe->ip=i; + tempe->string=NULL; + tempe->next=NULL; + tempe1=&result->ie; + while (tempe1->next) //TODO:This could be optimized + tempe1=tempe1->next; + tempe1->next=tempe; + } + } + ResolveGlbls(l,result); +} catch { + if (Fs->except_argc>0) + if (Fs->except_argv[0]==EXCEPT_COMPILER) + Fs->catch_except=TRUE; + okay=FALSE; +} + RemQue(l); + if (error_cnt) *error_cnt=l->error_cnt; + if (warning_cnt) *warning_cnt=l->warning_cnt; + if (!okay) { + //TODO free debug info and possibly classes + if (error_cnt) + if (*error_cnt<1) *error_cnt=1; + result=NULL; + } else { + if (map_name) + my_HashRep(a->glbl_hash,HTT_ALL,map_name,"",mapfile_drive); + LexDel(l); + DelHashTable(a->local_hash); + DelHashTable(a->glbl_hash); + + if (!a->num_code_U1s) + result->code=NULL; + else { + result->code=MAlloc(a->num_code_U1s); + result->code_U1s=a->num_code_U1s; + tempc=a->code; + j=0; + l=a->num_code_U1s; + while (tempc) { + i=l; + if (i>ASM_CODE_BLK_SIZE) + i=ASM_CODE_BLK_SIZE; + MemCpy(result->code+j,tempc->body,i); + j+=i; + l-=i; + tempc=tempc->next; + } + } + DelLinkedList(a->code); + result->absolutes=a->absolutes; + Free(a); + } + return result; +} + + +I8 CompileFile(I1 *filename,I1 *map_name=NULL,I1 *out_name=NULL,I1 mapfile_drive=0) +{ + I1 *fbuf=NULL,*fbuf2=NULL,*fbuf3=NULL; + ExeStruct *e; + U4 *dd; + U8 size=0; + U1 *header=MAlloc(0x20000),*ptr; + BinFileHeaderStruct *bfh; + U8 i,cnt=0,error_cnt=0,warning_cnt=0; + ExeImportExportStruct *tempe,*tempe1; + ExeAbsoluteAddressStruct *tempa,*tempa1; + + fbuf=DefaultExtension(filename,"CPZ"); + fbuf2=MSPrintF("#include \"%s\"",fbuf); + if (map_name) + fbuf3=DefaultExtension(map_name,"MPZ"); + e=CompileBuf(fbuf2,fbuf3,&error_cnt,&warning_cnt,mapfile_drive); + + if (e) { + ptr=header; + tempa=e->absolutes; + while (tempa) { + cnt++; + tempa=tempa->next; + } + if (cnt) { + *ptr++=EIE_ABSOLUTE_ADDRESS; + dd=ptr; + *dd=cnt; + ptr+=sizeof(U4); + *ptr++=0; + tempa=e->absolutes; + while (tempa) { + tempa1=tempa->next; + dd=ptr; + *dd=tempa->ip; + ptr+=sizeof(U4); + Free(tempa); + tempa=tempa1; + } + } + tempe=e->ie; + while (tempe) { + tempe1=tempe->next; + *ptr++=tempe->type; + dd=ptr; + *dd=tempe->ip; + ptr+=sizeof(U4); + if (tempe->string) { + i=StrLen(tempe->string); + MemCpy(ptr,tempe->string,i+1); + Free(tempe->string); + ptr+=i+1; + } else + *ptr++=0; + Free(tempe); + tempe=tempe1; + } + *ptr++=EIE_END; + i=(ptr-header+15) & -0x10; + size=i+e->code_U1s+sizeof(BinFileHeaderStruct); + bfh=MAlloc(size); + MemCpy(bfh+e->code_U1s+sizeof(BinFileHeaderStruct),header,i); + MemCpy(bfh+sizeof(BinFileHeaderStruct),e->code,e->code_U1s); + bfh->jmp=0xE9+256*(16-3); + bfh->header_offset=e->code_U1s+sizeof(BinFileHeaderStruct); + bfh->file_size=size; + bfh->xsum=LT_XSUM; + bfh->xsum=ArcCheckSum(bfh,size); + Free(fbuf2); + if (out_name) + fbuf2=DefaultExtension(out_name,"BIZ"); + else + fbuf2=ChangeExtension(fbuf,"BIZ"); + WriteFile(fbuf2,bfh,size); + Free(bfh); + Free(e->code); + Free(e); + } + Free(header); + Free(fbuf); + Free(fbuf2); + Free(fbuf3); + PrintF(SysText("ST_ERRORS_WARNINGS"),error_cnt,warning_cnt,size); + return error_cnt; +} + +I8 ExecuteCmdLine(LexStruct *l) +{ + I8 result=0,i,type; + double *resultd; + I1 *ptr,*ptr2,*ptr3; + U1 *code; + LtfEntry *cl; + Ltf *ltf; + while (l->token && + (l->token!='}' || !(l->flags & LF_EXE_BLK)) ) { + ptr2=&Fs->task_descriptor; + ptr3=ptr2+TSS_DESC_LENGTH; + if (l->cur_lfn->flags & LFSF_IS_LTF) { + cl=l->cur_lfn->line_start; + ltf=l->cur_lfn->l; + while (cl!=ltf && ptr2btype && ptr2display; + while (*ptr && ptr2next; + } + } else + if (ptr=l->cur_lfn->line_start) + MemCpy(ptr2,ptr,TSS_DESC_LENGTH); + code=CompileStatement(l,&type); + if (code!=INVALID_PTR) { + result=Run(code); + for (i=6;i>=0;i--) { + Fs->answers[i+1]=Fs->answers[i]; + Fs->double_answers[i+1]=Fs->double_answers[i]; + Fs->answers_types[i+1]=Fs->answers_types[i]; + } + Fs->answers[0]=result; + + resultd=&result; + Fs->double_answers[0]=*resultd; + + Fs->answers_types[0]=type; + Free(code); + } + } + return result; +} + +void ContinueUserTask() +{ + LexStruct *l; + while (TRUE) { + l=LexNew(NULL,LF_PROMPT,NULL); + InsQue(l,Fs->last_lex); + try { + Lex(l); + ExecuteCmdLine(l); + } catch + CatchAll; + RemQue(l); + //LexDel(l); //Sometimes crashes on BREAK + } +} + + +I8 ExecuteString(I1 *buf,I1 *filename=NULL) +{ + I8 result; + BoolU4 okay=TRUE; + LexStruct *l; + if (!filename) + filename=sys_temp_filename; + l=LexNew(buf,LF_DONT_FREE_BUFFER,AbsoluteFileName(filename)); + InsQue(l,Fs->last_lex); + try { + Lex(l); + result=ExecuteCmdLine(l); + } catch { + if (Fs->except_argc>0) + if (Fs->except_argv[0]==EXCEPT_COMPILER || + Fs->except_argv[0]==EXCEPT_BREAK) { + Fs->catch_except=TRUE; + okay=FALSE; + result=0; + } + } + RemQue(l); + if (okay) + LexDel(l); + return result; +} + +I8 ExecuteFile(I1 *name) +{ + I8 result; + I1 *name2=DefaultExtension(name,"CPZ"); + I1 *st=MSPrintF("#include \"%s\";",name2); + result=ExecuteString(st,name); + Free(st); + Free(name2); + return result; +} + +void LoadCompileSysText() +{ + LoadStr("ST_ERROR","ERROR: "); + LoadStr("ST_MISSING_SEMICOLON","missing ';' at"); + LoadStr("ST_MISSING_EXPRESSION","missing Expression at "); + LoadStr("ST_MISSING_RIGHT_PAREN","missing ')' at "); + LoadStr("ST_MISSING_RIGHT_BRACKET","missing ']' at "); + LoadStr("ST_UNDEFINED_SYMBOL","undefined symbol at "); + LoadStr("ST_UNDEFINED_IDENTIFIER","undefined identifier at "); + LoadStr("ST_INVALID_CLASS","invalid class at "); + LoadStr("ST_INVALID_MEMBER","invalid member at "); + LoadStr("ST_EXPECTING_TYPE","expecting type at "); + LoadStr("ST_EXPECTING_IDENTIFIER","expecting identifier at "); + LoadStr("ST_EXPECTING_RIGHT_PAREN","expecting ')' at "); + LoadStr("ST_EXPECTING_LEFT_BRACE","expecting '{' at "); + LoadStr("ST_MISSING_RIGHT_BRACE","missing '}' at "); + LoadStr("ST_INVALID_LVALUE","invalid lvalue at "); + LoadStr("ST_EXPECTING_EQUAL","expecting '=' at "); + LoadStr("ST_NOT_POINTER_TYPE","not pointer type at "); + LoadStr("ST_EXPECTING_COMMA","expecting ',' at "); + LoadStr("ST_EXPECTING_SYS_SYMBOL","expecting System symbol at "); + LoadStr("ST_EXPECTING_STRING","expecting string at "); + LoadStr("ST_MISSING_WHILE","missing 'while' at"); + LoadStr("ST_UNKNOWN_STATEMENT","unknown statement at "); + LoadStr("ST_ALREADY_ONE_IMMEDIATE","already one immediate at "); + LoadStr("ST_SYNTAX_ERROR","syntax error at "); + LoadStr("ST_EXPECTING_SCALE_FACTOR","expecting scale factor at "); + LoadStr("ST_QUESTION_NOT_ALLOWED","'?' not allowed at "); + LoadStr("ST_EXPECTING_LEFT_PAREN","expecting '(' at "); + LoadStr("ST_UNDEFINED_DUP_CNT","undefined DUP cnt at "); + LoadStr("ST_EXPECTING_COLON","expecting ':' at "); + LoadStr("ST_EXPECTING_DOUBLE_COLON","expecting '::' at "); + LoadStr("ST_EXPECTING_DOT","expecting '.' at "); + LoadStr("ST_REDEFINITION","redefinition at "); + LoadStr("ST_INVALID_INSTRUCTION","invalid instruction at "); + LoadStr("ST_INTERNAL_ERROR","LTintern error at "); + LoadStr("ST_BRANCH_OUT_OF_RANGE","branch out of range at "); + LoadStr("ST_ATTEMPT_DEFINE_IMPORT","attempt to define import at "); + LoadStr("ST_COULD_USE_U1_DISP","could use U1 displacement at "); + LoadStr("ST_WARNING","WARNING: "); + LoadStr("ST_LINE","line: "); + LoadStr("ST_NO_SIZE_SPECIFIED","no size specified at "); + LoadList("ST_U1_REGS","AL\0CL\0DL\0BL\0AH\0CH\0DH\0BH\0"); + LoadList("ST_U2_REGS","AX\0CX\0DX\0BX\0SP\0BP\0SI\0DI\0"); + LoadList("ST_U4_REGS","EAX\0ECX\0EDX\0EBX\0ESP\0EBP\0ESI\0EDI\0"); + LoadList("ST_OPCODE_MODIFIERS","NO\0R\0CB\0CW\0CD\0CP\0IB\0IW\0ID\0RB\0RW\0RD\0"); + LoadList("ST_ARGUMENT_TYPES", + "NO\0REL8\0REL16\0REL32\0UIMM8\0UIMM16\0UIMM32\0R8\0R16\0R32\0" + "IMM8\0IMM16\0IMM32\0RM8\0RM16\0RM32\0M8\0M16\0M32\0" + "M1616\0M1632\0M16N32\0M16N16\0M32N32\0" + "MOFFS8\0MOFFS16\0MOFFS32\0CL\0" + "AL\0AX\0EAX\0DX\0SS\0DS\0ES\0FS\0GS\0SREG\0CS\0"); + LoadList("ST_SEG_REGS","ES\0CS\0SS\0DS\0FS\0GS\0"); + LoadStr("ST_EXPECTING_INTEGER","expecting integer at "); + LoadStr("ST_DIVIDE_BY_ZERO","Divide by zero at "); + LoadStr("ST_OPT_INTERNAL_ERROR","Compiler Optimization Error at "); + LoadStr("ST_UNRESOLVED_REFERENCE","Unresolved Reference:"); + LoadStr("ST_NOT_DEFINED","Not Defined"); + LoadStr("ST_SCANNING_DIRECTORY","Scanning Directory:"); + LoadStr("ST_ASM_NOT_ALLOWED","ASM not allowed"); + LoadStr("ST_UNUSED_VAR","Unused Var"); + LoadStr("ST_NOT_ALLOWED_IN_FUNCTION","Not allowed in function"); + LoadStr("ST_MISSING_CATCH","missing 'catch' at"); + LoadStr("ST_UNDEFINED_GOTO_LABEL","Undefined goto label:"); + LoadStr("ST_BREAK_NOT_ALLOWED","'break' not allowed\r\n"); + LoadStr("ST_CONTINUE_NOT_ALLOWED","'continue' not allowed\r\n"); + LoadStr("ST_ERRORS_WARNINGS","Errors:%04d Warnings:%04d Size:%08X\r\n"); + LoadStr("ST_IMPORT_NOT_NEEDED","import not needed at "); + LoadStr("ST_EXPECTING_CASE","expecting 'case' at "); + LoadStr("ST_CASE_RANGE_ERROR","switch range error at "); + LoadStr("ST_LEX_STACK_OVERFLOW","Lex Stack overflow"); + LoadStr("ST_STRING_DEFAULT","String defaults not implemented in static mode at "); + +$AN,"Anchor for inserting Compiler systext","COMPILE_SYSTEXT"$ + + + LoadList("ST_INTERMEDIATE_CODE", + +//The first character is a flag +// '*' means it is a dereferrence instruction +// '=' means it is an assignment instruction + +".NULL\0" +".NOP\0" +".END_EXP\0" +".ZERO\0" +".U8\0" +".U4\0" +".U2\0" +".U1\0" +".DOUBLE\0" +".STRING_CONSTANT\0" +".EBP\0" +".FS\0" +".ESI\0" +".EDI\0" +".TO_DOUBLE\0" +".TO_INT\0" +".COM\0" +".NOT\0" +".UNARY_MINUS\0" +".ADDRESS\0" +".U8_DISP32\0" +".U4_DISP32\0" +".U2_DISP32\0" +".U1_DISP32\0" +".U8_DISP8\0" +".U4_DISP8\0" +".U2_DISP8\0" +".U1_DISP8\0" +".FS_U8_DISP32\0" +".FS_U4_DISP32\0" +".FS_U2_DISP32\0" +".FS_U1_DISP32\0" +".ESI_U8_DISP32\0" +".ESI_U4_DISP32\0" +".ESI_U2_DISP32\0" +".ESI_U1_DISP32\0" +".ESI_U8_DISP8\0" +".ESI_U4_DISP8\0" +".ESI_U2_DISP8\0" +".ESI_U1_DISP8\0" +".EDI_U8_DISP32\0" +".EDI_U4_DISP32\0" +".EDI_U2_DISP32\0" +".EDI_U1_DISP32\0" +".EDI_U8_DISP8\0" +".EDI_U4_DISP8\0" +".EDI_U2_DISP8\0" +".EDI_U1_DISP8\0" +"*DEREF_U8\0" +"*DEREF_U4\0" +"*DEREF_U2\0" +"*DEREF_U1\0" +"*ESI_DEREF_U8\0" +"*ESI_DEREF_U4\0" +"*ESI_DEREF_U2\0" +"*ESI_DEREF_U1\0" +"*EDI_DEREF_U8\0" +"*EDI_DEREF_U4\0" +"*EDI_DEREF_U2\0" +"*EDI_DEREF_U1\0" +"*U8_PP\0" +"*U4_PP\0" +"*U2_PP\0" +"*U1_PP\0" +"*U8_MM\0" +"*U4_MM\0" +"*U2_MM\0" +"*U1_MM\0" +"*PP_U8\0" +"*PP_U4\0" +"*PP_U2\0" +"*PP_U1\0" +"*MM_U8\0" +"*MM_U4\0" +"*MM_U2\0" +"*MM_U1\0" +"*ESI_U4_PP\0" +"*ESI_U4_MM\0" +"*ESI_PP_U4\0" +"*ESI_MM_U4\0" +"*EDI_U4_PP\0" +"*EDI_U4_MM\0" +"*EDI_PP_U4\0" +"*EDI_MM_U4\0" +".LEA_DISP32_EBP\0" +".LEA_DISP8_EBP\0" +".U8_DISP32_SCALED\0" +".U4_DISP32_SCALED\0" +".U2_DISP32_SCALED\0" +".SHL\0" +".SHR\0" +".SHL_CONSTANT1\0" +".SHL_CONSTANT2\0" +".SHR_CONSTANT1\0" +".SHR_CONSTANT2\0" +".POWER\0" +".MULTIPLICATION\0" +".DIVISION\0" +".REMAINDER\0" +".AND\0" +".OR\0" +".XOR\0" +".ADDITION\0" +".SUBTRACTION\0" +".EQUAL_EQUAL\0" +".NOT_EQUAL_TO\0" +".LESS_THAN\0" +".GREATER_THAN\0" +".LESS_OR_EQUAL\0" +".GREATER_OR_EQUAL\0" +".AND_AND\0" +".OR_OR\0" +".XOR_XOR\0" +".COLON\0" +".QUESTION\0" +"=ASSIGN_U8\0" +"=ASSIGN_U4\0" +"=ASSIGN_U2\0" +"=ASSIGN_U1\0" +"=SHL_EQUAL_U8\0" +"=SHL_EQUAL_U4\0" +"=SHL_EQUAL_U2\0" +"=SHL_EQUAL_U1\0" +"=SHR_EQUAL_U8\0" +"=SHR_EQUAL_U4\0" +"=SHR_EQUAL_U2\0" +"=SHR_EQUAL_U1\0" +"=MUL_EQUAL_U8\0" +"=MUL_EQUAL_U4\0" +"=MUL_EQUAL_U2\0" +"=MUL_EQUAL_U1\0" +"=DIV_EQUAL_U8\0" +"=DIV_EQUAL_U4\0" +"=DIV_EQUAL_U2\0" +"=DIV_EQUAL_U1\0" +"=AND_EQUAL_U8\0" +"=AND_EQUAL_U4\0" +"=AND_EQUAL_U2\0" +"=AND_EQUAL_U1\0" +"=OR_EQUAL_U8\0" +"=OR_EQUAL_U4\0" +"=OR_EQUAL_U2\0" +"=OR_EQUAL_U1\0" +"=XOR_EQUAL_U8\0" +"=XOR_EQUAL_U4\0" +"=XOR_EQUAL_U2\0" +"=XOR_EQUAL_U1\0" +"=ADD_EQUAL_U8\0" +"=ADD_EQUAL_U4\0" +"=ADD_EQUAL_U2\0" +"=ADD_EQUAL_U1\0" +"=SUB_EQUAL_U8\0" +"=SUB_EQUAL_U4\0" +"=SUB_EQUAL_U2\0" +"=SUB_EQUAL_U1\0" +"=ESI_ASSIGN_U4\0" +"=ESI_SHL_EQUAL_U4\0" +"=ESI_SHR_EQUAL_U4\0" +"=ESI_MUL_EQUAL_U4\0" +"=ESI_DIV_EQUAL_U4\0" +"=ESI_AND_EQUAL_U4\0" +"=ESI_OR_EQUAL_U4\0" +"=ESI_XOR_EQUAL_U4\0" +"=ESI_ADD_EQUAL_U4\0" +"=ESI_SUB_EQUAL_U4\0" +"=EDI_ASSIGN_U4\0" +"=EDI_SHL_EQUAL_U4\0" +"=EDI_SHR_EQUAL_U4\0" +"=EDI_MUL_EQUAL_U4\0" +"=EDI_DIV_EQUAL_U4\0" +"=EDI_AND_EQUAL_U4\0" +"=EDI_OR_EQUAL_U4\0" +"=EDI_XOR_EQUAL_U4\0" +"=EDI_ADD_EQUAL_U4\0" +"=EDI_SUB_EQUAL_U4\0" +".ADD64\0" +".ADD32\0" +".ADD8\0" +".INC\0" +".SUB64\0" +".SUB32\0" +".SUB8\0" +".DEC\0" +".ENTER\0" +".LEAVE\0" +".ENTER1\0" +".LEAVE1\0" +".ENTER2\0" +".LEAVE2\0" +".ADD_ESP32\0" +".ADD_ESP8\0" +".RET\0" +".CALL\0" +".CALL_INDIRECT\0" +".CALL_INDIRECT2\0" +".IRQ\0" +".CLI\0" +".STI\0" +".GET_FLAGS\0" +".SET_FLAGS\0" +".GET_BASE_PTR\0" +".SET_BASE_PTR\0" +".GET_STACK_PTR\0" +".SET_STACK_PTR\0" +".GET_LABEL\0" +".ABSOLUTE_ADDRESS\0" +".LABEL\0" +".TYPE\0" +".BT\0" +".BTS\0" +".BTR\0" +".BTC\0" +".BSF\0" +".BSR\0" +".INSQUE\0" +".INSQUE_REV\0" +".REMQUE\0" +".STRLEN\0" +".MEMCPY\0" +".MEMSET\0" +".INPD\0" +".INPW\0" +".INP\0" +".OUTPD\0" +".OUTPW\0" +".OUTP\0" +".JMP\0" +".SHORT_JMP\0" +".SWITCH\0" +".SKIPZ\0" +".SKIPZ2\0" +".SKIPNZ\0" +".SKIPNZ2\0" +".EQUAL_EQUAL_SKIPZ\0" +".EQUAL_EQUAL_SKIPZ2\0" +".NOT_EQUAL_TO_SKIPZ\0" +".NOT_EQUAL_TO_SKIPZ2\0" +".LESS_THAN_SKIPZ\0" +".LESS_THAN_SKIPZ2\0" +".GREATER_THAN_SKIPZ\0" +".GREATER_THAN_SKIPZ2\0" +".LESS_OR_EQUAL_SKIPZ\0" +".LESS_OR_EQUAL_SKIPZ2\0" +".GREATER_OR_EQUAL_SKIPZ\0" +".GREATER_OR_EQUAL_SKIPZ2\0" +".AND_AND_SKIPZ\0" +".AND_AND_SKIPZ2\0" +".AND_AND_SKIPNZ\0" +".AND_AND_SKIPNZ2\0" +".OR_OR_SKIPZ\0" +".OR_OR_SKIPZ2\0" +".OR_OR_SKIPNZ\0" +".OR_OR_SKIPNZ2\0" +".LEA_DISP32_ESI\0" +".LEA_DISP8_ESI\0" +".LEA_DISP32_EDI\0" +".LEA_DISP8_EDI\0" +".PUSH_U8\0" +".PUSH_U4\0" +".PUSH_U2\0" +".PUSH_U1\0" +".PUSH_NEG_U4\0" +".PUSH_NEG_U2\0" +".PUSH_NEG_U1\0" +".PUSH_DOUBLE\0" +".PUSH_U8_DISP32\0" +".PUSH_U8_DISP8\0" +".PUSH_ESI_U8_DISP32\0" +".PUSH_ESI_U8_DISP8\0" +".PUSH_EDI_U8_DISP32\0" +".PUSH_EDI_U8_DISP8\0" +".PUSH_DEREF_U8\0" +".PUSH_U8_DISP32_SCALED\0" +".BT_CONSTANT\0" +".BTS_CONSTANT\0" +".BTR_CONSTANT\0" +".BTC_CONSTANT\0" +"*ESI_NEXT_EQUAL_U4\0" +"*EDI_NEXT_EQUAL_U4\0" +".ADD_EQUAL_U8_CONSTANT_U1\0" +".SUB_EQUAL_U8_CONSTANT_U1\0" +".ADD_EQUAL_U4_CONSTANT_U1\0" +".ESI_ADD_EQUAL_U4_CONSTANT_U1\0" +".EDI_ADD_EQUAL_U4_CONSTANT_U1\0" +); +} + +void FillCompilerTables() +{ + I1 *st,buf[128]; + U1 *d; + U8 i; + I8 j; + U2 *u; + U4 *d4; + + assign_bitmap=MAllocZ((EC_NUM_ENTRIES+7)>>3); + deref_bitmap=MAllocZ((EC_NUM_ENTRIES+7)>>3); + push_bitmap=MAllocZ((EC_NUM_ENTRIES+7)>>3); + push_map=MAllocZ(sizeof(U2)*EC_NUM_ENTRIES); + st=SysText("ST_INTERMEDIATE_CODE"); + for (i=0;i=0) + push_map[i]=j; + st+=StrLen(st)+1; + } + + d=MAllocZ(EC_NUM_ENTRIES); + unsigned_fix_up_table=d; + d[EC_ADD8]=FUT_8_4; + d[EC_SUB8]=FUT_8_4; + d[EC_IRQ]=FUT_8_1; + d[EC_ADD_ESP8]=FUT_8_1; + d[EC_U1_DISP8]=FUT_8_1; + d[EC_U2_DISP8]=FUT_8_1; + d[EC_U4_DISP8]=FUT_8_1; + d[EC_U8_DISP8]=FUT_8_6; + d[EC_PUSH_U8_DISP8]=FUT_8_6; + d[EC_ESI_U1_DISP8]=FUT_8_1; + d[EC_ESI_U2_DISP8]=FUT_8_1; + d[EC_ESI_U4_DISP8]=FUT_8_1; + d[EC_ESI_U8_DISP8]=FUT_8_6; + d[EC_PUSH_ESI_U8_DISP8]=FUT_8_6; + d[EC_EDI_U1_DISP8]=FUT_8_1; + d[EC_EDI_U2_DISP8]=FUT_8_1; + d[EC_EDI_U4_DISP8]=FUT_8_1; + d[EC_EDI_U8_DISP8]=FUT_8_6; + d[EC_PUSH_EDI_U8_DISP8]=FUT_8_6; + d[EC_LEA_DISP8_EBP]=FUT_8_1; + d[EC_LEA_DISP8_ESI]=FUT_8_1; + d[EC_LEA_DISP8_EDI]=FUT_8_1; + d[EC_SHL_CONSTANT1]=FUT_8_6; + d[EC_SHL_CONSTANT2]=FUT_8_5; + d[EC_SHR_CONSTANT1]=FUT_8_6; + d[EC_SHR_CONSTANT2]=FUT_8_5; + d[EC_ADD_EQUAL_U8_CONSTANT_U1]=FUT_8_10; + d[EC_SUB_EQUAL_U8_CONSTANT_U1]=FUT_8_10; + d[EC_ADD_EQUAL_U4_CONSTANT_U1]=FUT_8_5; + d[EC_ESI_ADD_EQUAL_U4_CONSTANT_U1]=FUT_8_5; + d[EC_EDI_ADD_EQUAL_U4_CONSTANT_U1]=FUT_8_5; + d[EC_BT_CONSTANT]=FUT_8_6; + d[EC_BTS_CONSTANT]=FUT_8_6; + d[EC_BTR_CONSTANT]=FUT_8_6; + d[EC_BTC_CONSTANT]=FUT_8_6; + + d[EC_CALL]=FUT_32_4_CALL; + + d[EC_U8]=FUT_64_H9_L4; + d[EC_U4]=FUT_32_4; + d[EC_U1]=FUT_8_1; + d[EC_DOUBLE]=FUT_64_H9_L4; + d[EC_PUSH_U8]=FUT_64_H9_L4; + d[EC_PUSH_DOUBLE]=FUT_64_H9_L4; + d[EC_PUSH_U4]=FUT_32_4; + d[EC_PUSH_U2]=FUT_32_4; + d[EC_PUSH_U1]=FUT_8_1; + d[EC_PUSH_NEG_U4]=FUT_32_4; + d[EC_PUSH_NEG_U2]=FUT_32_4; + d[EC_PUSH_NEG_U1]=FUT_8_1; + d[EC_ADD32]=FUT_32_7; + d[EC_SUB32]=FUT_32_7; + d[EC_ADD_ESP32]=FUT_32_4; + d[EC_ENTER]=FUT_32_4; + d[EC_ENTER1]=FUT_ENTER1; + d[EC_ENTER2]=FUT_ENTER2; + d[EC_LEAVE]=FUT_32_6; + d[EC_LEAVE1]=FUT_32_6; + d[EC_LEAVE2]=FUT_32_6; + d[EC_TYPE]=FUT_32_4; + d[EC_U1_DISP32]=FUT_32_4; + d[EC_U2_DISP32]=FUT_32_4; + d[EC_U4_DISP32]=FUT_32_4; + d[EC_U8_DISP32]=FUT_32_9; + d[EC_PUSH_U8_DISP32]=FUT_32_9; + d[EC_ESI_U1_DISP32]=FUT_32_4; + d[EC_ESI_U2_DISP32]=FUT_32_4; + d[EC_ESI_U4_DISP32]=FUT_32_4; + d[EC_ESI_U8_DISP32]=FUT_32_9; + d[EC_PUSH_ESI_U8_DISP32]=FUT_32_9; + d[EC_EDI_U1_DISP32]=FUT_32_4; + d[EC_EDI_U2_DISP32]=FUT_32_4; + d[EC_EDI_U4_DISP32]=FUT_32_4; + d[EC_EDI_U8_DISP32]=FUT_32_9; + d[EC_PUSH_EDI_U8_DISP32]=FUT_32_9; + d[EC_FS_U1_DISP32]=FUT_32_4; + d[EC_FS_U2_DISP32]=FUT_32_4; + d[EC_FS_U4_DISP32]=FUT_32_4; + d[EC_FS_U8_DISP32]=FUT_32_4P10_4; + d[EC_LEA_DISP32_EBP]=FUT_32_4; + d[EC_LEA_DISP32_ESI]=FUT_32_4; + d[EC_LEA_DISP32_EDI]=FUT_32_4; + d[EC_CALL_INDIRECT]=FUT_32_4; + d[EC_U2_DISP32_SCALED]=FUT_32_6; + d[EC_U4_DISP32_SCALED]=FUT_32_6; + d[EC_U8_DISP32_SCALED]=FUT_32_9; + d[EC_PUSH_U8_DISP32_SCALED]=FUT_32_9; + + d[EC_CALL_INDIRECT2]=FUT_32_4_ABS; + d[EC_ABSOLUTE_ADDRESS]=FUT_32_4_ABS; + + d[EC_STRING_CONSTANT]=FUT_32_4_ABS2; + d[EC_GET_LABEL]=FUT_32_4_ABS2; + d[EC_SWITCH]=FUT_32_4_ABS2; + + d[EC_SKIPZ2]=FUT_32_JMP_4; + d[EC_SKIPNZ2]=FUT_32_JMP_4; + d[EC_OR_OR_SKIPZ2]=FUT_32_JMP_4; + d[EC_OR_OR_SKIPNZ2]=FUT_32_JMP_4; + d[EC_AND_AND_SKIPZ2]=FUT_32_JMP_4; + d[EC_AND_AND_SKIPNZ2]=FUT_32_JMP_4; + d[EC_LESS_THAN_SKIPZ2]=FUT_32_JMP_4; + d[EC_GREATER_THAN_SKIPZ2]=FUT_32_JMP_4; + d[EC_EQUAL_EQUAL_SKIPZ2]=FUT_32_JMP_4; + d[EC_NOT_EQUAL_TO_SKIPZ2]=FUT_32_JMP_4; + d[EC_GREATER_OR_EQUAL_SKIPZ2]=FUT_32_JMP_4; + d[EC_LESS_OR_EQUAL_SKIPZ2]=FUT_32_JMP_4; + d[EC_JMP]=FUT_32_JMP_4; + + d[EC_SKIPZ]=FUT_8_JMP_1; + d[EC_SKIPNZ]=FUT_8_JMP_1; + d[EC_OR_OR_SKIPZ]=FUT_8_JMP_1; + d[EC_OR_OR_SKIPNZ]=FUT_8_JMP_1; + d[EC_AND_AND_SKIPZ]=FUT_8_JMP_1; + d[EC_AND_AND_SKIPNZ]=FUT_8_JMP_1; + d[EC_LESS_THAN_SKIPZ]=FUT_8_JMP_1; + d[EC_GREATER_THAN_SKIPZ]=FUT_8_JMP_1; + d[EC_EQUAL_EQUAL_SKIPZ]=FUT_8_JMP_1; + d[EC_NOT_EQUAL_TO_SKIPZ]=FUT_8_JMP_1; + d[EC_GREATER_OR_EQUAL_SKIPZ]=FUT_8_JMP_1; + d[EC_LESS_OR_EQUAL_SKIPZ]=FUT_8_JMP_1; + d[EC_SHORT_JMP]=FUT_8_JMP_1; + + d=MAllocZ(EC_NUM_ENTRIES); + signed_fix_up_table=d; + + d[EC_ADD_ESP8]=FUT_8_1; + d[EC_U1_DISP8]=FUT_8_2; + d[EC_U2_DISP8]=FUT_8_2; + d[EC_U4_DISP8]=FUT_8_2; + d[EC_ESI_U1_DISP8]=FUT_8_2; + d[EC_ESI_U2_DISP8]=FUT_8_2; + d[EC_ESI_U4_DISP8]=FUT_8_2; + d[EC_EDI_U1_DISP8]=FUT_8_2; + d[EC_EDI_U2_DISP8]=FUT_8_2; + d[EC_EDI_U4_DISP8]=FUT_8_2; + d[EC_SHR_CONSTANT1]=FUT_8_6; + d[EC_SHR_CONSTANT2]=FUT_8_4; + d[EC_ADD_EQUAL_U4_CONSTANT_U1]=FUT_8_4; + d[EC_ESI_ADD_EQUAL_U4_CONSTANT_U1]=FUT_8_4; + d[EC_EDI_ADD_EQUAL_U4_CONSTANT_U1]=FUT_8_4; + + d[EC_U4]=FUT_32_5; + d[EC_U1_DISP32]=FUT_32_5; + d[EC_U2_DISP32]=FUT_32_5; + d[EC_U4_DISP32]=FUT_32_5; + d[EC_ESI_U1_DISP32]=FUT_32_5; + d[EC_ESI_U2_DISP32]=FUT_32_5; + d[EC_ESI_U4_DISP32]=FUT_32_5; + d[EC_EDI_U1_DISP32]=FUT_32_5; + d[EC_EDI_U2_DISP32]=FUT_32_5; + d[EC_EDI_U4_DISP32]=FUT_32_5; + d[EC_FS_U1_DISP32]=FUT_32_5; + d[EC_FS_U2_DISP32]=FUT_32_5; + d[EC_FS_U4_DISP32]=FUT_32_5; + d[EC_LEA_DISP32_EBP]=FUT_32_4; + d[EC_U2_DISP32_SCALED]=FUT_32_5; + d[EC_U4_DISP32_SCALED]=FUT_32_5; + + d[EC_ABSOLUTE_ADDRESS]=FUT_32_4_ABS; + + d[EC_GET_LABEL]=FUT_32_4_ABS2; + d[EC_SWITCH]=FUT_32_4_ABS2; + + d[EC_SKIPZ2]=FUT_32_JMP_4; + d[EC_SKIPNZ2]=FUT_32_JMP_4; + d[EC_OR_OR_SKIPZ2]=FUT_32_JMP_4; + d[EC_OR_OR_SKIPNZ2]=FUT_32_JMP_4; + d[EC_AND_AND_SKIPZ2]=FUT_32_JMP_4; + d[EC_AND_AND_SKIPNZ2]=FUT_32_JMP_4; + d[EC_LESS_THAN_SKIPZ2]=FUT_32_JMP_4; + d[EC_GREATER_THAN_SKIPZ2]=FUT_32_JMP_4; + d[EC_EQUAL_EQUAL_SKIPZ2]=FUT_32_JMP_4; + d[EC_NOT_EQUAL_TO_SKIPZ2]=FUT_32_JMP_4; + d[EC_GREATER_OR_EQUAL_SKIPZ2]=FUT_32_JMP_4; + d[EC_LESS_OR_EQUAL_SKIPZ2]=FUT_32_JMP_4; + + d[EC_SKIPZ]=FUT_8_JMP_1; + d[EC_SKIPNZ]=FUT_8_JMP_1; + d[EC_OR_OR_SKIPZ]=FUT_8_JMP_1; + d[EC_OR_OR_SKIPNZ]=FUT_8_JMP_1; + d[EC_AND_AND_SKIPZ]=FUT_8_JMP_1; + d[EC_AND_AND_SKIPNZ]=FUT_8_JMP_1; + d[EC_LESS_THAN_SKIPZ]=FUT_8_JMP_1; + d[EC_GREATER_THAN_SKIPZ]=FUT_8_JMP_1; + d[EC_EQUAL_EQUAL_SKIPZ]=FUT_8_JMP_1; + d[EC_NOT_EQUAL_TO_SKIPZ]=FUT_8_JMP_1; + d[EC_GREATER_OR_EQUAL_SKIPZ]=FUT_8_JMP_1; + d[EC_LESS_OR_EQUAL_SKIPZ]=FUT_8_JMP_1; + + d=MAllocZ(EC_NUM_ENTRIES); + double_fix_up_table=d; + + d[EC_LESS_THAN_SKIPZ2]=FUT_32_JMP_4; + d[EC_GREATER_THAN_SKIPZ2]=FUT_32_JMP_4; + d[EC_GREATER_OR_EQUAL_SKIPZ2]=FUT_32_JMP_4; + d[EC_LESS_OR_EQUAL_SKIPZ2]=FUT_32_JMP_4; + + d[EC_LESS_THAN_SKIPZ]=FUT_8_JMP_1; + d[EC_GREATER_THAN_SKIPZ]=FUT_8_JMP_1; + d[EC_GREATER_OR_EQUAL_SKIPZ]=FUT_8_JMP_1; + d[EC_LESS_OR_EQUAL_SKIPZ]=FUT_8_JMP_1; + d[EC_SHORT_JMP]=FUT_8_JMP_1; + + u=MAllocZ(sizeof(U2)*TK_NUM_TK); + duel_I1_tokens1=u; + u['!']=256*TK_NOT_EQUAL+'='; + u['&']=256*TK_AND_AND+'&'; + u['*']=256*TK_MUL_EQUAL+'='; + u['+']=256*TK_PLUS_PLUS+'+'; + u['-']=256*TK_DEREFERRENCE+'>'; + u['/']='*'; + u[':']=256*TK_DOUBLE_COLON+':'; + u['<']=256*TK_LESS_EQUAL+'='; + u['=']=256*TK_EQUAL_EQUAL+'='; + u['>']=256*TK_GREATER_EQUAL+'='; + u['^']=256*TK_XOR_EQUAL+'='; + u['|']=256*TK_OR_OR+'|'; + + u=MAllocZ(sizeof(U2)*TK_NUM_TK); + duel_I1_tokens2=u; + u['&']=256*TK_AND_EQUAL+'='; + u['+']=256*TK_ADD_EQUAL+'='; + u['-']=256*TK_MINUS_MINUS+'-'; + u['/']='/'; + u['<']=256*TK_SHL+'<'; + u['>']=256*TK_SHR+'>'; + u['^']=256*TK_XOR_XOR+'^'; + u['|']=256*TK_OR_EQUAL+'='; + + u=MAllocZ(sizeof(U2)*TK_NUM_TK); + duel_I1_tokens3=u; + u['-']=256*TK_SUB_EQUAL+'='; + u['/']=256*TK_DIV_EQUAL+'='; + u['>']=256*TK_CAST+'<'; + + d4=MAllocZ(sizeof(U4)*TK_NUM_TK); + binary_ops_table=d4; + + d4['`'] =0x20000+EC_POWER; + d4[TK_SHL] =0x20000+EC_SHL; + d4[TK_SHR] =0x20000+EC_SHR; + + d4['*'] =0x30000+EC_MULTIPLICATION; + d4['/'] =0x30000+EC_DIVISION; + d4['%'] =0x30000+EC_REMAINDER; + + d4['&'] =0x40000+EC_AND; + + d4['|'] =0x50000+EC_OR; + d4['^'] =0x50000+EC_XOR; + + d4['+'] =0x60000+EC_ADDITION; + d4['-'] =0x60000+EC_SUBTRACTION; + + d4[TK_EQUAL_EQUAL] =0x70000+EC_EQUAL_EQUAL; + d4[TK_NOT_EQUAL] =0x70000+EC_NOT_EQUAL_TO; + d4['<'] =0x70000+EC_LESS_THAN; + d4['>'] =0x70000+EC_GREATER_THAN; + d4[TK_LESS_EQUAL] =0x70000+EC_LESS_OR_EQUAL; + d4[TK_GREATER_EQUAL]=0x70000+EC_GREATER_OR_EQUAL; + + d4[TK_AND_AND] =0x80000+EC_AND_AND; + + d4[TK_OR_OR] =0x90000+EC_OR_OR; + d4[TK_XOR_XOR] =0x90000+EC_XOR_XOR; + + d4[':'] =0xA0000+EC_COLON; + d4['?'] =0xA0000+EC_QUESTION; + + d4['='] =0x100000+EC_ASSIGN_U8; + d4[TK_SHL_EQUAL]=0x100000+EC_SHL_EQUAL_U8; + d4[TK_SHR_EQUAL]=0x100000+EC_SHR_EQUAL_U8; + d4[TK_MUL_EQUAL]=0x100000+EC_MUL_EQUAL_U8; + d4[TK_DIV_EQUAL]=0x100000+EC_DIV_EQUAL_U8; + d4[TK_AND_EQUAL]=0x100000+EC_AND_EQUAL_U8; + d4[TK_OR_EQUAL] =0x100000+EC_OR_EQUAL_U8; + d4[TK_XOR_EQUAL]=0x100000+EC_XOR_EQUAL_U8; + d4[TK_ADD_EQUAL]=0x100000+EC_ADD_EQUAL_U8; + d4[TK_SUB_EQUAL]=0x100000+EC_SUB_EQUAL_U8; + + d4=MAllocZ(sizeof(U4)*TK_NUM_TK); + unary_ops_table=d4; + d4['~']=0x10000+EC_COM; + d4['!']=0x10000+EC_NOT; + d4['-']=0x10000+EC_UNARY_MINUS; + d4['&']=0x10000+EC_ADDRESS; + d4['*']=0x10000+EC_DEREF_U8; + + d4=unsigned_code_table[EC_ABSOLUTE_ADDRESS+1]-4; + *d4=offset(TssStruct.absolute_address); + + for (i=0;ilast_lex); + ext[EXT_SPRINTF_JOIN]=&SPrintFJoin2; + ext[EXT_GETF_JOIN]=&GetFJoin2; + ext[EXT_EXECUTE_FILE]=&ExecuteFile; + ext[EXT_EXECUTE_STRING]=&ExecuteString; + InitCompiler(TRUE); + try { + Lex(l); + ExecuteCmdLine(l); + } catch + CatchAll; + RemQue(l); + LexDel(l); +} diff --git a/LT/COMPILE/DoTest.CPZ b/LT/COMPILE/DoTest.CPZ new file mode 100644 index 0000000000000000000000000000000000000000..3d62ee3fb97b3d10f259da01f4cb96da35d86368 GIT binary patch literal 42 pcmZ?H&n?KzNp;K2N!3saNi8nXa}J17(zNE~^2tw3fe3-Q3;-g~3-bT~ literal 0 HcmV?d00001 diff --git a/LT/COMPILE/LEX.CPZ b/LT/COMPILE/LEX.CPZ new file mode 100644 index 0000000..6a74637 --- /dev/null +++ b/LT/COMPILE/LEX.CPZ @@ -0,0 +1,1687 @@ +extern BoolU4 GetExpression(LexStruct *l,U1 **exp); +extern I8 Lex(LexStruct *l); +extern U8 PrsUnaryTerm(LexStruct *l,ParseStack *ps); +extern U8 PrsUnaryModifier(LexStruct *l,ParseStack *ps); +extern U8 PrsDereferrence(LexStruct *l,ParseStack *ps); +extern ClassStruct *CmpParseClass(LexStruct *l,BoolU4 is_union,BoolU4 is_public); +extern void PrsExcept(LexStruct *l,I1 *name=NULL,I1 *msg=NULL); +extern void CmpParseVarList(LexStruct *l,ClassStruct *tempc, + I8 mode,U8 union_base=MAX_I4); +extern BoolU4 CmpParseStatement(LexStruct *l,ClassStruct *locals,I8 try_count=0, + CbMiscStruct *break_label=NULL,CbMiscStruct *continue_label=NULL, + BoolU4 saved_prs_semicolon=TRUE); +extern I8 ExecuteCmdLine(LexStruct *l); +extern I8 ExecuteString(I1 *buf,I1 *filename=NULL); +extern I8 ExecuteFile(I1 *name); +extern void ContinueUserTask(); +extern IntermediateCode *CmpOptPass1(LexStruct *l,ClassStruct *fun_class,BoolU4 combined); +extern void CmpOptPass2(LexStruct *l,ClassStruct *fun_class); +extern void CmpOptPass3(LexStruct *l,ClassStruct *fun_class); +extern void CmpOptPass4(LexStruct *l,ClassStruct *fun_class); + +LTextern CODE_TABLE U4 code_table[1]; +LTextern UNSIGNED_CODE_TABLE U4 unsigned_code_table[1]; +LTextern DOUBLE_CODE_TABLE U4 double_code_table[1]; +LTextern INTERNAL_TYPES_TABLE U1 internal_types_table[1]; + +SysHashTable *asm_hash; +BoolU4 is_first_compiler; +SysHashEntry *sys_internal_types[IT_NUM_IT]; +U1 it_to_ec_offset[IT_NUM_IT]={0,0,3,3,2,2,1,1,0,0,0,0}; + + +#define FUT_NULL 0 +#define FUT_8_1 1 +#define FUT_8_2 2 +#define FUT_8_4 3 +#define FUT_8_5 4 +#define FUT_8_6 5 +#define FUT_8_10 6 +#define FUT_8_JMP_1 7 +#define FUT_32_4 8 +#define FUT_32_4_CALL 9 +#define FUT_32_4_ABS 10 +#define FUT_32_4_ABS2 11 +#define FUT_32_5 12 +#define FUT_32_6 13 +#define FUT_32_7 14 +#define FUT_32_9 15 +#define FUT_32_4_ENTER 16 +#define FUT_32_4P11_4 17 +#define FUT_32_JMP_4 18 +#define FUT_64_H9_L4 19 +#define FUT_ENTER1 20 +#define FUT_ENTER2 21 +#define FUT_32_4P10_4 22 + +U1 *signed_fix_up_table,*unsigned_fix_up_table,*double_fix_up_table; + +U2 *duel_I1_tokens1,*duel_I1_tokens2,*duel_I1_tokens3; +U4 *binary_ops_table,*unary_ops_table; +U1 *deref_bitmap,*assign_bitmap, + *push_bitmap; +U2 *push_map; + +LexStruct *LexNew(I1 *buf,U8 flags,I1 *filename) +{ + LexStruct *l=MAlloc(sizeof(LexStruct)); + LexFileStruct *tempf=&l->lfns[0]; + MemSet(l,0,offset(LexStruct.lfns)+sizeof(LexFileStruct)); + l->next=l; + l->last=l; + l->flags=flags; + l->ESI_offset=MAX_I8; + l->EDI_offset=MAX_I8; + l->hash_mask=HTT_ALL; + l->hash_table_list=Fs->hash_table; + l->define_hash_table=Fs->hash_table; + l->cur_lfn=tempf; + l->next_exe_blk=&l->next_exe_blk; + l->last_exe_blk=&l->next_exe_blk; + if (!filename) + tempf->name=NewString(sys_temp_filename); + else + tempf->name=filename; + if (flags & LF_PROMPT) + buf=MAllocZ(4); + tempf->buf=buf; + tempf->buf_ptr=buf; + tempf->line_start=buf; + tempf->line_num=1; + l->cur_buf_ptr=buf; + return l; +} + +void LexDel(LexStruct *l) +{ + LexFileStruct *tempf=l->cur_lfn; + void my_LtfDel(Ltf *l,BoolU4 adam_mem); + Ltf *ltf; + + while (tempf!=&l->lfns[0]) { + if (ltf=tempf->l) { + if (ext[EXT_LTF_DEL]) { + my_LtfDel=ext[EXT_LTF_DEL]; + my_LtfDel(ltf,FALSE); + } + } + Free(tempf->buf); + Free(tempf->name); + tempf-=sizeof(LexFileStruct); + } + Free(tempf->name); + if (!(l->flags & LF_DONT_FREE_BUFFER)) + Free(tempf->buf); + Free(l->ident); + Free(l); +} + + +void SetSourceFileInfo(LexStruct *l,SysHashEntry *h) +{ + LexFileStruct *tempf=l->cur_lfn; + h->source_link=MSPrintF("FL:%s,%d",tempf->name,tempf->line_num); + if (Bt(&l->flags,LFf_KEEP_PRIVATE)) + h->type|=HTT_PRIVATE; +} + +void LexPutToken(LexStruct *l) +{ + PutChar('"'); + if (l->token==TK_IDENT || l->token==TK_STRING) + PutS(l->ident); + else if (l->token==TK_INTEGER) + cout "INT:",l->cur_i; + else if (l->token==TK_DOUBLE) + cout "DBL:",l->cur_d; + else if (l->token>=CH_SHIFT_SPACE && l->token<=0x7E) + PutChar(l->token); + else { + cout "T:",l->token; + } + PutS("\" "); +} + +U4 lex_zeros=0,lex_line_feed=0x000A; + +void LexBackupLastChar(LexStruct *l) +{ + LexFileStruct *tempf=l->cur_lfn; + tempf->buf_ptr=l->cur_buf_ptr; + if (l->flags & LF_USE_LAST_I1) { + tempf->last_I1=l->last_I1; + l->flags&=~LF_USE_LAST_I1; + } else + tempf->last_I1=0; +} + +U8 LexGetChar(LexStruct *l) +{ + U1 *src; + LexFileStruct *tempf,*tempf1; + BoolU4 cont; + U8 result; + U1 *my_SysPrompt(BoolU4 double_semicolon); + Ltf *ltf; + LtfEntry *cl; + U1 *ptr; + void my_LtfDel(Ltf *l,BoolU4 adam_mem); + if (l->flags & LF_USE_LAST_I1) { + l->flags&=~LF_USE_LAST_I1; + return l->last_I1; + } + do { +lex_getchar_start: + src=l->cur_buf_ptr++; + switch (l->last_I1=result=*src++) { + case 0: + tempf=l->cur_lfn; + if (tempf->flags & LFSF_IS_LTF) { + ltf=tempf->l; + cl=tempf->cur_entry; + cl=cl->next; + while (cl!=ltf) { + cont=FALSE; + tempf->cur_entry=cl; + switch (cl->btype) { + case LTFT_TEXT: + if (*(src=cl->display)) + tempf->buf=tempf->buf_ptr=l->cur_buf_ptr=src; + else { + cont=TRUE; + cl=cl->next; + } + break; + case LTFT_CR: + src=&lex_line_feed; + tempf->buf=tempf->buf_ptr=l->cur_buf_ptr=src; + + tempf->line_start=cl->next; + tempf->line_num=cl->y+2; //+1 because CR is on previous line, +1 because ltf y starts at zero + compiled_lines++; + if (l->flags & LF_ECHO) + CrLf; + l->last_I1=CH_CR; + return CH_CR; + case LTFT_TAB: + src=&lex_zeros; + tempf->buf=tempf->buf_ptr=l->cur_buf_ptr=src; + + tempf->line_num=cl->y+1; + if (l->flags & LF_ECHO) + PutChar(CH_TAB); + l->last_I1=CH_TAB; + return CH_TAB; + case LTFT_PAGE_BREAK: + src=&lex_zeros; + tempf->buf=tempf->buf_ptr=l->cur_buf_ptr=src; + + tempf->line_num=cl->y+2; //TODO: should be a page down + if (l->flags & LF_ECHO) + PutChar(CH_FORM_FEED); + l->last_I1=CH_FORM_FEED; + return CH_FORM_FEED; + case LTFT_INSERT_BINARY: + src=&lex_zeros; + tempf->buf=tempf->buf_ptr=l->cur_buf_ptr=src; + + tempf->line_num=cl->y+1; + Free(l->ident); + l->ident=NULL; + l->ident_len=0; + if (cl->bin_data) { + ptr=MAlloc(cl->bin_data->size); + if (cl->bin_data->data) + MemCpy(ptr,cl->bin_data->data,cl->bin_data->size); + l->ident=ptr; + l->ident_len=cl->bin_data->size; + } + l->last_I1=TK_INSERT_BINARY; + return TK_INSERT_BINARY; + case LTFT_INSERT_BINARY_TYPE: + src=&lex_zeros; + tempf->buf=tempf->buf_ptr=l->cur_buf_ptr=src; + + if (cl->bin_data) + l->cur_i=cl->bin_data->type; + else + l->cur_i=0; + tempf->line_num=cl->y+1; + l->last_I1=TK_INSERT_BINARY_TYPE; + return TK_INSERT_BINARY_TYPE; + case LTFT_INSERT_BINARY_SIZE: + src=&lex_zeros; + tempf->buf=tempf->buf_ptr=l->cur_buf_ptr=src; + + if (cl->bin_data) + l->cur_i=cl->bin_data->size; + else + l->cur_i=0; + tempf->line_num=cl->y+1; + l->last_I1=TK_INSERT_BINARY_SIZE; + return TK_INSERT_BINARY_SIZE; + default: + cont=TRUE; + cl=cl->next; + } + if (!cont) break; + } + if (cl==ltf) { + if (ext[EXT_LTF_DEL]) { + my_LtfDel=ext[EXT_LTF_DEL]; + my_LtfDel(ltf,FALSE); + } + tempf->l=tempf->buf=NULL; + Free(tempf->name); + tempf->name=NULL; + goto here; + } + } else { +here: + tempf=l->cur_lfn; + if (tempf!=&l->lfns[0]) { + Free(tempf->name); + tempf->name=NULL; + Free(tempf->buf); + tempf->buf=NULL; + tempf1=tempf; + l->cur_lfn=tempf-=sizeof(LexFileStruct); + l->cur_buf_ptr=tempf->buf_ptr; + if (l->last_I1=tempf->last_I1) { + l->flags&=~LF_USE_LAST_I1; + return l->last_I1; + } else + l->flags&=~LF_USE_LAST_I1; + } else { + if (l->flags & LF_PROMPT) { + Free(tempf->buf); + my_SysPrompt=FindExtern("SysPrompt"); + l->cur_buf_ptr=tempf->line_start= + tempf->buf_ptr=tempf->buf=my_SysPrompt(TRUE); + } else { + l->last_I1=TK_EOF; + l->cur_buf_ptr=src-1; + return TK_EOF; + } + } + } + break; + case CH_CURSOR: + case CH_FORM_FEED: + goto lex_getchar_start; + case CH_LINE_FEED: + tempf=l->cur_lfn; + if (tempf->flags & LFSF_IS_LTF) + return result; + else { + tempf->line_num++; + compiled_lines++; + tempf->line_start=src; + } + default: + if (l->flags & LF_ECHO) + PutChar(result); + return result; + } + } while (TRUE); +} + +void LexSkipEol(LexStruct *l) +{ + U1 ch; + do ch=LexGetChar(l); + while (ch && ch!=CH_CR && ch!=CH_LINE_FEED); +} + +void DelExpression(U1 *code) +{ + Free(code); +} + + +U8 EvalExpression(LexStruct *l) +{ + U1 *exp; + U8 result=0; + if (!GetExpression(l,&exp)) + LexSkipEol(l); + else { + result=Run(exp); + DelExpression(exp); + } + return result; +} + +void LexIncludeString(LexStruct *l,I1 *filename, + I1 *src,BoolU4 actual_file) +{ + LexFileStruct *tempf; + LexBackupLastChar(l); + tempf=l->cur_lfn+sizeof(LexFileStruct); + l->cur_lfn=tempf; + tempf->buf=src; + tempf->buf_ptr=src; + tempf->line_num=1; + tempf->line_start=src; + tempf->last_I1=0; + if (actual_file) { + tempf->name=AbsoluteFileName(filename); + tempf->flags=LFSF_IS_INCLUDED; + } else { + tempf->name=NewString(sys_temp_filename); + tempf->flags=0; + } + l->cur_buf_ptr=src; +} + +void LexIncludeLtf(LexStruct *l,I1 *filename) +{ + BoolU4 is_null; + LtfEntry *cl; + Ltf *my_LtfRead(I1 *name,U8 flags); + Ltf *ltf; + LexFileStruct *tempf; + + LexBackupLastChar(l); + tempf=l->cur_lfn+sizeof(LexFileStruct); + l->cur_lfn=tempf; + tempf->line_start=&lex_zeros; + if (!ext[EXT_LTF_READ]) + throw(EXCEPT_COMPILER,1); //This should never happen + my_LtfRead=ext[EXT_LTF_READ]; + ltf=my_LtfRead(filename,LTFF_DOUBLE_DOLLARS); + if (!ltf) + is_null=TRUE; + else { + tempf->l=ltf; + cl=ltf->dummy.next; + while (cl!=ltf) { + if (cl->btype==LTFT_TEXT) + break; + if (cl->btype==LTFT_TAB) + break; + if (cl->btype==LTFT_CR) + break; + if (cl->btype==LTFT_INSERT_BINARY) + break; + if (cl->btype==LTFT_INSERT_BINARY_TYPE) + break; + if (cl->btype==LTFT_INSERT_BINARY_SIZE) + break; + cl=cl->next; + } + if (cl!=ltf) { + tempf->line_start=cl; + tempf->line_num=cl->y+1; + if (cl->btype==LTFT_TEXT) { + tempf->cur_entry=cl; + tempf->buf=cl->display; + tempf->buf_ptr=cl->display; + } else { + tempf->cur_entry=cl->last; //TODO might be problem at begining of file + tempf->buf=&lex_zeros; + tempf->buf_ptr=&lex_zeros; + } + is_null=FALSE; + } else + is_null=TRUE; + } + tempf->name=AbsoluteFileName(filename); + if (is_null) { + tempf->flags=LFSF_IS_INCLUDED; + tempf->buf=&lex_zeros; + tempf->buf_ptr=&lex_zeros; + tempf->line_num=1; + } else + tempf->flags=LFSF_IS_INCLUDED|LFSF_IS_LTF; + tempf->last_I1=0; + l->cur_buf_ptr=tempf->buf_ptr; +} + +void LexPush(LexStruct *l) +{ + LexFileStruct *tempf=l->cur_lfn, + *tempf1=&l->stack[l->stack_ptr++]; + if (l->stack_ptr>=LFN_STACK_CNT) + PrsExcept(l,"ST_LEX_STACK_OVERFLOW"); + LexBackupLastChar(l); + if (tempf->last_I1) + l->flags|=LF_USE_LAST_I1; + MemCpy(tempf1,tempf,sizeof(LexFileStruct)); +} + +void LexPop(LexStruct *l) +{ + LexFileStruct *tempf=l->cur_lfn, + *tempf1=&l->stack[--l->stack_ptr]; + l->cur_buf_ptr=tempf1->buf_ptr; + if (l->last_I1=tempf1->last_I1) + l->flags|=LF_USE_LAST_I1; + else + l->flags&=~LF_USE_LAST_I1; + MemCpy(tempf,tempf1,sizeof(LexFileStruct)); +} + +MemberListStruct *FindMember(I1 *st,ClassStruct *c) +{ + MemberListStruct *ml=c->member_list; + while (ml) { + if (!StrCmp(ml->string,st)) { + ml->use_cnt++; + return ml; + } + ml=ml->next; + } + return NULL; +} + +void DelMemberList(ClassStruct *tempc) +{ + MemberListStruct *tempm,*tempm1; + tempm=tempc->member_list; + while (tempm) { + tempm1=tempm->next; + Free(tempm->string); + Free(tempm->fmtstr); + Free(tempm->fmtdata); + if (tempm->flags & MLF_DEFAULT_AVAILABLE && + tempm->member_class==sys_internal_types[IT_I1]+sizeof(ClassStruct)) + Free(tempm->default_value); + Free(tempm); + tempm=tempm1; + } + tempc->size=0; + tempc->last_in_member_list=&tempc->member_list; + tempc->member_list=NULL; + tempc->member_cnt=0; + tempc->parameter_cnt=0; +} + + +I8 LexInString(LexStruct *l, + I1 *buf,I8 size,BoolU4 *done) +{ + I8 i=0,j,ch; + *done=TRUE; + while (iflags|=LF_USE_LAST_I1; + } else if (ch>='0' && ch<='7') { + j=ch-'0'; + do { + ch=LexGetChar(l); + if (ch>='0' && ch<='7') + j=j<<3+ch-'0'; + } while (ch>='0' && ch<='7'); + buf[i++]=j; + l->flags|=LF_USE_LAST_I1; + } else { + l->flags|=LF_USE_LAST_I1; + buf[i++]='\\'; + } + } else if (ch=='$$') { + ch=LexGetChar(l); + buf[i++]='$$'; + if (ch!='$$') + l->flags|=LF_USE_LAST_I1; + } else + buf[i++]=ch; + } + *done=FALSE; + return i; +} + +I8 Lex(LexStruct *l) +{ + U8 ch; + I8 i,j,k; + double d; + SysHashEntry *temph,**temph1; + BoolU4 cont,str_done; + I1 *fbuf; + I1 *buf2,*buf3,buf[LEX_MAX_IDENT]; + while (TRUE) { +lex_cont: + if (!(ch=LexGetChar(l))) + return l->token=TK_EOF; + if (Bt(alpha_bitmap,ch)) { + i=0; + buf[i++]=ch; + do { + if (i>=LEX_MAX_IDENT-1) + break; + else { + if (!(ch=LexGetChar(l))) + break; + else { + if (Bt(alpha_numeric_bitmap,ch)) + buf[i++]=ch; + else { + l->flags|=LF_USE_LAST_I1; + break; + } + } + } + } while (TRUE); + buf[i++]=0; + temph=NULL; + if (l->local_var_list) { + l->local_var_entry=FindMember(buf, + l->local_var_list); + } else + l->local_var_entry=NULL; + if (!l->local_var_entry && l->hash_table_list) + temph=FindHashEntry(buf, + l->hash_table_list,l->hash_mask); + if (temph && !(l->flags & LF_NO_DEFINES)) + j=temph->type; + else + j=0; + if (j & HTT_STRING_CONSTANT) + LexIncludeString(l, + temph->string,NewString(temph><(StringConstantStruct *)->data),FALSE); + else { + l->hash_entry=temph; + Free(l->ident); + l->ident=NewString(buf); + l->ident_len=i; + l->token=TK_IDENT; + goto lex_end; + } + } else if (Bt(dec_numeric_bitmap,ch)) { + i=ch-'0'; + ch=LexGetChar(l); + if (ch=='X' || ch=='x') { + while (TRUE) { + ch=ToUpper(LexGetChar(l)); + if (Bt(hex_numeric_bitmap,ch)) { + if (ch<='9') + i=i<<4+ch-'0'; + else + i=i<<4+ch-'A'+10; + } else { + l->cur_i=i; + l->flags|=LF_USE_LAST_I1; + l->token=TK_INTEGER; + goto lex_end; + } + } + } + while (TRUE) { + if (Bt(dec_numeric_bitmap,ch)) + i=MulU8(i,10)+ch-'0'; + else { + if (ch=='.' || ch=='e' || ch=='E') break; + l->cur_i=i; + l->flags|=LF_USE_LAST_I1; + l->token=TK_INTEGER; + goto lex_end; + } + ch=LexGetChar(l); + } + if (ch=='.') + ch=LexGetChar(l); +float_start: + //TODO:back-up for cases where i overflows + // (people should use 'e', so might not be worth it) + j=0; + k=0; + while (TRUE) { + //TODO: maybe replace with log2 and insert bit field + if (Bt(dec_numeric_bitmap,ch)) { + j=MulU8(j,10)+ch-'0'; + k++; + } else { + d=i+j*Pow10(-k); + if (ch=='e' || ch=='E') break; + l->cur_d=d; + l->flags|=LF_USE_LAST_I1; + l->token=TK_DOUBLE; + goto lex_end; + } + ch=LexGetChar(l); + } + ch=LexGetChar(l); + k=1; + if (ch=='-') { + k=-1; + ch=LexGetChar(l); + } + j=0; + while (TRUE) { + //TODO: maybe replace with log2 and insert bit field + if (Bt(dec_numeric_bitmap,ch)) + j=MulU8(j,10)+ch-'0'; + else { + d*=Pow10(j*k); + l->cur_d=d; + l->flags|=LF_USE_LAST_I1; + l->token=TK_DOUBLE; + goto lex_end; + } + ch=LexGetChar(l); + } + } else if (ch=='"') { + l->flags|=LF_IN_QUOTES; + buf2=NULL; + i=0; + do { + j=LexInString(l,buf,LEX_MAX_IDENT,&str_done); + buf3=MAlloc(i+j); + if (buf2) { + MemCpy(buf3,buf2,i); + Free(buf2); + buf2=buf3; + MemCpy(buf2+i,buf,j); + } else { + buf2=buf3; + MemCpy(buf2,buf,j); + } + i+=j; + } while (!str_done); + Free(l->ident); + l->ident=MAlloc(i); + MemCpy(l->ident,buf2,i); + Free(buf2); + l->ident_len=i; + l->flags&=~LF_IN_QUOTES; + l->token=TK_STRING; + goto lex_end; + } else if (ch==0x27) { // "'" + ch=LexGetChar(l); + if (!ch || ch==0x27) i=0x27; + else if (ch=='\\') { + ch=LexGetChar(l); + if (ch=='n') + i=10; + else if (ch=='r') + i=13; + else if (ch=='"') + i='"'; + else if (ch==0x27) + i=0x27; + else if (ch=='\`') + i='\`'; + else if (ch=='\\') + i='\\'; + else if (ch=='t') + i=9; + else if (ch=='x') { + i=0; + while (TRUE) { + ch=ToUpper(LexGetChar(l)); + if (Bt(hex_numeric_bitmap,ch)) { + if (ch<='9') + i=i<<4+ch-'0'; + else + i=i<<4+ch-'A'+10; + } else + break; + } + l->flags|=LF_USE_LAST_I1; + } else if (ch>='0' && ch<='7') { + i=ch-'0'; + do { + ch=LexGetChar(l); + if (ch>='0' && ch<='7') + i=i<<3+ch-'0'; + } while (ch>='0' && ch<='7'); + l->flags|=LF_USE_LAST_I1; + } else { + l->flags|=LF_USE_LAST_I1; + i='\\'; + } + } else if (ch=='$$') { + ch=LexGetChar(l); + i='$$'; + if (ch!='$$') + l->flags|=LF_USE_LAST_I1; + } else + i=ch; + ch=LexGetChar(l); + if (ch!=0x27) + l->flags|=LF_USE_LAST_I1; + l->cur_i=i; + l->token=TK_INTEGER; + goto lex_end; + } else if (ch=='#') { + if (Lex(l)!=TK_IDENT) //skip '#' + goto lex_end; + if (!(temph=l->hash_entry)) + goto lex_end; + if (!(temph->type & HTT_KEYWORD)) + goto lex_end; + i=temph->user0; + if (i==KW_INCLUDE) { + if (Lex(l)!=TK_STRING) + goto lex_end; + if (l->flags & LF_ASM_EXPRESSIONS) + fbuf=DefaultExtension(l->ident,"ASZ"); + else + fbuf=DefaultExtension(l->ident,"CPZ"); + if (ext[EXT_LTF_READ]) + LexIncludeLtf(l,fbuf); + else + LexIncludeString(l,fbuf,ReadTextFile(fbuf),TRUE); + Free(fbuf); + } else if (i==KW_DEFINE) { + l->flags|=LF_NO_DEFINES; + if (Lex(l)==TK_IDENT) { + temph=MAllocZ(sizeof(StringConstantStruct)); + temph->string=l->ident; + l->ident=0; + temph->use_cnt=0; + temph->type=HTT_STRING_CONSTANT; + SetSourceFileInfo(l,temph); + i=0; + do ch=LexGetChar(l); + while (ch && (ch<=CH_SPACE || ch>0x7E)); + if (ch>CH_SPACE && ch<=0x7E) { + buf[i++]=ch; + while (i=CH_SHIFT_SPACE && ch<=0x7E || ch==CH_TAB); + break; + } else { + buf[i++]='/'; + l->flags|=LF_USE_LAST_I1; + } + } else if (ch>=CH_SHIFT_SPACE && ch<=0x7E || ch==CH_TAB) + buf[i++]=ch; + else + break; + } + } + buf[i++]=0; + temph><(StringConstantStruct *)->data=NewString(buf); + temph1=FindHashBucket(temph->string,l->define_hash_table); + temph->next=*temph1; + *temph1=temph; + } + l->flags&=~LF_NO_DEFINES; + } + } else if (ch==TK_INSERT_BINARY || + ch==TK_INSERT_BINARY_TYPE || + ch==TK_INSERT_BINARY_SIZE) { + l->token=ch; + goto lex_end; + } else if (ch=='.') { + ch=LexGetChar(l); + if (ch>='0' && ch<='9') { + i=0; + goto float_start; + } + l->flags|=LF_USE_LAST_I1; + l->token='.'; + goto lex_end; + } else if (ch>=0x21 && ch<=0x7E) { + i=duel_I1_tokens1[ch]; + if (!i) { + if (ch=='$$') { + do ch=LexGetChar(l); + while (ch && ch!='$$'); + goto lex_cont; + } else { + l->token=ch; + goto lex_end; + } + } else { + j=LexGetChar(l); + if (i.u1[0]==j) { + i>>=8; + if (!i) { // "/*" + cont=TRUE; + while (cont) { + do ch=LexGetChar(l); + while (ch && ch!='*'); + while (cont && ch=='*') { + ch=LexGetChar(l); + if (ch=='/') + cont=FALSE; + } + } + goto lex_cont; + } else { + l->token=i; + goto lex_end; + } + } + if (i=duel_I1_tokens2[ch]) { + if (i.u1[0]==j) { + i>>=8; + if (!i) { // "//" + LexSkipEol(l); + goto lex_cont; + } else { + if (i==TK_SHL || i==TK_SHR) { + j=LexGetChar(l); + if (j=='=') { + if (i==TK_SHL) + i=TK_SHL_EQUAL; + else + i=TK_SHR_EQUAL; + } else + l->flags|=LF_USE_LAST_I1; + } + l->token=i; + goto lex_end; + } + } + if (i=duel_I1_tokens3[ch]) { + if (i.u1[0]==j) { + l->token=i.u1[1]; + goto lex_end; + } + } + } + l->flags|=LF_USE_LAST_I1; + l->token=ch; + goto lex_end; + } + } + } +lex_end: + if (Bt(&l->flags,LFf_LEX_TRACE)) + LexPutToken(l); + return l->token; +} + +I1 *LexExtendString(LexStruct *l,U8 *size) +{ + U8 len=l->ident_len,len1,len2; + I1 *st=l->ident,*st1,*st2; + l->ident=NULL; + while (l->token==TK_STRING) { + st1=st; + len1=len; + if (Lex(l)==TK_STRING) { + len2=l->ident_len; + st2=l->ident; + l->ident=NULL; + len=len1+len2-1; + st=MAlloc(len); + if (len1>1) + MemCpy(st,st1,len1-1); + MemCpy(st+len1-1,st2,len2); + Free(st1); + Free(st2); + } + } + *size=len; + return st; +} + +I1 *LexPutLine(LexStruct *l,I1 *start) +{ + LtfEntry *my_LtfPutLine(LtfEntry *cl); + I1 *ptr; + if (!start) return; + if (l->cur_lfn->flags&LFSF_IS_LTF) { + if (my_LtfPutLine=FindExtern("LtfPutLine")) + return my_LtfPutLine(start); + } else { + ptr=start; + while (*ptr && *ptr!=CH_LINE_FEED && *ptr!=CH_CR) + PutChar(*ptr++); + CrLf; + return (*ptr) ? ptr+1:ptr; + } + return NULL; +} + +I8 LexLineNum(LexStruct *l) +{ + return l->cur_lfn->line_num; +} + +void LexPutLink(LexStruct *l) +{ + PutFileLink(l->cur_lfn->name,l->cur_lfn->line_num); + AdamErr("%s,%d\r",l->cur_lfn->name,l->cur_lfn->line_num); + PutS(" "); +} + +void PutLexError(LexStruct *l,I1 *name=NULL,I1 *msg=NULL) +{ + PutSysText("ST_ERROR"); + l->error_cnt++; + AdamErr("Tsk:%08X ",Fs); + if (name) { + PutSysText(name); + AdamErr("%S",name); + } + if (msg) { + PutS(msg); + AdamErr("%s\r\n",msg); + } + LexPutToken(l); + LexPutLink(l); + LexPutLine(l,l->cur_lfn->line_start); +} + +void PutLexWarning(LexStruct *l,I1 *name=NULL,I1 *msg=NULL) +{ + PutSysText("ST_WARNING"); + l->warning_cnt++; + if (name) + PutSysText(name); + if (msg) + PutS(msg); + LexPutToken(l); + LexPutLink(l); + LexPutLine(l,l->cur_lfn->line_start); +} + +void PutAsmError(LexStruct *l,I1 *name) +{ + PutLexError(l,name); + LexSkipEol(l); + Lex(l); +} + +void PutAsmWarning(LexStruct *l,I1 *name) +{ + PutLexWarning(l,name); + LexSkipEol(l); + Lex(l); +} + +void PrsExcept(LexStruct *l,I1 *name=NULL,I1 *msg=NULL) +{ + PutLexError(l,name,msg); + IntFlushMsgs; + throw(EXCEPT_COMPILER,0); +} + +void CbPutClass(ClassStruct *c) +{ + I8 i; + if (!c) return; + if (c->pointer_cnt>4) { + coutln "ERROR:put_class ptrcnt=",c->pointer_cnt; + while (TRUE) +//TODO: + SwapInNext; + } + for (i=0;ipointer_cnt;i++) + PutChar('*'); + c-=sizeof(ClassStruct)*c->pointer_cnt; + if (c->string) + PutS(c->string); + else { + coutln "ERROR:put_class string=NULL"; + while (TRUE) +//TODO: + SwapInNext; + } + PutChar(CH_SPACE); +} + + +void CbPutIc(IntermediateCode *tempi) +{ + I1 *st; + U8 opcode=tempi->ic_code.u2[0]; + if (opcode>EC_NOP) { + st=PointAtListEntry(opcode,SysText("ST_INTERMEDIATE_CODE")); + PrintF("%20ts %016X ", + st+1,tempi->ic_data); + if (tempi->ic_flags & ICF_NO_PUSHES) + PutS("!PUSH "); + CbPutClass(tempi->ic_class); + if (tempi->ic_flags & ICF_TO_DOUBLE) + PutS("->double "); + if (tempi->ic_flags & ICF_TO_INT) + PutS("->int "); + if (tempi->ic_flags & ICF_NO_PUSHES_TO_DOUBLE_OR_INT) + PutS("!PUSH2 "); + if (tempi->ic_flags & ICF_USE_DOUBLE_TEMPLATE) + PutS("[double] "); + if (tempi->ic_flags & ICF_USE_UNSIGNED_TEMPLATE) + PutS("[unsigned] "); + CrLf; + } +} + + +void CbInitOutPtrs(LexCbStack *ll) +{ + CodeBlk *cb=MAlloc(sizeof(CodeBlk)); + cb->next=NULL; + ll->cb_out_first=cb; + ll->cb_out_last=cb; + ll->cb_misc_list=NULL; + ll->cb_misc_list_end=&ll->cb_misc_list; + ll->cb_out_end=cb+sizeof(CodeBlk); + ll->cb_out_ptr=&cb->data; + ll->cb_last_out_ptr=&cb->data; +} + +void CbInitInPtrs(LexCbStack *ll) +{ + CodeBlk *cb=ll->cb_out_first; + ll->cb_in_first=cb; + ll->cb_in_end=cb+sizeof(CodeBlk); + ll->cb_in_ptr=&cb->data; +} + +void CbPutAllIc(LexStruct *l) +{ + IntermediateCode *tempi; + CbInitInPtrs(&l->cb); + tempi=l->cb.cb_in_ptr; + while (tempi->ic_code) { + CbPutIc(tempi); + tempi+=sizeof(IntermediateCode); + } +} + +void CbAddIc(LexStruct *l, + U8 opcode,U8 arg, ClassStruct *c,U8 flags=0) +{ + IntermediateCode *tempi=l->cb.cb_out_ptr; + CodeBlk *cb,*cb1; + l->cb.cb_last_out_ptr=tempi; + tempi->ic_code=opcode; + tempi->ic_data=arg; + tempi->ic_class=c; + tempi->ic_flags=flags; + tempi->ic_line=l->cur_lfn->line_num; + if (l->flags & LF_PARSE_TRACE) + CbPutIc(tempi); + + tempi+=sizeof(IntermediateCode); + if (tempi==l->cb.cb_out_end) { + cb=MAlloc(sizeof(CodeBlk)); + cb->next=NULL; + cb1=l->cb.cb_out_last; + cb1->next=cb; + l->cb.cb_out_last=cb; + tempi=&cb->data; + l->cb.cb_out_end=cb+sizeof(CodeBlk); + } + l->cb.cb_out_ptr=tempi; +} + +IntermediateCode *CbGetIc1(LexCbStack *l) +{ + IntermediateCode *tempi=l->cb_in_ptr, + *tempi1=tempi+sizeof(IntermediateCode); + CodeBlk *cb; + if (tempi1==l->cb_in_end) { + cb=tempi1-sizeof(CodeBlk); + cb=cb->next; + l->cb_in_end=cb+sizeof(CodeBlk); + tempi1=&cb->data; + } + l->cb_in_ptr=tempi1; + return tempi; +} + +void CbPush(LexStruct *l) +{ + LexCbStack *templ=MAlloc(sizeof(LexCbStack)); + MemCpy(templ,&l->cb,sizeof(LexCbStack)); + if (l->cb.cb_misc_list_end==&l->cb.cb_misc_list) + templ->cb_misc_list_end=&templ->cb_misc_list; + l->cb.cb_next=templ; +} + +void CbPop(LexStruct *l) +{ + LexCbStack *templ=l->cb.cb_next; + MemCpy(&l->cb,templ,sizeof(LexCbStack)); + if (templ->cb_misc_list_end==&templ->cb_misc_list) + l->cb.cb_misc_list_end=&l->cb.cb_misc_list; + Free(templ); +} + +CbMiscStruct *CbFindGotoLabel(LexStruct *l,I1 *name) +{ + CbMiscStruct *templ=l->cb.cb_misc_list; + while (templ) { + if (templ->type==CBMT_GOTO_LABEL) { + if (!StrCmp(templ->string,name)) + return templ; + } + templ=templ->next; + } + return NULL; +} + +CbMiscStruct *CbMiscNew(LexStruct *l,U8 t) +{ + CbMiscStruct *result=MAllocZ(sizeof(CbMiscStruct)); + l->cb.cb_misc_list_end->next=result; + l->cb.cb_misc_list_end=result; + result->address=INVALID_PTR; + result->type=t; + return result; +} + + +void DelCbMiscList(LexStruct *l) +{ + CbMiscStruct *mc=l->cb.cb_misc_list,*mc1; + while (mc) { + mc1=mc->next; + if (mc->type==CBMT_GOTO_LABEL && + !mc->address) { + l->cb.cb_misc_list=NULL; //prevent recursion + cout SysText("ST_ERROR"),SysText("ST_UNDEFINED_GOTO_LABEL"); + coutln mc->string; + throw(EXCEPT_COMPILER,1); + } + Free(mc->string); + Free(mc->jmp_table); + Free(mc); + mc=mc1; + } +} + +LexStruct *CbPopNoFree(LexStruct *l) +{ + LexCbStack *templ=l->cb.cb_next; + MemCpy(&l->cb,templ,sizeof(LexCbStack)); + if (templ->cb_misc_list_end==&templ->cb_misc_list) + l->cb.cb_misc_list_end=&l->cb.cb_misc_list; + return templ; +} + +void CbAppend(LexStruct *l, LexCbStack *ll) +{ + IntermediateCode *tempi; + CbInitInPtrs(ll); + do { + tempi=CbGetIc1(ll); + if (tempi->ic_code) { + CbAddIc(l,tempi->ic_code,tempi->ic_data, + tempi->ic_class,tempi->ic_flags); + } + } while (tempi->ic_code); + DelLinkedList(ll->cb_out_first); + + if (ll->cb_misc_list_end!=&ll->cb_misc_list) { + l->cb.cb_misc_list_end->next=ll->cb_misc_list; + l->cb.cb_misc_list_end=ll->cb_misc_list_end; + } + Free(ll); +} + +void CbCombine(LexStruct *l) +{ + CodeBlk *cb=l->cb.cb_out_first,*cb1,*cb2; + I8 i=0,j=sizeof(CodeBlk)-4; + U4 *ptr; + while (cb) { + i++; + cb=cb->next; + } + if (i>1) { + cb1=MAlloc(i*j+4); + cb1->next=NULL; + cb=l->cb.cb_out_first; + ptr=&cb1->data; + while (cb) { + cb2=cb->next; + MemCpy(ptr,&cb->data,j); + ptr+=j; + Free(cb); + cb=cb2; + } + l->cb.cb_out_first=cb1; + } +} + +U8 CbCountCode(LexStruct *l,I8 pass,I8 *min_line,I8 *max_line) +{ + U8 result=0,code; + I8 i,min_line2=-1,last_line=0; + ClassStruct *tempc; + IntermediateCode *tempi; + CbMiscStruct *lb; + CbInitInPtrs(&l->cb); + tempi=l->cb.cb_in_ptr; + while (code=tempi->ic_code.u2[0]) { + if (code>EC_END_EXP) { + if (code==EC_LABEL) { + lb=tempi->ic_data; + lb->address=result; + } else if (code>=EC_SKIPZ && code<=EC_OR_OR_SKIPNZ2) { + if (pass==2) { + lb=tempi->ic_data; + if (lb->address!=INVALID_PTR) { + i=lb->address-result; + if (i<116 && i>-116) //U1 disp + tempi->ic_code= --code; + } + } + } + i=unsigned_code_table[code+1]-unsigned_code_table[code]; + tempc=tempi->ic_class; + if (!(tempi->ic_flags & ICF_USE_UNSIGNED_TEMPLATE)) { + if (tempc->sub_type==IT_DOUBLE || + tempi->ic_flags & ICF_USE_DOUBLE_TEMPLATE) { + if (double_code_table[code+1]-double_code_table[code]) + i=double_code_table[code+1]-double_code_table[code]; + } else if (!(tempc->sub_type & 1) && code_table[code+1]-code_table[code]) + i=code_table[code+1]-code_table[code]; + } + result+=i; + if (tempi->ic_flags & ICF_NO_PUSHES) + result-=2; + if (tempi->ic_flags & ICF_TO_DOUBLE) { + result+=unsigned_code_table[EC_TO_DOUBLE+1]- + unsigned_code_table[EC_TO_DOUBLE]; + if (tempi->ic_flags & ICF_NO_PUSHES_TO_DOUBLE_OR_INT) + result-=2; + } + if (tempi->ic_flags & ICF_TO_INT) { + result+=unsigned_code_table[EC_TO_INT+1]- + unsigned_code_table[EC_TO_INT]; + if (tempi->ic_flags & ICF_NO_PUSHES_TO_DOUBLE_OR_INT) + result-=2; + } + if (pass==2 && i) { + i=tempi->ic_line; + if (i>=last_line) { + last_line=i; + if (i<*min_line) + *min_line=i; + if (i>*min_line && i*max_line) + *max_line=i; + } + } + } + tempi+=sizeof(IntermediateCode); + } + lb=l->cb.cb_misc_list; + while (lb) { + if (lb->type==CBMT_STRING_CONSTANT) { +// lb->address=result+sizeof(U4); +// result+=sizeof(U4)+lb->st_len; + lb->address=result; + result+=lb->st_len; + } else if (lb->type==CBMT_JMP_TABLE) { + lb->address=result; + result+=lb->st_len<<2; + } + lb=lb->next; + } + if (pass==2) { + if (min_line2!=-1 && + (min_line2-*min_line)>10) //Defines screw things up + *min_line=min_line2; + } + return result; +} + +U1 *CbCompile(LexStruct *l,ClassStruct *fun_class, + U8 *code_size,DbgInfo **dbg_info,U8 *type=NULL) +{ + U1 *result,*dst,*bb; + I8 min_line=MAX_I8,max_line=0; + U8 i,code,p1,p2,size,fix_up_type; + U4 *dd; + ClassStruct *tempc; + IntermediateCode *tempi; + CbMiscStruct *lb,*lb1; + DbgInfo *my_dbg=NULL; + ExeAbsoluteAddressStruct *tempa; + AsmCtrlStruct *a=l->a; + U8 Dasm2(U1 *ip,I8 cnt,BoolU4 use16); + + CbCombine(l); + if (Bt(&l->flags,LFf_OPT_TRACE)) { + coutln "$$IV 1$$Before Pass 1:$$IV 0$$"; + CbPutAllIc(l); + } + CmpOptPass1(l,fun_class,TRUE); + if (Bt(&l->flags,LFf_OPT_TRACE)) { + coutln "$$IV 1$$After Pass 1:$$IV 0$$"; + CbPutAllIc(l); + } + CmpOptPass2(l,fun_class); + if (Bt(&l->flags,LFf_OPT_TRACE)) { + coutln "$$IV 1$$After Pass 2:$$IV 0$$"; + CbPutAllIc(l); + } + CmpOptPass3(l,fun_class); + if (Bt(&l->flags,LFf_OPT_TRACE)) { + coutln "$$IV 1$$After Pass 3:$$IV 0$$"; + CbPutAllIc(l); + } + CmpOptPass4(l,fun_class); + if (Bt(&l->flags,LFf_OPT_TRACE)) { + coutln "$$IV 1$$After Pass 4:$$IV 0$$"; + CbPutAllIc(l); + } + + CbCountCode(l,1,NULL,NULL); + *code_size=CbCountCode(l,2,&min_line,&max_line); + result=MAlloc(*code_size); + if (max_line>=min_line && max_line-min_line<10000) { + my_dbg=MAllocZ(offset(DbgInfo.body)+sizeof(U4)*(max_line-min_line+1)); + my_dbg->min_line=min_line; + my_dbg->max_line=max_line; + } + if (dbg_info) + *dbg_info=my_dbg; + + dst=result; + CbInitInPtrs(&l->cb); + tempi=l->cb.cb_in_ptr; + while (code=tempi->ic_code.u2[0]) { + if (code>EC_END_EXP) { + if (type) { + if (tempc=tempi->ic_class) { + if (tempi->ic_flags & ICF_TO_DOUBLE) + *type=IT_DOUBLE; + else if (tempi->ic_flags & ICF_TO_INT) + *type=IT_I8; + else + *type=tempc->sub_type; + } + } + p1=unsigned_code_table[code]; + p2=unsigned_code_table[code+1]; + size=p2-p1; + fix_up_type=unsigned_fix_up_table[code]; + tempc=tempi->ic_class; + if (!(tempi->ic_flags & ICF_USE_UNSIGNED_TEMPLATE)) { + if (tempc->sub_type==IT_DOUBLE || + tempi->ic_flags & ICF_USE_DOUBLE_TEMPLATE) { + if (double_code_table[code+1]-double_code_table[code]) { + p1=double_code_table[code]; + p2=double_code_table[code+1]; + size=p2-p1; + fix_up_type=double_fix_up_table[code]; + } + } else if (!(tempc->sub_type & 1) && code_table[code+1]-code_table[code]) { + p1=code_table[code]; + p2=code_table[code+1]; + size=p2-p1; + fix_up_type=signed_fix_up_table[code]; + } + } + if (tempi->ic_flags & ICF_NO_PUSHES) { + p1+=2; + size-=2; + } + if (size) { + MemCpy(dst,p1,size); + if (my_dbg) { + if (tempi->ic_line>=min_line && tempi->ic_line<=max_line) { + i=tempi->ic_line-min_line; + if (!my_dbg->body[i]) { + if (a) + my_dbg->body[i]=a->ip+dst-result; + else + my_dbg->body[i]=dst; + } + } + } + } + dst+=size; + switch (fix_up_type) { + case FUT_8_1: + bb=dst-1; + *bb=tempi->ic_data; + break; + case FUT_8_2: + bb=dst-2; + *bb=tempi->ic_data; + break; + case FUT_8_4: + bb=dst-4; + *bb=tempi->ic_data; + break; + case FUT_8_5: + bb=dst-5; + *bb=tempi->ic_data; + break; + case FUT_8_6: + bb=dst-6; + *bb=tempi->ic_data; + break; + case FUT_8_10: + bb=dst-10; + *bb=tempi->ic_data; + break; + case FUT_8_JMP_1: + lb=tempi->ic_data; + if (a) + i=lb->address-(dst-result); + else + i=(result+lb->address)-dst; + bb=dst-1; + *bb=i; + break; + case FUT_32_4: + dd=dst-4; + *dd=tempi->ic_data; + break; + case FUT_32_4_CALL: + if (a) + i=tempi->ic_data-(a->ip+dst-result); + else + i=tempi->ic_data-dst; + dd=dst-4; + *dd=i; + break; + case FUT_32_4_ABS: + dd=dst-4; + *dd=tempi->ic_data; + if (a && !(l->flags & LF_ASM_EXPRESSIONS)) { + tempa=MAllocZ(sizeof(ExeAbsoluteAddressStruct)); + tempa->next=a->absolutes; + a->absolutes=tempa; + tempa->ip=a->ip+dd-result; + } + break; + case FUT_32_4_ABS2: + lb=tempi->ic_data; + if (a) + i=lb->address+a->ip; + else + i=lb->address+result; + dd=dst-4; + *dd=i; + if (a && !(l->flags & LF_ASM_EXPRESSIONS)) { + tempa=MAllocZ(sizeof(ExeAbsoluteAddressStruct)); + tempa->next=a->absolutes; + a->absolutes=tempa; + tempa->ip=a->ip+dd-result; + } + break; + case FUT_32_5: + dd=dst-5; + *dd=tempi->ic_data; + break; + case FUT_32_6: + dd=dst-6; + *dd=tempi->ic_data; + break; + case FUT_32_7: + dd=dst-7; + *dd=tempi->ic_data; + break; + case FUT_32_9: + dd=dst-9; + *dd=tempi->ic_data; + break; + case FUT_32_4P10_4: + dd=dst-4; + *dd=tempi->ic_data; + dd=dst-10; + *dd=tempi->ic_data+4; + break; + case FUT_32_4P11_4: + dd=dst-4; + *dd=tempi->ic_data; + dd=dst-11; + *dd=tempi->ic_data+4; + break; + case FUT_32_JMP_4: + lb=tempi->ic_data; + if (a) + i=lb->address-(dst-result); + else + i=(result+lb->address)-dst; + dd=dst-4; + *dd=i; + break; + case FUT_64_H9_L4: + dd=dst-4; + *dd=tempi->ic_data.u4[0]; + dd=dst-9; + *dd=tempi->ic_data.u4[1]; + break; + case FUT_ENTER1: + dd=dst-11; + *dd=tempi->ic_data; + dd=dst-4; + *dd=l->ESI_offset; + break; + case FUT_ENTER2: + dd=dst-18; + *dd=tempi->ic_data; + dd=dst-10; + *dd=l->ESI_offset; + dd=dst-4; + *dd=l->EDI_offset; + break; + } + if (tempi->ic_flags & ICF_TO_DOUBLE) { + p1=unsigned_code_table[EC_TO_DOUBLE]; + p2=unsigned_code_table[EC_TO_DOUBLE+1]; + size=p2-p1; + if (tempi->ic_flags & ICF_NO_PUSHES_TO_DOUBLE_OR_INT) { + p1+=2; + size-=2; + } + MemCpy(dst,p1,size); + dst+=size; + } + if (tempi->ic_flags & ICF_TO_INT) { + p1=unsigned_code_table[EC_TO_INT]; + p2=unsigned_code_table[EC_TO_INT+1]; + size=p2-p1; + if (tempi->ic_flags & ICF_NO_PUSHES_TO_DOUBLE_OR_INT) { + p1+=2; + size-=2; + } + MemCpy(dst,p1,size); + dst+=size; + } + } + tempi+=sizeof(IntermediateCode); + } + lb=l->cb.cb_misc_list; + while (lb) { + if (lb->type==CBMT_STRING_CONSTANT) { +/* + i=(lb->st_len+7) & -4; + MemCpy(result+lb->address-sizeof(U4),&i,sizeof(U4)); +*/ + MemCpy(result+lb->address,lb->string,lb->st_len); + } else if (lb->type==CBMT_JMP_TABLE) { + for (i=0;ist_len;i++) { + lb1=lb->jmp_table[i]; + dd=result+lb->address+i<<2; + if (a) { + tempa=MAllocZ(sizeof(ExeAbsoluteAddressStruct)); + tempa->next=a->absolutes; + a->absolutes=tempa; + tempa->ip=a->ip+dd-result; + *dd=lb1->address+a->ip; + } else + *dd=lb1->address+result; + } + } + lb=lb->next; + } + Free(l->cb.cb_out_first); + DelCbMiscList(l); + if (Bt(&l->flags,LFf_COMPILE_TRACE)) { + if (Dasm2=FindExtern("Dasm2")) + Dasm2(result,*code_size,FALSE); + } + return result; +} + +void DelHashTable(SysHashTable *tempht) +{ + I8 i; + SysHashEntry *temph,*temph1; + ClassStruct *tempc; + GlblVarStruct *tempg; + if (!tempht) return; + for (i=0;i<=tempht->mask;i++) { + temph=tempht->body[i]; + while (temph) { + temph1=temph->next; + Free(temph->string); + if (temph->type & (HTT_FUNCTION | HTT_CLASS | + HTT_STRING_CONSTANT | HTT_GLBL_VAR | + HTT_SYS_SYMBOL)) { + Free(temph->source_link); + if (temph->type & (HTT_FUNCTION | HTT_CLASS)) { + tempc=temph; + Free(tempc->debug); + Free(tempc->import_name); + DelMemberList(tempc); + //assumes code not on heap + } else if (temph->type&HTT_STRING_CONSTANT) + Free(temph><(StringConstantStruct *)->data); + else if (temph->type&HTT_GLBL_VAR) { + tempg=temph; + Free(tempg->import_name); + } + } + Free(temph); + temph=temph1; + } + } + Free(tempht); +} + + \ No newline at end of file diff --git a/LT/COMPILE/LoadCmp2.CPZ b/LT/COMPILE/LoadCmp2.CPZ new file mode 100644 index 0000000000000000000000000000000000000000..6b36a7065c25a135a6223af48147dcef3c7cd5f7 GIT binary patch literal 39 ucmeatPfT&nEwJY0a>*>R=H>Ft%Peuu&n?KzNiEWFbMy&z)wJg2VgLa06$?QC literal 0 HcmV?d00001 diff --git a/LT/COMPILE/OPT.CPZ b/LT/COMPILE/OPT.CPZ new file mode 100644 index 0000000..33e78c2 --- /dev/null +++ b/LT/COMPILE/OPT.CPZ @@ -0,0 +1,3045 @@ +BoolU4 FixupBinaryOp1(IntermediateCode *tempi, + IntermediateCode *tempi1,IntermediateCode *tempi2, + BoolU4 *is_unsigned) +{ + ClassStruct *tempc=tempi->ic_class,*tempc1,*tempc2; + tempc1=tempi1->ic_class; + tempc2=tempi2->ic_class; + if (tempc1->sub_type>=tempc2->sub_type) + tempi->ic_class=tempc1; + else + tempi->ic_class=tempc2; + tempc=tempi->ic_class; + *is_unsigned=tempc1->sub_type&1 || tempc2->sub_type&1; + tempi->ic_class=tempc; + if (tempc->sub_type==IT_DOUBLE) + return FALSE; + return tempi1->ic_code.u2[0]==EC_U8 && + tempi2->ic_code.u2[0]==EC_U8; +} + +BoolU4 FixupBinaryOp2(IntermediateCode **tempi1,IntermediateCode **tempi2) +{ + IntermediateCode *tempii1=*tempi1, + *tempii2=*tempi2; + if (tempii1->ic_code.u2[0]==EC_U8 && + !(tempii1->ic_flags & ICF_TO_DOUBLE)) + return TRUE; + if (tempii2->ic_code.u2[0]==EC_U8 && + !(tempii2->ic_flags & ICF_TO_DOUBLE)) { + *tempi1=tempii2; + *tempi2=tempii1; + return TRUE; + } + return FALSE; +} + +BoolU4 FixupBinaryOp3(IntermediateCode *tempi1) +{ + return tempi1->ic_code.u2[0]==EC_U8; +} + +void ShiftNoPush(IntermediateCode *tempi) +{ + if (tempi->ic_flags & ICF_NO_PUSHES) { + while (TRUE) { + if (!tempi->ic_code.u2[0]) + return; + if (tempi->ic_code.u2[0]!=EC_NOP) { + tempi->ic_flags |= ICF_NO_PUSHES; + return; + } + tempi+=sizeof(IntermediateCode); + } + } +} + + +void OptMissing(LexStruct *l,I8 pass,IntermediateCode *tempi) +{ + coutln "Pass:",pass," Missing IC handler"; + CbPutIc(tempi); + PrsExcept(l,"ST_OPT_INTERNAL_ERROR"); +} + +IntermediateCode opt_nop={EC_NOP,0,0,0,0}; +ParseStack *OptStart(LexStruct *l,IntermediateCode **temp_lag) +{ + I8 i; + ParseStack *ps=MAlloc(sizeof(ParseStack)); + CbInitInPtrs(&l->cb); + ps->ptr=0; + PrsPush(ps,0); + for (i=0;i<4;i++) + temp_lag[i]=&opt_nop; + return ps; +} + + + +LTextern CP_OPTNEXT BoolU4 OptNext(IntermediateCode *tempi, + IntermediateCode **temp_lag); + +/********** +void OptNext(IntermediateCode *tempi, + IntermediateCode **temp_lag) +{ + I8 i,j=0; + for (i=3;i>0;i--) + temp_lag[i]=temp_lag[i-1]; + temp_lag[0]=tempi; + for (i=0;i<4;i++) //TODO: move end_exp + if (temp_lag[i]->ic_code.u2[0]>EC_END_EXP) + temp_lag[j++]=temp_lag[i]; + while (j<4) + temp_lag[j++]=&opt_nop; +} +************/ + +void OptEnd(LexStruct *l,I8 pass,ParseStack *ps) +{ + if (ps->ptr>2) { + PrintF("Pass:%d Stack:%d\r\n",pass,ps->ptr); + PrsExcept(l,"ST_OPT_INTERNAL_ERROR"); + } + Free(ps); +} + +IntermediateCode *CmpOptPass1(LexStruct *l,ClassStruct *fun_class,BoolU4 combined) +{ //simplify constant arithmetic + I8 i1,i2; + U8 u1,u2; + BoolU4 is_unsigned; + ClassStruct *tempc,*tempc1,*tempc2; + IntermediateCode *tempi,*tempi1,*tempi2, + *temp_lag[4],*last_with_class=NULL; + ParseStack *ps=OptStart(l,temp_lag); + if (combined) + tempi=l->cb.cb_in_ptr; + else + tempi=CbGetIc1(&l->cb); + while (tempi->ic_code.u2[0]) { + OptNext(tempi,temp_lag); + switch (tempi->ic_code.u2[0]) { + case EC_U8: + case EC_U4: + case EC_U2: + case EC_U1: + case EC_DOUBLE: + case EC_STRING_CONSTANT: + case EC_EBP: + case EC_FS: + PrsPush(ps,tempi); + break; + case EC_COM: + tempi1=PrsPop(ps); + if (tempi1->ic_code.u2[0]==EC_U8) { + tempi->ic_data=~tempi1->ic_data; + tempi->ic_code=EC_U8; + tempi->ic_flags|=tempi1->ic_flags; + tempi1->ic_code=EC_NOP; + } + PrsPush(ps,tempi); + break; + case EC_NOT: + tempi1=PrsPop(ps); + if (tempi1->ic_code.u2[0]==EC_U8) { + if (tempi1->ic_data) + tempi->ic_data=0; + else + tempi->ic_data=1; + tempi->ic_code=EC_U8; + tempi->ic_flags|=tempi1->ic_flags; + tempi1->ic_code=EC_NOP; + } + PrsPush(ps,tempi); + break; + case EC_UNARY_MINUS: + tempi1=PrsPop(ps); + tempc=tempi->ic_class; + if (tempc->sub_type==IT_DOUBLE) { + PrsPush(ps,tempi); + break; + } + tempc=tempi1->ic_class; + if (tempc->type&HTT_INTERNAL_TYPE && tempc->sub_type & 1) + tempi->ic_class=sys_internal_types[tempc->sub_type-1]; + if (tempi1->ic_code.u2[0]==EC_U8) { + i1=tempi1->ic_data; + tempi->ic_data=-i1; + tempi->ic_code=EC_U8; + tempi->ic_flags|=tempi1->ic_flags; + tempi1->ic_code=EC_NOP; + } + PrsPush(ps,tempi); + break; + case EC_DEREF_U8: + case EC_DEREF_U4: + case EC_DEREF_U2: + case EC_DEREF_U1: + case EC_U8_PP: + case EC_U4_PP: + case EC_U2_PP: + case EC_U1_PP: + case EC_U8_MM: + case EC_U4_MM: + case EC_U2_MM: + case EC_U1_MM: + case EC_PP_U8: + case EC_PP_U4: + case EC_PP_U2: + case EC_PP_U1: + case EC_MM_U8: + case EC_MM_U4: + case EC_MM_U2: + case EC_MM_U1: + case EC_INC: + case EC_DEC: + case EC_SHL_CONSTANT1: + case EC_SHL_CONSTANT2: + case EC_SHR_CONSTANT1: + case EC_SHR_CONSTANT2: + case EC_ADD64: + case EC_ADD32: + case EC_ADD8: + case EC_SUB64: + case EC_SUB32: + case EC_SUB8: + ps->ptr--; + PrsPush(ps,tempi); + break; + + case EC_POWER: + tempi2=PrsPop(ps); + tempi1=PrsPop(ps); + tempc1=tempi1->ic_class; + tempc2=tempi2->ic_class; + if (tempc1->sub_type>=tempc2->sub_type) + tempi->ic_class=tempc1; + else + tempi->ic_class=tempc2; + tempc=tempi->ic_class; + if (tempc1->sub_type!=IT_DOUBLE) + tempi1->ic_flags|=ICF_TO_DOUBLE; + if (tempc2->sub_type!=IT_DOUBLE) + tempi2->ic_flags|=ICF_TO_DOUBLE; + if (tempc->sub_type!=IT_DOUBLE) + tempi->ic_flags|=ICF_TO_INT|ICF_USE_DOUBLE_TEMPLATE; + PrsPush(ps,tempi); + break; + case EC_SHL: + tempi2=PrsPop(ps); + tempi1=PrsPop(ps); + if (FixupBinaryOp1(tempi,tempi1,tempi2,&is_unsigned)) { + if (is_unsigned) { + u1=tempi1->ic_data; + u2=tempi2->ic_data; + tempi->ic_data=u1<ic_data; + i2=tempi2->ic_data; + tempi->ic_data=i1<ic_code=EC_U8; + tempi->ic_flags|=tempi1->ic_flags|tempi2->ic_flags; + tempi1->ic_code=EC_NOP; + tempi2->ic_code=EC_NOP; + } else if (FixupBinaryOp3(tempi2)) { + tempi->ic_flags|=tempi2->ic_flags; + tempi2->ic_code=EC_NOP; + if (tempi2->ic_data<32) { + tempi->ic_data=tempi2->ic_data; + tempi->ic_code=EC_SHL_CONSTANT1; + } else { + tempi->ic_data=tempi2->ic_data-32; + tempi->ic_code=EC_SHL_CONSTANT2; + } + } + PrsPush(ps,tempi); + break; + case EC_SHR: + tempi2=PrsPop(ps); + tempi1=PrsPop(ps); + if (FixupBinaryOp1(tempi,tempi1,tempi2,&is_unsigned)) { + if (is_unsigned) { + u1=tempi1->ic_data; + u2=tempi2->ic_data; + tempi->ic_data=u1>>u2; + } else { + i1=tempi1->ic_data; + i2=tempi2->ic_data; + tempi->ic_data=i1>>i2; + } + tempi->ic_code=EC_U8; + tempi->ic_flags|=tempi1->ic_flags|tempi2->ic_flags; + tempi1->ic_code=EC_NOP; + tempi2->ic_code=EC_NOP; + } else if (FixupBinaryOp3(tempi2)) { + tempi->ic_flags|=tempi2->ic_flags; + tempi2->ic_code=EC_NOP; + if (tempi2->ic_data<32) { + tempi->ic_data=tempi2->ic_data; + tempi->ic_code=EC_SHR_CONSTANT1; + } else { + tempi->ic_data=tempi2->ic_data-32; + tempi->ic_code=EC_SHR_CONSTANT2; + } + } + PrsPush(ps,tempi); + break; + case EC_MULTIPLICATION: + tempi2=PrsPop(ps); + tempi1=PrsPop(ps); + tempc1=tempi1->ic_class; + tempc2=tempi2->ic_class; + if (tempc1->sub_type>=tempc2->sub_type) + tempi->ic_class=tempc1; + else + tempi->ic_class=tempc2; + tempc=tempi->ic_class; + if (tempc->sub_type==IT_DOUBLE) { + if (tempc1->sub_type!=IT_DOUBLE) + tempi1->ic_flags|=ICF_TO_DOUBLE; + if (tempc2->sub_type!=IT_DOUBLE) + tempi2->ic_flags|=ICF_TO_DOUBLE; + PrsPush(ps,tempi); + break; + } + if (FixupBinaryOp1(tempi,tempi1,tempi2,&is_unsigned)) { + if (is_unsigned) { + u1=tempi1->ic_data; + u2=tempi2->ic_data; + tempi->ic_data=MulU8(u1,u2); + } else { + i1=tempi1->ic_data; + i2=tempi2->ic_data; + tempi->ic_data=MulI8(i1,i2); + } + tempi->ic_code=EC_U8; + tempi->ic_flags|=tempi1->ic_flags|tempi2->ic_flags; + tempi1->ic_code=EC_NOP; + tempi2->ic_code=EC_NOP; + PrsPush(ps,tempi); + } else { + if (tempi1->ic_code.u2[0]==EC_U8) { + switch (tempi1->ic_data) { + case 1: + tempi1->ic_flags|=tempi->ic_flags; + tempi1->ic_code=EC_NOP; + tempi->ic_code=EC_NOP; +// tempi2->ic_class=tempi->ic_class; + PrsPush(ps,tempi1); + break; + case 2: + tempi->ic_flags|=tempi1->ic_flags; + tempi1->ic_code=EC_NOP; + tempi->ic_data=1; + tempi->ic_code=EC_SHL_CONSTANT1; + PrsPush(ps,tempi); + break; + case 4: + tempi->ic_flags|=tempi1->ic_flags; + tempi1->ic_code=EC_NOP; + tempi->ic_data=2; + tempi->ic_code=EC_SHL_CONSTANT1; + PrsPush(ps,tempi); + break; + case 8: + tempi->ic_flags|=tempi1->ic_flags; + tempi1->ic_code=EC_NOP; + tempi->ic_data=3; + tempi->ic_code=EC_SHL_CONSTANT1; + PrsPush(ps,tempi); + break; + case 16: + tempi->ic_flags|=tempi1->ic_flags; + tempi1->ic_code=EC_NOP; + tempi->ic_data=4; + tempi->ic_code=EC_SHL_CONSTANT1; + PrsPush(ps,tempi); + break; + case 32: + tempi->ic_flags|=tempi1->ic_flags; + tempi1->ic_code=EC_NOP; + tempi->ic_data=5; + tempi->ic_code=EC_SHL_CONSTANT1; + PrsPush(ps,tempi); + break; + default: + PrsPush(ps,tempi); + } + } else if (tempi2->ic_code.u2[0]==EC_U8) { + switch (tempi2->ic_data) { + case 1: + tempi1->ic_flags|=tempi2->ic_flags|tempi->ic_flags; + tempi2->ic_code=EC_NOP; + tempi->ic_code=EC_NOP; +// tempi1->ic_class=tempi->ic_class; + PrsPush(ps,tempi1); + break; + case 2: + tempi->ic_flags|=tempi2->ic_flags; + tempi2->ic_code=EC_NOP; + tempi->ic_data=1; + tempi->ic_code=EC_SHL_CONSTANT1; + PrsPush(ps,tempi); + break; + case 4: + tempi->ic_flags|=tempi2->ic_flags; + tempi2->ic_code=EC_NOP; + tempi->ic_data=2; + tempi->ic_code=EC_SHL_CONSTANT1; + PrsPush(ps,tempi); + break; + case 8: + tempi->ic_flags|=tempi2->ic_flags; + tempi2->ic_code=EC_NOP; + tempi->ic_data=3; + tempi->ic_code=EC_SHL_CONSTANT1; + PrsPush(ps,tempi); + break; + case 16: + tempi->ic_flags|=tempi2->ic_flags; + tempi2->ic_code=EC_NOP; + tempi->ic_data=4; + tempi->ic_code=EC_SHL_CONSTANT1; + PrsPush(ps,tempi); + break; + case 32: + tempi->ic_flags|=tempi2->ic_flags; + tempi2->ic_code=EC_NOP; + tempi->ic_data=5; + tempi->ic_code=EC_SHL_CONSTANT1; + PrsPush(ps,tempi); + break; + default: + PrsPush(ps,tempi); + } + } else + PrsPush(ps,tempi); + } + break; + case EC_DIVISION: + tempi2=PrsPop(ps); + tempi1=PrsPop(ps); + tempc1=tempi1->ic_class; + tempc2=tempi2->ic_class; + if (tempc1->sub_type>=tempc2->sub_type) + tempi->ic_class=tempc1; + else + tempi->ic_class=tempc2; + tempc=tempi->ic_class; + if (tempc->sub_type==IT_DOUBLE) { + if (tempc1->sub_type!=IT_DOUBLE) + tempi1->ic_flags|=ICF_TO_DOUBLE; + if (tempc2->sub_type!=IT_DOUBLE) + tempi2->ic_flags|=ICF_TO_DOUBLE; + PrsPush(ps,tempi); + break; + } + if (FixupBinaryOp1(tempi,tempi1,tempi2,&is_unsigned)) { + if (!tempi2->ic_data) PrsExcept(l,"ST_DIVIDE_BY_ZERO"); + if (is_unsigned) { + u1=tempi1->ic_data; + u2=tempi2->ic_data; + tempi->ic_data=DivU8(u1,u2); + } else { + i1=tempi1->ic_data; + i2=tempi2->ic_data; + tempi->ic_data=DivI8(i1,i2); + } + tempi->ic_code=EC_U8; + tempi->ic_flags|=tempi1->ic_flags|tempi2->ic_flags; + tempi1->ic_code=EC_NOP; + tempi2->ic_code=EC_NOP; + PrsPush(ps,tempi); + } else { + if (tempi2->ic_code.u2[0]==EC_U8) { + switch (tempi2->ic_data) { + case 1: + tempi1->ic_flags|=tempi2->ic_flags|tempi->ic_flags; + tempi2->ic_code=EC_NOP; + tempi->ic_code=EC_NOP; +// tempi1->ic_class=tempi->ic_class; + PrsPush(ps,tempi1); + break; + case 2: + tempi2->ic_data=1; + tempi->ic_code=EC_SHR; + PrsPush(ps,tempi); + break; + case 4: + tempi2->ic_data=2; + tempi->ic_code=EC_SHR; + PrsPush(ps,tempi); + break; + case 8: + tempi2->ic_data=3; + tempi->ic_code=EC_SHR; + PrsPush(ps,tempi); + break; + case 16: + tempi2->ic_data=4; + tempi->ic_code=EC_SHR; + PrsPush(ps,tempi); + break; + case 32: + tempi2->ic_data=5; + tempi->ic_code=EC_SHR; + PrsPush(ps,tempi); + break; + default: + PrsPush(ps,tempi); + } + } else + PrsPush(ps,tempi); + } + break; + case EC_REMAINDER: + tempi2=PrsPop(ps); + tempi1=PrsPop(ps); + tempc1=tempi1->ic_class; + tempc2=tempi2->ic_class; + if (tempc1->sub_type>=tempc2->sub_type) + tempi->ic_class=tempc1; + else + tempi->ic_class=tempc2; + tempc=tempi->ic_class; + if (tempc->sub_type==IT_DOUBLE) { + if (tempc1->sub_type!=IT_DOUBLE) + tempi1->ic_flags|=ICF_TO_DOUBLE; + if (tempc2->sub_type!=IT_DOUBLE) + tempi2->ic_flags|=ICF_TO_DOUBLE; + PrsPush(ps,tempi); + break; + } + if (FixupBinaryOp1(tempi,tempi1,tempi2,&is_unsigned)) { + if (!tempi2->ic_data) PrsExcept(l,"ST_DIVIDE_BY_ZERO"); + if (is_unsigned) { + u1=tempi1->ic_data; + u2=tempi2->ic_data; + tempi->ic_data=ModU8(u1,u2); + } else { + i1=tempi1->ic_data; + i2=tempi2->ic_data; + tempi->ic_data=ModI8(i1,i2); + } + tempi->ic_code=EC_U8; + tempi->ic_flags|=tempi1->ic_flags|tempi2->ic_flags; + tempi1->ic_code=EC_NOP; + tempi2->ic_code=EC_NOP; + } + PrsPush(ps,tempi); + break; + case EC_AND: + tempi2=PrsPop(ps); + tempi1=PrsPop(ps); + if (FixupBinaryOp1(tempi,tempi1,tempi2,&is_unsigned)) { + u1=tempi1->ic_data; + u2=tempi2->ic_data; + tempi->ic_data=u1&u2; + tempi->ic_code=EC_U8; + tempi->ic_flags|=tempi1->ic_flags|tempi2->ic_flags; + tempi1->ic_code=EC_NOP; + tempi2->ic_code=EC_NOP; + } + PrsPush(ps,tempi); + break; + case EC_OR: + tempi2=PrsPop(ps); + tempi1=PrsPop(ps); + if (FixupBinaryOp1(tempi,tempi1,tempi2,&is_unsigned)) { + u1=tempi1->ic_data; + u2=tempi2->ic_data; + tempi->ic_data=u1|u2; + tempi->ic_code=EC_U8; + tempi->ic_flags|=tempi1->ic_flags|tempi2->ic_flags; + tempi1->ic_code=EC_NOP; + tempi2->ic_code=EC_NOP; + } + PrsPush(ps,tempi); + break; + case EC_XOR: + tempi2=PrsPop(ps); + tempi1=PrsPop(ps); + if (FixupBinaryOp1(tempi,tempi1,tempi2,&is_unsigned)) { + u1=tempi1->ic_data; + u2=tempi2->ic_data; + tempi->ic_data=u1^u2; + tempi->ic_code=EC_U8; + tempi->ic_flags|=tempi1->ic_flags|tempi2->ic_flags; + tempi1->ic_code=EC_NOP; + tempi2->ic_code=EC_NOP; + } + PrsPush(ps,tempi); + break; + case EC_ADDITION: + tempi2=PrsPop(ps); + tempi1=PrsPop(ps); + tempc1=tempi1->ic_class; + tempc2=tempi2->ic_class; + if (tempc1->sub_type>=tempc2->sub_type) + tempi->ic_class=tempc1; + else + tempi->ic_class=tempc2; + tempc=tempi->ic_class; + if (tempc->sub_type==IT_DOUBLE) { + if (tempc1->sub_type!=IT_DOUBLE) + tempi1->ic_flags|=ICF_TO_DOUBLE; + if (tempc2->sub_type!=IT_DOUBLE) + tempi2->ic_flags|=ICF_TO_DOUBLE; + PrsPush(ps,tempi); + break; + } + if (FixupBinaryOp1(tempi,tempi1,tempi2,&is_unsigned)) { + u1=tempi1->ic_data; + u2=tempi2->ic_data; + tempi->ic_data=u1+u2; + tempi->ic_code=EC_U8; + tempi->ic_flags|=tempi1->ic_flags|tempi2->ic_flags; + tempi1->ic_code=EC_NOP; + tempi2->ic_code=EC_NOP; + PrsPush(ps,tempi); + } else { + if (tempi1->ic_code.u2[0]==EC_U8 && !tempi1->ic_data) { + tempi2->ic_flags|=tempi1->ic_flags|tempi->ic_flags; + tempi1->ic_code=EC_NOP; + tempi->ic_code=EC_NOP; +// tempi2->ic_class=tempi->ic_class; + PrsPush(ps,tempi2); + } else if (tempi2->ic_code.u2[0]==EC_U8 && !tempi2->ic_data) { + tempi1->ic_flags|=tempi2->ic_flags|tempi->ic_flags; + tempi2->ic_code=EC_NOP; + tempi->ic_code=EC_NOP; +// tempi1->ic_class=tempi->ic_class; + PrsPush(ps,tempi1); + } else + PrsPush(ps,tempi); + } + break; + case EC_SUBTRACTION: + tempi2=PrsPop(ps); + tempi1=PrsPop(ps); + tempc1=tempi1->ic_class; + tempc2=tempi2->ic_class; + if (tempc1->sub_type>=tempc2->sub_type) + tempi->ic_class=tempc1; + else + tempi->ic_class=tempc2; + tempc=tempi->ic_class; + if (tempc->sub_type==IT_DOUBLE) { + if (tempc1->sub_type!=IT_DOUBLE) + tempi1->ic_flags|=ICF_TO_DOUBLE; + if (tempc2->sub_type!=IT_DOUBLE) + tempi2->ic_flags|=ICF_TO_DOUBLE; + PrsPush(ps,tempi); + break; + } + if (FixupBinaryOp1(tempi,tempi1,tempi2,&is_unsigned)) { + u1=tempi1->ic_data; + u2=tempi2->ic_data; + tempi->ic_data=u1-u2; + tempi->ic_code=EC_U8; + tempi->ic_flags|=tempi1->ic_flags|tempi2->ic_flags; + tempi1->ic_code=EC_NOP; + tempi2->ic_code=EC_NOP; + PrsPush(ps,tempi); + } else { + if (tempi2->ic_code.u2[0]==EC_U8 && !tempi2->ic_data) { + tempi1->ic_flags|=tempi2->ic_flags|tempi->ic_flags; + tempi2->ic_code=EC_NOP; + tempi->ic_code=EC_NOP; + tempi1->ic_class=tempi->ic_class; + PrsPush(ps,tempi1); + } else + PrsPush(ps,tempi); + } + break; + case EC_EQUAL_EQUAL: + tempi2=PrsPop(ps); + tempi1=PrsPop(ps); + tempc1=tempi1->ic_class; + tempc2=tempi2->ic_class; + if (tempc1->sub_type>=tempc2->sub_type) + tempi->ic_class=tempc1; + else + tempi->ic_class=tempc2; + tempc=tempi->ic_class; + if (tempc->sub_type==IT_DOUBLE) { + if (tempc1->sub_type!=IT_DOUBLE) + tempi1->ic_flags|=ICF_TO_DOUBLE; + if (tempc2->sub_type!=IT_DOUBLE) + tempi2->ic_flags|=ICF_TO_DOUBLE; + tempi->ic_flags|=ICF_USE_DOUBLE_TEMPLATE; + tempi->ic_class=sys_internal_types[IT_I8]; + PrsPush(ps,tempi); + break; + } + if (FixupBinaryOp1(tempi,tempi1,tempi2,&is_unsigned)) { + u1=tempi1->ic_data; + u2=tempi2->ic_data; + tempi->ic_data=u1==u2; + tempi->ic_code=EC_U8; + tempi->ic_flags|=tempi1->ic_flags|tempi2->ic_flags; + tempi1->ic_code=EC_NOP; + tempi2->ic_code=EC_NOP; + } + tempi->ic_class=sys_internal_types[IT_I8]; + PrsPush(ps,tempi); + break; + case EC_NOT_EQUAL_TO: + tempi2=PrsPop(ps); + tempi1=PrsPop(ps); + tempc1=tempi1->ic_class; + tempc2=tempi2->ic_class; + if (tempc1->sub_type>=tempc2->sub_type) + tempi->ic_class=tempc1; + else + tempi->ic_class=tempc2; + tempc=tempi->ic_class; + if (tempc->sub_type==IT_DOUBLE) { + if (tempc1->sub_type!=IT_DOUBLE) + tempi1->ic_flags|=ICF_TO_DOUBLE; + if (tempc2->sub_type!=IT_DOUBLE) + tempi2->ic_flags|=ICF_TO_DOUBLE; + tempi->ic_flags|=ICF_USE_DOUBLE_TEMPLATE; + tempi->ic_class=sys_internal_types[IT_I8]; + PrsPush(ps,tempi); + break; + } + if (FixupBinaryOp1(tempi,tempi1,tempi2,&is_unsigned)) { + u1=tempi1->ic_data; + u2=tempi2->ic_data; + tempi->ic_data=u1!=u2; + tempi->ic_code=EC_U8; + tempi->ic_flags|=tempi1->ic_flags|tempi2->ic_flags; + tempi1->ic_code=EC_NOP; + tempi2->ic_code=EC_NOP; + } + tempi->ic_class=sys_internal_types[IT_I8]; + PrsPush(ps,tempi); + break; + case EC_LESS_THAN: + tempi2=PrsPop(ps); + tempi1=PrsPop(ps); + tempc1=tempi1->ic_class; + tempc2=tempi2->ic_class; + if (tempc1->sub_type>=tempc2->sub_type) + tempi->ic_class=tempc1; + else + tempi->ic_class=tempc2; + tempc=tempi->ic_class; + if (tempc->sub_type==IT_DOUBLE) { + if (tempc1->sub_type!=IT_DOUBLE) + tempi1->ic_flags|=ICF_TO_DOUBLE; + if (tempc2->sub_type!=IT_DOUBLE) + tempi2->ic_flags|=ICF_TO_DOUBLE; + tempi->ic_flags|=ICF_USE_DOUBLE_TEMPLATE; + tempi->ic_class=sys_internal_types[IT_I8]; + PrsPush(ps,tempi); + break; + } + if (FixupBinaryOp1(tempi,tempi1,tempi2,&is_unsigned)) { + if (is_unsigned) { + u1=tempi1->ic_data; + u2=tempi2->ic_data; + tempi->ic_data=u1ic_data; + i2=tempi2->ic_data; + tempi->ic_data=i1ic_code=EC_U8; + tempi->ic_flags|=tempi1->ic_flags|tempi2->ic_flags; + tempi1->ic_code=EC_NOP; + tempi2->ic_code=EC_NOP; + } + if (is_unsigned) + tempi->ic_flags|=ICF_USE_UNSIGNED_TEMPLATE; + tempi->ic_class=sys_internal_types[IT_I8]; + PrsPush(ps,tempi); + break; + case EC_GREATER_THAN: + tempi2=PrsPop(ps); + tempi1=PrsPop(ps); + tempc1=tempi1->ic_class; + tempc2=tempi2->ic_class; + if (tempc1->sub_type>=tempc2->sub_type) + tempi->ic_class=tempc1; + else + tempi->ic_class=tempc2; + tempc=tempi->ic_class; + if (tempc->sub_type==IT_DOUBLE) { + if (tempc1->sub_type!=IT_DOUBLE) + tempi1->ic_flags|=ICF_TO_DOUBLE; + if (tempc2->sub_type!=IT_DOUBLE) + tempi2->ic_flags|=ICF_TO_DOUBLE; + tempi->ic_flags|=ICF_USE_DOUBLE_TEMPLATE; + tempi->ic_class=sys_internal_types[IT_I8]; + PrsPush(ps,tempi); + break; + } + if (FixupBinaryOp1(tempi,tempi1,tempi2,&is_unsigned)) { + if (is_unsigned) { + u1=tempi1->ic_data; + u2=tempi2->ic_data; + tempi->ic_data=u1>u2; + } else { + i1=tempi1->ic_data; + i2=tempi2->ic_data; + tempi->ic_data=i1>i2; + } + tempi->ic_code=EC_U8; + tempi->ic_flags|=tempi1->ic_flags|tempi2->ic_flags; + tempi1->ic_code=EC_NOP; + tempi2->ic_code=EC_NOP; + } + if (is_unsigned) + tempi->ic_flags|=ICF_USE_UNSIGNED_TEMPLATE; + tempi->ic_class=sys_internal_types[IT_I8]; + PrsPush(ps,tempi); + break; + case EC_LESS_OR_EQUAL: + tempi2=PrsPop(ps); + tempi1=PrsPop(ps); + tempc1=tempi1->ic_class; + tempc2=tempi2->ic_class; + if (tempc1->sub_type>=tempc2->sub_type) + tempi->ic_class=tempc1; + else + tempi->ic_class=tempc2; + tempc=tempi->ic_class; + if (tempc->sub_type==IT_DOUBLE) { + if (tempc1->sub_type!=IT_DOUBLE) + tempi1->ic_flags|=ICF_TO_DOUBLE; + if (tempc2->sub_type!=IT_DOUBLE) + tempi2->ic_flags|=ICF_TO_DOUBLE; + tempi->ic_flags|=ICF_USE_DOUBLE_TEMPLATE; + tempi->ic_class=sys_internal_types[IT_I8]; + PrsPush(ps,tempi); + break; + } + if (FixupBinaryOp1(tempi,tempi1,tempi2,&is_unsigned)) { + if (is_unsigned) { + u1=tempi1->ic_data; + u2=tempi2->ic_data; + tempi->ic_data=u1<=u2; + } else { + i1=tempi1->ic_data; + i2=tempi2->ic_data; + tempi->ic_data=i1<=i2; + } + tempi->ic_code=EC_U8; + tempi->ic_flags|=tempi1->ic_flags|tempi2->ic_flags; + tempi1->ic_code=EC_NOP; + tempi2->ic_code=EC_NOP; + } + if (is_unsigned) + tempi->ic_flags|=ICF_USE_UNSIGNED_TEMPLATE; + tempi->ic_class=sys_internal_types[IT_I8]; + PrsPush(ps,tempi); + break; + case EC_GREATER_OR_EQUAL: + tempi2=PrsPop(ps); + tempi1=PrsPop(ps); + tempc1=tempi1->ic_class; + tempc2=tempi2->ic_class; + if (tempc1->sub_type>=tempc2->sub_type) + tempi->ic_class=tempc1; + else + tempi->ic_class=tempc2; + tempc=tempi->ic_class; + if (tempc->sub_type==IT_DOUBLE) { + if (tempc1->sub_type!=IT_DOUBLE) + tempi1->ic_flags|=ICF_TO_DOUBLE; + if (tempc2->sub_type!=IT_DOUBLE) + tempi2->ic_flags|=ICF_TO_DOUBLE; + tempi->ic_flags|=ICF_USE_DOUBLE_TEMPLATE; + tempi->ic_class=sys_internal_types[IT_I8]; + PrsPush(ps,tempi); + break; + } + if (FixupBinaryOp1(tempi,tempi1,tempi2,&is_unsigned)) { + if (is_unsigned) { + u1=tempi1->ic_data; + u2=tempi2->ic_data; + tempi->ic_data=u1>=u2; + } else { + i1=tempi1->ic_data; + i2=tempi2->ic_data; + tempi->ic_data=i1>=i2; + } + tempi->ic_code=EC_U8; + tempi->ic_flags|=tempi1->ic_flags|tempi2->ic_flags; + tempi1->ic_code=EC_NOP; + tempi2->ic_code=EC_NOP; + } + if (is_unsigned) + tempi->ic_flags|=ICF_USE_UNSIGNED_TEMPLATE; + tempi->ic_class=sys_internal_types[IT_I8]; + PrsPush(ps,tempi); + break; + case EC_AND_AND: + tempi2=PrsPop(ps); + tempi1=PrsPop(ps); + if (FixupBinaryOp1(tempi,tempi1,tempi2,&is_unsigned)) { + u1=tempi1->ic_data; + u2=tempi2->ic_data; + tempi->ic_data=u1&&u2; + tempi->ic_code=EC_U8; + tempi->ic_flags|=tempi1->ic_flags|tempi2->ic_flags; + tempi1->ic_code=EC_NOP; + tempi2->ic_code=EC_NOP; + } + tempi->ic_class=sys_internal_types[IT_I8]; + PrsPush(ps,tempi); + break; + case EC_OR_OR: + tempi2=PrsPop(ps); + tempi1=PrsPop(ps); + if (FixupBinaryOp1(tempi,tempi1,tempi2,&is_unsigned)) { + u1=tempi1->ic_data; + u2=tempi2->ic_data; + tempi->ic_data=u1||u2; + tempi->ic_code=EC_U8; + tempi->ic_flags|=tempi1->ic_flags|tempi2->ic_flags; + tempi1->ic_code=EC_NOP; + tempi2->ic_code=EC_NOP; + } + tempi->ic_class=sys_internal_types[IT_I8]; + PrsPush(ps,tempi); + break; + case EC_XOR_XOR: + tempi2=PrsPop(ps); + tempi1=PrsPop(ps); + if (FixupBinaryOp1(tempi,tempi1,tempi2,&is_unsigned)) { + u1=tempi1->ic_data; + u2=tempi2->ic_data; + tempi->ic_data=u1^^u2; + tempi->ic_code=EC_U8; + tempi->ic_flags|=tempi1->ic_flags|tempi2->ic_flags; + tempi1->ic_code=EC_NOP; + tempi2->ic_code=EC_NOP; + } + tempi->ic_class=sys_internal_types[IT_I8]; + PrsPush(ps,tempi); + break; + case EC_COLON: + tempi2=PrsPop(ps); + tempi1=PrsPop(ps); + tempc1=tempi1->ic_class; + tempc2=tempi2->ic_class; + if (tempc1->sub_type>=tempc2->sub_type) + tempi->ic_class=tempc1; + else + tempi->ic_class=tempc2; + tempc=tempi->ic_class; + if (tempc->sub_type==IT_DOUBLE) { + if (tempc1->sub_type!=IT_DOUBLE) + tempi1->ic_flags|=ICF_TO_DOUBLE; + if (tempc2->sub_type!=IT_DOUBLE) + tempi2->ic_flags|=ICF_TO_DOUBLE; + } + ps->ptr-=1; + PrsPush(ps,tempi); + break; + case EC_ASSIGN_U8: + case EC_MUL_EQUAL_U8: + case EC_DIV_EQUAL_U8: + case EC_ADD_EQUAL_U8: + case EC_SUB_EQUAL_U8: + tempi2=PrsPop(ps); + tempi1=PrsPop(ps); + tempc=tempi->ic_class; + if (tempc->sub_type==IT_DOUBLE) { + tempc=tempi2->ic_class; + if (tempc->sub_type!=IT_DOUBLE) + tempi2->ic_flags|=ICF_TO_DOUBLE; + } else { + tempc=tempi2->ic_class; + if (tempc->sub_type==IT_DOUBLE) + tempi2->ic_flags|=ICF_TO_INT; + } + PrsPush(ps,tempi); + break; + case EC_ASSIGN_U4: + case EC_ASSIGN_U2: + case EC_ASSIGN_U1: + case EC_SHL_EQUAL_U8: + case EC_SHL_EQUAL_U4: + case EC_SHL_EQUAL_U2: + case EC_SHL_EQUAL_U1: + case EC_SHR_EQUAL_U8: + case EC_SHR_EQUAL_U4: + case EC_SHR_EQUAL_U2: + case EC_SHR_EQUAL_U1: + case EC_MUL_EQUAL_U4: + case EC_MUL_EQUAL_U2: + case EC_MUL_EQUAL_U1: + case EC_DIV_EQUAL_U4: + case EC_DIV_EQUAL_U2: + case EC_DIV_EQUAL_U1: + case EC_AND_EQUAL_U8: + case EC_AND_EQUAL_U4: + case EC_AND_EQUAL_U2: + case EC_AND_EQUAL_U1: + case EC_OR_EQUAL_U8: + case EC_OR_EQUAL_U4: + case EC_OR_EQUAL_U2: + case EC_OR_EQUAL_U1: + case EC_XOR_EQUAL_U8: + case EC_XOR_EQUAL_U4: + case EC_XOR_EQUAL_U2: + case EC_XOR_EQUAL_U1: + case EC_ADD_EQUAL_U4: + case EC_ADD_EQUAL_U2: + case EC_ADD_EQUAL_U1: + case EC_SUB_EQUAL_U4: + case EC_SUB_EQUAL_U2: + case EC_SUB_EQUAL_U1: + tempi2=PrsPop(ps); + tempi1=PrsPop(ps); + tempc=tempi2->ic_class; + if (tempc->sub_type==IT_DOUBLE) + tempi2->ic_flags|=ICF_TO_INT; + PrsPush(ps,tempi); + break; + case EC_ENTER: + case EC_LEAVE: + tempi->ic_data=-fun_class->size; + break; + case EC_ADD_ESP32: + ps->ptr-=1+tempi->ic_data>>3; + if (temp_lag[1]->ic_code.u2[0]==EC_ADD_ESP32) { + tempi->ic_data+=temp_lag[1]->ic_data; + tempi->ic_flags|=temp_lag[1]->ic_flags; + temp_lag[1]->ic_code=EC_NOP; + } + PrsPush(ps,tempi); + break; + case EC_CALL: + case EC_CALL_INDIRECT: + case EC_CALL_INDIRECT2: + case EC_CLI: + case EC_STI: + case EC_GET_FLAGS: + case EC_GET_BASE_PTR: + case EC_GET_STACK_PTR: + case EC_GET_LABEL: + case EC_ABSOLUTE_ADDRESS: + case EC_TYPE: + PrsPush(ps,tempi); + break; + case EC_SET_FLAGS: + case EC_SET_BASE_PTR: + case EC_SET_STACK_PTR: + case EC_BSF: + case EC_BSR: + case EC_BT_CONSTANT: + case EC_BTS_CONSTANT: + case EC_BTR_CONSTANT: + case EC_BTC_CONSTANT: + case EC_REMQUE: + case EC_INPD: + case EC_INPW: + case EC_INP: + case EC_STRLEN: + ps->ptr--; + PrsPush(ps,tempi); + break; + case EC_BT: + case EC_BTS: + case EC_BTR: + case EC_BTC: + tempi2=PrsPop(ps); + tempi1=PrsPop(ps); + i1=tempi1->ic_data; + if (FixupBinaryOp3(tempi1) && + i1>=-128 && i1<128) { + tempi->ic_flags|=(tempi1->ic_flags&~ICF_NO_PUSHES); + tempi1->ic_code=EC_NOP; + ShiftNoPush(tempi1); + tempi->ic_data=i1; + tempi->ic_code+=EC_BT_CONSTANT-EC_BT; + } + PrsPush(ps,tempi); + break; + case EC_INSQUE: + case EC_INSQUE_REV: + case EC_OUTPD: + case EC_OUTPW: + case EC_OUTP: + ps->ptr-=2; + PrsPush(ps,tempi); + break; + case EC_SWITCH: + ps->ptr-=2; + break; + case EC_MEMCPY: + case EC_MEMSET: + ps->ptr-=3; + PrsPush(ps,tempi); + break; + + case EC_SKIPZ2: + ps->ptr--; + tempi2=temp_lag[1]; +ec_skipz2: + switch (tempi2->ic_code.u2[0]) { + case EC_NOT: + tempi->ic_code=EC_SKIPNZ2; + tempi2->ic_code=EC_NOP; + tempi->ic_class=tempi2->ic_class; + tempi->ic_flags=tempi2->ic_flags; + tempi2=temp_lag[2]; + temp_lag[2]=temp_lag[3]; + temp_lag[3]=&opt_nop; + if (tempi2->ic_code.u2[0]!=EC_NOT) + goto ec_skipnz2; + else + goto ec_skipz_done; + case EC_EQUAL_EQUAL: + tempi->ic_code=EC_EQUAL_EQUAL_SKIPZ2; + break; + case EC_NOT_EQUAL_TO: + tempi->ic_code=EC_NOT_EQUAL_TO_SKIPZ2; + break; + case EC_LESS_THAN: + tempi->ic_code=EC_LESS_THAN_SKIPZ2; + break; + case EC_GREATER_THAN: + tempi->ic_code=EC_GREATER_THAN_SKIPZ2; + break; + case EC_LESS_OR_EQUAL: + tempi->ic_code=EC_LESS_OR_EQUAL_SKIPZ2; + break; + case EC_GREATER_OR_EQUAL: + tempi->ic_code=EC_GREATER_OR_EQUAL_SKIPZ2; + break; + case EC_OR_OR: + tempi->ic_code=EC_OR_OR_SKIPZ2; + break; + case EC_AND_AND: + tempi->ic_code=EC_AND_AND_SKIPZ2; + break; + } + if (tempi->ic_code.u2[0]!=EC_SKIPZ2) { + tempi->ic_class=tempi2->ic_class; + tempi->ic_flags|=tempi2->ic_flags; + tempi2->ic_code=EC_NOP; + } +ec_skipz_done: + PrsPush(ps,tempi); + break; + case EC_SKIPNZ2: + ps->ptr--; + tempi2=temp_lag[1]; +ec_skipnz2: + switch (tempi2->ic_code.u2[0]) { + case EC_NOT: + tempi->ic_code=EC_SKIPZ2; + tempi2->ic_code=EC_NOP; + tempi->ic_class=tempi2->ic_class; + tempi->ic_flags=tempi2->ic_flags; + tempi2=temp_lag[2]; + temp_lag[2]=temp_lag[3]; + temp_lag[3]=&opt_nop; + if (tempi2->ic_code.u2[0]!=EC_NOT) + goto ec_skipz2; + else + goto ec_skipnz_done; + case EC_EQUAL_EQUAL: + tempi->ic_code=EC_NOT_EQUAL_TO_SKIPZ2; + break; + case EC_NOT_EQUAL_TO: + tempi->ic_code=EC_EQUAL_EQUAL_SKIPZ2; + break; + case EC_LESS_THAN: + tempi->ic_code=EC_GREATER_OR_EQUAL_SKIPZ2; + break; + case EC_GREATER_THAN: + tempi->ic_code=EC_LESS_OR_EQUAL_SKIPZ2; + break; + case EC_LESS_OR_EQUAL: + tempi->ic_code=EC_GREATER_THAN_SKIPZ2; + break; + case EC_GREATER_OR_EQUAL: + tempi->ic_code=EC_LESS_THAN_SKIPZ2; + break; + case EC_OR_OR: + tempi->ic_code=EC_OR_OR_SKIPNZ2; + break; + case EC_AND_AND: + tempi->ic_code=EC_AND_AND_SKIPNZ2; + break; + } + if (tempi->ic_code.u2[0]!=EC_SKIPNZ2) { + tempi->ic_class=tempi2->ic_class; + tempi->ic_flags|=tempi2->ic_flags; + tempi2->ic_code=EC_NOP; + } +ec_skipnz_done: + PrsPush(ps,tempi); + break; + case EC_EQUAL_EQUAL_SKIPZ2: + case EC_NOT_EQUAL_TO_SKIPZ2: + case EC_LESS_THAN_SKIPZ2: + case EC_GREATER_THAN_SKIPZ2: + case EC_LESS_OR_EQUAL_SKIPZ2: + case EC_GREATER_OR_EQUAL_SKIPZ2: + case EC_AND_AND_SKIPZ2: + case EC_AND_AND_SKIPNZ2: + case EC_OR_OR_SKIPZ2: + case EC_OR_OR_SKIPNZ2: + ps->ptr-=2; + PrsPush(ps,tempi); + break; + + case EC_NULL: + case EC_LABEL: + case EC_ADDRESS: + case EC_QUESTION: + case EC_JMP: + case EC_IRQ: + case EC_NOP: + case EC_RET: + break; + + case EC_END_EXP: + ps->ptr--; + break; + + default: + OptMissing(l,1,tempi); + } + if (tempi->ic_class) + last_with_class=tempi; + if (combined) + tempi+=sizeof(IntermediateCode); + else + tempi=CbGetIc1(&l->cb); + } + OptEnd(l,1,ps); + return last_with_class; +} + +#define PASS2_OFFSETS 4 + +void CmpOptPass2(LexStruct *l,ClassStruct *fun_class) +{ + MemberListStruct *tempm; + ClassStruct *tempc; + IntermediateCode *tempi,*tempi1,*tempi2, + *temp_lag[4],*last_with_class=NULL; + I8 i,j,o[PASS2_OFFSETS+2],c[PASS2_OFFSETS+2],lea_s[PASS2_OFFSETS+2]; + ParseStack *ps=OptStart(l,temp_lag); + + for (i=0;imember_list; + while (tempm) { + tempc=tempm->member_class; + if (!tempm->cnt && tempc->pointer_cnt && tempm->use_cnt>c[PASS2_OFFSETS-1]) { + for (i=0;iuse_cnt>c[i]) { + for (j=i;juse_cnt; + o[i]=tempm->offset; + break; + } + } + tempm=tempm->next; + } + } + + tempi=l->cb.cb_in_ptr; + while (tempi->ic_code.u2[0]) { + OptNext(tempi,temp_lag); + switch (tempi->ic_code.u2[0]) { + case EC_U8: + case EC_U4: + case EC_U2: + case EC_U1: + case EC_DOUBLE: + case EC_STRING_CONSTANT: + case EC_EBP: + case EC_FS: + PrsPush(ps,tempi); + break; + case EC_COM: + case EC_NOT: + case EC_UNARY_MINUS: + ps->ptr--; + PrsPush(ps,tempi); + break; + case EC_DEREF_U8: + tempi1=PrsPop(ps); + if (tempi1->ic_code.u2[0]==EC_LEA_DISP32_EBP) { + for (i=0;iic_data) + lea_s[i]--; + } + if (temp_lag[1]->ic_code.u2[0]==EC_ADD32) { + if (temp_lag[2]->ic_code.u2[0]==EC_EBP) { + tempi->ic_flags|=temp_lag[2]->ic_flags|temp_lag[1]->ic_flags; + temp_lag[2]->ic_code=EC_NOP; + temp_lag[1]->ic_code=EC_NOP; + tempi->ic_data=temp_lag[1]->ic_data; + tempi->ic_code=EC_U8_DISP32; + } else if (temp_lag[2]->ic_code.u2[0]==EC_FS) { + tempi->ic_flags|=temp_lag[2]->ic_flags|temp_lag[1]->ic_flags; + temp_lag[2]->ic_code=EC_NOP; + temp_lag[1]->ic_code=EC_NOP; + tempi->ic_data=temp_lag[1]->ic_data; + tempi->ic_code=EC_FS_U8_DISP32; + } else if (temp_lag[2]->ic_data==3 && + temp_lag[2]->ic_code.u2[0]==EC_SHL_CONSTANT1) { + tempi->ic_flags|=temp_lag[2]->ic_flags|temp_lag[1]->ic_flags; + temp_lag[2]->ic_code=EC_NOP; + temp_lag[1]->ic_code=EC_NOP; + tempi->ic_data=temp_lag[1]->ic_data; + tempi->ic_code=EC_U8_DISP32_SCALED; + for (i=0;iic_data) + lea_s[i]+=100000; + } + } + PrsPush(ps,tempi); + break; + case EC_DEREF_U4: + tempi1=PrsPop(ps); + if (tempi1->ic_code.u2[0]==EC_LEA_DISP32_EBP) { + for (i=0;iic_data) + lea_s[i]--; + } + if (temp_lag[1]->ic_code.u2[0]==EC_ADD32) { + if (temp_lag[2]->ic_code.u2[0]==EC_EBP) { + tempi->ic_flags|=temp_lag[2]->ic_flags|temp_lag[1]->ic_flags; + temp_lag[2]->ic_code=EC_NOP; + temp_lag[1]->ic_code=EC_NOP; + tempi->ic_data=temp_lag[1]->ic_data; + tempi->ic_code=EC_U4_DISP32; + } else if (temp_lag[2]->ic_code.u2[0]==EC_FS) { + tempi->ic_flags|=temp_lag[2]->ic_flags|temp_lag[1]->ic_flags; + temp_lag[2]->ic_code=EC_NOP; + temp_lag[1]->ic_code=EC_NOP; + tempi->ic_data=temp_lag[1]->ic_data; + tempi->ic_code=EC_FS_U4_DISP32; + } else if (temp_lag[2]->ic_data==2 && + temp_lag[2]->ic_code.u2[0]==EC_SHL_CONSTANT1) { + tempi->ic_flags|=temp_lag[2]->ic_flags|temp_lag[1]->ic_flags; + temp_lag[2]->ic_code=EC_NOP; + temp_lag[1]->ic_code=EC_NOP; + tempi->ic_data=temp_lag[1]->ic_data; + tempi->ic_code=EC_U4_DISP32_SCALED; + for (i=0;iic_data) + lea_s[i]+=100000; + } + } + PrsPush(ps,tempi); + break; + case EC_DEREF_U2: + tempi1=PrsPop(ps); + if (tempi1->ic_code.u2[0]==EC_LEA_DISP32_EBP) { + for (i=0;iic_data) + lea_s[i]--; + } + if (temp_lag[1]->ic_code.u2[0]==EC_ADD32) { + if (temp_lag[2]->ic_code.u2[0]==EC_EBP) { + tempi->ic_flags|=temp_lag[2]->ic_flags|temp_lag[1]->ic_flags; + temp_lag[2]->ic_code=EC_NOP; + temp_lag[1]->ic_code=EC_NOP; + tempi->ic_data=temp_lag[1]->ic_data; + tempi->ic_code=EC_U2_DISP32; + } else if (temp_lag[2]->ic_code.u2[0]==EC_FS) { + tempi->ic_flags|=temp_lag[2]->ic_flags|temp_lag[1]->ic_flags; + temp_lag[2]->ic_code=EC_NOP; + temp_lag[1]->ic_code=EC_NOP; + tempi->ic_data=temp_lag[1]->ic_data; + tempi->ic_code=EC_FS_U2_DISP32; + } else if (temp_lag[2]->ic_data==1 && + temp_lag[2]->ic_code.u2[0]==EC_SHL_CONSTANT1) { + tempi->ic_flags|=temp_lag[2]->ic_flags|temp_lag[1]->ic_flags; + temp_lag[2]->ic_code=EC_NOP; + temp_lag[1]->ic_code=EC_NOP; + tempi->ic_data=temp_lag[1]->ic_data; + tempi->ic_code=EC_U2_DISP32_SCALED; + for (i=0;iic_data) + lea_s[i]+=100000; + } + } + PrsPush(ps,tempi); + break; + case EC_DEREF_U1: + tempi1=PrsPop(ps); + if (tempi1->ic_code.u2[0]==EC_LEA_DISP32_EBP) { + for (i=0;iic_data) + lea_s[i]--; + } + if (temp_lag[1]->ic_code.u2[0]==EC_ADD32) { + if (temp_lag[2]->ic_code.u2[0]==EC_EBP) { + tempi->ic_flags|=temp_lag[2]->ic_flags|temp_lag[1]->ic_flags; + temp_lag[2]->ic_code=EC_NOP; + temp_lag[1]->ic_code=EC_NOP; + tempi->ic_data=temp_lag[1]->ic_data; + tempi->ic_code=EC_U1_DISP32; + } else if (temp_lag[2]->ic_code.u2[0]==EC_FS) { + tempi->ic_flags|=temp_lag[2]->ic_flags|temp_lag[1]->ic_flags; + temp_lag[2]->ic_code=EC_NOP; + temp_lag[1]->ic_code=EC_NOP; + tempi->ic_data=temp_lag[1]->ic_data; + tempi->ic_code=EC_FS_U1_DISP32; + } + } + PrsPush(ps,tempi); + break; + case EC_U4_PP: + case EC_U4_MM: + case EC_PP_U4: + case EC_MM_U4: + tempi1=PrsPop(ps); + if (tempi1->ic_code.u2[0]==EC_LEA_DISP32_EBP) { + for (i=0;iic_data) + lea_s[i]--; + } else if (temp_lag[1]->ic_code.u2[0]==EC_ADD32 && + temp_lag[2]->ic_code.u2[0]==EC_EBP) { + for (i=0;iic_data) + lea_s[i]--; + } + PrsPush(ps,tempi); + break; + case EC_U8_PP: + case EC_U2_PP: + case EC_U1_PP: + case EC_U8_MM: + case EC_U2_MM: + case EC_U1_MM: + case EC_PP_U8: + case EC_PP_U2: + case EC_PP_U1: + case EC_MM_U8: + case EC_MM_U2: + case EC_MM_U1: + case EC_SHL_CONSTANT1: + case EC_SHL_CONSTANT2: + case EC_SHR_CONSTANT1: + case EC_SHR_CONSTANT2: + ps->ptr--; + PrsPush(ps,tempi); + break; + case EC_POWER: + case EC_SHL: + case EC_SHR: + case EC_MULTIPLICATION: + case EC_DIVISION: + case EC_REMAINDER: + case EC_AND: + case EC_OR: + case EC_XOR: + ps->ptr-=2; + PrsPush(ps,tempi); + break; + case EC_ADDITION: + if (tempi->ic_class->sub_type==IT_DOUBLE) { + ps->ptr-=2; + PrsPush(ps,tempi); + break; + } + tempi1=PrsPop(ps); + tempi2=PrsPop(ps); + if (FixupBinaryOp2(&tempi1,&tempi2)) { + tempi->ic_flags|=(tempi1->ic_flags&~ICF_NO_PUSHES); + tempi1->ic_code=EC_NOP; + ShiftNoPush(tempi1); + tempi->ic_data=tempi1->ic_data; + tempi->ic_code=EC_ADD32; + } + PrsPush(ps,tempi); + break; + case EC_SUBTRACTION: + if (tempi->ic_class->sub_type==IT_DOUBLE) { + ps->ptr-=2; + PrsPush(ps,tempi); + break; + } + tempi2=PrsPop(ps); + tempi1=PrsPop(ps); + if (FixupBinaryOp3(tempi2)) { + tempi->ic_flags|=(tempi2->ic_flags&~ICF_NO_PUSHES); + tempi2->ic_code=EC_NOP; + ShiftNoPush(tempi2); + tempi->ic_data=tempi2->ic_data; + tempi->ic_code=EC_SUB32; + } + PrsPush(ps,tempi); + break; + case EC_EQUAL_EQUAL: + case EC_NOT_EQUAL_TO: + case EC_LESS_THAN: + case EC_GREATER_THAN: + case EC_LESS_OR_EQUAL: + case EC_GREATER_OR_EQUAL: + case EC_AND_AND: + case EC_OR_OR: + case EC_XOR_XOR: + ps->ptr-=2; + PrsPush(ps,tempi); + break; + case EC_COLON: + ps->ptr-=3; + PrsPush(ps,tempi); + break; + + case EC_ASSIGN_U4: + case EC_SHL_EQUAL_U4: + case EC_SHR_EQUAL_U4: + case EC_MUL_EQUAL_U4: + case EC_DIV_EQUAL_U4: + case EC_AND_EQUAL_U4: + case EC_OR_EQUAL_U4: + case EC_XOR_EQUAL_U4: + case EC_ADD_EQUAL_U4: + case EC_SUB_EQUAL_U4: + tempi2=PrsPop(ps); + tempi1=PrsPop(ps); + if (tempi1->ic_code.u2[0]==EC_LEA_DISP32_EBP) + for (i=0;iic_data) + lea_s[i]--; + PrsPush(ps,tempi); + break; + case EC_ASSIGN_U8: + case EC_ASSIGN_U2: + case EC_ASSIGN_U1: + case EC_SHL_EQUAL_U8: + case EC_SHL_EQUAL_U2: + case EC_SHL_EQUAL_U1: + case EC_SHR_EQUAL_U8: + case EC_SHR_EQUAL_U2: + case EC_SHR_EQUAL_U1: + case EC_MUL_EQUAL_U8: + case EC_MUL_EQUAL_U2: + case EC_MUL_EQUAL_U1: + case EC_DIV_EQUAL_U8: + case EC_DIV_EQUAL_U2: + case EC_DIV_EQUAL_U1: + case EC_AND_EQUAL_U8: + case EC_AND_EQUAL_U2: + case EC_AND_EQUAL_U1: + case EC_OR_EQUAL_U8: + case EC_OR_EQUAL_U2: + case EC_OR_EQUAL_U1: + case EC_XOR_EQUAL_U8: + case EC_XOR_EQUAL_U2: + case EC_XOR_EQUAL_U1: + case EC_ADD_EQUAL_U8: + case EC_ADD_EQUAL_U2: + case EC_ADD_EQUAL_U1: + case EC_SUB_EQUAL_U8: + case EC_SUB_EQUAL_U2: + case EC_SUB_EQUAL_U1: + ps->ptr-=2; + PrsPush(ps,tempi); + break; + case EC_SHL_CONSTANT1: + case EC_SHL_CONSTANT2: + case EC_SHR_CONSTANT1: + case EC_SHR_CONSTANT2: + case EC_ADD64: + case EC_ADD32: + case EC_ADD8: + case EC_INC: + case EC_SUB64: + case EC_SUB32: + case EC_SUB8: + case EC_DEC: + ps->ptr--; + PrsPush(ps,tempi); + break; + case EC_ENTER: + break; + case EC_ADD_ESP32: + ps->ptr-=1+tempi->ic_data>>3; + PrsPush(ps,tempi); + break; + case EC_CALL: + case EC_CALL_INDIRECT: + case EC_CALL_INDIRECT2: + PrsPush(ps,tempi); + break; + case EC_CLI: + case EC_STI: + case EC_GET_FLAGS: + PrsPush(ps,tempi); + break; + case EC_SET_FLAGS: + ps->ptr--; + PrsPush(ps,tempi); + break; + case EC_GET_BASE_PTR: + PrsPush(ps,tempi); + break; + case EC_SET_BASE_PTR: + ps->ptr--; + PrsPush(ps,tempi); + break; + case EC_GET_STACK_PTR: + PrsPush(ps,tempi); + break; + case EC_SET_STACK_PTR: + ps->ptr--; + PrsPush(ps,tempi); + break; + case EC_GET_LABEL: + case EC_ABSOLUTE_ADDRESS: + PrsPush(ps,tempi); + break; + case EC_TYPE: + PrsPush(ps,tempi); + break; + case EC_BT: + case EC_BTS: + case EC_BTR: + case EC_BTC: + ps->ptr-=2; + PrsPush(ps,tempi); + break; + case EC_BSF: + case EC_BSR: + case EC_BT_CONSTANT: + case EC_BTS_CONSTANT: + case EC_BTR_CONSTANT: + case EC_BTC_CONSTANT: + ps->ptr--; + PrsPush(ps,tempi); + break; + case EC_INSQUE: + case EC_INSQUE_REV: + ps->ptr-=2; + PrsPush(ps,tempi); + break; + case EC_REMQUE: + ps->ptr--; + PrsPush(ps,tempi); + break; + case EC_MEMCPY: + case EC_MEMSET: + ps->ptr-=3; + PrsPush(ps,tempi); + break; + case EC_INPD: + case EC_INPW: + case EC_INP: + case EC_STRLEN: + ps->ptr--; + PrsPush(ps,tempi); + break; + case EC_OUTPD: + case EC_OUTPW: + case EC_OUTP: + ps->ptr-=2; + PrsPush(ps,tempi); + break; + case EC_SWITCH: + ps->ptr-=2; + break; + case EC_SKIPZ: + case EC_SKIPZ2: + case EC_SKIPNZ: + case EC_SKIPNZ2: //not present yet + ps->ptr--; + PrsPush(ps,tempi); + break; + case EC_EQUAL_EQUAL_SKIPZ: + case EC_EQUAL_EQUAL_SKIPZ2: + case EC_NOT_EQUAL_TO_SKIPZ: + case EC_NOT_EQUAL_TO_SKIPZ2: + case EC_LESS_THAN_SKIPZ: + case EC_LESS_THAN_SKIPZ2: + case EC_GREATER_THAN_SKIPZ: + case EC_GREATER_THAN_SKIPZ2: + case EC_LESS_OR_EQUAL_SKIPZ: + case EC_LESS_OR_EQUAL_SKIPZ2: + case EC_GREATER_OR_EQUAL_SKIPZ: + case EC_GREATER_OR_EQUAL_SKIPZ2: + case EC_AND_AND_SKIPZ: + case EC_AND_AND_SKIPZ2: + case EC_AND_AND_SKIPNZ: + case EC_AND_AND_SKIPNZ2: + case EC_OR_OR_SKIPZ: + case EC_OR_OR_SKIPZ2: + case EC_OR_OR_SKIPNZ: + case EC_OR_OR_SKIPNZ2: + ps->ptr-=2; + PrsPush(ps,tempi); + break; + case EC_LEAVE: + case EC_RET: + if (fun_class && (tempi1=last_with_class)) { + if (fun_class->return_class->sub_type==IT_DOUBLE && + tempi1->ic_class->sub_type!=IT_DOUBLE) + tempi1->ic_flags|=ICF_TO_DOUBLE; + if (fun_class->return_class->sub_type!=IT_DOUBLE && + tempi1->ic_class->sub_type==IT_DOUBLE) + tempi1->ic_flags|=ICF_TO_INT; + } + break; + + case EC_NULL: + case EC_LABEL: + case EC_ADDRESS: + case EC_QUESTION: + case EC_JMP: + case EC_IRQ: + case EC_NOP: + break; + + case EC_END_EXP: + ps->ptr--; + break; + + default: + OptMissing(l,2,tempi); + } + if (temp_lag[1]->ic_code.u2[0]==EC_ADD32) { + if (temp_lag[2]->ic_code.u2[0]==EC_EBP) { + temp_lag[1]->ic_flags|=temp_lag[2]->ic_flags; + temp_lag[2]->ic_code=EC_NOP; + temp_lag[1]->ic_code=EC_LEA_DISP32_EBP; + for (i=0;iic_data) + lea_s[i]++; + } + } + if (tempi->ic_class) + last_with_class=tempi; + tempi+=sizeof(IntermediateCode); + } + j=0; + if (fun_class && !Bt(&l->flags,LFf_NO_REG_VAR)) { + for (i=0;iESI_offset=o[0]; + l->EDI_offset=o[1]; + } else { + l->ESI_offset=MAX_I8; + l->EDI_offset=MAX_I8; + } + OptEnd(l,2,ps); +} + + +void CmpOptPass3(LexStruct *l,ClassStruct *fun_class) +{ //Reg optimization + I8 i1; + IntermediateCode *tempi,*tempi1,*tempi2, + *temp_lag[4]; + ClassStruct *tempc,*tempc2; + ParseStack *ps; + fun_class; //no unused warning + + if (l->flags & LF_NO_REG_OPT) + return; + + ps=OptStart(l,temp_lag); + tempi=l->cb.cb_in_ptr; + while (tempi->ic_code.u2[0]) { + OptNext(tempi,temp_lag); + switch (tempi->ic_code.u2[0]) { + case EC_U8: + case EC_U4: + PrsPush(ps,tempi); + break; + case EC_U2: //doesn't occur + case EC_U1: //doesn't occur + case EC_DOUBLE: + case EC_STRING_CONSTANT: + case EC_EBP: + case EC_FS: + PrsPush(ps,tempi); + break; + case EC_LEA_DISP32_EBP: + PrsPush(ps,tempi); + break; + case EC_COM: + case EC_NOT: + case EC_UNARY_MINUS: + ps->ptr--; + PrsPush(ps,tempi); + break; + case EC_U4_DISP32: + if (tempi->ic_data==l->ESI_offset) + tempi->ic_code=EC_ESI; + else if (tempi->ic_data==l->EDI_offset) + tempi->ic_code=EC_EDI; + PrsPush(ps,tempi); + break; + case EC_U8_DISP32: + case EC_U2_DISP32: + case EC_U1_DISP32: + PrsPush(ps,tempi); + break; + case EC_U8_DISP32_SCALED: + case EC_U4_DISP32_SCALED: + case EC_U2_DISP32_SCALED: + ps->ptr--; + PrsPush(ps,tempi); + break; + case EC_FS_U8_DISP32: + case EC_FS_U4_DISP32: + case EC_FS_U2_DISP32: + case EC_FS_U1_DISP32: + PrsPush(ps,tempi); + break; + case EC_DEREF_U8: + tempi1=PrsPop(ps); + if (tempi1->ic_code.u2[0]==EC_LEA_DISP32_EBP) { + if (tempi1->ic_data==l->ESI_offset) { + tempi->ic_flags|=(tempi1->ic_flags & ~ICF_NO_PUSHES); + tempi1->ic_code=EC_NOP; + ShiftNoPush(tempi1); + tempi->ic_code=EC_ESI_DEREF_U8; + } else if (tempi1->ic_data==l->EDI_offset) { + tempi->ic_flags|=(tempi1->ic_flags & ~ICF_NO_PUSHES); + tempi1->ic_code=EC_NOP; + ShiftNoPush(tempi1); + tempi->ic_code=EC_EDI_DEREF_U8; + } + } + if (temp_lag[1]->ic_code.u2[0]==EC_ADD32) { + if (temp_lag[2]->ic_code.u2[0]==EC_ESI) { + tempi->ic_flags|=temp_lag[2]->ic_flags|temp_lag[1]->ic_flags; + temp_lag[2]->ic_code=EC_NOP; + temp_lag[1]->ic_code=EC_NOP; + tempi->ic_data=temp_lag[1]->ic_data; + tempi->ic_code=EC_ESI_U8_DISP32; + } + if (temp_lag[2]->ic_code.u2[0]==EC_EDI) { + tempi->ic_flags|=temp_lag[2]->ic_flags|temp_lag[1]->ic_flags; + temp_lag[2]->ic_code=EC_NOP; + temp_lag[1]->ic_code=EC_NOP; + tempi->ic_data=temp_lag[1]->ic_data; + tempi->ic_code=EC_EDI_U8_DISP32; + } + } + PrsPush(ps,tempi); + break; + case EC_DEREF_U4: + tempi1=PrsPop(ps); + if (tempi1->ic_code.u2[0]==EC_LEA_DISP32_EBP) { + if (tempi1->ic_data==l->ESI_offset) { + tempi->ic_flags|=(tempi1->ic_flags & ~ICF_NO_PUSHES); + tempi1->ic_code=EC_NOP; + ShiftNoPush(tempi1); + tempi->ic_code=EC_ESI_DEREF_U4; + } else if (tempi1->ic_data==l->EDI_offset) { + tempi->ic_flags|=(tempi1->ic_flags & ~ICF_NO_PUSHES); + tempi1->ic_code=EC_NOP; + ShiftNoPush(tempi1); + tempi->ic_code=EC_EDI_DEREF_U4; + } + } + if (temp_lag[1]->ic_code.u2[0]==EC_ADD32) { + if (temp_lag[2]->ic_code.u2[0]==EC_ESI) { + tempi->ic_flags|=temp_lag[2]->ic_flags|temp_lag[1]->ic_flags; + temp_lag[2]->ic_code=EC_NOP; + temp_lag[1]->ic_code=EC_NOP; + tempi->ic_data=temp_lag[1]->ic_data; + tempi->ic_code=EC_ESI_U4_DISP32; + } + if (temp_lag[2]->ic_code.u2[0]==EC_EDI) { + tempi->ic_flags|=temp_lag[2]->ic_flags|temp_lag[1]->ic_flags; + temp_lag[2]->ic_code=EC_NOP; + temp_lag[1]->ic_code=EC_NOP; + tempi->ic_data=temp_lag[1]->ic_data; + tempi->ic_code=EC_EDI_U4_DISP32; + } + } + PrsPush(ps,tempi); + break; + case EC_DEREF_U2: + tempi1=PrsPop(ps); + if (tempi1->ic_code.u2[0]==EC_LEA_DISP32_EBP) { + if (tempi1->ic_data==l->ESI_offset) { + tempi->ic_flags|=(tempi1->ic_flags & ~ICF_NO_PUSHES); + tempi1->ic_code=EC_NOP; + ShiftNoPush(tempi1); + tempi->ic_code=EC_ESI_DEREF_U2; + } else if (tempi1->ic_data==l->EDI_offset) { + tempi->ic_flags|=(tempi1->ic_flags & ~ICF_NO_PUSHES); + tempi1->ic_code=EC_NOP; + ShiftNoPush(tempi1); + tempi->ic_code=EC_EDI_DEREF_U2; + } + } + if (temp_lag[1]->ic_code.u2[0]==EC_ADD32) { + if (temp_lag[2]->ic_code.u2[0]==EC_ESI) { + tempi->ic_flags|=temp_lag[2]->ic_flags|temp_lag[1]->ic_flags; + temp_lag[2]->ic_code=EC_NOP; + temp_lag[1]->ic_code=EC_NOP; + tempi->ic_data=temp_lag[1]->ic_data; + tempi->ic_code=EC_ESI_U2_DISP32; + } + if (temp_lag[2]->ic_code.u2[0]==EC_EDI) { + tempi->ic_flags|=temp_lag[2]->ic_flags|temp_lag[1]->ic_flags; + temp_lag[2]->ic_code=EC_NOP; + temp_lag[1]->ic_code=EC_NOP; + tempi->ic_data=temp_lag[1]->ic_data; + tempi->ic_code=EC_EDI_U2_DISP32; + } + } + PrsPush(ps,tempi); + break; + case EC_DEREF_U1: + tempi1=PrsPop(ps); + if (tempi1->ic_code.u2[0]==EC_LEA_DISP32_EBP) { + if (tempi1->ic_data==l->ESI_offset) { + tempi->ic_flags|=(tempi1->ic_flags & ~ICF_NO_PUSHES); + tempi1->ic_code=EC_NOP; + ShiftNoPush(tempi1); + tempi->ic_code=EC_ESI_DEREF_U1; + } else if (tempi1->ic_data==l->EDI_offset) { + tempi->ic_flags|=(tempi1->ic_flags & ~ICF_NO_PUSHES); + tempi1->ic_code=EC_NOP; + ShiftNoPush(tempi1); + tempi->ic_code=EC_EDI_DEREF_U1; + } + } + if (temp_lag[1]->ic_code.u2[0]==EC_ADD32) { + if (temp_lag[2]->ic_code.u2[0]==EC_ESI) { + tempi->ic_flags|=temp_lag[2]->ic_flags|temp_lag[1]->ic_flags; + temp_lag[2]->ic_code=EC_NOP; + temp_lag[1]->ic_code=EC_NOP; + tempi->ic_data=temp_lag[1]->ic_data; + tempi->ic_code=EC_ESI_U1_DISP32; + } + if (temp_lag[2]->ic_code.u2[0]==EC_EDI) { + tempi->ic_flags|=temp_lag[2]->ic_flags|temp_lag[1]->ic_flags; + temp_lag[2]->ic_code=EC_NOP; + temp_lag[1]->ic_code=EC_NOP; + tempi->ic_data=temp_lag[1]->ic_data; + tempi->ic_code=EC_EDI_U1_DISP32; + } + } + PrsPush(ps,tempi); + break; + case EC_U4_PP: + tempi1=PrsPop(ps); + if (tempi1->ic_code.u2[0]==EC_LEA_DISP32_EBP) { + if (tempi1->ic_data==l->ESI_offset) { + tempi->ic_flags|=(tempi1->ic_flags & ~ICF_NO_PUSHES); + tempi1->ic_code=EC_NOP; + ShiftNoPush(tempi1); + tempi->ic_code=EC_ESI_U4_PP; + } else if (tempi1->ic_data==l->EDI_offset) { + tempi->ic_flags|=(tempi1->ic_flags & ~ICF_NO_PUSHES); + tempi1->ic_code=EC_NOP; + ShiftNoPush(tempi1); + tempi->ic_code=EC_EDI_U4_PP; + } + } + PrsPush(ps,tempi); + break; + case EC_U4_MM: + tempi1=PrsPop(ps); + if (tempi1->ic_code.u2[0]==EC_LEA_DISP32_EBP) { + if (tempi1->ic_data==l->ESI_offset) { + tempi->ic_flags|=(tempi1->ic_flags & ~ICF_NO_PUSHES); + tempi1->ic_code=EC_NOP; + ShiftNoPush(tempi1); + tempi->ic_code=EC_ESI_U4_MM; + } else if (tempi1->ic_data==l->EDI_offset) { + tempi->ic_flags|=(tempi1->ic_flags & ~ICF_NO_PUSHES); + tempi1->ic_code=EC_NOP; + ShiftNoPush(tempi1); + tempi->ic_code=EC_EDI_U4_MM; + } + } + PrsPush(ps,tempi); + break; + case EC_PP_U4: + tempi1=PrsPop(ps); + if (tempi1->ic_code.u2[0]==EC_LEA_DISP32_EBP) { + if (tempi1->ic_data==l->ESI_offset) { + tempi->ic_flags|=(tempi1->ic_flags & ~ICF_NO_PUSHES); + tempi1->ic_code=EC_NOP; + ShiftNoPush(tempi1); + tempi->ic_code=EC_ESI_PP_U4; + } else if (tempi1->ic_data==l->EDI_offset) { + tempi->ic_flags|=(tempi1->ic_flags & ~ICF_NO_PUSHES); + tempi1->ic_code=EC_NOP; + ShiftNoPush(tempi1); + tempi->ic_code=EC_EDI_PP_U4; + } + } + PrsPush(ps,tempi); + break; + case EC_MM_U4: + tempi1=PrsPop(ps); + if (tempi1->ic_code.u2[0]==EC_LEA_DISP32_EBP) { + if (tempi1->ic_data==l->ESI_offset) { + tempi->ic_flags|=(tempi1->ic_flags & ~ICF_NO_PUSHES); + tempi1->ic_code=EC_NOP; + ShiftNoPush(tempi1); + tempi->ic_code=EC_ESI_MM_U4; + } else if (tempi1->ic_data==l->EDI_offset) { + tempi->ic_flags|=(tempi1->ic_flags & ~ICF_NO_PUSHES); + tempi1->ic_code=EC_NOP; + ShiftNoPush(tempi1); + tempi->ic_code=EC_EDI_MM_U4; + } + } + PrsPush(ps,tempi); + break; + case EC_U8_PP: + case EC_U2_PP: + case EC_U1_PP: + case EC_U8_MM: + case EC_U2_MM: + case EC_U1_MM: + case EC_PP_U8: + case EC_PP_U2: + case EC_PP_U1: + case EC_MM_U8: + case EC_MM_U2: + case EC_MM_U1: + ps->ptr--; + PrsPush(ps,tempi); + break; + case EC_POWER: + case EC_SHL: + case EC_SHR: + case EC_MULTIPLICATION: + case EC_DIVISION: + case EC_REMAINDER: + case EC_AND: + case EC_OR: + case EC_XOR: + case EC_ADDITION: + case EC_SUBTRACTION: + case EC_EQUAL_EQUAL: + case EC_NOT_EQUAL_TO: + case EC_LESS_THAN: + case EC_GREATER_THAN: + case EC_LESS_OR_EQUAL: + case EC_GREATER_OR_EQUAL: + case EC_AND_AND: + case EC_OR_OR: + case EC_XOR_XOR: + ps->ptr-=2; + PrsPush(ps,tempi); + break; + case EC_COLON: + ps->ptr-=3; + PrsPush(ps,tempi); + break; + case EC_ASSIGN_U4: + tempi2=PrsPop(ps); + tempi1=PrsPop(ps); + if (tempi1->ic_code.u2[0]==EC_LEA_DISP32_EBP) { + if (tempi1->ic_data==l->ESI_offset) { + tempi->ic_flags|=(tempi1->ic_flags&~ICF_NO_PUSHES); + tempi1->ic_code=EC_NOP; + ShiftNoPush(tempi1); + tempi->ic_code=EC_ESI_ASSIGN_U4; + } else if (tempi1->ic_data==l->EDI_offset) { + tempi->ic_flags|=(tempi1->ic_flags&~ICF_NO_PUSHES); + tempi1->ic_code=EC_NOP; + ShiftNoPush(tempi1); + tempi->ic_code=EC_EDI_ASSIGN_U4; + } + } + PrsPush(ps,tempi); + break; + case EC_SHL_EQUAL_U4: + tempi2=PrsPop(ps); + tempi1=PrsPop(ps); + if (tempi1->ic_code.u2[0]==EC_LEA_DISP32_EBP) { + if (tempi1->ic_data==l->ESI_offset) { + tempi->ic_flags|=(tempi1->ic_flags&~ICF_NO_PUSHES); + tempi1->ic_code=EC_NOP; + ShiftNoPush(tempi1); + tempi->ic_code=EC_ESI_SHL_EQUAL_U4; + } else if (tempi1->ic_data==l->EDI_offset) { + tempi->ic_flags|=(tempi1->ic_flags&~ICF_NO_PUSHES); + tempi1->ic_code=EC_NOP; + ShiftNoPush(tempi1); + tempi->ic_code=EC_EDI_SHL_EQUAL_U4; + } + } + PrsPush(ps,tempi); + break; + case EC_SHR_EQUAL_U4: + tempi2=PrsPop(ps); + tempi1=PrsPop(ps); + if (tempi1->ic_code.u2[0]==EC_LEA_DISP32_EBP) { + if (tempi1->ic_data==l->ESI_offset) { + tempi->ic_flags|=(tempi1->ic_flags&~ICF_NO_PUSHES); + tempi1->ic_code=EC_NOP; + ShiftNoPush(tempi1); + tempi->ic_code=EC_ESI_SHR_EQUAL_U4; + } else if (tempi1->ic_data==l->EDI_offset) { + tempi->ic_flags|=(tempi1->ic_flags&~ICF_NO_PUSHES); + tempi1->ic_code=EC_NOP; + ShiftNoPush(tempi1); + tempi->ic_code=EC_EDI_SHR_EQUAL_U4; + } + } + PrsPush(ps,tempi); + break; + case EC_MUL_EQUAL_U4: + tempi2=PrsPop(ps); + tempi1=PrsPop(ps); + if (tempi1->ic_code.u2[0]==EC_LEA_DISP32_EBP) { + if (tempi1->ic_data==l->ESI_offset) { + tempi->ic_flags|=(tempi1->ic_flags&~ICF_NO_PUSHES); + tempi1->ic_code=EC_NOP; + ShiftNoPush(tempi1); + tempi->ic_code=EC_ESI_MUL_EQUAL_U4; + } else if (tempi1->ic_data==l->EDI_offset) { + tempi->ic_flags|=(tempi1->ic_flags&~ICF_NO_PUSHES); + tempi1->ic_code=EC_NOP; + ShiftNoPush(tempi1); + tempi->ic_code=EC_EDI_MUL_EQUAL_U4; + } + } + PrsPush(ps,tempi); + break; + case EC_DIV_EQUAL_U4: + tempi2=PrsPop(ps); + tempi1=PrsPop(ps); + if (tempi1->ic_code.u2[0]==EC_LEA_DISP32_EBP) { + if (tempi1->ic_data==l->ESI_offset) { + tempi->ic_flags|=(tempi1->ic_flags&~ICF_NO_PUSHES); + tempi1->ic_code=EC_NOP; + ShiftNoPush(tempi1); + tempi->ic_code=EC_ESI_DIV_EQUAL_U4; + } else if (tempi1->ic_data==l->EDI_offset) { + tempi->ic_flags|=(tempi1->ic_flags&~ICF_NO_PUSHES); + tempi1->ic_code=EC_NOP; + ShiftNoPush(tempi1); + tempi->ic_code=EC_EDI_DIV_EQUAL_U4; + } + } + PrsPush(ps,tempi); + break; + case EC_AND_EQUAL_U4: + tempi2=PrsPop(ps); + tempi1=PrsPop(ps); + if (tempi1->ic_code.u2[0]==EC_LEA_DISP32_EBP) { + if (tempi1->ic_data==l->ESI_offset) { + tempi->ic_flags|=(tempi1->ic_flags&~ICF_NO_PUSHES); + tempi1->ic_code=EC_NOP; + ShiftNoPush(tempi1); + tempi->ic_code=EC_ESI_AND_EQUAL_U4; + } else if (tempi1->ic_data==l->EDI_offset) { + tempi->ic_flags|=(tempi1->ic_flags&~ICF_NO_PUSHES); + tempi1->ic_code=EC_NOP; + ShiftNoPush(tempi1); + tempi->ic_code=EC_EDI_AND_EQUAL_U4; + } + } + PrsPush(ps,tempi); + break; + case EC_OR_EQUAL_U4: + tempi2=PrsPop(ps); + tempi1=PrsPop(ps); + if (tempi1->ic_code.u2[0]==EC_LEA_DISP32_EBP) { + if (tempi1->ic_data==l->ESI_offset) { + tempi->ic_flags|=(tempi1->ic_flags&~ICF_NO_PUSHES); + tempi1->ic_code=EC_NOP; + ShiftNoPush(tempi1); + tempi->ic_code=EC_ESI_OR_EQUAL_U4; + } else if (tempi1->ic_data==l->EDI_offset) { + tempi->ic_flags|=(tempi1->ic_flags&~ICF_NO_PUSHES); + tempi1->ic_code=EC_NOP; + ShiftNoPush(tempi1); + tempi->ic_code=EC_EDI_OR_EQUAL_U4; + } + } + PrsPush(ps,tempi); + break; + case EC_XOR_EQUAL_U4: + tempi2=PrsPop(ps); + tempi1=PrsPop(ps); + if (tempi1->ic_code.u2[0]==EC_LEA_DISP32_EBP) { + if (tempi1->ic_data==l->ESI_offset) { + tempi->ic_flags|=(tempi1->ic_flags&~ICF_NO_PUSHES); + tempi1->ic_code=EC_NOP; + ShiftNoPush(tempi1); + tempi->ic_code=EC_ESI_XOR_EQUAL_U4; + } else if (tempi1->ic_data==l->EDI_offset) { + tempi->ic_flags|=(tempi1->ic_flags&~ICF_NO_PUSHES); + tempi1->ic_code=EC_NOP; + ShiftNoPush(tempi1); + tempi->ic_code=EC_EDI_XOR_EQUAL_U4; + } + } + PrsPush(ps,tempi); + break; + case EC_ADD_EQUAL_U4: + tempi2=PrsPop(ps); + tempi1=PrsPop(ps); + i1=tempi2->ic_data; + if (tempi1->ic_code.u2[0]==EC_LEA_DISP32_EBP) { + if (tempi1->ic_data==l->ESI_offset) { + tempi->ic_flags|=(tempi1->ic_flags&~ICF_NO_PUSHES); + tempi1->ic_code=EC_NOP; + ShiftNoPush(tempi1); + tempi->ic_code=EC_ESI_ADD_EQUAL_U4; + if (tempi2->ic_code.u2[0]==EC_U8 && + i1>=-128 && i1<=127) { + tempi2->ic_code=EC_NOP; + tempi->ic_flags|=tempi2->ic_flags; + tempi->ic_data=i1; + tempi->ic_code=EC_ESI_ADD_EQUAL_U4_CONSTANT_U1; + } + } else if (tempi1->ic_data==l->EDI_offset) { + tempi->ic_flags|=(tempi1->ic_flags&~ICF_NO_PUSHES); + tempi1->ic_code=EC_NOP; + ShiftNoPush(tempi1); + tempi->ic_code=EC_EDI_ADD_EQUAL_U4; + if (tempi2->ic_code.u2[0]==EC_U8 && + i1>=-128 && i1<=127) { + tempi2->ic_code=EC_NOP; + tempi->ic_flags|=tempi2->ic_flags; + tempi->ic_data=i1; + tempi->ic_code=EC_EDI_ADD_EQUAL_U4_CONSTANT_U1; + } + } + } + if (tempi->ic_code.u2[0]==EC_ADD_EQUAL_U4 && + tempi2->ic_code.u2[0]==EC_U8 && + i1>=-128 && i1<=127) { + tempi2->ic_code=EC_NOP; + tempi->ic_flags|=tempi2->ic_flags; + tempi->ic_data=i1; + tempi->ic_code=EC_ADD_EQUAL_U4_CONSTANT_U1; + } + PrsPush(ps,tempi); + break; + case EC_SUB_EQUAL_U4: + tempi2=PrsPop(ps); + tempi1=PrsPop(ps); + i1=-tempi2->ic_data; + if (tempi1->ic_code.u2[0]==EC_LEA_DISP32_EBP) { + if (tempi1->ic_data==l->ESI_offset) { + tempi->ic_flags|=(tempi1->ic_flags&~ICF_NO_PUSHES); + tempi1->ic_code=EC_NOP; + ShiftNoPush(tempi1); + tempi->ic_code=EC_ESI_SUB_EQUAL_U4; + if (tempi2->ic_code.u2[0]==EC_U8 && + i1>=-128 && i1<=127) { + tempi2->ic_code=EC_NOP; + tempi->ic_flags|=tempi2->ic_flags; + tempi->ic_data=i1; + tempi->ic_code=EC_ESI_ADD_EQUAL_U4_CONSTANT_U1; + } + } else if (tempi1->ic_data==l->EDI_offset) { + tempi->ic_flags|=(tempi1->ic_flags&~ICF_NO_PUSHES); + tempi1->ic_code=EC_NOP; + ShiftNoPush(tempi1); + tempi->ic_code=EC_EDI_SUB_EQUAL_U4; + if (tempi2->ic_code.u2[0]==EC_U8 && + i1>=-128 && i1<=127) { + tempi2->ic_code=EC_NOP; + tempi->ic_flags|=tempi2->ic_flags; + tempi->ic_data=i1; + tempi->ic_code=EC_EDI_ADD_EQUAL_U4_CONSTANT_U1; + } + } + } + if (tempi->ic_code.u2[0]==EC_SUB_EQUAL_U4 && + tempi2->ic_code.u2[0]==EC_U8 && + i1>=-128 && i1<=127) { + tempi2->ic_code=EC_NOP; + tempi->ic_flags|=tempi2->ic_flags; + tempi->ic_data=i1; + tempi->ic_code=EC_ADD_EQUAL_U4_CONSTANT_U1; + } + PrsPush(ps,tempi); + break; + case EC_ASSIGN_U8: + case EC_ASSIGN_U2: + case EC_ASSIGN_U1: + case EC_SHL_EQUAL_U8: + case EC_SHL_EQUAL_U2: + case EC_SHL_EQUAL_U1: + case EC_SHR_EQUAL_U8: + case EC_SHR_EQUAL_U2: + case EC_SHR_EQUAL_U1: + case EC_MUL_EQUAL_U8: + case EC_MUL_EQUAL_U2: + case EC_MUL_EQUAL_U1: + case EC_DIV_EQUAL_U8: + case EC_DIV_EQUAL_U2: + case EC_DIV_EQUAL_U1: + case EC_AND_EQUAL_U8: + case EC_AND_EQUAL_U2: + case EC_AND_EQUAL_U1: + case EC_OR_EQUAL_U8: + case EC_OR_EQUAL_U2: + case EC_OR_EQUAL_U1: + case EC_XOR_EQUAL_U8: + case EC_XOR_EQUAL_U2: + case EC_XOR_EQUAL_U1: + case EC_ADD_EQUAL_U2: + case EC_ADD_EQUAL_U1: + case EC_SUB_EQUAL_U2: + case EC_SUB_EQUAL_U1: + ps->ptr-=2; + PrsPush(ps,tempi); + break; + + case EC_ADD_EQUAL_U8: + tempi2=PrsPop(ps); + tempi1=PrsPop(ps); + i1=tempi2->ic_data; + tempc=tempi->ic_class; + tempc2=tempi2->ic_class; + if (tempc->sub_type!=IT_DOUBLE && + tempc2->sub_type!=IT_DOUBLE && + tempi2->ic_code.u2[0]==EC_U8 && + i1>=-128 && i1<=127) { + tempi2->ic_code=EC_NOP; + tempi->ic_flags|=tempi2->ic_flags; + tempi->ic_data=i1; + tempi->ic_code=EC_ADD_EQUAL_U8_CONSTANT_U1; + } + PrsPush(ps,tempi); + break; + + case EC_SUB_EQUAL_U8: + tempi2=PrsPop(ps); + tempi1=PrsPop(ps); + i1=tempi2->ic_data; + tempc=tempi->ic_class; + tempc2=tempi2->ic_class; + if (tempc->sub_type!=IT_DOUBLE && + tempc2->sub_type!=IT_DOUBLE && + tempi2->ic_code.u2[0]==EC_U8 && + i1>=-128 && i1<=127) { + tempi2->ic_code=EC_NOP; + tempi->ic_flags|=tempi2->ic_flags; + tempi->ic_data=i1; + tempi->ic_code=EC_SUB_EQUAL_U8_CONSTANT_U1; + } + PrsPush(ps,tempi); + break; + + case EC_SHL_CONSTANT1: + case EC_SHL_CONSTANT2: + case EC_SHR_CONSTANT1: + case EC_SHR_CONSTANT2: + case EC_ADD64: + case EC_ADD32: + case EC_SUB64: + case EC_SUB32: + ps->ptr--; + PrsPush(ps,tempi); + break; + case EC_ENTER: + if (l->EDI_offset!=MAX_I8) + tempi->ic_code=EC_ENTER2; + else if (l->ESI_offset!=MAX_I8) + tempi->ic_code=EC_ENTER1; + break; + case EC_LEAVE: + if (l->EDI_offset!=MAX_I8) + tempi->ic_code=EC_LEAVE2; + else if (l->ESI_offset!=MAX_I8) + tempi->ic_code=EC_LEAVE1; + break; + case EC_ADD_ESP32: + i1=tempi->ic_data; + ps->ptr-=1+i1>>3; + PrsPush(ps,tempi); + break; + case EC_CALL: + case EC_CALL_INDIRECT: + case EC_CALL_INDIRECT2: + PrsPush(ps,tempi); + break; + case EC_IRQ: + break; + case EC_CLI: + case EC_STI: + case EC_GET_FLAGS: + PrsPush(ps,tempi); + break; + case EC_SET_FLAGS: + ps->ptr--; + PrsPush(ps,tempi); + break; + case EC_GET_BASE_PTR: + PrsPush(ps,tempi); + break; + case EC_SET_BASE_PTR: + ps->ptr--; + PrsPush(ps,tempi); + break; + case EC_GET_STACK_PTR: + PrsPush(ps,tempi); + break; + case EC_SET_STACK_PTR: + ps->ptr--; + PrsPush(ps,tempi); + break; + case EC_GET_LABEL: + case EC_ABSOLUTE_ADDRESS: + PrsPush(ps,tempi); + break; + case EC_TYPE: + PrsPush(ps,tempi); + break; + case EC_BT: + case EC_BTS: + case EC_BTR: + case EC_BTC: + ps->ptr-=2; + PrsPush(ps,tempi); + break; + case EC_BSF: + case EC_BSR: + case EC_BT_CONSTANT: + case EC_BTS_CONSTANT: + case EC_BTR_CONSTANT: + case EC_BTC_CONSTANT: + ps->ptr--; + PrsPush(ps,tempi); + break; + case EC_INSQUE: + case EC_INSQUE_REV: + ps->ptr-=2; + PrsPush(ps,tempi); + break; + case EC_REMQUE: + ps->ptr--; + PrsPush(ps,tempi); + break; + case EC_MEMCPY: + case EC_MEMSET: + ps->ptr-=3; + PrsPush(ps,tempi); + break; + case EC_INPD: + case EC_INPW: + case EC_INP: + case EC_STRLEN: + ps->ptr--; + PrsPush(ps,tempi); + break; + case EC_OUTPD: + case EC_OUTPW: + case EC_OUTP: + ps->ptr-=2; + PrsPush(ps,tempi); + break; + case EC_JMP: + case EC_SHORT_JMP: + break; + case EC_SWITCH: + ps->ptr-=2; + break; + case EC_SKIPZ: + case EC_SKIPZ2: + case EC_SKIPNZ: + case EC_SKIPNZ2: //not present yet + ps->ptr--; + PrsPush(ps,tempi); + break; + case EC_EQUAL_EQUAL_SKIPZ: + case EC_EQUAL_EQUAL_SKIPZ2: + case EC_NOT_EQUAL_TO_SKIPZ: + case EC_NOT_EQUAL_TO_SKIPZ2: + case EC_LESS_THAN_SKIPZ: + case EC_LESS_THAN_SKIPZ2: + case EC_GREATER_THAN_SKIPZ: + case EC_GREATER_THAN_SKIPZ2: + case EC_LESS_OR_EQUAL_SKIPZ: + case EC_LESS_OR_EQUAL_SKIPZ2: + case EC_GREATER_OR_EQUAL_SKIPZ: + case EC_GREATER_OR_EQUAL_SKIPZ2: + case EC_AND_AND_SKIPZ: + case EC_AND_AND_SKIPZ2: + case EC_AND_AND_SKIPNZ: + case EC_AND_AND_SKIPNZ2: + case EC_OR_OR_SKIPZ: + case EC_OR_OR_SKIPZ2: + case EC_OR_OR_SKIPNZ: + case EC_OR_OR_SKIPNZ2: + ps->ptr-=2; + PrsPush(ps,tempi); + break; + + case EC_NULL: + case EC_LABEL: + case EC_ADDRESS: + case EC_QUESTION: + case EC_JMP: + case EC_IRQ: + case EC_NOP: + case EC_RET: + break; + + case EC_END_EXP: + ps->ptr--; + break; + + default: + OptMissing(l,3,tempi); + } + if (temp_lag[1]->ic_code.u2[0]==EC_ADD32) { + if (temp_lag[2]->ic_code.u2[0]==EC_ESI) { + temp_lag[1]->ic_flags|=temp_lag[2]->ic_flags; + temp_lag[2]->ic_code=EC_NOP; + temp_lag[1]->ic_code=EC_LEA_DISP32_ESI; + } else if (temp_lag[2]->ic_code.u2[0]==EC_EDI) { + temp_lag[1]->ic_flags|=temp_lag[2]->ic_flags; + temp_lag[2]->ic_code=EC_NOP; + temp_lag[1]->ic_code=EC_LEA_DISP32_EDI; + } + } + tempi+=sizeof(IntermediateCode); + } + OptEnd(l,3,ps); +} + +void CmpOptPass4(LexStruct *l,ClassStruct *fun_class) +{ //adjust constants to smaller sizes + I8 i1,i; + IntermediateCode *tempi,*tempi1, + *temp_lag[4]; + ClassStruct *tempc; + ParseStack *ps=OptStart(l,temp_lag); + + fun_class; //no unused warning + tempi=l->cb.cb_in_ptr; + while (tempi->ic_code.u2[0]) { + OptNext(tempi,temp_lag); + switch (tempi->ic_code.u2[0]) { + case EC_U8: + if (!(tempi->ic_data&0xFFFFFFFF00000000)) { + if (!tempi->ic_data) + tempi->ic_code=EC_ZERO; + else if (tempi->ic_data<=127) { + tempc=tempi->ic_class; + if (!(tempc->sub_type&1)) + tempi->ic_class=sys_internal_types[tempc->sub_type+1]; + tempi->ic_code=EC_U1; + } else { + tempc=tempi->ic_class; + if (!(tempc->sub_type&1)) + tempi->ic_class=sys_internal_types[tempc->sub_type+1]; + tempi->ic_code=EC_U4; + } + } else if (tempi->ic_data&0xFFFFFFFF80000000==0xFFFFFFFF80000000) { + tempc=tempi->ic_class; + if (tempc->sub_type&1) + tempi->ic_class=sys_internal_types[tempc->sub_type-1]; + tempi->ic_code=EC_U4; + } + PrsPush(ps,tempi); + break; + case EC_U4: + if (!tempi->ic_data) + tempi->ic_code=EC_ZERO; + else if (tempi->ic_data<=127) { + tempc=tempi->ic_class; + if (!(tempc->sub_type&1)) + tempi->ic_class=sys_internal_types[tempc->sub_type+1]; + tempi->ic_code=EC_U1; + } + PrsPush(ps,tempi); + break; + case EC_U2: //doesn't occur + case EC_U1: //doesn't occur + case EC_DOUBLE: + case EC_STRING_CONSTANT: + case EC_EBP: + case EC_FS: + case EC_ESI: + case EC_EDI: + PrsPush(ps,tempi); + break; + case EC_LEA_DISP32_EBP: + i1=tempi->ic_data; + if (i1>=-128 && i1<=127) + tempi->ic_code=EC_LEA_DISP8_EBP; + PrsPush(ps,tempi); + break; + case EC_LEA_DISP32_ESI: + i1=tempi->ic_data; + if (i1>=-128 && i1<=127) + tempi->ic_code=EC_LEA_DISP8_ESI; + PrsPush(ps,tempi); + break; + case EC_LEA_DISP32_EDI: + i1=tempi->ic_data; + if (i1>=-128 && i1<=127) + tempi->ic_code=EC_LEA_DISP8_EDI; + PrsPush(ps,tempi); + break; + case EC_COM: + case EC_NOT: + case EC_UNARY_MINUS: + ps->ptr--; + PrsPush(ps,tempi); + break; + case EC_U8_DISP32: + case EC_U4_DISP32: + case EC_U2_DISP32: + case EC_U1_DISP32: + case EC_ESI_U8_DISP32: + case EC_ESI_U4_DISP32: + case EC_ESI_U2_DISP32: + case EC_ESI_U1_DISP32: + case EC_EDI_U8_DISP32: + case EC_EDI_U4_DISP32: + case EC_EDI_U2_DISP32: + case EC_EDI_U1_DISP32: + i1=tempi->ic_data; + if (i1>=-128 && i1<=127) + tempi->ic_code+=EC_U8_DISP8-EC_U8_DISP32; + PrsPush(ps,tempi); + break; + case EC_U8_DISP32_SCALED: + case EC_U4_DISP32_SCALED: + case EC_U2_DISP32_SCALED: + ps->ptr--; + PrsPush(ps,tempi); + break; + case EC_FS_U8_DISP32: + case EC_FS_U4_DISP32: + case EC_FS_U2_DISP32: + case EC_FS_U1_DISP32: + case EC_ESI_DEREF_U8: + case EC_ESI_DEREF_U4: + case EC_ESI_DEREF_U2: + case EC_ESI_DEREF_U1: + case EC_EDI_DEREF_U8: + case EC_EDI_DEREF_U4: + case EC_EDI_DEREF_U2: + case EC_EDI_DEREF_U1: + case EC_ESI_U4_PP: + case EC_ESI_U4_MM: + case EC_ESI_PP_U4: + case EC_ESI_MM_U4: + case EC_EDI_U4_PP: + case EC_EDI_U4_MM: + case EC_EDI_PP_U4: + case EC_EDI_MM_U4: + PrsPush(ps,tempi); + break; + case EC_DEREF_U8: + case EC_DEREF_U4: + case EC_DEREF_U2: + case EC_DEREF_U1: + case EC_U8_PP: + case EC_U4_PP: + case EC_U2_PP: + case EC_U1_PP: + case EC_U8_MM: + case EC_U4_MM: + case EC_U2_MM: + case EC_U1_MM: + case EC_PP_U8: + case EC_PP_U4: + case EC_PP_U2: + case EC_PP_U1: + case EC_MM_U8: + case EC_MM_U4: + case EC_MM_U2: + case EC_MM_U1: + ps->ptr--; + PrsPush(ps,tempi); + break; + case EC_POWER: + case EC_SHL: + case EC_SHR: + case EC_MULTIPLICATION: + case EC_DIVISION: + case EC_REMAINDER: + case EC_AND: + case EC_OR: + case EC_XOR: + case EC_ADDITION: + case EC_SUBTRACTION: + case EC_EQUAL_EQUAL: + case EC_NOT_EQUAL_TO: + case EC_LESS_THAN: + case EC_GREATER_THAN: + case EC_LESS_OR_EQUAL: + case EC_GREATER_OR_EQUAL: + case EC_AND_AND: + case EC_OR_OR: + case EC_XOR_XOR: + ps->ptr-=2; + PrsPush(ps,tempi); + break; + case EC_COLON: + ps->ptr-=3; + PrsPush(ps,tempi); + break; + case EC_ESI_ASSIGN_U4: + ps->ptr--; + if (temp_lag[1]->ic_code.u2[0]==EC_DEREF_U4 && + temp_lag[2]->ic_code.u2[0]==EC_ESI) { + temp_lag[1]->ic_code=EC_NOP; + temp_lag[2]->ic_code=EC_NOP; + tempi->ic_flags|=temp_lag[2]->ic_flags; + tempi->ic_code=EC_ESI_NEXT_EQUAL_U4; + } + PrsPush(ps,tempi); + break; + case EC_EDI_ASSIGN_U4: + ps->ptr--; + if (temp_lag[1]->ic_code.u2[0]==EC_DEREF_U4 && + temp_lag[2]->ic_code.u2[0]==EC_EDI) { + temp_lag[1]->ic_code=EC_NOP; + temp_lag[2]->ic_code=EC_NOP; + tempi->ic_flags|=temp_lag[2]->ic_flags; + tempi->ic_code=EC_EDI_NEXT_EQUAL_U4; + } + PrsPush(ps,tempi); + break; + case EC_ADD_EQUAL_U8_CONSTANT_U1: + case EC_SUB_EQUAL_U8_CONSTANT_U1: + case EC_ADD_EQUAL_U4_CONSTANT_U1: + ps->ptr--; + PrsPush(ps,tempi); + break; + case EC_ESI_ADD_EQUAL_U4_CONSTANT_U1: + case EC_EDI_ADD_EQUAL_U4_CONSTANT_U1: + PrsPush(ps,tempi); + break; + + case EC_ESI_SHL_EQUAL_U4: + case EC_ESI_SHR_EQUAL_U4: + case EC_ESI_MUL_EQUAL_U4: + case EC_ESI_DIV_EQUAL_U4: + case EC_ESI_AND_EQUAL_U4: + case EC_ESI_OR_EQUAL_U4: + case EC_ESI_XOR_EQUAL_U4: + case EC_ESI_ADD_EQUAL_U4: + case EC_ESI_SUB_EQUAL_U4: + + case EC_EDI_SHL_EQUAL_U4: + case EC_EDI_SHR_EQUAL_U4: + case EC_EDI_MUL_EQUAL_U4: + case EC_EDI_DIV_EQUAL_U4: + case EC_EDI_AND_EQUAL_U4: + case EC_EDI_OR_EQUAL_U4: + case EC_EDI_XOR_EQUAL_U4: + case EC_EDI_ADD_EQUAL_U4: + case EC_EDI_SUB_EQUAL_U4: + ps->ptr--; + PrsPush(ps,tempi); + break; + + case EC_ASSIGN_U8: + case EC_ASSIGN_U4: + case EC_ASSIGN_U2: + case EC_ASSIGN_U1: + case EC_SHL_EQUAL_U8: + case EC_SHL_EQUAL_U4: + case EC_SHL_EQUAL_U2: + case EC_SHL_EQUAL_U1: + case EC_SHR_EQUAL_U8: + case EC_SHR_EQUAL_U4: + case EC_SHR_EQUAL_U2: + case EC_SHR_EQUAL_U1: + case EC_MUL_EQUAL_U8: + case EC_MUL_EQUAL_U4: + case EC_MUL_EQUAL_U2: + case EC_MUL_EQUAL_U1: + case EC_DIV_EQUAL_U8: + case EC_DIV_EQUAL_U4: + case EC_DIV_EQUAL_U2: + case EC_DIV_EQUAL_U1: + case EC_AND_EQUAL_U8: + case EC_AND_EQUAL_U4: + case EC_AND_EQUAL_U2: + case EC_AND_EQUAL_U1: + case EC_OR_EQUAL_U8: + case EC_OR_EQUAL_U4: + case EC_OR_EQUAL_U2: + case EC_OR_EQUAL_U1: + case EC_XOR_EQUAL_U8: + case EC_XOR_EQUAL_U4: + case EC_XOR_EQUAL_U2: + case EC_XOR_EQUAL_U1: + case EC_ADD_EQUAL_U8: + case EC_ADD_EQUAL_U4: + case EC_ADD_EQUAL_U2: + case EC_ADD_EQUAL_U1: + case EC_SUB_EQUAL_U8: + case EC_SUB_EQUAL_U4: + case EC_SUB_EQUAL_U2: + case EC_SUB_EQUAL_U1: + ps->ptr-=2; + PrsPush(ps,tempi); + break; + case EC_SHL_CONSTANT1: + case EC_SHL_CONSTANT2: + case EC_SHR_CONSTANT1: + case EC_SHR_CONSTANT2: + case EC_ADD64: + ps->ptr--; + PrsPush(ps,tempi); + break; + case EC_ADD32: + tempi1=PrsPop(ps); + if (!(i1=tempi->ic_data)) { + tempi1->ic_class=tempi->ic_class; + tempi1->ic_flags|=tempi->ic_flags; + tempi->ic_code=EC_NOP; + PrsPush(ps,tempi1); + } else { + if (i1==1) + tempi->ic_code=EC_INC; + else if (i1==-1) + tempi->ic_code=EC_DEC; + else if (i1>=-128 && i1<=127) + tempi->ic_code=EC_ADD8; + PrsPush(ps,tempi); + } + break; + case EC_SUB64: + ps->ptr--; + PrsPush(ps,tempi); + break; + case EC_SUB32: + tempi1=PrsPop(ps); + if (!(i1=tempi->ic_data)) { + tempi1->ic_class=tempi->ic_class; + tempi1->ic_flags|=tempi->ic_flags; + tempi->ic_code=EC_NOP; + PrsPush(ps,tempi1); + } else { + if (i1==1) + tempi->ic_code=EC_DEC; + else if (i1==-1) + tempi->ic_code=EC_INC; + else if (i1>=-128 && i1<=127) + tempi->ic_code=EC_SUB8; + PrsPush(ps,tempi); + } + break; + case EC_ENTER: + case EC_ENTER1: + case EC_ENTER2: + break; + case EC_LEAVE: + if (temp_lag[1]->ic_code.u2[0]==EC_ADD_ESP32 || + temp_lag[1]->ic_code.u2[0]==EC_ADD_ESP8) { + tempi->ic_data+=temp_lag[1]->ic_data; + tempi->ic_flags|=temp_lag[1]->ic_flags; + temp_lag[1]->ic_code=EC_NOP; + } + break; + case EC_LEAVE1: + case EC_LEAVE2: + break; + case EC_ADD_ESP32: + i1=tempi->ic_data; + ps->ptr-=1+i1>>3; + if (i1>=-128 && i1<=127) { + if (!i1) { + temp_lag[1]->ic_flags|=tempi->ic_flags; + tempi->ic_code=EC_NOP; + } else + tempi->ic_code=EC_ADD_ESP8; + } + PrsPush(ps,tempi); + break; + case EC_CALL: + case EC_CALL_INDIRECT: + case EC_CALL_INDIRECT2: + PrsPush(ps,tempi); + break; + case EC_IRQ: + break; + case EC_CLI: + case EC_STI: + case EC_GET_FLAGS: + PrsPush(ps,tempi); + break; + case EC_SET_FLAGS: + ps->ptr--; + PrsPush(ps,tempi); + break; + case EC_GET_BASE_PTR: + PrsPush(ps,tempi); + break; + case EC_SET_BASE_PTR: + ps->ptr--; + PrsPush(ps,tempi); + break; + case EC_GET_STACK_PTR: + PrsPush(ps,tempi); + break; + case EC_SET_STACK_PTR: + ps->ptr--; + PrsPush(ps,tempi); + break; + case EC_GET_LABEL: + case EC_ABSOLUTE_ADDRESS: + PrsPush(ps,tempi); + break; + case EC_TYPE: + PrsPush(ps,tempi); + break; + case EC_BT: + case EC_BTS: + case EC_BTR: + case EC_BTC: + ps->ptr-=2; + PrsPush(ps,tempi); + break; + case EC_BSF: + case EC_BSR: + case EC_BT_CONSTANT: + case EC_BTS_CONSTANT: + case EC_BTR_CONSTANT: + case EC_BTC_CONSTANT: + ps->ptr--; + PrsPush(ps,tempi); + break; + case EC_INSQUE: + case EC_INSQUE_REV: + ps->ptr-=2; + PrsPush(ps,tempi); + break; + case EC_REMQUE: + ps->ptr--; + PrsPush(ps,tempi); + break; + case EC_MEMCPY: + case EC_MEMSET: + ps->ptr-=3; + PrsPush(ps,tempi); + break; + case EC_INPD: + case EC_INPW: + case EC_INP: + case EC_STRLEN: + ps->ptr--; + PrsPush(ps,tempi); + break; + case EC_OUTPD: + case EC_OUTPW: + case EC_OUTP: + ps->ptr-=2; + PrsPush(ps,tempi); + break; + case EC_JMP: + case EC_SHORT_JMP: + break; + case EC_SWITCH: + ps->ptr-=2; + break; + case EC_SKIPZ: + case EC_SKIPZ2: + case EC_SKIPNZ: + case EC_SKIPNZ2: //not present yet + ps->ptr--; + PrsPush(ps,tempi); + break; + case EC_EQUAL_EQUAL_SKIPZ: + case EC_EQUAL_EQUAL_SKIPZ2: + case EC_NOT_EQUAL_TO_SKIPZ: + case EC_NOT_EQUAL_TO_SKIPZ2: + case EC_LESS_THAN_SKIPZ: + case EC_LESS_THAN_SKIPZ2: + case EC_GREATER_THAN_SKIPZ: + case EC_GREATER_THAN_SKIPZ2: + case EC_LESS_OR_EQUAL_SKIPZ: + case EC_LESS_OR_EQUAL_SKIPZ2: + case EC_GREATER_OR_EQUAL_SKIPZ: + case EC_GREATER_OR_EQUAL_SKIPZ2: + case EC_AND_AND_SKIPZ: + case EC_AND_AND_SKIPZ2: + case EC_AND_AND_SKIPNZ: + case EC_AND_AND_SKIPNZ2: + case EC_OR_OR_SKIPZ: + case EC_OR_OR_SKIPZ2: + case EC_OR_OR_SKIPNZ: + case EC_OR_OR_SKIPNZ2: + ps->ptr-=2; + PrsPush(ps,tempi); + break; + + case EC_NULL: + case EC_LABEL: + case EC_ADDRESS: + case EC_QUESTION: + case EC_JMP: + case EC_IRQ: + case EC_NOP: + case EC_RET: + break; + + case EC_END_EXP: + ps->ptr--; + break; + + default: + OptMissing(l,4,tempi); + } + if (Bt(push_bitmap,tempi->ic_code.u2[0]) && !(tempi->ic_flags & ICF_NO_PUSHES)) { + tempi1=temp_lag[1]; + i=push_map[tempi1->ic_code.u2[0]]; + i1=tempi1->ic_data; + tempc=tempi1->ic_class; + switch (i) { + case EC_PUSH_U4: + if (!(tempc->sub_type&1) && i1<0) + i=EC_PUSH_NEG_U4; + break; + case EC_PUSH_U2: + if (!(tempc->sub_type&1) && i1<0) + i=EC_PUSH_NEG_U2; + break; + case EC_PUSH_U1: + if (i1<-0x80 || i1>0x7F) { + i=EC_PUSH_U2; + if (!(tempc->sub_type&1) && i1<0) + i=EC_PUSH_NEG_U2; + } else { + if (!(tempc->sub_type&1) && i1<0) + i=EC_PUSH_NEG_U1; + } + break; + } + if (i) { + tempi1->ic_code=i; + if (!(tempi1->ic_flags & (ICF_TO_DOUBLE|ICF_TO_INT)) ) + tempi->ic_flags|=ICF_NO_PUSHES; + else + tempi1->ic_flags|=ICF_NO_PUSHES_TO_DOUBLE_OR_INT; + } + } + tempi+=sizeof(IntermediateCode); + } + OptEnd(l,4,ps); +} + \ No newline at end of file diff --git a/LT/COMPILE/PARSE.CPZ b/LT/COMPILE/PARSE.CPZ new file mode 100644 index 0000000..78a484e --- /dev/null +++ b/LT/COMPILE/PARSE.CPZ @@ -0,0 +1,773 @@ +/* +void PrsPush(ParseStack *ps,U4 val) +{ + ps->stk[ps->ptr++]=val; +} +U8 PrsPop(ParseStack *ps) +{ + return ps->stk[--ps->ptr]; +} +*/ + +LTextern CP_PRSPUSH void PrsPush(ParseStack *ps,U4 val); +LTextern CP_PRSPOP U4 PrsPop(ParseStack *ps); + +#define PRST_UNARY_TERM 0 +#define PRST_UNARY_MODIFIERS 1 +#define PRST_DEREFERRENCE 2 +#define PRST_CHECK_BINARY_OPS 3 + +BoolU4 PrsParseExpression(LexStruct *l,BoolU4 add_esp=FALSE) +{ + BoolU4 result=TRUE,question_clause=FALSE, + cont_unary,cont_check_binary_ops,is_lower; + I8 i,j,k; + IntermediateCode *tempi,*tempi_first=l->cb.cb_out_ptr; + ClassStruct *tempc; + ParseStack *ps=MAlloc(sizeof(ParseStack)); + + ps->ptr=0; + PrsPush(ps,0); //terminate + PrsPush(ps,0); //terminate +try { + do { + l->flags&=~(LF_PREINC+LF_PREDEC+LF_POSTINC+LF_POSTDEC+LF_FUNCTION); + do i=PrsUnaryTerm(l,ps); + while (i==PRST_UNARY_TERM); + + while (i==PRST_UNARY_MODIFIERS) + i=PrsUnaryModifier(l,ps); + + if (i==PRST_DEREFERRENCE) + PrsDereferrence(l,ps); + + //Check for binary Ops + do { + i=PrsPop(ps); + tempc=PrsPop(ps); + if (i && i.u2[1]<=1) { + tempi=l->cb.cb_last_out_ptr; + i&=0xFFFF; + tempc=tempi->ic_class; + if (Bt(deref_bitmap,i) && tempc->pointer_cnt) { + tempc=tempc-sizeof(ClassStruct); + while (tempc->return_class) + tempc=tempc->return_class; + if (tempc->type & HTT_INTERNAL_TYPE) + i=EC_DEREF_U8+0x10000+it_to_ec_offset[tempc->sub_type]; + else + i=EC_DEREF_U4+0x10000; + } else { + if (i==EC_ADDRESS) { + if (!(l->flags & (LF_EAX|LF_ARRAY))) { + j=tempi->ic_code.u2[0]; + if (!Bt(deref_bitmap,j)) + PrsExcept(l,"ST_INVALID_LVALUE"); + tempi->ic_code=EC_NOP; + tempc=tempc+sizeof(ClassStruct); + } + } + } + CbAddIc(l,i,0,tempc); + cont_check_binary_ops=TRUE; + } else { + PrsPush(ps,tempc); + PrsPush(ps,i); + i=l->token; + k=binary_ops_table[i]; + if (k.u2[0]==EC_QUESTION) + question_clause=TRUE; + else if (k.u2[0]==EC_COLON) { + if (!question_clause) + k=0; + else + question_clause=FALSE; + } + if (!k.u2[1]) { + cont_check_binary_ops=FALSE; + cont_unary=FALSE; //DONE + } else { + Lex(l); //skip op + if (Bt(assign_bitmap,k.u2[0])) { + tempi=l->cb.cb_last_out_ptr; + tempc=tempi->ic_class; + j=tempi->ic_code.u2[0]; + if (!Bt(deref_bitmap,j)) + PrsExcept(l,"ST_INVALID_LVALUE"); + tempi->ic_code=EC_NOP; + while (tempc->return_class) + tempc=tempc->return_class; + if (!(tempc->type & HTT_INTERNAL_TYPE)) + k=k.u2[0]+0x100000+it_to_ec_offset[IT_U4]; + else + k=k.u2[0]+0x100000+it_to_ec_offset[tempc->sub_type]; + } + do { + i=PrsPop(ps); //pop ops of higher prec + tempc=PrsPop(ps); + is_lower=FALSE; + if (i) { + if (k.u2[1]==i.u2[1]) { + if (!Bt(assign_bitmap,k.u2[0]) || + !Bt(assign_bitmap,i.u2[0])) + is_lower=TRUE; + } else if (k.u2[1]>i.u2[1]) + is_lower=TRUE; + } + if (is_lower) + CbAddIc(l,i,0,tempc); + else { + PrsPush(ps,tempc); + PrsPush(ps,i); + tempi=l->cb.cb_last_out_ptr; + tempc=tempi->ic_class; + PrsPush(ps,tempc); + PrsPush(ps,k); + cont_check_binary_ops=FALSE; + cont_unary=TRUE; + break; + } + } while (TRUE); + } + } + } while (cont_check_binary_ops); + } while (cont_unary); + while (TRUE) { + i=PrsPop(ps); + tempc=PrsPop(ps); + if (i) + CbAddIc(l,i,0,tempc); + else + break; + } +} catch { + if (Fs->except_argc>0) { + if (Fs->except_argv[0]==EXCEPT_COMPILER) { + l->statement_cnt=0; + l->braces_cnt=0; + result=FALSE; + Fs->catch_except=TRUE; + } + } +} + Free(ps); + if (add_esp && result) { + if (Bt(push_bitmap,tempi_first->ic_code.u2[0])) { + tempi_first->ic_flags|=ICF_NO_PUSHES; + CbAddIc(l,EC_END_EXP,0,0); + } else + CbAddIc(l,EC_ADD_ESP32,8,0); + } + return result; +} + + +U8 PrsUnaryTerm(LexStruct *l,ParseStack *ps) +{ + I8 i,*i_ptr; + I8 argc_cnt,size; + U8 d; + SysHashEntry *temph,**temph1; + ClassStruct *tempc,*tempc1,*tempc2; + GlblVarStruct *tempg; + MemberListStruct *tempm; + LexUndefEntry *templu; + CbMiscStruct *tempmc; + IntermediateCode *tempi; + BoolU4 needs_right_paren; + LexCbStack *templ,*templ1; + + if (l->token==TK_INTEGER) { + if (l->cur_i<0) + CbAddIc(l,EC_U8,l->cur_i,sys_internal_types[IT_U8]); + else + CbAddIc(l,EC_U8,l->cur_i,sys_internal_types[IT_I8]); + Lex(l); + return PRST_CHECK_BINARY_OPS; + } + if (l->token==TK_DOUBLE) { + i_ptr=&l->cur_d; + CbAddIc(l,EC_DOUBLE,*i_ptr,sys_internal_types[IT_DOUBLE]); + Lex(l); + return PRST_CHECK_BINARY_OPS; + } + if (l->token==TK_STRING) { + d=LexExtendString(l,&size); + if (l->flags & LF_ASM_EXPRESSIONS) + CbAddIc(l,EC_U8,d,sys_internal_types[IT_I1]+sizeof(ClassStruct)); + else { + tempmc=CbMiscNew(l,CBMT_STRING_CONSTANT); + CbAddIc(l,EC_STRING_CONSTANT,tempmc,sys_internal_types[IT_I1]+sizeof(ClassStruct)); + tempmc->st_len=size; + tempmc->string=d; + l->flags|=LF_HAS_MISC_DATA; + } + return PRST_CHECK_BINARY_OPS; + } + if (l->token==TK_INSERT_BINARY) { + d=l->ident; + size=l->ident_len; + l->ident=NULL; + Lex(l); + if (l->flags & LF_ASM_EXPRESSIONS) + CbAddIc(l,EC_U8,d,sys_internal_types[IT_I1]+sizeof(ClassStruct)); + else { + tempmc=CbMiscNew(l,CBMT_STRING_CONSTANT); + CbAddIc(l,EC_STRING_CONSTANT,tempmc,sys_internal_types[IT_I1]+sizeof(ClassStruct)); + tempmc->st_len=size; + tempmc->string=d; + l->flags|=LF_HAS_MISC_DATA; + } + return PRST_CHECK_BINARY_OPS; + } + if (l->token==TK_INSERT_BINARY_TYPE || + l->token==TK_INSERT_BINARY_SIZE) { + CbAddIc(l,EC_U8,l->cur_i,sys_internal_types[IT_U8]); + Lex(l); + return PRST_CHECK_BINARY_OPS; + } + if (l->token=='(') { + Lex(l); //Skip ( + if (!PrsParseExpression(l)) + throw(EXCEPT_COMPILER,2); + if (l->token!=')') + PrsExcept(l,"ST_MISSING_RIGHT_PAREN"); + Lex(l); //skip ) + l->flags=(l->flags & ~(LF_ARRAY+LF_FUNCTION)) | LF_EAX; + return PRST_UNARY_MODIFIERS; + } + + i=unary_ops_table[l->token]; + if (i.u2[1]) { + Lex(l); //Skip op + if (i.u2[0]==EC_ADDRESS && l->token==TK_IDENT) { + if (tempc=l->hash_entry) { + if (tempc->type & HTT_FUNCTION) { + if (!Bt(&tempc->flags,Cf_INTERNAL)) { + Lex(l); //skip fun name + if (Bt(&tempc->flags,Cf_EXTERN)) { + if (l->a) + CbAddIc(l,EC_ABSOLUTE_ADDRESS, + tempc->executable_address,sys_internal_types[IT_U4]); + else + CbAddIc(l,EC_U8, + &tempc->executable_address,sys_internal_types[IT_U4]); + CbAddIc(l,EC_DEREF_U4,0, + sys_internal_types[IT_U4]); + } else { + if (l->a) + CbAddIc(l,EC_ABSOLUTE_ADDRESS, + tempc->executable_address,sys_internal_types[IT_U4]); + else + CbAddIc(l,EC_U8, + tempc->executable_address,sys_internal_types[IT_U4]); + } + return PRST_CHECK_BINARY_OPS; + } //TODO: is this an error? + }//TODO: is this an error? + }//TODO: is this an error? + } + PrsPush(ps,tempc); + PrsPush(ps,i); + return PRST_UNARY_TERM; + } + if (l->token=='+') { + Lex(l); + return PRST_UNARY_TERM; + } + + if (l->token!=TK_IDENT) { + if (l->token==TK_PLUS_PLUS) { + Lex(l); + l->flags|=LF_PREINC; + return PRST_UNARY_TERM; + } + if (l->token==TK_MINUS_MINUS) { + Lex(l); + l->flags|=LF_PREDEC; + return PRST_UNARY_TERM; + } + if (l->token=='$$' && l->flags & LF_ASM_EXPRESSIONS) { + Lex(l); + CbAddIc(l,EC_U8,l->instruction_pointer,sys_internal_types[IT_U4]); + return PRST_CHECK_BINARY_OPS; + } + PrsExcept(l,"ST_MISSING_EXPRESSION"); + } + + if (tempm=l->local_var_entry) { + l->flags&=~(LF_EAX+LF_ARRAY+LF_FUNCTION); + tempc=tempm->member_class+sizeof(ClassStruct); + if (tempm->flags & MLF_FUNCTION) { + l->flags|=LF_FUNCTION; + PrsPush(ps,0); + PrsPush(ps,tempm->parameter_cnt); + } + if (tempm->cnt) { + l->flags|=LF_ARRAY; + tempc+=sizeof(ClassStruct); + } + CbAddIc(l,EC_EBP,0,tempc); + CbAddIc(l,EC_U8,tempm->offset,tempc); + CbAddIc(l,EC_ADDITION,0,tempc); + Lex(l); //skip var name + return PRST_UNARY_MODIFIERS; + } + + if (!(temph=l->hash_entry)) { + if (!(l->flags & LF_ASM_EXPRESSIONS)) + PrsExcept(l,"ST_INVALID_LVALUE"); + temph=MAllocZ(sizeof(SysHashEntry)); + temph->string=l->ident; + l->ident=NULL; + if (temph->string[0]=='@' && + temph->string[1]=='@') { + temph->type=HTT_SYS_SYMBOL | HTT_UNRESOLVED_LOCAL; + temph1=FindHashBucket(temph->string,l->local_hash_table); + } else { + temph->type=HTT_SYS_SYMBOL | HTT_UNRESOLVED_GLBL; + temph1=FindHashBucket(temph->string,l->glbl_hash_table); + } + temph->use_cnt=0; + SetSourceFileInfo(l,temph); + temph->next=*temph1; + *temph1=temph; + temph->user0=0; + } + + if (temph->type & HTT_SYS_SYMBOL) { + if (!(temph->type & HTT_LITERAL) && + !(temph->type & HTT_IMPORT)) + l->absolute_address_cnt++; + if (temph->type & (HTT_UNRESOLVED_LOCAL|HTT_UNRESOLVED_GLBL)) { + templu=MAlloc(sizeof(LexUndefEntry)); + templu->hash=temph; + templu->next=l->undef_hash_entry; + l->undef_hash_entry=templu; + if (temph->type & HTT_UNRESOLVED_LOCAL) + l->flags|=LF_UNRESOLVED_LOCAL; + else + l->flags|=LF_UNRESOLVED_GLBL; + CbAddIc(l,EC_U8,&temph->user0,sys_internal_types[IT_U4]); + CbAddIc(l,EC_DEREF_U4,0,sys_internal_types[IT_U4]); + } else { + if (l->a && !(temph->type & HTT_LITERAL)) + CbAddIc(l,EC_ABSOLUTE_ADDRESS,temph->user0,sys_internal_types[IT_U4]); + else + CbAddIc(l,EC_U8,temph->user0,sys_internal_types[IT_U4]); + } + Lex(l); + return PRST_CHECK_BINARY_OPS; + } + + if (temph->type & HTT_FUNCTION) { + Lex(l); //skip fun name + CbPush(l); + templ=l->cb.cb_next; + l->cb.cb_next=NULL; + tempc=temph; + i=tempc->parameter_cnt; + tempm=tempc->member_list; + argc_cnt=0; + if (l->token!='(') + needs_right_paren=FALSE; + else { + Lex(l); + needs_right_paren=TRUE; + } + while (i--) { + if (l->token==',') + Lex(l); + CbInitOutPtrs(&l->cb); + if (tempm->flags & MLF_DEFAULT_AVAILABLE && + (l->token==')' || !needs_right_paren)) + CbAddIc(l,EC_U8,tempm->default_value,tempm->member_class); + else + if (!PrsParseExpression(l)) + throw(EXCEPT_COMPILER,3); + else { + CbPush(l); + CbAddIc(l,0,0,0); + tempi=CmpOptPass1(l,NULL,FALSE); + CbPop(l); + tempc1=tempi->ic_class; + while (tempc1->return_class) + tempc1=tempc1->return_class; + tempc2=tempm->member_class; + while (tempc2->return_class) + tempc2=tempc2->return_class; + if (tempc2->sub_type==IT_DOUBLE && + tempc1->sub_type!=IT_DOUBLE) + tempi->ic_flags|=ICF_TO_DOUBLE; + else + if (tempc2->sub_type!=IT_DOUBLE && + tempc1->sub_type==IT_DOUBLE) + tempi->ic_flags|=ICF_TO_INT; + } + CbAddIc(l,0,0,0); + CbPush(l); + tempm=tempm->next; + } + if (tempm && tempm->flags & MLF_DOT_DOT_DOT) { + CbInitOutPtrs(&l->cb); + CbAddIc(l,EC_U8,0,tempm->member_class); + tempi=l->cb.cb_last_out_ptr; + CbAddIc(l,0,0,0); + CbPush(l); + if (needs_right_paren) { + if (l->token!=')') { + do { + if (l->token==',') + Lex(l); + CbInitOutPtrs(&l->cb); + if (!PrsParseExpression(l)) + throw(EXCEPT_COMPILER,4); + CbAddIc(l,0,0,0); + CbPush(l); + argc_cnt++; + } while (l->token==','); + } + } + tempi->ic_data=argc_cnt++; //++ so add_esp latter works + } + if (needs_right_paren) { + if (l->token!=')') + PrsExcept(l,"ST_MISSING_RIGHT_PAREN"); + Lex(l); + } + templ1=templ->cb_next; + templ->cb_next=l->cb.cb_next; + l->cb.cb_next=templ; + CbPop(l); + templ=l->cb.cb_next; + l->cb.cb_next=templ1; + while (templ) { + templ1=templ->cb_next; + CbAppend(l,templ); + templ=templ1; + } + if (Bt(&tempc->flags,Cf_INTERNAL)) + CbAddIc(l,tempc->executable_address,0,tempc->return_class); + else if (Bt(&tempc->flags,Cf_EXTERN)) { + if (l->a) + CbAddIc(l,EC_CALL_INDIRECT2,tempc->executable_address,tempc->return_class); + else + CbAddIc(l,EC_CALL_INDIRECT2,&tempc->executable_address,tempc->return_class); + CbAddIc(l,EC_ADD_ESP32,(argc_cnt+tempc->parameter_cnt)<<3,tempc->return_class); + } else { + CbAddIc(l,EC_CALL,tempc->executable_address,tempc->return_class); + CbAddIc(l,EC_ADD_ESP32,(argc_cnt+tempc->parameter_cnt)<<3,tempc->return_class); + } + l->flags=(l->flags|LF_EAX) & ~(LF_ARRAY|LF_FUNCTION); + return PRST_UNARY_MODIFIERS; + } + if (temph->type & HTT_GLBL_VAR) { + tempg=temph; + tempc=tempg->var_class+sizeof(ClassStruct); + l->flags&=~(LF_EAX|LF_ARRAY|LF_FUNCTION); + if (tempg->cnt) { + tempc+=sizeof(ClassStruct); + l->flags|=LF_ARRAY; + } + if (tempg->flags & GVAF_FUNCTION) { + //TODO:Not implemented + l->flags|=LF_FUNCTION; + } + if (l->a) { + if (tempg->flags & GVAF_EXTERN) { //TODO: Untested + CbAddIc(l,EC_U8,&tempg->data_address,tempc); + CbAddIc(l,EC_DEREF_U4,0,tempc); + } else { + CbAddIc(l,EC_ABSOLUTE_ADDRESS,tempg->data_address,tempc); + if (tempg->flags & GVAF_IMPORT) + CbAddIc(l,EC_DEREF_U4,0,tempc); + } + } else { + if (tempg->flags & GVAF_EXTERN) { + CbAddIc(l,EC_U8,&tempg->data_address,tempc); + CbAddIc(l,EC_DEREF_U4,0,tempc); + } else + CbAddIc(l,EC_U8,tempg->data_address,tempc); + } + Lex(l); + return PRST_UNARY_MODIFIERS; + } + if (!(temph->type & HTT_KEYWORD)) + PrsExcept(l,"ST_MISSING_EXPRESSION"); + if (temph->user0==KW_SIZEOF) { + if (Lex(l)!='(') PrsExcept(l,"ST_EXPECTING_LEFT_PAREN"); + if (Lex(l)!=TK_IDENT) + PrsExcept(l,"ST_INVALID_CLASS"); + if (tempm=l->local_var_entry) { + tempc=tempm->member_class; + i=(tempm->cnt) ? tempm->cnt:1; + CbAddIc(l,EC_U8,tempc->size*i,sys_internal_types[IT_U4]); + } else { + tempc=l->hash_entry; + if (!tempc || !(tempc->type & (HTT_CLASS|HTT_INTERNAL_TYPE|HTT_GLBL_VAR))) + PrsExcept(l,"ST_INVALID_CLASS"); + CbAddIc(l,EC_U8,tempc->size,sys_internal_types[IT_U4]); + } //TODO: should allow '*' and '.member', etc; + if (Lex(l)!=')') + PrsExcept(l,"ST_MISSING_RIGHT_PAREN"); + Lex(l); + return PRST_CHECK_BINARY_OPS; + } else if (temph->user0==KW_OFFSET) { + if (Lex(l)!='(') PrsExcept(l,"ST_EXPECTING_LEFT_PAREN"); + if (Lex(l)!=TK_IDENT) + PrsExcept(l,"ST_INVALID_CLASS"); + if (tempm=l->local_var_entry) + tempc=tempm->member_class; + else { + tempc=l->hash_entry; + if (!tempc || !(tempc->type & (HTT_CLASS|HTT_GLBL_VAR))) + PrsExcept(l,"ST_INVALID_CLASS"); + else if (tempc->type & HTT_GLBL_VAR) { + tempg=tempc; + tempc=tempg->var_class; + } + } + if (Lex(l)!='.') + PrsExcept(l,"ST_EXPECTING_DOT"); + if (Lex(l)!=TK_IDENT) + PrsExcept(l,"ST_INVALID_MEMBER"); + if (!(tempm=FindMember(l->ident,tempc))) + PrsExcept(l,"ST_INVALID_MEMBER"); + CbAddIc(l,EC_U8,tempm->offset,sys_internal_types[IT_U4]); + if (Lex(l)!=')') + PrsExcept(l,"ST_MISSING_RIGHT_PAREN"); + Lex(l); + return PRST_CHECK_BINARY_OPS; + } + PrsExcept(l,"ST_MISSING_EXPRESSION"); +} + +U8 PrsUnaryModifier(LexStruct *l,ParseStack *ps) +{ + I8 i,j; + LexCbStack *templ,*templ2,*templl; + ClassStruct *tempc,*tempc1; + MemberListStruct *tempm; + IntermediateCode *tempi; + if (l->flags & LF_ASM_EXPRESSIONS) + return PRST_CHECK_BINARY_OPS; + if (l->token==TK_DEREFERRENCE) { + tempi=l->cb.cb_last_out_ptr; + if (!(l->flags & (LF_EAX | LF_ARRAY))) { + tempc=tempi->ic_class-sizeof(ClassStruct); + CbAddIc(l,EC_DEREF_U4+0x10000,0,tempc); + } else + tempi->ic_class-=sizeof(ClassStruct); + } + if (l->token=='.' || l->token==TK_DEREFERRENCE) { + tempi=l->cb.cb_last_out_ptr; + tempc=tempi->ic_class; + if (!(l->flags & LF_EAX)) + tempc-=sizeof(ClassStruct); + if (!(tempc->type & HTT_CLASS)) + PrsExcept(l,"ST_INVALID_CLASS"); + if (Lex(l)!=TK_IDENT) + PrsExcept(l,"ST_INVALID_MEMBER"); + if (!(tempm=FindMember(l->ident,tempc))) + PrsExcept(l,"ST_INVALID_MEMBER"); + Lex(l); //skip member name + tempc1=tempm->member_class+sizeof(ClassStruct); + CbAddIc(l,EC_U8,tempm->offset,tempc1); + l->flags&=~(LF_EAX|LF_ARRAY|LF_FUNCTION); + if (tempm->cnt) { + tempc1+=sizeof(ClassStruct); + l->flags|=LF_ARRAY; + } + if(tempm->flags & MLF_FUNCTION) { + PrsPush(ps,0); + PrsPush(ps,tempm->parameter_cnt); + l->flags|=LF_FUNCTION; + } + CbAddIc(l,EC_ADDITION,0,tempc1); + return PRST_UNARY_MODIFIERS; + } + if (l->token==TK_CAST) { + if (Lex(l)!='(') + PrsExcept(l,"ST_EXPECTING_LEFT_PAREN"); + if (Lex(l)!=TK_IDENT) + PrsExcept(l,"ST_INVALID_CLASS"); + tempc=l->hash_entry; + if (!tempc || !(tempc->type & (HTT_CLASS|HTT_INTERNAL_TYPE))) + PrsExcept(l,"ST_INVALID_CLASS"); + while (Lex(l)=='*') + tempc+=sizeof(ClassStruct); + tempc+=sizeof(ClassStruct); + tempi=l->cb.cb_last_out_ptr; + tempi->ic_class=tempc; + if (l->token!=')') + PrsExcept(l,"ST_MISSING_RIGHT_PAREN"); + Lex(l); + return PRST_UNARY_MODIFIERS; + } + if (l->token=='[') { + Lex(l); + tempi=l->cb.cb_last_out_ptr; + if (!(l->flags & (LF_ARRAY | LF_EAX))) { + tempc=tempi->ic_class-sizeof(ClassStruct); + while (!(tempc->type & HTT_INTERNAL_TYPE) && tempc->return_class) + tempc=tempc->return_class; + if (tempc->type==HTT_INTERNAL_TYPE) + i=EC_DEREF_U8+0x10000+it_to_ec_offset[tempc->sub_type]; + else + i=EC_DEREF_U4+0x10000; + CbAddIc(l,i,0,tempc); + } else { + tempc=tempi->ic_class; + if (!(l->flags & LF_EAX)) + tempc-=sizeof(ClassStruct); + } + tempc1=tempc-sizeof(ClassStruct); + CbAddIc(l,EC_U8,tempc1->size,tempc); + if (!PrsParseExpression(l)) + throw(EXCEPT_COMPILER,5); + if (l->token!=']') + PrsExcept(l,"ST_MISSING_RIGHT_BRACKET"); + Lex(l); //skip ] + CbAddIc(l,EC_MULTIPLICATION,0,tempc); + CbAddIc(l,EC_ADDITION,0,tempc); + l->flags&=~(LF_EAX|LF_ARRAY); + return PRST_UNARY_MODIFIERS; + } + if (l->token=='(' && l->flags & LF_FUNCTION) { + tempi=l->cb.cb_last_out_ptr; + if (!(l->flags & (LF_EAX | LF_ARRAY))) { + tempc=tempi->ic_class-sizeof(ClassStruct); + CbAddIc(l,EC_DEREF_U4+0x10000,0,tempc); + } else { + tempi->ic_class=tempi->ic_class-sizeof(ClassStruct); + tempc=tempi; + } + i=PrsPop(ps); + PrsPop(ps); + j=i; + Lex(l); //skip '(' + CbPush(l); + templ=l->cb.cb_next; + l->cb.cb_next=NULL; + while (i--) { + if (l->token==',') + Lex(l); + CbInitOutPtrs(&l->cb); + if (!PrsParseExpression(l)) + throw(EXCEPT_COMPILER,6); + CbAddIc(l,0,0,0); + CbPush(l); + } + if (l->token!=')') + PrsExcept(l,"ST_MISSING_RIGHT_PAREN"); + Lex(l); //skip ')' + templl=templ->cb_next; + templ->cb_next=l->cb.cb_next; + l->cb.cb_next=templ; + CbPop(l); + templ=l->cb.cb_next; + l->cb.cb_next=templl; + while (templ) { + templ2=templ->cb_next; + CbAppend(l,templ); + templ=templ2; + } + CbAddIc(l,EC_CALL_INDIRECT,j<<3,tempc); + CbAddIc(l,EC_ADD_ESP32,j<<3+8,tempc); + l->flags=(l->flags | LF_EAX)&~(LF_ARRAY | LF_FUNCTION); + return PRST_UNARY_MODIFIERS; + } + if (l->token==TK_PLUS_PLUS) { + Lex(l); + l->flags|=LF_POSTINC; + return PRST_DEREFERRENCE; + } + if (l->token==TK_MINUS_MINUS) { + Lex(l); + l->flags|=LF_POSTDEC; + return PRST_DEREFERRENCE; + } + return PRST_DEREFERRENCE; +} + +U8 PrsDereferrence(LexStruct *l,ParseStack *ps) +{ + I8 i; + ClassStruct *tempc; + IntermediateCode *tempi; + if (l->flags & LF_FUNCTION) { + i=PrsPop(ps); + tempc=PrsPop(ps); + } + if (l->flags & LF_EAX) + return PRST_CHECK_BINARY_OPS; + tempi=l->cb.cb_last_out_ptr; + tempc=tempi->ic_class-sizeof(ClassStruct); + if (l->flags & LF_ARRAY) { + tempi->ic_class=tempc; + return PRST_CHECK_BINARY_OPS; + } + + if (l->flags & LF_PREINC) { + l->flags&=~LF_PREINC; + i=EC_PP_U8; + } else if (l->flags & LF_PREDEC) { + l->flags&=~LF_PREDEC; + i=EC_MM_U8; + } else if (l->flags & LF_POSTINC) { + l->flags&=~LF_POSTINC; + i=EC_U8_PP; + } else if (l->flags & LF_POSTDEC) { + l->flags&=~LF_POSTDEC; + i=EC_U8_MM; + } else + i=EC_DEREF_U8; + + while (tempc->return_class) + tempc=tempc->return_class; + if (tempc->type & HTT_INTERNAL_TYPE) + i+=it_to_ec_offset[tempc->sub_type]; + else + i+=it_to_ec_offset[IT_U4]; + CbAddIc(l,i+0x10000,0,tempc); + return PRST_CHECK_BINARY_OPS; +} + +U1 *CompileExpression(LexStruct *l) +{ + U1 *result; + U8 size; + DbgInfo *dbg=NULL; + CbPush(l); + CbInitOutPtrs(&l->cb); + if (PrsParseExpression(l,TRUE)) { + CbAddIc(l,EC_RET,0,0); + CbAddIc(l,0,0,0); + result=CbCompile(l,NULL,&size,&dbg); + } else + result=NULL; + CbPop(l); + Free(dbg); + return result; +} + +BoolU4 GetExpression(LexStruct *l,U1 **e) //FALSE=no err +{ + *e=CompileExpression(l); + if (*e) + return TRUE; + else + return FALSE; +} + +I8 Expression(LexStruct *l) //FALSE=no err +{ + I8 result; + U1 *e=CompileExpression(l); + if (e) { + result=Run(e); + DelExpression(e); + } else + result=0; + return result; +} diff --git a/LT/COMPILE/SPRINTF2.CPZ b/LT/COMPILE/SPRINTF2.CPZ new file mode 100644 index 0000000..3c348fc --- /dev/null +++ b/LT/COMPILE/SPRINTF2.CPZ @@ -0,0 +1,759 @@ +void OutChar(I1 **addr_dst,I1 ch,I1 **addr_buf) +{ + I8 i; + I1 *dst=*addr_dst,*buf; + if (addr_buf) { + buf=*addr_buf; + i=dst-buf; + if (i>=MSize(buf)) { + buf=MAlloc(i<<1+1); + MemCpy(buf,*addr_buf,i); + dst=buf+i; + *addr_buf=buf; + } + } + *dst++=ch; + *addr_dst=dst; +} + +void OutString(I1 *ptr,I1 **addr_buf,I1 *addr_dst, + I8 len,BoolU4 left_justify,BoolU4 truncate) +{ + I8 i,j; + i=StrLen(ptr); + if (truncate && i>len) + i=len; + if (left_justify) { + for (j=0;j5) + return MSPrintF("%*ts,%04X",field_length-5,temph->string,offset); + else + return MSPrintF("%s,%04X",temph->string,offset); + } + } + if (field_length) + return MSPrintF("%*tX",field_length,add); + else + return MSPrintF("%X",add); +} + +I1 *MSPrintFTime(LTDate ltdt,U8 sub_format) +{ + LTDateStruct d; + ToLTDateStruct(&d,ltdt); + switch (sub_format) { + case 1: + return MSPrintF("%02d:%02d",d.hours,d.minutes); + case 2: + if (d.hours>=12) + return MSPrintF("%02d:%02d:%02d pm",d.hours-12,d.minutes,d.seconds); + else + return MSPrintF("%02d:%02d:%02d am",d.hours,d.minutes,d.seconds); + case 3: + if (d.hours>=12) + return MSPrintF("%02d:%02d pm",d.hours-12,d.minutes); + else + return MSPrintF("%02d:%02d am",d.hours,d.minutes); + case 4: + if (d.hours>=12) + return MSPrintF("%02d:%02d:%02dp",d.hours-12,d.minutes,d.seconds); + else + return MSPrintF("%02d:%02d:%02da",d.hours,d.minutes,d.seconds); + case 5: + if (d.hours>=12) + return MSPrintF("%02d:%02dp",d.hours-12,d.minutes); + else + return MSPrintF("%02d:%02da",d.hours,d.minutes); + case 6: + return MSPrintF("%dh %02dm",d.hours+ltdt.date*24,d.minutes); + case 7: + return MSPrintF("%dh %02dm %02ds",d.hours+ltdt.date*24,d.minutes,d.seconds); + case 8: + return MSPrintF("%dd %02dh %02dm",ltdt.date,d.hours,d.minutes); + case 9: + return MSPrintF("%dd %02dh %02dm %02ds",ltdt.date,d.hours,d.minutes,d.seconds); + case 10: + return MSPrintF("%dd %02dh %02dm %02d.%02ds",ltdt.date,d.hours,d.minutes,d.seconds,d.hundredths); + case 11: + return MSPrintF("%dh %02dm %02d.%02ds",d.hours+ltdt.date*24,d.minutes,d.seconds,d.hundredths); + case 12: + return MSPrintF("%d.%02d",MulU8(60,(ltdt.date*24+d.hours)*60+d.minutes)+d.seconds,d.hundredths); + case 13: + return MSPrintF("%02d:%02d.%02d",MulU8(60,ltdt.date*24+d.hours)+d.minutes,d.seconds,d.hundredths); + case 14: + return MSPrintF("%02d:%02d:%02d.%02d",ltdt.date*24+d.hours,d.minutes,d.seconds,d.hundredths); + case 15: + return MSPrintF("%dd %02dh %02dm %02d.%04ds",ltdt.date,d.hours,d.minutes,d.seconds,d.ten_thousandths); + case 16: + return MSPrintF("%dh %02dm %02d.%04ds",d.hours+ltdt.date*24,d.minutes,d.seconds,d.ten_thousandths); + case 17: + return MSPrintF("%d.%04d",MulU8(60,(ltdt.date*24+d.hours)*60+d.minutes)+d.seconds,d.ten_thousandths); + case 18: + return MSPrintF("%02d:%02d.%04d",MulU8(60,ltdt.date*24+d.hours)+d.minutes,d.seconds,d.ten_thousandths); + case 19: + return MSPrintF("%02d:%02d:%02d.%04d",ltdt.date*24+d.hours,d.minutes,d.seconds,d.ten_thousandths); + default: + return MSPrintF("%02d:%02d:%02d",d.hours,d.minutes,d.seconds); + } +} + +I1 *MSPrintFDate(U8 dt,U8 sub_format) +{ + LTDateStruct d; + LTDate ltdt=0; + ltdt.date=dt; + ToLTDateStruct(&d,ltdt); + switch (sub_format) { + case 1: + return MSPrintF("%02d/%02d",d.month,d.day_of_month); + case 2: + return MSPrintF("%3tZ %02d/%02d",d.day_of_week,"ST_DAYS_OF_WEEK", + d.month,d.day_of_month); + case 3: + return MSPrintF("%3tZ %02d/%02d/%02d",d.day_of_week,"ST_DAYS_OF_WEEK", + d.month,d.day_of_month,(d.year)%100); + case 4: + return MSPrintF("%02d/%02d/%d",d.month,d.day_of_month,d.year); + case 5: + return MSPrintF("%3tZ %02d/%02d/%d",d.day_of_week,"ST_DAYS_OF_WEEK", + d.month,d.day_of_month,d.year); + case 6: + return MSPrintF("%3tZ %02d",d.month-1,"ST_MONTHS",d.day_of_month); + case 7: + return MSPrintF("%3tZ, %3tZ %02d",d.day_of_week,"ST_DAYS_OF_WEEK", + d.month-1,"ST_MONTHS",d.day_of_month); + case 8: + return MSPrintF("%3tZ %02d,%04d",d.month-1,"ST_MONTHS",d.day_of_month,d.year); + case 9: + return MSPrintF("%3tZ, %3tZ %02d,%d",d.day_of_week,"ST_DAYS_OF_WEEK", + d.month-1,"ST_MONTHS",d.day_of_month,d.year); + case 10: + return MSPrintF("%Z %d",d.month-1,"ST_MONTHS",d.day_of_month); + case 11: + return MSPrintF("%Z, %Z %d",d.day_of_week,"ST_DAYS_OF_WEEK", + d.month-1,"ST_MONTHS",d.day_of_month); + case 12: + return MSPrintF("%Z %d,%d",d.month-1,"ST_MONTHS",d.day_of_month,d.year); + case 13: + return MSPrintF("%Z, %Z %d,%d",d.day_of_week,"ST_DAYS_OF_WEEK", + d.month-1,"ST_MONTHS",d.day_of_month,d.year); + case 14: + return MSPrintF("%02d/%02d/%02d",d.day_of_month,d.month,(d.year)%100); + case 15: + return MSPrintF("%02d/%02d",d.day_of_month,d.month); + case 16: + return MSPrintF("%3tZ %02d/%02d",d.day_of_week,"ST_DAYS_OF_WEEK", + d.day_of_month,d.month); + case 17: + return MSPrintF("%3tZ %02d/%02d/%02d",d.day_of_week,"ST_DAYS_OF_WEEK", + d.day_of_month,d.month,(d.year)%100); + case 18: + return MSPrintF("%02d/%02d/%d",d.day_of_month,d.month,d.year); + case 19: + return MSPrintF("%3tZ %02d/%02d/%d",d.day_of_week,"ST_DAYS_OF_WEEK", + d.day_of_month,d.month,d.year); + case 20: + return MSPrintF("%02d %3tZ",d.day_of_month,d.month-1,"ST_MONTHS"); + case 21: + return MSPrintF("%3tZ, %02d %3tZ",d.day_of_week,"ST_DAYS_OF_WEEK", + d.day_of_month,d.month-1,"ST_MONTHS"); + case 22: + return MSPrintF("%02d %3tZ,%04d",d.day_of_month,d.month-1,"ST_MONTHS",d.year); + case 23: + return MSPrintF("%3tZ, %02d %3tZ,%d",d.day_of_week,"ST_DAYS_OF_WEEK", + d.day_of_month,d.month-1,"ST_MONTHS",d.year); + case 24: + return MSPrintF("%d %Z",d.day_of_month,d.month-1,"ST_MONTHS"); + case 25: + return MSPrintF("%Z, %d %Z",d.day_of_week,"ST_DAYS_OF_WEEK", + d.day_of_month,d.month-1,"ST_MONTHS"); + case 26: + return MSPrintF("%d %Z,%d",d.day_of_month,d.month-1,"ST_MONTHS",d.year); + case 27: + return MSPrintF("%Z, %d %Z,%d",d.day_of_week,"ST_DAYS_OF_WEEK", + d.day_of_month,d.month-1,"ST_MONTHS",d.year); + case 28: + return MSPrintF("%02d/%02d/%02d",(d.year)%100,d.month,d.day_of_month); + case 29: + return MSPrintF("%d/%02d/%02d",d.year,d.month,d.day_of_month); + case 30: + return MSPrintF("%02d%02d%02d",(d.year)%100,d.month,d.day_of_month); + case 31: + return MSPrintF("%d%02d%02d",d.year,d.month,d.day_of_month); + case 32: + return MSPrintF("%02d%02d%02d",d.month,d.day_of_month,(d.year)%100); + case 33: + return MSPrintF("%02d%02d%d",d.month,d.day_of_month,d.year); + case 34: + return MSPrintF("%3tZ",d.day_of_week,"ST_DAYS_OF_WEEK"); + case 35: + return MSPrintF("%Z",d.day_of_week,"ST_DAYS_OF_WEEK"); + case 36: + return MSPrintF("%3tZ",d.month-1,"ST_MONTHS"); + case 37: + return MSPrintF("%Z",d.month-1,"ST_MONTHS"); + case 38: + return MSPrintF("%d %3tZ",d.year,d.month-1,"ST_MONTHS"); + case 39: + return MSPrintF("%d %Z",d.year,d.month-1,"ST_MONTHS"); + case 40: + return MSPrintF("%02d %3tZ",(d.year)%100,d.month-1,"ST_MONTHS"); + case 41: + return MSPrintF("%02d %Z",(d.year)%100,d.month-1,"ST_MONTHS"); + case 42: + return MSPrintF("%3tZ %d",d.month-1,"ST_MONTHS",d.year); + case 43: + return MSPrintF("%Z %d",d.month-1,"ST_MONTHS",d.year); + case 44: + return MSPrintF("%3tZ %02d",d.month-1,"ST_MONTHS",(d.year)%100); + case 45: + return MSPrintF("%Z %02d",d.month-1,"ST_MONTHS",(d.year)%100); + case 46: + return MSPrintF("%02d",(d.year)%100); + case 47: + return MSPrintF("%d",d.year); + default: + return MSPrintF("%02d/%02d/%02d",d.month,d.day_of_month,(d.year)%100); + } +} + +I1 *SPrintFJoin2(I1 *dst,I1 *src,I8i argc,I8i *argv) +{ + I1 ch,*ptr,**addr_buf,*buf=NULL,*addr_dst, + *temp1; + BoolU4 pad_zero,left_justify,truncate,neg,neg_e; + I8 i; + I8 k,len,dec_len,sub_format; + U8 d,cur_param=0; + double dd,dd1,*dd_ptr; + I1 temp_buf[80]; + argc; //ref so no warning + if (dst) { + addr_buf=NULL; + } else { + buf=MAlloc(256); + addr_buf=&buf; + dst=buf; + } + addr_dst=&dst; + + while (ch = *(src++)) { + if (ch=='%') { + if (*src=='-') { + left_justify=TRUE; + src++; + } else + left_justify=FALSE; + if (*src=='0') { + pad_zero=TRUE; + src++; + } else + pad_zero=FALSE; + len=0; + while (*src>='0' && *src<='9') + len=len*10+ *(src++)-'0'; + if (*src=='*') { + src++; + len=argv[cur_param++]; + } + dec_len=0; + if (*src=='.') { + src++; + while (*src>='0' && *src<='9') + dec_len=dec_len*10+ *(src++)-'0'; + if (*src=='*') { + src++; + dec_len=argv[cur_param++]; + } + } + if (*src=='t') { + src++; + truncate=TRUE; + } else + truncate=FALSE; + + sub_format=0; + if (*src=='h') { + src++; + while (*src>='0' && *src<='9') + sub_format=sub_format*10+ *(src++)-'0'; + if (*src=='*') { + src++; + sub_format=argv[cur_param++]; + } + } + neg=FALSE; + k=0; + switch (*src++) { + case 's': + ptr=argv[cur_param++]; + OutString(ptr,addr_buf,addr_dst,len,left_justify,truncate); + break; + case 'S': + ptr=SysText(argv[cur_param++]); + OutString(ptr,addr_buf,addr_dst,len,left_justify,truncate); + break; + case 'F': + ptr=ReadTextFile(argv[cur_param++]); + if (ptr) { + OutString(ptr,addr_buf,addr_dst,len,left_justify,truncate); + Free(ptr); + } + break; + case 'Q': + ptr=argv[cur_param++]; + while (ch=*ptr++) { + if (ch=='$$') { + OutChar(addr_dst,ch,addr_buf); + OutChar(addr_dst,ch,addr_buf); + } else if (ch==CH_LINE_FEED){ + OutChar(addr_dst,'\\',addr_buf); + OutChar(addr_dst,'n',addr_buf); + } else if (ch==CH_CR){ + OutChar(addr_dst,'\\',addr_buf); + OutChar(addr_dst,'r',addr_buf); + } else if (ch==CH_TAB){ + OutChar(addr_dst,'\\',addr_buf); + OutChar(addr_dst,'t',addr_buf); + } else { + if (ch=='"' || ch=='\\') + OutChar(addr_dst,'\\',addr_buf); + OutChar(addr_dst,ch,addr_buf); + } + } + break; + case 'z': + ptr=PointAtListEntry(argv[cur_param],argv[cur_param+1]); + cur_param=cur_param+2; + OutString(ptr,addr_buf,addr_dst,len,left_justify,truncate); + break; + case 'Z': + ptr=SysTextSub(argv[cur_param],argv[cur_param+1]); + cur_param=cur_param+2; + OutString(ptr,addr_buf,addr_dst,len,left_justify,truncate); + break; + case 'c': + OutChar(addr_dst,argv[cur_param++],addr_buf); + break; + case 'D': + temp1=MSPrintFDate(argv[cur_param++],sub_format); + OutString(temp1,addr_buf,addr_dst,len,left_justify,truncate); + Free(temp1); + break; + case 'T': + temp1=MSPrintFTime(argv[cur_param++],sub_format); + OutString(temp1,addr_buf,addr_dst,len,left_justify,truncate); + Free(temp1); + break; + case 'P': + if (truncate) + temp1=MSPrintFPSect(argv[cur_param++],len); + else + temp1=MSPrintFPSect(argv[cur_param++],0); + OutString(temp1,addr_buf,addr_dst,len,left_justify,truncate); + Free(temp1); + break; + case 'd': + i=argv[cur_param++]; + if (i<0) { + neg=TRUE; + i=-i; + } + while (!k || i) { + temp_buf[k++]=ModU8(i,10)+'0'; + i=DivU8(i,10); + } +out_num: + i=(neg)? 1:0; + if (truncate && k+i>len) + k=len-i; + if (pad_zero) + for (;i=0;i--) + OutChar(addr_dst,temp_buf[i],addr_buf); + break; + case 'u': + d=argv[cur_param++]; + while (!k|| d) { + temp_buf[k++]=ModU8(d,10)+'0'; + d=DivU8(d,10); + } + goto out_num; + case 'f': + dd_ptr=&argv[cur_param++]; + dd=*dd_ptr; + if (dd<0) { + neg=TRUE; + dd=-dd; + } +out_f: + if (i=dec_len) + dd*=Pow10(i); + dd=Round(dd); + while (i--) { + temp_buf[k++]=dd%10+'0'; + dd=Floor(dd/10); + } + if (dec_len) + temp_buf[k++]='.'; + do { + temp_buf[k++]=dd%10+'0'; + dd=Floor(dd/10); + } while (dd); + goto out_num; + case 'e': + if (!len) len=12; + dd_ptr=&argv[cur_param++]; + dd=*dd_ptr; + if (dd<0) { + neg=TRUE; + dd=-dd; + } + dd1=(dd) ? Log10(dd):0; + dd1=Round(dd1); +out_e: + dd/=Pow10(dd1); + if (dd1<0) { + dd1=-dd1; + neg_e=TRUE; + } else + neg_e=FALSE; + if (dd) { + if (dd<1.0) { + dd*=10; + if (neg_e) + dd1+=1; + else + dd1-=1; + } else if (dd>=10.0) { + dd/=10; + if (neg_e) + dd1-=1; + else + dd1+=1; + } + } + i=3; + do { + temp_buf[k++]=dd1%10+'0'; + dd1=Floor(dd1/10); + } while (dd1 && i--); + if (neg_e) + temp_buf[k++]='-'; + temp_buf[k++]='e'; + dec_len=len-k-neg-2; + goto out_f; + case 'g': + if (!len) len=12; + dd_ptr=&argv[cur_param++]; + dd=*dd_ptr; + if (dd<0) { + neg=TRUE; + dd=-dd; + } + dd1=(dd) ? Log10(dd):0; + dd1=Round(dd1); + if (dd1>=(len-1-dec_len) || dd1<-(dec_len-1)) + goto out_e; + else + goto out_f; + case 'X': + d=argv[cur_param++]; + while (!k || d) { + temp_buf[k]=(d & 15)+'0'; + if (temp_buf[k]>'9') temp_buf[k]+='A'-0x3A; + k++; + d>>=4; + } + goto out_num; + case 'x': + d=argv[cur_param++]; + while (!k || d) { + temp_buf[k]=(d & 15)+'0'; + if (temp_buf[k]>'9') temp_buf[k]+='a'-0x3A; + k++; + d>>=4; + } + goto out_num; + case 'b': + d=argv[cur_param++]; + while (!k || d) { + temp_buf[k++]=(d&1)+'0'; + d>>=1; + } + goto out_num; + case '%': + OutChar(addr_dst,'%',addr_buf); + break; + } + } else + OutChar(addr_dst,ch,addr_buf); + } + OutChar(addr_dst,0,addr_buf); + return buf; +} + + +double A2Double(I1 *src,I1 **end_ptr=NULL) +{ + I1 ch=*src++; + I8 i=0,j=0,k=0; + double d; + BoolU4 neg=FALSE; + + while (ch==CH_SPACE||ch==CH_TAB||ch==CH_SHIFT_SPACE) + ch=*src++; + if (ch=='-') { + neg=TRUE; + ch=*src++; + } + while (TRUE) { + if (Bt(dec_numeric_bitmap,ch)) + i=MulU8(i,10)+ch-'0'; + else { + if (ch=='.' || ch=='e' || ch=='E') break; + d=i; + goto a2d_end; + } + ch=*src++; + } + if (ch=='.') + ch=*src++; + while (TRUE) { + if (Bt(dec_numeric_bitmap,ch)) { + j=MulU8(j,10)+ch-'0'; + k++; + } else { + d=i+j*Pow10(-k); + if (ch=='e' || ch=='E') break; + goto a2d_end; + } + ch=*src++; + } + ch=*src++; + k=1; + if (ch=='-') { + k=-1; + ch=*src++; + } + j=0; + while (TRUE) { + if (Bt(dec_numeric_bitmap,ch)) + j=MulU8(j,10)+ch-'0'; + else { + d*=Pow10(j*k); + goto a2d_end; + } + ch=*src++; + } +a2d_end: + if (end_ptr) *end_ptr=src-1; + return (neg) ? -d:d; +} + +/* +A2LTDate() + This routine recognizes the following formats: + 1) "*+nnnn" "*-nnnnn" + 2) mm/dd + 3) mm/dd/yy +*/ + +LTDate A2LTDate(I1 *src2) +{ + LTDate result=0; + LTDateStruct d,d1; + I1 *src=MStringUtil(src2,SU_REMOVE_SPACES|SU_TO_UPPER), + *v=NewString(src), + *p1=src; + BoolU4 start_month=FALSE,end_month=FALSE; + BoolU4 start_year=FALSE,end_year=FALSE; + + MemSet(&d,0,sizeof(LTDateStruct)); + MemSet(&d1,0,sizeof(LTDateStruct)); + if (!StrNCmp(p1,"SM(",3)) { + p1+=3; + start_month=TRUE; + } else if (!StrNCmp(p1,"EM(",3)) { + p1+=3; + end_month=TRUE; + } else if (!StrNCmp(p1,"SY(",3)) { + p1+=3; + start_year=TRUE; + } else if (!StrNCmp(p1,"EY(",3)) { + p1+=3; + end_year=TRUE; + } + if (*p1=='*') { + p1++; + if (*p1=='+' || *p1=='-') + result.date=AtoI(p1,10,&p1); + result+=GetCurTimeLTDate; + } else { + RemoveFirstSeg(p1,"/",v); //Put month into v + d.month=AtoI(v); + if (Occurrences(p1,'/')) { + RemoveFirstSeg(p1,"/",v); //Put day into v leaving year in p1 + d.day_of_month=AtoI(v); + d.year=AtoI(p1,10,&p1); + if (d.year<100) //if not 4 digit year + d.year+=2000; + } else { + d.day_of_month=AtoI(p1,10,&p1); + ToLTDateStruct(&d1,GetCurTimeLTDate); + d.year=d1.year; + } + result=ToLTDate(&d); + } + if (*p1==')') p1++; + + if (start_month) + result.date=FirstDayOfMonth(result.date); + else if (end_month) + result.date=LastDayOfMonth(result.date); + else if (start_year) + result.date=FirstDayOfYear(result.date); + else if (end_year) + result.date=LastDayOfYear(result.date); + + if (*p1=='+' || *p1=='-') + result.date+=AtoI(p1); + Free(src); + Free(v); + return result; +} + +void GetFJoin2(I1 *src,I1 *fmt,I8i argc,I8i *argv) +//Pass pointer to data, +//For %s pass pointer to pointer (be careful because address +// of array is the same as array--create ptr to array and take address +{ + I1 ch,*buf,*ptr,**pptr; + BoolU4 left_justify=FALSE; + I8 cur_param=0,i,j,k,len,*i_ptr,sub_format=0,dec_len; + double *d_ptr; + argc; //ref so no warning + while (ch = *(fmt++)) { + if (ch=='%') { + if (*fmt=='%') { + src++; + fmt++; + } else { + if (*fmt=='-') { + left_justify=TRUE; + fmt++; + } else + left_justify=FALSE; + len=0; + while (*fmt>='0' && *fmt<='9') + len=len*10+ (*(fmt++)-'0'); + if (*fmt=='*') { + fmt++; + len=argv[cur_param++]; + } + ch=*(fmt++); + if (ch && !len) { + ptr=src; + while (*ptr && *ptr!=*fmt) + ptr++; + len=ptr-src; + } else { + if (ch=='.') { + dec_len=0; + while (*fmt>='0' && *fmt<='9') + dec_len=dec_len*10+ (*(fmt++)-'0'); + if (*fmt=='*') { + fmt++; + dec_len=argv[cur_param++]; + } + ch=*(fmt++); + } + } + buf=MAlloc(len+1); + for (i=0;i9) j=j-'A'+('9'+1); + *i_ptr=(*i_ptr<<4)+j; + } + break; + case 'b': + i_ptr=argv[cur_param++]; + *i_ptr=0; + for (k=0;k>32; + break; + } + Free(buf); + } + } else + src++; + } +} + + + \ No newline at end of file diff --git a/LT/COMPILE/Test.CPZ b/LT/COMPILE/Test.CPZ new file mode 100644 index 0000000..7f135e7 --- /dev/null +++ b/LT/COMPILE/Test.CPZ @@ -0,0 +1,34 @@ +exe {KeepPrivate(ON);} +exe {Externs2Imports(ON);} +#include "/LT/OSMain/ADAMK.HPZ" +#include "/LT/OSMain/ADAMK2.HPZ" +#include "/LT/OSMain/ADAMK3.HPZ" +exe {KeepPrivate(OFF);} +exe {Externs2Imports(OFF);} + +exe {PTrace(ON);} +exe {OTrace(ON);} +exe {CTrace(ON);} + +void Test() +{ + I8 i; + for (i=0;i<8;i++) { + coutln 1,2,3,4,i; + } +} +void Test1() +{ + I8 i; + for (i=0;i<8;i++) { + coutln 1,2,3,4,i; + } +} +void Test2() +{ + I8 i; + for (i=0;i<8;i++) { + coutln 1,2,3,4,i; + } +} + diff --git a/LT/COMPILE/Test2.CPZ b/LT/COMPILE/Test2.CPZ new file mode 100644 index 0000000000000000000000000000000000000000..3bb2e4a5bafd98c19f132c347759764e3430ee65 GIT binary patch literal 69 zcmZ>*NKGy+NewP3%FIjGP~zoEtw>d<_75paOitDC_tUhlwdUn=D$!6Yt}KpE%SlWx Y)(MUbPK$SObqaOYwC3ef(zIp(02;*<<^TWy literal 0 HcmV?d00001 diff --git a/LT/DEMO/AutoFile/Demo1.AUZ b/LT/DEMO/AutoFile/Demo1.AUZ new file mode 100644 index 0000000..dcdb90e --- /dev/null +++ b/LT/DEMO/AutoFile/Demo1.AUZ @@ -0,0 +1,15 @@ +/* To run this, do a directory, right click on +this file's name and select "AutoFile". +Or, type $LK,"AutoFile","MN:AutoFile"$(filename); +See $LK,"AutoFile","FF:::/LT/DOC/OSGlossary.GLZ,AutoFile"$ in the glossary for more info. +*/ + + +//This is to demo autofiles. +I4 i; +for (i=0;i<3;i++) + PutS("Dir;\r"); +PutS("$$FG RED$$//Press a letter to complete the mask$$FG$$\r"); +PutS("Dir(\"*."); +I1 ch=GetKey; //Prompt for first digit of mask +PrintF("%c*\");\r",ch); \ No newline at end of file diff --git a/LT/DEMO/AutoFile/Demo2.AUZ b/LT/DEMO/AutoFile/Demo2.AUZ new file mode 100644 index 0000000..897cc5c --- /dev/null +++ b/LT/DEMO/AutoFile/Demo2.AUZ @@ -0,0 +1,9 @@ +/* To run this, do a directory, right click on +this file's name and select "AutoFile". +Or, type $LK,"AutoFile","MN:AutoFile"$(filename); +See $LK,"AutoFile","FF:::/LT/DOC/OSGlossary.GLZ,AutoFile"$ in the glossary for more info. +*/ +PutS("$$FG RED$$Prof(&GrUpdateScreen,0x2000);$$FG$$\r"); +PutS("$$FG RED$$//Collecting Data, Press A Key$$FG$$"); +GetKey; +PutS("\r$$FG RED$$ProfRep;$$FG$$\r"); \ No newline at end of file diff --git a/LT/DEMO/AutoFile/Demo3.AUZ b/LT/DEMO/AutoFile/Demo3.AUZ new file mode 100644 index 0000000..a11a799 --- /dev/null +++ b/LT/DEMO/AutoFile/Demo3.AUZ @@ -0,0 +1,26 @@ +/* To run this, do a directory, right click on +this file's name and select "AutoFile". +Or, type $LK,"AutoFile","MN:AutoFile"$(filename); +See $LK,"AutoFile","FF:::/LT/DOC/OSGlossary.GLZ,AutoFile"$ in the glossary for more info. + +This autofile will renumber the defines in +Demo3.TXZ. Test it by numbering a few wrong +and running this demo. + +*/ + +U1 i; + +PutS("Edit(\"Demo3.TXZ\");\r"); +//Go to start of file +Msg(MSG_KEY_DOWN,0,SC_CURSOR_UP|SCF_CTRL); +for (i=0;i<=0xD6;i++) { + PrintF("%c0x%c",6,CH_ESC); //ctrl F + Msg(MSG_KEY_DOWN,0,SC_CURSOR_RIGHT); + Msg(MSG_KEY_DOWN,0,SC_CURSOR_RIGHT); + PrintF("%02X",i); + Msg(MSG_KEY_DOWN,0,SC_CURSOR_RIGHT); + Msg(MSG_KEY_DOWN,0,SC_CURSOR_RIGHT); + PrintF("%c%c",CH_BACKSPACE,CH_BACKSPACE); + Sleep(5); +} \ No newline at end of file diff --git a/LT/DEMO/AutoFile/Demo3.TXZ b/LT/DEMO/AutoFile/Demo3.TXZ new file mode 100644 index 0000000000000000000000000000000000000000..95d1e287d9631a39b8b7cd16310f401c0008252b GIT binary patch literal 6069 zcmY#RNlnYlOI2`nj`s`o@!{m;G^lVf=jB2c_YdGy0E=7ja-qnCT0qoWqKcY8L>*B@ zjliM?Ca9u@5K&VUQ5XMECm&akl?G-g62T!so__A}&i;PEA&!0_oCXyJsBU$23IGXO zpy+Z7hFD^W=6q*=Ux>#HP@U@M9|9G3LNO=Q&oL-6-q+JFG?-HXWQ{Y5w4;klkZW)- z*x4>tPVZ;wq95reJ0^&n0z!n&xMhr*-98gB6kpdD2hmsL$jDW-r@tSk zL4^@&bhvnic?N@IKvJkN66EUZ=;`O;8UzY_BUdzo9sOLOR=T0d_y>VAzAgW>>Cc#l_j2cyb{vi;_ z_z-`PFN{%R%*Qo2I6lO~(GM(#8for9u8twDK?rGcl;jH5>K_C#9prG-D1_-oR)HRw zj(#rjpil(qc0}`+e^5Lq7!4|nQFB#YPY9W`2mJ>b$1+fkzxNg851Y9Wav4Y3_PT75&&{EiyC zNYW77QS&O2G{kn)ct(gKalOjd3JtuBS}LnM~!nNX^8FUaqj5if)eMZsBw-Y4Yu73HO`Tw z!M2;B#yOHS*mg7YI1dhWLb2TpHO`TwA-1E&Ig&KQcGNgWl7`rh9_NlOE@lvOQDfWD z#RbwNG((MNM;8}J)7lI*hCTh9Ayu6jTCE%E1T`NuN`ph4pys2-WpJny)O^%Pba925 zj~;ujej$+R*9ACkE1)dXJC#NK`3&lkp$A`lYPJ;>y)Tna`fi^NNP@~K#1e$y;P_vU$ zup7j9)ChA5hO`eYP~*$fFE}t1oTe>MBMTxCALJSa4i(hc3Uc*@=|YVsUsqq}fJm?o z)EM%0^$m6n0ZX99ji+CL3nxh25;amh{Q|-v;;0eg=?CqgTcSpTe`pBEAcG1^)Mx;S zhl9;W%}5||i210|5ab#V@97r|(SjNiP$?&{X{eC_lJXA?foemI5SSc9A9{1t%Qpbx z4AgiD_V5o1i3dv>R9K=$O>nqph_eUS73hu8U~kWWD6kA_ynw~QrMV?)ynrP9AUaUv z1tI~~;%I=DfFboNgaoOJ;xwpmM2#khB!mPj0Tnuq=oJ-mM! zz&!&{rvhOPYQ&-`02_i{b;0@%sOF$XHKrP{QRoFH*gAM41@1T0Oo>Gi*f3~g#?c8n zS_QKc)jS0S1%nDlaN2Nm#;ei@tP(x3fLd=L40jxAngL0HFjyMwEYzd}k^^CoydO9T zpr#;@90)_?K?XRXCnRux3mRdZ1{F@IX$VOcoDQAPay+QB2G$Hoz)q;?2BF(83T!!g zigEMwfs{N>s0qc*GdKi1wBm%C{oP>7QPYDPST)G?sM+2v(#I$Qlog#&K9skINYw#Y09volzqLCT{_gM$eXR!SN`=lg?<76C95+Lg|baN5S!-kTFAJ zBk+KtGkRRbhoX#AI-}<~P)`{)qHD-$P~nUkdC1bBMC*(ihoGJ=if+`HM3x5Wc0tc? zaIeP)J3IQgx`4*NQ6m@bdn6U8(F_j&s0z>kkqi0&QE*6*k1Kdo#053Zqg;dh!KvBB b6s=P63-yh6^$Q8|bOpB^UBFS#%f$cyl+#A4 literal 0 HcmV?d00001 diff --git a/LT/DEMO/AutoFile/Demo4.CPZ b/LT/DEMO/AutoFile/Demo4.CPZ new file mode 100644 index 0000000..8105a47 --- /dev/null +++ b/LT/DEMO/AutoFile/Demo4.CPZ @@ -0,0 +1,12 @@ +/* This is not an AutoFile. It uses $LK,"AutoString","MN:AutoString"$ +to run text as though from an AutoFile. + + This example shows how you can drive pop-up +windows. +*/ + +Auto(" "); +coutln "PopUp #1:",PopUpNoYes; + +AutoString("Msg(MSG_KEY_DOWN,0,SC_CURSOR_RIGHT);PutChar(CH_SPACE);"); +coutln "PopUp #2:",PopUpNoYes; diff --git a/LT/DEMO/Caller.CPZ b/LT/DEMO/Caller.CPZ new file mode 100644 index 0000000..31f647d --- /dev/null +++ b/LT/DEMO/Caller.CPZ @@ -0,0 +1,23 @@ +void Lowest(U8 i) +{ + PrintF("%d,%P %P\r\n",i,Caller,CallerCaller); +} + +void Mid1() +{ + Lowest(1); +} + +void Mid2() +{ + Lowest(2); +} + +void Top() +{ + Mid1; + Mid2; + Lowest(3); +} + +Top; diff --git a/LT/DEMO/CircleTrace.CPZ b/LT/DEMO/CircleTrace.CPZ new file mode 100644 index 0000000000000000000000000000000000000000..6f6bb090664f04962d284ccd7b27c6a1f5a14d2c GIT binary patch literal 2251 zcmdPb4=74ZF3C(zRVXP+OwP>U20xRd`V()c6@S@ts2Z!up#9cnK`Kn8X-ZUu9^y9 zI}{WGauO>wlrmghoE?LlU0j`mlpq$?B3tHClvwUr0=LCECpEDsJTosPzdR(h0^}}` zIr$|Jq2Q9D%)E3Bh|hHlDh%9o40OQW0J~l}B{eNGFBKF{@kNO#nWe=Fh6V;8fAMmG z1Hw5ZASb^>!@bBUv&1*CKtU@hu{c%7(?X#FL{x%^Dp(k~7lGA+RaEFyLY!Wdm|`1T zSX81BTv()0p_`mp1hq)l$W&7sBv^?i2+;?Q7HwO{q+*St#1teYAZf7MVJ-wmF(~j; z;bG!wp^%)LqEld~Q(&Z1VW?AS2oCa46NUVol=#wul*E$M_;PTV*@9vTMFd%CW`8rrt*MSiK}8tFx#fQ6VJ zQd}HdQdF8;qM%irmr_!kZ5v#WSe~b$hLR8=YH?a_3rc!m`+O5CGIKMlQXxqOECli? zN~qYXLDC&q*1ZUv>cDJ}t90#>^K>ls!8X526AMU5A4HNMUi1&dCp)2+bh!2Vn z4bX(RM?oPoO+f=>hb^*63Nt%rA2vAeYFay zImM|6PosMT6!*j@8Iae>Pc|Ukxale0cV>b;{2#34!HPkX(hK zZGoY+LZzW?ff3aE3JTEFn4FuU2ulY(pp*j&5>A99Gru#K$lXgN5|6l74pkci*gbR3P3e)L1sm2PO(CM zox+n1->y; + *lo=result.u4[0]; + *hi=result.u4[1]; +} + +Simplex *CopySimplex(Simplex *dst, Simplex *src) +{ + MemCpy(dst,src,sizeof(Simplex)); + return dst; +} + + +Simplex *Mix(Simplex *result,Simplex *n1,Simplex *n2) +{ + result->x=MulU8(n1->x,n2->x); + result->y=MulU8(n1->y,n2->y); + return result; +} + +Simplex *Mangle(Simplex *result,Simplex *n1,Simplex *n2) +{ + result->x=MulU8(n1->x,n2->y); + result->y=MulU8(n1->y,n2->x); + return result; +} + +Simplex *Add(Simplex *result,Simplex *n1,Simplex *n2) +{ + result->x=n1->x+n2->x; + result->y=n1->y+n2->y; + return result; +} + +Simplex *Sub(Simplex *result,Simplex *n1,Simplex *n2) +{ + result->x=n1->x-n2->x; + result->y=n1->y-n2->y; + return result; +} + + +void DrawIt() +{ + U1 old_attr=Fs->text_attribute; + Fs->text_attribute=(BLACK<<4)+WHITE; + ClearWindowText; + Fs->text_attribute=old_attr; +} + + +void BigDawg() +{ + U4 old_update,d_lo,d_hi; + U8 sc,ch; + I4 i,j,k,cnt; + Simplex n1,n2,n3,n4,n5,n6,n7,n8; + U4 in_color,key_hit; + U8 timeout_jiffies; + GrBitMap *base=GrNew(grbase); + + old_update=Fs->update_window; + Fs->update_window=&DrawIt; + + MaximizeWindow; + GrClear; + do { + n2.x=RandU4; + SwapInNext; + n2.y=RandU4; + cnt=RandU4; + SwapInNext; + + n8.x=RandU4; + SwapInNext; + n8.y=RandU4; + SwapInNext; + + in_color=RandU2 & 1; + + key_hit=FALSE; + timeout_jiffies=jiffies+JIFFY_FREQ/8; + for (j=0;jtimeout_jiffies && j<20) { + key_hit=TRUE; + ch=0; + break; + } + if (ScanChar(&sc,&ch)) { + key_hit=TRUE; + break; + } + for (i=0;itimeout_jiffies && j<20) { + key_hit=TRUE; + ch=0; + break; + } + n1.x.u4[0]=i; + n1.y.u4[0]=j; + n1.x.u4[1]=0; + n1.y.u4[1]=0; + CopySimplex(&n3,&n1); + + k=0; + Norm(&d_lo,&d_hi,&n3); + while (d_lotimeout_jiffies && j<20) { + key_hit=TRUE; + ch=0; + break; + } + Mangle(&n7,Mix(&n4,&n3,&n1), + Add(&n5,&n3,&n2)); + k++; + Norm(&d_lo,&d_hi, + Add(&n3,&n7,Mangle(&n6,&n3,&n8))); + } + if (!in_color) + k=(k!=1)?15:0; + base->color=ROP_EQU+k; + GrPlot(base,i,j); + } + SwapInNext; + } + + if (!key_hit) + ch=GetChar; + GrClear; + } while (ch!=CH_ESC && ch!=CH_CTRLQ); + Fs->update_window=old_update; + GrDel(base); +} + +BigDawg; //Autostart when included diff --git a/LT/DEMO/Debug/Test.CPZ b/LT/DEMO/Debug/Test.CPZ new file mode 100644 index 0000000000000000000000000000000000000000..d29f0a019ba024fad1559d251a1db1fb8f8123a9 GIT binary patch literal 1673 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 literal 0 HcmV?d00001 diff --git a/LT/DEMO/Exceptions.CPZ b/LT/DEMO/Exceptions.CPZ new file mode 100644 index 0000000000000000000000000000000000000000..0832db1ab769073e7828d26c4b072a32b0b09137 GIT binary patch literal 939 zcmdPbS8?*zF;oe64D$2zbGHKV3{(_c^7GV76pB(yN{jLo@=Hq;^3xO&6_OK6k~6An z^*BQ^GK+b+^!0Ny(=$pG(o;(m(lRSjQ}lSbc)65QQqwZ?QWadC1L6%i4N(P*IE_#R zj5&=_1xz?iK&F)CXQn6wXXKY_X!3GZ^KvODc$z3=T7wwL`K2W}c?wEy#kzK>70Iau zCGm+x>B+WAI%pzb)oJ-f3L2TV2G*H2=+c?m+L|B(6%+!BGV@B@G|-GJi&jmEwN*8+ zh=?hQ$y3tFM6;kQIx|+&nwP5<W1;SbhGt}bksnMG*q1Jb za6f`ngS_Tqs04O=W}1Qq$V5X;O@)$-qWp3VaHxVTRZxIQ8lgxU=@=X9n40RCnW3sO zg{eZd+X&NcBZ%E4MU@KRfLBm(F$B8?VWkPoFtB?}AU4%P(g#cv+%HB78Hsr*IjKbu za}~hRiew;KwAdMF!i<1eh$>$eZ4hf~3ke30I!>59&WWX<#F&|<-~#pmCrBSS#l}NY ziET(ws4LW71%+Bj%!8>~XdFVKBQ-Z49w^9xUEHy7PHLpY=Ex$;iBqOs} zkC#hJpO=f5OF1(yIj1xwRY6JLCq&=H)z@D?q$oAjB{etSD?c+&38bbhKQjg95s-w2 zr=fyYerZWTX-PcD)p?1zskVNhK0cbfT-Cf>3JPvHiRs0`B}JvlB?@WQAQ7LEGzG03 zTc46NztnQDh@8(5u&TAGeha7etHr;lrVXo#mzyqk}sd$5v@l6H}jCRnXcNm@W@ zNw7waj*^N>NRWcAv$ms;PK;8Fl8Q=9QA{2-Wu7iN+D0lWP$`g~f=iP$a&+7>^HSVE zL9GGyv6hmKTAE&do+cKXJY95j5k~lwqy?oWC*~w;J7G9KDk_vL4qff9a#DZFd)STi}Q1GFs2nh;>D)1>u Wb4ksCxTh8rQ_$1~iX>}ZE(QP_qrlYw literal 0 HcmV?d00001 diff --git a/LT/DEMO/GetInput.CPZ b/LT/DEMO/GetInput.CPZ new file mode 100644 index 0000000000000000000000000000000000000000..aa50e52df6da3a1f78f76c2883841197bfc0cef9 GIT binary patch literal 1384 zcmYe!Nh~f_a0xCcDorlo<*HWD*AFdDRd5ao^3nBCNX$!7C{E2uO)gPTa!D*nR8lC( zS4dCIOD#$)NmVGxNL5J7FUn0UQ7A4c%FIhI=H*gQNXaiv%1KqoE6p`jNXsoLE-6w_ zQc-bn)D6)wGBwkQQF4JOFtk!NG}5z3i&0Whi78UDM%8PCSFaIBZz{4*PYX_vmB!e$ zd0HrdfT5K^g{px?1Qv}Zcr}9UOF_|QsF0VKn;LBqtAMIAK*wB1K_N!TFEKY2WT%yC zF^WD5PKA^b1vE|YpaBJ|f`WpTs)Y+eSFJTK7cW;qX;MyRvO-yYW{QGKzGsPsCNEbt zQlO=PL(tPgArrzdRL}ys5X^zbuR?lB4w&x~;sUZMC9x#6Br`V^Y`y|WRu2?ywuVM} z#;Lj{)(Q&x`oXCs3Mr{+iKRIu;OI>+$pI-cvNh2&O*ICa1{E^4HK;H&GB!aLGqKe* zH8Tf`1eX*!7gTDffmJ8wrs^npL@`ys-&r@01g`kh2;FwlAJsRC1pcfB^{7KARmG?Bgq*d z6Z4W&b3i!+Bo6ZsNG}LGgK}_CYJq}lMPhD2PAW*9f&xqwJzSts zjc$lvez`(HQGRYgNoHQULRwLNE;x55=cXv+Wagz>feZy%o@pD9TjFVf=mOY uBT)JWnFvX4keE@>P;~(rik=uj`VsG95ha!TkG_xQ+CBHN&C)L)eq*y}@q&B&zBt9)CF}+yF zIVdD8-p@bY#Xr=^$2H#B$J5yxVms8L%)E@uq|6fA%z}6*6J%+8enDzcVo7FxUNP9J z0Ao)Rh2&^6lUOhpr()ZXpioz^5|A@coNTKG2}rQ4dl5Jo!R(ZL1#rMBC?w~m*t(~d z_!g&Ys1+FMs1+FL7~0tQ2D`_52E_ZshX!aPxIyuu0T7QUC}gH7Xn^$EA}Q5`8LFU= z9Gw}fS7BRVXboXj+7=i=nN_w1U^gfzC@3W9+9l`b=?u&P>m9$}Ax!iRggRAUt6~Y{raH ZkRp^g2Kyg(;sB|KCNfyIfx6b30RV(j26+Gg literal 0 HcmV?d00001 diff --git a/LT/DEMO/Graphics/Blot.CPZ b/LT/DEMO/Graphics/Blot.CPZ new file mode 100644 index 0000000..bce68c4 --- /dev/null +++ b/LT/DEMO/Graphics/Blot.CPZ @@ -0,0 +1,29 @@ +GrBitMap *b=GrNew(grbase); +GrBitMap *img1=GrBitMapNew(BMT_MONO,128,128); +GrBitMap *img2=GrBitMapNew(BMT_COLOR4,512,512); + +img1->color=GR_WHITE; +img1->pen_width=3; +GrLine3(img1,60,0,0,0,60,0); +GrCircle(img1,30,30,20); + +img2->color=GR_RED^GR_WHITE|ROP_OR; +img2->brush=img1; +GrCircle(img2,256-30,256-30,128,67); +img2->color=GR_BLUE^GR_WHITE; +img2->pen_width=6; +img2->brush=NULL; +GrLine3(img2,128,128,0,256+128,256+128,0); +GrLine3(img2,256+128,128,0,128,256+128,0); + +I8 i; +for (i=0;i<256;i+=4) { + GrClear; + GrBlot(b,i-256,i-256,img2); + Sleep(20); +} + +GrDel(img1); +GrDel(img2); +GrDel(b); + diff --git a/LT/DEMO/Graphics/Box.CPZ b/LT/DEMO/Graphics/Box.CPZ new file mode 100644 index 0000000..2b28da0 --- /dev/null +++ b/LT/DEMO/Graphics/Box.CPZ @@ -0,0 +1,60 @@ +GrBitMap *base=GrNew(grbase2); + +void DrawIt() +{ + ClearWindowText; + base->pen_width=2; + base->color=GR_RED; + GrLine3(base,-100,-100,-100, -100, 100,-100); + GrLine3(base,-100, 100,-100, 100, 100,-100); + GrLine3(base, 100, 100,-100, 100,-100,-100); + GrLine3(base, 100,-100,-100, -100,-100,-100); + + GrLine3(base,-100,-100, 100, -100, 100, 100); + GrLine3(base,-100, 100, 100, 100, 100, 100); + GrLine3(base, 100, 100, 100, 100,-100, 100); + GrLine3(base, 100,-100, 100, -100,-100, 100); + + GrLine3(base,-100,-100, 100, -100,-100,-100); + GrLine3(base,-100, 100, 100, -100, 100,-100); + GrLine3(base, 100, 100, 100, 100, 100,-100); + GrLine3(base, 100,-100, 100, 100,-100,-100); +} + +void Box() +{ + double theta=0,phi=0,zeta=0,s=1,s1=1.05; + I8 *r1,*r2,*r3,*r4,*r5; + U8 sc,ch; + U4 *old_update_window=Fs->update_window; + Fs->update_window=&DrawIt; + + base->x=200; + base->y=200; + base->flags|=BMF_TRANSFORMATION; + while (TRUE) { + if (ScanChar(&sc,&ch)) break; + r1=GrTheta(theta); + r2=GrPhi(phi); + r3=GrTheta(zeta); + r4=GrMulMat(r1,r2); + r5=GrMulMat(r4,r3); + Free(base->r); + base->r=GrScaleMat(r5,s); + Free(r1); + Free(r2); + Free(r3); + Free(r4); + Free(r5); + + Sleep(60); + theta+=pi2/70; + phi +=pi2/90; + zeta +=pi2/110; + s *=s1; + if (s<0.2|| s>1.4) s1=1/s1; + } + Fs->update_window=old_update_window; +} + +Box; \ No newline at end of file diff --git a/LT/DEMO/Graphics/DotNet.CPZ b/LT/DEMO/Graphics/DotNet.CPZ new file mode 100644 index 0000000..9d50d64 --- /dev/null +++ b/LT/DEMO/Graphics/DotNet.CPZ @@ -0,0 +1,12 @@ +void DotNet() +{ + I8 i; + GrBitMap *base=GrNew(grbase); + PrintF("$$CL$$"); //Clear text + base->color=GR_RED^GR_WHITE; //Printed on white background + for (i=0;i<600;i+=20) + GrLine(base,i,0,0,600-i,3); +} + +DotNet; //Run when #included +//Type "GrClear;" to get rid of it \ No newline at end of file diff --git a/LT/DEMO/Graphics/Sprite1.CPZ b/LT/DEMO/Graphics/Sprite1.CPZ new file mode 100644 index 0000000000000000000000000000000000000000..85389917585c517ca441fc861753a3fa65d72e04 GIT binary patch literal 1916 zcmdPb56Q?ZR!GatNmVEk`X zPtH$CRY*)LNi70Pl%!UaC?po8Ch93DIEMuJ=msg2Cl-UuN>M1u2Wu!wO)NuFSRJKBsB%3C8-i>mY#w_NJeU&4%k_F#i>Olx=ERN ziA9wP$@#gtiFshvAnl1MDXA$6NtFsE`RVC7nR)37CHV>kIf)?WgIt)Kp8|G$d1grl z#Ox3qh180~+{`?%;*3;9FmcWCZ&*+nvqzRTC9+hnVqVTs8C!|1TrT%Kd-nXF|P!qsXQY!4`fn7 zW=?7f*yD*M3Yo<^3YGb#3dxCi3W>$Vndx~7nI+JGO;jkz&jbfxSz=LUVp2{j+yQ?1 zC8<^lo@rpc1x2aF#c)r9ViO!`nRyC@rTHbP#URV`^I%bun3sa)_F{01LPEGCUm-U! z8yu7%gP>tktWcI&oC$IOIKC7h<`*kursshZQBozy4yXo@|BAr=0|gQ|89us>DlGvg9Y{#)sHk`btEebI9T|cM`(g!H3IgdWOUx-vErth&dr@LRMrLxc zesDoiW=X1{o^wDHD2Wz>jV?$nD$Xn}NzE%!NQWp?NJ=bD)k!Y`Qy}xoGe8*x zjMO3p_aGNnUw?IQI#+q$So}fM`u#1LQ!f;QDS+XLTX}ihC*pU3Md=o zr-AJ(PA*DK%>yUc3~*@X7l4vKC`}Ys7MG;vDrgv)dQ@qG!zr^^Atg089~3;rnYjfy zsYM_+C8Z`OmKLXiqc|mBAuqo~AulyGMIlk4JTosPzZ_;`QGRJjW*#VQ@N)5TsRVfH zDA@#fDj3=+=@_bjgdn&qKQl!E8a^7Dyj<11TnY-Ih6-Alx#_klo=!SSAobQDQTHOJ z%o5+k0tGEl0NJ`1`K6X?Kte$itiaPmArs69C@l%rP*PEG_EAw$g2<)i7b$3D+8S7A z+N2kiXQq^7*x4CbXKHI}DuAt2P;f7D&Ph!yvIeXsWTfWmfx<-roNjdO3R3gp!OpNXhI&HD zJt#ih!!yKH2^5K?#i=O@AlnsSaR|=)<@rU~nR)3T8^Hd8gs2WUy}%M?YEEiyYFMX2N5 zi(GS3bBhCV@=G*85v!A_lU|gOnwg$aVrOTlW1y3no2~=%2q-ckeh$t_O)bzc1_>xA z)Pls4^Gi!|@)VRjAr(nxRjQSej*4fnj*^XMFf`$TlLxB8lF9;z!Vr+c5M+h!MJ}m1 zU`K(hsRgABXi~LiU}9ikU}S)Rbqov)EDQ`_F_5?zL|B=Df#Jvh|Nj{n7+_381_lOB zh%Ah$#K6EH4iN$|L3%|P7#P@~=7G%Bf=DxfXnqJA#*}7YVBmuY!I&WWAH-T16QmlV Hh=BnBbeJg4 literal 0 HcmV?d00001 diff --git a/LT/DEMO/Graphics/Sprite2.CPZ b/LT/DEMO/Graphics/Sprite2.CPZ new file mode 100644 index 0000000000000000000000000000000000000000..59f66b82079f14920d41d7bd0569a09cc96062a8 GIT binary patch literal 1236 zcmdPb56Q?ZR!B+B%~vQbPAyhQFG@-*PBqd|D9%@?%r8~QEiEolNK8plNaW?x*Dozd zNi0c?FVD$jdJQsV_(^D$Xn}NzE(KQ&7@pOV33f7^oAD&r~kzZP(P?C{ZtfK&ON=a%(i9&vwLVig` zYLNoO)5Qu&sX6)OAlH`Xm*%7>Bo-8;CKl;|%y-U7O)LrrhfPRoMG4H@RE6ZkJcZ

3kjpGlC{KikT1sjfC|EP|6r4kXd~}1rhJ(DSYgdq(7Z28I zYXml4LBYMqH77N+_o9%D)RIJv5)cUrDg^}vg(4$c_o9G|OpSt!OqiHkQEDnU zh;{9XKw_XY0M0$h`MF7%d8x(V$So<)S18IaNi50C&npJUoPq+xLq)dkMZTpuzKJCo zMTR;>Mi4VVwt-D9G6V@AxJdHBIjN}y8YTuH1)u;^0NGTMsBK%2X{2um4K)RYf{aWB z1*o7gC@4W{Ye58N6ktT2H7^%9jX;x!H3Jg^0~j+fFfgoxvSDIkAVCHOWd;U@AOHXV zXFxCw85kHiA+j*05(5K+I7A4<1nCuFU|?W_n#sbzz@P<@2GjfyHb@A>lxARH;DZRk Sm>~Ke#99~=q#B}#fdK%6>_Wf* literal 0 HcmV?d00001 diff --git a/LT/DEMO/Graphics/Sprite3.CPZ b/LT/DEMO/Graphics/Sprite3.CPZ new file mode 100644 index 0000000000000000000000000000000000000000..3665e1ae6575e4e8e713c78322a8d94ae37b5512 GIT binary patch literal 928 zcmdPb4=qkra1IIb(G5~4$yZ2BNm0lzQba?MH2)ll(t(owSU zbb?y0qv9D1;s-R!pj8>5^G*A1||ju21W)5 zXl7(!U}j(di-ANya=Z)>vG4!?|7T!eU}0cj00|j0Ffj0e)G#o>m_`f?3{X`tCdjZK z|NsBzfEo%i5M%-fb2Bh7fYk9oOaTe8Lxn)fq1J+Q7(&?$3=Dz{3=IGN|NjpX0?`Z% z3<3-c3_t(>{|_*r0F%**zWVQ;_^O z1_lO@Yd`=0|9@NV?QOZgmgP@2JNsM3a}o%hy}T@QlFy75&lv_O9$hM)lb%=JGJ88a zaE40cCLQl-Iv!0b9+N;Q@sPpEZD;4*ExY&T=I3pBx4~w829qFmjswUtkRP=f7#KeO d|NsA6jxod1_0f)4vqi- literal 0 HcmV?d00001 diff --git a/LT/DEMO/Graphics/StarTrek1.CPZ b/LT/DEMO/Graphics/StarTrek1.CPZ new file mode 100644 index 0000000000000000000000000000000000000000..75f20c3e0fc68b2607965483d5c8f79e10f6938f GIT binary patch literal 3811 zcmd<(fF;amDW0IVlP$ecvO5lQ~NP-Z(p%w}$sl_El`IV_D@g7=7%6JTTqau-6v z2qs}-r=(+|f{-wVNtoIx>6n5f+>4wtOMDXx6tt2Oi&Jggi~Lf{HPVYf93xF@kVBPI zQqwZ?QWg9{edB{e9D{;64Gj!k0SAzR0w~0F?UM6z@{4TUgW|(I zJVRWO!^Xfm(*_>U)|uMcnjo_j6x@pfa`H&vtSyU{l_uT&!kZj?)E4vbfnT2fk+2TsmlU%~TRa7kiONKtCGA>2#QRIi{AYN3#y zlMlqO5>mM2nNfn@!2P=B8DD?7= z3=Z*h_68N#p!DmLpO^x(!#Oc0GpQ)CBr`t`>|AgNDJWzX#AoJZWF}>nfP5F9Uyuq> zQ*0X&1Wk${@1ptxniD`0DB)nM1}R*?7WgJsWaeg8r9ui6Xkh{^Pch33n6Dt^G^n7k z4NA;Q2{lqpFDlPWDainvsQ@k7E2A@G5%L+Sndupz;tHIg6%@)dGILTDG!!!n;){|r z6{;2V_4D#e6pBEq6p~6yO7inS(V(DEVOybXY^_jfTd8XVH6Ii=6?RZNH5DqLUWMeY zN*e=Bg-YA>A|x9jGMNSOIbf?4^!0O6(@LP$*hB15PzWwaEYH(WgV!{WO3{ zEswOlJl)(P1NDup6%_RKGZJ&s6pB-m^Yc<*CW0L5m{ja(p#d!obSpG%3=Iqv z)YKGU;+5Jarn;42VQ_)NiB_Ot+6T5RKQ9$-87I``&?*bzZgA}e4R8eoNX2IguIHeF zNHw2=0%lSH3O7e3x zK(-~97RBe3q=7sJ&Jysl!kU+hfr)_uj2Rdh7}hdE*dQ?$4yXh>0|SE@0|UeJ|NsAg z`2YWZbo%Xexsy^Rsdx(AF1ziPDDwN8l>yGk^U5|6c`c4mvs0 zrBg`NbKBO~-MP27F+xoM8MXHAwp?bA8Hx-H3^EK14B!9%|NrMd0*HVlO&J&%xEL51 z1Q-|?{&-GO_nfSL{=a?wJP}V%At1im(+2wuWLz-=1A_zu1H+U5x3^s{jor=&iZpO!ffx)740%k52xI~UGc!bjkAZ>V z>;M1%K{P~!0mKCPPL6>AY(4`61B|J_z`*eH|Ns9C3=A+PNHxd+1_rQ35ECTy8lnou z1gU-s5rQ#6A@&R+1Y?FXFfe?A2*H>j8Wi9R3=A-)5h#cus$fiznZF=HAhUk||NkFE zg94p_fdR&pWnf?cB|)eVhzT+i0|Ucjh!Bh!g9scLGn9dW z;T=R3NC;$n90LP`5F}VZOi(Hgf+lYU28IM^ddWp-gfTM_HiBIJ{{R2~dJGHyls6ikmD7xIC37LU`0mgJd zL>r6=3Tmj+L!iDeXJBCX2XQBiDapXV08L>qCMYmLk<7rr0Aqr(%4dj17!%}7Q1n4v z3}W&#Fff2Zh=GAYje&syl)^yy4x|!PG%+wRfHZ?5LT3q#rf literal 0 HcmV?d00001 diff --git a/LT/DEMO/Graphics/StarTrek2.CPZ b/LT/DEMO/Graphics/StarTrek2.CPZ new file mode 100644 index 0000000000000000000000000000000000000000..3a2866525d6d33019faf1c7907c550d847e29794 GIT binary patch literal 7424 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 literal 0 HcmV?d00001 diff --git a/LT/DEMO/Graphics/StarTrek3.CPZ b/LT/DEMO/Graphics/StarTrek3.CPZ new file mode 100644 index 0000000000000000000000000000000000000000..3959fbddf4ad30f785cfb71842998ebb38a9efaa GIT binary patch literal 8191 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 literal 0 HcmV?d00001 diff --git a/LT/DEMO/MsgLoop.CPZ b/LT/DEMO/MsgLoop.CPZ new file mode 100644 index 0000000..0e73a51 --- /dev/null +++ b/LT/DEMO/MsgLoop.CPZ @@ -0,0 +1,15 @@ +void MsgLoop() +{ + U8 p1=0,p2=0,cmd=0; + coutln "Use $$LK \"these\",\"MN:MSG_CMD\"$$ defines " + "in your programs instead of hardcoded numbers."; + coutln "Press ESC to Exit"; + while (cmd!=MSG_KEY_DOWN || (p1!=CH_ESC && p1!=CH_CTRLQ)) { + cmd=GetMsg(&p1,&p2,-2); + // The following fixes the cursor position + LtfBottom(Fs->cur_ltf); + PrintF("CMD:%02X P1:%08X P2:%08X\r\n",cmd,p1,p2); + } +} + +MsgLoop; diff --git a/LT/DEMO/Music.CPZ b/LT/DEMO/Music.CPZ new file mode 100644 index 0000000..baa6aec --- /dev/null +++ b/LT/DEMO/Music.CPZ @@ -0,0 +1,20 @@ +void SoundOff() +{ + Sound(0); + Exit; +} + + +void MusicDemoTsk() +{ + Fs->end_task_cb=&SoundOff; + while (TRUE) { + Play("1wCqDsEFG2AB"); + Play("wCqDsEFG3AB"); + Play("wCqDsEFG4AB"); + Play("wCqDsEFG5AB"); + Play("wCqDsEFG6AB"); + } +} + +Spawn(&MusicDemoTsk,"MUSIC"); \ No newline at end of file diff --git a/LT/DEMO/Sound.CPZ b/LT/DEMO/Sound.CPZ new file mode 100644 index 0000000..3d88bbb --- /dev/null +++ b/LT/DEMO/Sound.CPZ @@ -0,0 +1,15 @@ +//Practice your ASCII knowledge ;-) + +void Organ() +{ + U1 ch; + coutln "Press keys to make sounds"; + coutln "and press ESC to exit."; + do { + ch=GetKey; + Sound((ch-28)*25); + } while (ch!=CH_ESC); + Sound(0); +} + +Organ; \ No newline at end of file diff --git a/LT/DEMO/Spy.CPZ b/LT/DEMO/Spy.CPZ new file mode 100644 index 0000000..57e2a4b --- /dev/null +++ b/LT/DEMO/Spy.CPZ @@ -0,0 +1,15 @@ +void Spy(TssStruct *tss) +{ + BoolU4 old_preempt=Preempt(OFF); + SysHashTable *old_hash=Fs->hash_table; + Fs->hash_table=tss->hash_table; + while (!ScanChar) { + LtfBottom(Fs->cur_ltf); + PrintF("$$CL$$"); + TssRep(tss); + StackRep(tss->esp); + WinSync; + } + Fs->hash_table=old_hash; + Preempt(old_preempt); +} \ No newline at end of file diff --git a/LT/DEMO/TreeDemo.CPZ b/LT/DEMO/TreeDemo.CPZ new file mode 100644 index 0000000000000000000000000000000000000000..5b43f3be0827ee49c58a52190087bb9216a94f14 GIT binary patch literal 968 zcmdPb;^hj-$ShVUElw>~@F__PC@l%r2hl~Dc_nTNNvX++rNyZVr3ER8C8@={TqXGm z<(VZJnRyC{3MECUsS4#8nK`L2PG+$}a(+%uVnK0gib8s72`^V}YH@LDif(CvLS~wR zQch-Bs**-dW_GGVX>n#=xE0M<`t(Fl_(VCXXceC zfKARzD+L*xRH=}WnF7|H#>O&T#%ZanV16#aD}weykxK? z3JPvHiRs0`B}JvlB?@WQAdyfLh5Ve9cxVKGg+TG8m1FBxtZSECS`?pC0#WInTH*%Q zuc4NvqZAwx@8;>_8Xp?s=@akfnext; + if (tempm->attr & LT_ATTR_DIR) { + LtfPutS(l,"$$TR \"\"$$"); + LtfPrintF(l,"$$MA +A \"%s\",\"Cd(\\\"%s\\\");Dir;\r\"$$\r\n", + tempm->name,tempm->full_name); + if (tempm->sub) { + LtfPutS(l,"$$ID,+2$$"); + TreeSub(l,tempm->sub); + LtfPutS(l,"$$ID,-2$$"); + } + } else { + LtfPrintF(l,"$$LK \"%12s\",\"FI:%s\"$$\r\n", + tempm->name,tempm->full_name); + } + DelLTDirEntry(tempm); + tempm=tempm1; + } +} diff --git a/LT/DEMO/WinMgr2.CPZ b/LT/DEMO/WinMgr2.CPZ new file mode 100644 index 0000000..e121a34 --- /dev/null +++ b/LT/DEMO/WinMgr2.CPZ @@ -0,0 +1,183 @@ +//This is an alternative window manager. +//It augments the existing one found +//in $LK,"::/LT/ADAM/WINDOW.CPZ","FI:::/LT/ADAM/WINDOW.CPZ"$. It uses +//the real-time differential equation +//solver to reposition windows as though +//they were repulsively charged particles. + +//I find this window manager to be a +//novelty, not desirable for actual +//use. You're welcome to add it, or +//some variation to your start-up +//scripts if you like it. It's not +//fully debugged. + +//I had to cheat to make this work. +//I added $LK,"CRTf_HAS_BEEN_RESIZED2","MN:CRTf_HAS_BEEN_RESIZED2"$ and +//modified $LK,"::/LT/ADAM/WINDOW.CPZ","FI:::/LT/ADAM/WINDOW.CPZ"$. + +Ode *o=NULL; +I8 tss_cnt=0; +TssStruct *tss_map=NULL; + +void EndTsk() +{ + RemQue(o); + OdeDel(o); + Free(tss_map); + Exit; +} + +void MyDerivative(Ode *o,double t,Order2D3 *state,Order2D3 *DstateDt) +{ + U8 i,j; + double f,d,dd,dx,dy; + + MemSet(DstateDt,0,sizeof(Order2D3)*tss_cnt); + for (i=0;iend_task_cb=&EndTsk; + while (TRUE) { + cnt=0; + tss=Fs->next_tss; + while (tss!=Fs) { + if (Bt(&tss->crt_flags,CRTf_SHOW)) + cnt++; + tss=tss->next_tss; + } + + if (cnt==tss_cnt) { + same=TRUE; + i=0; + tss=Fs->next_tss; + while (tss!=Fs) { + if (Bt(&tss->crt_flags,CRTf_SHOW)) + if (tss_map[i++]!=tss) + same=FALSE; + tss=tss->next_tss; + } + } else + same=FALSE; + if (!same) { + tss_cnt=cnt; + if (o) { + RemQue(o); + OdeDel(o); + Free(tss_map); + } + o=OdeNew(cnt*sizeof(Order2D3)); + tss_map=MAlloc(sizeof(U4)*cnt); + i=0; + tss=Fs->next_tss; + while (tss!=Fs) { + if (Bt(&tss->crt_flags,CRTf_SHOW)) { + tss_map[i]=tss; + tempo=o->state+sizeof(Order2D3)*i; + tempo->x=(tss->window_left+tss->window_right)>>1; + tempo->y=(tss->window_top+tss->window_bottom)>>1; + tempo->z=0; + tempo->DxDt=0; + tempo->DyDt=0; + tempo->DzDt=0; + i++; + } + tss=tss->next_tss; + } + o->derivative=&MyDerivative; + o->tolerance_start=.1; + InsQue(o,Fs->last_ode); + } + Sleep(60); + cnt=0; + tss=Fs->next_tss; + while (tss!=Fs) { + if (Bt(&tss->crt_flags,CRTf_SHOW)) + cnt++; + tss=tss->next_tss; + } + if (cnt==tss_cnt) { + same=TRUE; + i=0; + tss=Fs->next_tss; + while (tss!=Fs) { + if (Bt(&tss->crt_flags,CRTf_SHOW)) + if (tss_map[i++]!=tss) + same=FALSE; + tss=tss->next_tss; + } + } else + same=FALSE; + if (same) { + Bts(&sys_flags,SYSf_CLEAR_SCREEN_TEXT); + for (i=0;istate+sizeof(Order2D3)*i; + x=tss->window_right-tss->window_left; + y=tss->window_bottom-tss->window_top; + if (Bt(&tss->crt_flags,CRTf_HAS_BEEN_RESIZED2)) { + tempo->x=(tss->window_left+tss->window_right)>>1; + tempo->y=(tss->window_top+tss->window_bottom)>>1; + tempo->DxDt=0; + tempo->DyDt=0; + } else { + j=tempo->x-x>>1; + j&=-4; + if (j<4) j=4; + if (j+x>tss->crt_width-12) j=tss->crt_width-x-12; + SetWindowHor(tss,j,j+x); + j=tempo->y-y>>1; + if (j<2) j=2; + if (j+y>tss->crt_height-3) j=tss->crt_height-y-3; + SetWindowVert(tss,j,j+y); + + x=(tss->window_left+tss->window_right)>>1; + y=(tss->window_top+tss->window_bottom)>>1; + if (tempo->x>x+8) tempo->x=x+8; + if (tempo->y>y+2) tempo->y=y+2; + if (tempo->xx=x-8; + if (tempo->yy=y-2; + if (tempo->DxDt>32.0) tempo->DxDt=32.0; + if (tempo->DyDt>8.0) tempo->DyDt=8.0; + if (tempo->DxDt<-32.0) tempo->DxDt=-32.0; + if (tempo->DyDt<-8.0) tempo->DyDt=-8.0; + } + Btr(&tss->crt_flags,CRTf_HAS_BEEN_RESIZED2); + } + } + } +} + +Spawn(&WinMngTsk,"WINMGR2"); diff --git a/LT/DOC/CtrlL.MUZ b/LT/DOC/CtrlL.MUZ new file mode 100644 index 0000000..8c6447a --- /dev/null +++ b/LT/DOC/CtrlL.MUZ @@ -0,0 +1,39 @@ +$WW,1$See $LK,"::/LT/DOC/Dollar.TXZ","FI:::/LT/DOC/Dollar.TXZ"$ for details of dollar sign cmds. + +$FG,2$"Expression"$FG$ a number or C+ algebraic term with operators and C+ symbols can be entered. +$FG,2$"Macro"$FG$ Most entries can behave like macro entries if you assign them macro strings. +$FG,2$"AutoString"$FG$ Like a macro except it is an $LK,"AutoFile","FF:::/LT/DOC/OSGlossary.GLZ,AutoFile"$. You cannot have both an autostring and macro text defined. + +$FG,5$Displayed Text$FG$ is the text that will be displayed for the item. For links, you can leave it blank and the details of the link will be shown. +$FG,5$Hide$FG$ means display nothing, making an entry invisible. + +$FG,5$Left X$FG$ relative to the left margin. +$FG,5$Center X$FG$ relative to the horizontal center of the window. +$FG,5$Right X$FG$ relative to the right margin. +$FG,5$Top Y$FG$ relative to the top of the window. +$FG,5$Center Y$FG$ relative to the vertical center of the window. +$FG$$FG,5$Bottom Y$FG$ relative to the bottom of the window. + +$FG,5$Blink$FG$ make the text blink. +$FG,5$Invert$FG$ make the text inverted. +$FG,5$Underline$FG$ make the text underlined. + +$FG,5$Scroll X Length Expression$FG$ if a value is entered, the text will scroll in an area of this width. +$FG,5$Y Offset Expression$FG$ if a value is entered, the text will be shifted vertically by this many pixels, so you can make superscripts or subscripts. +$FG,5$X Offset Expression$FG$ if a value is entered, the text will be shifted horizontally by this many pixels. + +$FG,5$Tree$FG$ The item will behave like a tree widget, with this as the adam. +$FG,5$Collapsed$FG$ The tree or hidden widget will begin collapsed. +$FG,5$Alias$FG$ For tree entries, the text of the subentry the cursor is on will appear here. This is for drop-down lists. + +$FG,5$Quote$FG$ Make the result suitable for including in a program, in quotes, especially $FG,4$format_str$FG$ entries in class definitions. + +$FG,5$X Expression$FG$ For cursor movements, this is the horizontal value. +$FG,5$Y Expression$FG$ For cursor movements, this is the vertical value. + +$FG,5$$BK,1$PopUp$BK,0$$FG$ For macro's, run the macro in a PopUp window. Do this when making a macro to run a program, so it doesn't tie-up memory. + +$FG,5$Escape$FG$ For macro's, send an ESC char to exit before running the macro. Without this, the macro runs in the wrong window, usually. + +$FG,5$Refresh Data$FG$ For entries in programs where values are prompted, this flag updates the entry continuously. +$FG,5$Password$FG$ When items are prompted, the value will be shown as "*". diff --git a/LT/DOC/Dollar.TXZ b/LT/DOC/Dollar.TXZ new file mode 100644 index 0000000..e7b72ae --- /dev/null +++ b/LT/DOC/Dollar.TXZ @@ -0,0 +1,151 @@ +$WW,1$$FG,5$DOLLAR SIGN CMDS$FG$ + LoseThos supports rich-text type commands which are bracketed with "$$". Use CTRL-L to experiment with them. Use CTRL-T to toggle between plain text and rich text. + The format of "$$" commands includes a two character code, +/-flags, a comma and parameters separated by commas. The flags often determine how many and what parameters the command takes. + See $LK,"default_flags","FA:::/LT/ADAM/LTF.CPZ,default_flags"$. + +$TR,"TX Text"$ +$ID,2$Normally, text is not bracketed with "$$", but if you wish to specify flag attributes to center text, you can bracket them with "$$" and enter flags such as "$FG,4$+CX$FG$". You cannot edit them if they are bracketed by "$$" unless you toggle to plain text mode with CTRL-T. +$ID,-2$$TR,"CR Hard Carriage Return"$ +$ID,2$Carriage returns are normally specified without being bracketed with "$$". +$ID,-2$$TR,"SR Soft Carriage Return"$ +$ID,2$Word wrap uses soft carriage returns which are not saved. You never place soft carriage returns by yourself. +$ID,-2$$TR,"TB Tab"$ +$ID,2$Tabs are normally not bracketed with "$$", but are stored as ASCII#9. +$ID,-2$$TR,"CU Cursor position"$ +$ID,2$The cursor position is usually stored as a ASCII#5 I1acter and is not bracketed with "$$". You do not normally enter cursor position commands yourself. +$ID,-2$$TR,"ID Indent +/- number"$ +$ID,2$This changes the indention deeper if positive or shallower if negative. It effects the behavior of trees. +$ID,-2$$TR,"DA Data"$ +$ID,2$This is primarily used for forms that prompt for data. Use CTRL-L as a resource editor-type thing to generate the text you'll need in your "fmtdata" command in a struct. If you add it directly with LtfPutS, you'll need to fill-in the data address. See $LK,"DoForm","MN:DoForm"$(). +$ID,-2$$TR,"Text Colors"$ +$ID,2$You place an expression(usually a color define--see $LK,"color defines","MN:BLACK"$) to indicate which of the 16 colors to use. If you enter no number, color returns to the default. +$FG,5$FG Foreground Color$FG$ +$FG,5$BG Background Color$FG$ +$FG,5$FD Default Foreground Color$FG$ +$FG,5$BD Default Background Color$FG$ +$FG,5$FL Foreground of Link Color$FG$ +$FG,5$BL Background of Link Color$FG$ +$FG,5$FM Foreground of Macro/Menu-Value Color$FG$ +$FG,5$BM Background of Macro/Menu-Value Color$FG$ +$FG,5$FA Foreground of Anchor Color$FG$ +$FG,5$BA Background of Anchor Color$FG$ +$FG,5$FH Foreground of Hidden widget Color$FG$ +$FG,5$BH Background of Hidden widget Color$FG$ +$FG,5$FE Foreground of Tree Color$FG$ +$FG,5$BE Background of Tree Color$FG$ +$ID,-2$$TR,"FU,BU User Prompts"$ +$ID,2$These are special color changing commands. They are used when the user is prompted for text at the command line. They reset the cursor position if the cursor is positioned before them on the line. They are also used to indicate the start of a prompted string. +$ID,-2$$TR,"CL clear"$ +$ID,2$Clear all entries except ones with hold($FG,4$+H$FG$) flags. This is good for programs which update data to the command line. It keeps the quantity of ltf entries down. +$ID,-2$$TR,"WW Word Wrap"$ +$ID,2$Include a 1 or 0. +$ID,-2$$TR,"UL Underline"$ +$ID,2$Include a 1 or 0. +$ID,-2$$TR,"IV Invert"$ +$ID,2$Include a 1 or 0. +$ID,-2$$TR,"BK Blink"$ +$ID,2$Include a 1 or 0. +$ID,-2$$TR,"SX Shift X position"$ +$ID,2$* Include a number from -16 to 15. +* Only foreground is shifted. +* Positive right. +* For negative be sure to preceed with a comma. +$ID,-2$$TR,"SY Shift Y position"$ +$ID,2$* Include a number from -16 to 15. +* Only foreground is shifted. +* Positive down. +* For negative be sure to preceed with a comma. +$ID,-2$$TR,"CM Cursor Movement"$ +$ID,2$ +$ID,-2$$TR,"AN Anchor"$ +$ID,2$ +$ID,-2$$TR,"LK Link"$ +$ID,2$By default, links have a separate display text from link text, but with the $FG,4$-A$FG$ flag you can make the link displayed as in example 3. + +Examples (Press CTRL-T to see): + +1)$LK,"File link to Help.TXZ","::/LT/DOC/Help.TXZ"$ +2)$LK,"File link to Help.TXZ with link type file","FI:::/LT/DOC/Help.TXZ"$ +3)File link without different display string.$LK-A,"::/LT/DOC/Help.TXZ"$ +4)$LK,"File find link searching for 'Admin'","FF:::/LT/DOC/Help.TXZ,Admin"$ +5)$LK,"File find link searching for 3rd 'CTRL'","FF:::/LT/OSMain/ADAMK.HPZ,CTRL:3"$ +6)$LK,"Manual page link","MN:PrintF"$ +7)$LK,"File line number link","FL:::/LT/OSMain/ADAMK.HPZ,200"$ +8)$LK,"File anchor link--Press CTRL-T to see anchor after you click","FA:::/LT/OSMain/SYSTEXT.CPZ,OS_SYSTEXT"$ +$ID,-2$$TR,"BT Button"$ +$ID,2$ +$ID,-2$$TR,"CB Check Box"$ +$ID,2$ +$ID,-2$$TR,"MA Macro"$ +$ID,2$Macro's are usually placed into menu/help areas and they have the '$FG,4$+X$FG$' flag set by default. Adding '$FG,4$-X$FG$' prevents the usual ESC from being sent (which exits the macro screen). Note that when you output a macro to the cmd line, when the user clicks on it, it will go to the bottom and execute it unless you cancel the ESC with a '$FG,4$-X$FG$'. + +$ID,-2$$TR,"MU Menu Value"$ +$ID,2$ +$ID,-2$$TR,"HX Hex Edit"$ +$ID,2$ +$ID,-2$$TR,"Hidden Text Widget"$ +$ID,2$$FG,5$HS Start of hidden text$FG$ +$FG,5$HE End of hidden text$FG$ +$FG,5$$FG$Hidden text widgets allow text to be placed in collapsable brackets like this $HS$$FG$This is hidden.$HE$ which can be expanded by clicking them. If you place a '$FG,4$-C$FG$' flag to uncollapse it, it will start expanded like this $HS-C$$FG$Click to hide$HE$. They can be nestled like this $HS$Click here:$HS$This is nestled.$HE$ okay?$HE$. +$ID,-2$$TR,"TR Tree Widget"$ +$ID,2$A tree widget is a branch in a collapsable tree. The domain of the branch extends from the first +indent until enough -indents bring it back to where it started. Tree's begin collapsed unless a $FG,4$-C$FG$ flag is present. +$ID,-2$$TR,"PI Picture"$ +$ID,2$You can insert a picture into text with CTRL-R. It is critical where the cursor is at the time you enter CTRL-R because the picture will be offset from that location. This is especially important when adding images to programs. Numbers for pictures are automatically chosen because copying to and from the clipboard requires this. You can insert another picture with the same image by hitting CTRL-T and manually adding a $$PI$$ entry with the same number. You can cause the $$PI$$ command to appear with some text associated with it by manually adding text into the $$PI$$ command, as in $$PI,"pic 2",2$$. +$ID,-2$$TR,"IB Insert Binary"$ +$ID,2$This cmd is used to tell the compiler to fetch the binary data stored after the end of text. There is basically one type of binary data in LTF's at this point--pictures-- created with CTRL-R. They have a number associated with them. This number is automatically chosen, because copying to the clip-board and back requires renumbering. To use a $$IB$$ command, toggle to plain text (CTRL-T) after inserting a picture and check the number in the $$PI$$ command. Create a $$IB$$ command with the same number and the picture will be inserted into the compiled stream like a string constant. You can optionally include text to be displayed for the $$IB$$ command. + +The main reason for the $$IB$$ command at this point is to pass a parameter to the $LK,"GrElemsPlot","MN:GrElemsPlot"$() function. See $LK,"::/LT/DEMO/Graphics/Sprite1.CPZ","FI:::/LT/DEMO/Graphics/Sprite1.CPZ"$. + +$ID,-2$$TR,"IT Insert Binary Type"$ +$ID,2$See $$IB$$. This command inserts a number into the compiled stream describing the type of binary data associated with a number. See $LK,"LTFBT_ELEMENT_GRAPH","MN:LTFBT_ELEMENT_GRAPH"$ for the types of binary data in LTF's. +$ID,-2$$TR,"IS Insert Binary Size"$ +$ID,2$See $$IB$$. This command inserts a number into the compiled stream describing the size of binary data associated with a number. +$ID,-2$$TR,"BP Break Point"$ +$ID,2$This is used by the debugger to mark a break point. +$ID,-2$$TR,"ER Error"$ +$ID,2$When errors are detected in dollar commands, an $FG,5$ER$FG$ entry is generated to hold the garbage so it is not lost. +$ID,-2$ +$FE,4$$TR,"FLAGS"$ +$ID,2$$TR,"+H Hold"$ +$ID,2$Hold entry and do not delete it when cleared with $FG,5$CL$FG$ or when the l->max_entries is exceeded. Word wrap is a good one to hold. +$ID,-2$$TR,"+A Auxilliary String"$ +$ID,2$Most commands display a string. Some need other strings. A $FG,4$+A$FG$ means an auxilliary string is present. Links have $FG,4$+A$FG$ by default, so use a $FG,4$-A$FG$ if you wish the display string and the link string to be the same. +$ID,-2$$TR,"+TR Tree"$(obsolete) +$ID,2$* There is now a separate $FG,5$TR$FG$ command so this flag is obsolete. +* Make a tree branch. Usually this is placed on a text($FG,5$TX$FG$) entry. The tree extends from the start until another tree entry or when indentation has been expanded and reduced back to the starting value. +* A $FG,4$+C$FG$ flag on a tree will start it collapsed. +$ID,-2$$TR,"+PU PopUp"$ +$ID,2$A PopUp flag on a macro ($FG,5$MA$FG$) will cause the commands to run in a pop-up window. +$ID,-2$$TR,"+C Collapsed"$ +$ID,2$A collapsed flag on a tree $FG,5$TR$FG$ entry or a hide start $FG,5$HS$FG$ will cause it to start collapsed. A $FG,4$-C$FG$ flag will make it start open. +$ID,-2$$TR,"+X Exit"$ +$ID,2$* A exit flag will cause a macro to send an ESC before running(to exit the macro screen and return to the cmd prompt). Actually, the default has an exit flag set so you might add a $FG,4$-X$FG$ to turn-off ESC. +* If an entry is in the cmd prompt window, the $FG,4$+X$FG$ will cause a movement to the bottom of the window. +$ID,-2$$TR,"+Q Quit"$ +$ID,2$A quit flag is similar to a $FG,4$+X$FG$ except a CTRL-Q instead of an ESC to exit. +$ID,-2$$TR,"+PW Password"$ +$ID,2$A password flag on a data entry ($FG,5$DA$FG$) will cause text to be shown as '*'s. +$ID,-2$$TR,"+Z Zero"$ +$ID,2$A zero flag on a hex edit($FG,5$HX$FG$) entry will cause the offset from zero. A $FG,4$-X$FG$ will show the actual mem address. By default, $FG,5$HX$FG$ has the zero flag set. +$ID,-2$$TR,"+AL Alias"$ +$ID,2$An alias flag on a tree entry ($FG,4$+TR$FG$) will cause the text of the current entry the cursor is on to be copied to this entry. This creates something similar to a drop-down window, but it doesn't work well yet. +$ID,-2$$TR,"+RD Refresh Data"$ +$ID,2$The Refresh Data flag on a $FG,5$DA$FG$ or a $FG,5$CB$FG$ makes the value updated continuously. +$ID,-2$$ID,-2$$FE,5$ + +$FG,5$EXAMPLES: + +$FG$Press CTRL-T to see how the following were done. +$UL,1$Underlined$UL,0$ $IV,1$Inverted$IV,0$ $BK,1$Blinking$BK,0$ $SY,-3$super$SY,0$ $SY,0$$SY,3$sub$SY,0$ +$TX+SCX,"This is a big long scrolling message.",10$ + +$FG,5$Cursor Movements:$FG$ +$CM+LX,3,3$Cursor moved 3 rows down and to 3rd column from left. +$CM+RX,-40,3$Note mandatory comma after flags + +The following may be changed to modes instead of attributes with flags. + +$TX+CX,"This is centered"$ + +$TX+RX,"This is right justified"$ + \ No newline at end of file diff --git a/LT/DOC/Graphics.TXZ b/LT/DOC/Graphics.TXZ new file mode 100644 index 0000000..663993b --- /dev/null +++ b/LT/DOC/Graphics.TXZ @@ -0,0 +1,19 @@ +$WW,1$* $LK,"grbase","MN:grbase"$ is a bitmap for persistent data on the screen, not needing to be redrawn. You create an alias for this by using $LK,"GrNew","MN:GrNew"$() and work with that. This image is XORed on top of everything, so the colors you work with, you usually XOR with GR_WHITE to compensate. (White is usually the text background color. XORing twice gets you to what you started with.) It's slightly simpler using this bitmap then $LK,"grbase2","MN:grbase2"$, but it's not as good because changes aren't syncronized to the screen update and window borders are not enforced. See $LK,"::/LT/DEMO/Graphics/DotNet.CPZ","FI:::/LT/DEMO/Graphics/DotNet.CPZ"$ + +* $LK,"grbase2","MN:grbase2"$ is a bitmap for the screen, redrawn each refresh. You create an alias with $LK,"GrNew","MN:GrNew"$() and work with that. You must change the "$FG,2$Fs->update_window$FG$" variable to point to your update function and must draw everything in the window over and over again. "$FG,2$DrawIt()$FG$" is the preferred name for your update function, so everyone is consistent. See $LK,"::/LT/DEMO/Graphics/Box.CPZ","FI:::/LT/DEMO/Graphics/Box.CPZ"$ + +* Use $LK,"GrNew","MN:GrNew"$() to create your own structure for accessing the screen and pass it either $LK,"grbase","MN:grbase"$ or $LK,"grbase2","MN:grbase2"$. (Free it with $LK,"GrDel","MN:GrDel"$() when finished). A $LK,"GrBitMap","MN:GrBitMap"$ returned by $LK,"GrNew","MN:GrNew"$() stores the pen width and current color. It also can hold info necessary to rotate the whole image in 3D and shift it around. + +* Use $LK,"GrBitMapNew","MN:GrBitMapNew"$() to create a memory bitmap which can be used to work off-line and which can be $LK,"GrBlot","MN:GrBlot"$ed onto the screen. If you set $FG,2$brush$FG$ member of $FG,2$GrBitMap$FG$ to another $FG,2$GrBitMap$FG$, all the graphic routines will $LK,"GrBlot","MN:GrBlot"$() the brush instead of $LK,"GrPlot","MN:GrPlot"$(). See $LK,"::/LT/DEMO/Graphics/Blot.CPZ","FI:::/LT/DEMO/Graphics/Blot.CPZ"$. + +* There are various flavors of line and point plotting routines. $LK,"GrLine","MN:GrLine"$() and $LK,"GrPlot","MN:GrPlot"$() are the simplest. The others allow 3 dimensional graphics. + +* $LK,"GrTheta","MN:GrTheta"$() and $LK,"GrPhi","MN:GrPhi"$() create matrices for 3 dimensional rotations. You pass them an angle in radians. To make the matrices take effect, assign them to your graphic $LK,"GrBitMap","MN:GrBitMap"$'s "$FG,2$r$FG$" variable and set the $LK,"BMF_TRANSFORMATION","MN:BMF_TRANSFORMATION"$ flag. Transformations (rotations) can be combined using $LK,"GrMulMat","MN:GrMulMat"$(). See $LK,"::/LT/DEMO/Graphics/Box.CPZ","FI:::/LT/DEMO/Graphics/Box.CPZ"$. + +* You can rotate single points using $LK,"GrRotate","MN:GrRotate"$(). + +* You can shift the image around by changing a $LK,"GrBitMap","MN:GrBitMap"$'s "$FG,2$x$FG$","$FG,2$y$FG$" and "$FG,2$z$FG$" variables. + +* Use the resource editor, $FG,2$CTRL-R$FG$, to create a picture-like thing called a Graphic Element that can be plotted with $LK,"GrElemsPlot","MN:GrElemsPlot"$(). Use $FG,2$$$IB,"",1$$$FG$ in a source program to insert the address of picture #1. (After creating a picture with $FG,2$CTRL-R$FG$ in your source code, toggle to plain text with $FG,2$CTRL-T$FG$ and check it's number. Then, make an assignment to a pointer variable with $FG,2$$$IB,"",n$$$FG$ as the value. See $LK,"::/LT/DEMO/Graphics/Sprite1.CPZ","FI:::/LT/DEMO/Graphics/Sprite1.CPZ"$ and $LK,"::/LT/DEMO/Graphics/Sprite2.CPZ","FI:::/LT/DEMO/Graphics/Sprite2.CPZ"$.) The origin (zero point) for a graphic element is defined by the cursor location when you press $FG,2$CTRL-R$FG$. The "$FG,2$x$FG$", "$FG,2$y$FG$" and "$FG,2$z$FG$" values you pass to $LK,"GrElemsPlot","MN:GrElemsPlot"$() shift it around. You can edit a Graphic Element by clicking the cursor on it and pressing $FG,2$CTRL-R$FG$ again. + +* There is a mechanism built-in for generating motion based on differential equations, which allows real-world physics. You create an $LK,"Ode","MN:Ode"$ struct with $LK,"OdeNew","MN:OdeNew"$(), passing it the number of variables in the state vector. For real-world physics, you usually have 2 state variables for each dimension (for each mass) because motion is governed by f=ma which is a 2nd order equation. The two states are position and velocity and to solve these you need to supply the derivative of position and velocity. The derivative of position is usually simply the current velocity and the derivative of velocity is the acceleration (the sum of forces on a mass divided by mass). To help provide meaningful names for values in the state vector, you can create an $LK,"Order2D3","MN:Order2D3"$ pointer and point it to a mass in the state vector. Six elements in the state vector are required for each mass. See $LK,"::/LT/DEMO/Graphics/StarTrek2.CPZ","FI:::/LT/DEMO/Graphics/StarTrek2.CPZ"$. Or, see $LK,"::/LT/DEMO/Graphics/StarTrek3.CPZ","FI:::/LT/DEMO/Graphics/StarTrek3.CPZ"$ where an angle instead of a Z dimension is used. The values in the state don't have to be positions and velocities. diff --git a/LT/DOC/GuideLines.TXZ b/LT/DOC/GuideLines.TXZ new file mode 100644 index 0000000..a486e1f --- /dev/null +++ b/LT/DOC/GuideLines.TXZ @@ -0,0 +1,88 @@ +$WW,1$$FG,5$$TX+CX,"OS PROGRAMMING GUIDELINES:"$$FG$ +* Virtual mem is not used. The stack does not grow, so allocate enough when the task (process) is $LK,"Spawn","MN:Spawn"$ed and use the heap for most things. (The "heap" refers to $LK,"MAlloc","MN:MAlloc"$() and $LK,"Free","MN:Free"$().) +* I've tried to standardize names see $LK,"Naming convention","FF:::/LT/DOC/OSGlossary.GLZ,Naming convention"$ +* There are two modes of compiling $LK,"Static Compiled Mode","FF:::/LT/DOC/OSGlossary.GLZ,Static Compiled Mode"$ and $LK,"Dynamic Compiled Mode","FF:::/LT/DOC/OSGlossary.GLZ,Dynamic Compiled"$. Actual compilation is done in both--nothing is "interpreted". + +$FG,5$$TX+CX,"Departures from C/C++:"$$FG$ +* Built-in types include $FG,2$I0,I1,I2,I4,I8$FG$ for signed ints and $FG,2$U0,U1,U2,U4,U8$FG$ for unsigned ints and $FG,2$double$FG$. +* The "$FG,2$`$FG$" operator raises a base to a power. +* Operator Precidence + 1) $FG,2$`$FG$,$FG,2$>>$FG$,$FG,2$<<$FG$ + 2) $FG,2$*$FG$,$FG,2$/$FG$,$FG,2$%$FG$ + 3) $FG,2$&$FG$ + 4) $FG,2$|$FG$,$FG,2$^$FG$ + 5) $FG,2$+$FG$,$FG,2$-$FG$ + 6) $FG,2$==$FG$,$FG,2$!=$FG$,$FG,2$<$FG$,$FG,2$>$FG$,$FG,2$<=$FG$,$FG,2$>=$FG$ + 7) $FG,2$&&$FG$ + 8) $FG,2$||$FG$,$FG,2$^^$FG$ + 9) $FG,2$:$FG$,$FG,2$?$FG$ + 10) $FG,2$=$FG$,$FG,2$<<=$FG$,$FG,2$>>=$FG$,$FG,2$*=$FG$,$FG,2$/=$FG$,$FG,2$&=$FG$,$FG,2$|=$FG$,$FG,2$^=$FG$,$FG,2$+=$FG$,$FG,2$-=$FG$ +* No conditional compilation, except with the $FG,2$exe{}$FG$ feature. With this statement blk in your source code, you can place programs that insert text into the stream of code being compiled. See $LK,"exe {}","FF:::/LT/OSMain/END.CPZ,exe {"$ for an example where the date/time and compile-time prompting for configuration data is placed into a program. The $LK,"ExePrintF","MN:ExePrintF"$() and $LK,"ExePutS","MN:ExePutS"$() place text into a source program stream following the conclusion of the $FG,2$exe{}$FG$ blk. I do hope to add conditional compilation, but it's not a priority. +* No "$FG,2$#define$FG$" functions exist (I'm not a fan) +* Pointer arithmetic is not based on size of objects (I'd have no objections to this changing) +* No type-checking +* Variable parameter cnts ($FG,2$...$FG$) are accessed with "$FG,2$argc$FG$" and "$FG,2$argv[]$FG$" which are predefined invisible local variable. +* "$FG,2$cout$FG$" works with commas but not "$FG,2$<<$FG$" and and has no "$FG,2$endl$FG$" or other codes. Use "$FG,2$coutln$FG$" to print a carriage return after other stuff. An alias for "$FG,2$cout$FG$" is "$FG,2$dbgo$FG$" or "$FG,2$dbgoln$FG$" and is useful for debugging--I often place debug output all over the place and do a $LK,"Grep","MN:Grep"$() to locate them all. +* Type casting is done with "$FG,2$><(classname)$FG$" and is postfix. +* When dealing with function addresses, preceed the name with "$FG,2$&$FG$". This allows functions to be called like Pascal procedure with no "()" if there are no parameters or there are just default parameters. +* "$FG,2$$$$FG$" is an escape character. Two dollar signs signify an ordinary $$. See $LK,"::/LT/DOC/Dollar.TXZ","FI:::/LT/DOC/Dollar.TXZ"$. +* There is not a "$FG,2$struct$FG$" keyword, just "$FG,2$class$FG$". +* "$FG,2$union$FG$" is more like a class, so you don't referrence it with a "$FG,2$union$FG$" label after you define it. Some common unions are declared in $LK,"ADAMK.HPZ","MN:U2"$ for 1,2,4 and 8 byte objects. If you place a type in front of a union declaration, that is the type when used by itself. +* You cannot declare instances of "$FG,2$class$FG$es" or "$FG,2$unions$FG$" in the same statement where they are defined. +* $FG,2$class$FG$ member vars have two keywords for associating data with member vars -- "$FG,2$fmtstr$FG$" and "$FG,2$fmtdata$FG$". All compiler structures are saved and you can access the compiler's info about classes and variables. In the future, I hope to have arbitrary named data on class definitions. +* "$FG,2$static$FG$" variables in functions are not allowed and I have no plans for doing them--just use a global variable. +* See $LK,"::/LT/DEMO/Exceptions.CPZ","FI:::/LT/DEMO/Exceptions.CPZ"$. "$FG,2$try{} catch{}$FG$ and $FG,2$throw$FG$" are different from C++. "$FG,2$throw$FG$" is a function with variable ("$FG,2$...$FG$") parameters. The values passed in "$FG,2$throw()$FG$" can be accessed from within a "$FG,2$catch{}$FG$" using the "$FG,2$Fs->except_argc$FG$" and "$FG,2$Fs->except_argv[]$FG$" variables. Within a "$FG,2$catch {}$FG$" blk, set the var "$FG,2$Fs->catch_except$FG$" to "$FG,2$TRUE$FG$" if you want to terminate the search for a handler. By convention, the first parameter of $FG,2$except_argv[]$FG$ specifies the exception type number. A list of assigned exception types can be found at $LK,"EXCEPT_LOCAL","MN:EXCEPT_LOCAL"$. For a handler that will catch all excepts, you can use $LK,"CatchAll","MN:CatchAll"$(). +* A function is available similar to "$FG,2$sizeof$FG$" which provides the offset of a member of a class. It's called "$FG,2$offset()$FG$". You place the class name and member inside as in "$FG,2$offset(classname.membername)$FG$". It has nothing to do with 16-bit code. $FG,2$sizeof()$FG$ cannot be applied to variables, just classes. Also, both $FG,2$sizeof()$FG$ and $FG,2$offset()$FG$ only accept one level of member variables. That is you cannot do $FG,2$sizeof(classname.membername.submembername)$FG$.$FG$ +* There is a function called $LK,"MSize","MN:MSize"$() which gives the size of an object allocated off the heap. For larger size allocations, the system rounds-up to a power of two, so $FG,2$MSize()$FG$ lets you know the real size. +* You can $LK,"Free","MN:Free"$() a $FG,2$NULL$FG$ pointer. Useful variants of $LK,"MAlloc","MN:MAlloc"$() can be found $LK,"Here","MN:MAllocZ"$. Each task has a heap and you can $FG,2$MAlloc$FG$ and $FG,2$Free$FG$ off of other task's heaps. + +$FG,5$$TX+CX,"PrintF Family"$$FG$ + +$LK,"MSPrintF","MN:MSPrintF"$() is like $LK,"SPrintF","MN:SPrintF"$() but it returns a $LK,"MAlloc","MN:MAlloc"$ated string. It is vary handy because you don't have to worry about overflow. + +$LK,"Auto","MN:Auto"$(I1 *src,...) and text to the current task's input buffer. +$LK,"AutoString","MN:AutoString"$(I1 *src,...) sends text of an $LK,"AutoFile","FF:::/LT/DOC/OSGlossary.GLZ,AutoFile"$ to the keyboard stream of the current TASK but can also do mouse commands. + +$LK,"XTalk","MN:XTalk"$(TssStruct *tss,I1 *src,...) and text to another task's input buffer. +$LK,"XTalkString","MN:XTalkString"$(TssStruct *tss,I1 *src,...) sends text of an $LK,"AutoFile","FF:::/LT/DOC/OSGlossary.GLZ,AutoFile"$ to the keyboard stream of another TASK but can also do mouse commands. + + +$LK,"LtfPutS","MN:LtfPutS"$(Ltf *l,I1 *src) and $LK,"LtfPrintF","MN:LtfPrintF"$(Ltf *l,I1 *src,...) send text to a linked text file. You can buffer to a Ltf and save it, providing the functionality of $FG,2$fprintf$FG$. See $LK,"::/LT/DEMO/FPrintF.CPZ","FI:::/LT/DEMO/FPrintF.CPZ"$. + +$LK,"Adam","MN:Adam"$(I1 *src,...) send text to the adam task to be compiled and run. +$LK,"AdamLog","MN:AdamLog"$(I1 *src,...) and $LK,"AdamErr","MN:AdamErr"$(I1 *src,...) send text to the adam task to be displayed. + + +$LK,"Lpt1PrintF","MN:Lpt1PrintF"$(I1 *src,...) send text to the printer port. + +$LK,"ExePrintF","MN:ExePrintF"$(I1 *src,...) and $LK,"ExePutS","MN:ExePutS"$(I1 *src) send text to the stream of code being compiled and must reside in a $FG,2$exe{}$FG$ blk. + +$LK,"CommPrintF","MN:CommPrintF"$(U4 port,I1 *src,...) sends text to the comm ports. + +$BK,1$Note:$BK,0$ If no $FG,2$PutS$FG$ variant is available, you can use $FG,2$PrintF("%s",src)$FG$. + +The $LK,"PrintF","MN:PrintF"$() family supports extended format codes. + * $FG,2$"%S"$FG$ will print a systext entry. + * $FG,2$"%F"$FG$ will print a text file. + * $FG,2$"t"$FG$ is a flag which will truncate to field width. + * $FG,2$"%P"$FG$ will display a PSECT expression which is good for pointers or addresses. + * $FG,2$"%T"$FG$ and $FG,2$"%D"$FG$ will display a date or time and the format is selected with a subcode, entered after a "$FG,2$h$FG$". Example: "$FG,2$%20h1D$FG$" uses date format code "1". See $LK,"MSPrintFDate","FF:::/LT/OSMain/SPRINTF.CPZ,MSPrintFDate"$() and $LK,"MSPrintFTime","FF:::/LT/OSMain/SPRINTF.CPZ,MSPrintFTime"$() for subcodes. + * $FG,2$"%z"$FG$ will display a sub entry of an enumerated list of text entries. It calls $LK+S,"PointAtListEntry","MN:PointAtListEntry"$(). + * $FG,2$"%Z"$FG$ will display a SysText sub entry. + * $FG,2$"%Q"$FG$ will convert "\" to "\\" and quote to backslash quote. (For use in creating strings in strings.) + + + +$FG,5$$TX+CX,"Hash symbol tables:"$$FG$ + +* See $LK,"::/LT/UTILS/HASHUTIL.CPZ","FI:::/LT/UTILS/HASHUTIL.CPZ"$ for examples of how the hash tables are set-up. Basically, symbols are placed into hash tables and child process hash tables are chained to parents. This provides scopes for variables and functions. +* "$FG,2$adam_tss->hash_table$FG$" holds the C/C++ symbols loaded in on start-up. +* "$FG,2$Fs->hash_table$FG$" holds user C+ symbols and if a symbol is not found, it checks parents. When a duplicate symbol is added to the table, it overshadows the previous symbol. When developing software, typically you include the file at the command prompt, make changes and reinclude it. Old symbols are overshadowed but they are still there. Periodically, kill the TASK and start fresh when mem is low. If you wish your applications to free themselves instead of staying in mem, spawn or $LK,"PopUp","MN:PopUp"$() a task to run the application and kill it when it's done. +* To display the contents of a hash table, use the $LK,"HashRep","MN:HashRep"$() routine or the varients. + +$FG,5$$TX+CX,"Assembly Language Concerns:"$$FG$ + +* Segment registers except $FG,2$FS$FG$ are set to $FG,2$0x00000000$FG$ as a base. +* $FG,2$FS$FG$ must always point to the per-TASK's structure. See $LK,"C+","FF:::/LT/OSMain/ADAMK.HPZ,TssStruct:2"$$LK "C++ task struct" "FF:::/LT/OSMain/ADAMK.HPZ,TssStruct"$ and $LK,"Asm","FF:::/LT/OSMain/OSINC.ASZ,TSS_EIP"$$LK "ASM task struct" "FF:::/LT/OSMain/OSINC.ASZ,TSS_BACK_LINK"$. +* Don't change the segment registers unless interrupts are off. +* When interacting with compiled code, preserve $FG,2$EBP, ESI, EDI$FG$ because the compiler uses these for register vars. You are free to trash $FG,2$EAX, EBX, ECX, EDX$FG$. diff --git a/LT/DOC/Help.TXZ b/LT/DOC/Help.TXZ new file mode 100644 index 0000000..92d7bf5 --- /dev/null +++ b/LT/DOC/Help.TXZ @@ -0,0 +1,78 @@ +$WW+H,1$Left-click on the word "$FG,2$MENU$FG$" in the window title bar to pull-up the menu. Underlined text is usually a link. Left click with the mouse or press SPACE when the cursor is on top of them to edit/view them. Right click or press $FG,2$ENTER$FG$ to $FG,2$#include$FG$ them, often causing them to execute. + $FG,9$ESC$FG$ Exits and saves + $FG,9$CTRL Q$FG$ Aborts + $FG,9$Window's Key$FG$ Views the Menu/Help/Macro area +Double mouse clicks send $FG,2$ESC$FG$ or $FG,2$CTRLQ$FG$. + +Remember to terminate commands with a semicolon. + +$TR,"USER HELP"$ +$ID,2$ +See $LK,"::/LT/DOC/OSGlossary.GLZ","FL:::/LT/DOC/OSGlossary.GLZ,1"$ for a glossary. + +$TR,"DOLLAR SIGN COMMANDS"$ +$ID,2$$LK,"Dollar Sign Commands","FI:::/LT/DOC/Dollar.TXZ"$ are rich-text commands. The editor, compiler, assembler and operating system are seamlessly equiped to handle LoseThos rich text. Commands like $LK,"Dir","MN:Dir"$() and $LK,"Grep","MN:Grep"$() can output links to the command line. + +$ID,-2$$TR,"COMMAND PROMPT"$ +$ID,2$The LoseThos command line interface is based on C/C++. Explore the ".CPZ" files or $MA+A-X+PU,"Click Here","HFunsRep;View;"$ to learn which commands are available. A command which takes no parameters may be executed by typing the name and a semicolon. Commands with parameters require placing the parameter in parentheses like a function call. + + +$MA,"Dir(\"*\");"$ will list files in the current directory. + +$MA,"Dir;"$ uses default of "*". + +$MA,"Cd(\"::/LT/APPS\");"$ will change directories +Directories are referenced with "/" not "\". The Boot drive is referred to with "$FG,2$::$FG$". Other drives are referred to by a letter and a colon. Your user account directory is referred to with "$FG,2$HOME$FG$". + +If a file is not found in one directory, all it's parents are searched. + +$FG,9$Edit("FILENAME.TXZ");$FG$ Invokes the editor. See $LK,"Editor cmds","::/LT/ADAM/EDIT.MUZ"$. Note that editor commands work practically everywhere--like at the command prompt or within help. + +$ID,-2$$TR,"BURNING CD-ROMs/DVDs"$ +$ID,2$0) Prepare a partition (drive) with the files you wish to burn. +1) Use $LK+S,"CreateCDFile","MN:CreateCDFile"$() to make an ISO image file of a partition. +2) Use $LK+S,"WriteCDImage","MN:WriteCDImage"$() to burn an ISO file onto a CD or DVD. + +Note: You can create a $LK,"File Partition","FF:::/LT/DOC/OSGlossary.GLZ,File Partition"$ on an ordinary partition, copy files into it, create an image and burn it. +$ID,-2$ +See $LK+S,"::/LT/DOC/Quirks.TXZ","FI:::/LT/DOC/Quirks.TXZ"$ for things to watch for. + +$ID,-2$$TR,"ADMIN HELP"$ +$ID,2$ +$TR,"ADDING DRIVES"$ +$ID,2$Use $LK,"AddDrives","MN:AddDrives"$() to enable disk drives. + +See $LK+S,"File Partition","FF:::/LT/DOC/OSGlossary.GLZ,File Partition"$ for a definition. +$ID,-2$ +See $LK,"::/LT/DOC/Install.TXZ","FI:::/LT/DOC/Install.TXZ"$ for details on installing to a hard drive. + +See $LK-A+S,"::/LT/OSMain/ADAMK.CPZ"$ for the LoseThos equivalent of the AUTOEXEC.BAT. + +$TR,"ACCOUNTS"$ +$ID,2$ +You can add and remove accounts by making or removing directories in the $FG,2$::/LT/ACCOUNTS$FG$ directory. You'll have to copy start-up files into them. + +See $LK-A,"HOME/USER.CPZ"$ for the user start-up file. + +See $LK-A,"HOME/USER.MUZ"$ for a personalizable menu/macro area which can be viewed at the command line with the windows key or by clicking "$FG,2$MENU$FG$" in the upper left border area of a window. + +See $LK-A,"HOME/FAVOR.MUZ"$ for a handy "favorites" file which can be reached by pressing $FG,2$CTRL-SHIFT-F$FG$, pretty-much anywhere. Users can place links and todo lists or any text within this. + +See $LK-A,"HOME/ADAM3.CPZ"$ for the user files that get loaded into the adam task. These are only loaded once. + +See $LK-A,"HOME/SYSTEM.CPZ"$ for the start-up file used when a $LK,"System","MN:System"$() command is used. + +See $LK-A,"HOME/SERVANT.CPZ"$ for the start-up file other commands which $LK,"Spawn","MN:Spawn"$() tasks. + +See $LK-A,"HOME/FAULT.CPZ"$ for a start-up file called when a fault occurs. When debugging you might place data display commands here. + +$ID,-2$ +$ID,-2$$TR,"DEVELOPER HELP"$ +$ID,2$ +See $LK-A+S,"::/LT/DOC/GuideLines.TXZ"$ for some programming guidelines. + +See $LK+S,"::/LT/DOC/Graphics.TXZ","FI:::/LT/DOC/Graphics.TXZ"$ for details on graphics programming. +$ID,-2$ +See $BK,1$$LK+S,"::/LT/DOC/Mysteries.TXZ","FI:::/LT/DOC/Mysteries.TXZ"$$BK,0$ for mysteries explained. +See $BK,1$$LK+S,"::/LT/DOC/News.TXZ","FL:::/LT/DOC/News.TXZ,1"$$BK,0$ for the latest news. + diff --git a/LT/DOC/Install.TXZ b/LT/DOC/Install.TXZ new file mode 100644 index 0000000..21789b9 --- /dev/null +++ b/LT/DOC/Install.TXZ @@ -0,0 +1,31 @@ +$WW,1$$FG,5$$TX+CX,"Preinstallation Notes"$$FG$ + +1) The CD-ROM INSTALL or UPGRADE boot options will automate much of this. + +2) Make partitions with Windows or Linux. You used to do it with FDISK, now you do it during installation. + +3) Only LBA 28 bit disk access is supported, so drives of size 120Gig are the limit. Ancient drives with CHS are not supported. + +4) Test your hard drive by adding it with $LK,"AddDrives","MN:AddDrives"$(). Typically, hard drives are "ATA" not "ATAPI", and are found at port address 0x1F0, unit 0. When AddDrives() displays defined partitions, make sure your partition shows-up. Note the drive letter, though you can move them around. $LK,"PartitionRep","MN:PartitionRep"$() will give a report. + +5) $BK,1$WARNING!!!$BK,0$ Each partition has one boot record, so do not attempt to boot both LoseThos and some other operating system from the same partition. + +6) More than one LoseThos partition on a hard drive is very useful for development work (I have three). You might accidentally change files rendering your partition unbootable, needing to resort to a back-up to fix it. A floppy or CD will work. + +$FG,5$$TX+CX,"Installing to a hard drive"$$FG$ + +1) Create a FAT32 partition or two (highly recommended) on your hard drive. You'll need Linux and Linux's LILO present on the hard drive as well. I have Windows, Linux and LoseThos all on my hard drive. (Install Windows before Linux.) + +2) Boot to a LoseThos floppy or CD and add your hard disk with $LK,"AddDrives","MN:AddDrives"$(). Note the partition (drive) letter of the partition you wish to boot from in the future. + +3) Use $LK,"Format","MN:Format"$() to make it a LoseThos partition. + +4) Copy the "/LT" directory to the partition with $LK,"CopyTree","MN:CopyTree"$("T:/LT","D:/LT"); where "T" is the source drive letter and "D" is the destination. + +5) Type "$LK,"InstallBoot","MN:InstallBoot"$('?');" where the question is the drive. Enter the requested prompts during recompilation, making sure to add your hard drive (again) so it will be present when you boot. + +6) Boot to Linux and modify LILO. Go to the "/etc" directory, edit "lilo.conf" and run "lilo". You'll need to know the Linux name for the LoseThos partition--something like "hda3" or whatever. + +$FG,5$$TX+CX,"Postinstallation Notes"$$FG$ + +1) Once installed, you can recompile the hard drive OSmain with "$LK,"InstallBoot","MN:InstallBoot"$('D');" or whatever drive. diff --git a/LT/DOC/Mysteries.TXZ b/LT/DOC/Mysteries.TXZ new file mode 100644 index 0000000..8b63f7f --- /dev/null +++ b/LT/DOC/Mysteries.TXZ @@ -0,0 +1,31 @@ +$WW,1$$FG,5$This is to clearify how several mysterious things happen in this operating system.$FG$ + +1) There are symbol(hash) tables maintained by each task. When a symbol is not found, the parent task's symbol table is checked. All process chain back to the adam process. + +2) Binary files have export symbols which are loaded into tables. The operating system OSmain has such a table. In addition, some map files are processed to provide more information on symbols--source file links. This is how the $LK,"Man","MN:Man"$() page feature works. + +3) The word "$FG,2$public$FG$" does very little except allow the $LK,"HashRep","MN:HashRep"$() program varients to exclude meaningless symbols. If you wish a full report of public and nonpublic symbols $MA+A-X+PU,"Click Here","LtfSetMax(1000000);HAllRep;View;\r"$. + +4) When compilation takes place "dynamically", the structures used by the compiler stick around. Data on classes can be accessed. See $LK,"ClassRep","MN:ClassRep"$() or $LK,"TssRep","MN:TssRep"$(). + +5) When the joystick is calibrated, a file is created. To recalibrate the joystick, you must del the file "$FG,2$::/LT/ADAM/JOY.DTZ$FG$". + +6) Filenames ending in '$FG,2$Z$FG$' are automatically compressed and uncompressed when writing to disk. File size in directory listing is the compressed size. You can view uncompressed size with $LK,"Dir","MN:Dir"$("*",TRUE); + +7) Some memory objects are allocated when needed and will decrease the available memory displayed. A task keeps memory objects smaller than a couple blocks in it's own separate heap when freed and these are not counted in the available system free memory, though they are free. They get returned to the system when the task is killed. To get a sense of this, compile the operating system and see the amount of memory used. Then, compile it again and far less will be allocated. This is because it is reusing the small chunks. + +8) The cursor location is stored as an $FG,2$ASCII 5$FG$ in files. $FG,2$ASCII 31$FG$ is used for $FG,2$SHIFT-SPACE$FG$, a character which does not get converted to tabs by $LK,"S2T","MN:S2T"$(). + +9) Binary data is stored beyond the terminating $FG,2$NULL$FG$ in text files. Map files store debug source lines and other files store pictures. + +10) Pictures are stored as line coordinates, instead of bit maps. If you have a drawing with, like 10 lines, 40 numbers are stored, compared to, like 200x200 bytes, for a bitmap. Therefore, graphics don't take much room. If the number of lines is large, however, it'd be more efficient to store a bitmap, but this is not yet fully supported. + +11) If you change code in the $FG,2$/LT/ADAM$FG$ or $FG,2$/LT/UTILS$FG$ directory, you don't need to recompile, you just need to reboot because those directories get recompiled when you boot. It uses dynamic compilation. There is no "$FG,2$.BIN$FG$" file for dynamic compilation. + +12) If you find crappy code, it might be from before the compiler had features like the type cast "$FG,2$><$FG$$FG$" statement. Or, it might have been something done hurriedly just to get results. Some things I dive into without planning, like the dollar sign commands. After, the idea matures, I cleaned-it-up. + +13) The hits on hash entries reflect times they have been searched for and found. The $LK,"FindExtern","MN:FindExtern"$() function is used to search the hash tables for functions which weren't in existence yet. The $LK,"DrawBorder","MN:DrawBorder"$() function, for example, is searched for every time the screen is updated, therefore it has lots of hits in a hash table report. + +14) If a file is not found, the parent directories are searched for a file of the same name. + +15) LoseThos partitions will appear as FAT32 to other operating systems, but will not work. Do not access them from other operating systems. This is to fool my bootloader. diff --git a/LT/DOC/News.TXZ b/LT/DOC/News.TXZ new file mode 100644 index 0000000..9a0c624 --- /dev/null +++ b/LT/DOC/News.TXZ @@ -0,0 +1,133 @@ +$WW,1$ + +$IV,1$----07/18/06 10:25:00----$IV,0$ +* Unmask IRQ's during mouse polling. Might have side-effects. + +$IV,1$----07/16/06 11:44:46----$IV,0$ +* Changed "Message" to "Msg" +* Expanded serial communication +* Cleaned-up externs in Adam directory + +$IV,1$----07/13/06 09:22:24----$IV,0$ +* Fixed some bugs in disassembler. + +$IV,1$----07/12/06 16:47:29----$IV,0$ +* Modified FlagsStruct converting from 128-bit to 64-bit. +* Fixed bad default flag in $LK,"FileOccurrences","MN:FileOccurrences"$(). +* Fixed bug in FindFile for CD-ROM. Cd() result was bad. + +$IV,1$----07/11/06 17:51:02----$IV,0$ +* Probably fixed problem with SHIFT or CTRL keys getting locked on. + +$IV,1$----07/11/06 09:02:06----$IV,0$ +* Fixed bugs with use of HOME directory in Cd() and other spots. Wasn't changing partitions to the home drive. +* Moved $LK,"FindFiles","MN:FindFiles"$() to $LK,"SysFindFiles","MN:SysFindFiles"$() and enveloped it so it now supports specifying directories. + +$IV,1$----07/11/06 04:43:20----$IV,0$ +* Changed $LK,"Dir","MN:Dir"$() listing--shortened date/time, sorts by filename extension. +* Moved stuff around in files + +$IV,1$----07/10/06 10:46:36----$IV,0$ +* Combined Ltf flags and flags2 + +$IV,1$----07/10/06 04:24:01----$IV,0$ +* sped-up screen update +* Enhanced $LK,"ProfRep","MN:ProfRep"$(); +* Increased RAM disk size from 2880 blks to 8192 blks. This is the 'B' drive. + +$IV,1$----07/08/06 05:27:06----$IV,0$ +* Changed music_tempo. It is now a recripocal and a different scale. +$IV,1$ +----07/08/06 00:07:23----$IV,0$ +* Changed eigth note tripolets in $LK,"Play","MN:Play"$() from 'S' to "et". + +$IV,1$----07/06/06 23:33:18----$IV,0$ +* Fixed $LK,"Edit","MN:Edit"$() menu so that it is active when you click commands. +* Fixed $LK,"WriteCdImage","MN:WriteCdImage"$() to use proper path in filename. + +$IV,1$----07/03/06 23:53:32----$IV,0$ +* Converted some compression routines to asm to speed things up. + +$IV,1$----07/01/06 22:30:45----$IV,0$ +* Improved $LK,"::/LT/DEMO/WinMgr2.CPZ","FI:::/LT/DEMO/WinMgr2.CPZ"$. You really should try it. It demo's the Ode feature. + +$IV,1$----07/01/06 03:55:58----$IV,0$ +* Sped-up compiler$IV,1$ + +----06/30/06 21:55:59----$IV,0$ +* Fixed some memory leaks in compiler. +* Changed syntax for type casting. Now, requires parenthesis. It's designated with "><(class *)" and it is post-fix. +$IV,1$----06/30/06 16:40:43----$IV,0$ +* Fixed compiler bugs + +$IV,1$----06/29/06 03:32:32----$IV,0$ +* Added $LK,"CurDir","MN:CurDir"$() which returns both drive and directory. +* Fixed $LK,"CopyTree","MN:CopyTree"$() +$IV,1$ +----06/28/06 11:13:23----$IV,0$ +* Made major improvement in screen update speed. +* Sped-up compile time a little + +$IV,1$----06/28/06 05:30:34----$IV,0$ +* Added significant compiler optimization +* Probably fixed bug on Install option for distributed CD-ROMs (fixed SysGetChar) +$IV,1$ +----06/27/06 23:32:19----$IV,0$ +* Added minor compiler optimization + +$IV,1$----06/27/06 21:20:14----$IV,0$ +* Fixed bug with F2 macro +* Added minor compiler optimization + +$IV,1$----06/27/06 03:50:53----$IV,0$ +* Added compiled_lines to wallpaper + +$IV,1$----06/26/06 22:43:23----$IV,0$ +* Fixed $LK,"GrCircle","MN:GrCircle"$() and $LK,"Circle","MN:Circle"$(); +* Added minor compiler optimization. +* Fixed bug in editor involving cursor-up on nontext widgets. +* Fixed lacking feature with CTRL-R, adding "END" for text insert points. + +$IV,1$ +----06/25/06 19:13:38----$IV,0$ +* Altered the way string constants and Pictures are stored when compiled so that it looks like it is on the heap. This might fix lots of bugs. +* Added $LK,"LtfPutGrElem","MN:LtfPutGrElem"$(); +See $LK,"::/LT/DEMO/Graphics/Sprite3.CPZ","FI:::/LT/DEMO/Graphics/Sprite3.CPZ"$. +$IV,1$ +----06/24/06 18:20:28----$IV,0$ +* fixed missed optimization in compiler--code is smaller and faster + +$IV,1$----06/20/06 19:36:07----$IV,0$ +* $BK,1$WARNING$BK,0$: swapped keyboard scan-code flags SCf_KEY_UP and SCf_E0_PREFIX. If you have a EditPlugIn, you might need to change it. See $LK,"My_EditPlugIns","FF:::/LT/ACCOUNTS/ADAM3.CPZ,My_EditPlugIns"$. +* Added numeric keypad support +* Added HOME/END keys to editor + $IV,1$ +----06/20/06 13:00:25----$IV,0$ +* $BK,1$WARNING$BK,0$: renamed "trap" to "except" +* renamed "heap_cache" stuff to "heap_hash". + +$IV,1$----06/14/06 21:01:01----$IV,0$ +* Fixed a word-wrap bug, pretty-much. +$IV,1$ +----06/12/06 06:02:07----$IV,0$ +* Fixed bug on cursor movement in forms. +* Added $LK,"::/LT/DEMO/WinMgr2.CPZ","FI:::/LT/DEMO/WinMgr2.CPZ"$ + +$IV,1$----06/10/06 15:29:42----$IV,0$ +* worked on mouse and mouse wheel +* modified $LK,"Grep","MN:Grep"$() to return match count. +* added $LK,"FileOccurrences","MN:FileOccurrences"$() +$IV,1$ +----06/07/06 15:08:58----$IV,0$ +* Implemented Scroll-Lock +* Sets keyboard LEDs +* Added BSplines + +$IV,1$----06/05/06 12:47:59----$IV,0$ +* implemented returns out of catch{} +$IV,1$----06/05/06 08:51:40----$IV,0$ +* fixed bug in exception handling and implenmented returns out of try{} but not catch {} statements. +$IV,1$----06/04/06 07:39:40----$IV,0$ +* Added array nd structure initialization for global variables +$IV,1$----05/20/06 04:20:38----$IV,0$ +* Added F4 and SHIFT-F4 for picking directories and files. \ No newline at end of file diff --git a/LT/DOC/OSGlossary.GLZ b/LT/DOC/OSGlossary.GLZ new file mode 100644 index 0000000..e63cb50 --- /dev/null +++ b/LT/DOC/OSGlossary.GLZ @@ -0,0 +1,169 @@ +$WW,1$$TR,"Task"$ +$ID,2$A "task" is the Intel term for a "process". Each task has a $LK+S,"TssStruct","MN:TssStruct"$, the name derived from "Task State Something". The "$FG,2$Fs$FG$" segment register is maintained pointing to the current TssStruct. +$ID,-2$$TR,"Adam Task"$ +$ID,2$This is Adam, as in Adam and Eve, the parent of all tasks. This task is created at start-up and appears in the small window at the top beneath the user windows. On it's heap are all mem objects which are system wide. When created, it runs the file $LK,"::/LT/OSMain/ADAMK.CPZ","FI:::/LT/OSMain/ADAMK.CPZ"$$ER+A,""$ Normally, ADAMK.CPZ ends by $FG,2$#include$FG$ $LK,"::/LT/ADAM/ADAM2.CPZ","FI:::/LT/ADAM/ADAM2.CPZ"$ where the remainder of the operating system is "$FG,2$#include$FG$d". When start-up is finished, the adam task enters a server mode where it accepts requests from other tasks. The $LK,"Adam","MN:Adam"$("") routine will cause the adam task to compile and run text source code. "$FG,2$#include$FG$" statements can be sent to the $LK,"Adam","MN:Adam"$("") routine, creating system-wide code and data which don't disappear when any particular task ends. +$ID,-2$$TR,"Parent/Child Task"$ +$ID,2$Often a task will $LK,"Spawn","MN:Spawn"$() or $LK,"PopUp","MN:PopUp"$() a task as a helper. The helper is known as a Child Task, though you can $FG,2$Spawn$FG$ a task and assign it a different parent... like Adam. Links are kept as to who Spawned what so that when one task is $LK,"Kill","MN:Kill"$()ed the helper tasks disappear, too. You see a report on current system tasks with $LK,"TaskRep","MN:TaskRep"$(). There is just one possible window per task, so child tasks are needed. +$ID,-2$$TR,"C+"$ +$ID,2$The language used by LoseThos is more than "$FG,2$C$FG$" and less than "$FG,2$C++$FG$", so it's just "$FG,2$C+$FG$". +$ID,-2$$TR,"Static Compiled Mode"$ +$ID,2$I coined this term to refer to conventional compilation mode, but it is not the preferred mode for this operating system and is discouraged. "$FG,2$.BI?$FG$" files are created directly, skipping "$FG,2$.OBJ$FG$" files. In this mode, code and data are contiguous. After compiling, you do a $LK,"Load","MN:Load"$() cmd which is available from right-clicking on a link (like from $LK,"Dir","MN:Dir"$()). There is no "$FG,2$main()$FG$" routine. Instead, statements outside functions are automatically executed upon loading. There is no way to unload except by killing the task. To invoke $FG,2$Static Compiled Mode$FG$, use the $LK,"CompileFile","MN:CompileFile"$() routine or right-click on a link. The OSmain and compiler are made in static compiled mode and stored in "$FG,2$BOOT.BIC$FG$" and "$FG,2$CMP.BIZ$FG$". +$ID,-2$$TR,"Dynamic Compiled Mode"$ +$ID,2$I coined this term to refer to the mode when the compiler allocates objects(code and data) from the heap, noncontiguously. This mode is used during command-line operations. When you "$FG,2$#include$FG$" a file, it is compiled function by function and objects are placed all over in mem. The $LK,"ExecuteFile","MN:ExecuteFile"$() routine is the same as "$FG,2$#include$FG$" but can be placed in programs. $LK,"ExecuteString","MN:ExecuteString"$() routine will compile and run a string. "$FG,2$asm{}$FG$" cmds are not allowed in Dynamic mode. +$ID,-2$$TR,"Compiler Intermediate Code"$ +$ID,2$The compiler generates instructions one step before making actual assembly(machine) language instructions. This code is reverse polish in nature and can be viewed with $LK,"PTrace","MN:PTrace"$() or $LK,"OTrace","MN:OTrace"$(). The compiler does not "interpret" code, except in the process of optimization. The assembly language can be viewed when it is compiled with the $LK,"CTrace","MN:CTrace"$() routine, or afterward with $LK,"Dasm","MN:Dasm"$(). +$ID,-2$$TR,"AutoFile"$ +$ID,2$A $FG,2$C+$FG$ script who's stdout goes to a task's input buffer. (A $FG,2$PrintF$FG$ will result in characters going to a parent task as though the user typed it.) $LK,"Msg","MN:Msg"$() can be included in an autofile to send mouse or other commands. While an autofile is running, the normal input gets diverted to the autofile task and can be filtered and sent back to the parent task. Unless you are driving functions which prompt for data, you can probably use an $FG,2$#include$FG$ file in place of an $FG,2$AutoFile$FG$. See $LK,"::/LT/DEMO/AutoFile/Demo1.AUZ","FI:::/LT/DEMO/AutoFile/Demo1.AUZ"$. Note: $LK,"Auto","MN:Auto"$() is a simple routine which call $FG,2$PutS$FG$ from within the helper(child) task to send a string to the parent's input stream. It differs from $LK,"AutoString","MN:AutoString"$(). You'll probably use $LK,"Auto","MN:Auto"$() a lot but not $LK,"AutoString","MN:AutoString"$(). With $LK,"Auto","MN:Auto"$() you can place answers to the prompts for recompiling the OSMain with $LK,"InstallBoot","MN:InstallBoot"$(). +$ID,-2$$TR,"File Partition"$ +$ID,2$There are physical partitions on disks and then there are virtual partitions which are stored in files on other partitions. This is a LoseThos feature. You can create a file partition using AddDrives or at the prompt when you recompile the operating system. If you answer "Yes" to the prompt on reformating, this partition will be reformatted each time you use it for the first time after booting. The original purpose of file partitions was as a holding area to collect files to write to a CD-ROM. Use the file partition's letter when calling $LK,"CreateCDFile","MN:CreateCDFile"$(). +$ID,-2$$TR,"GrElem (Graphic Element)"$ +$ID,2$A graphic element is a line or point or poly-line or whatever, created with $FG,2$CTRL-R$FG$. Several graphic elements are clustered by $FG,2$CTRL-R$FG$. +$ID,-2$$TR,"SysText"$ +$ID,2$To allow different languages, LoseThos uses strings to identify actual strings to be displayed. This is basically a level of indirection. Support for lists of strings is also provided, but it's not especially effecient. See $LK,"SysText","MN:SysText"$(), $LK,"LoadStr","MN:LoadStr"$(), $LK,"LoadList","MN:LoadList"$(), $LK,"MatchSysTextEntry","MN:MatchSysTextEntry"$() and $LK,"SysTextSub","MN:SysTextSub"$(). $LK,"PrintF","MN:PrintF"$() also has some special codes to support SysText. +$ID,-2$$TR,"Hard-coded"$ +$ID,2$When you use a raw number instead of a $FG,2$#define$FG$'ed label, that's called "hard-coding". Use labels whenever possible or your programs will fail if numbers change when the operating system is updated. +$ID,-2$ + +$FG,5$$TX+CX,"FileNames"$$FG$ + +$FG,5$Wildcards$FG$ + FileName wild card matching allows "$FG,2$*$FG$" to match sequences of arbitrary characters and "$FG,2$?$FG$" for a single arbitrary character. For some commands, you can enter multiple specifiers separated by "$FG,2$;$FG$". You don't need to, but can, use "$FG,2$*.*$FG$" instead of "$FG,2$*$FG$" for filenames. You can specify names to exclude by using a "$FG,2$~$FG$". + +$FG,5$*.??Z$FG$ + Automatically compressed and uncompresses files when read and written. +$FG,5$$FG,5$*.??C$FG$ + Contiguous files--NOT compressed. +$FG,5$*.TX?$FG$ + Text Files +$FG,5$*.GL?$FG$ + Glossary Files--WordStat will show a "$FG,2$#$FG$" next to words which are defined as anchors within glossary files. +$FG,5$*.CP?$FG$ + C+ source files. The default C+ compiler type is "$FG,2$.CPZ$FG$". +$FG,5$*.HP?$FG$ + C+ source header files. +$FG,5$*.AS?$FG$ + Assembly source files. The default assembler type is "$FG,2$.ASZ$FG$". +$FG,5$*.MU?$FG$ + Menu/Help/Macro files +$FG,5$*.MP?$FG$ + Compiler "map" files +$FG,5$*.BI?$FG$ + Binary executable files, created by $LK,"CompileFile","MN:CompileFile"$() and read by $LK,"Load","MN:Load"$(). +$FG,5$*.DT?$FG$ + Data files +$FG,5$*.DVC$FG$ + File Partition Drive (A drive stored in a file on another partition) +$FG,5$$FG,5$*.IS?$FG$ + CD-ROM image file--ISO9660. To burn on other operating systems, rename "$FG,2$.ISO$FG$" +$FG,5$*.AUZ$FG$ + "AutoFile" Basically a C+ program who's stdout goes to the input of a task when $LK,"AutoFile","MN:AutoFile"$() is called. + +$LK,"SOURCE_FILE_MASK","MN:SOURCE_FILE_MASK"$$FG$ + This $FG,2$#define$FG$ holds a list of source file extensions. +$LK,"TEXT_FILE_MASK","MN:TEXT_FILE_MASK"$$FG$ + This $FG,2$#define$FG$ holds a list of text file extensions. + + + +$FG,5$$TX+CX,"Naming conventions"$ +$FG$ +$FG,5$$FG$The following are rules I stick to. If you work on the operating system, it'd be good to stick with them for uniformity, but you can do what you like. Since there are no "$FG,2$namespaces$FG$" and I don't plan to implement name spaces, I highly recommend putting a 2-3 character module code prefix on symbols. e.g. "Ws","Ltf","Lex" + +$FG,5$ALL_CAPS$FG$ + Assembly Language labels are capitalized with underscores between words. So are $FG,2$#define$FG$'s. + +$FG,5$MixedCaps$FG$ + $FG,2$C+$FG$ Functions and class names are MixedCaps. + +$FG,5$lower_case$FG$ + Local function vars and glbl vars are lower case. Class member names are also lower_case. + +$FG,5$SYSf_????$FG$ + Flags which are designated with bit numbers instead of bit values are designated with a lower case "$FG,2$f$FG$". + +$FG,5$CP_????$FG$ + Assembly language routines which are C+ callable have a prefix "CP_". + + + +$AN,"Fs","Fs"$ + This refers to the CPU segment register called FS. This register is special in LoseThos because it points to the currently active task's $LK,"TssStruct","MN:TssStruct"$. + +$AN,"Tss","Tss"$ + This is an Intel abbreviation for task state something. Each task has one of these structures. LoseThos doesn't actually use this CPU feature. + +$AN,"Bt,Bts,Btr,Btc","Bt,Bts,Btr,Btc"$ + These are bit manipulation functions named after Intel instructions. They stand for "Bit Test", "Bit Test and Set", "Bit Test and Reset" and "Bit Test and Compliment". + +$AN,"Cli,Sti","Cli,Sti"$ + These functions turn on or off interrupts. They are named after the Intel instructions. "Cli" turns off interrupts. + +$AN,"Root","root"$ + Refers to the base of a binary tree or the head of a queue. + +$AN,"Put","Put"$/$AN,"PrintF","PrintF"$ + This usually means sending data to a character stream. I try to use this instead of "Display" or "Dump". + +$AN,"Get","Get"$ + This is the opposite of "Put". + +$AN,"Write","Write"$ + This usually refers to sending data to disk and not to be confused with "Save". + +$AN,"Read","Read"$ + This is the opposite of "Write" and not to be confused with "Load". + +$AN,"Load","Load"$ + Refers to doing more than just reading. + +$AN,"Save","Save"$ + This is an editor cmd. + +$AN,"Find","Find"$ + I try to use this instead of "Locate", etc. + +$AN,"struct","struct"$ + I try to use this instead of "Record" or "Node". + +$AN,"Join","Join"$ + When two parts of a program have a common low-level routine, that routine is often labeled SomethingJoin. + +$AN,"Free","Free"$/$AN,"Unused","Unused"$ + "Free" is a verb meaning to return something (to the system) like mem or disk space. "Unused" is an adjective. + + +$FG,5$$TX+CX,"Abreviations"$$FG$ + +$FG,5$Attr$FG$ Attribute +$FG,5$Blk$FG$ Block +$FG,5$Buf$FG$ Buffer +$FG,5$Cb$FG$ Call-back (or code block) +$FG,5$Chnl$FG$ Channel +$FG,5$$FG,5$Cmd$FG$ Command +$FG,5$Cnt$FG$ Count +$FG,5$Ctrl$FG$ Control. The control key is indicated with "$FG,2$^$FG$" in documentation. +$FG,5$Cur$FG$ Current +$FG,5$Dbg$FG$ Debug +$FG,5$Del$FG$ Delete +$FG,5$Dev$FG$ Device +$FG,5$Dir$FG$ Directory +$FG,5$Elem$FG$ Element +$FG,5$Glbl$FG$ Global +$FG,5$Gr$FG$ Graphic +$FG,5$ip_$FG$ Input Pointer. See $LK,"::/LT/ADAM/INPTR.CPZ","FI:::/LT/ADAM/INPTR.CPZ"$. +$FG,5$Lex$FG$ Lexical analyser +$FG,5$Lpt$FG$ I think this stands for "line printer port". (It's a DOS term.) +$FG,5$Ltf$FG$ Linked-Text-File (doubly-linked-list of rich text cmds) +$FG,5$Mem$FG$ Memory +$FG,5$$FG,5$Msg$FG$ Message +$FG,5$Num$FG$ Number +$FG,5$$FG,5$Ode$FG$ Ordinary differential equation +$FG,5$Pmt$FG$ Prompt +$FG,5$Ptr$FG$ Pointer +$FG,5$Rep$FG$ Report +$FG,5$$FG,5$Rmt$FG$ Remote +$FG,5$Rx$FG$ Receive +$FG,5$$FG,5$$FG,5$Str$FG$ String +$FG,5$Sys$FG$ System +$FG,5$Tx$FG$ Transmit +$FG,5$$FG,5$Var$FG$ Variable diff --git a/LT/DOC/Quirks.TXZ b/LT/DOC/Quirks.TXZ new file mode 100644 index 0000000..dc57e82 --- /dev/null +++ b/LT/DOC/Quirks.TXZ @@ -0,0 +1,9 @@ +$WW,1$* Call $LK,"ChangeDisk","MN:ChangeDisk"$() when you insert a new removable media. +* You can only $FG,2$extern$FG$ something once. There is a varient called $FG,2$LTextern$FG$ which binds a C+ definition to a asm symbol. This, too, can only be done once. +* Use $FG,2$MulI8,MulU8,DivI8,DivU8,ModI8,ModU8$FG$ when doing 64-bit arithmetic, except if 32-bit results are guarenteed. When I move to a true 64-bit CPU, these won't be needed. +* $FG,2$switch/case$FG$ statements allocate a single jump table--do not use with wide, sparce ranges of case values. Eventually, this might be fixed. +* Don't use default string constant parameters on functions compiled in $LK,"Static Compiled Mode","FF:::/LT/DOC/OSGlossary.GLZ,Static Compiled Mode"$ because there is a bug. +* A $LK,"Cd","MN:Cd"$() cmd must be followed by two semicolons if a $FG,2$#include$FG$ is after it. This is because the precompiler processes the next instruction early. +* The last semicolon on the cmd line is converted to a double semicolon because the compiler looks ahead before doing a cmd. This normally has no negative effect, but when entering "$FG,2$if$FG$" statements with "$FG,2$else$FG$" clauses it presents problems. +* You cannot use $FG,2$$$IB$$,$$IT$$ or $$IS$$$FG$ at the command line or before the $LK,"::/LT/ADAM/EDIT.CPZ","FI:::/LT/ADAM/EDIT.CPZ"$ file has been included during start-up. +* The assembler error messages are often off by a line and undefines are cryptic. diff --git a/LT/DOC/StartUp.TXZ b/LT/DOC/StartUp.TXZ new file mode 100644 index 0000000000000000000000000000000000000000..8d73531074501ae761e1ba495cfe6a9a6eefd9e2 GIT binary patch literal 899 zcmd<(0zs7kPaP#C9b**`2ZR}z7#J9s86cpInSp_kfdMSW$bpa$W?*3W^#A{VP6h@B zQHW9)Q;C6rK?EYCz`(%p`~Uy{(hLj?ED#|r28e-*P$>om29PWp0|Ns{H8(^RjH%4P zz`z3$Qej|V0Lg+3fQT?SGB7ZJYz=_Y3=9mG3=9l^|NsAQ%)r3#>;M1%3=9k~rU6tJ z0|Nt$X~@99zzz`xF+q+nhg!qHzyM={XhDc7GX@3*5L1tVfdLc*3=9k~%iW+hGcYi~ zm<|jK3|tV6Fs2Iw1A`Dm2*&hBn3c-F!0_?^|NpUwAPj{DbU6b9!)J(x@)#HxzW@LK zKLepE8|vyph|vrT3{X}n!U-^D5hBW(p^;ICPz7VQAPk2wdl114W40ku#B7MwGoVH? zFfdGqGABZ51_lNg6GTHp2F3(w?!0_S!|Nq+= z7#PGLx?#+N3=9nKAt81estQDdbTcq8T!U(W(F_a>PoS#qGB7awfoOy=K{PZS-hn1b hkZP#oV9d7+3=F&wN5GhG7#J9SLd=3OpCa7F0039gfZhNA literal 0 HcmV?d00001 diff --git a/LT/DOC/Tips.TXZ b/LT/DOC/Tips.TXZ new file mode 100644 index 0000000..849c158 --- /dev/null +++ b/LT/DOC/Tips.TXZ @@ -0,0 +1,78 @@ +$WW,1$$FG,5$$IV,1$$TX+CX,"MISC"$$IV,0$$FG$ + +* Press the $FG,2$WINDOW$FG$'s key at the command line to access your macro/menu area. Place macros there with $FG,2$CTRL-L$FG$. Use the "$FG,2$Pop-Up$FG$" option on macros to $LK,"Spawn","MN:Spawn"$ a task to run a file. It dies when it is finished. This returns memory to the system allocated by programs. Be sure to press $FG,2$CTRL-S$FG$ to save your macro/menu area after making changes. + +* You can adjust the screen refresh rate (software). It is automatically adjusted based on load. The range is $LK,"win_min_refresh","MN:win_min_refresh"$,$LK,"win_max_refresh","MN:win_max_refresh"$. + +* You can adjust the number of answers displayed by setting $FG,2$Fs->answers_displayed$FG$ to a number from 0-8. See $LK,"answers_displayed","FF:HOME/USER.CPZ,answers_displayed"$ in your $LK,"HOME/USER.CPZ","FI:HOME/USER.CPZ"$ file. + +* You can use "$FG,2$ans0$FG$","$FG,2$ans1$FG$", etc in expressions. You can use the cmd prompt as a calculator by just entering expressions like "$FG,2$1+2*3;$FG$". $FG,2$double$FG$ results can be accessed with "$FG,2$ansd0$FG$" or "$FG,2$ansd1$FG$". + +* You can recompile and reinstall the kernel with $LK,"InstallBoot","MN:InstallBoot"$(). You can upgrade to 800x600 VGA resolution if your video chip supports it. You can turn-off $FG,2$WORDSTAT$FG$ initialization by entering $FG,2$$FG$ at the prompt. To start $FG,2$WORDSTAT$FG$ later, use $LK,"WsInit","MN:WsInit"$(). + +* Filenames ending in "$FG,2$Z$FG$" will be automatically compressed and uncompressed when read or written. The compression method is not supported elsewhere. + +* The joystick can be recalibrated with $LK,"JoyCalibration","MN:JoyCalibration"$(). + +* You might speed-up CD-ROM access by changing $FG,2$bdev->max_reads$FG$ if your drive can handle more. See $LK+S,"InitBlkDev","MN:InitBlkDev"$() under ATAPI. + +* $LK,"MergeChk","MN:MergeChk"$() can be used to see what's changed. The "$FG,2$+d$FG$" flag will show differences of files which have changed and allow you to merge code. (The "$FG,2$+r$FG$" flag will recurse.) + +* Use $LK,"Plain","MN:Plain"$() to edit a plain text file. You'll need this if your file has $FG,2$$$$FG$'s. + +* Use $LK,"Silent","MN:Silent"$() to disable output. Or, $LK,"Btr","MN:Btr"$(&sys_flags,SYSf_NO_IO_SOUND) to turn-off disk IO feedback. + +* There are handy functions--$FG,2$F(),R(),FD()$FG$ and $FG,2$RD()$FG$ which are defined in $LK,"HOME/USER.CPZ","FI:HOME/USER.CPZ"$. They will perform find-and-replace operations accross multiple files. The "$FG,2$+l$FG$" flag is particularly useful since it limits to whole labels. + +* You can save files after making changes, anytime you are within the editor, like when viewing help/macro files. $FG,2$CTRL-A$FG$ saves as, $FG,2$CTRL-S$FG$ saves with the same name in the scrolling title bar. Hitting $FG,2$ESC$FG$ will exit and save. ($FG,2$CTRL-Q$FG$ will exit and not save). You can save the cmd line window to a file, too, since you're actually in the editor when you're at the cmd line. + +* When using $FG,2$CTRL-L$FG$ to insert links in documents, you can usually leave the "Display Text" blank and it will be filled-in automatically based on other entries. + +* There is a feature of the compiler/assembler which allows code to be executed in the middle of compilation and data inserted into the compilation stream. You do a "$FG,2$exe{}$FG$" blk similar to an "$FG,2$asm{}$FG$" blk. Click here for an example: $LK,"exe {","FF:::/LT/OSMain/END.CPZ,exe {"$. + +* Use $LK,"LtfSetMax","MN:LtfSetMax"$() to adjust the size of the cmd line buf. + +* If you output to the cmd line and wish to allow users to scroll around and view data, you can use $LK,"View","MN:View"$(). $LK,"Example","MN:WsPutMatrix"$ + +* Use $LK+S,"View","MN:View"$() in Pop-up macros to linger until the user presses $FG,2$ESC$FG$ or $FG,2$CTRL-Q$FG$. + +* You can access the word under the cursor at $LK,"ws_cur_word","MN:ws_cur_word"$, but you should probably turn-off preemption or interrupts momentarily to copy it. + +* You can reactivate WORDSTAT after closing it by pressing $FG,2$CTRL-FUNCTION KEY$FG$. + +* $LK,"Preempt","MN:Preempt"$() is used to keep a task from being interrupted and swapped-out. It has a similar effect to turning-off interrupts. Each task has it's own preemption control. A task with preemption turned-off can voluntarily $LK,"SwapInNext","MN:SwapInNext"$() with preemption off. + +* You can set a color for different drives with $LK,"SetDriveTextAttr","MN:SetDriveTextAttr"$(). Place calls to this in $LK,"::HOME/USER.CPZ","FI:::HOME/USER.CPZ"$. + +* If you toggle to plain text when you are working with graphics in a document, you can add duplicate entries for pictures by entering a "$FG,2$PI$FG$" command with the same number. + +* If you toggle to plain text when working with graphics, you can add a string to the $FG,2$$$PI$$$FG$ entry to keep track of it. Try "$FG,2$$$PI,"+",2$$$FG$" where '2' is the picture number. + +* I use spaces-to-tab operations on all my files to keep them small. You have to be careful, though, because spaces in messages will be converted. I use $FG,2$SHIFT-SPACE$FG$ ' ' in such cases. See $LK,"S2T","MN:S2T"$() for spaces-to-tabs. + +* You can edit an existing Graphic Element by putting the cursor on it and pressing $FG,2$CTRL-R$FG$. + +* You can customize the "wallpaper" by adding stuff to the $LK,"WallPaper","MN:WallPaper"$() routine. + +$FG,5$$IV,1$$TX+CX,"DEBUGGING"$$FG$$IV,0$ + +* While debugging, you specify addresses of assembly OSmain $FG,2$asm{}$FG$ routines with just the label, as in "$FG,2$CP_MALLOC+0x20$FG$". You specify C+ labels with "&" before functions as in "$FG,2$&Printf+0x10$FG$". + +$LK,"D","MN:D"$() $LK,"LtfD","MN:LtfD"$() to hex dump mem with numbering from zero. With $LK,"LtfD","MN:LtfD"$ the values are updated continually and you can alter mem by editing. + +$LK,"Dm","MN:Dm"$() $LK,"LtfDm","MN:LtfDm"$() to hex dump mem with addresses showing. + +$LK,"Dasm","MN:Dasm"$() to disassemble mem. + +$LK,"Prof","MN:Prof"$() and $LK,"ProfRep","MN:ProfRep"$() provide code profiling. See $LK,"::/LT/DEMO/AutoFile/Demo2.AUZ","FI:::/LT/DEMO/AutoFile/Demo2.AUZ"$ (This is an "$LK,"AutoFile","FF:::/LT/DOC/OSGlossary.GLZ,AutoFile"$".) + +* Use $LK,"DbgNum","MN:DbgNum"$(), $LK,"DbgStr","MN:DbgStr"$() and $LK,"DbgAdd","MN:DbgAdd"$() to print debug info bypassing the window framework. You can use $LK,"Raw","MN:Raw"$($FG,2$TRUE$FG$) to make all output bypass the window framework. + +* Use $LK,"SysDbg","MN:SysDbg"$() to set a flag which you can read with $LK,"IsSysDbg","MN:IsSysDbg"$() when you wish to trigger some debug activity. + +* There are flags for various trace options that can help debugging. $LK,"Echo","MN:Echo"$() turns on or off raw data going into the lexical analyzer. $LK,"LTrace","MN:LTrace"$() shows the tokens coming out of the lexical analyzer. $LK,"CTrace","MN:CTrace"$() disassembles code generated from the C+ compiler. $LK,"PTrace","MN:PTrace"$() shows "intermediate code" comming out of the first stage of the compiler (it's not 100% valid because it hasn't been fixed-up). $LK,"OTrace","MN:OTrace"$() shows intermediate code coming-out after optimization. These flags can be set and reset by placing them in "$FG,2$exe{}$FG$" code blks. + +* $FG,4$dbgo$FG$ is an alias for "$FG,2$cout$FG$" and can be used to place output. You can easily find and remove them doing a $LK,"Grep","MN:Grep"$(). + +* $LK,"SBpt","MN:SBpt"$() to set breakpoints. When the fault screen appears, use $LK,"Go","MN:Go"$() to continue. You can altering modify what is displayed each break-point by $LK,"HOME/FAULT.CPZ","FI:HOME/FAULT.CPZ"$ in your account's home directory. + diff --git a/LT/OSMain/ADAMK.CPZ b/LT/OSMain/ADAMK.CPZ new file mode 100644 index 0000000..78fbf70 --- /dev/null +++ b/LT/OSMain/ADAMK.CPZ @@ -0,0 +1,8 @@ +extern U8i SysEcho(U8i val); +SysEcho(0); //0=echo OFF 1=echo ON +#include "/LT/OSMain/ADAMK.HPZ" +#include "/LT/OSMain/ADAMK2.HPZ" +#include "/LT/OSMain/ADAMK3.HPZ" +#include "/LT/COMPILE/CMP.HPZ" +Cd("/LT/ADAM");; +#include "ADAM2" diff --git a/LT/OSMain/ADAMK.HPZ b/LT/OSMain/ADAMK.HPZ new file mode 100644 index 0000000..11ceae3 --- /dev/null +++ b/LT/OSMain/ADAMK.HPZ @@ -0,0 +1,2336 @@ +public U2i union U2 +{ + I1i i1[2]; + U1i u1[2]; +}; + +public I2i union I2 +{ + I1i i1[2]; + U1i u1[2]; +}; + +public U4i union U4 +{ + I1i i1[4]; + U1i u1[4]; + I2i i2[2]; + U2i u2[2]; +}; + +public I4i union I4 +{ + I1i i1[4]; + U1i u1[4]; + I2i i2[2]; + U2i u2[2]; +}; + +public U8i union U8 +{ + I1i i1[8]; + U1i u1[8]; + I2i i2[4]; + U2i u2[4]; + I4i i4[2]; + U4i u4[2]; +}; + +public I8i union I8 +{ + I1i i1[8]; + U1i u1[8]; + I2i i2[4]; + U2i u2[4]; + I4i i4[2]; + U4i u4[2]; +}; + +public class P2I4 //two dimensional point +{ + I4 x,y; +}; + +public class P3I4 //three dimensional point +{ + I4 x,y,z; +}; + +public class P2I8 //two dimensional point +{ + I8 x,y; +}; + +public class P3I8 //three dimensional point +{ + I8 x,y,z; +}; + +public class P2d //two dimensional point +{ + double x,y; +}; + +public class P3d //three dimensional point +{ + double x,y,z; +}; + +#define NULL 0 +#define TRUE 1 +#define FALSE 0 +#define ON 1 +#define OFF 0 +#define BoolU1 U1 +#define BoolU2 U2 +#define BoolU4 U4 +#define BoolU8 U8 +#define MAX_U1 0xFF +#define MIN_U1 0 +#define MAX_I1 0x7F +#define MIN_I1 0x80 +#define MAX_U2 0xFFFF +#define MIN_U2 0 +#define MAX_I2 0x7FFF +#define MIN_I2 0x8000 +#define MAX_U4 0xFFFFFFFF +#define MIN_U4 0 +#define MAX_I4 0x7FFFFFFF +#define MIN_I4 0x80000000 +#define MAX_U8 0xFFFFFFFFFFFFFFFF +#define MIN_U8 0 +#define MAX_I8 0x7FFFFFFFFFFFFFFF +#define MIN_I8 0x8000000000000000 +#define MAX_double 1.79e308 //TODO:make exact +#define MIN_double -1.79e308 +#define PTR_SIZE sizeof(U4i) +#define INVALID_PTR 0x7FFFFFFF +#define INVALID_CLUSTER -1 +#define ALL_MASK -1 + +public class Ode +{ + Ode *next,*last; + I8 n; + double base_t; + double t; + double h; + double tolerance_start; + double tolerance; + double *state; + double *DstateDt; + double *state_scale; + double *initial_state; + double *temp0,*temp1,*temp2,*temp3, + *temp4,*temp5,*temp6,*temp7; + void derivative(Ode *o,double t,double *state,double *DstateDt); +}; + +public class Order2D3 +{ + double x,y,z,DxDt,DyDt,DzDt; +}; + +class BinFileHeaderStruct +{ + U4 jmp; + U4 header_offset; + U4 file_size; + U4 xsum; +}; + +#define MAXGDT 512 +#define MAXIDT 96 +#define SYS_DEFAULT_FLAGS 0x40200 +#define SYS_DEFAULT_CR3 0 + +class GdtTabStruct +{ + U4 lo,hi; +}; + +class OsMainStruct $LK,"/LT/OSMain/OSMAIN.ASZ","FI:/LT/OSMain/OSMAIN.ASZ"$ +{ + BinFileHeaderStruct h; + U4 jmp; + U4 boot_base; + U4 header_base; + U4 os_32start; + GdtTabStruct gdttab[MAXGDT]; + U4 boot_code; + U4 sys_memblks; +}; + + +#define JIFFY_FREQ 10000 // Hz +#define LTDATE_FREQ 49710 // Hz +#define SYS_TIMER_FREQ (18333*65536/1000) //Hz + +#define SYS_TIMER0_PERIOD (65536*182/10/JIFFY_FREQ) + +//SYSFLAGS definitions +#define SYSf_PREEMPTIVE 0 +#define SYSf_CLEAR_SCREEN_TEXT 1 +#define SYSf_DEBUG 2 +#define SYSf_RAW_CRT_OUT 3 +#define SYSf_CTRL_ALT_DEL 4 +#define SYSf_CTRL_ALT_C 5 +#define SYSf_CTRL_ALT_ESC 6 +#define SYSf_CTRL_ALT_X 7 +#define SYSf_CTRL_ALT_TAB 8 +#define SYSf_TASK_LINKS_ALTERED 9 +#define SYSf_RECORD_MACRO 10 +#define SYSf_NO_SOUND 11 +#define SYSf_NO_IO_SOUND 12 + +//Extern calls +#define EXT_IRQ01 1 // Keyboard +#define EXT_IRQ03 3 // Comm +#define EXT_IRQ04 4 // Comm +#define EXT_IRQ06 6 // FDC0 +#define EXT_IRQ07 7 // LPT1 +#define EXT_IRQ0C 12 // Mouse +#define EXT_IRQ0E 14 // IDE0 +#define EXT_IRQ0F 15 // IDE1 +#define EXT_IRQ00 32 // Timer +#define EXT_LTF_PUT_I1 33 +#define EXT_LTF_PUTS 34 +#define EXT_LTF_READ 35 +#define EXT_LTF_WRITE 36 +#define EXT_LTF_NEW 37 +#define EXT_LTF_RESET 38 +#define EXT_LTF_DEL 39 +#define EXT_LTF_RECALC 40 +#define EXT_SPRINTF_JOIN 41 +#define EXT_GETF_JOIN 42 +#define EXT_DEBUG 43 +#define EXT_EXECUTE_FILE 44 +#define EXT_EXECUTE_STRING 45 +#define EXT_WINDOW_TO_TOP 46 +#define EXT_CMP_EXE_BLK 47 +#define EXT_RMT_GETMSG 48 +#define EXT_RMT_PUTCHAR 49 +#define EXT_RMT_PUTS 50 +#define EXT_RMT_LTFPUTCHAR 51 +#define EXT_TABLE_SIZE 256 + + +//Software Interrupts +#define I_PUT_SYSTEXT 0x30 +#define I_PUT_I1 0x31 +#define I_GET_CHAR 0x32 +#define I_COUT 0x33 +#define I_PEEK_MSG 0x34 +#define I_GET_MSG_NO_WAIT 0x35 +#define I_FLUSH_MSGS 0x36 +#define I_GET_MSG 0x37 +#define I_PUT_STRING 0x38 +#define I_COUTLN 0x39 +#define I_DEBUG 0x3A + +#define FLT_UNDEF_EXTERN 0x100 + +//Hash table types +#define HTT_INVALID 0 +#define HTT_ALL -1 +#define HTT_STRING_CONSTANT 0x001 +#define HTT_SYS_SYMBOL 0x002 +#define HTT_KEYWORD 0x004 +#define HTT_LOCAL_VAR 0x008 +#define HTT_GLBL_VAR 0x010 +#define HTT_CLASS 0x020 +#define HTT_INTERNAL_TYPE 0x040 +#define HTT_FUNCTION 0x080 +#define HTT_WORD 0x100 +#define HTT_OPCODE 0x200 +#define HTT_R8 0x400 +#define HTT_R16 0x800 +#define HTT_R32 0x1000 +#define HTT_SEG 0x2000 +#define HTT_SYSTEXT 0x4000 +#define HTT_FILE 0x8000 +#define HTT_MODULE 0x10000 +#define HTT_PRIVATE 0x02000000 +#define HTT_PUBLIC 0x04000000 +#define HTT_EXPORT 0x08000000 +#define HTT_IMPORT 0x10000000 +#define HTT_LITERAL 0x20000000 +#define HTT_UNRESOLVED_LOCAL 0x40000000 +#define HTT_UNRESOLVED_GLBL 0x80000000 + +class DbgInfo +{ + U4 min_line,max_line; + U4 body[1]; +}; + +public class SysHashEntry +//Don't forget to change WsHashEntry and asm stuff +{ + SysHashEntry *next; + I1 *string; + U4 type,use_cnt; + I1 *source_link; + DbgInfo *debug; + U4 user0,user1,user2; +}; + +public class SysHashTable +{ + SysHashTable *next; + U4 mask; + SysHashEntry *body[1]; //SysHashTable is var size +}; + +public class StringConstantStruct +{ + SysHashEntry *next; + I1 *string; + U4 type,use_cnt; + I1 *source_link; + I1 *data; +}; + +#define LTFLT_BLINK 0x10000000 +#define LTFLT_INVERTED 0x20000000 +#define LTFLT_SELECTED 0x40000000 +#define LTFLT_UNDERLINED 0x80000000 + +#define MLF_DEFAULT_AVAILABLE 1 +#define MLF_FUNCTION 2 +#define MLF_DOT_DOT_DOT 4 +public class MemberListStruct +{ + MemberListStruct *next; + I1 *string; + U4 *member_class; + U4 use_cnt; + I1 *fmtstr; + I1 *fmtdata; + U2 flags; + U2 parameter_cnt; + U4 cnt; //for arrays + I4 offset; + U8 default_value; + void output_fun(I1 *buf,U1 *d); + void input_fun(I1 *buf,U1 *d); +}; + +#define Cf_INTERNAL 0 // Internal function +#define Cf_EXTERN 1 +public class ClassStruct //used for classes, functions and internal_data_types +{ + SysHashEntry *next; + I1 *string; + U4 type,use_cnt; + I1 *source_link; + DbgInfo *debug; + U2 member_cnt; + U2 parameter_cnt; + I4 size; + MemberListStruct *member_list; + MemberListStruct *last_in_member_list; + U4 *executable_address; + ClassStruct *return_class; + U1 pointer_cnt; + U1 sub_type,flags[2]; + I1 *import_name; +}; + +//Internal type definitions +#define IT_I0 0 +#define IT_U0 1 +#define IT_I1 2 +#define IT_U1 3 +#define IT_I2 4 +#define IT_U2 5 +#define IT_I4 6 +#define IT_U4 7 +#define IT_I8 8 +#define IT_U8 9 +#define IT_DOUBLE 10 +#define IT_UDOUBLE 11 // fictitious placeholder +#define IT_NUM_IT 12 + +#define GVAF_FUNCTION 1 +#define GVAF_IMPORT 2 +#define GVAF_EXTERN 4 +public class GlblVarStruct +{ + SysHashEntry *next; + I1 *string; + U4 type,use_cnt; + I1 *source_link; + DbgInfo *debug; + U2 flags; + U2 parameter_cnt; + U4 size; //must be in same spot as in class + ClassStruct *var_class; + U4 cnt; + I1 *import_name; + U4 data_address; + U4 data; +}; + +#define SACTf_ADAM3_LOADED 0 + +public class SysAccntStruct +{ + SysAccntStruct *next,*last; + I1 name[32]; + U4 flags; +}; + +#define TSSCf_WAKE_MASTER 0 +#define TSSCf_FOCUS_MASTER 1 +#define TSSCf_NOT_INPUT 2 +#define TSSCf_EXIT_ON_COMPLETE 3 +#define TSSCf_TEXT 4 +#define TSSCf_DONT_FILTER 5 + +class TssCmdStruct +{ + TssCmdStruct *next,*last; + U4 code; + U8 p1,p2; + U8 flags; + I1 *data; + U8 result; + U4 master_tss; +}; + +#define SBPTf_DISABLE 0 + +#define SBPTF_BPT 2 +#define SBPTF_STEP 4 +class SysBpt +{ + SysBpt *next; + U4 flags; + U4 address; + U1 b; +}; + +class MemBlk +{ + MemBlk *next,*last; + U4 pages; +}; + +class UnusedAllocatedMem +{ + UnusedAllocatedMem *next; + U4 size; +}; + +//LtfEntry.type codes (Low 8 bits) +#define LTFT_TEXT 0 +#define LTFT_CR 1 +#define LTFT_SOFT_CR 2 +#define LTFT_CURSOR 3 +#define LTFT_TAB 4 +#define LTFT_CLEAR 5 +#define LTFT_PAGE_BREAK 6 +#define LTFT_DATA 7 +#define LTFT_PAGE_LENGTH 8 +#define LTFT_LEFT_MARGIN 9 +#define LTFT_RIGHT_MARGIN 10 +#define LTFT_HEADER 11 +#define LTFT_FOOTER 12 +#define LTFT_INDENT 13 +#define LTFT_FOREGROUND_COLOR 14 +#define LTFT_BACKGROUND_COLOR 15 +#define LTFT_DEFAULT_FOREGROUND_COLOR 16 +#define LTFT_DEFAULT_BACKGROUND_COLOR 17 +#define LTFT_LINK_FOREGROUND 18 +#define LTFT_LINK_BACKGROUND 19 +#define LTFT_MACRO_FOREGROUND 20 +#define LTFT_MACRO_BACKGROUND 21 +#define LTFT_ANCHOR_FOREGROUND 22 +#define LTFT_ANCHOR_BACKGROUND 23 +#define LTFT_HIDDEN_FOREGROUND 24 +#define LTFT_HIDDEN_BACKGROUND 25 +#define LTFT_TREE_FOREGROUND 26 +#define LTFT_TREE_BACKGROUND 27 +#define LTFT_USER_FOREGROUND 28 +#define LTFT_USER_BACKGROUND 29 +#define LTFT_WORD_WRAP 30 +#define LTFT_UNDERLINED 31 +#define LTFT_INVERTED 32 +#define LTFT_BLINK 33 +#define LTFT_SHIFTED_X 34 +#define LTFT_SHIFTED_Y 35 +#define LTFT_CURSOR_MOVEMENT 36 +#define LTFT_ANCHOR 37 +#define LTFT_LINK 38 +#define LTFT_BUTTON 39 +#define LTFT_CHECK_BOX 40 +#define LTFT_MACRO 41 +#define LTFT_MENU_VALUE 42 +#define LTFT_HEX_EDIT 43 +#define LTFT_HIDE_START 44 +#define LTFT_HIDE_END 45 +#define LTFT_TREE 46 +#define LTFT_PICTURE 47 +#define LTFT_INSERT_BINARY 48 +#define LTFT_INSERT_BINARY_TYPE 49 +#define LTFT_INSERT_BINARY_SIZE 50 +#define LTFT_BPT 51 +#define LTFT_SONG 52 +#define LTFT_ERROR 53 + +//LtfEntry.flag flags +#define LTFLF_AUX_STRING 1 +#define LTFLF_LEFT_CB 2 +#define LTFLF_LEFT_EXP 4 +#define LTFLF_LEFT_MACRO 8 +#define LTFLF_LEFT_AUTO 0x10 +#define LTFLF_RIGHT_CB 0x20 +#define LTFLF_RIGHT_EXP 0x40 +#define LTFLF_RIGHT_MACRO 0x80 +#define LTFLF_RIGHT_AUTO 0x100 +#define LTFLF_DISPLAY_CB 0x200 +#define LTFLF_HAS_BIN 0x400 +#define LTFLF_ESC 0x800 +#define LTFLF_QUIT 0x1000 +#define LTFLF_LEFT_X 0x2000 +#define LTFLF_CENTER_X 0x4000 +#define LTFLF_RIGHT_X 0x8000 +#define LTFLF_TOP_Y 0x10000 +#define LTFLF_CENTER_Y 0x20000 +#define LTFLF_BOTTOM_Y 0x40000 +#define LTFLF_SHIFTED_X 0x80000 +#define LTFLF_SHIFTED_Y 0x100000 +#define LTFLF_SCROLLING_X 0x200000 +#define LTFLF_SCROLLING_Y 0x400000 + +#define LTFLF_HAS_BORDER 0x100000000 +#define LTFLF_SOLID_BORDER 0x200000000 +#define LTFLF_BORDER_PLOT 0x400000000 +#define LTFLF_COLLAPSED 0x800000000 +#define LTFLF_CHECKED 0x1000000000 +#define LTFLF_REFRESH_DATA 0x2000000000 +#define LTFLF_DATA_IS_PTR 0x4000000000 +#define LTFLF_HAS_TERMINATOR 0x8000000000 +#define LTFLF_ZERO_BASED 0x10000000000 +#define LTFLF_PASSWORD 0x20000000000 +#define LTFLF_WORD_WRAP 0x40000000000 +#define LTFLF_UNDERLINED 0x80000000000 +#define LTFLF_INVERTED 0x100000000000 +#define LTFLF_BLINK 0x200000000000 +#define LTFLF_SELECTED 0x400000000000 +#define LTFLF_HOLD 0x800000000000 +#define LTFLF_TREE 0x1000000000000 +#define LTFLF_SKIP 0x2000000000000 +#define LTFLF_ALIAS 0x4000000000000 +#define LTFLF_POPUP 0x8000000000000 +#define LTFLF_PAGE_REL_Y 0x10000000000000 +#define LTFLF_MARGIN_REL_X 0x20000000000000 + +#define LTFLf_AUX_STRING 0 +#define LTFLf_LEFT_CB 1 +#define LTFLf_LEFT_EXP 2 +#define LTFLf_LEFT_MACRO 3 +#define LTFLf_LEFT_AUTO 4 +#define LTFLf_RIGHT_CB 5 +#define LTFLf_RIGHT_EXP 6 +#define LTFLf_RIGHT_MACRO 7 +#define LTFLf_RIGHT_AUTO 8 +#define LTFLf_DISPLAY_CB 9 +#define LTFLf_HAS_BIN 10 +#define LTFLf_ESC 11 +#define LTFLf_QUIT 12 +#define LTFLf_LEFT_X 13 +#define LTFLf_CENTER_X 14 +#define LTFLf_RIGHT_X 15 +#define LTFLf_TOP_Y 16 +#define LTFLf_CENTER_Y 17 +#define LTFLf_BOTTOM_Y 18 +#define LTFLf_SHIFTED_X 19 +#define LTFLf_SHIFTED_Y 20 +#define LTFLf_SCROLLING_X 21 +#define LTFLf_SCROLLING_Y 22 + +#define LTFLf_HAS_BORDER 32 +#define LTFLf_SOLID_BORDER 33 +#define LTFLf_BORDER_PLOT 34 +#define LTFLf_COLLAPSED 35 +#define LTFLf_CHECKED 36 +#define LTFLf_REFRESH_DATA 37 +#define LTFLf_DATA_IS_PTR 38 +#define LTFLf_HAS_TERMINATOR 39 +#define LTFLf_ZERO_BASED 40 +#define LTFLf_PASSWORD 41 +#define LTFLf_WORD_WRAP 42 +#define LTFLf_UNDERLINED 43 +#define LTFLf_INVERTED 44 +#define LTFLf_BLINK 45 +#define LTFLf_SELECTED 46 +#define LTFLf_HOLD 47 +#define LTFLf_TREE 48 +#define LTFLf_SKIP 49 +#define LTFLf_ALIAS 50 +#define LTFLf_POPUP 51 +#define LTFLf_PAGE_REL_Y 52 +#define LTFLf_MARGIN_REL_X 53 + +#define LTFBT_GENERIC_DATA 1 +#define LTFBT_ELEMENT_GRAPH 2 +public class LtfBinEntry +{ + LtfBinEntry *next,*last; + U0 start; + U4 type,num,flags,size,use_cnt; + U1 *data; +}; + +#define LTF_DEFAULT (-0x7FFFFFFF) + +public class LtfEntryBase +{ + LtfEntryBase *next,*last; + union { + U4 type; + U1 btype; + }; + U8 flags; + I4 x,y; + U4 min_col,max_col; + + //These are here to allow recalculating the Ltf + //from a point other than the beginning. Without + //these, you do not know the current state. + //Margins will change to allow multiple columns + //of text on the same page. (cursor move back up the page.) + I4 indent,page_line_num; + I4 left_margin,right_margin; + + U1 *user_data; +}; + +public class LtfEntry +{ + LtfEntry *next,*last; + union { + U4 type; + U1 btype; + }; + U8 flags; + I4 x,y; + U4 min_col,max_col; + I4 indent,page_line_num; + I4 left_margin,right_margin; + U1 *user_data; + + U1 *display; + U1 *plain_text; + + union { + I4 attr; + I4 cursor_x_offset; + I4 left_cb(U4 *l,U1 *user,LtfEntry *ll); + I4 left_exp; + }; + + union { + I1 *left_macro; + I1 *song; + } + + union { + I4 cursor_y_offset; + I4 right_cb(U4 *l,U1 *user,LtfEntry *ll); + I4 right_exp; + }; + I1 *right_macro; + + I1 *display_cb(U4 *l,U1 *user,LtfEntry *ll, + TssStruct *mem_tss); + I1 *aux_string; + U1 *my_format_data; + U4 scroll_len; + U4 len; + U4 bin_num; + LtfBinEntry *bin_data; + + U1 *data; +}; + +class EditFindTextStruct +{ + I1 find_text[132] fmtstr "$$DA -P 131 \"FIND :%s\"$$\r\n"; + I1 replace_text[132] fmtstr "$$DA -P 131 \"REPLACE:%s\"$$\r\n"; + U4 replace fmtstr "$$CB \"REPLACE\"$$\r\n"; + U4 scan_forward fmtstr "$$CB \"FORWARD\"$$\r\n"; + U4 scan_selected_text fmtstr "$$CB \"SELECTION\"$$\r\n"; + U4 match_case fmtstr "$$CB \"CASE\"$$\r\n"; + U4 whole_labels fmtstr "$$CB \"WHOLE LABELS\"$$\r\n"; +}; + +class EditFileNameStruct +{ + I1 name[256] fmtstr "$$DA -P 255 \"File Name:%s\"$$"; +}; + + +// LTF header flags +#define LTFF_OVERSTRIKE 1 +#define LTFF_PLAIN_TEXT 2 +#define LTFF_PLAIN_TEXT_WITH_TABS 4 +#define LTFF_MIN_SIZE 8 +#define LTFF_NO_CURSOR 0x10 // Makes LtfInsertStr remove +#define LTFF_IN_DOLLAR 0x20 +#define LTFF_STATEMENT_WAS_RUN 0x40 +#define LTFF_WORD_WRAP 0x80 +#define LTFF_UNDERLINED 0x100 +#define LTFF_INVERTED 0x200 +#define LTFF_BLINK 0x400 +#define LTFF_FORM 0x800 +#define LTFF_ATTR_BY_PARTITION 0x1000 +#define LTFF_ATTR_BY_FILENAME 0x2000 +#define LTFF_INHIBIT_LEFT_CLICK 0x4000 +#define LTFF_DOUBLE_DOLLARS 0x8000 + +public class Ltf //Linked Text File header +{ + LtfEntryBase dummy; + LtfBinEntry bin_root; + + U4 flags; + I4 shifted_x,shifted_y; + LtfEntry *cur_entry; + I4 cur_data_col, + line_start_col,cur_top_line_num; + I4 x,y,min_x,max_x,min_y,max_y; + I4 old_window_top,old_window_bottom, + old_window_left,old_window_right; + I8 line,col; + I4 indent,page_line_num,page_length; + I4 left_margin,right_margin; + I4 header,footer; + U4 cmd_I1; + U4 dollar_buf_size,dollar_buf_ptr; + U1 *dollar_buf; + U4 max_entries,ww_lines_back,cur_bin_num; + LtfEntry *recalc_start; + EditFindTextStruct *find_replace; + LtfEntry *base_select,*limit_select; + Ltf *menu_ltf; + U4 cur_GrElem,cur_sub_GrElem; + U4 *tss,*mem_tss; + U1 text_attribute,link_attribute, + macro_attribute,anchor_attribute, + hidden_attribute,tree_attribute,user_attribute,pad1; + EditFileNameStruct filename; + U8 file_attr; + BoolU4 EditPlugIns(Ltf *l,I8 ch,U8 sc); + U1 *user_data; +}; + + +class InstructionEntry +{ + U1 ins_entry_num; //This entry num in opcode hash entry + U1 opcode_cnt; + U1 opcode[4],operand_size16,operand_size32,dont_switch_modes; + U1 plus_opcode,slash_value,opcode_modifier,default; + U1 arg1,arg2; +}; + +class OpcodeHashEntry +{ + SysHashEntry *next; + I1 *string; + U4 type,use_cnt; //AHT_OPCODE + I1 *source_link; + DbgInfo *debug; + U1 instruction_entry_cnt; + U1 reserved[3]; + InstructionEntry ins[1]; +}; + + +#define OM_NO 0 +#define OM_R 1 // Not used +#define OM_CB 2 +#define OM_CW 3 +#define OM_CD 4 +#define OM_CP 5 +#define OM_IB 6 +#define OM_IW 7 +#define OM_ID 8 +#define OM_RB 9 +#define OM_RW 10 +#define OM_RD 11 + +#define ARGT_NO 0 +#define ARGT_REL8 1 +#define ARGT_REL16 2 +#define ARGT_REL32 3 + +#define ARGT_UIMM8 4 +#define ARGT_UIMM16 5 +#define ARGT_UIMM32 6 +#define ARGT_R8 7 + +#define ARGT_R16 8 +#define ARGT_R32 9 +#define ARGT_IMM8 10 +#define ARGT_IMM16 11 + +#define ARGT_IMM32 12 +#define ARGT_RM8 13 +#define ARGT_RM16 14 +#define ARGT_RM32 15 + +#define ARGT_M8 16 // Not used, needed for LEA, etc +#define ARGT_M16 17 // Not used +#define ARGT_M32 18 // Not used +#define ARGT_M1616 19 // Not used + +#define ARGT_M1632 20 // Not used +#define ARGT_M16N32 21 // Not used +#define ARGT_M16N16 22 // Not used +#define ARGT_M32N32 23 // Not used + +#define ARGT_MOFFS8 24 +#define ARGT_MOFFS16 25 +#define ARGT_MOFFS32 26 +#define ARGT_CL 27 + +#define ARGT_AL 28 +#define ARGT_AX 29 +#define ARGT_EAX 30 +#define ARGT_DX 31 + +#define ARGT_SS 32 +#define ARGT_DS 33 +#define ARGT_ES 34 +#define ARGT_FS 35 + +#define ARGT_GS 36 +#define ARGT_SREG 37 +#define ARGT_CS 38 + + +#define ASM_CODE_BLK_BITS 15 +#define ASM_CODE_BLK_SIZE (1<answers[0]) +#define ans0 (Fs->answers[0]) +#define ans1 (Fs->answers[1]) +#define ans2 (Fs->answers[2]) +#define ans3 (Fs->answers[3]) +#define ans4 (Fs->answers[4]) +#define ans5 (Fs->answers[5]) +#define ans6 (Fs->answers[6]) +#define ans7 (Fs->answers[7]) + +#define ansd (Fs->double_answers[0]) +#define ansd0 (Fs->double_answers[0]) +#define ansd1 (Fs->double_answers[1]) +#define ansd2 (Fs->double_answers[2]) +#define ansd3 (Fs->double_answers[3]) +#define ansd4 (Fs->double_answers[4]) +#define ansd5 (Fs->double_answers[5]) +#define ansd6 (Fs->double_answers[6]) +#define ansd7 (Fs->double_answers[7]) + +public class MachineRegsStruct +{ + U4 + cr0 fmtstr "CR0 :%08X", + cr2 fmtstr "CR2 :%08X", + cr3 fmtstr "CR3 :%08X", + cr4 fmtstr "CR4 :%08X", + dbg0 fmtstr "DBG0:%08X", + dbg1 fmtstr "DBG1:%08X", + dbg2 fmtstr "DBG2:%08X", + dbg3 fmtstr "DBG3:%08X", + dbg6 fmtstr "DBG6:%08X", + dbg7 fmtstr "DBG7:%08X"; +}; + +#define KEYB_PORT 0x60 +#define KEYB_CTRL 0x64 + + +//SYS_CUR_SCAN_CODE FLAGS +#define SCf_E0_PREFIX 7 +#define SCf_KEY_UP 8 +#define SCf_SHIFT 9 +#define SCf_CTRL 10 +#define SCf_ALT 11 +#define SCf_CAPS 12 +#define SCf_NUM 13 +#define SCf_SCROLL 14 +#define SCf_NEW_KEY 16 +#define SCf_PRIOR_E0 17 + +#define SCF_E0_PREFIX (1<K%avKIkeQd9Q<{>RqEMcZnx{~i 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 literal 0 HcmV?d00001 diff --git a/LT/OSMain/ADAMK3.HPZ b/LT/OSMain/ADAMK3.HPZ new file mode 100644 index 0000000..ba0dccb --- /dev/null +++ b/LT/OSMain/ADAMK3.HPZ @@ -0,0 +1,290 @@ +extern SysAccntStruct sys_accounts; +public extern TssStruct *adam_tss; +public extern U4 num_spawned_users; +extern TssCmdStruct sys_macro_queue; +extern TssStruct *macro_util_tss; +public extern U1 *grfont; +extern U4 *vga_image; + +extern U4 FDC_retries; +extern U4 FDC_DRIVE_HEADS; +extern U4 FDC_DISK_CYLINDERS; +extern U4 FDC_DISK_SECTORS; +extern U4 FDC_MAX_SECTOR; +extern U4 FDC_DMA_BUF; +extern LTCacheBlk *LTDCBase; +extern LTCacheBlk *LTDCNext_lru,*LTDCLast_lru; +extern LTCacheBlk **LTDCHashTable; +public extern void LTDCInitCache(U8 size_in_U1s); + +extern U8 sys_timer,jiffies; +extern U8 rnd_SEED; +extern I1 sys_temp_filename[80]; +extern U8 disk_status_display,compiled_lines; +public extern Ltf *sys_clipboard_ltf; +public extern I8 num_blkdevs; +extern I1 *sys_startup_account; +extern I1 *wordstat_mask; +extern BoolU4 ip_inhibit_win_operations; +public extern I1 *sys_compile_time; + +public extern void PortNop(); +public extern void BusyWait(U8 uS); //Loosely timed + +//49,710Hz since boot (LTDATE_FREQ) +public extern LTDate BootTime(); +//18.33333*65536Hz (SYS_TIMER_FREQ) +public extern U8 ReadSysTimer(); + + +extern void KbdCmdSend(U8 port, U1 val); +extern I8 KbdCmdRead(); +extern void KbdCmdFlush(); +extern void KbdMouseCmdAck(U1 val); + +public extern U8 RandU2(); +public extern U8 RandU4(); +public extern U8 DivU8(U8 n1,U8 n2); +public extern I8 DivI8(I8 n1,I8 n2); +public extern U8 ModU8(U8 n1,U8 n2); +public extern I8 ModI8(I8 n1,I8 n2); +public extern I8 AtoI(I1 *st,I8 radix=10,I1 **end_ptr=NULL); +public extern void Sleep(U8 mS); +public extern void Sound(U8 freq); +public extern void Beep(U8 freq=500,BoolU4 busy=FALSE); +public extern U8 GetS(I1 *buf,U8 size); +public extern BoolU4 YorN(); +public extern void D(U1 *buf,U8 cnt=0x80,BoolU4 show_offset=TRUE); +public extern void Dm(U1 *buf,U8 cnt=0x80); + +public extern I8 ToUpper(I8 ch); +public extern BoolU4 AssignBit(U1 *field,U8 bit,BoolU4 val); +public extern BoolU4 Externs2Imports(BoolU4 val); +public extern BoolU4 KeepPrivate(BoolU4 val); +public extern BoolU4 PTrace(BoolU4 val); +public extern BoolU4 OTrace(BoolU4 val); +public extern BoolU4 NoRegVar(BoolU4 val); +public extern BoolU4 CTrace(BoolU4 val); +public extern BoolU4 LTrace(BoolU4 val); +public extern BoolU4 Echo(BoolU4 val); +public extern BoolU4 Silent(BoolU4 val); +public extern BoolU4 Preempt(BoolU4 val); +public extern BoolU4 SysDbg(BoolU4 val); +public extern BoolU4 IsSysDbg(); +public extern BoolU4 Raw(BoolU4 val); +public extern BoolU4 IsRaw(); +public extern U1 *Caller(); +public extern U1 *CallerCaller(); +public extern void DbgStr(I1 *st,U8 mS=100); +public extern void DbgNum(U8 num,U8 mS=100); +public extern void DbgF(double d,U8 mS=100); +public extern void DbgAdd(U4 *add,U8 mS=100); +public extern void DbgD(U4 *add,U8 cnt=0x80,U8 mS=100); +public extern void DbgDm(U4 *add,U8 cnt=0x80,U8 mS=100); +extern void ThrowDivide(U1 *eip); +extern void ThrowFloating(U1 *eip); + +public extern SysHashEntry *FindLocalHash(I1 *st,U8 mask); +public extern void GrClear(GrBitMap *base=NULL); +public extern GrBitMap *GrBitMapNew(U8 type,U8 width,U8 height); +public extern void CursorHome(); +public extern void CursorOn(); +public extern void CursorOff(); +public extern void ClearWindowText(); +public extern void InitCrt(); +public extern void PutChar(I1 ch); +public extern void PutS(I1 *st); +public extern U1 *AMAlloc(U8 size); +public extern void AFree(U1 *add); +public extern U1 *AMAllocIdentical(U1 *src); +public extern U1 *MAllocIdentical(U1 *src,TssStruct *tss=NULL); +public extern I1 *ANewString(I1 *buf); +public extern I1 *NewString(I1 *buf,TssStruct *tss=NULL); +public extern U1 *AMAllocZ(U8 size); +public extern U1 *MAllocZ(U8 size,TssStruct *tss=NULL); +public extern void DelLinkedList(U4 *list); +public extern void Exit(); +public extern void Kill(TssStruct *tss); + +//Exceptions are thrown through the following funcation call. +//by convention, the first parameter should be a type code. +public extern U8 ExceptDepth(TssStruct *tss=NULL); +public extern void throw(...); +//The following are used internally and should not be called directly +extern void SysTry(U1 *start_label,U1 *skip_label,U8 my_ebp,U8 my_esp); +extern void SysCatch(); + +public extern void ArcCompressBuf(ArcCs *c); +public extern void ArcFinishCompression(ArcCs *c); +public extern void ArcExpandBuf(ArcCs *c); +public extern ArcCs *NewArcCs(BoolU4 expand,BoolU4 text_only); +public extern void DelArcCs(ArcCs *c); +public extern ArcCompressStruct * + CompressBuf(U1 *src,U8 size,U8 flags=0); +public extern U1 *ExpandBuf(ArcCompressStruct *r); + + +public extern SysHashEntry *LoadStr(I1 *name, I1 *st); +public extern SysHashEntry *LoadList(I1 *name, I1 *st); +public extern I1 *SysText(I1 *name); +public extern I1 *SysTextSub(U8 sub,I1 *name); +public extern I8 SysTextSubCount(I1 *name); +public extern void Beeps(U8 j,BoolU4 busy); +public extern void UnrecoverableSysError(U8 j); +public extern void PutSysText(I1 *name); +public extern SysHashEntry *FindPSect(U1 *add,I8 *offset); + +public extern I1 *PointAtListEntry(I8 entry_number, I1 *lst); +public extern I8 MatchListEntry(I1 *src, I1 *lst,I8 flags=0,I8 *ambiguity_overkill_ptr=NULL); +public extern I8 MatchSysTextEntry(I1 *src, I1 *lst_name,I8 flags=0,I8 *ambiguity_overkill_ptr=NULL); +public extern I8 Occurrences(I1 *src, I1 ch); +public extern I8 SpacesToTabs(I1 *dst,I1 *src); +public extern I1 *TabsToSpaces(I1 *src); +public extern I1 *StringUtil(I1 *u, I8 mask); +public extern I1 *MStringUtil(I1 *u,U8 flags); +public extern I1 *RemoveFirstSeg(I1 *src, I1 *marker, I1 *dst); +public extern I1 *RemoveLastSeg(I1 *src, I1 *marker, I1 *dst); +public extern BoolU4 WildCardMatch(I1 *wild_st,I1 *src_st); +public extern BoolU4 WildFileNameList(I1 *wild_st,I1 *src_st); +public extern I1 *Add2String(I1 *base,I1 *addition); //frees base parameter +public extern I1 *SearchString(I1 *src,I1 *pattern,U8 flags=0); + +public extern I1 *SPrintFJoin(I1 *dst,I1 *fmt,I8i argc,I8i *argv); +public extern void GetFJoin(I1 *src,I1 *fmt,I8i argc,I8i *argv); +public extern void SPrintF(I1 *dst,I1 *fmt,...); +public extern void PrintF(I1 *fmt,...); +public extern I1 *MSPrintF(I1 *fmt,...); +public extern void Adam(I1 *fmt,...); +public extern void AdamLog(I1 *fmt,...); +public extern void AdamErr(I1 *fmt,...); +public extern U8 System(I1 *fmt,...); +public extern U8 ServantUser(I1 *fmt,...); +public extern void XTalk(TssStruct *tss,I1 *fmt,...); +public extern void XTalkString(TssStruct *tss,I1 *fmt,...); +public extern void Auto(I1 *fmt,...); +public extern void AutoString(I1 *fmt,...); +public extern void AutoFile(I1 *filename); +public extern void GetF(I1 *src,I1 *fmt,...); + +public extern void QSort(void *base,U8 num, U8 width, U1 *compare); + +public extern I4 YearStartDate(I4 year); +public extern LTDate ToLTDate(LTDateStruct *d); +public extern void ToLTDateStruct(LTDateStruct *d,LTDate ltdt); +public extern I4 FirstDayOfMonth(I4 i); +public extern I4 LastDayOfMonth(I4 i); +public extern I4 FirstDayOfYear(I4 i); +public extern I4 LastDayOfYear(I4 i); +public extern U1 DayOfWeek(I4 i); +public extern void GetCurTimeLTDateStruct(LTDateStruct *r); +public extern LTDate GetCurTimeLTDate(); +public extern void LTDateToISO(ISODate *dst,LTDate ltdate); + +public extern LTBlkDev *local_blkdevs,*boot_blkdev; +public extern LTPartition *local_partitions,*default_partition; +public extern I1 default_drive; +public extern LTPartition *drive_to_partition[32]; +extern void LockPartition(LTPartition *p); +extern BoolU4 UnlockPartition(LTPartition *p,BoolU4 reset=FALSE); +public extern void InvalidateDiskCache(LTPartition *p,BoolU4 unlock); +public extern void ChangeDisk(I1 drive_letter=0); +public extern void PartitionRep(); +extern void AddBlkDev(LTBlkDev *bd); +public extern BoolU4 RBlks(LTPartition *p,U1 *buf, U8 blk, U8 cnt,BoolU4 unlock); +public extern BoolU4 WBlks(LTPartition *p,U1 *buf, U8 blk, U8 cnt,BoolU4 unlock); +public extern void WZeroBlks(LTPartition *p,U8 blk,U8 cnt,BoolU4 unlock); +public extern LTFile *FOpen(I1 *filename,I1 *flags,U8 cnt=0); +public extern U8 FSize(LTFile *f); +public extern void FSync(LTFile *f); +public extern void FClose(LTFile *f); +public extern BoolU4 FRBlks(LTFile *f,U1 *buf,U8 blk=LTFB_NEXT_BLK,U8 cnt=1); +public extern BoolU4 FWBlks(LTFile *f,U1 *buf,U8 blk=LTFB_NEXT_BLK,U8 cnt=1); +public extern void ReadCDImage(I1 drive,I1 *out_name,U8 cnt); +public extern void WriteCDImage(I1 drive,I1 *in_name); +public extern U8 NextClusterNum(LTPartition *p,U8 c,U8 cnt,BoolU4 unlock); +public extern U8 ClusterBlk(LTPartition *p,U8 c); +public extern U8 RClusters(LTPartition *p,U1 *buf,U8 c,U8 cnt,BoolU4 unlock,BoolU4 update_display=FALSE); +public extern U8 WClusters(LTPartition *p,U1 *buf,U8 c,U8 cnt,BoolU4 unlock,BoolU4 update_display=FALSE); +public extern void CleanMAPBuf(LTPartition *p); +public extern U8 AllocClusters(LTPartition *p,U8 c,U8 cnt,BoolU4 contiguous,BoolU4 unlock); +public extern BoolU4 NewLTDirEntry(LTPartition *p,I1 *cur_dir,LTDirEntry *tempm,BoolU4 free_old_chain=TRUE); + +public extern void DelLTDirEntry(LTDirEntry *tempm); +public extern void DelLTDirList(LTDirEntry *tempm); +extern LTDirEntry *SysFindFiles(I1 *wild,U8 *fuf_flags=NULL); +public extern LTDirEntry *FindFiles(I1 *wild,U8 *fuf_flags=NULL); +extern U8 NameToDirCluster(LTPartition *p,I1 *name,BoolU4 unlock); +extern U8 NameToParentDirCluster(LTPartition *p,I1 *name,BoolU4 unlock); + +public extern void PutFileLink(I1 *name,I8 line=0,BoolU4 plain_text=FALSE); +public extern void PutDirLink(I1 *name); + +public extern void CheckLTPartition(LTPartition *p); +public extern void CheckLTBlkDev(LTBlkDev *bdev); +public extern I1 PartitionToDrive(LTPartition *p=NULL); +public extern LTPartition *DriveToPartition(I1 drive=0); +public extern LTBlkDev *DriveToBlkDev(I1 drive=0); +public extern BoolU4 DriveIsWritable(I1 drive=0); + +public extern I1 *CurDir(); +public extern I1 *AbsoluteDirName(I1 *name); +public extern I1 *AbsoluteFileName(I1 *name); +public extern BoolU4 CheckFileName(I1 *name); +public extern I1 *ChangeExtension(I1 *name,I1 *extension); +public extern I1 *DefaultExtension(I1 *name,I1 *extension); +public extern U8 FileAttr(I1 *name,U8 old_attr=0); +public extern void GetFFlags(FlagsStruct *f,I1 *systext_list,I1 *st); +public extern I1 *SPrintFFlags(I1 *dst,I1 *systext_list,U8 flags0,U8 flags1=0); +public extern void MapDrive(I1 ch,LTPartition *p); +public extern BoolU4 Drive(I1 drive_letter); +public extern BoolU4 Cd(I1 *name,BoolU4 make_dirs=FALSE); +public extern void DelLTFileAccess(LTFileAccess *fa); +public extern LTFileAccess *NewLTFileAccess(I1 *mask,BoolU4 make_mask=FALSE,BoolU4 make_dirs=FALSE); +public extern void Dir(I1 *wild=NULL,BoolU4 full=FALSE); +public extern void Del(I1 *wild,BoolU4 print_msg=TRUE); +public extern U1 *ReadFile(I1 *filename,U8 *size=NULL,U8 *attr=NULL,BoolU4 raw=FALSE); +public extern I1 *ReadTextFile(I1 *filename,U8 *attr=NULL); +public extern BoolU4 FindFile(I1 *filename,LTDirEntry *de=NULL, + BoolU4 dir_only=FALSE,BoolU4 file_only=FALSE,BoolU4 scan_parents=FALSE); +public extern U8 WriteFile(I1 *filename,U1 *fbuf, + U8 size,LTDate LTdatetime=0,U8 attr=0,BoolU4 raw=FALSE); +public extern void WriteTextFile(I1 *filename,I1 *st,U8 attr=0); +public extern void AddDrives(BoolU4 show_rep=TRUE); +public extern void SelectDefaultDrive(); +extern BoolU4 CopySingle(I1 *f1,I1 *f2); //LTust one file +public extern BoolU4 MkDir(I1 *filename); +public extern BoolU4 IsDir(I1 *dir_name); +extern void SysDel(I1 *wild,BoolU4 make_mask); //this is dangerous +public extern void Format(I1 drive_letter,BoolU4 quick=TRUE,BoolU4 confirm=TRUE,U8 type=PT_LT); + + +public extern TssStruct *Spawn(U1 *start_add, + I1 *desc=NULL, + TssStruct *parent=NULL, //NULL means adam + I1 *account=NULL, //Null means use parent's + U8 stk=DEFAULT_STACK); +public extern SysHashTable *NewHashTable(U8 size,TssStruct *mem_tss=NULL); +public extern void AddTaskToQueue(TssStruct *tss,TssStruct *pred=NULL); +public extern TssCmdStruct * + QueueTaskRequest(TssStruct *servant,TssStruct *master, + I1 *data,U8 flags); +public extern TssCmdStruct * + QueueTextInput(TssStruct *servant,TssStruct *master, + I1 *data,U8 flags); +public extern TssCmdStruct *QueueMsg(TssStruct *servant,TssStruct *master, + U8 code,U8 p1,U8 p2,U8 flags); +public extern void Msg(U8 code,U8 p1,U8 p2,U8 flags=0); +public extern BoolU4 GetRequestResult(TssCmdStruct *rqst=NULL,U8 *result=NULL); + +public extern void HandleServantCmds(); +public extern void InitUserTask(); +public extern void InitLocalTask(); +public extern void InitSysTask(); +public extern I1 *HomeDirString(); +public extern void ContinueServantTask(); +public extern void UserCmdLine(); +extern void SysCmdLine(); +extern void ServantUserCmdLine(); +extern void FaultCmdLine(); +public extern U1 *Load(I1 *filename,BoolU4 no_abs=FALSE); + \ No newline at end of file diff --git a/LT/OSMain/CHARIO.ASZ b/LT/OSMain/CHARIO.ASZ new file mode 100644 index 0000000000000000000000000000000000000000..9e2340ae18096c2ad047c19d55b68ccb14ae2105 GIT binary patch literal 2595 zcmd;d^zn4}zzakb**;&cf$ zRReLU`vAo9GzWt3=j}z z7?KcNQe79M3nZhit*&EW&C3<+;prAatltzJlvPwzggX) zU5n&7$6$oxUEJI~yu5v^VwCDYK2WNOif|4?NIUuY+Su8HWDtG>JB~shI)?;N9(ji5 zI!4AiraFceIz|RMMy5JOhB}ryhNe1(W;#m9(P^k-2#;|S9Wxzs9ScxY`*`}f#=E(? zy66}h>KGd7C?Q3$l8%v?j**Fuv5t`uEb@$W3{7+ljdhf$9Nqf*`ubWpK|qkdv#U#J zkSk6Vyj*CRBP7VtFWAR1#1)b^Ksmz-lqmv2gFQH1odS5dIDP%YKr9{CU=R-~5do8M zjL-=+Q3!U64{!`}^fiojbqa{(<>Cx+4G!USb&Svnc6N(*HHZ%ga&_|rY4Y-m;&gB@ zG%!F{1d3-~E>16yv=Pj7rwAR8IQ9e%QtcZ6HjS5ym&?Jy$O`J%2pxQx9^Gbe9s(H# zvf2b)*4Z&27$gaGH^?4iggs!rL^#jE!NdwRP*BV@hIqixz>3q+&jlQC1{LORyj+~l zz5!6KDJaOi99_X42C;qp!=fUA+GU`E-pc?!NH)w00m&Ei9&R6 zWN^H5Xi&VHzjJ7Ce28PPcP!M)UVh*(<>lgZ3JKywRtv5#KzSloC)hbH-p@506xHC= z;0%feuoiqeK$T7?D8Rj7>cRO36nkI>cFRD~4)QdX%n8cCE-sv|!2voJyj-0AL7a|0 zI*vXdCxKG0AuksvIBt2loCD&K!xUtlqYErw1$*lF2D^h5ID0q-#ryfkyE=RL!z_05 z^mB=KjR3I5iXNJMHopY8R9YtR1Onk5{i@I zhJm9eIMfN8S`E!$Y0t$I8slJ-ojm;mask=size-1; + return tempht; +} + +/* +U8 CreateCodeSelector(U8 phy_add) +{ + U8 result,*d,*d1,old_flags=GetFlags; + Cli; + result=*FREE_GDT_LIST; + d=GDTTAB+result; + *FREE_GDT_LIST=*d; + d=result+GDTTAB; + d1=d+4; + *d =0x0000FFFF; + *d1=0x00CF9A00; + d=d+2; + *d+=(phy_add & 0x00FFFFFF); + *d1+=(phy_add & 0xFF000000); + SetFlags(old_flags); + return result; +} +U8 CreateTssSelector(U8 phy_add) +{ + U8 result,*d,*d1,old_flags=GetFlags; + Cli; + result=*FREE_GDT_LIST; + d=GDTTAB+result; + *FREE_GDT_LIST=*d; + d=result+GDTTAB; + d1=d+4; + *d =sizeof(TssStruct)-1; + *d1=0x00008900; + d=d+2; + *d+=(phy_add & 0x00FFFFFF); + *d1+=(phy_add & 0xFF000000); + SetFlags(old_flags); + return result; +} +*/ + +U8 CreateMemSelector(U8 phy_add) +{ + U8 result,old_flags=GetFlags; + U4 *d,*d1; + Cli; + result=free_gdt_list; + d=&gdttab+result; + free_gdt_list=*d; + d1=d+4; + *d =0x0000FFFF; + *d1=0x00CF9200; + d=d+2; + *d +=(phy_add & 0x00FFFFFF); + *d1+=(phy_add & 0xFF000000); + SetFlags(old_flags); + return result; +} + +void AddTaskToQueue(TssStruct *tss,TssStruct *pred=NULL) +{ + TssStruct *last; + U8 old_flags=GetFlags; + if (!pred) pred=Fs; + Cli; + last=pred->last_tss; + last->next_tss=tss; + pred->last_tss=tss; + tss ->last_tss=last; + tss ->next_tss=pred; + SetFlags(old_flags); +} + +void AddTaskToChildQueue(TssStruct *tss) +{ + TssStruct *last,*pred; + U8 old_flags=GetFlags; + Cli; + pred=tss->parent_tss->last_child_tss; + last=pred->last_sibling_tss; + last->next_sibling_tss=tss; + pred->last_sibling_tss=tss; + tss ->last_sibling_tss=last; + tss ->next_sibling_tss=pred; + SetFlags(old_flags); +} + +asm {CP_INIT_TSS::} +U1 *InitTss(TssStruct *tss,U8 stk) +{ //Returns Fs of task + U1 *b; + U1 *result; + MemSet(tss,0,sizeof(TssStruct)); + tss->cs=SYS_CS_SEL; + tss->ds=ZERO_DS_SEL; + tss->es=ZERO_DS_SEL; + tss->gs=ZERO_DS_SEL; + tss->absolute_address=tss; + tss->io_bitmap_ptr=TSS_IO_BITMAP; + tss->next_tss=tss; + tss->last_tss=tss; + tss->eflags=SYS_DEFAULT_FLAGS; + tss->cr3=SYS_DEFAULT_CR3; + tss->optimization=0x7F; + b=&tss->next_child_tss-offset(TssStruct.next_sibling_tss); + tss->next_child_tss=b; + tss->last_child_tss=b; + b=&tss->next_servant_cmd; + tss->next_servant_cmd=b; + tss->last_servant_cmd=b; + b=&tss->next_master_cmd; + tss->next_master_cmd=b; + tss->last_master_cmd=b; + b=&tss->next_mem_blk; + tss->next_mem_blk=b; + tss->last_mem_blk=b; + b=&tss->next_lex; + tss->next_lex=b; + tss->last_lex=b; + b=&tss->next_except; + tss->next_except=b; + tss->last_except=b; + b=&tss->next_ode; + tss->next_ode=b; + tss->last_ode=b; + + result=CreateMemSelector(tss); + tss->fs=result; + tss->hash_table=NewHashTable(0x1000,tss); + b=MAlloc(stk,tss); + tss->stack_base=b; + b=b+stk; + tss->esp0=b; + tss->esp1=b; + tss->esp2=b; + tss->esp=b; + tss->ss0=ZERO_DS_SEL; + tss->ss1=ZERO_DS_SEL; + tss->ss2=ZERO_DS_SEL; + tss->ss=ZERO_DS_SEL; + MemSet(tss->io_bitmap,0xFF,MAXIO>>3); + Bts(&tss->task_flags,TSSf_PREEMPT); + return result; +} + +asm {CP_SPAWN_TASK::} +TssStruct *Spawn(U1 *start_add,I1 *desc=NULL, + TssStruct *parent=NULL, //NULL means adam + I1 *account=NULL, + U8 stk=DEFAULT_STACK) +{ + U8 d,old_flags=GetFlags; + TssStruct *tss=AMAlloc(sizeof(TssStruct)); + SysAccntStruct *my_FindSysAccnt(I1 *name); + SysAccntStruct *tempa; + if (!parent) parent=adam_tss; + InitTss(tss,stk); + tss->eip=start_add; + tss->esp-=4; + *tss->esp=&Exit; + tss->parent_tss=parent; + tss->hash_table->next=parent->hash_table; + if (!desc) desc="USER CMD"; + MemCpy(tss->task_descriptor,desc,TSS_DESC_LENGTH); + tss->account=tss->parent_tss->account; + if (account) { + if (d=FindExtern("FindSysAccnt")) { + my_FindSysAccnt=d; + if (tempa=my_FindSysAccnt(account)) + tss->account=tempa; + } + } + Cli; + //The following is a convenient way to + //initialize the FPU, but not very professional. + //I'll fix it when I have time. + MemCpy(&tss->fpu,&parent->fpu,108); + + AddTaskToQueue(tss); + AddTaskToChildQueue(tss); + Bts(&sys_flags,SYSf_TASK_LINKS_ALTERED); + SetFlags(old_flags); + return tss; +} + + +TssCmdStruct *QueueTaskRequest(TssStruct *servant,TssStruct *master, + I1 *data,U8 flags) +{ + U8 old_flags=GetFlags; + TssCmdStruct *result; + if (!data) return; + result=AMAlloc(sizeof(TssCmdStruct)); + result->master_tss=master; + Bts(&flags,TSSCf_TEXT); + Bts(&flags,TSSCf_NOT_INPUT); + result->flags=flags; + result->data=ANewString(data); + Cli; + InsQue(result,servant->last_servant_cmd); + if (Bt(&flags,TSSCf_WAKE_MASTER)) { + Bts(&master->task_flags,TSSf_SUSPENDED); + SwapInNext; + } + SetFlags(old_flags); + return result; +} + +TssCmdStruct *QueueTextInput(TssStruct *servant,TssStruct *master, + I1 *data,U8 flags) +{ + U8 old_flags=GetFlags; + BoolU4 old_preempt=Preempt(OFF); + U1 *input_filter_start_add; + TssCmdStruct *result; + TssStruct *tss; + if (!data) return; + result=AMAlloc(sizeof(TssCmdStruct)); + result->master_tss=master; + Bts(&flags,TSSCf_TEXT); + result->flags=flags; + result->data=ANewString(data); + + if (input_filter_start_add=FindExtern("InputFilterTask")) { + if (Bt(&servant->task_flags,TSSf_INPUT_FILTER_TASK)) + servant=servant->parent_tss; + tss=Spawn(input_filter_start_add, + "Input Filter",servant); + tss->input_filter_tss=servant->input_filter_tss; + servant->input_filter_tss=tss; + Cli; + InsQue(result,tss->last_servant_cmd); + if (Bt(&flags,TSSCf_WAKE_MASTER)) { + Bts(&master->task_flags,TSSf_SUSPENDED); + SwapInNext; + } + SetFlags(old_flags); + } else { + AFree(result); + result=NULL; + } + Preempt(old_preempt); + return result; +} + +TssCmdStruct *QueueMsg(TssStruct *servant,TssStruct *master, + U8 code,U8 p1,U8 p2,U8 flags) +{ + TssCmdStruct *tempc1,*tempc=AMAlloc(sizeof(TssCmdStruct)); + U8 old_flags=GetFlags; + tempc->master_tss=master; + tempc->code=code; + tempc->p1=p1; + tempc->p2=p2; + tempc->flags=flags; + tempc->data=NULL; + if (Bt(&sys_flags,SYSf_RECORD_MACRO) && + servant!=macro_util_tss && + code==MSG_KEY_DOWN) { + tempc1=AMAllocIdentical(tempc); + InsQue(tempc1,sys_macro_queue.last); + } + Cli; + if (Bt(&servant->task_flags,TSSf_FILTER_INPUT) && + !Bt(&flags,TSSCf_DONT_FILTER)) + servant=servant->input_filter_tss; + InsQue(tempc,servant->last_servant_cmd); + if (Bt(&flags,TSSCf_WAKE_MASTER)) { + Bts(&master->task_flags,TSSf_SUSPENDED); + SwapInNext; + } + SetFlags(old_flags); + return tempc; +} + +BoolU4 GetRequestResult(TssCmdStruct *rqst=NULL,U8 *result=NULL) +{ + U8 old_flags=GetFlags; + TssCmdStruct *tempc,*tempc1; + Cli; + tempc1=&Fs->next_master_cmd; + tempc=tempc1->next; + while (tempc!=tempc1) { + if (!rqst || rqst==tempc) { + RemQue(tempc); + if (result) + *result=tempc->result; + AFree(tempc->data); + AFree(tempc); + SetFlags(old_flags); + return TRUE; + } + tempc=tempc->next; + } + SetFlags(old_flags); + return FALSE; +} + +void Msg(U8 code,U8 p1,U8 p2,U8 flags=0) +{ + if (Bt(&Fs->task_flags,TSSf_INPUT_FILTER_TASK)) { + QueueMsg(Fs->parent_tss,0,code,p1,p2, + flags| 1<next_servant_cmd; + tempc=tempc1->next; + while (tempc!=tempc1) { + tempc2=tempc->next; + if (Bt(&tempc->flags,TSSCf_NOT_INPUT)) { + RemQue(tempc); + SetFlags(old_flags); + tempc->result=my_ExecuteString(tempc->data,sys_temp_filename); + if (master=tempc->master_tss) { + if (!Bt(&tempc->flags,TSSCf_EXIT_ON_COMPLETE)) { + Cli; + InsQue(tempc,master->last_master_cmd); + SetFlags(old_flags); + } + if (Bt(&tempc->flags,TSSCf_FOCUS_MASTER) && + Bt(&master->task_flags,TSSf_LOCAL_USER)) + sys_cur_focus_task=master; + if (Bt(&tempc->flags,TSSCf_WAKE_MASTER)) + Btr(&master->task_flags,TSSf_SUSPENDED); + if (!Bt(&tempc->flags,TSSCf_EXIT_ON_COMPLETE)) + goto start_over; + else { + AFree(tempc->data); + AFree(tempc); + Exit; + } + } else { + if (!Bt(&tempc->flags,TSSCf_EXIT_ON_COMPLETE)) { + AFree(tempc->data); + AFree(tempc); + goto start_over; + } else { + AFree(tempc->data); + AFree(tempc); + Exit; + } + } + } //TODO: figure-out how to handle build-up of input + tempc=tempc2; + } + SetFlags(old_flags); +} + +void ContinueServantTask() +{ + while (TRUE) { + Btr(&Fs->task_flags,TSSf_IDLE); + HandleServantCmds; + Bts(&Fs->task_flags,TSSf_IDLE); + SwapInNext; + } +} + +I1 *HomeDirString() +{ + I1 *result=MAlloc(128); + SysAccntStruct *sa=Fs->account; + StrCpy(result,"::/LT/ACCOUNTS/"); + if (sa) + StrCat(result,sa->name); + else + StrCat(result,"USER"); + *result=PartitionToDrive(default_partition); + return result; +} + +void InitSysTask() +{ + InitCrt; + CursorOff; + Fs->text_attribute=(WHITE<<4)+PURPLE; + Fs->border_attribute=(WHITE<<4)+LTPURPLE; + Fs->window_top++; + CursorHome; +} + +void InitLocalTask() +{ + InitCrt; + Bts(&Fs->crt_flags,CRTf_HAS_CLOSE_WINDOW); + CursorOff; + Fs->text_attribute=(WHITE<<4)+BLUE; + Fs->border_attribute=(WHITE<<4)+LTBLUE; + Fs->window_top=13; + CursorHome; + Cd("HOME"); + my_WindowToTop(Fs); +} + +void InitUserTask() +{ + Bts(&Fs->task_flags,TSSf_LOCAL_USER); + InitLocalTask; +} + + +asm {CP_USER_CMD_LINE::} +void UserCmdLine() +{ + void my_ContinueUserTask(); + InitUserTask; + Fs->user_num=++num_spawned_users; + my_ExecuteFile("USER.CPZ"); + my_ContinueUserTask=FindExtern("ContinueUserTask"); + my_ContinueUserTask(); +} + +void SysCmdLine() +{ + InitSysTask; + Cd("HOME"); + my_ExecuteFile("SYSTEM.CPZ"); + ContinueServantTask; +} + +void ServantUserCmdLine() +{ + InitUserTask; + my_ExecuteFile("SERVANT.CPZ"); + ContinueServantTask; +} + +asm {CP_FAULT_CMD_LINE::} +void FaultCmdLine() +{ + void my_ContinueUserTask(); + InitUserTask; + my_ExecuteFile("FAULT.CPZ"); + my_ContinueUserTask=FindExtern("ContinueUserTask"); + my_ContinueUserTask(); +} + +asm {END_TASK::} +U8 EndTask() +{ + TssStruct *tempt,*tempt1; + TssCmdStruct *tempc,*tempc1,*tempc2; + U8 my_fs; + U4 *d; + if (Fs->end_task_cb) { + Btr(&Fs->task_flags,TSSf_KILL_TASK); + Fs->eip=Fs->end_task_cb; + Fs->end_task_cb=NULL; + return Fs->fs; + } + Cli; + if (sys_cur_focus_task==Fs) { + sys_cur_focus_task=0; + ip_inhibit_win_operations=FALSE; + } + ReleaseTaskPartitions; + tempt1=&Fs->next_child_tss-offset(TssStruct.next_sibling_tss); + tempt=tempt1->next_sibling_tss; + if (tempt!=tempt1) { + do { + Bts(&tempt->task_flags,TSSf_KILL_TASK); + tempt=tempt->next_sibling_tss; + } while (tempt!=tempt1); + return Fs->next_tss->fs; + } + Btr(&sys_flags,SYSf_PREEMPTIVE); + Bts(&sys_flags,SYSf_CLEAR_SCREEN_TEXT); + + tempc1=&Fs->next_servant_cmd; + tempc=tempc1->next; + while (tempc!=tempc1) { + tempc2=tempc->next; + AFree(tempc->data); + AFree(tempc); + tempc=tempc2; + } + + tempc1=&Fs->next_master_cmd; + tempc=tempc1->next; + while (tempc!=tempc1) { + tempc2=tempc->next; + AFree(tempc->data); + AFree(tempc); + tempc=tempc2; + } + +//Remque + tempt =Fs->next_sibling_tss; + tempt1=Fs->last_sibling_tss; + tempt1->next_sibling_tss=tempt; + tempt ->last_sibling_tss=tempt1; + tempt =Fs->next_tss; + tempt1=Fs->last_tss; + tempt1->next_tss=tempt; + tempt ->last_tss=tempt1; + Bts(&sys_flags,SYSf_TASK_LINKS_ALTERED); + FreeMemBlkList; + my_fs=Fs->fs; + AFree(Fs); + d=&gdttab+my_fs; + *d=*free_gdt_list; + *free_gdt_list=my_fs; + return tempt->fs; +} + \ No newline at end of file diff --git a/LT/OSMain/COMPRESS.CPZ b/LT/OSMain/COMPRESS.CPZ new file mode 100644 index 0000000..ad1e96d --- /dev/null +++ b/LT/OSMain/COMPRESS.CPZ @@ -0,0 +1,209 @@ +// The following algorithm came from a magazine +// and I implimented it when I worked for Ticketmaster. + +void ArcCompressBuf(ArcCs *c) +{ + ArcTableEntry *temp,*temp1; + U8 basecode; + U1 *src_ptr,*src_limit,ch; + + src_ptr=c->src_buf+c->src_pos; + src_limit=c->src_buf+c->src_size; + + if (c->saved_basecode==0xFFFFFFFF) + basecode=*src_ptr++; + else + basecode=c->saved_basecode; + + while (src_ptrdst_pos+c->cur_bits_in_use<=c->dst_size) { + ArcGetTableEntry(c); + + arc_start_loop1: + if (src_ptr>=src_limit) goto arc_done_compression; + ch=*src_ptr++; + if (temp=c->hash[basecode]) + do { + if (temp->ch==ch) { + basecode=(temp-&c->compress[0])>>3; + goto arc_start_loop1; + } + } while (temp=temp->next); + + OrWordBitField(c->dst_buf,c->dst_pos,basecode); + c->dst_pos+=c->cur_bits_in_use; + + c->entry_used=TRUE; + temp=c->cur_entry; + temp->basecode=basecode; + temp->ch=ch; + temp1=&c->hash[basecode]; + temp->next=temp1->next; + temp1->next=temp; + + basecode=ch; + } +arc_done_compression: + c->saved_basecode=basecode; + c->src_pos=src_ptr-c->src_buf; +} + +void ArcFinishCompression(ArcCs *c) +{ + if (c->dst_pos+c->cur_bits_in_use<=c->dst_size) { + OrWordBitField(c->dst_buf,c->dst_pos,c->saved_basecode); + c->dst_pos+=c->cur_bits_in_use; + } +} + +void ArcExpandBuf(ArcCs *c) +{ + U1 *dst_ptr,*dst_limit; + U8 basecode,lastcode,code; + ArcTableEntry *temp,*temp1; + + dst_ptr=c->dst_buf+c->dst_pos; + dst_limit=c->dst_buf+c->dst_size; + + while (dst_ptrstack_ptr!=c->stack_base) + *dst_ptr++ = * -- c->stack_ptr; + + if (c->stack_ptr==c->stack_base && dst_ptrsaved_basecode==0xFFFFFFFF) { + lastcode=ExtractWordBitField(c->src_buf,c->src_pos, + c->next_bits_in_use); + c->src_pos=c->src_pos+c->next_bits_in_use; + *dst_ptr++=lastcode; + ArcGetTableEntry(c); + c->last_ch=lastcode; + } else + lastcode=c->saved_basecode; + while (dst_ptrsrc_pos+c->next_bits_in_use<=c->src_size) { + basecode=ExtractWordBitField(c->src_buf,c->src_pos, + c->next_bits_in_use); + c->src_pos+=c->next_bits_in_use; + if (c->cur_entry==&c->compress[basecode]) { + *c->stack_ptr++=c->last_ch; + code=lastcode; + } else + code=basecode; + while (code>=c->min_table_entry) { + *c->stack_ptr++=c->compress[code].ch; + code=c->compress[code].basecode; + } + *c->stack_ptr++=code; + c->last_ch=code; + + c->entry_used=TRUE; + temp=c->cur_entry; + temp->basecode=lastcode; + temp->ch=c->last_ch; + temp1=&c->hash[lastcode]; + temp->next=temp1->next; + temp1->next=temp; + + ArcGetTableEntry(c); + while (dst_ptrstack_ptr!=c->stack_base) + *dst_ptr++ = * -- c->stack_ptr; + lastcode=basecode; + } + c->saved_basecode=lastcode; + } + c->dst_pos=dst_ptr-c->dst_buf; +} + +ArcCs *NewArcCs(BoolU4 expand,BoolU4 text_only) +{ + ArcCs *c; + c=MAllocZ(sizeof(ArcCs)); + if (expand) { + c->stack_base=MAlloc(ARC_MAX_TABLE_ENTRY+1); + c->stack_ptr=c->stack_base; + } + if (text_only) + c->min_bits=7; + else + c->min_bits=8; + c->min_table_entry=1<min_bits; + c->free_index=c->min_table_entry; + c->next_bits_in_use=c->min_bits+1; + c->free_limit=1<next_bits_in_use; + c->saved_basecode=0xFFFFFFFF; + c->entry_used=TRUE; + ArcGetTableEntry(c); + c->entry_used=TRUE; + return c; +} + +void DelArcCs(ArcCs *c) +{ + Free(c->stack_base); + Free(c); +} + + +ArcCompressStruct *CompressBuf(U1 *src,U8 size, + U8 flags=0) +{ + U8 size_out; + ArcCompressStruct *result; + BoolU4 text_only=(ArcDetermineCompressionType(src,size)==CT_7_BIT); + ArcCs *c=NewArcCs(FALSE,text_only); + c->src_size=size; + c->src_buf=src; + c->dst_size=(size+sizeof(ArcCompressStruct)-1)<<3; + c->dst_buf=MAllocZ(c->dst_size>>3); + c->dst_pos=(sizeof(ArcCompressStruct)-1)<<3; + ArcCompressBuf(c); + ArcFinishCompression(c); + if (c->src_pos==c->src_size) { + size_out=(c->dst_pos+7)>>3; + result=MAlloc(size_out); + MemCpy(result,c->dst_buf,size_out); + result->compression_type=(text_only) ? CT_7_BIT:CT_8_BIT; + result->compressed_size=size_out; + } else { + result=MAlloc(size+sizeof(ArcCompressStruct)-1); + MemCpy(result->body,src,size); + result->compression_type=CT_NONE; + result->compressed_size=size+sizeof(ArcCompressStruct)-1; + } + result->expanded_size=size; + result->flags=flags; + Free(c->dst_buf); + DelArcCs(c); + return result; +} + +U1 *ExpandBuf(ArcCompressStruct *r) +{ + ArcCs *c; + ArcCompressStruct *r2=r; + U1 *result; + BoolU4 text_only; + result=MAlloc(r2->expanded_size+1); + result[r2->expanded_size]=0; //terminate + + text_only=(r2->compression_type==CT_7_BIT); + if (r2->compression_type==CT_NONE) { + MemCpy(result,r2->body,r2->expanded_size); + goto expand_end; + } + c=NewArcCs(TRUE,text_only); + c->src_size=r2->compressed_size<<3; + c->src_pos=(sizeof(ArcCompressStruct)-1)<<3; + c->src_buf=r2; + c->dst_size=r2->expanded_size; + c->dst_buf=result; + c->dst_pos=0; + ArcExpandBuf(c); + DelArcCs(c); + +expand_end: + if (r2!=r) + Free(r2); + return result; +} + diff --git a/LT/OSMain/CRT.CPZ b/LT/OSMain/CRT.CPZ new file mode 100644 index 0000000000000000000000000000000000000000..13e05439881fa1d13cdc3690f65c90c78163e1d3 GIT binary patch literal 4678 zcmdPb!U}k~I0Hh1Jvd#R0(iMNef`5gEFITi5Dy~Z7y(z~;t5d`6~XE17@-qts1WQH zAK)0|=xZ45>J$(Qk>zys&@rfRGl243T|9L{O%$SCoa3GSeL!j)U0gUpqDH)2oX)-h zV77&UmXWCzNW{y}mD9n&(8$g1_m(O zLyZ)oU0pn5bs*mG2ipen5Qv2k1N%P6HH4Q7Yba@H>GN{&a+T$0rYN`+C6+s9Bo=9S zS|}uEXe#LI2PKv(cv=S_LIVIv~ObERva~ppl$mYwPS0 zAL8hwsQ^~5fH2Y7BR)95(b-iKtXe^#JR>tFRY4;qIX*c*M?p=&ToYujf&xx0wF;>@ z#i4JsTB3=9mkVL^|>>DtiffGX3+=063n-i*}D^o$aSzdc+%-917yHMO9j z0d~KFLP1H9k*!*KQCfapNwh|ChMGZzo13PVMJ!Z4Ex$-XBh%KvI@89&I#XL49{dX6 zWM&IaX4=|N)nN0qZJ}1!*%?E{YavdCL@rcyEiYFsJbAkpIp?G%78z-{7dd5?_$C%8 zXeA{Ur)ok|cX4@UNpgmQ21rcTuB5Uc74DAY#Nt#1C*KfIHun!Qv4Ys7px~RD8=P7K z)sd8+QmJF01LbArm82HsCFaC~lLgo!T{}ovY1-KtLLvv0-jj+_6SJXSfZOBi@8?gs zEymbv!4@QFA!6$n>f-|o7Eq2;1ceDSiNQlLy$CD{b~-4PK>`IX4U+_izf*pGPN<23 zb7@g=evyA(aB@*G8p6%ZK`}QcHLV1vlR%Ov zZYo02TLj7=Fef?t`vlwA7~yafSSi9yP{q0?;6N@)Eh#O^Qve54GB_mT%TkL<>}*RE z)YN#nI2FLbgd}5Qn}kIsBfrSbHV3?Ba) za4IR%PyU#~1{(f%1~M$gW_yKWeijdTr!}fdzd3| z`%2NNq&IO2g<%K*5ZxrX;@rtOROio;7mm z3NBm2!TC2NwW0*>08a~r3Y|)@zR`RRE8y_v^H39TwFeHePz!|=P@@Xm(9s5GeNYyO zPb?`Z%1kOPNwu-D0OeQ(1#l%=X zQc{ahWi7#u0?C4G09UrQ&=MV5dZH+R z)W9$m;Q9eB56ubSxPhsFnxSift_qZ2Y#~7avK*?nB)`BG;a;d9q^5zH2)0uf(rSie zBv5{ZWu?U8T!m`qfcSvWka$l+E2~;-XxluXv;?VX4sEi8S}5dJ#`~0{!DM|((iF6E zbinO*9feQ}h2mr#Xx*EilM-K0l$x4bPyz{Ubj?N@J|WH-c{vJN$r*VtGr&eb)Po9d zMW+(1g<`O$kE>q@YC&IISsb5SS`=TLoR}A%oS%}apr#P)>=qyF9OUoggOs>H2E!Dm zYUHrrSbdoc43}A*MjORp&JKNNXl4#e6ka(XEH)!;O+Q*!r&;g|| zP*CQSq$#MWp~kr;*yAWhfr|;Kda&I(Aoqj94^lk`M+T?G2L!pg`UZq}hPi5joCde2 zD7PdYlmH-M5Ai;V=|*su2Kj2c^XhCiCV9N-Q^akss!u!6-8Ma!*CED7c zV8fCKq5V>FlOf1DPH4_Swn;&OKrZm@qhTz*1^4 pxL_ib5JB+;cLyj1284zLBd0x(0year); + i2=YearStartDate(d->year+1); + if (i2-i1==365) + i1+=month_start_days1[d->month-1]; + else + i1+=month_start_days2[d->month-1]; + ltdt.date=i1+d->day_of_month-1; + ltdt.time=DivU8((d->ten_thousandths+10000*(d->seconds+60*(d->minutes+60*d->hours)))<<21,(15*15*3*625)); + return ltdt; +} + +U1 DayOfWeek(I4 i) +{ + return (i+LT_BASE_DAY_OF_WEEK) % 7; +} + +void ToLTDateStruct(LTDateStruct *d,LTDate ltdt) +{ + I4 i,date=ltdt.date; + U4 k; + d->day_of_week=DayOfWeek(date); + d->year=DivI8(MulI8(date,100000),36524225); + i=YearStartDate(d->year); + date-=i; + if (YearStartDate(d->year+1)-i==365) { + k=0; + while (date>=month_start_days1[k+1] && k<11) + k++; + date-=month_start_days1[k]; + } else { + k=0; + while (date>=month_start_days2[k+1] && k<11) + k++; + date-=month_start_days2[k]; + } + d->month=k+1; + d->day_of_month=date+1; + k=MulU8(625*15*15*3,ltdt.time)>>21+1; + d->ten_thousandths=k%10000; k/=100; + d->hundredths=k%100; k/=100; + d->seconds=k%60;k/=60; + d->minutes=k%60; + d->hours =k/60; +} + +I4 FirstDayOfMonth(I4 i) +{ + LTDateStruct d; + LTDate ltdt=0; + ltdt.date=i; + ToLTDateStruct(&d,ltdt); + d.day_of_month=1; + ltdt=ToLTDate(&d); + return ltdt.date; +} + +I4 LastDayOfMonth(I4 i) +{ + LTDateStruct d; + LTDate ltdt=0; + ltdt.date=i; + ToLTDateStruct(&d,ltdt); + d.month++; + if (d.month==13) { + d.month=0; + d.year++; + } + d.day_of_month=1; + ltdt=ToLTDate(&d); + return ltdt.date-1; +} + +I4 FirstDayOfYear(I4 i) +{ + LTDateStruct d; + LTDate ltdt=0; + ltdt.date=i; + ToLTDateStruct(&d,ltdt); + d.day_of_month=1; + d.month=1; + ltdt=ToLTDate(&d); + return ltdt.date; +} + +I4 LastDayOfYear(I4 i) +{ + LTDateStruct d; + LTDate ltdt=0; + ltdt.date=i; + ToLTDateStruct(&d,ltdt); + d.day_of_month=1; + d.month=1; + d.year++; + ltdt=ToLTDate(&d); + return ltdt.date-1; +} + + +I8 Bcd2Bin(U8 b) +{ + I8 i,result=0; + for (i=0;i<16;i++) { + result=MulU8(result,10)+DivU8(b,0x1000000000000000); + b<<=4; + } + return result; +} + + +void GetCurTimeLTDateStruct(LTDateStruct *r) +{ + I8 i; + U8 old_flags=GetFlags; + U1 *p=r; + + MemSet(r,0,sizeof(LTDateStruct)); + Cli; + do OutP(0x70,0x0A); + while (InP(0x71) & 0x80); + + OutP(0x70,0); + p[3]=InP(0x71); + OutP(0x70,2); + p[4]=InP(0x71); + OutP(0x70,4); + p[5]=InP(0x71); + + OutP(0x70,6); + p[6]=InP(0x71); + OutP(0x70,7); + p[7]=InP(0x71); + OutP(0x70,8); + p[8]=InP(0x71); + OutP(0x70,9); + p[9]=InP(0x71); + + SetFlags(old_flags); + + OutP(0x70,0x0B); + if (!(InP(0x71) & 4)) { + for (i=3;i<10;i++) + p[i]=Bcd2Bin(p[i]); + } + r->year+=2000; +} + +LTDate GetCurTimeLTDate() +{ + LTDateStruct r; + GetCurTimeLTDateStruct(&r); + return ToLTDate(&r); +} + +void LTDateToISO(ISODate *dst,LTDate ltdate) +{ + LTDateStruct d; + ToLTDateStruct(&d,ltdate); + dst->year=d.year-ISO_BASE_YEAR; + dst->mon=d.month; + dst->day=d.day_of_month; + dst->hour=d.hours; + dst->min=d.minutes; + dst->sec=d.seconds; + dst->hund=d.hundredths; +} + +LTDate ISOToLTDate(ISODate *dt) +{ + LTDateStruct ltdt; + ltdt.day_of_month=dt->day; + ltdt.month=dt->mon; + ltdt.year=dt->year+ISO_BASE_YEAR; + ltdt.ten_thousandths=dt->hund*100; + ltdt.hundredths=dt->hund; + ltdt.seconds=dt->sec; + ltdt.minutes=dt->min; + ltdt.hours=dt->hour; + return ToLTDate(<dt); +} + diff --git a/LT/OSMain/DISK1.CPZ b/LT/OSMain/DISK1.CPZ new file mode 100644 index 0000000000000000000000000000000000000000..f14ad9b5f51d8ecece58924abf691843f5fc7407 GIT binary patch literal 3674 zcmXTR&rDJ932|}u%*!lsPE5{7)d;mvD9)@(jnB-B4>c^-p zm89ktBwK?-LoF0Cb&~T+z#OOi{G3n|h5Ve9_=2L;)ZBs++W-iy;qT_AY0b+8(&Fe= zl$xpmveGHBI29zSpnwqbNG#3>NleOtN@S)fXdpSp#-PH;z`#IL0qi7@qgT1-TLCI$K9y$DEw}WMnr$^ng_OrB;;0 z=Ms~vI-Oi+L#7tWr7`}px~KT99WvF0oI@c(g1TC#0~`ou#B!<9>_--iNzVV zU;(IZFk9Cy2jm}Il4&`K>BY7NU>&uPhz8k%hzM9nf<)s(9G!ezmR6ivf)spuaL+(2Am5YVB!MIKfc+Y30nS1o7lCq5QcgB3 z*MRbeZBkCQf|>$2$s_q(*AU_^NZNxN08acwc?oPaJpTrz=7ORak$j-p6y_4bnNvXl zl-m?Rp$|$=@MMO==L!m#`3C9;aDsvO4$MSKSQyC&NdTO9pc>$b4M{H~Q6dR|HQ;a_ zYUn^S0M5`smx#~P0he;|Ibb{J5_nKIf&&0cCIyMd=YX?2IH7^~$+~u+#0GXFh##K^ z4x{)S^gsehCL;wkR2f`jGLi;}9HcY^=|eFMED0(5!E$-%hC<}fljD}0?2RB>W7#ZKsFfUxMUq(E>2J~1xIDFAtLNR27~=h zW{OvU*Eis@0c;s0WDJo45^O_xMrKZ`0;K3wgsOpOEs*tK&AN64wzdTdYHF~OI4LLF z7F2M+l`1IU2vd*;VL1_^8*HzF0@!KLQV(J=y4%1ia2g9On4n%ojqq&cRfU__Xq zf>u&#nvMb_=D>7vUJ0xK!iXKPGl_{;P$-d6ETKgbG$NAoN_2JMp$ZOsaJqn{!U7$5 z;(!*2U^SYcW&tRu!91`ISoII~2c+GBS^g;~_@?GM7gTDffi>#dCFQ47>VSgD$;TU9 z147D4Xgq<^K>^f2n1-BeP(skwh6;m1AGxT2=}#(6)3${f3Ra6Rdco1j%LT7KJoCyD zb23vBOF&H$I+|h{?QP7+LN)>QXP`-t?Byn037h()Q8B| zAjiWp3&>`$8l)J9W>m0eQF1FRQ^7PVD1hwJwS@#WD4s!j&@vxHI44^huB=ueHK#Zg zR*obUr6y*BLjfFH(9#KHFx*LC2V(JrHb@n$`G}N;;TqwE4%l5V=WA&|_34o0JG{=u Kk;rO!xflTK_cp2k literal 0 HcmV?d00001 diff --git a/LT/OSMain/DISK2.CPZ b/LT/OSMain/DISK2.CPZ new file mode 100644 index 0000000..8ce30a1 --- /dev/null +++ b/LT/OSMain/DISK2.CPZ @@ -0,0 +1,901 @@ +BoolU4 RAMRBlks(LTPartition *p,U1 *buf,U8 blk,U8 cnt) +{ + LTBlkDev *bdev=p->bdev; + CheckLTBlkDev(bdev); + MemCpy(buf,bdev->RAM_disk+blk*BLK_SIZE,cnt*BLK_SIZE); + return TRUE; +} + +BoolU4 RAMWBlks(LTPartition *p,U1 *buf,U8 blk,U8 cnt) +{ + LTBlkDev *bdev=p->bdev; + CheckLTBlkDev(bdev); + MemCpy(bdev->RAM_disk+blk*BLK_SIZE,buf,cnt*BLK_SIZE); + return TRUE; +} + +BoolU4 FileRBlks(LTPartition *p,U1 *buf,U8 blk,U8 cnt) +{ + LTBlkDev *bdev=p->bdev; + CheckLTBlkDev(bdev); + if (!bdev->f) + throw(EXCEPT_PARTITION,5); + if (!FRBlks(bdev->f,buf,blk,cnt)) + throw(EXCEPT_PARTITION,6); + FSync(bdev->f); + return TRUE; +} + +BoolU4 FileWBlks(LTPartition *p,U1 *buf,U8 blk,U8 cnt) +{ + LTBlkDev *bdev=p->bdev; + CheckLTBlkDev(bdev); + if (!bdev->f) + throw(EXCEPT_PARTITION,7); + if (!FWBlks(bdev->f,buf,blk,cnt)) + throw(EXCEPT_PARTITION,8); + FSync(bdev->f); + return TRUE; +} + +#define FDC_p0 0 +#define FDC_p1 1 +#define FDC_DOR 2 +#define FDC_p3 3 +#define FDC_STATUS 4 +#define FDC_DATA 5 +#define FDC_DIR 7 +#define FDC_DCR 7 + +void Irq06Handler() +{ + Bts(&sys_irq_flags,6); +} + + +void FDCFlushStatus(LTBlkDev *bdev) +{ + U1 b; + I8 i; + MemSet(bdev->status,0,32); + i=0; + while (i<32) { + b=InP(bdev->base0+FDC_STATUS); + if (b & 0x80) { + if (b & 0x40) + bdev->status[i++]=InP(bdev->base0+FDC_DATA); + else + break; + } + SwapInNext; + } + if (i==32) + throw(EXCEPT_FDC,2); + bdev->status[0]=bdev->status[0] & 0xC8; //clear non-error bits + bdev->last_jiffy=jiffies; +} + +void FDCWaitIrq(LTBlkDev *bdev) +{ + BoolU4 old_flags=GetFlags; + Sti; + while (!Btr(&sys_irq_flags,bdev->irq)) { +/* + if (!(InP(bdev->base0+FDC_p0) & 0x80)) //Pending IRQ? + throw(EXCEPT_FDC,1); +*/ + SwapInNext; + } + SetFlags(old_flags); + FDCFlushStatus(bdev); +} + + +void FDCSendCmdU1(LTBlkDev *bdev,U1 v) +{ + FDCFlushStatus(bdev); + OutP(bdev->base0+FDC_DATA,v); +} + +void FDCSeek(LTBlkDev *bdev,U1 cyl, U1 head) +{ + FDCSendCmdU1(bdev,0x0F); + FDCSendCmdU1(bdev,head<<2); + FDCSendCmdU1(bdev,cyl); + FDCWaitIrq(bdev); +} + +void FDCFree(LTBlkDev *bdev) +{ + Btr(&sys_irq_busy_flags,bdev->irq); +} + +void MonitorFDCTsk() +{ + LTBlkDev *bdev; + Preempt(OFF); + bdev=Fs->user_aux0; + CheckLTBlkDev(bdev); + while (TRUE) { + if (!Bts(&sys_irq_busy_flags,bdev->irq)) { + if (bdev->last_jiffy) { + if (jiffies > bdev->last_jiffy+JIFFY_FREQ<<1) { + FDCSeek(bdev,0,0); + FDCSeek(bdev,0,1); + OutP(bdev->base0+FDC_DOR,0x00); + bdev->last_jiffy=0; + } + } + FDCFree(bdev); + } + SwapInNext; + } +} + + +void FDCGet(LTBlkDev *bdev) +{ + CheckLTBlkDev(bdev); + while (Bts(&sys_irq_busy_flags,bdev->irq)) + SwapInNext; + Btr(&sys_irq_flags,bdev->irq); + + if (!bdev->last_jiffy) { + bdev->last_jiffy=jiffies; + OutP(bdev->base0+FDC_DOR,0x00); + BusyWait(100); + OutP(bdev->base0+FDC_DOR,0x1C); //Motor ON + FDCWaitIrq(bdev); + OutP(bdev->base0+FDC_DCR,0x00); //step,Load, Unload specs + FDCSendCmdU1(bdev,0x03); + FDCSendCmdU1(bdev,0xCF); + FDCSendCmdU1(bdev,0x10); + FDCWaitIrq(bdev); + FDCSendCmdU1(bdev,0x07); //Recalibrate + FDCSendCmdU1(bdev,0x00); + FDCWaitIrq(bdev); + } +} + +void FDCReset(LTBlkDev *bdev) +{ + CheckLTBlkDev(bdev); + OutP(0x0A,0x42); //Shut down old DMA + OutP(0x09,0x02); + bdev->last_jiffy=0; + Btr(&sys_irq_busy_flags,bdev->irq); + FDCGet(bdev); +} + +BoolU4 FDCReadTrack(LTBlkDev *bdev,U1 cyl, U1 head,U8 blk) +{ + I8 i; + U8 size=BLK_SIZE*FDC_DISK_SECTORS-1; + BoolU4 old_preempt=Preempt(OFF); + CheckLTBlkDev(bdev); + + for (i=0;i>8) & 0xFF); + OutP(0x81,FDC_DMA_BUF>>16); //set page + OutP(0x0C,0); + OutP(0x05,size.u1[0]); //cnt + OutP(0x05,size.u1[1]); + OutP(0x0A,0x02); //Start new DMA + OutP(0x09,0x06); + + FDCSendCmdU1(bdev,0x62); + FDCSendCmdU1(bdev,head<<2); + FDCSendCmdU1(bdev,cyl); + FDCSendCmdU1(bdev,head); + FDCSendCmdU1(bdev,1); //sector + FDCSendCmdU1(bdev,BLK_SIZE>>8); + FDCSendCmdU1(bdev,FDC_DISK_SECTORS); //last sec + FDCSendCmdU1(bdev,0x1B); //gap + FDCSendCmdU1(bdev,0xFF); + FDCWaitIrq(bdev); + if (bdev->status[0] || bdev->status[1] || + bdev->status[2]) { + coutln "FDC Read Error:",bdev->status[2],bdev->status[1],bdev->status[0]; + FDCReset(bdev); + } else { + Preempt(old_preempt); + return TRUE; + } + } + coutln "FDC Read Failed!!! Blk:",blk; + Preempt(old_preempt); + return FALSE; +} + +BoolU4 FDCRBlks(LTPartition *p,U1 *buf, U8 blk, U8 cnt) +{ + LTCacheBlk *tempc; + BoolU4 okay=TRUE; + U8 l,blk2; + U1 cyl,head,sec; + LTBlkDev *bdev=p->bdev; + CheckLTBlkDev(bdev); + while (cnt>0) { + if (bdev->flags & LTBDF_READ_CACHE) { + while (cnt) { + tempc=LTDCFindBlk(p,blk); //TODO preempt + if (tempc) { + MemCpy(buf,&tempc->body,BLK_SIZE); + cnt--; + buf+=BLK_SIZE; + blk++; + } else + break; + } + } + if (cnt) { + l=cnt; + if (l>bdev->max_reads) + l=bdev->max_reads; + blk2=blk; + sec=blk2%FDC_DISK_SECTORS+1;blk2=blk2/FDC_DISK_SECTORS; + head=blk2%FDC_DRIVE_HEADS; + cyl=blk2/FDC_DRIVE_HEADS; + if (!FDCReadTrack(bdev,cyl,head,blk-(sec-1))) + okay=FALSE; + MemCpy(buf,FDC_DMA_BUF+BLK_SIZE*(sec-1),l*BLK_SIZE); + if (bdev->flags & LTBDF_READ_CACHE) + LTDCAdd(DriveToPartition(bdev->partition_base), + FDC_DMA_BUF,blk-(sec-1),FDC_DISK_SECTORS); + buf+=l*BLK_SIZE; + blk+=l; + cnt-=l; + disk_status_display.u2[0]=disk_status_display.u2[0]-l; + } + } + return okay; +} + +BoolU4 FDCWriteBlk2(LTBlkDev *bdev,U1 *buf, U1 cyl, U1 head,U1 sec,U8 blk) +{ + I8 i; + U8 size=BLK_SIZE*bdev->max_writes-1; + BoolU4 old_preempt; + + old_preempt=Preempt(OFF); + for (i=0;i>8) & 0xFF); + OutP(0x81,FDC_DMA_BUF>>16); //set page + OutP(0x0C,0); + OutP(0x05,size.u1[0]); //cnt + OutP(0x05,size.u1[1]); + OutP(0x0A,0x02); //Start new DMA + OutP(0x09,0x06); + + FDCSendCmdU1(bdev,0xC5); + FDCSendCmdU1(bdev,head<<2); + FDCSendCmdU1(bdev,cyl); + FDCSendCmdU1(bdev,head); + FDCSendCmdU1(bdev,sec); + FDCSendCmdU1(bdev,BLK_SIZE>>8); + FDCSendCmdU1(bdev,FDC_DISK_SECTORS); //last sec + FDCSendCmdU1(bdev,0x1B); //gap + FDCSendCmdU1(bdev,0xFF); + FDCWaitIrq(bdev); + if (bdev->status[2] || bdev->status[1] || + bdev->status[0]) { + coutln "FDC Write Error:",bdev->status[0],bdev->status[1],bdev->status[2]; + FDCReset(bdev); + } else { + Preempt(old_preempt); + return TRUE; + } + } + coutln "FDC Write Failed!!! Blk:",blk; + Preempt(old_preempt); + return FALSE; +} + +BoolU4 FDCWBlks(LTPartition *p,U1 *buf, U8 blk, U8 cnt) +{ + BoolU4 okay=TRUE; + U8 l,blk2; + U1 cyl,head,sec; + LTBlkDev *bdev=p->bdev; + CheckLTBlkDev(bdev); + while (cnt>0) { + l=cnt; + if (l>bdev->max_writes) + l=bdev->max_writes; + blk2=blk; + sec=blk2%FDC_DISK_SECTORS+1;blk2=blk2/FDC_DISK_SECTORS; + head=blk2%FDC_DRIVE_HEADS; + cyl=blk2/FDC_DRIVE_HEADS; + if (!FDCWriteBlk2(bdev,buf,cyl,head,sec,blk)) + okay=FALSE; + buf+=l*BLK_SIZE; + blk+=l; + cnt-=l; + disk_status_display.u2[0]=disk_status_display.u2[0]-l; + } + return okay; +} + + + +//The following definitions were copied from Linux source code +/* ATA/ATAPI Cmds pre T13 Spec */ +#define WIN_NOP 0x00 +#define CFA_REQ_EXT_ERROR_CODE 0x03 /* CFA Request Extended Error Code */ +#define WIN_SRST 0x08 /* ATAPI soft reset cmd */ +#define WIN_DEV_RESET 0x08 +#define WIN_RESTORE 0x10 +#define WIN_READ 0x20 /* 28-Bit */ +#define WIN_READ_EXT 0x24 /* 48-Bit */ +#define WIN_READDMA_EXT 0x25 /* 48-Bit */ +#define WIN_READDMA_QUEUED_EXT 0x26 /* 48-Bit */ +#define WIN_READ_NATIVE_MAX_EXT 0x27 /* 48-Bit */ +#define WIN_MULTREAD_EXT 0x29 /* 48-Bit */ +#define WIN_WRITE 0x30 /* 28-Bit */ +#define WIN_WRITE_EXT 0x34 /* 48-Bit */ +#define WIN_WRITEDMA_EXT 0x35 /* 48-Bit */ +#define WIN_WRITEDMA_QUEUED_EXT 0x36 /* 48-Bit */ +#define WIN_SET_MAX_EXT 0x37 /* 48-Bit */ +#define CFA_WRITE_SECT_WO_ERASE 0x38 /* CFA Write Sectors without erase */ +#define WIN_MULTWRITE_EXT 0x39 /* 48-Bit */ +#define WIN_WRITE_VERIFY 0x3C /* 28-Bit */ +#define WIN_VERIFY 0x40 /* 28-Bit - Read Verify Sectors */ +#define WIN_VERIFY_EXT 0x42 /* 48-Bit */ +#define WIN_FORMAT 0x50 +#define WIN_INIT 0x60 +#define WIN_SEEK 0x70 +#define CFA_TRANSLATE_SECTOR 0x87 /* CFA Translate Sector */ +#define WIN_DIAGNOSE 0x90 +#define WIN_SPECIFY 0x91 /* set Drive geometry translation */ +#define WIN_DOWNLOAD_MICROCODE 0x92 +#define WIN_STANDBYNOW2 0x94 +#define WIN_SETIDLE2 0x97 +#define WIN_CHECKPOWERMODE2 0x98 +#define WIN_SLEEPNOW2 0x99 +#define WIN_PACKETCMD 0xA0 /* Send a packet cmd. */ +#define WIN_PIDENTIFY 0xA1 /* IDEntify ATAPI dev */ +#define WIN_QUEUED_SERVICE 0xA2 +#define WIN_SMART 0xB0 /* self-monitoring and reporting */ +#define CFA_ERASE_SECTORS 0xC0 +#define WIN_MULTREAD 0xC4 /* read sectors using multiple mode*/ +#define WIN_MULTWRITE 0xC5 /* write sectors using multiple mode */ +#define WIN_SETMULT 0xC6 /* enable/disable multiple mode */ +#define WIN_READDMA_QUEUED 0xC7 /* read sectors using Queued DMA transfers */ +#define WIN_READDMA 0xC8 /* read sectors using DMA transfers */ +#define WIN_WRITEDMA 0xCA /* write sectors using DMA transfers */ +#define WIN_WRITEDMA_QUEUED 0xCC /* write sectors using Queued DMA transfers */ +#define CFA_WRITE_MULTI_WO_ERASE 0xCD /* CFA Write multiple without erase */ +#define WIN_GETMEDIASTATUS 0xDA +#define WIN_DOORLOCK 0xDE /* lock door ON removable drives */ +#define WIN_DOORUNLOCK 0xDF /* unlock door ON removable drives */ +#define WIN_STANDBYNOW1 0xE0 +#define WIN_IDLEIMMEDIATE 0xE1 /* force Drive to become "ready" */ +#define WIN_STANDBY 0xE2 /* Set dev in Standby Mode */ +#define WIN_SETIDLE1 0xE3 +#define WIN_READ_BUFFER 0xE4 /* force read only 1 sector */ +#define WIN_CHECKPOWERMODE1 0xE5 +#define WIN_SLEEPNOW1 0xE6 +#define WIN_FLUSH_CACHE 0xE7 +#define WIN_WRITE_BUFFER 0xE8 /* force write only 1 sector */ +#define WIN_FLUSH_CACHE_EXT 0xEA /* 48-Bit */ +#define WIN_IDENTIFY 0xEC /* ask Drive to IDEntify itself */ +#define WIN_MEDIAELTECT 0xED +#define WIN_IDENTIFY_DMA 0xEE /* same as WIN_IDENTIFY, but DMA */ +#define WIN_SETFEATURES 0xEF /* set special Drive features */ +#define EXAU1_ENABLE_NEST 0xF0 +#define WIN_SECURITY_SET_PASS 0xF1 +#define WIN_SECURITY_UNLOCK 0xF2 +#define WIN_SECURITY_ERASE_PREPARE 0xF3 +#define WIN_SECURITY_ERASE_UNIT 0xF4 +#define WIN_SECURITY_FREEZE_LOCK 0xF5 +#define WIN_SECURITY_DISABLE 0xF6 +#define WIN_READ_NATIVE_MAX 0xF8 /* return the native maximum address */ +#define WIN_SET_MAX 0xF9 +#define DISABLE_SEAGATE 0xFB + +/* Bits of HD_STATUS */ +#define ERR_STAT 0x01 +#define INDEX_STAT 0x02 +#define ECC_STAT 0x04 /* Corrected error */ +#define DRQ_STAT 0x08 +#define SEEK_STAT 0x10 +#define WRERR_STAT 0x20 +#define READY_STAT 0x40 +#define BUSY_STAT 0x80 +; /*here for compiler bug*/ +#define BAD_R_STAT (BUSY_STAT | ERR_STAT) +#define BAD_W_STAT (BAD_R_STAT | WRERR_STAT) +#define BAD_STAT (BAD_R_STAT | DRQ_STAT) +#define DRIVE_READY (READY_STAT | SEEK_STAT) +#define DATA_READY (DRQ_STAT) + +#define IDE_DATA_REG 0 +#define IDE_FEATURE_REG 1 +#define IDE_NSECTOR_REG 2 +#define IDE_SECTOR_REG 3 +#define IDE_LCYL_REG 4 +#define IDE_HCYL_REG 5 +#define IDE_SELECT_REG 6 +#define IDE_STATUS 7 +#define IDE_CMD 7 +#define IDE_CONTROL_REG 0 + +void Irq0EHandler() +{ + Bts(&sys_irq_flags,14); +} + +void Irq0FHandler() +{ + Bts(&sys_irq_flags,15); +} + +void ATASelectBlk28(LTBlkDev *bdev,U8 blk,U8 cnt) +{ + OutP(bdev->base1+IDE_CONTROL_REG,0x8); + OutP(bdev->base0+IDE_SECTOR_REG,blk); + OutP(bdev->base0+IDE_NSECTOR_REG,cnt); + OutP(bdev->base0+IDE_LCYL_REG,blk.u1[1]); + OutP(bdev->base0+IDE_HCYL_REG,blk.u1[2]); + OutP(bdev->base0+IDE_SELECT_REG,0xE0|bdev->unit<<4|blk.u1[3]); +} + +/************* +void ATASelectBlk48(LTBlkDev *bdev,U8 blk,U8 cnt) +{//Untested + OutP(bdev->base1+IDE_CONTROL_REG,0x8); + OutP(bdev->base0+IDE_NSECTOR_REG,cnt.u1[1]); + OutP(bdev->base0+IDE_SECTOR_REG,blk_lo.u1[3]); + OutP(bdev->base0+IDE_LCYL_REG,blk_hi); + OutP(bdev->base0+IDE_HCYL_REG,blk_hi.u1[1]); + + OutP(bdev->base0+IDE_NSECTOR_REG,cnt); + OutP(bdev->base0+IDE_SECTOR_REG,blk_lo); + OutP(bdev->base0+IDE_LCYL_REG,blk_lo.u1[1]); + OutP(bdev->base0+IDE_HCYL_REG,blk_lo.u1[2]); + OutP(bdev->base0+IDE_SELECT_REG,0xE0|bdev->unit<<4); +} +***************/ + +void IDEWaitNotBusy(LTBlkDev *bdev) +{ + while (InP(bdev->base0+IDE_STATUS) & BUSY_STAT) + SwapInNext; +} + +void ATANop(LTBlkDev *bdev) +{ + OutP(bdev->base0+IDE_SELECT_REG,0xE0|bdev->unit<<4); + OutP(bdev->base0+IDE_FEATURE_REG,0); + OutP(bdev->base0+IDE_CMD,WIN_NOP); + IDEWaitNotBusy(bdev); +} + +void ATACmd(LTBlkDev *bdev,U1 cmd) +{ + OutP(bdev->base0+IDE_FEATURE_REG,0); + OutP(bdev->base0+IDE_CMD,cmd); + bdev->last_jiffy=jiffies; +} + +/******* +U8 ATAPIStat(LTBlkDev *bdev) +{ + return InP(bdev->base0+IDE_STATUS)+ + 256*(InP(bdev->base0+IDE_NSECTOR_REG)+ + 256* InP(bdev->base0+IDE_FEATURE_REG) ); +} +**********/ + +void ATAPIWritePktWord(LTBlkDev *bdev,U2 w) +{ + while (!(InP(bdev->base0+IDE_STATUS)&DATA_READY)) + SwapInNext; + OutPW(bdev->base0+IDE_DATA_REG,w.u1[1]+256*w.u1[0]); + bdev->last_jiffy=jiffies; +} + +void IDEWaitForDrive(LTBlkDev *bdev) +{ + while (Bts(&sys_irq_busy_flags,bdev->irq)) + SwapInNext; + Btr(&sys_irq_flags,bdev->irq); +} + +/******** +void IDEWaitForIrq(LTBlkDev *bdev) +{ + BoolU4 old_flags=GetFlags; + Sti; + while (!Btr(&sys_irq_flags,bdev->irq)) + SwapInNext; + SetFlags(old_flags); +} +*********/ + +void ATAPISeek(LTBlkDev *bdev,U8 blk) +{ + OutP(bdev->base1+IDE_CONTROL_REG,0x8); + OutP(bdev->base0+IDE_SELECT_REG,0xE0|bdev->unit<<4); + OutP(bdev->base0+IDE_LCYL_REG,bdev->blk_size); + OutP(bdev->base0+IDE_HCYL_REG,bdev->blk_size.u1[1]); + ATACmd(bdev,WIN_PACKETCMD); + ATAPIWritePktWord(bdev,0x2B00); //Seek + ATAPIWritePktWord(bdev,blk>>16); + ATAPIWritePktWord(bdev,blk); + ATAPIWritePktWord(bdev,0); + ATAPIWritePktWord(bdev,0); + ATAPIWritePktWord(bdev,0x0000); + IDEWaitNotBusy(bdev); +} + +void ATAPIStartStop(LTBlkDev *bdev,BoolU4 start) +{ + OutP(bdev->base0+IDE_SELECT_REG,0xE0|bdev->unit<<4); + ATACmd(bdev,WIN_PACKETCMD); + ATAPIWritePktWord(bdev,0x1B00); //Start/Stop + ATAPIWritePktWord(bdev,0x0000); + if (start) + ATAPIWritePktWord(bdev,0x0100); + else + ATAPIWritePktWord(bdev,0x0000); + ATAPIWritePktWord(bdev,0x0000); + ATAPIWritePktWord(bdev,0x0000); + ATAPIWritePktWord(bdev,0x0000); + IDEWaitNotBusy(bdev); +} + +void IDEInit(LTBlkDev *bdev,BoolU4 unlock) +{ + U8 blk=0x0F000000; //TODO:fix this? + BoolU4 old_preempt=Preempt(OFF); + CheckLTBlkDev(bdev); + if (unlock) { + Btr(&sys_irq_busy_flags,bdev->irq); + IDEWaitForDrive(bdev); + } +// not using irqs +// Btr(&sys_irq_flags,bdev->irq); + + if (!(bdev->flags & LTBDF_HAS_BEEN_RESET)) { + OutP(bdev->base0+IDE_SELECT_REG,0xE0|bdev->unit<<4); + ATACmd(bdev,WIN_DEV_RESET); + IDEWaitNotBusy(bdev); + bdev->flags=bdev->flags | LTBDF_HAS_BEEN_RESET; + } + if (bdev->type==LTBDT_ATA) { + OutP(bdev->base0+IDE_SELECT_REG,0xE0|bdev->unit<<4); + ATACmd(bdev,WIN_READ_NATIVE_MAX); + IDEWaitNotBusy(bdev); +//TODO:do this right + ATASelectBlk28(bdev,blk,0); + ATACmd(bdev,WIN_SET_MAX); + IDEWaitNotBusy(bdev); + } else { + ATAPIStartStop(bdev,TRUE); + ATAPISeek(bdev,0); + } + Btr(&sys_irq_flags,bdev->irq); + if (unlock) + Btr(&sys_irq_busy_flags,bdev->irq); + Preempt(old_preempt); +} + +/********** +void IDEWaitReady(LTBlkDev *bdev) +{ + U8 i=0; + while (!(InP(bdev->base0+IDE_STATUS) & READY_STAT)) { + if (!(++i & 0xFFF)) + IDEInit(bdev,FALSE); + ATANop(bdev); + SwapInNext; + } +} +***********/ + +void ATAPIWaitReady(LTBlkDev *bdev) +{ + U8 pass=0; + BoolU4 cont; + do { + IDEWaitNotBusy(bdev); + if (pass) + SwapInNext; + ATANop(bdev); + if (InP(bdev->base0+IDE_STATUS) & READY_STAT) { + if (!bdev->last_jiffy || pass>16 || + (jiffies>bdev->last_jiffy+JIFFY_FREQ<<1)) { + ATAPIStartStop(bdev,TRUE); + } + cont=FALSE; + } else { + if (pass>16) + IDEInit(bdev,FALSE); + cont=TRUE; + } + pass++; + } while (cont || InP(bdev->base0+IDE_FEATURE_REG)); +} + +void ATAReadBlks2(LTBlkDev *bdev,U1 *buf, U8 cnt) +{ + U8 U2s_avail,sectors_avail; + while (cnt) { + while (InP(bdev->base0+IDE_STATUS) & DATA_READY!=DATA_READY) + SwapInNext; + +// while (!(sectors_avail=cnt-InP(bdev->base0+IDE_NSECTOR_REG))) +// SwapInNext; + sectors_avail=1; + + U2s_avail=sectors_avail*BLK_SIZE>>1; + RepInSW(buf,U2s_avail,bdev->base0+IDE_DATA_REG); + buf+=U2s_avail<<1; + cnt-=sectors_avail; + } + IDEWaitNotBusy(bdev); + Btr(&sys_irq_flags,bdev->irq); +} + + +/*********** +void ATAReadBlksExt(LTBlkDev *bdev,U1 *buf, U8 blk, U8 cnt) +{// Untested + BoolU4 old_preempt=Preempt(OFF); + IDEWaitForDrive(bdev); + ATASelectBlk48(bdev,blk,0,cnt); + ATACmd(bdev,WIN_MULTREAD_EXT); + ATAReadBlks2(bdev,buf,cnt); + Btr(&sys_irq_busy_flags,bdev->irq); + Preempt(old_preempt); +} +*************/ + +void ATAReadBlks(LTBlkDev *bdev,U1 *buf, U8 blk, U8 cnt) +{ + BoolU4 old_preempt=Preempt(OFF); + IDEWaitForDrive(bdev); + ATASelectBlk28(bdev,blk,cnt); + ATACmd(bdev,WIN_MULTREAD); + ATAReadBlks2(bdev,buf,cnt); + Btr(&sys_irq_busy_flags,bdev->irq); + Preempt(old_preempt); +} + +void ATAPIReadBlks2(LTBlkDev *bdev,U1 *buf, U8 blk, U8 cnt) +{ + U8 U2s_avail; + U1 *done_add=buf+cnt*bdev->blk_size; + BoolU4 old_preempt=Preempt(OFF); + + if (!cnt) + return; + IDEWaitForDrive(bdev); + ATAPIWaitReady(bdev); + OutP(bdev->base1+IDE_CONTROL_REG,0x8); + OutP(bdev->base0+IDE_SELECT_REG,0xE0|bdev->unit<<4); + OutP(bdev->base0+IDE_LCYL_REG,bdev->blk_size); + OutP(bdev->base0+IDE_HCYL_REG,bdev->blk_size.u1[1]); + ATACmd(bdev,WIN_PACKETCMD); + ATAPIWritePktWord(bdev,0xA800); + ATAPIWritePktWord(bdev,blk.u2[1]); + ATAPIWritePktWord(bdev,blk); + ATAPIWritePktWord(bdev,cnt.u2[1]); + ATAPIWritePktWord(bdev,cnt); + ATAPIWritePktWord(bdev,0x0000); + while (bufbase0+IDE_STATUS) & DATA_READY)) + SwapInNext; + if (U2s_avail=(InP(bdev->base0+IDE_HCYL_REG)<<8+InP(bdev->base0+IDE_LCYL_REG))>>1) { + if (buf+U2s_avail<<1>done_add) + U2s_avail=(done_add-buf)>>1; + RepInSW(buf,U2s_avail,bdev->base0+IDE_DATA_REG); + buf+=U2s_avail<<1; + } + } + IDEWaitNotBusy(bdev); +// ATAPIStartStop(bdev,FALSE); + Btr(&sys_irq_busy_flags,bdev->irq); + Preempt(old_preempt); +} + +void ATAPIReadBlks(LTBlkDev *bdev,U1 *buf, U8 blk, U8 cnt) +{ + LTPartition *p=DriveToPartition(bdev->partition_base); + U8 dv=bdev->blk_size/BLK_SIZE,l,blk2, + l2=bdev->max_reads<<1+dv<<1; + U1 *cd_buf=MAlloc(BLK_SIZE*l2); + if (cnt) { + if (blk<=bdev->max_reads) + blk2=0; + else + blk2=((blk-bdev->max_reads)/dv)*dv; + if (blk2+l2>p->size) + l2=p->size-blk2; + l=(l2+dv-1)/dv; + ATAPIReadBlks2(bdev,cd_buf,blk2/dv,l); + if (bdev->flags & LTBDF_READ_CACHE) + LTDCAdd(p,cd_buf,blk2,l*dv); + MemCpy(buf,cd_buf+(blk-blk2)*BLK_SIZE,cnt*BLK_SIZE); + } + Free(cd_buf); +} + +void IDERBlks(LTPartition *p,U1 *buf, U8 blk, U8 cnt) +{ + U8 l; + LTBlkDev *bdev=p->bdev; + CheckLTBlkDev(bdev); + while (cnt>0) { + l=cnt; + if (l>bdev->max_reads) + l=bdev->max_reads; + if (bdev->type==LTBDT_ATAPI) + ATAPIReadBlks(bdev,buf,blk,l); + else + ATAReadBlks(bdev,buf,blk,l); + buf+=l*BLK_SIZE; + blk+=l; + cnt-=l; + disk_status_display.u2[0]=disk_status_display.u2[0]-l; + } +} + +//This is for low level disk access +//Call WBlks() instead +void ATAWriteBlks(LTBlkDev *bdev,U1 *buf, U8 blk, U8 cnt) +{ + U8 U2s_avail,sectors_avail; + BoolU4 old_preempt=Preempt(OFF); + IDEWaitForDrive(bdev); + ATASelectBlk28(bdev,blk,cnt); + ATACmd(bdev,WIN_MULTWRITE); + while (cnt) { + while (InP(bdev->base0+IDE_STATUS) & DRIVE_READY!=DRIVE_READY) + SwapInNext; + while (InP(bdev->base0+IDE_STATUS) & DATA_READY!=DATA_READY) + SwapInNext; +//TODO + sectors_avail=1; + U2s_avail=sectors_avail*BLK_SIZE>>1; + RepOutSW(buf,U2s_avail,bdev->base0+IDE_DATA_REG); + buf+=U2s_avail<<1; + cnt-=sectors_avail; + } + IDEWaitNotBusy(bdev); + Btr(&sys_irq_busy_flags,bdev->irq); + Preempt(old_preempt); +} + +void ATAPISync(LTBlkDev *bdev) +{ + OutP(bdev->base1+IDE_CONTROL_REG,0x8); + OutP(bdev->base0+IDE_SELECT_REG,0xE0|bdev->unit<<4); + OutP(bdev->base0+IDE_LCYL_REG,bdev->blk_size); + OutP(bdev->base0+IDE_HCYL_REG,bdev->blk_size.u1[1]); + ATACmd(bdev,WIN_PACKETCMD); + ATAPIWritePktWord(bdev,0x3500); //Sync + ATAPIWritePktWord(bdev,0x0000); + ATAPIWritePktWord(bdev,0x0000); + ATAPIWritePktWord(bdev,0x0000); + ATAPIWritePktWord(bdev,0x0000); + ATAPIWritePktWord(bdev,0x0000); + IDEWaitNotBusy(bdev); +} + +void ATAPIClose(LTBlkDev *bdev) +{ + OutP(bdev->base1+IDE_CONTROL_REG,0x8); + OutP(bdev->base0+IDE_SELECT_REG,0xE0|bdev->unit<<4); + OutP(bdev->base0+IDE_LCYL_REG,bdev->blk_size); + OutP(bdev->base0+IDE_HCYL_REG,bdev->blk_size.u1[1]); + ATACmd(bdev,WIN_PACKETCMD); + ATAPIWritePktWord(bdev,0x5B00); //Close + ATAPIWritePktWord(bdev,0x0200); + ATAPIWritePktWord(bdev,0x0000); + ATAPIWritePktWord(bdev,0x0000); + ATAPIWritePktWord(bdev,0x0000); + ATAPIWritePktWord(bdev,0x0000); + IDEWaitNotBusy(bdev); +} + +void ATAPIWriteBlks(LTBlkDev *bdev,U1 *buf, U8 blk, U8 cnt) +{ + U8 U2s_avail; + U1 *buf2; + + ATAPISeek(bdev,blk); + + OutP(bdev->base0+IDE_FEATURE_REG,0); + OutP(bdev->base0+IDE_LCYL_REG,bdev->blk_size); + OutP(bdev->base0+IDE_HCYL_REG,bdev->blk_size.u1[1]); + OutP(bdev->base0+IDE_SELECT_REG,0xE0|bdev->unit<<4); + OutP(bdev->base0+IDE_CMD,WIN_PACKETCMD); + ATAPIWritePktWord(bdev,0x0400); //FMT + ATAPIWritePktWord(bdev,blk.u2[1]); + ATAPIWritePktWord(bdev,blk); + ATAPIWritePktWord(bdev,cnt.u2[1]); + ATAPIWritePktWord(bdev,cnt); + ATAPIWritePktWord(bdev,0x0000); + IDEWaitNotBusy(bdev); + + ATAPISeek(bdev,blk); + + OutP(bdev->base1+IDE_CONTROL_REG,0x8); + OutP(bdev->base0+IDE_SELECT_REG,0xE0|bdev->unit<<4); + OutP(bdev->base0+IDE_LCYL_REG,bdev->blk_size); + OutP(bdev->base0+IDE_HCYL_REG,bdev->blk_size.u1[1]); + ATACmd(bdev,WIN_PACKETCMD); + ATAPIWritePktWord(bdev,0xAA00); //Write + ATAPIWritePktWord(bdev,blk.u2[1]); + ATAPIWritePktWord(bdev,blk); + ATAPIWritePktWord(bdev,cnt.u2[1]); + ATAPIWritePktWord(bdev,cnt); + ATAPIWritePktWord(bdev,0x0000); + buf2=buf+bdev->blk_size*cnt; + while (bufbase0+IDE_STATUS) & DRIVE_READY!=DRIVE_READY) + SwapInNext; + while (InP(bdev->base0+IDE_STATUS) & DATA_READY!=DATA_READY) + SwapInNext; + U2s_avail=(InP(bdev->base0+IDE_HCYL_REG)<<8+InP(bdev->base0+IDE_LCYL_REG))>>1; + if (buf+U2s_avail<<1>buf2) + U2s_avail=(buf2-buf)>>1; + if (U2s_avail) { + RepOutSW(buf,U2s_avail,bdev->base0+IDE_DATA_REG); + buf+=U2s_avail<<1; + } + } + IDEWaitNotBusy(bdev); +} + +//TODO: needs to be fixed so it does more than one blk at +//a time when it calls ATAWriteBlks. +void IDEWBlks(LTPartition *p,U1 *buf, U8 blk, U8 cnt) +{ + U8 l,dv; + LTBlkDev *bdev=p->bdev; + CheckLTBlkDev(bdev); + dv=bdev->blk_size/BLK_SIZE; + if (bdev->type==LTBDT_ATAPI) { + IDEWaitForDrive(bdev); + ATAPIWaitReady(bdev); + } + while (cnt>0) { + l=cnt; + if (l>bdev->max_writes) + l=bdev->max_writes; + if (bdev->type==LTBDT_ATAPI) + ATAPIWriteBlks(bdev,buf,blk/dv,(l+dv-1)/dv); + else + ATAWriteBlks(bdev,buf,blk,l); + buf+=l*BLK_SIZE; + blk+=l; + cnt-=l; + disk_status_display.u2[0]=disk_status_display.u2[0]-l; + } + if (bdev->type==LTBDT_ATAPI) { + ATAPISync(bdev); +// ATAPIStartStop(bdev,FALSE); + Btr(&sys_irq_busy_flags,bdev->irq); + } +} + \ No newline at end of file diff --git a/LT/OSMain/DISK3.CPZ b/LT/OSMain/DISK3.CPZ new file mode 100644 index 0000000..bead55f --- /dev/null +++ b/LT/OSMain/DISK3.CPZ @@ -0,0 +1,1984 @@ +void LockPartition(LTPartition *p) +{ + LTBlkDev *bdev=p->bdev; + CheckLTPartition(p); + if (p->owning_task!=Fs) { + while (Bts(&p->flags,MPEf_LOCKED)) + SwapInNext; + if (bdev->type==LTBDT_FDC) + FDCGet(bdev); + p->owning_task=Fs; + } +} + +BoolU4 UnlockPartition(LTPartition *p,BoolU4 reset=FALSE) +{ + LTBlkDev *bdev=p->bdev; + BoolU4 old_preempt=Preempt(OFF),result=FALSE; + CheckLTPartition(p); + if (p->owning_task==Fs) { + if (reset) { + bdev->flags&=~(LTBDF_INITIALIZED|LTBDF_INIT_IN_PROGRESS); + if (bdev->irq) + Btr(&sys_irq_busy_flags,bdev->irq); + } + p->owning_task=0; + if (bdev->type==LTBDT_FDC) + FDCFree(bdev); + Btr(&p->flags,MPEf_LOCKED); + result=TRUE; + } + Preempt(old_preempt); + return result; +} + + +void AllocMAPBuf(LTPartition *p,U8 num_blks) +{ + CheckLTPartition(p); + AFree(p->cur_MAP_blk); + AFree(p->buffered_MAP_dirty_bits); + p->num_buffered_MAP_blks=num_blks; + p->cur_MAP_blk=AMAlloc(BLK_SIZE*num_blks); + p->buffered_MAP_dirty_bits=AMAllocZ((num_blks+7)>>3); + p->cur_MAP_blk_num=0; + RBlks(p,p->cur_MAP_blk,p->MAP1,p->num_buffered_MAP_blks,FALSE); +} + + +void CleanMAPBuf(LTPartition *p,I8 MAP_select=-1) +{ + U8 i; + if (MAP_select==-1 || MAP_select==0) { + for (i=0;inum_buffered_MAP_blks;i++) + if (Bt(p->buffered_MAP_dirty_bits,i)) + WBlks(p,p->cur_MAP_blk+i*BLK_SIZE,p->MAP1+i+p->cur_MAP_blk_num,1,FALSE); + } + if (MAP_select==-1 || MAP_select==1) { + for (i=0;inum_buffered_MAP_blks;i++) + if (Btr(p->buffered_MAP_dirty_bits,i)) + WBlks(p,p->cur_MAP_blk+i*BLK_SIZE,p->MAP2+i+p->cur_MAP_blk_num,1,FALSE); + } +} + + +void SetLTBuf(LTPartition *p,U8 c) +{ + U8 MAP_blk_num=c/(BLK_SIZE<<3); + if (MAP_blk_num!=p->cur_MAP_blk_num) { + CleanMAPBuf(p); + p->cur_MAP_blk_num=MAP_blk_num; + RBlks(p,p->cur_MAP_blk,p->MAP1+p->cur_MAP_blk_num,1,FALSE); + } +} + + +void FreeLTFreeList(LTPartition *p,BoolU4 unlock) +{ + LTFreeList *tempf,*tempf1; + try { + LockPartition(p); + + if (tempf=p->next_free) { + while (tempf!=&p->next_free) { + tempf1=tempf->next; + AFree(tempf); + tempf=tempf1; + } + } + p->next_free=NULL; + if (unlock) + UnlockPartition(p); + } catch + UnlockPartition(p); +} + +void BuildLTFreeList(LTPartition *p,BoolU4 unlock) +{ + LTFreeList *tempf; + U8 i,first=0, + max_cluster=(p->size+p->offset-p->data)/p->spc; + + try { + LockPartition(p); + + if (p->next_free) + FreeLTFreeList(p,FALSE); + p->next_free=&p->next_free; + p->last_free=&p->next_free; + while (firstcur_MAP_blk,(first+i)&(BLK_SIZE<<3-1))) + break; + else + i++; + } + if (i) { + tempf=AMAlloc(sizeof(LTFreeList)); + tempf->size=i; + tempf->start=first; + InsQue(tempf,p->last_free); + } + first+=i+1; + } + + if (unlock) + UnlockPartition(p); + } catch + UnlockPartition(p); +} + +void InitLTPartition(LTPartition *p,BoolU4 unlock) +{ + LTBootStruct br; + try { + LockPartition(p); + p->type=PT_LT; + FreeLTFreeList(p,FALSE); + RBlks(p,&br,p->offset,1,FALSE); + p->spc=br.sectors_per_cluster; + p->data=p->offset+1+br.bitmap_sectors-1*p->spc; + p->root_cluster=br.root_cluster; + p->MAP1=p->offset+1; + p->MAP2=p->offset+1; + AllocMAPBuf(p,1); + if (unlock) + UnlockPartition(p); + } catch + UnlockPartition(p); +} + +void InitISOPartition(LTPartition *p,BoolU4 unlock) +{ + U8 i=16; + ISOPrimaryDescriptor *iso=MAlloc(CD_BLK_SIZE); + ISODirEntry *de; + + try { + LockPartition(p); + p->type=PT_ISO9660; + p->spc=CD_BLK_SIZE/BLK_SIZE; + p->size=CD_FILE_OFFSET; + while (TRUE) { + RBlks(p,iso,i*p->spc,p->spc,FALSE); + if (iso->type==ISOT_SUPPLEMENTARY_DESC) + break; + else if (iso->type==ISOT_TERMINATOR) + throw(EXCEPT_PARTITION,0); + else + i++; + } + p->data=0; + de=&iso->root_directory_record; + p->root_cluster=de->location.little; + p->size=iso->volume_space_size.little*CD_BLK_SIZE/BLK_SIZE; + Free(iso); + if (unlock) + UnlockPartition(p); + } catch + UnlockPartition(p); +} + +#define ZERO_BUF_SIZE 2048 +void WZeroBlks(LTPartition *p,U8 blk,U8 cnt,BoolU4 unlock) +{ + U8 l; + U1 *z=MAllocZ(BLK_SIZE*ZERO_BUF_SIZE); + while (cnt) { + l=cnt; + if (l>ZERO_BUF_SIZE) + l=ZERO_BUF_SIZE; + WBlks(p,z,blk,l,unlock); + blk+=l; + cnt-=l; + SwapInNext; //Prevent locking + } + Free(z); +} + +//Very dangerous +BoolU4 SetDriveType(I1 drive,U8 type=PT_LT) +{ + I8 i,j,ext_base,num_partition; + U8 offset,cur_type; + MasterBootStruct mbr; + LTBlkDev *bd=DriveToBlkDev(drive); + num_partition=bd->partition_base-'A'; + switch (bd->type) { + case LTBDT_ATA: + offset=0; + ext_base=INVALID_CLUSTER; + while (TRUE) { + ATAReadBlks(bd,&mbr,offset,1); + j=-1; + for (i=0;i<4;i++) { + cur_type=mbr.p[i].type; + if (cur_type) { + if (cur_type==5 || cur_type==0xF) + j=i; + else { + if ((num_partition+'A')==drive) { + mbr.p[i].type=type; + ATAWriteBlks(bd,&mbr,offset,1); + return TRUE; + } + num_partition++; + } + } + } + if (j<0) + break; + if (mbr.p[j].offset==0) + break; + if (ext_base==INVALID_CLUSTER) { + offset=mbr.p[j].offset; + ext_base=offset; + } else + offset=mbr.p[j].offset+ext_base; + } + break; + } +} + +void FormatLT(I1 drive_letter,BoolU4 quick=TRUE) +{ + U1 *root_dir; + LTDirEntry *dLT; + LTBootStruct *br=MAllocZ(BLK_SIZE); + LTPartition *p=DriveToPartition(drive_letter); + U8 i,l; + try { + LockPartition(p); +// SetDriveType(drive_letter,PT_LT); + SetDriveType(drive_letter,PT_FAT32); + p->type=PT_LT; + br->U1s_per_sector=BLK_SIZE; + if (p->size<0x2000) + br->sectors_per_cluster=1; + else if (p->size<0x20000) + br->sectors_per_cluster=2; + else if (p->size<0x200000) + br->sectors_per_cluster=4; + else if (p->size<0x2000000) + br->sectors_per_cluster=8; + else if (p->size<0x20000000) + br->sectors_per_cluster=16; + else + br->sectors_per_cluster=32; + + br->signature=PT_LT; + br->signature2=0xAA55; + br->sectors=p->size; + l=br->sectors_per_cluster*(BLK_SIZE<<3); + l=(br->sectors+l-1)/l; + br->bitmap_sectors=l; + br->unique_id=BootTime; + br->root_cluster=0; + + if (quick) + i=l+1; + else + i=p->size; + WZeroBlks(p,p->offset,i,FALSE); + + WBlks(p,br,p->offset,1,FALSE); + InitLTPartition(p,FALSE); + AllocClusters(p,0,1,FALSE,FALSE); //Alloc #1 + br->root_cluster=AllocClusters(p,0,1,FALSE,FALSE); + WBlks(p,br,p->offset,1,FALSE); + root_dir=MAllocZ(BLK_SIZE*p->spc); + + dLT=root_dir-offset(LTDirEntry.start); + + dLT->attr=LT_ATTR_DIR|LT_ATTR_CONTIGUOUS; + dLT->name[0]='.'; + dLT->cluster=br->root_cluster; + dLT->size=p->spc*BLK_SIZE; + dLT->expanded_size=dLT->size; + dLT->datetime=GetCurTimeLTDate; + + dLT+=LT_DIR_ENTRY_SIZE; + + dLT->name[0]='.'; + dLT->name[1]='.'; + dLT->attr=LT_ATTR_DIR|LT_ATTR_CONTIGUOUS; + dLT->cluster=br->root_cluster; + dLT->datetime=GetCurTimeLTDate; + + WBlks(p,root_dir,p->data+br->root_cluster*p->spc,1,FALSE); + InitLTPartition(p,FALSE); + UnlockPartition(p); + } catch + UnlockPartition(p); + Free(br); + Free(root_dir); +} + + +BoolU4 InitBlkDev(LTBlkDev *bd,BoolU4 unlock) +{ + LTPartition *p=DriveToPartition(bd->partition_base); + BoolU4 old_preempt=Preempt(OFF),result=FALSE; + if (!(bd->flags & LTBDF_INITIALIZED)) { + bd->flags=bd->flags | LTBDF_INITIALIZED | + LTBDF_INIT_IN_PROGRESS; + switch(bd->type) { + case LTBDT_RAM: + bd->RAM_disk=AMAllocZ((bd->max_blk+1)*BLK_SIZE); + p->type=PT_LT; + //TODO: finish unlock? + FormatLT(bd->partition_base,FALSE); + break; + case LTBDT_FDC: + if (!monitor_floppy_tss) { + monitor_floppy_tss=Spawn(&MonitorFDCTsk,"FLOPPY MANAGER"); + monitor_floppy_tss->user_aux0=bd; + } + bd->max_reads=1; + bd->max_writes=1; + bd->read_freq=750; + bd->write_freq=150; + break; + case LTBDT_ATA: + bd->max_reads=128; + bd->max_writes=1; + bd->read_freq=2000; + bd->write_freq=500; + IDEInit(bd,TRUE); + break; + case LTBDT_ATAPI: + bd->max_reads=128; + bd->max_writes=128; + bd->read_freq=1000; + bd->write_freq=250; + IDEInit(bd,TRUE); + break; + case LTBDT_FILE: + if (bd->flags & LTBDF_FORMAT) { + //TODO: finish unlock? + bd->f=FOpen(bd->filename,"wc",p->size); + if (!bd->f) + throw(EXCEPT_PARTITION,1); + //TODO: finish unlock? + FormatLT(bd->partition_base,TRUE); + } else { + bd->f=FOpen(bd->filename,"wc+"); + if (!bd->f) + throw(EXCEPT_PARTITION,2); + bd->max_blk=(FSize(bd->f)+BLK_SIZE-1)/BLK_SIZE-1; + p->size=bd->max_blk+1; + InitLTPartition(p,unlock); + } + break; + } + if (bd->flags & LTBDF_READ_CACHE) + InvalidateDiskCache(p,unlock); + bd->flags=bd->flags & ~LTBDF_INIT_IN_PROGRESS; + result=TRUE; + } + Preempt(old_preempt); + return result; +} + +BoolU4 RBlks(LTPartition *p,U1 *buf, U8 blk, U8 cnt,BoolU4 unlock) +{ + BoolU4 result=TRUE; + LTBlkDev *bdev=p->bdev; + CheckLTPartition(p); + try { + LockPartition(p); + InitBlkDev(bdev,FALSE); + if ((p->offset && blkoffset) || blk+cnt>p->offset+p->size) + throw(EXCEPT_PARTITION,3); + blk+=bdev->offset; + + if (bdev->flags & LTBDF_READ_CACHE) + RCache(p,&buf,&blk,&cnt); + if (cnt) { + if (!Bt(&sys_flags,SYSf_NO_IO_SOUND)) + Sound(bdev->read_freq); + disk_status_display.u2[0]=cnt; + result=p->RBlks(p,buf,blk,cnt); + bdev->last_jiffy=jiffies; + disk_status_display.u2[0]=0; + if (!Bt(&sys_flags,SYSf_NO_IO_SOUND)) + Sound(0); + if (bdev->flags & LTBDF_READ_CACHE) + LTDCAdd(p,buf,blk,cnt); + } + if (unlock) + UnlockPartition(p); + } catch + UnlockPartition(p); + return result; +} + +BoolU4 WBlks(LTPartition *p,U1 *buf, U8 blk, U8 cnt,BoolU4 unlock) +{ + BoolU4 result; + LTBlkDev *bdev=p->bdev; + CheckLTPartition(p); + try { + LockPartition(p); + InitBlkDev(bdev,FALSE); + if ((bdev->flags & LTBDF_READ_ONLY) && + !(bdev->flags & LTBDF_READ_ONLY_OVERRIDE)) + throw(EXCEPT_BLKDEV,0); + if ((p->offset && blkoffset) || blk+cnt>p->offset+p->size) + throw(EXCEPT_PARTITION,4); + blk+=bdev->offset; + if (cnt) { + if (!Bt(&sys_flags,SYSf_NO_IO_SOUND)) + Sound(bdev->write_freq); + disk_status_display.u2[0]=cnt+0x8000; + result=p->WBlks(p,buf,blk,cnt); + bdev->last_jiffy=jiffies; + disk_status_display.u2[0]=0; + if (!Bt(&sys_flags,SYSf_NO_IO_SOUND)) + Sound(0); + if (bdev->flags & LTBDF_READ_CACHE) + LTDCAdd(p,buf,blk,cnt); + } + if (unlock) + UnlockPartition(p); + } catch + UnlockPartition(p); + return result; +} + + +void InvalidateDiskCache(LTPartition *p,BoolU4 unlock) +{ + LTBlkDev *bdev=p->bdev; + CheckLTPartition(p); + try { + LockPartition(p); + InitBlkDev(bdev,FALSE); + if (bdev->flags & LTBDF_READ_CACHE) + LTDCInvalidate(p); + if (bdev->type==LTBDT_FDC) + InitLTPartition(p,FALSE); + else if (p->type==PT_ISO9660) { + if (!(bdev->flags & LTBDF_READ_ONLY_OVERRIDE)) + InitISOPartition(p,FALSE); + } + if(unlock) + UnlockPartition(p); + } catch + UnlockPartition(p); +} + +void ChangeDisk(I1 drive_letter=0) +{ + LTBlkDev *bdev=DriveToBlkDev(drive_letter); + if (!InitBlkDev(bdev,TRUE) && bdev->flags & LTBDF_REMOVABLE) + InvalidateDiskCache(DriveToPartition(drive_letter),TRUE); + Drive(drive_letter); //TODO: might preempt off + FreeLTFreeList(DriveToPartition(drive_letter),TRUE); +} + + +void PartitionRep() +{ + I8 i; + I1 ch; + U2 u2; + U1 u1; + LTPartition *p; + LTBlkDev *bdev; + coutln "\r\nDefined Partitions:\r\n"; + for (i=0;i<32;i++) { + p=local_partitions+sizeof(LTPartition)*i; + bdev=p->bdev; + if (p->type) { + if (p==default_partition) + cout "*"; + else + cout " "; + ch=PartitionToDrive(p); + cout ch," "; + if (p->type==PT_LT) + cout "LT "; + else if (p->type==PT_FAT12) + cout "FAT12 "; + else if (p->type==PT_FAT32) + cout "FAT32 "; + else if (p->type==PT_ISO9660) + cout "ISO9660"; + else + cout "-------"; + cout " ",SysTextSub(bdev->type,"ST_BLKDEV_TYPES")," "; + cout p->offset,"-",p->offset+p->size-1," "; + u2=bdev->base0; cout u2," "; + u1=bdev->irq; cout u1," "; + u1=bdev->unit; coutln u1; + } + } +} + +void ReleaseTaskPartitions() +{ + I8 i; + LTPartition *p; + for (i=0;i<32;i++) { + p=local_partitions+sizeof(LTPartition)*i; + if (p->owning_task==Fs) { + UnlockPartition(p,TRUE); + if (!Bt(&sys_flags,SYSf_NO_IO_SOUND)) + Sound(0); + } + } +} + +U8 AddBlkDev(LTBlkDev *bd) +{ + I8 i,j,ext_base,num_partition; + U8 offset; + MasterBootStruct mbr; + LTBootStruct br; + LTPartition *p; + I1 *drname; + + bd->ch_L='L'; + bd->ch_B='B'; + bd->ch_D='D'; + num_partition=bd->partition_base-'A'; + p=local_partitions+sizeof(LTPartition)*num_partition; + MemSet(p,0,sizeof(LTPartition)); + p->drive=num_partition+'A'; + p->ch_L='L'; + p->ch_P='P'; + p->ch_E='E'; + p->bdev=bd; + p->size=bd->max_blk+1; + j=(sys_boot_code.u1[1]==0xE0) ? 0:1; + switch (sys_boot_code.u1[0]) { + case BOOT_CODE_CDROM: + if (sys_boot_code.u2[1]==bd->base0 && j==bd->unit) + boot_blkdev=bd; + break; + case BOOT_CODE_HARDDRIVE: + if (sys_boot_code.u2[1]==bd->base0 && j==bd->unit) + boot_blkdev=bd; + break; + } + if (boot_blkdev==bd) + bd->flags|=LTBDF_HAS_BEEN_RESET; + + switch (bd->type) { + case LTBDT_FDC: + p->type=PT_LT; + p->RBlks=&FDCRBlks; + p->WBlks=&FDCWBlks; + num_partition++; + break; + case LTBDT_RAM: + p->type=PT_LT; + p->RBlks=&RAMRBlks; + p->WBlks=&RAMWBlks; + num_partition++; + break; + case LTBDT_ATA: + InitBlkDev(bd,TRUE); + offset=0; + ext_base=INVALID_CLUSTER; + while (TRUE) { + ATAReadBlks(bd,&mbr,offset,1); + j=-1; + for (i=0;i<4;i++) { + if (mbr.p[i].type!=0) { + p=local_partitions+sizeof(LTPartition)*num_partition; + MemSet(p,0,sizeof(LTPartition)); + p->drive=num_partition+'A'; + p->ch_L='L'; + p->ch_P='P'; + p->ch_E='E'; + p->bdev=bd; + p->RBlks=&IDERBlks; + p->WBlks=&IDEWBlks; + p->offset=mbr.p[i].offset+offset; + p->size =mbr.p[i].size; + p->type =mbr.p[i].type; + if (p->type==PT_LT) + InitLTPartition(p,TRUE); + else { + if (p->type==PT_FAT32+1) p->type=PT_FAT32; + if (p->type==PT_FAT32) { + ATAReadBlks(bd,&br,p->offset,1); + if (br.signature==PT_LT) + InitLTPartition(p,TRUE); + } + } + if (p->type==5 || p->type==0xF) + j=i; + else + num_partition++; + } + } + if (j<0) + break; + if (mbr.p[j].offset==0) + break; + if (ext_base==INVALID_CLUSTER) { + offset=mbr.p[j].offset; + ext_base=offset; + } else + offset=mbr.p[j].offset+ext_base; + } + break; + case LTBDT_ATAPI: + p->type=PT_ISO9660; + p->RBlks=&IDERBlks; + p->WBlks=&IDEWBlks; + p->size =CD_FILE_OFFSET; + num_partition++; + break; + case LTBDT_FILE: + drname=ChangeExtension(bd->filename,"DVC"); + bd->filename=ANewString(drname); + Free(drname); + p->type=PT_LT; + p->RBlks=&FileRBlks; + p->WBlks=&FileWBlks; + num_partition++; + break; + } + return num_partition-(bd->partition_base-'A'); +} + + +void AddDrives(BoolU4 show_rep=TRUE) +{ + LTBlkDev *bd; + I8 base_partition,i,j,k; + I1 buf[32],buf2[128]; + BoolU4 format; + do { + if (show_rep) + PartitionRep; + show_rep=TRUE; + PutSysText("ST_ADDDRIVES1"); + base_partition=ToUpper(SysGetChar)-'A'; + CrLf; + if (base_partition>=0 && base_partition<32) { + + PutSysText("ST_ADDDRIVES2"); + i=SysGetChar-'0'; + CrLf; + + j=1;k=0; + if (i==5) { + PutSysText("ST_ADDDRIVES3"); + GetS(buf2,128); + PutSysText("ST_ADDDRIVES4"); + format=YorN; + *buf=0; + } + if (i==1 || i==5 && format) { + PutSysText("ST_ADDDRIVES5"); + GetS(buf,32); + } else if (i!=5) { + PutSysText("ST_ADDDRIVES10"); + j=SysGetChar-'0'; + CrLf; + + PutSysText("ST_ADDDRIVES7"); + k=SysGetChar-'0'; + CrLf; + } + + if (i>0 && i<=5 && j>0 && j<=4 && k>=0 && k<=1) { + bd=local_blkdevs+sizeof(LTBlkDev)*(num_blkdevs++); + bd->partition_base=base_partition+'A'; + + bd->type=i; + if (i==2 || i==4) + bd->flags=LTBDF_REMOVABLE; + else + bd->flags=0; + if (i!=1) + bd->flags|=LTBDF_READ_CACHE; + + if (i==4) { + bd->blk_size=CD_BLK_SIZE; + bd->flags|=LTBDF_READ_ONLY; + } else + bd->blk_size=BLK_SIZE; + if (i==1 || i==5 && format) { + bd->max_blk=AtoI(buf)-1; + if (bd->max_blkmax_blk=FDC_MAX_SECTOR; + } else if (i==2) + bd->max_blk=FDC_MAX_SECTOR; + else + bd->max_blk=0xEFFFFFFF; + if (j==2) { + bd->base0=0x3F0; + bd->irq=6; + } else if (j==3) { + bd->base0=0x1F0; + bd->base1=0x3F6; + bd->irq=14; + } else if (j==4) { + bd->base0=0x170; + bd->base1=0x376; + bd->irq=15; + } + if (i==5) { + bd->filename=ANewString(buf2); + if (format) + bd->flags=bd->flags|LTBDF_FORMAT; + } + bd->unit=k; + if (!AddBlkDev(bd)) + PutSysText("ST_FAILED"); + } else + PutSysText("ST_FAILED"); + } + } while (base_partition>=0 && base_partition<32); +} + +void SetPromptedBaseUnit(LTBlkDev *bd) +{ + if (sys_boot_code.u1[1]==0xE0) + bd->unit=0; + else + bd->unit=1; + if (sys_boot_code.u2[1]==0x1F0) { + bd->base0=0x1F0; + bd->base1=0x3F6; + bd->irq=14; + } else { + bd->base0=0x170; + bd->base1=0x376; + bd->irq=15; + } +} + +void InitAllBlkDevs() +{ + LTBlkDev *bd; + I8 i; + + num_blkdevs=0; + boot_blkdev=NULL; + local_blkdevs=AMAllocZ(sizeof(LTBlkDev)<<4); + + monitor_floppy_tss=NULL; + FDC_retries=2; + FDC_DRIVE_HEADS=2; + FDC_DISK_CYLINDERS=80; + FDC_DISK_SECTORS=18; + FDC_MAX_SECTOR=FDC_DRIVE_HEADS*FDC_DISK_CYLINDERS*FDC_DISK_SECTORS-1; + FDC_DMA_BUF=0xD000; + ext[EXT_IRQ06]=&Irq06Handler; + + ext[EXT_IRQ0E]=&Irq0EHandler; + ext[EXT_IRQ0F]=&Irq0FHandler; + + local_partitions=AMAllocZ(sizeof(LTPartition)<<5); + for (i=0;i<32;i++) + drive_to_partition[i]=local_partitions+sizeof(LTPartition)*i; + dc_col=0; + + exe { + I8 base_partition,i,j,k,l,num=0; + I1 buf[32],buf2[128]; + BoolU4 format; + PutSysText("ST_ADDDRIVES0"); + do { + PutSysText("ST_ADDDRIVES1"); + base_partition=ToUpper(GetChar)-'A'; + CrLf; + if (base_partition>=0 && base_partition<32) { + PutSysText("ST_ADDDRIVES2"); + i=GetChar-'0'; + CrLf; + + j=1;k=0; + if (i==5) { + PutSysText("ST_ADDDRIVES3"); + GetS(buf2,128); + PutSysText("ST_ADDDRIVES4"); + format=YorN; + *buf=0; + } + if (i==1 || i==5 && format) { + PutSysText("ST_ADDDRIVES5"); + GetS(buf,32); + } else if (i!=5) { + PutSysText("ST_ADDDRIVES6"); + j=GetChar-'0'; + CrLf; + + if (j!=5) { + PutSysText("ST_ADDDRIVES7"); + k=GetChar-'0'; + CrLf; + } else { + if (i!=4) { + PutSysText("ST_ADDDRIVES9"); + j=0; //force error + } + } + } + + if (i>0 && i<=5 && j>0 && j<=5 && k>=0 && k<=1) { + ExePrintF("bd=local_blkdevs+sizeof(LTBlkDev)*(num_blkdevs++);"); + ExePrintF("bd->partition_base=%d;", + base_partition+'A'); + + ExePrintF("bd->type=%d;",i); + if (i==2 || i==4) + ExePrintF("bd->flags=LTBDF_REMOVABLE;"); + else + ExePrintF("bd->flags=0;"); + if (i!=1) + ExePrintF("bd->flags=bd->flags|LTBDF_READ_CACHE;"); + + if (i==4) { + ExePrintF("bd->blk_size=CD_BLK_SIZE;"); + ExePrintF("bd->flags=bd->flags | LTBDF_READ_ONLY;"); + } else + ExePrintF("bd->blk_size=BLK_SIZE;"); + if (i==1 || i==5 && format) { + l=AtoI(buf)-1; + if (lmax_blk=%d;",l); + } else if (i==2) + ExePrintF("bd->max_blk=FDC_MAX_SECTOR;"); + else + ExePrintF("bd->max_blk=0xEFFFFFFF;"); + + ExePrintF("bd->unit=%d;",k); + + if (j==2) + ExePrintF("bd->base0=0x3F0;bd->irq=6;"); + else if (j==3) + ExePrintF("bd->base0=0x1F0;bd->base1=0x3F6;bd->irq=14;"); + else if (j==4) + ExePrintF("bd->base0=0x170;bd->base1=0x376;bd->irq=15;"); + else if (j==5) + ExePrintF("SetPromptedBaseUnit(bd);"); + + if (i==5) { + ExePrintF("bd->filename=ANewString(\"%s\");",buf2); + if (format) + ExePrintF("bd->flags=bd->flags|LTBDF_FORMAT;"); + } + ExePrintF("AddBlkDev(bd);"); + num++; + } else + PutSysText("ST_FAILED"); + } + } while (num==0 || base_partition>=0 && base_partition<32); + cout "\r\nDefault Drive Letter for phase 2 of boot. " + "Usually it's the same as phase 1. " + "(hitting SPACE will prompt at boot): "; + i=GetChar; + if (i==13) { + i=Fs->user_aux1; //set by bootins + PrintF("Using Drive '%c'",i); + } + CrLf; + if (i!=CH_SPACE) + i=ToUpper(i); + if (i<'A' || i>'Z') { + i=0; + coutln "Drive will be prompted."; + } + ExePrintF("default_drive=%d;",i); + } + PartitionRep; +} + + +U8 NextClusterNum(LTPartition *p,U8 c,U8 cnt,BoolU4 unlock) +{ + CheckLTPartition(p); + if (!cnt || !c) return c; + try { + LockPartition(p); + if (p->type==PT_ISO9660 || p->type==PT_LT) + c+=cnt; + else + c=INVALID_CLUSTER; + if (unlock) + UnlockPartition(p); + } catch + UnlockPartition(p); + return c; +} + + +U8 ClusterBlk(LTPartition *p,U8 c) +{ + CheckLTPartition(p); + return p->data+c*p->spc; +} + +U8 RClusters(LTPartition *p,U1 *buf,U8 c,U8 cnt,BoolU4 unlock,BoolU4 update_display=FALSE) +{ + CheckLTPartition(p); + if (!cnt) return c; + try { + LockPartition(p); + if (p->type==PT_ISO9660 || p->type==PT_LT) { + RBlks(p,buf,p->data+c*p->spc,p->spc*cnt,FALSE); + c+=cnt; + } else { + while (cnt && c && c!=INVALID_CLUSTER) { + RBlks(p,buf,p->data+c*p->spc,p->spc,FALSE); + buf+=p->spc*BLK_SIZE; + c=NextClusterNum(p,c,1,FALSE); + cnt--; + if (update_display) + disk_status_display.u2[1]--; + } + if (cnt) + UnrecoverableSysError(0x0FFF0001); + } + if (unlock) + UnlockPartition(p); + } catch + UnlockPartition(p); + return c; +} + +BoolU4 ToLTFilename(I1 *dst,I1 *src) +{ + MemSet(dst,0,LT_MAX_FILENAME_LEN+1); + if (!CheckFileName(src)) + return FALSE; + StrCpy(dst,src); + return TRUE; +} + +BoolU4 FromISOName(I1 *dst,U1 *src) +{ + BoolU4 result=TRUE; + I8 i,j,l; + MemSet(dst,0,LT_MAX_FILENAME_LEN+1); + l=*src++; + if (l==1 && !*src) { + dst[0]='.'; + } else if (l==1 && *src==1) { + dst[0]='.'; + dst[1]='.'; + } else { + l/=2; + j=0; + for (i=0;i=LT_MAX_FILENAME_LEN) + return FALSE; + dst[j++]=*src++; + } else + return FALSE; + } + } + return CheckFileName(dst); +} + +BoolU4 FillLTDirISO(LTPartition *p,LTDirEntry *tempm,ISODirEntry *de,BoolU4 unlock) +{ + ArcCompressStruct *buf; + BoolU4 result; + MemSet(tempm,0,sizeof(LTDirEntry)); + result=FromISOName(tempm->name,&de->name_len); + tempm->cluster=de->location.little; + tempm->size=de->size.little; + tempm->attr=FileAttr(tempm->name); + if (de->flags & ISO_ATTR_DIR) + tempm->attr|=LT_ATTR_DIR; + tempm->datetime=ISOToLTDate(&de->date); + if (tempm->attr & LT_ATTR_COMPRESSED) { + buf=MAlloc(BLK_SIZE*p->spc); + RClusters(p,buf,tempm->cluster,1,unlock); + tempm->expanded_size=buf->expanded_size; + Free(buf); + } else + tempm->expanded_size=tempm->size; + return result; +} + + +BoolU4 FindLTFile(LTPartition *p,U8 cur_dir_cluster,I1 *name,LTDirEntry *result, + BoolU4 dir_only,BoolU4 file_only,BoolU4 unlock) +{ + BoolU4 res=FALSE; + LTDirEntry *buf,*buf2,*ptr; + I1 dname[LT_MAX_FILENAME_LEN+1]; + U8 cnt; + BoolU4 cont2=FALSE; + U1 ch; + + MemSet(result,0,sizeof(LTDirEntry)); + CheckLTPartition(p); + if (p->type!=PT_LT) + PutSysText("ST_NOT_LT"); + else if (!ToLTFilename(dname,name)) + PutSysText("ST_INVALID_FILENAME"); + else { + try { + LockPartition(p); + buf2=MAlloc(BLK_SIZE*p->spc); + RClusters(p,buf2,cur_dir_cluster,1,FALSE); + + ptr=buf2-offset(LTDirEntry.start); + buf=MAlloc(ptr->size); + RClusters(p,buf,cur_dir_cluster,ptr->size/BLK_SIZE/p->spc,FALSE); + Free(buf2); + + ptr=buf-offset(LTDirEntry.start); + cnt=ptr->size/LT_DIR_ENTRY_SIZE; + ptr->name[0]='.'; + ptr->name[1]=0; + while (cnt--) { + ch=ptr->name[0]; + if (!ch) + break; + else if (!(ptr->attr & LT_ATTR_DELETED)) { + if (dir_only && !(ptr->attr & LT_ATTR_DIR)) + cont2=FALSE; + else if (file_only && ptr->attr & LT_ATTR_DIR) + cont2=FALSE; + else + cont2=TRUE; + if (cont2 && !StrCmp(dname,ptr->name)) { + MemCpy(&result->attr,&ptr->attr,LT_DIR_ENTRY_SIZE); + res=TRUE; + goto exit_this; + } + } + ptr+=LT_DIR_ENTRY_SIZE; + } +exit_this: + Free(buf); + if (unlock) + UnlockPartition(p); + } catch + UnlockPartition(p); + } + + return res; +} + + +BoolU4 FindISOFile(LTPartition *p,U8 cur_dir_cluster,I1 *name,LTDirEntry *result, + BoolU4 dir_only,BoolU4 file_only,BoolU4 unlock) +{ + ISODirEntry *isoptr,*buf; + I1 dname[LT_MAX_FILENAME_LEN+1]; + BoolU4 res=FALSE; + I8 i; + + CheckLTPartition(p); + if (p->type!=PT_ISO9660) + PutSysText("ST_NOT_ISO9660"); + else { + try { + LockPartition(p); + isoptr=MAlloc(BLK_SIZE*p->spc); + RClusters(Fs->cur_partition,isoptr,cur_dir_cluster,1,FALSE); + if (isoptr->name_len==1 && isoptr->name==0) { //curdir + i=(isoptr->size.little+BLK_SIZE*p->spc-1)/(BLK_SIZE*p->spc); + buf=MAlloc(BLK_SIZE*p->spc*i); + RClusters(Fs->cur_partition,buf,cur_dir_cluster,i,FALSE); + Free(isoptr); + } else { + buf=isoptr; + i=1; + } + i*=BLK_SIZE*p->spc; + isoptr=buf; + while (i>0) { + if (!isoptr->length) { + isoptr++; + i--; + } else { + FromISOName(dname,&isoptr->name_len); + if (*dname) { + if (!StrCmp(name,dname)) { + res=FillLTDirISO(p,result,isoptr,FALSE); + if (res && + !(dir_only && !(result->attr & LT_ATTR_DIR)) && + !(file_only && result->attr & LT_ATTR_DIR) ) + goto exit_this; + else + res=FALSE; + } + } + i-=isoptr->length; + isoptr+=isoptr->length; + } + } +exit_this: + Free(buf); + if (unlock) + UnlockPartition(p); + } catch + UnlockPartition(p); + } + return res; +} + + +U8 NameToDirCluster(LTPartition *p,I1 *name,BoolU4 unlock) +{ + BoolU4 cont=TRUE; + U8 cur_dir_cluster; + LTDirEntry de; + I1 *buf=NewString(name),*buf2=NewString(name); + CheckLTPartition(p); + try { + LockPartition(p); + cur_dir_cluster=p->root_cluster; + while (*buf && cont) { + RemoveFirstSeg(buf,"/",buf2); + if (*buf2) { + if (p->type==PT_LT) + cont=FindLTFile(p,cur_dir_cluster, + buf2,&de,TRUE,FALSE,FALSE); + else if (p->type==PT_ISO9660) + cont=FindISOFile(p,cur_dir_cluster, + buf2,&de,TRUE,FALSE,FALSE); + else cont=FALSE; + cur_dir_cluster=de.cluster; + } + } + if (!cont) { + cout name," ",SysText("ST_FILE_NOT_FOUND"); + cur_dir_cluster=0; + } + if (unlock) + UnlockPartition(p); + } catch + UnlockPartition(p); + Free(buf); + Free(buf2); + return cur_dir_cluster; +} + +U8 NameToParentDirCluster(LTPartition *p,I1 *name,BoolU4 unlock) +{ + BoolU4 cont=TRUE; + U8 cur_dir_cluster,cur_dir_cluster2; + LTDirEntry de; + I1 *buf=NewString(name),*buf2=NewString(name); + CheckLTPartition(p); + try { + LockPartition(p); + cur_dir_cluster=p->root_cluster; + cur_dir_cluster2=p->root_cluster; + while (*buf && cont) { + cur_dir_cluster2=cur_dir_cluster; + RemoveFirstSeg(buf,"/",buf2); + if (*buf2) { + if (p->type==PT_LT) + cont=FindLTFile(p,cur_dir_cluster, + buf2,&de,TRUE,FALSE,FALSE); + else if (p->type==PT_ISO9660) + cont=FindISOFile(p,cur_dir_cluster, + buf2,&de,TRUE,FALSE,FALSE); + else cont=FALSE; + cur_dir_cluster=de.cluster; + } + } + if (!cont) { + cout name," ",SysText("ST_FILE_NOT_FOUND"); + cur_dir_cluster2=0; + } + if (unlock) + UnlockPartition(p); + } catch + UnlockPartition(p); + Free(buf); + Free(buf2); + return cur_dir_cluster2; +} + + +U1 *ReadISOFile(LTPartition *p,I1 *cur_dir,I1 *filename,U8 *size, + U8 *attr,BoolU4 raw,ArcCompressStruct **ac2) +{ + U1 *buf=NULL; + LTDirEntry de; + U8 c,cluster_size=BLK_SIZE*p->spc,cluster_cnt; + ArcCompressStruct *ac; + U8 cur_dir_cluster=NameToDirCluster(p,cur_dir,TRUE); + + CheckLTPartition(p); + if (size) + *size=0; + if (ac2) + *ac2=NULL; + if (attr) + *attr=0; + if (p->type!=PT_ISO9660) + PutSysText("ST_NOT_ISO9660"); + else { + try { + LockPartition(p); + if (FindISOFile(p,cur_dir_cluster,filename,&de,FALSE,TRUE,FALSE)) { + if (attr) + *attr=de.attr; + cluster_cnt=(de.size+cluster_size-1)/cluster_size; + buf=MAlloc(cluster_cnt*cluster_size+1); + c=de.cluster; + disk_status_display.u2[1]=cluster_cnt; + c=RClusters(p,buf,c,cluster_cnt,FALSE,TRUE); + disk_status_display.u2[1]=0; + if ((FileAttr(de.name) & LT_ATTR_COMPRESSED) && !raw) { + ac=buf; + if (attr) + *attr=FileAttr(de.name,*attr); + if (size) + *size=ac->expanded_size; + if (ac2) { + *ac2=ac; + buf=ExpandBuf(ac); + } else { + buf=ExpandBuf(ac); + Free(ac); + } + } else { + buf[de.size]=0; //Terminate + if (size) + *size=de.size; + } + if (attr) + *attr=FileAttr(de.name,*attr); + } + UnlockPartition(p); + } catch + UnlockPartition(p); + } + return buf; +} + + + +U1 *ReadLTFile(LTPartition *p,I1 *cur_dir,I1 *filename,U8 *size, + U8 *attr,BoolU4 raw,ArcCompressStruct **ac2) +{ + U1 *buf=NULL; + LTDirEntry de; + U8 c,cluster_size=BLK_SIZE*p->spc,cluster_cnt; + ArcCompressStruct *ac; + U8 cur_dir_cluster=NameToDirCluster(p,cur_dir,TRUE); + + CheckLTPartition(p); + if (size) + *size=0; + if (ac2) + *ac2=NULL; + if (attr) + *attr=0; + if (p->type!=PT_LT) + PutSysText("ST_NOT_ISO9660"); + else { + try { + LockPartition(p); + if (FindLTFile(p,cur_dir_cluster,filename,&de,FALSE,TRUE,FALSE)) { + if (attr) + *attr=de.attr; + cluster_cnt=(de.size+cluster_size-1)/cluster_size; + buf=MAlloc(cluster_cnt*cluster_size+1); + c=de.cluster; + disk_status_display.u2[1]=cluster_cnt; + c=RClusters(p,buf,c,cluster_cnt,FALSE,TRUE); + disk_status_display.u2[1]=0; + if (de.xsum) { + if ((de.xsum^ArcCheckSum(buf,de.size))!=LT_XSUM) + throw(EXCEPT_ARC_XSUM); + } + if ((FileAttr(de.name) & LT_ATTR_COMPRESSED) && !raw) { + ac=buf; + if (attr) + *attr=FileAttr(de.name,*attr); + if (size) + *size=ac->expanded_size; + if (ac2) { + *ac2=ac; + buf=ExpandBuf(ac); + } else { + buf=ExpandBuf(ac); + Free(ac); + } + } else { + buf[de.size]=0; //Terminate + if (size) + *size=de.size; + } + if (attr) + *attr=FileAttr(de.name,*attr); + } + UnlockPartition(p); + } catch + UnlockPartition(p); + } + return buf; +} + +BoolU4 CdLT(I1 *name,U8 cur_dir_cluster) +{ + LTDirEntry de; + if (Fs->cur_partition->type!=PT_LT) + PutSysText("ST_NOT_LT"); + else { + if (FindLTFile(Fs->cur_partition,cur_dir_cluster, + name,&de,TRUE,FALSE,TRUE)) { + return TRUE; + } else + cout name," ",SysText("ST_FILE_NOT_FOUND"); + } + return FALSE; +} + +BoolU4 CdISO(I1 *name,U8 cur_dir_cluster) +{ + LTDirEntry de; + if (Fs->cur_partition->type!=PT_ISO9660) + PutSysText("ST_NOT_ISO9660"); + else { + if (FindISOFile(Fs->cur_partition,cur_dir_cluster, + name,&de,TRUE,FALSE,TRUE)) { + return TRUE; + } else + cout name," ",SysText("ST_FILE_NOT_FOUND"); + } + return FALSE; +} + +U8 WClusters(LTPartition *p,U1 *buf,U8 c,U8 cnt,BoolU4 unlock,BoolU4 update_display=FALSE) +{ + CheckLTPartition(p); + update_display; + try { + LockPartition(p); + if (p->type==PT_LT) { + WBlks(p,buf,p->data+c*p->spc,p->spc*cnt,FALSE); + c=0; + } + if (unlock) + UnlockPartition(p); + } catch + UnlockPartition(p); + return c; +} + +void FreeLTClusters(LTPartition *p,U8 c,U8 cnt,BoolU4 unlock) +{ + LTFreeList *tempf; + BoolU4 found=FALSE; + CheckLTPartition(p); + if (!c) return; + if (p->type!=PT_LT) + PutSysText("ST_NOT_LT"); + else { + try { + LockPartition(p); + if (!p->next_free) + BuildLTFreeList(p,FALSE); + tempf=p->next_free; + while (!found && tempf!=&p->next_free) { + if (tempf->start+tempf->size==c) { + tempf->size+=cnt; + found=TRUE; + } else if (c+cnt==tempf->start) { + tempf->size+=cnt; + tempf->start=c; + found=TRUE; + } + tempf=tempf->next; + } + if (!found) { + tempf=AMAlloc(sizeof(LTFreeList)); + tempf->size=cnt; + tempf->start=c; + InsQue(tempf,p->last_free); + } + while (cnt--) { + SetLTBuf(p,c); + Btr(p->cur_MAP_blk,c&(BLK_SIZE<<3-1)); + Bts(p->buffered_MAP_dirty_bits,0); + c++; + } + CleanMAPBuf(p); + + if (unlock) + UnlockPartition(p); + } catch + UnlockPartition(p); + } +} + +U8 AllocLTClusters(LTPartition *p,U8 cnt, BoolU4 unlock) +{ + LTFreeList *tempf,*best_free=NULL; + U8 i,first,best_size=MAX_U8; + if (!cnt) + UnrecoverableSysError(0x0FFF0003); + try { + LockPartition(p); + if (!p->next_free) + BuildLTFreeList(p,FALSE); + tempf=p->next_free; + while (tempf!=&p->next_free) { + if (tempf->size>=cnt && tempf->sizesize; + } + tempf=tempf->next; + } + if (!best_free) + UnrecoverableSysError(0x0FFF0003); + first=best_free->start; + for (i=0;icur_MAP_blk,(first+i)&(BLK_SIZE<<3-1)); + Bts(p->buffered_MAP_dirty_bits,0); + } + CleanMAPBuf(p); + if (best_free->size-=cnt) + best_free->start+=cnt; + else { + RemQue(best_free); + AFree(best_free); + } + if (unlock) + UnlockPartition(p); + } catch + UnlockPartition(p); + return first; +} + +//c=0 means first cluster in chain +U8 AllocClusters(LTPartition *p,U8 c,U8 cnt,BoolU4 contiguous,BoolU4 unlock) +{ + contiguous; //no unused var warn + if (!cnt) + return c; + CheckLTPartition(p); + if (p->type==PT_LT) + return AllocLTClusters(p,cnt,unlock); +} + + +BoolU4 NewLTDirEntry2(LTPartition *p,I1 *cur_dir,LTDirEntry *de,BoolU4 free_old_chain,BoolU4 unlock) +{ + LTDirEntry *buf,*buf2,*ptr,de2; + LTBootStruct *br; + U8 c,i=1,j=0,l=BLK_SIZE/LT_DIR_ENTRY_SIZE,cnt,dir_size; + BoolU4 written=FALSE; + U1 ch; + U8 cur_dir_cluster=NameToDirCluster(p,cur_dir,unlock); + I1 *temp,*parent_dir; + try { + de->attr|=LT_ATTR_CONTIGUOUS; + LockPartition(p); + buf2=MAlloc(BLK_SIZE*p->spc); + RClusters(p,buf2,cur_dir_cluster,1,FALSE); + + ptr=buf2-offset(LTDirEntry.start); + buf=MAlloc(ptr->size); + RClusters(p,buf,cur_dir_cluster,ptr->size/BLK_SIZE/p->spc,FALSE); + + dir_size=ptr->size; + cnt=ptr->size/LT_DIR_ENTRY_SIZE; + ptr=buf-offset(LTDirEntry.start)+LT_DIR_ENTRY_SIZE; + Free(buf2); + while (cnt--) { + ch=ptr->name[0]; + if (!ch) { + if (written) break; + MemCpy(&ptr->attr,&de->attr,LT_DIR_ENTRY_SIZE); + if ((i+1)*LT_DIR_ENTRY_SIZE+j*BLK_SIZEdata+cur_dir_cluster*p->spc+j,1,FALSE); + else { + buf2=MAllocZ(dir_size+p->spc*BLK_SIZE); + MemCpy(buf2,buf,dir_size); + FreeLTClusters(p,cur_dir_cluster, + dir_size/(p->spc*BLK_SIZE),FALSE); + dir_size+=p->spc*BLK_SIZE; + c=AllocClusters(p,0,dir_size/(p->spc*BLK_SIZE),TRUE,FALSE); + Free(buf); + buf=buf2; + ptr=buf-offset(LTDirEntry.start); + ptr->size=dir_size; + ptr->expanded_size=dir_size; + ptr->cluster=c; + WClusters(p,buf,c,dir_size/(p->spc*BLK_SIZE),FALSE); + if (cur_dir_cluster==p->root_cluster) { + br=MAllocZ(BLK_SIZE); + RBlks(p,br,p->offset,1,FALSE); + br->root_cluster=c; + WBlks(p,br,p->offset,1,FALSE); + Free(br); + p->root_cluster=c; + } else { + temp=NewString(cur_dir); + parent_dir=NewString(cur_dir); + RemoveLastSeg(parent_dir,"/",temp); + if (!*parent_dir) StrCpy(parent_dir,"/"); + if (FindLTFile(p,NameToDirCluster(p,parent_dir,FALSE), + ptr->name,&de2,TRUE,FALSE,FALSE)) { + de2.cluster=c; + de2.size=dir_size; + de2.expanded_size=dir_size; + //TODO: is this supposed to free old chain? + NewLTDirEntry2(p,parent_dir,&de2,FALSE,FALSE); + } else + UnrecoverableSysError(0x0FFF0006); + Free(temp); + Free(parent_dir); + } + } + break; + } else if (ptr->attr & LT_ATTR_DELETED) { + if (!written) { + MemCpy(&ptr->attr,&de->attr,LT_DIR_ENTRY_SIZE); + WBlks(p,buf+j*BLK_SIZE, + p->data+cur_dir_cluster*p->spc+j,1,FALSE); + written=TRUE; + } + } else { + if (!StrCmp(de->name,ptr->name)) { + if (free_old_chain) + FreeLTClusters(p,ptr->cluster, + (ptr->size+p->spc*BLK_SIZE-1)/(p->spc*BLK_SIZE),FALSE); + if (!written) { + MemCpy(&ptr->attr,&de->attr,LT_DIR_ENTRY_SIZE); + WBlks(p,buf+j*BLK_SIZE, + p->data+cur_dir_cluster*p->spc+j,1,FALSE); + break; + } else { + ptr->attr|=LT_ATTR_DELETED; + WBlks(p,buf+j*BLK_SIZE, + p->data+cur_dir_cluster*p->spc+j,1,FALSE); + } + } + } + ptr+=LT_DIR_ENTRY_SIZE; + if (++i>=l) { + j++; + i=0; + } + } + Free(buf); + if (unlock) + UnlockPartition(p); + } catch + UnlockPartition(p); + return FALSE; +} + +BoolU4 NewLTDirEntry(LTPartition *p,I1 *cur_dir,LTDirEntry *tempm,BoolU4 free_old_chain=TRUE) +{ + if (p->type==PT_LT) + return NewLTDirEntry2(p,cur_dir,tempm,free_old_chain,TRUE); + return FALSE; +} + +BoolU4 DelLTFiles(LTPartition *p,I1 *cur_dir,I1 *wild, + BoolU4 del_dir=FALSE,BoolU4 print_msg=TRUE) +{ + LTDirEntry *buf,*buf2,*ptr; + U8 cnt,i=0,j=0,l=BLK_SIZE/LT_DIR_ENTRY_SIZE; + U1 ch; + U8 cur_dir_cluster=NameToDirCluster(p,cur_dir,TRUE); + try { + LockPartition(p); + buf2=MAlloc(BLK_SIZE*p->spc); + RClusters(p,buf2,cur_dir_cluster,1,FALSE); + + ptr=buf2-offset(LTDirEntry.start); + buf=MAlloc(ptr->size); + RClusters(p,buf,cur_dir_cluster,ptr->size/BLK_SIZE/p->spc,FALSE); + Free(buf2); + + ptr=buf-offset(LTDirEntry.start); + cnt=ptr->size/LT_DIR_ENTRY_SIZE; + ptr->name[0]='.'; + ptr->name[1]=0; + while (cnt--) { + ch=ptr->name[0]; + if (!ch) + break; + else if (!(ptr->attr & LT_ATTR_DELETED) && ch!='.' && (del_dir || + !(ptr->attr & LT_ATTR_DIR))) { + if (WildFileNameList(wild,ptr->name)) { + if (print_msg) + coutln SysText("ST_DELETE"),ptr->name; + ptr->attr|=LT_ATTR_DELETED; + WBlks(p,buf+j*BLK_SIZE, + p->data+cur_dir_cluster*p->spc+j,1,FALSE); + FreeLTClusters(p,ptr->cluster, + (ptr->size+p->spc*BLK_SIZE-1)/(p->spc*BLK_SIZE),FALSE); + } + } + ptr+=LT_DIR_ENTRY_SIZE; + if (++i>=l) { + j++; + i=0; + } + } + Free(buf); + UnlockPartition(p); + } catch + UnlockPartition(p); + return FALSE; +} + +U8 WriteLTFile(LTPartition *p,I1 *cur_dir,I1 *name,U1 *buf,U8 size, + LTDate LTdatetime,U8 attr,BoolU4 raw, + ArcCompressStruct **ac2) +{ + LTDirEntry de; + U8 c=0; + U8 flags=0,cluster_cnt, + cluster_size=BLK_SIZE*p->spc; + ArcCompressStruct *ac=NULL; + BoolU4 contiguous; + U8 cur_dir_cluster=NameToDirCluster(p,cur_dir,TRUE); + MemSet(&de,0,sizeof(LTDirEntry)); + if (ac2) *ac2=NULL; + if (!LTdatetime) + LTdatetime=GetCurTimeLTDate; + + if (p->type!=PT_LT) + PutSysText("ST_NOT_LT"); + else if (!ToLTFilename(de.name,name)) + PutSysText("ST_INVALID_FILENAME"); + else { + DelLTFiles(p,cur_dir,de.name,FALSE,FALSE); + attr=FileAttr(name,attr); + attr|=LT_ATTR_CONTIGUOUS; + contiguous=TRUE; + de.expanded_size=size; + if ((attr & LT_ATTR_COMPRESSED) && !raw) { + ac=CompressBuf(buf,size,flags); + size=ac->compressed_size; + buf=ac; + } + de.size=size; + de.xsum=ArcCheckSum(buf,size)^LT_XSUM; + cluster_cnt=(size+cluster_size-1)/cluster_size; + if (cluster_cnt) + c=AllocClusters(p,0,cluster_cnt,contiguous,TRUE); + else + c=INVALID_CLUSTER; + de.cluster=c; + de.attr=attr; + de.datetime=LTdatetime; + disk_status_display.u2[1]=0x8000+cluster_cnt; + if (cluster_cnt) + WClusters(p,buf,c,cluster_cnt,TRUE,TRUE); + disk_status_display.u2[1]=0; + NewLTDirEntry2(p,cur_dir,&de,TRUE,TRUE); + if (ac2) + *ac2=ac; + else + Free(ac); + } + return c; +} + +void DelLTDirEntry(LTDirEntry *tempm) +{ + if (tempm) { + Free(tempm->full_name); + Free(tempm); + } +} + +void DelLTDirList(LTDirEntry *tempm) +{ + LTDirEntry *tempm2; + while (tempm) { + tempm2=tempm->next; + if (tempm->sub) + DelLTDirList(tempm->sub); + DelLTDirEntry(tempm); + tempm=tempm2; + } +} + +LTDirEntry *FindLTFiles(I1 *wild,U8 *fuf_flags) +{ + LTPartition *p=Fs->cur_partition; + LTDirEntry *buf,*buf2,*ptr; + U8 cnt,cur_dir_cluster=NameToDirCluster(p,Fs->cur_dir,FALSE); + U1 ch; + LTDirEntry *result=NULL,*tempm; + + LockPartition(p); + buf2=MAlloc(BLK_SIZE*p->spc); + RClusters(p,buf2,cur_dir_cluster,1,FALSE); + + ptr=buf2-offset(LTDirEntry.start); + buf=MAlloc(ptr->size); + RClusters(p,buf,cur_dir_cluster,ptr->size/BLK_SIZE/p->spc,FALSE); + Free(buf2); + + ptr=buf-offset(LTDirEntry.start); + cnt=ptr->size/LT_DIR_ENTRY_SIZE; + ptr->name[0]='.'; + ptr->name[1]=0; + ptr+=LT_DIR_ENTRY_SIZE; + ptr->cluster=NameToParentDirCluster(p,Fs->cur_dir,FALSE); + ptr-=LT_DIR_ENTRY_SIZE; + while (cnt--) { + ch=ptr->name[0]; + if (!ch) + break; + else if (!(ptr->attr & LT_ATTR_DELETED)) { + tempm=MAllocZ(sizeof(LTDirEntry)); + MemCpy(&tempm->attr,&ptr->attr,LT_DIR_ENTRY_SIZE); + if (Bt(fuf_flags,FUf_RECURSE) && tempm->attr & LT_ATTR_DIR && tempm->name[0]!='.') { + tempm->next=result; + result=tempm; + tempm->full_name=AbsoluteDirName(tempm->name); + UnlockPartition(p); + Cd(tempm->name); + tempm->sub=FindLTFiles(wild,fuf_flags); + Cd(".."); + LockPartition(p); + } else if ((!(tempm->attr & LT_ATTR_DIR) && !Bt(fuf_flags,FUf_JUST_DIRS) + || !Bt(fuf_flags,FUf_RECURSE)) && + WildFileNameList(wild,tempm->name)) { + tempm->next=result; + result=tempm; + tempm->full_name=AbsoluteFileName(tempm->name); + } else + DelLTDirEntry(tempm); + } + ptr+=LT_DIR_ENTRY_SIZE; + } + Free(buf); + UnlockPartition(p); + return result; +} + +LTDirEntry *FindISOFiles(I1 *wild,U8 *fuf_flags) +{ + LTPartition *p=Fs->cur_partition; + ISODirEntry *buf,*isoptr; + U8 cur_dir_cluster=NameToDirCluster(p,Fs->cur_dir,TRUE); + LTDirEntry *result=NULL,*tempm; + I8 i; + + isoptr=MAlloc(BLK_SIZE*p->spc); + RClusters(Fs->cur_partition,isoptr,cur_dir_cluster,1,TRUE); + if (isoptr->name_len==1 && isoptr->name==0) { //curdir + i=(isoptr->size.little+BLK_SIZE*p->spc-1)/(BLK_SIZE*p->spc); + buf=MAlloc(BLK_SIZE*p->spc*i); + RClusters(Fs->cur_partition,buf,cur_dir_cluster,i,TRUE); + Free(isoptr); + } else { + buf=isoptr; + i=1; + } + i*=BLK_SIZE*p->spc; + while (i>0) { + if (!buf->length) { + buf++; + i--; + } else { + tempm=MAlloc(sizeof(LTDirEntry)); + if (FillLTDirISO(Fs->cur_partition,tempm,buf,TRUE)) { + if (Bt(fuf_flags,FUf_RECURSE) && tempm->attr & LT_ATTR_DIR && tempm->name[0]!='.') { + tempm->next=result; + result=tempm; + tempm->full_name=AbsoluteDirName(tempm->name); + Cd(tempm->name); + tempm->sub=FindISOFiles(wild,fuf_flags); + Cd(".."); + } else if ((!(tempm->attr & LT_ATTR_DIR) && !Bt(fuf_flags,FUf_JUST_DIRS) + || !Bt(fuf_flags,FUf_RECURSE)) && + WildFileNameList(wild,tempm->name)) { + tempm->next=result; + result=tempm; + tempm->full_name=AbsoluteFileName(tempm->name); + } else + DelLTDirEntry(tempm); + } else + DelLTDirEntry(tempm); + i-=buf->length; + buf+=buf->length; + } + } + Free(buf); + return result; +} + + +I8 CompareLTDir(LTDirEntry **e1,LTDirEntry **e2) +{ + I1 buf1[LT_MAX_FILENAME_LEN+1],buf2[LT_MAX_FILENAME_LEN+1]; + I1 buf3[LT_MAX_FILENAME_LEN+1],buf4[LT_MAX_FILENAME_LEN+1]; + I8 d1=0,d2=0; + if ((*e1)->attr & LT_ATTR_DIR) + d1=1; + if ((*e2)->attr & LT_ATTR_DIR) + d2=1; + if (d1!=d2) + return d2-d1; + else { + StrCpy(buf1,(*e1)->name); + StrCpy(buf2,(*e2)->name); + RemoveLastSeg(buf1,".",buf3); + RemoveLastSeg(buf2,".",buf4); + if (d1=StrCmp(buf3,buf4)) + return d1; + return StrCmp(buf1,buf2); + } +} + + +void SortLTDirFiles(LTDirEntry **tempm) +{ + I8 i,cnt=0; + LTDirEntry *tempm1=*tempm,*tempm2,**sort_buf; + if (tempm1) { + tempm2=tempm1; + while (tempm2) { + cnt++; + tempm2=tempm2->next; + } + sort_buf=MAlloc(cnt*PTR_SIZE); + i=0; + tempm2=tempm1; + while (tempm2) { + sort_buf[i++]=tempm2; + tempm2=tempm2->next; + } + QSort(sort_buf,cnt,PTR_SIZE,&CompareLTDir); + tempm1=sort_buf[0]; + *tempm=tempm1; + for (i=0;inext=sort_buf[i+1]; + } + tempm2=sort_buf[i]; + tempm2->next=NULL; + Free(sort_buf); + + tempm2=tempm1; + while (tempm2) { + if (tempm2->sub) + SortLTDirFiles(&tempm2->sub); + tempm2=tempm2->next; + } + } +} + +LTDirEntry *SysFindFiles(I1 *wild,U8 *fuf_flags=NULL) +{ + LTPartition *p=Fs->cur_partition; + LTDirEntry *result=NULL; + U8 my_flags=0; + if (!fuf_flags) fuf_flags=&my_flags; + CheckLTPartition(p); + if (p->type==PT_LT) + result=FindLTFiles(wild,fuf_flags); + else if (p->type==PT_ISO9660) + result=FindISOFiles(wild,fuf_flags); + else { + PutSysText("ST_FILE_SYSTEM_NOT_SUPPORTED"); + result=NULL; + } + SortLTDirFiles(&result); + return result; +} + + +void PutFileLink(I1 *name,I8 line=0,BoolU4 plain_text=FALSE) +{ + I1 *buf; + if (!name) return; + buf=AbsoluteFileName(name); + if (plain_text) { + if (line) + PrintF("$$LK \"%s,%04d\",\"PL:%s,%d\"$$", + name,line,buf,line); + else + PrintF("$$LK \"%s\",\"PI:%s\"$$", + name,buf); + } else { + if (line) + PrintF("$$LK \"%s,%04d\",\"FL:%s,%d\"$$", + name,line,buf,line); + else + PrintF("$$LK \"%s\",\"FI:%s\"$$", + name,buf); + } + Free(buf); +} + +void PutDirLink(I1 *name) +{ + I1 *buf; + if (!name) return; + buf=AbsoluteDirName(name); + PrintF("$$MA +A \"%s\",\"Cd(\\\"%s\\\");Dir;\r\"$$", + name,buf); + Free(buf); +} + +void DirLT(I1 *wild,BoolU4 full) +{ + LTPartition *p=Fs->cur_partition; + LTDirEntry *tempm1=NULL,*tempm2; + U8 my_flags=0; + I1 *st; + tempm1=SysFindFiles(wild,&my_flags); + + if (tempm1) { + st=CurDir; + if (full) + coutln "Directory of ",st, + "\r\n__DATE__ __TIME__ __SIZE__"; + else + coutln "Directory of ",st, + "\r\nDATE_ TIME_ __SIZE__"; + Free(st); + while (tempm1) { + tempm2=tempm1->next; + if (full) { + PrintF("%D %T %08X ", + tempm1->datetime.date, + tempm1->datetime.time, + tempm1->size); + cout " ",tempm1->expanded_size, + " ",tempm1->cluster; + } else { + PrintF("%h1D %h1T %08X ", + tempm1->datetime.date, + tempm1->datetime.time, + tempm1->size); + } + if (tempm1->attr & LT_ATTR_DIR) + PutDirLink(tempm1->name); + else + PutFileLink(tempm1->name); + + CrLf; + DelLTDirEntry(tempm1); + tempm1=tempm2; + } + } else { + PutSysText("ST_NO_MATCHING_ENTRIES"); + return; + } +} + + \ No newline at end of file diff --git a/LT/OSMain/DISK4.CPZ b/LT/OSMain/DISK4.CPZ new file mode 100644 index 0000000..6405864 --- /dev/null +++ b/LT/OSMain/DISK4.CPZ @@ -0,0 +1,1014 @@ +void MapDrive(I1 ch,LTPartition *p) +{ + drive_to_partition[ToUpper(ch)-'A']=p; + p->drive=ToUpper(ch); +} + +BoolU4 Drive(I1 drive_letter) +{ + LTPartition *p; + LTBlkDev *bdev; + BoolU4 different=FALSE; + LTPartition *new_partition=DriveToPartition(drive_letter); + if (!new_partition) { + PutSysText("ST_INVALID_DRIVE"); + return FALSE; + } + if (new_partition!=Fs->cur_partition) { + different=TRUE; + Fs->cur_partition=new_partition; + } + p=Fs->cur_partition; + CheckLTPartition(p); + bdev=p->bdev; + CheckLTBlkDev(bdev); + if (different) { + if ((bdev->flags & LTBDF_REMOVABLE) && + !(bdev->flags & LTBDF_INITIALIZED) ) + ChangeDisk(p->drive); + if (bdev->type==LTBDT_RAM || bdev->type==LTBDT_FILE) + InitBlkDev(bdev,TRUE); + } + Free(Fs->cur_dir); + Fs->cur_dir=NewString("/"); + if (p->type==PT_ISO9660 || p->type==PT_LT) + return TRUE; + else + return FALSE; +} + +BoolU4 Cd(I1 *name,BoolU4 make_dirs=FALSE) +{ + I8 maxlen; + BoolU4 result=TRUE; + I1 *buf2,*buf3,*buf,*hdir; + LTPartition *p; + U8 cur_dir_cluster=0; + if (*name && name[1]==':') { + if (*name==':') { + if (Fs->cur_partition!=default_partition) + if (!Drive(*name)) return FALSE; + } else { + if (Fs->cur_partition!= + DriveToPartition(*name)) + if (!Drive(*name)) return FALSE; + } + name+=2; + } + if (*name=='/') { + Free(Fs->cur_dir); + Fs->cur_dir=NewString("/"); + name++; + } + buf2=MStringUtil(name, + SU_REMOVE_LEADING|SU_REMOVE_TRAILING| + SU_DISCARD_PARITY|SU_REMOVE_CTRL_CHARS); + maxlen=StrLen(Fs->cur_dir)+1+StrLen(buf2)+1; + buf3=MAlloc(maxlen); + buf=MAlloc(maxlen); + StrCpy(buf3,Fs->cur_dir); + while (*buf2 && result) { + RemoveFirstSeg(buf2,"/",buf); + if (!*buf) + StrCpy(buf3,"/"); + else if (!StrCmp(buf,"..")) { + RemoveLastSeg(buf3,"/",buf); + if (!*buf3) + StrCpy(buf3,"/"); + } else if (!StrCmp(buf,".")) { + ; + } else if (*buf) { + if (!StrCmp(buf,"HOME")) { + hdir=HomeDirString; + result=Cd(hdir); + Free(buf3); + buf3=MAlloc(maxlen+StrLen(hdir)); + StrCpy(buf3,hdir+2); + Free(hdir); + } else { + p=Fs->cur_partition; + cur_dir_cluster=NameToDirCluster(p,buf3,TRUE); + if (p->type==PT_LT) + result=CdLT(buf,cur_dir_cluster); + else if (p->type==PT_ISO9660) + result=CdISO(buf,cur_dir_cluster); + else result=FALSE; + if (!result && make_dirs) { + Free(Fs->cur_dir); + Fs->cur_dir=NewString(buf3); + result=MkDir(buf); + } + if (result) { + if (StrCmp(buf3,"/")) + StrCat(buf3,"/"); + StrCat(buf3,buf); + } + } + } + } + Free(Fs->cur_dir); + Fs->cur_dir=NewString(buf3); + Free(buf); + Free(buf2); + Free(buf3); + return result; +} + +void DelLTFileAccess(LTFileAccess *fa) +{ + LTBlkDev *bdev; + if (!fa) return; + bdev=fa->old_partition->bdev; + if (!(bdev->flags & LTBDF_INIT_IN_PROGRESS)) { + if (fa->old_dir) { + Drive(PartitionToDrive(fa->old_partition)); + Cd(fa->old_dir); + } + } else { + Fs->cur_partition=fa->old_partition; + Free(Fs->cur_dir); + Fs->cur_dir=NewString("/"); + } + Free(fa->old_dir); + Free(fa->mask); + Free(fa); +} + +LTFileAccess *NewLTFileAccess(I1 *mask,BoolU4 make_mask=FALSE,BoolU4 make_dirs=FALSE) +{ + BoolU4 valid=TRUE; + I1 *buf,*my_mask,*temp_mask; + BoolU4 old_silent; + LTFileAccess *fa=MAllocZ(sizeof(LTFileAccess)); + my_mask=MStringUtil(mask, + SU_REMOVE_LEADING|SU_REMOVE_TRAILING| + SU_DISCARD_PARITY|SU_REMOVE_CTRL_CHARS); + temp_mask=my_mask; + fa->old_dir=NewString(Fs->cur_dir); + fa->old_partition=Fs->cur_partition; + if (*my_mask && my_mask[1]==':') { + if (Fs->cur_partition!=DriveToPartition(*my_mask)) + if (!Drive(*my_mask)) valid=FALSE; + my_mask+=2; + } + if (StrStr(my_mask,"HOME")) { //TODO + if (Fs->cur_partition!=DriveToPartition(':')) + Drive(':'); + } + fa->p=Fs->cur_partition; + CheckLTPartition(fa->p); + buf=NewString(my_mask); + fa->mask=MAlloc(StrLen(buf)+1); + RemoveLastSeg(buf,"/",fa->mask); + if (*my_mask=='/' && !*buf) + StrCpy(buf,"/"); + if (*buf) + if (!Cd(buf,make_dirs)) + valid=FALSE; + if (valid && make_mask) { + if (!make_dirs || CheckFileName(fa->mask)) { + old_silent=Silent(ON); + if (Cd(fa->mask,make_dirs)) { + Free(fa->mask); + fa->mask=NewString("*"); + } + Silent(old_silent); + } + } + Free(buf); + Free(temp_mask); + if (!valid) { + DelLTFileAccess(fa); + fa=NULL; +// throw(EXCEPT_FILE); + } + return fa; +} + +LTDirEntry *FindFiles(I1 *wild,U8 *fuf_flags=NULL) +{ + U8 my_flags=0; + LTDirEntry *result=NULL; + LTFileAccess *fa=NewLTFileAccess(wild,TRUE); + if (!fuf_flags) fuf_flags=&my_flags; + if (fa) { + result=SysFindFiles(fa->mask,fuf_flags); + DelLTFileAccess(fa); + } + return result; +} + +BoolU4 IsDir(I1 *dir_name) +{ + BoolU4 result=FALSE; + I1 *mask=MSPrintF("%s/*",dir_name); + BoolU4 old_silent=Silent(ON); + LTFileAccess *fa=NewLTFileAccess(mask); + if (fa) { + result=TRUE; + DelLTFileAccess(fa); + } + Free(mask); + Silent(old_silent); + return result; +} + +void Dir(I1 *wild=NULL,BoolU4 full=FALSE) +{ + I1 *w; + LTFileAccess *fa; + if (!wild) + w=NewString("*"); //We must do this because of bug that prevents string defaults + else + w=NewString(wild); + fa=NewLTFileAccess(w,TRUE); + if (fa) { + DirLT(fa->mask,full); + DelLTFileAccess(fa); + } + Free(w); +} + + +void Del(I1 *wild,BoolU4 print_msg=TRUE) +{ + LTFileAccess *fa=NewLTFileAccess(wild); + if (fa) { + if (fa->p->type==PT_LT) + DelLTFiles(fa->p,Fs->cur_dir,fa->mask,FALSE,print_msg); + DelLTFileAccess(fa); + } +} + +U1 *ReadFile(I1 *filename,U8 *size=NULL,U8 *attr=NULL,BoolU4 raw=FALSE) +{ + SysHashEntry *temph,**temph1; + I1 *absname; + U1 *result=NULL; + U8 size2=0,attr2=0; + LTFileAccess *fa; + ArcCompressStruct *ac=NULL; + + if (attr) + *attr=0; + absname=AbsoluteFileName(filename); + if (!raw && (temph=FindHashEntry(absname,adam_tss->hash_table,HTT_FILE))) { + if (FileAttr(absname) & LT_ATTR_COMPRESSED) { + ac=temph->user0; + if (size) + *size=ac->expanded_size; + if (attr) + *attr=FileAttr(absname,*attr); + result=ExpandBuf(ac); + } else { //Not implimented + result=MAlloc(temph->user1+1); + MemCpy(result,temph->user0,temph->user1); + result[temph->user1]=0; //Terminate + if (size) + *size=temph->user1; + } + } else { + fa=NewLTFileAccess(absname); + if (fa) { + if (fa->p->type==PT_LT) + result=ReadLTFile(fa->p,Fs->cur_dir,fa->mask,&size2,&attr2,raw,&ac); + else if (fa->p->type==PT_ISO9660) + result=ReadISOFile(fa->p,Fs->cur_dir,fa->mask,&size2,&attr2,raw,&ac); + while (!result && StrCmp(Fs->cur_dir,"/")) { + Cd(".."); + if (Fs->cur_partition->type==PT_LT) + result=ReadLTFile(fa->p,Fs->cur_dir,fa->mask,&size2,&attr2,raw,&ac); + else if (fa->p->type==PT_ISO9660) + result=ReadISOFile(fa->p,Fs->cur_dir,fa->mask,&size2,&attr2,raw,&ac); + } + if (!result) + cout filename," ",SysText("ST_FILE_NOT_FOUND"); + DelLTFileAccess(fa); + } + if (size) + *size=size2; + if (attr) + *attr=attr2; + if (!raw && attr2 & LT_ATTR_RESIDENT) { + temph=AMAllocZ(sizeof(SysHashEntry)); + temph->string=ANewString(absname); + temph->type=HTT_FILE; + temph->use_cnt=0; + temph->source_link=NULL; + temph->user0=AMAllocIdentical(ac); + temph->user1=size2; + temph1=FindHashBucket(temph->string,adam_tss->hash_table); + temph->next=*temph1; + *temph1=temph; + } + Free(ac); + } + Free(absname); + return result; +} + +I1 *ReadTextFile(I1 *filename,U8 *attr=NULL) +{ + return ReadFile(filename,NULL,attr); +} + + +BoolU4 FindFile(I1 *filename,LTDirEntry *rde=NULL, + BoolU4 dir_only=FALSE,BoolU4 file_only=FALSE,BoolU4 scan_parents=FALSE) +{ + U8 cur_dir_cluster; + BoolU4 result=FALSE; + LTDirEntry de; + LTFileAccess *fa=NewLTFileAccess(filename); + if (fa) { + cur_dir_cluster=NameToDirCluster(fa->p,Fs->cur_dir,TRUE); + if (fa->p->type==PT_LT) + result=FindLTFile(fa->p,cur_dir_cluster,fa->mask, + &de,dir_only,file_only,TRUE); + else if (fa->p->type==PT_ISO9660) + result=FindISOFile(fa->p,cur_dir_cluster,fa->mask, + &de,dir_only,file_only,TRUE); + if (scan_parents) { + while (!result && StrCmp(Fs->cur_dir,"/")) { + Cd(".."); + cur_dir_cluster=NameToDirCluster(fa->p,Fs->cur_dir,TRUE); + if (fa->p->type==PT_LT) + result=FindLTFile(fa->p,cur_dir_cluster,fa->mask, + &de,dir_only,file_only,TRUE); + else if (fa->p->type==PT_ISO9660) + result=FindISOFile(fa->p,cur_dir_cluster,fa->mask, + &de,dir_only,file_only,TRUE); + } + } + DelLTFileAccess(fa); + } + if (result && rde) + MemCpy(rde,&de,sizeof(LTDirEntry)); + return result; +} + + +U8 WriteFile(I1 *filename,U1 *fbuf, + U8 size,LTDate LTdatetime=0,U8 attr=0,BoolU4 raw=FALSE) +{ + U8 c=0; + SysHashEntry *temph,**temph1; + LTFileAccess *fa=NewLTFileAccess(filename); + ArcCompressStruct *ac=NULL; + I1 *absname=AbsoluteFileName(filename); + if (fa) { + if (fa->p->type==PT_LT) + c=WriteLTFile(fa->p,Fs->cur_dir,fa->mask, + fbuf,size,LTdatetime,attr,raw,&ac); + if (temph=FindHashEntry(absname,adam_tss->hash_table,HTT_FILE)) { + AFree(temph->user0); + if (!raw && ac && attr & LT_ATTR_RESIDENT) { + temph->user0=AMAllocIdentical(ac); + temph->user1=size; + } else { + temph->user0=0; + temph->type=HTT_INVALID; + } + } else if (!raw && ac && attr & LT_ATTR_RESIDENT) { + temph=AMAllocZ(sizeof(SysHashEntry)); + temph->string=ANewString(absname); + temph->type=HTT_FILE; + temph->use_cnt=0; + temph->source_link=NULL; + temph->user0=AMAllocIdentical(ac); + temph->user1=size; + temph1=FindHashBucket(temph->string,adam_tss->hash_table); + temph->next=*temph1; + *temph1=temph; + } + Free(ac); + DelLTFileAccess(fa); + } + Free(absname); + return c; +} + +void WriteTextFile(I1 *filename,I1 *st,U8 attr=0) +{ + WriteFile(filename,st,StrLen(st),0,attr); +} + + +void FAllocFile(LTFile *f,U8 cnt,BoolU4 contiguous) +{ + LTPartition *fp=f->p; + LTFileAccess *fa=NewLTFileAccess(f->de.full_name); + f->de.cluster=AllocClusters(fp,0,(cnt+fp->spc-1)/fp->spc,contiguous,TRUE); + f->de.size=BLK_SIZE*cnt; + f->de.expanded_size=f->de.size; + if (fa) { + NewLTDirEntry(fa->p,Fs->cur_dir,&f->de,TRUE); + DelLTFileAccess(fa); + } + f->flags&=~LTF_NEW_FILE; +} + +U8 FSize(LTFile *f) +{ + if (f) + return f->de.size; + else + return 0; +} + +void FSync(LTFile *f) +{ + if (f->flags & LTF_BUF_DIRTY) { + WClusters(f->p,f->cluster_buf,f->cluster,1,TRUE,TRUE); + f->flags&=~LTF_BUF_DIRTY; + } + disk_status_display.u2[1]=0; +} + + +LTFile *FOpen(I1 *filename,I1 *flags,U8 cnt=0) +{ //allows flags "r","w","w+" and "c" (contiguous) + LTFile *f=AMAllocZ(sizeof(LTFile)); + LTFileAccess *fa; + I1 *full_name,*full_name2; + BoolU4 contiguous=Occurrences(flags,'c'); + + f->cluster=INVALID_CLUSTER; + f->file_ptr=0; + f->fblk_num=0; + if (cnt) + f->max_blk=cnt-1; + else + f->max_blk=INVALID_CLUSTER; + f->file_cluster_num=INVALID_CLUSTER; + full_name2=AbsoluteFileName(filename); + full_name=ANewString(full_name2); + Free(full_name2); + f->p=DriveToPartition(*full_name); + if (contiguous) { + f->flags|=LTF_CONTIGUOUS; + if (f->p->type!=PT_LT) { + if (!(FileAttr(filename) & LT_ATTR_CONTIGUOUS)) + throw(EXCEPT_FILE,60); + } + } + f->cluster_buf=AMAllocZ(f->p->spc*BLK_SIZE); + if (Occurrences(flags,'w')) { + f->flags=f->flags|LTF_WRITE|LTF_NEEDS_WRITE; + if (Occurrences(flags,'+')) { + if (FindFile(full_name,&f->de,FALSE,TRUE)) { + f->de.full_name=full_name; + if (contiguous) + f->max_blk=(FSize(f)+BLK_SIZE-1)/BLK_SIZE-1; + return f; + } + } else + Del(full_name,FALSE); + f->de.full_name=full_name; + f->flags|=LTF_NEW_FILE; + fa=NewLTFileAccess(full_name); + if (fa) { + StrCpy(f->de.name,fa->mask); + DelLTFileAccess(fa); + if (cnt) + FAllocFile(f,cnt,contiguous); + if (!contiguous || cnt) + return f; + } + } else { + if (FindFile(full_name,&f->de,FALSE,TRUE)) { + f->de.full_name=full_name; + if (contiguous) + f->max_blk=(FSize(f)+BLK_SIZE-1)/BLK_SIZE-1; + return f; + } + } + AFree(f->cluster_buf); + AFree(full_name); + AFree(f); + return NULL; +} + +void FClose(LTFile *f) +{ + LTFileAccess *fa; + if (f) { + FSync(f); + if (f->flags & LTF_NEEDS_WRITE) { + fa=NewLTFileAccess(f->de.full_name); + if (fa) { + if (!(f->flags & LTF_USE_OLD_DATETIME)) + f->de.datetime=GetCurTimeLTDate; + if (f->flags & LTF_NEW_FILE) + NewLTDirEntry(fa->p,Fs->cur_dir,&f->de,TRUE); + else + NewLTDirEntry(fa->p,Fs->cur_dir,&f->de,FALSE); + DelLTFileAccess(fa); + } else + throw(EXCEPT_FILE,40); + } + AFree(f->cluster_buf); + AFree(f->de.full_name); + AFree(f); + } +} + +U8 FSetCluster(LTFile *f,U8 c,U8 blk,BoolU4 read) +{ + if (f->cluster!=c) { + if (f->flags & LTF_BUF_DIRTY) { + WClusters(f->p,f->cluster_buf,f->cluster,1,TRUE,TRUE); + f->flags=f->flags & ~LTF_BUF_DIRTY; + } + f->cluster=c; + f->file_cluster_num=blk/f->p->spc; + if (read) + c=RClusters(f->p,f->cluster_buf,c,1,TRUE,TRUE); + } + return c; +} + +BoolU4 FRBlks(LTFile *f,U1 *buf,U8 blk=LTFB_NEXT_BLK,U8 cnt=1) +{ + LTPartition *p=f->p; + U8 spc=p->spc,i,j,c=f->de.cluster; + + if (!f || !p) return FALSE; + if (blk==LTFB_NEXT_BLK) + blk=f->fblk_num; + if (blk+cnt-1>f->max_blk) + return FALSE; + if (!cnt) return TRUE; + + disk_status_display.u2[1]=cnt/spc; + if (f->flags & LTF_CONTIGUOUS) { + RBlks(p,buf,ClusterBlk(p,c)+blk,cnt,TRUE); + blk+=cnt; + } else { + i=blk/spc; + if (i>=f->file_cluster_num) { + c=f->cluster; + i-=f->file_cluster_num; + } + if (i) + c=NextClusterNum(p,c,i,TRUE); + + i=blk%spc; + if (i) { + c=FSetCluster(f,c,blk,TRUE); + j=(cntcluster_buf+BLK_SIZE*i,j*BLK_SIZE); + buf+=j*BLK_SIZE; + cnt-=j; + blk+=j; + } + while (cnt>=spc) { + c=FSetCluster(f,c,blk,TRUE); + MemCpy(buf,f->cluster_buf,spc*BLK_SIZE); + buf+=spc*BLK_SIZE; + cnt-=spc; + blk+=spc; + } + if (cnt) { + c=FSetCluster(f,c,blk,TRUE); + MemCpy(buf,f->cluster_buf,cnt*BLK_SIZE); + buf+=cnt*BLK_SIZE; + blk+=cnt; + } + } + f->fblk_num=blk; + disk_status_display.u2[1]=0; + return TRUE; +} + +BoolU4 FWBlks(LTFile *f,U1 *buf,U8 blk=LTFB_NEXT_BLK,U8 cnt=1) +{ + LTPartition *p=f->p; + U8 spc=p->spc,i,j,c=f->de.cluster,c1; + + if (!f || !p) return FALSE; + if (blk==LTFB_NEXT_BLK) + blk=f->fblk_num; + if (blk+cnt-1>f->max_blk) + return FALSE; + if (!(f->flags & LTF_WRITE)) + return FALSE; + if (!cnt) return TRUE; + disk_status_display.u2[1]=0x8000+cnt/spc; + if (f->flags & LTF_CONTIGUOUS) { + WBlks(p,buf,ClusterBlk(p,c)+blk,cnt,TRUE); + blk+=cnt; + } else { + if (!c) { + c=AllocClusters(p,0,1,FALSE,TRUE); + f->file_cluster_num=0; + f->cluster=c; + f->de.cluster=c; + f->flags|=LTF_NEEDS_WRITE|LTF_NEW_FILE; + } + i=blk/spc; + if (i>=f->file_cluster_num) { + c=f->cluster; + i-=f->file_cluster_num; + } + while (i) { + c1=c; + c=NextClusterNum(p,c1,1,TRUE); + if (c==INVALID_CLUSTER) { + c=AllocClusters(p,c1,i,FALSE,TRUE); + if (i>1) + c=NextClusterNum(p,c,i-1,TRUE); + break; + } else + i--; + } + + i=blk%spc; + if (i) { + FSetCluster(f,c,blk,TRUE); + j=(cntcluster_buf+BLK_SIZE*i,buf,j*BLK_SIZE); + f->flags|=LTF_BUF_DIRTY; + buf+=j*BLK_SIZE; + cnt-=j; + blk+=j; + if (cnt) { + c1=c; + c=NextClusterNum(p,c1,1,TRUE); + if (c==INVALID_CLUSTER) + c=AllocClusters(p,c1,1,FALSE,TRUE); + } + } + while (cnt>=spc) { + FSetCluster(f,c,blk,FALSE); + MemCpy(f->cluster_buf,buf,spc*BLK_SIZE); + f->flags|=LTF_BUF_DIRTY; + buf+=spc*BLK_SIZE; + cnt-=spc; + blk+=spc; + if (cnt) { + c1=c; + c=NextClusterNum(p,c1,1,TRUE); + if (c==INVALID_CLUSTER) + c=AllocClusters(p,c1,1,FALSE,TRUE); + } + } + if (cnt) { + FSetCluster(f,c,blk,TRUE); + MemCpy(f->cluster_buf,buf,cnt*BLK_SIZE); + f->flags|=LTF_BUF_DIRTY; + buf+=cnt*BLK_SIZE; + blk+=cnt; + } + if (f->de.sizede.size=blk*BLK_SIZE; + if (f->de.expanded_sizede.expanded_size=blk*BLK_SIZE; + } + f->fblk_num=blk; + disk_status_display.u2[1]=0; + return TRUE; +} + +void SelectDefaultDrive() +{ + I1 ch; + LTPartition *p; + + if (!default_drive) + AddDrives(FALSE); + while (!default_drive) { + cout "\r\nContinue Boot to Which Drive? "; + p=DriveToPartition(SysGetChar); + CrLf; + if (!p || p->type!=PT_ISO9660 && p->type!=PT_LT) { + coutln "Invalid Partition"; + PartitionRep; + } else { + if (p->bdev->flags & LTBDF_REMOVABLE) { + ch=p->drive; + coutln "Insert Diskette in Drive ",ch; + } + default_drive=p->drive; + } + } + default_partition=DriveToPartition(default_drive); + Fs->cur_partition=-1; //Null screws-up cache + Fs->cur_dir=NewString("/"); + ChangeDisk(':'); +} + +BoolU4 CopySingleZ(I1 *f1,I1 *f2) //Just one file +{ + U1 *file_buf=NULL; + U8 size,attr=0; + LTDirEntry de; + + if (FindFile(f1,&de,FALSE,TRUE)) { + file_buf=ReadFile(f1,&size,&attr); + attr=FileAttr(f2,attr); + if (file_buf) { + coutln "Copying ",f1," to ",f2; + WriteFile(f2,file_buf,size,de.datetime,attr); + Free(file_buf); + return TRUE; + } else PutSysText("ST_FILE_NOT_FOUND"); + } else PutSysText("ST_FILE_NOT_FOUND"); + return FALSE; +} + +#define COPY_BUF_BLKS 0x400 +BoolU4 CopySingle(I1 *f1,I1 *f2) //Just one file +{ + U1 *buf; + U8 cnt,l,size,attr1=FileAttr(f1),attr2=FileAttr(f2); + LTFile *in_file=NULL,*out_file=NULL; + U8 xsum=LT_XSUM,i,j; + if (!StrCmp(f1,f2)) + return FALSE; + if (attr1!=attr2) + return CopySingleZ(f1,f2); + buf=MAlloc(COPY_BUF_BLKS*BLK_SIZE); + if (attr2 & LT_ATTR_CONTIGUOUS) + in_file=FOpen(f1,"rc"); + else + in_file=FOpen(f1,"r"); + if (in_file) { + size=FSize(in_file); + cnt=(size+BLK_SIZE-1)/BLK_SIZE; + if (attr2 & LT_ATTR_CONTIGUOUS) + out_file=FOpen(f2,"wc",cnt); + else + out_file=FOpen(f2,"w",cnt); + if (out_file) { + coutln "Copying ",f1," to ",f2; + j=size; + while (cnt) { + if (cnt>COPY_BUF_BLKS) { + l=COPY_BUF_BLKS; + i=l*BLK_SIZE; + } else { + l=cnt; + i=j; + } + FRBlks(in_file, buf,LTFB_NEXT_BLK,l); + xsum^=ArcCheckSum(buf,i); + FWBlks(out_file,buf,LTFB_NEXT_BLK,l); + cnt-=l; + j-=l*BLK_SIZE; + } + if (in_file->de.xsum && + in_file->de.xsum!=xsum) + throw(EXCEPT_ARC_XSUM); + out_file->de.xsum=xsum; + out_file->flags|=LTF_USE_OLD_DATETIME; + out_file->de.datetime=in_file->de.datetime; + out_file->de.size=size; + out_file->de.expanded_size=in_file->de.expanded_size; + out_file->de.attr=FileAttr(f2,in_file->de.attr); + FClose(out_file); + FClose(in_file); + Free(buf); + return TRUE; + } else PutSysText("ST_FILE_NOT_FOUND"); + FClose(in_file); + } else PutSysText("ST_FILE_NOT_FOUND"); + Free(buf); + return FALSE; +} + +BoolU4 MkDir(I1 *filename) +{ + U8 c,size,cur_dir_cluster; + U1 *buf; + BoolU4 result=FALSE; + LTDirEntry *dLT; + I1 *name; + if (FindFile(filename,NULL,TRUE)) + return FALSE; + LTFileAccess *fa=NewLTFileAccess(filename); + if (fa) { + if (!CheckFileName(fa->mask)) + PutSysText("ST_INVALID_FILENAME"); + else { + name=MStringUtil(fa->mask, + SU_REMOVE_LEADING|SU_REMOVE_TRAILING| + SU_DISCARD_PARITY|SU_REMOVE_CTRL_CHARS); + size=fa->p->spc*BLK_SIZE; + buf=MAllocZ(size); + cur_dir_cluster=NameToDirCluster(fa->p,Fs->cur_dir,TRUE); + if (fa->p->type==PT_LT) { + dLT=buf-offset(LTDirEntry.start); + c=WriteFile(name,buf,size,0,LT_ATTR_DIR,FALSE); + + dLT->attr=LT_ATTR_DIR|LT_ATTR_CONTIGUOUS; + StrCpy(dLT->name,name); + dLT->cluster=c; + dLT->size=size; + dLT->expanded_size=size; + dLT->datetime=GetCurTimeLTDate; + + dLT+=LT_DIR_ENTRY_SIZE; + + dLT->attr=LT_ATTR_DIR|LT_ATTR_CONTIGUOUS; + dLT->name[0]='.'; + dLT->name[1]='.'; + dLT->name[2]=0; + dLT->cluster=cur_dir_cluster; + dLT->size=0; + dLT->expanded_size=0; + dLT->datetime=GetCurTimeLTDate; + + } + WClusters(fa->p,buf,c,1,TRUE); + Free(buf); + Free(name); + result=TRUE; + } + DelLTFileAccess(fa); + } + return result; +} + +void SysDel(I1 *wild,BoolU4 make_mask) //this is dangerous +{ + LTFileAccess *fa=NewLTFileAccess(wild,make_mask); + if (fa) { + if (fa->p->type==PT_LT) + DelLTFiles(fa->p,Fs->cur_dir,fa->mask,TRUE); + DelLTFileAccess(fa); + } +} + +void Format(I8 drive_letter,BoolU4 quick=TRUE,BoolU4 confirm=TRUE,U8 type=PT_LT) +{ + LTPartition *p=DriveToPartition(drive_letter); + if (confirm) { + cout "Are you sure "; + if (!YorN) + return; + } + if (!p) { + PutSysText("ST_INVALID_DRIVE"); + return; + } + if (type==PT_LT) { + Drive(drive_letter); + FormatLT(drive_letter,quick); + InvalidateDiskCache(DriveToPartition(drive_letter),TRUE); + Drive(drive_letter); + } +} + + +void ReadCDImage(I1 drive,I1 *out_name) +{ + LTBlkDev *bdev=DriveToBlkDev(drive); + LTPartition *p=DriveToPartition(drive); + U1 *buf=MAlloc(COPY_BUF_BLKS*BLK_SIZE); + I1 *out_name2=DefaultExtension(out_name,"ISO"); + LTFile *f=FOpen(out_name2,"w"); + U8 l,dv,blk=0,cnt; + InitBlkDev(bdev,TRUE); + if (bdev->type!=LTBDT_ATAPI) + throw(EXCEPT_BLKDEV,3); + dv=bdev->blk_size/BLK_SIZE; + cnt=((p->size+dv-1)/dv)*dv; + while (cnt) { + if (cnt>COPY_BUF_BLKS) + l=COPY_BUF_BLKS; + else + l=cnt; + if (l>bdev->max_reads) + l=bdev->max_reads; + if (!Bt(&sys_flags,SYSf_NO_IO_SOUND)) + Sound(bdev->read_freq); + disk_status_display.u2[1]=cnt/l; + disk_status_display.u2[0]=l/dv; + ATAPIReadBlks2(bdev,buf,blk/dv,l/dv); + disk_status_display=0; + if (!Bt(&sys_flags,SYSf_NO_IO_SOUND)) + Sound(0); + FWBlks(f,buf,blk,l); + cnt-=l; + blk+=l; + } + FClose(f); + Free(buf); + Free(out_name2); +} + +class LTDuelBuf +{ + U1 *buf0,*buf1; + U8 in_buf,out_buf,cnt; + I1 *filename; + LTBlkDev *CD_bdev; +}; + + +void WriteCDImageTsk() +{ + LTDuelBuf *d=Fs->user_aux1; + U1 *buf; + U8 l,blk=0,cnt=d->cnt; + LTFile *f; + if (FileAttr(d->filename)<_ATTR_CONTIGUOUS) + f=FOpen(d->filename,"rc"); + else + f=FOpen(d->filename,"r"); + while (cnt) { + if (cnt>COPY_BUF_BLKS) + l=COPY_BUF_BLKS; + else + l=cnt; + if (l>d->CD_bdev->max_writes) + l=d->CD_bdev->max_writes; + buf=(d->in_buf & 1) ? d->buf1:d->buf0; + while (d->in_buf>d->out_buf+1) + SwapInNext; + FRBlks(f,buf,blk,l); + if (!Bt(&sys_flags,SYSf_NO_IO_SOUND)) + Sound(d->CD_bdev->write_freq); + d->in_buf++; + cnt-=l; + blk+=l; + } + FClose(f); +} + +void WriteCDImage(I1 drive,I1 *in_name) +{ + LTDuelBuf *d=MAllocZ(sizeof(LTDuelBuf)); + U1 *buf; + I1 *in_name3=DefaultExtension(in_name,"ISO"); + I1 *in_name2=AbsoluteFileName(in_name3); + U8 l,dv,blk=0,cnt; + LTPartition *p=DriveToPartition(drive); + LTBlkDev *bdev=p->bdev; + TssStruct *tss; + BoolU4 old_preempt; + LTFile *f=FOpen(in_name2,"r"); + + if (!f) { + Free(d); + return; + } + cnt=(FSize(f)+BLK_SIZE-1)/BLK_SIZE; + FClose(f); + if (bdev->type!=LTBDT_ATAPI) + throw(EXCEPT_BLKDEV,4); + bdev->flags|=LTBDF_READ_ONLY_OVERRIDE; + InitBlkDev(bdev,TRUE); + dv=bdev->blk_size/BLK_SIZE; + if (p->sizesize=cnt; + + d->filename=in_name2; + d->CD_bdev=bdev; + d->buf0=MAlloc(COPY_BUF_BLKS*BLK_SIZE); + d->buf1=MAlloc(COPY_BUF_BLKS*BLK_SIZE); + d->cnt=cnt; + + old_preempt=Preempt(OFF); + tss=Spawn(&WriteCDImageTsk,"WRITE CD"); + tss->user_aux1=d; + Preempt(old_preempt); + + while (d->in_buf<=d->out_buf) + SwapInNext; + if (!Bt(&sys_flags,SYSf_NO_IO_SOUND)) + Sound(bdev->write_freq); + IDEWaitForDrive(bdev); + ATAPIWaitReady(bdev); + while (cnt) { + if (cnt>COPY_BUF_BLKS) + l=COPY_BUF_BLKS; + else + l=cnt; + if (l>bdev->max_writes) + l=bdev->max_writes; + buf=(d->out_buf&1) ? d->buf1:d->buf0; + while (d->in_buf<=d->out_buf) + SwapInNext; + disk_status_display.u2[1]=cnt/l+0x8000; + disk_status_display.u2[0]=l/dv+0x8000; + ATAPIWriteBlks(bdev,buf,blk/dv,(l+dv-1)/dv); + disk_status_display=0; + d->out_buf++; + cnt-=l; + blk+=l; + } + ATAPISync(bdev); + ATAPIClose(bdev); + if (!Bt(&sys_flags,SYSf_NO_IO_SOUND)) + Sound(0); + bdev->flags&=~LTBDF_READ_ONLY_OVERRIDE; + Btr(&sys_irq_busy_flags,bdev->irq); + Free(d->buf0); + Free(d->buf1); + Free(d); + Free(in_name2); + Free(in_name3); +} + diff --git a/LT/OSMain/END.CPZ b/LT/OSMain/END.CPZ new file mode 100644 index 0000000..7d42557 --- /dev/null +++ b/LT/OSMain/END.CPZ @@ -0,0 +1,345 @@ +void InitSysGlbls() +{ + sys_timer=0; + jiffies=0; + rnd_SEED = 93186752; + sys_cur_focus_task=Fs; + num_spawned_users=0; + compiled_lines=0; + ext[EXT_IRQ00]=&SimpleTimerIrq; + + StrCpy(sys_temp_filename,"::/LT/DOC/TEMP.TXZ"); + + sys_macro_queue.next=&sys_macro_queue; + sys_macro_queue.last=&sys_macro_queue; + macro_util_tss=NULL; + ip_inhibit_win_operations=FALSE; + + LTDCBase=NULL; + LTDCHashTable=NULL; + + exe { + I1 *buf,*buf2; + LTDate ltdt; + + buf=PmtStr("Start-up Accnt(ENTER will prompt):",""); + buf2=PmtStr("Wordstat directory list(separated by ';'):",""); + ExePrintF("sys_startup_account=\"%s\";\r\n",buf); + ExePrintF("wordstat_mask=\"%s\";\r\n",buf2); + Free(buf); + Free(buf2); + ltdt=GetCurTimeLTDate; + ExePrintF("sys_compile_time=\"%D %T\";\r\n",ltdt.date,ltdt.time); + buf=PmtStr("Disk Cache Size (ENTER will use default of %s Bytes):","0x1000000"); + ExePrintF("LTDCInitCache(%s);",buf); + Free(buf); + } +} + + +void AddModuleHash(I1 *name,U8 base) +{ + SysHashEntry *temph,**temph1; + temph=MAllocZ(sizeof(SysHashEntry)); + temph->type=HTT_MODULE|HTT_PUBLIC; + temph->use_cnt=0; + temph->user0=base; + temph->source_link=NULL; + temph->string=NewString(name); + temph1=FindHashBucket(temph->string,Fs->hash_table); + temph->next=*temph1; + *temph1=temph; +} + +void AddOsMapSymbols() +{ + SysHashEntry *temph,**temph1; + I1 *sptr; + U1 *ptr; + U4 *dd; + U8 type; + I8 i,code; + + code=sys_boot_base; + AddModuleHash("/LT/OSMain/OS",code); + ptr=sys_boot_header_base; + while ((type=*ptr++)!=EIE_END) { //PASS 1 + dd=ptr; + ptr+=4; + i=*dd; + sptr=ptr; + ptr+=StrLen(sptr)+1; + if (type<=EIE_LIT_EXPORT) { + temph=MAllocZ(sizeof(SysHashEntry)); + temph->type=HTT_SYS_SYMBOL; + temph->use_cnt=0; + temph->user0=i+code; + temph->source_link=NULL; + temph->string=NewString(sptr); + temph1=FindHashBucket(temph->string,Fs->hash_table); + temph->next=*temph1; + *temph1=temph; + } else if (typefile_size)!=LT_XSUM) + throw(EXCEPT_ARC_XSUM); + + absname=AbsoluteFileName(fbuf); + Free(fbuf); + fbuf=NewString(absname); + fbuf2=NewString(absname); + RemoveLastSeg(fbuf,".",fbuf2); + if (fbuf[1]==':' && StrLen(fbuf)>2) + AddModuleHash(fbuf+2,code); + Free(fbuf); + Free(fbuf2); + + ptr=bfh+bfh->header_offset; + while ((etype=*ptr++)!=EIE_END) { //PASS 1 + dd=ptr; + ptr+=sizeof(U4); + i=*dd; + sptr=ptr; + ptr+=StrLen(sptr)+1; + if (etype<=EIE_LIT_EXPORT) { + temph=MAllocZ(sizeof(SysHashEntry)); + temph->string=NewString(sptr); + temph->type=HTT_SYS_SYMBOL; + temph->use_cnt=0; + l=StrLen(absname); + temph->source_link=MAlloc(l+4); + StrCpy(temph->source_link,"FI:"); + StrCat(temph->source_link,absname); + if (etype==EIE_LIT_EXPORT) + temph->user0=i; + else + temph->user0=i+code; + temph1=FindHashBucket(temph->string,Fs->hash_table); + temph->next=*temph1; + *temph1=temph; + } else if (etypetype & HTT_FUNCTION) { + tempc=saved_hash_ptr; + if (etype & 1) + i=tempc->executable_address; + else + i=tempc->executable_address-code; + } else if (saved_hash_ptr->type & HTT_GLBL_VAR) { + tempg=saved_hash_ptr; + if (etype & 1) + i=tempg->data_address; + else + i=tempg->data_address-code; + } else { + if (etype & 1) + i=saved_hash_ptr->user0; + else + i=saved_hash_ptr->user0-code; + } + if (etype<=EIE_LIT_U1) + *bb=i+*bb; + else if (etype<=EIE_LIT_U2) + *ww=i+*ww; + else if (etype<=EIE_LIT_U4) + *dd=i+*dd; + } + } else if (etype==EIE_ABSOLUTE_ADDRESS) { + if (no_abs) + ptr+=i*sizeof(U4); + else { + cnt=i; + for (j=0;jheader_offset; + while ((etype=*ptr++)!=EIE_END) { //PASS 2 + dd=ptr; + ptr+=sizeof(U4); + i=*dd; + sptr=ptr; + ptr+=StrLen(sptr)+1; + if (etype<=EIE_LIT_EXPORT) { + } else if (etype>8); +} + +void InitIrqs() +{ //Init 8259 + OutP(0x20,0x11); //IW1 + OutP(0xA0,0x11); //IW1 + PortNop; + OutP(0x21,0x20); //IW2 + OutP(0xA1,0x28); //IW2 + PortNop; + OutP(0x21,0x04); //IW3 + OutP(0xA1,0x02); //IW3 + PortNop; + OutP(0x21,0x0D); //IW4 + OutP(0xA1,0x09); //IW4 + PortNop; + OutP(0x21,0x20); //Mask + OutP(0xA1,0x2F); //Mask + PortNop; +} + +GrBitMap *GrBitMapNew(U8 type,U8 width,U8 height) +{ //This only allows widths which are divisible by 8 + GrBitMap *result; + result=MAllocZ(sizeof(GrBitMap)); + result->type=type; + result->width=width; + result->internal_width=(width+7)&-8; + result->height=height; + result->left_margin=0; + result->right_margin=width; + result->top_margin=0; + result->bottom_margin=height; + switch (type) { + case BMT_COLOR4: + result->plane_size=(result->internal_width*result->height)>>3; + result->body=MAllocZ(result->plane_size<<2); + break; + case BMT_MONO: + result->plane_size=(result->internal_width*result->height)>>3; + result->body=MAllocZ(result->plane_size); + break; + default: + throw(EXCEPT_GRAPHICS,1); + } + result->pen_width=1; + result->r=MAllocZ(9<<3); + result->r[0].u4[1]=1; + result->r[4].u4[1]=1; + result->r[8].u4[1]=1; + return result; +} + +void InitGraphics(I8 mode) +{ + dc_col=0; +//TODO reinit VGA without BIOS + grmode=mode; + grfont=SYS_FONT_8x8; + switch (grmode) { + case 1: + grwidth=640; + grheight=480; + break; + case 2: + grwidth=800; + grheight=600; + break; + } +//TODO free old allocated stuff + grbase=GrBitMapNew(BMT_COLOR4,grwidth,grheight); + grbase->flags|=BMF_SCREEN_BITMAP; + grbase2=GrBitMapNew(BMT_COLOR4,grwidth+64,grheight+64); + grbase2->left_margin=32; + grbase2->right_margin=grbase2->internal_width-32; + grbase2->top_margin=32; + grbase2->bottom_margin=grbase2->height-32; + grbase2->flags|=BMF_SCREEN_BITMAP; + vga_image=MAllocZ(grwidth*grheight>>1); + textbase=MAlloc(grwidth/FONT_WIDTH*(grheight/FONT_HEIGHT)<<2); + GrClear2(grbase); + ClearWindowText; + + OutP(VGA_SC_INDEX,VGA_MAP_MASK); + OutP(VGA_SC_DATA,0x0F); + MemSet(0xA0000,0,grheight*grwidth>>3); +} + +asm {CP_OS_MAIN:} +void OsMain() +{ + void my_AdamStartUpFile(); + adam_tss=Fs; + + InitTimer; + InitIrqs; + ext=MAllocZ(EXT_TABLE_SIZE<<2); + InitGraphics(grmode); + + $FG,5$//$BK,1$WARNING$BK,0$ do not do cout before here (null ext[]) + //DbgNum(), DbgStr() are okay, however.$FG$ + + coutln "InitSysTask"; + InitSysTask; + coutln "AddOsMapSymbols"; + AddOsMapSymbols; + coutln "InitSysGlbls"; + InitSysGlbls; + coutln "LoadSysStrings"; + LoadSysStrings; + coutln "ENABLE IRQ's"; + SetFlags(SYS_DEFAULT_FLAGS); + InitKeyboard; + coutln "InitAllBlkDevs"; + InitAllBlkDevs; + coutln "Select Default Drive"; + SelectDefaultDrive; + cout "Loading Compiler..."; + + Cd("/LT/COMPILE"); + Load("CMP"); + coutln "Done"; + my_AdamStartUpFile=FindExtern("AdamStartUpFile"); + my_AdamStartUpFile(); + ContinueServantTask; //Never to return +} + +asm { ALIGN 16,0x90 +SYS_CS_SIZE::} diff --git a/LT/OSMain/FONT8x8.ASZ b/LT/OSMain/FONT8x8.ASZ new file mode 100644 index 0000000..e898eba --- /dev/null +++ b/LT/OSMain/FONT8x8.ASZ @@ -0,0 +1,259 @@ +//The following font came from FreeDOS + ALIGN 8,0x90 +SYS_FONT_8x8:: + DU1 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00; + DU1 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00; + DU1 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00; + DU1 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00; + DU1 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00; + DU1 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00; + DU1 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00; + DU1 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00; + DU1 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00; + DU1 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00; + DU1 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00; + DU1 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00; + DU1 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00; + DU1 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00; + DU1 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00; + DU1 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00; + DU1 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00; + DU1 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00; + DU1 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00; + DU1 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00; + DU1 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00; + DU1 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00; + DU1 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00; + DU1 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00; + DU1 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00; + DU1 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00; + DU1 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00; + DU1 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00; + DU1 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00; + DU1 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00; + DU1 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00; + DU1 0x00,0x00,0x00,0x00,0x00,0x00,0x10,0x00; // SHIFT_SPACE + DU1 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00; // SPACE + DU1 0x18,0x3c,0x3c,0x18,0x18,0x00,0x18,0x00; // ! + DU1 0x6C,0x6C,0x6C,0x00,0x00,0x00,0x00,0x00; // " + DU1 0x36,0x36,0x7F,0x36,0x7F,0x36,0x36,0x00; // # + DU1 0x0C,0x3F,0x68,0x3E,0x0B,0x7E,0x18,0x00; // $$ + DU1 0x60,0x66,0x0C,0x18,0x30,0x66,0x06,0x00; // % + DU1 0x38,0x6C,0x6C,0x38,0x6D,0x66,0x3B,0x00; // & + DU1 0x18,0x18,0x18,0x00,0x00,0x00,0x00,0x00; // ' + DU1 0x0C,0x18,0x30,0x30,0x30,0x18,0x0C,0x00; // ( + DU1 0x30,0x18,0x0C,0x0C,0x0C,0x18,0x30,0x00; // ) + DU1 0x00,0x18,0x7E,0x3C,0x7E,0x18,0x00,0x00; // * + DU1 0x00,0x18,0x18,0x7E,0x18,0x18,0x00,0x00; // + + DU1 0x00,0x00,0x00,0x00,0x00,0x18,0x18,0x30; // , + DU1 0x00,0x00,0x00,0x7E,0x00,0x00,0x00,0x00; // - + DU1 0x00,0x00,0x00,0x00,0x00,0x18,0x18,0x00; // . + DU1 0x00,0x06,0x0C,0x18,0x30,0x60,0x00,0x00; // / + DU1 0x3C,0x66,0x6E,0x7E,0x76,0x66,0x3C,0x00; // 0 + DU1 0x18,0x38,0x18,0x18,0x18,0x18,0x7E,0x00; // 1 + DU1 0x3C,0x66,0x06,0x0C,0x18,0x30,0x7E,0x00; // 2 + DU1 0x3C,0x66,0x06,0x1C,0x06,0x66,0x3C,0x00; // 3 + DU1 0x0C,0x1C,0x3C,0x6C,0x7E,0x0C,0x0C,0x00; // 4 + DU1 0x7E,0x60,0x7C,0x06,0x06,0x66,0x3C,0x00; // 5 + DU1 0x1C,0x30,0x60,0x7C,0x66,0x66,0x3C,0x00; // 6 + DU1 0x7E,0x06,0x0C,0x18,0x30,0x30,0x30,0x00; // 7 + DU1 0x3C,0x66,0x66,0x3C,0x66,0x66,0x3C,0x00; // 8 + DU1 0x3C,0x66,0x66,0x3E,0x06,0x0C,0x38,0x00; // 9 + DU1 0x00,0x00,0x18,0x18,0x00,0x18,0x18,0x00; // : + DU1 0x00,0x00,0x18,0x18,0x00,0x18,0x18,0x30; // ; + DU1 0x0C,0x18,0x30,0x60,0x30,0x18,0x0C,0x00; // < + DU1 0x00,0x00,0x7E,0x00,0x7E,0x00,0x00,0x00; // = + DU1 0x30,0x18,0x0C,0x06,0x0C,0x18,0x30,0x00; // > + DU1 0x3C,0x66,0x0C,0x18,0x18,0x00,0x18,0x00; // ? + DU1 0x3C,0x66,0x6E,0x6A,0x6E,0x60,0x3C,0x00; // @ + DU1 0x3C,0x66,0x66,0x7E,0x66,0x66,0x66,0x00; // A + DU1 0x7C,0x66,0x66,0x7C,0x66,0x66,0x7C,0x00; // B + DU1 0x3C,0x66,0x60,0x60,0x60,0x66,0x3C,0x00; // C + DU1 0x78,0x6C,0x66,0x66,0x66,0x6C,0x78,0x00; // D + DU1 0x7E,0x60,0x60,0x7C,0x60,0x60,0x7E,0x00; // E + DU1 0x7E,0x60,0x60,0x7C,0x60,0x60,0x60,0x00; // F + DU1 0x3C,0x66,0x60,0x6E,0x66,0x66,0x3C,0x00; // G + DU1 0x66,0x66,0x66,0x7E,0x66,0x66,0x66,0x00; // H + DU1 0x7E,0x18,0x18,0x18,0x18,0x18,0x7E,0x00; // I + DU1 0x3E,0x0C,0x0C,0x0C,0x0C,0x6C,0x38,0x00; // J + DU1 0x66,0x6C,0x78,0x70,0x78,0x6C,0x66,0x00; // K + DU1 0x60,0x60,0x60,0x60,0x60,0x60,0x7E,0x00; // L + DU1 0x63,0x77,0x7F,0x6B,0x6B,0x63,0x63,0x00; // M + DU1 0x66,0x66,0x76,0x7E,0x6E,0x66,0x66,0x00; // N + DU1 0x3C,0x66,0x66,0x66,0x66,0x66,0x3C,0x00; // O + DU1 0x7C,0x66,0x66,0x7C,0x60,0x60,0x60,0x00; // P + DU1 0x3C,0x66,0x66,0x66,0x6A,0x6C,0x36,0x00; // Q + DU1 0x7C,0x66,0x66,0x7C,0x6C,0x66,0x66,0x00; // R + DU1 0x3C,0x66,0x60,0x3C,0x06,0x66,0x3C,0x00; // S + DU1 0x7E,0x18,0x18,0x18,0x18,0x18,0x18,0x00; // T + DU1 0x66,0x66,0x66,0x66,0x66,0x66,0x3C,0x00; // U + DU1 0x66,0x66,0x66,0x66,0x66,0x3C,0x18,0x00; // V + DU1 0x63,0x63,0x6B,0x6B,0x7F,0x77,0x63,0x00; // W + DU1 0x66,0x66,0x3C,0x18,0x3C,0x66,0x66,0x00; // X + DU1 0x66,0x66,0x66,0x3C,0x18,0x18,0x18,0x00; // Y + DU1 0x7E,0x06,0x0C,0x18,0x30,0x60,0x7E,0x00; // Z + DU1 0x7C,0x60,0x60,0x60,0x60,0x60,0x7C,0x00; // [ + DU1 0x00,0x60,0x30,0x18,0x0C,0x06,0x00,0x00; // \ + DU1 0x3E,0x06,0x06,0x06,0x06,0x06,0x3E,0x00; // ] + DU1 0x3C,0x66,0x00,0x00,0x00,0x00,0x00,0x00; // ^ + DU1 0x00,0x00,0x00,0x00,0x00,0x00,0xFF,0xFF; // _ + DU1 0x30,0x18,0x00,0x00,0x00,0x00,0x00,0x00; // ? + DU1 0x00,0x00,0x3C,0x06,0x3E,0x66,0x3E,0x00; // a + DU1 0x60,0x60,0x7C,0x66,0x66,0x66,0x7C,0x00; // b + DU1 0x00,0x00,0x3C,0x66,0x60,0x66,0x3C,0x00; // c + DU1 0x06,0x06,0x3E,0x66,0x66,0x66,0x3E,0x00; // D + DU1 0x00,0x00,0x3C,0x66,0x7E,0x60,0x3C,0x00; // e + DU1 0x1C,0x30,0x30,0x7C,0x30,0x30,0x30,0x00; // f + DU1 0x00,0x00,0x3E,0x66,0x66,0x3E,0x06,0x3C; // g + DU1 0x60,0x60,0x7C,0x66,0x66,0x66,0x66,0x00; // h + DU1 0x18,0x00,0x38,0x18,0x18,0x18,0x3C,0x00; // i + DU1 0x18,0x00,0x38,0x18,0x18,0x18,0x18,0x70; // j + DU1 0x60,0x60,0x66,0x6C,0x78,0x6C,0x66,0x00; // k + DU1 0x38,0x18,0x18,0x18,0x18,0x18,0x3C,0x00; // l + DU1 0x00,0x00,0x36,0x7F,0x6B,0x6B,0x63,0x00; // m + DU1 0x00,0x00,0x7C,0x66,0x66,0x66,0x66,0x00; // n + DU1 0x00,0x00,0x3C,0x66,0x66,0x66,0x3C,0x00; // o + DU1 0x00,0x00,0x7C,0x66,0x66,0x7C,0x60,0x60; // p + DU1 0x00,0x00,0x3E,0x66,0x66,0x3E,0x06,0x07; // q + DU1 0x00,0x00,0x6C,0x76,0x60,0x60,0x60,0x00; // r + DU1 0x00,0x00,0x3E,0x60,0x3C,0x06,0x7C,0x00; // s + DU1 0x30,0x30,0x7C,0x30,0x30,0x30,0x1C,0x00; // t + DU1 0x00,0x00,0x66,0x66,0x66,0x66,0x3E,0x00; // u + DU1 0x00,0x00,0x66,0x66,0x66,0x3C,0x18,0x00; // v + DU1 0x00,0x00,0x63,0x6B,0x6B,0x7F,0x36,0x00; // w + DU1 0x00,0x00,0x66,0x3C,0x18,0x3C,0x66,0x00; // x + DU1 0x00,0x00,0x66,0x66,0x66,0x3E,0x06,0x3C; // y + DU1 0x00,0x00,0x7E,0x0C,0x18,0x30,0x7E,0x00; // z + DU1 0x0C,0x18,0x18,0x70,0x18,0x18,0x0C,0x00; // { + DU1 0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x00; // | + DU1 0x30,0x18,0x18,0x0E,0x18,0x18,0x30,0x00; // } + DU1 0x31,0x6B,0x46,0x00,0x00,0x00,0x00,0x00; // ~ + DU1 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF; //  + DU1 0x24,0x24,0x24,0x24,0x24,0x24,0x24,0x24; //128 + DU1 0x3C,0x3C,0x3C,0x3C,0x3C,0x3C,0x3C,0x3C; //129 + DU1 0x00,0x00,0xFF,0x00,0x00,0xFF,0x00,0x00; //130 + DU1 0x00,0x00,0xFF,0xFF,0xFF,0xFF,0x00,0x00; //131 + DU1 0x00,0x00,0x3F,0x20,0x20,0x27,0x24,0x24; //132 + DU1 0x00,0x00,0x3F,0x3F,0x3F,0x3F,0x3C,0x3C; //133 + DU1 0x00,0x00,0xFC,0x04,0x04,0xE4,0x24,0x24; //134 + DU1 0x00,0x00,0xFC,0xFC,0xFC,0xFC,0x3C,0x3C; //135 + DU1 0x24,0x24,0x27,0x20,0x20,0x3F,0x00,0x00; //136 + DU1 0x3C,0x3C,0x3F,0x3F,0x3F,0x3F,0x00,0x00; //137 + DU1 0x24,0x24,0xE4,0x04,0x04,0xFC,0x00,0x00; //138 + DU1 0x3C,0x3C,0xFC,0xFC,0xFC,0xFC,0x00,0x00; //139 + DU1 0x00,0x7E,0x7E,0x66,0x66,0x7E,0x7E,0x00; //140 + DU1 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00; + DU1 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00; + DU1 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00; + DU1 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00; + DU1 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00; + DU1 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00; + DU1 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00; + DU1 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00; + DU1 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00; + DU1 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00; + DU1 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00; + DU1 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00; + DU1 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00; + DU1 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00; + DU1 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00; + DU1 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00; + DU1 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00; + DU1 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00; + DU1 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00; + DU1 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00; + DU1 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00; + DU1 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00; + DU1 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00; + DU1 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00; + DU1 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00; + DU1 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00; + DU1 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00; + DU1 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00; + DU1 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00; + DU1 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00; + DU1 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00; + DU1 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00; + DU1 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00; + DU1 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00; + DU1 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00; + DU1 0x22,0x88,0x22,0x88,0x22,0x88,0x22,0x88; + DU1 0x55,0xaa,0x55,0xaa,0x55,0xaa,0x55,0xaa; + DU1 0xdd,0x77,0xdd,0x77,0xdd,0x77,0xdd,0x77; + DU1 0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18; + DU1 0x18,0x18,0x18,0xf8,0x18,0x18,0x18,0x18; + DU1 0x18,0x18,0xf8,0x18,0xf8,0x18,0x18,0x18; + DU1 0x66,0x66,0x66,0xe6,0x66,0x66,0x66,0x66; + DU1 0x00,0x00,0x00,0xfe,0x66,0x66,0x66,0x66; + DU1 0x00,0x00,0xf8,0x18,0xf8,0x18,0x18,0x18; + DU1 0x66,0x66,0xe6,0x06,0xe6,0x66,0x66,0x66; + DU1 0x66,0x66,0x66,0x66,0x66,0x66,0x66,0x66; + DU1 0x00,0x00,0xfe,0x06,0xe6,0x66,0x66,0x66; + DU1 0x66,0x66,0xe6,0x06,0xfe,0x00,0x00,0x00; + DU1 0x66,0x66,0x66,0xfe,0x00,0x00,0x00,0x00; + DU1 0x18,0x18,0xf8,0x18,0xf8,0x00,0x00,0x00; + DU1 0x00,0x00,0x00,0xf8,0x18,0x18,0x18,0x18; + DU1 0x18,0x18,0x18,0x1f,0x00,0x00,0x00,0x00; + DU1 0x18,0x18,0x18,0xff,0x00,0x00,0x00,0x00; + DU1 0x00,0x00,0x00,0xff,0x18,0x18,0x18,0x18; + DU1 0x18,0x18,0x18,0x1f,0x18,0x18,0x18,0x18; + DU1 0x00,0x00,0x00,0xff,0x00,0x00,0x00,0x00; + DU1 0x18,0x18,0x18,0xff,0x18,0x18,0x18,0x18; + DU1 0x18,0x18,0x1f,0x18,0x1f,0x18,0x18,0x18; + DU1 0x66,0x66,0x66,0x67,0x66,0x66,0x66,0x66; + DU1 0x66,0x66,0x67,0x60,0x7f,0x00,0x00,0x00; + DU1 0x00,0x00,0x7f,0x60,0x67,0x66,0x66,0x66; + DU1 0x66,0x66,0xe7,0x00,0xff,0x00,0x00,0x00; + DU1 0x00,0x00,0xff,0x00,0xe7,0x66,0x66,0x66; + DU1 0x66,0x66,0x67,0x60,0x67,0x66,0x66,0x66; + DU1 0x00,0x00,0xff,0x00,0xff,0x00,0x00,0x00; + DU1 0x66,0x66,0xe7,0x00,0xe7,0x66,0x66,0x66; + DU1 0x18,0x18,0xff,0x00,0xff,0x00,0x00,0x00; + DU1 0x66,0x66,0x66,0xff,0x00,0x00,0x00,0x00; + DU1 0x00,0x00,0xff,0x00,0xff,0x18,0x18,0x18; + DU1 0x00,0x00,0x00,0xff,0x66,0x66,0x66,0x66; + DU1 0x66,0x66,0x66,0x7f,0x00,0x00,0x00,0x00; + DU1 0x18,0x18,0x1f,0x18,0x1f,0x00,0x00,0x00; + DU1 0x00,0x00,0x1f,0x18,0x1f,0x18,0x18,0x18; + DU1 0x00,0x00,0x00,0x7f,0x66,0x66,0x66,0x66; + DU1 0x66,0x66,0x66,0xff,0x66,0x66,0x66,0x66; + DU1 0x18,0x18,0xff,0x18,0xff,0x18,0x18,0x18; + DU1 0x18,0x18,0x18,0xf8,0x00,0x00,0x00,0x00; + DU1 0x00,0x00,0x00,0x1f,0x18,0x18,0x18,0x18; + DU1 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff; + DU1 0x00,0x00,0x00,0x00,0xff,0xff,0xff,0xff; + DU1 0xf0,0xf0,0xf0,0xf0,0xf0,0xf0,0xf0,0xf0; + DU1 0x0f,0x0f,0x0f,0x0f,0x0f,0x0f,0x0f,0x0f; + DU1 0xff,0xff,0xff,0xff,0x00,0x00,0x00,0x00; + DU1 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00; + DU1 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00; + DU1 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00; + DU1 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00; + DU1 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00; + DU1 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00; + DU1 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00; + DU1 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00; + DU1 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00; + DU1 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00; + DU1 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00; + DU1 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00; + DU1 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00; + DU1 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00; + DU1 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00; + DU1 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00; + DU1 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00; + DU1 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00; + DU1 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00; + DU1 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00; + DU1 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00; + DU1 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00; + DU1 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00; + DU1 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00; + DU1 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00; + DU1 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00; + DU1 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00; + DU1 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00; + DU1 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00; + DU1 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00; + DU1 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00; + DU1 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00; diff --git a/LT/OSMain/IRQHAND.ASZ b/LT/OSMain/IRQHAND.ASZ new file mode 100644 index 0000000..5094e27 --- /dev/null +++ b/LT/OSMain/IRQHAND.ASZ @@ -0,0 +1,887 @@ + ALIGN 8,0x90 +IRQ_VECTORS:: + DU4 IRQ00,IRQ01,IRQ02,IRQ03; + DU4 IRQ04,IRQ05,IRQ06,IRQ07; + DU4 IRQ08,IRQ09,IRQ0A,IRQ0B; + DU4 IRQ0C,IRQ0D,IRQ0E,IRQ0F; + DU4 IRQ10,IRQ11,IRQ12,IRQ13; + DU4 IRQ14,IRQ15,IRQ16,IRQ17; + DU4 IRQ18,IRQ19,IRQ1A,IRQ1B; + DU4 IRQ1C,IRQ1D,IRQ1E,IRQ1F; + DU4 IRQ20,IRQ21,IRQ22,IRQ23; + DU4 IRQ24,IRQ25,IRQ26,IRQ27; + DU4 IRQ28,IRQ29,IRQ2A,IRQ2B; + DU4 IRQ2C,IRQ2D,IRQ2E,IRQ2F; + DU4 IRQ30,IRQ31,IRQ32,IRQ33; + DU4 IRQ34,IRQ35,IRQ36,IRQ37; + DU4 IRQ38,IRQ39,IRQ3A,IRQ3B; + DU4 IRQ3C,IRQ3D,IRQ3E,IRQ3F; + DU4 IRQ40,IRQ41,IRQ42,IRQ43; + DU4 IRQ44,IRQ45,IRQ46,IRQ47; + DU4 IRQ48,IRQ49,IRQ4A,IRQ4B; + DU4 IRQ4C,IRQ4D,IRQ4E,IRQ4F; + DU4 IRQ50,IRQ51,IRQ52,IRQ53; + DU4 IRQ54,IRQ55,IRQ56,IRQ57; + DU4 IRQ58,IRQ59,IRQ5A,IRQ5B; + DU4 IRQ5C,IRQ5D,IRQ5E,IRQ5F; + +////***************** INTERRUPT ROUTINES *************** + + ALIGN 8,0x90 +IRQ00: PUSHAD + MOV EDX,0 + JMP U4 IRQFAULT + + ALIGN 8,0x90 +IRQ01: PUSHAD + MOV EDX,1 + JMP U4 IRQFAULT + + ALIGN 8,0x90 +IRQ02: PUSHAD + MOV EDX,2 + JMP U4 IRQFAULT + + ALIGN 8,0x90 +IRQ03: PUSHAD + MOV EDX,3 + JMP U4 IRQFAULT + + ALIGN 8,0x90 +IRQ04: PUSHAD + MOV EDX,4 + JMP U4 IRQFAULT + + ALIGN 8,0x90 +IRQ05: PUSHAD + MOV EDX,5 + JMP U4 IRQFAULT + + ALIGN 8,0x90 +IRQ06: PUSHAD + MOV EDX,6 + JMP U4 IRQFAULT + + ALIGN 8,0x90 +IRQ07: PUSHAD + MOV EDX,7 + JMP U4 IRQFAULT + + ALIGN 8,0x90 +IRQ08: PUSHAD + MOV EDX,8 + JMP U4 IRQFAULT + + ALIGN 8,0x90 +IRQ09: PUSHAD + MOV EDX,9 + JMP U4 IRQFAULT + + ALIGN 8,0x90 +IRQ0A: PUSHAD + MOV EDX,0x0A + JMP U4 IRQFAULT + + ALIGN 8,0x90 +IRQ0B: PUSHAD + MOV EDX,0x0B + JMP U4 IRQFAULT + + ALIGN 8,0x90 +IRQ0C: PUSHAD + MOV EDX,0x0C + JMP U4 IRQFAULT + + ALIGN 8,0x90 +IRQ0D: PUSHAD + MOV EDX,0x0D + JMP U4 IRQFAULT + + ALIGN 8,0x90 +IRQ0E: PUSHAD + MOV EDX,0x0E + JMP U4 IRQFAULT + + ALIGN 8,0x90 +IRQ0F: PUSHAD + MOV EDX,0x0F + JMP U4 IRQFAULT + + ALIGN 8,0x90 +IRQ10: PUSHAD + MOV EDX,0x10 + JMP U4 IRQFAULT + + ALIGN 8,0x90 +IRQ11: PUSHAD + MOV EDX,0x11 + JMP U4 IRQFAULT + + ALIGN 8,0x90 +IRQ12: PUSHAD + MOV EDX,0x12 + JMP U4 IRQFAULT + + ALIGN 8,0x90 +IRQ13: PUSHAD + MOV EDX,0x13 + JMP U4 IRQFAULT + + ALIGN 8,0x90 +IRQ14: PUSHAD + MOV EDX,0x14 + JMP U4 IRQFAULT + + ALIGN 8,0x90 +IRQ15: PUSHAD + MOV EDX,0x15 + JMP U4 IRQFAULT + + ALIGN 8,0x90 +IRQ16: PUSHAD + MOV EDX,0x16 + JMP U4 IRQFAULT + + ALIGN 8,0x90 +IRQ17: PUSHAD + MOV EDX,0x17 + JMP U4 IRQFAULT + + ALIGN 8,0x90 +IRQ18: PUSHAD + MOV EDX,0x18 + JMP U4 IRQFAULT + + ALIGN 8,0x90 +IRQ19: PUSHAD + MOV EDX,0x19 + JMP U4 IRQFAULT + + ALIGN 8,0x90 +IRQ1A: PUSHAD + MOV EDX,0x1A + JMP U4 IRQFAULT + + ALIGN 8,0x90 +IRQ1B: PUSHAD + MOV EDX,0x1B + JMP U4 IRQFAULT + + ALIGN 8,0x90 +IRQ1C: PUSHAD + MOV EDX,0x1C + JMP U4 IRQFAULT + + ALIGN 8,0x90 +IRQ1D: PUSHAD + MOV EDX,0x1D + JMP U4 IRQFAULT + + ALIGN 8,0x90 +IRQ1E: PUSHAD + MOV EDX,0x1E + JMP U4 IRQFAULT + + ALIGN 8,0x90 +IRQ1F: PUSHAD + MOV EDX,0x1F + JMP U4 IRQFAULT + + ALIGN 8,0x90 +IRQ20: STI + CLD + PUSHAD + MOV EAX,U4 [SYS_EXTERN_TABLE] + MOV EAX,U4 EXT_IRQ00*4[EAX] + OR EAX,EAX + JZ @@2 + MOV EBP,ESP + PUSH 0 + PUSH U4 SP_EIP[EBP] + CALL EAX + ADD ESP,8 +@@2: MOV AL,0x20 //ACKNOWLEDGE INTERRUPT + OUT 0x20,AL + POPAD + BT U4 [SYS_FLAGS],SYSf_PREEMPTIVE + JC IRQ_SWAP_IN_NEXT + IRET + +IRQ_SWAP_IN_NEXT: + CLI + CALL SAVE_CONTEXT //PREEMPTIVE + + MOV EBP,ESP + MOV EAX,[EBP] + MOV U4 FS:[TSS_EIP],EAX + MOV EAX,8[EBP] + MOV U4 FS:[TSS_EFLAGS],EAX + ADD EBP,12 + MOV U4 FS:[TSS_ESP],EBP + + MOV ESI,U4 FS:[TSS_NEXT_TSS] + MOV AX,U2 TSS_FS[ESI] + MOV FS,AX + JMP U4 SWAP_IN_NEXT_PART2 + + ALIGN 8,0x90 +IRQ21:: CLD + PUSHAD + CALL U4 CP_KBD_HANDLER+4 + MOV AL,0x20 //ACKNOWLEDGE INTERRUPT + OUT 0x20,AL + POPAD + IRET + + ALIGN 8,0x90 +IRQ22: PUSHAD + MOV EDX,0x22 + JMP U4 IRQFAULT + + + ALIGN 8,0x90 +IRQ23: CLD + PUSHAD + MOV EAX,U4 [SYS_EXTERN_TABLE] + MOV EAX,U4 EXT_IRQ03*4[EAX] + OR EAX,EAX + JZ @@231 + CALL EAX +@@231: MOV AL,0x20 //ACKNOWLEDGE INTERRUPT + OUT 0x20,AL + POPAD + IRET + + ALIGN 8,0x90 +IRQ24: CLD + PUSHAD + MOV EAX,U4 [SYS_EXTERN_TABLE] + MOV EAX,U4 EXT_IRQ04*4[EAX] + OR EAX,EAX + JZ @@241 + CALL EAX +@@241: MOV AL,0x20 //ACKNOWLEDGE INTERRUPT + OUT 0x20,AL + POPAD + IRET + + ALIGN 8,0x90 +IRQ25: PUSHAD + MOV EDX,0x25 + JMP U4 IRQFAULT + + ALIGN 8,0x90 +IRQ26: CLD + PUSHAD + MOV EAX,U4 [SYS_EXTERN_TABLE] + MOV EAX,U4 EXT_IRQ06*4[EAX] + OR EAX,EAX + JZ @@261 + CALL EAX +@@261: MOV AL,0x20 //ACKNOWLEDGE INTERRUPT + OUT 0x20,AL + POPAD + IRET + + ALIGN 8,0x90 +IRQ27: CLD + PUSHAD + MOV EAX,U4 [SYS_EXTERN_TABLE] + MOV EAX,U4 EXT_IRQ07*4[EAX] + OR EAX,EAX + JZ @@271 + CALL EAX +@@271: MOV AL,0x20 //ACKNOWLEDGE INTERRUPT + OUT 0x20,AL + POPAD + IRET + + ALIGN 8,0x90 +IRQ28: PUSHAD + MOV EDX,0x28 + JMP U4 IRQFAULT + + ALIGN 8,0x90 +IRQ29: PUSHAD + MOV EDX,0x29 + JMP U4 IRQFAULT + + ALIGN 8,0x90 +IRQ2A: PUSHAD + MOV EDX,0x2A + JMP U4 IRQFAULT + + + ALIGN 8,0x90 +IRQ2B: PUSHAD + MOV EDX,0x2B + JMP U4 IRQFAULT + + ALIGN 8,0x90 +IRQ2C: CLD + PUSHAD + MOV EAX,U4 [SYS_EXTERN_TABLE] + MOV EAX,U4 EXT_IRQ0C*4[EAX] + OR EAX,EAX + JZ @@2C1 + CALL EAX +@@2C1: MOV AL,0x20 + OUT 0xA0,AL + MOV AL,0x20 + OUT 0x20,AL + POPAD + IRET + + ALIGN 8,0x90 +IRQ2D: PUSHAD + MOV EDX,0x2D + JMP U4 IRQFAULT + + + ALIGN 8,0x90 +IRQ2E: CLD + PUSHAD + MOV EAX,U4 [SYS_EXTERN_TABLE] + MOV EAX,U4 EXT_IRQ0E*4[EAX] + OR EAX,EAX + JZ @@2E1 + CALL EAX +@@2E1: MOV AL,0x20 + OUT 0xA0,AL + MOV AL,0x20 + OUT 0x20,AL + POPAD + IRET + + ALIGN 8,0x90 +IRQ2F: CLD + PUSHAD + MOV EAX,U4 [SYS_EXTERN_TABLE] + MOV EAX,U4 EXT_IRQ0F*4[EAX] + OR EAX,EAX + JZ @@2F1 + CALL EAX +@@2F1: MOV AL,0x20 + OUT 0xA0,AL + MOV AL,0x20 + OUT 0x20,AL + POPAD + IRET + +//************************************ SOFTWARE INT'S ****************************** +TEST_AND_ENABLE_IRQS: + PUSH EBP + MOV EBP,ESP +//16[ebp]=flags +//12[ebp]=cs +// 8[ebp]=iret +// 4[ebp]=ret +// 0[ebp]=ebp + BT U4 16[EBP],9 + JNC @@TEI1 + STI +@@TEI1: POP EBP + RET + + + ALIGN 8,0x90 +IRQ30: CALL TEST_AND_ENABLE_IRQS + PUSHAD + PUSH 0 + PUSH ESI + CALL CP_PUT_SYSTEXT+4 + ADD ESP,8 + POPAD + IRET + + ALIGN 8,0x90 +IRQ31: CALL TEST_AND_ENABLE_IRQS + PUSHAD + CALL PUT_I1 + POPAD + IRET + + ALIGN 8,0x90 +IRQ32: CALL TEST_AND_ENABLE_IRQS + PUSHAD + MOV ESI,MSG_GETCHAR + CALL FIND_EXTERN + JNZ @@3210 + CALL GET_KEY + INT I_PUT_I1 + XOR EDX,EDX + JMP @@3220 +@@3210: PUSH 0 + PUSH 0 + CALL ESI + ADD ESP,8 +@@3220: MOV EBP,ESP + MOV U4 SP_EAX[EBP],EAX + MOV U4 SP_EDX[EBP],EDX + POPAD + IRET + + +COUT_JOIN:: + OR EBX,EBX + JZ U4 @@100 +@@20: MOV EDX,U4 [EBP] + MOV EAX,U4 8[EBP] + PUSHAD + + CMP EDX,IT_NUM_IT+IT_I1 + JNE @@25 + PUSH ESI + MOV ESI,EAX + CALL PUT_STRING + POP ESI + JMP @@29 +@@25: CMP EDX,IT_U8 + JE @@26 + CMP EDX,IT_I8 + JNE @@24 +@@26: MOV EAX,U4 12[EBP] + CALL PUT_HEX + MOV EAX,U4 8[EBP] + CALL PUT_HEX + JMP @@29 +@@24: CMP EDX,IT_U4 + JE @@21 + CMP EDX,IT_I4 + JNE @@21A +@@21: CALL PUT_HEX + JMP @@29 +@@21A: CMP EDX,IT_U2 + JE @@22 + CMP EDX,IT_I2 + JNE @@22A +@@22: CALL PUT_HEX_U2 + JMP @@29 +@@22A: CMP EDX,IT_U1 + JNE @@23 + CALL PUT_HEX_U1 + JMP @@29 +@@23: CMP EDX,IT_DOUBLE + JNE @@30 + PUSH U4 12[EBP] + PUSH U4 8[EBP] + CALL CP_PUT_FLOAT+4 + ADD ESP,8 + JMP @@29 +@@30: CMP EDX,IT_I1 + JNE @@21 + CALL PUT_I1 + +@@29: POPAD + SUB EBP,16 + DEC EBX + JNZ U4 @@20 +@@100: RET + + ALIGN 8,0x90 +IRQ33:: CALL TEST_AND_ENABLE_IRQS //COUT + PUSH EBP + MOV EBP,ESP + MOV EBX,EAX //GET PARAM CNT + ADD EBX,EBX + LEA EBP,16-16[EBP+EBX*8] + MOV EBX,EAX //GET PARAM CNT + CALL COUT_JOIN + POP EBP + IRET + + ALIGN 8,0x90 +IRQ34: CALL TEST_AND_ENABLE_IRQS + PUSHAD + SUB ESP,16 //Space for param1 & param2 + PUSH EDX //mask + PUSH EAX //mask + MOV EAX,ESP + ADD EAX,16 + PUSH 0 + PUSH 0 + PUSH 0 //¶m2 + PUSH EAX //¶m2 + SUB EAX,8 + PUSH 0 //¶m1 + PUSH EAX //¶m1 + MOV ESI,MSG_PEEK_MSG + CALL FIND_EXTERN + CALL ESI + ADD ESP,32 + POP EBX //param1 + ADD ESP,4 + POP EDX //param2 + ADD ESP,4 + MOV EBP,ESP + MOV U4 SP_EAX[EBP],EAX + MOV U4 SP_EBX[EBP],EBX + MOV U4 SP_EDX[EBP],EDX + POPAD + IRET + + ALIGN 8,0x90 +IRQ35: CALL TEST_AND_ENABLE_IRQS + PUSHAD + SUB ESP,16 //Space for param1 & param2 + PUSH EDX //mask + PUSH EAX //mask + MOV EAX,ESP + ADD EAX,16 + PUSH 0 + PUSH 0 + PUSH 0 //¶m2 + PUSH EAX //¶m2 + SUB EAX,8 + PUSH 0 //¶m1 + PUSH EAX //¶m1 + MOV ESI,MSG_GET_MSG_NO_WAIT + CALL FIND_EXTERN + CALL ESI + ADD ESP,32 + POP EBX //param1 + ADD ESP,4 + POP EDX //param2 + MOV EBP,ESP + ADD ESP,4 + MOV U4 SP_EAX[EBP],EAX + MOV U4 SP_EBX[EBP],EBX + MOV U4 SP_EDX[EBP],EDX + POPAD + IRET + + ALIGN 8,0x90 +IRQ36:: CALL TEST_AND_ENABLE_IRQS + PUSHAD + MOV ESI,MSG_FLUSH_MSGS + CALL FIND_EXTERN + XOR EAX,EAX + OR ESI,ESI + JZ @@1 + CALL ESI +@@1: MOV EBP,ESP + MOV U4 SP_EDX[EBP],EDX + MOV U4 SP_EAX[EBP],EAX + POPAD + IRET + +CP_FLUSH_MSGS:: + INT I_FLUSH_MSGS + RET + + ALIGN 8,0x90 +IRQ37: CALL TEST_AND_ENABLE_IRQS + PUSHAD + SUB ESP,16 //Space for param1 & param2 + PUSH EDX //mask + PUSH EAX //mask + MOV EAX,ESP + ADD EAX,16 + PUSH 0 + PUSH 0 + PUSH 0 //¶m2 + PUSH EAX //¶m2 + SUB EAX,8 + PUSH 0 //¶m1 + PUSH EAX //¶m1 + MOV ESI,MSG_GET_MSG + CALL FIND_EXTERN + CALL ESI + ADD ESP,32 + POP EBX //param1 + ADD ESP,4 + POP EDX //param2 + ADD ESP,4 + MOV EBP,ESP + MOV U4 SP_EAX[EBP],EAX + MOV U4 SP_EBX[EBP],EBX + MOV U4 SP_EDX[EBP],EDX + POPAD + IRET + + ALIGN 8,0x90 +IRQ38:: CALL TEST_AND_ENABLE_IRQS + CALL PUT_STRING + IRET + + ALIGN 8,0x90 +IRQ39:: CALL TEST_AND_ENABLE_IRQS + PUSH EBP + MOV EBP,ESP + MOV EBX,EAX //GET PARAM CNT + ADD EBX,EBX + LEA EBP,16-16[EBP+EBX*8] + MOV EBX,EAX //GET PARAM CNT + CALL COUT_JOIN + CALL CRLF + POP EBP + IRET + + ALIGN 8,0x90 //I_DEBUG +IRQ3A:: CLI + CLD + PUSHAD + CALL SAVE_CONTEXT + MOV EAX,U4 [SYS_EXTERN_TABLE] + MOV EAX,U4 EXT_DEBUG*4[EAX] + OR EAX,EAX + JZ @@3A1 + CALL EAX +@@3A1: POPAD + IRET + + ALIGN 8,0x90 +IRQ3B: PUSHAD + MOV EDX,0x3B + JMP U4 IRQFAULT + + ALIGN 8,0x90 +IRQ3C: PUSHAD + MOV EDX,0x3C + JMP U4 IRQFAULT + + ALIGN 8,0x90 +IRQ3D: PUSHAD + MOV EDX,0x3D + JMP U4 IRQFAULT + + ALIGN 8,0x90 +IRQ3E: PUSHAD + MOV EDX,0x3E + JMP U4 IRQFAULT + + ALIGN 8,0x90 +IRQ3F: PUSHAD + MOV EDX,0x3F + JMP U4 IRQFAULT + + ALIGN 8,0x90 +IRQ40: PUSHAD + MOV EDX,0x40 + JMP U4 IRQFAULT + + ALIGN 8,0x90 +IRQ41: PUSHAD + MOV EDX,0x41 + JMP U4 IRQFAULT + + ALIGN 8,0x90 +IRQ42: PUSHAD + MOV EDX,0x42 + JMP U4 IRQFAULT + + ALIGN 8,0x90 +IRQ43: PUSHAD + MOV EDX,0x43 + JMP U4 IRQFAULT + + ALIGN 8,0x90 +IRQ44: PUSHAD + MOV EDX,0x44 + JMP U4 IRQFAULT + + ALIGN 8,0x90 +IRQ45: PUSHAD + MOV EDX,0x45 + JMP U4 IRQFAULT + + ALIGN 8,0x90 +IRQ46: PUSHAD + MOV EDX,0x46 + JMP U4 IRQFAULT + + ALIGN 8,0x90 +IRQ47: PUSHAD + MOV EDX,0x47 + JMP U4 IRQFAULT + + ALIGN 8,0x90 +IRQ48: PUSHAD + MOV EDX,0x48 + JMP U4 IRQFAULT + + ALIGN 8,0x90 +IRQ49: PUSHAD + MOV EDX,0x49 + JMP U4 IRQFAULT + + ALIGN 8,0x90 +IRQ4A: PUSHAD + MOV EDX,0x4A + JMP U4 IRQFAULT + + ALIGN 8,0x90 +IRQ4B: PUSHAD + MOV EDX,0x4B + JMP U4 IRQFAULT + + ALIGN 8,0x90 +IRQ4C: PUSHAD + MOV EDX,0x4C + JMP U4 IRQFAULT + + ALIGN 8,0x90 +IRQ4D: PUSHAD + MOV EDX,0x4D + JMP U4 IRQFAULT + + ALIGN 8,0x90 +IRQ4E: PUSHAD + MOV EDX,0x4E + JMP U4 IRQFAULT + + ALIGN 8,0x90 +IRQ4F: PUSHAD + MOV EDX,0x4F + JMP U4 IRQFAULT + + ALIGN 8,0x90 +IRQ50: PUSHAD + MOV EDX,0x50 + JMP U4 IRQFAULT + + ALIGN 8,0x90 +IRQ51: PUSHAD + MOV EDX,0x51 + JMP U4 IRQFAULT + + ALIGN 8,0x90 +IRQ52: PUSHAD + MOV EDX,0x52 + JMP IRQFAULT + + ALIGN 8,0x90 +IRQ53: PUSHAD + MOV EDX,0x53 + JMP IRQFAULT + + ALIGN 8,0x90 +IRQ54: PUSHAD + MOV EDX,0x54 + JMP IRQFAULT + + ALIGN 8,0x90 +IRQ55: PUSHAD + MOV EDX,0x55 + JMP IRQFAULT + + ALIGN 8,0x90 +IRQ56: PUSHAD + MOV EDX,0x56 + JMP IRQFAULT + + ALIGN 8,0x90 +IRQ57: PUSHAD + MOV EDX,0x57 + JMP IRQFAULT + + ALIGN 8,0x90 +IRQ58: PUSHAD + MOV EDX,0x58 + JMP IRQFAULT + + ALIGN 8,0x90 +IRQ59: PUSHAD + MOV EDX,0x59 + JMP IRQFAULT + + ALIGN 8,0x90 +IRQ5A: PUSHAD + MOV EDX,0x5A + JMP IRQFAULT + + ALIGN 8,0x90 +IRQ5B: PUSHAD + MOV EDX,0x5B + JMP IRQFAULT + + ALIGN 8,0x90 +IRQ5C: PUSHAD + MOV EDX,0x5C + JMP IRQFAULT + + ALIGN 8,0x90 +IRQ5D: PUSHAD + MOV EDX,0x5D + JMP IRQFAULT + + ALIGN 8,0x90 +IRQ5E: PUSHAD + MOV EDX,0x5E + JMP IRQFAULT + + ALIGN 8,0x90 +IRQ5F: PUSHAD + MOV EDX,0x5F + JMP IRQFAULT + +FAULT_DESC: DU1 "FAULT TASK",0; + +CP_FAULT:: + PUSHAD + MOV EBP,ESP + MOV EDX,U4 SP_PARAM1[EBP] +IRQFAULT:: + CLD + PUSH EDX //Save IRQNUM + MOV U4 [SYS_CUR_FOCUS_TASK],0 + + MOV EAX,U4 FS:[TSS_DBG] + OR EAX,EAX + JNZ @@10 + PUSH 0 + PUSH U4 DEFAULT_STACK + PUSH 0 + PUSH 0 ///Use parent account + PUSH 0 + PUSH U4 FS:[TSS_ABSOLUTE_ADDRESS] + PUSH 0 + PUSH U4 FAULT_DESC + PUSH 0 + PUSH U4 CP_FAULT_CMD_LINE+4 + CALL CP_SPAWN_TASK+4 + ADD ESP,40 + +@@10: POP U4 TSS_USER_AUX0[EAX] + PUSH 0 + PUSH EAX + MOV EAX,U4 [SYS_EXTERN_TABLE] + MOV EAX,U4 EXT_WINDOW_TO_TOP*4[EAX] + OR EAX,EAX + JZ @@20 + CALL EAX +@@20: ADD ESP,8 + POPAD + BTS U4 FS:[TSS_TASK_FLAGS],TSSf_SUSPENDED + JMP U4 IRQ_SWAP_IN_NEXT + +GET_MACHINE_REGS:: + PUSH EBP + MOV EBP,ESP + MOV EBX,SF_PARAM1[EBP] + + DU1 0x0F,0x20,0xC0; + MOV U4 [EBX],EAX + DU1 0x0F,0x20,0xD0; + MOV U4 4[EBX],EAX + DU1 0x0F,0x20,0xD8; + MOV U4 8[EBX],EAX + DU1 0x0F,0x20,0xE0; + MOV U4 12[EBX],EAX + + DU1 0x0F,0x21,0xC0; + MOV U4 16[EBX],EAX + DU1 0x0F,0x21,0xC8; + MOV U4 20[EBX],EAX + DU1 0x0F,0x21,0xD0; + MOV U4 24[EBX],EAX + DU1 0x0F,0x21,0xD8; + MOV U4 28[EBX],EAX + DU1 0x0F,0x21,0xF0; + MOV U4 32[EBX],EAX + DU1 0x0F,0x21,0xF8; + MOV U4 36[EBX],EAX + + POP EBP + RET + \ No newline at end of file diff --git a/LT/OSMain/MEM.ASZ b/LT/OSMain/MEM.ASZ new file mode 100644 index 0000000000000000000000000000000000000000..dc570870ba8df0cdeb02e6125f74e919643058df GIT binary patch literal 5570 zcmdPb56MVX$Vg2rP)JTp&PY`#Nlnhk%PcHSRq#|u%PcA`Q7BFT2+2&&PA$nz zEG|hc(&OdQ*Y{LN$K`95916qQHb_+^^JE6a&?XO@eB@$)iHodxjIGYfTV*XgX2A1 z9RuQ>9D`kB!G?l#x;i4HeO-N>e7u8WdAT@UT%9>x9V6h%P)zXg^z{sh)d9%6g>T` zKz_0H3-wh1`6n18%IWG7VH;9h3}S<@f`4d;6{l;kr!6Ri6&zh$f?R{4Djg$i0}|6y zixm=ca`KZCOHxxnIxynZ(Z|Q%*)hZw6u0r9r~pTBKxnWBC&aT5rZXsfAxv=ifS7JB zyj+~lKAzwhbM_4YxmO3A96%0^_izmMhzA7_FBhkmyDO)IgCRVD1cM_4Rc*AZV}zCo zC?)s@f&8T78VrgFuP9Cj2O|TxR%dYHfk#=eCrAf0Mz9*F;|g}Xmu~>rAXAWYL2j|) zbP5jQbajq^rYevRLQNEc{6qa*;zI-CLmZuaTy;&NU7bPBf-3R?`@KM2mdAT^L;CP*ua33Q(r&C-^Jfb!N0UbAwNwaH#HZOW_<%d z#h0%WIC)0927AIv7B44o8ZiVVSwB!z8yOgbTm%U{NHK!NEs(+hy$nH%1S11uD{z4Y zQ4Pu&aH}~L6!i5&16&+KTopixSi#jVBq$P=gy8nV^?(aIA5K>nPaSYxgBEsd*BSUCBU~v;z-T;OfxYVX@ znF;bQT4{(@lYzn)wY0-b^oHQ_22{v_3N?_!aTbVRAHqvPP&fp+`hvp&l4u+wbdVDo zH2Hx_4zNSO(T7=7!b=!P5rC=`QBp$7J>(<_&2Uf|tQuh@E4V~7G%$ojnJIdK2r>d% zm7^MC1kc^j6beZ_kn|7EOyGzG=?^slr{{RMHxYUvt^lPnLr`u zRF{y1;o_;|3N{v;Yh65bKt_VX5SBQ>L4znJkptNUTh=)jL=8(P(Y{2%NIDZDtrjZ;Ho znB|bRDaehWdTG^lMm zY{3O8)j<6}P>&3waR*LwM(|46F#^=o(FJv_CgaIq5%z3iefV-_VzO<*JC&otQnD`KyGyeHTJ=! zkBbYaZva*T?%adhGoZEyq}B$NFOWEbTMyC?u3If2$=e*mugFTlxf)b}5ZgvKg%}6U z4hYA~?C{>e*0yyu2dV9gHF7ctk zu0i1D9w>z%Rdeu~2ep=i^$KvNPDpP7R2INZK(4z$0RYVn@CpjGzkppUG$lduB65cT z=10^*666t3M+mJ23MxC0oBGhkJUAWFIz@sSNuV&spVC0#1L~P!O;Ml>1uh5BQxv2~ a0QHF+!JT1npg2Z=A|C2RELjkd-53DD3;S&V literal 0 HcmV?d00001 diff --git a/LT/OSMain/MEM.CPZ b/LT/OSMain/MEM.CPZ new file mode 100644 index 0000000..94e2dd5 --- /dev/null +++ b/LT/OSMain/MEM.CPZ @@ -0,0 +1,62 @@ +U1 *AMAlloc(U8 size) +{ + U1 *result=MAlloc(size,adam_tss); + return result; +} + +void AFree(U1 *add) +{ + Free(add,adam_tss); +} + +U1 *AMAllocIdentical(U1 *src) +{ + U8 size=MSize(src); + U1 *result=MAlloc(size,adam_tss); + MemCpy(result,src,size); +} + +U1 *MAllocIdentical(U1 *src,TssStruct *tss=NULL) +{ + U8 size=MSize(src); + U1 *result=MAlloc(size,tss); + MemCpy(result,src,size); +} + +I1 *ANewString(I1 *buf) +{ + U8 size=StrLen(buf)+1; + U1 *result=MAlloc(size,adam_tss); + MemCpy(result,buf,size); +} + +I1 *NewString(I1 *buf,TssStruct *tss=NULL) +{ + U8 size=StrLen(buf)+1; + U1 *result=MAlloc(size,tss); + MemCpy(result,buf,size); +} + +U1 *AMAllocZ(U8 size) +{ + U1 *result=MAlloc(size,adam_tss); + MemSet(result,0,size); + return result; +} + +U1 *MAllocZ(U8 size,TssStruct *tss=NULL) +{ + U1 *result=MAlloc(size,tss); + MemSet(result,0,size); + return result; +} + +void DelLinkedList(U4 *list) +{ + U4 *d; + while (list) { + d=*list; + Free(list); + list=d; + } +} diff --git a/LT/OSMain/MISC.CPZ b/LT/OSMain/MISC.CPZ new file mode 100644 index 0000000..6d4d1e3 --- /dev/null +++ b/LT/OSMain/MISC.CPZ @@ -0,0 +1,877 @@ +BoolU4 AssignBit(U1 *field,U8 bit,U8 val) +{ + if (val) + return Bts(field,bit); + else + return Btr(field,bit); +} + +void PortNop() +{ + InP(0x379); //This is an innoculous ISA (parallel port) + //access which should take + //fixed time on all machines. + //It takes 1.66uS +} + +void Exit() +{ + Bts(&Fs->task_flags,TSSf_KILL_TASK); + while (TRUE) + SwapInNext; +} + +void Kill(TssStruct *tss) +{ + Bts(&tss->task_flags,TSSf_KILL_TASK); +} + +void SimpleTimerIrq() +{ + U8 old_flags=GetFlags; + Cli; + jiffies++; + sys_timer+=SYS_TIMER0_PERIOD+1; + SetFlags(old_flags); +} + +U8 ReadSysTimer() +{ + U8 i,old_flags=GetFlags; + U8 result; + Cli; + OutP(0x43,0); //Latch Timer0 + i=InP(0x40); + i+=(InP(0x40)<<8); + result=sys_timer+SYS_TIMER0_PERIOD-i; + SetFlags(old_flags); + return result; +} + +U8 ExceptDepth(TssStruct *tss=NULL) +{ + U8 result=0; + ExceptStruct *tempt; + if (!tss) tss=Fs; + tempt=tss->next_except; + while (tempt!=&tss->next_except) { + result++; + tempt=tempt->next; + } + return result; +} + +asm { +CP_TEST_EXCEPT:: + MOV EAX,U4 FS:[TSS_LAST_EXCEPT] + MOV EBP,U4 EXCEPT_EBP[EAX] + MOV ESI,U4 EXCEPT_ESI[EAX] + MOV EDI,U4 EXCEPT_EDI[EAX] + CALL U4 EXCEPT_HANDLER_START[EAX] + RET + +CP_CATCH_EXCEPT:: + MOV EAX,U4 FS:[TSS_LAST_EXCEPT] + MOV EDX,U4 EXCEPT_HANDLER_SKIP[EAX] + MOV ESP,U4 EXCEPT_ESP[EAX] + JMP EDX + +CP_SAVE_EXCEPT_ESI_EDI:: + PUSH EBP + MOV EBP,ESP + MOV EAX,SF_PARAM1[EBP] + MOV U4 EXCEPT_ESI[EAX],ESI + MOV U4 EXCEPT_EDI[EAX],EDI + POP EBP + RET +}; + +LTextern CP_TEST_EXCEPT void TestExcept(); +LTextern CP_CATCH_EXCEPT void TakeExcept(); +LTextern CP_SAVE_EXCEPT_ESI_EDI void SaveExceptRegs(ExceptStruct *t); + +exe {NoRegVar(ON);} +void SysTry(U1 *start_label,U1 *skip_label,U8 my_ebp,U8 my_esp) +{ + U4 *ptr=GetBasePtr; + ExceptStruct *tempt=MAlloc(sizeof(ExceptStruct)); + tempt->handler_start=start_label; + tempt->handler_skip=skip_label; + tempt->esp=my_esp+8; + tempt->ebp=my_ebp; + SaveExceptRegs(tempt); + InsQue(tempt,Fs->last_except); +} + +void SysCatch() +{ + ExceptStruct *tempt=Fs->last_except; + RemQue(tempt); + Free(tempt); +} + +void throw(...) +{ + ExceptStruct *tempt=Fs->last_except; + U8 i; + + AdamLog("Depth:%02X Tsk:%08X throw(", + ExceptDepth(Fs),Fs); //TODO: fix compiler--"(FS)" + for (i=0;iexcept_argc=argc; + Fs->except_argv=argv; + Fs->except_ebp=GetBasePtr; + Fs->catch_except=FALSE; + while (tempt!=&Fs->next_except) { + TestExcept; + if (Fs->catch_except) + TakeExcept; + SetBasePtr(Fs->except_ebp); + RemQue(tempt); + Free(tempt); + tempt=Fs->last_except; + } + PutSysText("ST_UNHANDLED_EXCEPTION"); + while (TRUE) + SwapInNext; +} +exe {NoRegVar(OFF);} + +void KbdCmdSend(U8 port, U1 val) +{ + U8 timeout; + for (timeout=50000; + (InP(KEYB_CTRL)&2) && timeout;timeout--) + PortNop; + if (timeout) + OutP(port, val); + else + throw(EXCEPT_LOCAL); +} + +I8 KbdCmdRead() +{ + U8 timeout; + for (timeout=50000; timeout; timeout--) { + if (InP(KEYB_CTRL) & 1) + return InP(KEYB_PORT); + else + PortNop; + } + return -1; +} + +void KbdCmdFlush() +{ + I8 i; + for (i=0;i<1000;i++) { + if (InP(KEYB_CTRL) & 1) { + InP(KEYB_PORT); + i=0; + } else + PortNop; + } +} + +void KbdSetLEDs(U8 sc) +{ + U8 old_flags=GetFlags; + U1 v=0; + AssignBit(&v,0,Bt(&sc,SCf_SCROLL)); + AssignBit(&v,1,Bt(&sc,SCf_NUM)); + AssignBit(&v,2,Bt(&sc,SCf_CAPS)); + Cli; + KbdCmdSend(KEYB_PORT,0xED); + KbdCmdSend(KEYB_PORT,v); + SetFlags(old_flags); +} + +void KbdMouseCmdAck(U1 val) +{ + U1 b; + U8 timeout=32; + BoolU4 cont=TRUE; + while (cont && timeout) { + try { + KbdCmdSend(KEYB_CTRL,0xD4); + KbdCmdSend(KEYB_PORT,val); + b=KbdCmdRead; + if (b==0xFA) + cont=FALSE; + } catch + Fs->catch_except=TRUE; + timeout--; + } + if (cont) + throw(EXCEPT_LOCAL); +} + +void InitKeyboard() +{ + KbdCmdSend(KEYB_PORT,0xF0); + KbdCmdSend(KEYB_PORT,0x02); + KbdSetLEDs(sys_cur_scan_code); +} + +U1 scan_code_map[0x100]={ + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,SC_SHIFT,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,SC_CR,SC_CTRL,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0x35,0,0,0,SC_ALT,0,0,0,0,0,0, + 0,0,0,0,0,0,0,SC_HOME,SC_CURSOR_UP,SC_PAGE_UP,0,SC_CURSOR_LEFT,0,SC_CURSOR_RIGHT,0,SC_END, + SC_CURSOR_DOWN,SC_PAGE_DOWN,SC_INSERT,SC_DELETE,0,0,0,0,0,0,0,0,SC_GUI,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +}; + + +U1 num_lock_map[0x100]={ + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,8,9,10,0,5,6,7,0,2, + 3,4,11,0x34,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,SC_CR,SC_CTRL,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0x35,0,0,0,SC_ALT,0,0,0,0,0,0, + 0,0,0,0,0,0,0,SC_HOME,SC_CURSOR_UP,SC_PAGE_UP,0,SC_CURSOR_LEFT,0,SC_CURSOR_RIGHT,0,SC_END, + SC_CURSOR_DOWN,SC_PAGE_DOWN,SC_INSERT,SC_DELETE,0,0,0,0,0,0,0,0,SC_GUI,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +}; + + +asm {CP_KBD_HANDLER::} +void KbdHandler() +{ + void kbd_hand2(); + U8 sc=sys_cur_scan_code&~0x1FF, + sc2=InP(KEYB_PORT),sc3,sc_raw; + Bts(&sys_irq_flags,1); + if (sc2==0xE0) { + sys_cur_scan_code|=SCF_PRIOR_E0; + return; + } + AssignBit(&sc2,SCf_KEY_UP,sc2 & 0x80); + AssignBit(&sc2,SCf_E0_PREFIX,Btr(&sc,SCf_PRIOR_E0)); + sc_raw=sc2; + if (sc & SCF_NUM) { + if (sc3=num_lock_map[sc2.u1[0]]) + sc2.u1[0]=sc3; + } else { + if (sc3=scan_code_map[sc2.u1[0]]) + sc2.u1[0]=sc3; + } + if (sc2==SC_SHIFT) { + sc|=SCF_SHIFT; + goto new_key_done; + } + if (sc2==SC_SHIFT+SCF_KEY_UP) { + sc&=~SCF_SHIFT; + goto new_key_done; + } + + if (sc2==SC_CTRL) { + sc|=SCF_CTRL; + goto new_key_done; + } + if (sc2==SC_CTRL+SCF_KEY_UP) { + sc&=~SCF_CTRL; + goto new_key_done; + } + + if (sc2==SC_ALT) { + sc|=SCF_ALT; + goto new_key_done; + } + if (sc2==SC_ALT+SCF_KEY_UP) { + sc&=~SCF_ALT; + goto new_key_done; + } + + if (sc2==SC_CAPS) + goto new_key_done; + if (sc2==SC_CAPS+SCF_KEY_UP) { + sc^=SCF_CAPS; + KbdSetLEDs(sc); + goto new_key_done; + } + + if (sc2==SC_NUM) + goto new_key_done; + if (sc2==SC_NUM+SCF_KEY_UP) { + sc^=SCF_NUM; + KbdSetLEDs(sc); + goto new_key_done; + } + + if (sc2==SC_SCROLL) + goto new_key_done; + if (sc2==SC_SCROLL+SCF_KEY_UP) { + sc^=SCF_SCROLL; + KbdSetLEDs(sc); + goto new_key_done; + } + + if (sc & SCF_CTRL && sc & SCF_ALT) { + if (sc2==SC_DELETE) { + Bts(&sys_flags,SYSf_CTRL_ALT_DEL); + goto mostly_done; + } + if (sc2==1) { + Bts(&sys_flags,SYSf_CTRL_ALT_ESC); + goto mostly_done; + } + if (sc2==15) { + Bts(&sys_flags,SYSf_CTRL_ALT_TAB); + goto mostly_done; + } + if (sc2==0x2D) { + Bts(&sys_flags,SYSf_CTRL_ALT_X); + goto mostly_done; + } + if (sc2==0x2E) { + Bts(&sys_flags,SYSf_CTRL_ALT_C); + goto mostly_done; + } + } + +new_key_done: + sc|=SCF_NEW_KEY; +mostly_done: + sys_cur_scan_code=sc|sc2; + sys_cur_raw_scan_code=sc|sc_raw; + if (kbd_hand2=ext[EXT_IRQ01]) + kbd_hand2(); + Btr(&sys_irq_flags,1); +} + +U8 DivU8(U8 n1,U8 n2) +{ + U8 r_lo=n1,r_hi=0; + U8 i; + for (i=0;i<64;i++) { + if (r_lo & 0x8000000000000000) { + r_hi<<=1; + r_hi++; + } else + r_hi<<=1; + r_lo<<=1; + if (r_hi>=n2) { + r_hi-=n2; + r_lo++; + } + } + return r_lo; +} + +I8 DivI8(I8 n1,I8 n2) +{ + U8 r_lo,r_hi=0; + U8 i; + BoolU4 signed; + if (n1<0) { + signed=TRUE; + n1=-n1; + } else + signed=FALSE; + if (n2<0) { + signed=!signed; + n2=-n2; + } + r_lo=n1; + for (i=0;i<64;i++) { + if (r_lo & 0x8000000000000000) { + r_hi<<=1; + r_hi++; + } else + r_hi<<=1; + r_lo<<=1; + if (r_hi>=n2) { + r_hi-=n2; + r_lo++; + } + } + return (signed) ? -r_lo:r_lo; +} + +U8 ModU8(U8 n1,U8 n2) +{ + U8 r_lo=n1,r_hi=0; + U8 i; + for (i=0;i<64;i++) { + if (r_lo & 0x8000000000000000) { + r_hi<<=1; + r_hi++; + } else + r_hi<<=1; + r_lo<<=1; + if (r_hi>=n2) { + r_hi-=n2; + r_lo++; + } + } + return r_hi; +} + +I8 ModI8(I8 n1,I8 n2) +{ + U8 r_lo,r_hi=0; + U8 i; + BoolU4 signed; + if (n1<0) { + signed=TRUE; + n1=-n1; + } else + signed=FALSE; + if (n2<0) { + signed=!signed; + n2=-n2; + } + r_lo=n1; + for (i=0;i<64;i++) { + if (r_lo & 0x8000000000000000) { + r_hi<<=1; + r_hi++; + } else + r_hi<<=1; + r_lo<<=1; + if (r_hi>=n2) { + r_hi-=n2; + r_lo++; + } + } + return (signed) ? -r_hi:r_hi; +} + +LTDate BootTime() +//Roughly 49,710ths of a second since boot +{ + return DivU8(ReadSysTimer<<14,1833333*3*3*3/125); +} + +U2 RandU2() //TODO: fix this +{ + LTDate i=BootTime; + rnd_SEED^=MulU8(rnd_SEED,0x56234)+i.date^i.time^jiffies+ModU8(rnd_SEED,0x7635); + return rnd_SEED.u2[0]; +} + +U8 RandU4() +{ + U8 result=0; + result.u2[0]=RandU2; + result.u2[1]=RandU2; + return result; +} + +I8 ToUpper(I8 ch) +{ + if (ch>='a' && ch<='z') + return ch+'A'-'a'; + else + return ch; +} + +I8 AtoI(I1 *st,I8 radix=10,I1 **end_ptr=NULL) +{ + BoolU4 neg=FALSE; + I1 ch; + I8 result=0,k=0; + if (radix<2||radix>36) return 0; + while (*st==CH_SPACE || *st==CH_SHIFT_SPACE || *st==CH_TAB) + st++; + if (*st=='-') { + st++; + neg=TRUE; + } + if (*st=='+') st++; + while (ch=ToUpper(*st++)) { + k++; + if (radix==10) { + if (ch>='0' && ch<='9') + result=MulI8(result,10)+ch-'0'; + else if (k==2 && !result) { + if (ch=='X') + radix=16; + else if (ch=='B') + radix=2; + else if (ch=='o') + radix=8; + else + break; + } else + break; + } else if (radix>10) { + if (ch>='0' && ch<='9') + result=MulI8(result,radix)+ch-'0'; + else if (ch>='A' && ch<='A'+radix-11) + result=MulI8(result,radix)+ch-'A'+10; + else + break; + } else { + if (ch>='0' && ch<='0'+radix-1) + result=MulI8(result,radix)+ch-'0'; + else + break; + } + } + if (end_ptr) *end_ptr=st-1; + return (neg)? -result:result; +} + + +void BusyWait(U8 uS) //Loosely timed +{ + U8 i; + for (i=0;ilast_lex->flags,LFf_EXTERNS_TO_IMPORTS,val); +} + +BoolU4 KeepPrivate(BoolU4 val) { + return AssignBit(&Fs->last_lex->flags,LFf_KEEP_PRIVATE,val); +} + +BoolU4 PTrace(BoolU4 val) { + return AssignBit(&Fs->last_lex->flags,LFf_PARSE_TRACE,val); +} + +BoolU4 OTrace(BoolU4 val) { + return AssignBit(&Fs->last_lex->flags,LFf_OPT_TRACE,val); +} + +BoolU4 CTrace(BoolU4 val) { + return AssignBit(&Fs->last_lex->flags,LFf_COMPILE_TRACE,val); +} + +BoolU4 LTrace(BoolU4 val) { + return AssignBit(&Fs->last_lex->flags,LFf_LEX_TRACE,val); +} + +BoolU4 NoRegVar(BoolU4 val) { + return AssignBit(&Fs->last_lex->flags,LFf_NO_REG_VAR,val); +} + +BoolU4 Echo(BoolU4 val) { + return AssignBit(&Fs->last_lex->flags,LFf_ECHO,val); +} + +BoolU4 SysEcho(BoolU4 val) { + return AssignBit(&Fs->last_lex->flags,LFf_ECHO,val); +} + +BoolU4 Silent(BoolU4 val) { + return AssignBit(&Fs->crt_flags,CRTf_SILENT,val); +} + +BoolU4 Preempt(BoolU4 val) { + return AssignBit(&sys_flags,SYSf_PREEMPTIVE,val); +} + +BoolU4 SysDbg(BoolU4 val) { + return AssignBit(&sys_flags,SYSf_DEBUG,val); +} + +BoolU4 IsSysDbg() { + return Bt(&sys_flags,SYSf_DEBUG); +} + +BoolU4 Raw(BoolU4 val) { + if (val) { + OutP(VGA_SC_INDEX,VGA_MAP_MASK); + OutP(VGA_SC_DATA,0x0F); + } + return AssignBit(&sys_flags,SYSf_RAW_CRT_OUT,val); +} + +BoolU4 IsRaw() { + return Bt(&sys_flags,SYSf_RAW_CRT_OUT); +} + +U1 *Caller() +{ + U4 *bp=GetBasePtr; + bp=*bp+4; + return *bp; +} + +U1 *CallerCaller() +{ + U4 *bp=GetBasePtr; + bp=*bp; + bp=*bp+4; + return *bp; +} + +void DbgStr(I1 *st,U8 mS=100) +{ + BoolU4 old_flags=GetFlags; + BoolU4 old_raw; + Cli; + old_raw=Raw(ON); + cout "DbgStr(",st,")"; + BusyWait(mS<<10); + SetFlags(old_flags); + Raw(old_raw); +} + +void DbgNum(U8 num,U8 mS=100) +{ + BoolU4 old_flags=GetFlags; + BoolU4 old_raw; + Cli; + old_raw=Raw(ON); + cout "DbgNum(",num,")"; + BusyWait(mS<<10); + SetFlags(old_flags); + Raw(old_raw); +} + +void DbgF(double d,U8 mS=100) +{ + BoolU4 old_flags=GetFlags; + BoolU4 old_raw; + Cli; + old_raw=Raw(ON); + cout "DbgF(",d,")"; + BusyWait(mS<<10); + SetFlags(old_flags); + Raw(old_raw); +} + +void DbgAdd(U4 *add,U8 mS=100) +{ + BoolU4 old_flags=GetFlags; + BoolU4 old_raw; + Cli; + old_raw=Raw(ON); + PrintF("DbgAdd(%P)",add); + BusyWait(mS<<10); + SetFlags(old_flags); + Raw(old_raw); +} + +void DbgD(U4 *add,U8 cnt=0x80,U8 mS=100) +{ + BoolU4 old_flags=GetFlags; + BoolU4 old_raw; + Cli; + old_raw=Raw(ON); + D(add,cnt); + BusyWait(mS<<10); + SetFlags(old_flags); + Raw(old_raw); +} + +void DbgDm(U4 *add,U8 cnt=0x80,U8 mS=100) +{ + BoolU4 old_flags=GetFlags; + BoolU4 old_raw; + Cli; + old_raw=Raw(ON); + Dm(add,cnt); + BusyWait(mS<<10); + SetFlags(old_flags); + Raw(old_raw); +} + + +SysHashEntry *FindLocalHash(I1 *st,U8 mask) +{ + return FindHashEntry(st,Fs->hash_table,mask); +} + +void Beeps(U8 j,BoolU4 busy) +{ + U8 i,f; + for (i=0;i<8;i++) { + if (Bt(&j,i+24)) { + f=200; + if (Bt(&j,i+8)) + f+=400; + if (Bt(&j,i+16)) + f+=800; + Sound(f); + if (busy) { + if (Bt(&j,i)) + BusyWait(300000); + else + BusyWait(100000); + } else { + if (Bt(&j,i)) + Sleep(400); + else + Sleep(150); + } + Sound(0); + } + if (busy) + BusyWait(150000); + else + Sleep(300); + } +} + +void UnrecoverableSysError(U8 j) +{ + Cli; + while (TRUE) { + Beeps(j,TRUE); + Raw(ON); + coutln "Unrecoverable SysError:",j; + BusyWait(500000); + } +} + +asm {CP_BREAK::} +void Break() +{ + ReleaseTaskPartitions; + IntFlushMsgs; + throw(EXCEPT_BREAK); +} + +void ThrowDivide(U1 *eip) +{ + throw(EXCEPT_ARITHMETIC,eip); +} + +void ThrowFloating(U1 *eip) +{ + throw(EXCEPT_FLOATING,eip); +} + + +SysHashEntry *FindPSect(U8 add,I8 *offset) +{ + SysHashEntry *result=NULL,*temph; + SysHashTable *h=Fs->hash_table; + ClassStruct *tempc; + U8 i,best=0x8000,j; + + while (h) { + for (i=0;i<=h->mask;i++) { + temph=h->body[i]; + while (temph) { + if (temph->type&HTT_FUNCTION) { + tempc=temph; + j=tempc->executable_address; + } else + j=temph->user0; + j=add-j; + if (temph->type&(HTT_SYS_SYMBOL|HTT_FUNCTION)) { + if (jnext; + } + } + h=h->next; + } + *offset=best; + return result; +} + + +U8 GetS(I1 *buf,U8 size) +{ + I8 ch; + I1 *buf2; + U8 i=0; + void my_SysGetS(); + if (!size || !buf) return 0; + i=FindExtern("SysGetS"); + if (i) { + my_SysGetS=i; + buf2=my_SysGetS(); + if (StrLen(buf2)>size-1) { + MemCpy(buf,buf2,size-1); + buf[size-1]=0; + } else + StrCpy(buf,buf2); + i=StrLen(buf); + Free(buf2); + } else { + while (TRUE) { + ch=GetKey; + if (ch==CH_CR) { + PutChar(ch); + break; + } if (ch==CH_BACKSPACE) { + if (i>0) { + i--; + PutChar(ch); + } + } else { + if (ians 0000 StrConst +$LK "ans0 ","FL:::/LT/OSMain/ADAMK.HPZ,1621"$(Fs->ans 0000 StrConst +$LK "ans1 ","FL:::/LT/OSMain/ADAMK.HPZ,1622"$(Fs->ans 0000 StrConst +$LK "ans2 ","FL:::/LT/OSMain/ADAMK.HPZ,1623"$(Fs->ans 0000 StrConst +$LK "ans3 ","FL:::/LT/OSMain/ADAMK.HPZ,1624"$(Fs->ans 0000 StrConst +$LK "ans4 ","FL:::/LT/OSMain/ADAMK.HPZ,1625"$(Fs->ans 0000 StrConst +$LK "ans5 ","FL:::/LT/OSMain/ADAMK.HPZ,1626"$(Fs->ans 0000 StrConst +$LK "ans6 ","FL:::/LT/OSMain/ADAMK.HPZ,1627"$(Fs->ans 0000 StrConst +$LK "ans7 ","FL:::/LT/OSMain/ADAMK.HPZ,1628"$(Fs->ans 0000 StrConst +$LK "ansd ","FL:::/LT/OSMain/ADAMK.HPZ,1630"$(Fs->dou 0000 StrConst +$LK "ansd0 ","FL:::/LT/OSMain/ADAMK.HPZ,1631"$(Fs->dou 0000 StrConst +$LK "ansd1 ","FL:::/LT/OSMain/ADAMK.HPZ,1632"$(Fs->dou 0000 StrConst +$LK "ansd2 ","FL:::/LT/OSMain/ADAMK.HPZ,1633"$(Fs->dou 0000 StrConst +$LK "ansd3 ","FL:::/LT/OSMain/ADAMK.HPZ,1634"$(Fs->dou 0000 StrConst +$LK "ansd4 ","FL:::/LT/OSMain/ADAMK.HPZ,1635"$(Fs->dou 0000 StrConst +$LK "ansd5 ","FL:::/LT/OSMain/ADAMK.HPZ,1636"$(Fs->dou 0000 StrConst +$LK "ansd6 ","FL:::/LT/OSMain/ADAMK.HPZ,1637"$(Fs->dou 0000 StrConst +$LK "ansd7 ","FL:::/LT/OSMain/ADAMK.HPZ,1638"$(Fs->dou 0000 StrConst +$LK "boot_blkdev ","FL:::/LT/OSMain/START.CPZ,67"$00004A30 0004 GlbVar Export +$LK "compiled_lines ","FL:::/LT/OSMain/START.CPZ,66"$00004A24 0001 GlbVar Export +$LK "dc_col ","FL:::/LT/OSMain/START.CPZ,62"$000049F8 0009 GlbVar Export +$LK "dec_numeric_bitmap ","FL:::/LT/OSMain/ADAMK2.HPZ,62"$00003930 0000 GlbVar Public Export +$LK "default_drive ","FL:::/LT/OSMain/START.CPZ,69"$00004A3C 0007 GlbVar Export +$LK "default_partition ","FL:::/LT/OSMain/START.CPZ,68"$00004A38 0005 GlbVar Export +$LK "disk_status_display ","FL:::/LT/OSMain/START.CPZ,66"$00004A1C 001E GlbVar Export +$LK "displayable_chars_bitmap ","FL:::/LT/OSMain/ADAMK2.HPZ,67"$000039B0 0000 GlbVar Public Export +$LK "drive_to_partition ","FL:::/LT/OSMain/START.CPZ,70"$00004A3D 0003 GlbVar Export +$LK "e ","FL:::/LT/OSMain/ADAMK2.HPZ,47"$00002315 0000 GlbVar Public Export +$LK "ext ","FL:::/LT/OSMain/ADAMK2.HPZ,24"$00001D04 0011 GlbVar Public Export +$LK "filename_chars_bitmap ","FL:::/LT/OSMain/ADAMK2.HPZ,66"$00003910 0002 GlbVar Public Export +$LK "free_gdt_list ","FL:::/LT/OSMain/ADAMK2.HPZ,22"$00001018 0004 GlbVar Export +$LK "free_page_hash ","FL:::/LT/OSMain/ADAMK2.HPZ,34"$00001D0C 0000 GlbVar Export +$LK "free_page_hash2 ","FL:::/LT/OSMain/ADAMK2.HPZ,35"$0000210C 0000 GlbVar Export +$LK "gdttab ","FL:::/LT/OSMain/ADAMK2.HPZ,23"$00000010 0002 GlbVar Export +$LK "grbase ","FL:::/LT/OSMain/ADAMK2.HPZ,53"$00001CF4 0004 GlbVar Export +$LK "grbase2 ","FL:::/LT/OSMain/ADAMK2.HPZ,54"$00001CF8 0008 GlbVar Export +$LK "grfont ","FL:::/LT/OSMain/START.CPZ,48"$000049CC 0002 GlbVar Export +$LK "grheight ","FL:::/LT/OSMain/ADAMK2.HPZ,57"$00001CE0 000E GlbVar Export +$LK "grmode ","FL:::/LT/OSMain/ADAMK2.HPZ,55"$00001CD8 0003 GlbVar Export +$LK "grwidth ","FL:::/LT/OSMain/ADAMK2.HPZ,56"$00001CDC 0012 GlbVar Export +$LK "hex_numeric_bitmap ","FL:::/LT/OSMain/ADAMK2.HPZ,63"$00003950 0000 GlbVar Public Export +$LK "ip_inhibit_win_operations ","FL:::/LT/OSMain/START.CPZ,74"$00004ACD 0002 GlbVar Export +$LK "jiffies ","FL:::/LT/OSMain/START.CPZ,63"$00004A08 000D GlbVar Export +$LK "local_blkdevs ","FL:::/LT/OSMain/START.CPZ,67"$00004A2C 0004 GlbVar Export +$LK "local_partitions ","FL:::/LT/OSMain/START.CPZ,68"$00004A34 0006 GlbVar Export +$LK "log10_2 ","FL:::/LT/OSMain/ADAMK2.HPZ,50"$0000232D 0000 GlbVar Public Export +$LK "log2_10 ","FL:::/LT/OSMain/ADAMK2.HPZ,48"$0000231D 0000 GlbVar Public Export +$LK "log2_E ","FL:::/LT/OSMain/ADAMK2.HPZ,49"$00002325 0000 GlbVar Public Export +$LK "logE_2 ","FL:::/LT/OSMain/ADAMK2.HPZ,51"$00002335 0000 GlbVar Public Export +$LK "macro_util_tss ","FL:::/LT/OSMain/START.CPZ,44"$000049BC 0002 GlbVar Export +$LK "mem_free_list ","FL:::/LT/OSMain/ADAMK2.HPZ,33"$00001D08 0000 GlbVar Export +$LK "monitor_floppy_tss ","FL:::/LT/OSMain/START.CPZ,47"$000049C8 0004 GlbVar Export +$LK "month_start_days1 ","FL:::/LT/OSMain/ADAMK2.HPZ,137"$00003BC0 0003 GlbVar Export +$LK "month_start_days2 ","FL:::/LT/OSMain/ADAMK2.HPZ,138"$00003BD8 0003 GlbVar Export +$LK +BI,"my_ExecuteFile ","FL:::/LT/OSMain/CMD.CPZ,1",323$00009570 0004 Funct Export +$LK +BI,"my_ExecuteString ","FL:::/LT/OSMain/CMD.CPZ,10",324$000095E3 0001 Funct Export +$LK +BI,"my_WindowToTop ","FL:::/LT/OSMain/CMD.CPZ,19",325$00009667 0001 Funct Export +$LK "num_blkdevs ","FL:::/LT/OSMain/START.CPZ,71"$00004ABD 0004 GlbVar Export +$LK "num_lock_map ","FL:::/LT/OSMain/MISC.CPZ,240"$00006C2E 0001 GlbVar Export +$LK "num_spawned_users ","FL:::/LT/OSMain/START.CPZ,46"$000049C4 0002 GlbVar Export +$LK "one ","FL:::/LT/OSMain/ADAMK2.HPZ,44"$000022FD 0000 GlbVar Public Export +$LK "pi ","FL:::/LT/OSMain/ADAMK2.HPZ,45"$00002305 0000 GlbVar Public Export +$LK "pi2 ","FL:::/LT/OSMain/ADAMK2.HPZ,46"$0000230D 0000 GlbVar Public Export +$LK "printable_chars_bitmap ","FL:::/LT/OSMain/ADAMK2.HPZ,64"$00003970 0000 GlbVar Public Export +$LK "progress1 ","FL:::/LT/OSMain/ADAMK2.HPZ,40"$0000218C 0000 GlbVar Public Export +$LK "progress2 ","FL:::/LT/OSMain/ADAMK2.HPZ,41"$00002194 0000 GlbVar Public Export +$LK "progress3 ","FL:::/LT/OSMain/ADAMK2.HPZ,42"$0000219C 0000 GlbVar Public Export +$LK "progress4 ","FL:::/LT/OSMain/ADAMK2.HPZ,43"$000021A4 0000 GlbVar Public Export +$LK "rnd_SEED ","FL:::/LT/OSMain/START.CPZ,64"$00004A10 0005 GlbVar Export +$LK "safe_dollar_chars_bitmap ","FL:::/LT/OSMain/ADAMK2.HPZ,65"$00003990 0001 GlbVar Public Export +$LK "scan_code_map ","FL:::/LT/OSMain/MISC.CPZ,219"$00006B2E 0001 GlbVar Export +$LK "sys_accounts ","FL:::/LT/OSMain/START.CPZ,42"$0000495C 0000 GlbVar Export +$LK "sys_boot_base ","FL:::/LT/OSMain/ADAMK2.HPZ,26"$00000004 0001 GlbVar Public Export +$LK "sys_boot_code ","FL:::/LT/OSMain/ADAMK2.HPZ,29"$00001010 0006 GlbVar Export +$LK "sys_boot_header_base ","FL:::/LT/OSMain/ADAMK2.HPZ,30"$00000008 0001 GlbVar Public Export +$LK "sys_clipboard_ltf ","FL:::/LT/OSMain/START.CPZ,65"$00004A18 0000 GlbVar Export +$LK "sys_compile_time ","FL:::/LT/OSMain/START.CPZ,75"$00004AD1 0001 GlbVar Export +$LK "sys_cur_focus_task ","FL:::/LT/OSMain/ADAMK2.HPZ,36"$000021B0 0005 GlbVar Export +$LK "sys_cur_raw_scan_code ","FL:::/LT/OSMain/ADAMK2.HPZ,38"$00001CFC 0001 GlbVar Export +$LK "sys_cur_scan_code ","FL:::/LT/OSMain/ADAMK2.HPZ,39"$00001D00 0006 GlbVar Export +$LK "sys_flags ","FL:::/LT/OSMain/ADAMK2.HPZ,25"$00001CE4 001B GlbVar Public Export +$LK "sys_heap_base ","FL:::/LT/OSMain/ADAMK2.HPZ,27"$00001CD0 0000 GlbVar Public Export +$LK "sys_heap_limit ","FL:::/LT/OSMain/ADAMK2.HPZ,28"$00001CD4 0000 GlbVar Public Export +$LK "sys_irq_busy_flags ","FL:::/LT/OSMain/ADAMK2.HPZ,32"$00001CEC 000D GlbVar Public Export +$LK "sys_irq_flags ","FL:::/LT/OSMain/ADAMK2.HPZ,31"$00001CE8 000A GlbVar Public Export +$LK "sys_macro_queue ","FL:::/LT/OSMain/START.CPZ,43"$00004988 0005 GlbVar Export +$LK "sys_startup_account ","FL:::/LT/OSMain/START.CPZ,72"$00004AC5 0001 GlbVar Export +$LK "sys_swap_cnter ","FL:::/LT/OSMain/ADAMK2.HPZ,37"$000021AC 0000 GlbVar Export +$LK "sys_temp_filename ","FL:::/LT/OSMain/START.CPZ,41"$0000490C 0002 GlbVar Export +$LK "sys_timer ","FL:::/LT/OSMain/START.CPZ,63"$00004A00 0003 GlbVar Export +$LK "textbase ","FL:::/LT/OSMain/ADAMK2.HPZ,52"$00001CF0 0004 GlbVar Export +$LK +BI,"throw ","FL:::/LT/OSMain/MISC.CPZ,113",326$00006493 001C Funct Export +$LK "vga_image ","FL:::/LT/OSMain/START.CPZ,76"$00004AD5 0001 GlbVar Export +$LK "wordstat_mask ","FL:::/LT/OSMain/START.CPZ,73"$00004AC9 0001 GlbVar Export + $K4KMK ÝJíJ KK$ ZKqKŽK¬KØK$)/ŽMžM¼MçMóM$!lLƒL¨LÆLòLHìûµLÅLÛLõLM(äë0L@LmLƒL›L¨LH%4z`Š`š`Ç`à`aa*a>aQadawaŠa—a `Ñæ"Y9YWY|Y¯YÖYçYôYZ]Z„Z¾ZüZ0[B[y[å[ø[ +œ¬ÐV.VYVtV|VŠV—V¤V´VáVúVW0WDWcWxW—W¬W¿WÔWóWüWTXtX¥XÁXÕXçXYY H%#N3NCNpN‰N«N¿NÓNñNOO,O?OLO H&5YOiO–OªO¾OÑOÖOîOPP,P?PLP H$Q_a_q_ž_·_Ù_í_``'`:`M```m`hg~�RŸR³RÀRÈRÑRÞRS*S…S–S§S¬S¹SÔSæSùSTØ5h¤a»aÐaæaÿa!bNbgb{bšb¯bÎbãböbcc(cUcnc�c¤c¸c×cìc d d3d`dud›dªdÕdäd3eSe„e�e¬eÀeÒe(üM.MMMVM“M¯M4¡«RUiU„U‘U®UÂUÜUúU V� +TBTSTyTˆT¢TÇTãT÷TU&UDUtÃÝøJKK2KLKnK’K×Khýˆ]Ÿ]º]Ç]ä]ø] ^/^>^i^x^’^·^Ó^ç^__4_C_$)o’æ©æ°æÒæÝæÿæç!ç2çMçcçzç´çÃçåçÿçè/èMèfèyè’èžè¿èéé=éOé`é}é…éŸé¿éÛéâéüéê2êRêeêwê©êÂêÖêîêóê ë#ë6ëNëwë‹ëŸë³ëÇëÚëîëûë€p�#ì:ì?ì\ìmìƒì“ìÁìÇìÒìúìíIíií„í˜íÝíðíî=îOîbîvîŠî—îHBQRi�¬µºã÷ +@^kÓê<Pt†™¬8R]&=`t˜ª½LÚêùàáSápá áÕáâ$â7â<âAâdâqâ܌Ŕܔ•/•U•|•••§•¹•˕ە÷•P––Å–á–æ–,—H—M—\—|—¤—¸—Ì—à—ó—ø— ˜ ˜4˜G˜L˜]˜q˜‡˜•˜¸˜Θû˜A™g™Ž™§™¹™Ë™Ý™í™ššfš§šæšôš››<›V›y›•›°›è› +œ"œFœSœŠœ™œµœöœ�d�n�€�”�¨�½�Ð�Õ�ü�ž1žEžYžmž€ž…ž­žt�çÛžëžðžùž ŸŸAŸFŸ�Ÿ Ÿ»ŸÀŸéŸ  . ? T e Æ × ê  +¡¡6¡;¡L¡g¡l¡{¢®¢Ç¢Ü¢£2£H£U£u£Œ£ £¶£Ï£4¤c¤v¤™¤«¤Ф줥¥)¥E¥Y¥m¥¥›¥¯¥Ã¥Õ¥ð¥¦¦<¦Q¦^¦s¦‰¦Ò¦@)6!^8^L^`^q^†^—^¸^Ñ^â^ð^˜7Zþ^_0_I_V_†_–_œ_´_Ä_ß_ø_ ``/`R`c`„`¨`º`É`ã`ÿ`a/a4a @kx ™7™K™L™`™t™‹™ž™²™Å™Ï™ @]jf˜}˜‘˜¢˜£˜·˜Î˜á˜õ˜™™!4¹ÃìÚüÚÛ ÛÛ+Û9ÛhÛ"¬�¸Ž×—׍׾ׯ×Ù×ØØØ4ØNØlØÊØÛØúØÙÙ*ÙIÙyÙŸÙãÙýÙ*ÚLÚrÚwÚ…Ú“Ú˜Ú°ÚÓÚäÚ#<%1j-j:jHjVjkj—jÃj×jk$Ä3ï'HV�›¥òÿ4X\tž£¬Êäöü%Qcrˆ�¢Å%ð<uLcyš£Îó:V[ƒ¦ºÇÜöÿL Q y “ ¿ Ù ñ  ' b ™ º Ï á ò  !%!Q!d!t!�!µ!Ú!÷!"3"&(4;Óã%?'( h`x`€`¨`Ñ`(Èîh}}�}¸} ~x~†~£~§~¹~Õ~ý~+e¦ìø€(€G€X€w€�€‹€©€ã€(�v�Å�Ï�Ô�‚b‚l‚Œ‚Ê‚)8v�› ² Ö ò  +( +; +*0¯¸q ˆ   º Í +$¨®ó  + - P c ,4oy¢»«»¿»ì»2¼`¼ˆ¼-0@Ḯքæ„þ„… …8…L….„çm�v�£�Ñ�è� Ž-ŽRŽrނދލ޻ŽÏŽÔŽñŽ��&�+�>�R�j�/ÒÖp{y{�{0$�� �$�1�1œa…o&o:o¢oÊoØoåoýop5pQpep‘p·pûpqq2qKqhq…q¨qÉqÓqëqrr2$$؂Ⴀƒƒ*ƒ3Y]H†Q†x†4$Š�Òˆâˆèˆ÷ˆ‰5(‘˜‰ ‰&‰+‰:‰J‰6<)u© À Ò æ  9 L z  † š È Ó ð  6 B G d « à Û ñ *1Kj…Œ¦ÅÚù -@r‹Ÿ¤¸ßö"<h~¥¼ç&@Rn™¬ÀÓâ7DBP_ÑoчѢѧÑÞÑìÑ9ÒFÒ8D3AKÐ[ÐuÐ�ЕÐÌÐÚÐ'Ñ4Ñ90Úã��'�Y�€���­�:<Žš«îÂîôî9ïKï\ï|ï’ï¥ï¹ïÆï;<¶Âêñòòò4òPòhò°òÞòåò +óó<,-ä=ä[äÆäääå2å= ëðâ�âã6ã>H2A kkek’k®kl-lvl£l¿l&m>m?`{�ÙWéW X9X‰XçX Y7YŽYóYZNZ‡Z·ZÊZÐZóZ [@ –›Ü­ì­ù­#®Ad!7Dþ[þƒþ¡þºþØþñþÿ.ÿ3ÿPÿmÿŒÿ«ÿÑÿçÿBˆ•´ø#$H$_$u$†$±$Ý$ô$%%,%Q%i%–%Ë%á%æ% &;&M&o&‡&�&±&¾&Ë&C0ˆ‘¿©È©Ñ©î©ó©ªªªDôÒ µDÌDE E7EKE]EmE•E·EÌEïEF Fë\ëwë}ë†ëîë8ì[ì`ì¡ìÀì@íÈíÝíîî)îBîVîyî†î[(7>tN‹N’N›N®N³N\LÙé�˜œ¹Ôíô )]´’¼ßö +$;GNSw•ºØë÷ +Lož£×êý"/5?P^€‚Ÿêtótuu-uLubuvu•u´uÌuùuvCvVv‰v·vÏvìvÿvSw_To�NsWsƒs°sÌsús t@tnt†t£t¶tÞt`5Eaˆ6ÆNÝNôNOO+OLOcOpO‡O§O´OüO P$P.PoP†P‹PÓPyQ©QÒQæQüQ)RbŒ(X o € œ ¤ µ à Ú ì  + + +$ +1 +? +Q +r +� +Å +à +÷ +& ` y Œ c, •å¥å¶åÈåÙåìåd(?åVågåmåzå‡åe<ù‰ã™ãžã«ã¼ãÒãää äfeiü†‡,‡gâ! ®"®-®J®g®ƒ®•®–®´®Ç®Ú®à®¯¯)¯>¯G¯Z¯u¯‰¯�¯º¯Ã¯Ö¯é¯÷¯° +°,°5°H°[°i°v°|°Š°ž°µ°É°Ò°æ°ý°±%±*±B±T±x±“±­±h<4@¥b¼bÐbábêbccc0ci$a +a'a,a5a:ajtµÏÙ&ð&ö& '?'h'~'­'²'Ç'ä'û' (#(4(H(U(b(k(ˆ(kIMX…a…ˆ…l@Ž›_'v'|'­' (6(\(d(�(�(²(mhí?.V.b.o.Œ.².¾.Ò.ñ./+/T/a/z/ˆ/ /­/n`9Nå5õ5616J6i6‚6•6Ò6Ü6á6ó6757Q7omq}8�8«8ph‰ Ù9é9ö9::@:Q:m:…:‘:§:´:Ì:Ý:ñ:;; ;3;@;q¸Ûö? @ @.@;@S@n@@¢@¯@á@ö@AA A$A5AMAZAwA�AèAB:BvB‹BïBCCYCsC�C­CÜCðCrÈ«ÚÖ;æ;</<<<o<Œ<œ<¬<¾<Î<à<=7=Y=k==›=«=»=Ì=è=ý=>#>6>P>a>u>‚>š>Ê>.?;?@?O?]?¤?³?À?s0¡ªM;];j;z;Š;ž;¼;É;t(el8!828N8c8p8u _dÍ7Ý7ê78vÄ8¦XHoH�H�H�HµHÍHÚH÷HIhI’IºIìIJJ8JUJ„J˜JwHO^^7n77€7¢7§7³7À7xÌ7þCD=DXD‹D¨DâDòDEE$E6E^E�E¯EÁEÕEñEFF%FAFVFkF€F“F­F¾FÒFßFýF'G‹G˜G�G¬G»GHH Hy®ìŽ)¥)³)Ò)å)ö)**.*F*Y*t*„*˜*¶*Ä*Ø*ù*+4+h+ƒ+¯+Ê+÷+ ,,T,a,y,�,£,É,Ö,ú,--0-L-c-h-•-«-°-ò-ÿ- ..'.5.zÜHâ0ù0 +1H1ƒ1’1±1Ô1ê1232P2—2´2¹2á2ö2 3%3-3c3�3ž3Ï3I4¢4¼4Ù4ö45C55™5¶5Ó5é56V6p6�6¢6¼6Ë6{D»/Ë/è/0'0G0\0‡0Œ0È0Ù0|(œ£¼(Ì(Ï(ì(þ(}0¤­))/)V)k)…)~lI¡Õ6ì6ò6'7a7p7�7²7È7Ü7î7 8?8\8¢8¿8Ä8Õ899,9J9^9†9›9°9Ê9Û9ó9 :<:s:€:Á:Æ:à:; ;A;»;<)<N<k<ˆ<™<±<Þ<ì<)=E=h=¥=¹=Þ=û=>)>A>n>|>¹>Ï>ð>-?A?f?ƒ?ª?Ý?@7@L@f@u@,Øàš­ª­¯­À­Ó­ã­€H¦µ¡ð¸ðÎðôðññ\ñhñŽñ®ñÊñÜñ�8^4u4{4ˆ4Œ4¤4É4á4ð4ÿ4‚\2 5$5*575;5S5x5�5Ÿ5®5ƒdÞôL´c´Š´­´´×´ú´ µ)µHµfµžµ˵êµþµ¶*¶„�>_ˆ Ÿ ° Ì Ø !!)!f!€!�!Ì!Ú!"-"X"o"~"»"Õ"ä"!#&#3#=#q#€#…<½Éê&@NUu‚�†ð4m» »0»>»S»n»s»›»©»á»¼i¼Ô¼½O½c½h½y½޽½½νæ½ó½ÿ½¾¾4¾B¾`¾�¾’¾ä¾<¿K¿a¿¿˜¿�¿±¿¶¿οñ¿ò¿ÿ¿‡Üì  ù$ù8ùcùtù¬ùÙù2ú�úÚú +ûû#û)û>ûmû…û‘û•ûªû¯ûÃûëûOü^ünüŠü üÂüÚüÿücý„ý“ý£ý¿ýÑýãýþ þ%þ3þˆüö28¶A¶R¶c¶‹¶™¶°¶˶å¶ú¶ÿ¶'·5·m·™·°·Ü·>¸R¸i¸—¸®¸ȸ渹¹¹<¹l¹‡¹¯¹ʹṺYºkºpº…ºŠºžº£º»ºÞºߺ캉è´ëôô/ô\ômô{ô³ôßôëôõgõ{õ‡õ¬õ¾õÓõÙõö ö*ö<öBöKönö‚ö³ö÷&÷6÷R÷f÷|÷ž÷¶÷Ä÷é÷Mønø}ø�ø©ø»øÁøÚøîøüøŠâæ)�9�`�‹Œ$D¡�¸�É�Ò�é�õ�"‘C‘O‘g‘w‘”‘®‘בï‘’ ’/’4’9’V’r’€’Œ4:Df¸o¸ƒ¸š¸±¸É¸è¸þ¸�8U`ºº/ºFº]ºuº�º¬ºÂºŽ\L`ÂNÒNäNíN OOO$O5O>OWOgO~OœO¬O�4ö@_{h{Š{¦{Î{Ü{ï{|"|:|Z|w|—|´|Ô|ñ|}.}N}k}„} }Ä}ò}9~S~j~ƒ~ˆ~¨~Ì~ù~)=bœÌ€€5€L€p€¢€Æ€à€õ€ �'�A�e��Ü�ð�‚'‚<‚M‚�Àb�ÍÓÖÓçÓõÓ Ô Ô;Ô@ÔhÔvÔƒÔ›ÔµÔöÔ0ÕRÕdÕšÕ¼ÕÙÕëÕÿÕÖ+ÖHÖeÖˆÖ¦Ö¼ÖðÖ +××7×<×T×w×xבXM` nn´“$Ÿ¥¿%¿4¿H¿”œzž”¼«¼¿¼Ä¼ë¼ì¼ü¼½-½F½V½o½½˜½¨½Á½Ñ½ê½ú½¾#¾<¾F¾V¾x¾¢¾ß¾÷¾¿•%)û2–˜Áä\s¥¸ÓîþVd…‰™Ÿ[y�½Éí"(äFR|�—@Öí*SXr�˜d5K‹¥¢¥¶¥·¥Ô¥Ý¥ô¥)¦6¦9¦S¦a¦n¦x¦‡¦Œ¦›¦©¦™ EjŽ’¥’¹’ø’“*“?“R“{“¯“Ô“ë“ ” ”$”2”G”^”n”s”Š”ž”³”ÔȔ攕$•H•šˆï�lŸl³lÆlÛlmm*m?mPmem�m¶mßmäm +n,n1nEnWnvn�nªnÇnÓn›(CJS"S%S=SOSœ87B7RGRqR°RµRôRùR�ÐV‡j§�§•§–§³§¼§Ó§æ§¨¨¨?¨O¨e¨f¨‚¨Œ¨ž¨µ¨Ñ¨ã¨ü¨©©©*©7©<©A©W©e©r©w©|©Š©—©œ©¢©±©ž<’ž&ª=ªTª]ªsªvªŽª©ªÉªÖªŸÌ6fYPiP€P›P¨P±PÏPÜP÷P$Q5QBQaQ{Q¨Q¼QÉQäQøQR +RR.RLRQRsR‚R `çü\\,\9\Q\i\v\“\Ÿ\Ë\ò\ ])]F]u]z]¡pi‚àe÷eff8fNf[fhf€f˜f¥fÂfÎf8g_gyg–g³gâgýg +h¢P¼MÌMêMóMN£ ÞãäKôKLL#L¤4³½WÀgÀ€À™À¼ÀÝÀöÀÁ(ÁAÁ¥4ùƒ\¨l¨‚¨•¨³¨ƨڨ©\©r©‘©°©Ï©í©ª`ªL¬Q¬¦ A�U‚l‚‚«‚Ƃقô‚ƒNƒbƒyƒ~ƒŒƒȃåƒ÷ƒ „„3„8„L„^„s„ˆ„™„ž„²„Æ„Û„ð„……#…P…T…l…�…†…±…µ…Í…†,†@†E†W†p†�†¢†±†À†§@‘ž[![>[][|[Ë[\h\…\¢\ð\õ\¨”1ìnõn o"o8oeo{o‘o–o¬oÂoÇoúopZpwp©pÆpøpq[q«q¿qÄqÖqèq2r©ˆš¹tt0tRtztˆtŸt¶tÐtÞt'u7uFu]u}u•u³uÌuïu1vEvJvbv…v†vªTÜî·kÀkÐkâkçk÷k lll0l5lElWl\lll~lƒl«$ÕÛèjñjkk&k¬X†™r$rLrZrsr‡r»ràr;scs‹s³sÅsÊsâstt­<©µr«{«€«�«¢«Á«à«ý«¬¬)¬®¤(V\_\u\‹\¤\»\Î\ä\] ]5]Q]d]w]Š]ë]¯0Ÿ¨ùª«« «+«J«a«f«°$ÕÛikrk‚k—k«k±ìz²Ý™ô™š0šBšTšfšyšŒšŸš²šÆš×šìšþš›$›.›A›T›^›q›„›Ž›¡›´›¾›Ñ›ä›î›œœœ1œDœ^œoœ“œªœ½œÒœâœòœ��$�6�H�Z�Œ�¡�¯�²$¶¼:¬C¬`¬e¬³\ÅÙ‡���ª�¸�à�î�ŽŽ/ŽDŽbކޡ޹޾ŽÖŽùŽúŽ´ 38¼5Å5Ù5µ¹½¦J¯JÃJ¶¾ÂÏJØJìJ·DÊØžµÆãü0=P_n¸…‰¥ˆ®ˆÊˆ¹y}ˆ"ˆ>ˆº8¨³h#hNhkhwh‹h•h­h»8œ§gˆg«gÄgÜgægh¼8�›ÍfÖfífg gAg\gsg½¨n2mBmkm‡m›m´mÎm×mn*nBn[n…nžn£nÍnænýnoo7oRoWonoŠo�o¨oÃoÈoßoûopp4p9pFpUpnpŠpšpŸp¬p»pØpôpq qq%qBq^qnqsq­qÄqØqÝqôqr r$r8r=rTrhrmr„r˜r�r¹rÞrss-sAs¾XÁÔ¢i«iÀiÒiïij*j>jPj_jzj¦j¼jÆjÜj¿<´À¹hÂhÖhçhi;idieixiŒi–iÀMQ”…�…Ä…ÁFaVakaÂd_u„.›.¶.Ä.Ó.á.ÿ.//)/6/d/t/—/¤/»/Ï/Ã\J^c-z-•-§-µ-Ä-Ò-Ø-î-2.A.N.T.h.v.Ä %*V+_+„+³+Å”$¤(´(Ï(ã(÷()!)4)C)L)k)�)—)Ì)ü)%*D*T*d*x*®*Ù*++"+I+ÆP8Ie,|,—,¥,´,¾,Ý,ï,--!-1-F-U-Çhv�Ý/ô/00)080F0`0q0ˆ0•0¦0º0Ê0Ú0ù0ÿ01!1È<+7¿+Ï+ê+ø+,,,3,I,X,É<¦²T¿d¿{¿œ¿¹¿Ö¿ó¿À-ÀJÀÊ]a„†�†´†ËHET +¹¹'¹>¹U¹i¹Š¹¡¹³¹Ë¹ê¹ºÌ@anκ׺뺻»1»I»[»z»–»Íð[ÔPagaxaœaÊaÖaýab2bFbgbˆb¥bòbc)c=cYc†c–cœc´cÄcßcøcd=dTdjdŒd¼dÜdùde*eRee’e¢eÀeÈeîeòe-f2fRfrf’f¸fÉfÜfýf-gVgggzgœgÍgÒgågh8hEhph‚h®hÀhêh +ii'i,iDiti„iŠiªi½iÕiöi#j3j9jQjaj|j‘j«jÇjâjþjk+k9kÎ`œ±ëÉÊÊ:ÊNÊ`ÊoʃʤʪʵÊÁÊÙÊËLËaËnËÏ@Ž›ÉÉ4ÉHÉYÉgÉ{ɜɽÉÐÉÝÉÐhY>óGóaó{ó•ó¯óÉóãóýóô1ôKôeôô™ô³ôÍôçôõõ5õOõiõƒõ�õ·õÑõëõö ö9öSömö‡ö¡ö»öÕöïö ÷#÷=÷W÷q÷Ñ<6hMhSh`hyh‹h”h¥h¼hÑhÒ$æKýKL2L^LÓ$06NN.NYNfNÔ08AÔë$7DÕ@O\wَ٤ٹÙÒÙìÙÿÙÚÚ-Ú:ÚÖ ïÿ5 O ×ô"\.ÃEÃoÀâåÿÃÏÃçÃüÃÄÄ$ÄuÄ�Ä…ÄÃÄÏÄÓÄ ÅÅ(Å+ÅAÅYÅkÅpňŋšŦÅÀÅÅÅØÅôÅùÅ&ÆLÆSÆ[ÆdÆwƞƺÆÌÆØ �†{È’ÈÆÈÙÜ A—J®J¿JãJõJKK+K@KEKJKgK”K·KâKLLOLdLyL‘L©LÁLÖLÜLñLMM0MHM\MpM…M¯MÃM×MéMöMNÚ€³Ðûxyy,y>y]ysy‡y¦yÅyÝy +z&zTzgzšzÈzàzýz{d{ÛT ²_whw”wÁwÝw xxQxx—x´xÇxïxÜdrˆ¸8È8Ö8à8í8û8"939Y9r9‰9¡9µ9Â9Ç9Ì9Ý0LU³¦¼¦Ý¦!§^§Þ˜n‘À#À5ÀwÀ…À­À»ÀÚÀ÷ÀÁ%Á<ÁKÁ†Á Á¯ÁêÁ Â.Âw‹Â�¨ÂËÂàÂôÂÃߤ’¸&Ã/ÃAÃÑùÃÇÃæÃÄ"Ä:ÄWÄhÄÄŽÄÉÄãÄòÄ-ÅCÅcÅqźÅÎÅÓÅëÅÆ#Æ7ÆGÆàdvŒA"Q"h"q"“"¤"©"¿"Ö"##*#V#j#|#‰#›#§#á¼JÚ–ñ–—2—?—â$17�è¦è´èëèùèã¼Ä0uÛ~Û¼ÛÐÛþÛ&ÜEÜS܋ܺÜÑÜýÜb݄ݵÝÒÝæÝÞ%Þ7ÞHÞƒÞÆÞÒÞUßZߥßÖß'à\à¼àÐàáàøàá8áUá¯á×áùá(âEâtâˆâ¥âªâÎâòâã>ã—ãµãÖã÷ã"ä6äMädäiä•ä¦äáädåyå~å§å¬åµå=æNæ‰æ ççç5ç¸çÍçòçèè2è7èOèrèèäÔмCZl€—§ËÝ %U[uŠ ´Ââ2f‡�¨½× 9Mq€”¨±¾ÄÑå$"(MM]\]z]”]�]¢]¨]¼]Á]Þ]^^ ^,^s^~^–^Á^ó0ˆ‘H_pž±ôdq‡ÇÞïþ GLkpx|«°Ïâõ 27¤­ÇöX¾ÑÏ^æ^÷^_'_<_O_Y_z_�_³_½_Õ_á_ ``7`÷ ˆ�ÐÈàÈ÷Èølmá„£Æ×èúY}¯Ü 5btŒÈù|4e£|£Š£ž£¯£Ä£Ü£ô£ ¤¤1¤B¤Œ¤¦¤Ì¤Í¤â¤¥¥2¥H¥a¥f¥p¥}¥ú\Ýñ + ! 5 F T e w ‰ ¡ » ¼ à ö ¡¡¡+¡û˜ó9¡P¡d¡¡‘¡Ÿ¡°¡Â¡Ú¡õ¡¢1¢>¢C¢t¢�¢£¢¤¢È¢Þ¢÷¢ü¢£ £££-£:£ü( 33393F3 3¯3ý( +½3Ô3Ú3ç3A4P4þŒ‚¢ô†ý†‡)‡7‡_‡m‡�‡ˆ:ˆ^ˆyˆ ˆ±ˆňâˆúˆ=‰^‰r‰†‰˜‰³‰Û‰à‰ø‰Š)Šÿpާ/1F1a1o1~1Œ1�1¸1Ä1õ122.282N22‹2ß2ð2ú2xœ·0®9®G®c®‹®™®ó®b¯¯„¯Ô¯3°`°�°¥°ª°ŰÒ°å°ê°±%±6±$×Ý©{²{Ç{W|k|(Þåw|€|”|§|À|Ð|,}…FˆOˆXˆjˆ|ˆ�ˆœa…ØOïOPP3PWP�P•P¦P²PÐPõPLQ]QlQ‹Q¨QµQÒQæQúQ(RPR–R¬RÀRÒRõRS/SBSUSiSô6Øï(9=To¿ëý#'Sns™Çäè!-D”®þ9Pj¾Ø(1~‹�ª®É  ) = N _ z � Á Ó â ö  +  ôºôiÆrƃƮÆÖÆäÆèÆÿÆÇÇÇ2ÇGÇbÇgÇ�Ç�ÇÙÇÝÇÈHÈȟȽÈûÈÉaÉrÉvɩɭÉÏÉ×ÉçÉÊÊ"Ê6Ê;ÊcÊgÊŠÊŽÊÁÊÕÊøÊùÊËüö2 Ë)Ë:ËeË�˛˟˶˺ËÎËÒËéËÌÌ ÌHÌV̖̹̒ÌÍ8ÍXÍvÍ´ÍÎÍæÍ&Î@ÎŒÎ�ΡÎÔÎØÎúÎÏÏ-Ï2ÏMÏaÏfώϒϵϹÏìÏÐ#Ð$Ð0Ð<'3Öaßaóaôab"bJbb‰b™b  7<; R z  +@ +í“ý“*”P”i”z”Ž” ”¸” P]nHÚ_ÚoÚÚ¸ÚÓÚçÚìÚÛÛ&Û Lo4ÛKÛiÛ§ÛµÛÕÛêÛùÛþÛÜ Ü.Ü !¶ÍíTå÷�¦µÅò)M’³Éõ<Ûò /bg�Ÿ­œ€¤<ÜSÜcÜ…Ü–Ü©ÜÂÜÜÜÝÝ<Ý@ÝGÝ]ÝhÝmÝ„Ý�ݴݸݿÝÕÝàÝîÝûÝx¢½ƒ@“@ž@°@Ä@â@ó@ø@aAA„A‰A¨A¼AêAB)BGBvB‚BX”§ˆ Ÿ à ×  +  ( H M u Š ¦ ³ Æ Ø $ÐÖ^­g­l­}­‚­´Ëõ¦w¶wÇwäw x x6xDxgx}xªxìxýx7yYy^y�y¾yáyïyz&z3zjzyz•zÖzîzD{N{4BLKm[m‚mœm°mÈmþmLèøV§f§§š§±§Ö§ê§þ§¨¨)¨=¨O¨mqt‡}‡§‡,&xa�a•a–a«aÀaÊa0%.6ƒ?ƒSƒ�ƒžƒ£ƒÁƒËƒœ8\0DXekr…аÄÊÑ-@P†¥Ñ*07;OTYL/?׃àƒôƒ„„%„L„M„`„t„�„ „ª„Á„´ºäýËÌÌBÌRÌbÌvÌ�̢̮ÌÌÌÚÌøÌýÌÍÍ;ÍOÍTÍ}ͯ͢ÍÊÍÏÍàÍ Î5ÎIÎz΋ΞμÎÑÎãΜ·Û½�Ô�è�ù� ž!ž2ž=žPžcžyž•žÃžåžòžŸ,ŸPŸhŸiŸ›Ÿ®Ÿ»ŸÏŸÙŸæŸ(N+ÒBÒHÒ[ÒÐÒÞÒéÒ +Ó�Ó�Ó¹ÓÊÓuÔ~Ô—ÔœÔÛÔùÔ Õ+Õ1Õ7ÕGÕeÕ‹Õ©Õ¼ÕÊÕÞÕóÕºÖÔÖìÖ××;×W×v×�×É×ìר'Ø>ØzØ�Ø»ØÚØñØÙ%ÙCÙ[ÙiÙ $kqOdXdldzd‹d (ÈÏ­­­,­=­B­!uyç‡ð‡ˆ"0BK'N>NZNaNxN§N´N#im8‡A‡h‡$X]pg~’£·ÅÓê.X]nŽœ%,em@ÇWÇmÇpǃǕÇ&,nv£ÇºÇÐÇÓÇøÇ +È',wÈ/ÈEÈHÈ[ÈmÈ(8_jyc‚c“c²cÈcÞcþcd&dCd)P‚“U +l +� +¤ +× +ì +õ +ÿ +' < I \ n *�åñÎÏKÏcωϣÏÏÏÐ#ÐEÐfИЫÐÙÐÞÐÑÑ3ÑUÑvѨѻÑÔÑÙÑìÑÒÒ+=�M�b�, #o��”�-D ß²ï² +³)³E³†³Â³í³e´v´.|9´´Ä´ß´ú´-µHµ\µ”µ¥µýµ¶I¶N¶_¶·¶Î¶··.·\·›·Ù·¸9¸Y¸/,¸ÀB±Y±…±’±¤±¶±ű0(æíÜ|å|!}G}\}1(]dÚÆêÆüÆ ÇÇ2`$ßhöhüh(i5iRi[iriwi™iªi¶iÍißiñijj34v��€�‰���©�Ø�ç�ì�40¾Çq¬�¬†¬«¬¼¬Ï¬ß¬5�£Ä1Š:ŠTŠbŠŠŠ˜Š¬ŠÇŠñŠ‹¬‹Ê‹î‹ÿ‹Œ0ŒPŒ“Œ´ŒÈŒÜŒîŒ �1�6�N�q��6LQavÒÒ�Ò’ÒºÒÈÒíÒ\ÓpÓuÓ�Ó°ÓÁÓ7LºÊ’v©vÀvÑvévøvwAw^w{w€w˜w8x¥À Þ Þ.ÞJÞQÞcÞwÞ|Þ”Þ¦Þ«ÞÆÞÞÞñÞß#ß5ß:ßLßfß~߃ß9lÁÙ‘ߨ߹ßÏß÷ßà à0àHàaàràwà|à�à¥à¯àÇàÚàéà:(­ôúUV%VIVdVxV”V£VÍVÕVèVòV.W ˆ�''Q'?0luåü < [ n � @(¹Àâ ù ;NA$ʱӱ걂²Ó²BHfÁoÁ�Á›ÁºÁÑÁïÁüÁÂ6ÂBÂGÂC, +p•‡•Ÿ••ՕD, ã•ú•–F–Y–E0g–~–––¹–Ì–Fxr�“dœd°däd eDete‘e®eÊeæef fff&f4fHf\fsfxf�f†f \ No newline at end of file diff --git a/LT/OSMain/OSINC.ASZ b/LT/OSMain/OSINC.ASZ new file mode 100644 index 0000000..89a3e7e --- /dev/null +++ b/LT/OSMain/OSINC.ASZ @@ -0,0 +1,287 @@ + STRUC 0 +SF_EBP: DU4 ?; +SF_EIP: DU4 ?; +SF_PARAM1: DU8 ?; +SF_PARAM2: DU8 ?; +SF_PARAM3: DU8 ?; +SF_PARAM4: DU8 ?; +SF_PARAM5: DU8 ?; +SF_PARAM6: DU8 ?; +SF_PARAM7: DU8 ?; +SF_PARAM8: DU8 ?; + ENDS + + STRUC 0 +SFI_EBP: DU4 ?; +SFI_EIP: DU4 ?; +SFI_CS: DU4 ?; +SFI_FLAGS: DU4 ?; +SFI_PARAM1: DU8 ?; +SFI_PARAM2: DU8 ?; +SFI_PARAM3: DU8 ?; +SFI_PARAM4: DU8 ?; +SFI_PARAM5: DU8 ?; +SFI_PARAM6: DU8 ?; +SFI_PARAM7: DU8 ?; +SFI_PARAM8: DU8 ?; + ENDS + + STRUC 0 +NULL_SEL: DU4 ?,?; +SYS_BOOT_DS_SEL: DU4 ?,?; +SYS_BOOT_CS_SEL: DU4 ?,?; +SYS_CS_SEL: DU4 ?,?; +ZERO_DS_SEL: DU4 ?,?; +//ADAM_TSS_SEL: DU4 ?,?; +FIRST_FREE_SEL: + ENDS + + + STRUC 0 +EXCEPT_NEXT: DU4 ?; +EXCEPT_LAST: DU4 ?; +EXCEPT_HANDLER_START: DU4 ?; +EXCEPT_HANDLER_SKIP: DU4 ?; +EXCEPT_ESP: DU4 ?; +EXCEPT_EBP: DU4 ?; +EXCEPT_ESI: DU4 ?; +EXCEPT_EDI: DU4 ?; +EXCEPT_STRUCT_SIZE: + ENDS + + STRUC 0 +MB_NEXT: DU4 ?; +MB_LAST: DU4 ?; +MB_SIZE: DU4 ?; +MB_STRUCT_SIZE: + ENDS + + STRUC 0 //AVAILABLE TO MALLOC MEM +UUM_NEXT: DU4 ?; +UUM_SIZE: DU4 ?; +UUM_STRUCT_SIZE: + ENDS + +#define USED_USER_MEM_SIZE -4 + + + STRUC 0 +BPT_NEXT:: DU4 ?; +BPT_FLAGS:: DU4 ?; +BPT_ADDRESS:: DU4 ?; +BPT_U1:: DU1 ?; + ENDS + + STRUC 0 +TSS_BACK_LINK: DU4 ?; +TSS_ESP0: DU4 ?; +TSS_SS0: DU4 ?; +TSS_ESP1: DU4 ?; +TSS_SS1: DU4 ?; +TSS_ESP2: DU4 ?; +TSS_SS2: DU4 ?; +TSS_CR3: DU4 ?; +TSS_EIP: DU4 ?; +TSS_EFLAGS: DU4 ?; +TSS_EAX: DU4 ?; +TSS_ECX: DU4 ?; +TSS_EDX: DU4 ?; +TSS_EBX: DU4 ?; +TSS_ESP: DU4 ?; +TSS_EBP: DU4 ?; +TSS_ESI: DU4 ?; +TSS_EDI: DU4 ?; +TSS_ES: DU4 ?; +TSS_CS: DU4 ?; +TSS_SS: DU4 ?; +TSS_DS: DU4 ?; +TSS_FS: DU4 ?; +TSS_GS: DU4 ?; +TSS_LDTR: DU4 ?; +TSS_TASK_SWITCH_EXCEPT: DU2 ?; +TSS_IO_BITMAP_PTR: DU2 ?; +TSS_IO_BITMAP: DU1 (MAXIO/8) DUP (?); + +TSS_TASK_DESCRIPTOR: DU1 (TSS_DESC_LENGTH+1) DUP (?); + +TSS_UPDATE_WINDOW: DU4 ?; +TSS_CUR_LTF: DU4 ?; +TSS_AUX_LTF: DU4 ?; +TSS_EDIT_PLUGINS: DU4 ?; +TSS_SCROLL_SPEED: DU4 ?; +TSS_CRT_WIDTH: DU4 ?; +TSS_CRT_HEIGHT: DU4 ?; +TSS_TEXT_ATTRIBUTE: DU1 ?; +TSS_BORDER_ATTRIBUTE: DU1 ?; + DU2 ?; //Unused +TSS_WINDOW_LEFT: DU4 ?; +TSS_WINDOW_RIGHT: DU4 ?; +TSS_WINDOW_TOP: DU4 ?; +TSS_WINDOW_BOTTOM: DU4 ?; +TSS_CURSOR_HOR: DU4 ?; +TSS_CURSOR_VERT: DU4 ?; + +TSS_WINDOW_PIXEL_LEFT: DU4 ?; //These are derived +TSS_WINDOW_PIXEL_RIGHT: DU4 ?; +TSS_WINDOW_PIXEL_TOP: DU4 ?; +TSS_WINDOW_PIXEL_BOTTOM: DU4 ?; + +TSS_SCROLL_X: DU4 ?; +TSS_SCROLL_Y: DU4 ?; + +TSS_CRT_FLAGS: DU4 ?; + +TSS_ABSOLUTE_ADDRESS: DU4 ?; +TSS_PARENT_TSS: DU4 ?; +TSS_NEXT_TSS: DU4 ?; //ABSOLUTE ADDRESS OF NEXT TSS +TSS_LAST_TSS: DU4 ?; //ABSOLUTE ADDRESS OF LAST TSS +TSS_INPUT_FILTER_TSS: DU4 ?; +TSS_NEXT_SIBLING_TSS: DU4 ?; +TSS_LAST_SIBLING_TSS: DU4 ?; +TSS_NEXT_CHILD_TSS: DU4 ?; +TSS_LAST_CHILD_TSS: DU4 ?; +TSS_FPU: DU1 108 DUP(?); +TSS_WINDOW_BORDER_PIXEL_LEFT: DU4 ?; //These are derived +TSS_WINDOW_BORDER_PIXEL_RIGHT: DU4 ?; +TSS_WINDOW_BORDER_PIXEL_TOP: DU4 ?; +TSS_WINDOW_BORDER_PIXEL_BOTTOM: DU4 ?; +TSS_TASK_FLAGS: DU4 ?; +TSS_STACK_BASE: DU4 ?; +TSS_NEXT_MEM_BLK: DU4 ?; +TSS_LAST_MEM_BLK: DU4 ?; +TSS_HEAP_HASH: DU1 HEAP_HASH_SIZE DUP (?); +TSS_MALLOC_FREE_LIST: DU4 ?; +TSS_NEXT_EXCEPT: DU4 ?; +TSS_LAST_EXCEPT: DU4 ?; +TSS_EXCEPT_EBP: DU4 ?; +TSS_EXCEPT_ARGC: DU4 ?; +TSS_EXCEPT_ARGV: DU4 ?; +TSS_CATCH_EXCEPT: DU4 ?; +TSS_BPT_LIST: DU4 ?; +TSS_NEXT_ODE: DU4 ?; +TSS_LAST_ODE: DU4 ?; +TSS_HASH_TABLE: DU4 ?; +TSS_ACCOUNT: DU4 ?; +TSS_OPTIMIZATION: DU4 ?; +TSS_NEXT_SERVANT_CMD: DU4 ?; +TSS_LAST_SERVANT_CMD: DU4 ?; +TSS_NEXT_MASTER_CMD: DU4 ?; +TSS_LAST_MASTER_CMD: DU4 ?; +TSS_NEXT_LEX: DU4 ?; +TSS_LAST_LEX: DU4 ?; + +TSS_CUR_PARTITION: DU4 ?; +TSS_CUR_DIR: DU4 ?; + +TSS_END_TASK_CB: DU4 ?; +TSS_USER_NUM: DU4 ?; +TSS_ANSWERS: DU8 8 DUP(?); +TSS_DOUBLE_ANSWERS: DU8 8 DUP(?); +TSS_ANSWERS_TYPES: DU4 8 DUP(?); +TSS_ANSWERS_DISPLAYED: DU4 ?; +TSS_DBG: DU4 ?; +TSS_POPUP: DU4 ?; +TSS_RMTCHNL: DU4 ?; +TSS_USER_AUX0: DU4 ?; +TSS_USER_AUX1: DU4 ?; +TSS_USER_AUX2: DU4 ?; +TSS_USER_AUX3: DU4 ?; +TSS_STRUCT_SIZE: + ENDS + STRUC 0 +HT_NEXT: DU4 ?; +HT_MASK: DU4 ?; +HT_BODY: + ENDS + + STRUC 0 +HTE_NEXT: DU4 ?; +HTE_STRING: DU4 ?; +HTE_TYPE: DU4 ?; +HTE_USE_CNT: DU4 ?; +HTE_SOURCE_LINK: DU4 ?; +HTE_DEBUG: DU4 ?; +HTE_USER0: DU4 ?; + ENDS + + STRUC 0 +SP_EDI: DU4 ?; +SP_ESI: DU4 ?; +SP_EBP: DU4 ?; +SP_ESP: DU4 ?; +SP_EBX: DU4 ?; +SP_EDX: DU4 ?; +SP_ECX: DU4 ?; +SP_EAX: DU4 ?; +SP_STRUCT_SIZE: +SP_EIP: DU4 ?; +SP_PARAM1: DU8 ?; +SP_PARAM2: DU8 ?; +SP_PARAM3: DU8 ?; +SP_PARAM4: DU8 ?; +SP_PARAM5: DU8 ?; +SP_PARAM6: DU8 ?; +SP_PARAM7: DU8 ?; +SP_PARAM8: DU8 ?; +SP_PARAM9: DU8 ?; +SP_PARAM10: DU8 ?; +SP_PARAM11: DU8 ?; +SP_PARAM12: DU8 ?; + ENDS + + STRUC 0 +C_HASH_NEXT: DU4 ?; +C_HASH_STRING: DU4 ?; +C_HASH_TYPE: DU4 ?; +C_USE_CNT: DU4 ?; +C_SOURCE_LINK: DU4 ?; +C_DEBUG: DU4 ?; +C_MEM_CNT: DU2 ?; +C_PARAM_CNT: DU2 ?; //FOR FUNCTIONS +C_SIZE: DU4 ?; //Must be in same position as HTE_USER1 +C_MEM_LIST: DU4 ?; //MEMBER LIST +C_MEM_LIST_LAST: DU4 ?; +C_STATEMENTS: DU4 ?; //For functions + ENDS + + STRUC 0 +IC_CODE: DU4 ?; +IC_FLAGS: DU4 ?; +IC_DATA: DU8 ?; +IC_CLASS: DU4 ?; +IC_LINE: DU4 ?; +IC_STRUCT_SIZE: + ENDS + + STRUC 0 +ATE_NEXT: DU4 ?; +ATE_BASECODE: DU2 ?; +ATE_CH: DU1 ?,?; +ATE_STRUCT_SIZE: + ENDS + + STRUC 0 +ACS_SRC_SIZE: DU8 ?; +ACS_SRC_POS: DU8 ?; +ACS_SRC_BUF: DU4 ?; +ACS_DST_SIZE: DU8 ?; +ACS_DST_POS: DU8 ?; +ACS_DST_BUF: DU4 ?; +ACS_MIN_BITS: DU4 ?; +ACS_MIN_TABLE_ENTRY: DU4 ?; +ACS_CUR_ENTRY: DU4 ?; +ACS_CUR_BITS_IN_USE: DU4 ?; +ACS_NEXT_ENTRY: DU4 ?; +ACS_NEXT_BITS_IN_USE: DU4 ?; +ACS_STACK_PTR: DU4 ?; +ACS_STACK_BASE: DU4 ?; +ACS_FREE_INDEX: DU4 ?; +ACS_FREE_LIMIT: DU4 ?; +ACS_SAVED_BASECODE: DU4 ?; +ACS_ENTRY_USED: DU4 ?; +ACS_LAST_CH: DU1 ?,?,?,?; +ACS_COMPRESS: DU8 ARC_MAX_TABLE_ENTRY+1 DUP(?); +ACS_HASH: DU4 ARC_MAX_TABLE_ENTRY+1 DUP(?); +ACS_STRUCT_SIZE: + ENDS + diff --git a/LT/OSMain/OSMAIN.ASZ b/LT/OSMain/OSMAIN.ASZ new file mode 100644 index 0000000..622bc37 --- /dev/null +++ b/LT/OSMain/OSMAIN.ASZ @@ -0,0 +1,360 @@ + USE16 + JMP U2 J_START2 +////**************************PROCEDURE************************* +// ASM Global variables required for 16-bit start-up + ALIGN 4,0x90 +SYS_BOOT_BASE:: DU4 ?; //Fixed offset from start used by reboot_J +SYS_BOOT_HEADER_BASE:: DU4 ?; +OS_32START:: DU4 INIT_OS; + + ALIGN 16,0x90 +GDTTAB:: DU1 MAXGDT*8 DUP(0); +SYS_BOOT_CODE:: DU4 0xFF; +SYS_MEMBLKS:: DU4 0; +FREE_GDT_LIST:: DU4 0; +ADAM_TSS:: DU1 TSS_STRUCT_SIZE DUP(0); +SYS_TEMP_PTR:: DU4 0,0; + +////**************************PROCEDURE************************* +//EBX is SYS_BOOT_CODE (value passed from boot blk) +J_START2:: + MOV AX,(0xA0000-2*BLK_SIZE)/16 + MOV SS,AX + MOV SP,2*BLK_SIZE + PUSH EBX //will be SYS_BOOT_CODE + MOV AX,0xB800 + MOV ES,AX + MOV U4 ES:[0],('L'+0xF000)+0x10000*('T'+0xF000) + MOV U4 ES:[4],0 + MOV ECX,1200000 //Delay + CALL BUSY_WAIT + + CALL U2 GET_IP +GET_IP: + POP BX + SUB BX,GET_IP + SHR BX,4 + MOV AX,CS + ADD AX,BX + PUSH AX + PUSH U2 J_START3 + RETF +J_START3:: +//XSUM OSMain + MOV AX,CS + DEC AX + MOV DS,AX + XOR ESI,ESI + MOV ECX,U4 8[ESI] //Get length + SHR ECX,4 + MOV EBX,LT_XSUM +@@2: LODSD + XOR EBX,EAX + LODSD + XOR EBX,EAX + LODSD + XOR EBX,EAX + LODSD + XOR EBX,EAX + XOR ESI,ESI + MOV AX,DS + INC AX + MOV DS,AX + LOOP @@2 + MOV U4 ES:[4],'O'+65536*'K'+0xF000F000 + OR EBX,EBX + JZ J_CONT_START + +//XSUM Error + MOV U4 ES:[4],'X'+65536*'M'+0xF000F000 +@@3: JMP @@3 + +BUSY_WAIT:: + MOV DX,0x379 //Par Port +@@1: IN AL,DX + DEC ECX + JNZ @@1 + RET +////**************************PROCEDURE************************* +J_CONT_START: + STI +//Enter Graphics Mode +exe { + I8 ch,video_mode; + do { + CrLf; + coutln "1) VGA 640x480x16"; + coutln "2) SVGA 800x600x16--not supported by all computers"; + cout "Video Mode:"; + ch=GetChar; + } while (ch<'1' || ch>'2'); + video_mode=ch-'0'; + switch (video_mode) { + case 1: + ExePutS("MOV AX,0x12"); + break; + case 2: + ExePutS("MOV AX,0x6A"); + break; + } +} + INT 0x10 //ENABLE VGA + +//Get memory map + MOV AX,0xE801 + INT 0x15 + MOV AX,CS + MOV DS,AX + ADD DX,0x101 + MOV U2 [SYS_MEMBLKS+2],DX + + CLI + +//Enable A20 + IN AL,0x92 + OR AL,2 + OUT 0x92,AL + + CLD //Start with known registers + MOV AX,CS + MOV DS,AX + MOV ES,AX + MOV FS,AX + MOV GS,AX + XOR EAX,EAX + XOR EBX,EBX + XOR ECX,ECX + XOR EDX,EDX + XOR ESI,ESI + XOR EDI,EDI + XOR EBP,EBP + + XOR EAX,EAX + MOV AX,CS + SHL EAX,4 + MOV U4 [SYS_BOOT_BASE],EAX + + POP U4 [SYS_BOOT_CODE] + + MOV BX,CS + DEC BX + MOV GS,BX + MOV EBX,U4 GS:[4] + ADD EAX,EBX + SUB EAX,16 + MOV U4 [SYS_BOOT_HEADER_BASE],EAX + + MOV U4 [GDTTAB+SYS_BOOT_DS_SEL],0x000FFFF + MOV U4 [GDTTAB+SYS_BOOT_DS_SEL+4],0x0CF9200 + MOV U4 [GDTTAB+SYS_BOOT_CS_SEL],0x000FFFF + MOV U4 [GDTTAB+SYS_BOOT_CS_SEL+4],0x0CF9A00 + MOV EAX,U4 [SYS_BOOT_BASE] + ADD U4 [GDTTAB+SYS_BOOT_DS_SEL+2],EAX + ADD U4 [GDTTAB+SYS_BOOT_CS_SEL+2],EAX + + // SETUP POINTER TO LIMIT AND BASE + //OF GDT. USE ENTRY (0) BECAUSE IT IS + //INVALID. + MOV U2 [SYS_TEMP_PTR],MAXGDT*8-1 + MOV EAX,U4 [SYS_BOOT_BASE] + ADD EAX,GDTTAB+NULL_SEL + MOV U4 [SYS_TEMP_PTR+2],EAX + MOV U2 [SYS_TEMP_PTR+6],0 + +// LGDT FU2 SYS_TEMP_PTR + DU1 0x67,0x0F,0x01,0x15; + DU4 SYS_TEMP_PTR; + +// MOV EAX,CR0 //ENTER PROTECTED MODE!! + DU1 0x0F,0x20,0xC0; + + OR AL,1 + + +// MOV CR0,EAX + DU1 0x0F,0x22,0xC0; + + DU1 0x66,0xEA; //JMP SYS_CS_SEL:INIT_OS + DU4 INIT_OS; + DU2 SYS_BOOT_CS_SEL; +////**************************PROCEDURE************************* +// ASM Global variables not required for 16-bit start-up + ALIGN 8,0x90 +IDTTAB:: DU1 MAXIDT*8 DUP(0); +SYS_HEAP_BASE:: DU4 0x100000; +SYS_HEAP_LIMIT:: DU4 0; + +exe { + ExePrintF("SYS_GRMODE:: DU4 %d;",video_mode); +} +SYS_GRWIDTH:: DU4 ?; +SYS_GRHEIGHT:: DU4 ?; + +SYS_FLAGS:: DU4 0x8; //RAW_CRT_OUT=8 +SYS_IRQ_FLAGS:: DU4 0; +SYS_IRQ_BUSY_FLAGS:: DU4 0; +SYS_TEXTBASE:: DU4 0; +SYS_GRBASE:: DU4 0; +SYS_GRBASE2:: DU4 0; +SYS_CUR_RAW_SCAN_CODE:: DU4 0; +SYS_CUR_SCAN_CODE:: DU4 0; +SYS_EXTERN_TABLE:: DU4 0; +MEM_FREE_LIST:: DU4 0; +FREE_PAGE_HASH:: DU4 FREE_PAGE_HASH_SIZE DUP(0); +FREE_PAGE_HASH2:: DU4 32 DUP(0); +PROGRESS1:: DU8 0; +PROGRESS2:: DU8 0; +PROGRESS3:: DU8 0; +PROGRESS4:: DU8 0; +SYS_SWAPS_CNTER:: DU4 0; +SYS_CUR_FOCUS_TASK:: DU4 0; + + +////**************************PROCEDURE************************* + ALIGN 16,0x90 + USE32 +INIT_OS:: + MOV AX,SYS_BOOT_DS_SEL //LOAD DS SELECTOR + MOV DS,AX + MOV ES,AX + + MOV U4 [GDTTAB+ZERO_DS_SEL],0x0000FFFF + MOV U4 [GDTTAB+ZERO_DS_SEL+4],0x00CF9200 + MOV U4 [GDTTAB+SYS_CS_SEL],0x0000FFFF + MOV U4 [GDTTAB+SYS_CS_SEL+4],0x00CF9A00 + +//INIT FREE GDT ENTRIES + MOV U4 [FREE_GDT_LIST],0 + MOV ECX,MAXGDT-FIRST_FREE_SEL/8 + MOV EAX,FIRST_FREE_SEL +@@3: MOV EBX,U4 [FREE_GDT_LIST] + MOV U4 GDTTAB[EAX],EBX + MOV U4 [FREE_GDT_LIST],EAX + ADD EAX,8 + LOOP @@3 + +//Patch absolute addresses + MOV ESI,U4 [SYS_BOOT_HEADER_BASE] + MOV EDI,U4 [SYS_BOOT_BASE] + MOV AX,ZERO_DS_SEL + MOV DS,AX + MOV ES,AX + MOV ECX,U4 1[ESI] + LEA ESI,U4 1+4+1[ESI] +@@10: LODSD + ADD EAX,EDI + ADD U4 [EAX],EDI + LOOP @@10 + + MOV AX,ZERO_DS_SEL + MOV DS,AX + MOV ES,AX + MOV FS,AX + MOV GS,AX + MOV SS,AX + MOV ESP,0x800000 //TEMP + + DU1 0xEA; //JMP SYS_CS_SEL:CONT_INIT_OS + DU4 CONT_INIT_OS; + DU2 SYS_CS_SEL; + +CONT_INIT_OS:: + MOV U4 [SYS_HEAP_BASE],0x100000 + CALL INIT_MEM + +//INIT INTERRUPT TABLE + MOV ECX,MAXIDT + MOV EDI,IDTTAB + MOV ESI,IRQ_VECTORS +@@1: LODSW + STOSW + MOV AX,SYS_CS_SEL + STOSW + MOV AX,0x8E00 //E=32-bit irq gate + STOSW + MOVSW + LOOP @@1 + + MOV U2 [SYS_TEMP_PTR],MAXIDT*8-1 + MOV U4 [SYS_TEMP_PTR+2],IDTTAB + MOV U2 [SYS_TEMP_PTR+6],0 +// LIDT FU2 SYS_TEMP_PTR + DU1 0x0F,0x01,0x1D; + DU4 SYS_TEMP_PTR; + +//INIT SYSTEM TSS + PUSH 0 + PUSH DEFAULT_STACK + PUSH 0 + PUSH ADAM_TSS + CALL CP_INIT_TSS+4 + ADD ESP,16 + MOV FS,AX + MOV ESP,U4 FS:[TSS_ESP] + + CALL INIT_FLOATING_CONSTANTS + + JMP U4 CP_OS_MAIN+4 + +////**************************PROCEDURE************************* +CP_REBOOT:: + MOV EAX,ZERO_DS_SEL + MOV ES,AX + MOV U2 ES:[0x472],0 + + MOV AL,0x8F + OUT 0x70,AL + OUT 0xEB,AL + MOV AL,0 + OUT 0x71,AL + OUT 0xEB,AL + MOV AL,0 + OUT 0x70,AL + OUT 0xEB,AL + + IN AL,0x92 + OR AL,1 + OUT 0x92,AL + OUT 0xEB,AL +@@100: JMP @@100 + + +////**************************PROCEDURE************************* +FC_1:: DU8 0; +FC_PI:: DU8 0; +FC_PI2:: DU8 0; +FC_E:: DU8 0; +FC_LOG2_10:: DU8 0; +FC_LOG2_E:: DU8 0; +FC_LOG10_2:: DU8 0; +FC_LOGE_2:: DU8 0; +INIT_FLOATING_CONSTANTS:: + PUSH EBP + MOV EBP,ESP + SUB ESP,8 + FLD1 + FSTP U4[FC_1] + FLDPI + FSTP U4[FC_PI] + FLDPI + FLDPI + FADDP + FSTP U4[FC_PI2] + FLDL2T + FSTP U4[FC_LOG2_10] + FLDL2E + FSTP U4[FC_LOG2_E] + FLDLG2 + FSTP U4[FC_LOG10_2] + FLDLN2 + FSTP U4[FC_LOGE_2] + + FLD1 + FSTP U4 -8[EBP] + CALL CP_EXP + MOV U4 [FC_E],EAX + MOV U4 [FC_E+4],EDX + + ADD ESP,8 + POP EBP + RET diff --git a/LT/OSMain/QSORT.CPZ b/LT/OSMain/QSORT.CPZ new file mode 100644 index 0000000..812e50d --- /dev/null +++ b/LT/OSMain/QSORT.CPZ @@ -0,0 +1,29 @@ + +void QSort(U1 *base,U8 num, U8 width, U1 *compare) +{ //This uses a shell sort + I8 my_compare(U1 *elem1,U1 *elem2 ); + I8 span=num>>1,i; + U1 *b1,*b2,*temp=MAlloc(width); + BoolU4 cont; + + my_compare=compare; + while (span) { + cont=TRUE; + while (cont) { + cont=FALSE; + for (i=0;i+span0) { + MemCpy(temp,b1,width); + MemCpy(b1,b2,width); + MemCpy(b2,temp,width); + cont=TRUE; + } + } + } + span>>=1; + } + Free(temp); +} + diff --git a/LT/OSMain/SCHED.ASZ b/LT/OSMain/SCHED.ASZ new file mode 100644 index 0000000000000000000000000000000000000000..02f41f10b2e57af33e5857fbefb3e96a3eeca9bc GIT binary patch literal 5320 zcmdPb*Vos=2?B!ron2i*gIsZ{;N{|U^zn4}Cwo4fb$z0WtgoI73Yo+=8v5LxO|jUEO>f-GgI!xj23O!%!p~BVu)29V4*FIDurG zu*o=sWSp_dxPW9_u*n2_#_G5Rdt$N21tjBwO~xr8R>##TfR_uZ%Qe_j2gy^8PQm^@ zp&_pEjxH`iuEAjMxq*TNmfP|xiBZK21fuR!|8Jrd$5ajCW z8xZ0d=E}>(>E+Dn;9$th#px6h1X2wPz7WS?Z;?9^ zF(`B$989b@1N;LxUBRvfv%rxJW`UDekZTAp7u9n>kZW*=e-LUW@bq&AMFKdggToyI zg5#b2LR^DjshFf*kIdbB3^$Y-6=;i0i>EK|BNK&9c1gAf6DCz_|1%#x5ZCjjK}xN|-oBfWibUFY4kTAd zLWj$^fbu*<#wh^R1)x}g`wvwv7$gVL<%sGAN3a_pB?!zCd}RV!F#=AB;7E_fR_K7U z5n2g?SBrxKtmr^04G~2=xcESlaR!%+=%UaB>Pe-1sju(p$Eo1z;%N&C7>t@K$kjJ6 z)HNO?2dk$*r532Bf>l}0KAxbW1X?D7%Mox&fy6o}eSwl}d`NIGIAOyg5fb$vX&=Yn z5OnEK69teIicV-z2{IfijnE0MroeVXi*k&J0C^$a$J5U{INs4G#5KqjR^5V&K9Gm} z1K?FKq&%lm5TjTA;f?|Eo__HlzoAzC;E?2WcJ%S#1XYKy76L5993ymsJ^kXrt^y}_ zq_hG`70~tosOUzPfh1t4A;=QJplUiefR_toD%dqpMQ8;GND34`urdIY$&A3!;}#4q z4WZiHf^|SO2B_$U`7b`eF(||c>`Q3Xj1e!+AwfQ%7>Rdr1=U+#;5xuLAU?>|$=^Q& zoU#aNbqxj;pI&~T{ATphh3ZiDIN<-+tnG?GAd0?wk++tbGfTo!=*1@=Cu(FIPhAoqc?m^Q2t15FK_ zpwW)&15ms}Di%;V1@bwhp$X0qI^f2pkH52{4=lDo zi4&_KV7E9%=r{+&gB=SGKxi4~>KOnr6Vlwo8l2#?3yJ}7B8S8>*rVX6ad8C;JBC0c zKt)|>um`jl2djX~gR?p)%YYPtnuXxTApHUZT6p6OQj`RUBV$qCR`m^b2S;1Hv#(3M zi)*m66{kz6A*T{3U=*BvU6gbTtTAfJVC=;WI2r;_>Pm1;=?JQRKye>xqJS+8>KK5F zK9EjM15j*$qAb)z!Nt|hG1Mm{J~+hD*&8MfS75-&sjshJTAZqon39;QkeHmDUz%5f zU74ecqpw0{u|h#&Q7RTSp(Y9#;ecUKsELAe03xh>JpEk3=@*=;oCD$^fda}MU|~lW z7f#pU038z~&$)uTonU`LQaC73TtRgVG+=i4XVmbMX(4 z5Alx=@ej~4iFSoF`ao&cF#=j8f_qnpq6$9E_2GFf$>n#RYDbKpF>-Z~`}UKt2rigf@!2{6HN@Ly#ZA z;S=ns1BzczwGHZ&7#c$R5iT$dFjde}2AuK1O*C-7+rh!m1XMSHN@tvz5u}Jr(#H=L`o^3 z{xVn#s3-<`*$EuNme3H!*6am`DJQtM35qdr^g()pvC|KvDpY~I}Bb5BiDLp{spC6 zP}3VTAA*WKcx4Fo5ap!;TBpD{ARf&*L^>H9L!g2VTvJDY3I&%49cZD7>SzW4%5?E@ literal 0 HcmV?d00001 diff --git a/LT/OSMain/SPRINTF.CPZ b/LT/OSMain/SPRINTF.CPZ new file mode 100644 index 0000000000000000000000000000000000000000..83292d74f5be8da7cf8679c4e89fe6db059d8d34 GIT binary patch literal 6017 zcmeY?RL}|zD9X$$ar4U0%+mnzQ;JJ;Ky+GeiH@g5rb1#-dNP=yl~|Nsrpe1y&C8{r z08)`#8IPpdh#1}0AibGs3L2>uCDE=CA@RWhL7sjgZt-6Jo_?{K3ShGp6wpkz#i|-? zmV!c2YDsBP9=a9{kT*bH06QP-aN$nH{1OG9{KS;h6g?%VN~ooNp*}ufky>7^T3#+*uCn~h6b1KGq~I(rN+u#W z!TNG5<6&AMfk{9w*kpa8(*0TPX}VkYSj?1`8y3KtTf- zBjM=j>A}(&R0%kBVvSPNUYrB;Zz* znhN8AZAvW8Rj76jhz|%2iFfnycMP$rg{JO+(h|3v{KOKCl>E}9oK%GrSX4pXrKD^t>@ZtfY z+!~rq_4PwCGK&?8Q}a@a6-rVoNhgk5CH*xZ4yILW+x>b5nv#ib|796tqfGa|@Ee z@l&3WnUkuZq3Beip$2ked`WS!t{ups@o71U>BTxB!NF@RzV@SJh8wt z&o8wCQn-PQvJEUvElmwcEY1!}Ei6qfF42IQrQ=qtlT@0f1JSEtXk!x+9PFGHAMWVw z8t>~E9O4?J35rk!P~isE90ZOr4Y0{NY7kFA)X*XZQZkDRauO?3Q}m$e5ES@6`RSB~ zKdAh4D^|3Hg#rl4@X#lBTs1D1;y$1l1vspaQGFosCFNXmD?W%8(*x zf=kND%*)QqOGoy)Yf%veUWZ1s0w}u~+QRdul4`JOv1+gqOjJrRG)jt# zbqqi$%23AuNZP=yL9mkSch^NJM` zL7pnhEY1W~GoZ2#T>2skZIF6IF|B~Tj1I0WE=i?cDQ#;2E{}1Q)2OM-HW=g)4YlA( zP^s>dnU|`g6dV~G;_9mq;u!3$q~lf$iF)MXok}G;D1A}2Q1{Nv$pNKWh>Kx)6vBfx zhaq(UdL;`A18`(g9F?g>Wr=wup~b0`6n)_MgV(y`#V5ic&bcYjcy$d5bMy)I9M7nBx&Dtp_K;$pDN!PPBhMUD~O*s5@a8U?tpo4<2tFsy0^o9v!iLbzr}aTBO* z3D!z>+CVhGK<(%}1yG6Q25Rc$C6<&HrGlDe;1Uj$)zJ$%cx_l(k`HYIf*P8jwl3+V zIoKO$MKr7cLoc8~X&zh=fqQK*CxZ*xyu{p8SbG@c7!cpc)+IG9u{5W|wW1_7uQ)S5 zPXi>ZqvRMG1+73qWOkPe8ib=AS%0;@p| zm!aqDB8ack(y)0OGZ>r zGDsUJF2E^DE2X#u9A^p&ATc~iI4!?OK_k=Fz&g{$*4WTGQ(GIFK0%QK>Tg1=&eTMT zq2Q7tXV4HpafyzSHnb1}#T}A(0BEqqu>_G;G9f7imKMM%fjG+zbtt!7+ZdWsQS65{ zTvCcby<~9V3NF)KG(rs(Kn;7HPz#0Ryb@c33JU`rr~Le!P!omXjQsNW{Is;<)Dqi} zpioezsa8IVDxkOk849%*8bgo~ONAs|P}f~a0X8^^=vcuN=pZDsY&DYeO6&~HG!^U> z49%>P^FUq)#T`;yWFaL3m>JQTu}H>%6uZy9KNclDZ&07bB_Z5GtnByA`YmQ5iEA{SeV0M$I8m=Dg# mFIPZ~V;yk3Ly`a})4PDir*x9@N_5;DeS%#<4zA_pVgLX^x4g*! literal 0 HcmV?d00001 diff --git a/LT/OSMain/START.CPZ b/LT/OSMain/START.CPZ new file mode 100644 index 0000000..0f1745e --- /dev/null +++ b/LT/OSMain/START.CPZ @@ -0,0 +1,78 @@ +/**************** EXTERNS *********************/ +extern void PutSysText(I1 *name); +extern I1 *ReadTextFile(I1 *filename,U8 *attr=NULL); +extern void throw(...); +extern I1 *MSPrintF(I1 *src,...); +extern BoolU4 Cd(I1 *name,BoolU4 make_dirs=FALSE); +extern BoolU4 MkDir(I1 *filename); +extern void Msg(U8 code,U8 p1,U8 p2,U8 flags=0); +extern I1 PartitionToDrive(LTPartition *p=NULL); +extern BoolU4 RBlks(LTPartition *p,U1 *buf, U8 blk, U8 cnt,BoolU4 unlock); +extern BoolU4 WBlks(LTPartition *p,U1 *buf, U8 blk, U8 cnt,BoolU4 unlock); +extern void InvalidateDiskCache(LTPartition *p,BoolU4 unlock); +extern BoolU4 InitBlkDev(LTBlkDev *bd,BoolU4 unlock); +extern U8 AllocClusters(LTPartition *p,U8 c,U8 cnt,BoolU4 contiguous,BoolU4 unlock); +extern BoolU4 Drive(I1 drive_letter); +extern LTFile *FOpen(I1 *filename,I1 *flags,U8 cnt=0); +extern U8 FSize(LTFile *f); +extern void FSync(LTFile *f); +extern void FClose(LTFile *f); +extern BoolU4 FRBlks(LTFile *f,U1 *buf,U8 blk=LTFB_NEXT_BLK,U8 cnt=1); +extern BoolU4 FWBlks(LTFile *f,U1 *buf,U8 blk=LTFB_NEXT_BLK,U8 cnt=1); +extern void ReleaseTaskPartitions(); +extern void AdamLog(I1 *src,...); +extern void AdamErr(I1 *src,...); +extern BoolU4 SysDbg(BoolU4 val); +extern BoolU4 IsSysDbg(); +extern BoolU4 Raw(BoolU4 val); +extern BoolU4 IsRaw(); +extern void D(U1 *buf,U8 cnt=0x80,BoolU4 show_offset=TRUE); +extern void Dm(U1 *buf,U8 cnt=0x80); +extern U1 *Caller(); +extern U1 *CallerCaller(); +extern void DbgStr(I1 *st,U8 mS=100); +extern void DbgNum(U8 num,U8 mS=100); +extern void DbgAdd(U4 *add,U8 mS=100); +extern void DbgD(U4 *add,U8 cnt=0x80,U8 mS=100); +extern void DbgDm(U4 *add,U8 cnt=0x80,U8 mS=100); +extern void PrintF(I1 *fmt,...); + +/*********** MOST GLBL VARS ***********/ +I1 sys_temp_filename[80]; +SysAccntStruct sys_accounts; +TssCmdStruct sys_macro_queue; +TssStruct *macro_util_tss; +TssStruct *adam_tss; +U4 num_spawned_users; +TssStruct *monitor_floppy_tss; +U1 *grfont; + +U4 FDC_retries; +U4 FDC_DRIVE_HEADS; +U4 FDC_DISK_CYLINDERS; +U4 FDC_DISK_SECTORS; +U4 FDC_MAX_SECTOR; +U4 FDC_DMA_BUF; + +LTCacheBlk *LTDCBase; +LTCacheBlk *LTDCNext_lru,*LTDCLast_lru; +LTCacheBlk **LTDCHashTable; + + +U8 dc_col; +U8 sys_timer,jiffies; +U8 rnd_SEED; +Ltf *sys_clipboard_ltf; +U8 disk_status_display,compiled_lines; +LTBlkDev *local_blkdevs,*boot_blkdev; +LTPartition *local_partitions,*default_partition; +I1 default_drive; +LTPartition *drive_to_partition[32]; +I8 num_blkdevs; +I1 *sys_startup_account; +I1 *wordstat_mask; +BoolU4 ip_inhibit_win_operations; +I1 *sys_compile_time; +U4 *vga_image; + + diff --git a/LT/OSMain/STRINGS.CPZ b/LT/OSMain/STRINGS.CPZ new file mode 100644 index 0000000..7b83a98 --- /dev/null +++ b/LT/OSMain/STRINGS.CPZ @@ -0,0 +1,707 @@ +BoolU4 YorN() +{ + I8 ch; + cout "(y or n)? "; + while (TRUE) { + ch=ToUpper(GetKey); + if (ch=='Y') { + coutln "$$FU$$$$BU$$YES$$FG$$$$BG$$"; + return TRUE; + } else if (ch=='N') { + coutln "$$FU$$$$BU$$NO$$FG$$$$BG$$"; + return FALSE; + } + } +} + +I1 *PointAtListEntry(I8 entry_number, I1 *lst) +{ + while (*lst && entry_number) { + while (*lst) /* Advance to end of cur entry. */ + lst++; + lst++; /* Skip trailing zero */ + entry_number--; + if (*lst=='@') { /* Check for '@' alias list entry*/ + entry_number++; + lst++; + } + } + return lst; +} + +I8 MatchListEntry(I1 *src, I1 *lst,I8 flags=0,I8 *ambiguity_overkill_ptr=NULL) +/* RETURNS: -2 if Ambiguous, -1 if not found, else entry_number */ +{ + I8 l,entry_num=0,result=-1,unutilized_src; + I1 *s; + BoolU4 exact_match=FALSE; + + l=StrLen(src); + if (ambiguity_overkill_ptr) + *ambiguity_overkill_ptr=l; + while (*lst) { + if (*lst=='@') { /* Check for '@' alias list entry*/ + entry_num--; + lst++; + } + + s=src; + if (flags & MLE_IGNORE_CASE) + while (*s && ToUpper(*s) == ToUpper(*lst)) { + s++; + lst++; + } + else + while (*s && *s==*lst) { + s++; + lst++; + } + unutilized_src=l-(s-src); + if (!(*s)) { /* Did we reach end of sourcecout */ + if (!(*lst)) { /* Did we reach end of list entrycout */ + if (!ambiguity_overkill_ptr) + return entry_num; /* Found Exact match */ + result=entry_num; + exact_match=TRUE; + } else { + if (result!=-1) { + if (ambiguity_overkill_ptr) + *ambiguity_overkill_ptr=0; + if (!exact_match) + result=-2; /* AMBIGUOUS RESPONSE unless later exact match*/ + } else { + if (!(flags & MLE_EXACT)) + result=entry_num; + } + } + } else { + if (ambiguity_overkill_ptr && *ambiguity_overkill_ptr>(unutilized_src-1)) + *ambiguity_overkill_ptr=unutilized_src-1; + } + + while (*lst) /* Advance to end of cur entry. */ + lst++; + lst++; /* Skip trailing zero */ + entry_num++; + } + if (ambiguity_overkill_ptr && result==-1) + *ambiguity_overkill_ptr=0; + return result; +} + +void UndefinedSysText(I1 *name) +{ + PutSysText("ST_UNDEFINED_SYSTEXT"); + PutS(name); + throw(EXCEPT_UNDEF_SYSTEXT,name); +} + + +I1 *SysText(I1 *name) +{ + SysHashEntry *temph=FindLocalHash(name,HTT_SYSTEXT); + if (temph) + return temph->user0; + else + UndefinedSysText(name); +} + +I1 *SysTextSub(U8 sub,I1 *name) +{ + SysHashEntry *temph=FindLocalHash(name,HTT_SYSTEXT); + if (temph) + return PointAtListEntry(sub,temph->user0); + else + UndefinedSysText(name); +} + +I8 SysTextSubCount(I1 *name) +{ + SysHashEntry *temph=FindLocalHash(name,HTT_SYSTEXT); + if (temph) + return temph->user1; + else + UndefinedSysText(name); +} + +I8 MatchSysTextEntry(I1 *src, I1 *lst_name, + I8 flags=0,I8 *ambiguity_overkill_ptr=NULL) +{ + return MatchListEntry(src,SysText(lst_name), + flags,ambiguity_overkill_ptr); +} + +asm {CP_PUT_SYSTEXT:} +void PutSysText(I1 *name) +{ + PutS(SysText(name)); +} + + +SysHashEntry *LoadStr(I1 *name, I1 *st) +{ + SysHashEntry *temph, + *temph1=FindHashBucket(name,Fs->hash_table); + temph=MAllocZ(sizeof(SysHashEntry)); + temph->next=*temph1; + *temph1=temph; + temph->type=HTT_SYSTEXT; + temph->string=NewString(name); + temph->user0=NewString(st); + temph->user1=-1; + return temph; +} + +SysHashEntry *LoadList(I1 *name, I1 *st) +{ + U8 cnt=0; + I1 *ptr; + SysHashEntry *temph, + *temph1=FindHashBucket(name,Fs->hash_table); + temph=MAllocZ(sizeof(SysHashEntry)); + temph->next=*temph1; + *temph1=temph; + temph->type=HTT_SYSTEXT; + temph->string=NewString(name); + ptr=st; + while (*ptr) { + while (*ptr++); + cnt++; + } + temph->user0=MAlloc(ptr+1-st); + MemCpy(temph->user0,st,ptr+1-st); + temph->user1=cnt; + return temph; +} + +I8 Occurrences(I1 *src, I8 ch) +{ + I8 i=0; + while (*src) + if (*src++ == ch) i++; + return i; +} + +I8 SpacesToTabs(I1 *dst2,I1 *src) +{ + I1 *src2,*dst=dst2; + I8 i,changed=0,space_cnt,space_cnt2,col=0; + while (*src) { + src2=src; + space_cnt=0; + while (*src2==CH_SPACE) { + space_cnt++; + src2++; + } + if (space_cnt<2) { + if (*src==CH_TAB) + col=0; + else { + col++; + if (col==8) + col=0; + } + *(dst++)=*(src++); + } else { + while (col+space_cnt>=8) { + space_cnt2=8-col; + if (space_cnt2==1) + *(dst++)=CH_SPACE; + else { + *(dst++)=CH_TAB; + changed=changed+(space_cnt2-1); + } + space_cnt=space_cnt-space_cnt2; + col=0; + } + for (i=0;i=l-2) { + temp=MAlloc(l<<1); + MemCpy(temp,dst,i+1); + Free(dst); + l<<=1; + dst=temp; + } + } + col=j; + } else { + dst[col]=ch; + if (col>=l-2) { + temp=MAlloc(l<<1); + MemCpy(temp,dst,col+1); + Free(dst); + l*=2; + dst=temp; + } + col++; + } + } + dst[col]=0; + return dst; +} + +I1 *StringUtil(I1 *u, I8 mask) +{ + I1 *src,*dst; + I8 ch; + + src=u; + if (mask & SU_REMOVE_LEADING) + while (*src==CH_SPACE || *src==CH_SHIFT_SPACE || *src==CH_TAB) + src++; + + dst=u; + while (ch=*src++) { + if (ch==CH_SPACE || ch==CH_SHIFT_SPACE || ch==CH_TAB) { + if (!(mask & SU_REMOVE_SPACES)) { + if (mask & SU_SINGLE_SPACE) { + (*dst++) = CH_SPACE; + while (ch= *src++ && (ch==CH_SPACE || ch==CH_SHIFT_SPACE || ch==CH_TAB) ); + src--; + } else + (*dst++) = ch; + } + } else { + if (!(mask & SU_REMOVE_CTRL_CHARS) || ch>=CH_SHIFT_SPACE) + (*dst++)=ch; + } + } + *dst=0; + + if (mask & SU_CAP_UNDERSCORES) { + src=u; + dst=u; + while (*src) { + *dst++=ToUpper(*src++); + while (*src && *src!='_') + *dst++=*src++; + if (*src=='_') + src++; + } + *dst=0; + } + + if (mask & SU_REMOVE_TRAILING) + while ( dst != u && (!*dst || *dst==CH_SPACE || *dst==CH_SHIFT_SPACE || *dst==CH_TAB)) + (*dst--)=0; + if (mask & SU_DISCARD_PARITY) + for (dst=u;*dst;dst++) { + ch=*dst; + *dst=ch & 127; + } + if (mask & SU_TO_UPPER) + for (dst=u;*dst;dst++) { + ch=*dst; + if (ch>=0x61 && ch<=0x7A) + *dst = ch-0x20; + } + if (mask & SU_TO_LOWER) + for (dst=u;*dst;dst++) { + ch=*dst; + if (ch>=0x41 && ch<=0x5A) + *dst = ch+0x20; + } + if (mask & SU_SAFE_DOLLAR) + for (dst=u;*dst;dst++) { + ch=*dst; + if (!Bt(safe_dollar_chars_bitmap,*dst)) + *dst = '.'; + } + if (mask & SU_S2T) + SpacesToTabs(u,u); + return u; +} + +I1 *MStringUtil(I1 *src,U8 flags) +{ + I1 *dst=NewString(src),*dst2,*temp; + StringUtil(dst,flags); + if (flags & SU_T2S) { + temp=TabsToSpaces(dst); + Free(dst); + dst=temp; + } + dst2=NewString(dst); //Shorten + Free(dst); + return dst2; +} + +I1 *RemoveFirstSeg(I1 *src, I1 *marker, I1 *dst) +{ + I1 *temp,*temp1,ch; + + temp = src; + temp1= dst; + while ( (ch= *src++) && !Occurrences(marker,ch) ) + *dst++=ch; + + *dst = 0; + if (ch) + StrCpy(temp,src); + else + *temp=0; + return temp1; +} + + +I1 *RemoveLastSeg(I1 *src, I1 *marker, I1 *dst) +{ + I1 *temp; + + temp=src+StrLen(src); + while (temp>src && !Occurrences(marker,*temp)) + temp--; + if (Occurrences(marker,*temp)) { + StrCpy(dst,temp+1); + *temp=0; + } else { + StrCpy(dst,src); + *src=0; + } + return dst; +} + +I1 *SearchString(I1 *src,I1 *pattern,U8 flags=0) +{ + BoolU4 cont; + U1 *src2; + I1 *saved_src=src; + I8 plen=StrLen(pattern); + do { + cont=FALSE; + if (flags & SS_IGNORE_CASE) + src=StrIStr(src,pattern); + else + src=StrStr(src,pattern); + if (src && flags & SS_WHOLE_LABELS) { + src2=src+plen; + if (Bt(alpha_numeric_bitmap,*src2)) { + src++; //TODO: Numbers could be false negative + if (*src) + cont=TRUE; + else + src=NULL; + } else { + if (src!=saved_src) { + src2=src-1; + if (Bt(alpha_numeric_bitmap,*src2)) { + src++; + if (*src) + cont=TRUE; + else + src=NULL; + } + } + } + } + } while (cont); + return src; +} + +BoolU4 WildCardMatch(I1 *wild_st,I1 *src_st) +{ + U8 ch1,ch2; + while (TRUE) { + if ( !(ch1 = *src_st++)) { + if (*wild_st) + return FALSE; + else + return TRUE; + } else { + if ( !(ch2 = *wild_st++)) + return FALSE; + else { + if (ch2 == '*') { + if (!(ch2 = *wild_st++)) + return TRUE; + while (ch2 != ch1) + if (!(ch1 = *src_st++)) + return FALSE; + } else + if (ch2!='?') + if (ch1!=ch2) + return FALSE; + } + } + } +} + +BoolU4 WildFileNameList(I1 *wild_st,I1 *src_st) +{ + BoolU4 result=FALSE; + I1 *buf1=NewString(wild_st), + *buf2=MAlloc(StrLen(wild_st)+1); + while (TRUE) { + RemoveFirstSeg(buf1,";",buf2); + if (*buf2) { + if (*buf2=='~') { + if (WildCardMatch(buf2+1,src_st)) { + result=FALSE; + break; + } + } else { + if (WildCardMatch(buf2,src_st)) + result=TRUE; + } + } else + break; + } + Free(buf1); + Free(buf2); + return result; +} + +I1 *Add2String(I1 *base,I1 *addition) +{ //doubles length + I1 *result; + I8 blen=StrLen(base),alen=StrLen(addition); + I8 bmem=MSize(base); + if (blen+alen+1>bmem) { + result=MAlloc(bmem<<1+alen+1); + MemCpy(result,base,blen); + StrCpy(result+blen,addition); + Free(base); + } else { + result=base; + StrCpy(result+blen,addition); + } + return result; +} + +void CheckLTPartition(LTPartition *p) +{ + if (!p || p->ch_L!='L' || p->ch_P!='P' || p->ch_E!='E') + throw(EXCEPT_PARTITION,9); +} + +I1 PartitionToDrive(LTPartition *p=NULL) +{ + if (!p) + p=Fs->cur_partition; + CheckLTPartition(p); + return p->drive; +} + +LTPartition *DriveToPartition(I1 drive=0) +{ + LTPartition *p; + if (!drive) + p=Fs->cur_partition; + else if (drive==':') + p=default_partition; + else + p=drive_to_partition[ToUpper(drive)-'A']; + CheckLTPartition(p); + return p; +} + +void CheckLTBlkDev(LTBlkDev *bdev) +{ + if (!bdev || bdev->ch_L!='L' || + bdev->ch_B!='B' || bdev->ch_D!='D') + throw(EXCEPT_BLKDEV,1); + if (!bdev->type || bdev->type>LTBDT_FILE) + throw(EXCEPT_BLKDEV,2); +} + +LTBlkDev *DriveToBlkDev(I1 drive=0) +{ + LTPartition *p=DriveToPartition(drive); + LTBlkDev *bdev=p->bdev; + CheckLTBlkDev(bdev); + return bdev; +} + +BoolU4 DriveIsWritable(I1 drive=0) +{ + LTBlkDev *bdev=DriveToBlkDev(drive); + if (bdev->flags & LTBDF_READ_ONLY) + return FALSE; + else + return TRUE; +} + +I1 *CurDir() +{ + I1 *st=MAlloc(StrLen(Fs->cur_dir)+3); + st[0]=PartitionToDrive; + st[1]=':'; + StrCpy(st+2,Fs->cur_dir); + return st; +} + +I1 *AbsoluteDirName(I1 *name) +{ + I8 maxlen; + I1 drive[3],*hdir,*cur_dir,*buf2,*buf3,*buf,*my_name,*temp_name; + if (!Fs->cur_dir) + return NewString(name); + if (!*Fs->cur_dir) + return NewString(name); + my_name=MStringUtil(name, + SU_REMOVE_LEADING|SU_REMOVE_TRAILING| + SU_DISCARD_PARITY|SU_REMOVE_CTRL_CHARS); + temp_name=my_name; + drive[0]=PartitionToDrive; + drive[1]=':'; + drive[2]=0; + if (*my_name && my_name[1]==':') { + if (*my_name==':') + drive[0]=default_drive; + else + drive[0]=*my_name; + my_name=my_name+2; + cur_dir=NewString("/"); + } else + cur_dir=NewString(Fs->cur_dir); + if (*my_name=='/') { + Free(cur_dir); + cur_dir=NewString("/"); + my_name++; + } + + buf2=NewString(my_name); + maxlen=StrLen(cur_dir)+1+StrLen(buf2)+1; + buf3=MAlloc(maxlen); + buf =MAlloc(maxlen); + StrCpy(buf3,cur_dir); + while (*buf2) { + RemoveFirstSeg(buf2,"/",buf); + if (!*buf) + StrCpy(buf3,"/"); + else if (!StrCmp(buf,"..")) { + RemoveLastSeg(buf3,"/",buf); + if (!*buf3) + StrCpy(buf3,"/"); + } else if (!StrCmp(buf,".")) { + ; + } else if (*buf) { + if (!StrCmp(buf,"HOME")) { + Free(buf3); + hdir=HomeDirString; + buf3=MAlloc(maxlen+StrLen(hdir)); + StrCpy(buf3,hdir+2); + Free(hdir); + drive[0]=default_drive; + } else { + if (StrCmp(buf3,"/")) + StrCat(buf3,"/"); + StrCat(buf3,buf); + } + } + } + Free(cur_dir); + cur_dir=MAlloc(StrLen(buf3)+3); + StrCpy(cur_dir,drive); + StrCpy(cur_dir+2,buf3); + Free(buf); + Free(buf2); + Free(buf3); + Free(temp_name); + return cur_dir; +} + +I1 *AbsoluteFileName(I1 *name) +{ + I1 *buf,*buf2,*buf3,*my_name,*temp_name,*temp_buf; + my_name=MStringUtil(name, + SU_REMOVE_LEADING|SU_REMOVE_TRAILING| + SU_DISCARD_PARITY|SU_REMOVE_CTRL_CHARS); + temp_name=my_name; + buf=NewString(my_name); + temp_buf=buf; + if (*buf && buf[1]==':') { + buf+=2; + my_name+=2; + } + buf2=MAlloc(StrLen(temp_name)+1); + RemoveLastSeg(buf,"/",buf2); + if (*my_name=='/' && !*buf) + StrCpy(buf,"/"); + buf3=AbsoluteDirName(temp_buf); + Free(temp_buf); + buf=MAlloc(StrLen(buf3)+1+StrLen(buf2)+1); + StrCpy(buf,buf3); + if (buf[StrLen(buf)-1]!='/') + StrCat(buf,"/"); + StrCat(buf,buf2); + Free(buf2); + Free(buf3); + Free(temp_name); + return buf; +} + +I1 *ChangeExtension(I1 *name,I1 *extension) +{ + I1 *buf=MAlloc(StrLen(name)+1), + *result=MAlloc(StrLen(name)+1+StrLen(extension)+1); + StrCpy(result,name); + if (Occurrences(name,'.')) + RemoveLastSeg(result,".",buf); + StrCat(result,"."); + StrCat(result,extension); + Free(buf); + return result; +} + +I1 *DefaultExtension(I1 *name,I1 *extension) +{ + I1 *result=MAlloc(StrLen(name)+1+StrLen(extension)+1); + StrCpy(result,name); + if (!Occurrences(name,'.')) { + StrCat(result,"."); + StrCat(result,extension); + } + return result; +} + +U8 FileAttr(I1 *name,U8 attr=0) +{ + I1 *ptr=name,ch=0; + while (*ptr && *ptr!='.') + ptr++; + if (*ptr=='.') + ch=ToUpper(ptr[StrLen(ptr)-1]); + if (ch=='Z') + attr|=LT_ATTR_COMPRESSED; + else + attr&=~LT_ATTR_COMPRESSED; +//TODO: temporary + attr|=LT_ATTR_CONTIGUOUS; + return attr; +} + +BoolU4 CheckFileName(I1 *name) +{ + I1 *ptr=name; + if (!name) return FALSE; + if (!*ptr) return FALSE; + if (*ptr=='.') { + if (!ptr[1]) return TRUE; + if (ptr[1]=='.' && !ptr[2]) return TRUE; + } + if (StrLen(name)>LT_MAX_FILENAME_LEN) return FALSE; + while (*ptr) + if (!Bt(filename_chars_bitmap,*ptr++)) + return FALSE; + return TRUE; +} diff --git a/LT/OSMain/SYSTEXT.CPZ b/LT/OSMain/SYSTEXT.CPZ new file mode 100644 index 0000000..8b23a8f --- /dev/null +++ b/LT/OSMain/SYSTEXT.CPZ @@ -0,0 +1,93 @@ +void LoadSysStrings() +{ + LoadStr("ST_USER_STARTUP","Welcome\r\n"); + LoadStr("ST_UNDEFINED_SYSTEXT","ERROR: Undefined SysText\r\n"); + LoadStr("ST_UNDEFINED_EXTERN","ERROR: Undefined Extern\r\n"); + LoadStr("ST_FILE_NOT_FOUND","ERROR: File not found.\r\n"); + LoadStr("ST_INVALID_FILENAME","ERROR: Invalid File Name.\r\n"); + LoadStr("ST_PRESS_A_KEY","PRESS A KEY\r\n"); + LoadStr("ST_VERIFY_ERROR","Verify Error:"); + LoadStr("ST_NOT_LT","ERROR: Not LT Partition\r\n"); + LoadStr("ST_NOT_ISO9660","ERROR: Not ISO9660 Partition\r\n"); + LoadStr("ST_DELETE","Del "); + LoadStr("ST_INVALID_DRIVE","ERROR: Invalid Drive\r\n"); + LoadStr("ST_CUR_PARTITION","Current Partition: "); + LoadStr("ST_FILE_SYSTEM_NOT_SUPPORTED","ERROR: File System Not supported\r\n"); + LoadStr("ST_NO_MATCHING_ENTRIES","No matching entries\r\n"); + LoadStr("ST_OUT_OF_ROOT_DIR_SPACE","ERROR: Out of Root Dir Space\r\n"); + LoadStr("ST_OUT_OF_DRIVE_SPACE","ERROR: Out of Drive Space\r\n"); + LoadStr("ST_INVALID_CLUSTER","ERROR: Invalid Cluster\r\n"); + LoadList("ST_LTF_CMDS","TX\0CR\0SR\0CU\0TB\0CL\0PB\0DA\0PL\0LM\0RM\0HD\0" + "FO\0ID\0FG\0BG\0FD\0BD\0FL\0BL\0" + "FM\0BM\0FA\0BA\0FH\0BH\0FE\0BE\0FU\0BU\0WW\0UL\0IV\0BK\0SX\0SY\0CM\0AN\0LK\0BT\0" + "CB\0MA\0MU\0HX\0HS\0HE\0TR\0PI\0IB\0IT\0IS\0BP\0SO\0ER\0"); + LoadList("ST_LTF_FLAGS","A\0" + "LC\0LE\0LM\0LA\0RC\0RE\0RM\0RA\0" + "DC\0BI\0X\0Q\0LX\0CX\0RX\0TY\0CY\0BY\0SX\0SY\0SCX\0SCY\0" + " \0 \0 \0 \0 \0 \0 \0 \0 \0" + "B\0S\0BD\0C\0CK\0RD\0P\0T\0" + "Z\0PW\0WW\0UL\0IV\0BK\0SEL\0H\0TR\0SK\0AL\0PU\0PRY\0MRX\0.\0"); + LoadList("ST_HTT_TYPES","StrConst\0SysSym\0KeyWord\0LocVar\0GlbVar\0Class\0" + "IntType\0Funct\0Word\0OpCode\0R8\0R16\0R32\0" + "SegReg\0SysText\0File\0Module\0.\0.\0.\0.\0.\0.\0.\0.\0Private\0" + "Public\0Export\0Import\0Lit\0UnrLoc\0UnrGlb\0"); + LoadStr("ST_UNHANDLED_EXCEPTION","ERROR: Unhandled Exception\r\n"); + LoadList("ST_DAYS_OF_WEEK","Sunday\0Monday\0Tuesday\0Wednesday\0" + "Thursday\0Friday\0Saturday\0"); + LoadList("ST_MONTHS","January\0February\0March\0April\0May\0" + "June\0July\0August\0September\0October\0November\0December\0"); + LoadList("ST_EXCEPT_TYPES","Local\0Compiler\0Arithmetic\0Undefined Systext\0" + "Undefined Extern\0File\0Break\0Arc Xsum\0" + "FDC error\0Partition error\0Blk Dev error\0" + "Floating\0Graphics\0"); + LoadList("ST_FILE_ATTRS","R\0H\0S\0V\0D\0A\0.\0.\0X\0Y\0T\0Z\0" + "C\0F\0"); + LoadList("ST_FILE_UTIL_FLAGS","r\0d\0i\0l\0?\0a\0c\0R\0p\0m\0D\0"); + LoadList("ST_BLKDEV_TYPES","NULL \0RAM \0FDC \0ATA \0ATAPI\0FILE_\0"); + LoadList("ST_GRELEM_TYPES","End\0.\0Color (4-bit)\0.\0Point\0" + "Line\0PolyLine\0PolyPoint\0Width\0Shift\0" + "BSpline2\0BSpline3\0BSpline2 Closed\0BSpline3 Closed\0"); + LoadList("ST_LINK_TYPES","FI\0FA\0FF\0FL\0MN\0PI\0PF\0PL\0"); + LoadStr("ST_ERR_START","$$FG RED$$$$BK 1$$"); + LoadStr("ST_ERR_END","$$FG$$$$BK 0$$"); + + LoadStr("ST_ADDDRIVES0", + "\r\n\r\n\r\n$$BK,1$$$$FG,PURPLE$$Add drives to this installation so they will " + "be present when you boot.$$FG$$$$BK,0$$\r\n"); + LoadStr("ST_ADDDRIVES1", + "\r\n****** Add Drives ******\r\n" + "The base drive letter is the letter\r\n" + "of the first partition. If adding\r\n" + "a hard drive, you should pick 'C'.\r\n" + "If more than one partition is present\r\n" + "they will be lettered in sequence.\r\n" + "\r\n" + "Base Drive Letter(ENTER to exit):"); + LoadStr("ST_ADDDRIVES2", + "\t1=RAM\r\n\t2=FDC(Floppy)\r\n\t3=ATA(Harddisk)\r\n" + "\t4=ATAPI(CD-ROM)\r\n\t5=FILE\r\n" + "Type:"); + LoadStr("ST_ADDDRIVES3", + "Filename:"); + LoadStr("ST_ADDDRIVES4", + "Reformat (with each boot) "); + LoadStr("ST_ADDDRIVES5", + "Blks(2880 for floppy):"); + LoadStr("ST_ADDDRIVES6", + "\t2=3F0(Floppy)\r\n\t3=1F0(Primary IDE)\r\n" + "\t4=170(Secondary IDE)\r\n" + "\t5=Use values prompted for CD-ROM during boot\r\n" + "Port:"); + LoadStr("ST_ADDDRIVES7", + "\t0=Master\r\n\t1=Slave\r\nUnit:"); + LoadStr("ST_ADDDRIVES9", + "Only works for ATAPI type\r\n"); + LoadStr("ST_ADDDRIVES10", + "\t2=3F0(Floppy)\r\n\t3=1F0(Primary IDE)\r\n" + "\t4=170(Secondary IDE)\r\n" + "Port:"); + LoadStr("ST_FAILED","\r\n\r\n$$BK,1$$$$FG,RED$$Operation Failed$$BK,0$$$$FG$$\r\n\r\n"); + +$AN,"Anchor for inserting OS systext","OS_SYSTEXT"$ + +} diff --git a/LT/OSMain/SYSUTILS.ASZ b/LT/OSMain/SYSUTILS.ASZ new file mode 100644 index 0000000..a551fc4 --- /dev/null +++ b/LT/OSMain/SYSUTILS.ASZ @@ -0,0 +1,1175 @@ + ALIGN 8,0x90 + +ALPHA_BITMAP:: DU4 0x0000000,0x00000000,0x87FFFFFF,0x07FFFFFE; + DU4 0,0,0,0; +ALPHA_NUMERIC_BITMAP:: DU4 0x0000000,0x03FF0000,0x87FFFFFF,0x07FFFFFE; + DU4 0,0,0,0; +FILENAME_CHARS_BITMAP:: DU4 0x0000000,0x03FF6001,0x87FFFFFF,0x07FFFFFE; + DU4 0,0,0,0; +DEC_NUMERIC_BITMAP:: DU4 0x0000000,0x03FF0000,0,0; + DU4 0,0,0,0; +HEX_NUMERIC_BITMAP:: DU4 0x0000000,0x03FF0000,0x7E,0x7E; + DU4 0,0,0,0; +PRINTABLE_CHARS_BITMAP:: + DU4 0x80002200,0xFFFFFFFF,0xFFFFFFFF,0x7FFFFFFF; + DU4 0,0,0,0; +SAFE_DOLLAR_CHARS_BITMAP:: + DU4 0x80000000,0xFFFFFFEF,0xFFFFFFFF,0x7FFFFFFF; + DU4 0,0,0,0; +DISPLAYABLE_CHARS_BITMAP:: + DU4 0x80000000,0xFFFFFFFF,0xFFFFFFFF,0x7FFFFFFF; + DU4 0x00001FFF,0,0,0; + +////**************************PROCEDURE************************* +CP_RUN_STATEMENT:: + PUSHAD + MOV EBP,ESP + MOV ESI,U4 SP_PARAM1[EBP] + OR ESI,ESI + JZ @@100 + CALL ESI + MOV EBP,ESP + MOV SP_EAX[EBP],EAX + MOV SP_EDX[EBP],EDX + POPAD + RET +@@100: POPAD + XOR EDX,EDX + XOR EAX,EAX + RET +////**************************PROCEDURE************************* + ALIGN 8,0x90 +DEBUG_SPIN_WAIT:: + PUSH ECX + MOV ECX,0x8FFFFFFF +@@1: LOOP @@1 + POP ECX + RET +////**************************PROCEDURE************************* + ALIGN 8,0x90 +OR_U2_BIT_FIELD:: + PUSH EBP + MOV EBP,ESP + MOV EBX,U4 SF_PARAM2[EBP] + MOV EDX,U4 SF_PARAM2+4[EBP] + MOV CL,3 + SHRD EBX,EDX + ADD EBX,U4 SF_PARAM1[EBP] + MOV EAX,U4 SF_PARAM3[EBP] + MOV ECX,U4 SF_PARAM2[EBP] + AND ECX,7 + SHL EAX,CL + OR U4 [EBX],EAX + POP EBP + RET +////**************************PROCEDURE************************* +EWBP_MASKTABLE: + DU4 0,1,3,7,15,31,63,127,255; + DU4 0x1FF,0x3FF,0x7FF,0x0FFF; + DU4 0x1FFF,0x3FFF,0x7FFF,0x0FFFF; + +EXTRACT_U2_BIT_FIELD:: + PUSH EBP + MOV EBP,ESP + MOV EBX,U4 SF_PARAM2[EBP] + MOV EDX,U4 SF_PARAM2+4[EBP] + MOV CL,3 + SHRD EBX,EDX + ADD EBX,U4 SF_PARAM1[EBP] + MOV EAX,U4 [EBX] + MOV ECX,U4 SF_PARAM2[EBP] + AND ECX,7 + SHR EAX,CL + MOV EBX,U4 SF_PARAM3[EBP] + AND EAX,U4 EWBP_MASKTABLE[EBX*4] + XOR EDX,EDX + POP EBP + RET +////**************************PROCEDURE************************* + ALIGN 8,0x90 +U64_MUL:: + PUSH EBP + MOV EBP,ESP + MOV EAX,U4 SF_PARAM1[EBP] + MUL U4 SF_PARAM2+4[EBP] + MOV EBX,EAX + MOV EAX,U4 SF_PARAM1+4[EBP] + MUL U4 SF_PARAM2[EBP] + ADD EBX,EAX + MOV EAX,U4 SF_PARAM1[EBP] + MUL U4 SF_PARAM2[EBP] + ADD EDX,EBX + POP EBP + RET + +////**************************PROCEDURE************************* + ALIGN 8,0x90 +I64_MUL:: + PUSH EBP + MOV EBP,ESP + MOV EAX,U4 SF_PARAM1+4[EBP] + OR EAX,EAX + JS @@40 + + MOV EAX,U4 SF_PARAM2+4[EBP] + OR EAX,EAX + JS @@20 + +@@10: MOV EAX,U4 SF_PARAM1[EBP] + MUL U4 SF_PARAM2+4[EBP] + MOV EBX,EAX + MOV EAX,U4 SF_PARAM1+4[EBP] + MUL U4 SF_PARAM2[EBP] + ADD EBX,EAX + MOV EAX,U4 SF_PARAM1[EBP] + MUL U4 SF_PARAM2[EBP] + ADD EDX,EBX + POP EBP + RET + +@@20: NEG U4 SF_PARAM2[EBP] + JC @@21 + DEC U4 SF_PARAM2+4[EBP] +@@21: NOT U4 SF_PARAM2+4[EBP] +@@30: MOV EAX,U4 SF_PARAM1[EBP] + MUL U4 SF_PARAM2+4[EBP] + MOV EBX,EAX + MOV EAX,U4 SF_PARAM1+4[EBP] + MUL U4 SF_PARAM2[EBP] + ADD EBX,EAX + MOV EAX,U4 SF_PARAM1[EBP] + MUL U4 SF_PARAM2[EBP] + ADD EDX,EBX + NEG EAX + JC @@31 + DEC EDX +@@31: NOT EDX + POP EBP + RET + +@@40: NEG U4 SF_PARAM1[EBP] + JC @@41 + DEC U4 SF_PARAM1+4[EBP] +@@41: NOT U4 SF_PARAM1+4[EBP] + + MOV EAX,U4 SF_PARAM2+4[EBP] + OR EAX,EAX + JNS @@30 + + NEG U4 SF_PARAM2[EBP] + JC @@42 + DEC U4 SF_PARAM2+4[EBP] +@@42: NOT U4 SF_PARAM2+4[EBP] + JMP @@10 +////**************************PROCEDURE************************* +// IN: ESI=STRUCT TO INSERT +// EDI=PREDECESSOR + ALIGN 8,0x90 +INSQUE:: + PUSH EBX + MOV EBX,[EDI] + MOV [EDI],ESI + MOV [ESI],EBX + MOV 4[ESI],EDI + MOV 4[EBX],ESI + POP EBX + RET +////**************************PROCEDURE************************* +// IN: ESI=STRUCT TO INSERT +// EDI=SUCCESSOR + ALIGN 8,0x90 +INSQUE_REV:: + PUSH EBX + MOV EBX,4[EDI] + MOV [EBX],ESI + MOV [ESI],EDI + MOV 4[ESI],EBX + MOV 4[EDI],ESI + POP EBX + RET +////**************************PROCEDURE************************* +// IN: ESI=STRUCT TO REMOVE + ALIGN 8,0x90 +REMQUE:: + PUSH EBX + PUSH EDI + MOV EBX,[ESI] + MOV EDI,4[ESI] + MOV [EDI],EBX + MOV 4[EBX],EDI + POP EDI + POP EBX + RET +////**************************PROCEDURE************************* + ALIGN 8,0x90 +PUT_I1:: + PUSHAD + PUSH 0 + PUSH EAX + CALL CP_PUT_I1+4 + ADD ESP,8 + POPAD + RET +////**************************PROCEDURE************************* + ALIGN 8,0x90 +PUT_STRING:: + PUSHAD + PUSH 0 + PUSH ESI + CALL CP_PUT_STRING+4 + ADD ESP,8 + POPAD + RET +////**************************PROCEDURE************************* +// IN: EAX=BINARY +// ES:[EDI]=@FIELD +// ECX=LENGTH (IF THE HEX_FIELD ENTRY IS USED) +// +// OUT: EAX PRESERVED +// ECX=0 +// [EDI] POINTS PAST DESTINATION + + ALIGN 8,0x90 +BINARY_TO_HEX:: + MOV ECX,8 +BINARY_TO_FIXED_HEX: + PUSHFD //-**** + CLI //because of STD + PUSH EAX //-**** + PUSH EDX //-**** + ADD EDI,ECX + PUSH EDI //-**** EDI WE WANT TO RETURN + DEC EDI + MOV EDX,EAX + STD + +@@1: MOV AL,DL + AND AL,0xF + ADD AL,0x90 + DAA + ADC AL,0x40 + DAA + STOSB + SHR EDX,4 + LOOP @@1 + + POP EDI //+**** + POP EDX //+**** + POP EAX //+**** + POPFD //+**** + RET +////**************************PROCEDURE************************* +//IN: [ESI] = @FIELD +// ECX = LENGTH +//OUT: EAX = VALUE +// ECX = 0 + ALIGN 8,0x90 +HEX_TO_BINARY:: + PUSH EDX + XOR EDX,EDX + OR ECX,ECX + JZ @@9 +@@1: SHL EDX,4 + LODSB + SUB AL,0x30 + CMP AL,9 + JA @@2 + SUB AL,7 +@@2: MOVZX EAX,AL + ADD EDX,EAX + LOOP @@1 + +@@9: MOV EAX,EDX + POP EDX + RET +////**************************PROCEDURE************************* + ALIGN 8,0x90 +MONTH_START_DAYS1:: + DU2 0,31,59,90,120,151,181,212,243,273,304,334; +MONTH_START_DAYS2:: + DU2 0,31,60,91,121,152,182,213,244,274,305,335; + +MSG_GETCHAR: DU1 "GetChar",0; +MSG_PEEK_MSG: DU1 "PeekMsg",0; +MSG_GET_MSG: DU1 "GetMsg",0; +MSG_GET_MSG_NO_WAIT: DU1 "GetMsgNoWait",0; +MSG_FLUSH_MSGS: DU1 "FlushMsgs",0; +MSG_GET_CHAR_NO_ECHO: DU1 "GetCharNoEcho",0; + +////**************************PROCEDURE************************* + ALIGN 8,0x90 +CP_REP_INSW:: + PUSH EBP + MOV EBP,ESP + PUSH EDI + MOV EDI,SF_PARAM1[EBP] + MOV EDX,SF_PARAM3[EBP] + MOV ECX,SF_PARAM2[EBP] + REP_INSW + POP EDI + POP EBP + RET + ALIGN 8,0x90 +CP_REP_INSB:: + PUSH EBP + MOV EBP,ESP + PUSH EDI + MOV EDI,SF_PARAM1[EBP] + MOV EDX,SF_PARAM3[EBP] + MOV ECX,SF_PARAM2[EBP] + REP_INSB + POP EDI + POP EBP + RET +CP_REP_OUTSW:: + PUSH EBP + MOV EBP,ESP + PUSH ESI + MOV ESI,SF_PARAM1[EBP] + MOV EDX,SF_PARAM3[EBP] + MOV ECX,SF_PARAM2[EBP] + REP_OUTSW + POP ESI + POP EBP + RET +CP_REP_OUTSB:: + PUSH EBP + MOV EBP,ESP + PUSH ESI + MOV ESI,SF_PARAM1[EBP] + MOV EDX,SF_PARAM3[EBP] + MOV ECX,SF_PARAM2[EBP] + REP_OUTSB + POP ESI + POP EBP + RET +////**************************PROCEDURE************************* + ALIGN 8,0x90 +CP_STRCAT:: + PUSH EBP + MOV EBP,ESP + PUSH ESI + PUSH EDI + MOV ESI,U4 SF_PARAM1[EBP] +@@2: LODSB + OR AL,AL + JNZ @@2 + MOV EDI,ESI + DEC EDI + MOV ESI,U4 SF_PARAM2[EBP] +@@1: LODSB + STOSB + OR AL,AL + JNZ @@1 + POP EDI + POP ESI + POP EBP + RET +////**************************PROCEDURE************************* + ALIGN 8,0x90 +CP_STRCPY:: + PUSH EBP + MOV EBP,ESP + PUSH ESI + PUSH EDI + MOV ESI,U4 SF_PARAM2[EBP] + MOV EDI,U4 SF_PARAM1[EBP] +@@1: LODSB + STOSB + OR AL,AL + JNZ @@1 + POP EDI + POP ESI + POP EBP + RET +////**************************PROCEDURE************************* + ALIGN 8,0x90 +CP_STRCMP:: + PUSH EBP + MOV EBP,ESP + PUSH ESI + PUSH EDI + MOV ESI,U4 SF_PARAM2[EBP] + MOV EDI,U4 SF_PARAM1[EBP] +@@1: LODSB + OR AL,AL + JZ @@100 + SCASB + JE @@1 + JA @@90 +@@80: MOV EAX,1 + JMP @@101 +@@90: MOV EAX,-1 + JMP @@101 +@@100: SCASB + JNE @@80 + XOR EAX,EAX +@@101: CDQ + POP EDI + POP ESI + POP EBP + RET +////**************************PROCEDURE************************* + ALIGN 8,0x90 +CP_STRNCMP:: + PUSH EBP + MOV EBP,ESP + PUSH ESI + PUSH EDI + MOV ECX,U4 SF_PARAM3[EBP] + MOV ESI,U4 SF_PARAM2[EBP] + MOV EDI,U4 SF_PARAM1[EBP] +@@1: OR ECX,ECX + JZ @@102 + DEC ECX + LODSB + OR AL,AL + JZ @@100 + SCASB + JE @@1 + JA @@90 +@@80: MOV EAX,1 + JMP @@101 +@@90: MOV EAX,-1 + JMP @@101 +@@100: SCASB + JNE @@80 +@@102: XOR EAX,EAX +@@101: CDQ + POP EDI + POP ESI + POP EBP + RET +////**************************PROCEDURE************************* + ALIGN 8,0x90 +CP_STRSTR:: + PUSH EBP + MOV EBP,ESP + PUSH ESI + PUSH EDI + MOV ESI,U4 SF_PARAM1[EBP] + MOV EDI,U4 SF_PARAM2[EBP] + MOV AH,U1 [EDI] + OR AH,AH + JZ @@90 + JMP @@5 +@@1: INC ESI +@@5: LODSB + OR AL,AL + JZ @@100 + CMP AL,AH + JNE @@5 + DEC ESI + MOV ECX,1 +@@10: MOV AL,U1 [EDI+ECX] + OR AL,AL + JZ @@90 + CMP AL,U1 [ESI+ECX] + JNE @@1 + INC ECX + JMP @@10 + +@@80: DEC ESI +@@90: MOV EAX,ESI + JMP @@101 +@@100: XOR EAX,EAX +@@101: XOR EDX,EDX + POP EDI + POP ESI + POP EBP + RET +////**************************PROCEDURE************************* +TO_UPPER:: + CMP AL,'a' + JB @@100 + CMP AL,'z' + JA @@100 + ADD AL,'A'-'a' +@@100: RET +////**************************PROCEDURE************************* + ALIGN 8,0x90 +CP_STRISTR:: + PUSH EBP + MOV EBP,ESP + PUSH ESI + PUSH EDI + MOV ESI,U4 SF_PARAM1[EBP] + MOV EDI,U4 SF_PARAM2[EBP] + MOV AL,U1 [EDI] + CALL TO_UPPER + MOV AH,AL + OR AH,AH + JZ @@90 + JMP @@5 +@@1: INC ESI +@@5: LODSB + CALL TO_UPPER + OR AL,AL + JZ @@100 + CMP AL,AH + JNE @@5 + DEC ESI + MOV ECX,1 +@@10: MOV AL,U1 [EDI+ECX] + CALL TO_UPPER + OR AL,AL + JZ @@90 + MOV BL,U1 [ESI+ECX] + XCHG AL,BL + CALL TO_UPPER + CMP AL,BL + JNE @@1 + INC ECX + JMP @@10 + +@@80: DEC ESI +@@90: MOV EAX,ESI + JMP @@101 +@@100: XOR EAX,EAX +@@101: XOR EDX,EDX + POP EDI + POP ESI + POP EBP + RET +////**************************PROCEDURE************************* +// IN: [ESI] +// OUT: EAX + ALIGN 8,0x90 +HASH_STRING:: + PUSH ESI //-**** + PUSH EBX //-**** + PUSH ECX //-**** + XOR EAX,EAX + XOR EBX,EBX +@@1: LODSB + OR AL,AL + JZ @@100 + SHL EBX,1 + ADC EBX,EAX + JMP @@1 + +@@100: MOV CL,16 + MOV EAX,EBX + SHR EBX,CL + ADC EAX,EBX + POP ECX //+**** + POP EBX //+**** + POP ESI //+**** + RET +////**************************PROCEDURE************************* +// IN: [ESI]=STRING +// EBX=TYPE MASK +// [EDI]=TABLE +// OUT: [ESI]=ENTRY OR ZERO NOT FOUND +// ZERO FLAG SET NOT FOUND +// EAX=INDEX + ALIGN 8,0x90 +FIND_HASH_ENTRY:: + PUSH EDX //-**** + PUSH EDI //-**** + MOV EDX,ESI + CALL HASH_STRING +@@4: PUSH EAX //-**** + AND EAX,U4 HT_MASK[EDI] + LEA ESI,U4 HT_BODY[EDI] + MOV ESI,U4[ESI+EAX*4] +@@1: OR ESI,ESI + JNZ @@3 + MOV EDI,U4 HT_NEXT[EDI] + OR EDI,EDI + JZ @@100 + POP EAX + JMP @@4 + +@@3: MOV EAX,U4 HTE_TYPE[ESI] + AND EAX,EBX + JE @@90 + PUSH ESI //-**** + PUSH EDI //-**** + MOV EDI,U4 HTE_STRING[ESI] + MOV ESI,EDX +@@2: LODSB + MOV AH,U1 [EDI] + INC EDI + CMP AL,AH + JNE @@80 + OR AL,AL + JNZ @@2 + POP EDI //+**** + POP ESI //+**** + INC U4 HTE_USE_CNT[ESI] + JMP @@100 + +@@80: POP EDI //+**** + POP ESI //+**** + +@@90: MOV ESI,U4 HTE_NEXT[ESI] + JMP @@1 + +@@100: POP EAX //+**** + AND EAX,U4 HT_MASK[EDI] + POP EDI //+**** + POP EDX //+**** + OR ESI,ESI + RET +////**************************PROCEDURE************************* +// IN: ES:[ESI]=STRING +// [EDI]=TABLE +// OUT: [ESI]=BUCKET + ALIGN 8,0x90 +FIND_HASH_BUCKET:: + PUSH EAX + CALL HASH_STRING + AND EAX,U4 HT_MASK[EDI] + LEA ESI,U4 HT_BODY[EDI+EAX*4] + POP EAX + RET +////**************************PROCEDURE************************* +FIND_EXTERN:: +//IN: ESI +//OUT: ESI + PUSH EAX + PUSH EDI + PUSH EBX + MOV EDI,U4 FS:[TSS_HASH_TABLE] + MOV EBX,HTT_FUNCTION|HTT_SYS_SYMBOL + CALL FIND_HASH_ENTRY + JNZ @@1 + XOR ESI,ESI + JMP @@3 +@@1: MOV EAX,U4 HTE_USER0[ESI] + TEST U4 HTE_TYPE[ESI],HTT_FUNCTION + JZ @@2 + MOV EAX,U4 C_STATEMENTS[ESI] +@@2: MOV ESI,EAX +@@3: POP EBX + POP EDI + POP EAX + OR ESI,ESI + RET +CP_FIND_EXTERN:: + PUSH EBP + MOV EBP,ESP + PUSH ESI + PUSH EDI + MOV EDI,U4 FS:[TSS_HASH_TABLE] + MOV ESI,U4 SF_PARAM1[EBP] + MOV EBX,HTT_FUNCTION|HTT_SYS_SYMBOL + CALL FIND_HASH_ENTRY + JZ @@1 + MOV EAX,U4 HTE_USER0[ESI] + TEST U4 HTE_TYPE[ESI],HTT_FUNCTION + JZ @@2 + MOV EAX,U4 C_STATEMENTS[ESI] + JMP @@2 +@@1: XOR EAX,EAX +@@2: XOR EDX,EDX + POP EDI + POP ESI + POP EBP + RET +////**************************PROCEDURE************************* + ALIGN 8,0x90 +CRLF:: + PUSH EAX + PUSH EDX + XOR EDX,EDX + MOV EAX,13 + INT I_PUT_I1 + XOR EDX,EDX + MOV EAX,10 + INT I_PUT_I1 + POP EDX + POP EAX + RET + ALIGN 8,0x90 +////**************************PROCEDURE************************* +CP_HASH_STRING:: + PUSH EBP + MOV EBP,ESP + PUSH ESI + MOV ESI,U4 SF_PARAM1[EBP] + CALL HASH_STRING + XOR EDX,EDX + POP ESI + POP EBP + RET +////**************************PROCEDURE************************* + ALIGN 8,0x90 +CP_FIND_HASH_ENTRY:: + PUSH EBP + MOV EBP,ESP + PUSH EDI + PUSH ESI + MOV ESI,U4 SF_PARAM1[EBP] + MOV EDI,U4 SF_PARAM2[EBP] + MOV EBX,U4 SF_PARAM3[EBP] + CALL FIND_HASH_ENTRY + MOV EAX,ESI + XOR EDX,EDX + POP ESI + POP EDI + POP EBP + RET +////**************************PROCEDURE************************* + ALIGN 8,0x90 +CP_FIND_HASH_BUCKET:: + PUSH EBP + MOV EBP,ESP + PUSH EDI + PUSH ESI + MOV ESI,U4 SF_PARAM1[EBP] + MOV EDI,U4 SF_PARAM2[EBP] + CALL FIND_HASH_BUCKET + MOV EAX,ESI + XOR EDX,EDX + POP ESI + POP EDI + POP EBP + RET +////**************************PROCEDURE************************* + ALIGN 8,0x90 +CP_FSQRT:: + PUSH EBP + MOV EBP,ESP + FLD U4 SF_PARAM1[EBP] + FSQRT + FSTP U4 SF_PARAM1[EBP] + MOV EAX,SF_PARAM1[EBP] + MOV EDX,SF_PARAM1+4[EBP] + POP EBP + RET +////**************************PROCEDURE************************* + ALIGN 8,0x90 +CP_FSIN:: + PUSH EBP + MOV EBP,ESP + FLD U4 SF_PARAM1[EBP] + FSIN + FSTP U4 SF_PARAM1[EBP] + MOV EAX,SF_PARAM1[EBP] + MOV EDX,SF_PARAM1+4[EBP] + POP EBP + RET +////**************************PROCEDURE************************* + ALIGN 8,0x90 +CP_FCOS:: + PUSH EBP + MOV EBP,ESP + FLD U4 SF_PARAM1[EBP] + FCOS + FSTP U4 SF_PARAM1[EBP] + MOV EAX,SF_PARAM1[EBP] + MOV EDX,SF_PARAM1+4[EBP] + POP EBP + RET +////**************************PROCEDURE************************* + ALIGN 8,0x90 +CP_FTAN:: + PUSH EBP + MOV EBP,ESP + FLD U4 SF_PARAM1[EBP] +@@1: FPTAN + FSTSW + TEST AX,0x400 + JNZ @@1 + FFREE + FINCSTP + FSTP U4 SF_PARAM1[EBP] + MOV EAX,SF_PARAM1[EBP] + MOV EDX,SF_PARAM1+4[EBP] + POP EBP + RET +////**************************PROCEDURE************************* + ALIGN 8,0x90 +CP_FATAN:: + PUSH EBP + MOV EBP,ESP + FLD U4 SF_PARAM1[EBP] + FLD1 +@@1: FPATAN + FSTSW + TEST AX,0x400 + JNZ @@1 + FSTP U4 SF_PARAM1[EBP] + MOV EAX,SF_PARAM1[EBP] + MOV EDX,SF_PARAM1+4[EBP] + POP EBP + RET +////**************************PROCEDURE************************* + ALIGN 8,0x90 +CP_ARG:: + PUSH EBP + MOV EBP,ESP + FLD U4 SF_PARAM2[EBP] + FLD U4 SF_PARAM1[EBP] +@@1: FPATAN + FSTSW + TEST AX,0x400 + JNZ @@1 + FSTP U4 SF_PARAM1[EBP] + MOV EAX,SF_PARAM1[EBP] + MOV EDX,SF_PARAM1+4[EBP] + POP EBP + RET +////**************************PROCEDURE************************* + ALIGN 8,0x90 +CP_FRNDINT:: + PUSH EBP + MOV EBP,ESP + FLD U4 SF_PARAM1[EBP] + FRNDINT + FSTP U4 SF_PARAM1[EBP] + MOV EAX,SF_PARAM1[EBP] + MOV EDX,SF_PARAM1+4[EBP] + POP EBP + RET +////**************************PROCEDURE************************* + ALIGN 8,0x90 +CP_FLOOR:: + PUSH EBP + MOV EBP,ESP + + SUB ESP,4 + FSTCW U4 -4[EBP] + MOV AX,U2 -4[EBP] + MOV U2 -2[EBP],AX + OR AX,0x0C00 + MOV U2 -4[EBP],AX + FLDCW U4 -4[EBP] + + FLD U4 SF_PARAM1[EBP] + FRNDINT + FSTP U4 SF_PARAM1[EBP] + MOV EAX,SF_PARAM1[EBP] + MOV EDX,SF_PARAM1+4[EBP] + + FLDCW U4 -2[EBP] + ADD ESP,4 + + POP EBP + RET +////**************************PROCEDURE************************* + ALIGN 8,0x90 +CP_POW10:: + PUSH EBP + MOV EBP,ESP + SUB ESP,12 + FSTCW U4 -4[EBP] + MOV AX,U2 -4[EBP] + MOV U2 -2[EBP],AX + OR AX,0x0C00 + MOV U2 -4[EBP],AX + FLDCW U4 -4[EBP] + + FLDL2T + FLD U4 SF_PARAM1[EBP] + FMULP + FST U4 SF_PARAM1[EBP] + FRNDINT + FLD U4 SF_PARAM1[EBP] + FSUBRP + F2XM1 + FLD1 + FADDP + FSTP U4 -12[EBP] + FFREE + FINCSTP + FLD U4 SF_PARAM1[EBP] + FLD U4 -12[EBP] + FSCALE // ST0<>2; + for (i=0;ientry_used) { + i=c->free_index; + + c->entry_used=FALSE; + c->cur_entry=c->next_entry; + c->cur_bits_in_use=c->next_bits_in_use; + if (c->next_bits_in_usenext_entry = &c->compress[i++]; + if (i==c->free_limit) { + c->next_bits_in_use++; + c->free_limit=1<next_bits_in_use; + } + } else { + do if (++i==c->free_limit) + i=c->min_table_entry; + while (c->hash[i]); + temp=&c->compress[i]; + c->next_entry=temp; + temp1=&c->hash[temp->basecode]; + while (temp1) { + if (temp1->next==temp) { + temp1->next=temp->next; + break; + } else + temp1=temp1->next; + } + } + c->free_index=i; + } +} +*/ + ALIGN 8,0x90 +CP_ARC_GET_TABLE_ENTRY:: + PUSH EBP + MOV EBP,ESP + PUSH ESI + PUSH EDI + MOV ESI,U4 SF_PARAM1[EBP] + BTR U4 ACS_ENTRY_USED[ESI],0 + JNC @@100 + MOV EDX,U4 ACS_FREE_INDEX[ESI] + MOV EAX,U4 ACS_NEXT_ENTRY[ESI] + MOV U4 ACS_CUR_ENTRY[ESI],EAX + MOV ECX,U4 ACS_NEXT_BITS_IN_USE[ESI] + MOV U4 ACS_CUR_BITS_IN_USE[ESI],ECX + CMP ECX,ARC_MAX_BITS + JAE @@20 + LEA EAX,U4 ACS_COMPRESS[ESI+EDX*8] + MOV U4 ACS_NEXT_ENTRY[ESI],EAX + INC EDX + CMP U4 ACS_FREE_LIMIT[ESI],EDX + JNE @@90 + INC ECX + MOV U4 ACS_NEXT_BITS_IN_USE[ESI],ECX + MOV EAX,1 + SHL EAX,CL + MOV U4 ACS_FREE_LIMIT[ESI],EAX + JMP @@90 +@@20: INC EDX + CMP U4 ACS_FREE_LIMIT[ESI],EDX + JNE @@25 + MOV EDX,U4 ACS_MIN_TABLE_ENTRY[ESI] +@@25: MOV EAX,U4 ACS_HASH[ESI+EDX*4] + OR EAX,EAX + JNZ @@20 + LEA EDI,U4 ACS_COMPRESS[ESI+EDX*8] + MOV U4 ACS_NEXT_ENTRY[ESI],EDI + MOVZX EBX,U2 ATE_BASECODE[EDI] + LEA ECX,U4 ACS_HASH[ESI+EBX*4] +@@50: OR ECX,ECX + JZ @@90 + MOV EAX,U4 ATE_NEXT[ECX] + CMP EDI,EAX + JNE @@55 + MOV EAX,U4 ATE_NEXT[EDI] + MOV U4 ATE_NEXT[ECX],EAX + JMP @@90 +@@55: MOV ECX,EAX + JMP @@50 +@@90: MOV U4 ACS_FREE_INDEX[ESI],EDX +@@100: POP EDI + POP ESI + POP EBP + RET + \ No newline at end of file diff --git a/LT/UTILS/BMP.CPZ b/LT/UTILS/BMP.CPZ new file mode 100644 index 0000000..746bf8c --- /dev/null +++ b/LT/UTILS/BMP.CPZ @@ -0,0 +1,245 @@ +U4i class RGBEntry +{ + U1 r,g,b,reserved; +}; + +U4i class BGREntry +{ + U1 b,g,r,reserved; +}; + +class BMPFile +{ + U2 type; + U4 file_size; + U4 reserved; + U4 data_offset; + + U4 header_size; + U4 width; + U4 height; + U2 planes; + U2 bit_cnt; + U4 compression; + U4 image_size; + U4 x_pixels_per_meter; + U4 y_pixels_per_meter; + U4 colors_used; + U4 important_colors; + + U0 end; + + BGREntry pallette[16]; +}; + + +BMPFile *NewBMPFile(U8 width,U8 height,U8 bits) +{ + BMPFile *r; + U8 size; + if (bits==24) + size=offset(BMPFile.end)+ + width*height*sizeof(RGBEntry); + else + size=offset(BMPFile.end)+ + width*height>>1+16*sizeof(BGREntry); + r=MAllocZ(size); + r->type=0x4D42; + r->planes=1; + r->file_size=size; + r->data_offset=offset(BMPFile.end); + r->header_size=offset(BMPFile.end)- + offset(BMPFile.header_size); + r->width=width; + r->height=height; + if (bits==24) { + r->bit_cnt=32; + r->image_size=width*height<<2; + } else { + r->bit_cnt=4; + r->image_size=width*height>>1; + r->data_offset+=16*sizeof(BGREntry); + r->pallette[BLACK] =0x00000000; + r->pallette[BLUE] =0x00000080; + r->pallette[GREEN] =0x00008000; + r->pallette[CYAN] =0x00008080; + r->pallette[RED] =0x00800000; + r->pallette[PURPLE] =0x00800080; + r->pallette[BROWN] =0x00808000; + r->pallette[LTGRAY] =0x00808080; + + r->pallette[DKGRAY] =0x00000000; + r->pallette[LTBLUE] =0x000000FF; + r->pallette[LTGREEN] =0x0000FF00; + r->pallette[LTCYAN] =0x0000FFFF; + r->pallette[LTRED] =0x00FF0000; + r->pallette[LTPURPLE]=0x00FF00FF; + r->pallette[YELLOW] =0x00FFFF00; + r->pallette[WHITE] =0x00FFFFFF; + + } + + return r; +} + + +public void CaptureScreen4(I1 *filename) +{// 4 bit color + U1 *src,j; + U8 wd=grbase->width>>3,pl=wd*grbase->height; + U4 *img=MAlloc(pl<<2); + BMPFile *r=NewBMPFile(grbase->width,grbase->height,4); + I8 x,y,i; + RGBEntry *rgb; + + while (gr_screen_capture) + SwapInNext; + gr_screen_capture=img; + while (gr_screen_capture) + SwapInNext; + + rgb=r+r->data_offset; + for (y=grbase->height-1;y>=0;y--) { + src=y*wd+img; + for (x=0;xdata_offset; + for (y=grbase->height-1;y>=0;y--) { + src=y*wd+img+pl; + for (x=0;xdata_offset; + for (y=grbase->height-1;y>=0;y--) { + src=y*wd+img+pl<<1; + for (x=0;xdata_offset; + for (y=grbase->height-1;y>=0;y--) { + src=y*wd+img+pl*3; + for (x=0;xfile_size); + Free(img); + Free(r); +} + +public void CaptureScreen24(I1 *filename) +{// 24 bit color + U1 *src,j; + U8 wd=grbase->width>>3,pl=wd*grbase->height; + U4 *img=MAlloc(pl<<2); + BMPFile *r=NewBMPFile(grbase->width,grbase->height,24); + I8 x,y,i; + RGBEntry *rgb; + + while (gr_screen_capture) + SwapInNext; + gr_screen_capture=img; + while (gr_screen_capture) + SwapInNext; + + rgb=r+r->data_offset; + for (y=grbase->height-1;y>=0;y--) { + src=y*wd+img; + for (x=0;x>=1) { + if (i&j) + rgb->r=0x7F; + rgb+=4; + } + } + } + + rgb=r+r->data_offset; + for (y=grbase->height-1;y>=0;y--) { + src=y*wd+img+pl; + for (x=0;x>=1) { + if (i&j) + rgb->g=0x7F; + rgb+=4; + } + } + } + + rgb=r+r->data_offset; + for (y=grbase->height-1;y>=0;y--) { + src=y*wd+img+pl<<1; + for (x=0;x>=1) { + if (i&j) + rgb->b=0x7F; + rgb+=4; + } + } + } + + rgb=r+r->data_offset; + for (y=grbase->height-1;y>=0;y--) { + src=y*wd+img+pl*3; + for (x=0;x>=1) { + if (i&j) { + if (rgb->r) rgb->r=0xFF; + if (rgb->g) rgb->g=0xFF; + if (rgb->b) rgb->b=0xFF; + } + rgb+=4; + } + } + } + WriteFile(filename,r,r->file_size); + Free(img); + Free(r); +} diff --git a/LT/UTILS/BOOTCD2.ASZ b/LT/UTILS/BOOTCD2.ASZ new file mode 100644 index 0000000..d9a3b07 --- /dev/null +++ b/LT/UTILS/BOOTCD2.ASZ @@ -0,0 +1,298 @@ +asm { +#define BOOT_ADDRESS 0x040000 +#define BLK_SIZE 0x200 +#define CD_BLK_SIZE 2048 +#define BOOT_HIGH_LOC ((0xA0000-5*BLK_SIZE)>>4) + +#define BOOT_CODE_FLOPPY 1 +#define BOOT_CODE_HARDDRIVE 2 +#define BOOT_CODE_CDROM 3 +#define BOOT_CODE_RAM 4 + +#define WIN_NOP 0x00 +#define WIN_DEV_RESET 0x08 +#define WIN_PACKETCMD 0xA0 /* Send a packet cmd. */ + +#define ERR_STAT 0x01 +#define DRQ_STAT 0x08 +#define SEEK_STAT 0x10 +#define READY_STAT 0x40 +#define BUSY_STAT 0x80 + +#define DRIVE_READY (READY_STAT | SEEK_STAT) +#define DATA_READY (DRQ_STAT) + +#define IDE_PRIMARY_BASE 0x1F0 +#define IDE_SECONDARY_BASE 0x170 + +#define IDE_DATA_REG (0) +#define IDE_FEATURE_REG (1) +#define IDE_NSECTOR_REG (2) +#define IDE_SECTOR_REG (3) +#define IDE_LCYL_REG (4) +#define IDE_HCYL_REG (5) +#define IDE_SELECT_REG (6) +#define IDE_STATUS (7) +#define IDE_CMD (7) +#define IDE_CONTROL_REG (0x3F6-0x1F0) + + USE16 +BCD2_START:: + CLD + MOV AX,BOOT_HIGH_LOC + MOV ES,AX + MOV SS,AX + MOV SP,5*BLK_SIZE + + CALL U2 GET_IP +GET_IP: + POP BX + SUB BX,GET_IP + SHR BX,4 + MOV AX,CS //COPY HIGH + ADD AX,BX + MOV DS,AX + MOV CX,CD_BLK_SIZE + XOR SI,SI + XOR DI,DI + REP_MOVSB + + MOV AX,SS + MOV DS,AX + MOV AX,BOOT_ADDRESS/16 + MOV ES,AX + XOR DI,DI //ES:[DI]=DEST + + MOV SI,MSG_PS + CALL BCD2_PUTS + XOR AH,AH + INT 0x16 + MOV SI,IDE_SECONDARY_BASE + CMP AL,'S' + JE @@12 + CMP AL,'s' + JE @@12 + MOV SI,IDE_PRIMARY_BASE + +@@12: +/********** + PUSH ES + XOR AX,AX + MOV ES,AX + MOV AL,U1 ES:[0x3EE] + POP ES +*******/ + + PUSH SI + MOV SI,MSG_UNIT + CALL BCD2_PUTS + XOR AH,AH + INT 0x16 + POP SI + + SHL AL,4 + OR AL,0xE0 + MOV U1 [BCD2_UNIT_VALUE+1],AL + + CLI + DU1 0xEA; + DU2 BCD2_MAIN,BOOT_HIGH_LOC; + +MSG_PS:: + DU1 "\r\n\r\n\r\n\r\n" + "\r\nBooting LoseThos Operating System from CD-ROM..." + "\r\n\r\nPlease specify the location of the CD-ROM" + "\r\ndrive you are booting from. (I don't know how" + "\r\nto detect it.) Typically, CD-ROMs are on the" + "\r\nsecondary controller, so press 's' if this is the case." + "\r\n\r\n (p)rimary or (s)econdary IDE controller:",0; +MSG_UNIT:: + DU1 "\r\n\r\nTypically, CD-ROMs are the master unit, so" + "\r\npress '0' if this is the case." + "\r\n\r\n Unit (0=Master or 1=Slave):",0; +BCD2_PUTS:: + LODSB + OR AL,AL + JZ BCD2_RET + MOV AH,0x0E + MOV BX,0x07 + INT 0x10 + JMP BCD2_PUTS + +BCD2_STAT:: + MOV DX,SI + ADD DX,IDE_STATUS + IN AL,DX +BCD2_RET: + RET +BCD2_SELECT_UNIT:: + MOV DX,SI + ADD DX,IDE_SELECT_REG +BCD2_UNIT_VALUE:: + MOV AL,0xF0 //Gets patched + OUT DX,AL + RET +BCD2_CMD:: + MOV AH,AL + XOR AL,AL + MOV DX,SI + ADD DX,IDE_FEATURE_REG + OUT DX,AL + MOV AL,AH + MOV DX,SI + ADD DX,IDE_CMD + OUT DX,AL + RET +BCD2_WAIT_NOT_BUSY:: + CALL BCD2_STAT + AND AL,BUSY_STAT + JNZ BCD2_WAIT_NOT_BUSY + RET +BCD2_WAIT_DRQ:: + CALL BCD2_STAT + AND AL,DRQ_STAT + JZ BCD2_WAIT_DRQ + RET +BCD2_PKT:: + PUSH AX + CALL BCD2_WAIT_DRQ + POP BX + MOV AL,BH + MOV AH,BL + MOV DX,SI + ADD DX,IDE_DATA_REG + OUT DX,AX + RET +BCD2_RESET:: + CALL BCD2_SELECT_UNIT + MOV AL,WIN_DEV_RESET + CALL BCD2_CMD + CALL BCD2_WAIT_NOT_BUSY + RET + +BCD2_MAIN:: + CALL BCD2_RESET +BCD2_WAIT_READY:: + MOV ECX,100000 //Busy wait + MOV DX,0x379 //Par Port +@@1: IN AL,DX + DEC ECX + JNZ @@1 +BCD2_WAIT_READY2:: + CALL BCD2_SELECT_UNIT + MOV AL,WIN_NOP + CALL BCD2_CMD + CALL BCD2_WAIT_NOT_BUSY + CALL BCD2_STAT + AND AL,READY_STAT + JNZ @@1 + CALL BCD2_RESET + JMP BCD2_WAIT_READY + +@@1: CALL BCD2_SELECT_UNIT + MOV AL,WIN_PACKETCMD + CALL BCD2_CMD + MOV AX,0x1B00 + CALL BCD2_PKT + XOR AX,AX + CALL BCD2_PKT + MOV AX,0x0100 + CALL BCD2_PKT + XOR AX,AX + CALL BCD2_PKT + XOR AX,AX + CALL BCD2_PKT + XOR AX,AX + CALL BCD2_PKT + CALL BCD2_WAIT_NOT_BUSY + + MOV DX,SI + ADD DX,IDE_FEATURE_REG + IN AL,DX + OR AL,AL + JNZ BCD2_WAIT_READY + +BCD2_SEND_READ:: + MOV AL,8 + MOV DX,SI + ADD DX,IDE_CONTROL_REG + OUT DX,AL + CALL BCD2_SELECT_UNIT + MOV AL,0 + MOV DX,SI + ADD DX,IDE_LCYL_REG + OUT DX,AL + MOV AL,8 + INC DX //IDE_HCYL_REG + OUT DX,AL + MOV AL,WIN_PACKETCMD + CALL BCD2_CMD + MOV AX,0xA800 + CALL BCD2_PKT +BCD2_BLK_HI:: + MOV AX,512 + CALL BCD2_PKT +BCD2_BLK_LO:: + MOV AX,512 + CALL BCD2_PKT + XOR AX,AX //cnt_hi + CALL BCD2_PKT +BCD2_BLK_CNT:: + MOV AX,512 + PUSH AX + CALL BCD2_PKT + XOR EAX,EAX + CALL BCD2_PKT + + POP AX //cnt + SHL EAX,10 + MOV EBX,EAX + +@@10: CALL BCD2_WAIT_DRQ + + XOR ECX,ECX + MOV DX,SI + ADD DX,IDE_HCYL_REG + IN AL,DX + MOV CH,AL + MOV DX,SI + ADD DX,IDE_LCYL_REG + IN AL,DX + MOV CL,AL + SHR1 CX + JZ @@10 + CMP CX,0x7F00 + JB @@20 + MOV CX,0x7F00 +@@20: PUSH CX + MOV DX,SI + ADD DX,IDE_DATA_REG + REP_INSW + + MOV AX,DI + SHR AX,4 + MOV DX,AX + MOV AX,ES + ADD AX,DX + MOV ES,AX + AND DI,0xF + + POP CX + SUB EBX,ECX + JZ @@100 //TODO look-up branch + JNC @@10 + +@@100: CALL BCD2_WAIT_NOT_BUSY + + MOV AX,SI + SHL EAX,16 + MOV AH,U1 [BCD2_UNIT_VALUE+1] + MOV AL,BOOT_CODE_CDROM + MOV EBX,EAX + + DU1 0xEA; +BCD2_JMP_START:: + DU2 0,BOOT_ADDRESS/16; +BCD2_END:: + END +} \ No newline at end of file diff --git a/LT/UTILS/BOOTCD2.BIZ b/LT/UTILS/BOOTCD2.BIZ new file mode 100644 index 0000000000000000000000000000000000000000..fbbf2e794f86cb2bf9620ec65324f6cf950558db GIT binary patch literal 1270 zcmaFK%fL{{%)s!Ig@Hk^tnBlj9SQT(`VOS^UD(6G^@4#Ry7{%h!PhKlJtvqCr}f>~ z$-rU!&G`T4C22hu()w=fU~ow5J7D~OUk<~I(~L$>&Wi0TV6+J?VYewRVcz$FF>K!q z#uuBw5^)C}u<$%c?@(f5VEFYag(+b^FBc3t<>!}V=A|q67l5QWJ|)6^aW|lQYvQ6-qKv6>{>E6H7Al^Az&a zzSFhMtQop zA{l4J0P-;ocYu7Jn^;_uTBJ~#mstX`nwJY|w*elzL-R6A6f_KMeIa`DixdoPgL4wg zQZ=m@)^Hst;oriyo1NjT!0S)l*P0Kpzc~z|*fxB4cev|;(E$*L@m<#u5Y7JX@QYjj zRT@fv9)5A@zY0gm&%*&PzWk5wI^OjdB+u~v@QZ{0H*mZ-`v1k%|A$|E{GYaSK^r5( zu1e-NX`ZFOUo82*f#Jo9|1Wm@e=+I5ibLs(bN^r8e$o4X!-5wR|LqUo`#)S;F{+>p3RX8Sl)DsQJ`Xc6?4E2E^QHIaC-Nz5UVClY))^mXQP+H%C=I8v8Y1%hS zn2LA5c=oURSlYn{0_k0gW>5z;F;I80_lj0v2RoaDa({ z6}kikGBBvZgq(d{7#K2P_PP4GFfe$);{$>j7)oIpz-|IN-iU$00!7r%KP28M zG&quh;R#F}3@I=HUq??r1_n_WH#o#Ggn@w_#tjG!31(oJ!3c2( M$gvFni*LyQ0Eqj|dL+<>WM|a5QyxGd8z0L(&8?)5Fu?g8<`N$q;usWSWyQ6q65*nakplJ<}1-S<->Fndl%f;#JFXcH=@_A7P~l_&3J@^gEm+4f0wD(uQ<(pu!of&NT#?wp0Xm3a;pO5C4)Fv#(%I3+ zhtu6PB;GTCmkUCJoEhLB!080CDmc`M(|(Fevmg@klf)Mp#zH?UM|iE{~*p_Pn}?pw?S+dPaPK!JIFO4-q$}Y z*a_@Lkc?vl#OoloON5RK$Zei}A)E#khQ?q;pnx@~aCNi>2eJ_-DA5>VD4 z=* zs?;$8Vm&nN>w}U6I5OR#p%M@p?7<0&R!Cy-@%Ik^#{fv!IRfNZuyRKa9fJyU1DL5k zI?f)Tv;vAg=dchDS5Sa}d=YA-px_p46>Sg;2{4eDqmPcW4=D0Hf;b(0bU={@j(4mY zjj(9Mt=a^l8s;o$%z*s_jw9sw0y)JgLdVbo6h)q4kOT%2boSA4@d2kIA6rQ1@p5r` z`Z;rgT@6y<;-TXR@`0nD3#W^Rjv+{~i-&DSYGMk^UlBTnP**sE6oXVad)Ovd=0MY# z3(OK1A6u8A%(7IdYR3p2_h2X+mSbQk7+Q=#A`R>*P(*=~ty6@KQv}Eo*I=t?r-)eF zq|!8~DUKdGMj#nS58I;D#1w_({1mulJ`lGXDkSA(^Kx;5&2$4<4`zWJ0`@vm!UknU zkT@rZ0a6Om<{!Wb7XybgD73%~kSb8J;RGcla4zuj4TyJgboK@%C4GJ8jMU_81uz+0 znhQ0{1>^!yRJjIw>bQclBPi5eog;KYO%yDmU4uPiq2UY?10^7^yig(QV9xoP;U0}4S-n-avCoeB70FBhkmlPjl#11Ld* xlcJA~x}&>pP&p5MX?J3)2Qh{ssIi&IhZz_d7@XW(;=OzW;)6pRgF+Y>#Gyj2elCz81Ia_>6c`}No&8;085p9WydYPI H^nV5b+fIhY literal 0 HcmV?d00001 diff --git a/LT/UTILS/BOOTHD.ASZ b/LT/UTILS/BOOTHD.ASZ new file mode 100644 index 0000000..1997d28 --- /dev/null +++ b/LT/UTILS/BOOTHD.ASZ @@ -0,0 +1,185 @@ +//This only boots to primary IDE, unit 0 +asm { +#define BOOT_ADDRESS 0x040000 +#define BLK_SIZE 0x200 +#define LT_XSUM 0xA5CF3796 +#define BOOT_HIGH_LOC ((0xA0000-2*BLK_SIZE)>>4) + +#define BOOT_CODE_FLOPPY 1 +#define BOOT_CODE_HARDDRIVE 2 +#define BOOT_CODE_CDROM 3 +#define BOOT_CODE_RAM 4 + +#define WIN_MULTREAD 0xC4 /* read sectors using multiple mode*/ +#define WIN_DEV_RESET 0x08 +#define WIN_READ_NATIVE_MAX 0xF8 +#define WIN_SET_MAX 0xF9 + +#define ERR_STAT 0x01 +#define INDEX_STAT 0x02 +#define ECC_STAT 0x04 /* Corrected error */ +#define DRQ_STAT 0x08 +#define SEEK_STAT 0x10 +#define WRERR_STAT 0x20 +#define READY_STAT 0x40 +#define BUSY_STAT 0x80 + +#define BAD_R_STAT (BUSY_STAT | ERR_STAT) +#define BAD_W_STAT (BAD_R_STAT | WRERR_STAT) +#define BAD_STAT (BAD_R_STAT | DRQ_STAT) +#define DRIVE_READY (READY_STAT | SEEK_STAT) +#define DATA_READY (DRQ_STAT) + +#define IDE_BASE0 0x1F0 +#define IDE_BASE1 0x3F6 + +#define IDE_DATA_REG (IDE_BASE0+0) +#define IDE_FEATURE_REG (IDE_BASE0+1) +#define IDE_NSECTOR_REG (IDE_BASE0+2) +#define IDE_SECTOR_REG (IDE_BASE0+3) +#define IDE_LCYL_REG (IDE_BASE0+4) +#define IDE_HCYL_REG (IDE_BASE0+5) +#define IDE_SELECT_REG (IDE_BASE0+6) +#define IDE_STATUS (IDE_BASE0+7) +#define IDE_CMD (IDE_BASE0+7) +#define IDE_CONTROL_REG (IDE_BASE1+0) + + + USE16 +BHD2_START:: + DU1 32 DUP(0); +BHD2_CODE:: + CLI + CLD + MOV AX,BOOT_HIGH_LOC + MOV SS,AX + MOV ES,AX + MOV SP,2*BLK_SIZE + CALL U2 GET_IP +GET_IP: + POP BX + SUB BX,GET_IP + SHR BX,4 + MOV AX,CS //COPY HIGH + ADD AX,BX + MOV DS,AX + MOV CX,BLK_SIZE + XOR SI,SI + XOR DI,DI + REP_MOVSB + + DU1 0xEA; + DU2 BHD2_HISTART,BOOT_HIGH_LOC; + +BHD2_WAIT_BUSY: + MOV DX,IDE_STATUS + IN AL,DX + AND AL,BUSY_STAT + JNZ BHD2_WAIT_BUSY + RET + +BHD2_ATA_CMD: + PUSH AX + MOV DX,IDE_FEATURE_REG + XOR AL,AL + OUT DX,AL + POP AX + MOV DX,IDE_CMD + OUT DX,AL + RET + +BHD2_SELECT: + MOV DX,IDE_SELECT_REG + MOV AL,0xE0 //Unit 0 + OUT DX,AL + RET + +BHD2_BLK:: DU4 ?; + + +BHD2_HISTART: +//Init Drive + CALL BHD2_SELECT + MOV AL,WIN_DEV_RESET + CALL BHD2_ATA_CMD + CALL BHD2_WAIT_BUSY + + CALL BHD2_SELECT + MOV AL,WIN_READ_NATIVE_MAX + CALL BHD2_ATA_CMD + CALL BHD2_WAIT_BUSY + + MOV DX,IDE_CONTROL_REG + MOV AL,8 + OUT DX,AL + MOV DX,IDE_SECTOR_REG + XOR AL,AL + OUT DX,AL + MOV DX,IDE_NSECTOR_REG + OUT DX,AL + MOV DX,IDE_LCYL_REG + OUT DX,AL + MOV DX,IDE_HCYL_REG + OUT DX,AL + MOV DX,IDE_SELECT_REG + OR AL,0xEF //Unit 0 + OUT DX,AL + + MOV AL,WIN_SET_MAX + CALL BHD2_ATA_CMD + CALL BHD2_WAIT_BUSY + +BHD2_RESTART:: + MOV CX,512 //Gets patched + MOV AX,BOOT_ADDRESS/16 + MOV ES,AX + +@@1: XOR DI,DI + PUSH CX + +//READ BLK + MOV DX,IDE_CONTROL_REG + MOV AL,8 + OUT DX,AL + MOV DX,IDE_SECTOR_REG + MOV AL,U1 [BHD2_BLK] + OUT DX,AL + MOV DX,IDE_NSECTOR_REG + MOV AL,1 //Blk Cnt + OUT DX,AL + MOV DX,IDE_LCYL_REG + MOV AL,U1 [BHD2_BLK+1] + OUT DX,AL + MOV DX,IDE_HCYL_REG + MOV AL,U1 [BHD2_BLK+2] + OUT DX,AL + MOV DX,IDE_SELECT_REG + MOV AL,U1 [BHD2_BLK+3] + OR AL,0xE0 //Unit 0 + OUT DX,AL + MOV AL,WIN_MULTREAD + CALL BHD2_ATA_CMD + + MOV DX,IDE_STATUS +@@10: IN AL,DX + AND AL,DATA_READY + JZ @@10 + MOV CX,BLK_SIZE/2 + MOV DX,IDE_DATA_REG + REP_INSW + CALL BHD2_WAIT_BUSY + + POP CX + INC U4 [BHD2_BLK] + MOV AX,ES + ADD AX,BLK_SIZE/16 + MOV ES,AX + LOOP @@1 + + MOV EBX,BOOT_CODE_HARDDRIVE + DU1 0xEA; +BHD2_JMP_START:: + DU2 0,BOOT_ADDRESS/16; +BHD2_END:: + END +} \ No newline at end of file diff --git a/LT/UTILS/BOOTHD.BIZ b/LT/UTILS/BOOTHD.BIZ new file mode 100644 index 0000000000000000000000000000000000000000..67436b1e20ee04835e149ff03212566ee4ce16f9 GIT binary patch literal 433 zcmaFK%fMj4$iT3Jk%8fCyJ#T;0r2b3jsx@4`YxpP9oWOb@`8aOy7{%?!PhKlJtvqC zr}f>~$-rd%&G`T4C9m=s4$R;6o$-xIL+Ovh0lPjj8Xb5SvFkhIyTiM_F>ZM9?l8!v z7oYxb;CS)i|BEaCUp)W6;m3=s|6iQ^zv~|6=j~oeWGn7#!024jBIrgzHG}%4T3-c(>~l;|8$4^sXE*|0`p9S1y?K zjWN9|kAZ=K=fS%TM_wfU2fLA@n;dASNolX5bX6`b<(b3#oNoQqNuOH!RvobvNaz+Tkk``r6x^J1@{6H7P#7i^+4?%>QEEwPQJw-Q)mig$fzulN2C!D)|S4GdRdTuou9#dFB&^Ge(_ zK+21ClvIAj_v9_qQyDCpb{=t3~>lZ z2J972Lj~uI)Z}bX+=5CgkWW%T1(>Y?%p1@wo}8aoVhfE(1qDw-g>q;C7Y|VnCc$p- z2?JteSV3JT>JnK`Kn8X#A~wL=V0P;$*HNi9+ca`c6m zq@Yn+T$-4ZQ>mctq^_xumS3b$lA2qPUzAu>sQ^k`#a1v=70`Vdk{?=7kXoeSo?7CZ zkqAxY3JMAe&P6_HP^Ty;6xf1Y8j=qW2o2QG0);?nlSQgez^!Rqo# zY~37vf?c8Z*Fw_1TYgb)VhNhVb-)TCB+L^iIRO$^XwCr}3^o>8AfU>_iUwXTXj+4m z1)$2rGdD3k6_hB8i;^J;4VuZIoKOn|t^CrGcu)xrl0g&>&ON$fXb1w%o*mcu-Mf3obZ7(jdp6h~y>~fYKDi zTw4QBpn<{{)nr?@%)AuW3Q%FEp@d|ksgkC(f`Y!jXP!cGVsWZMqC$RJS`Mg1lMHE3 z6oGO>K~ZXPYF-J*SWwDQL^T^)l%WdZvXC_UKsJICl?FU|VE%)ZzK$-?#)yIf$Ze>u z&`<(NI|lngi(n`ZvmAyd8*t(SR}2aYFbkaheFHpwT#?FmbUU1V1EA(R`v#C?Hb&Kf zZZzJ?1B;`RO4DqEQWH}^%^eL`y`lq3GoShqF z9h^F0*&Cc!GV{_ElyqR~bd(g*it=+6p!F75IV74=ic25~5o8rK451-cU<=9%$)!c{ z1+dZ^8q&}zNeR^WvQkhru!x8$ipf*bfoD93VW27m(ma5>BdIhEp-RU<$0sD-F(f1? z-pw<@)djf_fixOQp)EUzTTzmff`UtG4sw025A__xZfHHhTcSlmQtWX1$TLZ zQR@|@7MJEA7mq$6h?)!>uviKhpAe8O!6ikd$t4QV)-Sl7;F?!bRH={xZ2_AoXr-ip z%?Pzn$V6%ygWAkV5DDZ~GAREjB4QBK)PO{$Ej*~8F_x49tAHSm)j;S18(UnSS(2Qg zppldUsbSzXCb*D+)HaSGjsc!lpd1dWsK9oElUgdsZ;)acZY`*N0&$9t8Ym&_z#H(O zh7>0>c3`;|WS#<~E=MglAQBK;5Pb=-i$PLQW1x`?5IQ^Yz-bNU8?<1?o~0lKVF4uM6>S4T z;(bD(WpqGkNpNLxNNPoihEi}yyq`Zv4w^qfwKb$Gsh|K4cw5xQ8(bWcDxv!AO{UXm2ZAZW?Chv zWP}%J3Q76-B??8U$@xVo@Rp;3LQ;`lR%vcQd}3Zod|rM*v_Y(`L4~UmG?ie=8^+oi z8{m{R0_nCy$YafHoET}36Vf5{a50Jxas~Irz&%1v1yDcP7Sct9b>Be!QyAMC+#pOz zv2_Azb@K6s2xz6GfSQ#li6x2JDXDtNIi* zSpt$Rq5gJrA;;UGPB4;A6NoE7z4`)OJ3@YUbBPCe3!(?q3xIpw%_Sb}bEpauJPu0L z3JTz+E{F*>)jHG0#M}ZFcu7Tiuz*9Pk#I6H4=8hjD<`A^5o|G-fEHAc`U}>;M(!kpKVy literal 0 HcmV?d00001 diff --git a/LT/UTILS/BOOTRAM.BIZ b/LT/UTILS/BOOTRAM.BIZ new file mode 100644 index 0000000000000000000000000000000000000000..eef07911266196ece3f3c47a6eb385d3358191d8 GIT binary patch literal 2020 zcmaFK%fR5y&cN`Toq@sngwmzZ?l-$x7#JA-r*bfig3%Bd4S~@R7!83D69UX^3=E;& zZyMhSFfcHLg?DfL^8f$;?!6!W|Nn1%!1z*70F=Dc>-r-opxc#WW>CO?(Rv1k<|7K- zAB->UkY-?D=w_H{e5sqE`Gr99Er#wNzl<;Sx`_k@7+>mj7l>{?!qUkM5|IcB=srFZ zB;4)B5*^8WSok7bvQ0sNfdM4d>%@W(RDlY1w}V&^@t}Y#h71M)1_qGn3Scd63PAy( z-EYFeyK7mxOL@9|MYvCvFnwMU9~awvM56f!N3ZLT{{<}n4Z4rbgt`H@a*(kCAY;4T zWgw0W3V3nt$N&G$M>yi+8jpa&DfX}eGbn{PvN152vN16HXJB9lg+p*;aJ-Yhe@MKO zW3Vd&dp!d~P-^SA;moPAbDrb;{ql-(BYj7~g1O^7@fOy}?_@GcfhW{=`@d4f; L3=A?%3=B>H4CJLp literal 0 HcmV?d00001 diff --git a/LT/UTILS/BOOTRAM.CPZ b/LT/UTILS/BOOTRAM.CPZ new file mode 100644 index 0000000000000000000000000000000000000000..3fcb2c891be975475d86784ca6441e9864434051 GIT binary patch literal 991 zcmYeTNL8rzPE9QcD9S8LEJ@Yy_tUhl<>gY&%uCKGO-WTy()S6`_Yd|>%*@kwbaC|c z*7FF6QsU)GEY4M^#-YwX*wfEhiI)r0a5p!w>COT1zLD`kp?+3Yyj+|Cp}`)Uu1*2G zT%5lCVIY={YcPTrq2uK59}@5E@8TLC{TPEUvUS9F;oS1^P#>4OQM7^RDzewCnOc@ zCSn6>D1aa`AE%lqTh5CPO5h^7BhHJPj4J(lT>W^AdAY zHF>$JdASr6LM;@EGpkaqL2UnGP?QCi6qP2IC}?G5#%Jaxrl;Blr6#7hW#*)6!1U^< zfwXAq@N#h~K!8?GK2&jWWpR8`ett=OQettcE=XN|nub$m9>@TX)Wnq3B8d4QCn_j7 z=VXGNs-OU~P1g>t+ZJZ1HX&mWnlr#wfGtO8N0QcqD#%YuD^4u|`x+q&wmCUJCDj%s z^`NN&`7k#%Hz_B(7;c5G9g-;2N4}}K&IOekY6$bwQ%Xt_lXTQz{?fIBia`D6o>CH$ zm;?opcode_cnt && j<(*tempi2)->opcode_cnt) { + i1=(*tempi1)->opcode[j]; + i2=(*tempi2)->opcode[j]; + result=i1-i2; + if (result) return result; + j++; + } else { + i1=(*tempi1)->opcode_cnt; + i2=(*tempi2)->opcode_cnt; + result=i1-i2; + if (result) return result; + + i1=(*tempi1)->slash_value; + i2=(*tempi2)->slash_value; + if (i1==8) i1=-1; + if (i2==8) i2=-1; + result=i1-i2; + if (result) return result; + + i1=(*tempi1)->operand_size32; + i2=(*tempi2)->operand_size32; + result=i1-i2; + if (result) return result; + return result; + } + } +} + +void LoadDisasmTable() +{ + SysHashTable *h=asm_hash; + OpcodeHashEntry *temph; + InstructionEntry *tempi; + U8 cnt=0; + I8 i,j,k; + + for (i=0;i<=h->mask;i++) { + temph=h->body[i]; + while (temph) { + if (temph->type==HTT_OPCODE) + cnt+=temph->instruction_entry_cnt; + temph=temph->next; + } + } + disasm_table_entries=cnt; + + j=0; + disasm_table=MAlloc(cnt*PTR_SIZE); + for (i=0;i<=h->mask;i++) { + temph=h->body[i]; + while (temph) { + if (temph->type==HTT_OPCODE) { + tempi=&temph->ins; + for (k=0;kinstruction_entry_cnt;k++) { + disasm_table[j++]=tempi; + tempi+=sizeof(InstructionEntry); + } + } + temph=temph->next; + } + } + + QSort(disasm_table,cnt,PTR_SIZE,&CompareInstructionEntries); +} + +if (!disasm_table) + LoadDisasmTable; + + +BoolU4 PutSourceLine(U4 *add,U8 cnt) +{ + ClassStruct *tempc; + U8 i,minl,maxl,offset; + DbgInfo *dbg; + U4 *body; + I1 *src,*src2; + tempc=FindPSect(add,&offset); + if (tempc) { + dbg=tempc->debug; + if (dbg) { + body=dbg->body; + minl=dbg->min_line; + maxl=dbg->max_line; + for (i=minl;i<=maxl;i++) { + if ((body[i-minl]>=add) && + (body[i-minl]source_link); + src2=MAlloc(StrLen(src)+1); + RemoveFirstSeg(src,":",src2); + RemoveLastSeg(src,",",src2); + PrintF("$$LK -A \"FL:%s,%d\"$$",src,i); + Free(src); + Free(src2); + return TRUE; + } + } + } + } + return FALSE; +} + +public void DasmIns(I1 *buf,U1 **add,BoolU4 use16=FALSE) +{ + U1 *ip=*add,*bb; + U2 *ww; + U4 *dd; + I4 disp,imm; + BoolU4 opsize16=use16,opadd16=use16,cont; + I4 i,j,k,l,m,o1,o2,a1,a2,aa1,aa2,arg1_size=0,arg2_size=0,a1_size,a2_size, + ModrM=-1,SIB=-1,scale,r1,r2, + Mod=-1,RM1=-1,RM2=-1; + InstructionEntry *tempi; + OpcodeHashEntry *tempo,dummy; + I1 *a1_st,*a2_st,*bin_data_area,*bin_data_area2, + buf2[256],buf3[256],seg_overrides[40],arg1_st[256],arg2_st[256]; + + *arg1_st=0; + *arg2_st=0; + a1_st=arg1_st; + a2_st=arg2_st; + + if (PutSourceLine(ip,1)) + CrLf; + SPrintF(buf,"%16tP ",ip); + bin_data_area=buf+StrLen(buf); + for (i=0;i<6;i++) { + SPrintF(buf2,"%02X",ip[i]); + StrCat(buf,buf2); + } + StrCat(buf," "); + + SPrintF(buf3,"%16tP ",ip+6); + bin_data_area2=buf3+StrLen(buf3); + for (i=6;i<12;i++) { + SPrintF(buf2,"%02X",ip[i]); + StrCat(buf3,buf2); + } + + *seg_overrides=0; + cont=TRUE; + do { + switch (*ip++) { + case 0x2E: StrCat(seg_overrides,"CS:"); break; + case 0x36: StrCat(seg_overrides,"SS:"); break; + case 0x3E: StrCat(seg_overrides,"DS:"); break; + case 0x26: StrCat(seg_overrides,"ES:"); break; + case 0x64: StrCat(seg_overrides,"FS:"); break; + case 0x65: StrCat(seg_overrides,"GS:"); break; + case 0x66: opsize16=!opsize16; break; + case 0x67: opadd16=!opadd16; break; + default: cont=FALSE; + } + } while (cont); + ip--; + + i=0; + j=disasm_table_entries-1; + do { + k=(i+j)>>1; //binary search + tempi=disasm_table[k]; + m=0; + l=0; + while (TRUE) { + if (lopcode_cnt) { + o1=ip[l]; + if (l==tempi->opcode_cnt-1 && + tempi->plus_opcode) + o1&=-8; + o2=tempi->opcode[l]; + m=o1-o2; + l++; + if (m) + break; + } else { + if (tempi->slash_value<8) { + o1=(ip[l] >> 3) & 7; + o2=tempi->slash_value; + m=o1-o2; + if (!m) { + if (opsize16) { + if (tempi->operand_size32) + m=-1; + } else { + if (tempi->operand_size16) + m=1; + } + } + break; + } else { + m=0; + if (opsize16) { + if (tempi->operand_size32) + m=-1; + } else { + if (tempi->operand_size16) + m=1; + } + break; + } + } + } + + if (m>0) { + if (k==i) { + k=j; + break; + } else + i=k; + } else if (m<0) { + if (k-i<=1) { + k=i; + break; + } else + j=k; + } else + break; + } while (TRUE); + + tempi=disasm_table[k]; + ip+=tempi->opcode_cnt; + tempo=tempi-(tempi->ins_entry_num*sizeof(InstructionEntry))+&dummy-&dummy.ins; + StrCat(buf,tempo->string); + + a1=tempi->arg1; + a2=tempi->arg2; + aa1=a1; + aa2=a2; + + StrCpy(buf2,SysTextSub(a1,"ST_ARGUMENT_TYPES")); + if (StrStr(buf2,"8")) + arg1_size=1; + else if (StrStr(buf2,"16")) + arg1_size=2; + else if (StrStr(buf2,"32")) + arg1_size=4; + + StrCpy(buf2,SysTextSub(a2,"ST_ARGUMENT_TYPES")); + if (StrStr(buf2,"8")) + arg2_size=1; + else if (StrStr(buf2,"16")) + arg2_size=2; + else if (StrStr(buf2,"32")) + arg2_size=4; + + a1_size=arg1_size; + a2_size=arg2_size; + if (tempi->plus_opcode && (tempi->slash_value==8 || + tempi->opcode_modifier>=OM_RB && tempi->opcode_modifier<=OM_RD)) { + ip--; + RM1=*(ip++) - tempi->opcode[tempi->opcode_cnt-1]; + *buf2=0; + if (a1>=ARGT_R8 && a1<=ARGT_R32) { + if (a1_size==1) + SPrintF(buf2,"%Z",RM1,"ST_U1_REGS"); + else if (a1_size==2) + SPrintF(buf2,"%Z",RM1,"ST_U2_REGS"); + else if (a1_size==4) + SPrintF(buf2,"%Z",RM1,"ST_U4_REGS"); + StrCat(a1_st,buf2); + } else { + if (a2_size==1) + SPrintF(buf2,"%Z",RM1,"ST_U1_REGS"); + else if (a2_size==2) + SPrintF(buf2,"%Z",RM1,"ST_U2_REGS"); + else if (a2_size==4) + SPrintF(buf2,"%Z",RM1,"ST_U4_REGS"); + StrCat(a2_st,buf2); + } + } + if ((a1>=ARGT_RM8 && a1<=ARGT_RM32) || + (a2>=ARGT_RM8 && a2<=ARGT_RM32)) { + if (a2>=ARGT_RM8 && a2<=ARGT_RM32) { + a1_st=arg2_st; + a2_st=arg1_st; + a1_size=arg2_size; + a2_size=arg1_size; + aa1=a2; + aa2=a1; + } + StrCat(a1_st,seg_overrides); + ModrM=*(ip++); + Mod=(ModrM>>6) & 3; + RM1=ModrM & 7; + RM2=(ModrM>>3) & 7; + if (Mod<3 && RM1==4) { + SIB=*(ip++); + } + if (Mod==1) { + bb=ip; + disp=*bb; + SPrintF(buf2,"%02X",disp); + StrCat(a1_st,buf2); + ip++; + } + if (Mod==2) { + dd=ip; + disp=*dd; + SPrintF(buf2,"%08X",disp); + StrCat(a1_st,buf2); + ip=ip+4; + } + if (tempi->slash_value<8) + RM2=-1; + else { + *buf2=0; + if (aa2==ARGT_SREG) + SPrintF(buf2,"%Z",RM2,"ST_SEG_REGS"); + else if (!(aa2>=ARGT_IMM8 && aa2<=ARGT_IMM32) && + !(aa2>=ARGT_UIMM8 && aa2<=ARGT_UIMM32)) { + if (a2_size==1) + SPrintF(buf2,"%Z",RM2,"ST_U1_REGS"); + else if (a2_size==2) + SPrintF(buf2,"%Z",RM2,"ST_U2_REGS"); + else if (a2_size==4) + SPrintF(buf2,"%Z",RM2,"ST_U4_REGS"); + } + StrCat(a2_st,buf2); + } + if (RM1==5 && Mod==0) { + dd=ip; + disp=*dd; + SPrintF(buf2,"[%X] ",disp); + StrCat(a1_st,buf2); + ip=ip+4; + RM1=-1; + } else { + if (Mod<3) { + if (RM1==4) { + RM1=-1; + r1=SIB & 7; + r2=(SIB >> 3) & 7; + scale=(SIB >> 6) &3; + if (scale==3) + scale=8; + else if (scale==2) + scale=4; + else if (scale==1) + scale=2; + else + scale=1; + if (r1==5 && Mod==0) { + dd=ip; + disp=*dd; + SPrintF(buf2,"%08X",disp); + StrCat(a1_st,buf2); + ip=ip+4; + SPrintF(buf2,"[%Z*%d]",r2,"ST_U4_REGS",scale); + StrCat(a1_st,buf2); + } else { + SPrintF(buf2,"[%Z+%Z*%d]",r1,"ST_U4_REGS", + r2,"ST_U4_REGS",scale); + StrCat(a1_st,buf2); + } + } else { + *buf2=0; + if (opadd16) + SPrintF(buf2,"[%Z]",RM1,"ST_U2_REGS"); + else + SPrintF(buf2,"[%Z]",RM1,"ST_U4_REGS"); + StrCat(a1_st,buf2); + } + } else { + *buf2=0; + if (a1_size==1) + SPrintF(buf2,"%Z",RM1,"ST_U1_REGS"); + else if (a1_size==2) + SPrintF(buf2,"%Z",RM1,"ST_U2_REGS"); + else if (a1_size==4) + SPrintF(buf2,"%Z",RM1,"ST_U4_REGS"); + StrCat(a1_st,buf2); + } + } + } + if (a1>=ARGT_MOFFS8 && a1<=ARGT_MOFFS32) { + StrCat(arg1_st,seg_overrides); + if (arg1_size==1) { + bb=ip; + disp=*bb; + ip++; + SPrintF(buf2,"[%X]",disp); + StrCat(arg1_st,buf2); + } else if (opadd16) { + ww=ip; + disp=*ww; + ip=ip+2; + SPrintF(buf2,"[%X]",disp); + StrCat(arg1_st,buf2); + } else { + dd=ip; + disp=*dd; + ip=ip+4; + SPrintF(buf2,"[%X]",disp); + StrCat(arg1_st,buf2); + } + } + + if (a2>=ARGT_MOFFS8 && a2<=ARGT_MOFFS32) { + StrCat(arg2_st,seg_overrides); + if (arg2_size==1) { + bb=ip; + disp=*bb; + ip++; + SPrintF(buf2,"[%X]",disp); + StrCat(arg2_st,buf2); + } else if (opadd16) { + ww=ip; + disp=*ww; + ip=ip+2; + SPrintF(buf2,"[%X]",disp); + StrCat(arg2_st,buf2); + } else { + dd=ip; + disp=*dd; + ip=ip+4; + SPrintF(buf2,"[%X]",disp); + StrCat(arg2_st,buf2); + } + } + + if (a1==ARGT_IMM8 || a1==ARGT_UIMM8) { + bb=ip; + imm=*bb; + SPrintF(buf2,"%02X",imm); + StrCat(arg1_st,buf2); + ip++; + } else if (a1==ARGT_IMM16 || a1==ARGT_UIMM16) { + ww=ip; + imm=*ww; + SPrintF(buf2,"%04X",imm); + StrCat(arg1_st,buf2); + ip=ip+2; + } else if (a1==ARGT_IMM32 || a1==ARGT_UIMM32) { + dd=ip; + imm=*dd; + SPrintF(buf2,"%08X",imm); + StrCat(arg1_st,buf2); + ip=ip+4; + } else if (a1==ARGT_REL8) { + bb=ip; + disp=*bb; + if (disp>=0x80) + disp=disp | 0xFFFFFF00; + ip++; + disp=disp+ip; + SPrintF(buf2,"%P ",disp); + StrCat(arg1_st,buf2); + } else if (a1==ARGT_REL16) { + ww=ip; + disp=*ww; + if (disp>=0x8000) + disp=disp | 0xFFFF0000; + ip=ip+2; + disp=disp+ip; + SPrintF(buf2,"%P ",disp); + StrCat(arg1_st,buf2); + } else if (a1==ARGT_REL32) { + dd=ip; + disp=*dd; + ip=ip+4; + disp=disp+ip; + SPrintF(buf2,"%P ",disp); + StrCat(arg1_st,buf2); + } else if (a1==ARGT_CL) + StrCat(arg1_st,"CL"); + else if (a1==ARGT_AL) + StrCat(arg1_st,"AL"); + else if (a1==ARGT_AX) + StrCat(arg1_st,"AX"); + else if (a1==ARGT_EAX) + StrCat(arg1_st,"EAX"); + else if (a1==ARGT_DX) + StrCat(arg1_st,"DX"); + else if (a1==ARGT_SS) + StrCat(arg1_st,"SS"); + else if (a1==ARGT_DS) + StrCat(arg1_st,"DS"); + else if (a1==ARGT_ES) + StrCat(arg1_st,"ES"); + else if (a1==ARGT_FS) + StrCat(arg1_st,"FS"); + else if (a1==ARGT_GS) + StrCat(arg1_st,"GS"); + else if (a1==ARGT_CS) + StrCat(arg1_st,"CS"); + + if (a2==ARGT_IMM8 || a2==ARGT_UIMM8) { + bb=ip; + imm=*bb; + SPrintF(buf2,"%02X",imm); + StrCat(arg2_st,buf2); + ip++; + } else if (a2==ARGT_IMM16 || a2==ARGT_UIMM16) { + ww=ip; + imm=*ww; + SPrintF(buf2,"%04X",imm); + StrCat(arg2_st,buf2); + ip=ip+2; + } else if (a2==ARGT_IMM32 || a2==ARGT_UIMM32) { + dd=ip; + imm=*dd; + SPrintF(buf2,"%08X",imm); + StrCat(arg2_st,buf2); + ip=ip+4; + } else if (a2==ARGT_CL) + StrCat(arg2_st,"CL"); + else if (a2==ARGT_AL) + StrCat(arg2_st,"AL"); + else if (a2==ARGT_AX) + StrCat(arg2_st,"AX"); + else if (a2==ARGT_EAX) + StrCat(arg2_st,"EAX"); + else if (a2==ARGT_DX) + StrCat(arg2_st,"DX"); + else if (a2==ARGT_SS) + StrCat(arg2_st,"SS"); + else if (a2==ARGT_DS) + StrCat(arg2_st,"DS"); + else if (a2==ARGT_ES) + StrCat(arg2_st,"ES"); + else if (a2==ARGT_FS) + StrCat(arg2_st,"FS"); + else if (a2==ARGT_GS) + StrCat(arg2_st,"GS"); + else if (a2==ARGT_CS) + StrCat(arg2_st,"CS"); + + if (*arg1_st) { + StrCat(buf,"\t"); + StrCat(buf,arg1_st); + } + if (*arg2_st) { + StrCat(buf,","); + StrCat(buf,arg2_st); + } + for (i=ip-*add;i<6;i++) { + bin_data_area[i<<1]=CH_SPACE; + bin_data_area[i<<1+1]=CH_SPACE; + } + for (i=ip-*add;i<12;i++) { + bin_data_area2[(i-6)<<1]=CH_SPACE; + bin_data_area2[(i-6)<<1+1]=CH_SPACE; + } + StrCat(buf,"\r\n"); + if (ip-*add>6) { + StrCat(buf,buf3); + StrCat(buf,"\r\n"); + } + *add=ip; +} + + +public U1 *Dasm(U1 *ip,U8 cnt=20,BoolU4 use16=FALSE) +{ //This counts instructions + I8 i; + I1 buf[512]; + for (i=0;i=0 && i=filter_cnt) { + PrintF("$$FG GREEN$$%3d.%02d%% %08X:",routine_total*100/total_time, + routine_total*10000/total_time%100,routine_total); + PrintF("%s\r\n$$FG$$",last_buf); + } + StrCpy(last_buf,buf2); + routine_total=0; + } + hits=pf_array[i]; + routine_total+=hits; + if (hits>=filter_cnt) { + PrintF("%3d.%02d%% %08X:",hits*100/total_time, + hits*10000/total_time%100,hits); + if (!PutSourceLine(ip,ip-last_ip+1)) + PrintF("%s\r\n",buf); + else + CrLf; + last_ip=ip; + } + } + if (*last_buf && routine_total>=filter_cnt) { + PrintF("$$FG GREEN$$%3d.%02d%% %08X:",routine_total*100/total_time, + routine_total*10000/total_time%100,routine_total); + PrintF("%s\r\n$$FG$$",last_buf); + } + prof_on=TRUE; +} + +public void FunRep(I1 *st) +{ + ClassStruct *tempc=FindLocalHash(st,HTT_FUNCTION); + MemberListStruct *tempm; + if (tempc) { + tempm=tempc->member_list; + while (tempm) { + PrintF("%08X %s\r\n",tempm->offset,tempm->string); + tempm=tempm->next; + } + } +} + +public BoolU4 CheckPtr(U1 *ptr) +{ + if (ptr>=sys_heap_base && ptr<=sys_heap_limit) + return TRUE; + else if (ptrsize)) { + LtfPrintF(l,"Bad Ptr:%08X\r\n",d); + return; + } + LtfPrintF(l,"Class:\"%s\"\r\n",class_name); + ml=cl->member_list; + while (ml) { + cl2=ml->member_class; + ptr=d+ml->offset; + LtfPrintF(l,"%08X ",ptr); + j=cl2->pointer_cnt; + cl2-=cl2->pointer_cnt*sizeof(ClassStruct); + while (cl2->return_class) { + cl2=cl2->return_class; + cl2-=cl2->pointer_cnt*sizeof(ClassStruct); + } + if (cl2->type & HTT_INTERNAL_TYPE) { + LtfPrintF(l,"$$FG GREEN$$%-20ts:$$FG$$",ml->string); + if (!j && ml->cnt==0) { + switch (cl2->sub_type) { + case IT_I1: + LtfPrintF(l,"%02X '%c'",ptr->u1[0],ptr->u1[0]); + break; + case IT_U1: + LtfPrintF(l,"%02X",ptr->u1[0]); + break; + case IT_I2: + LtfPrintF(l,"%04X",ptr->u2[0]); + break; + case IT_U2: + LtfPrintF(l,"%04X",ptr->u2[0]); + break; + case IT_I4: + LtfPrintF(l,"%08X",*ptr); + break; + case IT_U4: + LtfPrintF(l,"%08X",*ptr); + break; + case IT_I8: + ptr2=ptr; + LtfPrintF(l,"%016X",*ptr2); + break; + case IT_U8: + ptr2=ptr; + LtfPrintF(l,"%016X",*ptr2); + break; + case IT_DOUBLE: + ptr2=ptr; + LtfPrintF(l,"%16g",*ptr2); + break; + default: + LtfPrintF(l,"%08X",*ptr); + break; + } + } else if ((j==1 || ml->cnt) && + cl2->sub_type==IT_I1) { + if (j==1) { + if (CheckPtr(*ptr)) { + s2=MStringUtil(*ptr,SU_SAFE_DOLLAR); + LtfPrintF(l,"\"%40ts\"",s2); + Free(s2); + } + } else { + if (ml->cnt<40) + s=ptr+ml->cnt; + else + s=ptr+40; + ch=*s; + *s=0; + s2=MStringUtil(ptr,SU_SAFE_DOLLAR); + LtfPrintF(l,"\"%s\"",s2); + Free(s2); + *s=ch; + } + } else if (ml->cnt>0 && ml->cnt<=32 && !j) { + for (i=0;icnt;i++) { + switch (cl2->sub_type) { + case IT_I1: + LtfPrintF(l,"%02X '%c' ",ptr->u1[0],ptr->u1[0]); + ptr+=1; + break; + case IT_U1: + LtfPrintF(l,"%02X ",ptr->u1[0]); + ptr+=1; + break; + case IT_I2: + LtfPrintF(l,"%04X ",ptr->u2[0]); + ptr+=2; + break; + case IT_U2: + LtfPrintF(l,"%04X ",ptr->u2[0]); + ptr+=2; + break; + case IT_I4: + LtfPrintF(l,"%08X ",*ptr); + ptr+=4; + break; + case IT_U4: + LtfPrintF(l,"%08X ",*ptr); + ptr+=4; + break; + case IT_I8: + ptr2=ptr; + LtfPrintF(l,"%016X ",*ptr2); + ptr+=8; + break; + case IT_U8: + ptr2=ptr; + LtfPrintF(l,"%016X ",*ptr2); + ptr+=8; + break; + case IT_DOUBLE: + ptr2=ptr; + LtfPrintF(l,"%16g ",*ptr2); + ptr+=8; + break; + default: + LtfPrintF(l,"%08X ",*ptr); + ptr+=4; + break; + } + } + } else + LtfPrintF(l,"%08X",*ptr); + LtfPutS(l,"\r\n"); + } else { + if (depth<2) { + if (j==1 && !CheckPtr(*ptr)) + LtfPrintF(l,"%-20ts:%08X\r\n",ml->string,*ptr); + else { + LtfPrintF(l,"$$TR,\"%s\"$$\r\n",ml->string); + LtfPutS(l,"$$ID,2$$"); + if (!j) + ClassRep2(l,ptr,cl2->string,depth+1); + else if (j==1) + ClassRep2(l,*ptr,cl2->string,depth+1); + LtfPutS(l,"$$ID,-2$$"); + } + } else + LtfPrintF(l,"%-20ts\r\n",ml->string); + } + ml=ml->next; + } +} + +public void ClassRep(U1 *d,I1 *class_name) +{ + BoolU4 old_preempt=Preempt(OFF); + LtfSetMax(MAX_I4); + ClassRep2(Fs->cur_ltf,d,class_name,0); + LtfPutS(Fs->cur_ltf,"\r\n"); + LtfRecalc(Fs->cur_ltf); + Preempt(old_preempt); +} + +public void MachineRegsRep() +{ + ClassStruct *cl,*cn; + MemberListStruct *ml; + MachineRegsStruct m; + I4 *i_ptr; + + GetMachineRegs(&m); + cl=FindLocalHash("MachineRegsStruct",HTT_CLASS); + ml=cl->member_list; + while (ml) { + if (ml->fmtstr) { + i_ptr=&m+ml->offset; + cn=ml->member_class; + if (cn->type==HTT_INTERNAL_TYPE && ml->cnt==0) { + if (ml->fmtdata) + PrintF(ml->fmtstr,*i_ptr,ml->fmtdata); + else + PrintF(ml->fmtstr,*i_ptr); + PrintF(" %P",*i_ptr); + } else { + if (ml->fmtdata) + PrintF(ml->fmtstr,i_ptr,ml->fmtdata); + else + PrintF(ml->fmtstr,i_ptr); + PrintF(" %P",*i_ptr); + } + CrLf; + } + ml=ml->next; + } + CrLf; +} + +public void TssRep(TssStruct *tss=NULL) +{ + ClassStruct *cl,*cn; + MemberListStruct *ml; + I4 *i_ptr; + + if (!tss) tss=Fs; + cl=FindLocalHash("TssStruct",HTT_CLASS); + ml=cl->member_list; + while (ml) { + if (ml->fmtstr) { + i_ptr=tss+ml->offset; + cn=ml->member_class; + if ((cn->type & HTT_INTERNAL_TYPE) && ml->cnt==0) { + if (ml->fmtdata) + PrintF(ml->fmtstr,*i_ptr,ml->fmtdata); + else + PrintF(ml->fmtstr,*i_ptr); + PrintF(" %P",*i_ptr); + } else { + if (ml->fmtdata) + PrintF(ml->fmtstr,i_ptr,ml->fmtdata); + else + PrintF(ml->fmtstr,i_ptr); + PrintF(" %P",*i_ptr); + } + CrLf; + } + ml=ml->next; + } + CrLf; +} + +public void StackRep(U4 *esp) +{ + U8 i; + U4 my_esp[32]; + BoolU4 old_preempt=Preempt(OFF); + for (i=0;i<32;i++) { + my_esp[i]=*esp; + esp=esp+4; + } + Preempt(old_preempt); + for (i=0;i<32;i++) + PrintF("%08X [ESP+%04X]: %08X %P\r\n",my_esp+i<<2,i<<2,my_esp[i],my_esp[i]); + CrLf; +} + + +void DrawIt() +{ + ClearWindowText; +} + +public void ViewDisk(I1 drive=0) +{ + LTPartition *p=DriveToPartition(drive); + U1 *old_update_window=Fs->update_window; + Ltf *old_ltf=Fs->cur_ltf; + U8 lohi,c1,i,x,y, + l=(grheight-3*FONT_HEIGHT)*(grwidth-FONT_WIDTH<<1), + s=(p->size+p->spc-1)/p->spc; + U8 sc,ch; + U1 *bitmap; + GrBitMap *base=GrNew(grbase); + if (p->type!=PT_LT) + return; + + MaximizeWindow; + UpdateDerivedTssValues(Fs); + Fs->update_window=&DrawIt; + Fs->cur_ltf=NULL; + GrClear; + ClearWindowText; + try { + i=((s+7)>>3+BLK_SIZE-1)/BLK_SIZE; + bitmap=MAlloc(BLK_SIZE*i); + RBlks(p,bitmap,p->MAP1,i,TRUE); + i=0; + for (y=0;y<(grheight-3*FONT_HEIGHT);y++) { + if (ScanChar(&sc,&ch)) + break; + for (x=0;x<(grwidth-FONT_WIDTH<<1);x++) { + lohi=MulI8(i,s); + c1=lohi/l; + if (Bt(bitmap,c1)) + base->color=ROP_XOR+(GR_BLUE^GR_WHITE); + else + base->color=ROP_XOR+(GR_WHITE^GR_WHITE); + GrPlot3(base,x,y,0); + i++; + } + } + Free(bitmap); + } catch + UnlockPartition(p); + GetChar; + Fs->update_window=old_update_window; + GrClear; + Fs->cur_ltf=old_ltf; +} + +void ChkDskList(LTDirEntry *tempm1,U1 *bits,U1 *bits2,U8 size,U8 bpc) +{ + LTDirEntry *tempm2; + U8 i,j; + tempm2=tempm1->next; //skip "." directory + while (tempm1) { + tempm2=tempm1->next; + if (tempm1->attr & LT_ATTR_DIR) { + if (tempm1->sub) { + coutln SysText("ST_SCANNING_DIRECTORY"),tempm1->full_name; + ChkDskList(tempm1->sub,bits,bits2,size,bpc); + } + } + j=(tempm1->size+bpc-1)/bpc; + for (i=0;icluster>size) { + PutSysText("ST_ERR_START"); + coutln "Invalid Cluster:",tempm1->full_name, + " Cluster:",i+tempm1->cluster; + PutSysText("ST_ERR_END"); + break; + } + if (Bts(bits,i+tempm1->cluster)) { + PutSysText("ST_ERR_START"); + coutln "Double Alloc:",tempm1->full_name, + " Cluster:",i+tempm1->cluster; + PutSysText("ST_ERR_END"); + } + if (!Btr(bits2,i+tempm1->cluster)) { + PutSysText("ST_ERR_START"); + coutln "UnAlloc:",tempm1->full_name, + " Cluster:",i+tempm1->cluster; + PutSysText("ST_ERR_END"); + } + } + DelLTDirEntry(tempm1); + tempm1=tempm2; + } +} + +public void ChkDsk(I1 drive=0) +{ + U8 i,j,bpc,size,my_flags=(1<type!=PT_LT) { + PutSysText("ST_NOT_LT"); + return; + } + size=(p->size-(p->data-p->offset))/p->spc; + bits=MAllocZ((size+7)>>3); + bits2=MAllocZ((size+7)>>3+BLK_SIZE); + RBlks(p,bits2,p->MAP1,((size+7)>>3+BLK_SIZE-1)/BLK_SIZE,TRUE); + bpc=p->spc*BLK_SIZE; + + j=1; //TODO: get rootdir size + for (i=0;iroot_cluster>size) { + PutSysText("ST_ERR_START"); + coutln "Invalid Cluster: RootDir", + " Cluster:",i+p->root_cluster; + PutSysText("ST_ERR_END"); + break; + } + if (Bts(bits,i+p->root_cluster)) { + PutSysText("ST_ERR_START"); + coutln "Double Alloc: RootDir", + " Cluster:",i+p->root_cluster; + PutSysText("ST_ERR_END"); + } + if (!Btr(bits2,i+p->root_cluster)) { + PutSysText("ST_ERR_START"); + coutln "UnAlloc: RootDir", + " Cluster:",i+p->root_cluster; + PutSysText("ST_ERR_END"); + } + } + + ChkDskList(FindFiles(mask,&my_flags),bits,bits2,size,bpc); + for (i=1;iqW6tr?|eM-{&Qp;f? z0i`9u8aX;jDk{#t3fevqItoTQCMqf_DsJu|(kVnoAx0@Q*j2&J)5p~?MoGs&MMX&y zk8Tr?3XpaM=SW9COf!sPlynRUn1ShnAXi^UPd^veAO%MsAGlkL2$+M*EtsZ(TxCqa zG)z}HI{62MfL#-#1d=5#U=U#f(GT-caEy|UDclX2w%{1`P0cIS$bkpAOKJ{`SCm>( zT9gNl+ge^OUM^1y1?T+Sg2bX!P%3cED=ErME!OZUNdqw}6|}T+atw7)xJIxff)Gv4 zF|-9M)Jo1V01280C1hj@4fLyR&r0R?wierAdSD5Qf^ zb5fH_G(s&Dw9;}C(~EUHEflg0<8$(%jEqbjUM@~fP(I8uf(aYNXJjHrMrko>Z8j2baS1G6|Xt=n= zBSNGG&Vz@6rlzI>xX4gY2q?s1O2vEdeafA^$ zj)3N6h}+;%V;d3_>I!u?S`4|k#p6tNh`3QuC@#+|NzPEv0GAM;Gzcy8!4Bt4PApDU zFtFm~;#5#bDoRbvw&vx62pU2J5l(S)^a%#J1w*9~L?tBc)Y!VX#be2lpd^ITy&y}` z?KdXER3nm2HNh|yrDy?}hnnn(b#qE;T4HHV39-h*^AX5Ke0D&RFEq_UDNss)gtmej zsMy2|Zcupu(TN#eek!^C0u3cVg1;}Jh1%;s0+`!UQ zjbw1O#;Ks-Qsmxb zRGNgh76R2vpb!JsOQ1m00hLUi77EFEC59lu3NVW+R_7vF73JQ=$5SRlFcm)N0eV_c~#FA8nocz4>)Z!9_+{BXPjLf`rh2oMT5S5vy zkeOGKT2z*pQw(wdG^b=5+JM4bK}}5|(+I>g0%sPG^FY2R&M}P6G>p}?s|4k{oP3a1 z5Mt19&;*$W)?uiv4R(}*LTXNNDmZ5p=NLt28bM3|MLEO-m>4YN;3gQMngDGBfND)> ziw|x)G$-i5Er1Gu5;4dzkod~9GXQ0cOoX{eZp*ZRNFtmKm8|CF;>+H8{Q58h{E65I4)v7VhCnxS)|O!T^|H z4kS(LW`SBWV530s2Tqr|Sw=QFpilsrsGyJoNv*nBV9$ZXpdJL#zf7MlciE zIS5f(upG?u3b0IUi|{^7%*YnuQHVVd5}G7H1v+P@k!_|?63Dbn-B8+rE#UiLI1Vs%v z9$<+d)i9_r+F%+SaL_^qERbb{A^|Rr5mvx*CJw7$ML$w+3Rbg&Iyxx*9F(>YCnstr z2eXx7ILNwL1*J(jnaK*F7T~^?hNq!|R!VURxRav;;uIGpLpY%p3gActCl7G!LdH7` zK?5E^sfj5XaD56sA#QH*0X~kNe(@o$5h3y6o*^FbA&ySL3N;WpKmT~=(4b)dAV}0g zOfrI-1h*8TnlzKZ?HmOyP!~=M6u(+ppv0u51x`+23RFZu#%(|e4pfVRYG!cx1WFiS zZ>rhWf%DRfgAEM2&>Q+Tt8TXbVmQts(P*tU%5Ez_a zRH6Y&e;{w_z`UuWhB<}=@;WF+igS!$eg~yTG=GCyN-$|q&=}zl8j7P9IcSWcGtq+v z(qSh$Xuu|b`x=O#0hjqkLx$f(pR8RvI}*ph#3ua4Skp1w}dv4_OYB WN{}Q$kqY5L8o!Vt)*9UNU;qG`;1DAK literal 0 HcmV?d00001 diff --git a/LT/UTILS/GREP.CPZ b/LT/UTILS/GREP.CPZ new file mode 100644 index 0000000..15f0a0e --- /dev/null +++ b/LT/UTILS/GREP.CPZ @@ -0,0 +1,270 @@ +public I8 PopUpReplaceSkipAllCancelEdit(I1 *msg) +{ + I8 i; + Ltf *l=LtfNew; + LtfPutS(l,msg); + LtfPutS(l,"$$CM +LX, 2,4$$$$BT, \"REPLACE\",0$$"); + LtfPutS(l,"$$CM +LX, 22,0$$$$BT, \"SKIP\",1$$"); + LtfPutS(l,"$$CM +LX, 2,4$$$$BT, \"ALL\",2$$"); + LtfPutS(l,"$$CM +LX, 22,0$$$$BT, \"ABORT ALL\",3$$"); + LtfPutS(l,"$$CM +LX, 2,4$$$$BT, \"EDIT\",4$$"); + LtfPutS(l,"$$CM +LX, 22,0$$$$BT, \"ABORT FILE\",5$$"); + LtfPutS(l,"$$CM +LX, 2,4$$$$BT, \"SKIP FILE\",6$$"); + i=PopUpMenu(l); + LtfDel(l); + return i; +} + + + +U8 GrepFile(I1 *pattern,I1 *name,U8 *flags,I1 *replace_text) +{ + BoolU4 first_on_line,write_this_file=FALSE,cont=!Bt(flags,FUf_CANCEL); + I1 *src,*dst,*dst2,*name_buf=NULL; + U8 ss_flags; + Ltf *l=LtfRead(name, LTFF_PLAIN_TEXT_WITH_TABS | LTFF_NO_CURSOR); + LtfEntry *cl; + I8 i,j,plen,rlen,dlen; + U8 cnt=0; + + ss_flags=(Bt(flags,FUf_IGNORE)) ? SS_IGNORE_CASE :0; + if (Bt(flags,FUf_LABEL)) + ss_flags|=SS_WHOLE_LABELS; + + plen=StrLen(pattern); + if (replace_text) + rlen=StrLen(replace_text); + cl=l->dummy.next; + while (cl!=l && cont) { + if (cl->btype==LTFT_TEXT) { + src=cl->display; + first_on_line=TRUE; + while (src && cont) { + if (src=SearchString(src,pattern,ss_flags)) { + cnt++; + if (first_on_line || Bt(flags,FUf_REPLACE)) { + first_on_line=FALSE; + PutFileLink(name,cl->y+1,TRUE); + name_buf=MSPrintF("%s,%d",name,cl->y+1); + PrintF(" %s\r\n",cl->display); + } + if (Bt(flags,FUf_REPLACE)) { + if (Bt(flags,FUf_ALL)) + i=2; + else { + i=PopUpReplaceSkipAllCancelEdit(""); + if (i==3) { + Bts(flags,FUf_CANCEL); + cont=FALSE; + write_this_file=FALSE; + } else if (i==2) + Bts(flags,FUf_ALL); + else if (i==5) { + cont=FALSE; + write_this_file=FALSE; + } else if (i==6) + cont=FALSE; + } + if (!i || i==2) { + dlen=StrLen(cl->display); + dst=MAlloc(dlen+1+rlen-plen); + dst2=dst; + j=src-cl->display; + for (i=0;idisplay[i]; + for (i=0;idisplay[i]; + Free(cl->display); + cl->display=dst2; + PrintF("%12s,%04X*%s\r\n",name,cl->y+1,dst2); + write_this_file=TRUE; + } else { + src++; + if (i==4) { + Free(name_buf); + name_buf=NewString(l->filename.name); + l->flags&=~LTFF_NO_CURSOR; + l->cur_entry=cl; + l->cur_data_col=cl->min_col; + LtfWrite(l); + LtfDel(l); + PrintF("Wrote:%s\r\n",name_buf); + Edit(name_buf); + l=LtfRead(name_buf, LTFF_PLAIN_TEXT_WITH_TABS); + cl=l->cur_entry; + if (cl->last!=l) cl=cl->last; + src=NULL; + write_this_file=FALSE; + } + } + } else + src++; + Free(name_buf); + name_buf=NULL; + } + } + } + cl=cl->next; + } + if (write_this_file) { + LtfWrite(l); + PrintF("Wrote:%s\r\n",l->filename.name); + } + LtfDel(l); + return cnt; +} + +U8 GrepList(I1 *pattern,LTDirEntry *tempm1,U8 *flags,I1 *replace_text) +{ + U8 cnt=0; + LTDirEntry *tempm2; + + while (tempm1 && !Bt(flags,FUf_CANCEL)) { + tempm2=tempm1->next; + if (tempm1->attr & LT_ATTR_DIR) { + if (tempm1->sub) { + PrintF("%S %s\r\n","ST_SCANNING_DIRECTORY",tempm1->full_name); + cnt+=GrepList(pattern,tempm1->sub,flags,replace_text); + } + } else + cnt+=GrepFile(pattern,tempm1->full_name,flags,replace_text); + DelLTDirEntry(tempm1); + tempm1=tempm2; + } + return cnt; +} + +public U8 Grep(I1 *pattern,I1 *wild=TEXT_FILE_MASK,I1 *flags="+r+i+l",I1 *replace_text=NULL) + +//This does not do regular expressions--my bad +//Anyway, it's good for searching and replacing. +//Let's say it stands for global replace ;-) + +//"+r"=recurse +//"+i"=ignore case +//"+l"=whole labels only. +// This will check for a nonlabel character before +// and after. If you have a variable, "ll" and don't +// want to match words like "will" and "wallow", you +// set this flag and it will see that the characters +// before or after "ll" are label characters. + +{ + U8 cnt=0; + FlagsStruct f; + GetFFlags(&f,"ST_FILE_UTIL_FLAGS",flags); + AssignBit(&f.on,FUf_REPLACE,replace_text); + cnt+=GrepList(pattern,FindFiles(wild,&f.on),&f.on,replace_text); + return cnt; +} + +public U8 FileOccurrences(I1 *pattern,I1 *wild=TEXT_FILE_MASK,I1 *flags="+r+i+l") +{ + U8 cnt; + BoolU4 old_silent=Silent(TRUE); + cnt=Grep(pattern,wild,flags); + Silent(old_silent); + return cnt; +} + +LTDirEntry MCFindMatch(LTDirEntry *pattern,LTDirEntry *list) +{ + while (list) { + if (!StrCmp(pattern->name,list->name) && pattern->attr==list->attr) + return list; + list=list->next; + } + return NULL; +} + +void MergeChkList(LTDirEntry *m1,LTDirEntry *m2,U8 *fuf_flags,U8 *df_flags) +{ + I8 i; + LTDirEntry *tempm2; + while (m1 && !(*df_flags & DF_ABORT_ALL_FILES)) { + tempm2=MCFindMatch(m1,m2); + if (!tempm2) + coutln "Does Not Exist:",m1->full_name; + else { + if (m1->attr & LT_ATTR_DIR) + MergeChkList(m1->sub,tempm2->sub,fuf_flags,df_flags); + else { + i=m1->datetime-tempm2->datetime; + if (AbsI8(i)>LTDATE_FREQ*2) { //Filedates can shift due to conversion + coutln m1->full_name; + if (Bt(fuf_flags,FUf_DIFF)) { + if (IsTextFile(m1->full_name)) + *df_flags=Diff(tempm2->full_name,m1->full_name,*df_flags); + } + } + } + } + m1=m1->next; + } +} + +public void MergeChk(I1 *dst_mask,I1 *src_mask,I1 *flags="+r") +//r=recurse +//d=diff +{ + U8 df_flags=0; + LTDirEntry *tempm1=NULL,*tempm2=NULL; + FlagsStruct f; + GetFFlags(&f,"ST_FILE_UTIL_FLAGS",flags); + coutln "WARNING:This is based strictly on file dates."; + tempm1=FindFiles(src_mask,&f.on); + tempm2=FindFiles(dst_mask,&f.on); + MergeChkList(tempm1,tempm2,&f.on,&df_flags); + DelLTDirList(tempm1); + DelLTDirList(tempm2); +} + + + +void CommMergeChkList(U8 port,LTDirEntry *m1,LTDirEntry *m2,U8 *fuf_flags,U8 *df_flags) +{ + I8 i; + LTDirEntry *tempm2; + while (m1 && !(*df_flags & DF_ABORT_ALL_FILES)) { + tempm2=MCFindMatch(m1,m2); + if (!tempm2) + coutln "Does Not Exist:",m1->name; + else { + if (m1->attr & LT_ATTR_DIR) + CommMergeChkList(port,m1->sub,tempm2->sub,fuf_flags,df_flags); + else { + i=m1->datetime-tempm2->datetime; + if (AbsI8(i)>LTDATE_FREQ*2) { //Filedates can shift due to conversion + coutln m1->name; + if (Bt(fuf_flags,FUf_DIFF)) { + if (IsTextFile(m1->name)) + *df_flags=Diff(tempm2->name,m1->name,*df_flags); + } + } + } + } + m1=m1->next; + } +} + + +//$BK,1$Not Done$BK,0$ +public void CommMergeChk(U8 port,I1 *dst_mask,I1 *src_mask,I1 *flags="+r") +//r=recurse +//d=diff +{ + U8 df_flags=0; + LTDirEntry *tempm1=NULL,*tempm2=NULL; + FlagsStruct f; + GetFFlags(&f,"ST_FILE_UTIL_FLAGS",flags); + coutln "WARNING:This is based strictly on file dates."; + tempm1=FindFiles(src_mask,&f.on); + tempm2=FindFiles(dst_mask,&f.on); + CommMergeChkList(port,tempm1,tempm2,&f.on,&df_flags); + DelLTDirList(tempm1); + DelLTDirList(tempm2); +} + diff --git a/LT/UTILS/HASHUTIL.CPZ b/LT/UTILS/HASHUTIL.CPZ new file mode 100644 index 0000000000000000000000000000000000000000..b1dd2a7fcb8f9d790c9412901ff9e3ed5b4f7e1c GIT binary patch literal 6122 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 F0{~#X)VBZt literal 0 HcmV?d00001 diff --git a/LT/UTILS/IDE.CPZ b/LT/UTILS/IDE.CPZ new file mode 100644 index 0000000..989fc64 --- /dev/null +++ b/LT/UTILS/IDE.CPZ @@ -0,0 +1,207 @@ +ClassStruct *DbgFindFun(Ltf *l,I8 line_offset=0) +{ + I1 st[256],st2[256],*filename=l->filename.name; + I8 line=l->cur_entry->y+1+line_offset; + U8 i; + SysHashEntry *temph; + SysHashTable *h=Fs->hash_table; + ClassStruct *tempc; + DbgInfo *tempd; + while (h) { + for (i=0;i<=h->mask;i++) { + temph=h->body[i]; + while (temph) { + if (temph->type&HTT_FUNCTION) { + tempc=temph; + if (tempd=tempc->debug) { + StrCpy(st,tempc->source_link); + RemoveFirstSeg(st,":",st2); + RemoveLastSeg(st,",",st2); + if (!StrCmp(st,filename)) { + if (line>=tempd->min_line && line<=tempd->max_line) + return tempc; + } + } + } + temph=temph->next; + } + } + h=h->next; + } + return NULL; +} + +void WatchLocals() +{ + TssStruct *tss=Fs->parent_tss,*dbg_tss=tss->dbg_tss; + Ltf *l; + ClassStruct *tempc; + U8 j,sc,ch; + while (TRUE) { +// PutS("$$CL$$"); + LtfBottom(Fs->cur_ltf); + if (l=dbg_tss->cur_ltf) { + if (tempc=DbgFindFun(l,0)) { + Preempt(OFF); + ClassRep2(Fs->cur_ltf,tss->ebp,tempc->string,0,HTT_FUNCTION); + Preempt(ON); + } + } + if (ScanChar(&sc,&ch)) { + j=jiffies+JIFFY_FREQ*5; + LtfPutChar(Fs->cur_ltf,ch,sc,TRUE); + do { + if (ch==CH_CTRLQ || ch==CH_ESC) Exit; + if (ScanChar(&sc,&ch)) { + j=jiffies+JIFFY_FREQ*5; + LtfPutChar(Fs->cur_ltf,ch,sc,TRUE); + } + Sleep(100); + } while (jiffiesdbg_tss=Spawn(&UserCmdLine,"Debug",Fs); + +/*** Not ready for prime time + tss=Spawn(&ServantUserCmdLine,"WATCH TASK",Fs); + while (!Bt(&tss->task_flags,TSSf_IDLE)) + SwapInNext; + Bts(&tss->crt_flags,CRTf_SHOW); + QueueTaskRequest(tss,Fs,"WatchLocals;",(1<filename.name; + I8 line=l->cur_entry->y+1+line_offset; + SysHashEntry *temph; + SysHashTable *h=Fs->hash_table; + ClassStruct *tempc; + U8 i,a; + DbgInfo *tempd; + LtfEntry *ll; + while (h) { + for (i=0;i<=h->mask;i++) { + temph=h->body[i]; + while (temph) { + if (temph->type&HTT_FUNCTION) { + tempc=temph; + if (tempd=tempc->debug) { + StrCpy(st,tempc->source_link); + RemoveFirstSeg(st,":",st2); + RemoveLastSeg(st,",",st2); + if (!StrCmp(st,filename)) { + if (line>=tempd->min_line && line<=tempd->max_line) { + a=tempd->body[line-tempd->min_line]; + ll=l->cur_entry; + while (ll->last->btype!=LTFT_CR && + ll->last->btype!=LTFT_SOFT_CR && + ll->last!=l) + ll=ll->last; + l->cur_entry=ll; + l->cur_data_col=ll->min_col; + if (flags==SBPTF_BPT) { + if (!RBpt(Fs->parent_tss,a)) { + SBpt(Fs->parent_tss,a,flags); + Auto("$$BP$$"); + } else { + if (ll->btype==LTFT_BPT) { + l->cur_entry=ll->next; + l->cur_data_col=l->cur_entry->min_col; + RemQue(ll); + LtfDelEntry(ll,l->mem_tss); + } + } + } else { + if (!FindBpt(Fs->parent_tss,a,ALL_MASK,FALSE)) + SBpt(Fs->parent_tss,a,flags); + } + if (line_offset) { + l->x=0; + l->y=line-1; + LtfUpdateWindowJoin(l,FALSE,FALSE,FALSE,TRUE); + } + return; + } + } + } + } + temph=temph->next; + } + } + h=h->next; + } +} + +void ClearAllBpts(Ltf *l) +{ + LtfEntry *ll,*ll2; + CBpt(Fs->parent_tss); + ll=l->dummy.next; + while (ll!=l) { + ll2=ll->next; + if (ll->btype==LTFT_BPT) { + if (l->cur_entry==ll) { + l->cur_entry=ll->next; + l->cur_data_col=l->cur_entry->min_col; + } + RemQue(ll); + LtfDelEntry(ll,l->mem_tss); + } + ll=ll2; + } +} + +void LtfGo() //Continue after breakpoint +{ + TssStruct *tss=Fs->parent_tss; + U4 *eip=&tss->eip; + CBpt(tss,SBPTF_STEP); + *eip-=1; + DBpt(tss,*eip); + Btr(&tss->task_flags,TSSf_SUSPENDED); +} + +public void Go() //Continue after breakpoint +{ + LtfGo; + Exit; +} + +public void Step() //Single step (ASM) +{ + TssStruct *tss=Fs->parent_tss; + U4 *eip=&tss->eip; + I1 buf[256]; + U8 my_eip; + CBpt(tss,SBPTF_STEP); + *eip-=1; + DBpt(tss,*eip); + my_eip=*eip; + DasmIns(buf,&my_eip); //get addr of next ins start + SBpt(tss,my_eip,SBPTF_STEP); + Btr(&tss->task_flags,TSSf_SUSPENDED); + Exit; +} + +void LtfStep(Ltf *l) //Single step +{ + TssStruct *tss=Fs->parent_tss; + U4 *eip=&tss->eip; + CBpt(tss,SBPTF_STEP); + *eip-=1; + DBpt(tss,*eip); + ToggleBpt(l,1,SBPTF_STEP); + Btr(&tss->task_flags,TSSf_SUSPENDED); +} + diff --git a/LT/UTILS/S2T.CPZ b/LT/UTILS/S2T.CPZ new file mode 100644 index 0000000000000000000000000000000000000000..91abd8b738b96ca3629415fe21d3d1c4ada4e0af GIT binary patch literal 1408 zcmdPbSMl-IQ3@_8%FIg-Ey>JL(oypDvqIvlXlN?r7o-*?mSpDV6)WWDDWqlQq!#mX z@p2WECgo%%E0pDDrYHo5x@G31YIqtdXyqm5rs{-RC={2*r{yH37i;ozRr7KwD1hWr zic73PY^VJEoKO>m1sTaZ?GFx7&D!NCHFJg}=l>H~^0^Ge(_l!74f zr=VJ_kW{IlngWXDqT-mMm^>vNaP&ca268$`A1E{mDm8L+?La9Dq(TowfYrj(_>`oD z7iE^DYUDsfz>e@KNpnfffe6)t5+pPw`eYWDX!wM49XL5dN zNluvLgg-CEoQE76CLK--F+*3>3 zz@i#zX*!_ba`W_YjSmg+^oe)#adZz>(t#KNRtyawx6Hg0P!UzE0k%;sO)o!B6UD2< vx!NcM;cN`228TjS4-SnFHVUZ;4vi0T_4N;PjSmTO^z`xcb4NG~Y#RdrKZ~Ev literal 0 HcmV?d00001 diff --git a/LT/UTILS/TEXT.CPZ b/LT/UTILS/TEXT.CPZ new file mode 100644 index 0000000000000000000000000000000000000000..f6e2a269f9bd216b78df8a2b05cfdb4a75c06867 GIT binary patch literal 909 zcmXTR&rDHp$1Y*{6zL>qfW^u)GILTDG;$3!6~NjQ6f)C5TwS}wl9D0?H3grL zc*l^Cpm-P0AWe`V3JMCymggGk+7*{3X@U(?P)N-wPK6nyppcwjT9T8e08*1ynv)Zs zmzbLhRj8m4oRgYbpkZiWU;xt$u{)_W%{C}CF(o9mq6F+e6z!T|cXAe#6xk+~rdjiH zaYB7)>*nYa>7UWTFZHNwt;mH}cw(2S>>M$_{g@TeIU0skikjEezY}NJD zVInZoLxMuVhASx4@^W#4Fesd$vM|%ai!w`6L$JDAC#f_I>vvok6w4B8BVp}EcA|*{;E`9xwjLc$%%wmPK{33J&#U)=MFTX^gv^Z5EKM$f- zp**uBLm>s6G!>Hbb8{2(Qi?(P74nNfijp$(5{oJ!YQg3f*%qZHmlhSLLK7`=QZ7l& zEyy*r^$Yd!0ejaC