From 1343005a29c547748091a3f1ba87fec4a740467b Mon Sep 17 00:00:00 2001 From: "Terry A. Davis" Date: Sat, 6 Jul 2013 23:29:50 +0200 Subject: [PATCH] TempleOSTS_130707.ISO --- 0000Boot/0000Kernel.BIN.C | Bin 222896 -> 222448 bytes 0000Boot/BootCD.BIN | Bin 2041 -> 0 bytes 0000Boot/BootMHD2.BIN.C | Bin 582 -> 582 bytes TempleOS/Accts/Adam3.CPP | 1 - TempleOS/Accts/Adam3aLocalize.CPP | 2 - TempleOS/Accts/Adam3bPkgs.CPP | 3 +- TempleOS/Accts/Adam3cSnd.CPP | 10 - TempleOS/Accts/Adam3dKeyPlugIns.CPP | 12 +- TempleOS/Accts/Adam3fSys.CPP | 6 +- TempleOS/Accts/DoItOnce.CPP | 4 +- TempleOS/Accts/Install/Adam3fSys.CPP | 5 +- TempleOS/Accts/Install/DoItOnce.CPP | 28 +- TempleOS/Accts/PersonalMenu.TXT | Bin 53355 -> 51749 bytes TempleOS/Accts/SafeMode/Adam3.CPP | 9 - TempleOS/Accts/SafeMode/Adam3cSnd.CPP | 1 - TempleOS/Accts/SafeMode/Adam3fSys.CPP | 38 - TempleOS/Accts/SafeMode/DoItOnce.CPP | 9 - TempleOS/Accts/TS/Adam3bPkgs.CPP | 1 - TempleOS/Accts/TS/Adam3dKeyPlugIns.CPP | 20 +- TempleOS/Accts/TS/Adam3fSys.CPP | 5 +- TempleOS/Accts/TS/DbgAdam1.CPP | 11 + TempleOS/Accts/TS/DoItOnce.CPP | 2 +- TempleOS/Accts/TS/PersonalMenu.TXT | Bin 52801 -> 53455 bytes .../AcctExample => Accts/TS/TAD}/Adam3.CPP | 1 - TempleOS/Accts/TS/TAD/Adam3aLocalize.CPP | 2 - TempleOS/Accts/TS/TAD/Archive/FileSysISO3.CPP | 488 -- TempleOS/Accts/TS/TAD/Archive/Logo.TXT | Bin 33204 -> 0 bytes TempleOS/Accts/TS/TAD/Archive/Marketing.TXT | 21 - TempleOS/Accts/TS/TAD/Archive/USB.CPP | 217 - TempleOS/Accts/TS/TAD/Archive/USB1a.CPP | 114 - TempleOS/Accts/TS/TAD/MakeDistro.CPP | 54 - TempleOS/Accts/TS/TAD/MusicOrgan/abiding.CPP | 11 +- TempleOS/Accts/TS/TAD/MusicOrgan/abyss.CPP | 6 +- TempleOS/Accts/TS/TAD/MusicOrgan/awake.CPP | 8 +- .../TS/TAD/MusicOrgan/battlehymnsolo.CPP | Bin 12886 -> 1189 bytes TempleOS/Accts/TS/TAD/MusicOrgan/born.CPP | 8 +- TempleOS/Accts/TS/TAD/MusicOrgan/childish.CPP | 2 +- .../Accts/TS/TAD/MusicOrgan/compassions.CPP | 8 +- .../Accts/TS/TAD/MusicOrgan/completed.CPP | Bin 924 -> 890 bytes TempleOS/Accts/TS/TAD/MusicOrgan/cosam.CPP | 6 +- .../Accts/TS/TAD/MusicOrgan/despairing.CPP | 6 +- TempleOS/Accts/TS/TAD/MusicOrgan/dialogue.CPP | Bin 3381 -> 3375 bytes .../Accts/TS/TAD/MusicOrgan/disputing.CPP | 6 +- TempleOS/Accts/TS/TAD/MusicOrgan/doing.CPP | Bin 2639 -> 2613 bytes TempleOS/Accts/TS/TAD/MusicOrgan/dream.CPP | 8 +- TempleOS/Accts/TS/TAD/MusicOrgan/elijah.CPP | Bin 17596 -> 17570 bytes .../Accts/TS/TAD/MusicOrgan/environeth.CPP | 4 +- TempleOS/Accts/TS/TAD/MusicOrgan/epicurus.CPP | 2 +- TempleOS/Accts/TS/TAD/MusicOrgan/exalt.CPP | 1 + TempleOS/Accts/TS/TAD/MusicOrgan/exiled.CPP | 9 +- TempleOS/Accts/TS/TAD/MusicOrgan/exodus.CPP | 8 +- TempleOS/Accts/TS/TAD/MusicOrgan/feigned.CPP | 6 +- TempleOS/Accts/TS/TAD/MusicOrgan/finger.CPP | Bin 3966 -> 3966 bytes TempleOS/Accts/TS/TAD/MusicOrgan/first.CPP | Bin 1821 -> 1817 bytes .../Accts/TS/TAD/MusicOrgan/fishermen.CPP | Bin 2355 -> 2359 bytes TempleOS/Accts/TS/TAD/MusicOrgan/fixing.CPP | 6 +- TempleOS/Accts/TS/TAD/MusicOrgan/flung.CPP | 6 +- .../Accts/TS/TAD/MusicOrgan/forasmuch.CPP | Bin 2276 -> 2248 bytes TempleOS/Accts/TS/TAD/MusicOrgan/freaks.CPP | 8 +- TempleOS/Accts/TS/TAD/MusicOrgan/free.CPP | 10 +- .../Accts/TS/TAD/MusicOrgan/furnishing.CPP | Bin 5273 -> 5263 bytes .../Accts/TS/TAD/MusicOrgan/gutenberg.CPP | Bin 2026 -> 1997 bytes TempleOS/Accts/TS/TAD/MusicOrgan/honestly.CPP | 6 +- TempleOS/Accts/TS/TAD/MusicOrgan/hope.CPP | Bin 1667 -> 1700 bytes TempleOS/Accts/TS/TAD/MusicOrgan/josh.CPP | Bin 2495 -> 2479 bytes TempleOS/Accts/TS/TAD/MusicOrgan/keeping.CPP | Bin 2538 -> 2518 bytes TempleOS/Accts/TS/TAD/MusicOrgan/limit.CPP | Bin 1463 -> 1461 bytes TempleOS/Accts/TS/TAD/MusicOrgan/mary.CPP | 6 +- TempleOS/Accts/TS/TAD/MusicOrgan/mildly.CPP | Bin 1838 -> 1869 bytes TempleOS/Accts/TS/TAD/MusicOrgan/myrrh.CPP | 8 +- TempleOS/Accts/TS/TAD/MusicOrgan/night.CPP | Bin 3354 -> 3387 bytes TempleOS/Accts/TS/TAD/MusicOrgan/o.CPP | 8 +- .../Accts/TS/TAD/MusicOrgan/population.CPP | 6 +- TempleOS/Accts/TS/TAD/MusicOrgan/prosper.CPP | Bin 5566 -> 5602 bytes TempleOS/Accts/TS/TAD/MusicOrgan/psalm.CPP | 6 +- TempleOS/Accts/TS/TAD/MusicOrgan/reposes.CPP | 6 +- TempleOS/Accts/TS/TAD/MusicOrgan/restless.CPP | 6 +- TempleOS/Accts/TS/TAD/MusicOrgan/rifled.CPP | 6 +- TempleOS/Accts/TS/TAD/MusicOrgan/risen.CPP | 5 +- .../Accts/TS/TAD/MusicOrgan/satisfaction.CPP | Bin 2585 -> 2583 bytes TempleOS/Accts/TS/TAD/MusicOrgan/service.CPP | 4 +- .../Accts/TS/TAD/MusicOrgan/signifies.CPP | 6 +- TempleOS/Accts/TS/TAD/MusicOrgan/silver.CPP | 8 +- .../Accts/TS/TAD/MusicOrgan/teachings.CPP | 8 +- .../Accts/TS/TAD/MusicOrgan/thereupon.CPP | 11 +- TempleOS/Accts/TS/TAD/MusicOrgan/thither.CPP | 6 +- TempleOS/Accts/TS/TAD/MusicOrgan/twins.CPP | 2 +- TempleOS/Accts/TS/TAD/MusicOrgan/verses.CPP | 6 +- TempleOS/Accts/TS/TAD/MusicOrgan/villa.CPP | 6 +- TempleOS/Accts/TS/TAD/MusicOrgan/worship.CPP | 8 +- .../Accts/TS/TAD/MusicOrgan/yesterday.CPP | 8 +- TempleOS/Accts/TS/TAD/MusicOrgan/you.CPP | 6 +- TempleOS/Accts/TS/TAD/PersonalNotes.TXT | 56 +- TempleOS/Accts/TS/TAD/Registry.CPP | 28 +- TempleOS/Accts/TS/TAD/Test.CPP | 53 + TempleOS/Accts/TS/TSAdam.CPP | 69 +- TempleOS/Accts/TS/TSDistro.CPP | 131 +- TempleOS/Accts/TS/Wb2/Blog.TXT | 14 - TempleOS/Accts/TS/Wb2/Games.TXT | 24 +- TempleOS/Accts/TS/Wb2/Hymns.TXT | 1 + TempleOS/Accts/TS/Wb2/LineCnt.TXT | 714 +- TempleOS/Accts/TS/Wb2/Menu.BMP | Bin 63780 -> 0 bytes TempleOS/Accts/TS/Wb2/MenuV0104.BMP | Bin 0 -> 153718 bytes TempleOS/Accts/TS/Wb2/ScreenShots.TXT | 6 +- TempleOS/Accts/TS/Wb2/TempleOS.BMP | Bin 55340 -> 0 bytes TempleOS/Accts/TS/Wb2/TempleOSV0104.BMP | Bin 0 -> 153718 bytes .../TS/Wb2/{Tanks.BMP => ToTheFront.BMP} | Bin TempleOS/Accts/TS/Wb2/Tutorials.TXT | 33 + TempleOS/Accts/TS/Wb2/index.TXT | 170 +- TempleOS/Adam/Adam2.CPP | 3 +- TempleOS/Adam/AdamExt.HPP | 21 +- TempleOS/Adam/AutoFile2a.CPP | 3 +- TempleOS/Adam/Boot/BootCD.CPP | 15 +- TempleOS/Adam/Boot/BootHD.CPP | 6 +- TempleOS/Adam/Boot/BootMHD.CPP | 1 + TempleOS/Adam/Boot/BootMHD2.CPP | 1 + TempleOS/Adam/{Dsk => Boot}/DskCDDVD.CPP | 402 +- TempleOS/Adam/Boot/InsBoot.CPP | 87 +- TempleOS/Adam/Ctrls/Ctrls2a.CPP | 2 +- TempleOS/Adam/Dbg2a.CPP | 11 +- TempleOS/Adam/DevInfo.CPP | 16 +- TempleOS/Adam/Doc/Doc.CPP | 9 +- TempleOS/Adam/Doc/DocCodeTools.CPP | 439 +- TempleOS/Adam/Doc/DocCtrlL.CPP | 152 +- TempleOS/Adam/Doc/DocEd.CPP | 81 +- TempleOS/Adam/Doc/DocFile.CPP | 64 +- TempleOS/Adam/Doc/DocHighlight.CPP | 30 +- TempleOS/Adam/Doc/DocIDE.CPP | 20 +- TempleOS/Adam/Doc/DocMacro.CPP | 34 +- TempleOS/Adam/Doc/DocMain.CPP | 150 +- TempleOS/Adam/Doc/DocNew.CPP | 256 +- TempleOS/Adam/Doc/DocOpt.CPP | 1 + TempleOS/Adam/Doc/DocPlain.CPP | 145 +- TempleOS/Adam/Doc/DocPopUp.CPP | 193 +- TempleOS/Adam/Doc/DocRecalc.CPP | 436 +- TempleOS/Adam/Doc/DocTree.CPP | 4 +- TempleOS/Adam/DocDefines.CPP | 12 +- TempleOS/Adam/Dsk/ChkDsk.CPP | 14 +- TempleOS/Adam/Dsk/Dsk2.CPP | 1 - TempleOS/Adam/Dsk/Dsk2a.CPP | 32 +- TempleOS/Adam/Dsk/Dsk2b.CPP | 30 +- TempleOS/Adam/Dsk/FileMgr.CPP | 24 +- TempleOS/Adam/Gr/CSpriteBitMap.CPP | 198 +- TempleOS/Adam/Gr/CSpriteEd.CPP | 581 +- .../Gr/{CSpriteVect.CPP => CSpriteMain.CPP} | 694 +- TempleOS/Adam/Gr/CSpriteMesh.CPP | 181 +- TempleOS/Adam/Gr/CSpriteNew.CPP | 20 +- TempleOS/Adam/Gr/Gr.CPP | 27 +- TempleOS/Adam/Gr/GrAsm.CPP | 2 +- TempleOS/Adam/Gr/GrBitMap.CPP | 162 +- TempleOS/Adam/Gr/GrComposites.CPP | 59 +- TempleOS/Adam/Gr/GrDC.CPP | 6 +- TempleOS/Adam/Gr/GrPrimatives.CPP | 216 +- TempleOS/Adam/Gr/GrScreen.CPP | 144 +- TempleOS/Adam/Gr/GrSpritePlot.CPP | 28 +- TempleOS/Adam/Gr/GrVectMap.CPP | 486 -- TempleOS/Adam/Gr/MathGr.CPP | 242 +- TempleOS/Adam/Hash2a.CPP | 105 +- TempleOS/Adam/LogIn.CPP | 23 +- TempleOS/Adam/MathODE.CPP | 2 +- TempleOS/Adam/Menu.CPP | 10 +- TempleOS/Adam/Snd/HDAudio.CPP | 651 -- TempleOS/Adam/Snd/HDCfg.CPP | 638 -- TempleOS/Adam/Snd/MathAudio.CPP | 41 +- TempleOS/Adam/Snd/Music.CPP | 48 +- TempleOS/Adam/Snd/Snd.CPP | 45 - TempleOS/Adam/Snd/SndEffects.CPP | 48 +- TempleOS/Adam/Snd/SndFile.CPP | 197 +- TempleOS/Adam/Start.CPP | 14 - TempleOS/Adam/TaskSettings.CPP | 64 +- TempleOS/Adam/Training.CPP | 2 +- TempleOS/Adam/{ => Utils}/BinRep.CPP | 4 +- TempleOS/Adam/{ => Utils}/Diff.CPP | 14 +- TempleOS/Adam/{ => Utils}/FileBMP.CPP | 4 +- TempleOS/Adam/{ => Utils}/Grep.CPP | 29 +- TempleOS/Adam/{ => Utils}/HeapLog.CPP | 0 TempleOS/Adam/{ => Utils}/LineCnt.CPP | 4 +- TempleOS/Adam/{ => Utils}/LinkChk.CPP | 9 +- TempleOS/Adam/{ => Utils}/MemRep.CPP | 51 +- TempleOS/Adam/{ => Utils}/Merge.CPP | 14 +- TempleOS/Adam/{ => Utils}/Profiler.CPP | 0 TempleOS/Adam/{ => Utils}/S2T.CPP | 0 TempleOS/Adam/{ => Utils}/ToHtml.CPP | 11 +- TempleOS/Adam/{ => Utils}/ToTXT.CPP | 0 TempleOS/Adam/WallPaper.CPP | Bin 6992 -> 6183 bytes TempleOS/Adam/Window.CPP | 251 +- TempleOS/Adam/WordStat/WSDict.CPP | 2 +- TempleOS/Adam/WordStat/WSDictGen.CPP | 2 +- TempleOS/Adam/WordStat/WSMain.CPP | 22 +- TempleOS/Apps/AfterEgypt/AENotes.TXT | 7 - TempleOS/Apps/AfterEgypt/AENotesPart2.TXT | 51 - TempleOS/Apps/AfterEgypt/AESplash.TXT | Bin 302128 -> 302128 bytes TempleOS/Apps/AfterEgypt/AfterEgypt.CPP | Bin 5773 -> 4262 bytes TempleOS/Apps/AfterEgypt/Battle.CPP | Bin 3279 -> 3342 bytes TempleOS/Apps/AfterEgypt/Comics.CPP | 5 +- TempleOS/Apps/AfterEgypt/Comics/Moses65.TXT | Bin 460 -> 0 bytes TempleOS/Apps/AfterEgypt/Comics/Moses67.TXT | Bin 404 -> 0 bytes TempleOS/Apps/AfterEgypt/Comics/Moses75.TXT | Bin 0 -> 733 bytes TempleOS/Apps/AfterEgypt/GodTalking.CPP | Bin 0 -> 1904 bytes TempleOS/Apps/AfterEgypt/Horeb.CPP | Bin 18720 -> 23386 bytes TempleOS/Apps/AfterEgypt/Load.CPP | 1 + TempleOS/Apps/AfterEgypt/Map.CPP | Bin 1789 -> 1711 bytes TempleOS/Apps/AfterEgypt/Quail.CPP | Bin 2802 -> 2962 bytes TempleOS/Apps/AfterEgypt/WaterRock.CPP | Bin 3483 -> 3542 bytes TempleOS/Apps/GrModels/BallGen.CPP | 24 +- TempleOS/Apps/GrModels/ManGen.CPP | 50 +- TempleOS/Apps/GrModels/Models.CPP | 6 +- TempleOS/Apps/HolySpirit/HSNotes.TXT | 40 +- TempleOS/Apps/HolySpirit/HolySpirit.CPP | 2 +- TempleOS/Apps/HolySpirit/Vocab.TXT | 4 +- TempleOS/Apps/KeepAway/KeepAway.CPP | 24 +- TempleOS/Apps/MusicOrgan/Examples/abiding.CPP | 11 +- TempleOS/Apps/MusicOrgan/Examples/abyss.CPP | 6 +- TempleOS/Apps/MusicOrgan/Examples/awake.CPP | 8 +- .../MusicOrgan/Examples/battlehymnsolo.CPP | Bin 12886 -> 1189 bytes TempleOS/Apps/MusicOrgan/Examples/born.CPP | 8 +- .../Apps/MusicOrgan/Examples/childish.CPP | 2 +- .../Apps/MusicOrgan/Examples/compassions.CPP | 8 +- .../Apps/MusicOrgan/Examples/completed.CPP | Bin 924 -> 890 bytes TempleOS/Apps/MusicOrgan/Examples/cosam.CPP | 6 +- .../Apps/MusicOrgan/Examples/despairing.CPP | 6 +- .../Apps/MusicOrgan/Examples/dialogue.CPP | Bin 3381 -> 3375 bytes .../Apps/MusicOrgan/Examples/disputing.CPP | 6 +- TempleOS/Apps/MusicOrgan/Examples/doing.CPP | Bin 2639 -> 2613 bytes TempleOS/Apps/MusicOrgan/Examples/dream.CPP | 8 +- TempleOS/Apps/MusicOrgan/Examples/elijah.CPP | Bin 17596 -> 17570 bytes .../Apps/MusicOrgan/Examples/environeth.CPP | 4 +- .../Apps/MusicOrgan/Examples/epicurus.CPP | 2 +- TempleOS/Apps/MusicOrgan/Examples/exalt.CPP | 1 + TempleOS/Apps/MusicOrgan/Examples/exiled.CPP | 9 +- TempleOS/Apps/MusicOrgan/Examples/feigned.CPP | 6 +- TempleOS/Apps/MusicOrgan/Examples/finger.CPP | Bin 3966 -> 3966 bytes TempleOS/Apps/MusicOrgan/Examples/first.CPP | Bin 1821 -> 1817 bytes .../Apps/MusicOrgan/Examples/fishermen.CPP | Bin 2355 -> 2359 bytes TempleOS/Apps/MusicOrgan/Examples/fixing.CPP | 6 +- TempleOS/Apps/MusicOrgan/Examples/flung.CPP | 6 +- .../Apps/MusicOrgan/Examples/forasmuch.CPP | Bin 2276 -> 2248 bytes TempleOS/Apps/MusicOrgan/Examples/freaks.CPP | 8 +- TempleOS/Apps/MusicOrgan/Examples/free.CPP | 10 +- .../Apps/MusicOrgan/Examples/furnishing.CPP | Bin 5273 -> 5263 bytes .../Apps/MusicOrgan/Examples/gutenberg.CPP | Bin 2026 -> 1997 bytes .../Apps/MusicOrgan/Examples/honestly.CPP | 6 +- TempleOS/Apps/MusicOrgan/Examples/hope.CPP | Bin 1667 -> 1700 bytes TempleOS/Apps/MusicOrgan/Examples/josh.CPP | Bin 2495 -> 2479 bytes TempleOS/Apps/MusicOrgan/Examples/keeping.CPP | Bin 2538 -> 2518 bytes TempleOS/Apps/MusicOrgan/Examples/limit.CPP | Bin 1463 -> 1461 bytes TempleOS/Apps/MusicOrgan/Examples/mary.CPP | 6 +- TempleOS/Apps/MusicOrgan/Examples/mildly.CPP | Bin 1838 -> 1869 bytes TempleOS/Apps/MusicOrgan/Examples/night.CPP | Bin 3354 -> 3387 bytes TempleOS/Apps/MusicOrgan/Examples/o.CPP | 8 +- .../Apps/MusicOrgan/Examples/population.CPP | 6 +- TempleOS/Apps/MusicOrgan/Examples/prosper.CPP | Bin 5566 -> 5602 bytes TempleOS/Apps/MusicOrgan/Examples/psalm.CPP | 6 +- TempleOS/Apps/MusicOrgan/Examples/reposes.CPP | 6 +- .../Apps/MusicOrgan/Examples/restless.CPP | 6 +- TempleOS/Apps/MusicOrgan/Examples/rifled.CPP | 6 +- TempleOS/Apps/MusicOrgan/Examples/risen.CPP | 5 +- .../Apps/MusicOrgan/Examples/satisfaction.CPP | Bin 2585 -> 2583 bytes TempleOS/Apps/MusicOrgan/Examples/service.CPP | 4 +- .../Apps/MusicOrgan/Examples/signifies.CPP | 6 +- TempleOS/Apps/MusicOrgan/Examples/silver.CPP | 8 +- .../Apps/MusicOrgan/Examples/teachings.CPP | 8 +- .../Apps/MusicOrgan/Examples/thereupon.CPP | 11 +- TempleOS/Apps/MusicOrgan/Examples/thither.CPP | 6 +- TempleOS/Apps/MusicOrgan/Examples/twins.CPP | 2 +- TempleOS/Apps/MusicOrgan/Examples/verses.CPP | 6 +- TempleOS/Apps/MusicOrgan/Examples/villa.CPP | 6 +- TempleOS/Apps/MusicOrgan/Examples/worship.CPP | 8 +- TempleOS/Apps/MusicOrgan/Examples/you.CPP | 6 +- TempleOS/Apps/MusicOrgan/Help.TXT | 6 +- TempleOS/Apps/MusicOrgan/JukeBox.CPP | 22 +- TempleOS/Apps/MusicOrgan/MakeSong.CPP | 30 +- TempleOS/Apps/MusicOrgan/Organ.CPP | 233 +- TempleOS/Apps/Pilgrims/Load.CPP | 7 - TempleOS/Apps/Pilgrims/NewEngland.GRA | Bin 14375 -> 0 bytes TempleOS/Apps/Pilgrims/Pilgrims.CPP | 773 -- TempleOS/Apps/Pilgrims/Run.CPP | 2 - TempleOS/Apps/Span/Span.HPP | 2 +- TempleOS/Apps/Span/SpanBridge1.CPP | 36 +- TempleOS/Apps/Span/SpanMain.CPP | 23 +- TempleOS/Apps/Span/SpanNew.CPP | 16 +- TempleOS/Apps/Strut/Strut.CPP | 2 +- TempleOS/Apps/Tanks/Install.CPP | 2 - TempleOS/Apps/Tanks/Load.CPP | 1 - TempleOS/Apps/Tanks/Run.CPP | 2 - TempleOS/Apps/TimeClock/Install.CPP | 7 +- TempleOS/Apps/TimeClock/TimeClk.CPP | 8 +- TempleOS/Apps/TimeOut/Load.CPP | 5 + TempleOS/Apps/TimeOut/Run.CPP | 2 + .../Timeout.CPP => TimeOut/TimeOut.CPP} | 40 +- TempleOS/Apps/Timeout/Load.CPP | 5 - TempleOS/Apps/Timeout/Run.CPP | 2 - .../Apps/{Tanks => ToTheFront}/AIs/Human.CPP | 12 +- .../{Tanks => ToTheFront}/AIs/SimpleAI.CPP | 7 +- TempleOS/Apps/ToTheFront/Install.CPP | 2 + TempleOS/Apps/ToTheFront/Load.CPP | 1 + TempleOS/Apps/ToTheFront/Run.CPP | 2 + .../Tanks.CPP => ToTheFront/ToTheFront.CPP} | 183 +- TempleOS/Apps/X-Caliber/X-Caliber.CPP | 22 +- TempleOS/Compiler/Assembler.CPP | 46 +- TempleOS/Compiler/BackEnd.CPP | 1059 +-- TempleOS/Compiler/CmpAsm.CPP | 10 +- TempleOS/Compiler/CmpDefs.HPP | 293 +- TempleOS/Compiler/CmpExts.CPP | 8 +- TempleOS/Compiler/CmpInit.CPP | 42 +- TempleOS/Compiler/CmpMain.CPP | 96 +- TempleOS/Compiler/CmpQueVect.CPP | 67 - TempleOS/Compiler/CodeGen.CPP | 33 +- TempleOS/Compiler/Compiler.BIN | Bin 266886 -> 250107 bytes TempleOS/Compiler/Compiler.HPP | 12 +- TempleOS/Compiler/Compiler.MAP | 1258 ++-- TempleOS/Compiler/Compiler.PRJ | 1 - TempleOS/Compiler/Directives.CPP | 21 +- TempleOS/Compiler/ExpParser.CPP | 809 +- TempleOS/Compiler/Hash1b.CPP | 5 +- TempleOS/Compiler/Lex.CPP | 128 +- TempleOS/Compiler/OpCodes.TXT | 4 +- TempleOS/Compiler/OptPass012.CPP | 1067 ++- TempleOS/Compiler/OptPass3.CPP | 179 +- TempleOS/Compiler/OptPass4.CPP | 326 +- TempleOS/Compiler/OptPass5.CPP | 56 +- TempleOS/Compiler/OptPass6.CPP | 119 +- TempleOS/Compiler/OptPass789A.CPP | 354 +- TempleOS/Compiler/StmtParser.CPP | 190 +- TempleOS/Compiler/Unassembler.CPP | 501 +- TempleOS/Demo/AcctExample/Adam3bPkgs.CPP | 1 - .../Demo/AcctExample/Adam3dKeyPlugIns.CPP | 20 +- TempleOS/Demo/AcctExample/Adam3fSys.CPP | 5 +- TempleOS/Demo/AcctExample/DbgAdam1.CPP | 11 + TempleOS/Demo/AcctExample/DoItOnce.CPP | 2 +- TempleOS/Demo/AcctExample/PersonalMenu.TXT | Bin 52801 -> 53455 bytes .../TS => Demo/AcctExample/TAD}/Adam3.CPP | 1 - .../Demo/AcctExample/TAD/Adam3aLocalize.CPP | 2 - .../AcctExample/TAD/Archive/FileSysISO3.CPP | 488 -- .../Demo/AcctExample/TAD/Archive/Logo.TXT | Bin 33204 -> 0 bytes .../AcctExample/TAD/Archive/Marketing.TXT | 21 - TempleOS/Demo/AcctExample/TAD/Archive/USB.CPP | 217 - .../Demo/AcctExample/TAD/Archive/USB1a.CPP | 114 - TempleOS/Demo/AcctExample/TAD/MakeDistro.CPP | 54 - .../Demo/AcctExample/TAD/PersonalNotes.TXT | 56 +- TempleOS/Demo/AcctExample/TAD/Registry.CPP | 28 +- TempleOS/Demo/AcctExample/TSAdam.CPP | 69 +- TempleOS/Demo/AcctExample/TSDistro.CPP | 131 +- TempleOS/Demo/Asm/AsmAndC.CPP | 7 +- TempleOS/Demo/Asm/AsmAndC2.CPP | 9 +- TempleOS/Demo/Asm/AsmHelloWorld.CPP | 11 +- TempleOS/Demo/Asm/BuzzFizz.CPP | 2 +- TempleOS/Demo/Asm/PutDec.CPP | 8 +- TempleOS/Demo/AutoFile/AFDir.AUT | 2 +- TempleOS/Demo/AutoFile/AFEd.TXT | 28 +- TempleOS/Demo/DateTime.CPP | 10 +- TempleOS/Demo/DbgDemo.CPP | 2 +- TempleOS/Demo/Doc/CallBack.CPP | 49 +- TempleOS/Demo/Doc/CallBackAux2.CPP | 35 - TempleOS/Demo/Doc/Data.CPP | 10 +- TempleOS/Demo/Doc/DefineStr.CPP | 8 +- TempleOS/Demo/Doc/Form.CPP | 6 +- TempleOS/Demo/Doc/MenuButton.CPP | 8 +- TempleOS/Demo/Doc/MenuSprite.CPP | Bin 1126 -> 1139 bytes TempleOS/Demo/Doc/TreeDemo.CPP | 28 +- TempleOS/Demo/Doc/UnusedDefine.CPP | 16 +- TempleOS/Demo/Dsk/FPrintF.CPP | 26 +- TempleOS/Demo/Dsk/UnusedSpaceRep.CPP | 2 +- TempleOS/Demo/GameStarters/Bomber.CPP | Bin 12893 -> 0 bytes TempleOS/Demo/GameStarters/Chess.CPP | 1047 --- TempleOS/Demo/GameStarters/MissileDefense.CPP | Bin 11136 -> 0 bytes TempleOS/Demo/GameStarters/Rocks.CPP | 708 -- TempleOS/Demo/GameStarters/SpaceShip.CPP | Bin 13882 -> 0 bytes .../Demo/GameStarters/Stadium/Stadium.GRA | Bin 4624 -> 0 bytes TempleOS/Demo/GameStarters/Wenceslas.CPP | 540 -- TempleOS/Demo/GameStarters/ZoneOut.CPP | Bin 9241 -> 0 bytes .../WarGame.CPP => Games/BattleLines.CPP} | Bin 8296 -> 8308 bytes .../Demo/{GameStarters => Games}/BigGuns.CPP | Bin 6505 -> 6563 bytes .../{GameStarters => Games}/BlackDiamond.CPP | Bin .../BirdLand.CPP => Games/BugBird.CPP} | Bin 5936 -> 5956 bytes TempleOS/Demo/Games/BulgeBomber.CPP | Bin 0 -> 12656 bytes .../FPS.CPP => Games/CastleFrankenstein.CPP} | 79 +- .../Demo/{GameStarters => Games}/ChessNet.CPP | Bin 6049 -> 6082 bytes .../{GameStarters => Games}/CircleTrace.CPP | 5 +- .../Demo/{GameStarters => Games}/Coach.CPP | Bin 4850 -> 4847 bytes .../{GameStarters => Games}/Collision.CPP | Bin 4118 -> 4119 bytes TempleOS/Demo/{ => Games}/Digits.CPP | 7 +- .../Demo/{GameStarters => Games}/DunGen.CPP | 68 +- .../{GameStarters => Games}/EagleDive.CPP | 86 +- .../Navy.CPP => Games/FlatTops.CPP} | 9 +- .../Demo/{GameStarters => Games}/Halogen.CPP | 30 +- .../{GameStarters => Games}/MassSpring.CPP | 0 TempleOS/Demo/{ => Games}/Maze.CPP | 0 .../{GameStarters => Games}/RainDrops.CPP | 2 +- .../Demo/{GameStarters => Games}/RawHide.CPP | 21 +- .../Demo/{GameStarters => Games}/Rocket.CPP | Bin 4707 -> 4674 bytes .../{GameStarters => Games}/RocketScience.CPP | Bin 12939 -> 12910 bytes .../Demo/{GameStarters => Games}/Squirt.CPP | 37 +- .../Stadium/Stadium.CPP | Bin 3747 -> 3763 bytes TempleOS/Demo/Games/Stadium/Stadium.GRA | Bin 0 -> 6413 bytes .../Stadium/Stadium.TXT | Bin .../Stadium/StadiumGen.CPP | 10 +- .../Demo/{GameStarters => Games}/TheDead.CPP | Bin 7102 -> 7027 bytes .../{GameStarters => Games}/TicTacToe.CPP | 6 + .../Demo/{GameStarters => Games}/Varoom.CPP | Bin 7636 -> 7848 bytes TempleOS/Demo/Games/Wenceslas.CPP | 540 ++ .../Demo/{GameStarters => Games}/Whap.CPP | 0 .../Demo/{GameStarters => Games}/Zing.CPP | Bin 4815 -> 4816 bytes TempleOS/Demo/Games/ZoneOut.CPP | Bin 0 -> 111905 bytes TempleOS/Demo/Graphics/BSpline.CPP | 3 +- TempleOS/Demo/Graphics/Bling.CPP | 241 - TempleOS/Demo/Graphics/Blot.CPP | 2 +- TempleOS/Demo/Graphics/Box.CPP | 8 +- TempleOS/Demo/Graphics/CPUPlot.CPP | 64 - TempleOS/Demo/Graphics/Camp.CPP | Bin 22837 -> 98375 bytes TempleOS/Demo/Graphics/CaptureScreen.CPP | 4 +- TempleOS/Demo/Graphics/CharGraphics.CPP | 2 +- TempleOS/Demo/Graphics/Circuit.CPP | 1191 --- TempleOS/Demo/Graphics/Doodle.CPP | 3 +- TempleOS/Demo/Graphics/DotNet.CPP | 2 + TempleOS/Demo/Graphics/Extents.CPP | Bin 1180 -> 1180 bytes TempleOS/Demo/Graphics/Flowers.CPP | Bin 4608 -> 0 bytes TempleOS/Demo/Graphics/FontEd.CPP | 1 + TempleOS/Demo/Graphics/Golf.CPP | Bin 1046 -> 0 bytes TempleOS/Demo/Graphics/Hanoi.CPP | 2 +- TempleOS/Demo/Graphics/Life.CPP | 7 +- TempleOS/Demo/Graphics/Logo.CPP | Bin 20191 -> 20191 bytes TempleOS/Demo/Graphics/Mountain.CPP | Bin 2792 -> 2611 bytes TempleOS/Demo/Graphics/NeatTrick.CPP | 21 - TempleOS/Demo/Graphics/Pic2ASCII.CPP | 101 - TempleOS/Demo/Graphics/Pick.CPP | Bin 2684 -> 2711 bytes TempleOS/Demo/Graphics/Pick3D.CPP | Bin 6576 -> 6605 bytes TempleOS/Demo/Graphics/PixelCollision.CPP | Bin 3338 -> 2547 bytes TempleOS/Demo/Graphics/PoleZeros.CPP | 16 +- TempleOS/Demo/Graphics/PredatorPrey.CPP | 15 +- TempleOS/Demo/Graphics/ScrollBars.CPP | Bin 4523 -> 4518 bytes TempleOS/Demo/Graphics/Shading.CPP | 2 +- TempleOS/Demo/Graphics/Shadow.CPP | Bin 2244 -> 2244 bytes TempleOS/Demo/Graphics/Speedline.CPP | 7 +- TempleOS/Demo/Graphics/SpritePlot.CPP | Bin 20725 -> 20725 bytes TempleOS/Demo/Graphics/SpritePlot3D.CPP | Bin 1209 -> 1115 bytes TempleOS/Demo/Graphics/SpritePut.CPP | Bin 24857 -> 24998 bytes TempleOS/Demo/Graphics/Symmetry.CPP | 3 +- TempleOS/Demo/Graphics/Transform.CPP | Bin 8991 -> 9106 bytes TempleOS/Demo/Graphics/WallPaperFish.CPP | Bin 6388 -> 6388 bytes TempleOS/Demo/Graphics/WinZBuf.CPP | 3 +- TempleOS/Demo/Lectures/64BitAsmQuiz.TXT | 5 - TempleOS/Demo/Lectures/FixedPoint.CPP | 4 +- TempleOS/Demo/Lectures/FixedPointAdvanced.CPP | 29 +- TempleOS/Demo/Lectures/InterruptDemo.CPP | 2 +- TempleOS/Demo/Lectures/MiniCompiler.CPP | 2 +- TempleOS/Demo/Lectures/PageTableEntries1.CPP | 2 +- TempleOS/Demo/Lectures/PageTableEntries2.CPP | 2 +- TempleOS/Demo/Lectures/Uncached.CPP | 4 +- TempleOS/Demo/MagicPairs.CPP | 16 +- TempleOS/Demo/MakeDistro.CPP | 4 +- TempleOS/Demo/MsgLoop.CPP | 1 + TempleOS/Demo/MultiCore/Clouds.CPP | 57 +- TempleOS/Demo/MultiCore/Layers3DJob.CPP | Bin 2389 -> 0 bytes TempleOS/Demo/MultiCore/LayersSpawn.CPP | 83 - TempleOS/Demo/MultiCore/LoadTest.CPP | 33 +- TempleOS/Demo/MultiCore/Lock.CPP | 28 +- TempleOS/Demo/MultiCore/MPAdd.CPP | 25 +- TempleOS/Demo/MultiCore/MPPrintF.CPP | 8 +- TempleOS/Demo/MultiCore/Noise.CPP | 63 - TempleOS/Demo/MultiCore/Palindrome.CPP | 15 +- TempleOS/Demo/MultiCore/Primes.CPP | 5 +- TempleOS/Demo/MultiCore/RadixSort.CPP | 17 +- TempleOS/Demo/MultiCore/Sort.CPP | 113 - TempleOS/Demo/OldSchool/Demo2/MakeFile.CPP | 2 +- TempleOS/Demo/OldSchool/Demo2/OD1.BIN | Bin 160 -> 0 bytes TempleOS/Demo/OldSchool/Demo2/OD2.BIN | Bin 335 -> 0 bytes TempleOS/Demo/OldSchool/Demo2/ODMain.BIN | Bin 368 -> 0 bytes TempleOS/Demo/OldSchool/Demo2/ReadMe.TXT | 2 +- TempleOS/Demo/OldSchool/ReadMe.TXT | 2 +- TempleOS/Demo/PrintF.CPP | 4 +- TempleOS/Demo/Progress.CPP | 23 +- TempleOS/Demo/Prompt.CPP | 6 +- TempleOS/Demo/RegistryDemo.CPP | 8 +- TempleOS/Demo/ScreenCodes.CPP | 2 +- TempleOS/Demo/Shared/TreeDemoJoin.CPP | 25 - TempleOS/Demo/Snd/ASCIIOrgan.CPP | Bin 4178 -> 4174 bytes TempleOS/Demo/Snd/BeatFreq.CPP | 68 - TempleOS/Demo/Snd/Chords.CPP | 16 - TempleOS/Demo/Snd/Echo.CPP | 96 - TempleOS/Demo/Snd/Guitar.CPP | 17 - TempleOS/Demo/Snd/MorseCode.CPP | 4 +- TempleOS/Demo/Snd/PolyPhonic.CPP | 98 - TempleOS/Demo/Snd/Record.CPP | 120 - TempleOS/Demo/Snd/SndScope.CPP | 46 - TempleOS/Demo/Snd/Synth.CPP | 280 - TempleOS/Demo/Snd/WaterFowl.CPP | Bin 3861 -> 3455 bytes TempleOS/Demo/Spy.CPP | 4 +- TempleOS/Demo/WebLogExample/WebLogRep.CPP | 8 +- TempleOS/Demo/WebLogExample/access_090509.LOG | 2 +- TempleOS/Demo/WebLogExample/access_090510.LOG | 4 +- TempleOS/Demo/WinMgr2.CPP | 161 - TempleOS/Doc/Acknowledgements.TXT | 33 +- TempleOS/Doc/AutoFile.TXT | 3 +- TempleOS/Doc/Bit.TXT | 4 +- TempleOS/Doc/Boot.TXT | Bin 4370 -> 4367 bytes TempleOS/Doc/ChangeLog.TXT | 148 +- TempleOS/Doc/Char.TXT | 3 +- TempleOS/Doc/Charter.TXT | 23 +- TempleOS/Doc/CmdLine.TXT | 2 +- TempleOS/Doc/Confuse.TXT | 7 +- TempleOS/Doc/Ctrls.TXT | 2 - TempleOS/Doc/Customize.TXT | 3 - TempleOS/Doc/CutCorners.TXT | 2 +- TempleOS/Doc/D3.TXT | 3 +- TempleOS/Doc/Dbg.TXT | 4 +- TempleOS/Doc/Define.TXT | 1 - TempleOS/Doc/DemoIndex.TXT | 99 +- TempleOS/Doc/Directives.TXT | 2 +- TempleOS/Doc/Doc.TXT | 7 +- TempleOS/Doc/Dollar.TXT | 26 +- TempleOS/Doc/Features.TXT | 4 +- TempleOS/Doc/FileMgr.TXT | 4 +- TempleOS/Doc/Glossary.TXT | 81 +- TempleOS/Doc/Graphics.TXT | Bin 6694 -> 6289 bytes TempleOS/Doc/Grub.TXT | 1 - TempleOS/Doc/GuideLines.TXT | 74 +- TempleOS/Doc/Hash.TXT | 3 +- TempleOS/Doc/HelpIndex.TXT | Bin 9988 -> 7498 bytes TempleOS/Doc/HelpSystem.TXT | 1 - TempleOS/Doc/{Differences.TXT => HolyC.TXT} | 11 +- TempleOS/Doc/ImportExports.TXT | 67 +- TempleOS/Doc/InputPointer.TXT | 2 +- TempleOS/Doc/Install.TXT | 3 +- TempleOS/Doc/Lex.TXT | 1 - TempleOS/Doc/Mem.TXT | Bin 6301 -> 5976 bytes TempleOS/Doc/Menus.TXT | 1 - TempleOS/Doc/MultiCore.TXT | 2 +- TempleOS/Doc/MultiTasking.TXT | 2 +- TempleOS/Doc/Mysteries.TXT | 9 +- TempleOS/Doc/NamedFrame.TXT | 1 - TempleOS/Doc/NewFileSystem.TXT | 2 - TempleOS/Doc/ODE.TXT | 3 +- TempleOS/Doc/Options.TXT | 2 - TempleOS/Doc/Profiler.TXT | 1 - TempleOS/Doc/Que.TXT | 3 - TempleOS/Doc/Quirks.TXT | 2 +- TempleOS/Doc/Requirements.TXT | 6 +- TempleOS/Doc/Resource.TXT | 5 + TempleOS/Doc/Snd.TXT | 6 - TempleOS/Doc/Splash.TXT | 3 +- TempleOS/Doc/Sprite.TXT | 3 +- TempleOS/Doc/SpriteBitMap.TXT | 3 + TempleOS/Doc/SpriteEd.TXT | 9 + TempleOS/Doc/SpriteEdText.TXT | 7 + TempleOS/Doc/SpriteMain.TXT | 9 + TempleOS/Doc/SpriteSideBar.TXT | 7 + TempleOS/Doc/Start.TXT | 2 - TempleOS/Doc/Strategy.TXT | 2 - TempleOS/Doc/SysPgmGuide.TXT | 31 - TempleOS/Doc/TSZ.TXT | 12 +- TempleOS/Doc/TimeCycles.TXT | 2 - TempleOS/Doc/TimeDate.TXT | 2 - TempleOS/Doc/TimeJiffy.TXT | 2 - TempleOS/Doc/Tips.TXT | 10 +- TempleOS/Doc/Transform.TXT | 3 +- TempleOS/Doc/TrivialSolutions.TXT | 2 +- TempleOS/Doc/Upgrade.TXT | 1 - TempleOS/Doc/Welcome.TXT | 21 +- TempleOS/Doc/{CtrlL.TXT => Widget.TXT} | 6 +- TempleOS/Doc/WordStat.TXT | 1 - TempleOS/Kernel/Adam1a.HPP | 575 +- TempleOS/Kernel/Adam1b.HPP | 38 +- TempleOS/Kernel/Adam1c.HPP | 169 +- TempleOS/Kernel/BootDefs.HPP | 11 +- TempleOS/Kernel/Compress.CPP | 7 +- TempleOS/Kernel/DataTypes1a.CPP | 323 + TempleOS/Kernel/Date.CPP | 252 +- TempleOS/Kernel/Dbg1a.CPP | 22 +- TempleOS/Kernel/Define1a.CPP | 13 +- TempleOS/Kernel/Display.CPP | 41 +- TempleOS/Kernel/Dsk/ATADef.HPP | 2 +- TempleOS/Kernel/Dsk/Dsk1a.CPP | 50 +- TempleOS/Kernel/Dsk/Dsk1b.CPP | 40 +- TempleOS/Kernel/Dsk/Dsk1c.CPP | 24 +- TempleOS/Kernel/Dsk/DskATA.CPP | 27 +- TempleOS/Kernel/Dsk/DskAddDev.CPP | 67 +- TempleOS/Kernel/Dsk/DskCFile.CPP | 16 +- TempleOS/Kernel/Dsk/DskDir.CPP | 10 +- TempleOS/Kernel/Dsk/DskStr.CPP | 11 +- TempleOS/Kernel/Dsk/FileSysFAT.CPP | 47 +- TempleOS/Kernel/Dsk/FileSysISO1.CPP | 6 +- .../{FileSysNative.CPP => FileSysRedSea.CPP} | 122 +- TempleOS/Kernel/EdLite.CPP | 24 +- TempleOS/Kernel/FIFO.CPP | 169 - TempleOS/Kernel/Font8x8.CPP | 2 +- TempleOS/Kernel/Hash1a.CPP | 22 +- TempleOS/Kernel/Interrupts.CPP | 3 +- TempleOS/Kernel/KCfg.CPP | 30 +- TempleOS/Kernel/KEnd.CPP | 21 +- TempleOS/Kernel/KExts.CPP | 35 +- TempleOS/Kernel/KGlbls.CPP | 21 +- TempleOS/Kernel/KStart.CPP | 21 +- TempleOS/Kernel/KbdMouse/Keyboard.CPP | 34 +- TempleOS/Kernel/KbdMouse/Message.CPP | 42 +- TempleOS/Kernel/Kernel.MAP | 6520 ++++++++--------- TempleOS/Kernel/Kernel.PRJ | 6 +- TempleOS/Kernel/Math1b.CPP | 2 +- TempleOS/Kernel/Memory.CPP | 102 +- TempleOS/Kernel/Misc1a.CPP | 47 +- TempleOS/Kernel/MultiProc.CPP | 247 +- TempleOS/Kernel/PSect.CPP | 127 +- TempleOS/Kernel/QSort.CPP | 6 +- TempleOS/Kernel/Scheduler.CPP | 14 +- TempleOS/Kernel/SrvCmd.CPP | 522 ++ TempleOS/Kernel/Str1a.CPP | 54 +- TempleOS/Kernel/Task1a.CPP | 89 +- TempleOS/Kernel/TaskCmd.CPP | 422 -- TempleOS/Kernel/Utils1a.CPP | 124 + TempleOS/Misc/OSTestSuite.CPP | 829 +-- TempleOS/Misc/Tour/Tour.AUT | 8 +- TempleOS/Misc/Tour/Tour1.AUT | 43 +- TempleOS/Misc/Tour/Tour2.AUT | 56 +- TempleOS/Misc/Tour/Tour3.AUT | 17 +- TempleOS/Misc/Tour/Tour5.AUT | 2 +- TempleOS/Misc/Tour/Tour7.AUT | 10 +- TempleOS/ReadMe.TXT | 2 +- 617 files changed, 14399 insertions(+), 25130 deletions(-) delete mode 100644 0000Boot/BootCD.BIN delete mode 100644 TempleOS/Accts/Adam3cSnd.CPP delete mode 100644 TempleOS/Accts/SafeMode/Adam3.CPP delete mode 100644 TempleOS/Accts/SafeMode/Adam3cSnd.CPP delete mode 100644 TempleOS/Accts/SafeMode/Adam3fSys.CPP delete mode 100644 TempleOS/Accts/SafeMode/DoItOnce.CPP create mode 100644 TempleOS/Accts/TS/DbgAdam1.CPP rename TempleOS/{Demo/AcctExample => Accts/TS/TAD}/Adam3.CPP (92%) delete mode 100644 TempleOS/Accts/TS/TAD/Archive/FileSysISO3.CPP delete mode 100644 TempleOS/Accts/TS/TAD/Archive/Logo.TXT delete mode 100644 TempleOS/Accts/TS/TAD/Archive/Marketing.TXT delete mode 100644 TempleOS/Accts/TS/TAD/Archive/USB.CPP delete mode 100644 TempleOS/Accts/TS/TAD/Archive/USB1a.CPP delete mode 100644 TempleOS/Accts/TS/TAD/MakeDistro.CPP delete mode 100644 TempleOS/Accts/TS/Wb2/Blog.TXT delete mode 100644 TempleOS/Accts/TS/Wb2/Menu.BMP create mode 100644 TempleOS/Accts/TS/Wb2/MenuV0104.BMP delete mode 100644 TempleOS/Accts/TS/Wb2/TempleOS.BMP create mode 100644 TempleOS/Accts/TS/Wb2/TempleOSV0104.BMP rename TempleOS/Accts/TS/Wb2/{Tanks.BMP => ToTheFront.BMP} (100%) rename TempleOS/Adam/{Dsk => Boot}/DskCDDVD.CPP (57%) rename TempleOS/Adam/Gr/{CSpriteVect.CPP => CSpriteMain.CPP} (66%) delete mode 100644 TempleOS/Adam/Gr/GrVectMap.CPP delete mode 100644 TempleOS/Adam/Snd/HDAudio.CPP delete mode 100644 TempleOS/Adam/Snd/HDCfg.CPP rename TempleOS/Adam/{ => Utils}/BinRep.CPP (95%) rename TempleOS/Adam/{ => Utils}/Diff.CPP (97%) rename TempleOS/Adam/{ => Utils}/FileBMP.CPP (97%) rename TempleOS/Adam/{ => Utils}/Grep.CPP (92%) rename TempleOS/Adam/{ => Utils}/HeapLog.CPP (100%) rename TempleOS/Adam/{ => Utils}/LineCnt.CPP (98%) rename TempleOS/Adam/{ => Utils}/LinkChk.CPP (92%) rename TempleOS/Adam/{ => Utils}/MemRep.CPP (85%) rename TempleOS/Adam/{ => Utils}/Merge.CPP (89%) rename TempleOS/Adam/{ => Utils}/Profiler.CPP (100%) rename TempleOS/Adam/{ => Utils}/S2T.CPP (100%) rename TempleOS/Adam/{ => Utils}/ToHtml.CPP (96%) rename TempleOS/Adam/{ => Utils}/ToTXT.CPP (100%) delete mode 100644 TempleOS/Apps/AfterEgypt/AENotes.TXT delete mode 100644 TempleOS/Apps/AfterEgypt/AENotesPart2.TXT delete mode 100644 TempleOS/Apps/AfterEgypt/Comics/Moses65.TXT delete mode 100644 TempleOS/Apps/AfterEgypt/Comics/Moses67.TXT create mode 100644 TempleOS/Apps/AfterEgypt/Comics/Moses75.TXT create mode 100644 TempleOS/Apps/AfterEgypt/GodTalking.CPP delete mode 100644 TempleOS/Apps/Pilgrims/Load.CPP delete mode 100644 TempleOS/Apps/Pilgrims/NewEngland.GRA delete mode 100644 TempleOS/Apps/Pilgrims/Pilgrims.CPP delete mode 100644 TempleOS/Apps/Pilgrims/Run.CPP delete mode 100644 TempleOS/Apps/Tanks/Install.CPP delete mode 100644 TempleOS/Apps/Tanks/Load.CPP delete mode 100644 TempleOS/Apps/Tanks/Run.CPP create mode 100644 TempleOS/Apps/TimeOut/Load.CPP create mode 100644 TempleOS/Apps/TimeOut/Run.CPP rename TempleOS/Apps/{Timeout/Timeout.CPP => TimeOut/TimeOut.CPP} (93%) delete mode 100644 TempleOS/Apps/Timeout/Load.CPP delete mode 100644 TempleOS/Apps/Timeout/Run.CPP rename TempleOS/Apps/{Tanks => ToTheFront}/AIs/Human.CPP (93%) rename TempleOS/Apps/{Tanks => ToTheFront}/AIs/SimpleAI.CPP (94%) create mode 100644 TempleOS/Apps/ToTheFront/Install.CPP create mode 100644 TempleOS/Apps/ToTheFront/Load.CPP create mode 100644 TempleOS/Apps/ToTheFront/Run.CPP rename TempleOS/Apps/{Tanks/Tanks.CPP => ToTheFront/ToTheFront.CPP} (92%) delete mode 100644 TempleOS/Compiler/CmpQueVect.CPP create mode 100644 TempleOS/Demo/AcctExample/DbgAdam1.CPP rename TempleOS/{Accts/TS => Demo/AcctExample/TAD}/Adam3.CPP (92%) delete mode 100644 TempleOS/Demo/AcctExample/TAD/Archive/FileSysISO3.CPP delete mode 100644 TempleOS/Demo/AcctExample/TAD/Archive/Logo.TXT delete mode 100644 TempleOS/Demo/AcctExample/TAD/Archive/Marketing.TXT delete mode 100644 TempleOS/Demo/AcctExample/TAD/Archive/USB.CPP delete mode 100644 TempleOS/Demo/AcctExample/TAD/Archive/USB1a.CPP delete mode 100644 TempleOS/Demo/AcctExample/TAD/MakeDistro.CPP delete mode 100644 TempleOS/Demo/Doc/CallBackAux2.CPP delete mode 100644 TempleOS/Demo/GameStarters/Bomber.CPP delete mode 100644 TempleOS/Demo/GameStarters/Chess.CPP delete mode 100644 TempleOS/Demo/GameStarters/MissileDefense.CPP delete mode 100644 TempleOS/Demo/GameStarters/Rocks.CPP delete mode 100644 TempleOS/Demo/GameStarters/SpaceShip.CPP delete mode 100644 TempleOS/Demo/GameStarters/Stadium/Stadium.GRA delete mode 100644 TempleOS/Demo/GameStarters/Wenceslas.CPP delete mode 100644 TempleOS/Demo/GameStarters/ZoneOut.CPP rename TempleOS/Demo/{GameStarters/WarGame.CPP => Games/BattleLines.CPP} (99%) rename TempleOS/Demo/{GameStarters => Games}/BigGuns.CPP (94%) rename TempleOS/Demo/{GameStarters => Games}/BlackDiamond.CPP (100%) rename TempleOS/Demo/{GameStarters/BirdLand.CPP => Games/BugBird.CPP} (89%) create mode 100644 TempleOS/Demo/Games/BulgeBomber.CPP rename TempleOS/Demo/{GameStarters/FPS.CPP => Games/CastleFrankenstein.CPP} (84%) rename TempleOS/Demo/{GameStarters => Games}/ChessNet.CPP (98%) rename TempleOS/Demo/{GameStarters => Games}/CircleTrace.CPP (96%) rename TempleOS/Demo/{GameStarters => Games}/Coach.CPP (96%) rename TempleOS/Demo/{GameStarters => Games}/Collision.CPP (98%) rename TempleOS/Demo/{ => Games}/Digits.CPP (91%) rename TempleOS/Demo/{GameStarters => Games}/DunGen.CPP (85%) rename TempleOS/Demo/{GameStarters => Games}/EagleDive.CPP (92%) rename TempleOS/Demo/{GameStarters/Navy.CPP => Games/FlatTops.CPP} (99%) rename TempleOS/Demo/{GameStarters => Games}/Halogen.CPP (82%) rename TempleOS/Demo/{GameStarters => Games}/MassSpring.CPP (100%) rename TempleOS/Demo/{ => Games}/Maze.CPP (100%) rename TempleOS/Demo/{GameStarters => Games}/RainDrops.CPP (98%) rename TempleOS/Demo/{GameStarters => Games}/RawHide.CPP (92%) rename TempleOS/Demo/{GameStarters => Games}/Rocket.CPP (93%) rename TempleOS/Demo/{GameStarters => Games}/RocketScience.CPP (97%) rename TempleOS/Demo/{GameStarters => Games}/Squirt.CPP (93%) rename TempleOS/Demo/{GameStarters => Games}/Stadium/Stadium.CPP (95%) create mode 100644 TempleOS/Demo/Games/Stadium/Stadium.GRA rename TempleOS/Demo/{GameStarters => Games}/Stadium/Stadium.TXT (100%) rename TempleOS/Demo/{GameStarters => Games}/Stadium/StadiumGen.CPP (64%) rename TempleOS/Demo/{GameStarters => Games}/TheDead.CPP (76%) rename TempleOS/Demo/{GameStarters => Games}/TicTacToe.CPP (96%) rename TempleOS/Demo/{GameStarters => Games}/Varoom.CPP (90%) create mode 100644 TempleOS/Demo/Games/Wenceslas.CPP rename TempleOS/Demo/{GameStarters => Games}/Whap.CPP (100%) rename TempleOS/Demo/{GameStarters => Games}/Zing.CPP (98%) create mode 100644 TempleOS/Demo/Games/ZoneOut.CPP delete mode 100644 TempleOS/Demo/Graphics/Bling.CPP delete mode 100644 TempleOS/Demo/Graphics/CPUPlot.CPP delete mode 100644 TempleOS/Demo/Graphics/Circuit.CPP delete mode 100644 TempleOS/Demo/Graphics/Flowers.CPP delete mode 100644 TempleOS/Demo/Graphics/Golf.CPP delete mode 100644 TempleOS/Demo/Graphics/NeatTrick.CPP delete mode 100644 TempleOS/Demo/Graphics/Pic2ASCII.CPP delete mode 100644 TempleOS/Demo/MultiCore/Layers3DJob.CPP delete mode 100644 TempleOS/Demo/MultiCore/LayersSpawn.CPP delete mode 100644 TempleOS/Demo/MultiCore/Noise.CPP delete mode 100644 TempleOS/Demo/MultiCore/Sort.CPP delete mode 100644 TempleOS/Demo/OldSchool/Demo2/OD1.BIN delete mode 100644 TempleOS/Demo/OldSchool/Demo2/OD2.BIN delete mode 100644 TempleOS/Demo/OldSchool/Demo2/ODMain.BIN delete mode 100644 TempleOS/Demo/Shared/TreeDemoJoin.CPP delete mode 100644 TempleOS/Demo/Snd/BeatFreq.CPP delete mode 100644 TempleOS/Demo/Snd/Chords.CPP delete mode 100644 TempleOS/Demo/Snd/Echo.CPP delete mode 100644 TempleOS/Demo/Snd/Guitar.CPP delete mode 100644 TempleOS/Demo/Snd/PolyPhonic.CPP delete mode 100644 TempleOS/Demo/Snd/Record.CPP delete mode 100644 TempleOS/Demo/Snd/SndScope.CPP delete mode 100644 TempleOS/Demo/Snd/Synth.CPP delete mode 100644 TempleOS/Demo/WinMgr2.CPP rename TempleOS/Doc/{Differences.TXT => HolyC.TXT} (98%) create mode 100644 TempleOS/Doc/Resource.TXT delete mode 100644 TempleOS/Doc/Snd.TXT create mode 100644 TempleOS/Doc/SpriteBitMap.TXT create mode 100644 TempleOS/Doc/SpriteEd.TXT create mode 100644 TempleOS/Doc/SpriteEdText.TXT create mode 100644 TempleOS/Doc/SpriteMain.TXT create mode 100644 TempleOS/Doc/SpriteSideBar.TXT delete mode 100644 TempleOS/Doc/SysPgmGuide.TXT rename TempleOS/Doc/{CtrlL.TXT => Widget.TXT} (92%) create mode 100644 TempleOS/Kernel/DataTypes1a.CPP rename TempleOS/Kernel/Dsk/{FileSysNative.CPP => FileSysRedSea.CPP} (86%) delete mode 100644 TempleOS/Kernel/FIFO.CPP create mode 100644 TempleOS/Kernel/SrvCmd.CPP delete mode 100644 TempleOS/Kernel/TaskCmd.CPP diff --git a/0000Boot/0000Kernel.BIN.C b/0000Boot/0000Kernel.BIN.C index eaf58db0732c119a7fc54054ae2ed8346f197c29..26ecefdd357de743497c931bf72600a6b4a83d44 100644 GIT binary patch literal 222448 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 Jh1`CMAOXfK3Z(!5 literal 222896 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 diff --git a/0000Boot/BootCD.BIN b/0000Boot/BootCD.BIN deleted file mode 100644 index 5ecf30627b14e9125a631628d3227c175a602346..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2041 zcmeyfBcVR6@4&CLz6*O8xPHH2V2EyhEp+fTOIptf=EG@yH+C{`7=JVV|9J^m;f+`8 z7!v9k7z7v?8IXZbequ^yUb;d^YHmSJs(&y8jG<7JT3DJ{lv=Eis9o_!aSPvO_Vg}WGX@5RvjT_La2+W5_2Sk4*Wc1R zL`@kO7`E`A6-e&@OQ-E%U|?uS<6o3!%gDgcP$ZDH14M%a_;)>$E#lZ0!SG`5|JVQa zxih@j`hUj(_O!kOX~rkhyLo#U7#Kj>9T?J#FQt9|n3mqz2NFs@J_+iOg&hp(-J)F# z3=Dw*L2T)r_6!UR>7AmEAXPmF(mQP#7#Q}MGi-56?*hB)tZ+mFLt5W~sEGduN}2v2 z3P|skodQz4u#X`voe^Ygx+PeoWP{!dq5lz)j~1q-cguEw)Es;)u$!6T6$8TocBu8E U)MyBdhQMeDjE2By2v9u)0Eotm+5i9m diff --git a/0000Boot/BootMHD2.BIN.C b/0000Boot/BootMHD2.BIN.C index b5107f4b9e055a32838440cd6ccca834fc62f23d..54fea1693dd66cbead5688768806cbf54d33b975 100644 GIT binary patch delta 47 zcmX@ca*RbFB`y6pD+2=qgOh@h!j1*gCJHEXPD|^%@oEd>f@vFVm>8L7^D=IBWMpLo E0C0W|-v9sr delta 47 zcmX@ca*RbFB`y6pD+2=qgOh@h!j1*?69tqx>(lyfyxPLJpnjtb6C<;?6T@alMpi}u DX~GVE diff --git a/TempleOS/Accts/Adam3.CPP b/TempleOS/Accts/Adam3.CPP index 05b8698..79b1fa2 100644 --- a/TempleOS/Accts/Adam3.CPP +++ b/TempleOS/Accts/Adam3.CPP @@ -3,7 +3,6 @@ #include "HOME/Adam3aLocalize" #include "HOME/Adam3bPkgs" -#include "HOME/Adam3cSnd" #include "HOME/Adam3dKeyPlugIns" #include "HOME/Adam3eWrappers" #include "HOME/Adam3fSys" diff --git a/TempleOS/Accts/Adam3aLocalize.CPP b/TempleOS/Accts/Adam3aLocalize.CPP index 355852d..0315c2c 100644 --- a/TempleOS/Accts/Adam3aLocalize.CPP +++ b/TempleOS/Accts/Adam3aLocalize.CPP @@ -7,8 +7,6 @@ SetTypeMatic(0); //Set Time Zone local_time_offset=0*60*60*CDATE_FREQ; -snd_vol=0.1; - //$AN,"","mouse_move_scale"$adjust these to set mouse move scale mxx_scale=0.5; myy_scale=0.5; diff --git a/TempleOS/Accts/Adam3bPkgs.CPP b/TempleOS/Accts/Adam3bPkgs.CPP index a5afe9b..4d2744b 100644 --- a/TempleOS/Accts/Adam3bPkgs.CPP +++ b/TempleOS/Accts/Adam3bPkgs.CPP @@ -3,7 +3,8 @@ Cd("/TempleOS/Adam/Boot");; #include "InsBoot" -Cd("/TempleOS/Adam");; +Cd("/TempleOS/Adam/Utils");; +#include "Profiler" #include "Diff" #include "Grep" #include "LineCnt" diff --git a/TempleOS/Accts/Adam3cSnd.CPP b/TempleOS/Accts/Adam3cSnd.CPP deleted file mode 100644 index 7e8ea7c..0000000 --- a/TempleOS/Accts/Adam3cSnd.CPP +++ /dev/null @@ -1,10 +0,0 @@ -//Change anything you want in this -//acct file or others. - -Cd("/TempleOS/Adam/Snd");; -#include "HDAudio" -//Uncomment this after running $LK-A,"::/TempleOS/Adam/Snd/HDCfg.CPP"$. -//#include "HOME/HDAudioCfg" -LBtr(&sys_semas[SYS_SEMA_SND],0); - -Cd("HOME");; diff --git a/TempleOS/Accts/Adam3dKeyPlugIns.CPP b/TempleOS/Accts/Adam3dKeyPlugIns.CPP index 0878854..549ab4e 100644 --- a/TempleOS/Accts/Adam3dKeyPlugIns.CPP +++ b/TempleOS/Accts/Adam3dKeyPlugIns.CPP @@ -3,9 +3,9 @@ U0 FillInTime() { - CDate spdt; - spdt=GetCurTimeCDate; - "$$IV,1$$----%D %T----$$IV,0$$\n",spdt,spdt; + CDate cdt; + cdt=GetCurTimeDate; + "$$IV,1$$----%D %T----$$IV,0$$\n",cdt,cdt; } @@ -96,7 +96,7 @@ Bool MyPutKey(I64 ch,I64 sc) SetKeyDesc("Misc/Insert Datetime"); } else { if (sc & SCF_SHIFT) - DocInsSafe(DocCur, + DocInsSafe(DocPut, "$$HS+C$$$$FG$$$$HE$$"); else FillInTime(); @@ -135,7 +135,7 @@ Bool MyPutKey(I64 ch,I64 sc) else { ClipBoardDel; DocPrintF(sys_clipboard_doc,"$$LK-A,\"FL:%s,%d\"$$", - DocCur->filename.name,DocCur->cur_entry->y+1); + DocPut->filename.name,DocPut->cur_entry->y+1); } return TRUE; case 'L': @@ -145,7 +145,7 @@ Bool MyPutKey(I64 ch,I64 sc) i=RandU32; ClipBoardDel; DocPrintF(sys_clipboard_doc,"$$LK,\"\",\"FA:%s,ANC%d\"$$", - DocCur->filename.name,i); + DocPut->filename.name,i); "$$AN,\"\",\"ANC%d\"$$",i; } return TRUE; diff --git a/TempleOS/Accts/Adam3fSys.CPP b/TempleOS/Accts/Adam3fSys.CPP index 04f9a42..28412ae 100644 --- a/TempleOS/Accts/Adam3fSys.CPP +++ b/TempleOS/Accts/Adam3fSys.CPP @@ -4,16 +4,16 @@ U0 UserStartUp() { //Run each time a user a spawned UseTermDoc; - DocCurAttr(WHITE<<4+BLUE); Type("::/TempleOS/Doc/Start.TXT"); LBts(&Fs->display_flags,DISPLAYf_SHOW); WinZBufUpdate; if (!IsSysDeterministic) Preempt(ON); + Dir; } -U0 ServantStartUp() -{ //Run each time a servant task is spawned. +U0 SrvStartUp() +{ //Run each time a srv task is spawned. UseTermDoc; LBts(&Fs->display_flags,DISPLAYf_SHOW); WinZBufUpdate; diff --git a/TempleOS/Accts/DoItOnce.CPP b/TempleOS/Accts/DoItOnce.CPP index c250de3..d4c1438 100644 --- a/TempleOS/Accts/DoItOnce.CPP +++ b/TempleOS/Accts/DoItOnce.CPP @@ -1,6 +1,6 @@ //This file is executed by the //first terminal window upon start-up. -//See $LK,"DoItOnce","FF:HOME/Adam3fSys.CPP,DoItOnce"$. +//See $LK,"DoItOnce","FF:HOME/Adam3fSys.CPP,DoItOnce"$ and $LK,"Acct Files","FF:::/TempleOS/Doc/GuideLines.TXT,ACCT FILES"$. //It goes in your HOME directory and //you can customize it. @@ -11,6 +11,6 @@ Type("::/TempleOS/Doc/Customize.TXT"); "\nTake Tour"; if (YorN) { - Cd("/TempleOS/Misc/Tour"); + Cd("::/TempleOS/Misc/Tour"); AutoFile("Tour"); } diff --git a/TempleOS/Accts/Install/Adam3fSys.CPP b/TempleOS/Accts/Install/Adam3fSys.CPP index 5262f38..f2347df 100644 --- a/TempleOS/Accts/Install/Adam3fSys.CPP +++ b/TempleOS/Accts/Install/Adam3fSys.CPP @@ -4,7 +4,6 @@ U0 UserStartUp() { //Run each time a user a spawned UseTermDoc; - DocCurAttr(WHITE<<4+BLUE); Type("::/TempleOS/Doc/Start.TXT"); LBts(&Fs->display_flags,DISPLAYf_SHOW); WinZBufUpdate; @@ -12,8 +11,8 @@ U0 UserStartUp() Preempt(ON); } -U0 ServantStartUp() -{ //Run each time a servant task is spawned. +U0 SrvStartUp() +{ //Run each time a srv task is spawned. UseTermDoc; LBts(&Fs->display_flags,DISPLAYf_SHOW); WinZBufUpdate; diff --git a/TempleOS/Accts/Install/DoItOnce.CPP b/TempleOS/Accts/Install/DoItOnce.CPP index 3995199..330840c 100644 --- a/TempleOS/Accts/Install/DoItOnce.CPP +++ b/TempleOS/Accts/Install/DoItOnce.CPP @@ -26,7 +26,7 @@ U0 VMInstallBoot(CTask *task,U8 cd_drv,U8 drv,U8 *acct_name, XTalkWait(task, "MakeOSInstallPrtBootLoader('%C');\n" - "B10x20000\n",drv); + "B1\n0x20000\n",drv); if (ata_drv) XTalkWait(task,"C2p%d\n",ata_drv->num); @@ -48,11 +48,15 @@ U0 VMInstallWizard() CTask *task; while (TRUE) { "Make-up a Log-In Name (account).\n"; - acct_name=PmtStr("User Acct Name (%s): ","User"); + acct_name=PmtStr("User Acct Name: "); if (FileNameChk(acct_name)) break; Free(acct_name); } + + "\nIt's normal for this to freeze for a moment or two.\n"; + PressAKey; + task=SpawnUser; TaskWait(task); SetWinHorz(Fs->win_left,Fs->win_right,task); @@ -61,10 +65,10 @@ U0 VMInstallWizard() WinToTop(Fs); ATARep(FALSE,TRUE,&root); - ATAIDDrvs(root,dft_drv,&ata_drv,&atapi_drv); + ATAIDDrvs(root,*sys_acct,&ata_drv,&atapi_drv); if (VMPrtDsk(task,ata_drv)) { - VMInstallBoot(task,dft_drv,'C',acct_name,ata_drv,atapi_drv); - VMInstallBoot(task,dft_drv,'D',acct_name,ata_drv,atapi_drv); + VMInstallBoot(task,*sys_acct,'C',acct_name,ata_drv,atapi_drv); + VMInstallBoot(task,*sys_acct,'D',acct_name,ata_drv,atapi_drv); InstallMasterBootLoader('C'); } LinkedLstDel(root); @@ -85,11 +89,15 @@ U0 RegularInstallWizard() while (TRUE) { "Make-up a Log-In Name (account).\n"; - acct_name=PmtStr("User Acct Name (%s): ","User"); + acct_name=PmtStr("User Acct Name: "); if (FileNameChk(acct_name)) break; Free(acct_name); } + + "\nIt's normal for this to freeze for a moment or two.\n"; + PressAKey; + task=SpawnUser; TaskWait(task); SetWinHorz(Fs->win_left,Fs->win_right,task); @@ -143,7 +151,7 @@ U0 RegularInstallWizard() } NewLine; - st1=MSPrintF("%C:/TempleOS",dft_drv); + st1=MSPrintF("%C:/TempleOS",*sys_acct); st2=MSPrintF("%C:/TempleOS",*dst); "$$FG,RED$$Format %C Partition?$$FG$$\n",*dst; @@ -151,7 +159,7 @@ U0 RegularInstallWizard() NewLine; while (TRUE) { "$$FG,PURPLE$$1$$FG$$) Use FAT32\n" - "$$FG,PURPLE$$2$$FG$$) Use TempleOS Native\n" + "$$FG,PURPLE$$2$$FG$$) Use RedSea\n" "\nFile System Type: "; ch=GetChar; NewLine; @@ -161,7 +169,7 @@ U0 RegularInstallWizard() if (ch=='1') Fmt(*dst,TRUE,FALSE,PT_FAT32); else - Fmt(*dst,TRUE,FALSE,PT_NATIVE); + Fmt(*dst,TRUE,FALSE,PT_REDSEA); } else { "\n$$BK,1$$WARNING$$BK,0$$ if you answer yes to the following " "you will lose all TempleOS files in your /TempleOS directory tree.\n" @@ -183,7 +191,7 @@ U0 RegularInstallWizard() Copy("::/TempleOS/Demo/MakeDistro.CPP.Z",new_home_str); XTalkWait(task, "MakeOSInstallPrtBootLoader('%C');\n" - "B10x20000\n" + "B1\n0x20000\n" "C" "2p" "%s\n" diff --git a/TempleOS/Accts/PersonalMenu.TXT b/TempleOS/Accts/PersonalMenu.TXT index ae6fc47f14c1f7c10a9725a1799b0ff4b243c0fa..001a626adfe97e08527866cc6c5ecfe3c2a6b39b 100644 GIT binary patch delta 5525 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 diff --git a/TempleOS/Accts/SafeMode/Adam3.CPP b/TempleOS/Accts/SafeMode/Adam3.CPP deleted file mode 100644 index 1c65883..0000000 --- a/TempleOS/Accts/SafeMode/Adam3.CPP +++ /dev/null @@ -1,9 +0,0 @@ -//Change anything you want in this -//acct file or others. -mp_cnt=1; -#include "HOME/Adam3aLocalize" -#include "HOME/Adam3bPkgs" -#include "HOME/Adam3cSnd" -#include "HOME/Adam3dKeyPlugIns" -#include "HOME/Adam3eWrappers" -#include "HOME/Adam3fSys" diff --git a/TempleOS/Accts/SafeMode/Adam3cSnd.CPP b/TempleOS/Accts/SafeMode/Adam3cSnd.CPP deleted file mode 100644 index 053482c..0000000 --- a/TempleOS/Accts/SafeMode/Adam3cSnd.CPP +++ /dev/null @@ -1 +0,0 @@ -//No Snd diff --git a/TempleOS/Accts/SafeMode/Adam3fSys.CPP b/TempleOS/Accts/SafeMode/Adam3fSys.CPP deleted file mode 100644 index aeef269..0000000 --- a/TempleOS/Accts/SafeMode/Adam3fSys.CPP +++ /dev/null @@ -1,38 +0,0 @@ -//Change anything you want in this -//acct file or others. - -U0 UserStartUp() -{ //Run each time a user a spawned - UseTermDoc; - DocCurAttr(WHITE<<4+BLUE); - Type("::/TempleOS/Doc/Start.TXT"); - LBts(&Fs->display_flags,DISPLAYf_SHOW); - WinZBufUpdate; - if (!IsSysDeterministic) - Preempt(ON); -} - -U0 ServantStartUp() -{ //Run each time a servant task is spawned. - UseTermDoc; - LBts(&Fs->display_flags,DISPLAYf_SHOW); - WinZBufUpdate; - if (!IsSysDeterministic) - Preempt(ON); -} - -U0 StartUpTasks() -{ - CTask *task1,*task2; - task1=SpawnUser; - task2=SpawnUser; - WinToTop(task1); - WinTileVert; - if (!IsSysDeterministic) - PopUp("#include \"::/TempleOS/Adam/Start\";"); - AdamLog("Boot Time:%7.3fs\n",tS); -} - -StartUpTasks; - -"\nOS Compile Time:%D %T\n",sys_compile_time,sys_compile_time; diff --git a/TempleOS/Accts/SafeMode/DoItOnce.CPP b/TempleOS/Accts/SafeMode/DoItOnce.CPP deleted file mode 100644 index f84f897..0000000 --- a/TempleOS/Accts/SafeMode/DoItOnce.CPP +++ /dev/null @@ -1,9 +0,0 @@ -//This file is executed by the -//first terminal window upon start-up. -//See $LK,"DoItOnce","FF:HOME/Adam3fSys.CPP,DoItOnce"$. - -//It goes in your HOME directory and -//you can customize it. - -//Delete this to get rid of -//default start-up msg. diff --git a/TempleOS/Accts/TS/Adam3bPkgs.CPP b/TempleOS/Accts/TS/Adam3bPkgs.CPP index c10725a..7001c54 100644 --- a/TempleOS/Accts/TS/Adam3bPkgs.CPP +++ b/TempleOS/Accts/TS/Adam3bPkgs.CPP @@ -5,5 +5,4 @@ Cd("HOME");; #include "/TempleOS/Accts/TS/TSAdam" #include "/TempleOS/Accts/TS/TSDistro" -#include "/TempleOS/Demo/WebLogExample/WebLogRep" Cd("HOME");; diff --git a/TempleOS/Accts/TS/Adam3dKeyPlugIns.CPP b/TempleOS/Accts/TS/Adam3dKeyPlugIns.CPP index 50eaabd..60a6a03 100644 --- a/TempleOS/Accts/TS/Adam3dKeyPlugIns.CPP +++ b/TempleOS/Accts/TS/Adam3dKeyPlugIns.CPP @@ -3,13 +3,13 @@ U0 FillInTime() { - CDate spdt; - spdt=GetCurTimeCDate; - "$$IV,1$$----%D %T----$$IV,0$$\n",spdt,spdt; + CDate cdt; + cdt=GetCurTimeDate; + "$$IV,1$$----%D %T----$$IV,0$$\n",cdt,cdt; } U0 RandQuote(I64 num) -{ //$LK-A,"::/TempleOS/Apps/AfterEgypt/AENotes.TXT"$ +{ //$LK-A,"::/TempleOS/Apps/HolySpirit/HSNotes.TXT"$ I64 i,size,l=512; U8 *bible_filename=Define("ST_BIBLE_FILE"), *buf=FileRead(bible_filename,&size); @@ -22,7 +22,7 @@ U0 RandQuote(I64 num) } U0 BadCodeJump(I64 num) -{ //$LK-A,"::/TempleOS/Apps/AfterEgypt/AENotes.TXT"$ +{ //$LK-A,"::/TempleOS/Apps/HolySpirit/HSNotes.TXT"$ CDirEntry *root=FilesFind("/TempleOS/*",FUF_JUST_FILES|FUF_RECURSE|FUF_FLATTEN_TREE|FUF_JUST_SRC_FILES), *tempm=root; I64 cnt=0; @@ -129,7 +129,7 @@ Bool MyPutKey(I64 ch,I64 sc) else SetKeyDesc("God Word"); } else { - //$LK-A,"::/TempleOS/Apps/AfterEgypt/AENotes.TXT"$ + //$LK-A,"::/TempleOS/Apps/HolySpirit/HSNotes.TXT"$ if (sc & SCF_SHIFT) RandQuote(KbdMouseEvtTime>>4); else @@ -157,7 +157,7 @@ Bool MyPutKey(I64 ch,I64 sc) SetKeyDesc("Misc/Insert Datetime"); } else { if (sc & SCF_SHIFT) - DocInsSafe(DocCur, + DocInsSafe(DocPut, "$$HS+C$$$$FG$$$$HE$$"); else FillInTime(); @@ -202,7 +202,7 @@ Bool MyPutKey(I64 ch,I64 sc) else { ClipBoardDel; DocPrintF(sys_clipboard_doc,"$$LK-A,\"FL:%s,%d\"$$", - DocCur->filename.name,DocCur->cur_entry->y+1); + DocPut->filename.name,DocPut->cur_entry->y+1); } return TRUE; case 'L': @@ -212,7 +212,7 @@ Bool MyPutKey(I64 ch,I64 sc) i=RandU32; ClipBoardDel; DocPrintF(sys_clipboard_doc,"$$LK,\"\",\"FA:%s,ANC%d\"$$", - DocCur->filename.name,i); + DocPut->filename.name,i); "$$AN,\"\",\"ANC%d\"$$",i; } return TRUE; @@ -234,7 +234,7 @@ Bool MyPutKey(I64 ch,I64 sc) case 'b': if (sc&SCF_KEY_DESC) SetKeyDesc("Cmd/Jump to Bad Code"); - else //$LK-A,"::/TempleOS/Apps/AfterEgypt/AENotes.TXT"$ + else //$LK-A,"::/TempleOS/Apps/HolySpirit/HSNotes.TXT"$ BadCodeJump(KbdMouseEvtTime>>4); return TRUE; diff --git a/TempleOS/Accts/TS/Adam3fSys.CPP b/TempleOS/Accts/TS/Adam3fSys.CPP index 5c2f209..cff1eaa 100644 --- a/TempleOS/Accts/TS/Adam3fSys.CPP +++ b/TempleOS/Accts/TS/Adam3fSys.CPP @@ -1,7 +1,6 @@ U0 UserStartUp() { //Run each time a user a spawned UseTermDoc; - DocCurAttr(WHITE<<4+BLUE); Type("::/TempleOS/Doc/Start.TXT"); LBts(&Fs->display_flags,DISPLAYf_SHOW); WinZBufUpdate; @@ -22,8 +21,8 @@ U0 UserStartUp() CPURep; } -U0 ServantStartUp() -{ //Run each time a servant task is spawned. +U0 SrvStartUp() +{ //Run each time a srv task is spawned. UseTermDoc; LBts(&Fs->display_flags,DISPLAYf_SHOW); WinZBufUpdate; diff --git a/TempleOS/Accts/TS/DbgAdam1.CPP b/TempleOS/Accts/TS/DbgAdam1.CPP new file mode 100644 index 0000000..df5ed8e --- /dev/null +++ b/TempleOS/Accts/TS/DbgAdam1.CPP @@ -0,0 +1,11 @@ +//This is executed by Adam at boot. +//See $LK,"Adam1 Start-up","FF:::/TempleOS/Kernel/KEnd.CPP,Adam1:2"$ +extern I8i OptEqu(I64i num,I8i val); +OptEqu(0,0); //(0,0)=EchoOff (0,1)=EchoOn +#include "/TempleOS/Kernel/BootDefs.HPP" +#include "/TempleOS/Kernel/Adam1a.HPP" +#include "/TempleOS/Compiler/CmpDefs.HPP" +#include "/TempleOS/Kernel/Adam1b.HPP" +#include "/TempleOS/Kernel/Adam1c.HPP" +#include "/TempleOS/Compiler/Compiler.HPP" +Dbg("Type 'G;'"); diff --git a/TempleOS/Accts/TS/DoItOnce.CPP b/TempleOS/Accts/TS/DoItOnce.CPP index 92000b3..7af498c 100644 --- a/TempleOS/Accts/TS/DoItOnce.CPP +++ b/TempleOS/Accts/TS/DoItOnce.CPP @@ -1,6 +1,6 @@ //This file is executed by the //first terminal window upon start-up. -//See $LK,"DoItOnce","FF:HOME/Adam3fSys.CPP,DoItOnce"$. +//See $LK,"DoItOnce","FF:HOME/Adam3fSys.CPP,DoItOnce"$ and $LK,"Acct Files","FF:::/TempleOS/Doc/GuideLines.TXT,ACCT FILES"$. //It goes in your HOME directory and //you can customize it. diff --git a/TempleOS/Accts/TS/PersonalMenu.TXT b/TempleOS/Accts/TS/PersonalMenu.TXT index 00f8840c9990a3ba1a227acc8dfaa58df962ea7c..48ea010061197c0814a2acda8dd76afdad036605 100644 GIT binary patch delta 5869 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 P11$-mCn*d*69WSPhVEv~ delta 7563 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 diff --git a/TempleOS/Demo/AcctExample/Adam3.CPP b/TempleOS/Accts/TS/TAD/Adam3.CPP similarity index 92% rename from TempleOS/Demo/AcctExample/Adam3.CPP rename to TempleOS/Accts/TS/TAD/Adam3.CPP index 7bdfb98..0fa67b9 100644 --- a/TempleOS/Demo/AcctExample/Adam3.CPP +++ b/TempleOS/Accts/TS/TAD/Adam3.CPP @@ -5,7 +5,6 @@ #exe {OptOn(OPTf_WARN_DUP_TYPES);}; #include "HOME/Adam3aLocalize" #include "HOME/Adam3bPkgs" -#include "HOME/Adam3cSnd" #include "HOME/Adam3dKeyPlugIns" #include "HOME/Adam3eWrappers" #include "HOME/Adam3fSys" diff --git a/TempleOS/Accts/TS/TAD/Adam3aLocalize.CPP b/TempleOS/Accts/TS/TAD/Adam3aLocalize.CPP index ee77a09..fff1cf1 100644 --- a/TempleOS/Accts/TS/TAD/Adam3aLocalize.CPP +++ b/TempleOS/Accts/TS/TAD/Adam3aLocalize.CPP @@ -7,8 +7,6 @@ SetTypeMatic(0); //Set Time Zone local_time_offset=-7*60*60*CDATE_FREQ; //Pacific -snd_vol=0.1; - //$AN,"","mouse_move_scale"$adjust these to set mouse move scale mxx_scale=0.5; myy_scale=0.5; diff --git a/TempleOS/Accts/TS/TAD/Archive/FileSysISO3.CPP b/TempleOS/Accts/TS/TAD/Archive/FileSysISO3.CPP deleted file mode 100644 index 77df7d0..0000000 --- a/TempleOS/Accts/TS/TAD/Archive/FileSysISO3.CPP +++ /dev/null @@ -1,488 +0,0 @@ -//ISO1 is ISO9660 -//ISO2 is ISO13490 -//ISO3 is ISO13346 - -//ISO13346 tag id types -#define ISO3T_PRI_VOL_DESC 1 -#define ISO3T_ANCHOR_VOL_DESC_PTR 2 -#define ISO3T_VOL_DESC_PTR 3 -#define ISO3T_IMPLEMENTATION_VOL_DESC 4 -#define ISO3T_PRT_DESC 5 -#define ISO3T_LOG_VOL_DESC 6 -#define ISO3T_UNALLOCATED_SPACE_DESC 7 -#define ISO3T_TERMINATOR_DESC 8 -#define ISO3T_LOG_VOL_INTEGRITY_DESC 9 -#define ISO3T_FILE_SET_DESC 256 -#define ISO3T_FILE_ID_DESC 257 -#define ISO3T_ALLOC_EXTENT_DESC 258 -#define ISO3T_INDIRECT_ENTRY 259 -#define ISO3T_TERMINAL_ENTRY 260 -#define ISO3T_FILE_ENTRY 261 -#define ISO3T_EXT_ATTR_HEADER_DESC 262 -#define ISO3T_UNALLOC_SPACE_ENTRY 263 -#define ISO3T_SPACE_BITMAP_DESC 264 -#define ISO3T_PRT_INTEGRITY_ENTRY 265 -#define ISO3T_EXT_FILE_ENTRY 266 - -class CISO3Tag -{ - U16 id; - U16 version; - U8 xsum; - U8 reserved; - U16 serial_num; - U16 desc_crc; - U16 desc_crc_len; - U32 loc; -}; - -class CISO3Date -{ - U16 time_zone; - I16 year; - U8 mon; - U8 day; - U8 hour; - U8 min; - U8 sec; - U8 sec100; - U8 sec10000; - U8 sec1000000; -}; - - -class CISO3DString32 -{ - U8 body[31]; - U8 len; -}; - -class CISO3DString128 -{ - U8 body[127]; - U8 len; -}; - -class CISO3CharSpec -{ - U8 type; - U8 body[63]; -}; - -class CISO3RegId -{ - U8 flags; - U8 id[23]; - U8 id_suffix[8]; -}; - -class CISO3ExtentAD -{ - U32 len; - U32 loc; -}; - -class CISO3LBAdd -{ - U32 log_blk_num; - U16 prt_ref_num; -}; - -class CISO3LongAD -{ - U32 len; - CISO3LBAdd loc; - U8 implementation_use[6]; -}; - -class CISO3ICBTag -{ - U32 prior_record_direct_entries; - U16 strategy_type; - U16 strategy_param; - U16 max_entries; - U8 reserved; - U8 file_type; - CISO3LBAdd parent_icb_loc; - U16 flags; -}; - -class CISO3PriDesc -{ - CISO3Tag tag; - U32 vol_desc_seq_num; - U32 pri_vol_desc_num; - CISO3DString32 vol_id; - U16 vol_seq_num; - U16 max_vol_seq_num; - U16 interchg_level; - U16 max_interchg_level; - U32 char_set_lst; - U32 max_char_set_lst; - CISO3DString128 vol_set_id; - CISO3CharSpec desc_char_set; - CISO3CharSpec explanatory_char_set; - CISO3ExtentAD vol_abstract; - CISO3ExtentAD vol_copyright_notice; - CISO3RegId app_id; - CISO3Date recording_date_time; - CISO3RegId implementation_id[32]; - U8 implementation_use[64]; - U32 pred_vol_desc_seq_loc; - U16 flags; - U8 reserved[22]; -}; - -class CISO3PrtMap -{ - U8 type; - U8 len; - U0 mapping; -}; - -class CISO3PrtMap1 -{ - U8 type; - U8 len; - U16 vol_seq_num; - U16 prt_num; -}; - -class CISO3PrtMap2 -{ - U8 type; - U8 len; - U8 prt_id[62]; -}; - -class CISO3LogVolDesc -{ - CISO3Tag tag; - U32 vol_desc_seq_num; - CISO3CharSpec desc_char_set; - CISO3DString128 log_vol_id; - U32 blk_size; - CISO3RegId domain_id; - U8 log_vol_contents_use[16]; - U32 map_table_len; - U32 num_prt_maps; - CISO3RegId implementation_id; - U8 implementation_use[128]; - CISO3ExtentAD integrity_seq_extent; - U0 prt_maps; -}; - -class CISO3Prt -{ - CISO3Tag tag; - U32 vol_desc_seq_num; - U16 flags; - U16 num; - CISO3RegId contents; - U8 contents_use[128]; - U32 access_type; - U32 starting_loc; - U32 len; - CISO3RegId implementation_id; - U8 implementation_use[128]; - U8 reserved[156]; -}; - -class CISO3FileSetDesc -{ - CISO3Tag tag; - CISO3Date recording_date_time; - U16 interchg_level; - U16 max_interchg_level; - U32 char_set_lst; - U32 max_char_set_lst; - U32 file_set_num; - U32 file_set_desc_num; - CISO3CharSpec log_vol_id_char_set; - CISO3DString128 log_vol_id; - CISO3CharSpec file_set_char_set; - CISO3DString32 file_set_id; - CISO3DString32 copyright_file_id; - CISO3DString32 abstract_file_id; - CISO3LongAD root_dir_icb; - CISO3RegId domain_id; - CISO3LongAD next_extent; - CISO3LongAD sys_stream_dir_icb; - U8 reserved[32]; -}; - -class CISO3FileIdDesc -{ - CISO3Tag tag; - U16 version; - U8 characteristics; - U8 len_of_file_id; - CISO3LongAD icb; - U16 len_of_implementation_use; - U0 implementation_use; - U0 file_id; -}; - -class CISO3File -{ - CISO3Tag tag; - CISO3ICBTag icb_tag; - U32 uid; - U32 gid; - U32 permissions; - U16 file_link_cnt; - U8 record_fmt; - U8 record_display_attr; - U32 record_len; - I64 info_len; - I64 log_blks_recorded; - CISO3Date access_date_time; - CISO3Date modification_date_time; - CISO3Date attr_date_time; - U32 chk_pt; - CISO3LongAD ext_attr_icb; - CISO3RegId implementation_id; - I64 unique_id; - U32 ext_attr_len; - U32 alloc_desc_len; - U0 ext_attr; - U0 alloc_desc; -}; - -class CISO3FileExt -{ - CISO3Tag tag; - CISO3ICBTag icb_tag; - U32 uid; - U32 gid; - U32 permissions; - U16 file_link_cnt; - U8 record_fmt; - U8 record_display_attr; - U32 record_len; - I64 info_len; - I64 object_size; - I64 log_blks_recorded; - CISO3Date access_date_time; - CISO3Date modification_date_time; - CISO3Date creation_date_time; - CISO3Date attr_date_time; - U32 chk_pt; - U32 reserved; - CISO3LongAD ext_attr_icb; - CISO3LongAD stream_dir_icb; - CISO3RegId implementation_id; - I64 unique_id; - U32 ext_attr_len; - U32 alloc_desc_len; - U0 ext_attr; - U0 alloc_desc; -}; - -import U0 ClassRep(U8 *class_name,U8 *d,I64 max_depth=2,Bool fun=FALSE,I64 offset=0); - -Bool ISO3PrtInitPrt(CPrt *p,I64 blk) -{ - CBlkDev *bdev=p->bdev; - I64 spc=bdev->blk_size>>BLK_SIZE_BITS,i=blk/spc; - CISO3FileSetDesc *iso=MAlloc(bdev->blk_size); - Bool unlock,result=FALSE; - try { - unlock=PrtLock(p); - while (TRUE) { - p->size=MaxI64(p->size,(i+1)*spc); - RBlks(p,iso,i*spc,spc); - "%X:%X\n",i,iso->tag.id; - switch (iso->tag.id) { - case ISO3T_FILE_SET_DESC: - ClassRep("CISO3FileSetDesc",iso,3); -// p->offset=blk; -// p->root_cluster=iso->root_dir_icb.loc.log_blk_num+p->offset/spc; - result=TRUE; - break; - case ISO3T_EXT_FILE_ENTRY: - ClassRep("CISO3FileExt",iso,3); - break; - case ISO3T_FILE_ENTRY: - ClassRep("CISO3File",iso,3); - break; - case ISO3T_FILE_ID_DESC: - ClassRep("CISO3FileIdDesc",iso,3); - break; - case ISO3T_ALLOC_EXTENT_DESC: - case ISO3T_INDIRECT_ENTRY: - case ISO3T_TERMINAL_ENTRY: - case ISO3T_EXT_ATTR_HEADER_DESC: - case ISO3T_UNALLOC_SPACE_ENTRY: - case ISO3T_SPACE_BITMAP_DESC: - case ISO3T_PRT_INTEGRITY_ENTRY: - break; - default - goto i3pip_done; - } - i++; - } -i3pip_done: - Free(iso); - if (unlock) - PrtUnlock(p); - } catch { - Free(iso); - if (unlock) - PrtUnlock(p); - } - return result; -} - -Bool ISO3PrtInit(CPrt *p,I64 blk) -{ - CBlkDev *bdev=p->bdev; - I64 spc=bdev->blk_size>>BLK_SIZE_BITS,i=blk/spc,offset=0; - CISO3Prt *iso=MAlloc(bdev->blk_size); - Bool unlock,result=FALSE; - - try { - unlock=PrtLock(p); - while (TRUE) { - p->size=MaxI64(p->size,(i+1)*spc); - RBlks(p,iso,i*spc,spc); -"%X:%X\n",i,iso->tag.id; - switch (iso->tag.id) { - case ISO3T_PRT_DESC: - ClassRep("CISO3Prt",iso,3); - offset=iso->starting_loc*spc; //one partition for now - break; - case ISO3T_PRI_VOL_DESC: - ClassRep("CISO3PriDesc",iso,3); - break; - case ISO3T_LOG_VOL_DESC: - ClassRep("CISO3LogVolDesc",iso,3); - D(&iso(CISO3LogVolDesc *)->prt_maps); - break; - case ISO3T_ANCHOR_VOL_DESC_PTR: - case ISO3T_VOL_DESC_PTR: - case ISO3T_IMPLEMENTATION_VOL_DESC: - case ISO3T_UNALLOCATED_SPACE_DESC: - case ISO3T_LOG_VOL_INTEGRITY_DESC: - break; - case ISO3T_TERMINATOR_DESC: - goto i3pi_done; - default: - PutDefineErr("ST_UNSUPPORTED_FILE_SYSTEM"); - throw(EXCEPT_PRT,10); - } - i++; - } -i3pi_done: - if (offset) - result=ISO3PrtInitPrt(p,offset); - Free(iso); - if (unlock) - PrtUnlock(p); - } catch { - Free(iso); - if (unlock) - PrtUnlock(p); - } - return result; -} - - -/**** -U0 CDate2ISO3(CISO3Date *dst,CDate spdt) -{ - CDateStruct ds; - CDate2CDateStruct(&ds,spdt); - MemSet(dst,0,sizeof(CISO3Date)); - dst->year=ds.year; - dst->mon=ds.mon; - dst->day=ds.day_of_mon; - dst->hour=ds.hour; - dst->min=ds.min; - dst->sec=ds.sec; - dst->sec100=ds.sec100; -} - -CDate ISO3Date2CDate(CISO3Date *dt) -{ - CDateStruct ds; - MemSet(&ds,0,sizeof(CDateStruct)); - ds.day_of_mon=dt->day; - ds.mon=dt->mon; - ds.year=dt->year; - ds.sec100=dt->sec100; - ds.sec=dt->sec; - ds.min=dt->min; - ds.hour=dt->hour; - return CDateStruct2CDate(&ds); -} -****/ - - -Bool ISOPrtInit(CPrt *p,I64 blk) -{ - CBlkDev *bdev=p->bdev; - I64 spc=bdev->blk_size>>BLK_SIZE_BITS,i=blk/spc; - CISO1PriDesc *iso=MAlloc(bdev->blk_size); - CISO1DirEntry *de; - Bool unlock,result=FALSE; - U8 buf[8]; - - try { - unlock=PrtLock(p); - p->type=PT_ISO9660; //default - p->spc=spc; - p->offset=p->data=p->root_cluster=p->size=0; - while (TRUE) { - p->size=MaxI64(p->size,(i+1)*spc); - RBlks(p,iso,i*spc,spc); - buf[0](U32)=iso->id[0](U32); - buf[4](U16)=iso->id[4](U8); - switch (LstEntryMatch(buf,"CD001\0CDW02\0BEA01\0BOOT2\0NSR02\0NSR03\0TEA01\0",LEF_EXACT)) { - case 0: - p->type=PT_ISO9660; - switch (iso->type) { - case ISO1T_SUPPLEMENTARY_DESC: - p->data=0; - de=&iso->root_dir_record; - p->root_cluster=de->loc.little; - p->size=iso->vol_space_size.little*bdev->blk_size>>BLK_SIZE_BITS; - result=TRUE; - goto ipi_done; - case ISO1T_TERMINATOR: - throw(EXCEPT_PRT,11); - } - break; - case 2...6: - p->type=PT_ISO13346; - break; - case 1: //PT_ISO13490 (Not supported) - default: //Its normal for ISO13346 to read NULL blk as terminator - switch (p->type) { - case PT_ISO13346: - i++; //Terminator is blk after last valid. Advance to next blk - if (ISO3PrtInit(p,i*spc)) { - result=TRUE; - goto ipi_done; - } - break; - } - PutDefineErr("ST_UNSUPPORTED_FILE_SYSTEM"); - throw(EXCEPT_PRT,12); - } - i++; - } -ipi_done: - Free(iso); - if (unlock) - PrtUnlock(p); - } catch { - p->type=PT_ISO9660; - p->spc=spc; - p->offset=p->data=p->root_cluster=0; - Free(iso); - if (unlock) - PrtUnlock(p); - } - return result; -} diff --git a/TempleOS/Accts/TS/TAD/Archive/Logo.TXT b/TempleOS/Accts/TS/TAD/Archive/Logo.TXT deleted file mode 100644 index 6281b43dba79e958fbe25c9f820f219cb2cdb9e7..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 33204 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 W{{R2~(hU3}poAsIz`(%7&Hw;P67%u^ diff --git a/TempleOS/Accts/TS/TAD/Archive/Marketing.TXT b/TempleOS/Accts/TS/TAD/Archive/Marketing.TXT deleted file mode 100644 index 06e9928..0000000 --- a/TempleOS/Accts/TS/TAD/Archive/Marketing.TXT +++ /dev/null @@ -1,21 +0,0 @@ -$WW,1$I have a million metaphors. Linux is a semi; Windows is a car; and TempleOS is a motorcycle. Or, it's like a 1960's muscle car that wouldn't be street legal, now, with all the safety crap regulations complicating and gunking-up, but boy is it fun and beautiful under the hood. Maybe, it's a tree-house -- you don't need building codes to mod it and it has no networking. It's a kayak, not a Titanic -- just reset it. Why do you want a 1970's main frame operating system, anyway, that has ugly 32-bit crap all over its C language? 7-bit ASCII for source code? Please! Why not fix all the standard C library to pure 64-bit? How awful PrintF() with "%ld" instead of "%d" and crap for long constants! Yuck! You'll love $LK,"TempleOS C","FI:::/TempleOS/Doc/Differences.TXT"$. - -Okay, here's a $LK,"Pop Quiz","FI:::/TempleOS/Demo/Lectures/64BitAsmQuiz.TXT"$ to get you psyched-up for TempleOS! Assembly language knowledge is not required, but anyone interested in TempleOS is probably at least curious about assembly language. - -TempleOS has a good chance of running natively on $FG,4$x86_64$FG$ machines from about 2003-2010. After that, it will probably work just in VMware. - -1) Download the free $FG,4$$TX+HTML,"TempleOSCD.ISO (24.0 MB)","http://www.templeos.org/TempleOSCD.ISO"$$FG$. -2) Download the free $FG,4$$TX+HTML,"VMware Player","https://my.vmware.com/web/vmware/free#desktop_end_user_computing/vmware_player/5_0"$$FG$ (The $FG,4$$TX+HTML,"VMware","https://my.vmware.com/web/vmware/free#desktop_end_user_computing/vmware_player/5_0"$$FG$ web page takes a whole minute to load completely. Be patient. When it finally shows, pick the first ".exe" to download.) -3) Create an "Other 64-Bit" virtual machine. Aim its CD-ROM to TempleOSCD.ISO -4) Play the virtual machine. -5) Log-in as "Accts/Install". -6) Optionally, purchase $FG,4$$TX+HTML,"VMware WorkStation","http://www.vmware.com"$$FG$ or download $FG,4$$TX+HTML,"WinImage","http://www.winimage.com/winimage.htm"$$FG$ if you wish to transfer files in and out. - -If you want to install my personal version for $FG,4$$TX+HTML,"VMware","https://my.vmware.com/web/vmware/free#desktop_end_user_computing/vmware_player/5_0"$$FG$... -1b) Download the free $FG,4$$TX+HTML,"TempleOSTS.ISO (24.5 MB)","http://www.templeos.org/TempleOSTS.ISO"$$FG$. -3b) Create an "Other 64-Bit" virtual machine. Aim its CD-ROM to TempleOSTS.ISO -5b) Type >$FG,4$TSInstall;$FG$ or >$FG,4$TSUpgrade;$FG$ at the command-line. -7b) See $FG,4$MakeBackUp$FG$ to reproduce the ISO's in $FG,4$E:/Wb$FG$. It makes this website, too. - - -* "WinImage" is a trademark of Gilles Vollant. diff --git a/TempleOS/Accts/TS/TAD/Archive/USB.CPP b/TempleOS/Accts/TS/TAD/Archive/USB.CPP deleted file mode 100644 index 3bdb2bb..0000000 --- a/TempleOS/Accts/TS/TAD/Archive/USB.CPP +++ /dev/null @@ -1,217 +0,0 @@ -/* -You can play with this if you are -interested in USB. I'm not planning -on doing USB unless the legacy PS2 -keyboard/mouse mode disappears. -There EHCI UHCI in various ICH chips and -others and God knows how many custom packet -formats for different keyboards and mice. Okay, -I suppose if BIOS can make a universal -packet, it is done just one way for -different mice. PS2 is more compatible. - -*/ -#help_index "USB" -extern I64 sys_num_usb; -extern CUSB sys_usb_devs[MAX_USB]; -extern CUSBTD *USBAllocTD(); -extern U0 USBFreeTD(CUSBTD *temptd); -extern U0 USBEndAll(); -extern U0 USBInitAll(); -extern U32 *USBAllocFrameLst(I64 usb_num,I64 size); - -U8 *StatCB(CDoc *,CDocEntry *doc_e,CTask *mem_task) -{ //This routine shows the stat of the USB ports - U8 *st=MAlloc(128,mem_task); - U16 w1,w2,w3,w4; - U32 d1; - CUSB *u=doc_e->user_data; - I64 d=u->ports; - w3=InU16(d+USBP_STS); - w1=InU16(d+USBP_PORTSC0); w2=InU16(d+USBP_PORTSC1); - w4=InU16(d+USBP_FRNUM); - d1=InU32(d+USBP_FRBASEADD); - SPrintF(st,"%X:Stat:%04X P0:%04X P1:%04X FRAME:%04X",d1,w3,w1,w2,w4); - return st; -} - -U0 PutStat() -{ - I64 i; - Bool old_preempt=Preempt(OFF); - CDocEntry *doc_e; - CUSB *u; - WinMax; - - "$$FG,GREEN$$Dev Stat Bits\n$$FG$$" - " 0:IRQ\n" - " 1:IRQ err\n" - " 2:Resume\n" - " 3:Host Sys Err\n" - " 4:Host Process Err\n" - " 5:Halted\n" - "$$FG,GREEN$$Port Stat Bits\n$$FG$$" - " 0:Connection Stat\n" - " 1:Connection Stat Change\n" - " 2:Port Enabled\n" - " 3:Port Enabled Change\n" - "4-5:Line Stat\n" - " 6:Resume Detect\n" - " 8:Low Speed\n" - " 9:Port Rst\n" - " 10:Overcurrent Active\n" - " 11:Overcurrent Indicator\n" - " 12:Suspend\n\n"; - - for (i=0;iports; - doc_e=DocPutS(DocCur,"$$TX+TC,\" \"$$"); - doc_e->user_data=&sys_usb_devs[i]; - doc_e->tag_cb=&StatCB; - "$$FG$$\n"; - } - - Preempt(old_preempt); - NewLine; -} - - -extern U0 PutQH(U32 h); - -U32 *P(U32 d) -{ - return d&~3; -} - - -U0 PutTD(U32 t) -{ - "TD:$$FG,GREEN$$%08X$$FG$$\n",t; - "%08X\n",*P(t); - DocDm(t+4,8); - if (*P(t+12)) - DocDm(*P(t+12),16); -// DocDm(*P(t+12),*P(t+4)>>21&0x7FF); - if (!(*P(t)&1)) { - if (*P(t)&2) - PutQH(*P(t)); - else - PutTD(*P(t)); - } -} - -U0 PutQH(U32 h) -{ - "QH:$$FG,RED$$%08X$$FG$$\n",h; - "%08X\n",*P(h); - "%08X\n",*P(h+4); - - if (!(*P(h)&1)) { - if (*P(h)&2) - PutQH(*P(h)); - else - PutTD(*P(h)); - } - - if (!(*P(h+4)&1)) { - if (*P(h+4)&2) - PutQH(*P(h+4)); - else - PutTD(*P(h+4)); - } -} - -U0 PutFrame(U32 f) -{ - PutQH(f); -} - -U0 PutFrames() -{ - I64 i,d,f,w1,w2; - CUSB *u; - for (i=0;iports; - w1=InU16(d+USBP_PORTSC0); w2=InU16(d+USBP_PORTSC1); - if (w1&1 || w2&1) { - f=InU32(d+USBP_FRBASEADD); - PutFrame(f); - } - } - -} - -U0 Main() -{ - USBInitAll; - PutStat; - PutFrames; - "$$FG,RED$$The BIOS sets-up the USB in PS/2 legacy mode.$$FG$$\n"; -} - -Main; - - -/* Not Finished -#define PORT 5 - -#define DEV_ADD_INIT 1 -#define DEV_ADD 1 -#define END_PT0 0 -#define END_PT1 1 -#define END_PT2 2 -#define MAX_LEN 8 -#define TERMINATE 1 - -U0 SetUpTD() -{ - CUSB *u=&sys_usb_devs[PORT]; - I64 i,d=u->ports; - U32 *frm=CAllocAligned(0x1000,0x1000,Fs->code_heap), - *tds=CAllocAligned(256,16,Fs->code_heap), - *buf=CAlloc(128,Fs->code_heap); - DocD(buf,128); - - "<0>\n"; Sleep(100); - OutU16(d+USBP_CMD,2); //Reset - "<1>\n"; Sleep(100); - OutU16(d+USBP_CMD,0); - "<2>\n"; Sleep(100); - OutU16(d+USBP_PORTSC0,4); //Enable - OutU16(d+USBP_PORTSC1,4); - "<3>\n"; Sleep(100); - - tds[0]=&tds[4](U8 *); - tds[1]=0; - tds[2]=PID_SETUP+DEV_ADD_INIT<<8+END_PT0<<15+MAX_LEN<<21; - tds[3]=buf; - buf[0]=0+RQ_SET_ADDR<<8+DEV_ADD<<16; - buf[1]=0+0<<16; - - - tds[4]=TERMINATE; - tds[5]=0; - tds[6]=PID_SETUP+DEV_ADD_INIT<<8+END_PT0<<15+MAX_LEN<<21; - tds[7]=buf(U8 *)+8; - buf[2]=0+RQ_SET_ADDR<<8+DEV_ADD<<16; - buf[3]=0+0<<16; - - frm[0]=&tds[0](U8 *); - for (i=1;i<0x1000/4;i++) - frm[i]=TERMINATE; - - OutU16(d+USBP_FRNUM,frm); - OutU32(d+USBP_FRBASEADD,frm); - "<4>\n"; Sleep(200); - OutU16(d+USBP_CMD,1); - "<5>\n"; Sleep(1000); - OutU16(d+USBP_CMD,0); - "<6>\n"; Sleep(200); -} - -SetUpTD; - -*/ - diff --git a/TempleOS/Accts/TS/TAD/Archive/USB1a.CPP b/TempleOS/Accts/TS/TAD/Archive/USB1a.CPP deleted file mode 100644 index 55c7f6c..0000000 --- a/TempleOS/Accts/TS/TAD/Archive/USB1a.CPP +++ /dev/null @@ -1,114 +0,0 @@ -#define USBP_CMD 0x00 -#define USBP_STS 0x02 -#define USBP_INTR 0x04 -#define USBP_FRNUM 0x06 -#define USBP_FRBASEADD 0x08 -#define USBP_SOFMOD 0x0C -#define USBP_PORTSC0 0x10 -#define USBP_PORTSC1 0x12 -#define MAX_USB 16 - -class CUSBTD //Not implemented -{ - U32 td[4]; -}; - -class CUSB //Not implemented -{ - U8 num, //USB dev num - bus,dev,fun; - U16 ports,pad; - U32 *frame_lst; -}; - -//USB Pkt ID's -#define PID_OUT 0xE1 -#define PID_IN 0x69 -#define PID_SOF 0xA5 -#define PID_SETUP 0x2D -#define PID_DATA0 0xC3 -#define PID_DATA1 0x4B -#define PID_DATA2 0x87 -#define PID_MDATA 0x0F -#define PID_ACK 0xD2 -#define PID_NAK 0x5A -#define PID_STALL 0x1E -#define PID_NYET 0x96 -#define PID_PRE 0x3C -#define PID_ERR 0x3C -#define PID_SPLIT 0x78 -#define PID_PING 0xB4 - -//USB Std Rqsts -#define RQ_GET_STAT 0x0 -#define RQ_CLR_FEAT 0x1 -#define RQ_SET_FEAT 0x3 -#define RQ_SET_ADDR 0x5 -#define RQ_SET_DESC 0x7 -#define RQ_GET_CFG 0x8 -#define RQ_SET_CFG 0x9 -#define RQ_GET_INTERFACE 0xA -#define RQ_SET_INTERFACE 0xB -#define RQ_SYNC_FRAME 0xC - -I64 sys_num_usb=0; -CUSB sys_usb_devs[MAX_USB]; -MemSet(sys_usb_devs,0,MAX_USB*sizeof(CUSB)); - - -U0 USBInitOne(I64 b,I64 d,I64 f) -{ - CUSB *u; - if (sys_num_usbnum=sys_num_usb; - u->bus=b; - u->dev=d; - u->fun=f; - u->ports=PCIReadU32(b,d,f,0x20)&~0x1F; - } -} - -U0 USBEndAll() -{ - sys_num_usb=0; -} - -U0 USBInitAll() //This is only valid for my ICH10 dev -{ - if (sys_num_usb) - USBEndAll; - USBInitOne(0,29,0); - USBInitOne(0,29,1); - USBInitOne(0,29,2); - USBInitOne(0,29,3); - USBInitOne(0,26,0); - USBInitOne(0,26,1); - USBInitOne(0,26,2); -} - -CUSBTD *USBAllocTD() -{ - return MAllocAligned(sizeof(CUSBTD),0x10,sys_uncached_heap); -} - -U0 USBFreeTD(CUSBTD *temptd) -{ - Free(temptd); -} - -U32 *USBAllocFrameLst(I64 usb_num,I64 size) -{ //aligned to 0x1000 - CUSB *u; - if (0<=usb_numframe_lst); - u->frame_lst=MAllocAligned(size*sizeof(U32),0x1000,sys_uncached_heap); - OutU16(u->ports+USBP_CMD,0); //Stop - OutU16(u->ports+USBP_FRNUM,0); - OutU32(u->ports+USBP_FRBASEADD,u->frame_lst); - return u->frame_lst; - } - return NULL; -} diff --git a/TempleOS/Accts/TS/TAD/MakeDistro.CPP b/TempleOS/Accts/TS/TAD/MakeDistro.CPP deleted file mode 100644 index 67d8d92..0000000 --- a/TempleOS/Accts/TS/TAD/MakeDistro.CPP +++ /dev/null @@ -1,54 +0,0 @@ -/*$HL,0$ -$FG,5$$TX+CX,"Roll Your Own Distro"$$FG$ - -It's unlikely you will get it running on bare hardware, so you'll probably -run it in a virtual machine such as VMware. Download the free 64-bit -$FG,4$$TX+HTML,"VMware Player","https://my.vmware.com/web/vmware/free#desktop_end_user_computing/vmware_player/5_0"$$FG$ for Linux or Windows and point the CDROM at the $FG,4$$TX+HTML,"TempleOSCD.ISO","http://www.templeos.org/TempleOSCD.ISO"$$FG$. -(The $FG,4$$TX+HTML,"VMware","https://my.vmware.com/web/vmware/free#desktop_end_user_computing/vmware_player/5_0"$$FG$ web page takes a whole minute to load. They hide the free version.) - -Purchase $FG,4$$TX+HTML,"VMware WorkStation","http://www.vmware.com"$$FG$ or download $FG,4$$TX+HTML,"WinImage","http://www.winimage.com/winimage.htm"$$FG$ if you wish to transfer files -in and out. The VMWare Workstation will stretch to full-screen and make drives -accessible from Windows. - -$HL,1$*/ - -#define STD_DISTRO_CDROM_CFG "b10x20000\nt3 \n\n\n\n\n" - -U0 MakeMyISO(U8 *out_iso_filename) -{//Does everything with current drive. - if (!IsDrvWritable) { - "Drive must be writable. Install on Hard drive, first.\n"; - return; - } - DelTree("/Distro"); - Auto(STD_DISTRO_CDROM_CFG); - MakeOSInstallPrtBootLoader(,'T'); - CopyTree("/0000Boot","/Distro/0000Boot"); - CopyTree("/TempleOS","/Distro/TempleOS"); - //To save space, optionally delete dictionary. - Del("/Distro/TempleOS/Adam/WordStat/WSDefs.DAT"); - Del("/Distro/TempleOS/Misc/Bible.TXT.Z"); - Del("/Distro/TempleOS/Misc/PCIDevices.TXT.Z"); - MkDir("/Distro/Temp"); - MkDir("/Distro/Temp/ScreenShots"); - CDFileCreate(out_iso_filename,"/Distro/*","",BOOTCD_BIN_Z); - //CDImageWrite('T',out_iso_filename,MT_CD); //Uncomment to burn a CD-ROM or (MT_DVD) - //DelTree("/Distro"); -} - -MakeMyISO("/MyDistro.ISO"); - -// Study my account examples $LK,"Cfg Strs","FL:::/TempleOS/Demo/AcctExample/TSAdam.CPP,1"$ $LK,"Update Funs","FL:::/TempleOS/Demo/AcctExample/TSDistro.CPP,1"$. - - - - - -/* - -* "Linux" is probably a trademark owned by Linus Torvalds. -* "VMware Player" and "VMware WorkStation" are trademarks of VMware, Inc. -* "Windows" is a trademark of MicroSoft Corp. -* "WinImage" is a trademark of Gilles Vollant. - -*/ diff --git a/TempleOS/Accts/TS/TAD/MusicOrgan/abiding.CPP b/TempleOS/Accts/TS/TAD/MusicOrgan/abiding.CPP index 20b1d30..d5a276b 100644 --- a/TempleOS/Accts/TS/TAD/MusicOrgan/abiding.CPP +++ b/TempleOS/Accts/TS/TAD/MusicOrgan/abiding.CPP @@ -30,6 +30,7 @@ U0 Song() CTask *task; I64 i; SettingsPush; //See $LK,"SettingsPush","MN:SettingsPush"$ + Fs->text_attr=LTCYAN<<4+BLACK; Fs->draw_it=&DrawIt; Fs->task_end_cb=&SndTaskEndCB; MusicSettingsRst; @@ -52,16 +53,16 @@ U0 Song() TaskWait(task); SetWinHorz(Fs->win_left,Fs->win_right,task); SetWinVert(Fs->win_bottom+3,Fs->win_bottom+15,task); - "$$BD+H,LTCYAN$$$$FD+H,BLACK$$"; + "$$BG+H,LTCYAN$$$$FD+H,BLACK$$"; while (!ScanKey) { "$$FG,WHITE$$To God...\n$$FG$$"; - Play("W13etCFE!!sDDDDD2G!3D2G!!3qC2eG3EqEetAA!F2qG", + Play("3etCFEsDDDDD2G3D2G3qC2eG3EqEetAAF2qG", "I \0am \0a\0biding \0 \0 \0 \0in \0 \0Your \0 \0presence.\n\0 \0 \0 \0 \0 \0 \0 \0"); - Play("3etCFE!!sDDDDD2G!3D2G!!3qC2eG3EqEetAA!F2qG", + Play("3etCFEsDDDDD2G3D2G3qC2eG3EqEetAAF2qG", "I \0am \0a\0biding \0 \0 \0 \0in \0 \0Your \0 \0presence.\n\0 \0 \0 \0 \0 \0 \0 \0"); - Play("!3DBsFGF!G2eG!!3FRDqEGeB!E", + Play("3DBsFGFG2eG3FRDqEGeBE", "What \0a \0joy!\n\0 \0 \0 \0 \0 \0 \0 \0 \0 \0 \0 \0"); - Play("!qDBsFGF!G2eG!!3FRDqEGeB!E", + Play("qDBsFGFG2eG3FRDqEGeBE", "I'm \0so \0coy!\n\0 \0 \0 \0 \0 \0 \0 \0 \0 \0 \0 \0"); } } catch diff --git a/TempleOS/Accts/TS/TAD/MusicOrgan/abyss.CPP b/TempleOS/Accts/TS/TAD/MusicOrgan/abyss.CPP index 3bec3d0..bb912e1 100644 --- a/TempleOS/Accts/TS/TAD/MusicOrgan/abyss.CPP +++ b/TempleOS/Accts/TS/TAD/MusicOrgan/abyss.CPP @@ -20,7 +20,7 @@ U0 Song() SetWinHorz(Fs->win_left,Fs->win_right,task); SetWinVert(Fs->win_bottom+3,Fs->win_bottom+15,task); while (!ScanKey) { - Play("W13sBBBBqCq.BeAqBh.A", + Play("3sBBBBqCq.BeAqBh.A", "Can't \0 \0 \0 \0get \0there, \0from \0he\0re.\n\0"); Play("M2/4"); Play("eECqAM4/4"); @@ -28,9 +28,9 @@ U0 Song() "Can't \0 \0 \0 \0get \0there, \0from \0he\0re.\n\0"); Play("M2/4"); Play("eDDqDM4/4"); - Play("DeEDqG!CeF2G3qG!!sFGFG!!eD!C", + Play("DeEDqGCeF2G3qGsFGFGeDC", "Oh, \0my \0 \0God, \0some\0thing's... \0 \0 \0ver\0 \0y \0 \0wrong!\n\0 \0"); - Play("qDeEDqG!CeF2G3qG!!sFGFG!!eD!C", + Play("qDeEDqGCeF2G3qGsFGFGeDC", "Oh, \0my \0 \0God, \0some\0thing's... \0 \0 \0ver\0 \0y \0 \0wrong!\n\0 \0"); } } catch diff --git a/TempleOS/Accts/TS/TAD/MusicOrgan/awake.CPP b/TempleOS/Accts/TS/TAD/MusicOrgan/awake.CPP index 8044511..a06cb6a 100644 --- a/TempleOS/Accts/TS/TAD/MusicOrgan/awake.CPP +++ b/TempleOS/Accts/TS/TAD/MusicOrgan/awake.CPP @@ -57,13 +57,13 @@ U0 Song() SetWinVert(Fs->win_bottom+3,Fs->win_bottom+15,task); while (!ScanKey) { "$$FG,GREEN$$Jesus talking...$$FG$$\n"; - Play("W13eBC!qB2sG3D2G3DetC!!GFsCBCB!etCGBeB!!GsBCB!C", + Play("3eBCqB2sG3D2G3DetCGFsCBCBetCGBeBGsBCBC", "Stay \0a\0wake.\n\0 \0 \0 \0 \0 \0 \0 \0 \0 \0 \0 \0 \0 \0 \0 \0 \0 \0 \0 \0 \0"); - Play("eBC!qB2sG3D2G3DetC!!GFsCBCB!etCGBeB!!GsBCB!C", + Play("eBCqB2sG3D2G3DetCGFsCBCBetCGBeBGsBCBC", "Stay \0a\0wake.\n\0 \0 \0 \0 \0 \0 \0 \0 \0 \0 \0 \0 \0 \0 \0 \0 \0 \0 \0 \0 \0"); - Play("qD!sD!BD!BetA2G3GqB2G3sAD!ADqD!etGF!D", + Play("qDsDBDBetA2G3GqB2G3sADADqDetGFD", " \0 \0 \0 \0 \0 \0 \0 \0 \0 \0 \0I \0 \0am \0a \0dead \0 \0man.\n\0"); - Play("qD!sD!BD!BetA2G3GqB2G3sAD!ADqD!etGF!D", + Play("qDsDBDBetA2G3GqB2G3sADADqDetGFD", " \0 \0 \0 \0 \0 \0 \0 \0 \0 \0 \0I \0 \0am \0a \0dead \0 \0man.\n\0"); } } catch diff --git a/TempleOS/Accts/TS/TAD/MusicOrgan/battlehymnsolo.CPP b/TempleOS/Accts/TS/TAD/MusicOrgan/battlehymnsolo.CPP index 4e9cba6b703cb6cf31c3f1368493c209f6aa5524..ad238f827c195c22f16261caaefda4235cf8f05a 100644 GIT binary patch literal 1189 zcmdPbH&@6=ELKP_N-W68OfKf)3N=s&&d*EN(B!J-Qcws^Eh)*&OD_&6EzYo3(AN)6 zO;u3w@zzm7mQd1B^7XSq5mDh%P;e{OwJS-jD2Y!jDJimb@^N(bwy`nM4)^d3akYlY zCl+VNr{<-^Cnwpe1?Q!NBo=48=A}40ffV?b7H1~Ij14L-0g2^;#Nta*a|`lq6^!&u zEDR8$#U+W!i6tfZ@o9<4CHY0R3I=+XAlZ_lN(GQ-6coxcGILTDG!%oA6Z5=ND>b3Q z3JNay$<8^ciA5mg3JMAeN-8Q&?mA#MtEi}`xVh_qovor0lLv$0iJ2t|Y57G8B^jv- zsd*`SdU{GQ?S84{KACx`8m5{sk>G;FWC>f{f zxfi>G2)9%{*J5{*R6XZn7ZB4GM7R_>g9MzE;M$;0g}E~TY)Y!0W3eNMa006a5sn~} zO^U%(v1=jN3U`9W5O9k#0RvoIoSicCoC|{ps5908xrczFV&o9Xa4pnxP9p1y1I(viIZtgna9-bktDk?E~Fc_YgS)!1ZU!+iy zk*biIm!hYqr)15=>6cpWlbM&QVXA4(#Ti_Xn4DUyVQ3EG1eBHp7Zhcdq-v;mI_W6c z7}|lt11yu1SgE08oT}$u><%K_QuSPm-Az*UoQqvROji)$Qs@j4a8d&4fZAfs#TfwB zo2utn>N%%kH=|Gkm|EiM>R#wv?BeX=?B?v| zT>EPqH#IuO;gbPp&PuoXMt zgaVd?v)~Mxy9bgih%SFIqbPs7s z8KRn&?jbQLgG)$Sx`(u+3{g!>_drrHJjq}(up}ayy9bgiM$1F=f(%r@gCY!)EQV}( zi0&<_@j>B(nS$XWSdubWj%xO!8^nOEM*&aVL#DsXPAkBGtw#Y*+*rC65ILHcKe!SK zDDPpBqq%$FNd}XFB@vDGPmz)pmPAB{@Bt?jH~}3I0=Wt`4Alon*SdubW z5qdF3HU2Ou52+R&=mwEl9-z7yv^+#F0a5v*;e#3;=)BSJK@SmB{%CnfpghDcO?TPR_`)CLgD!kfv)h34M$1F| SQ7{@lqv3-;1n|o;FaQ9kJznGh diff --git a/TempleOS/Accts/TS/TAD/MusicOrgan/born.CPP b/TempleOS/Accts/TS/TAD/MusicOrgan/born.CPP index 934c46e..35336d9 100644 --- a/TempleOS/Accts/TS/TAD/MusicOrgan/born.CPP +++ b/TempleOS/Accts/TS/TAD/MusicOrgan/born.CPP @@ -37,13 +37,13 @@ U0 Song() try { while (!ScanKey) { t0=tMBeat; - Play("3qB!eB2G!3qA!!eF!!AsF!AFA!!qC2sG!3A!2G3ARBRB", + Play("3qBeB2G3qAeFAsFAFAqC2sG3A2G3ARBRB", "New \0day \0is \0born.\n\0 \0 \0 \0 \0 \0 \0 \0 \0 \0 \0 \0 \0 \0 \0 \0"); - Play("qB!eB2G!3qA!!eF!!AsF!AFA!!qC2sG!3A!2G3ARBRB", + Play("qBeB2G3qAeFAsFAFAqC2sG3A2G3ARBRB", "Though \0it's \0the \0mourn',\n\0 \0 \0 \0 \0 \0 \0 \0 \0 \0 \0 \0 \0 \0 \0 \0"); - Play("!eDDR!!CqG!2eGR3qE!!etEA!!FqCsDGDG", + Play("eDDRCqG2eGR3qEetEAFqCsDGDG", "cheer-\0up \0 \0the \0heart\n\0 \0 \0 \0 \0 \0 \0 \0 \0as \0 \0you \0"); - Play("!eDDR!!CqG!2eGR3qE!!etEA!!FqCsDGDG", + Play("eDDRCqG2eGR3qEetEAFqCsDGDG", "hitch-\0up \0 \0the \0cart.\n\0 \0 \0 \0 \0 \0 \0 \0 \0 \0 \0 \0"); } } catch diff --git a/TempleOS/Accts/TS/TAD/MusicOrgan/childish.CPP b/TempleOS/Accts/TS/TAD/MusicOrgan/childish.CPP index 07f418c..ee62adb 100644 --- a/TempleOS/Accts/TS/TAD/MusicOrgan/childish.CPP +++ b/TempleOS/Accts/TS/TAD/MusicOrgan/childish.CPP @@ -7,7 +7,7 @@ U0 Song() music_stacatto_factor= 0.902; try { while (!ScanKey) { - Play("W13qEsCDCDqCDeEGsEBEBeCBsDADA", + Play("3qEsCDCDqCDeEGsEBEBeCBsDADA", "Be \0like \0 \0a \0 \0child \0 \0 \0 \0some \0 \0re\0 \0spect.\n\0 \0 \0 \0 \0 \0"); Play("qEsCDCDqCDeEGsEBEBeCBsDADA", "Ma\0tur\0 \0i\0 \0ty \0 \0 \0 \0don't \0 \0ne\0 \0glect.\n\0 \0 \0 \0 \0 \0"); diff --git a/TempleOS/Accts/TS/TAD/MusicOrgan/compassions.CPP b/TempleOS/Accts/TS/TAD/MusicOrgan/compassions.CPP index 681af72..740974c 100644 --- a/TempleOS/Accts/TS/TAD/MusicOrgan/compassions.CPP +++ b/TempleOS/Accts/TS/TAD/MusicOrgan/compassions.CPP @@ -7,13 +7,13 @@ U0 Song() music_stacatto_factor= 0.902; try { while (!ScanKey) { - Play("W13qBAeEE!qAeA!EDB!2qG3F", + Play("3qBAeEEqAeAEDB2qG3F", "$$FG,RED$$You \0need \0help!\n\0 \0 \0 \0Po\0-o\0-o\0r \0dear.\n\0"); - Play("BAeEE!qAeA!EDB!2qG3F", + Play("BAeEEqAeAEDB2qG3F", "You \0need \0help!\n\0 \0 \0 \0Po\0-o\0-o\0r \0dear.\n$$FG$$\0"); - Play("!4eFG!!qDetF!E!D!eD!EetADEC3G4GqD3G", + Play("4eFGqDetFEDeDEetADEC3G4GqD3G", "Pat\0ron\0ize? \0No, \0 \0thank \0you!\n\0 \0Too \0 \0man\0y \0strings \0a\0ttach\0ed.\n\0"); - Play("!4eFG!!qDetF!E!D!eD!EetADEC3G4GqD3G", + Play("4eFGqDetFEDeDEetADEC3G4GqD3G", "Pat\0ron\0ize? \0No, \0 \0thank \0you!\n\0 \0Too \0 \0man\0y \0strings \0a\0ttach\0ed.\n\0"); } } catch diff --git a/TempleOS/Accts/TS/TAD/MusicOrgan/completed.CPP b/TempleOS/Accts/TS/TAD/MusicOrgan/completed.CPP index 450f5347880003a8c244f327b7793ec95df88ba7..dd944a9dd5b0a4505db95dcf4e138ecc1bc8bb64 100644 GIT binary patch delta 131 zcmbQk{)=tGTWO=z5_e-K=R)^X7pFpJBX{FscSm=}R9ClR_sIf`6U1@L1x@B>Vv|fQ nad&nrbV)67a&vvQ=cmIwn5jLU$*}VpkVemqKTEr^$zy0@$ET8Rh^U7Z)dYr$VPxS4UTu$qmd| MC<2@RF$b~%06^asR{#J2 delta 98 zcmdlga$aP^Iwp~DL*qhsC&yw}7e!YW#X@IyCq>1{dzb>akhnt30V0YnE{aa>ii%E! YPN}Ynj*1}Z$$89KSS2<;VGd*i067#H)c^nh diff --git a/TempleOS/Accts/TS/TAD/MusicOrgan/dream.CPP b/TempleOS/Accts/TS/TAD/MusicOrgan/dream.CPP index 313adf2..cb6ce32 100644 --- a/TempleOS/Accts/TS/TAD/MusicOrgan/dream.CPP +++ b/TempleOS/Accts/TS/TAD/MusicOrgan/dream.CPP @@ -7,13 +7,13 @@ U0 Song() music_stacatto_factor= 0.902; try { while (!ScanKey) { - Play("W13qA!!sDGD!!GqAsCA!CAeCBsFDF!D!!etCGAsAD!A!!D", + Play("3qAsDGDGqAsCACAeCBsFDFDetCGAsADAD", " \0I\0mag\0 \0ine.\n\0 \0 \0 \0 \0 \0 \0 \0 \0 \0 \0 \0 \0 \0 \0 \0 \0 \0 \0"); - Play("qA!!sDGD!!GqAsCA!CAeCBsFDF!D!!etCGAsAD!A!!D", + Play("qAsDGDGqAsCACAeCBsFDFDetCGAsADAD", " \0 \0Fa\0 \0thom.\n\0 \0 \0 \0 \0 \0 \0 \0 \0 \0 \0 \0 \0 \0 \0 \0 \0 \0 \0"); - Play("!!GF!G!!FE!!BE!BeCB2qG3sFAFAqCEA", + Play("GFGFEBEBeCB2qG3sFAFAqCEA", "Hi-\0 \0i-\0gh \0as \0 \0your \0 \0thoughts \0will \0go.\n\0 \0 \0 \0 \0 \0 \0 \0"); - Play("!!sGF!G!!FE!!BE!BeCB2qG3sFAFAqCEA", + Play("sGFGFEBEBeCB2qG3sFAFAqCEA", "Deep \0 \0 \0as \0 \0 \0we \0 \0ought \0to \0know.\n\0 \0 \0 \0 \0 \0 \0 \0"); } } catch diff --git a/TempleOS/Accts/TS/TAD/MusicOrgan/elijah.CPP b/TempleOS/Accts/TS/TAD/MusicOrgan/elijah.CPP index bd01a08091d105211c86031d6451b11a71e3b0aa..c802ec809106ff3bc289a786df5bb0648a69c642 100644 GIT binary patch delta 88 zcmdnf$+)PKal>b3R-;1qRQJihnKLKg-nN UQtam9Hu)DzDsI`$&8(L80FlrhkN^Mx delta 115 zcmZ3~$+)MJal>b3j&MVxLibd6#mR{*vXezwd>BEjLKVf-5+_9$Mb}gpMYlp%C&glC iH)pq0XGKM~LYHDU7ez%kMa9XlSyG8oxH*&6(jEY)9w34M diff --git a/TempleOS/Accts/TS/TAD/MusicOrgan/environeth.CPP b/TempleOS/Accts/TS/TAD/MusicOrgan/environeth.CPP index fca4552..2e6c9d8 100644 --- a/TempleOS/Accts/TS/TAD/MusicOrgan/environeth.CPP +++ b/TempleOS/Accts/TS/TAD/MusicOrgan/environeth.CPP @@ -9,10 +9,10 @@ U0 Song() while (!ScanKey) { "$$FG,GREEN$$To God...$$FG$$\n"; Play("M5/4"); - Play("W13eEqCeEFEDCqBeEqCeEFEDCqB", + Play("3eEqCeEFEDCqBeEqCeEFEDCqB", "Fa\0ther, \0for\0give \0them \0if \0you \0must.\n\0I'd \0like \0to \0see \0them \0turn \0to \0dust.\n\0"); Play("M4/4"); - Play("sGBGBetAF!2G3eEF!sEGEGqDsB!!D!BDGFGF2etG3GB"); + Play("sGBGBetAF2G3eEFsEGEGqDsBDBDGFGF2etG3GB"); } } catch CatchAll; diff --git a/TempleOS/Accts/TS/TAD/MusicOrgan/epicurus.CPP b/TempleOS/Accts/TS/TAD/MusicOrgan/epicurus.CPP index 051eac7..c706bc4 100644 --- a/TempleOS/Accts/TS/TAD/MusicOrgan/epicurus.CPP +++ b/TempleOS/Accts/TS/TAD/MusicOrgan/epicurus.CPP @@ -22,7 +22,7 @@ U0 Song() SetWinHorz(Fs->win_left,Fs->win_right,task); SetWinVert(Fs->win_bottom+3,Fs->win_bottom+15,task); while (!ScanKey) { - Play("W13qBeCDqCAetAACeECsF2G3F2GqG", + Play("3qBeCDqCAetAACeECsF2G3F2GqG", "I'm \0on \0a \0mis\0sion \0from \0 \0 \0my \0 \0God.\n\0 \0 \0 \0 \0"); Play("3BeCDqCAetAACeECsF2G3F2GqG", "I'm \0on \0a \0mis\0sion \0from \0 \0 \0my \0 \0God.\n\0 \0 \0 \0 \0"); diff --git a/TempleOS/Accts/TS/TAD/MusicOrgan/exalt.CPP b/TempleOS/Accts/TS/TAD/MusicOrgan/exalt.CPP index 10c4f7c..5fec839 100644 --- a/TempleOS/Accts/TS/TAD/MusicOrgan/exalt.CPP +++ b/TempleOS/Accts/TS/TAD/MusicOrgan/exalt.CPP @@ -14,6 +14,7 @@ U0 DrawIt(CTask *task,CDC *dc) U0 Song() { SettingsPush; //See $LK,"SettingsPush","MN:SettingsPush"$ + Fs->text_attr=LTCYAN<<4+BLACK; Fs->draw_it=&DrawIt; Fs->task_end_cb=&SndTaskEndCB; diff --git a/TempleOS/Accts/TS/TAD/MusicOrgan/exiled.CPP b/TempleOS/Accts/TS/TAD/MusicOrgan/exiled.CPP index 9f9e266..e08ddcb 100644 --- a/TempleOS/Accts/TS/TAD/MusicOrgan/exiled.CPP +++ b/TempleOS/Accts/TS/TAD/MusicOrgan/exiled.CPP @@ -38,6 +38,7 @@ U0 DrawIt(CTask *,CDC *dc) U0 Song() { SettingsPush; //See $LK,"SettingsPush","MN:SettingsPush"$ + Fs->text_attr=LTCYAN<<4+BLACK; Fs->draw_it=&DrawIt; Fs->task_end_cb=&SndTaskEndCB; MusicSettingsRst; @@ -46,13 +47,13 @@ U0 Song() try { "$$BG+H,LTCYAN$$"; while (!ScanKey) { - Play("W13qE!AA!etF2G3G!qDF!!etFE!D2eG!3G", + Play("3qEAAetF2G3GqDFetFED2eG3G", "A\0dam... \0 \0no \0 \0 \0long\0er \0sees \0Your \0face.\n\0 \0 \0"); - Play("qE!AA!etF2G3G!qDF!!etFE!D2eG!3G", + Play("qEAAetF2G3GqDFetFED2eG3G", "Oh! \0 \0 \0What \0 \0a \0wretch\0ed \0bar\0ren \0waste!\n\0 \0 \0"); - Play("qACFeB!CB2GqG3E!D", + Play("qACFeBCB2GqG3ED", " \0 \0 \0 \0 \0 \0 \0 \0Ex\0iled.\n\0"); - Play("ACFeB!CB2GqG3E!D"); + Play("ACFeBCB2GqG3ED"); } } catch CatchAll; diff --git a/TempleOS/Accts/TS/TAD/MusicOrgan/exodus.CPP b/TempleOS/Accts/TS/TAD/MusicOrgan/exodus.CPP index 8d2d44d..5037dc6 100644 --- a/TempleOS/Accts/TS/TAD/MusicOrgan/exodus.CPP +++ b/TempleOS/Accts/TS/TAD/MusicOrgan/exodus.CPP @@ -7,10 +7,10 @@ U0 Song() music_stacatto_factor= 0.902; try { while (!ScanKey) { - Play("W13e.C2sG3qEe.FsB!eCCsFGeBA!AetAR!!EeE!sCB"); - Play("e.C2sG3qEe.FsB!eCCsFGeBA!AetAR!!EeE!sCB"); - Play("eG!E2qG3sCD!CDe.EsG!!qCsD!CDC!!e.AsReG!E"); - Play("G!E2qG3sCD!CDe.EsG!!qCsD!CDC!!e.AsReG!E"); + Play("3e.C2sG3qEe.FsBeCCsFGeBAAetAREeEsCB"); + Play("e.C2sG3qEe.FsBeCCsFGeBAAetAREeEsCB"); + Play("eGE2qG3sCDCDe.EsGqCsDCDCe.AsReGE"); + Play("GE2qG3sCDCDe.EsGqCsDCDCe.AsReGE"); } } catch CatchAll; diff --git a/TempleOS/Accts/TS/TAD/MusicOrgan/feigned.CPP b/TempleOS/Accts/TS/TAD/MusicOrgan/feigned.CPP index f1b208e..2e3dca1 100644 --- a/TempleOS/Accts/TS/TAD/MusicOrgan/feigned.CPP +++ b/TempleOS/Accts/TS/TAD/MusicOrgan/feigned.CPP @@ -7,14 +7,14 @@ U0 Song() music_stacatto_factor= 0.857; try { while (!ScanKey) { - Play("W13eEDEFqDDeEDEDqCC", + Play("3eEDEFqDDeEDEDqCC", "$$CL$$Sit\0ting \0in \0a \0church\n\0 \0wond\0ering \0to \0my\0self,\n\0 \0"); Play("eD2G3BCqDsGGGGeD2G3BCqDsGGGG", "\"Is \0 \0God \0 \0real?\"\n\0 \0 \0 \0 \0\"At \0 \0the \0 \0wheel?\"\n\0 \0 \0 \0 \0"); "$$FG,GREEN$$God talking...\n$$FG$$"; - Play("qF!FFetREA!qG!sG!FG!!F!GEGEqC", + Play("qFFFetREAqGsGFGFGEGEqC", "$$FG,RED$$Oh, \0Hell \0yes!\n\0 \0 \0 \0 \0 \0 \0 \0 \0 \0 \0 \0 \0 \0"); - Play("F!FFetREA!qG!sG!FG!!F!GEGEqC", + Play("FFFetREAqGsGFGFGEGEqC", "Pass \0the \0test.$$FG$$\n\0 \0 \0 \0 \0 \0 \0 \0 \0 \0 \0 \0 \0 \0"); } } catch diff --git a/TempleOS/Accts/TS/TAD/MusicOrgan/finger.CPP b/TempleOS/Accts/TS/TAD/MusicOrgan/finger.CPP index 8d948671f0d317ea01f1863d185bfaa4f0018cc0..daf140b1e918c247814de548878b3a2c7d6694c5 100644 GIT binary patch delta 36 rcmew-_fKv^Ig7YUezJ2;YGRQ!mx4lYYDr0EUV3pre!=EGmJeJ209p;a delta 36 rcmew-_fKv^Ig5C3YDr0EUV3pret|WYf`UtavU5&qV$tS4mJeJ22lx%V diff --git a/TempleOS/Accts/TS/TAD/MusicOrgan/first.CPP b/TempleOS/Accts/TS/TAD/MusicOrgan/first.CPP index 9115c426bd758b610e35b63c9565853f8eda992e..170efdb6cb70f0d08fc113284bad008019425513 100644 GIT binary patch delta 11 ScmbQsH5lc6b7Z1xVpF% a1{t{r89N)Lmbg#;&FFz$W^*i4I~xFC?IJ?} delta 138 zcmX>h_(X8RYngCEMdQ>G7ez%QcXxM1V`s-g7e&`pH$`_vXT^zs<0KVvONvi!X7rI# tOm$LpDGW+2admMk3^H;LGImx}G)gUTSDfs~Br^F2qX`}*n;n_j*#Ip+C{+Le diff --git a/TempleOS/Accts/TS/TAD/MusicOrgan/freaks.CPP b/TempleOS/Accts/TS/TAD/MusicOrgan/freaks.CPP index a5911af..4600704 100644 --- a/TempleOS/Accts/TS/TAD/MusicOrgan/freaks.CPP +++ b/TempleOS/Accts/TS/TAD/MusicOrgan/freaks.CPP @@ -7,13 +7,13 @@ U0 Song() music_stacatto_factor= 0.604; try { while (!ScanKey) { - Play("W13sEqAsDeCqAsEqAsDeCqAsDeEqEsE", + Play("3sEqAsDeCqAsEqAsDeCqAsDeEqEsE", "Jes\0us \0kind \0of \0freaks,\n\0Jes\0us \0kind \0of \0freaks,\n\0are \0dif\0ferent \0 \0"); - Play("eDqCsDeCqBsBeBqAetBED!qBeC!B", + Play("eDqCsDeCqBsBeBqAetBEDqBeCB", "from \0 \0oth\0er\n\0 \0 \0peo\0ple.\n\0 \0 \0 \0 \0They \0don't \0"); - Play("2qGeG!3FsCDC!!DqFetB!ACBED!qBeC!B", + Play("2qGeG3FsCDCDqFetBACBEDqBeCB", "care,\n\0for \0God \0 \0is \0their \0 \0joy!\n\0 \0 \0 \0 \0 \0 \0 \0They \0don't \0"); - Play("2qGeG!3FsCDC!!DqFetB!AC", + Play("2qGeG3FsCDCDqFetBAC", "care,\n\0for \0God \0 \0is \0their \0 \0joy!\n\0 \0 \0 \0"); } } catch diff --git a/TempleOS/Accts/TS/TAD/MusicOrgan/free.CPP b/TempleOS/Accts/TS/TAD/MusicOrgan/free.CPP index a81d80a..da68c25 100644 --- a/TempleOS/Accts/TS/TAD/MusicOrgan/free.CPP +++ b/TempleOS/Accts/TS/TAD/MusicOrgan/free.CPP @@ -120,7 +120,7 @@ U0 Song() SettingsPush; //See $LK,"SettingsPush","MN:SettingsPush"$ Preempt(OFF); Init; - Fs->animate_task=Spawn(&AnimateTask,NULL,"Animate",Fs); + Fs->animate_task=Spawn(&AnimateTask,NULL,"Animate",,Fs); Fs->draw_it=&DrawIt; Fs->task_end_cb=&SndTaskEndCB; MusicSettingsRst; @@ -134,13 +134,13 @@ U0 Song() SetWinHorz(Fs->win_left,Fs->win_right,task); SetWinVert(Fs->win_bottom+3,Fs->win_bottom+15,task); while (!ScanKey) { - Play("W13qEEBeBDsBBB!BqDsBFB!!FD2G3D!2G", + Play("3qEEBeBDsBBBBqDsBFBFD2G3D2G", "Free \0will... \0 \0 \0 \0 \0 \0 \0 \0 \0I \0 \0 \0 \0fail.\n\0 \0 \0 \0"); - Play("3qEEBeBDsBBB!BqDsBFB!!FD2G3D!2G", + Play("3qEEBeBDsBBBBqDsBFBFD2G3D2G", "God \0still... \0 \0 \0 \0 \0 \0 \0 \0 \0I \0 \0 \0 \0hail.\n\0 \0 \0 \0"); - Play("3qD2G3eA2G3qCetEC!AqBsA!!C!ACqA", + Play("3qD2G3eA2G3qCetECAqBsACACqA", "All \0things \0work \0for \0good... \0to \0the \0Lord.\n\0 \0 \0 \0 \0 \0 \0"); - Play("D2G3eA2G3qCetEC!AqBsA!!C!ACqA", + Play("D2G3eA2G3qCetECAqBsACACqA", "It's \0all \0good... \0 \0 \0as\0 \0sured.\n\0 \0 \0 \0 \0 \0 \0"); } } catch diff --git a/TempleOS/Accts/TS/TAD/MusicOrgan/furnishing.CPP b/TempleOS/Accts/TS/TAD/MusicOrgan/furnishing.CPP index 6cdf9e0a4ba4b3713be7aa77be4f2f6460fcbfcd..496cc8fe75d119a29b5804d41a0ed4c8ad2364c2 100644 GIT binary patch delta 84 zcmbQK*{`{Qg=I4v3p=BeacYUXi?dOoyK$SQUoy&Ec$0`~cRn7f1jA delta 72 zcmeCzoT<5ig@q~Ha5D=FJEORwacYUXi?dOoyK$B_mOi<=$rm0-UsU@yP?#AwgE|aG+hazz|e`h|y F3IJny6V?C# delta 113 zcmZ24ykB^OIg>)Tp>eUZqN1a-qGPI~Q=wz3n`3H;i<^;qs=KjUp}XSbK&D1%eDW`u frt&HprFF; delta 102 zcmca6{7QI(CKFS*;bcuF4>d(cBX>pPVkdV+Cq;KRXGJ$>CpRaz)DkyEcgJEkcQ-|M X#X@(*$$dWZmEsoku|yp;_AkLnwM diff --git a/TempleOS/Accts/TS/TAD/MusicOrgan/limit.CPP b/TempleOS/Accts/TS/TAD/MusicOrgan/limit.CPP index 640b197087de8c97277eb8f965f47d0b154413cc..087c6a297213fac91920d3abdaaa4e9cf4f57041 100644 GIT binary patch delta 32 ocmdnay_I{zXU53^OtF&>FpE#-V{(}+&muNioLOP>W2P%i0KSn5!~g&Q delta 19 acmdnWy`6i*XGW%Q!^wV3v6};!Qkelq?gm}} diff --git a/TempleOS/Accts/TS/TAD/MusicOrgan/mary.CPP b/TempleOS/Accts/TS/TAD/MusicOrgan/mary.CPP index 73c41d2..4d0e2b1 100644 --- a/TempleOS/Accts/TS/TAD/MusicOrgan/mary.CPP +++ b/TempleOS/Accts/TS/TAD/MusicOrgan/mary.CPP @@ -7,10 +7,10 @@ U0 Song() music_stacatto_factor= 0.538; try { while (!ScanKey) { - Play("W13qEDCDeEEqEeDDqD"); + Play("3qEDCDeEEqEeDDqD"); Play("EDCDeEEqEeDDqD"); - Play("eD!!AsFDF!DqFsFBFB2qG3etBB!BqFC"); - Play("eD!!AsFDF!DqFsFBFB2qG3etBB!BqFC"); + Play("eDAsFDFDqFsFBFB2qG3etBBBqFC"); + Play("eDAsFDFDqFsFBFB2qG3etBBBqFC"); } } catch CatchAll; diff --git a/TempleOS/Accts/TS/TAD/MusicOrgan/mildly.CPP b/TempleOS/Accts/TS/TAD/MusicOrgan/mildly.CPP index adf7358699ff238f1a347d80da7aa808852ce6ad..657caa1433521f56cf8592760c6adec1daf9d30d 100644 GIT binary patch delta 37 scmZ3-cb0F%WJZaS)QXb$#FCOCTjxkeKN}kpZ6_Z`XK(AxJ&cQ30skKikpKVy delta 12 UcmX@hw~lYaWX8>#7-zEr03w_O;s5{u diff --git a/TempleOS/Accts/TS/TAD/MusicOrgan/myrrh.CPP b/TempleOS/Accts/TS/TAD/MusicOrgan/myrrh.CPP index 48ba6b2..cb90183 100644 --- a/TempleOS/Accts/TS/TAD/MusicOrgan/myrrh.CPP +++ b/TempleOS/Accts/TS/TAD/MusicOrgan/myrrh.CPP @@ -7,10 +7,10 @@ U0 Song() music_stacatto_factor= 0.902; try { while (!ScanKey) { - Play("W13eFDGsBReCB2sGRGR!3qEetG!AGeG!sF!!GeRsDG"); - Play("eFDGsBReCB2sGRGR!3qEetG!AGeG!sF!!GeRsDG"); - Play("FAFAqG!eEEqBetE!!2GR!3eFsARe.BsCe.RsE"); - Play("FAFAqG!eEEqBetE!!2GR!3eFsARe.BsCe.RsE"); + Play("3eFDGsBReCB2sGRGR3qEetGAGeGsFGeRsDG"); + Play("eFDGsBReCB2sGRGR3qEetGAGeGsFGeRsDG"); + Play("FAFAqGeEEqBetE2GR3eFsARe.BsCe.RsE"); + Play("FAFAqGeEEqBetE2GR3eFsARe.BsCe.RsE"); } } catch CatchAll; diff --git a/TempleOS/Accts/TS/TAD/MusicOrgan/night.CPP b/TempleOS/Accts/TS/TAD/MusicOrgan/night.CPP index e9efa1bb88058f79ec45051336a3e7e500b80034..7a92c5fccf2f1890a43568c11d6a4d4f241d17e0 100644 GIT binary patch delta 39 ucmbOwwOeY#d}gVV)QXb$#FCOCTPGh!XKx!D6K$Um_aMhe>&-Kmn>Ya&j14US delta 12 TcmdljHA`y4eCEvun5#JfB2EO> diff --git a/TempleOS/Accts/TS/TAD/MusicOrgan/o.CPP b/TempleOS/Accts/TS/TAD/MusicOrgan/o.CPP index 77bc483..468a6cb 100644 --- a/TempleOS/Accts/TS/TAD/MusicOrgan/o.CPP +++ b/TempleOS/Accts/TS/TAD/MusicOrgan/o.CPP @@ -7,10 +7,10 @@ U0 Song() music_stacatto_factor= 0.902; try { while (!ScanKey) { - Play("W13sC!G!CG!!etA!DD2sG!3G2G3G!F!A!!FADD!!DD!qGsB2G3B2G3qG"); - Play("sC!G!CG!!etA!DD2sG!3G2G3G!F!A!!FADD!!DD!qGsB2G3B2G3qG"); - Play("eG!2G3qEeAsA2G3qAsEAEAD!E!!DEqFeA!2G"); - Play("3G!2G3qEeAsA2G3qAsEAEAD!E!!DEqFeA!2G"); + Play("3sCGCGetADD2sG3G2G3GFAFADDDDqGsB2G3B2G3qG"); + Play("sCGCGetADD2sG3G2G3GFAFADDDDqGsB2G3B2G3qG"); + Play("eG2G3qEeAsA2G3qAsEAEADEDEqFeA2G"); + Play("3G2G3qEeAsA2G3qAsEAEADEDEqFeA2G"); } } catch CatchAll; diff --git a/TempleOS/Accts/TS/TAD/MusicOrgan/population.CPP b/TempleOS/Accts/TS/TAD/MusicOrgan/population.CPP index 09620c1..886a1d5 100644 --- a/TempleOS/Accts/TS/TAD/MusicOrgan/population.CPP +++ b/TempleOS/Accts/TS/TAD/MusicOrgan/population.CPP @@ -7,10 +7,10 @@ U0 Song() music_stacatto_factor= 0.780; try { while (!ScanKey) { - Play("W13eCDBCA2FFF3C2F3E2F3A2F3sEEeD"); + Play("3eCDBCA2FFF3C2F3E2F3A2F3sEEeD"); Play("F2FFF3qCeF2F3F2FFF3qCeF2F"); - Play("!3qG!sEAEAqB!etDC!F2qG3D!sGDGDetCRC"); - Play("!qG!sEAEAqB!etDC!F2qG3D!sGDGDetCRC"); + Play("3qGsEAEAqBetDCF2qG3DsGDGDetCRC"); + Play("qGsEAEAqBetDCF2qG3DsGDGDetCRC"); } } catch CatchAll; diff --git a/TempleOS/Accts/TS/TAD/MusicOrgan/prosper.CPP b/TempleOS/Accts/TS/TAD/MusicOrgan/prosper.CPP index 8f5bfea346e10c247ec0a4fd410d7fab1e523c90..15afc9d3060d961ce757a9a9ea57beb4179c64f5 100644 GIT binary patch delta 46 zcmdm|{YZO419NFn>c)ouj8Y}36(#YBB_&0+?m@1uel|8H+L5k4KK|j>n=6>ygaNbw B5TXD8 delta 15 XcmaE)y-#~W!^YzK63`; diff --git a/TempleOS/Accts/TS/TAD/MusicOrgan/psalm.CPP b/TempleOS/Accts/TS/TAD/MusicOrgan/psalm.CPP index fa72396..151d687 100644 --- a/TempleOS/Accts/TS/TAD/MusicOrgan/psalm.CPP +++ b/TempleOS/Accts/TS/TAD/MusicOrgan/psalm.CPP @@ -8,13 +8,13 @@ U0 Song() try { while (!ScanKey) { Play("M5/4"); - Play("W12qGGG3qtCBA2qGGG3qtCetBBqtA", + Play("2qGGG3qtCBA2qGGG3qtCetBBqtA", "Hymn's \0not \0long.\n\0 \0 \0 \0Nor \0this \0song.\n\0 \0 \0 \0 \0"); Play("qEeCCqDqtCBAM4/4", "For\0 \0 \0give!\n\0 \0 \0 \0"); - Play("qD!eA!2G3DG2G3DF!FAC!!2qG3eAE", + Play("qDeA2G3DG2G3DFFAC2qG3eAE", "That's \0 \0 \0all \0 \0I \0 \0say.\n\0 \0 \0 \0 \0 \0 \0"); - Play("qD!eA!2G3DG2G3DF!FAC!!2qG3eAE", + Play("qDeA2G3DG2G3DFFAC2qG3eAE", "This \0 \0 \0I \0 \0 \0 \0pray.\n\0 \0 \0 \0 \0 \0 \0"); } } catch diff --git a/TempleOS/Accts/TS/TAD/MusicOrgan/reposes.CPP b/TempleOS/Accts/TS/TAD/MusicOrgan/reposes.CPP index 43cc569..6b248b2 100644 --- a/TempleOS/Accts/TS/TAD/MusicOrgan/reposes.CPP +++ b/TempleOS/Accts/TS/TAD/MusicOrgan/reposes.CPP @@ -7,13 +7,13 @@ U0 Song() music_stacatto_factor= 0.902; try { while (!ScanKey) { - Play("W13eC2G3DDEDqCeEEGFGFqE", + Play("3eC2G3DDEDqCeEEGFGFqE", "Sit\0ting \0 \0 \0on \0the \0fence,\n\0is \0 \0 \0 \0no \0de\0fence.\n\0"); Play("sFFeGFEFEqDsCCeDCBqBB", "Is \0this \0seat \0 \0 \0tak\0 \0en?\n\0An\0 \0y\0one \0op\0 \0pose?\n\0"); - Play("etB2GG!3qE!2eG3F!EEetFBA!qFDetF!CC", + Play("etB2GG3qE2eG3FEEetFBAqFDetFCC", "Take \0 \0a \0step.\n\0 \0 \0 \0 \0 \0 \0 \0 \0 \0 \0 \0 \0"); - Play("B2GG!3qE!2eG3F!EEetFBA!qFDetF!CC", + Play("B2GG3qE2eG3FEEetFBAqFDetFCC", "Take \0 \0the \0step,\n\0 \0 \0 \0 \0 \0 \0 \0not \0back.\n\0 \0 \0 \0"); } } catch diff --git a/TempleOS/Accts/TS/TAD/MusicOrgan/restless.CPP b/TempleOS/Accts/TS/TAD/MusicOrgan/restless.CPP index b613806..a50c7a8 100644 --- a/TempleOS/Accts/TS/TAD/MusicOrgan/restless.CPP +++ b/TempleOS/Accts/TS/TAD/MusicOrgan/restless.CPP @@ -14,11 +14,11 @@ U0 Song() SetWinHorz(Fs->win_left,Fs->win_right,task); SetWinVert(Fs->win_bottom+3,Fs->win_bottom+15,task); while (!ScanKey) { - Play("W13sDDDACCADDACCAe.DsCCC2G3FD2G3FD2G3CCAe.D", + Play("3sDDDACCADDACCAe.DsCCC2G3FD2G3FD2G3CCAe.D", "I \0 \0 \0 \0got \0 \0 \0paid, \0 \0 \0to\0 \0 \0day.\n\0 \0 \0 \0 \0 \0 \0 \0 \0 \0 \0 \0 \0 \0 \0"); - Play("qD2sG3G2G3G!etGDAeF2GqG3etF!BA!!EACE!CE", + Play("qD2sG3G2G3GetGDAeF2GqG3etFBAEACECE", " \0 \0 \0 \0 \0 \0 \0 \0 \0 \0 \0I \0 \0 \0can't \0 \0 \0get \0 \0to \0"); - Play("qD2sG3G2G3G!etGDAeF2GqG3etF!BA!!EACE!CE", + Play("qD2sG3G2G3GetGDAeF2GqG3etFBAEACECE", "sleep.\n\0 \0 \0 \0 \0 \0 \0 \0 \0 \0 \0 \0 \0 \0 \0 \0 \0 \0 \0 \0"); } } catch diff --git a/TempleOS/Accts/TS/TAD/MusicOrgan/rifled.CPP b/TempleOS/Accts/TS/TAD/MusicOrgan/rifled.CPP index b4f18c9..140842d 100644 --- a/TempleOS/Accts/TS/TAD/MusicOrgan/rifled.CPP +++ b/TempleOS/Accts/TS/TAD/MusicOrgan/rifled.CPP @@ -8,10 +8,10 @@ U0 Song() try { while (!ScanKey) { Play("M9/8"); - Play("W13qAeCBAq.CsAAqAeCBA2q.G3sBC"); + Play("3qAeCBAq.CsAAqAeCBA2q.G3sBC"); Play("qAeDCAhBeFsEEeDq.CM4/4"); - Play("sAFAFeF!!2GsG3B2G!!3BqGeA!sAAetEGDE2G!3DeGsGG"); - Play("AFAFeF!!2GsG3B2G!!3BqGeA!sAAetEGDE2G!3DeGsGG"); + Play("sAFAFeF2GsG3B2G3BqGeAsAAetEGDE2G3DeGsGG"); + Play("AFAFeF2GsG3B2G3BqGeAsAAetEGDE2G3DeGsGG"); } } catch CatchAll; diff --git a/TempleOS/Accts/TS/TAD/MusicOrgan/risen.CPP b/TempleOS/Accts/TS/TAD/MusicOrgan/risen.CPP index 3f09ea9..3ea152c 100644 --- a/TempleOS/Accts/TS/TAD/MusicOrgan/risen.CPP +++ b/TempleOS/Accts/TS/TAD/MusicOrgan/risen.CPP @@ -63,6 +63,7 @@ U0 Song() { I64 i; SettingsPush; //See $LK,"SettingsPush","MN:SettingsPush"$ + Fs->text_attr=LTCYAN<<4+BLACK; Fs->draw_it=&DrawIt; Fs->task_end_cb=&SndTaskEndCB; MusicSettingsRst; @@ -73,10 +74,10 @@ U0 Song() by[i]=RANGE*RandI16/RANGE; } try { - "$$BG+H,LTCYAN$$$$FD+H,BLACK$$"; + "$$BG+H,LTCYAN$$"; while (!ScanKey) { t0=tMBeat; - Play("W13eDEqFFetEEFqDeCDDEetCGF"); + Play("3eDEqFFetEEFqDeCDDEetCGF"); Play("eDEqFFetEEFqDeCDDEetCGF"); Play("eDCqDEeAAetEEFEDGBDCqF"); Play("eDCqDEeAAetEEFEDGBDCqF"); diff --git a/TempleOS/Accts/TS/TAD/MusicOrgan/satisfaction.CPP b/TempleOS/Accts/TS/TAD/MusicOrgan/satisfaction.CPP index 60a52387c313f70b9e90995a848a51ea531d3a72..1f6686d3e1653d61c3d3270fbba91b97d79857b5 100644 GIT binary patch delta 12 TcmbO!GF@atI@{(win_left,Fs->win_right,task); SetWinVert(Fs->win_bottom+3,Fs->win_bottom+15,task); while (!ScanKey) { - Play("W13hDeDA2qG3hDeD2GqF", + Play("3hDeDA2qG3hDeD2GqF", "It \0sig\0ni\0fies\n\0a \0big \0sur\0prise.\n\0"); Play("3hDeD2sFG3qAhDeDA2qG", "Why \0 \0im\0pro\0vise?\n\0$$FG,RED$$\"Be\0cause,\"$$FG$$ \0re\0plies.\n\0"); - Play("3eC!!EsACACeD2G3qA!AFeE2G!3etFCC", + Play("3eCEsACACeD2G3qAAFeE2G3etFCC", "If \0 \0you \0 \0 \0 \0love \0your \0god,\n\0 \0don't \0bore \0 \0Him!\n\0 \0 \0"); - Play("eC!!EsACACeD2G3qA!AFeE2G!3etFCC", + Play("eCEsACACeD2G3qAAFeE2G3etFCC", "If \0 \0you \0 \0 \0 \0love \0your \0god,\n\0 \0sur\0prise \0 \0Him!\n\0 \0 \0"); } } catch diff --git a/TempleOS/Accts/TS/TAD/MusicOrgan/silver.CPP b/TempleOS/Accts/TS/TAD/MusicOrgan/silver.CPP index 0c815f8..7c6e7f0 100644 --- a/TempleOS/Accts/TS/TAD/MusicOrgan/silver.CPP +++ b/TempleOS/Accts/TS/TAD/MusicOrgan/silver.CPP @@ -8,13 +8,13 @@ U0 Song() music_stacatto_factor= 0.902; try { while (!ScanKey) { - Play("W13qF!2GsGG!!GG3GFG!FqAeD!2G!3etDBEsFCFC", + Play("3qF2GsGGGG3GFGFqAeD2G3etDBEsFCFC", "Love \0 \0 \0 \0 \0 \0ev\0 \0ery \0 \0sec\0ond.\n\0 \0 \0 \0 \0 \0 \0 \0 \0"); - Play("qF!2GsGG!!GG3GFG!FqAeD!2G!3etDBEsFCFC", + Play("qF2GsGGGG3GFGFqAeD2G3etDBEsFCFC", "World -- \0 \0 \0 \0 \0 \0all \0 \0that \0 \0beck\0ons.\n\0 \0 \0 \0 \0 \0 \0 \0 \0"); - Play("qBG!!FsEAEAqEFGeF!C", + Play("qBGFsEAEAqEFGeFC", " \0Life \0is \0too \0 \0 \0 \0prec\0i\0ous.\n\0 \0 \0"); - Play("qBG!!FsEAEAqEFGeF!C", + Play("qBGFsEAEAqEFGeFC", " \0Can \0be \0 \0 \0 \0 \0worr\0i\0ous.\n\0 \0 \0"); } } catch diff --git a/TempleOS/Accts/TS/TAD/MusicOrgan/teachings.CPP b/TempleOS/Accts/TS/TAD/MusicOrgan/teachings.CPP index a5ba030..b519cfe 100644 --- a/TempleOS/Accts/TS/TAD/MusicOrgan/teachings.CPP +++ b/TempleOS/Accts/TS/TAD/MusicOrgan/teachings.CPP @@ -15,13 +15,13 @@ U0 Song() SetWinHorz(Fs->win_left,Fs->win_right,task); SetWinVert(Fs->win_bottom+3,Fs->win_bottom+15,task); while (!ScanKey) { - Play("W12eG3CD!AqE!!sACACG!EGEqDsAAA!AetCDD", + Play("2eG3CDAqEsACACGEGEqDsAAAAetCDD", "Ple\0ase \0te\0ach \0me.\n\0 \0 \0 \0 \0 \0 \0 \0 \0 \0 \0 \0 \0 \0 \0 \0 \0"); - Play("2eG3CD!AqE!!sACACG!EGEqDsAAA!AetCDD", + Play("2eG3CDAqEsACACGEGEqDsAAAAetCDD", "Wa\0ter \0thi\0s \0tree.\n\0 \0 \0 \0 \0 \0 \0 \0 \0 \0 \0 \0 \0 \0 \0 \0 \0"); - Play("2qG!G3eEBqAGeFE!!sF!GFG!etD!BD", + Play("2qGG3eEBqAGeFEsFGFGetDBD", " \0 \0$$FG,RED$$I \0will \0teach \0thee.\n\0 \0 \0 \0 \0 \0 \0 \0 \0 \0"); - Play("2qG!G3eEBqAGeFE!!sF!GFG!etD!BD", + Play("2qGG3eEBqAGeFEsFGFGetDBD", " \0 \0Wat\0er \0that \0tree.$$FG$$\n\0 \0 \0 \0 \0 \0 \0 \0 \0 \0"); } } catch diff --git a/TempleOS/Accts/TS/TAD/MusicOrgan/thereupon.CPP b/TempleOS/Accts/TS/TAD/MusicOrgan/thereupon.CPP index 8a6c94d..e997d68 100644 --- a/TempleOS/Accts/TS/TAD/MusicOrgan/thereupon.CPP +++ b/TempleOS/Accts/TS/TAD/MusicOrgan/thereupon.CPP @@ -30,6 +30,7 @@ U0 Song() I64 i; CTask *task; SettingsPush; //See $LK,"SettingsPush","MN:SettingsPush"$ + Fs->text_attr=LTCYAN<<4+BLACK; Fs->draw_it=&DrawIt; Fs->task_end_cb=&SndTaskEndCB; MusicSettingsRst; @@ -52,17 +53,17 @@ U0 Song() TaskWait(task); SetWinHorz(Fs->win_left,Fs->win_right,task); SetWinVert(Fs->win_bottom+3,Fs->win_bottom+15,task); - "$$BD+H,LTCYAN$$$$FD+H,BLACK$$"; + "$$BG+H,LTCYAN$$$$FG+H,BLACK$$"; while (!ScanKey) { - Play("W12qG3eCB2hGqG3eCB2qG3A", + Play("2qG3eCB2hGqG3eCB2qG3A", "Umm... \0God?\n\0 \0 \0Let \0Your \0 \0 \0 \0"); Play("CeBA2G3DqEeDCBA2qG3A", "face \0shine \0on \0down\n\0on \0us, \0Your \0 \0luck\0y \0 \0peo\0"); - Play("eBA2h.G3qE!!CAF", + Play("eBA2h.G3qECAF", " \0ple.\n\0 \0Fath\0e\0r \0a\0"); - Play("FD!A!eEDqE!!CAF", + Play("FDAeEDqECAF", "bove,\n\0 \0 \0I \0 \0feel \0 \0 \0Your \0"); - Play("FD!A!eED", + Play("FDAeED", "love.\n\0 \0 \0 \0 \0"); } } catch diff --git a/TempleOS/Accts/TS/TAD/MusicOrgan/thither.CPP b/TempleOS/Accts/TS/TAD/MusicOrgan/thither.CPP index ee38d04..d56ca9f 100644 --- a/TempleOS/Accts/TS/TAD/MusicOrgan/thither.CPP +++ b/TempleOS/Accts/TS/TAD/MusicOrgan/thither.CPP @@ -7,13 +7,13 @@ U0 Song() music_stacatto_factor= 0.902; try { while (!ScanKey) { - Play("W13sC#C#D#D#C#C#CCC#C#D#D#C#C#CCEEDDC#C#DDEEDDC#C#DD", + Play("3sC#C#D#D#C#C#CCC#C#D#D#C#C#CCEEDDC#C#DDEEDDC#C#DD", "Still \0 \0 \0 \0there.\n\0 \0 \0 \0Still \0 \0 \0 \0there.\n\0 \0 \0 \0Not \0 \0 \0 \0fair.\n\0 \0 \0 \0Not \0 \0 \0 \0fair.\n\0 \0 \0 \0"); Play("C#C#D#D#C#C#CCC#C#D#D#C#C#CCEEDDC#C#DDEEDDC#C#DD", "Un\0 \0 \0 \0aware!\n\0 \0 \0 \0Un\0 \0 \0 \0aware!\n\0 \0 \0 \0Every\0 \0 \0 \0where!\n\0 \0 \0 \0Every\0 \0 \0 \0where!\n\0 \0 \0 \0"); - Play("eB!!DetFGAeF!EBE!etE!FEqCeFEDA", + Play("eBDetFGAeFEBEetEFEqCeFEDA", "$$FG,RED$$Running \0 \0 \0a\0way \0 \0 \0 \0 \0 \0from \0the \0Lord \0won't \0 \0work.\n\0 \0"); - Play("B!!DetFGAeF!EBE!etE!FEqCeFEDA", + Play("BDetFGAeFEBEetEFEqCeFEDA", "Running \0 \0 \0a\0way \0 \0 \0 \0 \0 \0from \0the \0Lord \0won't \0 \0work.$$FG$$\n\0 \0"); } } catch diff --git a/TempleOS/Accts/TS/TAD/MusicOrgan/twins.CPP b/TempleOS/Accts/TS/TAD/MusicOrgan/twins.CPP index 00b7f02..57b8930 100644 --- a/TempleOS/Accts/TS/TAD/MusicOrgan/twins.CPP +++ b/TempleOS/Accts/TS/TAD/MusicOrgan/twins.CPP @@ -8,7 +8,7 @@ U0 Song() try { while (!ScanKey) { "$$FG,GREEN$$As I look back on my sinful past...$$FG$$\n"; - Play("W13qCAABAeAECEqB", + Play("3qCAABAeAECEqB", "Who \0was \0that \0per\0son? \0 \0It \0wasn't \0 \0me?\n\0"); Play("CAABAeAECEqB", "Who \0was \0that \0per\0son? \0 \0It \0wasn't \0 \0me?\n\0"); diff --git a/TempleOS/Accts/TS/TAD/MusicOrgan/verses.CPP b/TempleOS/Accts/TS/TAD/MusicOrgan/verses.CPP index cc5b558..662160f 100644 --- a/TempleOS/Accts/TS/TAD/MusicOrgan/verses.CPP +++ b/TempleOS/Accts/TS/TAD/MusicOrgan/verses.CPP @@ -16,7 +16,7 @@ U0 PutVerse() U8 *ch; I64 *start; - "$$CL$$"; + DocClear; start=GetTimeStamp/16%size; if (start>size-LEN) start=size-LEN; ch=bible[start+LEN-1]; @@ -38,12 +38,12 @@ U0 Song() "$$WW,1$$This shows a random passage based on " "the time at the moment this song was run. " "Talk to God as an offering, then run $MA+A-X+PU,"AfterEgypt","Cd(\"::/TempleOS/Apps/AfterEgypt\");;#include \"Run\"\\n"$ if you " - "want God to talk some more. The $LK,"Holy Spirit","FI:::/TempleOS/Apps/HolySpirit/HSNotes.TXT"$ can " + "want God to talk some more. The $LK+PU,"Holy Spirit","FI:::/TempleOS/Apps/HolySpirit/HSNotes.TXT"$ can " "puppet you.\n"); TaskWait(task); SetWinHorz(Fs->win_left,Fs->win_right,task); SetWinVert(Fs->win_bottom+3,Fs->win_bottom+15,task); - DocRecalc(DocCur(task)); //Reformat word-wrap with new window size. + DocRecalc(DocPut(task)); //Reformat word-wrap with new window size. while (!ScanKey) { PutVerse; Play("3qAeABCBqCetABBqCetAAREE2G"); diff --git a/TempleOS/Accts/TS/TAD/MusicOrgan/villa.CPP b/TempleOS/Accts/TS/TAD/MusicOrgan/villa.CPP index 8fe51a7..1b6d738 100644 --- a/TempleOS/Accts/TS/TAD/MusicOrgan/villa.CPP +++ b/TempleOS/Accts/TS/TAD/MusicOrgan/villa.CPP @@ -7,12 +7,12 @@ U0 Song() music_stacatto_factor= 0.902; try { while (!ScanKey) { - Play("W14etEEEqBetDDqtDqBetCCqtCqBhB"); + Play("4etEEEqBetDDqtDqBetCCqtCqBhB"); Play("etEEEqBetDDqtDqBetCCqtCqBhB"); Play("etABCqDetBCCqDetDCBqAhA"); Play("etABCqDetBCCqDetDCBqAhA"); - Play("!qAetC!!AEsG!!CGCetBC3G4ADAqAGetDAD"); - Play("!qAetC!!AEsG!!CGCetBC3G4ADAqAGetDAD"); + Play("qAetCAEsGCGCetBC3G4ADAqAGetDAD"); + Play("qAetCAEsGCGCetBC3G4ADAqAGetDAD"); } } catch CatchAll; diff --git a/TempleOS/Accts/TS/TAD/MusicOrgan/worship.CPP b/TempleOS/Accts/TS/TAD/MusicOrgan/worship.CPP index 06991a7..cdc8351 100644 --- a/TempleOS/Accts/TS/TAD/MusicOrgan/worship.CPP +++ b/TempleOS/Accts/TS/TAD/MusicOrgan/worship.CPP @@ -7,12 +7,12 @@ U0 Song() music_stacatto_factor= 0.902; try { while (!ScanKey) { - Play("W13qEDeCC!etEAAqEetCDCA!!GFqG", + Play("3qEDeCCetEAAqEetCDCAGFqG", "I \0don't \0know \0 \0 \0 \0 \0 \0 \0 \0what \0 \0to \0 \0pray.\n\0"); - Play("EDeCC!etEAAqEetCDCA!!GFqG"); - Play("eGEetFDAqF!sGF!GF!G!!FG!F!etBGFqGeDE", + Play("EDeCCetEAAqEetCDCAGFqG"); + Play("eGEetFDAqFsGFGFGFGFetBGFqGeDE", "It's \0a \0blah \0 \0 \0day.\n\0 \0 \0 \0 \0 \0 \0 \0 \0 \0 \0 \0 \0 \0 \0"); - Play("GEetFDAqF!sGF!GF!G!!FG!F!etBGFqGeDE"); + Play("GEetFDAqFsGFGFGFGFetBGFqGeDE"); } } catch CatchAll; diff --git a/TempleOS/Accts/TS/TAD/MusicOrgan/yesterday.CPP b/TempleOS/Accts/TS/TAD/MusicOrgan/yesterday.CPP index 3fee8e5..363cd4f 100644 --- a/TempleOS/Accts/TS/TAD/MusicOrgan/yesterday.CPP +++ b/TempleOS/Accts/TS/TAD/MusicOrgan/yesterday.CPP @@ -7,10 +7,10 @@ U0 Song() music_stacatto_factor= 0.846; try { while (!ScanKey) { - Play("W13sEAE!AqE!!eFsG!A!qFsF!G!!eE2qG!3sFEFEqA"); - Play("sEAE!AqE!!eFsG!A!qFsF!G!!eE2qG!3sFEFEqA"); - Play("EeGDqBeCE!2qG3etDG!!C!!eEAFA"); - Play("qEeGDqBeCE!2qG3etDG!!C!!eEAFA"); + Play("3sEAEAqEeFsGAqFsFGeE2qG3sFEFEqA"); + Play("sEAEAqEeFsGAqFsFGeE2qG3sFEFEqA"); + Play("EeGDqBeCE2qG3etDGCeEAFA"); + Play("qEeGDqBeCE2qG3etDGCeEAFA"); } } catch CatchAll; diff --git a/TempleOS/Accts/TS/TAD/MusicOrgan/you.CPP b/TempleOS/Accts/TS/TAD/MusicOrgan/you.CPP index e0e1910..0b9a286 100644 --- a/TempleOS/Accts/TS/TAD/MusicOrgan/you.CPP +++ b/TempleOS/Accts/TS/TAD/MusicOrgan/you.CPP @@ -8,14 +8,14 @@ U0 Song() try { while (!ScanKey) { DocClear; - Play("W13qDsCCCCeBBCCqDsCCCCeBBCC", + Play("3qDsCCCCeBBCCqDsCCCCeBBCC", "I'm \0 \0 \0 \0 \0on \0my \0way.\n\0 \0Got \0a \0 \0 \0 \0bus\0y \0day.\n\0 \0"); Play("sBBBBeAAsBA2G3AqAsBBBBeAAsBA2G3AqA", "Woe, \0 \0 \0 \0I \0for\0got \0 \0to \0 \0pray.\n\0What's \0 \0 \0 \0God \0 \0have \0 \0to \0 \0say?\n\0"); "$$FG,GREEN$$God talking...\n$$FG$$"; - Play("AeB2G3GGqE2etG3F!B!eFGqFeEC", + Play("AeB2G3GGqE2etG3FBeFGqFeEC", "$$FG,RED$$Oh, \0 \0 \0hi-\0a \0you!\n\0What\0ch\0u \0been \0 \0do\0ing?\n\0 \0"); - Play("qAeB2G3GGqE2etG3F!B!eFGqFeEC", + Play("qAeB2G3GGqE2etG3FBeFGqFeEC", "Oh, \0 \0 \0hi-\0a \0you!\n\0What\0ch\0u \0been \0 \0do\0ing?$$FG$$\n\0 \0"); } } catch diff --git a/TempleOS/Accts/TS/TAD/PersonalNotes.TXT b/TempleOS/Accts/TS/TAD/PersonalNotes.TXT index 8f6ea6a..d3cfaa7 100644 --- a/TempleOS/Accts/TS/TAD/PersonalNotes.TXT +++ b/TempleOS/Accts/TS/TAD/PersonalNotes.TXT @@ -1,23 +1,32 @@ -* Cursor is not solid $LK,"Dbg","MN:Dbg"$ when entered in Adam2. +* fix result on Blot ect -* ata base- base1 temp blkdev +* Tour TestSuite on 256Meg NoMP runs out of mem. Leak,too? + +* CTRL-R transform individual elements + +* Size zero files don't copy out from VMware. + +* FileMgr header + +* ATA/ATAPI ID in VMware, when not booted to CD? I forgot. + +* I use fixed-point in $LK,"Circle","MN:Circle"$(), $LK,"Ellipse","MN:Ellipse"$(), $LK,"GrRot","MN:GrRot"$(), $LK,"GrMulMat","MN:GrMulMat"$() and others. +God says I might want to change to float. +$LK-A,"::/TempleOS/Demo/Lectures/FixedPoint.CPP"$. +$LK-A,"::/TempleOS/Demo/Lectures/FixedPointAdvanced.CPP"$. + +* DOCF_DBL_DOLLARS in reindention +* # in reindention +* reindent $LK,"DocRecalc","MN:DocRecalc"$().skip_soft_cr + +* HexEdit with odd size, ASCII cannot be edited. * clean-up addDev pmt -* indent - -* TestSuite Strut - * Might want to convert some Preempt() to Cli -* Bug: Back-up-script cause jumps back and forth in ToHtml. - -* Bug? Hung after pressing CmpMain in personal menu. Haven't seen in a while. -* Crashes after back-up-script. Went away maybe after spurious IRQ fix. * Music organ hangs when cursoring around. Haven't seen in while. -* $LK,"DocUpdateTaskDocs","MN:DocUpdateTaskDocs"$() used to skips locked docs. $LK,"WinMgrSync","MN:WinMgrSync"$() needs to check? - * Why was wordstat so slow on "OldMasterBootWrite" for example. * $LK,"Plain","MN:Plain"$() might be better not saving $LK,"CH_CURSOR","MN:CH_CURSOR"$. @@ -26,16 +35,12 @@ * It would be nice if $LK,"U","MN:U"$() NOP were better. -* Autoindent is very bad. - -* Make native file system expanded size set in Copy. +* Make RedSea file system expanded size set in Copy. * unhandled exception on MP message gets overwritten by WinMgr * Cmd to enable/disable compiler warnings -* make aware of ctrl-r side bar - * fix documentation problem -- remembering 0 terminator in str or not for $$DA * GetS, crazy putkey code * editor page formatting is FUBAR @@ -44,17 +49,14 @@ >Might want to do ZOOM in U8 graphics and convert screen capture to U8 >Might want to reverse bit order -* wenceslas crashes in testsuite, sometimes. went away? +* wenceslas crashes in testsuite, sometimes. -* CGrVectMap sucks -- Pilgrim * return vals for grrect, grblot, grputchar? * collisions for grrect, grblot, grputchar? * 32-bit devices should be in free spot address space of E820. -* RAM drive too small for TempleOSCD.ISO -$WW,1$ -* Race condition in Navy.CPP.Z torpedo +* Race condition in FlatTops.CPP.Z torpedo * {Lock|Rep}{Seg|2E=NotBr|3E=Br}{OP}{ADD}{REX} * Virtual Box MP reboot @@ -70,7 +72,6 @@ GrEdit: Move sidebar selected elems. GrEdit: Strip origin shift cmds. GrEditBitMap, grabscroll? -GrEditBitMap, cut/paste boxes. extern of fun with dft arg of str? @@ -78,7 +79,7 @@ extern of fun with dft arg of str? * FileMgr bad with lots of files. -* This $LK,"Fs->catch_except=TRUE","FF:::/TempleOS/Kernel/TaskCmd.CPP,Fs->catch_except=TRUE"$ causes problems because it catches divide and out-of-mem. Not sure what to do, yet. +* This $LK,"Fs->catch_except=TRUE","FF:::/TempleOS/Kernel/SrvCmd.CPP,Fs->catch_except=TRUE"$ causes problems because it catches divide and out-of-mem. Not sure what to do, yet. * $LK,"MPStart","MN:MPStart"$() free old task memory. (Prolly never gonna do anything about this.) * $LK,"sys_var_init_flag","MN:sys_var_init_flag"$ local vars. * sprite shift pts, ctrl pt for ellipse/polygon w,h is off when rotated. @@ -94,7 +95,6 @@ $HC,"tag+i"$ * Mouseinstall throws exceptions, doesn't work, investigate Mouse $LK,"0x9FC30","FF:::/TempleOS/Kernel/KbdMouse/Mouse.CPP,9FC"$ * get kbd lights working. -* figure-out hyperthread vs nonhyperthread CPU's * Might have issue with compiler exceptions and restoring lex.hash tables. * Generates two compiler error messages for expressions in statements. * release semaphores or break lock sema,usb_td @@ -106,8 +106,6 @@ $HC,">SCALE2,cy+y>>SCALE2,cz)) + result++; + for (j=0;j>SCALE1; + y1=(s2*x+c*y)>>SCALE1; + x=x1; y=y1; + } + } + return result; +} +U0 Main() +{ + I64 i; + CDC *dc=DCAlias; + for (i=0;i<100;i++) + Circle(dc,100,100,0,i*5,&GrLinePlot,1,0,2*ã); + PressAKey; + DCFill; + DCDel(dc); +} +Main; \ No newline at end of file diff --git a/TempleOS/Accts/TS/TSAdam.CPP b/TempleOS/Accts/TS/TSAdam.CPP index ce72c20..74d78db 100644 --- a/TempleOS/Accts/TS/TSAdam.CPP +++ b/TempleOS/Accts/TS/TSAdam.CPP @@ -75,7 +75,8 @@ boot it directly or from VMware with a physical drive. else if (ChkDrvModelSerial('D',"Hitachi HDS721075KLA330","GTF202P8H509AF") && ChkDrvModelSerial('I',"ST3320620AS","6QF24J0A")) ts_cid=CID_TAD8; //Regular boot of TAD8 - else if (dft_drv=='T' && IsDrvATAPI('T') && m20[11].base==0x100000000 && +//beware 'S' + else if (*sys_acct=='T' && IsDrvATAPI('T') && m20[11].base==0x100000000 && m20[11].base(I64)+m20[11].len-1==0x33FFFFFFF) ts_cid=CID_TAD8; //CDROM boot of TAD8 @@ -84,7 +85,6 @@ boot it directly or from VMware with a physical drive. U0 TSInit() { - //TS_IMG_DRV is for the holding area for burning CDROMs CATARep *root=NULL,*ata_drv=NULL,*atapi_drv=NULL; CBlkDev *bdev; switch (ts_cid) { @@ -94,7 +94,7 @@ U0 TSInit() case CID_TAD8_VM: DefinePrintF("CFG_ACCT","\"\nTS/TAD\n\""); DefinePrintF("CFG_HARD_DRVS","\"h2s0xbc00\n0xb880\n1d2s0xbc00\n0xb880\n0\""); - DefinePrintF("CFG_RAM_DRVS","\"b1Scale2Mem(2048,0x40000)\nz1Scale2Mem(2048,0x40000)\n\""); + DefinePrintF("CFG_RAM_DRVS","\"b1\nScale2Mem(2048,0x40000)\n\""); DefinePrintF("CFG_CDROM_DRVS","\"t3s0xb800\n0\""); DefinePrintF("CFG_DSK_CACHE","\"Scale2Mem(0x80000,0x8000000)\n\""); if (ts_cid==CID_TAD8) { @@ -108,13 +108,12 @@ U0 TSInit() DefinePrintF("TS_BAK_DRV","\"E\""); DefinePrintF("TS_RAM_DRV","\"B\""); DefinePrintF("TS_WIN_DRV","\"H\""); - DefinePrintF("TS_IMG_DRV","\"Z\""); DefinePrintF("TS_CDROM_DRV","\"T\""); break; */ case CID_DFT: DefinePrintF("CFG_ACCT","\"\nTS/TAD\n\""); - DefinePrintF("CFG_RAM_DRVS","\"b1Scale2Mem(2048,0x40000)\nz1Scale2Mem(2048,0x40000)\n\""); + DefinePrintF("CFG_RAM_DRVS","\"b1\nScale2Mem(2048,0x40000)\n\""); if (sys_auto_mount_ide_cnt) { //If AutoMount was successful, No need to manually mount in next compile DefinePrintF("CFG_HARD_DRVS","\"\""); @@ -125,10 +124,10 @@ U0 TSInit() DefinePrintF("CFG_HARD_DRVS","\"d2s0x1F0\n0x3F4\n0\""); DefinePrintF("CFG_CDROM_DRVS","\"t3s0x170\n0\""); - bdev=Drv2BlkDev(dft_drv); + bdev=Drv2BlkDev(*sys_acct); if (bdev->type==BDT_ATAPI) { ATARep(FALSE,,&root); - ATAIDDrvs(root,dft_drv,&ata_drv,&atapi_drv); + ATAIDDrvs(root,*sys_acct,&ata_drv,&atapi_drv); if (ata_drv) DefinePrintF("CFG_HARD_DRVS","\"d2p%d\n\"",ata_drv->num); if (atapi_drv) @@ -154,28 +153,26 @@ U0 TSInit() DefinePrintF("TS_BAK_DRV","\"E\""); DefinePrintF("TS_RAM_DRV","\"B\""); DefinePrintF("TS_WIN_DRV","\"\""); - DefinePrintF("TS_IMG_DRV","\"Z\""); DefinePrintF("TS_CDROM_DRV","\"T\""); } } TSInit; -Bool ts_has_main_drv =ToBool(StrLen(TS_MAIN_DRV)), - ts_has_bak_drv =ToBool(StrLen(TS_BAK_DRV)), - ts_has_ram_drv =ToBool(StrLen(TS_BAK_DRV)), - ts_has_win_drv =ToBool(StrLen(TS_WIN_DRV)), - ts_has_img_drv =ToBool(StrLen(TS_IMG_DRV)), - ts_has_cdrom_drv=ToBool(StrLen(TS_CDROM_DRV)); - U0 TSInit2() { DefinePrintF("TS_MAIN_DRV_LET","'%s'",TS_MAIN_DRV); DefinePrintF("TS_BAK_DRV_LET","'%s'",TS_BAK_DRV); DefinePrintF("TS_RAM_DRV_LET","'%s'",TS_RAM_DRV); DefinePrintF("TS_WIN_DRV_LET","'%s'",TS_WIN_DRV); - DefinePrintF("TS_IMG_DRV_LET","'%s'",TS_IMG_DRV); DefinePrintF("TS_CDROM_DRV_LET","'%s'",TS_CDROM_DRV); + } TSInit2; +Bool ts_has_main_drv =ToBool(StrLen(TS_MAIN_DRV)), + ts_has_bak_drv =ToBool(StrLen(TS_BAK_DRV)), + ts_has_ram_drv =ToBool(StrLen(TS_BAK_DRV)), + ts_has_win_drv =ToBool(StrLen(TS_WIN_DRV)), + ts_has_cdrom_drv=ToBool(StrLen(TS_CDROM_DRV)); + if (ts_has_main_drv) SetDrvTextAttr(TS_MAIN_DRV_LET, WHITE <<4|BLUE); if (ts_has_bak_drv) @@ -184,20 +181,21 @@ if (ts_has_ram_drv) SetDrvTextAttr(TS_RAM_DRV_LET, BLUE <<4|YELLOW); if (ts_has_win_drv) SetDrvTextAttr(TS_WIN_DRV_LET, LTRED <<4|BLACK); -if (ts_has_img_drv) - SetDrvTextAttr(TS_IMG_DRV_LET, BLUE <<4|LTRED); if (ts_has_cdrom_drv) SetDrvTextAttr(TS_CDROM_DRV_LET,LTGRAY<<4|BLUE); -#define TS_ISO_NAME TS_RAM_DRV ":/TempleOSCD.ISO" +#define TS_ISO_NAME TS_RAM_DRV ":/TempleOSCD.ISO" +#define TS_DISTRO_DIR TS_RAM_DRV ":/Distro" #define CFG_OPTS "ProtectLow\nAutoMountIDE\nDT\n" -#define CFG_DBG_OPTS "ProtectLow\nAutoMountIDE\nDTDet\nHeapInit\n130\nMemInit\n131\nVarInit\n132\n\n" -#define CFG_DBGZ_OPTS "ProtectLow\nAutoMountIDE\nDTDet\nHeapInit\n0\nMemInit\n0\nVarInit\n0\n\n" +#define CFG_DBG_OPTS "ProtectLow\nAutoMountIDE\nDT"\ + "Det\nHeapInit\n130\nMemInit\n131\nVarInit\n132\n\n" +#define CFG_DBGZ_OPTS "ProtectLow\nAutoMountIDE\nDT"\ + "Det\nHeapInit\n0\nMemInit\n0\nVarInit\n0\n\n" #define TS_CFG CFG_RAM_DRVS CFG_CDROM_DRVS CFG_HARD_DRVS CFG_ACCT CFG_DSK_CACHE CFG_OPTS #define TS_MENU_CFG CFG_RAM_DRVS CFG_CDROM_DRVS CFG_HARD_DRVS "\n\n" CFG_DSK_CACHE CFG_OPTS -#define TS_CDROM_CFG "b10x20000\nt3 \n\nTS\n\nAutoMountIDE\nDT\n" +#define TS_CDROM_CFG "b1\n0x20000\nt3 \n\nTS\n\nAutoMountIDE\nDT\n" //$BK,1$Change these, too...$BK,0$ //$MA+A-X+PU,"STD_DISTRO_CDROM_CFG","F(\"STD_DISTRO_CDROM_CFG\");View;"$ @@ -221,12 +219,12 @@ public U0 MyScreenShot(I64 bits=4) U8 *st; CDirEntry *tempm; I64 cnt=0; - tempm=FilesFind("::/Temp/ScreenShots/*.BMP"); + tempm=FilesFind("::/Temp/ScreenShots/*.BMP.Z"); while (tempm) { cnt++; tempm=tempm->next; } - st=MSPrintF("::/Temp/ScreenShots/SCRN%04d.BMP",cnt); + st=MSPrintF("::/Temp/ScreenShots/SCRN%04d.BMP.Z",cnt); BMPFileCaptureScreen(st,bits); Free(st); Beep; @@ -249,7 +247,7 @@ Boot Windows Download "ffmpeg" from the Internet >CD SCREENSHOTS - >TSZ -expand . + >TSZ . >ffmpeg -r 8 -i VID%05d.BMP -y Movie.avi */ @@ -288,7 +286,7 @@ U0 CopyVideo() { if (ts_has_bak_drv) { Del(TS_BAK_DRV ":/Temp/*.SND"); - SndFileCreate(TS_BAK_DRV ":/Temp/Audio",0.23,0.0,WF_NULL,0.45,0.35); + SndFileCreate(TS_BAK_DRV ":/Temp/Audio",0.23,0.0,WF_SQUARE,0.45,0.35); DelTree(TS_BAK_DRV ":/Temp/ScreenShots"); CopyTree("::/Temp/ScreenShots",TS_BAK_DRV ":/Temp/ScreenShots"); } @@ -328,25 +326,6 @@ U0 CtrlAltS(I64) } SetCtrlAltLetCB('S',&CtrlAltS,"Cmd/Screen Shot"); -public U0 Abbr(U8 *word,U8 *abbr) -{ - U8 buf1[136],buf2[136]; - StrCpy(buf1,word); - StrCpy(buf2,abbr); - - StrUtil(buf1,SUF_TO_LOWER); - StrUtil(buf2,SUF_TO_LOWER); - Grep(buf1,"/TempleOS/"FILENAME_MASK_TXT,"-l-i",buf2); - - *buf1=ToUpper(*buf1); - *buf2=ToUpper(*buf2); - Grep(buf1,"/TempleOS/"FILENAME_MASK_TXT,"-l-i",buf2); - - StrUtil(buf1,SUF_TO_UPPER); - StrUtil(buf2,SUF_TO_UPPER); - Grep(buf1,"/TempleOS/"FILENAME_MASK_TXT,"-l-i",buf2); -} - public U0 ChkAll() { U8 *ptr=TS_HDS; diff --git a/TempleOS/Accts/TS/TSDistro.CPP b/TempleOS/Accts/TS/TSDistro.CPP index 831557d..369f8e3 100644 --- a/TempleOS/Accts/TS/TSDistro.CPP +++ b/TempleOS/Accts/TS/TSDistro.CPP @@ -79,12 +79,6 @@ U0 TSCopyDrv(U8 src,U8 dst) SPrintF(buf_d,"%c:/Temp/ScreenShots",dst); MkDir(buf_d); - if (ts_has_bak_drv && dst==TS_BAK_DRV_LET) { - SPrintF(buf_d,"%c:/Logs",dst); - MkDir(buf_d); - SPrintF(buf_d,"%c:/Logs/TEMPLEOSLogs",dst); - MkDir(buf_d); - } DocClear; Drv(dst); TSMakeOSInstallPrtBootLoader(dst); @@ -178,12 +172,14 @@ U0 Uncollapse(U8 *files_find_mask=FILENAME_MASK_TXT,U8 *fu_flags=NULL) UncollapseLst(FilesFind(files_find_mask,f),&f); } -U0 CopySongDir(U8 *files_find_mask,U8 threshold) +public U0 CopySongs(U8 threshold='7') { CDoc *s; CDocEntry *doc_e; CDirEntry *tempm,*tempm1; - tempm1=tempm=FilesFind(files_find_mask); + DelTree("/TempleOS/Apps/MusicOrgan/Examples"); + MkDir("/TempleOS/Apps/MusicOrgan/Examples"); + tempm1=tempm=FilesFind("/TempleOS/Accts/TS/TAD/MusicOrgan/*.CPP*"); while (tempm1) { s=DocRead(tempm1->full_name); doc_e=s->root.next; @@ -194,17 +190,10 @@ U0 CopySongDir(U8 *files_find_mask,U8 threshold) CDirLstDel(tempm); } -public U0 CopySongs(U8 threshold='7') -{ - DelTree("/TempleOS/Apps/MusicOrgan/Examples"); - MkDir("/TempleOS/Apps/MusicOrgan/Examples"); - CopySongDir("/TempleOS/Accts/TS/TAD/MusicOrgan/*.CPP*",threshold); -} - U0 DistroPrep() { Del("/TempleOS/Demo/WebLogExample/WebLog.TXT*"); - Del("/TempleOS/Demo/GameStarters/EagleDive.BIN*"); + Del("/TempleOS/Demo/Games/EagleDive.BIN*"); DelTree("/TempleOS/Accts/*Temp.TXT.Z"); CopySongs; @@ -230,7 +219,7 @@ U0 DistroPrep() Cd("/TempleOS"); FilesCursorTop; - DelTree("/TempleOS/Demo/*.BI?"); + DelTree("/TempleOS/Demo/*.BI*"); Cd("/TempleOS"); S2T(FILENAME_MASK_SRC,"+r"); @@ -238,22 +227,6 @@ U0 DistroPrep() Move(WSD_DEF_FILENAME,WSD_DEF_FILENAME_Z); } -U0 TSDistroPrep() -{ - Drv(TS_MAIN_DRV_LET); - DistroPrep; - Auto(TS_CDROM_CFG); - MakeOSInstallPrtBootLoader(TS_MAIN_DRV_LET,TS_CDROM_DRV_LET); - Fmt(TS_IMG_DRV_LET,TRUE,FALSE,PT_NATIVE); - Drv(TS_IMG_DRV_LET); - CopyTree(TS_MAIN_DRV ":/TempleOS","/TempleOS"); - CopyTree(TS_MAIN_DRV ":/Windows","/Windows"); - CopyTree(TS_MAIN_DRV ":/Linux","/Linux"); - MkDir("/Temp"); - MkDir("/Temp/ScreenShots"); - CopyTree(TS_MAIN_DRV ":/0000Boot","/0000Boot"); -} - U0 MakeSymFiles() { CDoc *doc; @@ -262,7 +235,7 @@ U0 MakeSymFiles() DocClear; DocMax; HashRep(Fs->hash_table,HTG_ALL,NULL,"-p",0,NULL); - if (doc=DocCur) { + if (doc=DocPut) { st=StrNew(doc->filename.name); StrCpy(doc->filename.name,TS_BAK_DRV ":/Wb/Accts/TS/Wb2/SymsAlpha.TXT.Z"); DocWrite(doc); @@ -272,7 +245,7 @@ U0 MakeSymFiles() DocClear; DocMax; HashRep(Fs->hash_table,HTG_ALL,NULL,"-p+m",0,NULL); - if (doc=DocCur) { + if (doc=DocPut) { st=StrNew(doc->filename.name); StrCpy(doc->filename.name,TS_BAK_DRV ":/Wb/Accts/TS/Wb2/SymsAddress.TXT.Z"); DocWrite(doc); @@ -294,17 +267,22 @@ I64 MakeLineCntFile() Drv(TS_MAIN_DRV_LET); DistroPrep; + Cd(TS_MAIN_DRV ":/TempleOS"); + CopyTree(TS_MAIN_DRV ":/TempleOS/Accts/TS",TS_MAIN_DRV ":/Temp/TS"); + DelTree(TS_MAIN_DRV ":/TempleOS/Accts/TS"); + DocMax; DocClear; - Cd(TS_MAIN_DRV ":/TempleOS"); result=LineCntRep; - if (doc=DocCur) { + if (doc=DocPut) { st=StrNew(doc->filename.name); - StrCpy(doc->filename.name,TS_MAIN_DRV ":/TempleOS/Accts/TS/Wb2/LineCnt.TXT.Z"); + StrCpy(doc->filename.name,TS_MAIN_DRV ":/Temp/TS/Wb2/LineCnt.TXT.Z"); DocWrite(doc); StrCpy(doc->filename.name,st); Free(st); } + CopyTree(TS_MAIN_DRV ":/Temp/TS",TS_MAIN_DRV ":/TempleOS/Accts/TS"); + DelTree(TS_MAIN_DRV ":/Temp/TS"); DocClear; doc=DocRead(TS_MAIN_DRV ":/TempleOS/Adam/DocDefines.CPP.Z"); @@ -325,35 +303,49 @@ I64 MakeLineCntFile() return result; } -U0 StdDistroPrep(U8 *auto_cfg) +U0 TSDistroPrep() { Drv(TS_MAIN_DRV_LET); DistroPrep; - Auto(auto_cfg); + Auto(TS_CDROM_CFG); MakeOSInstallPrtBootLoader(TS_MAIN_DRV_LET,TS_CDROM_DRV_LET); - Fmt(TS_IMG_DRV_LET,TRUE,FALSE,PT_NATIVE); - Drv(TS_IMG_DRV_LET); - CopyTree(TS_MAIN_DRV ":/TempleOS","/TempleOS"); - CopyTree(TS_MAIN_DRV ":/Windows","/Windows"); - CopyTree(TS_MAIN_DRV ":/Linux","/Linux"); - MkDir("/Temp"); - DelTree("/TempleOS/Accts/TS"); - CopyTree(TS_MAIN_DRV ":/0000Boot","/0000Boot"); - Del("/0000Boot/OldMBR.BIN.C"); - Del("/0000Boot/BootMHD2.BIN.C"); + DelTree(TS_DISTRO_DIR); + CopyTree(TS_MAIN_DRV ":/TempleOS",TS_DISTRO_DIR "/TempleOS"); + CopyTree(TS_MAIN_DRV ":/Windows",TS_DISTRO_DIR "/Windows"); + CopyTree(TS_MAIN_DRV ":/Linux",TS_DISTRO_DIR "/Linux"); + MkDir(TS_DISTRO_DIR "/Temp"); + MkDir(TS_DISTRO_DIR "/Temp/ScreenShots"); + CopyTree(TS_MAIN_DRV ":/0000Boot",TS_DISTRO_DIR "/0000Boot"); +} + +U0 StdDistroPrep() +{ + Drv(TS_MAIN_DRV_LET); + DistroPrep; + Auto(STD_DISTRO_CDROM_CFG); + MakeOSInstallPrtBootLoader(TS_MAIN_DRV_LET,TS_CDROM_DRV_LET); + DelTree(TS_DISTRO_DIR); + CopyTree(TS_MAIN_DRV ":/TempleOS",TS_DISTRO_DIR "/TempleOS"); + CopyTree(TS_MAIN_DRV ":/Windows",TS_DISTRO_DIR "/Windows"); + CopyTree(TS_MAIN_DRV ":/Linux",TS_DISTRO_DIR "/Linux"); + MkDir(TS_DISTRO_DIR "/Temp"); + DelTree(TS_DISTRO_DIR "/TempleOS/Accts/TS"); + CopyTree(TS_MAIN_DRV ":/0000Boot",TS_DISTRO_DIR "/0000Boot"); + Del(TS_DISTRO_DIR "/0000Boot/OldMBR.BIN.C"); + Del(TS_DISTRO_DIR "/0000Boot/BootMHD2.BIN.C"); +} + +U0 MakeStdDistro() +{ + StdDistroPrep; + CDFileCreate(TS_ISO_NAME,TS_DISTRO_DIR "/*",,TS_DISTRO_DIR BOOT_DIR_KERNEL_BIN_C); + Drv(TS_MAIN_DRV_LET); } U0 MakeTSDistro() { TSDistroPrep; - CDFileCreate(TS_ISO_NAME,TS_IMG_DRV ":/*",NULL,BOOTCD_BIN_Z); - Drv(TS_MAIN_DRV_LET); -} - -U0 MakeStdDistro() -{ - StdDistroPrep(STD_DISTRO_CDROM_CFG); - CDFileCreate(TS_ISO_NAME,TS_IMG_DRV ":/*",NULL,BOOTCD_BIN_Z); + CDFileCreate(TS_ISO_NAME,TS_DISTRO_DIR "/*",,TS_DISTRO_DIR BOOT_DIR_KERNEL_BIN_C); Drv(TS_MAIN_DRV_LET); } @@ -382,6 +374,9 @@ U0 MakeWebSite() if (ts_has_bak_drv) { DocClear; Cd(TS_BAK_DRV ":/Wb"); + DelTree(TS_BAK_DRV ":/Wb/Accts/TS/TAD"); + Del(TS_BAK_DRV ":/Wb/Accts/TS/*"); + Touch(TS_BAK_DRV ":/Wb/Accts/TS/Wb2/index.TXT.Z","",,GetCurTimeDate); tempm=tempm2=FilesFind(FILENAME_MASK_TXT,FUF_RECURSE|FUF_FLATTEN_TREE|FUF_JUST_FILES); while (tempm) { TSWebFile(tempm->full_name); @@ -429,6 +424,19 @@ U0 TSUncompress() } } +U0 UpdateISODocDefines() +{ + I64 size; + size=10*FileSize(TS_BAK_DRV ":/Wb/TempleOSCD.ISO")/1024/1024; + DefinePrintF("DD_TEMPLEOSCD_SIZE", + "Download $TX+D,"TempleOS V1.03","DD_OS_NAME_VERSION"$ - Std. Distro (%0.1f MB)",0.1*size); + size=10*FileSize(TS_BAK_DRV ":/Wb/TempleOSTS.ISO")/1024/1024; + DefinePrintF("DD_TEMPLEOSTS_SIZE", + "Download $TX+D,"TempleOS V1.03","DD_OS_NAME_VERSION"$ - T.S. Company Internal Distro (%0.1f MB)",0.1*size); +} + +UpdateISODocDefines; + U0 MakeDistrosAndBackUp() { SettingsPush; //See $LK,"SettingsPush","MN:SettingsPush"$ @@ -444,12 +452,17 @@ U0 MakeDistrosAndBackUp() DelTree (TS_BAK_DRV ":/Wb"); progress4++; CopyTree(TS_MAIN_DRV ":/TempleOS",TS_BAK_DRV ":/Wb"); progress4++; DocClear; + MakeTSDistro; progress4++; DocClear; Copy(TS_ISO_NAME,TS_BAK_DRV ":/Wb/TempleOSTS.ISO"); progress4++; + MakeStdDistro; progress4++; DocClear; Copy(TS_ISO_NAME,TS_BAK_DRV ":/Wb/TempleOSCD.ISO"); progress4++; + + UpdateISODocDefines; + Cd(TS_MAIN_DRV ":/TempleOS"); if (LinkChk) throw; @@ -491,7 +504,7 @@ U0 TSPrtDsk() CATARep *root=NULL,*ata_drv=NULL,*atapi_drv=NULL; if (ts_cid==CID_DFT) {//Dangerous! don't do on my main machine ATARep(FALSE,TRUE,&root); - ATAIDDrvs(root,dft_drv,&ata_drv,&atapi_drv); + ATAIDDrvs(root,*sys_acct,&ata_drv,&atapi_drv); if (ata_drv) { XTalkWait(task,"PrtDsk;\nY%C2p%d\nYYY",TS_MAIN_DRV_LET,ata_drv->num); XTalkWait(task,"%d\nY\nY\n",(prt_dsk_dsk_size-PRT_HEADER)/2); diff --git a/TempleOS/Accts/TS/Wb2/Blog.TXT b/TempleOS/Accts/TS/Wb2/Blog.TXT deleted file mode 100644 index 534a631..0000000 --- a/TempleOS/Accts/TS/Wb2/Blog.TXT +++ /dev/null @@ -1,14 +0,0 @@ -$WW,1$$FG,5$$TX+CX+HTML,"TempleOS","http://www.templeos.org"$$FG$ - -$IV,1$----03/15/13 21:01:59----$IV,0$ -I changed the name to TempleOS because I didn't like "SparrowOS" and God seems okay with it being His official temple. - -Now, I need an icon kind of thing -- some kind of identifiable graphics. - -Whatchu think, God? - -God says... -$FG,4$gods Fathers lengthened god continuance imitated apprehend dies betters salvation hesitated orator recurring exuberance goeth settled ours beasts littles safe far unsettled Awake Offices hath muttering nourishment Run covenant whitherward family slain composing tumult inordinate foreshow honours shadows disapproveth confine hellish $FG$ - -Shadows on my cross image are off. :-) - diff --git a/TempleOS/Accts/TS/Wb2/Games.TXT b/TempleOS/Accts/TS/Wb2/Games.TXT index d83af35..6d73f62 100644 --- a/TempleOS/Accts/TS/Wb2/Games.TXT +++ b/TempleOS/Accts/TS/Wb2/Games.TXT @@ -4,6 +4,7 @@ $HC,""$ - -$TX+CX,"Pilgrim Game"$ -$LK-A,"::/TempleOS/Apps/Pilgrims/Pilgrims.CPP"$ - - - - - - - $HC,""$ $TX+CX,"Flight Sim / First Person Shooter"$ -$LK-A,"::/TempleOS/Demo/GameStarters/EagleDive.CPP"$ -$LK-A,"::/TempleOS/Demo/GameStarters/FPS.CPP"$ +$LK-A,"::/TempleOS/Demo/Games/EagleDive.CPP"$ +$LK-A,"::/TempleOS/Demo/Games/CastleFrankenstein.CPP"$ @@ -46,8 +36,8 @@ $HC,""$ -$TX+CX,"Tanks"$ -$LK-A,"::/TempleOS/Apps/Tanks/Tanks.CPP"$ +$TX+CX,"ToTheFront"$ +$LK-A,"::/TempleOS/Apps/ToTheFront/ToTheFront.CPP"$ diff --git a/TempleOS/Accts/TS/Wb2/Hymns.TXT b/TempleOS/Accts/TS/Wb2/Hymns.TXT index e1e4f98..b4b4b99 100644 --- a/TempleOS/Accts/TS/Wb2/Hymns.TXT +++ b/TempleOS/Accts/TS/Wb2/Hymns.TXT @@ -80,3 +80,4 @@ $LK+CX,"7) Completed ","FI:::/TempleOS/Apps/MusicOrgan/Examples/completed.CPP $FG,8$ * "Windows" is a trademark of MicroSoft Corp. +$FG$ \ No newline at end of file diff --git a/TempleOS/Accts/TS/Wb2/LineCnt.TXT b/TempleOS/Accts/TS/Wb2/LineCnt.TXT index d2a3b11..d68d642 100644 --- a/TempleOS/Accts/TS/Wb2/LineCnt.TXT +++ b/TempleOS/Accts/TS/Wb2/LineCnt.TXT @@ -1,246 +1,124 @@ -$WW+H,1$ 139,640 $TR,"/TempleOS/*"$ -$ID,2$ 7,040 $TR,"Accts"$ -$ID,2$ 283 $TR,"Install"$ -$ID,2$ 41 $LK,"Adam3fSys.CPP.Z","FI:D:/TempleOS/Accts/Install/Adam3fSys.CPP"$ - 242 $LK,"DoItOnce.CPP.Z","FI:D:/TempleOS/Accts/Install/DoItOnce.CPP"$ -$ID,-2$ 61 $TR,"SafeMode"$ -$ID,2$ 10 $LK,"Adam3.CPP.Z","FI:D:/TempleOS/Accts/SafeMode/Adam3.CPP"$ - 2 $LK,"Adam3cSnd.CPP.Z","FI:D:/TempleOS/Accts/SafeMode/Adam3cSnd.CPP"$ - 39 $LK,"Adam3fSys.CPP.Z","FI:D:/TempleOS/Accts/SafeMode/Adam3fSys.CPP"$ - 10 $LK,"DoItOnce.CPP.Z","FI:D:/TempleOS/Accts/SafeMode/DoItOnce.CPP"$ -$ID,-2$ 6,360 $TR,"TS"$ -$ID,2$ 5,028 $TR,"TAD"$ -$ID,2$ 822 $TR,"Archive"$ -$ID,2$ 489 $LK,"FileSysISO3.CPP.Z","FI:D:/TempleOS/Accts/TS/TAD/Archive/FileSysISO3.CPP"$ - 218 $LK,"USB.CPP.Z","FI:D:/TempleOS/Accts/TS/TAD/Archive/USB.CPP"$ - 115 $LK,"USB1a.CPP.Z","FI:D:/TempleOS/Accts/TS/TAD/Archive/USB1a.CPP"$ -$ID,-2$ 4,122 $TR,"MusicOrgan"$ -$ID,2$ 73 $LK,"abiding.CPP.Z","FI:D:/TempleOS/Accts/TS/TAD/MusicOrgan/abiding.CPP"$ - 42 $LK,"abyss.CPP.Z","FI:D:/TempleOS/Accts/TS/TAD/MusicOrgan/abyss.CPP"$ - 23 $LK,"almighty.CPP.Z","FI:D:/TempleOS/Accts/TS/TAD/MusicOrgan/almighty.CPP"$ - 23 $LK,"appreciate.CPP.Z","FI:D:/TempleOS/Accts/TS/TAD/MusicOrgan/appreciate.CPP"$ - 75 $LK,"awake.CPP.Z","FI:D:/TempleOS/Accts/TS/TAD/MusicOrgan/awake.CPP"$ - 63 $LK,"battlehymnsolo.CPP.Z","FI:D:/TempleOS/Accts/TS/TAD/MusicOrgan/battlehymnsolo.CPP"$ - 47 $LK,"bedewed.CPP.Z","FI:D:/TempleOS/Accts/TS/TAD/MusicOrgan/bedewed.CPP"$ - 49 $LK,"blinded.CPP.Z","FI:D:/TempleOS/Accts/TS/TAD/MusicOrgan/blinded.CPP"$ - 55 $LK,"born.CPP.Z","FI:D:/TempleOS/Accts/TS/TAD/MusicOrgan/born.CPP"$ - 23 $LK,"childish.CPP.Z","FI:D:/TempleOS/Accts/TS/TAD/MusicOrgan/childish.CPP"$ - 25 $LK,"compassions.CPP.Z","FI:D:/TempleOS/Accts/TS/TAD/MusicOrgan/compassions.CPP"$ - 41 $LK,"completed.CPP.Z","FI:D:/TempleOS/Accts/TS/TAD/MusicOrgan/completed.CPP"$ - 31 $LK,"cosam.CPP.Z","FI:D:/TempleOS/Accts/TS/TAD/MusicOrgan/cosam.CPP"$ - 30 $LK,"depending.CPP.Z","FI:D:/TempleOS/Accts/TS/TAD/MusicOrgan/depending.CPP"$ - 25 $LK,"despairing.CPP.Z","FI:D:/TempleOS/Accts/TS/TAD/MusicOrgan/despairing.CPP"$ - 21 $LK,"determination.CPP.Z","FI:D:/TempleOS/Accts/TS/TAD/MusicOrgan/determination.CPP"$ - 69 $LK,"dialogue.CPP.Z","FI:D:/TempleOS/Accts/TS/TAD/MusicOrgan/dialogue.CPP"$ - 27 $LK,"disputing.CPP.Z","FI:D:/TempleOS/Accts/TS/TAD/MusicOrgan/disputing.CPP"$ - 65 $LK,"doing.CPP.Z","FI:D:/TempleOS/Accts/TS/TAD/MusicOrgan/doing.CPP"$ - 17 $LK,"downfall.CPP.Z","FI:D:/TempleOS/Accts/TS/TAD/MusicOrgan/downfall.CPP"$ - 25 $LK,"dream.CPP.Z","FI:D:/TempleOS/Accts/TS/TAD/MusicOrgan/dream.CPP"$ - 21 $LK,"efforts.CPP.Z","FI:D:/TempleOS/Accts/TS/TAD/MusicOrgan/efforts.CPP"$ - 97 $LK,"elijah.CPP.Z","FI:D:/TempleOS/Accts/TS/TAD/MusicOrgan/elijah.CPP"$ - 23 $LK,"environeth.CPP.Z","FI:D:/TempleOS/Accts/TS/TAD/MusicOrgan/environeth.CPP"$ - 40 $LK,"epicurus.CPP.Z","FI:D:/TempleOS/Accts/TS/TAD/MusicOrgan/epicurus.CPP"$ - 40 $LK,"exalt.CPP.Z","FI:D:/TempleOS/Accts/TS/TAD/MusicOrgan/exalt.CPP"$ - 63 $LK,"exiled.CPP.Z","FI:D:/TempleOS/Accts/TS/TAD/MusicOrgan/exiled.CPP"$ - 21 $LK,"exodus.CPP.Z","FI:D:/TempleOS/Accts/TS/TAD/MusicOrgan/exodus.CPP"$ - 45 $LK,"expedition.CPP.Z","FI:D:/TempleOS/Accts/TS/TAD/MusicOrgan/expedition.CPP"$ - 35 $LK,"fairness.CPP.Z","FI:D:/TempleOS/Accts/TS/TAD/MusicOrgan/fairness.CPP"$ - 26 $LK,"feigned.CPP.Z","FI:D:/TempleOS/Accts/TS/TAD/MusicOrgan/feigned.CPP"$ - 68 $LK,"finger.CPP.Z","FI:D:/TempleOS/Accts/TS/TAD/MusicOrgan/finger.CPP"$ - 51 $LK,"first.CPP.Z","FI:D:/TempleOS/Accts/TS/TAD/MusicOrgan/first.CPP"$ - 57 $LK,"fishermen.CPP.Z","FI:D:/TempleOS/Accts/TS/TAD/MusicOrgan/fishermen.CPP"$ - 21 $LK,"fixing.CPP.Z","FI:D:/TempleOS/Accts/TS/TAD/MusicOrgan/fixing.CPP"$ - 21 $LK,"flung.CPP.Z","FI:D:/TempleOS/Accts/TS/TAD/MusicOrgan/flung.CPP"$ - 59 $LK,"fog.CPP.Z","FI:D:/TempleOS/Accts/TS/TAD/MusicOrgan/fog.CPP"$ - 37 $LK,"forasmuch.CPP.Z","FI:D:/TempleOS/Accts/TS/TAD/MusicOrgan/forasmuch.CPP"$ - 25 $LK,"freaks.CPP.Z","FI:D:/TempleOS/Accts/TS/TAD/MusicOrgan/freaks.CPP"$ - 153 $LK,"free.CPP.Z","FI:D:/TempleOS/Accts/TS/TAD/MusicOrgan/free.CPP"$ - 75 $LK,"furnishing.CPP.Z","FI:D:/TempleOS/Accts/TS/TAD/MusicOrgan/furnishing.CPP"$ - 52 $LK,"good.CPP.Z","FI:D:/TempleOS/Accts/TS/TAD/MusicOrgan/good.CPP"$ - 59 $LK,"gutenberg.CPP.Z","FI:D:/TempleOS/Accts/TS/TAD/MusicOrgan/gutenberg.CPP"$ - 57 $LK,"happy.CPP.Z","FI:D:/TempleOS/Accts/TS/TAD/MusicOrgan/happy.CPP"$ - 21 $LK,"honestly.CPP.Z","FI:D:/TempleOS/Accts/TS/TAD/MusicOrgan/honestly.CPP"$ - 55 $LK,"hope.CPP.Z","FI:D:/TempleOS/Accts/TS/TAD/MusicOrgan/hope.CPP"$ - 33 $LK,"image.CPP.Z","FI:D:/TempleOS/Accts/TS/TAD/MusicOrgan/image.CPP"$ - 46 $LK,"josh.CPP.Z","FI:D:/TempleOS/Accts/TS/TAD/MusicOrgan/josh.CPP"$ - 49 $LK,"keeping.CPP.Z","FI:D:/TempleOS/Accts/TS/TAD/MusicOrgan/keeping.CPP"$ - 31 $LK,"kept.CPP.Z","FI:D:/TempleOS/Accts/TS/TAD/MusicOrgan/kept.CPP"$ - 56 $LK,"limit.CPP.Z","FI:D:/TempleOS/Accts/TS/TAD/MusicOrgan/limit.CPP"$ - 60 $LK,"mary.CPP.Z","FI:D:/TempleOS/Accts/TS/TAD/MusicOrgan/mary.CPP"$ - 53 $LK,"mightest.CPP.Z","FI:D:/TempleOS/Accts/TS/TAD/MusicOrgan/mightest.CPP"$ - 78 $LK,"mildly.CPP.Z","FI:D:/TempleOS/Accts/TS/TAD/MusicOrgan/mildly.CPP"$ - 21 $LK,"myrrh.CPP.Z","FI:D:/TempleOS/Accts/TS/TAD/MusicOrgan/myrrh.CPP"$ - 24 $LK,"nay.CPP.Z","FI:D:/TempleOS/Accts/TS/TAD/MusicOrgan/nay.CPP"$ - 80 $LK,"night.CPP.Z","FI:D:/TempleOS/Accts/TS/TAD/MusicOrgan/night.CPP"$ - 21 $LK,"o.CPP.Z","FI:D:/TempleOS/Accts/TS/TAD/MusicOrgan/o.CPP"$ - 37 $LK,"partake.CPP.Z","FI:D:/TempleOS/Accts/TS/TAD/MusicOrgan/partake.CPP"$ - 21 $LK,"permitted.CPP.Z","FI:D:/TempleOS/Accts/TS/TAD/MusicOrgan/permitted.CPP"$ - 23 $LK,"personal.CPP.Z","FI:D:/TempleOS/Accts/TS/TAD/MusicOrgan/personal.CPP"$ - 21 $LK,"population.CPP.Z","FI:D:/TempleOS/Accts/TS/TAD/MusicOrgan/population.CPP"$ - 17 $LK,"proponent.CPP.Z","FI:D:/TempleOS/Accts/TS/TAD/MusicOrgan/proponent.CPP"$ - 55 $LK,"prosper.CPP.Z","FI:D:/TempleOS/Accts/TS/TAD/MusicOrgan/prosper.CPP"$ - 26 $LK,"psalm.CPP.Z","FI:D:/TempleOS/Accts/TS/TAD/MusicOrgan/psalm.CPP"$ - 37 $LK,"purpose.CPP.Z","FI:D:/TempleOS/Accts/TS/TAD/MusicOrgan/purpose.CPP"$ - 23 $LK,"reasoning.CPP.Z","FI:D:/TempleOS/Accts/TS/TAD/MusicOrgan/reasoning.CPP"$ - 37 $LK,"reliance.CPP.Z","FI:D:/TempleOS/Accts/TS/TAD/MusicOrgan/reliance.CPP"$ - 25 $LK,"reposes.CPP.Z","FI:D:/TempleOS/Accts/TS/TAD/MusicOrgan/reposes.CPP"$ - 30 $LK,"restless.CPP.Z","FI:D:/TempleOS/Accts/TS/TAD/MusicOrgan/restless.CPP"$ - 22 $LK,"rifled.CPP.Z","FI:D:/TempleOS/Accts/TS/TAD/MusicOrgan/rifled.CPP"$ - 90 $LK,"risen.CPP.Z","FI:D:/TempleOS/Accts/TS/TAD/MusicOrgan/risen.CPP"$ - 101 $LK,"satisfaction.CPP.Z","FI:D:/TempleOS/Accts/TS/TAD/MusicOrgan/satisfaction.CPP"$ - 36 $LK,"scriptures.CPP.Z","FI:D:/TempleOS/Accts/TS/TAD/MusicOrgan/scriptures.CPP"$ - 33 $LK,"service.CPP.Z","FI:D:/TempleOS/Accts/TS/TAD/MusicOrgan/service.CPP"$ - 53 $LK,"shield.CPP.Z","FI:D:/TempleOS/Accts/TS/TAD/MusicOrgan/shield.CPP"$ - 32 $LK,"signifies.CPP.Z","FI:D:/TempleOS/Accts/TS/TAD/MusicOrgan/signifies.CPP"$ - 26 $LK,"silver.CPP.Z","FI:D:/TempleOS/Accts/TS/TAD/MusicOrgan/silver.CPP"$ - 93 $LK,"small.CPP.Z","FI:D:/TempleOS/Accts/TS/TAD/MusicOrgan/small.CPP"$ - 44 $LK,"struggles.CPP.Z","FI:D:/TempleOS/Accts/TS/TAD/MusicOrgan/struggles.CPP"$ - 46 $LK,"sustain.CPP.Z","FI:D:/TempleOS/Accts/TS/TAD/MusicOrgan/sustain.CPP"$ - 33 $LK,"teachings.CPP.Z","FI:D:/TempleOS/Accts/TS/TAD/MusicOrgan/teachings.CPP"$ - 74 $LK,"thereupon.CPP.Z","FI:D:/TempleOS/Accts/TS/TAD/MusicOrgan/thereupon.CPP"$ - 25 $LK,"thither.CPP.Z","FI:D:/TempleOS/Accts/TS/TAD/MusicOrgan/thither.CPP"$ - 26 $LK,"twins.CPP.Z","FI:D:/TempleOS/Accts/TS/TAD/MusicOrgan/twins.CPP"$ - 41 $LK,"valued.CPP.Z","FI:D:/TempleOS/Accts/TS/TAD/MusicOrgan/valued.CPP"$ - 67 $LK,"vengeance.CPP.Z","FI:D:/TempleOS/Accts/TS/TAD/MusicOrgan/vengeance.CPP"$ - 61 $LK,"verses.CPP.Z","FI:D:/TempleOS/Accts/TS/TAD/MusicOrgan/verses.CPP"$ - 23 $LK,"villa.CPP.Z","FI:D:/TempleOS/Accts/TS/TAD/MusicOrgan/villa.CPP"$ - 51 $LK,"wisdom.CPP.Z","FI:D:/TempleOS/Accts/TS/TAD/MusicOrgan/wisdom.CPP"$ - 33 $LK,"witherto.CPP.Z","FI:D:/TempleOS/Accts/TS/TAD/MusicOrgan/witherto.CPP"$ - 23 $LK,"worship.CPP.Z","FI:D:/TempleOS/Accts/TS/TAD/MusicOrgan/worship.CPP"$ - 21 $LK,"yesterday.CPP.Z","FI:D:/TempleOS/Accts/TS/TAD/MusicOrgan/yesterday.CPP"$ - 27 $LK,"you.CPP.Z","FI:D:/TempleOS/Accts/TS/TAD/MusicOrgan/you.CPP"$ - 66 $LK,"zip.CPP.Z","FI:D:/TempleOS/Accts/TS/TAD/MusicOrgan/zip.CPP"$ -$ID,-2$ 21 $LK,"Adam3aLocalize.CPP.Z","FI:D:/TempleOS/Accts/TS/TAD/Adam3aLocalize.CPP"$ - 55 $LK,"MakeDistro.CPP.Z","FI:D:/TempleOS/Accts/TS/TAD/MakeDistro.CPP"$ - 5 $LK,"Registry.CPP.Z","FI:D:/TempleOS/Accts/TS/TAD/Registry.CPP"$ - 3 $LK,"Test.CPP.Z","FI:D:/TempleOS/Accts/TS/TAD/Test.CPP"$ -$ID,-2$ 0 $TR,"Wb2"$ -$ID,2$$ID,-2$ 14 $LK,"Adam3.CPP.Z","FI:D:/TempleOS/Accts/TS/Adam3.CPP"$ - 10 $LK,"Adam3bPkgs.CPP.Z","FI:D:/TempleOS/Accts/TS/Adam3bPkgs.CPP"$ - 267 $LK,"Adam3dKeyPlugIns.CPP.Z","FI:D:/TempleOS/Accts/TS/Adam3dKeyPlugIns.CPP"$ - 10 $LK,"Adam3eWrappers.CPP.Z","FI:D:/TempleOS/Accts/TS/Adam3eWrappers.CPP"$ - 61 $LK,"Adam3fSys.CPP.Z","FI:D:/TempleOS/Accts/TS/Adam3fSys.CPP"$ - 13 $LK,"DoItOnce.CPP.Z","FI:D:/TempleOS/Accts/TS/DoItOnce.CPP"$ - 437 $LK,"TSAdam.CPP.Z","FI:D:/TempleOS/Accts/TS/TSAdam.CPP"$ - 520 $LK,"TSDistro.CPP.Z","FI:D:/TempleOS/Accts/TS/TSDistro.CPP"$ +$WW+H,1$ 122,808 $TR,"/TempleOS/*"$ +$ID,2$ 613 $TR,"Accts"$ +$ID,2$ 290 $TR,"Install"$ +$ID,2$ 40 $LK,"Adam3fSys.CPP.Z","FI:D:/TempleOS/Accts/Install/Adam3fSys.CPP"$ + 250 $LK,"DoItOnce.CPP.Z","FI:D:/TempleOS/Accts/Install/DoItOnce.CPP"$ $ID,-2$ 0 $TR,"User"$ -$ID,2$$ID,-2$ 10 $LK,"Adam3.CPP.Z","FI:D:/TempleOS/Accts/Adam3.CPP"$ - 22 $LK,"Adam3aLocalize.CPP.Z","FI:D:/TempleOS/Accts/Adam3aLocalize.CPP"$ - 25 $LK,"Adam3bPkgs.CPP.Z","FI:D:/TempleOS/Accts/Adam3bPkgs.CPP"$ - 11 $LK,"Adam3cSnd.CPP.Z","FI:D:/TempleOS/Accts/Adam3cSnd.CPP"$ +$ID,2$$ID,-2$ 9 $LK,"Adam3.CPP.Z","FI:D:/TempleOS/Accts/Adam3.CPP"$ + 20 $LK,"Adam3aLocalize.CPP.Z","FI:D:/TempleOS/Accts/Adam3aLocalize.CPP"$ + 26 $LK,"Adam3bPkgs.CPP.Z","FI:D:/TempleOS/Accts/Adam3bPkgs.CPP"$ 180 $LK,"Adam3dKeyPlugIns.CPP.Z","FI:D:/TempleOS/Accts/Adam3dKeyPlugIns.CPP"$ 28 $LK,"Adam3eWrappers.CPP.Z","FI:D:/TempleOS/Accts/Adam3eWrappers.CPP"$ 43 $LK,"Adam3fSys.CPP.Z","FI:D:/TempleOS/Accts/Adam3fSys.CPP"$ 17 $LK,"DoItOnce.CPP.Z","FI:D:/TempleOS/Accts/DoItOnce.CPP"$ -$ID,-2$ 39,271 $TR,"Adam"$ -$ID,2$ 862 $TR,"Boot"$ -$ID,2$ 158 $LK,"BootCD.CPP.Z","FI:D:/TempleOS/Adam/Boot/BootCD.CPP"$ - 93 $LK,"BootHD.CPP.Z","FI:D:/TempleOS/Adam/Boot/BootHD.CPP"$ - 106 $LK,"BootMHD.CPP.Z","FI:D:/TempleOS/Adam/Boot/BootMHD.CPP"$ - 120 $LK,"BootMHD2.CPP.Z","FI:D:/TempleOS/Adam/Boot/BootMHD2.CPP"$ - 385 $LK,"InsBoot.CPP.Z","FI:D:/TempleOS/Adam/Boot/InsBoot.CPP"$ +$ID,-2$ 37,180 $TR,"Adam"$ +$ID,2$ 1,382 $TR,"Boot"$ +$ID,2$ 159 $LK,"BootCD.CPP.Z","FI:D:/TempleOS/Adam/Boot/BootCD.CPP"$ + 95 $LK,"BootHD.CPP.Z","FI:D:/TempleOS/Adam/Boot/BootHD.CPP"$ + 107 $LK,"BootMHD.CPP.Z","FI:D:/TempleOS/Adam/Boot/BootMHD.CPP"$ + 121 $LK,"BootMHD2.CPP.Z","FI:D:/TempleOS/Adam/Boot/BootMHD2.CPP"$ + 536 $LK,"DskCDDVD.CPP.Z","FI:D:/TempleOS/Adam/Boot/DskCDDVD.CPP"$ + 364 $LK,"InsBoot.CPP.Z","FI:D:/TempleOS/Adam/Boot/InsBoot.CPP"$ $ID,-2$ 716 $TR,"Ctrls"$ $ID,2$ 9 $LK,"Ctrls.CPP.Z","FI:D:/TempleOS/Adam/Ctrls/Ctrls.CPP"$ 394 $LK,"Ctrls2a.CPP.Z","FI:D:/TempleOS/Adam/Ctrls/Ctrls2a.CPP"$ 95 $LK,"CtrlsButton.CPP.Z","FI:D:/TempleOS/Adam/Ctrls/CtrlsButton.CPP"$ 218 $LK,"CtrlsSlider.CPP.Z","FI:D:/TempleOS/Adam/Ctrls/CtrlsSlider.CPP"$ -$ID,-2$ 11,855 $TR,"Doc"$ -$ID,2$ 101 $LK,"Doc.CPP.Z","FI:D:/TempleOS/Adam/Doc/Doc.CPP"$ +$ID,-2$ 11,727 $TR,"Doc"$ +$ID,2$ 100 $LK,"Doc.CPP.Z","FI:D:/TempleOS/Adam/Doc/Doc.CPP"$ 193 $LK,"DocBible.CPP.Z","FI:D:/TempleOS/Adam/Doc/DocBible.CPP"$ - 429 $LK,"DocCodeTools.CPP.Z","FI:D:/TempleOS/Adam/Doc/DocCodeTools.CPP"$ - 1,186 $LK,"DocCtrlL.CPP.Z","FI:D:/TempleOS/Adam/Doc/DocCtrlL.CPP"$ - 2,484 $LK,"DocEd.CPP.Z","FI:D:/TempleOS/Adam/Doc/DocEd.CPP"$ - 456 $LK,"DocFile.CPP.Z","FI:D:/TempleOS/Adam/Doc/DocFile.CPP"$ + 576 $LK,"DocCodeTools.CPP.Z","FI:D:/TempleOS/Adam/Doc/DocCodeTools.CPP"$ + 1,190 $LK,"DocCtrlL.CPP.Z","FI:D:/TempleOS/Adam/Doc/DocCtrlL.CPP"$ + 2,491 $LK,"DocEd.CPP.Z","FI:D:/TempleOS/Adam/Doc/DocEd.CPP"$ + 466 $LK,"DocFile.CPP.Z","FI:D:/TempleOS/Adam/Doc/DocFile.CPP"$ 386 $LK,"DocHighlight.CPP.Z","FI:D:/TempleOS/Adam/Doc/DocHighlight.CPP"$ 507 $LK,"DocIDE.CPP.Z","FI:D:/TempleOS/Adam/Doc/DocIDE.CPP"$ 220 $LK,"DocMacro.CPP.Z","FI:D:/TempleOS/Adam/Doc/DocMacro.CPP"$ - 691 $LK,"DocMain.CPP.Z","FI:D:/TempleOS/Adam/Doc/DocMain.CPP"$ - 909 $LK,"DocNew.CPP.Z","FI:D:/TempleOS/Adam/Doc/DocNew.CPP"$ - 116 $LK,"DocOpt.CPP.Z","FI:D:/TempleOS/Adam/Doc/DocOpt.CPP"$ - 1,277 $LK,"DocPlain.CPP.Z","FI:D:/TempleOS/Adam/Doc/DocPlain.CPP"$ - 880 $LK,"DocPopUp.CPP.Z","FI:D:/TempleOS/Adam/Doc/DocPopUp.CPP"$ - 1,844 $LK,"DocRecalc.CPP.Z","FI:D:/TempleOS/Adam/Doc/DocRecalc.CPP"$ + 693 $LK,"DocMain.CPP.Z","FI:D:/TempleOS/Adam/Doc/DocMain.CPP"$ + 839 $LK,"DocNew.CPP.Z","FI:D:/TempleOS/Adam/Doc/DocNew.CPP"$ + 117 $LK,"DocOpt.CPP.Z","FI:D:/TempleOS/Adam/Doc/DocOpt.CPP"$ + 1,154 $LK,"DocPlain.CPP.Z","FI:D:/TempleOS/Adam/Doc/DocPlain.CPP"$ + 917 $LK,"DocPopUp.CPP.Z","FI:D:/TempleOS/Adam/Doc/DocPopUp.CPP"$ + 1,702 $LK,"DocRecalc.CPP.Z","FI:D:/TempleOS/Adam/Doc/DocRecalc.CPP"$ 176 $LK,"DocTree.CPP.Z","FI:D:/TempleOS/Adam/Doc/DocTree.CPP"$ -$ID,-2$ 2,396 $TR,"Dsk"$ +$ID,-2$ 1,839 $TR,"Dsk"$ $ID,2$ 233 $LK,"ChkDsk.CPP.Z","FI:D:/TempleOS/Adam/Dsk/ChkDsk.CPP"$ - 6 $LK,"Dsk2.CPP.Z","FI:D:/TempleOS/Adam/Dsk/Dsk2.CPP"$ - 430 $LK,"Dsk2a.CPP.Z","FI:D:/TempleOS/Adam/Dsk/Dsk2a.CPP"$ - 411 $LK,"Dsk2b.CPP.Z","FI:D:/TempleOS/Adam/Dsk/Dsk2b.CPP"$ - 550 $LK,"DskCDDVD.CPP.Z","FI:D:/TempleOS/Adam/Dsk/DskCDDVD.CPP"$ + 5 $LK,"Dsk2.CPP.Z","FI:D:/TempleOS/Adam/Dsk/Dsk2.CPP"$ + 422 $LK,"Dsk2a.CPP.Z","FI:D:/TempleOS/Adam/Dsk/Dsk2a.CPP"$ + 413 $LK,"Dsk2b.CPP.Z","FI:D:/TempleOS/Adam/Dsk/Dsk2b.CPP"$ 766 $LK,"FileMgr.CPP.Z","FI:D:/TempleOS/Adam/Dsk/FileMgr.CPP"$ -$ID,-2$ 12,240 $TR,"Gr"$ -$ID,2$ 604 $LK,"CSpriteBitMap.CPP.Z","FI:D:/TempleOS/Adam/Gr/CSpriteBitMap.CPP"$ - 1,220 $LK,"CSpriteEd.CPP.Z","FI:D:/TempleOS/Adam/Gr/CSpriteEd.CPP"$ - 1,384 $LK,"CSpriteMesh.CPP.Z","FI:D:/TempleOS/Adam/Gr/CSpriteMesh.CPP"$ +$ID,-2$ 12,015 $TR,"Gr"$ +$ID,2$ 682 $LK,"CSpriteBitMap.CPP.Z","FI:D:/TempleOS/Adam/Gr/CSpriteBitMap.CPP"$ + 1,269 $LK,"CSpriteEd.CPP.Z","FI:D:/TempleOS/Adam/Gr/CSpriteEd.CPP"$ + 1,234 $LK,"CSpriteMain.CPP.Z","FI:D:/TempleOS/Adam/Gr/CSpriteMain.CPP"$ + 1,383 $LK,"CSpriteMesh.CPP.Z","FI:D:/TempleOS/Adam/Gr/CSpriteMesh.CPP"$ 236 $LK,"CSpriteNew.CPP.Z","FI:D:/TempleOS/Adam/Gr/CSpriteNew.CPP"$ - 1,282 $LK,"CSpriteVect.CPP.Z","FI:D:/TempleOS/Adam/Gr/CSpriteVect.CPP"$ - 130 $LK,"Gr.CPP.Z","FI:D:/TempleOS/Adam/Gr/Gr.CPP"$ + 127 $LK,"Gr.CPP.Z","FI:D:/TempleOS/Adam/Gr/Gr.CPP"$ 766 $LK,"GrAsm.CPP.Z","FI:D:/TempleOS/Adam/Gr/GrAsm.CPP"$ - 1,682 $LK,"GrBitMap.CPP.Z","FI:D:/TempleOS/Adam/Gr/GrBitMap.CPP"$ + 1,730 $LK,"GrBitMap.CPP.Z","FI:D:/TempleOS/Adam/Gr/GrBitMap.CPP"$ 11 $LK,"GrCfg.CPP.Z","FI:D:/TempleOS/Adam/Gr/GrCfg.CPP"$ 107 $LK,"GrChar.CPP.Z","FI:D:/TempleOS/Adam/Gr/GrChar.CPP"$ - 181 $LK,"GrComposites.CPP.Z","FI:D:/TempleOS/Adam/Gr/GrComposites.CPP"$ + 184 $LK,"GrComposites.CPP.Z","FI:D:/TempleOS/Adam/Gr/GrComposites.CPP"$ 305 $LK,"GrDC.CPP.Z","FI:D:/TempleOS/Adam/Gr/GrDC.CPP"$ - 1,469 $LK,"GrPrimatives.CPP.Z","FI:D:/TempleOS/Adam/Gr/GrPrimatives.CPP"$ - 786 $LK,"GrScreen.CPP.Z","FI:D:/TempleOS/Adam/Gr/GrScreen.CPP"$ - 527 $LK,"GrSpritePlot.CPP.Z","FI:D:/TempleOS/Adam/Gr/GrSpritePlot.CPP"$ - 487 $LK,"GrVectMap.CPP.Z","FI:D:/TempleOS/Adam/Gr/GrVectMap.CPP"$ - 1,063 $LK,"MathGr.CPP.Z","FI:D:/TempleOS/Adam/Gr/MathGr.CPP"$ -$ID,-2$ 2,258 $TR,"Snd"$ -$ID,2$ 652 $LK,"HDAudio.CPP.Z","FI:D:/TempleOS/Adam/Snd/HDAudio.CPP"$ - 639 $LK,"HDCfg.CPP.Z","FI:D:/TempleOS/Adam/Snd/HDCfg.CPP"$ - 254 $LK,"MathAudio.CPP.Z","FI:D:/TempleOS/Adam/Snd/MathAudio.CPP"$ - 261 $LK,"Music.CPP.Z","FI:D:/TempleOS/Adam/Snd/Music.CPP"$ - 67 $LK,"Snd.CPP.Z","FI:D:/TempleOS/Adam/Snd/Snd.CPP"$ - 69 $LK,"SndEffects.CPP.Z","FI:D:/TempleOS/Adam/Snd/SndEffects.CPP"$ - 316 $LK,"SndFile.CPP.Z","FI:D:/TempleOS/Adam/Snd/SndFile.CPP"$ -$ID,-2$ 1,343 $TR,"WordStat"$ + 1,513 $LK,"GrPrimatives.CPP.Z","FI:D:/TempleOS/Adam/Gr/GrPrimatives.CPP"$ + 796 $LK,"GrScreen.CPP.Z","FI:D:/TempleOS/Adam/Gr/GrScreen.CPP"$ + 525 $LK,"GrSpritePlot.CPP.Z","FI:D:/TempleOS/Adam/Gr/GrSpritePlot.CPP"$ + 1,147 $LK,"MathGr.CPP.Z","FI:D:/TempleOS/Adam/Gr/MathGr.CPP"$ +$ID,-2$ 680 $TR,"Snd"$ +$ID,2$ 235 $LK,"MathAudio.CPP.Z","FI:D:/TempleOS/Adam/Snd/MathAudio.CPP"$ + 225 $LK,"Music.CPP.Z","FI:D:/TempleOS/Adam/Snd/Music.CPP"$ + 22 $LK,"Snd.CPP.Z","FI:D:/TempleOS/Adam/Snd/Snd.CPP"$ + 75 $LK,"SndEffects.CPP.Z","FI:D:/TempleOS/Adam/Snd/SndEffects.CPP"$ + 123 $LK,"SndFile.CPP.Z","FI:D:/TempleOS/Adam/Snd/SndFile.CPP"$ +$ID,-2$ 2,405 $TR,"Utils"$ +$ID,2$ 84 $LK,"BinRep.CPP.Z","FI:D:/TempleOS/Adam/Utils/BinRep.CPP"$ + 304 $LK,"Diff.CPP.Z","FI:D:/TempleOS/Adam/Utils/Diff.CPP"$ + 288 $LK,"FileBMP.CPP.Z","FI:D:/TempleOS/Adam/Utils/FileBMP.CPP"$ + 267 $LK,"Grep.CPP.Z","FI:D:/TempleOS/Adam/Utils/Grep.CPP"$ + 160 $LK,"HeapLog.CPP.Z","FI:D:/TempleOS/Adam/Utils/HeapLog.CPP"$ + 114 $LK,"LineCnt.CPP.Z","FI:D:/TempleOS/Adam/Utils/LineCnt.CPP"$ + 75 $LK,"LinkChk.CPP.Z","FI:D:/TempleOS/Adam/Utils/LinkChk.CPP"$ + 246 $LK,"MemRep.CPP.Z","FI:D:/TempleOS/Adam/Utils/MemRep.CPP"$ + 92 $LK,"Merge.CPP.Z","FI:D:/TempleOS/Adam/Utils/Merge.CPP"$ + 201 $LK,"Profiler.CPP.Z","FI:D:/TempleOS/Adam/Utils/Profiler.CPP"$ + 70 $LK,"S2T.CPP.Z","FI:D:/TempleOS/Adam/Utils/S2T.CPP"$ + 354 $LK,"ToHtml.CPP.Z","FI:D:/TempleOS/Adam/Utils/ToHtml.CPP"$ + 150 $LK,"ToTXT.CPP.Z","FI:D:/TempleOS/Adam/Utils/ToTXT.CPP"$ +$ID,-2$ 1,341 $TR,"WordStat"$ $ID,2$ 307 $LK,"WSDict.CPP.Z","FI:D:/TempleOS/Adam/WordStat/WSDict.CPP"$ 220 $LK,"WSDictGen.CPP.Z","FI:D:/TempleOS/Adam/WordStat/WSDictGen.CPP"$ - 722 $LK,"WSMain.CPP.Z","FI:D:/TempleOS/Adam/WordStat/WSMain.CPP"$ + 720 $LK,"WSMain.CPP.Z","FI:D:/TempleOS/Adam/WordStat/WSMain.CPP"$ 94 $LK,"WordStat.CPP.Z","FI:D:/TempleOS/Adam/WordStat/WordStat.CPP"$ -$ID,-2$ 72 $LK,"Adam2.CPP.Z","FI:D:/TempleOS/Adam/Adam2.CPP"$ - 139 $LK,"AutoFile2a.CPP.Z","FI:D:/TempleOS/Adam/AutoFile2a.CPP"$ - 84 $LK,"BinRep.CPP.Z","FI:D:/TempleOS/Adam/BinRep.CPP"$ - 256 $LK,"Dbg2a.CPP.Z","FI:D:/TempleOS/Adam/Dbg2a.CPP"$ - 218 $LK,"DevInfo.CPP.Z","FI:D:/TempleOS/Adam/DevInfo.CPP"$ - 298 $LK,"Diff.CPP.Z","FI:D:/TempleOS/Adam/Diff.CPP"$ - 56 $LK,"DocDefines.CPP.Z","FI:D:/TempleOS/Adam/DocDefines.CPP"$ - 288 $LK,"FileBMP.CPP.Z","FI:D:/TempleOS/Adam/FileBMP.CPP"$ - 262 $LK,"Grep.CPP.Z","FI:D:/TempleOS/Adam/Grep.CPP"$ - 547 $LK,"Hash2a.CPP.Z","FI:D:/TempleOS/Adam/Hash2a.CPP"$ - 160 $LK,"HeapLog.CPP.Z","FI:D:/TempleOS/Adam/HeapLog.CPP"$ - 114 $LK,"LineCnt.CPP.Z","FI:D:/TempleOS/Adam/LineCnt.CPP"$ - 76 $LK,"LinkChk.CPP.Z","FI:D:/TempleOS/Adam/LinkChk.CPP"$ - 169 $LK,"LogIn.CPP.Z","FI:D:/TempleOS/Adam/LogIn.CPP"$ +$ID,-2$ 71 $LK,"Adam2.CPP.Z","FI:D:/TempleOS/Adam/Adam2.CPP"$ + 140 $LK,"AutoFile2a.CPP.Z","FI:D:/TempleOS/Adam/AutoFile2a.CPP"$ + 253 $LK,"Dbg2a.CPP.Z","FI:D:/TempleOS/Adam/Dbg2a.CPP"$ + 210 $LK,"DevInfo.CPP.Z","FI:D:/TempleOS/Adam/DevInfo.CPP"$ + 62 $LK,"DocDefines.CPP.Z","FI:D:/TempleOS/Adam/DocDefines.CPP"$ + 496 $LK,"Hash2a.CPP.Z","FI:D:/TempleOS/Adam/Hash2a.CPP"$ + 162 $LK,"LogIn.CPP.Z","FI:D:/TempleOS/Adam/LogIn.CPP"$ 139 $LK,"Math2a.CPP.Z","FI:D:/TempleOS/Adam/Math2a.CPP"$ 636 $LK,"MathODE.CPP.Z","FI:D:/TempleOS/Adam/MathODE.CPP"$ - 241 $LK,"MemRep.CPP.Z","FI:D:/TempleOS/Adam/MemRep.CPP"$ - 242 $LK,"Menu.CPP.Z","FI:D:/TempleOS/Adam/Menu.CPP"$ - 92 $LK,"Merge.CPP.Z","FI:D:/TempleOS/Adam/Merge.CPP"$ - 201 $LK,"Profiler.CPP.Z","FI:D:/TempleOS/Adam/Profiler.CPP"$ - 70 $LK,"S2T.CPP.Z","FI:D:/TempleOS/Adam/S2T.CPP"$ - 28 $LK,"Start.CPP.Z","FI:D:/TempleOS/Adam/Start.CPP"$ - 122 $LK,"TaskSettings.CPP.Z","FI:D:/TempleOS/Adam/TaskSettings.CPP"$ - 349 $LK,"ToHtml.CPP.Z","FI:D:/TempleOS/Adam/ToHtml.CPP"$ - 150 $LK,"ToTXT.CPP.Z","FI:D:/TempleOS/Adam/ToTXT.CPP"$ + 250 $LK,"Menu.CPP.Z","FI:D:/TempleOS/Adam/Menu.CPP"$ + 14 $LK,"Start.CPP.Z","FI:D:/TempleOS/Adam/Start.CPP"$ + 130 $LK,"TaskSettings.CPP.Z","FI:D:/TempleOS/Adam/TaskSettings.CPP"$ 243 $LK,"Training.CPP.Z","FI:D:/TempleOS/Adam/Training.CPP"$ 444 $LK,"Utils2a.CPP.Z","FI:D:/TempleOS/Adam/Utils2a.CPP"$ - 246 $LK,"WallPaper.CPP.Z","FI:D:/TempleOS/Adam/WallPaper.CPP"$ - 1,549 $LK,"Window.CPP.Z","FI:D:/TempleOS/Adam/Window.CPP"$ - 110 $LK,"AdamExt.HPP.Z","FI:D:/TempleOS/Adam/AdamExt.HPP"$ -$ID,-2$ 15,857 $TR,"Apps"$ -$ID,2$ 1,126 $TR,"AfterEgypt"$ + 212 $LK,"WallPaper.CPP.Z","FI:D:/TempleOS/Adam/WallPaper.CPP"$ + 1,500 $LK,"Window.CPP.Z","FI:D:/TempleOS/Adam/Window.CPP"$ + 113 $LK,"AdamExt.HPP.Z","FI:D:/TempleOS/Adam/AdamExt.HPP"$ +$ID,-2$ 14,962 $TR,"Apps"$ +$ID,2$ 1,154 $TR,"AfterEgypt"$ $ID,2$ 0 $TR,"Comics"$ -$ID,2$$ID,-2$ 283 $LK,"AfterEgypt.CPP.Z","FI:D:/TempleOS/Apps/AfterEgypt/AfterEgypt.CPP"$ - 136 $LK,"Battle.CPP.Z","FI:D:/TempleOS/Apps/AfterEgypt/Battle.CPP"$ - 28 $LK,"Comics.CPP.Z","FI:D:/TempleOS/Apps/AfterEgypt/Comics.CPP"$ - 327 $LK,"Horeb.CPP.Z","FI:D:/TempleOS/Apps/AfterEgypt/Horeb.CPP"$ - 17 $LK,"Load.CPP.Z","FI:D:/TempleOS/Apps/AfterEgypt/Load.CPP"$ - 78 $LK,"Map.CPP.Z","FI:D:/TempleOS/Apps/AfterEgypt/Map.CPP"$ - 95 $LK,"Quail.CPP.Z","FI:D:/TempleOS/Apps/AfterEgypt/Quail.CPP"$ +$ID,2$$ID,-2$ 209 $LK,"AfterEgypt.CPP.Z","FI:D:/TempleOS/Apps/AfterEgypt/AfterEgypt.CPP"$ + 138 $LK,"Battle.CPP.Z","FI:D:/TempleOS/Apps/AfterEgypt/Battle.CPP"$ + 29 $LK,"Comics.CPP.Z","FI:D:/TempleOS/Apps/AfterEgypt/Comics.CPP"$ + 76 $LK,"GodTalking.CPP.Z","FI:D:/TempleOS/Apps/AfterEgypt/GodTalking.CPP"$ + 340 $LK,"Horeb.CPP.Z","FI:D:/TempleOS/Apps/AfterEgypt/Horeb.CPP"$ + 18 $LK,"Load.CPP.Z","FI:D:/TempleOS/Apps/AfterEgypt/Load.CPP"$ + 72 $LK,"Map.CPP.Z","FI:D:/TempleOS/Apps/AfterEgypt/Map.CPP"$ + 108 $LK,"Quail.CPP.Z","FI:D:/TempleOS/Apps/AfterEgypt/Quail.CPP"$ 4 $LK,"Run.CPP.Z","FI:D:/TempleOS/Apps/AfterEgypt/Run.CPP"$ - 158 $LK,"WaterRock.CPP.Z","FI:D:/TempleOS/Apps/AfterEgypt/WaterRock.CPP"$ + 160 $LK,"WaterRock.CPP.Z","FI:D:/TempleOS/Apps/AfterEgypt/WaterRock.CPP"$ $ID,-2$ 462 $TR,"GrModels"$ $ID,2$ 133 $LK,"BallGen.CPP.Z","FI:D:/TempleOS/Apps/GrModels/BallGen.CPP"$ 4 $LK,"Load.CPP.Z","FI:D:/TempleOS/Apps/GrModels/Load.CPP"$ @@ -249,22 +127,22 @@ $ID,2$ 133 $LK,"BallGen.CPP.Z","FI:D:/TempleOS/Apps/GrModels/BallGen.CPP"$ 3 $LK,"Run.CPP.Z","FI:D:/TempleOS/Apps/GrModels/Run.CPP"$ $ID,-2$ 75 $TR,"HolySpirit"$ $ID,2$ 75 $LK,"HolySpirit.CPP.Z","FI:D:/TempleOS/Apps/HolySpirit/HolySpirit.CPP"$ -$ID,-2$ 747 $TR,"KeepAway"$ -$ID,2$ 742 $LK,"KeepAway.CPP.Z","FI:D:/TempleOS/Apps/KeepAway/KeepAway.CPP"$ +$ID,-2$ 741 $TR,"KeepAway"$ +$ID,2$ 736 $LK,"KeepAway.CPP.Z","FI:D:/TempleOS/Apps/KeepAway/KeepAway.CPP"$ 2 $LK,"Load.CPP.Z","FI:D:/TempleOS/Apps/KeepAway/Load.CPP"$ 3 $LK,"Run.CPP.Z","FI:D:/TempleOS/Apps/KeepAway/Run.CPP"$ $ID,-2$ 617 $TR,"Logic"$ $ID,2$ 2 $LK,"Load.CPP.Z","FI:D:/TempleOS/Apps/Logic/Load.CPP"$ 612 $LK,"Logic.CPP.Z","FI:D:/TempleOS/Apps/Logic/Logic.CPP"$ 3 $LK,"Run.CPP.Z","FI:D:/TempleOS/Apps/Logic/Run.CPP"$ -$ID,-2$ 6,486 $TR,"MusicOrgan"$ -$ID,2$ 4,059 $TR,"Examples"$ -$ID,2$ 73 $LK,"abiding.CPP.Z","FI:D:/TempleOS/Apps/MusicOrgan/Examples/abiding.CPP"$ +$ID,-2$ 6,346 $TR,"MusicOrgan"$ +$ID,2$ 4,057 $TR,"Examples"$ +$ID,2$ 74 $LK,"abiding.CPP.Z","FI:D:/TempleOS/Apps/MusicOrgan/Examples/abiding.CPP"$ 42 $LK,"abyss.CPP.Z","FI:D:/TempleOS/Apps/MusicOrgan/Examples/abyss.CPP"$ 23 $LK,"almighty.CPP.Z","FI:D:/TempleOS/Apps/MusicOrgan/Examples/almighty.CPP"$ 23 $LK,"appreciate.CPP.Z","FI:D:/TempleOS/Apps/MusicOrgan/Examples/appreciate.CPP"$ 75 $LK,"awake.CPP.Z","FI:D:/TempleOS/Apps/MusicOrgan/Examples/awake.CPP"$ - 63 $LK,"battlehymnsolo.CPP.Z","FI:D:/TempleOS/Apps/MusicOrgan/Examples/battlehymnsolo.CPP"$ + 52 $LK,"battlehymnsolo.CPP.Z","FI:D:/TempleOS/Apps/MusicOrgan/Examples/battlehymnsolo.CPP"$ 47 $LK,"bedewed.CPP.Z","FI:D:/TempleOS/Apps/MusicOrgan/Examples/bedewed.CPP"$ 49 $LK,"blinded.CPP.Z","FI:D:/TempleOS/Apps/MusicOrgan/Examples/blinded.CPP"$ 55 $LK,"born.CPP.Z","FI:D:/TempleOS/Apps/MusicOrgan/Examples/born.CPP"$ @@ -284,8 +162,8 @@ $ID,2$ 73 $LK,"abiding.CPP.Z","FI:D:/TempleOS/Apps/MusicOrgan/Examples/abid 97 $LK,"elijah.CPP.Z","FI:D:/TempleOS/Apps/MusicOrgan/Examples/elijah.CPP"$ 23 $LK,"environeth.CPP.Z","FI:D:/TempleOS/Apps/MusicOrgan/Examples/environeth.CPP"$ 40 $LK,"epicurus.CPP.Z","FI:D:/TempleOS/Apps/MusicOrgan/Examples/epicurus.CPP"$ - 40 $LK,"exalt.CPP.Z","FI:D:/TempleOS/Apps/MusicOrgan/Examples/exalt.CPP"$ - 63 $LK,"exiled.CPP.Z","FI:D:/TempleOS/Apps/MusicOrgan/Examples/exiled.CPP"$ + 41 $LK,"exalt.CPP.Z","FI:D:/TempleOS/Apps/MusicOrgan/Examples/exalt.CPP"$ + 64 $LK,"exiled.CPP.Z","FI:D:/TempleOS/Apps/MusicOrgan/Examples/exiled.CPP"$ 45 $LK,"expedition.CPP.Z","FI:D:/TempleOS/Apps/MusicOrgan/Examples/expedition.CPP"$ 35 $LK,"fairness.CPP.Z","FI:D:/TempleOS/Apps/MusicOrgan/Examples/fairness.CPP"$ 26 $LK,"feigned.CPP.Z","FI:D:/TempleOS/Apps/MusicOrgan/Examples/feigned.CPP"$ @@ -303,7 +181,7 @@ $ID,2$ 73 $LK,"abiding.CPP.Z","FI:D:/TempleOS/Apps/MusicOrgan/Examples/abid 59 $LK,"gutenberg.CPP.Z","FI:D:/TempleOS/Apps/MusicOrgan/Examples/gutenberg.CPP"$ 57 $LK,"happy.CPP.Z","FI:D:/TempleOS/Apps/MusicOrgan/Examples/happy.CPP"$ 21 $LK,"honestly.CPP.Z","FI:D:/TempleOS/Apps/MusicOrgan/Examples/honestly.CPP"$ - 55 $LK,"hope.CPP.Z","FI:D:/TempleOS/Apps/MusicOrgan/Examples/hope.CPP"$ + 56 $LK,"hope.CPP.Z","FI:D:/TempleOS/Apps/MusicOrgan/Examples/hope.CPP"$ 33 $LK,"image.CPP.Z","FI:D:/TempleOS/Apps/MusicOrgan/Examples/image.CPP"$ 46 $LK,"josh.CPP.Z","FI:D:/TempleOS/Apps/MusicOrgan/Examples/josh.CPP"$ 49 $LK,"keeping.CPP.Z","FI:D:/TempleOS/Apps/MusicOrgan/Examples/keeping.CPP"$ @@ -311,16 +189,16 @@ $ID,2$ 73 $LK,"abiding.CPP.Z","FI:D:/TempleOS/Apps/MusicOrgan/Examples/abid 56 $LK,"limit.CPP.Z","FI:D:/TempleOS/Apps/MusicOrgan/Examples/limit.CPP"$ 60 $LK,"mary.CPP.Z","FI:D:/TempleOS/Apps/MusicOrgan/Examples/mary.CPP"$ 53 $LK,"mightest.CPP.Z","FI:D:/TempleOS/Apps/MusicOrgan/Examples/mightest.CPP"$ - 78 $LK,"mildly.CPP.Z","FI:D:/TempleOS/Apps/MusicOrgan/Examples/mildly.CPP"$ + 79 $LK,"mildly.CPP.Z","FI:D:/TempleOS/Apps/MusicOrgan/Examples/mildly.CPP"$ 24 $LK,"nay.CPP.Z","FI:D:/TempleOS/Apps/MusicOrgan/Examples/nay.CPP"$ - 80 $LK,"night.CPP.Z","FI:D:/TempleOS/Apps/MusicOrgan/Examples/night.CPP"$ + 81 $LK,"night.CPP.Z","FI:D:/TempleOS/Apps/MusicOrgan/Examples/night.CPP"$ 21 $LK,"o.CPP.Z","FI:D:/TempleOS/Apps/MusicOrgan/Examples/o.CPP"$ 37 $LK,"partake.CPP.Z","FI:D:/TempleOS/Apps/MusicOrgan/Examples/partake.CPP"$ 21 $LK,"permitted.CPP.Z","FI:D:/TempleOS/Apps/MusicOrgan/Examples/permitted.CPP"$ 23 $LK,"personal.CPP.Z","FI:D:/TempleOS/Apps/MusicOrgan/Examples/personal.CPP"$ 21 $LK,"population.CPP.Z","FI:D:/TempleOS/Apps/MusicOrgan/Examples/population.CPP"$ 17 $LK,"proponent.CPP.Z","FI:D:/TempleOS/Apps/MusicOrgan/Examples/proponent.CPP"$ - 55 $LK,"prosper.CPP.Z","FI:D:/TempleOS/Apps/MusicOrgan/Examples/prosper.CPP"$ + 56 $LK,"prosper.CPP.Z","FI:D:/TempleOS/Apps/MusicOrgan/Examples/prosper.CPP"$ 26 $LK,"psalm.CPP.Z","FI:D:/TempleOS/Apps/MusicOrgan/Examples/psalm.CPP"$ 37 $LK,"purpose.CPP.Z","FI:D:/TempleOS/Apps/MusicOrgan/Examples/purpose.CPP"$ 23 $LK,"reasoning.CPP.Z","FI:D:/TempleOS/Apps/MusicOrgan/Examples/reasoning.CPP"$ @@ -328,7 +206,7 @@ $ID,2$ 73 $LK,"abiding.CPP.Z","FI:D:/TempleOS/Apps/MusicOrgan/Examples/abid 25 $LK,"reposes.CPP.Z","FI:D:/TempleOS/Apps/MusicOrgan/Examples/reposes.CPP"$ 30 $LK,"restless.CPP.Z","FI:D:/TempleOS/Apps/MusicOrgan/Examples/restless.CPP"$ 22 $LK,"rifled.CPP.Z","FI:D:/TempleOS/Apps/MusicOrgan/Examples/rifled.CPP"$ - 90 $LK,"risen.CPP.Z","FI:D:/TempleOS/Apps/MusicOrgan/Examples/risen.CPP"$ + 91 $LK,"risen.CPP.Z","FI:D:/TempleOS/Apps/MusicOrgan/Examples/risen.CPP"$ 101 $LK,"satisfaction.CPP.Z","FI:D:/TempleOS/Apps/MusicOrgan/Examples/satisfaction.CPP"$ 36 $LK,"scriptures.CPP.Z","FI:D:/TempleOS/Apps/MusicOrgan/Examples/scriptures.CPP"$ 33 $LK,"service.CPP.Z","FI:D:/TempleOS/Apps/MusicOrgan/Examples/service.CPP"$ @@ -339,7 +217,7 @@ $ID,2$ 73 $LK,"abiding.CPP.Z","FI:D:/TempleOS/Apps/MusicOrgan/Examples/abid 44 $LK,"struggles.CPP.Z","FI:D:/TempleOS/Apps/MusicOrgan/Examples/struggles.CPP"$ 46 $LK,"sustain.CPP.Z","FI:D:/TempleOS/Apps/MusicOrgan/Examples/sustain.CPP"$ 33 $LK,"teachings.CPP.Z","FI:D:/TempleOS/Apps/MusicOrgan/Examples/teachings.CPP"$ - 74 $LK,"thereupon.CPP.Z","FI:D:/TempleOS/Apps/MusicOrgan/Examples/thereupon.CPP"$ + 75 $LK,"thereupon.CPP.Z","FI:D:/TempleOS/Apps/MusicOrgan/Examples/thereupon.CPP"$ 25 $LK,"thither.CPP.Z","FI:D:/TempleOS/Apps/MusicOrgan/Examples/thither.CPP"$ 26 $LK,"twins.CPP.Z","FI:D:/TempleOS/Apps/MusicOrgan/Examples/twins.CPP"$ 41 $LK,"valued.CPP.Z","FI:D:/TempleOS/Apps/MusicOrgan/Examples/valued.CPP"$ @@ -354,103 +232,94 @@ $ID,2$ 73 $LK,"abiding.CPP.Z","FI:D:/TempleOS/Apps/MusicOrgan/Examples/abid $ID,-2$ 2 $LK,"Install.CPP.Z","FI:D:/TempleOS/Apps/MusicOrgan/Install.CPP"$ 147 $LK,"JukeBox.CPP.Z","FI:D:/TempleOS/Apps/MusicOrgan/JukeBox.CPP"$ 8 $LK,"Load.CPP.Z","FI:D:/TempleOS/Apps/MusicOrgan/Load.CPP"$ - 198 $LK,"MakeSong.CPP.Z","FI:D:/TempleOS/Apps/MusicOrgan/MakeSong.CPP"$ - 1,980 $LK,"Organ.CPP.Z","FI:D:/TempleOS/Apps/MusicOrgan/Organ.CPP"$ + 172 $LK,"MakeSong.CPP.Z","FI:D:/TempleOS/Apps/MusicOrgan/MakeSong.CPP"$ + 1,868 $LK,"Organ.CPP.Z","FI:D:/TempleOS/Apps/MusicOrgan/Organ.CPP"$ 88 $LK,"OrganCtrls.CPP.Z","FI:D:/TempleOS/Apps/MusicOrgan/OrganCtrls.CPP"$ 4 $LK,"Run.CPP.Z","FI:D:/TempleOS/Apps/MusicOrgan/Run.CPP"$ -$ID,-2$ 759 $TR,"Pilgrims"$ -$ID,2$ 8 $LK,"Load.CPP.Z","FI:D:/TempleOS/Apps/Pilgrims/Load.CPP"$ - 748 $LK,"Pilgrims.CPP.Z","FI:D:/TempleOS/Apps/Pilgrims/Pilgrims.CPP"$ - 3 $LK,"Run.CPP.Z","FI:D:/TempleOS/Apps/Pilgrims/Run.CPP"$ -$ID,-2$ 844 $TR,"Span"$ +$ID,-2$ 833 $TR,"Span"$ $ID,2$ 2 $LK,"Install.CPP.Z","FI:D:/TempleOS/Apps/Span/Install.CPP"$ 11 $LK,"Load.CPP.Z","FI:D:/TempleOS/Apps/Span/Load.CPP"$ 4 $LK,"Run.CPP.Z","FI:D:/TempleOS/Apps/Span/Run.CPP"$ - 91 $LK,"SpanBridge1.CPP.Z","FI:D:/TempleOS/Apps/Span/SpanBridge1.CPP"$ + 83 $LK,"SpanBridge1.CPP.Z","FI:D:/TempleOS/Apps/Span/SpanBridge1.CPP"$ 48 $LK,"SpanDerive.CPP.Z","FI:D:/TempleOS/Apps/Span/SpanDerive.CPP"$ - 505 $LK,"SpanMain.CPP.Z","FI:D:/TempleOS/Apps/Span/SpanMain.CPP"$ + 502 $LK,"SpanMain.CPP.Z","FI:D:/TempleOS/Apps/Span/SpanMain.CPP"$ 128 $LK,"SpanNew.CPP.Z","FI:D:/TempleOS/Apps/Span/SpanNew.CPP"$ 55 $LK,"Span.HPP.Z","FI:D:/TempleOS/Apps/Span/Span.HPP"$ $ID,-2$ 640 $TR,"Strut"$ $ID,2$ 7 $LK,"Load.CPP.Z","FI:D:/TempleOS/Apps/Strut/Load.CPP"$ 4 $LK,"Run.CPP.Z","FI:D:/TempleOS/Apps/Strut/Run.CPP"$ 629 $LK,"Strut.CPP.Z","FI:D:/TempleOS/Apps/Strut/Strut.CPP"$ -$ID,-2$ 1,969 $TR,"Tanks"$ -$ID,2$ 234 $TR,"AIs"$ -$ID,2$ 157 $LK,"Human.CPP.Z","FI:D:/TempleOS/Apps/Tanks/AIs/Human.CPP"$ - 77 $LK,"SimpleAI.CPP.Z","FI:D:/TempleOS/Apps/Tanks/AIs/SimpleAI.CPP"$ -$ID,-2$ 3 $LK,"Install.CPP.Z","FI:D:/TempleOS/Apps/Tanks/Install.CPP"$ - 2 $LK,"Load.CPP.Z","FI:D:/TempleOS/Apps/Tanks/Load.CPP"$ - 3 $LK,"Run.CPP.Z","FI:D:/TempleOS/Apps/Tanks/Run.CPP"$ - 1,727 $LK,"Tanks.CPP.Z","FI:D:/TempleOS/Apps/Tanks/Tanks.CPP"$ -$ID,-2$ 164 $TR,"TimeClock"$ -$ID,2$ 6 $LK,"Install.CPP.Z","FI:D:/TempleOS/Apps/TimeClock/Install.CPP"$ +$ID,-2$ 165 $TR,"TimeClock"$ +$ID,2$ 7 $LK,"Install.CPP.Z","FI:D:/TempleOS/Apps/TimeClock/Install.CPP"$ 2 $LK,"Load.CPP.Z","FI:D:/TempleOS/Apps/TimeClock/Load.CPP"$ 156 $LK,"TimeClk.CPP.Z","FI:D:/TempleOS/Apps/TimeClock/TimeClk.CPP"$ -$ID,-2$ 609 $TR,"Timeout"$ -$ID,2$ 6 $LK,"Load.CPP.Z","FI:D:/TempleOS/Apps/Timeout/Load.CPP"$ - 3 $LK,"Run.CPP.Z","FI:D:/TempleOS/Apps/Timeout/Run.CPP"$ - 600 $LK,"Timeout.CPP.Z","FI:D:/TempleOS/Apps/Timeout/Timeout.CPP"$ +$ID,-2$ 605 $TR,"TimeOut"$ +$ID,2$ 6 $LK,"Load.CPP.Z","FI:D:/TempleOS/Apps/TimeOut/Load.CPP"$ + 3 $LK,"Run.CPP.Z","FI:D:/TempleOS/Apps/TimeOut/Run.CPP"$ + 596 $LK,"TimeOut.CPP.Z","FI:D:/TempleOS/Apps/TimeOut/TimeOut.CPP"$ +$ID,-2$ 1,969 $TR,"ToTheFront"$ +$ID,2$ 235 $TR,"AIs"$ +$ID,2$ 157 $LK,"Human.CPP.Z","FI:D:/TempleOS/Apps/ToTheFront/AIs/Human.CPP"$ + 78 $LK,"SimpleAI.CPP.Z","FI:D:/TempleOS/Apps/ToTheFront/AIs/SimpleAI.CPP"$ +$ID,-2$ 3 $LK,"Install.CPP.Z","FI:D:/TempleOS/Apps/ToTheFront/Install.CPP"$ + 2 $LK,"Load.CPP.Z","FI:D:/TempleOS/Apps/ToTheFront/Load.CPP"$ + 3 $LK,"Run.CPP.Z","FI:D:/TempleOS/Apps/ToTheFront/Run.CPP"$ + 1,726 $LK,"ToTheFront.CPP.Z","FI:D:/TempleOS/Apps/ToTheFront/ToTheFront.CPP"$ $ID,-2$ 67 $TR,"Vocabulary"$ $ID,2$ 6 $LK,"Load.CPP.Z","FI:D:/TempleOS/Apps/Vocabulary/Load.CPP"$ 3 $LK,"Run.CPP.Z","FI:D:/TempleOS/Apps/Vocabulary/Run.CPP"$ 58 $LK,"VocabQuiz.CPP.Z","FI:D:/TempleOS/Apps/Vocabulary/VocabQuiz.CPP"$ -$ID,-2$ 1,292 $TR,"X-Caliber"$ +$ID,-2$ 1,288 $TR,"X-Caliber"$ $ID,2$ 9 $LK,"Load.CPP.Z","FI:D:/TempleOS/Apps/X-Caliber/Load.CPP"$ 3 $LK,"Run.CPP.Z","FI:D:/TempleOS/Apps/X-Caliber/Run.CPP"$ - 1,139 $LK,"X-Caliber.CPP.Z","FI:D:/TempleOS/Apps/X-Caliber/X-Caliber.CPP"$ + 1,135 $LK,"X-Caliber.CPP.Z","FI:D:/TempleOS/Apps/X-Caliber/X-Caliber.CPP"$ 141 $LK,"XCCtrls.CPP.Z","FI:D:/TempleOS/Apps/X-Caliber/XCCtrls.CPP"$ -$ID,-2$$ID,-2$ 21,617 $TR,"Compiler"$ -$ID,2$ 1,497 $LK,"Assembler.CPP.Z","FI:D:/TempleOS/Compiler/Assembler.CPP"$ - 5,121 $LK,"BackEnd.CPP.Z","FI:D:/TempleOS/Compiler/BackEnd.CPP"$ +$ID,-2$$ID,-2$ 20,410 $TR,"Compiler"$ +$ID,2$ 1,479 $LK,"Assembler.CPP.Z","FI:D:/TempleOS/Compiler/Assembler.CPP"$ + 4,656 $LK,"BackEnd.CPP.Z","FI:D:/TempleOS/Compiler/BackEnd.CPP"$ 695 $LK,"CmpAsm.CPP.Z","FI:D:/TempleOS/Compiler/CmpAsm.CPP"$ - 55 $LK,"CmpExts.CPP.Z","FI:D:/TempleOS/Compiler/CmpExts.CPP"$ + 57 $LK,"CmpExts.CPP.Z","FI:D:/TempleOS/Compiler/CmpExts.CPP"$ 21 $LK,"CmpGlbls.CPP.Z","FI:D:/TempleOS/Compiler/CmpGlbls.CPP"$ - 745 $LK,"CmpInit.CPP.Z","FI:D:/TempleOS/Compiler/CmpInit.CPP"$ - 702 $LK,"CmpMain.CPP.Z","FI:D:/TempleOS/Compiler/CmpMain.CPP"$ - 68 $LK,"CmpQueVect.CPP.Z","FI:D:/TempleOS/Compiler/CmpQueVect.CPP"$ - 510 $LK,"CodeGen.CPP.Z","FI:D:/TempleOS/Compiler/CodeGen.CPP"$ - 80 $LK,"Directives.CPP.Z","FI:D:/TempleOS/Compiler/Directives.CPP"$ - 1,298 $LK,"ExpParser.CPP.Z","FI:D:/TempleOS/Compiler/ExpParser.CPP"$ - 159 $LK,"Hash1b.CPP.Z","FI:D:/TempleOS/Compiler/Hash1b.CPP"$ - 1,703 $LK,"Lex.CPP.Z","FI:D:/TempleOS/Compiler/Lex.CPP"$ - 2,211 $LK,"OptPass012.CPP.Z","FI:D:/TempleOS/Compiler/OptPass012.CPP"$ - 652 $LK,"OptPass3.CPP.Z","FI:D:/TempleOS/Compiler/OptPass3.CPP"$ - 853 $LK,"OptPass4.CPP.Z","FI:D:/TempleOS/Compiler/OptPass4.CPP"$ - 172 $LK,"OptPass5.CPP.Z","FI:D:/TempleOS/Compiler/OptPass5.CPP"$ - 267 $LK,"OptPass6.CPP.Z","FI:D:/TempleOS/Compiler/OptPass6.CPP"$ - 1,340 $LK,"OptPass789A.CPP.Z","FI:D:/TempleOS/Compiler/OptPass789A.CPP"$ - 2,057 $LK,"StmtParser.CPP.Z","FI:D:/TempleOS/Compiler/StmtParser.CPP"$ - 898 $LK,"Unassembler.CPP.Z","FI:D:/TempleOS/Compiler/Unassembler.CPP"$ - 402 $LK,"CmpDefs.HPP.Z","FI:D:/TempleOS/Compiler/CmpDefs.HPP"$ - 85 $LK,"Compiler.HPP.Z","FI:D:/TempleOS/Compiler/Compiler.HPP"$ - 26 $LK,"Compiler.PRJ.Z","FI:D:/TempleOS/Compiler/Compiler.PRJ"$ -$ID,-2$ 27,073 $TR,"Demo"$ -$ID,2$ 2,235 $TR,"AcctExample"$ -$ID,2$ 903 $TR,"TAD"$ -$ID,2$ 822 $TR,"Archive"$ -$ID,2$ 489 $LK,"FileSysISO3.CPP.Z","FI:D:/TempleOS/Demo/AcctExample/TAD/Archive/FileSysISO3.CPP"$ - 218 $LK,"USB.CPP.Z","FI:D:/TempleOS/Demo/AcctExample/TAD/Archive/USB.CPP"$ - 115 $LK,"USB1a.CPP.Z","FI:D:/TempleOS/Demo/AcctExample/TAD/Archive/USB1a.CPP"$ -$ID,-2$ 21 $LK,"Adam3aLocalize.CPP.Z","FI:D:/TempleOS/Demo/AcctExample/TAD/Adam3aLocalize.CPP"$ - 55 $LK,"MakeDistro.CPP.Z","FI:D:/TempleOS/Demo/AcctExample/TAD/MakeDistro.CPP"$ + 731 $LK,"CmpInit.CPP.Z","FI:D:/TempleOS/Compiler/CmpInit.CPP"$ + 728 $LK,"CmpMain.CPP.Z","FI:D:/TempleOS/Compiler/CmpMain.CPP"$ + 483 $LK,"CodeGen.CPP.Z","FI:D:/TempleOS/Compiler/CodeGen.CPP"$ + 81 $LK,"Directives.CPP.Z","FI:D:/TempleOS/Compiler/Directives.CPP"$ + 1,269 $LK,"ExpParser.CPP.Z","FI:D:/TempleOS/Compiler/ExpParser.CPP"$ + 156 $LK,"Hash1b.CPP.Z","FI:D:/TempleOS/Compiler/Hash1b.CPP"$ + 1,687 $LK,"Lex.CPP.Z","FI:D:/TempleOS/Compiler/Lex.CPP"$ + 2,078 $LK,"OptPass012.CPP.Z","FI:D:/TempleOS/Compiler/OptPass012.CPP"$ + 619 $LK,"OptPass3.CPP.Z","FI:D:/TempleOS/Compiler/OptPass3.CPP"$ + 723 $LK,"OptPass4.CPP.Z","FI:D:/TempleOS/Compiler/OptPass4.CPP"$ + 122 $LK,"OptPass5.CPP.Z","FI:D:/TempleOS/Compiler/OptPass5.CPP"$ + 238 $LK,"OptPass6.CPP.Z","FI:D:/TempleOS/Compiler/OptPass6.CPP"$ + 1,246 $LK,"OptPass789A.CPP.Z","FI:D:/TempleOS/Compiler/OptPass789A.CPP"$ + 1,985 $LK,"StmtParser.CPP.Z","FI:D:/TempleOS/Compiler/StmtParser.CPP"$ + 851 $LK,"Unassembler.CPP.Z","FI:D:/TempleOS/Compiler/Unassembler.CPP"$ + 389 $LK,"CmpDefs.HPP.Z","FI:D:/TempleOS/Compiler/CmpDefs.HPP"$ + 91 $LK,"Compiler.HPP.Z","FI:D:/TempleOS/Compiler/Compiler.HPP"$ + 25 $LK,"Compiler.PRJ.Z","FI:D:/TempleOS/Compiler/Compiler.PRJ"$ +$ID,-2$ 20,893 $TR,"Demo"$ +$ID,2$ 1,357 $TR,"AcctExample"$ +$ID,2$ 37 $TR,"TAD"$ +$ID,2$ 13 $LK,"Adam3.CPP.Z","FI:D:/TempleOS/Demo/AcctExample/TAD/Adam3.CPP"$ + 19 $LK,"Adam3aLocalize.CPP.Z","FI:D:/TempleOS/Demo/AcctExample/TAD/Adam3aLocalize.CPP"$ 5 $LK,"Registry.CPP.Z","FI:D:/TempleOS/Demo/AcctExample/TAD/Registry.CPP"$ -$ID,-2$ 14 $LK,"Adam3.CPP.Z","FI:D:/TempleOS/Demo/AcctExample/Adam3.CPP"$ - 10 $LK,"Adam3bPkgs.CPP.Z","FI:D:/TempleOS/Demo/AcctExample/Adam3bPkgs.CPP"$ +$ID,-2$ 9 $LK,"Adam3bPkgs.CPP.Z","FI:D:/TempleOS/Demo/AcctExample/Adam3bPkgs.CPP"$ 267 $LK,"Adam3dKeyPlugIns.CPP.Z","FI:D:/TempleOS/Demo/AcctExample/Adam3dKeyPlugIns.CPP"$ 10 $LK,"Adam3eWrappers.CPP.Z","FI:D:/TempleOS/Demo/AcctExample/Adam3eWrappers.CPP"$ - 61 $LK,"Adam3fSys.CPP.Z","FI:D:/TempleOS/Demo/AcctExample/Adam3fSys.CPP"$ + 60 $LK,"Adam3fSys.CPP.Z","FI:D:/TempleOS/Demo/AcctExample/Adam3fSys.CPP"$ + 12 $LK,"DbgAdam1.CPP.Z","FI:D:/TempleOS/Demo/AcctExample/DbgAdam1.CPP"$ 13 $LK,"DoItOnce.CPP.Z","FI:D:/TempleOS/Demo/AcctExample/DoItOnce.CPP"$ - 437 $LK,"TSAdam.CPP.Z","FI:D:/TempleOS/Demo/AcctExample/TSAdam.CPP"$ - 520 $LK,"TSDistro.CPP.Z","FI:D:/TempleOS/Demo/AcctExample/TSDistro.CPP"$ -$ID,-2$ 422 $TR,"Asm"$ -$ID,2$ 82 $LK,"AsmAndC.CPP.Z","FI:D:/TempleOS/Demo/Asm/AsmAndC.CPP"$ - 99 $LK,"AsmAndC2.CPP.Z","FI:D:/TempleOS/Demo/Asm/AsmAndC2.CPP"$ - 53 $LK,"AsmHelloWorld.CPP.Z","FI:D:/TempleOS/Demo/Asm/AsmHelloWorld.CPP"$ + 416 $LK,"TSAdam.CPP.Z","FI:D:/TempleOS/Demo/AcctExample/TSAdam.CPP"$ + 533 $LK,"TSDistro.CPP.Z","FI:D:/TempleOS/Demo/AcctExample/TSDistro.CPP"$ +$ID,-2$ 425 $TR,"Asm"$ +$ID,2$ 79 $LK,"AsmAndC.CPP.Z","FI:D:/TempleOS/Demo/Asm/AsmAndC.CPP"$ + 96 $LK,"AsmAndC2.CPP.Z","FI:D:/TempleOS/Demo/Asm/AsmAndC2.CPP"$ + 58 $LK,"AsmHelloWorld.CPP.Z","FI:D:/TempleOS/Demo/Asm/AsmHelloWorld.CPP"$ 49 $LK,"BuzzFizz.CPP.Z","FI:D:/TempleOS/Demo/Asm/BuzzFizz.CPP"$ 24 $LK,"DivByHand.CPP.Z","FI:D:/TempleOS/Demo/Asm/DivByHand.CPP"$ 71 $LK,"MulByHand.CPP.Z","FI:D:/TempleOS/Demo/Asm/MulByHand.CPP"$ - 44 $LK,"PutDec.CPP.Z","FI:D:/TempleOS/Demo/Asm/PutDec.CPP"$ + 48 $LK,"PutDec.CPP.Z","FI:D:/TempleOS/Demo/Asm/PutDec.CPP"$ $ID,-2$ 111 $TR,"AutoFile"$ $ID,2$ 16 $LK,"AFDir.AUT.Z","FI:D:/TempleOS/Demo/AutoFile/AFDir.AUT"$ 29 $LK,"AFEd.AUT.Z","FI:D:/TempleOS/Demo/AutoFile/AFEd.AUT"$ @@ -458,117 +327,107 @@ $ID,2$ 16 $LK,"AFDir.AUT.Z","FI:D:/TempleOS/Demo/AutoFile/AFDir.AUT"$ 12 $LK,"AFProfile.AUT.Z","FI:D:/TempleOS/Demo/AutoFile/AFProfile.AUT"$ 13 $LK,"AFPopUp.CPP.Z","FI:D:/TempleOS/Demo/AutoFile/AFPopUp.CPP"$ 14 $LK,"AFSetIP.CPP.Z","FI:D:/TempleOS/Demo/AutoFile/AFSetIP.CPP"$ -$ID,-2$ 627 $TR,"Doc"$ -$ID,2$ 94 $LK,"CallBack.CPP.Z","FI:D:/TempleOS/Demo/Doc/CallBack.CPP"$ - 36 $LK,"CallBackAux2.CPP.Z","FI:D:/TempleOS/Demo/Doc/CallBackAux2.CPP"$ +$ID,-2$ 602 $TR,"Doc"$ +$ID,2$ 79 $LK,"CallBack.CPP.Z","FI:D:/TempleOS/Demo/Doc/CallBack.CPP"$ 39 $LK,"CursorMove.CPP.Z","FI:D:/TempleOS/Demo/Doc/CursorMove.CPP"$ - 65 $LK,"Data.CPP.Z","FI:D:/TempleOS/Demo/Doc/Data.CPP"$ + 67 $LK,"Data.CPP.Z","FI:D:/TempleOS/Demo/Doc/Data.CPP"$ 25 $LK,"DefineStr.CPP.Z","FI:D:/TempleOS/Demo/Doc/DefineStr.CPP"$ 69 $LK,"FileRead.CPP.Z","FI:D:/TempleOS/Demo/Doc/FileRead.CPP"$ 45 $LK,"Form.CPP.Z","FI:D:/TempleOS/Demo/Doc/Form.CPP"$ 77 $LK,"MenuButton.CPP.Z","FI:D:/TempleOS/Demo/Doc/MenuButton.CPP"$ 35 $LK,"MenuSprite.CPP.Z","FI:D:/TempleOS/Demo/Doc/MenuSprite.CPP"$ 25 $LK,"TextDemo.CPP.Z","FI:D:/TempleOS/Demo/Doc/TextDemo.CPP"$ - 32 $LK,"TreeDemo.CPP.Z","FI:D:/TempleOS/Demo/Doc/TreeDemo.CPP"$ + 56 $LK,"TreeDemo.CPP.Z","FI:D:/TempleOS/Demo/Doc/TreeDemo.CPP"$ 85 $LK,"UnusedDefine.CPP.Z","FI:D:/TempleOS/Demo/Doc/UnusedDefine.CPP"$ -$ID,-2$ 176 $TR,"Dsk"$ +$ID,-2$ 200 $TR,"Dsk"$ $ID,2$ 69 $LK,"DataBase.CPP.Z","FI:D:/TempleOS/Demo/Dsk/DataBase.CPP"$ - 28 $LK,"FPrintF.CPP.Z","FI:D:/TempleOS/Demo/Dsk/FPrintF.CPP"$ + 52 $LK,"FPrintF.CPP.Z","FI:D:/TempleOS/Demo/Dsk/FPrintF.CPP"$ 20 $LK,"OrderedIO.CPP.Z","FI:D:/TempleOS/Demo/Dsk/OrderedIO.CPP"$ 42 $LK,"Raw.CPP.Z","FI:D:/TempleOS/Demo/Dsk/Raw.CPP"$ 17 $LK,"UnusedSpaceRep.CPP.Z","FI:D:/TempleOS/Demo/Dsk/UnusedSpaceRep.CPP"$ -$ID,-2$ 11,002 $TR,"GameStarters"$ -$ID,2$ 172 $TR,"Stadium"$ -$ID,2$ 141 $LK,"Stadium.CPP.Z","FI:D:/TempleOS/Demo/GameStarters/Stadium/Stadium.CPP"$ - 31 $LK,"StadiumGen.CPP.Z","FI:D:/TempleOS/Demo/GameStarters/Stadium/StadiumGen.CPP"$ -$ID,-2$ 328 $LK,"BigGuns.CPP.Z","FI:D:/TempleOS/Demo/GameStarters/BigGuns.CPP"$ - 245 $LK,"BirdLand.CPP.Z","FI:D:/TempleOS/Demo/GameStarters/BirdLand.CPP"$ - 152 $LK,"BlackDiamond.CPP.Z","FI:D:/TempleOS/Demo/GameStarters/BlackDiamond.CPP"$ - 246 $LK,"Bomber.CPP.Z","FI:D:/TempleOS/Demo/GameStarters/Bomber.CPP"$ - 1,046 $LK,"Chess.CPP.Z","FI:D:/TempleOS/Demo/GameStarters/Chess.CPP"$ - 257 $LK,"ChessNet.CPP.Z","FI:D:/TempleOS/Demo/GameStarters/ChessNet.CPP"$ - 125 $LK,"CircleTrace.CPP.Z","FI:D:/TempleOS/Demo/GameStarters/CircleTrace.CPP"$ - 172 $LK,"Coach.CPP.Z","FI:D:/TempleOS/Demo/GameStarters/Coach.CPP"$ - 168 $LK,"Collision.CPP.Z","FI:D:/TempleOS/Demo/GameStarters/Collision.CPP"$ - 468 $LK,"DunGen.CPP.Z","FI:D:/TempleOS/Demo/GameStarters/DunGen.CPP"$ - 990 $LK,"EagleDive.CPP.Z","FI:D:/TempleOS/Demo/GameStarters/EagleDive.CPP"$ - 569 $LK,"FPS.CPP.Z","FI:D:/TempleOS/Demo/GameStarters/FPS.CPP"$ - 164 $LK,"Halogen.CPP.Z","FI:D:/TempleOS/Demo/GameStarters/Halogen.CPP"$ - 190 $LK,"MassSpring.CPP.Z","FI:D:/TempleOS/Demo/GameStarters/MassSpring.CPP"$ - 231 $LK,"MissileDefense.CPP.Z","FI:D:/TempleOS/Demo/GameStarters/MissileDefense.CPP"$ - 770 $LK,"Navy.CPP.Z","FI:D:/TempleOS/Demo/GameStarters/Navy.CPP"$ - 193 $LK,"RainDrops.CPP.Z","FI:D:/TempleOS/Demo/GameStarters/RainDrops.CPP"$ - 523 $LK,"RawHide.CPP.Z","FI:D:/TempleOS/Demo/GameStarters/RawHide.CPP"$ - 193 $LK,"Rocket.CPP.Z","FI:D:/TempleOS/Demo/GameStarters/Rocket.CPP"$ - 306 $LK,"RocketScience.CPP.Z","FI:D:/TempleOS/Demo/GameStarters/RocketScience.CPP"$ - 683 $LK,"Rocks.CPP.Z","FI:D:/TempleOS/Demo/GameStarters/Rocks.CPP"$ - 139 $LK,"SpaceShip.CPP.Z","FI:D:/TempleOS/Demo/GameStarters/SpaceShip.CPP"$ - 408 $LK,"Squirt.CPP.Z","FI:D:/TempleOS/Demo/GameStarters/Squirt.CPP"$ - 206 $LK,"TheDead.CPP.Z","FI:D:/TempleOS/Demo/GameStarters/TheDead.CPP"$ - 125 $LK,"TicTacToe.CPP.Z","FI:D:/TempleOS/Demo/GameStarters/TicTacToe.CPP"$ - 332 $LK,"Varoom.CPP.Z","FI:D:/TempleOS/Demo/GameStarters/Varoom.CPP"$ - 372 $LK,"WarGame.CPP.Z","FI:D:/TempleOS/Demo/GameStarters/WarGame.CPP"$ - 532 $LK,"Wenceslas.CPP.Z","FI:D:/TempleOS/Demo/GameStarters/Wenceslas.CPP"$ - 174 $LK,"Whap.CPP.Z","FI:D:/TempleOS/Demo/GameStarters/Whap.CPP"$ - 201 $LK,"Zing.CPP.Z","FI:D:/TempleOS/Demo/GameStarters/Zing.CPP"$ - 322 $LK,"ZoneOut.CPP.Z","FI:D:/TempleOS/Demo/GameStarters/ZoneOut.CPP"$ -$ID,-2$ 5,921 $TR,"Graphics"$ +$ID,-2$ 9,131 $TR,"Games"$ +$ID,2$ 175 $TR,"Stadium"$ +$ID,2$ 142 $LK,"Stadium.CPP.Z","FI:D:/TempleOS/Demo/Games/Stadium/Stadium.CPP"$ + 33 $LK,"StadiumGen.CPP.Z","FI:D:/TempleOS/Demo/Games/Stadium/StadiumGen.CPP"$ +$ID,-2$ 372 $LK,"BattleLines.CPP.Z","FI:D:/TempleOS/Demo/Games/BattleLines.CPP"$ + 333 $LK,"BigGuns.CPP.Z","FI:D:/TempleOS/Demo/Games/BigGuns.CPP"$ + 152 $LK,"BlackDiamond.CPP.Z","FI:D:/TempleOS/Demo/Games/BlackDiamond.CPP"$ + 246 $LK,"BugBird.CPP.Z","FI:D:/TempleOS/Demo/Games/BugBird.CPP"$ + 246 $LK,"BulgeBomber.CPP.Z","FI:D:/TempleOS/Demo/Games/BulgeBomber.CPP"$ + 594 $LK,"CastleFrankenstein.CPP.Z","FI:D:/TempleOS/Demo/Games/CastleFrankenstein.CPP"$ + 258 $LK,"ChessNet.CPP.Z","FI:D:/TempleOS/Demo/Games/ChessNet.CPP"$ + 126 $LK,"CircleTrace.CPP.Z","FI:D:/TempleOS/Demo/Games/CircleTrace.CPP"$ + 172 $LK,"Coach.CPP.Z","FI:D:/TempleOS/Demo/Games/Coach.CPP"$ + 168 $LK,"Collision.CPP.Z","FI:D:/TempleOS/Demo/Games/Collision.CPP"$ + 81 $LK,"Digits.CPP.Z","FI:D:/TempleOS/Demo/Games/Digits.CPP"$ + 436 $LK,"DunGen.CPP.Z","FI:D:/TempleOS/Demo/Games/DunGen.CPP"$ + 976 $LK,"EagleDive.CPP.Z","FI:D:/TempleOS/Demo/Games/EagleDive.CPP"$ + 769 $LK,"FlatTops.CPP.Z","FI:D:/TempleOS/Demo/Games/FlatTops.CPP"$ + 166 $LK,"Halogen.CPP.Z","FI:D:/TempleOS/Demo/Games/Halogen.CPP"$ + 190 $LK,"MassSpring.CPP.Z","FI:D:/TempleOS/Demo/Games/MassSpring.CPP"$ + 108 $LK,"Maze.CPP.Z","FI:D:/TempleOS/Demo/Games/Maze.CPP"$ + 193 $LK,"RainDrops.CPP.Z","FI:D:/TempleOS/Demo/Games/RainDrops.CPP"$ + 524 $LK,"RawHide.CPP.Z","FI:D:/TempleOS/Demo/Games/RawHide.CPP"$ + 194 $LK,"Rocket.CPP.Z","FI:D:/TempleOS/Demo/Games/Rocket.CPP"$ + 306 $LK,"RocketScience.CPP.Z","FI:D:/TempleOS/Demo/Games/RocketScience.CPP"$ + 423 $LK,"Squirt.CPP.Z","FI:D:/TempleOS/Demo/Games/Squirt.CPP"$ + 206 $LK,"TheDead.CPP.Z","FI:D:/TempleOS/Demo/Games/TheDead.CPP"$ + 131 $LK,"TicTacToe.CPP.Z","FI:D:/TempleOS/Demo/Games/TicTacToe.CPP"$ + 337 $LK,"Varoom.CPP.Z","FI:D:/TempleOS/Demo/Games/Varoom.CPP"$ + 532 $LK,"Wenceslas.CPP.Z","FI:D:/TempleOS/Demo/Games/Wenceslas.CPP"$ + 174 $LK,"Whap.CPP.Z","FI:D:/TempleOS/Demo/Games/Whap.CPP"$ + 201 $LK,"Zing.CPP.Z","FI:D:/TempleOS/Demo/Games/Zing.CPP"$ + 342 $LK,"ZoneOut.CPP.Z","FI:D:/TempleOS/Demo/Games/ZoneOut.CPP"$ +$ID,-2$ 3,995 $TR,"Graphics"$ $ID,2$ 118 $LK,"3DPoly.CPP.Z","FI:D:/TempleOS/Demo/Graphics/3DPoly.CPP"$ - 33 $LK,"BSpline.CPP.Z","FI:D:/TempleOS/Demo/Graphics/BSpline.CPP"$ - 242 $LK,"Bling.CPP.Z","FI:D:/TempleOS/Demo/Graphics/Bling.CPP"$ + 34 $LK,"BSpline.CPP.Z","FI:D:/TempleOS/Demo/Graphics/BSpline.CPP"$ 42 $LK,"Blot.CPP.Z","FI:D:/TempleOS/Demo/Graphics/Blot.CPP"$ 58 $LK,"Bounce.CPP.Z","FI:D:/TempleOS/Demo/Graphics/Bounce.CPP"$ 54 $LK,"Box.CPP.Z","FI:D:/TempleOS/Demo/Graphics/Box.CPP"$ - 65 $LK,"CPUPlot.CPP.Z","FI:D:/TempleOS/Demo/Graphics/CPUPlot.CPP"$ - 324 $LK,"Camp.CPP.Z","FI:D:/TempleOS/Demo/Graphics/Camp.CPP"$ + 339 $LK,"Camp.CPP.Z","FI:D:/TempleOS/Demo/Graphics/Camp.CPP"$ 28 $LK,"CaptureScreen.CPP.Z","FI:D:/TempleOS/Demo/Graphics/CaptureScreen.CPP"$ 50 $LK,"Cartesian.CPP.Z","FI:D:/TempleOS/Demo/Graphics/Cartesian.CPP"$ 36 $LK,"CharGraphics.CPP.Z","FI:D:/TempleOS/Demo/Graphics/CharGraphics.CPP"$ - 1,187 $LK,"Circuit.CPP.Z","FI:D:/TempleOS/Demo/Graphics/Circuit.CPP"$ 120 $LK,"CommonAncestor.CPP.Z","FI:D:/TempleOS/Demo/Graphics/CommonAncestor.CPP"$ 17 $LK,"Dither.CPP.Z","FI:D:/TempleOS/Demo/Graphics/Dither.CPP"$ - 49 $LK,"Doodle.CPP.Z","FI:D:/TempleOS/Demo/Graphics/Doodle.CPP"$ - 15 $LK,"DotNet.CPP.Z","FI:D:/TempleOS/Demo/Graphics/DotNet.CPP"$ + 50 $LK,"Doodle.CPP.Z","FI:D:/TempleOS/Demo/Graphics/Doodle.CPP"$ + 17 $LK,"DotNet.CPP.Z","FI:D:/TempleOS/Demo/Graphics/DotNet.CPP"$ 109 $LK,"EdCSprite.CPP.Z","FI:D:/TempleOS/Demo/Graphics/EdCSprite.CPP"$ 51 $LK,"Extents.CPP.Z","FI:D:/TempleOS/Demo/Graphics/Extents.CPP"$ - 233 $LK,"Flowers.CPP.Z","FI:D:/TempleOS/Demo/Graphics/Flowers.CPP"$ - 143 $LK,"FontEd.CPP.Z","FI:D:/TempleOS/Demo/Graphics/FontEd.CPP"$ - 55 $LK,"Golf.CPP.Z","FI:D:/TempleOS/Demo/Graphics/Golf.CPP"$ + 144 $LK,"FontEd.CPP.Z","FI:D:/TempleOS/Demo/Graphics/FontEd.CPP"$ 142 $LK,"Hanoi.CPP.Z","FI:D:/TempleOS/Demo/Graphics/Hanoi.CPP"$ - 98 $LK,"Life.CPP.Z","FI:D:/TempleOS/Demo/Graphics/Life.CPP"$ + 99 $LK,"Life.CPP.Z","FI:D:/TempleOS/Demo/Graphics/Life.CPP"$ 27 $LK,"Lines.CPP.Z","FI:D:/TempleOS/Demo/Graphics/Lines.CPP"$ 52 $LK,"Logo.CPP.Z","FI:D:/TempleOS/Demo/Graphics/Logo.CPP"$ 83 $LK,"LowPassFilter.CPP.Z","FI:D:/TempleOS/Demo/Graphics/LowPassFilter.CPP"$ 105 $LK,"MathAudioDemo.CPP.Z","FI:D:/TempleOS/Demo/Graphics/MathAudioDemo.CPP"$ 97 $LK,"Mountain.CPP.Z","FI:D:/TempleOS/Demo/Graphics/Mountain.CPP"$ - 22 $LK,"NeatTrick.CPP.Z","FI:D:/TempleOS/Demo/Graphics/NeatTrick.CPP"$ 28 $LK,"Palette.CPP.Z","FI:D:/TempleOS/Demo/Graphics/Palette.CPP"$ - 102 $LK,"Pic2ASCII.CPP.Z","FI:D:/TempleOS/Demo/Graphics/Pic2ASCII.CPP"$ - 98 $LK,"Pick.CPP.Z","FI:D:/TempleOS/Demo/Graphics/Pick.CPP"$ - 331 $LK,"Pick3D.CPP.Z","FI:D:/TempleOS/Demo/Graphics/Pick3D.CPP"$ - 93 $LK,"PixelCollision.CPP.Z","FI:D:/TempleOS/Demo/Graphics/PixelCollision.CPP"$ + 99 $LK,"Pick.CPP.Z","FI:D:/TempleOS/Demo/Graphics/Pick.CPP"$ + 332 $LK,"Pick3D.CPP.Z","FI:D:/TempleOS/Demo/Graphics/Pick3D.CPP"$ + 44 $LK,"PixelCollision.CPP.Z","FI:D:/TempleOS/Demo/Graphics/PixelCollision.CPP"$ 172 $LK,"PoleZeros.CPP.Z","FI:D:/TempleOS/Demo/Graphics/PoleZeros.CPP"$ - 83 $LK,"PredatorPrey.CPP.Z","FI:D:/TempleOS/Demo/Graphics/PredatorPrey.CPP"$ + 82 $LK,"PredatorPrey.CPP.Z","FI:D:/TempleOS/Demo/Graphics/PredatorPrey.CPP"$ 78 $LK,"RotateTank.CPP.Z","FI:D:/TempleOS/Demo/Graphics/RotateTank.CPP"$ 72 $LK,"ScrollBars.CPP.Z","FI:D:/TempleOS/Demo/Graphics/ScrollBars.CPP"$ 181 $LK,"Shading.CPP.Z","FI:D:/TempleOS/Demo/Graphics/Shading.CPP"$ 109 $LK,"Shadow.CPP.Z","FI:D:/TempleOS/Demo/Graphics/Shadow.CPP"$ 112 $LK,"SliderCtrl.CPP.Z","FI:D:/TempleOS/Demo/Graphics/SliderCtrl.CPP"$ - 50 $LK,"Speedline.CPP.Z","FI:D:/TempleOS/Demo/Graphics/Speedline.CPP"$ + 51 $LK,"Speedline.CPP.Z","FI:D:/TempleOS/Demo/Graphics/Speedline.CPP"$ 67 $LK,"SpritePlot.CPP.Z","FI:D:/TempleOS/Demo/Graphics/SpritePlot.CPP"$ 63 $LK,"SpritePlot3D.CPP.Z","FI:D:/TempleOS/Demo/Graphics/SpritePlot3D.CPP"$ 47 $LK,"SpritePut.CPP.Z","FI:D:/TempleOS/Demo/Graphics/SpritePut.CPP"$ 29 $LK,"SpritePutExt.CPP.Z","FI:D:/TempleOS/Demo/Graphics/SpritePutExt.CPP"$ 23 $LK,"SpriteText.CPP.Z","FI:D:/TempleOS/Demo/Graphics/SpriteText.CPP"$ - 62 $LK,"Symmetry.CPP.Z","FI:D:/TempleOS/Demo/Graphics/Symmetry.CPP"$ - 220 $LK,"Transform.CPP.Z","FI:D:/TempleOS/Demo/Graphics/Transform.CPP"$ + 63 $LK,"Symmetry.CPP.Z","FI:D:/TempleOS/Demo/Graphics/Symmetry.CPP"$ + 225 $LK,"Transform.CPP.Z","FI:D:/TempleOS/Demo/Graphics/Transform.CPP"$ 104 $LK,"WallPaperCtrl.CPP.Z","FI:D:/TempleOS/Demo/Graphics/WallPaperCtrl.CPP"$ - 119 $LK,"WallPaperFish.CPP.Z","FI:D:/TempleOS/Demo/Graphics/WallPaperFish.CPP"$ - 23 $LK,"WinZBuf.CPP.Z","FI:D:/TempleOS/Demo/Graphics/WinZBuf.CPP"$ -$ID,-2$ 1,442 $TR,"Lectures"$ + 118 $LK,"WallPaperFish.CPP.Z","FI:D:/TempleOS/Demo/Graphics/WallPaperFish.CPP"$ + 24 $LK,"WinZBuf.CPP.Z","FI:D:/TempleOS/Demo/Graphics/WinZBuf.CPP"$ +$ID,-2$ 1,457 $TR,"Lectures"$ $ID,2$ 54 $LK,"AndNotMod.CPP.Z","FI:D:/TempleOS/Demo/Lectures/AndNotMod.CPP"$ 104 $LK,"FixedPoint.CPP.Z","FI:D:/TempleOS/Demo/Lectures/FixedPoint.CPP"$ - 165 $LK,"FixedPointAdvanced.CPP.Z","FI:D:/TempleOS/Demo/Lectures/FixedPointAdvanced.CPP"$ + 178 $LK,"FixedPointAdvanced.CPP.Z","FI:D:/TempleOS/Demo/Lectures/FixedPointAdvanced.CPP"$ 77 $LK,"GraphicsCPULoad.CPP.Z","FI:D:/TempleOS/Demo/Lectures/GraphicsCPULoad.CPP"$ 91 $LK,"InterruptDemo.CPP.Z","FI:D:/TempleOS/Demo/Lectures/InterruptDemo.CPP"$ 225 $LK,"MiniCompiler.CPP.Z","FI:D:/TempleOS/Demo/Lectures/MiniCompiler.CPP"$ @@ -580,21 +439,17 @@ $ID,2$ 54 $LK,"AndNotMod.CPP.Z","FI:D:/TempleOS/Demo/Lectures/AndNotMod.CPP 84 $LK,"Ring3.CPP.Z","FI:D:/TempleOS/Demo/Lectures/Ring3.CPP"$ 56 $LK,"ScreenMemory.CPP.Z","FI:D:/TempleOS/Demo/Lectures/ScreenMemory.CPP"$ 110 $LK,"Spinning.CPP.Z","FI:D:/TempleOS/Demo/Lectures/Spinning.CPP"$ - 54 $LK,"Uncached.CPP.Z","FI:D:/TempleOS/Demo/Lectures/Uncached.CPP"$ -$ID,-2$ 1,184 $TR,"MultiCore"$ -$ID,2$ 195 $LK,"Clouds.CPP.Z","FI:D:/TempleOS/Demo/MultiCore/Clouds.CPP"$ + 56 $LK,"Uncached.CPP.Z","FI:D:/TempleOS/Demo/Lectures/Uncached.CPP"$ +$ID,-2$ 794 $TR,"MultiCore"$ +$ID,2$ 212 $LK,"Clouds.CPP.Z","FI:D:/TempleOS/Demo/MultiCore/Clouds.CPP"$ 25 $LK,"Interrupts.CPP.Z","FI:D:/TempleOS/Demo/MultiCore/Interrupts.CPP"$ - 132 $LK,"Layers3DJob.CPP.Z","FI:D:/TempleOS/Demo/MultiCore/Layers3DJob.CPP"$ - 84 $LK,"LayersSpawn.CPP.Z","FI:D:/TempleOS/Demo/MultiCore/LayersSpawn.CPP"$ - 58 $LK,"LoadTest.CPP.Z","FI:D:/TempleOS/Demo/MultiCore/LoadTest.CPP"$ - 65 $LK,"Lock.CPP.Z","FI:D:/TempleOS/Demo/MultiCore/Lock.CPP"$ - 86 $LK,"MPAdd.CPP.Z","FI:D:/TempleOS/Demo/MultiCore/MPAdd.CPP"$ + 55 $LK,"LoadTest.CPP.Z","FI:D:/TempleOS/Demo/MultiCore/LoadTest.CPP"$ + 57 $LK,"Lock.CPP.Z","FI:D:/TempleOS/Demo/MultiCore/Lock.CPP"$ + 87 $LK,"MPAdd.CPP.Z","FI:D:/TempleOS/Demo/MultiCore/MPAdd.CPP"$ 19 $LK,"MPPrintF.CPP.Z","FI:D:/TempleOS/Demo/MultiCore/MPPrintF.CPP"$ - 64 $LK,"Noise.CPP.Z","FI:D:/TempleOS/Demo/MultiCore/Noise.CPP"$ - 99 $LK,"Palindrome.CPP.Z","FI:D:/TempleOS/Demo/MultiCore/Palindrome.CPP"$ - 77 $LK,"Primes.CPP.Z","FI:D:/TempleOS/Demo/MultiCore/Primes.CPP"$ - 166 $LK,"RadixSort.CPP.Z","FI:D:/TempleOS/Demo/MultiCore/RadixSort.CPP"$ - 114 $LK,"Sort.CPP.Z","FI:D:/TempleOS/Demo/MultiCore/Sort.CPP"$ + 98 $LK,"Palindrome.CPP.Z","FI:D:/TempleOS/Demo/MultiCore/Palindrome.CPP"$ + 76 $LK,"Primes.CPP.Z","FI:D:/TempleOS/Demo/MultiCore/Primes.CPP"$ + 165 $LK,"RadixSort.CPP.Z","FI:D:/TempleOS/Demo/MultiCore/RadixSort.CPP"$ $ID,-2$ 183 $TR,"OldSchool"$ $ID,2$ 63 $TR,"Demo1"$ $ID,2$ 9 $LK,"MD1.CPP.Z","FI:D:/TempleOS/Demo/OldSchool/Demo1/MD1.CPP"$ @@ -608,42 +463,30 @@ $ID,2$ 25 $LK,"MakeFile.CPP.Z","FI:D:/TempleOS/Demo/OldSchool/Demo2/MakeFil 13 $LK,"OD1.PRJ.Z","FI:D:/TempleOS/Demo/OldSchool/Demo2/OD1.PRJ"$ 32 $LK,"OD2.PRJ.Z","FI:D:/TempleOS/Demo/OldSchool/Demo2/OD2.PRJ"$ 38 $LK,"ODMain.PRJ.Z","FI:D:/TempleOS/Demo/OldSchool/Demo2/ODMain.PRJ"$ -$ID,-2$$ID,-2$ 26 $TR,"Shared"$ -$ID,2$ 26 $LK,"TreeDemoJoin.CPP.Z","FI:D:/TempleOS/Demo/Shared/TreeDemoJoin.CPP"$ -$ID,-2$ 1,180 $TR,"Snd"$ +$ID,-2$$ID,-2$ 416 $TR,"Snd"$ $ID,2$ 52 $LK,"ASCIIOrgan.CPP.Z","FI:D:/TempleOS/Demo/Snd/ASCIIOrgan.CPP"$ - 69 $LK,"BeatFreq.CPP.Z","FI:D:/TempleOS/Demo/Snd/BeatFreq.CPP"$ - 17 $LK,"Chords.CPP.Z","FI:D:/TempleOS/Demo/Snd/Chords.CPP"$ - 97 $LK,"Echo.CPP.Z","FI:D:/TempleOS/Demo/Snd/Echo.CPP"$ - 18 $LK,"Guitar.CPP.Z","FI:D:/TempleOS/Demo/Snd/Guitar.CPP"$ 182 $LK,"MorseCode.CPP.Z","FI:D:/TempleOS/Demo/Snd/MorseCode.CPP"$ 42 $LK,"OhGreat.CPP.Z","FI:D:/TempleOS/Demo/Snd/OhGreat.CPP"$ - 99 $LK,"PolyPhonic.CPP.Z","FI:D:/TempleOS/Demo/Snd/PolyPhonic.CPP"$ - 121 $LK,"Record.CPP.Z","FI:D:/TempleOS/Demo/Snd/Record.CPP"$ - 47 $LK,"SndScope.CPP.Z","FI:D:/TempleOS/Demo/Snd/SndScope.CPP"$ - 281 $LK,"Synth.CPP.Z","FI:D:/TempleOS/Demo/Snd/Synth.CPP"$ - 155 $LK,"WaterFowl.CPP.Z","FI:D:/TempleOS/Demo/Snd/WaterFowl.CPP"$ -$ID,-2$ 508 $TR,"WebLogExample"$ -$ID,2$ 444 $LK,"WebLogRep.CPP.Z","FI:D:/TempleOS/Demo/WebLogExample/WebLogRep.CPP"$ + 140 $LK,"WaterFowl.CPP.Z","FI:D:/TempleOS/Demo/Snd/WaterFowl.CPP"$ +$ID,-2$ 506 $TR,"WebLogExample"$ +$ID,2$ 442 $LK,"WebLogRep.CPP.Z","FI:D:/TempleOS/Demo/WebLogExample/WebLogRep.CPP"$ 64 $LK,"WebLogScramble.CPP.Z","FI:D:/TempleOS/Demo/WebLogExample/WebLogScramble.CPP"$ $ID,-2$ 82 $LK,"ClassMeta.CPP.Z","FI:D:/TempleOS/Demo/ClassMeta.CPP"$ 38 $LK,"CompileDemo.CPP.Z","FI:D:/TempleOS/Demo/CompileDemo.CPP"$ 46 $LK,"DateTime.CPP.Z","FI:D:/TempleOS/Demo/DateTime.CPP"$ 29 $LK,"DbgDemo.CPP.Z","FI:D:/TempleOS/Demo/DbgDemo.CPP"$ 41 $LK,"Define.CPP.Z","FI:D:/TempleOS/Demo/Define.CPP"$ - 78 $LK,"Digits.CPP.Z","FI:D:/TempleOS/Demo/Digits.CPP"$ 68 $LK,"Exceptions.CPP.Z","FI:D:/TempleOS/Demo/Exceptions.CPP"$ 37 $LK,"ExtendedChars.CPP.Z","FI:D:/TempleOS/Demo/ExtendedChars.CPP"$ 95 $LK,"GlblVars.CPP.Z","FI:D:/TempleOS/Demo/GlblVars.CPP"$ 45 $LK,"KeyBitMap.CPP.Z","FI:D:/TempleOS/Demo/KeyBitMap.CPP"$ - 373 $LK,"MagicPairs.CPP.Z","FI:D:/TempleOS/Demo/MagicPairs.CPP"$ + 369 $LK,"MagicPairs.CPP.Z","FI:D:/TempleOS/Demo/MagicPairs.CPP"$ 55 $LK,"MakeDistro.CPP.Z","FI:D:/TempleOS/Demo/MakeDistro.CPP"$ - 108 $LK,"Maze.CPP.Z","FI:D:/TempleOS/Demo/Maze.CPP"$ - 21 $LK,"MsgLoop.CPP.Z","FI:D:/TempleOS/Demo/MsgLoop.CPP"$ + 22 $LK,"MsgLoop.CPP.Z","FI:D:/TempleOS/Demo/MsgLoop.CPP"$ 20 $LK,"ParenWarn.CPP.Z","FI:D:/TempleOS/Demo/ParenWarn.CPP"$ 65 $LK,"PhoneNumWords.CPP.Z","FI:D:/TempleOS/Demo/PhoneNumWords.CPP"$ 34 $LK,"PrintF.CPP.Z","FI:D:/TempleOS/Demo/PrintF.CPP"$ - 37 $LK,"Progress.CPP.Z","FI:D:/TempleOS/Demo/Progress.CPP"$ + 54 $LK,"Progress.CPP.Z","FI:D:/TempleOS/Demo/Progress.CPP"$ 26 $LK,"Prompt.CPP.Z","FI:D:/TempleOS/Demo/Prompt.CPP"$ 90 $LK,"PullDownMenu.CPP.Z","FI:D:/TempleOS/Demo/PullDownMenu.CPP"$ 27 $LK,"RegistryDemo.CPP.Z","FI:D:/TempleOS/Demo/RegistryDemo.CPP"$ @@ -653,72 +496,71 @@ $ID,-2$ 82 $LK,"ClassMeta.CPP.Z","FI:D:/TempleOS/Demo/ClassMeta.CPP"$ 33 $LK,"SubIntAccess.CPP.Z","FI:D:/TempleOS/Demo/SubIntAccess.CPP"$ 92 $LK,"SuggestSpelling.CPP.Z","FI:D:/TempleOS/Demo/SuggestSpelling.CPP"$ 45 $LK,"TimeIns.CPP.Z","FI:D:/TempleOS/Demo/TimeIns.CPP"$ - 168 $LK,"WinMgr2.CPP.Z","FI:D:/TempleOS/Demo/WinMgr2.CPP"$ 156 $LK,"WordSearch.CPP.Z","FI:D:/TempleOS/Demo/WordSearch.CPP"$ $ID,-2$ 0 $TR,"Doc"$ -$ID,2$$ID,-2$ 25,644 $TR,"Kernel"$ -$ID,2$ 6,050 $TR,"Dsk"$ +$ID,2$$ID,-2$ 25,879 $TR,"Kernel"$ +$ID,2$ 6,072 $TR,"Dsk"$ $ID,2$ 730 $LK,"Dsk1a.CPP.Z","FI:D:/TempleOS/Kernel/Dsk/Dsk1a.CPP"$ 518 $LK,"Dsk1b.CPP.Z","FI:D:/TempleOS/Kernel/Dsk/Dsk1b.CPP"$ - 390 $LK,"Dsk1c.CPP.Z","FI:D:/TempleOS/Kernel/Dsk/Dsk1c.CPP"$ - 955 $LK,"DskATA.CPP.Z","FI:D:/TempleOS/Kernel/Dsk/DskATA.CPP"$ - 319 $LK,"DskAddDev.CPP.Z","FI:D:/TempleOS/Kernel/Dsk/DskAddDev.CPP"$ - 263 $LK,"DskCFile.CPP.Z","FI:D:/TempleOS/Kernel/Dsk/DskCFile.CPP"$ + 396 $LK,"Dsk1c.CPP.Z","FI:D:/TempleOS/Kernel/Dsk/Dsk1c.CPP"$ + 946 $LK,"DskATA.CPP.Z","FI:D:/TempleOS/Kernel/Dsk/DskATA.CPP"$ + 334 $LK,"DskAddDev.CPP.Z","FI:D:/TempleOS/Kernel/Dsk/DskAddDev.CPP"$ + 269 $LK,"DskCFile.CPP.Z","FI:D:/TempleOS/Kernel/Dsk/DskCFile.CPP"$ 161 $LK,"DskCache.CPP.Z","FI:D:/TempleOS/Kernel/Dsk/DskCache.CPP"$ 269 $LK,"DskDir.CPP.Z","FI:D:/TempleOS/Kernel/Dsk/DskDir.CPP"$ - 374 $LK,"DskStr.CPP.Z","FI:D:/TempleOS/Kernel/Dsk/DskStr.CPP"$ - 1,005 $LK,"FileSysFAT.CPP.Z","FI:D:/TempleOS/Kernel/Dsk/FileSysFAT.CPP"$ + 375 $LK,"DskStr.CPP.Z","FI:D:/TempleOS/Kernel/Dsk/DskStr.CPP"$ + 1,008 $LK,"FileSysFAT.CPP.Z","FI:D:/TempleOS/Kernel/Dsk/FileSysFAT.CPP"$ 315 $LK,"FileSysISO1.CPP.Z","FI:D:/TempleOS/Kernel/Dsk/FileSysISO1.CPP"$ - 719 $LK,"FileSysNative.CPP.Z","FI:D:/TempleOS/Kernel/Dsk/FileSysNative.CPP"$ + 719 $LK,"FileSysRedSea.CPP.Z","FI:D:/TempleOS/Kernel/Dsk/FileSysRedSea.CPP"$ 32 $LK,"ATADef.HPP.Z","FI:D:/TempleOS/Kernel/Dsk/ATADef.HPP"$ -$ID,-2$ 1,263 $TR,"KbdMouse"$ +$ID,-2$ 1,259 $TR,"KbdMouse"$ $ID,2$ 129 $LK,"InputPointer.CPP.Z","FI:D:/TempleOS/Kernel/KbdMouse/InputPointer.CPP"$ 547 $LK,"Keyboard.CPP.Z","FI:D:/TempleOS/Kernel/KbdMouse/Keyboard.CPP"$ - 234 $LK,"Message.CPP.Z","FI:D:/TempleOS/Kernel/KbdMouse/Message.CPP"$ + 230 $LK,"Message.CPP.Z","FI:D:/TempleOS/Kernel/KbdMouse/Message.CPP"$ 353 $LK,"Mouse.CPP.Z","FI:D:/TempleOS/Kernel/KbdMouse/Mouse.CPP"$ $ID,-2$ 13 $LK,"Adam1.CPP.Z","FI:D:/TempleOS/Kernel/Adam1.CPP"$ 297 $LK,"BIOS32.CPP.Z","FI:D:/TempleOS/Kernel/BIOS32.CPP"$ - 325 $LK,"Compress.CPP.Z","FI:D:/TempleOS/Kernel/Compress.CPP"$ + 328 $LK,"Compress.CPP.Z","FI:D:/TempleOS/Kernel/Compress.CPP"$ + 324 $LK,"DataTypes1a.CPP.Z","FI:D:/TempleOS/Kernel/DataTypes1a.CPP"$ 484 $LK,"Date.CPP.Z","FI:D:/TempleOS/Kernel/Date.CPP"$ - 702 $LK,"Dbg1a.CPP.Z","FI:D:/TempleOS/Kernel/Dbg1a.CPP"$ - 136 $LK,"Define1a.CPP.Z","FI:D:/TempleOS/Kernel/Define1a.CPP"$ - 280 $LK,"Display.CPP.Z","FI:D:/TempleOS/Kernel/Display.CPP"$ - 337 $LK,"EdLite.CPP.Z","FI:D:/TempleOS/Kernel/EdLite.CPP"$ + 720 $LK,"Dbg1a.CPP.Z","FI:D:/TempleOS/Kernel/Dbg1a.CPP"$ + 137 $LK,"Define1a.CPP.Z","FI:D:/TempleOS/Kernel/Define1a.CPP"$ + 279 $LK,"Display.CPP.Z","FI:D:/TempleOS/Kernel/Display.CPP"$ + 345 $LK,"EdLite.CPP.Z","FI:D:/TempleOS/Kernel/EdLite.CPP"$ 224 $LK,"Except.CPP.Z","FI:D:/TempleOS/Kernel/Except.CPP"$ - 170 $LK,"FIFO.CPP.Z","FI:D:/TempleOS/Kernel/FIFO.CPP"$ 262 $LK,"Font8x8.CPP.Z","FI:D:/TempleOS/Kernel/Font8x8.CPP"$ - 810 $LK,"Hash1a.CPP.Z","FI:D:/TempleOS/Kernel/Hash1a.CPP"$ - 214 $LK,"Interrupts.CPP.Z","FI:D:/TempleOS/Kernel/Interrupts.CPP"$ - 222 $LK,"KCfg.CPP.Z","FI:D:/TempleOS/Kernel/KCfg.CPP"$ - 248 $LK,"KEnd.CPP.Z","FI:D:/TempleOS/Kernel/KEnd.CPP"$ - 100 $LK,"KExts.CPP.Z","FI:D:/TempleOS/Kernel/KExts.CPP"$ - 141 $LK,"KGlbls.CPP.Z","FI:D:/TempleOS/Kernel/KGlbls.CPP"$ - 524 $LK,"KStart.CPP.Z","FI:D:/TempleOS/Kernel/KStart.CPP"$ + 808 $LK,"Hash1a.CPP.Z","FI:D:/TempleOS/Kernel/Hash1a.CPP"$ + 213 $LK,"Interrupts.CPP.Z","FI:D:/TempleOS/Kernel/Interrupts.CPP"$ + 230 $LK,"KCfg.CPP.Z","FI:D:/TempleOS/Kernel/KCfg.CPP"$ + 253 $LK,"KEnd.CPP.Z","FI:D:/TempleOS/Kernel/KEnd.CPP"$ + 109 $LK,"KExts.CPP.Z","FI:D:/TempleOS/Kernel/KExts.CPP"$ + 136 $LK,"KGlbls.CPP.Z","FI:D:/TempleOS/Kernel/KGlbls.CPP"$ + 525 $LK,"KStart.CPP.Z","FI:D:/TempleOS/Kernel/KStart.CPP"$ 622 $LK,"Math1a.CPP.Z","FI:D:/TempleOS/Kernel/Math1a.CPP"$ 227 $LK,"Math1b.CPP.Z","FI:D:/TempleOS/Kernel/Math1b.CPP"$ - 1,426 $LK,"Memory.CPP.Z","FI:D:/TempleOS/Kernel/Memory.CPP"$ - 369 $LK,"Misc1a.CPP.Z","FI:D:/TempleOS/Kernel/Misc1a.CPP"$ - 526 $LK,"MultiProc.CPP.Z","FI:D:/TempleOS/Kernel/MultiProc.CPP"$ - 279 $LK,"PSect.CPP.Z","FI:D:/TempleOS/Kernel/PSect.CPP"$ - 248 $LK,"QSort.CPP.Z","FI:D:/TempleOS/Kernel/QSort.CPP"$ + 1,340 $LK,"Memory.CPP.Z","FI:D:/TempleOS/Kernel/Memory.CPP"$ + 360 $LK,"Misc1a.CPP.Z","FI:D:/TempleOS/Kernel/Misc1a.CPP"$ + 439 $LK,"MultiProc.CPP.Z","FI:D:/TempleOS/Kernel/MultiProc.CPP"$ + 298 $LK,"PSect.CPP.Z","FI:D:/TempleOS/Kernel/PSect.CPP"$ + 246 $LK,"QSort.CPP.Z","FI:D:/TempleOS/Kernel/QSort.CPP"$ 411 $LK,"Scheduler.CPP.Z","FI:D:/TempleOS/Kernel/Scheduler.CPP"$ - 2,409 $LK,"Str1a.CPP.Z","FI:D:/TempleOS/Kernel/Str1a.CPP"$ - 571 $LK,"Task1a.CPP.Z","FI:D:/TempleOS/Kernel/Task1a.CPP"$ - 423 $LK,"TaskCmd.CPP.Z","FI:D:/TempleOS/Kernel/TaskCmd.CPP"$ - 331 $LK,"Utils1a.CPP.Z","FI:D:/TempleOS/Kernel/Utils1a.CPP"$ + 523 $LK,"SrvCmd.CPP.Z","FI:D:/TempleOS/Kernel/SrvCmd.CPP"$ + 2,403 $LK,"Str1a.CPP.Z","FI:D:/TempleOS/Kernel/Str1a.CPP"$ + 564 $LK,"Task1a.CPP.Z","FI:D:/TempleOS/Kernel/Task1a.CPP"$ + 455 $LK,"Utils1a.CPP.Z","FI:D:/TempleOS/Kernel/Utils1a.CPP"$ 15 $LK,"AOT.HPP.Z","FI:D:/TempleOS/Kernel/AOT.HPP"$ 3 $LK,"AOTAdam.HPP.Z","FI:D:/TempleOS/Kernel/AOTAdam.HPP"$ - 3,746 $LK,"Adam1a.HPP.Z","FI:D:/TempleOS/Kernel/Adam1a.HPP"$ + 3,725 $LK,"Adam1a.HPP.Z","FI:D:/TempleOS/Kernel/Adam1a.HPP"$ 303 $LK,"Adam1b.HPP.Z","FI:D:/TempleOS/Kernel/Adam1b.HPP"$ - 832 $LK,"Adam1c.HPP.Z","FI:D:/TempleOS/Kernel/Adam1c.HPP"$ - 31 $LK,"BootDefs.HPP.Z","FI:D:/TempleOS/Kernel/BootDefs.HPP"$ + 825 $LK,"Adam1c.HPP.Z","FI:D:/TempleOS/Kernel/Adam1c.HPP"$ + 32 $LK,"BootDefs.HPP.Z","FI:D:/TempleOS/Kernel/BootDefs.HPP"$ 70 $LK,"Kernel.PRJ.Z","FI:D:/TempleOS/Kernel/Kernel.PRJ"$ -$ID,-2$ 3,138 $TR,"Misc"$ -$ID,2$ 701 $TR,"Tour"$ -$ID,2$ 40 $LK,"Tour.AUT.Z","FI:D:/TempleOS/Misc/Tour/Tour.AUT"$ - 109 $LK,"Tour1.AUT.Z","FI:D:/TempleOS/Misc/Tour/Tour1.AUT"$ - 124 $LK,"Tour2.AUT.Z","FI:D:/TempleOS/Misc/Tour/Tour2.AUT"$ - 113 $LK,"Tour3.AUT.Z","FI:D:/TempleOS/Misc/Tour/Tour3.AUT"$ +$ID,-2$ 2,871 $TR,"Misc"$ +$ID,2$ 681 $TR,"Tour"$ +$ID,2$ 42 $LK,"Tour.AUT.Z","FI:D:/TempleOS/Misc/Tour/Tour.AUT"$ + 98 $LK,"Tour1.AUT.Z","FI:D:/TempleOS/Misc/Tour/Tour1.AUT"$ + 112 $LK,"Tour2.AUT.Z","FI:D:/TempleOS/Misc/Tour/Tour2.AUT"$ + 114 $LK,"Tour3.AUT.Z","FI:D:/TempleOS/Misc/Tour/Tour3.AUT"$ 38 $LK,"Tour4.AUT.Z","FI:D:/TempleOS/Misc/Tour/Tour4.AUT"$ 65 $LK,"Tour5.AUT.Z","FI:D:/TempleOS/Misc/Tour/Tour5.AUT"$ 77 $LK,"Tour6.AUT.Z","FI:D:/TempleOS/Misc/Tour/Tour6.AUT"$ @@ -727,5 +569,5 @@ $ID,2$ 40 $LK,"Tour.AUT.Z","FI:D:/TempleOS/Misc/Tour/Tour.AUT"$ 29 $LK,"Tour9.AUT.Z","FI:D:/TempleOS/Misc/Tour/Tour9.AUT"$ 11 $LK,"TourA.AUT.Z","FI:D:/TempleOS/Misc/Tour/TourA.AUT"$ $ID,-2$ 32 $LK,"Dollar.CPP.Z","FI:D:/TempleOS/Misc/Dollar.CPP"$ - 2,405 $LK,"OSTestSuite.CPP.Z","FI:D:/TempleOS/Misc/OSTestSuite.CPP"$ + 2,158 $LK,"OSTestSuite.CPP.Z","FI:D:/TempleOS/Misc/OSTestSuite.CPP"$ $ID,-2$$ID,-2$ \ No newline at end of file diff --git a/TempleOS/Accts/TS/Wb2/Menu.BMP b/TempleOS/Accts/TS/Wb2/Menu.BMP deleted file mode 100644 index 7316b6384e1990f79d33aaf853dc9ed28c060c26..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 63780 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 aS>8eFBS;?L2lJWUu?e!h3lwCaD*ynBrbX}o diff --git a/TempleOS/Accts/TS/Wb2/MenuV0104.BMP b/TempleOS/Accts/TS/Wb2/MenuV0104.BMP new file mode 100644 index 0000000000000000000000000000000000000000..fa470d706094e635c1f7062d43e8cf026c45263e GIT binary patch literal 153718 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

Ua zlJJ{36X|9Sh#SFP1BVGLgdj95Re|I&!w)0^_9!S9!F>%%dms!k0o0IysskBM zBPp1S{0oXcnBTz8gvT?O2Z~r|9t1VCz)21w0o8;Oen=d6xWUZ>nAw^4|EO*^X}bP!;fPF

deVT&OKPGAHG;?f_Y%?S!RQ2qs3 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 literal 0 HcmV?d00001 diff --git a/TempleOS/Accts/TS/Wb2/ScreenShots.TXT b/TempleOS/Accts/TS/Wb2/ScreenShots.TXT index 58b635c..dc4bcfb 100644 --- a/TempleOS/Accts/TS/Wb2/ScreenShots.TXT +++ b/TempleOS/Accts/TS/Wb2/ScreenShots.TXT @@ -1,15 +1,15 @@ $WW,1$$FG,5$$TX+CX+HTML,"TempleOS","http://www.templeos.org"$$FG$ -$HI,"http://www.templeos.org/Wb/Accts/TS/Wb2/TempleOS.BMP"$ +$HI,"http://www.templeos.org/Wb/Accts/TS/Wb2/TempleOSV0104.BMP"$ -$HI,"http://www.templeos.org/Wb/Accts/TS/Wb2/Menu.BMP"$ +$HI,"http://www.templeos.org/Wb/Accts/TS/Wb2/MenuV0104.BMP"$ $TX+CX,"Your personal menu is a document with icons."$ -$HI,"http://www.templeos.org/Wb/Accts/TS/Wb2/Tanks.BMP"$ +$HI,"http://www.templeos.org/Wb/Accts/TS/Wb2/ToTheFront.BMP"$ $TX+CX,"This is a tank war game."$ diff --git a/TempleOS/Accts/TS/Wb2/TempleOS.BMP b/TempleOS/Accts/TS/Wb2/TempleOS.BMP deleted file mode 100644 index a8aeacd1838dd414c6185e6a51580820ac4064a5..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 55340 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 diff --git a/TempleOS/Accts/TS/Wb2/TempleOSV0104.BMP b/TempleOS/Accts/TS/Wb2/TempleOSV0104.BMP new file mode 100644 index 0000000000000000000000000000000000000000..1a35f3a4d60c2f9bcb66942d7ec151fdaa1dfd87 GIT binary patch literal 153718 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

DGhi5E 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 Mn+a literal 0 HcmV?d00001 diff --git a/TempleOS/Accts/TS/Wb2/Tanks.BMP b/TempleOS/Accts/TS/Wb2/ToTheFront.BMP similarity index 100% rename from TempleOS/Accts/TS/Wb2/Tanks.BMP rename to TempleOS/Accts/TS/Wb2/ToTheFront.BMP diff --git a/TempleOS/Accts/TS/Wb2/Tutorials.TXT b/TempleOS/Accts/TS/Wb2/Tutorials.TXT index 53e3d48..55a7667 100644 --- a/TempleOS/Accts/TS/Wb2/Tutorials.TXT +++ b/TempleOS/Accts/TS/Wb2/Tutorials.TXT @@ -65,3 +65,36 @@ $HC,""$ + +$TX+CX,"Start-Up Code Walk-Thru"$ + +Note: TempleOS stores files contiguously if their name ends in ".C". + + + + + + +$HC,""$ + +$TX+CX,"Assembler/Compiler Code Walk-Thru"$ + +Errata: Float * int goes to float, obviously. + + + + + + + +$HC,""$ + +$TX+CX," Graphic Editing"$ diff --git a/TempleOS/Accts/TS/Wb2/index.TXT b/TempleOS/Accts/TS/Wb2/index.TXT index 7803ce5..78d7cf4 100644 --- a/TempleOS/Accts/TS/Wb2/index.TXT +++ b/TempleOS/Accts/TS/Wb2/index.TXT @@ -1,24 +1,117 @@ -$WW,1$$FG,5$$TX+CX+HTML,"TempleOS","http://www.templeos.org"$$FG$ +$WW,1$$FG,1$$TX+CX+HTML,"TempleOS","http://www.templeos.org"$$FG$ + +$HC,""$ + +$FG,1$$TX+CX,"Nobody knows the Father but the Son."$ +$TX+CX,"Do loving offerings. Then, God will shine His love on you."$ +$TX+CX,"Hell is the absence of God; Heaven is God's company."$ +$TX+CX+HTML,"Anything but God's company? One tin soldier","http://www.youtube.com/watch?v=cTBx-hHf4BE"$$FG$ + +War? $FG,4$"Servicemen competing"$FG$ +(Praise the Creator--what would teenage male video games be like if never war?) + +Is the World perfectly just? $FG,4$You calling me lazy?$FG$ +(Slavery was just. In the movie, Titanic, the rich wore straight jackets. You must bow to authority to get authority. I do $TX+HTML,"Moses comics","http://www.templeos.org/Wb/Apps/AfterEgypt/Comics/"$ as offerings. I said, "We're dying of malnutrician on manna." Like Cain and Abel, God didn't like it. Duh! He wants to be the hero. How do I know they died of malnutrician? Fuck Hollywood for making slavery worse than it was -- I love God. School is more cruel. Read $LK,"Numbers,11:1","BF:Numbers,11:1"$. All you need is food, clothing and the word of God. Today, you can take Ivy League course videos! There is no excuse except you were born stupid... or ugly. I'm gonna praise God.) + +The holocaust? $FG,4$Wanted to "compact" the Jews.$FG$ +Arab/Jews? $FG,4$"Oil funny hopefully"$FG$ +Peace? $FG,4$One Palestinian can ruin it.$FG$ +Best religion? $FG,4$One with most new vistas of understanding in$FG$ + $FG,4$a lifetime. One you can level-up the most in.$FG$ +Chavez blaming the US. $FG,4$"Japan industrious"$FG$ +On racism? $FG,4$"Sports"$FG$ +On socialism? $FG,4$"pardon_the_French, never_happy, never_enough"$FG$ + $FG,4$"Gall aspect anti-Christ"$FG$ +On overpopulation $FG,4$"Okay church what_now whats_the_plan"$FG$ +Favorite thing on TV? $FG,4$"Soap_operas"$FG$ +Favorite movie? $FG,4$No answer but likes Highlander$FG$ +Shakespeare? $FG,4$had a "vile heart"$FG$ +Likes $FG,4$"Beverly Hillbillies" (Oil is a gift from God)$FG$ + $FG,4$God likes being hero. Don't be proud of heart$FG$ + $FG,4$and not accept a gift from God!$FG$ +Favorite saint? $FG,4$"ho_ho_ho"$FG$ +Favorite animal? $FG,4$"Elephant two"$FG$ +Favorite animal? $FG,4$"Bears"$FG$ +Favorite color? $FG,4$"Jude" (Jade Blue?)$FG$ +Favorite color? $FG,4$"Gold"$FG$ +Favorite color? $FG,4$"Iceberg" blue$FG$ +Money? $FG,4$"Enough vehemently better"$FG$ + $FG,4$"Pride [or] money, choose_one"$FG$ +Favorite car? $FG,4$Beamer$FG$ +Sports? $FG,4$"homo"$FG$ +Pets? $FG,4$"homo"$FG$ +Smelling farts $FG,4$"Sodom"$FG$ +Women's dress $FG,4$Upper skin exposure not as bad as lower.$FG$ +Remarriage? $FG,4$"More babies"$FG$ +Things you don't care about +that people think you do? $FG,4$Solomon's 300 concubines$FG$ +Adultery? $FG,4$Can be good.$FG$ +Animal sacrifices? $FG,4$Early Jews were "primitive".$FG$ +What do elephants think about? $FG,4$"Skin hunger"$FG$ +What makes elephants happy? $FG,4$"Baths"$FG$ +What makes my birds happy? $FG,4$"Gnawing"$FG$ +What makes my birds laugh? $FG,4$"bite ouch" (If I say "ouch".)$FG$ +What are my birds saying? $FG,4$"Chanting"$FG$ +What makes bears happy? $FG,4$"Reaping depends"$FG$ +What makes otters happy? $FG,4$"Eternal skies"$FG$ +What makes hippos happy? $FG,4$"Ascending breath"$FG$ +What makes horses happy? $FG,4$"[the] Call [of the] Open Range"$FG$ +Endangered species? $FG,4$"Enough stars?"$FG$ +What's for dinner? $FG,4$"Whale"$FG$ +Favorite Messier Object $FG,4$"$TX+HTML,"M104 Sombrero Galaxy","http://en.wikipedia.org/wiki/Messier_104"$"$FG$ +Favorite band? $FG,4$"Beatles"$FG$ +Good bands $FG,4$Rush, Triumph$FG$ + $FG,4$Likes harmonies$FG$ +Should I listen to classical? $FG,4$"Poison"$FG$ +You like chess people? $FG,4$"Do not admire the proud."$FG$ +Favorite video game? $FG,4$Donkey Kong$FG$ +Favorite actor? $FG,4$Hugh Grant$FG$ +Favorite vocalist? $FG,4$Mick Jagger$FG$ +Favorite guitarist? $FG,4$"$TX+HTML,"Simmons Destroyer","http://www.youtube.com/watch?v=nNADrrjTysk&t=3m55s"$"$FG$ +Dinosaurs? $FG,4$Brontosaurs' feet hurt when stepped$FG$ +Hardest part in evolution? $FG,4$Getting monkey mothers to hold babies nursing.$FG$ + $FG,4$(Smothering a problem).$FG$ +Happiest day in evolution? $FG,4$"Fruit"$FG$ +Significant thing in evolution? $FG,4$"Fish shoulders"$FG$ +Biggest thing to fly (pterodactyl)? $FG,4$"Couch"$FG$ +What made pterodactyls happy? $FG,4$"Members against organs"$FG$ +What did Neanderthals think about? $FG,4$"Warmth"$FG$ +What was Lucy's husband's name? $FG,4$"Golem"$FG$ +Was stegosuarus lame like turtles? $FG,4$"Not pet rocks"$FG$ +How does He feel about the Avatar movie?$FG,4$"Sick skin"$FG$ +What do You like at zoos with kids? $FG,4$"Dignity" Animals worried about dignity.$FG$ +Who's better alien or preditor? $FG,4$"Lions"$FG$ +Does he like mirrored glass megachurch? $FG,4$"Secular glass"$FG$ +You like to hangout in courts?Hospitals?$FG,4$"Prisons"$FG$ +Pipe Organs $FG,4$Are sacred.$FG$ +Eleventh commandment? $FG,4$Thou shall not litter.(Maybe, glory of Creation)$FG$ +Before Katrina $FG,4$Floods do justice. Black bead elder (tree book)$FG$ +After Katrina $FG,4$Suffering Simplifies Life$FG$ +What field are You most better? $FG,4$Economics$FG$ + +$FG,1$________________________________________________________________________________$FG$ + -$HI,"http://www.templeos.org/Wb/Accts/TS/Wb2/TempleOS.BMP"$ TempleOS is an $FG,4$$TX+HTML,"x86_64","http://en.wikipedia.org/wiki/Amd64#AMD64"$$FG$, multi-tasking, multi-cored, public domain, open source, $FG,4$$TX+HTML,"ring-0-only","http://en.wikipedia.org/wiki/Ring_(computer_security)"$$FG$, single-address-map ($FG,4$$TX+HTML,"identity-mapped","http://en.wikipedia.org/wiki/Identity_(mathematics)"$$FG$), non-networked, PC operating system for recreational programming. -A troll might ask, "Why not just use $FG,4$$TX+HTML,"DOS","http://en.wikipedia.org/wiki/DOS"$$FG$? It was ring-0-only and single-address-map." Actually, they wouldn't because many people would say, "Cool idea! I'm gonna dust-off $FG,4$$TX+HTML,"DOS","http://en.wikipedia.org/wiki/DOS"$$FG$ right now and have some fun!" $FG,4$$TX+HTML,"DOS","http://en.wikipedia.org/wiki/DOS"$$FG$ is 16-bit with segmentation, though, which is awful. TempleOS is 64-bit, flat, non-segmented and multi-cored. It's like a modern, souped-up, multi-tasking, cross between $FG,4$$TX+HTML,"DOS","http://en.wikipedia.org/wiki/DOS"$$FG$ and a Commodore 64. It has a C64-like shell with a $LK,"dialect","FI:::/TempleOS/Doc/Differences.TXT"$ of C/C++ instead of BASIC. It was written from scratch, and not even ASCII was sacred -- it has 8-bit unsigned character source code to support European languages. Also, the source code has graphics. +The two most sacred and defining features of TempleOS are being $FG,4$$TX+HTML,"ring-0-only","http://en.wikipedia.org/wiki/Ring_(computer_security)"$$FG$ and being $FG,4$$TX+HTML,"identity-mapped","http://en.wikipedia.org/wiki/Identity_(mathematics)"$$FG$. Linux wants to be a secure, multi-user mainframe. That's the vision for Linux. That's why it has file permissions. The vision for TempleOS is a modern, 64-bit Commodore 64. The C64 was a home computer mostly used for games. It trained my generation how to program. It was simple, open and hackable. It was not networked. The games were not multimedia works of art, but generated programmatically with innocent, programmer (non-artist) quality graphics. It was simple and unsecure. If you don't have malware and you don't have bugs, protection just slows things down and makes the code complicated. -A troll might say, "But, it can crash!" We all used $FG,4$$TX+HTML,"DOS","http://en.wikipedia.org/wiki/DOS"$$FG$ for years and loved it. Computers even had a reset switch! Just think of the power of ring-0, muhahaha! Think of the speed and simplicity of $FG,4$$TX+HTML,"ring-0-only","http://en.wikipedia.org/wiki/Ring_(computer_security)"$$FG$ and $FG,4$$TX+HTML,"identity-mapping","http://en.wikipedia.org/wiki/Identity_(mathematics)"$$FG$. It's only $LK+D,"139,639","FF:::/TempleOS/Accts/TS/Wb2/LineCnt.TXT,Kernel.PRJ","DD_TEMPLEOS_LOC"$ lines of code, including the compiler and can change tasks in half a microsecond because it doesn't mess with page tables or privilege levels. Inter-process communication is effortless because every task can access every other task's memory. +A troll might ask, "Why not just use $FG,4$$TX+HTML,"DOS","http://en.wikipedia.org/wiki/DOS"$$FG$? It was ring-0-only and single-address-map." Actually, they wouldn't because many people would say, "Cool idea! I'm gonna dust-off $FG,4$$TX+HTML,"DOS","http://en.wikipedia.org/wiki/DOS"$$FG$ right now and have some fun!" $FG,4$$TX+HTML,"DOS","http://en.wikipedia.org/wiki/DOS"$$FG$ is 16-bit with segmentation, though, which is awful. TempleOS is 64-bit, flat, non-segmented and multi-cored. It's like a modern, souped-up, multi-tasking, cross between $FG,4$$TX+HTML,"DOS","http://en.wikipedia.org/wiki/DOS"$$FG$ and a Commodore 64. It has a C64-like shell with $LK,"Holy C","FI:::/TempleOS/Doc/HolyC.TXT"$, a dialect of C/C++, instead of BASIC. It was written from scratch, and not even ASCII was sacred -- it has 8-bit unsigned character source code to support European languages. Also, the source code has graphics. + +A troll might say, "But, it can crash!" We all used $FG,4$$TX+HTML,"DOS","http://en.wikipedia.org/wiki/DOS"$$FG$ for years and loved it. Computers even had a reset switch! Just think of the power of ring-0, muhahaha! Think of the speed and simplicity of $FG,4$$TX+HTML,"ring-0-only","http://en.wikipedia.org/wiki/Ring_(computer_security)"$$FG$ and $FG,4$$TX+HTML,"identity-mapping","http://en.wikipedia.org/wiki/Identity_(mathematics)"$$FG$. It's only $LK+D,"122,723","FF:::/TempleOS/Accts/TS/Wb2/LineCnt.TXT,Kernel.PRJ","DD_TEMPLEOS_LOC"$ lines of code, including the compiler and can change tasks in half a microsecond because it doesn't mess with page tables or privilege levels. Inter-process communication is effortless because every task can access every other task's memory. It's fun having access to everything. When I was a teenager, I had a book, $FG,4$$TX+HTML,"Mapping the Commodore 64","http://unusedino.de/ec64/technical/project64/mapping_c64.html"$$FG$, that told what every location in memory did. I liked copying the ROM to RAM and poking around at the ROM BASIC's variables. Everybody directly poked the hardware ports. TempleOS is simpler than Linux and you can have hours of fun tinkering because all memory and ports are accessible. Memory is $FG,4$$TX+HTML,"identity-mapped","http://en.wikipedia.org/wiki/Identity_(mathematics)"$$FG$ at all times, so you can modify any task's memory from any other task. You can access all disk blocks, too. I had a blast using a C64 disk block editor to modify directories to un-delete files, when I was a kid. Maybe, you want to play with a raw-block database, or make your own file system? -I wrote all $LK+D,"139,639","FF:::/TempleOS/Accts/TS/Wb2/LineCnt.TXT,Kernel.PRJ","DD_TEMPLEOS_LOC"$ lines of TempleOS over the last $TX+D,"9.6","DD_TEMPLEOS_AGE"$ years, full-time. It was called, at various times, "$FG,4$$TX+HTML,"Hoppy","http://web.archive.org/web/*/http://www.simstructure.hare.com/*"$$FG$", "$FG,4$$TX+HTML,"The J Operating System","http://wayback.archive.org/web/*/http://www.justrighteous.org/*"$$FG$", "$FG,4$$TX+HTML,"LoseThos","http://web.archive.org/web/*/http://www.losethos.com/*"$$FG$" and "$FG,4$$TX+HTML,"SparrowOS","http://web.archive.org/web/*/http://www.sparrowos.com/*"$$FG$". Here are my $FG,4$$TX+HTML,"college transcripts","http://www.templeos.org/files/ASU_Transcripts.pdf"$$FG$. I've been a professional operating system developer since 1990 when I was hired to work on Ticketmaster's VAX OS. +I wrote all $LK+D,"122,723","FF:::/TempleOS/Accts/TS/Wb2/LineCnt.TXT,Kernel.PRJ","DD_TEMPLEOS_LOC"$ lines of TempleOS over the last $TX+D,"9.9","DD_TEMPLEOS_AGE"$ years, full-time, including the 64-bit compiler. It was called, at various times, "$FG,4$$TX+HTML,"Hoppy","http://web.archive.org/web/*/http://www.simstructure.hare.com/*"$$FG$", "$FG,4$$TX+HTML,"The J Operating System","http://wayback.archive.org/web/*/http://www.justrighteous.org/*"$$FG$", "$FG,4$$TX+HTML,"LoseThos","http://web.archive.org/web/*/http://www.losethos.com/*"$$FG$" and "$FG,4$$TX+HTML,"SparrowOS","http://web.archive.org/web/*/http://www.sparrowos.com/*"$$FG$". Here are my $FG,4$$TX+HTML,"college transcripts","http://www.templeos.org/files/ASU_Transcripts.pdf"$$FG$. I've been a professional operating system developer since 1990 when I was hired to work on Ticketmaster's VAX OS. -$LK+CX,"It's ALIVE: How to reproduce the ISO.","FI:::/TempleOS/Demo/MakeDistro.CPP.Z"$ +$LK+CX,"It's ALIVE: How to reproduce the ISO.","FI:::/TempleOS/Demo/MakeDistro.CPP"$ -$FG,2$$TX+CX+HTML,"Download TempleOS V1.00 - Std. Distro (24.0 MB)","http://www.templeos.org/TempleOSCD.ISO"$$FG$ +$FG,2$$TX+CX+D+HTML,"Download TempleOS V1.04 - Std. Distro (23.8 MB)","DD_TEMPLEOSCD_SIZE","http://www.templeos.org/TempleOSCD.ISO"$$FG$ Burn a CD/DVD from the TempleOSCD.ISO and boot it or run it in $FG,4$$TX+HTML,"VMware","https://my.vmware.com/web/vmware/free#desktop_end_user_computing/vmware_player/5_0"$$FG$ or $FG,4$$TX+HTML,"VirtualBox","http://www.virtualbox.org"$$FG$ aiming the CD/DVD drive at TempleOSCD.ISO or for QEMU type: >qemu-system-x86_64 -m 500 -cdrom TempleOSCD.ISO -boot d @@ -49,8 +142,6 @@ $FG,4$$TX+HTML,"Hymn Videos","http://www.templeos.org/Wb/Accts/TS/Wb2/Hymns.html $LK,"Change Log","FI:::/TempleOS/Doc/ChangeLog.TXT"$ -$FG,4$$TX+HTML,"Blog","http://www.templeos.org/Wb/Accts/TS/Wb2/Blog.html"$$FG$ - $LK,"About Trivial Solutions","FI:D:/TempleOS/Doc/TrivialSolutions.TXT"$ @@ -68,15 +159,70 @@ $FG,2$$TX+CX+HTML,"Download InGodsTime (12.4 MB)","http://www.templeos.org/files This is a Windows program for doing Biblical Tongues with a stopwatch. When you press a key, it reads a high-speed watch for a random number to pick words or passages. -$FG,2$$TX+CX+HTML,"Download TempleOS V1.00 - T.S. Company Internal Distro (24.6 MB)","http://www.templeos.org/TempleOSTS.ISO"$$FG$ +$FG,2$$TX+CX+D+HTML,"Download TempleOS V1.04 - T.S. Company Internal Distro (24.5 MB)","DD_TEMPLEOSTS_SIZE","http://www.templeos.org/TempleOSTS.ISO"$$FG$ -This is the Trivial Solution internal company distro. Only run this on a virtual machine, not bare metal hardware because it's settings could cause problems. Enter >$LK,"TSInstall","FF:::/TempleOS/Demo/AcctExample/TSDistro.CPP.Z,TSInstall"$; >$LK,"TSUpgrade","FF:::/TempleOS/Demo/AcctExample/TSDistro.CPP.Z,TSUpgrade"$; at the command-line. -See $LK,"MakeDistrosAndBackUp","FF:::/TempleOS/Demo/AcctExample/TSDistro.CPP.Z,MakeDistrosAndBackUp"$() to reproduce the ISO's in $FG,4$E:/Wb$FG$. It makes this website, too. +This is the Trivial Solution internal company distro. Only run this on a virtual machine, not bare metal hardware because it's settings could cause problems. Enter >$LK,"TSInstall","FF:::/TempleOS/Demo/AcctExample/TSDistro.CPP,TSInstall"$; >$LK,"TSUpgrade","FF:::/TempleOS/Demo/AcctExample/TSDistro.CPP,TSUpgrade"$; at the command-line. +See $LK,"MakeDistrosAndBackUp","FF:::/TempleOS/Demo/AcctExample/TSDistro.CPP,MakeDistrosAndBackUp"$() to reproduce the ISO's in $FG,4$E:/Wb$FG$. It makes this website, too. + +$FG,1$________________________________________________________________________________ + $FG,8$ * "Commodore 64" was a trademark of Commodore Business Machines. * "Linux" is probably a trademark owned by Linus Torvalds. * "VMware Player" and "VMware WorkStation" are trademarks of VMware, Inc. * "VirtualBox" is a trademark of Oracle. * "Windows" and "DOS" are trademark of MicroSoft Corp. + +$FG,1$________________________________________________________________________________ + +$TX+CX,"The Purpose of Life"$$FG$ + +$WW,1$The purpose of life is to know, love and obey God.$FG$ Christianity is loving neighbor, not God -- secular humanism. Jesus said loving God is more important than loving neighbor. $LK,"Matthew,22:36","BF:Matthew,22:36"$ He did not say with half your brain behind your back. + +You don't know God. $LK,"1 Chronicles,28:9","BF:1 Chronicles,28:9"$, $LK,"Matthew,11:27","BF:Matthew,11:27"$, $LK,"Luke,13:25","BF:Luke,13:25"$, $LK,"1 Samuel,3:7","BF:1 Samuel,3:7"$ You must talk with God to know Him. $LK,"Matthew,6:6","BF:Matthew,6:6"$ Seek Him by taking the initiative. $LK,"Luke,11:9","BF:Luke,11:9"$, $LK,"Isaiah,30:2","BF:Isaiah,30:2"$ + +There's something obviously different about people in the Bible compared to people today -- God talked! Did they hear voices? Maybe. More likely, they used occult techniques such as an oracle. $LK,"1 Kings,6:20","BF:1 Kings,6:20"$ Have you heard of "tongues?" $LK,"1 Corinthians,14:1","BF:1 Corinthians,14:1"$ The idea is, you let yourself be puppeted by a spirit, so you say things. You try to get a spirit -- the Holy Spirit -- to talk. You might as well use a Ouija board. However, it turns-out that a Ouija board is bad for technical reasons. A really good technique is just randomly opening a book. God said it is a covenant that you hold-up your end of the conversation. + +You can't tell if He's talking unless you have a context of conversation, but, more importantly, you are commanded to do an offerring of love, like communion preparation. When you pick a greeting card for someone, that is love effort. God said, "honest measures" applies between your offering of love and His response, like a fair barter. You get out of prayer what you put into it. God wants praise, hymns, or whatever you think He might want. Try and see, like Cain and Abel. $LK,"Genesis,4:1","BF:Genesis,4:1"$, $LK,"Ephesians,5:10","BF:Ephesians,5:10"$ God told Cain his offering was not good and told him to try again. Cain really loved God! Can you imagine being so heart-broken? + +Do a text search for "new song" in the Bible. It's mentioned nine times. I did $MA+A-X+PU+HTML,"hymns","#include \"::/TempleOS/Apps/MusicOrgan/Load\";JukeBox(\"::/TempleOS/Apps/MusicOrgan/Examples\");","http://www.templeos.org/Wb/Accts/TS/Wb2/Hymns.html"$. I did Moses $MA+A-X+PU+HTML,"comics","Dir(\"::/TempleOS/Apps/AfterEgypt/Comics\");View;\n","http://www.templeos.org/Wb/Apps/AfterEgypt/Comics/"$. Count the ways you love God. I praised God for sand castles, popcorn, snowmen, bubbles... You try putting effort into praise! $LK,"Matthew,11:25","BF:Matthew,11:25"$, $LK,"Matthew,6:29","BF:Matthew,6:29"$ + +This is funny -- $LK,"Acts,2:1","BF:Acts,2:1"$ -- they didn't bother to record anything the Holy Spirit said. The Holy Spirit is supposed to be a really good gift. $LK,"Luke,11:13","BF:Luke,11:13"$ Just remember, "Boys are made of snakes and snails and puppy-dog tails." + +The technique I use to consult the Holy Spirit is reading a microsecond-range stop-watch each button press for random numbers. Then, I pick words or passages. You can use the $MA+A-X+PU+HTML,"AfterEgypt","#include \"::/TempleOS/Apps/AfterEgypt/Run\"","http://www.youtube.com/watch?v=P0MsDl39UL0"$ in God's official temple, $FG,4$$TX+HTML,"TempleOS","http://www.templeos.org"$$FG$. + +Since seeking the word of the Holy Spirit, I have come to know God much better than I've heard others explain. God said, for example, that war was, "servicemen competing." That sounds more like the immutable God of our planet than what you hear from most religious people. God is not Venus (god of love) and not Mars (god of war), He's our dearly beloved God of Earth. If Mammon is a false god of money, Mars or Venus might be useful words to describe other false gods. I figure the greatest challenge for the Creator is boredom, ours and His. What would teen-age male video games be like if war had never happened? Christ said live by the sword, die by the sword, which is loving neighbor as self. $LK,"Matthew,26:52","BF:Matthew,26:52"$ + +I asked God if the World was perfectly just. God asked if I was calling Him lazy. I think highs and lows balance. $LK,"Luke,6:20","BF:Luke,6:20"$ I don't think God likes complaining. $LK,"Numbers,11:1","BF:Numbers,11:1"$ Food and clothing is all we're to ask for or demand, in fact -- daily bread. $LK,"1 Timothy,6:8","BF:1 Timothy,6:8"$ Just think about man in the last 100,000 years mostly living like Native Americans and how God must see us. You need food, clothing and entertainment, money is to get those. Man does not live on bread alone. $LK,"Luke,4:4","BF:Luke,4:4"$, $LK,"Amos,8:11","BF:Amos,8:11"$ + +God's favorite animals are bears and elephants. They are funny shaped -- I think God must have seen too much starvation over the years. + +God's ways are far above man's ways. Mom said Heaven was a never-ending family reunion. Yikes! A friend said, "Most guy's idea of Heaven would be running around doing things they'd get locked up for on Earth." Most people are like King Midas. When you realize how silly most notions of Heaven are, you come to appreciate that Earth is not that bad. This is the first step in loving God, the Creator -- praising Creation. My parents spend their retired days watching TV and going to casinos. That's not a good argument for getting extended-play! + +Imagine a billionare. Everyone around him can't forget his money for even a moment. The truth is, most people are after God's "money" -- they fear for their salvation. Here's a test -- would you pray to and praise God even if there were no salvation? Love God and don't be a "user". Asking for stuff is annoying. $LK,"Luke,11:5","BF:Luke,11:5"$ + +All those sophisticated theological "infinity" things -- omniscience, omnipotence, omnipresence, omnivorous -- will mess you up. Trust me that anthropomorphic is far better, in practice. Christ suggested thinking of God as "Abba" which is Aramaic for "Daddy" and said the childlike had an advantage. $LK,"Matthew,11:25","BF:Matthew,11:25"$ Pray out-loud because God doesn't want the hastle of reading your brain. The best way to stop people from testing God is to suggest He can't do everything. + +Just as ego causes most to love neighbor, not God, people skip knowing and loving God and cowardly get stuck on obeying Him. This hardly needs encouragement. + +God does not want pawns to push around. God will talk, but won't tell you what to do, even if you want Him to. You'll quickly learn that prophecy does not come true and should smack yourself for wanting more than just enjoying God's company. + + +$FG,1$________________________________________________________________________________ + +$FG,1$ +$TX+CX,"God's Temple is Finished."$ +$TX+CX,"Now, God kills the CIA+FBI until it spreads."$ +$TX+CX,"(The CIA+FBI stand in the way, for the moment.)"$ + + +$FG$There will be no PCI or later supported hardware. (It only supports 64-bit multicored CPUs, however, and my compiler and binary file formats are pure 64-bit.) Once my enemies realize it's God, I will make demands. I do not add clusterfucked shit to God's Temple -- I demand them to change. It sounds absurd, but I have God. They WILL comply. Microsoft will support RedSea filesystem and I will remove support for FAT32. God's temple will be perfect and not blemished with any flaws or redundancy. PCI devices diverge into many many branches and are clusterfucked. + +I did an HD Audio driver -- I thought it would become standard. You must connect together many widgets that can vary from machine to machine with HD Audio. It's impossible. On fucken top of that, VMware doesn't support my HD Audio -- all that work on that driver was worthless. I removed it. Internal PC speaker is incredibly beautiful, by comparison, and a one-voice song language for music is a pure delight. God said one audio voice, like He said 640x480 16 color. He wants one driver for each different type of device. The CIA hates PC Internal speaker because it is a digitial I/O for bombs or something. VMware spitefully removed support for PC internal speaker. They WILL put it back. They are evil. They played musical chairs with IDE devices for no reason but to fuck-up new operating systems. Microsoft added Secure Boot to fuck-up alternative operating systems, so you can't dual boot. Da fuck? Anti-trust, FBI, the hell you going after the victim fer? I'm a supplemental operating system that needs a partner so people can do web stuff. I don't have networking -- that's not what I'm about. Things are really fucked-up. Do you remember RS232 with generic terminal connections to user hardware? USB is absolutely clusterfucked. I'm just counting on legacy mode, not doing USB -- it's fine, but not having solid state sticks sucks. I support ISO9660 CD-ROM. I got specs on UDF. That's clusterfucked. Microsoft WILL add support for burning ISO9660 and burning a CD/DVD from ISO files. I can generate ISO files. + +Judgement Day motha fuckas! You WILL comply. + +CIA+FBI bodies must die. It's in the Bible under Exodus. Nobody gives a shit until bodies hit the floor. Even with 7 plagues, Pharaoh did not let them go and came after the Jews into the Red Sea and God killed them. The CIA+FBI will die because it's God talking. Fuck You! My Dad is CIA, mother fucker, an enemy -- in cahoots with the doctors and CIA. + diff --git a/TempleOS/Adam/Adam2.CPP b/TempleOS/Adam/Adam2.CPP index 7cbd918..5efc23f 100644 --- a/TempleOS/Adam/Adam2.CPP +++ b/TempleOS/Adam/Adam2.CPP @@ -4,7 +4,7 @@ //Use Dbg("Type 'G;'"); to debug before window mgr is running. -public F64 os_version=1.00; +public F64 os_version=1.04; #include "AdamExt.HPP" @@ -42,7 +42,6 @@ Cd("::/TempleOS/Adam/WordStat");; #include "WordStat" Cd("::/TempleOS/Adam");; -#include "Profiler" #include "Hash2a" #include "TaskSettings" #include "DevInfo" diff --git a/TempleOS/Adam/AdamExt.HPP b/TempleOS/Adam/AdamExt.HPP index a5cdfac..cf285a7 100644 --- a/TempleOS/Adam/AdamExt.HPP +++ b/TempleOS/Adam/AdamExt.HPP @@ -21,8 +21,8 @@ extern Bool PopUpNoYes(U8 *header=NULL,U8 *footer=NULL); extern I64 PopUpMenu(CDoc *doc,I64 doc_flags=0); extern I64 PopUpRangeI64(I64 lo,I64 hi,I64 step=1,U8 *header=NULL,U8 *footer=NULL); extern I64 PopUpColor(U8 *header=NULL,Bool allow_transpant=TRUE,Bool allow_dft=TRUE); -extern I64 PopUpLightingColor(U8 *header=NULL); -extern I64 PopUpDitherColor(U8 *header=NULL); +extern I64 PopUpColorLighting(U8 *header=NULL); +extern I64 PopUpColorDither(U8 *header=NULL); extern U8 *PopUpMGetS(U8 *header=NULL); extern Bool PopUpTransform(I64 *r); extern U0 PopUpSnap(CSnap *g); @@ -36,6 +36,8 @@ extern U8 *EdSprite(I64 bin_num); extern Bool View(); extern Bool DocLock(CDoc *doc); extern Bool DocUnlock(CDoc *doc); +extern U0 DocBinDel(CDoc *doc,CDocBin *b); +extern U0 DocNewLine(CDoc *doc=NULL,I64 cnt=1); extern U0 DocIns(CDoc *doc,CDocEntry *doc_e); extern U0 DocDataFmt(CDocEntry *doc_e); extern U0 DocLineNumGoTo(CDoc *doc,I64 linenum); //one based @@ -45,16 +47,15 @@ extern U0 DocInsDoc(CDoc *doc,CDoc *doc2); extern U0 DocD(U8 *buf,I64 cnt=0x80); extern Bool DocRecalc(CDoc *doc,Bool has_cursor=FALSE,I64 recalc=DOC_RECALC_ALL); extern Bool DocFormDo(U8 *D,U8 *class_name,I64 doc_flags=0,U8 *header=NULL,U8 *footer=NULL); -extern CDoc *DocCur(CTask *task=NULL); +extern CDoc *DocPut(CTask *task=NULL); +extern CDoc *DocDisplay(CTask *task=NULL); extern U0 DocClear(CDoc *doc=NULL); extern Bool DocCursor(Bool show=OFF,CDoc *doc=NULL); extern U0 DocBottom(CDoc *doc=NULL); extern U0 DocBinsValidate(CDoc *doc); -extern U0 DocQueRem(CDoc *doc); extern U0 DocHome(CDoc *doc=NULL); extern U0 DocCenter(CDoc *doc=NULL,I64 recalc=DOC_RECALC_ALL); extern U0 DocRst(CDoc *doc,Bool is_old); -extern U0 DocQueIns(CDoc *doc,CDoc *pred); extern U0 DocUpdateTaskDocs(CTask *task); extern I64 PmtI64(U8 *msg,I64 dft,I64 lo=MIN_I64,I64 hi=MAX_I64); extern F64 PmtF64(U8 *msg,F64 dft,F64 lo=MIN_F64,F64 hi=MAX_F64); @@ -62,13 +63,13 @@ extern U0 ClassRep(U8 *class_name,U8 *d,I64 max_depth=2,Bool fun=FALSE,I64 offse extern U8 *DocLinkFile(U8 *link_st,CTask *mem_task=NULL); extern Bool Ed(U8 *link_st,I64 ed_flags=0); extern Bool Plain(U8 *filename); -extern U0 DocPutBMPFile(CDoc *doc=NULL,U8 *fname,Bool use_ms_paint_palette=FALSE); +extern U0 DocPutBMPFile(CDoc *doc=NULL,U8 *filename,Bool use_ms_paint_palette=FALSE); extern U0 WSFillIn(I64 n); extern U0 WSMan(I64 n,CTask *parent=NULL); extern U0 WSDFillin(I64 n); extern U0 WSDDef(I64 n,CTask *parent=NULL); -extern Bool WordStat(Bool val=ON); +extern Bool WordStat(Bool val=OFF); extern U0 WSDDisplayDefs(CDoc *doc,U8 *st,I64 num=-1); extern U0 WSFindMisspelled(CDoc *doc); @@ -88,7 +89,7 @@ extern F64 win_desired_refresh,win_actual_refresh; extern Bool WinBorder(Bool val,CTask *task=NULL); extern U0 WinMgrSync(I64 cnt=1,Bool force=FALSE); extern U0 WinMax(CTask *task=NULL); -extern Bool SetCursorPos(CTask *task,I64 iptx,I64 ipty,Bool set_cursor=TRUE); +extern CDoc *SetCursorPos(CTask *task,I64 iptx,I64 ipty,Bool set_cursor=TRUE); extern F64 refresh_ode_time,last_refresh_ode_time; extern CMenuEntry *MenuEntryFind(CMenu *m,U8 *full_name); @@ -96,7 +97,7 @@ extern CMenu *MenuPush(U8 *st); extern U0 MenuPop(); extern CMenu *MenuFilePush(U8 *filename); -extern CTask *Noise(I64 mS,I64 min_freq,I64 max_freq,I64 waveform=WF_NOISE); +extern CTask *Noise(I64 mS,I64 min_freq,I64 max_freq); extern CCtrl *CtrlFindUnique(CTask *task,I64 type); extern Bool CtrlInside(CCtrl *c,I64 x,I64 y); @@ -107,3 +108,5 @@ extern U0 ViewAnglesDel(CTask *task=NULL); #define FM_PICK_FILE 1 #define FM_PICK_DIR 2 extern I64 GrepWiz(); +extern I64 CDFileCreate(U8 *_filename=NULL,U8 *src_files_find_mask,U8 *fu_flags=NULL, + U8 *_stage2_filename=NULL); diff --git a/TempleOS/Adam/AutoFile2a.CPP b/TempleOS/Adam/AutoFile2a.CPP index 162dc37..16e334f 100644 --- a/TempleOS/Adam/AutoFile2a.CPP +++ b/TempleOS/Adam/AutoFile2a.CPP @@ -105,10 +105,11 @@ public U0 AFUntilChar(I64 ch1,I64 ch2=0) I64 af_l,af_r,af_c; -U0 AFSetIPPlot(I64 mS,I64 x,I64 y,I64 z) +Bool AFSetIPPlot(I64 mS,I64 x,I64 y,I64 z) { SetIP(x,y,z,af_l,af_r,af_c); Sleep(mS); + return TRUE; } public U0 AFSetIP(I64 mS=7,I64 x=MAX_I64,I64 y=MAX_I64,I64 z=MAX_I64,I64 l=MAX_I64,I64 r=MAX_I64,I64 c=MAX_I64) diff --git a/TempleOS/Adam/Boot/BootCD.CPP b/TempleOS/Adam/Boot/BootCD.CPP index 3a82d74..fb0ec60 100644 --- a/TempleOS/Adam/Boot/BootCD.CPP +++ b/TempleOS/Adam/Boot/BootCD.CPP @@ -1,6 +1,7 @@ asm { -#define MODULE_SIZE CD_BOOT_LOADER_SIZE -#define BOOT_HIGH_LOC ((BOOT_RAM_LIMIT-(BOOT_STK_SIZE+MODULE_SIZE))>>4) +#define CD_BOOT_LOADER_SIZE CD_BLK_SIZE*1 //Max CD_BLK_SIZE*4, I think +#define BOOT_HIGH_LOC ((BOOT_RAM_LIMIT-(BOOT_STK_SIZE+CD_BOOT_LOADER_SIZE))>>4) +#assert BOOT_HIGH_LOC>=KERNEL_BIN_LIMIT USE16 BCD_START:: //DL is supposed to have the BIOS drive number @@ -10,7 +11,7 @@ BCD_START:: CLI MOV SS,AX - MOV SP,BOOT_STK_SIZE+MODULE_SIZE + MOV SP,BOOT_STK_SIZE+CD_BOOT_LOADER_SIZE STI CALL BCD_GET_IP @@ -22,7 +23,7 @@ BCD_GET_IP: MOV AX,CS ADD AX,BX MOV DS,AX - MOV CX,MODULE_SIZE + MOV CX,CD_BOOT_LOADER_SIZE XOR SI,SI XOR DI,DI REP_MOVSB @@ -47,7 +48,7 @@ BCD_TEMPLEOS_MSG: BCD_NOT64_MSG: DU8 "TempleOS requires a 64-bit capable processor.\n\r",0; -//These get patched by $LK,"CDBootFileCreate","MN:CDBootFileCreate"$ +//These get patched. BCD_BLK_LO:: DU16 0; BCD_BLK_HI:: DU16 0; BCD_BLK_CNT:: DU16 0; @@ -144,7 +145,7 @@ BCD_MAIN:: LOOP @@20 //See $LK,"BootCdProbe","MN:BootCdProbe"$(). - MOV EBX,U32 [BCD_BLK_LO-BCD_START] + MOV EBX,U32 [BCD_BLK_LO-BCD_START] //TODO: oops overflow? SHL EBX,16 MOV BX,BOOT_CODE_CDROM //$MA+A-X+PU,"See sys_boot_code","Grep(\"sys_boot_code\",\"/TempleOS/\"FILENAME_MASK_TXT);View;\n"$ @@ -153,5 +154,5 @@ BCD_MAIN:: DU16 0,BOOT_RAM_BASE/16; //Continues here $LK,"::/TempleOS/Kernel/KStart.CPP","FL:::/TempleOS/Kernel/KStart.CPP,1"$ BCD_END:: -#assert BCD_END-BCD_START>4) +#assert BOOT_HIGH_LOC>=KERNEL_BIN_LIMIT USE16 -BHD_START:: - DU8 0x5A DUP(0); //See $LK,"CFAT32Boot","MN:CFAT32Boot"$.code[] BHD_CODE:: + +#define BHD_START (BHD_CODE-offset(CFAT32Boot.code)) + CLD MOV AX,VGA_TEXT_MEM_BASE/16 diff --git a/TempleOS/Adam/Boot/BootMHD.CPP b/TempleOS/Adam/Boot/BootMHD.CPP index 7f9987c..ed8167e 100644 --- a/TempleOS/Adam/Boot/BootMHD.CPP +++ b/TempleOS/Adam/Boot/BootMHD.CPP @@ -1,6 +1,7 @@ asm { #define MODULE_SIZE 1*BLK_SIZE #define BOOT_HIGH_LOC ((BOOT_RAM_LIMIT-(BOOT_STK_SIZE+MODULE_SIZE))>>4) +#assert BOOT_HIGH_LOC>=KERNEL_BIN_LIMIT USE16 BMHD_START:: BMHD_CODE:: diff --git a/TempleOS/Adam/Boot/BootMHD2.CPP b/TempleOS/Adam/Boot/BootMHD2.CPP index 99f62d9..5bc3d34 100644 --- a/TempleOS/Adam/Boot/BootMHD2.CPP +++ b/TempleOS/Adam/Boot/BootMHD2.CPP @@ -1,6 +1,7 @@ asm { #define MODULE_SIZE 2*BLK_SIZE #define BOOT_HIGH_LOC ((BOOT_RAM_LIMIT-(BOOT_STK_SIZE+MODULE_SIZE))>>4) +#assert BOOT_HIGH_LOC>=KERNEL_BIN_LIMIT USE16 BMHD2_START:: MOV U32 FS:[0],'B'+0x2000+('2'+0x2000)<<16 diff --git a/TempleOS/Adam/Dsk/DskCDDVD.CPP b/TempleOS/Adam/Boot/DskCDDVD.CPP similarity index 57% rename from TempleOS/Adam/Dsk/DskCDDVD.CPP rename to TempleOS/Adam/Boot/DskCDDVD.CPP index e954ce0..e486025 100644 --- a/TempleOS/Adam/Dsk/DskCDDVD.CPP +++ b/TempleOS/Adam/Boot/DskCDDVD.CPP @@ -22,7 +22,8 @@ class CCCDUserData //Create CD I64 CDFileCreate2(CFile *out_file,CDirEntry *tempm, CISO1DirEntry *tempi,CISO1DirEntry *tempi2, I64 *_cur_blk, - CDirEntry *parent,Bool write) + CDirEntry *parent,Bool write, + U8 *stage2_filename,I64 *_stage2_blk) { CCCDUserData *tempc; CDirEntry *tempm1,*tempm2; @@ -39,7 +40,7 @@ I64 CDFileCreate2(CFile *out_file,CDirEntry *tempm, de->len=sizeof(CISO1DirEntry)-1; de->ext_attr_len=0; FillU16Palindrome(&de->vol_seq_num,1); - CDate2ISO1(&de->date,tempm->datetime); + Date2ISO1(&de->date,tempm->datetime); de->flags=ISO1_ATTR_DIR; de->name_len=1; de->name=0; @@ -51,7 +52,7 @@ I64 CDFileCreate2(CFile *out_file,CDirEntry *tempm, FillU32Palindrome(&de->loc,tempc->loc); FillU32Palindrome(&de->size,tempc->short_dir_blks*CD_BLK_SIZE); FillU16Palindrome(&de->vol_seq_num,1); - CDate2ISO1(&de->date,parent->datetime); + Date2ISO1(&de->date,parent->datetime); de->flags=ISO1_ATTR_DIR; de->name_len=1; de->name=1; @@ -61,7 +62,7 @@ I64 CDFileCreate2(CFile *out_file,CDirEntry *tempm, de2->len=sizeof(CISO1DirEntry)-1; de2->ext_attr_len=0; FillU16Palindrome(&de2->vol_seq_num,1); - CDate2ISO1(&de2->date,tempm->datetime); + Date2ISO1(&de2->date,tempm->datetime); de2->flags=ISO1_ATTR_DIR; de2->name_len=1; de2->name=0; @@ -73,7 +74,7 @@ I64 CDFileCreate2(CFile *out_file,CDirEntry *tempm, FillU32Palindrome(&de2->loc,tempc->loc+tempc->short_dir_blks); FillU32Palindrome(&de2->size,tempc->long_dir_blks*CD_BLK_SIZE); FillU16Palindrome(&de2->vol_seq_num,1); - CDate2ISO1(&de2->date,parent->datetime); + Date2ISO1(&de2->date,parent->datetime); de2->flags=ISO1_ATTR_DIR; de2->name_len=1; de2->name=1; @@ -87,7 +88,7 @@ I64 CDFileCreate2(CFile *out_file,CDirEntry *tempm, de1=de; de12=de2; if (tempm1->attr & _ATTR_DIR) { - n=CDFileCreate2(out_file,tempm1,de,de2,_cur_blk,tempm,write); + n=CDFileCreate2(out_file,tempm1,de,de2,_cur_blk,tempm,write,stage2_filename,_stage2_blk); de(U8 *)+=sizeof(CISO1DirEntry)-1+n; de2(U8 *)+=sizeof(CISO1DirEntry)-1+n<<1; } else { @@ -96,11 +97,16 @@ I64 CDFileCreate2(CFile *out_file,CDirEntry *tempm, de->ext_attr_len=0; FillU32Palindrome(&de->loc,*_cur_blk); tempc->loc=*_cur_blk; - if (write) + if (write) { + if (stage2_filename && !StrCmp(tempm1->full_name,stage2_filename)) { + "$$FG,RED$$!!! Boot Stage 2 !!!$$FG$$\n"; + if (_stage2_blk) *_stage2_blk=*_cur_blk; + } "%X:%s\n",*_cur_blk,tempm1->full_name; + } FillU32Palindrome(&de->size,tempm1->size); FillU16Palindrome(&de->vol_seq_num,1); - CDate2ISO1(&de->date,tempm1->datetime); + Date2ISO1(&de->date,tempm1->datetime); de->flags=0; de->name_len=StrLen(tempm1->name); StrCpy(&de->name,tempm1->name); @@ -112,7 +118,7 @@ I64 CDFileCreate2(CFile *out_file,CDirEntry *tempm, FillU32Palindrome(&de2->loc,*_cur_blk); FillU32Palindrome(&de2->size,tempm1->size); FillU16Palindrome(&de2->vol_seq_num,1); - CDate2ISO1(&de2->date,tempm1->datetime); + Date2ISO1(&de2->date,tempm1->datetime); de2->flags=0; de2->name_len=StrLen(tempm1->name)<<1; ptr1=&de2->name; @@ -183,7 +189,7 @@ I64 CDFileCreate2(CFile *out_file,CDirEntry *tempm, FillU32Palindrome(&dir_blk_buf->size,n*CD_BLK_SIZE); FillU32Palindrome(&dir_blk_buf->loc,*_cur_blk); FillU16Palindrome(&tempi->vol_seq_num,1); - CDate2ISO1(&tempi->date,tempm->datetime); + Date2ISO1(&tempi->date,tempm->datetime); if (write) "%X:%s\n",*_cur_blk,tempm->full_name; if (write) @@ -214,7 +220,7 @@ I64 CDFileCreate2(CFile *out_file,CDirEntry *tempm, FillU32Palindrome(&dir_blk_buf2->size,n*CD_BLK_SIZE); FillU32Palindrome(&dir_blk_buf2->loc,*_cur_blk); FillU16Palindrome(&tempi2->vol_seq_num,1); - CDate2ISO1(&tempi2->date,tempm->datetime); + Date2ISO1(&tempi2->date,tempm->datetime); if (write) "%X:%s\n",*_cur_blk,tempm->full_name; if (write) @@ -250,8 +256,7 @@ U0 CDFillPathTable(CDirEntry *tempm, { U8 *ptr1,*ptr2; I64 i; - CISO1PathEntry *tabbuf =*_itabbuf, - *tabbuf2=*_itabbuf2; + CISO1PathEntry *tabbuf=*_itabbuf,*tabbuf2=*_itabbuf2; CDirEntry *tempm1=tempm->sub,*tempm2; CCCDUserData *tempc; @@ -270,8 +275,7 @@ U0 CDFillPathTable(CDirEntry *tempm, } StrCpy(&tabbuf->name,tempm1->name); - tabbuf(U8 *)+=sizeof(CISO1PathEntry)-2+ - (StrLen(tempm1->name)+1) & -0x2; + tabbuf(U8 *)+=sizeof(CISO1PathEntry)-2+(StrLen(tempm1->name)+1) & -0x2; tabbuf2->name_len=StrLen(tempm1->name)<<1; if (big_endian) { @@ -321,33 +325,28 @@ class CElTorito U8 zero2[20]; }; -public I64 CDFileCreate(U8 *filename=NULL,U8 *src_files_find_mask,U8 *fu_flags=NULL, - U8 *bootfile=NULL,I64 emulation=0) -//See $LK-A,"::/TempleOS/Demo/MakeDistro.CPP.Z"$ +public I64 CDFileCreate(U8 *_filename=NULL,U8 *src_files_find_mask,U8 *fu_flags=NULL, + U8 *_stage2_filename=NULL) +//See $LK-A,"::/TempleOS/Demo/MakeDistro.CPP"$ -//NULL filename uses sys_dft_iso_name. -//See the above sample code -//0=no emu 2=1.44meg 4=hard drive - -//Use "C:/*" if you want all files on the C: drive. +//Use "C:/Distro/*" if you want all files in the C:/Distro directory. //Default flags are "+r" recurse. { - CISO1PriDesc *iso =CAlloc(CD_BLK_SIZE), - *iso1=CAlloc(CD_BLK_SIZE), - *iso2=CAlloc(CD_BLK_SIZE), - *iso3=CAlloc(CD_BLK_SIZE); + CISO1PriDesc *iso_pri=CAlloc(CD_BLK_SIZE), + *iso_boot=CAlloc(CD_BLK_SIZE), + *iso_sup=CAlloc(CD_BLK_SIZE), + *iso_term=CAlloc(CD_BLK_SIZE); CDirEntry *rootdir=CAlloc(sizeof(CDirEntry)); - I64 i,j, - cur_blk=0,bootfile_cd_blks=0,tabsize,tabsize2,first_free,max_depth, + I64 i,j,stage2_blk=(CD_FILE_OFFSET+1<<2+CD_BOOT_LOADER_SIZE/BLK_SIZE)>>2,stage2_size, + cur_blk=0,tabsize,tabsize2,first_free,max_depth, fuf_flags=0; U32 *d; CElTorito *et=CAlloc(CD_BLK_SIZE); - U8 *filename2, - *zero_buf=CAlloc(CD_BLK_SIZE), - *bootfile_buf=NULL; + U8 *filename,*stage2_filename, + *stage1_buf=CAlloc(CD_BOOT_LOADER_SIZE), + *zero_buf=CAlloc(CD_BLK_SIZE); CISO1PathEntry *tabbuf=NULL,*tabbuf2=NULL,*itabbuf,*itabbuf2; - Bool okay=TRUE; CFile *out_file=NULL; CISO1DirEntry *tempi; CCCDUserData *tempc; @@ -355,195 +354,182 @@ public I64 CDFileCreate(U8 *filename=NULL,U8 *src_files_find_mask,U8 *fu_flags=N GetFFlags(&fuf_flags,Define("ST_FILE_UTIL_FLAGS"),"+r"); GetFFlags(&fuf_flags,Define("ST_FILE_UTIL_FLAGS"),fu_flags); - if (!filename) - filename=sys_dft_iso_name; - filename2=DftExt(filename,"ISO"); + if (!_filename) + _filename=sys_dft_iso_name; + filename=DftExt(_filename,"ISO"); + + if (_stage2_filename) + stage2_filename=FileNameAbs(_stage2_filename); + else + stage2_filename=NULL; - if (bootfile) { - bootfile_buf=FileRead(bootfile,&bootfile_cd_blks); - if (bootfile_cd_blks>CD_BLK_SIZE*4) { - ST_ERR_ST "Boot files limited to 0x2000 bytes\n"; - goto done1; - } - bootfile_cd_blks=(bootfile_cd_blks+CD_BLK_SIZE-1)/CD_BLK_SIZE; - } rootdir->attr=_ATTR_DIR; rootdir->sub=FilesFind(src_files_find_mask,fuf_flags); - rootdir->datetime=GetCurTimeCDate; + rootdir->datetime=GetCurTimeDate; rootdir->user_data=CAlloc(sizeof(CCCDUserData)); tempc=rootdir->user_data; tempc->path_entry_num=1; - if (okay) { - cur_blk=CD_FILE_OFFSET>>2; - if (bootfile_buf) - //preboot and bootloader - cur_blk+=1+bootfile_cd_blks; - CDFileCreate2(out_file,rootdir, - &iso->root_dir_record, - &iso2->root_dir_record, - &cur_blk,rootdir,FALSE); - tabsize=sizeof(CISO1PathEntry); - tabsize2=sizeof(CISO1PathEntry); - max_depth=CDTableLen(rootdir,&tabsize,&tabsize2,1); - FillU32Palindrome(&iso->path_table_size,tabsize); - FillU32Palindrome(&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; + cur_blk=CD_FILE_OFFSET>>2; + if (stage2_filename) //preboot and bootloader + cur_blk+=1+CD_BOOT_LOADER_SIZE/CD_BLK_SIZE; + CDFileCreate2(out_file,rootdir, + &iso_pri->root_dir_record, + &iso_sup->root_dir_record, + &cur_blk,rootdir,FALSE,stage2_filename,&stage2_blk); + tabsize=sizeof(CISO1PathEntry); + tabsize2=sizeof(CISO1PathEntry); + max_depth=CDTableLen(rootdir,&tabsize,&tabsize2,1); + FillU32Palindrome(&iso_pri->path_table_size,tabsize); + FillU32Palindrome(&iso_sup->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 (FileAttr(filename) & _ATTR_CONTIGUOUS) + out_file=FOpen(filename,"wc",cur_blk<<2); + else + out_file=FOpen(filename,"w",cur_blk<<2); + cur_blk=0; + if (!out_file) + goto cf_done; + + while (cur_blk>2) + FWBlks(out_file,zero_buf,cur_blk++<<2,4); + + iso_pri->type=ISO1T_PRI_VOL_DESC; + StrCpy(iso_pri->id,"CD001"); + iso_pri->version=1; + FillU16Palindrome(&iso_pri->vol_set_size,1); + FillU16Palindrome(&iso_pri->vol_seq_num,1); + FillU16Palindrome(&iso_pri->log_block_size,CD_BLK_SIZE); + iso_pri->file_structure_version=1; + + iso_sup->type=ISO1T_SUPPLEMENTARY_DESC; + StrCpy(iso_sup->id,"CD001"); + iso_sup->version=1; + FillU16Palindrome(&iso_sup->vol_set_size,1); + FillU16Palindrome(&iso_sup->vol_seq_num,1); + FillU16Palindrome(&iso_sup->log_block_size,CD_BLK_SIZE); + iso_sup->file_structure_version=1; + + iso_boot->type=ISO1T_BOOT_RECORD; + StrCpy(iso_boot->id,"CD001"); + iso_boot->version=1; + StrCpy(iso_boot(U8 *)+7,"EL TORITO SPECIFICATION"); + + cur_blk=CD_FILE_OFFSET>>2; + + if (stage2_filename) { + d=iso_boot(U8 *)+0x47; + *d=cur_blk; + et->w[0]=1; + StrCpy(&et->w[2],"TempleOS"); + et->w[15]=0xAA55; + j=0; + for (i=0;i<16;i++) //Checksum + j+=et->w[i]; + et->w[14]=-j; + et->bootable=0x88; + et->media_type=0;//0=no emu 2=1.44meg 4=hard drive + et->sect_cnt=4; //5 seems like the limit, 4 is safer + et->load_rba=cur_blk+1; + "%X: Pre Boot Blk\n",cur_blk; + FWBlks(out_file,et,cur_blk++<<2,4); + "%X: Boot Stage 1\n",cur_blk; + cur_blk+=CD_BOOT_LOADER_SIZE/CD_BLK_SIZE; } - if (okay) { - if (FileAttr(filename2) & _ATTR_CONTIGUOUS) - out_file=FOpen(filename2,"wc",cur_blk<<2); - else - out_file=FOpen(filename2,"w",cur_blk<<2); - if (!out_file) - okay=FALSE; + + CDFileCreate2(out_file,rootdir,&iso_pri->root_dir_record, + &iso_sup->root_dir_record,&cur_blk,rootdir,TRUE,stage2_filename,&stage2_blk); + + tabbuf=CAlloc(tabsize*CD_BLK_SIZE); + iso_pri->type_l_path_table=cur_blk; + tabbuf->name_len=2; //Fill-in adam entry + tempi=&iso_pri->root_dir_record; + tabbuf->blk=tempi->loc.little; + tabbuf->parent_entry_num=1; + tabbuf2=CAlloc(tabsize2*CD_BLK_SIZE); + iso_sup->type_l_path_table=cur_blk+tabsize; + tabbuf2->name_len=2; //Fill-in adam entry + tempi=&iso_sup->root_dir_record; + tabbuf2->blk=tempi->loc.little; + tabbuf2->parent_entry_num=1; + itabbuf=tabbuf+1; + itabbuf2=tabbuf2+1; + first_free=2; + for (i=1;i<=max_depth;i++) + CDFillPathTable(rootdir,&itabbuf,&itabbuf2,1,FALSE,&first_free,1,i); + "%X: Path Table 0\n",cur_blk; + FWBlks(out_file,tabbuf,cur_blk<<2,tabsize<<2); + cur_blk+=tabsize; + "%X: Path Table 1\n",cur_blk; + FWBlks(out_file,tabbuf2,cur_blk<<2,tabsize2<<2); + cur_blk+=tabsize2; + + + MemSet(tabbuf,0,tabsize*CD_BLK_SIZE); + iso_pri->type_m_path_table=EndianU32(cur_blk); + tabbuf->name_len=2; //Fill-in adam entry + tempi=&iso_pri->root_dir_record; + tabbuf->blk=tempi->loc.big; + tabbuf->parent_entry_num=EndianU16(1); + MemSet(tabbuf2,0,tabsize2*CD_BLK_SIZE); + iso_sup->type_m_path_table=EndianU32(cur_blk+tabsize); + tabbuf2->name_len=2; //Fill-in adam entry + tempi=&iso_sup->root_dir_record; + tabbuf2->blk=tempi->loc.big; + tabbuf2->parent_entry_num=EndianU16(1); + itabbuf=tabbuf+1; + itabbuf2=tabbuf2+1; + first_free=2; + for (i=1;i<=max_depth;i++) + CDFillPathTable(rootdir,&itabbuf,&itabbuf2,1,TRUE,&first_free,1,i); + "%X: Path Table 2\n",cur_blk; + FWBlks(out_file,tabbuf,cur_blk<<2,tabsize<<2); + cur_blk+=tabsize; + "%X: Path Table 3\n",cur_blk; + FWBlks(out_file,tabbuf2,cur_blk<<2,tabsize2<<2); + cur_blk+=tabsize2; + + CDirLstDel2(rootdir); + FillU32Palindrome(&iso_pri->vol_space_size,cur_blk); + FillU32Palindrome(&iso_sup->vol_space_size,cur_blk); + FWBlks(out_file,iso_pri,16<<2,4); + + iso_term->type=ISO1T_TERMINATOR; + StrCpy(iso_term->id,"CD001"); + iso_term->version=1; + if (stage2_filename) { + FWBlks(out_file,iso_boot,17<<2,4); + FWBlks(out_file,iso_sup,18<<2,4); + FWBlks(out_file,iso_term,19<<2,4); + stage2_size=(FileSize(stage2_filename)+CD_BLK_SIZE-1)/CD_BLK_SIZE; + MemCpy(stage1_buf,BCD_START,BCD_END-BCD_START); + *(BCD_BLK_CNT-BCD_START+stage1_buf)(U16 *)=stage2_size; + *(BCD_BLK_LO -BCD_START+stage1_buf)(U32 *)=stage2_blk; + "$$FG,RED$$!!! Boot Stage 2 !!! %X-%X$$FG$$\n",stage2_blk,stage2_blk+stage2_size-1; + FWBlks(out_file,stage1_buf, + CD_FILE_OFFSET+1<<2,CD_BOOT_LOADER_SIZE/BLK_SIZE); + } else { + FWBlks(out_file,iso_sup,17<<2,4); + FWBlks(out_file,iso_term,18<<2,4); } - if (okay) { - cur_blk=0; - while (cur_blk>2) { - FWBlks(out_file,zero_buf,cur_blk<<2,4); - cur_blk++; - } - iso->type=ISO1T_PRI_VOL_DESC; - StrCpy(iso->id,"CD001"); - iso->version=1; - FillU16Palindrome(&iso->vol_set_size,1); - FillU16Palindrome(&iso->vol_seq_num,1); - FillU16Palindrome(&iso->log_block_size,CD_BLK_SIZE); - iso->file_structure_version=1; - - iso2->type=ISO1T_SUPPLEMENTARY_DESC; - StrCpy(iso2->id,"CD001"); - iso2->version=1; - FillU16Palindrome(&iso2->vol_set_size,1); - FillU16Palindrome(&iso2->vol_seq_num,1); - FillU16Palindrome(&iso2->log_block_size,CD_BLK_SIZE); - iso2->file_structure_version=1; - - iso1->type=ISO1T_BOOT_RECORD; - StrCpy(iso1->id,"CD001"); - iso1->version=1; - StrCpy(iso1(U8 *)+7,"EL TORITO SPECIFICATION"); - - cur_blk=CD_FILE_OFFSET>>2; - - if (bootfile_buf) { - d=iso1(U8 *)+0x47; - *d=cur_blk; - et->w[0]=1; - StrCpy(&et->w[2],"TempleOS"); - 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; - //0=no emu 2=1.44meg 4=hard drive - et->media_type=emulation; - et->sect_cnt=4; //5 seems like the limit, 4 is safer - et->load_rba=cur_blk+1; -//$AN,"CDBOOT","CDBOOT"$ See $LK,"CDBootFileCreate","MN:CDBootFileCreate"$ -//See $LK,"BootCdProbe","MN:BootCdProbe"$(). - "%X: Pre Boot Blk\n",cur_blk; - FWBlks(out_file,et,cur_blk<<2,4); - cur_blk++; - - "%X: Boot Loader Blks\n",cur_blk; - FWBlks(out_file,bootfile_buf,cur_blk<<2,bootfile_cd_blks<<2); - cur_blk+=bootfile_cd_blks; - } - - CDFileCreate2(out_file,rootdir, - &iso->root_dir_record, - &iso2->root_dir_record, - &cur_blk,rootdir,TRUE); - - tabbuf=CAlloc(tabsize*CD_BLK_SIZE); - iso->type_l_path_table=cur_blk; - tabbuf->name_len=2; //Fill-in adam entry - tempi=&iso->root_dir_record; - tabbuf->blk=tempi->loc.little; - tabbuf->parent_entry_num=1; - tabbuf2=CAlloc(tabsize2*CD_BLK_SIZE); - iso2->type_l_path_table=cur_blk+tabsize; - tabbuf2->name_len=2; //Fill-in adam entry - tempi=&iso2->root_dir_record; - tabbuf2->blk=tempi->loc.little; - tabbuf2->parent_entry_num=1; - itabbuf=tabbuf+1; - itabbuf2=tabbuf2+1; - first_free=2; - for (i=1;i<=max_depth;i++) - CDFillPathTable(rootdir,&itabbuf,&itabbuf2, - 1,FALSE,&first_free,1,i); - "%X: Path Table 0\n",cur_blk; - FWBlks(out_file,tabbuf,cur_blk<<2,tabsize<<2); - cur_blk+=tabsize; - "%X: Path Table 1\n",cur_blk; - FWBlks(out_file,tabbuf2,cur_blk<<2,tabsize2<<2); - cur_blk+=tabsize2; - - - MemSet(tabbuf,0,tabsize*CD_BLK_SIZE); - iso->type_m_path_table=EndianU32(cur_blk); - tabbuf->name_len=2; //Fill-in adam entry - tempi=&iso->root_dir_record; - tabbuf->blk=tempi->loc.big; - tabbuf->parent_entry_num=EndianU16(1); - MemSet(tabbuf2,0,tabsize2*CD_BLK_SIZE); - iso2->type_m_path_table=EndianU32(cur_blk+tabsize); - tabbuf2->name_len=2; //Fill-in adam entry - tempi=&iso2->root_dir_record; - tabbuf2->blk=tempi->loc.big; - tabbuf2->parent_entry_num=EndianU16(1); - itabbuf=tabbuf+1; - itabbuf2=tabbuf2+1; - first_free=2; - for (i=1;i<=max_depth;i++) - CDFillPathTable(rootdir,&itabbuf,&itabbuf2, - 1,TRUE,&first_free,1,i); - "%X: Path Table 2\n",cur_blk; - FWBlks(out_file,tabbuf,cur_blk<<2,tabsize<<2); - cur_blk+=tabsize; - "%X: Path Table 3\n",cur_blk; - FWBlks(out_file,tabbuf2,cur_blk<<2,tabsize2<<2); - cur_blk+=tabsize2; - - CDirLstDel2(rootdir); - FillU32Palindrome(&iso->vol_space_size,cur_blk); - FillU32Palindrome(&iso2->vol_space_size,cur_blk); - FWBlks(out_file,iso,16<<2,4); - - iso3->type=ISO1T_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; +cf_done: FClose(out_file); Free(tabbuf); Free(tabbuf2); -done1: - Free(bootfile_buf); - Free(filename2); - Free(et); + Free(stage2_filename); + Free(filename); Free(zero_buf); - Free(iso); - Free(iso1); - Free(iso2); - Free(iso3); + Free(stage1_buf); + Free(et); + Free(iso_pri); + Free(iso_boot); + Free(iso_sup); + Free(iso_term); return cur_blk; } #help_index "" diff --git a/TempleOS/Adam/Boot/InsBoot.CPP b/TempleOS/Adam/Boot/InsBoot.CPP index af527f2..fd6a653 100644 --- a/TempleOS/Adam/Boot/InsBoot.CPP +++ b/TempleOS/Adam/Boot/InsBoot.CPP @@ -4,19 +4,14 @@ //Kernel module: Kernel.BIN.Z #define KERNEL_BIN_C "Kernel.BIN.C" -//Must be first dir on CD. #define BOOT_DIR "/0000Boot" -//Must be first file on CD. #define BOOT_DIR_KERNEL_BIN_C BOOT_DIR "/0000" KERNEL_BIN_C //Stage 2 of master boot loader -#define BOOTMHD2_BIN_C "/0000Boot/BootMHD2.BIN.C" +#define BOOTMHD2_BIN_C BOOT_DIR "/BootMHD2.BIN.C" //Old master boot record -#define OLDMBR_BIN_C "/0000Boot/OldMBR.BIN.C" - -//CD-ROM patched Boot Loader -#define BOOTCD_BIN_Z "/0000Boot/BootCD.BIN.Z" +#define OLDMBR_BIN_C BOOT_DIR "/OldMBR.BIN.C" if (IsDrvWritable) MkDir("/Temp"); //Good to have a Temp @@ -25,30 +20,7 @@ if (IsDrvWritable) #include "BootHD" #include "BootMHD" #include "BootMHD2" - -#help_index "Install;File/Install Related;File/CD DVD" -public Bool CDBootFileCreate() -{ - U8 *br; - I64 size=FileSize(BOOT_DIR_KERNEL_BIN_C); - - br=CAlloc(CD_BOOT_LOADER_SIZE); - *BCD_BLK_CNT(U16 *)=(size+CD_BLK_SIZE-1)/CD_BLK_SIZE; - - //$LK,"CDBOOT","FA:::/TempleOS/Adam/Dsk/DskCDDVD.CPP,CDBOOT"$ writes the following blocks: - //0x14 Preboot - //0x15 Boot-loader ($LK,"BootCD.BIN.C","FI:::/TempleOS/Adam/Boot/BootCD.CPP"$ stored uncompressed in a non-file block) - //0x16 0000Kernel.BIN.C. - - //No emulation - //This trick assumes 0000Kernel is first file in first dir. - *BCD_BLK_LO(U32 *)=1+(CD_FILE_OFFSET+CD_BOOT_LOADER_SIZE/BLK_SIZE)/(CD_BLK_SIZE>>BLK_SIZE_BITS); - - MemCpy(br,BCD_START,BCD_END-BCD_START); - FileWrite(BOOTCD_BIN_Z,br,CD_BOOT_LOADER_SIZE); - Free(br); - return TRUE; -} +#include "DskCDDVD" #help_index "Call" asm { @@ -61,8 +33,24 @@ _HI_CALL:: CALL RAX @@05: LEAVE RET1 8 +// ************************************ +_HI_MEMCPY:: + ENTER 0 + PUSH RSI + PUSH RDI + CLD + MOV RDI,U64 SF_ARG1[RBP] + MOV RSI,U64 SF_ARG2[RBP] + MOV RCX,U64 SF_ARG3[RBP] + REP_MOVSB + MOV RAX,RDI + POP RDI + POP RSI + LEAVE + RET1 24 } _extern _HI_CALL I64 HiCall(U8 *s); +_extern _HI_MEMCPY U8 *HiMemCpy(U8 *dst,U8 *src,I64 cnt); #help_index "Boot" public U0 SoftBoot(U8 *filename) //No hardware rst @@ -74,23 +62,15 @@ public U0 SoftBoot(U8 *filename) //No hardware rst reg *shutdown,*hi_image2; if (!(hi_image2=FileRead(filename,&size))) return; - switch (snd_dev) { - case SD_PC_SPEAKER: - break; - case SD_HD_AUDIO: - CallExtStr("HDAudioEnd",TRUE); - break; - } - shutdown=MAlloc(SYS_RESTART_KERNEL_END-SYS_RESTART_KERNEL,Fs->code_heap); hi_image=MAlloc(size,Fs->code_heap); - MemCpy(hi_image,hi_image2,size); + HiMemCpy(hi_image,hi_image2,size); Free(hi_image2); hi_image->boot_base=lo_image(U8 *)+sizeof(CBinFile); hi_image->boot_patch_table_base=lo_image(U8 *)+hi_image->h.loader_patch_table_offset; - MemCpy(&hi_image->sys_mem_E801,&lo_image->sys_mem_E801,2*2); - MemCpy(&hi_image->sys_mem_E820,&lo_image->sys_mem_E820,NUM_MEM_E820_ENTRIES*MEM_E820_ENTRY_SIZE); + HiMemCpy(&hi_image->sys_mem_E801,&lo_image->sys_mem_E801,2*2); + HiMemCpy(&hi_image->sys_mem_E820,&lo_image->sys_mem_E820,NUM_MEM_E820_ENTRIES*MEM_E820_ENTRY_SIZE); hi_image->sys_gr_mode=lo_image->sys_gr_mode; hi_image->sys_pci_busses=lo_image->sys_pci_busses; hi_image->boot_code=BOOT_CODE_RAM; @@ -99,9 +79,9 @@ public U0 SoftBoot(U8 *filename) //No hardware rst if (mp_cnt>1) MPHalt; - MemCpy(shutdown,SYS_RESTART_KERNEL,SYS_RESTART_KERNEL_END-SYS_RESTART_KERNEL); - MemCpy(&hi_image->sys_gdttab,&lo_image->sys_gdttab,GDT_SIZE); - MemCpy(lo_image,hi_image,size); + HiMemCpy(shutdown,SYS_RESTART_KERNEL,SYS_RESTART_KERNEL_END-SYS_RESTART_KERNEL); + HiMemCpy(&hi_image->sys_gdttab,&lo_image->sys_gdttab,GDT_SIZE); + HiMemCpy(lo_image,hi_image,size); HiCall(shutdown); } @@ -168,7 +148,7 @@ public Bool MakeOSInstallPrtBootLoader(U8 src_drv=0,U8 dst_drv=0) //the code on that drive and update the boot sect. //If you are making a bootable CD-ROM you supply a dst_drv. -//See $LK-A,"::/TempleOS/Demo/MakeDistro.CPP.Z"$ +//See $LK-A,"::/TempleOS/Demo/MakeDistro.CPP"$ //See $LK,"Install Documentation","FI:::/TempleOS/Doc/Install.TXT"$ @@ -202,7 +182,6 @@ public Bool MakeOSInstallPrtBootLoader(U8 src_drv=0,U8 dst_drv=0) switch (bdev->type) { case BDT_ATAPI: Move("/TempleOS/Kernel/Kernel.BIN.Z",BOOT_DIR_KERNEL_BIN_C); - CDBootFileCreate; result=TRUE; break; case BDT_RAM: @@ -214,9 +193,9 @@ public Bool MakeOSInstallPrtBootLoader(U8 src_drv=0,U8 dst_drv=0) Free(de.full_name); "Modifying partition boot record.\n"; RBlks(p,&br,p->offset,1); - br.jump_and_nop[0]=0xEB; - br.jump_and_nop[1]=0x58; - br.jump_and_nop[2]=0x90; + br.jump_and_nop[0]=OC_JMP_REL8; + br.jump_and_nop[1]=offset(CFAT32Boot.code)-2; + br.jump_and_nop[2]=OC_NOP; *BHD_BLK_CNT(U16 *)=(de.size+BLK_SIZE-1)>>BLK_SIZE_BITS; *BHD_DAP_BLK(I64 *)=p->data+de.cluster*p->spc; for (i=0;icur_prt; - if (p->type!=PT_NATIVE && p->type!=PT_FAT32) - PutDefineErr("ST_NOT_NATIVE"); + if (p->type!=PT_REDSEA && p->type!=PT_FAT32) + PutDefineErr("ST_NOT_REDSEA"); else { //Bypass partition bounds-checking BlkDevLock(bdev); @@ -312,8 +291,8 @@ public Bool InstallMasterBootLoader(U8 drv_let,U8 *drv_lst=NULL) Drv(drv_let); p=Fs->cur_prt; - if (p->type!=PT_NATIVE && p->type!=PT_FAT32) - PutDefineErr("ST_NOT_NATIVE"); + if (p->type!=PT_REDSEA && p->type!=PT_FAT32) + PutDefineErr("ST_NOT_REDSEA"); else { bdev=Drv2BlkDev(drv_let); if (!FileFind(OLDMBR_BIN_C,,FUF_JUST_FILES)) diff --git a/TempleOS/Adam/Ctrls/Ctrls2a.CPP b/TempleOS/Adam/Ctrls/Ctrls2a.CPP index 139ba51..ac18c8f 100644 --- a/TempleOS/Adam/Ctrls/Ctrls2a.CPP +++ b/TempleOS/Adam/Ctrls/Ctrls2a.CPP @@ -64,7 +64,7 @@ public Bool CtrlInside(CCtrl *c,I64 x,I64 y) U0 DrawCtrls(CTask *task) { CCtrl *c; - CDC *dc=DCAlias(gr_dc,task); + CDC *dc=DCAlias(gr_dc2,task); Bool old_preempt=Preempt(OFF); c=task->next_ctrl; while (c!=&task->next_ctrl) { diff --git a/TempleOS/Adam/Dbg2a.CPP b/TempleOS/Adam/Dbg2a.CPP index 6240b45..eac8ce8 100644 --- a/TempleOS/Adam/Dbg2a.CPP +++ b/TempleOS/Adam/Dbg2a.CPP @@ -25,8 +25,7 @@ Bool ClassRep2(CDoc *doc,U8 *class_name,U8 *_b,I64 depth,I64 max_depth,Bool dyna ptr=_b(U8 *)+ml->offset; DocPrintF(doc,"%08X ",ptr(U8 *)+offset); j=tempc2->ptr_cnt; - while (tempc2->fwd_class) - tempc2=tempc2->fwd_class; + tempc2=OptClassFwd(tempc2); tempc2-=tempc2->ptr_cnt; if (tempc2->type & HTT_INTERNAL_TYPE) { DocPrintF(doc,"$$FG,GREEN$$%-20ts:$$FG$$",ml->str); @@ -143,7 +142,7 @@ public U0 ClassRep(U8 *class_name,U8 *_b,I64 max_depth=2,Bool fun=FALSE,I64 offs } else { DocMax; old_preempt=Preempt(OFF); - doc=DocCur; + doc=DocPut; } if (fun) ClassRep2(doc,class_name,_b,0,max_depth,FALSE,HTT_FUN,offset); @@ -168,7 +167,7 @@ public U0 ClassRepD(U8 *class_name,U8 *_b,I64 max_depth=2,Bool fun=FALSE,I64 off } else { DocMax; old_preempt=Preempt(OFF); - doc=DocCur; + doc=DocPut; } if (fun) ClassRep2(doc,class_name,_b,0,max_depth,TRUE,HTT_FUN,offset); @@ -190,9 +189,7 @@ U0 UpdateRegVarImg(CHashFun *tempf,U8 *_b,CTask *task) ml=tempf->member_lst; while (ml) { if (ml->register!=CREG_NONE) { - tempc=ml->member_class; - while (tempc->fwd_class) - tempc=tempc->fwd_class; + tempc=OptClassFwd(ml->member_class); MemCpy(_b+ml->offset,TaskRegAdd(task,ml->register),tempc->size); } ml=ml->next; diff --git a/TempleOS/Adam/DevInfo.CPP b/TempleOS/Adam/DevInfo.CPP index bd3fc84..86066fd 100644 --- a/TempleOS/Adam/DevInfo.CPP +++ b/TempleOS/Adam/DevInfo.CPP @@ -58,12 +58,8 @@ U0 PCILookUpSingle(CDoc *doc,I64 m,I64 d,U8 **_vendor,U8 **_dev) while (doc_e!=doc) { if (first) { if (doc_e->type_u8==DOCT_TEXT && doc_e->tag[0]!=';' && StrLen(doc_e->tag)>=4) { - buf[0]='0'; - buf[1]='x'; - buf[2]=doc_e->tag[0]; - buf[3]=doc_e->tag[1]; - buf[4]=doc_e->tag[2]; - buf[5]=doc_e->tag[3]; + buf[0](U16)='0x'; + buf[2](U32)=doc_e->tag(U32 *)[0]; buf[6]=0; if (A2I(buf)==m) { doc_e=doc_e->next->next; @@ -87,12 +83,8 @@ U0 PCILookUpSingle(CDoc *doc,I64 m,I64 d,U8 **_vendor,U8 **_dev) if (doc_e->type_u8==DOCT_TAB) { doc_e=doc_e->next; if (doc_e->type_u8==DOCT_TEXT && StrLen(doc_e->tag)>=4) { - buf[0]='0'; - buf[1]='x'; - buf[2]=doc_e->tag[0]; - buf[3]=doc_e->tag[1]; - buf[4]=doc_e->tag[2]; - buf[5]=doc_e->tag[3]; + buf[0](U16)='0x'; + buf[2](U32)=doc_e->tag(U32 *)[0]; buf[6]=0; if (A2I(buf)==d) { doc_e=doc_e->next->next; diff --git a/TempleOS/Adam/Doc/Doc.CPP b/TempleOS/Adam/Doc/Doc.CPP index 3757604..1ca8998 100644 --- a/TempleOS/Adam/Doc/Doc.CPP +++ b/TempleOS/Adam/Doc/Doc.CPP @@ -2,7 +2,6 @@ #help_file "::/TempleOS/Doc/Doc" //See $LK-A,"::/TempleOS/Doc/Doc.TXT"$ - extern I64 EdLeftClickLink(CDoc *doc,CDocEntry *doc_e); extern I64 TermRightClickLink(CDoc *doc,CDocEntry *doc_e); extern U0 DocPutSPartial(CDoc *doc,U8 *st); @@ -10,10 +9,10 @@ extern U0 DocFormBackward(CDoc *doc,Bool giveup=FALSE); extern U0 EdUndoFilter(CDoc *doc); U0 DocInit() -{ - DefineLstLoad("ST_DOC_CMDS","TX\0CR\0SR\0CU\0TB\0CL\0PB\0DA\0PL\0LM\0RM\0HD\0FO\0ID\0" - "FG\0BG\0FD\0BD\0F2\0FL\0FM\0FA\0FH\0FE\0FU\0FB\0FY\0FR\0FC\0FQ\0" - "WW\0UL\0IV\0BK\0SX\0SY\0CM\0AN\0LK\0BT\0" +{ //$LK,"CMD Defines","MN:DOCT_TEXT"$ + DefineLstLoad("ST_DOC_CMDS", + "TX\0CR\0SR\0CU\0TB\0CL\0PB\0DA\0PL\0LM\0RM\0HD\0FO\0ID\0" + "FG\0BG\0FD\0BD\0PT\0WW\0UL\0IV\0BK\0SX\0SY\0CM\0AN\0LK\0BT\0" "CB\0MA\0MU\0HX\0HS\0HE\0TR\0SP\0IB\0IT\0IS\0BP\0SO\0HL\0LP\0CC\0HI\0HV\0HC\0ER\0"); DefineLstLoad("ST_DOC_FLAGS", //flags1 diff --git a/TempleOS/Adam/Doc/DocCodeTools.CPP b/TempleOS/Adam/Doc/DocCodeTools.CPP index 7097881..5144ca5 100644 --- a/TempleOS/Adam/Doc/DocCodeTools.CPP +++ b/TempleOS/Adam/Doc/DocCodeTools.CPP @@ -1,26 +1,22 @@ -#define EF_DONT_RECOMPILE 0 -#define EF_RECOMPILE 1 -#define EF_RENUM_ASM 2 -#define EF_SLIDER_CTRL 3 -#define EF_CH_SC 4 +#define C_INDENT_SPACES 2 +#define ASM_RENUM_SPACING 5 + +#define EF_REINDENT 0 +#define EF_CHK_COMPILE 1 +#define EF_RENUM_ASM 2 +#define EF_SLIDER_CTRL 3 +#define EF_CH_SC 4 I64 PopUpEdFmt() { I64 i; CDoc *doc=DocNew; - DocPutS(doc,"$$FG,PURPLE$$Reformat Function$$FG$$\n" - "If you enter $$FG,GREEN$$DONT RECOMPILE$$FG$$ the stored\n" - "source line indentation information will\n" - "be used. $$BK,1$$Be sure it is up-to-date!$$BK,0$$\n" - "For $$FG,GREEN$$#exe$$FG$$ config'ed projects, enter $$FG,GREEN$$DONT RECOMPILE$$FG$$.\n" - "$$MU,\"Recompile and autoindent CPP.Z Fun\",EF_RECOMPILE$$\n" - "$$MU,\"Don't Recompile but autoindent CPP.Z Fun\",EF_DONT_RECOMPILE$$\n\n" - "$$MU,\"Renum Asm Local @@ Labels for Fun\",EF_RENUM_ASM$$\n\n" - "$$FG,PURPLE$$Insert Managed Code$$FG$$\n" - "$$MU,\"Slider Ctrl\",EF_SLIDER_CTRL$$\n\n" - "$$FG,PURPLE$$Misc$$FG$$\n" - "$$MU,\"Insert ASCII/Scan Code Hex Codes for key pressed\",EF_CH_SC$$\n\n" - "$$MU,\"CANCEL\",DOCM_CANCEL$$\n" + DocPutS(doc,"$$FG,LTBLUE$$$$MU,\"Check Compile\",EF_CHK_COMPILE$$\n" + "$$MU,\"Reindent CPP.Z Fun\",EF_REINDENT$$\n" + "$$MU,\"Renum Asm Local @@ Labels for Fun\",EF_RENUM_ASM$$\n" + "$$MU,\"Insert Mgd Code: Slider Ctrl\",EF_SLIDER_CTRL$$\n" + "$$MU,\"Insert ASCII/Scan Code Hex Codes for key pressed\",EF_CH_SC$$\n" + "$$MU,\"CANCEL\",DOCM_CANCEL$$\n\n" "$$FG,GREEN$$$$FG$$ to undo if not happy\n" "with the results.\n"); i=PopUpMenu(doc); @@ -28,14 +24,185 @@ I64 PopUpEdFmt() return i; } +class CRILex +{ + CLex *lx1,*lx2; + CQueVectU8 *indent; + I64 depth,exp_depth; + Bool was_new_line,is_not_cont,one_shot; +}; -#define C_INDENT_SPACES 2 -#define ASM_RENUM_SPACING 5 +I64 EdRILex(CRILex *rx) +{ + Bool is_not_cont=FALSE; + I64 i; + do { + Lex(rx->lx1); + Lex(rx->lx2); + + if (rx->lx1->token=='\n') { + if (rx->lx2->token==TK_IDENT) + i=PrsKeyWord(rx->lx2); + else + i=-1; + if (rx->lx2->token==';' || rx->lx2->token=='{' || rx->lx2->token=='}' || + rx->lx2->token==':' || rx->lx2->token==')' && !rx->exp_depth || + i==KW_ELSE || i==KW_CATCH || i==KW_DO) + is_not_cont=TRUE; + } + + if (rx->was_new_line && (rx->lx1->token!=':' || rx->lx2->token!=TK_IDENT || + PrsKeyWord(rx->lx2)==KW_DFT)) { + if (rx->one_shot) { + QueVectU8Put(rx->indent,rx->lx2->lfns[0].cur_entry->y,rx->depth+3); + rx->one_shot=FALSE; + } else + QueVectU8Put(rx->indent,rx->lx2->lfns[0].cur_entry->y,rx->depth); + } + if (rx->lx2->token=='\n') + rx->was_new_line=TRUE; + else + rx->was_new_line=FALSE; + } while (rx->lx1->token=='\n'); + rx->is_not_cont=is_not_cont; + return rx->lx1->token; +} + +U0 EdRIExp(CRILex *rx) +{ + if (rx->lx1->token=='(') { + if (!rx->exp_depth++) + rx->depth+=3; + EdRILex(rx); + while (rx->lx1->token && rx->lx1->token!=')') + EdRIExp(rx); + if (!--rx->exp_depth) + rx->depth-=3; + } + EdRILex(rx); +} + +U0 EdRIStmt(CRILex *rx,Bool indent) +{ + I64 i; + Bool cont; + if (rx->lx1->token=='{') { + rx->depth++; + EdRILex(rx); + while (rx->lx1->token && rx->lx1->token!='}') + EdRIStmt(rx,FALSE); + rx->depth--; + EdRILex(rx); + } else { + if (indent) rx->depth++; + do { + cont=FALSE; + switch (PrsKeyWord(rx->lx1)) { + case KW_IF: + EdRILex(rx); + EdRIExp(rx); + EdRIStmt(rx,TRUE); + if (PrsKeyWord(rx->lx1)==KW_ELSE) { + EdRILex(rx); + if (PrsKeyWord(rx->lx1)==KW_IF && rx->lx2->token!='\n') + EdRIStmt(rx,FALSE); + else + EdRIStmt(rx,TRUE); + } + break; + case KW_TRY: + EdRILex(rx); + EdRIStmt(rx,TRUE); + if (PrsKeyWord(rx->lx1)==KW_CATCH) { + EdRILex(rx); + EdRIStmt(rx,TRUE); + } + break; + case KW_FOR: + case KW_WHILE: + EdRILex(rx); + EdRIExp(rx); + EdRIStmt(rx,TRUE); + break; + case KW_DO: + EdRILex(rx); + EdRIStmt(rx,TRUE); + if (PrsKeyWord(rx->lx1)==KW_WHILE) { + EdRILex(rx); + EdRIExp(rx); + } + if (rx->lx1->token==';') + EdRILex(rx); + break; + case KW_SWITCH: + case KW_NOBOUND_SWITCH: + EdRILex(rx); + EdRIExp(rx); + if (rx->lx1->token=='{') { + rx->depth++; + EdRILex(rx); + while (rx->lx1->token && rx->lx1->token!='}') { + while (TRUE) { + i=PrsKeyWord(rx->lx1); + if (i==KW_CASE || i==KW_DFT) { + EdRILex(rx); + while (rx->lx1->token && rx->lx1->token!=':') + EdRILex(rx); + EdRILex(rx); + } else + break; + } + if (rx->lx1->token) + EdRIStmt(rx,TRUE); + } + rx->depth--; + EdRILex(rx); + } + break; + default: + while (rx->lx1->token && rx->lx1->token!=';' && rx->lx1->token!=':') { + if (rx->lx2->token=='\n' && !rx->is_not_cont) + rx->one_shot=TRUE; + EdRILex(rx); + } + if (rx->lx1->token==':') + cont=TRUE; + EdRILex(rx); + } + } while (cont); + if (indent) rx->depth--; + } +} + +CQueVectU8 *EdRICode(CDoc *doc) +{ + CQueVectU8 *result; + CRILex *rx=CAlloc(sizeof(CRILex)); + + rx->lx1=LexNew(NULL,LF_KEEP_NEW_LINES|LF_DONT_FREE_BUF,doc->filename.name); + Free(rx->lx1->lfns[0].name); + LexAttachDoc(rx->lx1,&rx->lx1->lfns[0],doc,,doc->cur_entry,doc->cur_data_col); + + rx->lx2=LexNew(NULL,LF_KEEP_NEW_LINES|LF_DONT_FREE_BUF,doc->filename.name); + Free(rx->lx2->lfns[0].name); + LexAttachDoc(rx->lx2,&rx->lx2->lfns[0],doc,,doc->cur_entry,doc->cur_data_col); + + rx->indent=QueVectU8New(doc->cur_entry->y); + + Lex(rx->lx1); + EdRIStmt(rx,FALSE); + + LexDel(rx->lx1); + LexDel(rx->lx2); + result=rx->indent; + Free(rx); + return result; +} U0 EdRemFunLeadingSpace(CDoc *doc) { Bool unlock=DocLock(doc), - start_of_line=TRUE; + start_of_line=TRUE; U8 ch,*ptr; I64 levels=1; CDocEntry *doc_e,*doc_e2; @@ -45,8 +212,8 @@ U0 EdRemFunLeadingSpace(CDoc *doc) do { doc_e2=doc_e->next; if (doc_e!=doc && doc_e!=doc->cur_entry && - !(doc_e->flags1&(DOCEG1_DONT_EDIT-DOCEF1_SCROLLING_X)) && - !(doc_e->flags2&DOCEG2_DONT_EDIT)) + !(doc_e->flags1&(DOCEG1_DONT_EDIT-DOCEF1_SCROLLING_X)) && + !(doc_e->flags2&DOCEG2_DONT_EDIT)) switch (doc_e->type_u8) { case DOCT_TEXT: ptr=doc_e->tag; @@ -155,7 +322,7 @@ U0 EdRenumAsm(CDoc *doc) I64 num=0; CRenum root,*tempr,*tempr1; U8 buf[sizeof(CEdFindText.find_text)], - buf2[sizeof(CEdFindText.find_text)]; + buf2[sizeof(CEdFindText.find_text)]; QueInit(&root); EdSelectFun(doc,TRUE); @@ -184,146 +351,105 @@ U0 EdRenumAsm(CDoc *doc) DocUnlock(doc); } -#define AC_ABORT -1 -#define AC_REINDENT 0 -#define AC_RENUM_ASM 1 - -U0 EdRefmtFun(CDoc *doc,I64 fmt_type) +U0 EdCodeTools2(CDoc *doc,I64 tool_action) { - Bool unlock=DocLock(doc),start_of_line=TRUE; + Bool okay,unlock=DocLock(doc),start_of_line=TRUE; CDocEntry *doc_e,*doc_ne; - I64 i,x,r,action=AC_ABORT,old_line_num; + I64 i,start_y,end_y,x,r,goto_line_num; U8 *b,*st,*st2,*prj_file; - CHashSrcSym *temph; - CIndentInfo *indent; CTask *task=NULL; - CTaskCmd *tempc; + CSrvCmd *tempc; + CQueVectU8 *indent; DocRecalc(doc); - old_line_num=doc->cur_entry->y+1; + goto_line_num=doc->cur_entry->y+1; DocCaptureUndo(doc,TRUE); - switch (fmt_type) { - case EF_RECOMPILE: - if (EdGoToFun(doc,FALSE,FALSE)) { - if (doc->flags&DOCF_PLAIN_TEXT) - DocFlagsToggle(doc,DOCF_PLAIN_TEXT); - DocWrite(doc); - task=Spawn(&ServantUserCmdLine,NULL,"Servant",Fs); - st2=CurDir; - st=MSPrintF("Cd(\"%s\");",st2); - tempc=TaskRqstQue(task,Fs,st,1<flags&DOCF_PLAIN_TEXT) + DocFlagsToggle(doc,DOCF_PLAIN_TEXT); + DocWrite(doc); + task=Spawn(&SrvUserCmdLine,NULL,"Srv",,Fs); + st2=CurDir; + st=MSPrintF("Cd(\"%s\");",st2); + tempc=TaskExeStrQue(task,Fs,st,1<win_left,Fs->win_right, task); + SetWinVert(Fs->win_top, Fs->win_bottom,task); + if (ScanResult(tempc,&r)) { + st=DirFile(doc->filename.name,,"PRJ.Z"), + prj_file=FileNameAbs(st,FUF_Z_OR_NOT_Z); Free(st); - SetWinHorz(Fs->win_left,Fs->win_right, task); - SetWinVert(Fs->win_top, Fs->win_bottom,task); - if (GetRqstResult(tempc,&r)) { - st=DirFile(doc->filename.name,,"PRJ.Z"), + if (FileFind(prj_file)) { + st2=DirFile(prj_file), + st=MSPrintF("Cd(\"%s\");",st2); + Free(st2); + tempc=TaskExeStrQue(task,Fs,st,1<filename.name,"Load","CPP.Z"); prj_file=FileNameAbs(st,FUF_Z_OR_NOT_Z); Free(st); - if (FileFind(prj_file)) { - st2=DirFile(prj_file), - st=MSPrintF("Cd(\"%s\");",st2); - Free(st2); - tempc=TaskRqstQue(task,Fs,st,1<filename.name,"Load","CPP.Z"); - prj_file=FileNameAbs(st,FUF_Z_OR_NOT_Z); - Free(st); - if (FileFind(prj_file)) - st=MSPrintF("\"$$WW,1$$\";ExeFile(\"%s\",TRUE);",prj_file); - else - st=MSPrintF("\"$$WW,1$$\";ExeFile(\"%s\",TRUE);",doc->filename.name); - tempc=TaskRqstQue(task,Fs,st,1<filename.name); + tempc=TaskExeStrQue(task,Fs,st,1<filename.name)) + goto_line_num=i; + Free(st); } break; - } - - switch (action) { - case AC_RENUM_ASM: - DocUnlock(doc); - Snd(2000); Sleep(150); Snd(0); - Sleep(100); - Snd(2000); Sleep(150); Snd(0); - DocLock(doc); - EdRenumAsm(doc); - break; - case AC_REINDENT: - if (temph->type&(HTT_FUN|HTT_EXPORT_SYS_SYM)) - indent=temph->indent; - else - indent=NULL; - if (indent && indent->min_line<=indent->max_line) { + case EF_REINDENT: + if (EdGoToFun(doc,FALSE,FALSE)) { + start_y=doc->cur_entry->y; + indent=EdRICode(doc); DocUnlock(doc); Snd(2000); Sleep(150); Snd(0); Sleep(100); Snd(2000); Sleep(150); Snd(0); DocLock(doc); EdRemFunLeadingSpace(doc); - DocLineNumGoTo(doc,indent->min_line); + DocLineNumGoTo(doc,start_y+1); doc_e=doc->cur_entry; - while (indent->min_line<=doc_e->y+1<=indent->max_line) { + end_y=start_y+indent->total_cnt; + while (start_y<=doc_e->ycur_entry && - !(doc_e->flags1&(DOCEG1_DONT_EDIT-DOCEF1_SCROLLING_X)) && - !(doc_e->flags2&DOCEG2_DONT_EDIT)) { + !(doc_e->flags1&(DOCEG1_DONT_EDIT-DOCEF1_SCROLLING_X)) && + !(doc_e->flags2&DOCEG2_DONT_EDIT)) { if (doc_e->type_u8==DOCT_NEW_LINE||doc_e->type_u8==DOCT_SOFT_NEW_LINE) start_of_line=TRUE; else { if (start_of_line) { - i=indent->body[doc_e->y+1-indent->min_line]*C_INDENT_SPACES; + i=QueVectU8Get(indent,doc_e->y)*C_INDENT_SPACES; x=doc_e->x+1; while (i>8) { doc_ne=CAlloc(sizeof(CDocEntryBase),doc->mem_task); @@ -339,7 +465,7 @@ U0 EdRefmtFun(CDoc *doc,I64 fmt_type) b=MAlloc(i+1,doc->mem_task); MemSet(b,CH_SPACE,i); b[i]=0; - doc_ne=CAlloc(sizeof(CDocEntryBase)+sizeof(U8 *),doc->mem_task); + doc_ne=CAlloc(sizeof(CDocEntryBase),doc->mem_task); doc_ne->type=DOCT_TEXT | doc->settings_root.dft_text_attr << 8; doc_ne->tag=b; doc_ne->max_col=1; @@ -354,11 +480,32 @@ U0 EdRefmtFun(CDoc *doc,I64 fmt_type) } doc_e=doc_e->next; } - break; + QueVectU8Del(indent); } + break; + case EF_RENUM_ASM: + if (EdGoToFun(doc,FALSE,TRUE)) { + if (EdCurU8(doc)=='{') { + EdCursorRight(doc); + DocRecalc(doc); + } else if (EdCurU8(doc)==':') { + EdCursorRight(doc); + if (EdCurU8(doc)==':') + EdCursorRight(doc); + DocRecalc(doc); + } + DocUnlock(doc); + Snd(2000); Sleep(150); Snd(0); + Sleep(100); + Snd(2000); Sleep(150); Snd(0); + DocLock(doc); + EdRenumAsm(doc); + } + break; } + DocRecalc(doc); - DocLineNumGoTo(doc,old_line_num); + DocLineNumGoTo(doc,goto_line_num); DocUnlock(doc); if (!unlock) @@ -371,7 +518,7 @@ U0 EdPopUpChSC(I64 *_ch,I64 *_sc) { I64 sc; "Press A Key\n"; - DocCur->flags|=DOCF_MIN_SIZE; + DocPut->flags|=DOCF_MIN_SIZE; do GetMsg(_ch,&sc,1<html_link); else *_html_link=NULL; + if (el->pop_up) + *_pop_up=TRUE; + else + *_pop_up=FALSE; if (el->quote) *_quote=TRUE; else @@ -326,11 +343,15 @@ Bool PmtLink(I64 type,U8 **_tag,U8 **_link,Bool *_quote,U8 **_html_link) U0 EdInsLink() { - U8 *tag=NULL,*link=NULL,*st=NULL,*html_link=NULL; - Bool quote=FALSE; + U8 *tag=NULL,*link=NULL,*st=NULL,*html_link=NULL,*pop_up_st; + Bool pop_up=FALSE,quote=FALSE; I64 type=PopUpLinkType(TRUE); if (type>=0) { - if (PmtLink(type,&tag,&link,"e,&html_link)) { + if (PmtLink(type,&tag,&link,&pop_up,"e,&html_link)) { + if (pop_up) + pop_up_st="+PU"; + else + pop_up_st=""; switch (type) { case LK_PLACE_ANCHOR: if (html_link) @@ -340,9 +361,9 @@ U0 EdInsLink() break; default: if (html_link) - st=MSPrintF("$$LK+HTML,\"%Q\",\"%Q\",\"%Q\"$$",tag,link,html_link); + st=MSPrintF("$$LK%s+HTML,\"%Q\",\"%Q\",\"%Q\"$$",pop_up_st,tag,link,html_link); else - st=MSPrintF("$$LK,\"%Q\",\"%Q\"$$",tag,link); + st=MSPrintF("$$LK%s,\"%Q\",\"%Q\"$$",pop_up_st,tag,link); } } } @@ -362,23 +383,12 @@ I64 PopUpColorType() { I64 i; CDoc *doc=DocNew; - DocPutS(doc,"$$MU,\"Foreground\",DOCT_FOREGROUND$$\n" + DocPrintF(doc,"$$FG,PURPLE$$$$TX+CX,\"Color Type Menu\"$$\n" + "\n$$FG,LTBLUE$$$$MU,\"Foreground\",DOCT_FOREGROUND$$\n" "$$MU,\"Background\",DOCT_BACKGROUND$$\n" "$$MU,\"Default Foreground\",DOCT_DFT_FOREGROUND$$\n" "$$MU,\"Default Background\",DOCT_DFT_BACKGROUND$$\n" - "$$MU,\"Alt Foreground\",DOCT_ALT_FOREGROUND$$\n" - "$$MU,\"Link Foreground\",DOCT_LINK_FOREGROUND$$\n" - "$$MU,\"Macro Foreground\",DOCT_MACRO_FOREGROUND$$\n" - "$$MU,\"Anchor Foreground\",DOCT_ANCHOR_FOREGROUND$$\n" - "$$MU,\"Hidden Foreground\",DOCT_HIDDEN_FOREGROUND$$\n" - "$$MU,\"Tree Foreground\",DOCT_TREE_FOREGROUND$$\n" - "$$MU,\"User Foreground\",DOCT_USER_FOREGROUND$$\n" - "$$MU,\"Binary Foreground\",DOCT_BINARY_FOREGROUND$$\n" - "$$MU,\"Keyword Foreground\",DOCT_KEYWORD_FOREGROUND$$\n" - "$$MU,\"Keyword2 Foreground\",DOCT_KEYWORD2_FOREGROUND$$\n" - "$$MU,\"Comment Foreground\",DOCT_COMMENT_FOREGROUND$$\n" - "$$MU,\"Quote Foreground\",DOCT_QUOTE_FOREGROUND$$\n" - "\n$$MU,\"CANCEL\",DOCM_CANCEL$$"); + "%s",ctrl_L_footer); i=PopUpMenu(doc); DocDel(doc); return i; @@ -388,13 +398,15 @@ I64 PopUpPageSettingType() { I64 i; CDoc *doc=DocNew; - DocPutS(doc,"$$MU,\"Page Length\",DOCT_PAGE_LEN$$\n" + DocPrintF(doc,"$$FG,PURPLE$$$$TX+CX,\"Page Setting Menu\"$$\n" + "\n$$FG,LTBLUE$$$$MU,\"Page Length\",DOCT_PAGE_LEN$$\n" "$$MU,\"Page Header\",DOCT_HEADER$$\n" "$$MU,\"Page Footer\",DOCT_FOOTER$$\n" "$$MU,\"Left Margin\",DOCT_LEFT_MARGIN$$\n" "$$MU,\"Right Margin\",DOCT_RIGHT_MARGIN$$\n" "$$MU,\"Lock To Page\",DOCT_LOCK_TO_PAGE$$\n" - "$$MU,\"Lock To Center\",DOCT_LOCK_TO_CENTER$$\n"); + "$$MU,\"Lock To Center\",DOCT_LOCK_TO_CENTER$$\n" + "%s",ctrl_L_footer); i=PopUpMenu(doc); DocDel(doc); return i; @@ -491,7 +503,8 @@ I64 PopUpDollarType() { I64 i; CDoc *doc=DocNew; - DocPutS(doc,"$$MU,\"Link\",DOCT_LINK$$\n" + DocPrintF(doc,"$$FG,PURPLE$$$$TX+CX,\"Text Widget Menu\"$$\n" + "\n$$FG,LTBLUE$$$$MU,\"Link\",DOCT_LINK$$\n" "$$MU,\"Text\",DOCT_TEXT$$\n" "$$MU,\"Tree Branch\",DOCT_TREE$$\n" "$$MU,\"Color\",DOCT_FOREGROUND$$\n" @@ -507,7 +520,7 @@ I64 PopUpDollarType() "$$MU,\"Syntax Highlighting\",DOCT_HIGHLIGHT$$\n" "$$MU,\"HTML\",DOCT_HTML_CODE$$\n" "$$MU,\"Song\",DOCT_SONG$$\n" - "\n$$MU,\"CANCEL\",DOCM_CANCEL$$"); + "%s",ctrl_L_footer); i=PopUpMenu(doc); DocDel(doc); return i; @@ -613,10 +626,10 @@ I64 PopUpHtmlType() { I64 i; CDoc *doc=DocNew; - DocPutS(doc,"$$MU,\"Html Code\",HT_CODE$$\n" + DocPutS(doc,"$$FG,LTBLUE$$$$MU,\"Html Code\",HT_CODE$$\n" "$$MU,\"Html Image\",HT_IMAGE$$\n" "$$MU,\"Html Video\",HT_VIDEO$$\n" - "\n$$MU,\"CANCEL\",DOCM_CANCEL$$"); + "\n$$MU,\"Abort\",DOCM_CANCEL$$"); i=PopUpMenu(doc); DocDel(doc); return i; @@ -953,7 +966,7 @@ U0 EdInsBinary(I64 bin_num,I64 type) "$$%Z+BP,\"%Q\",%d,\"%s,%d\"$$",type,"ST_DOC_CMDS",dt->tag,dt->bin_num, dt->bin_ptr_link_file,dt->bin_ptr_link_bin_num; } else { - if (DocBinFindNum(DocCur,dt->bin_num)) + if (DocBinFindNum(DocPut,dt->bin_num)) "$$%Z,\"%Q\",%d$$",type,"ST_DOC_CMDS",dt->tag,dt->bin_num; else PopUpOk("Invalid Binary Num"); @@ -981,7 +994,7 @@ U0 EdInsTree() st=MSPrintF("%q",dt->label); st2=MSPrintF("$$TR%s,\"%Q\"$$\n$$ID,%d$$*\n$$ID,%d$$", buf,st,dt->indent,-dt->indent); - DocInsSafe(DocCur,st2); + DocInsSafe(DocPut,st2); Free(st); Free(st2); } @@ -990,7 +1003,7 @@ U0 EdInsTree() U0 EdInsHidden() { - DocInsSafe(DocCur,"$$HS$$*$$HE$$"); + DocInsSafe(DocPut,"$$HS$$*$$HE$$"); } U0 EdInsDollarCmd() @@ -1048,39 +1061,29 @@ U0 EdInsDollarCmd() } #define PT_SPRITE 0 -#define PT_SPRITE_MACRO 1 -#define PT_SPRITE_MENU 2 -#define PT_SPRITE_LINK 3 -#define PT_SPRITE_PTR 4 -#define PT_SPRITE_SIZE 5 -#define PT_DUP_SPRITE 6 +#define PT_SPRITE_PTR 1 +#define PT_DUP_SPRITE 2 +#define PT_SPRITE_SIZE 3 +#define PT_SPRITE_MACRO 4 +#define PT_SPRITE_MENU 5 +#define PT_SPRITE_LINK 6 #define PT_SPRITE_TYPE 7 I64 PopUpSpriteType() { I64 i; CDoc *doc=DocNew; - DocPutS(doc,"A sprite is composed of an ordered lst of elements\n" - "such as lines and color changes. You can create an icon\n" - "by placing a sprite with a payload of C+ code to execute.\n" - "This is a called a \"sprite macro\". Check \"Pop-Up\" for\n" - "icons and \"Esc\" for shelling-to-the-cmd-line macros.\n\n" - "In a program, you first make a sprite. Then, you insert\n" - "a pointer to it.\n\n" - "$$MU,\"Insert just Sprite\",PT_SPRITE$$\n" + DocPutS(doc,"$$FG,PURPLE$$$$TX+CX,\"Graphic Resource Menu\"$$\n" + "$$LK+PU+CX,\"Click for Help\",\"FI:::/TempleOS/Doc/Resource.TXT.Z\"$$\n" + "\n$$FG,LTBLUE$$$$MU,\"Make Sprite\",PT_SPRITE$$\n" + "$$MU,\"Pointer to Sprite\",PT_SPRITE_PTR$$\n" + "$$MU,\"Duplicate Sprite\",PT_DUP_SPRITE$$\n" + "$$MU,\"Sprite Size (not really needed)\",PT_SPRITE_SIZE$$\n" "$$MU,\"Sprite Macro (Icon)\",PT_SPRITE_MACRO$$\n" "$$MU,\"Sprite Menu Item\",PT_SPRITE_MENU$$\n" "$$MU,\"Sprite Link\",PT_SPRITE_LINK$$\n" - "$$MU,\"Pointer to Sprite\",PT_SPRITE_PTR$$\n" - "$$MU,\"Sprite Size (not really needed)\",PT_SPRITE_SIZE$$\n" - "$$MU,\"Duplicate Sprite\",PT_DUP_SPRITE$$\n" - "\n$$MU,\"CANCEL\",DOCM_CANCEL$$\n\n" - "The potential exists for binary data besides $$FG,GREEN$$sprites$$FG$$.\n" - "This is why the pointer to a sprite is known as\n" - "\"Insert Binary\". There is one more option called\n" - "\"Insert Binary Type\". The only other binary data type is\n" - "source line info in map files.\n\n" - "$$MU,\"Insert Binary Data Type\",PT_SPRITE_TYPE$$\n"); + "$$MU,\"Binary Data Type (not needed)\",PT_SPRITE_TYPE$$\n" + "\n$$MU,\"Abort\",DOCM_CANCEL$$\n\n"); i=PopUpMenu(doc); DocDel(doc); return i; @@ -1107,16 +1110,14 @@ class CEdMenuSprite Bool escape fmtstr "$$CB,\"Escape\"$$\n"; }; -U8 *EdSpriteLink(U8 **_html_link) +U8 *EdSpriteLink(Bool *_pop_up,U8 **_html_link) { U8 *result=NULL,*tag=NULL,*link=NULL; Bool quote=FALSE; I64 type=PopUpLinkType(FALSE); *_html_link=NULL; - if (type>=0) { - if (PmtLink(type,&tag,&link,"e,_html_link)) - result=MSPrintF("\"%Q\",\"%Q\"",tag,link); - } + if (type>=0 && PmtLink(type,&tag,&link,_pop_up,"e,_html_link)) + result=MSPrintF("\"%Q\",\"%Q\"",tag,link); Free(tag); Free(link); return result; @@ -1125,6 +1126,7 @@ U8 *EdSpriteLink(U8 **_html_link) U8 *EdSprite(I64 bin_num) { I64 type=PopUpSpriteType; + Bool pop_up; U8 *st,*st1=NULL,*st2=NULL,buf[1024],*html_link=NULL; CEdMacroSprite *dt=CAlloc(sizeof(CEdMacroSprite)); *buf=0; @@ -1156,7 +1158,9 @@ U8 *EdSprite(I64 bin_num) break; case PT_SPRITE_LINK: StrCat(buf,"+L+A"); - st1=EdSpriteLink(&html_link); + st1=EdSpriteLink(&pop_up,&html_link); + if (pop_up) + StrCat(buf,"+PU"); break; case PT_SPRITE_PTR: EdInsBinary(--bin_num,DOCT_INS_BINARY); diff --git a/TempleOS/Adam/Doc/DocEd.CPP b/TempleOS/Adam/Doc/DocEd.CPP index ea32661..dc5325c 100644 --- a/TempleOS/Adam/Doc/DocEd.CPP +++ b/TempleOS/Adam/Doc/DocEd.CPP @@ -8,6 +8,8 @@ public Bool DocLineNumGoTo(CDoc *doc,I64 line_num) //one based doc->y=line_num-1; DocRecalc(doc,FALSE,DOC_RECALC_FIND_CURSOR); DocCenter(doc); + if (doc->cur_entry->y==line_num-1) + result=TRUE; if (unlock) DocUnlock(doc); } @@ -124,7 +126,7 @@ public U0 EdCursorLeft(CDoc *doc,I64 sc=MIN_I64) !(doc_ce->flags1&DOCEG1_DONT_EDIT) && !(doc_ce->flags2&DOCEG2_DONT_EDIT) && ccmax_col) { - doc_ne=CAlloc(sizeof(CDocEntryBase)+sizeof(U8 *),doc->mem_task); + doc_ne=CAlloc(sizeof(CDocEntryBase),doc->mem_task); doc_ne->type=doc_ce->type; doc_ne->flags1=doc_ce->flags1; doc_ne->flags2=doc_ce->flags2; @@ -143,7 +145,7 @@ public U0 EdCursorLeft(CDoc *doc,I64 sc=MIN_I64) !(doc_ce->flags1&DOCEG1_DONT_EDIT) && !(doc_ce->flags2&DOCEG2_DONT_EDIT) && cc>doc_ce->min_col) { - doc_ne=CAlloc(sizeof(CDocEntryBase)+sizeof(U8 *),doc->mem_task); + doc_ne=CAlloc(sizeof(CDocEntryBase),doc->mem_task); doc_ne->type=doc_ce->type; doc_ne->flags1=doc_ce->flags1; doc_ne->flags2=doc_ce->flags2; @@ -186,7 +188,7 @@ public U0 EdCursorLeft(CDoc *doc,I64 sc=MIN_I64) !(doc_ce->flags1&DOCEG1_DONT_EDIT) && !(doc_ce->flags2&DOCEG2_DONT_EDIT) && cc>doc_ce->min_col) { - doc_ne=CAlloc(sizeof(CDocEntryBase)+sizeof(U8 *),doc->mem_task); + doc_ne=CAlloc(sizeof(CDocEntryBase),doc->mem_task); doc_ne->type=doc_ce->type; doc_ne->flags1=doc_ce->flags1; doc_ne->flags2=doc_ce->flags2; @@ -246,7 +248,7 @@ public U0 EdCursorRight(CDoc *doc,I64 sc=MIN_I64) !(doc_ce->flags1&DOCEG1_DONT_EDIT) && !(doc_ce->flags2&DOCEG2_DONT_EDIT) && cc>doc_ce->min_col) { - doc_ne=CAlloc(sizeof(CDocEntryBase)+sizeof(U8 *),doc->mem_task); + doc_ne=CAlloc(sizeof(CDocEntryBase),doc->mem_task); doc_ne->type=doc_ce->type; doc_ne->flags1=doc_ce->flags1; doc_ne->flags2=doc_ce->flags2; @@ -276,7 +278,7 @@ public U0 EdCursorRight(CDoc *doc,I64 sc=MIN_I64) !(doc_ce->flags1&DOCEG1_DONT_EDIT) && !(doc_ce->flags2&DOCEG2_DONT_EDIT) && ccmax_col) { - doc_ne=CAlloc(sizeof(CDocEntryBase)+sizeof(U8 *),doc->mem_task); + doc_ne=CAlloc(sizeof(CDocEntryBase),doc->mem_task); doc_ne->type=DOCT_TEXT | old_color & -0x100; doc_ne->flags1=old_flags1; doc_ne->flags2=old_flags2; @@ -358,7 +360,7 @@ public U0 EdLineUp(CDoc *doc,I64 sc=MIN_I64) !(doc_ce->flags1&DOCEG1_DONT_EDIT) && !(doc_ce->flags2&DOCEG2_DONT_EDIT)) { if (doc_ce->min_colcur_data_colmax_col-1) { - doc_ne=CAlloc(sizeof(CDocEntryBase)+sizeof(U8 *),doc->mem_task); + doc_ne=CAlloc(sizeof(CDocEntryBase),doc->mem_task); doc_ne->type=doc_ce->type; doc_ne->flags1=doc_ce->flags1; doc_ne->flags2=doc_ce->flags2; @@ -456,7 +458,7 @@ public U0 EdLineUp(CDoc *doc,I64 sc=MIN_I64) !(doc_ce->flags1&DOCEG1_DONT_EDIT) && !(doc_ce->flags2&DOCEG2_DONT_EDIT) && doc_ce->xcur_data_colmax_col-1) { - doc_ne=CAlloc(sizeof(CDocEntryBase)+sizeof(U8 *),doc->mem_task); + doc_ne=CAlloc(sizeof(CDocEntryBase),doc->mem_task); doc_ne->type=doc_ce->type; doc_ne->flags1=doc_ce->flags1; doc_ne->flags2=doc_ce->flags2; @@ -513,7 +515,7 @@ public U0 EdLineDown(CDoc *doc,I64 sc=MIN_I64) !(doc_ce->flags1&DOCEG1_DONT_EDIT)&& !(doc_ce->flags2&DOCEG2_DONT_EDIT)) { if (doc->cur_data_col>doc_ce->min_col && doc->cur_data_colmax_col-1) { - doc_ne=CAlloc(sizeof(CDocEntryBase)+sizeof(U8 *),doc->mem_task); + doc_ne=CAlloc(sizeof(CDocEntryBase),doc->mem_task); doc_ne->type=doc_ce->type; doc_ne->flags1=doc_ce->flags1; doc_ne->flags2=doc_ce->flags2; @@ -590,7 +592,7 @@ public U0 EdLineDown(CDoc *doc,I64 sc=MIN_I64) !(doc_ce->flags1&DOCEG1_DONT_EDIT) && !(doc_ce->flags2&DOCEG2_DONT_EDIT)) { if (doc_ce->min_colcur_data_colmax_col-1) { - doc_ne=CAlloc(sizeof(CDocEntryBase)+sizeof(U8 *),doc->mem_task); + doc_ne=CAlloc(sizeof(CDocEntryBase),doc->mem_task); doc_ne->type=DOCT_TEXT | old_color & -0x100; doc_ne->flags1=old_flags1; doc_ne->flags2=old_flags2; @@ -717,7 +719,7 @@ U0 EdInsChar(I64 ch,I64 sc,CDoc *doc) goto ic_done; } } - if (ch==CH_CARRIAGE_RETURN) goto ic_done; + if (ch=='\r') goto ic_done; ic_cont: if ((ch==CH_SPACE || ch=='\n') && @@ -792,7 +794,7 @@ ic_overstrike_char: b=MAlloc(2,doc->mem_task); *b=ch; b[1]=0; - doc_ne=CAlloc(sizeof(CDocEntryBase)+sizeof(U8 *),doc->mem_task); + doc_ne=CAlloc(sizeof(CDocEntryBase),doc->mem_task); doc_ne->type=DOCT_TEXT | doc->settings_root.dft_text_attr << 8; doc_ne->tag=b; doc_ne->max_col=1; @@ -862,7 +864,7 @@ ic_form_tab: b=MAlloc(2,doc->mem_task); *b=ch; b[1]=0; - doc_ne=CAlloc(sizeof(CDocEntryBase)+sizeof(U8 *),doc->mem_task); + doc_ne=CAlloc(sizeof(CDocEntryBase),doc->mem_task); doc_ne->type=DOCT_TEXT | doc->settings_root.dft_text_attr << 8; doc_ne->tag=b; doc_ne->max_col=1; @@ -973,7 +975,10 @@ public U0 EdFindNext(CDoc *doc) } } fn_skip: - doc_e= doc->find_replace->scan_fwd ? doc_e->next:doc_e->last; + if (doc->find_replace->scan_fwd) + doc_e=doc_e->next; + else + doc_e=doc_e->last; } while (doc_e!=doc_ce); if (unlock) DocUnlock(doc); @@ -1475,8 +1480,7 @@ U0 DocEntryToggle(CDoc *doc) U0 DocFlagsToggle(CDoc *doc,I64 tog_flags) { Bool unlock=DocLock(doc); - I64 size,start_text_attr=doc->start_text_attr, - flags=doc->flags^tog_flags; + I64 size,flags=doc->flags^tog_flags; U8 *st=DocSave(doc,&size); CDocUndo *u_next,*u_last; @@ -1485,7 +1489,6 @@ U0 DocFlagsToggle(CDoc *doc,I64 tog_flags) doc->undo_root.next=doc->undo_root.last=&doc->undo_root; DocRst(doc,TRUE); - doc->start_text_attr=start_text_attr; doc->undo_root.next=u_next; doc->undo_root.last=u_last; DocUndoCntSet(doc); @@ -1506,7 +1509,7 @@ public U0 DocPutKey(CDoc *doc,I64 ch,I64 sc) U8 *st,*st2; Bool unlock; - if (!doc || doc->doc_signature!=DOC_SIGNATURE_VAL) + if (!doc && !(doc=DocPut) || doc->doc_signature!=DOC_SIGNATURE_VAL) return; if (doc->user_put_key) if ((*doc->user_put_key)(doc,doc->user_put_data,ch,sc)) @@ -1590,7 +1593,7 @@ public U0 DocPutKey(CDoc *doc,I64 ch,I64 sc) doc_ce=doc->cur_entry=doc_ce->last; if (doc_ce!=doc && doc_ce->type_u8==DOCT_SOFT_NEW_LINE) doc_ce=doc->cur_entry=doc_ce->last; - if (doc_ce==doc || doc_ce->type_u8==DOCT_USER_FOREGROUND) { + if (doc_ce==doc || doc_ce->type_u8==DOCT_PMT) { doc_ce=doc->cur_entry=doc_ce->next; doc->cur_data_col=doc_ce->min_col; } else { @@ -1803,7 +1806,7 @@ public U0 DocPutKey(CDoc *doc,I64 ch,I64 sc) else SetKeyDesc("Edit/Autocomplete Word"); } else { - if (WordStat) { + if (WordStat(ON)) { DocUnlock(doc); if (sc&SCF_SHIFT) WSDDef(ch-'0',Fs); @@ -1869,7 +1872,7 @@ public U0 DocPutKey(CDoc *doc,I64 ch,I64 sc) else SetKeyDesc("Edit/Autocomplete Sym"); } else { - if (WordStat) { + if (WordStat(ON)) { DocUnlock(doc); if (sc&SCF_SHIFT) WSMan(sc2-SC_F1+1,Fs); @@ -1961,6 +1964,13 @@ public U0 DocPutKey(CDoc *doc,I64 ch,I64 sc) DocWrite(doc); st=StrNew(doc->filename.name); } + if (st2=DirFile(st,"Run","CPP.Z")) { + if (FileFind(st2)) { + Free(st); + st=st2; + } else + Free(st2); + } if (st) { if (sc&SCF_SHIFT) AdamFile(st); @@ -2195,19 +2205,16 @@ public U0 DocPutKey(CDoc *doc,I64 ch,I64 sc) Yield; } +U0 DocNewLine(CDoc *doc=NULL,I64 cnt=1) +{ + while (cnt-->0) + DocPutKey(doc,'\n',0); +} + Bool AKDDocPutKey(I64 ch,I64 scancode) { CDoc *doc; - doc=Fs->next_doc; - while (doc!=(&Fs->next_doc)(U8 *)-offset(CDoc.next_doc) && - doc->doc_in_que_signature==DOC_IN_QUE_SIGNATURE_VAL) { - if (!(doc->flags&DOCF_DONT_SHOW) && doc->flags&DOCF_AUX_DOC && !doc->best_d) { - DocPutKey(doc,ch,scancode); - return FALSE; - } - doc=doc->next_doc; - } - if (doc=DocCur) + if (doc=DocPut) DocPutKey(doc,ch,scancode); return FALSE; } @@ -2261,7 +2268,7 @@ public U0 DocPutSPartial(CDoc *doc,U8 *st) Free(doc_ce->tag); doc_ce->tag=b; } else { - doc_ne=CAlloc(sizeof(CDocEntryBase)+sizeof(U8 *),doc->mem_task); + doc_ne=CAlloc(sizeof(CDocEntryBase),doc->mem_task); doc_ne->type=DOCT_TEXT | doc->settings_root.dft_text_attr << 8; doc_ne->tag=MAlloc(j+1,doc->mem_task); MemCpy(doc_ne->tag,ptr2,j+1); @@ -2287,12 +2294,11 @@ public U0 DocPutSPartial(CDoc *doc,U8 *st) Bool DocFileEd(I64 type,U8 *filename, U8 *pattern,I64 *_num,I64 ed_flags) { - I64 flags=0,i; + I64 flags=0,i,old_border_src=Fs->border_src; CDocEntry *doc_e; CDoc *doc; Bool old_silent=Bt(&Fs->display_flags,DISPLAYf_SILENT), - result=FALSE; - + result=FALSE; try { switch (type) { case LK_PLAIN: @@ -2315,7 +2321,7 @@ Bool DocFileEd(I64 type,U8 *filename, flags|=DOCF_ALLOW_UNDO; if (!*filename) - doc=DocCur; + doc=DocPut; else { Silent(ON); if (Bt(&ed_flags,EDf_BAIL)) //if bail, scan parents @@ -2326,7 +2332,7 @@ Bool DocFileEd(I64 type,U8 *filename, doc=DocRead(filename,flags); StrCpy(doc->desc,"Edit"); Silent(old_silent); - doc->flags|=DOCF_ATTR_BY_FILENAME; + Fs->border_src=BDS_ED_FILENAME_PRT; } if (Bt(&ed_flags,EDf_COLLAPSE)) @@ -2360,7 +2366,7 @@ Bool DocFileEd(I64 type,U8 *filename, DocUnlock(doc); DocWrite(doc); } - if (Fs->last_doc!=doc) + if (DocPut!=doc) DocDel(doc); else result=FALSE; @@ -2368,6 +2374,7 @@ Bool DocFileEd(I64 type,U8 *filename, Silent(old_silent); result=FALSE; } + Fs->border_src=old_border_src; return result; } diff --git a/TempleOS/Adam/Doc/DocFile.CPP b/TempleOS/Adam/Doc/DocFile.CPP index 2a65d14..7a20f85 100644 --- a/TempleOS/Adam/Doc/DocFile.CPP +++ b/TempleOS/Adam/Doc/DocFile.CPP @@ -138,7 +138,7 @@ public U8 *DocSave(CDoc *doc,I64 *_size=NULL) break; case DOCT_NEW_LINE: if (doc->flags&DOCF_CARRIAGE_RETURN) - *dst++=CH_CARRIAGE_RETURN; + *dst++='\r'; *dst++='\n'; break; default: @@ -152,7 +152,6 @@ public U8 *DocSave(CDoc *doc,I64 *_size=NULL) *dst++='$$'; Free(st); } - break; } } } @@ -200,7 +199,7 @@ public U0 DocInsDoc(CDoc *doc,CDoc *doc2) if (doc->cur_entry->type_u8==DOCT_TEXT && doc->cur_data_col>doc->cur_entry->min_col) { if (doc->cur_data_colcur_entry->max_col) { - doc_ne=CAlloc(sizeof(CDocEntryBase)+sizeof(U8 *),doc->mem_task); + doc_ne=CAlloc(sizeof(CDocEntryBase),doc->mem_task); doc_ne->type=DOCT_TEXT | doc->cur_entry->type & 0xFFFFFF00; doc_ne->flags1=doc->cur_entry->flags1; doc_ne->flags2=doc->cur_entry->flags2; @@ -424,32 +423,43 @@ U0 DocUndoRestore(CDoc *doc) DocUnlock(doc); } +#help_index "Graphics/Windows BMP Files;Doc/Output" -#help_index "File/Cmd Line (Typically);Doc/Cmd Line (Typically);Cmd Line (Typically)" - -public Bool Type(U8 *fname) -//Output a file to the cmd line. -//Even graphics and macros will be sent. -{ - CDoc *doc,*doc2; - if (doc=DocCur) { - if (FilesFindMatch(FILENAME_MASK_TXT,fname)) { - doc2=DocRead(fname); - DocInsDoc(doc,doc2); - DocDel(doc2); - return TRUE; - } else if (FilesFindMatch("*.BMP.Z",fname)) { - DocPutBMPFile(doc,fname,FALSE); - return TRUE; - } else if (FilesFindMatch("*.BMP;*.bmp",fname)) { - DocPutBMPFile(doc,fname,TRUE); - return TRUE; - } else if (FilesFindMatch("*.GRA*",fname)) { - DocPutGRAFile(doc,fname); - return TRUE; - } +public Bool DocType(CDoc *doc=NULL,U8 *filename,I64 trailing_new_lines=1) +{//This is like DOS "type" or Unix "cat". +//Output a file to a document. +//Even graphics can be sent. + Bool result=FALSE; + CDoc *doc2; + if (!doc && !(doc=DocPut) || doc->doc_signature!=DOC_SIGNATURE_VAL) + return FALSE; + if (FilesFindMatch(FILENAME_MASK_TXT,filename)) { + doc2=DocRead(filename); + DocInsDoc(doc,doc2); + DocDel(doc2); + result=TRUE; + } else if (FilesFindMatch("*.BMP.Z",filename)) { + DocPutBMPFile(doc,filename,FALSE); + result=TRUE; + } else if (FilesFindMatch("*.BMP;*.bmp",filename)) { + DocPutBMPFile(doc,filename,TRUE); + result=TRUE; + } else if (FilesFindMatch("*.GRA*",filename)) { + DocPutGRAFile(doc,filename); + result=TRUE; } - return FALSE; + if (result) + DocNewLine(doc,trailing_new_lines); + return result; +} + +#help_index "Graphics/Windows BMP Files;File/Cmd Line (Typically);Doc/Cmd Line (Typically);Cmd Line (Typically)" + +public Bool Type(U8 *filename,I64 trailing_new_lines=1) +{//This is like DOS "type" or Unix "cat". +//Output a file to the cmd line. +//Even graphics can be sent. + return DocType(,filename,trailing_new_lines); } #help_index "Doc" diff --git a/TempleOS/Adam/Doc/DocHighlight.CPP b/TempleOS/Adam/Doc/DocHighlight.CPP index 9f9acd6..b0e6ce0 100644 --- a/TempleOS/Adam/Doc/DocHighlight.CPP +++ b/TempleOS/Adam/Doc/DocHighlight.CPP @@ -10,7 +10,7 @@ DocHighlightInit; U32 *DocHighlight(CDoc *doc,Bool full_refresh,CDocEntry *doc_e,CDocSettings **_s, U8 *src,I64 len,I64 _temp_u32_attr) -{ //Be aware of $LK-A,"::/TempleOS/Adam/ToHtml.CPP"$. +{ //Be aware of $LK-A,"::/TempleOS/Adam/Utils/ToHtml.CPP"$. U32 *result=MAlloc((len+1)*sizeof(U32)),*dst=result; U8 *ptr,ch,ch1,last_ch; CDocSettings *s=*_s; @@ -28,13 +28,13 @@ hl_normal: case '/': if (len>=2) { if (*src=='/') { - temp_u32_attr=(s->comment_attr&15)<<8|mask_temp_u32_attr; + temp_u32_attr=DOC_COLOR_COMMENT<<8|mask_temp_u32_attr; *dst++=ch1+temp_u32_attr; *dst++=*src++ +temp_u32_attr; len-=2; goto hl_cpp_comment; } else if (*src=='*') { - temp_u32_attr=(s->comment_attr&15)<<8|mask_temp_u32_attr; + temp_u32_attr=DOC_COLOR_COMMENT<<8|mask_temp_u32_attr; *dst++=ch1+temp_u32_attr; *dst++=*src++ +temp_u32_attr; len-=2; @@ -44,30 +44,30 @@ hl_normal: } break; case '\'': - temp_u32_attr=(s->quote_attr&15)<<8|mask_temp_u32_attr; + temp_u32_attr=DOC_COLOR_QUOTE<<8|mask_temp_u32_attr; *dst++=ch1+temp_u32_attr; len--; goto hl_single_quote; case '\"': - temp_u32_attr=(s->quote_attr&15)<<8|mask_temp_u32_attr; + temp_u32_attr=DOC_COLOR_QUOTE<<8|mask_temp_u32_attr; *dst++=ch1+temp_u32_attr; len--; goto hl_dbl_quote; case '(': if (paren_depth++&1) - temp_u32_attr=(s->alt_text_attr&15)<<8|mask_temp_u32_attr; + temp_u32_attr=DOC_COLOR_ALT_TEXT<<8|mask_temp_u32_attr; break; case ')': if (--paren_depth&1) - temp_u32_attr=(s->alt_text_attr&15)<<8|mask_temp_u32_attr; + temp_u32_attr=DOC_COLOR_ALT_TEXT<<8|mask_temp_u32_attr; break; case '{': if (brace_depth++&1) - temp_u32_attr=(s->alt_text_attr&15)<<8|mask_temp_u32_attr; + temp_u32_attr=DOC_COLOR_ALT_TEXT<<8|mask_temp_u32_attr; break; case '}': if (--brace_depth&1) - temp_u32_attr=(s->alt_text_attr&15)<<8|mask_temp_u32_attr; + temp_u32_attr=DOC_COLOR_ALT_TEXT<<8|mask_temp_u32_attr; break; } *dst++=ch1+temp_u32_attr; @@ -82,9 +82,9 @@ hl_normal: *src=0; if (temph=HashFind(ptr,doc_hash,HTT_KEYWORD|HTT_ASM_KEYWORD|HTT_OPCODE|HTT_REG)) { if (temph->type&(HTT_KEYWORD|HTT_ASM_KEYWORD|HTT_OPCODE)) - temp_u32_attr=(s->keyword_attr&15) <<8|mask_temp_u32_attr; + temp_u32_attr=DOC_COLOR_KEYWORD<<8|mask_temp_u32_attr; else - temp_u32_attr=(s->keyword2_attr&15)<<8|mask_temp_u32_attr; + temp_u32_attr=DOC_COLOR_KEYWORD2<<8|mask_temp_u32_attr; } else temp_u32_attr=_temp_u32_attr; while (ch1=*ptr++) @@ -106,7 +106,7 @@ hl_normal_done: } break; case DOCSS_SINGLE_QUOTE: - temp_u32_attr=(s->quote_attr&15)<<8|mask_temp_u32_attr; + temp_u32_attr=DOC_COLOR_QUOTE<<8|mask_temp_u32_attr; hl_single_quote: last_ch=0; while (len--) { @@ -133,7 +133,7 @@ hl_single_quote: } break; case DOCSS_DBL_QUOTE: - temp_u32_attr=(s->quote_attr&15)<<8|mask_temp_u32_attr; + temp_u32_attr=DOC_COLOR_QUOTE<<8|mask_temp_u32_attr; hl_dbl_quote: last_ch=0; while (len--) { @@ -160,7 +160,7 @@ hl_dbl_quote: } break; case DOCSS_COMMENT: - temp_u32_attr=(s->comment_attr&15)<<8|mask_temp_u32_attr; + temp_u32_attr=DOC_COLOR_COMMENT<<8|mask_temp_u32_attr; comment_depth=s->comment_depth; hl_comment: last_ch=0; @@ -188,7 +188,7 @@ hl_comment: } break; case DOCSS_CPP_Z_COMMENT: - temp_u32_attr=(s->comment_attr&15)<<8|mask_temp_u32_attr; + temp_u32_attr=DOC_COLOR_COMMENT<<8|mask_temp_u32_attr; hl_cpp_comment: while (len--) *dst++=*src++ +temp_u32_attr; diff --git a/TempleOS/Adam/Doc/DocIDE.CPP b/TempleOS/Adam/Doc/DocIDE.CPP index eade120..6e90675 100644 --- a/TempleOS/Adam/Doc/DocIDE.CPP +++ b/TempleOS/Adam/Doc/DocIDE.CPP @@ -78,7 +78,7 @@ U0 WatchLocals() if (!TaskValidate(dbg_task=task->dbg_task)) Exit; DocDblBufStart; - if (doc=DocCur(dbg_task)) { + if (doc=DocPut(dbg_task)) { if (tempf=DbgFunFind(doc,0)) { "$$WW,1$$"; rbp=task->rbp; @@ -145,7 +145,7 @@ public U0 IDE(U8 *filename) SetWinVert(2,TEXT_ROWS-2); LBts(&Fs->display_flags,DISPLAYf_CHILDREN_NOT_ON_TOP); - task=Spawn(&UserCmdLine,NULL,"Debug",Fs); + task=Spawn(&UserCmdLine,NULL,"Debug",,Fs); TaskWait(task); SetWinHorz(TEXT_COLS>>1+1,TEXT_COLS-2,task); SetWinVert(12,TEXT_ROWS-2,task); @@ -153,7 +153,7 @@ public U0 IDE(U8 *filename) Fs->dbg_task=task; - task=Spawn(&UserCmdLine,NULL,"Watch",Fs); + task=Spawn(&UserCmdLine,NULL,"Watch",,Fs); TaskWait(task); SetWinHorz(TEXT_COLS>>1+1,TEXT_COLS-2,task); SetWinVert(2,10,task); @@ -405,12 +405,12 @@ U0 IDEEdTask(I64) CDoc *doc; CBpt *tempb; if (rip_filename=SrcFileName(rip)) { - ed_task=Spawn(&UserCmdLine,NULL,"Debug",task); + ed_task=Spawn(&UserCmdLine,NULL,"Debug",,task); TaskWait(ed_task); st=MSPrintF("Preempt(OFF);Ed(\"%s\");\n",rip_filename); XTalkWait(ed_task,st); Free(st); - doc=DocCur(ed_task); + doc=DocPut(ed_task); if (TaskValidate(dbg_task=task->dbg_task)) { SetWinHorz(dbg_task->win_left,dbg_task->win_right, ed_task); SetWinVert(dbg_task->win_top, dbg_task->win_bottom,ed_task); @@ -444,7 +444,7 @@ U0 IDEResumeDbg() CIDE *tempi=NamedFramePtr("IDEFrame",dbg_task); U8 *opcode; if (!tempi) { - Spawn(&IDEEdTask,NULL,"Resume Dbg",Fs); + Spawn(&IDEEdTask,NULL,"Resume Dbg",,Fs); Suspend(Fs); } else switch (tempi->type) { @@ -454,19 +454,19 @@ U0 IDEResumeDbg() LBtr(&Fs->rflags,RFLAGf_TRAP); if (Fs->rip==tempi->cur_line) {//Jmp to self tempi->cur_line=NULL; - Spawn(&IDEEdTask,NULL,"Resume Dbg",Fs); + Spawn(&IDEEdTask,NULL,"Resume Dbg",,Fs); Suspend(Fs); } else tempi->cur_line=NULL; } else { - Spawn(&IDEEdTask,NULL,"Resume Dbg",Fs); + Spawn(&IDEEdTask,NULL,"Resume Dbg",,Fs); Suspend(Fs); } break; case IDET_STEP_INTO: if (!tempi->cur_line || Fs->ripcur_line || Fs->rip>=tempi->next_line) { - Spawn(&IDEEdTask,NULL,"Resume Dbg",Fs); + Spawn(&IDEEdTask,NULL,"Resume Dbg",,Fs); Suspend(Fs); } else Suspend(Fs,FALSE); @@ -481,7 +481,7 @@ U0 IDEResumeDbg() } if (!tempi->cur_line || Fs->ripcur_line || Fs->rip>=tempi->next_line) { - Spawn(&IDEEdTask,NULL,"Resume Dbg",Fs); + Spawn(&IDEEdTask,NULL,"Resume Dbg",,Fs); Suspend(Fs); } else { opcode=Fs->rip; diff --git a/TempleOS/Adam/Doc/DocMacro.CPP b/TempleOS/Adam/Doc/DocMacro.CPP index a303ff0..333ca59 100644 --- a/TempleOS/Adam/Doc/DocMacro.CPP +++ b/TempleOS/Adam/Doc/DocMacro.CPP @@ -3,20 +3,20 @@ StrCpy(captured_macro_name,"Test"); I64 sys_macro_repeat_n=1; -U0 SysMacroStripKey(CTaskCmd *macro_root,I64 p1,I64 p2) +U0 SysMacroStripKey(CSrvCmd *macro_root,I64 p1,I64 p2) { - CTaskCmd *tempc,*tempc1; + CSrvCmd *tempc,*tempc1; tempc=macro_root->next; while (tempc!=macro_root) { tempc1=tempc->next; - if (tempc->cmd_code==TASKCT_MSG && + if (tempc->cmd_code==SVCT_MSG && (tempc->msg_code==MSG_KEY_DOWN || tempc->msg_code==MSG_KEY_UP || tempc->msg_code==MSG_KEY_DOWN_UP) && - p1 && tempc->p1==p1 || - !p1 && tempc->p2==p2) { + p1 && tempc->aux1==p1 || + !p1 && tempc->aux2==p2) { QueRem(tempc); - Free(tempc); + SrvCmdDel(tempc); } tempc=tempc1; } @@ -33,27 +33,27 @@ class CMacroTemp U8 buf[136]; }; -CMacroTemp *Cmd2MT(CTaskCmd *tempc) +CMacroTemp *Cmd2MT(CSrvCmd *tempc) { U8 buf[8]; CMacroTemp *tempmt=CAlloc(sizeof(CMacroTemp)); - if (Bt(getkey_chars_bitmap,tempc->p1) && tempc->msg_code==MSG_KEY_DOWN) { + if (Bt(getkey_chars_bitmap,tempc->aux1) && tempc->msg_code==MSG_KEY_DOWN) { tempmt->type=MT_CHAR; - buf[0]=tempc->p1; + buf[0]=tempc->aux1; buf[1]=0; SPrintF(tempmt->buf,"%Q",buf); } else { tempmt->type=MT_MSG; SPrintF(tempmt->buf,"Msg(0x%X,0x%X,0x%X);", - tempc->msg_code,tempc->p1,tempc->p2); + tempc->msg_code,tempc->aux1,tempc->aux2); } return tempmt; } -U8 *SysMacro2Str(CTaskCmd *macro_root) +U8 *SysMacro2Str(CSrvCmd *macro_root) { - CTaskCmd *tempc; + CSrvCmd *tempc; I64 cnt=1; //terminating zero U8 *ptr,*m; CMacroTemp *tempmt,*tempmt1,root; @@ -147,7 +147,7 @@ U0 EdInsCapturedMacro() I64 PopUpExitRecordPlayStopIns() { U8 buf[136]; - CTaskCmd *tempc; + CSrvCmd *tempc; CDoc *doc=DocNew; CDocEntry *doc_e=DocPutS(doc,"$$DA-P,135,\"Name:%s\"$$"); I64 result=0; @@ -166,12 +166,12 @@ I64 PopUpExitRecordPlayStopIns() "\n\n\n$$FG,GREEN$$SHIFT-F2$$FG$$ will play macro.\n"); doc->flags|=DOCF_MIN_SIZE | DOCF_FORM; SPrintF(buf,"DocMenuDo(0x%X);",doc); - sys_macro_util_task=Spawn(&ServantUserCmdLine,NULL,"Macro Popup",Fs); + sys_macro_util_task=Spawn(&SrvUserCmdLine,NULL,"Macro Popup",,Fs); Fs->popup_task=sys_macro_util_task; LBts(&sys_macro_util_task->display_flags,DISPLAYf_WIN_ON_TOP); - tempc=TaskRqstQue(sys_macro_util_task,Fs,buf, - 1<popup_task=NULL; Kill(sys_macro_util_task); sys_macro_util_task=NULL; diff --git a/TempleOS/Adam/Doc/DocMain.CPP b/TempleOS/Adam/Doc/DocMain.CPP index cc890d5..b9260a1 100644 --- a/TempleOS/Adam/Doc/DocMain.CPP +++ b/TempleOS/Adam/Doc/DocMain.CPP @@ -58,10 +58,9 @@ public Bool Plain(U8 *filename) public Bool DocLinkChk(U8 *link_st) { U8 *filename; - I64 num; Bool result=FALSE; if (link_st) { - switch (EdLinkCvt(link_st,&filename,,&num)) { + switch (EdLinkCvt(link_st,&filename)) { case -1: break; case LK_FILE_LINE: @@ -108,70 +107,68 @@ public U8 *DocLinkFile(U8 *link_st,CTask *mem_task=NULL) } #help_index "Doc/Task" -public CDoc *SysAuxDocInit() +public CDoc *SysBorderDocInit() { CDocEntry *doc_e; - CDoc *aux,*doc=DocCur; + CDoc *bdoc,*doc=DocPut; - aux=DocNew; - aux->flags|=DOCF_AUX_DOC; + bdoc=DocNew; + bdoc->flags|=DOCF_BORDER_DOC; if (doc) { - DocPutS(aux,"$$CM+H+BY+RX+NC,-7,1$$"); - doc_e=DocPutS(aux,"$$TX+H+BD+TC,\" \"$$"); + DocPutS(bdoc,"$$CM+H+BY+RX+NC,-7,1$$"); + doc_e=DocPutS(bdoc,"$$TX+H+BD+TC,\" \"$$"); doc_e->user_data=doc; doc_e->tag_cb=&EdFilterCB; - doc_e=DocPutS(aux,"$$TX+H+BD+TC,\" \"$$"); + doc_e=DocPutS(bdoc,"$$TX+H+BD+TC,\" \"$$"); doc_e->user_data=doc; doc_e->tag_cb=&EdOverStrikeCB; - doc_e=DocPutS(aux,"$$TX+H+BD+TC,\" \"$$"); + doc_e=DocPutS(bdoc,"$$TX+H+BD+TC,\" \"$$"); doc_e->user_data=doc; doc_e->tag_cb=&EdDollarCB; } - DocPutS(aux,"$$CM+H+BY+RX+NC,-4,1$$"); - doc_e=DocPutS(aux,"$$TX+H+BD+TC,\" \"$$"); + DocPutS(bdoc,"$$CM+H+BY+RX+NC,-4,1$$"); + doc_e=DocPutS(bdoc,"$$TX+H+BD+TC,\" \"$$"); doc_e->tag_cb=&EdQuotesCB; - doc_e=DocPutS(aux,"$$TX+H+BD+TC,\" \"$$"); + doc_e=DocPutS(bdoc,"$$TX+H+BD+TC,\" \"$$"); doc_e->tag_cb=&EdBracesCB; - doc_e=DocPutS(aux,"$$TX+H+BD+TC,\" \"$$"); + doc_e=DocPutS(bdoc,"$$TX+H+BD+TC,\" \"$$"); doc_e->tag_cb=&EdSemicolonCB; if (doc) { - DocPutS(aux,"$$CM+H+BY+RX+NC,-18,1$$"); - doc_e=DocPutS(aux,"$$TX+BD+TC,\" \"$$"); + DocPutS(bdoc,"$$CM+H+BY+RX+NC,-18,1$$"); + doc_e=DocPutS(bdoc,"$$TX+BD+TC,\" \"$$"); doc_e->user_data=doc; doc_e->tag_cb=&EdMoreCB; - doc_e=DocPutS(aux,"$$TX+H+BD+TC,\" \"$$"); + doc_e=DocPutS(bdoc,"$$TX+H+BD+TC,\" \"$$"); doc_e->user_data=doc; doc_e->tag_cb=&EdDollarTypeCB; } if (Fs->user_num) - DocPrintF(aux,"$$CM+H+TY+LX+NC,5,-1$$$$TX+H+BD,\"#%d\"$$",Fs->user_num); - DocPutS(aux,"$$CM+H+TY+NC,0,-1$$"); - doc_e=DocPutS(aux,"$$DA+H-T-P+BD+RD+CX+SCX+IV,140,\"%s...\",16$$"); + DocPrintF(bdoc,"$$CM+H+TY+LX+NC,5,-1$$$$TX+H+BD,\"#%d\"$$",Fs->user_num); + DocPutS(bdoc,"$$CM+H+TY+NC,0,-1$$"); + doc_e=DocPutS(bdoc,"$$DA+H-T-P+BD+RD+CX+SCX+IV,140,\"%s...\",16$$"); doc_e->data=&Fs->task_title; DocDataFmt(doc_e); - DocPrintF(aux,"$$CM+H+NC,1,0$$$$TX+H+BD+IV,\"%X\"$$",Fs); - aux->settings_root.dft_text_attr=Fs->border_attr; + DocPrintF(bdoc,"$$CM+H+NC,1,0$$$$TX+H+BD+IV,\"%X\"$$",Fs); if (Bt(&Fs->display_flags,DISPLAYf_HAS_CLOSE_WIN)) - DocPutS(aux,"$$TX+H+RX+BD,\"[X]\"$$"); - DocPutS(aux,"$$BK,1$$$$TX+H+LX+BD,\"MENU\"$$$$BK,0$$"); - return aux; + DocPutS(bdoc,"$$TX+H+RX+BD,\"[X]\"$$"); + DocPutS(bdoc,"$$BK,1$$$$TX+H+LX+BD,\"MENU\"$$$$BK,0$$"); + return bdoc; } public U0 UseTermDoc() { Bool old_preempt=Preempt(OFF); CDoc *doc=DocNew; - doc->start_text_attr=WHITE<<4+BLUE; - DocQueIns(doc,Fs->last_doc); doc->right_click_link=&TermRightClickLink; doc->max_entries=4096; - doc->flags|=DOCF_ATTR_BY_PRT; + Fs->border_src=BDS_CUR_PRT; StrCpy(doc->desc,"Term"); - DocQueInsRev(SysAuxDocInit,Fs->next_doc); + Fs->put_doc=Fs->display_doc=doc; + Fs->border_doc=SysBorderDocInit; Fs->cur_menu=MenuFile("::/TempleOS/Doc/EdPullDown.TXT"); WinScrollsInit(Fs); Preempt(old_preempt); @@ -219,7 +216,7 @@ public U8 *DocGetLine(CDoc *doc,CDocEntry *doc_e,I64 *cur_col=NULL,CDocEntry **_ } #help_index "Doc/Output" -public U0 DocDump(CDoc *doc,I64 uS_delay=0) +U0 DocDump(CDoc *doc,I64 uS_delay=0) { U8 *st; CDocEntry *doc_e,*doc_e2; @@ -240,10 +237,14 @@ public U0 DocDump(CDoc *doc,I64 uS_delay=0) DocUnlock(doc); } -public CDocEntry *DocPutLine(CDocEntry *doc_e) +public CDocEntry *DocPutLine(CDoc *doc=NULL,CDocEntry *doc_e) { U8 ch,*ptr,*ptr2; - while (doc_e->type_u8!=DOCT_ERROR && doc_e->type_u8!=DOCT_NEW_LINE) { + Bool unlock; + if (!doc && !(doc=DocPut) || doc->doc_signature!=DOC_SIGNATURE_VAL) + return NULL; + unlock=DocLock(doc); + while (doc_e!=doc && doc_e->type_u8!=DOCT_NEW_LINE) { if (Bt(doc_tag_types,doc_e->type_u8)) { ptr=doc_e->tag; do { @@ -266,7 +267,11 @@ public CDocEntry *DocPutLine(CDocEntry *doc_e) doc_e=doc_e->next; } NewLine; - return doc_e->type_u8==DOCT_ERROR ? doc_e:doc_e->next; + if (doc_e!=doc) + doc_e=doc_e->next; + if (unlock) + DocUnlock(doc); + return doc_e; } #help_index "Doc/Input" @@ -278,29 +283,19 @@ public U8 *DocMGetS(I64 flags=0) Bool old_preempt=IsPreempt; U8 *st,*result; I64 ch,sc; - "$$FU$$"; + "$$PT$$"; do { ch=DocGetKey(&sc); if (ch==CH_ESC) { - doc=Fs->next_doc; - while (doc!=(&Fs->next_doc)(U8 *)-offset(CDoc.next_doc) && - doc->doc_in_que_signature==DOC_IN_QUE_SIGNATURE_VAL) { + if (doc=DocPut) { DocLock(doc); - if (!(doc->flags&DOCF_DONT_SHOW) && - (!doc->best_d || !(doc->flags&DOCF_AUX_DOC)) && - doc->doc_in_que_signature==DOC_IN_QUE_SIGNATURE_VAL && doc->cur_entry!=doc) { + if (doc->doc_signature==DOC_SIGNATURE_VAL && doc->cur_entry!=doc) { doc_e=DocEntryCopy(doc,doc->cur_entry); - if (doc->flags&DOCF_AUX_DOC && DocCur) - DocBottom; - else - DocBottom(doc); + DocBottom(doc); DocEntryRun(doc,doc_e,TRUE); DocEntryDel(doc,doc_e); - DocUnlock(doc); - break; } DocUnlock(doc); - doc=doc->next_doc; } if (flags&GETSF_WITH_NEW_LINE) break; @@ -316,12 +311,12 @@ public U8 *DocMGetS(I64 flags=0) } while (flags&GETSF_WITH_NEW_LINE || ch!='\n' || sc & SCF_CTRL && sc & SCF_SHIFT); Preempt(OFF); - doc=DocCur; + doc=DocPut; DocLock(doc); if (flags&GETSF_WITH_NEW_LINE) { doc_e=doc->cur_entry; do doc_e=doc_e->last; - while (doc_e!=doc && doc_e->type_u8!=DOCT_USER_FOREGROUND); + while (doc_e!=doc && doc_e->type_u8!=DOCT_PMT); doc_e=doc_e->next; if (result=DocGetLine(doc,doc_e,NULL,&doc_e_end)) { while (doc_e_end!=doc && doc_e_end->type_u8==DOCT_NEW_LINE) { @@ -336,18 +331,18 @@ public U8 *DocMGetS(I64 flags=0) doc_e=doc->cur_entry; do doc_e=doc_e->last; while (doc_e!=doc && doc_e->type_u8!=DOCT_NEW_LINE && - doc_e->type_u8!=DOCT_USER_FOREGROUND); - if (doc_e!=doc && doc_e->type_u8!=DOCT_USER_FOREGROUND) { + doc_e->type_u8!=DOCT_PMT); + if (doc_e!=doc && doc_e->type_u8!=DOCT_PMT) { do doc_e=doc_e->last; while (doc_e!=doc && doc_e->type_u8!=DOCT_NEW_LINE && - doc_e->type_u8!=DOCT_USER_FOREGROUND); + doc_e->type_u8!=DOCT_PMT); } doc_e=doc_e->next; result=DocGetLine(doc,doc_e,NULL); } DocUnlock(doc); mgets_done: - "$$FU$$$$FG$$$$BG$$"; + "$$PT$$$$FG$$$$BG$$"; Preempt(old_preempt); return result; } @@ -367,11 +362,12 @@ public I64 PmtI64(U8 *msg,I64 dft,I64 lo=MIN_I64,I64 hi=MAX_I64) return dft; } try { - okay=FALSE; result=ExePrintF3("ToI64(%s);",st); okay=TRUE; - } catch + } catch { Fs->catch_except=TRUE; + okay=FALSE; + } Free(st); if (okay && lo<=result<=hi) return result; @@ -391,11 +387,12 @@ public F64 PmtF64(U8 *msg,F64 dft,F64 lo=MIN_F64,F64 hi=MAX_F64) return dft; } try { - okay=FALSE; result=ExePrintF3("ToF64(%s);",st)(F64); okay=TRUE; - } catch + } catch { Fs->catch_except=TRUE; + okay=FALSE; + } Free(st); if (okay && lo<=result<=hi) return result; @@ -433,7 +430,7 @@ public CDate PmtCDate(U8 *msg,CDate dft,CDate lo=MIN_I64,CDate hi=MAX_I64) Free(st); return dft; } - result=A2CDate(st); + result=A2Date(st); Free(st); if (result>=lo && result<=hi) return result; @@ -495,10 +492,15 @@ I64 PopUpCancelIncludeDelAuto(U8 *header=NULL,U8 *footer=NULL) I64 EdLeftClickLink(CDoc *doc,CDocEntry *doc_e) { //called with doc locked, exit unlocked Bool result; - U8 *st; + U8 *st,*st2; if (st=DocEntryLink(doc,doc_e)) { DocUnlock(doc); - result=Ed(st); + if (doc_e->flags1 & DOCEF1_POPUP) { + st2=MSPrintF("Ed(\"%Q\");",st); + result=PopUp(st2); + Free(st2); + } else + result=Ed(st); Free(st); return result; } @@ -523,7 +525,7 @@ I64 TermRightClickLink(CDoc *doc,CDocEntry *doc_e) break; } } - "#include \"%s\";\n$$FU$$$$FG$$$$BG$$",st; + "#include \"%s\";\n$$PT$$$$FG$$$$BG$$",st; WinZBufUpdate; ExeFile(st); result=TRUE; @@ -535,11 +537,11 @@ I64 TermRightClickLink(CDoc *doc,CDocEntry *doc_e) result=Type(st); break; case RIGHT_ED: - "Ed(\"%s\");\n$$FU$$$$FG$$$$BG$$",st; + "Ed(\"%s\");\n$$PT$$$$FG$$$$BG$$",st; result=Ed(st); break; case RIGHT_PLAIN: - "Plain(\"%s\");\n$$FU$$$$FG$$$$BG$$",st; + "Plain(\"%s\");\n$$PT$$$$FG$$$$BG$$",st; result=Plain(st); break; case RIGHT_AUTOFILE: @@ -549,7 +551,7 @@ I64 TermRightClickLink(CDoc *doc,CDocEntry *doc_e) break; } } - "AutoFile(\"%s\");\n$$FU$$$$FG$$$$BG$$",st; + "AutoFile(\"%s\");\n$$PT$$$$FG$$$$BG$$",st; WinZBufUpdate; AutoStr("%F\n",st); result=TRUE; @@ -561,7 +563,7 @@ I64 TermRightClickLink(CDoc *doc,CDocEntry *doc_e) break; } } - "Adam(\"#include \\\"%s\\\"\" );\n$$FU$$$$FG$$$$BG$$",st; + "Adam(\"#include \\\"%s\\\"\" );\n$$PT$$$$FG$$$$BG$$",st; WinZBufUpdate; AdamFile(st,FALSE); result=TRUE; @@ -573,7 +575,7 @@ I64 TermRightClickLink(CDoc *doc,CDocEntry *doc_e) break; } } - "Cmp(\"%s\");\n$$FU$$$$FG$$$$BG$$",st; + "Cmp(\"%s\");\n$$PT$$$$FG$$$$BG$$",st; WinZBufUpdate; result=!ToBool(Cmp(st)); break; @@ -584,7 +586,7 @@ I64 TermRightClickLink(CDoc *doc,CDocEntry *doc_e) break; } } - "Load(\"%s\");\n$$FU$$$$FG$$$$BG$$",st; + "Load(\"%s\");\n$$PT$$$$FG$$$$BG$$",st; WinZBufUpdate; result=ToBool(Load(st)); break; @@ -595,7 +597,7 @@ I64 TermRightClickLink(CDoc *doc,CDocEntry *doc_e) break; } } - "BinRep(\"%s\");\n$$FU$$$$FG$$$$BG$$",st; + "BinRep(\"%s\");\n$$PT$$$$FG$$$$BG$$",st; WinZBufUpdate; result=BinRep(st); break; @@ -620,7 +622,7 @@ I64 TermRightClickLink(CDoc *doc,CDocEntry *doc_e) break; } } - "IDE(\"%s\");\n$$FU$$$$FG$$$$BG$$",st; + "IDE(\"%s\");\n$$PT$$$$FG$$$$BG$$",st; WinZBufUpdate; IDE(st); result=TRUE; @@ -635,7 +637,7 @@ I64 TermRightClickLink(CDoc *doc,CDocEntry *doc_e) } else send_new_line=TRUE; DocBottom(doc); - "$$FU$$$$FG$$$$BG$$"; + "$$PT$$$$FG$$$$BG$$"; if (send_new_line) '\n'; return result; @@ -648,7 +650,7 @@ public U0 DocDm(U8 *buf,I64 cnt=0x80) //edited. { CDocEntry *doc_e; - CDoc *doc=DocCur; + CDoc *doc=DocPut; Bool unlock=DocLock(doc); doc_e=DocPrintF(doc,"$$HX-Z,%d,16$$",cnt); doc_e->data=buf; @@ -664,7 +666,7 @@ public U0 DocD(U8 *buf,I64 cnt=0x80) //edited. { CDocEntry *doc_e; - CDoc *doc=DocCur; + CDoc *doc=DocPut; Bool unlock=DocLock(doc); doc_e=DocPrintF(doc,"$$HX,%d,16$$",cnt); doc_e->data=buf; @@ -678,13 +680,13 @@ public U0 DocD(U8 *buf,I64 cnt=0x80) Bool AKDDocPutS(U8 *st) { CDoc *doc; - if (doc=DocCur) + if (doc=DocPut) DocPutSPartial(doc,st); return FALSE; } KeyDevAdd(&AKDDocPutKey,&AKDDocPutS,0x80000000,TRUE); fp_mgets=&DocMGetS; -fp_doc_cur=&DocCur; +fp_doc_put=&DocPut; #help_index "Doc" diff --git a/TempleOS/Adam/Doc/DocNew.CPP b/TempleOS/Adam/Doc/DocNew.CPP index 1748af6..be56d6f 100644 --- a/TempleOS/Adam/Doc/DocNew.CPP +++ b/TempleOS/Adam/Doc/DocNew.CPP @@ -40,18 +40,7 @@ U0 DocTablesInit() 1<shifted_x=0; s->shifted_y=0; - s->cur_text_attr=s->dft_text_attr=doc->start_text_attr=WHITE<<4+BLACK; - s->alt_text_attr =LTGRAY; - s->link_attr =RED; - s->macro_attr =LTBLUE; - s->anchor_attr =DKGRAY; - s->hidden_attr =DKGRAY; - s->tree_attr =PURPLE; - s->user_attr =GREEN; - s->bin_attr =CYAN; - s->keyword_attr =BLUE; - s->keyword2_attr =LTRED; - s->comment_attr =GREEN; - s->quote_attr =BROWN; + s->cur_text_attr=s->dft_text_attr=DOC_ATTR_DFT_TEXT; doc_e=&doc->root; doc_e->type=DOCT_ERROR; @@ -547,7 +524,6 @@ public U0 DocDel(CDoc *doc) if (!doc || doc->doc_signature!=DOC_SIGNATURE_VAL) return; DocLock(doc); doc->doc_signature=0; - doc->doc_in_que_signature=0; DocRst(doc,TRUE); Free(doc->find_replace); Free(doc->dollar_buf); @@ -683,7 +659,7 @@ U0 DocRemSoftNewLines(CDoc *doc=NULL,CDocEntry *doc_e=NULL) CDocEntry *doc_e2,*saved_ll=doc_e; Bool unlock; if (!doc) { - doc=DocCur; + doc=DocPut; if (!doc) return; } unlock=DocLock(doc); @@ -712,7 +688,7 @@ public I64 DocMax(I64 i=MAX_I32) //entries after a while. { I64 result; - CDoc *doc=DocCur; + CDoc *doc=DocPut; if (doc) { result=doc->max_entries; doc->max_entries=i; @@ -747,162 +723,116 @@ public CDoc *DocNew(CTask *task=NULL) sys_clipboard_doc=DocNew; #help_index "Doc/Task" -public U0 DocQueIns(CDoc *doc,CDoc *pred) -{ - CDoc *succ; - Bool *old_preempt; - if (!doc) return; - old_preempt=Preempt(OFF); - succ=pred->next_doc; - doc->last_doc=pred; - doc->next_doc=succ; - pred->next_doc=doc; - succ->last_doc=doc; - doc->doc_in_que_signature=DOC_IN_QUE_SIGNATURE_VAL; - Preempt(old_preempt); -} - -public U0 DocQueInsRev(CDoc *doc,CDoc *succ) -{ - CDoc *pred; - Bool *old_preempt; - if (!doc) return; - old_preempt=Preempt(OFF); - pred=succ->last_doc; - doc->last_doc=pred; - doc->next_doc=succ; - pred->next_doc=doc; - succ->last_doc=doc; - doc->doc_in_que_signature=DOC_IN_QUE_SIGNATURE_VAL; - Preempt(old_preempt); -} - -public U0 DocQueRem(CDoc *doc) -{ - CDoc *succ,*pred; - Bool *old_preempt; - if (!doc) return; - old_preempt=Preempt(OFF); - doc->doc_in_que_signature=0; - succ=doc->next_doc; - pred=doc->last_doc; - pred->next_doc=succ; - succ->last_doc=pred; - Preempt(old_preempt); -} - -public CDoc *DocCur(CTask *task=NULL) -{ +public CDoc *DocPut(CTask *task=NULL) +{//Current document that PUT goes to. + //Basically, StdOut unless double buffering. CDoc *result; if (!task) task=Fs; - result=task->last_doc; - if (result==(&task->next_doc)(U8 *)-offset(CDoc.next_doc) || - result->flags&DOCF_AUX_DOC || - result->doc_in_que_signature!=DOC_IN_QUE_SIGNATURE_VAL) - result=NULL; - return result; + if ((result=task->put_doc) && result->doc_signature==DOC_SIGNATURE_VAL) + return result; + else + return NULL; } -public CDoc *DocAux(CTask *task=NULL) -{ +public CDoc *DocDisplay(CTask *task=NULL) +{//StdOut unless double buffering. CDoc *result; if (!task) task=Fs; - result=task->next_doc; - if (result==(&task->next_doc)(U8 *)-offset(CDoc.next_doc) || - !(result->flags&DOCF_AUX_DOC) || - result->doc_in_que_signature!=DOC_IN_QUE_SIGNATURE_VAL) - result=NULL; - return result; + if ((result=task->display_doc) && result->doc_signature==DOC_SIGNATURE_VAL) + return result; + else + return NULL; +} + +public CDoc *DocBorder(CTask *task=NULL) +{//Doc holding border of window text. + CDoc *result; + if (!task) task=Fs; + if ((result=task->border_doc) && result->doc_signature==DOC_SIGNATURE_VAL) + return result; + else + return NULL; } public CDoc *DocDblBufStart(CTask *task=NULL) { //See $LK-A,"::/TempleOS/Demo/Spy.CPP"$ - CDoc *doc,*doc2; - Bool unlock_doc2,old_preempt=Preempt(OFF); - if (!task) task=Fs; - doc2=task->last_doc; - unlock_doc2=DocLock(doc2); //dont want change during winupdate, so lock DocCur$WW,0$ - doc=DocNew(task); - doc->win_task =doc2->win_task; - doc->start_text_attr=doc2->start_text_attr; - doc->max_entries=doc2->max_entries; - MemCpy(doc->find_replace,doc2->find_replace,sizeof(CEdFindText)); - doc->start_x =doc2->start_x; - doc->start_y =doc2->start_y; - MemCpy(&doc->filename,&doc2->filename,sizeof(CEdFileName)); - doc->left_click_link =doc2->left_click_link; - doc->right_click_link=doc2->right_click_link; - doc->user_put_data=doc2->user_put_data; - doc->user_put_key =doc2->user_put_key; - doc->user_put_s =doc2->user_put_s; - doc->parent_doc =doc2->parent_doc; - doc->desc[0](I64)=doc2->desc[0](I64); - doc->user_data =doc2->user_data; - doc->flags|=doc2->flags&DOCG_DBL_BUF_FLAGS | DOCF_DONT_SHOW; - DocQueIns(doc,task->last_doc); - if (unlock_doc2) - DocUnlock(doc2); + Bool unlock_ddoc,old_preempt=Preempt(OFF); + CDoc *pdoc=DocPut(task),*ddoc=DocDisplay(task),*result; + if (!pdoc || !ddoc || pdoc!=ddoc) + result=NULL; //Already Double buffering + else { + if (!task) task=Fs; + unlock_ddoc=DocLock(ddoc); //dont want change during winupdate, so lock DocPut$WW,0$ + result=DocNew(task); + result->win_task =ddoc->win_task; + result->max_entries =ddoc->max_entries; + MemCpy(result->find_replace,ddoc->find_replace,sizeof(CEdFindText)); + result->start_x =ddoc->start_x; + result->start_y =ddoc->start_y; + MemCpy(&result->filename,&ddoc->filename,sizeof(CEdFileName)); + result->left_click_link =ddoc->left_click_link; + result->right_click_link =ddoc->right_click_link; + result->user_put_data =ddoc->user_put_data; + result->user_put_key =ddoc->user_put_key; + result->user_put_s =ddoc->user_put_s; + result->parent_doc =ddoc->parent_doc; + result->desc[0](I64) =ddoc->desc[0](I64); + result->user_data =ddoc->user_data; + result->flags|=ddoc->flags&DOCG_DBL_BUF_FLAGS | DOCF_DONT_SHOW; + task->put_doc=result; + if (unlock_ddoc) + DocUnlock(ddoc); + } Preempt(old_preempt); - return doc; + return result; } public Bool DocDblBufEnd(CTask *task=NULL) { //See $LK-A,"::/TempleOS/Demo/Spy.CPP"$ - Bool okay=FALSE,old_preempt=Preempt(OFF); - CDoc *doc1,*doc2; - if (!task) task=Fs; - if (doc1=DocCur(task)) { - doc2=doc1->last_doc; - if (doc2!=(&task->next_doc)(U8 *)-offset(CDoc.next_doc) && - !(doc2->flags&DOCF_AUX_DOC) && - doc2->doc_in_que_signature==DOC_IN_QUE_SIGNATURE_VAL) { - doc2->flags|=DOCF_DONT_SHOW; - doc1->flags&=~DOCF_DONT_SHOW; - DocLock(doc2); - DocQueRem(doc2); - DocUnlock(doc2); - DocDel(doc2); - okay=TRUE; - } + Bool result=FALSE,old_preempt=Preempt(OFF); + CDoc *pdoc=DocPut(task),*ddoc=DocDisplay(task); + if (pdoc && ddoc && pdoc!=ddoc) {//Double buffering? + if (!task) task=Fs; + ddoc->flags|=DOCF_DONT_SHOW; + pdoc->flags&=~DOCF_DONT_SHOW; + DocLock(ddoc); + task->display_doc=pdoc; + DocUnlock(ddoc); + DocDel(ddoc); + result=TRUE; } Preempt(old_preempt); - return okay; + return result; } public Bool DocDblBufSwap(CTask *task=NULL) { //See $LK-A,"::/TempleOS/Demo/Spy.CPP"$ - Bool okay=FALSE,old_preempt=Preempt(OFF); - CDoc *doc1,*doc2; - if (!task) task=Fs; - if (doc1=DocCur(task)) { - doc2=doc1->last_doc; - if (doc2!=(&task->next_doc)(U8 *)-offset(CDoc.next_doc) && - !(doc2->flags&DOCF_AUX_DOC) && - doc2->doc_in_que_signature==DOC_IN_QUE_SIGNATURE_VAL) { - doc2->flags|=DOCF_DONT_SHOW; - doc1->flags&=~DOCF_DONT_SHOW; - DocLock(doc2); - DocQueRem(doc2); - DocUnlock(doc2); - DocRst(doc2,TRUE); - MemCpy(doc2->find_replace,doc1->find_replace,sizeof(CEdFindText)); - MemCpy(&doc2->filename,&doc1->filename,sizeof(CEdFileName)); - doc2->start_text_attr=doc1->start_text_attr; - doc2->max_entries =doc1->max_entries; - doc2->flags =doc1->flags&DOCG_DBL_BUF_FLAGS | doc2->flags&~DOCG_DBL_BUF_FLAGS; - doc2->left_click_link =doc1->left_click_link; - doc2->right_click_link=doc1->right_click_link; - doc2->user_put_data=doc1->user_put_data; - doc2->user_put_key =doc1->user_put_key; - doc2->user_put_s =doc1->user_put_s; - doc2->desc[0](I64)=doc1->desc[0](I64); - doc2->user_data =doc1->user_data; - DocQueIns(doc2,task->last_doc); - okay=TRUE; - } + Bool result=FALSE,old_preempt=Preempt(OFF); + CDoc *pdoc=DocPut(task),*ddoc=DocDisplay(task); + if (pdoc && ddoc && pdoc!=ddoc) {//Double buffering? + if (!task) task=Fs; + ddoc->flags|=DOCF_DONT_SHOW; + pdoc->flags&=~DOCF_DONT_SHOW; + DocLock(ddoc); + task->display_doc=pdoc; + DocUnlock(ddoc); + DocRst(ddoc,TRUE); + MemCpy(ddoc->find_replace,pdoc->find_replace,sizeof(CEdFindText)); + MemCpy(&ddoc->filename,&pdoc->filename,sizeof(CEdFileName)); + ddoc->max_entries =pdoc->max_entries; + ddoc->flags =pdoc->flags&DOCG_DBL_BUF_FLAGS | ddoc->flags&~DOCG_DBL_BUF_FLAGS; + ddoc->left_click_link =pdoc->left_click_link; + ddoc->right_click_link =pdoc->right_click_link; + ddoc->user_put_data =pdoc->user_put_data; + ddoc->user_put_key =pdoc->user_put_key; + ddoc->user_put_s =pdoc->user_put_s; + ddoc->desc[0](I64) =pdoc->desc[0](I64); + ddoc->user_data =pdoc->user_data; + task->put_doc=ddoc; + result=TRUE; } Preempt(old_preempt); - return okay; + return result; } #help_index "Doc" diff --git a/TempleOS/Adam/Doc/DocOpt.CPP b/TempleOS/Adam/Doc/DocOpt.CPP index 81c3dd5..aad8139 100644 --- a/TempleOS/Adam/Doc/DocOpt.CPP +++ b/TempleOS/Adam/Doc/DocOpt.CPP @@ -4,6 +4,7 @@ I64 DocOptEntry(CDoc *,CDocEntry *doc_e) { U8 *st,*st2,**dst; I64 i,result=0; + if (doc_e->flags1&DOCEF1_LINK) { if (doc_e->flags1 & DOCEF1_AUX_STR && Bt(doc_tag_types,doc_e->type_u8) && diff --git a/TempleOS/Adam/Doc/DocPlain.CPP b/TempleOS/Adam/Doc/DocPlain.CPP index afaddf4..422617f 100644 --- a/TempleOS/Adam/Doc/DocPlain.CPP +++ b/TempleOS/Adam/Doc/DocPlain.CPP @@ -80,40 +80,7 @@ DOCEF1_DATA_IS_PTR | DOCEF1_HAS_TERMINATOR | DOCEF1_AUX_STR | DOCEF1_U64, //DOCT_DFT_BACKGROUND 0, -//DOCT_ALT_FOREGROUND -0, - -//DOCT_LINK_FOREGROUND -0, - -//DOCT_MACRO_FOREGROUND -0, - -//DOCT_ANCHOR_FOREGROUND -0, - -//DOCT_HIDDEN_FOREGROUND -0, - -//DOCT_TREE_FOREGROUND -0, - -//DOCT_USER_FOREGROUND -0, - -//DOCT_BINARY_FOREGROUND -0, - -//DOCT_KEYWORD_FOREGROUND -0, - -//DOCT_KEYWORD2_FOREGROUND -0, - -//DOCT_COMMENT_FOREGROUND -0, - -//DOCT_QUOTE_FOREGROUND +//DOCT_PMT 0, //DOCT_WORD_WRAP @@ -261,40 +228,7 @@ I64 doc_dft_flags2[DOCT_NUM_TYPES]={ //DOCT_DFT_BACKGROUND 0, -//DOCT_ALT_FOREGROUND -0, - -//DOCT_LINK_FOREGROUND -0, - -//DOCT_MACRO_FOREGROUND -0, - -//DOCT_ANCHOR_FOREGROUND -0, - -//DOCT_HIDDEN_FOREGROUND -0, - -//DOCT_TREE_FOREGROUND -0, - -//DOCT_USER_FOREGROUND -0, - -//DOCT_BINARY_FOREGROUND -0, - -//DOCT_KEYWORD_FOREGROUND -0, - -//DOCT_KEYWORD2_FOREGROUND -0, - -//DOCT_COMMENT_FOREGROUND -0, - -//DOCT_QUOTE_FOREGROUND +//DOCT_PMT 0, //DOCT_WORD_WRAP @@ -442,40 +376,7 @@ I64 doc_dft_type_flags[DOCT_NUM_TYPES]={ //DOCT_DFT_BACKGROUND 0, -//DOCT_ALT_FOREGROUND -0, - -//DOCT_LINK_FOREGROUND -0, - -//DOCT_MACRO_FOREGROUND -0, - -//DOCT_ANCHOR_FOREGROUND -0, - -//DOCT_HIDDEN_FOREGROUND -0, - -//DOCT_TREE_FOREGROUND -0, - -//DOCT_USER_FOREGROUND -0, - -//DOCT_BINARY_FOREGROUND -0, - -//DOCT_KEYWORD_FOREGROUND -0, - -//DOCT_KEYWORD2_FOREGROUND -0, - -//DOCT_COMMENT_FOREGROUND -0, - -//DOCT_QUOTE_FOREGROUND +//DOCT_PMT 0, //DOCT_WORD_WRAP @@ -703,18 +604,6 @@ U8 *Doc2PlainText(CDoc *doc,CDocEntry *doc_e) case DOCT_BACKGROUND: case DOCT_DFT_FOREGROUND: case DOCT_DFT_BACKGROUND: - case DOCT_ALT_FOREGROUND: - case DOCT_LINK_FOREGROUND: - case DOCT_MACRO_FOREGROUND: - case DOCT_ANCHOR_FOREGROUND: - case DOCT_HIDDEN_FOREGROUND: - case DOCT_TREE_FOREGROUND: - case DOCT_USER_FOREGROUND: - case DOCT_BINARY_FOREGROUND: - case DOCT_KEYWORD_FOREGROUND: - case DOCT_KEYWORD2_FOREGROUND: - case DOCT_COMMENT_FOREGROUND: - case DOCT_QUOTE_FOREGROUND: case DOCT_WORD_WRAP: case DOCT_HIGHLIGHT: case DOCT_LOCK_TO_PAGE: @@ -907,18 +796,6 @@ CDocEntry *PrsDollarCmd(CDoc *doc,U8 *st) case DOCT_BACKGROUND: case DOCT_DFT_FOREGROUND: case DOCT_DFT_BACKGROUND: - case DOCT_ALT_FOREGROUND: - case DOCT_LINK_FOREGROUND: - case DOCT_MACRO_FOREGROUND: - case DOCT_ANCHOR_FOREGROUND: - case DOCT_HIDDEN_FOREGROUND: - case DOCT_TREE_FOREGROUND: - case DOCT_USER_FOREGROUND: - case DOCT_BINARY_FOREGROUND: - case DOCT_KEYWORD_FOREGROUND: - case DOCT_KEYWORD2_FOREGROUND: - case DOCT_COMMENT_FOREGROUND: - case DOCT_QUOTE_FOREGROUND: case DOCT_WORD_WRAP: case DOCT_HIGHLIGHT: case DOCT_LOCK_TO_PAGE: @@ -1077,7 +954,7 @@ public U0 DocIns(CDoc *doc,CDocEntry *doc_e) !(doc_ce->flags1&(DOCEF1_TAG_CB|DOCEF1_DEFINE|DOCEF1_HTML_LINK)) && !(doc_ce->flags2&DOCEF2_BIN_PTR_LINK) && doc->cur_data_colmax_col) { - doc_ne=CAlloc(sizeof(CDocEntryBase)+sizeof(U8 *),doc->mem_task); + doc_ne=CAlloc(sizeof(CDocEntryBase),doc->mem_task); doc_ne->type=DOCT_TEXT|doc_ce->type&0xFFFFFF00; doc_ne->x=doc_ce->x; doc_ne->y=doc_ce->y; @@ -1116,7 +993,7 @@ public CDocEntry *DocPutS(CDoc *doc,U8 *st) Bool unlock; I64 j; CDocEntry *doc_e=NULL,*result=NULL,*doc_ce; - if (!st || !doc || doc->doc_signature!=DOC_SIGNATURE_VAL) + if (!st || !doc && !(doc=DocPut) || doc->doc_signature!=DOC_SIGNATURE_VAL) return NULL; unlock=DocLock(doc); if (doc->flags & DOCF_PLAIN_TEXT_WITH_TABS) @@ -1134,7 +1011,7 @@ public CDocEntry *DocPutS(CDoc *doc,U8 *st) ptr--; if (!ch) { if (j=ptr-ptr2) { - doc_e=CAlloc(sizeof(CDocEntryBase)+sizeof(U8 *),doc->mem_task); + doc_e=CAlloc(sizeof(CDocEntryBase),doc->mem_task); doc_e->type=DOCT_TEXT | doc->settings_root.dft_text_attr << 8; if (doc->flags & DOCF_NO_CURSOR) { src=MAlloc(j+1); @@ -1153,7 +1030,7 @@ public CDocEntry *DocPutS(CDoc *doc,U8 *st) } else { if (j=ptr-ptr2) { *ptr=0; - doc_e=CAlloc(sizeof(CDocEntryBase)+sizeof(U8 *),doc->mem_task); + doc_e=CAlloc(sizeof(CDocEntryBase),doc->mem_task); doc_e->type=DOCT_TEXT | doc->settings_root.dft_text_attr << 8; if (doc->flags & DOCF_NO_CURSOR) { src=MAlloc(j+1); @@ -1210,7 +1087,7 @@ public CDocEntry *DocPutS(CDoc *doc,U8 *st) ptr2++; } if (ptr==ptr2) { - doc_e=CAlloc(sizeof(CDocEntryBase)+sizeof(U8 *),doc->mem_task); + doc_e=CAlloc(sizeof(CDocEntryBase),doc->mem_task); doc_e->type=DOCT_TEXT | doc->settings_root.dft_text_attr << 8; doc_e->max_col=1; if (doc->flags & DOCF_DBL_DOLLARS) @@ -1248,12 +1125,12 @@ public CDocEntry *DocPutS(CDoc *doc,U8 *st) doc_e=CAlloc(sizeof(CDocEntryBase),doc->mem_task); doc_e->type=DOCT_NEW_LINE | doc->settings_root.dft_text_attr << 8; DocIns(doc,doc_e); - if (ch==CH_CARRIAGE_RETURN) - while (*ptr==CH_CARRIAGE_RETURN) + if (ch=='\r') + while (*ptr=='\r') ptr++; if (*ptr=='\n') ptr++; - while (*ptr==CH_CARRIAGE_RETURN) + while (*ptr=='\r') ptr++; } } diff --git a/TempleOS/Adam/Doc/DocPopUp.CPP b/TempleOS/Adam/Doc/DocPopUp.CPP index e032797..5011596 100644 --- a/TempleOS/Adam/Doc/DocPopUp.CPP +++ b/TempleOS/Adam/Doc/DocPopUp.CPP @@ -5,27 +5,26 @@ public I64 DocEntryRun(CDoc *doc,CDocEntry *doc_e,Bool exited) DocLock(doc); if (!exited) { if (doc_e->flags1 & DOCEF1_ESC) { - Msg(MSG_KEY_DOWN,CH_ESC,0,1<flags1 & DOCEF1_QUIT) { - Msg(MSG_KEY_DOWN,CH_SHIFT_ESC,0,1<flags1 & DOCEF1_CHECK_COLLAPSABLE) doc_e->flags1^=DOCEF1_CHECKED_COLLAPSED; } - doc->best_d=MAX_I64; try { if (ch==CH_SPACE) { if (doc_e->flags1 & DOCEF1_LINK && doc->left_click_link) result=(*doc->left_click_link)(doc,doc_e); if (doc_e->flags1 & DOCEF1_LEFT_EXP) { result=doc_e->left_exp; - Msg(MSG_CMD,result,0,1<flags1 & DOCEF1_LEFT_CB && doc_e->left_cb) { DocUnlock(doc); result=(*doc_e->left_cb)(doc,doc_e); - Msg(MSG_CMD,result,0,1<flags1 & DOCEF1_LEFT_MACRO) { if (doc_e->flags1 & DOCEF1_POPUP) { @@ -45,12 +44,12 @@ public I64 DocEntryRun(CDoc *doc,CDocEntry *doc_e,Bool exited) result=(*doc->right_click_link)(doc,doc_e); if (doc_e->flags1 & DOCEF1_RIGHT_EXP) { result=doc_e->right_exp; - Msg(MSG_CMD,result,0,1<flags1 & DOCEF1_RIGHT_CB && doc_e->right_cb) { DocUnlock(doc); result=(*doc_e->right_cb)(doc,doc_e); - Msg(MSG_CMD,result,0,1<flags1 & DOCEF1_RIGHT_MACRO) { if (doc_e->flags1 & DOCEF1_POPUP) { @@ -77,7 +76,10 @@ U8 *EdOverStrikeCB(CDoc *,CDocEntry *doc_e,CTask *mem_task) { CDoc *doc=doc_e->user_data; U8 *st=MAlloc(8,mem_task); - *st=doc->flags & DOCF_OVERSTRIKE ? 'O':'Ä'; + if (doc->flags & DOCF_OVERSTRIKE) + *st='O'; + else + *st='Ä'; st[1]=0; return st; } @@ -86,7 +88,10 @@ U8 *EdFilterCB(CDoc *,CDocEntry *doc_e,CTask *mem_task) { CDoc *doc=doc_e->user_data; U8 *st=MAlloc(8,mem_task); - *st=doc->find_replace->filter_lines ? 'F':'Ä'; + if (doc->find_replace->filter_lines) + *st='F'; + else + *st='Ä'; st[1]=0; return st; } @@ -95,7 +100,10 @@ U8 *EdDollarCB(CDoc *,CDocEntry *doc_e,CTask *mem_task) { CDoc *doc=doc_e->user_data; U8 *st=MAlloc(8,mem_task); - *st=doc->flags & DOCF_IN_DOLLAR ? '$$':'Ä'; + if (doc->flags & DOCF_IN_DOLLAR) + *st='$$'; + else + *st='Ä'; st[1]=0; return st; } @@ -115,7 +123,10 @@ U8 *EdQuotesCB(CDoc *,CDocEntry *,CTask *mem_task) { CLex *lx=mem_task->last_lex; U8 *st=MAlloc(8,mem_task); - *st=lx->flags & LF_IN_QUOTES ? '"':'Ä'; + if (lx->flags & LF_IN_QUOTES) + *st='"'; + else + *st='Ä'; st[1]=0; return st; } @@ -124,7 +135,10 @@ U8 *EdBracesCB(CDoc *,CDocEntry *,CTask *mem_task) { CLex *lx=mem_task->last_lex; U8 *st=MAlloc(8,mem_task); - *st=lx->braces_cnt ? '}':'Ä'; + if (lx->braces_cnt) + *st='}'; + else + *st='Ä'; st[1]=0; return st; } @@ -133,7 +147,10 @@ U8 *EdSemicolonCB(CDoc *,CDocEntry *,CTask *mem_task) { CLex *lx=mem_task->last_lex; U8 *st=MAlloc(8,mem_task); - *st=lx->statement_cnt ? ';':'Ä'; + if (lx->statement_cnt) + *st=';'; + else + *st='Ä'; st[1]=0; return st; } @@ -157,12 +174,12 @@ public I64 DocGetKey(I64 *_sc=NULL) Bool cont,old_preempt=IsPreempt; do { ch=GetKey(&sc,TRUE); - DocRecalc(DocCur); + DocRecalc(DocPut); cont=FALSE; if (ch==CH_ESC || ch==CH_SHIFT_ESC) { //Check for exit filter mode Preempt(OFF); - if (DocCur && DocCur->find_replace->filter_lines) { - EdUndoFilter(DocCur); + if (DocPut && DocPut->find_replace->filter_lines) { + EdUndoFilter(DocPut); cont=TRUE; } Preempt(old_preempt); @@ -184,72 +201,78 @@ public Bool View() #help_index "Doc" public Bool DocDo(CDoc *doc,I64 doc_flags=0) { - CDoc *old_doc=DocCur,*old_aux_doc=DocAux,*aux; + CDoc *old_put_doc =DocPut, + *old_display_doc=DocDisplay, + *old_border_doc =DocBorder,*bdoc; CDocEntry *doc_e; I64 old_attr=Fs->text_attr, old_top =Fs->win_top, old_bottom=Fs->win_bottom, - old_left=Fs->win_left,old_right =Fs->win_right; + old_left=Fs->win_left,old_right =Fs->win_right, + old_title_src=Fs->title_src; Bool result,unlock,old_preempt; - + U8 *old_task_title; if (doc_flags&DOF_WIN_MAX) WinMax; unlock=DocLock(doc); doc->win_task=Fs; - aux=DocNew; - aux->flags|=DOCF_AUX_DOC; - aux->settings_root.dft_text_attr=Fs->border_attr; - DocPutS(aux,"$$CM+TY+LX+NC,0,-1$$"); + bdoc=DocNew; + bdoc->flags|=DOCF_BORDER_DOC; + DocPutS(bdoc,"$$CM+TY+LX+NC,0,-1$$"); if (Bt(&Fs->display_flags,DISPLAYf_HAS_CLOSE_WIN)) - DocPutS(aux,"$$TX+RX+BD,\"[X]\"$$"); - DocPutS(aux,"$$BK,1$$$$TX+LX+BD,\"MENU\"$$$$BK,0$$"); + DocPutS(bdoc,"$$TX+RX+BD,\"[X]\"$$"); + DocPutS(bdoc,"$$BK,1$$$$TX+LX+BD,\"MENU\"$$$$BK,0$$"); - doc_e=DocPutS(aux,"$$DA-T-P+BD+RD+CX+SCX+IV,256,\"%s...\",16$$"); - doc_e->data=&doc->filename.name; + old_task_title=StrNew(Fs->task_title); + if (Fs->title_src!=TTS_LOCKED_CONST) { + Fs->title_src=TTS_ED_FILENAME; + MemCpy(Fs->task_title,doc->filename.name,TASK_TITLE_LEN); + } + doc_e=DocPutS(bdoc,"$$DA-T-P+BD+RD+CX+SCX+IV,140,\"%s...\",16$$"); + doc_e->data=&Fs->task_title; DocDataFmt(doc_e); if (doc->flags & DOCF_ALLOW_UNDO) { - DocPutS(aux,"$$CM+BY+LX+NC,1,1$$"); - doc_e=DocPutS(aux,"$$DA+BD+RD-T,32,\"Undo:%03d\"$$\n"); + DocPutS(bdoc,"$$CM+BY+LX+NC,1,1$$"); + doc_e=DocPutS(bdoc,"$$DA+BD+RD-T,32,\"Undo:%03d\"$$\n"); doc_e->data=&doc->undo_cnt; DocDataFmt(doc_e); } - DocPutS(aux,"$$CM+BY+RX+NC,-30,1$$"); - doc_e=DocPutS(aux,"$$TX+BD+TC,\" \"$$"); + DocPutS(bdoc,"$$CM+BY+RX+NC,-30,1$$"); + doc_e=DocPutS(bdoc,"$$TX+BD+TC,\" \"$$"); doc_e->user_data=doc; doc_e->tag_cb=&EdMoreCB; - doc_e=DocPutS(aux,"$$TX+BD+TC,\" \"$$"); + doc_e=DocPutS(bdoc,"$$TX+BD+TC,\" \"$$"); doc_e->user_data=doc; doc_e->tag_cb=&EdDollarTypeCB; - doc_e=DocPutS(aux,"$$TX+BD+TC,\" \"$$"); + doc_e=DocPutS(bdoc,"$$TX+BD+TC,\" \"$$"); doc_e->user_data=doc; doc_e->tag_cb=&EdFilterCB; - doc_e=DocPutS(aux,"$$TX+BD+TC,\" \"$$"); + doc_e=DocPutS(bdoc,"$$TX+BD+TC,\" \"$$"); doc_e->user_data=doc; doc_e->tag_cb=&EdOverStrikeCB; - doc_e=DocPutS(aux,"$$TX+BD+TC,\" \"$$"); + doc_e=DocPutS(bdoc,"$$TX+BD+TC,\" \"$$"); doc_e->user_data=doc; doc_e->tag_cb=&EdDollarCB; - doc_e=DocPutS(aux,"$$DA+BD+RD-T,32,\"Line:%04d \"$$"); + doc_e=DocPutS(bdoc,"$$DA+BD+RD-T,32,\"Line:%04d \"$$"); doc_e->data=&doc->line; DocDataFmt(doc_e); - doc_e=DocPutS(aux,"$$DA+BD+RD-T,32,\"Col:%04d\"$$\n"); + doc_e=DocPutS(bdoc,"$$DA+BD+RD-T,32,\"Col:%04d\"$$\n"); doc_e->data=&doc->col; DocDataFmt(doc_e); - DocRecalc(aux); + DocRecalc(bdoc); DocRecalc(doc); if (!(doc_flags&DOF_DONT_HOME)) DocHome(doc); old_preempt=Preempt(OFF); - DocQueRem(old_aux_doc); - DocQueInsRev(aux,Fs->next_doc); - if (doc!=old_doc) - doc->parent_doc=old_doc; - DocQueRem(old_doc); - DocQueIns(doc,Fs->last_doc); - Fs->text_attr=doc->settings_root.dft_text_attr; + Fs->border_doc=bdoc; + if (doc!=old_display_doc) + doc->parent_doc=old_display_doc; + Fs->put_doc=Fs->display_doc=doc; + if (!(doc_flags&DOF_DONT_TEXT_ATTR)) + Fs->text_attr=DOC_ATTR_DFT_TEXT; LBts(&Fs->display_flags,DISPLAYf_SHOW); WinZBufUpdate; if (doc_flags&DOF_MIN_SIZE) @@ -274,13 +297,16 @@ public Bool DocDo(CDoc *doc,I64 doc_flags=0) } if (unlock) DocUnlock(doc); - - DocQueRem(aux); - DocQueInsRev(old_aux_doc,Fs->next_doc); - DocDel(aux); - DocQueRem(doc); - DocQueIns(old_doc,Fs->last_doc); - Fs->text_attr=old_attr; + Fs->border_doc =old_border_doc; + Fs->display_doc=old_display_doc; + Fs->put_doc =old_put_doc; + Fs->text_attr =old_attr; + if (Fs->title_src!=TTS_LOCKED_CONST) { + Fs->title_src =old_title_src; + StrCpy(Fs->task_title,old_task_title); + } + Free(old_task_title); + DocDel(bdoc); if (doc_flags&DOF_MIN_SIZE) { SetWinHorz(old_left,old_right); SetWinVert(old_top,old_bottom); @@ -302,6 +328,7 @@ public Bool DocFormDo(U8 *D,U8 *class_name, CHashClass *tempc; CDoc *doc; Bool result=FALSE; + I64 old_border_src=Fs->border_src; if (!(tempc=HashFind(class_name,Fs->hash_table,HTT_CLASS))) return FALSE; doc=DocNew; @@ -322,7 +349,7 @@ public Bool DocFormDo(U8 *D,U8 *class_name, } if (footer) DocPutS(doc,footer); if (doc->root.next!=doc) { - doc->flags&=~(DOCF_ATTR_BY_PRT | DOCF_ATTR_BY_FILENAME); + Fs->border_src=BDS_CONST; DocRecalc(doc); if (DocDo(doc,doc_flags)) { doc_e=doc->cur_entry; @@ -334,6 +361,7 @@ public Bool DocFormDo(U8 *D,U8 *class_name, } } DocDel(doc); + Fs->border_src=old_border_src; return result; } @@ -348,12 +376,12 @@ public I64 DocMenuDo(CDoc *m,I64 doc_flags=0) U8 *old_end_cb=Fs->task_end_cb; Bool old_break_shift_esc=LBts(&Fs->task_flags,TASKf_BREAK_TO_SHIFT_ESC); CDocEntry *doc_e; - I64 old_doc_flags=m->flags,result=DOCM_CANCEL; + I64 old_border_src=Fs->border_src,result=DOCM_CANCEL; Fs->task_end_cb=&DocMenuDoEndTaskCB; try { if (m) { StrCpy(m->desc,"Menu"); - m->flags&=~(DOCF_ATTR_BY_PRT | DOCF_ATTR_BY_FILENAME); + Fs->border_src=BDS_CONST; if (DocDo(m,doc_flags)) { doc_e=m->cur_entry; if (doc_e!=m) { @@ -369,8 +397,8 @@ public I64 DocMenuDo(CDoc *m,I64 doc_flags=0) Fs->catch_except=TRUE; } } - m->flags|=old_doc_flags&(DOCF_ATTR_BY_PRT | DOCF_ATTR_BY_FILENAME); LBEqu(&Fs->task_flags,TASKf_BREAK_TO_SHIFT_ESC,old_break_shift_esc); + Fs->border_src=old_border_src; Fs->task_end_cb=old_end_cb; return result; } @@ -378,21 +406,20 @@ public I64 DocMenuDo(CDoc *m,I64 doc_flags=0) #help_index "Doc" public I64 PopUp(U8 *msg,CTask *parent=NULL,CTask **_pu_task=NULL) { - I64 result=0; + I64 result; + CSrvCmd *tempc; Bool old_preempt=Preempt(OFF); - CTaskCmd *tempc; - CTask *task=Spawn(&ServantUserCmdLine,NULL,"System",parent); + CTask *task=Spawn(&SrvUserCmdLine,NULL,"System",,parent); if (!parent) { - TaskRqstQue(task,parent,msg,1<popup_task=task; - tempc=TaskRqstQue(task,parent,msg, - 1<popup_task=NULL; Kill(task); if (_pu_task) *_pu_task=NULL; @@ -405,8 +432,8 @@ public I64 PopUp(U8 *msg,CTask *parent=NULL,CTask **_pu_task=NULL) public CTask *PopUpViewDoc(CDoc *doc,I64 doc_flags=0) { U8 *buf=MSPrintF("if (!IsSysDeterministic) Preempt(ON);DocDo(0x%X,0x%X);",doc,doc_flags); - CTask *task=Spawn(&ServantUserCmdLine,NULL,"View",Fs); - TaskRqstQue(task,NULL,buf,1<flags|=DOCF_MIN_SIZE | DOCF_FORM; - return ServantUser("DocMenuDo(0x%X,0x%X);",doc,doc_flags); + return SrvUser("DocMenuDo(0x%X,0x%X);",doc,doc_flags); } public Bool PopUpForm(U8 *D,U8 *class_name,I64 doc_flags=DOF_MIN_SIZE, U8 *header=NULL,U8 *footer=NULL) { - return ServantUser("DocFormDo(0x%X,0x%X,0x%X,0x%X,0x%X);",D,class_name, + return SrvUser("DocFormDo(0x%X,0x%X,0x%X,0x%X,0x%X);",D,class_name, doc_flags,header,footer); } @@ -495,7 +522,7 @@ public U8 *PopUpFileName(U8 *dft=NULL,I64 doc_flags=0) } #help_index "Doc" -public Bool PopUpCd() +Bool PopUpCd() { Bool result; U8 *st=PopUpPickDir; @@ -512,6 +539,7 @@ public U8 *PopUpPickLstEntry(U8 *lst) { I64 i=0; CDoc *doc=DocNew; + DocPutS(doc,"$$FG,LTBLUE$$"); while (*lst) { if (*lst=='@') { //Check for '@' alias lst entry i--; @@ -623,6 +651,7 @@ public I64 PopUpRangeI64(I64 lo,I64 hi,I64 step=1,U8 *header=NULL,U8 *footer=NUL CDoc *doc=DocNew; if (header) DocPutS(doc,header); + DocPutS(doc,"$$FG,LTBLUE$$"); for (i=lo;i<=hi;i+=step) DocPrintF(doc,"$$MU,\"%d\",%d$$\n",i,i); if (footer) @@ -641,6 +670,7 @@ public F64 PopUpRangeF64(F64 lo,F64 hi,F64 step, CDoc *doc=DocNew; if (header) DocPutS(doc,header); + DocPutS(doc,"$$FG,LTBLUE$$"); for (d=lo;d<=hi;d+=step) { SPrintF(buf,fmt,d); DocPrintF(doc,"$$MU,\"%s\",0x%X$$\n",buf,d); @@ -661,6 +691,7 @@ public F64 PopUpRangeF64Exp(F64 lo,F64 hi,F64 factor, CDoc *doc=DocNew; if (header) DocPutS(doc,header); + DocPutS(doc,"$$FG,LTBLUE$$"); for (d=lo;d<=hi;d*=factor) { SPrintF(buf,fmt,d); DocPrintF(doc,"$$MU,\"%s\",0x%X$$\n",buf,d); @@ -678,7 +709,7 @@ public F64 PopUpRangeF64Log(F64 lo,F64 hi,I64 steps, return PopUpRangeF64Exp(lo,hi,Exp(Ln(hi/lo)/(steps-1)),fmt,header,footer); } -#help_index "Task/Rqsts" +#help_index "Task/Requests" public I64 AdamFile(U8 *filename,Bool warn_ext=TRUE) { Bool okay=TRUE; @@ -725,8 +756,7 @@ public I64 PopUpColor(U8 *header=NULL,Bool allow_transparent=TRUE,Bool allow_dft if (header) DocPutS(doc,header); if (allow_transparent) - DocPutS(doc,"$$BG,WHITE$$$$MU,\"TRANSPARENT\",COLOR_TRANSPARENT$$$$BG$$\n"); - DocPutS(doc,"$$FM,BLACK$$"); + DocPutS(doc,"$$MU,\"TRANSPARENT\",COLOR_TRANSPARENT$$\n"); for (i=0;i<16;i++) DocPrintF(doc,"$$BG,%d$$$$MU,\"__%-8Z__\",%d$$$$BG$$\n",i,i,"ST_COLORS",i); if (allow_dft) @@ -736,18 +766,25 @@ public I64 PopUpColor(U8 *header=NULL,Bool allow_transparent=TRUE,Bool allow_dft return i; } -public I64 PopUpLightingColor(U8 *header=NULL) +public I64 PopUpColorLighting(U8 *header=NULL) { I64 i; CDoc *doc=DocNew; if (header) DocPutS(doc,header); - DocPutS(doc,"\n$$FM,BLACK$$Single-Sided Full-Range Double-Sided Full-Range\n"); + DocPutS(doc,"\nSingle-Sided means both sides same color." + "\nDouble-Sided means back side darker." + "\n" + "\nHalf-Range means 0 to [0,7]" + "\n [8,15]-8 to [8,15]" + "\nFull-Range means 0 to [0,7] to [0,7]+8" + "\n"); + DocPutS(doc,"\n$$FG,LTPURPLE$$Single-Sided Full-Range Double-Sided Full-Range\n$$FG,BLACK$$"); for (i=0;i<8;i++) { DocPrintF(doc,"$$BG,%d$$$$MU,\"__%-19Z__\",%d$$$$BG$$ ",i,i,"ST_COLORS",i); DocPrintF(doc,"$$BG,%d$$$$MU,\"__%-19Z__\",%d$$$$BG$$\n",i,i,"ST_COLORS",ROPF_TWO_SIDED+i); } - DocPutS(doc,"\nSingle-Sided Half-Range Double-Sided Half-Range\n"); + DocPutS(doc,"\n$$FG,LTPURPLE$$Single-Sided Half-Range Double-Sided Half-Range\n$$FG,BLACK$$"); for (i=0;i<16;i++) { DocPrintF(doc,"$$BG,%d$$$$MU,\"__%-19Z__\",%d$$$$BG$$ ",i,i,"ST_COLORS",ROPF_HALF_RANGE_COLOR+i); DocPrintF(doc,"$$BG,%d$$$$MU,\"__%-19Z__\",%d$$$$BG$$\n",i,i,"ST_COLORS",ROPF_TWO_SIDED+ROPF_HALF_RANGE_COLOR+i); @@ -806,7 +843,7 @@ Bool PopUpTransform(I64 *r) U0 DrawIt(CTask *task,CDC *dc) { I64 i,j,i1,j1; - CDoc *doc=DocCur(task); + CDoc *doc=DocPut(task); for (j=0;j<17;j++) for (i=0;i<17;i++) { if (j<16) @@ -831,8 +868,8 @@ I64 DitherColorDo(U8 *header=NULL) I64 msg_code,p1,p2,result=-1,i,j; DocClear; "" header; - DocRecalc(DocCur); - NamedFramePtrAdd("DitherDoFrame",(DocCur->max_y+1)*FONT_HEIGHT); + DocRecalc(DocPut); + NamedFramePtrAdd("DitherDoFrame",(DocPut->max_y+1)*FONT_HEIGHT); SettingsPush; //See $LK,"SettingsPush","MN:SettingsPush"$ Fs->draw_it=&DrawIt; do { @@ -857,7 +894,7 @@ dcd_done: return result; } -public I64 PopUpDitherColor(U8 *header=NULL) +public I64 PopUpColorDither(U8 *header=NULL) { U8 buf[136]; SPrintF(buf,"DitherColorDo(0x%X);",header); diff --git a/TempleOS/Adam/Doc/DocRecalc.CPP b/TempleOS/Adam/Doc/DocRecalc.CPP index 8ef4ba9..6a2ee0e 100644 --- a/TempleOS/Adam/Doc/DocRecalc.CPP +++ b/TempleOS/Adam/Doc/DocRecalc.CPP @@ -24,14 +24,14 @@ public U0 DocCenter(CDoc *doc=NULL,I64 recalc=DOC_RECALC_ALL) Bool unlock; CTask *task; if (!doc) { - doc=DocCur; + doc=DocPut; if (!doc) return; } unlock=DocLock(doc); task=doc->win_task; DocRecalc(doc,FALSE,recalc); - if (!(doc->flags&DOCF_AUX_DOC)) + if (!(doc->flags&DOCF_BORDER_DOC)) doc->cur_top_line_num=doc->y-(task->win_height+1)>>1; LockToPage(doc); if (unlock) @@ -103,23 +103,23 @@ U0 DocBorderLstDraw(CDoc *doc) } U8 doc_spaces[9]= -{0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0}; +{CH_SPACE,CH_SPACE,CH_SPACE,CH_SPACE,CH_SPACE,CH_SPACE,CH_SPACE,CH_SPACE,0}; Bool DocRecalc(CDoc *doc,Bool has_cursor=FALSE,I64 recalc=DOC_RECALC_ALL) { I64 i,ii,j,k,x,x0,y,y0,D,d2,col,col2,best_col=0,best_d=MAX_I64,xx,yy,zz, - num_entries=0,ijif,cur_u8_attr,temp_u32_attr, - hide_collapsed[2], - cursor_y=MIN_I64,left_margin,right_margin, - y_plot_top,y_plot_bottom, - top,left,bottom,right,width,height,scroll_x,scroll_y, - pixel_top,pixel_left; + num_entries=0,ijif,cur_u8_attr,temp_u32_attr, + hide_collapsed[2], + cursor_y=MIN_I64,left_margin,right_margin, + y_plot_top,y_plot_bottom, + top,left,bottom,right,width,height,scroll_x,scroll_y, + pixel_top,pixel_left; CDocEntry reg *doc_e,reg *doc_e2,*best_do_e,*alias,*next_clear_found=NULL; CDocBin *tempb; CDocSettings *s; Bool del_cl,skipped_update,tree_collapsed, - resize=FALSE,same_win,more=FALSE,find_cursor=FALSE, - blink_flag,full_refresh=TRUE,unlock; + resize=FALSE,same_win,more=FALSE,find_cursor=FALSE, + blink_flag,full_refresh=TRUE,unlock; CTask *win_task,*mem_task; CDC *dc; U8 *bptr,*ptr,buf[136],ch; @@ -154,19 +154,19 @@ Bool DocRecalc(CDoc *doc,Bool has_cursor=FALSE,I64 recalc=DOC_RECALC_ALL) nobound_switch (recalc) { case DOC_RECALC_FIND_CURSOR: if (win_task) - dc=DCAlias(gr_dc,win_task); + dc=DCAlias(gr_dc2,win_task); find_cursor=TRUE; case DOC_RECALC_ALL: doc->recalc_start=doc; break; case DOC_RECALC_TO_SCREEN: if (doc->refresh_cnt++%(ToI64(win_actual_refresh/10)+1) && - !Bt(&doc->flags,DOCf_DO_FULL_REFRESH) && - !(doc->flags&DOCF_BACKWARD_MOVEMENT)) + !Bt(&doc->flags,DOCf_DO_FULL_REFRESH) && + !(doc->flags&DOCF_BACKWARD_MOVEMENT)) full_refresh=FALSE; doc->recalc_start=doc; if (win_task) - dc=DCAlias(gr_dc,win_task); + dc=DCAlias(gr_dc2,win_task); break; case DOC_RECALC_PARTIAL: DocRemSoftNewLines(doc,doc->recalc_start); @@ -188,14 +188,14 @@ Bool DocRecalc(CDoc *doc,Bool has_cursor=FALSE,I64 recalc=DOC_RECALC_ALL) left_margin=left; right_margin=right; PopFD; - if (doc->flags&DOCF_AUX_DOC) { + if (doc->flags&DOCF_BORDER_DOC) { scroll_x=0; scroll_y=0; } best_do_e=doc->cur_entry; if (!(doc->flags&(DOCF_PLAIN_TEXT|DOCF_PLAIN_TEXT_WITH_TABS)) && - FilesFindMatch(FILENAME_MASK_SRC,doc->filename.name)) + FilesFindMatch(FILENAME_MASK_SRC,doc->filename.name)) doc->flags|=DOCF_HIGHLIGHT; else doc->flags&=~DOCF_HIGHLIGHT; @@ -214,41 +214,44 @@ Bool DocRecalc(CDoc *doc,Bool has_cursor=FALSE,I64 recalc=DOC_RECALC_ALL) hss=&win_task->horz_scroll; vss=&win_task->vert_scroll; - if (doc->flags&DOCF_AUX_DOC) { + if (doc->flags&DOCF_BORDER_DOC) { doc->cur_top_line_num=0; doc->line_start_col=0; has_cursor=FALSE; - } else if (has_cursor && full_refresh) { - if (Bt(&hss->flags,WSSf_SET_TO_POS)||Bt(&vss->flags,WSSf_SET_TO_POS)) { - if (!(doc->flags&DOCF_NO_SCROLL_BARS)) { - if (Bt(&hss->flags,WSSf_SET_TO_POS)) { - doc->line_start_col=hss->pos; - LBtr(&hss->flags,WSSf_SET_TO_POS); - } - if (Bt(&vss->flags,WSSf_SET_TO_POS)) { - doc->cur_top_line_num=vss->pos; - LBtr(&vss->flags,WSSf_SET_TO_POS); + doc->settings_root.cur_text_attr=doc->settings_root.dft_text_attr=win_task->border_attr; + } else { + if (has_cursor && full_refresh) { + if (Bt(&hss->flags,WSSf_SET_TO_POS)||Bt(&vss->flags,WSSf_SET_TO_POS)) { + if (!(doc->flags&DOCF_NO_SCROLL_BARS)) { + if (Bt(&hss->flags,WSSf_SET_TO_POS)) { + doc->line_start_col=hss->pos; + LBtr(&hss->flags,WSSf_SET_TO_POS); + } + if (Bt(&vss->flags,WSSf_SET_TO_POS)) { + doc->cur_top_line_num=vss->pos; + LBtr(&vss->flags,WSSf_SET_TO_POS); + } } + doc->x=doc->line_start_col+width/2; + doc->y=doc->cur_top_line_num+height/2; + find_cursor=TRUE; + doc->recalc_start=doc; } - doc->x=doc->line_start_col+width/2; - doc->y=doc->cur_top_line_num+height/2; - find_cursor=TRUE; - doc->recalc_start=doc; } + doc->settings_root.cur_text_attr=doc->settings_root.dft_text_attr=win_task->text_attr; } x0=doc->line_start_col; y0=doc->cur_top_line_num; - doc->settings_root.cur_text_attr=doc->settings_root.dft_text_attr=doc->start_text_attr; same_win=top ==doc->old_win_top && - bottom==doc->old_win_bottom && - left ==doc->old_win_left && - right ==doc->old_win_right && - doc->cur_entry==doc->old_cur_entry && - doc->cur_data_col==doc->old_cur_data_col; + bottom==doc->old_win_bottom && + left ==doc->old_win_left && + right ==doc->old_win_right && + doc->cur_entry==doc->old_cur_entry && + doc->cur_data_col==doc->old_cur_data_col; if (recalc==DOC_RECALC_TO_SCREEN) { y_plot_top=y0-scroll_y/FONT_HEIGHT; y_plot_bottom=y0+height-1-scroll_y/FONT_HEIGHT; - if (!(doc->flags&DOCF_AUX_DOC) && !Bt(&win_task->display_flags,DISPLAYf_NO_BORDER)) + if (!(doc->flags&DOCF_BORDER_DOC) && !Bt(&win_task->display_flags,DISPLAYf_NO_BORDER)) DocBorderLstDraw(doc); } @@ -264,17 +267,19 @@ Bool DocRecalc(CDoc *doc,Bool has_cursor=FALSE,I64 recalc=DOC_RECALC_ALL) i=doc->ww_lines_back; ii=i/2; //Threshold for stopping on SOFT_CR while (i-- && doc_e->type_u8!=DOCT_NEW_LINE && - (i>ii || doc_e->type_u8!=DOCT_SOFT_NEW_LINE) && - doc_e->flags1 & DOCEF1_WORD_WRAP && - doc_e->last!=doc) + (i>ii || doc_e->type_u8!=DOCT_SOFT_NEW_LINE) && + doc_e->flags1 & DOCEF1_WORD_WRAP && + doc_e->last!=doc) doc_e=doc_e->last; x=doc_e->x; y=doc_e->y; doc->page_line_num=doc_e->page_line_num; } - - s=DocSettingsLast(doc_e); + if (doc_e==doc->root.next) + s=&doc->settings_root; + else + s=DocSettingsLast(doc_e); doc->flags=doc_e->flags1& (DOCG_BL_IV_UL|DOCEF1_WORD_WRAP|DOCEF1_LOCK_TO_PAGE|DOCEF1_LOCK_TO_CENTER) | - doc->flags&~(DOCG_BL_IV_UL|DOCEF1_WORD_WRAP|DOCEF1_LOCK_TO_PAGE|DOCEF1_LOCK_TO_CENTER); + doc->flags&~(DOCG_BL_IV_UL|DOCEF1_WORD_WRAP|DOCEF1_LOCK_TO_PAGE|DOCEF1_LOCK_TO_CENTER); cur_u8_attr=s->cur_text_attr; if (doc_e==doc->root.next) { doc->flags&=~DOCF_BACKWARD_MOVEMENT; @@ -282,7 +287,7 @@ Bool DocRecalc(CDoc *doc,Bool has_cursor=FALSE,I64 recalc=DOC_RECALC_ALL) doc->flags&=~DOCF_HAS_SONG; } else doc->flags=doc_e->flags1& DOCEF1_HIGHLIGHT | - doc->flags&~DOCEF1_HIGHLIGHT; + doc->flags&~DOCEF1_HIGHLIGHT; if (doc->root.next==doc) { best_do_e=doc; @@ -352,10 +357,10 @@ word_wrap_start: } } if (doc_e->type_u8==DOCT_TEXT && - !(doc_e->flags1&DOCEG1_DONT_EDIT) && - !(doc_e->flags2&DOCEG2_DONT_EDIT)) { + !(doc_e->flags1&DOCEG1_DONT_EDIT) && + !(doc_e->flags2&DOCEG2_DONT_EDIT)) { if (doc_e->flags1==doc_e2->flags1 && doc_e->flags2==doc_e2->flags2 && - doc_e->type==doc_e2->type) { + doc_e->type==doc_e2->type) { j=StrLen(doc_e2->tag); ptr=MAlloc(k+j+1,mem_task); MemCpy(ptr,doc_e->tag,k); @@ -383,8 +388,8 @@ word_wrap2: if (doc_e->flags1 & DOCEF1_SCROLLING_X) k=doc_e->scroll_len; if (doc_e->flags1 & - (DOCEF1_LEFT_X|DOCEF1_RIGHT_X|DOCEF1_CENTER_X| - DOCEF1_TOP_Y|DOCEF1_BOTTOM_Y|DOCEF1_CENTER_Y)) { + (DOCEF1_LEFT_X|DOCEF1_RIGHT_X|DOCEF1_CENTER_X| + DOCEF1_TOP_Y|DOCEF1_BOTTOM_Y|DOCEF1_CENTER_Y)) { if (doc_e->flags1 & DOCEF1_MARGIN_REL_X) { if (doc_e->flags1 & DOCEF1_LEFT_X) x=left_margin-left; @@ -425,7 +430,7 @@ word_wrap2: else doc->page_line_num=doc->page_line_num%s->page_len; if (s->header!=DOC_DFT && - doc->page_line_numheader) { + doc->page_line_numheader) { y+=s->header-doc->page_line_num; doc->page_line_num=s->header; } @@ -457,8 +462,8 @@ word_wrap2: i=right_margin+1-(x+left); //Space left on line ii=x+1-s->left_margin; if (doc_e->type_u8==DOCT_TEXT && - !(doc_e->flags1&DOCEG1_DONT_EDIT) && - !(doc_e->flags2&DOCEG2_DONT_EDIT)) { + !(doc_e->flags1&DOCEG1_DONT_EDIT) && + !(doc_e->flags2&DOCEG2_DONT_EDIT)) { if (doc->cur_entry==doc_e->next) { if (doc->cur_data_col==doc_e->next->min_col) i--; @@ -471,7 +476,7 @@ word_wrap2: if (k>i) { for (j=i;j>8-ii && j>=0;j--) if (doc_e->tag[j]==CH_SPACE || - doc_e->tag[j]==CH_SHIFT_SPACE) { + doc_e->tag[j]==CH_SHIFT_SPACE) { i=j+1; break; } @@ -506,12 +511,12 @@ word_wrap2: if (k>=i) { doc_e2=doc_e->last; if (doc_e2->type_u8!=DOCT_SOFT_NEW_LINE && - doc_e2->type_u8!=DOCT_NEW_LINE && - doc_e2->type_u8!=DOCT_CURSOR_MOVEMENT) { + doc_e2->type_u8!=DOCT_NEW_LINE && + doc_e2->type_u8!=DOCT_CURSOR_MOVEMENT) { doc_e2=CAlloc(sizeof(CDocEntryBase),mem_task); doc_e2->type=DOCT_SOFT_NEW_LINE | doc_e->type & 0xFFFFFF00; doc_e2->flags1=DOCEF1_WORD_WRAP | - doc_e->flags1 & (DOCEF1_LOCK_TO_PAGE|DOCEF1_HIGHLIGHT|DOCEF1_LOCK_TO_CENTER|DOCG_BL_IV_UL|DOCEF1_SKIP|DOCEF1_HARD_SKIP|DOCEF1_FILTER_SKIP); + doc_e->flags1 & (DOCEF1_LOCK_TO_PAGE|DOCEF1_HIGHLIGHT|DOCEF1_LOCK_TO_CENTER|DOCG_BL_IV_UL|DOCEF1_SKIP|DOCEF1_HARD_SKIP|DOCEF1_FILTER_SKIP); doc_e2->x=x; doc_e2->y=y; doc_e2->page_line_num=doc_e->last->page_line_num; @@ -540,40 +545,41 @@ skip_soft_cr: col2=0; doc_e->flags1=doc->flags& (DOCG_BL_IV_UL|DOCEF1_WORD_WRAP|DOCEF1_HIGHLIGHT|DOCEF1_LOCK_TO_PAGE|DOCEF1_LOCK_TO_CENTER) | - doc_e->flags1&~(DOCG_BL_IV_UL|DOCEF1_WORD_WRAP|DOCEF1_HIGHLIGHT|DOCEF1_LOCK_TO_PAGE|DOCEF1_LOCK_TO_CENTER); + doc_e->flags1&~(DOCG_BL_IV_UL|DOCEF1_WORD_WRAP|DOCEF1_HIGHLIGHT|DOCEF1_LOCK_TO_PAGE|DOCEF1_LOCK_TO_CENTER); temp_u32_attr=(cur_u8_attr&0xF0)<<8|doc->flags&DOCG_BL_IV_UL|(s->shifted_x&0x1F)<<16|(s->shifted_y&0x1F)<<21; switch (doc_e->type_u8) { case DOCT_SPRITE: - if (doc_e->flags1 & DOCEF1_LINK) - temp_u32_attr.u8[1]|=s->link_attr&15; - else if (doc_e->flags1 & (DOCEF1_LEFT_MACRO|DOCEF1_LEFT_EXP)) - temp_u32_attr.u8[1]|=s->macro_attr&15; + if (doc_e->flags1 & DOCEF1_LEFT_EXP) + temp_u32_attr.u8[1]|=cur_u8_attr&15; + else if (doc_e->flags1 & DOCEF1_LINK) + temp_u32_attr.u8[1]|=DOC_COLOR_LINK; + else if (doc_e->flags1 & DOCEF1_LEFT_MACRO) + temp_u32_attr.u8[1]|=DOC_COLOR_MACRO; else if (doc_e->flags1 & DOCEF1_TREE) - temp_u32_attr.u8[1]|=s->tree_attr&15; + temp_u32_attr.u8[1]|=DOC_COLOR_TREE; else - temp_u32_attr.u8[1]|=s->bin_attr&15; + temp_u32_attr.u8[1]|=DOC_COLOR_BIN; break; case DOCT_HTML_IMG: case DOCT_HTML_VIDEO: case DOCT_HTML_CODE: - temp_u32_attr.u8[1]|=s->bin_attr&15; + temp_u32_attr.u8[1]|=DOC_COLOR_BIN; break; case DOCT_LINK: - temp_u32_attr.u8[1]|=s->link_attr&15; + temp_u32_attr.u8[1]|=DOC_COLOR_LINK; break; case DOCT_MACRO: - case DOCT_MENU_VAL: - temp_u32_attr.u8[1]|=s->macro_attr&15; + temp_u32_attr.u8[1]|=DOC_COLOR_MACRO; break; case DOCT_ANCHOR: - temp_u32_attr.u8[1]|=s->anchor_attr&15; + temp_u32_attr.u8[1]|=DOC_COLOR_ANCHOR; break; case DOCT_TREE: - temp_u32_attr.u8[1]|=s->tree_attr&15; + temp_u32_attr.u8[1]|=DOC_COLOR_TREE; break; case DOCT_HIDE_START: case DOCT_HIDE_END: - temp_u32_attr.u8[1]|=s->hidden_attr&15; + temp_u32_attr.u8[1]|=DOC_COLOR_HIDDEN; break; default: temp_u32_attr.u8[1]|=cur_u8_attr&15; @@ -604,10 +610,10 @@ skip_soft_cr: } } else if (doc_e->flags1 & DOCEF1_HAS_BIN) { if (*ptr=='<') { - temp_u32_attr=temp_u32_attr & 0xFFFFF000 | (s->bin_attr&0xF)<<8; + temp_u32_attr=temp_u32_attr & 0xFFFFF000 | DOC_COLOR_BIN<<8; doc_e->type.u8[1]=temp_u32_attr.u8[1]; if (doc_e==doc->cur_entry && doc_e->type_u8!=DOCT_TEXT) - temp_u32_attr^=0x0F00; + temp_u32_attr^=0x0F00; if (full_refresh && '0'<=ptr[1]<='9') { SPrintF(buf,"<%d>",doc_e->bin_num); k=StrLen(buf); @@ -646,7 +652,7 @@ skip_soft_cr: ijif=cur_time*FONT_WIDTH*DOC_SCROLL_SPEED; ijif%=j*FONT_WIDTH; temp_u32_attr=temp_u32_attr & 0xFFE0FF00| - (FONT_WIDTH-1-ijif&(FONT_WIDTH-1))<<16; + (FONT_WIDTH-1-ijif&(FONT_WIDTH-1))<<16; #assert FONT_WIDTH==8 ijif>>=3; for (k=0;kscroll_len;k++) { @@ -654,14 +660,14 @@ skip_soft_cr: if (!Bt(displayable_chars_bitmap,ch)) ch='.'; if (recalc==DOC_RECALC_TO_SCREEN && !(doc_e->flags1&DOCEF1_DONT_DRAW)) { if (doc_e->flags1 & DOCEF1_BORDER_PLOT && - !Bt(&win_task->display_flags,DISPLAYf_NO_BORDER)) + !Bt(&win_task->display_flags,DISPLAYf_NO_BORDER)) PlotBorderU8(win_task,temp_u32_attr+ch,x-x0,y-y0); else PlotWinU8(win_task,temp_u32_attr+ch,x-x0,y-y0); } x++; } - } + } if (find_cursor) { D=DocCharDist(doc,doc_e->x,doc_e->y); col=doc_e->min_col; @@ -669,18 +675,18 @@ skip_soft_cr: col2=doc_e->scroll_len; //TODO This is flawed } else { if (doc_e->flags1 & DOCEF1_BORDER_PLOT && - !Bt(&win_task->display_flags,DISPLAYf_NO_BORDER)) { + !Bt(&win_task->display_flags,DISPLAYf_NO_BORDER)) { while (ch=*ptr++) { if (recalc==DOC_RECALC_TO_SCREEN && !(doc_e->flags1&DOCEF1_DONT_DRAW)) PlotBorderU8(win_task,temp_u32_attr+ch,x-x0,y-y0); else if (find_cursor) { d2=DocCharDist(doc,x,y); - if (d2type_u8) { case DOCT_TEXT: if (!col2 && - !(doc_e->flags1&(DOCEF1_TREE|DOCEF1_TAG_CB|DOCEF1_DEFINE|DOCEF1_HTML_LINK)) && - !(doc_e->flags2&DOCEF2_BIN_PTR_LINK)) + !(doc_e->flags1&(DOCEF1_TREE|DOCEF1_TAG_CB|DOCEF1_DEFINE|DOCEF1_HTML_LINK)) && + !(doc_e->flags2&DOCEF2_BIN_PTR_LINK)) del_cl=TRUE; break; case DOCT_HEX_ED: @@ -742,7 +748,7 @@ skip_soft_cr: while (ch=*ptr++) { if (recalc==DOC_RECALC_TO_SCREEN && !(doc_e->flags1&DOCEF1_DONT_DRAW)) { if (doc_e->flags1 & DOCEF1_BORDER_PLOT && - !Bt(&win_task->display_flags,DISPLAYf_NO_BORDER)) + !Bt(&win_task->display_flags,DISPLAYf_NO_BORDER)) PlotBorderU8(win_task,temp_u32_attr+ch,x-x0,y-y0); else PlotWinU8(win_task,temp_u32_attr+ch,x-x0,y-y0); @@ -763,7 +769,7 @@ skip_soft_cr: while (ch=*ptr++) { if (recalc==DOC_RECALC_TO_SCREEN && !(doc_e->flags1&DOCEF1_DONT_DRAW)) { if (doc_e->flags1 & DOCEF1_BORDER_PLOT && - !Bt(&win_task->display_flags,DISPLAYf_NO_BORDER)) + !Bt(&win_task->display_flags,DISPLAYf_NO_BORDER)) PlotBorderU8(win_task,temp_u32_attr+ch,x-x0,y-y0); else PlotWinU8(win_task,temp_u32_attr+ch,x-x0,y-y0); @@ -787,7 +793,7 @@ skip_soft_cr: if (!Bt(displayable_chars_bitmap,ch)) ch='.'; if (recalc==DOC_RECALC_TO_SCREEN && !(doc_e->flags1&DOCEF1_DONT_DRAW)) { if (doc_e->flags1 & DOCEF1_BORDER_PLOT && - !Bt(&win_task->display_flags,DISPLAYf_NO_BORDER)) + !Bt(&win_task->display_flags,DISPLAYf_NO_BORDER)) PlotBorderU8(win_task,temp_u32_attr+ch,x-x0,y-y0); else PlotWinU8(win_task,temp_u32_attr+ch,x-x0,y-y0); @@ -809,7 +815,7 @@ skip_soft_cr: case DOCT_TAB: k=(x+8) & ~7; if (doc_e->flags1 & DOCEF1_BORDER_PLOT && - !Bt(&win_task->display_flags,DISPLAYf_NO_BORDER)) { + !Bt(&win_task->display_flags,DISPLAYf_NO_BORDER)) { while (xflags1&DOCEF1_DONT_DRAW)) PlotBorderU8(win_task,temp_u32_attr+CH_SPACE,x-x0,y-y0); @@ -842,9 +848,9 @@ skip_soft_cr: case DOCT_NEW_LINE: case DOCT_SOFT_NEW_LINE: if (recalc==DOC_RECALC_TO_SCREEN && - !(doc_e->flags1&DOCEF1_DONT_DRAW)&& y_plot_top<=y<=y_plot_bottom) + !(doc_e->flags1&DOCEF1_DONT_DRAW)&& y_plot_top<=y<=y_plot_bottom) PlotWinAttr(win_task,width-(x-x0), - cur_u8_attr<<8,x-x0,y-y0); + cur_u8_attr<<8,x-x0,y-y0); if (doc_e->flags1&DOCEF1_HIGHLIGHT) { if (s->state&7==DOCSS_CPP_Z_COMMENT) { if (full_refresh) { @@ -1019,8 +1025,6 @@ adjust_xy: QueIns(s,doc->settings_root.last); } else s=DocSettingsNext(doc_e->next); - if (recalc==DOC_RECALC_TO_SCREEN && !(doc_e->flags1&DOCEF1_DONT_DRAW)) - win_task->text_attr=cur_u8_attr; break; case DOCT_DFT_FOREGROUND: cur_u8_attr&=0xF0; @@ -1049,113 +1053,14 @@ adjust_xy: QueIns(s,doc->settings_root.last); } else s=DocSettingsNext(doc_e->next); - if (recalc==DOC_RECALC_TO_SCREEN && !(doc_e->flags1&DOCEF1_DONT_DRAW)) - win_task->text_attr=cur_u8_attr; break; - case DOCT_ALT_FOREGROUND: - if (full_refresh) { - s=DocSettingsIdentical(doc,s); - s->alt_text_attr=doc_e->attr; - QueIns(s,doc->settings_root.last); - } else - s=DocSettingsNext(doc_e->next); - break; - case DOCT_LINK_FOREGROUND: - if (full_refresh) { - s=DocSettingsIdentical(doc,s); - s->link_attr=doc_e->attr; - QueIns(s,doc->settings_root.last); - } else - s=DocSettingsNext(doc_e->next); - break; - case DOCT_MACRO_FOREGROUND: - if (full_refresh) { - s=DocSettingsIdentical(doc,s); - s->macro_attr=doc_e->attr; - QueIns(s,doc->settings_root.last); - } else - s=DocSettingsNext(doc_e->next); - break; - case DOCT_ANCHOR_FOREGROUND: - if (full_refresh) { - s=DocSettingsIdentical(doc,s); - s->anchor_attr=doc_e->attr; - QueIns(s,doc->settings_root.last); - } else - s=DocSettingsNext(doc_e->next); - break; - case DOCT_HIDDEN_FOREGROUND: - if (full_refresh) { - s=DocSettingsIdentical(doc,s); - s->hidden_attr=doc_e->attr; - QueIns(s,doc->settings_root.last); - } else - s=DocSettingsNext(doc_e->next); - break; - case DOCT_TREE_FOREGROUND: - if (full_refresh) { - s=DocSettingsIdentical(doc,s); - s->tree_attr=doc_e->attr; - QueIns(s,doc->settings_root.last); - } else - s=DocSettingsNext(doc_e->next); - break; - case DOCT_USER_FOREGROUND: - if (doc_e->attr==DOC_DFT) { - cur_u8_attr=cur_u8_attr&0xF0|s->user_attr&0x0F; - if (y==cursor_y) { - doc->cur_entry=doc_e->next; - doc->cur_data_col=doc->cur_entry->min_col; - } - } else { - if (full_refresh) { - s=DocSettingsIdentical(doc,s); - s->user_attr=doc_e->attr; - QueIns(s,doc->settings_root.last); - } else - s=DocSettingsNext(doc_e->next); + case DOCT_PMT: + cur_u8_attr=cur_u8_attr&0xF0|DOC_COLOR_PMT; + if (y==cursor_y) { + doc->cur_entry=doc_e->next; + doc->cur_data_col=doc->cur_entry->min_col; } break; - case DOCT_BINARY_FOREGROUND: - if (full_refresh) { - s=DocSettingsIdentical(doc,s); - s->bin_attr=doc_e->attr; - QueIns(s,doc->settings_root.last); - } else - s=DocSettingsNext(doc_e->next); - break; - case DOCT_KEYWORD_FOREGROUND: - if (full_refresh) { - s=DocSettingsIdentical(doc,s); - s->keyword_attr=doc_e->attr; - QueIns(s,doc->settings_root.last); - } else - s=DocSettingsNext(doc_e->next); - break; - case DOCT_KEYWORD2_FOREGROUND: - if (full_refresh) { - s=DocSettingsIdentical(doc,s); - s->keyword2_attr=doc_e->attr; - QueIns(s,doc->settings_root.last); - } else - s=DocSettingsNext(doc_e->next); - break; - case DOCT_COMMENT_FOREGROUND: - if (full_refresh) { - s=DocSettingsIdentical(doc,s); - s->comment_attr=doc_e->attr; - QueIns(s,doc->settings_root.last); - } else - s=DocSettingsNext(doc_e->next); - break; - case DOCT_QUOTE_FOREGROUND: - if (full_refresh) { - s=DocSettingsIdentical(doc,s); - s->quote_attr=doc_e->attr; - QueIns(s,doc->settings_root.last); - } else - s=DocSettingsNext(doc_e->next); - break; case DOCT_WORD_WRAP: if (doc_e->attr) doc->flags|=DOCF_WORD_WRAP; @@ -1347,7 +1252,10 @@ adjust_xy: doc_e->max_col=1; break; default: - doc_e->max_col= doc_e->flags1 & DOCEF1_TREE ? 1:col2; + if (doc_e->flags1 & DOCEF1_TREE) + doc_e->max_col=1; + else + doc_e->max_col=col2; } if (x>doc->max_x) doc->max_x=x; @@ -1441,7 +1349,7 @@ skip: doc_e2->settings=s; doc_e2->type.u8[1]=cur_u8_attr; doc_e2->flags1=doc->flags& (DOCG_BL_IV_UL|DOCEF1_WORD_WRAP|DOCEF1_HIGHLIGHT|DOCEF1_LOCK_TO_PAGE|DOCEF1_LOCK_TO_CENTER) | - doc_e2->flags1&~(DOCG_BL_IV_UL|DOCEF1_WORD_WRAP|DOCEF1_HIGHLIGHT|DOCEF1_LOCK_TO_PAGE|DOCEF1_LOCK_TO_CENTER); + doc_e2->flags1&~(DOCG_BL_IV_UL|DOCEF1_WORD_WRAP|DOCEF1_HIGHLIGHT|DOCEF1_LOCK_TO_PAGE|DOCEF1_LOCK_TO_CENTER); } doc_e2=doc_e2->next; } @@ -1526,11 +1434,9 @@ skip: doc->cur_entry=best_do_e; doc->cur_data_col=best_col; DocFormBackward(doc); - - //We need this because text coordinates are used +//We need this because text coordinates are used if (best_dbest_d=best_d; } @@ -1546,7 +1452,7 @@ skip: doc->x+=x>>1*3+x&1; else doc->x+=doc->cur_entry->hex_ed_width*3+ - (x-doc->cur_entry->hex_ed_width<<1); + (x-doc->cur_entry->hex_ed_width<<1); } doc->line=doc->y+1; doc->col=doc->x+1; @@ -1589,8 +1495,8 @@ skip: x=doc->x-doc->line_start_col+left +scroll_x/FONT_WIDTH; y=doc->y-doc->cur_top_line_num+top+scroll_y/FONT_HEIGHT; if (0<=x<=right && 0<=y<=bottom && - xflags&DOCF_HIDE_CURSOR)) { + xflags&DOCF_HIDE_CURSOR)) { u32_ptr=gr_text_base+y*TEXT_COLS+x; *u32_ptr|=DOCET_BLINK; *u32_ptr^=0xFF00; @@ -1646,11 +1552,11 @@ skip: public U0 DocInsSafe(CDoc *doc,U8 *st) { //This is necessary when hidden text might screw-up - //inserts. It does them all-at-once. +//inserts. It does them all-at-once. Bool unlock; I64 old_flags; if (!doc) { - doc=DocCur; + doc=DocPut; if (!doc) return; } @@ -1668,7 +1574,7 @@ public U0 DocBottom(CDoc *doc=NULL) { Bool unlock; if (!doc) { - doc=DocCur; + doc=DocPut; if (!doc) return; } @@ -1684,7 +1590,7 @@ public U0 DocTop(CDoc *doc=NULL) { Bool unlock; if (!doc) { - doc=DocCur; + doc=DocPut; if (!doc) return; } @@ -1700,7 +1606,7 @@ public U0 DocClear(CDoc *doc=NULL) { Bool unlock; if (!doc) { - doc=DocCur; + doc=DocPut; if (!doc) return; } @@ -1715,7 +1621,7 @@ public U0 DocClear(CDoc *doc=NULL) public Bool DocCursor(Bool show=OFF,CDoc *doc=NULL) { if (!doc) { - doc=DocCur; + doc=DocPut; if (!doc) return FALSE; } @@ -1725,62 +1631,19 @@ public Bool DocCursor(Bool show=OFF,CDoc *doc=NULL) public Bool DocScroll(Bool val=OFF,CDoc *doc=NULL) { if (!doc) { - doc=DocCur; + doc=DocPut; if (!doc) return FALSE; } return !LBEqu(&doc->flags,DOCf_NO_SCROLL_BARS,!val); } -I64 DocBkColor(CDoc *doc,I64 col) -{ - CDocSettings *s=&doc->settings_root; - I64 result=doc->start_text_attr>>4&15; - col=(col&15)<<4; - doc->start_text_attr=doc->start_text_attr&15+col; - s->cur_text_attr =s->cur_text_attr&15+col; - s->dft_text_attr =s->dft_text_attr&15+col; - return result; -} - -public I64 DocCurAttr(I64 attr=WHITE<<4+BLUE,CTask *task=NULL) -{ - CDoc *doc; - I64 result=0; - if (!task) task=Fs; - result=task->text_attr; - if (doc=DocCur(task)) { - result=doc->start_text_attr; - doc->start_text_attr=attr; - DocBkColor(doc,attr>>4); - } - task->text_attr=attr; - return result; -} - -public I64 DocAuxAttr(I64 attr=WHITE<<4+BLUE,CTask *task=NULL) -{ //This will probably be ineffective since the - //$LK,"DOCF_ATTR_BY_PRT","MN:DOCF_ATTR_BY_PRT"$ or $LK,"DOCF_ATTR_BY_FILENAME","MN:DOCF_ATTR_BY_FILENAME"$ flag is probably set - //which means $LK,"SetDrvTextAttr","MN:SetDrvTextAttr"$() is overriding it. - CDoc *doc; - I64 result=0; - if (!task) task=Fs; - result=task->border_attr; - if (doc=DocAux(task)) { - result=doc->start_text_attr; - doc->start_text_attr=attr; - DocBkColor(doc,attr>>4); - } - task->border_attr=attr; - return result; -} - public U0 DocCollapse(Bool collapse=TRUE,CDoc *doc=NULL) { CDocEntry *doc_e; Bool unlock; if (!doc) { - doc=DocCur; + doc=DocPut; if (!doc) return; } @@ -1800,43 +1663,38 @@ public U0 DocCollapse(Bool collapse=TRUE,CDoc *doc=NULL) U0 DocUpdateTaskDocs(CTask *task) { CPrt *p; - I64 attr=task->border_attr; - CDoc *doc=task->last_doc; + CDoc *doc; CD3I64 saved_scroll; - Bool old_preempt=Preempt(OFF),okay=TRUE; - while (doc!=(&task->next_doc)(U8 *)-offset(CDoc.next_doc)) { - if (!(doc->flags&DOCF_DONT_SHOW)) { - if (doc->flags&DOCF_AUX_DOC) { - if (attr&0xF!=attr>>4) - doc->start_text_attr=attr; - WinScrollNull(task,&saved_scroll); - okay=DocRecalc(doc,FALSE,DOC_RECALC_TO_SCREEN); - WinScrollRestore(task,&saved_scroll); - } else { - if (doc->flags&DOCF_ATTR_BY_PRT) { - p=task->cur_prt; - attr=p->text_attr; + Bool old_preempt=Preempt(OFF); + I64 border_attr; + if (task->border_src==BDS_CUR_PRT && task->cur_prt) { + border_attr=task->cur_prt->text_attr; + if (border_attr&15!=border_attr>>4) + task->border_attr=border_attr; + } + if (task->title_src==TTS_TASK_NAME) + StrCpy(task->task_title,task->task_name); + if ((doc=DocDisplay(task)) && !(doc->flags&DOCF_DONT_SHOW)) { + if (task->border_src==BDS_ED_FILENAME_PRT) { + try { + if (p=Drv2Prt(*doc->filename.name)) { + border_attr=p->text_attr; + if (border_attr&15!=border_attr>>4) + task->border_attr=border_attr; } - if (doc->flags&DOCF_ATTR_BY_FILENAME) { - try - p=Drv2Prt(doc->filename.name[0]); - catch { - p=NULL; - Fs->catch_except=TRUE; - } - if (p) - attr=p->text_attr; - } - if (attr&0xF!=attr>>4) - task->border_attr=attr; - Preempt(old_preempt); - okay=DocRecalc(doc,TRUE,DOC_RECALC_TO_SCREEN); - Preempt(OFF); - } + } catch + Fs->catch_except=TRUE; } - if (!okay || doc->doc_in_que_signature!=DOC_IN_QUE_SIGNATURE_VAL) - break; - doc=doc->last_doc; + if (task->title_src==TTS_ED_FILENAME) + MemCpy(task->task_title,doc->filename.name,TASK_TITLE_LEN); + Preempt(old_preempt); + DocRecalc(doc,TRUE,DOC_RECALC_TO_SCREEN); + Preempt(OFF); + } + if ((doc=DocBorder(task)) && !(doc->flags&DOCF_DONT_SHOW)) { + WinScrollNull(task,&saved_scroll); + DocRecalc(doc,FALSE,DOC_RECALC_TO_SCREEN); + WinScrollRestore(task,&saved_scroll); } Preempt(old_preempt); } diff --git a/TempleOS/Adam/Doc/DocTree.CPP b/TempleOS/Adam/Doc/DocTree.CPP index 0b11b7d..9544b74 100644 --- a/TempleOS/Adam/Doc/DocTree.CPP +++ b/TempleOS/Adam/Doc/DocTree.CPP @@ -118,13 +118,13 @@ public I64 ExeDoc(CDoc *doc,Bool just_load=FALSE) I64 result; Bool okay=TRUE,unlock_doc=DocLock(doc); CLex *lx; - lx=LexNew("",LF_DONT_FREE_BUF,FileNameAbs(sys_temp_filename)); + lx=LexNew("",LF_DONT_FREE_BUF,sys_temp_filename); if (just_load) lx->flags|=LF_JUST_LOAD; if (Fs->last_lex!=&Fs->next_lex) lx->opts=Fs->last_lex->opts; QueIns(lx,Fs->last_lex); - LexIncludeDoc(lx,NULL,doc); + LexAttachDoc(lx,,doc); try { Lex(lx); result=ExeCmdLine(lx); diff --git a/TempleOS/Adam/DocDefines.CPP b/TempleOS/Adam/DocDefines.CPP index df9fc41..9f29e2b 100644 --- a/TempleOS/Adam/DocDefines.CPP +++ b/TempleOS/Adam/DocDefines.CPP @@ -22,14 +22,15 @@ U0 LoadDocDefines() DefinePrintF( "DD_MP_VECT_END","%08X",MP_VECT_ADDR+SYS_MP_INIT_END-SYS_MP_INIT_START-1); - DefinePrintF( - "DD_TEMPLEOS_AGE","%h56D",GetCurTimeCDate-A2CDate("8/1/2003")); + "DD_OS_NAME_VERSION","TempleOS V%0.2f",os_version); + DefinePrintF( + "DD_TEMPLEOS_AGE","%h56D",GetCurTimeDate-A2Date("8/1/2003")); //This is cut and replaced when I generate a distro. //See $LK,"DD_TEMPLEOS_LOC","FF:::/TempleOS/Demo/AcctExample/TSDistro.CPP,DD_TEMPLEOS_LOC"$. $TR-C,"LineCnt"$ -$ID,4$DefinePrintF("DD_TEMPLEOS_LOC","139,640"); +$ID,4$DefinePrintF("DD_TEMPLEOS_LOC","122,808"); $ID,-4$ DefinePrintF( "DD_PAGE_TABLE_BASE","%08X",PAGE_TABLE_BASE); @@ -43,6 +44,11 @@ $ID,-4$ DefinePrintF( "DD_SYS_HEAP_BASE2","%09,X",sys_heap_base); + DefinePrintF( + "DD_SYS_HEAP_LIMIT","%08X",sys_heap_limit); + DefinePrintF( + "DD_SYS_HEAP_LIMIT2","%09,X",sys_heap_limit); + DefinePrintF( "DD_MAPPED_MEM_SPACE_GIG","%d Gig",MAPPED_MEM_SPACE/0x40000000); DefinePrintF( diff --git a/TempleOS/Adam/Dsk/ChkDsk.CPP b/TempleOS/Adam/Dsk/ChkDsk.CPP index 0c8e182..6d0c7db 100644 --- a/TempleOS/Adam/Dsk/ChkDsk.CPP +++ b/TempleOS/Adam/Dsk/ChkDsk.CPP @@ -11,7 +11,7 @@ Bool ChkDskConfirm(Bool *_fix,Bool *_confirm) return *_fix; } -I64 NativeFSChkDskLst(CDirEntry *tempm1,U8 *bits,U8 *bits2,I64 size,I64 bpc) +I64 RedSeaFSChkDskLst(CDirEntry *tempm1,U8 *bits,U8 *bits2,I64 size,I64 bpc) { CDirEntry *tempm2; I64 i,j,errs=0; @@ -19,7 +19,7 @@ I64 NativeFSChkDskLst(CDirEntry *tempm1,U8 *bits,U8 *bits2,I64 size,I64 bpc) tempm2=tempm1->next; if (tempm1->attr & _ATTR_DIR) { if (tempm1->sub) - errs+=NativeFSChkDskLst(tempm1->sub,bits,bits2,size,bpc); + errs+=RedSeaFSChkDskLst(tempm1->sub,bits,bits2,size,bpc); } j=(tempm1->size+bpc-1)/bpc; for (i=0;icur_prt; @@ -86,13 +86,13 @@ I64 NativeFSChkDsk(U8 drv_let,Bool *_fix,Bool *_confirm) } } - errs+=NativeFSChkDskLst(FilesFind(files_find_mask,FUF_RECURSE),bits,bits2,size,bpc); + errs+=RedSeaFSChkDskLst(FilesFind(files_find_mask,FUF_RECURSE),bits,bits2,size,bpc); for (i=1;itype) { - case PT_NATIVE: - errs=NativeFSChkDsk(drv_let,&fix,&confirm); + case PT_REDSEA: + errs=RedSeaFSChkDsk(drv_let,&fix,&confirm); break; case PT_FAT32: errs=FAT32ChkDsk(drv_let,&fix,&confirm); diff --git a/TempleOS/Adam/Dsk/Dsk2.CPP b/TempleOS/Adam/Dsk/Dsk2.CPP index 67e7e49..e0fa865 100644 --- a/TempleOS/Adam/Dsk/Dsk2.CPP +++ b/TempleOS/Adam/Dsk/Dsk2.CPP @@ -1,5 +1,4 @@ #include "Dsk2a" #include "Dsk2b" -#include "DskCDDVD" #include "ChkDsk" #include "FileMgr" diff --git a/TempleOS/Adam/Dsk/Dsk2a.CPP b/TempleOS/Adam/Dsk/Dsk2a.CPP index 6e9ff4e..f043796 100644 --- a/TempleOS/Adam/Dsk/Dsk2a.CPP +++ b/TempleOS/Adam/Dsk/Dsk2a.CPP @@ -230,7 +230,7 @@ public I64 DelTree(U8 *files_find_mask,U8 *fu_flags=NULL) return result; } -U0 TouchFile(U8 *filename,U8 *attr,CDate spdt=0) //Just one file +U0 TouchFile(U8 *filename,U8 *attr,CDate cdt=0) //Just one file { CPrt *p=Drv2Prt(*filename); CDirEntry de; @@ -246,16 +246,16 @@ U0 TouchFile(U8 *filename,U8 *attr,CDate spdt=0) //Just one file if (!*cur_dir) StrCpy(cur_dir,"/"); GetFFlags(&de.attr,Define("ST_FILE_ATTRS"),attr); - if (spdt) - de.datetime=spdt; + if (cdt) + de.datetime=cdt; else - de.datetime=GetCurTimeCDate; + de.datetime=GetCurTimeDate; CDirNew(p,cur_dir,&de,FALSE); } } else PutDefineErr("ST_FILE_NOT_FOUND"); } -U0 TouchLst(CDirEntry *tempm1,U8 *attr,CDate spdt=0) +U0 TouchLst(CDirEntry *tempm1,U8 *attr,CDate cdt=0) { CDirEntry *tempm2; while (tempm1) { @@ -263,16 +263,16 @@ U0 TouchLst(CDirEntry *tempm1,U8 *attr,CDate spdt=0) if (tempm1->attr & _ATTR_DIR) { if (tempm1->sub) { "%S%s\n","ST_SCANNING_DIR",tempm1->full_name; - TouchLst(tempm1->sub,attr,spdt); + TouchLst(tempm1->sub,attr,cdt); } } else - TouchFile(tempm1->full_name,attr,spdt); + TouchFile(tempm1->full_name,attr,cdt); CDirEntryDel(tempm1); tempm1=tempm2; } } -public U0 Touch(U8 *files_find_mask,U8 *attr="+?",U8 *fu_flags=NULL,CDate spdt=0) +public U0 Touch(U8 *files_find_mask,U8 *attr="+?",U8 *fu_flags=NULL,CDate cdt=0) { //Attr "+?" =show // "+T" =resident @@ -280,7 +280,7 @@ public U0 Touch(U8 *files_find_mask,U8 *attr="+?",U8 *fu_flags=NULL,CDate spdt=0 // Touch(filename,"",,datetime); I64 fuf_flags=0; GetFFlags(&fuf_flags,Define("ST_FILE_UTIL_FLAGS"),fu_flags); - TouchLst(FilesFind(files_find_mask,fuf_flags),attr,spdt); + TouchLst(FilesFind(files_find_mask,fuf_flags),attr,cdt); } I64 FFLst(CDirEntry *tempm1) @@ -324,15 +324,7 @@ public U0 SetDrvTextAttr(U8 drv_let,U8 attr) Fs->catch_except=TRUE; } -U0 PrintFDrvTextAttr(U8 drv_let=0) -{ - CPrt *p=Drv2Prt(drv_let); - U8 fg=p->text_attr&0xF,bg=p->text_attr>>4; - if (fg!=bg) - "$$FG,%d$$$$BG,%d$$",fg,bg; -} - -I64 NativeFSUnusedDrvSpace(U8 drv_let=0) +I64 RedSeaFSUnusedDrvSpace(U8 drv_let=0) { CPrt *p=Drv2Prt(drv_let); I64 result=0,i,l; @@ -377,8 +369,8 @@ public I64 UnusedDrvSpace(U8 drv_let=0) I64 result=0; Drv(drv_let); switch (p->type) { - case PT_NATIVE: - result=NativeFSUnusedDrvSpace(drv_let); + case PT_REDSEA: + result=RedSeaFSUnusedDrvSpace(drv_let); break; case PT_FAT32: result=FAT32UnusedDrvSpace(drv_let); diff --git a/TempleOS/Adam/Dsk/Dsk2b.CPP b/TempleOS/Adam/Dsk/Dsk2b.CPP index 167a659..dc63832 100644 --- a/TempleOS/Adam/Dsk/Dsk2b.CPP +++ b/TempleOS/Adam/Dsk/Dsk2b.CPP @@ -67,8 +67,7 @@ public CDirEntry *CDirTreeUnflatten(U8 *src) return tempm; } -#help_index "Install;File/Install Related" -#help_file "::/TempleOS/Doc/Install" +#help_index "Install;File/Cmd Line (Typically);Cmd Line (Typically)" #define ROUND_PRT_TO (63*255) #define PRT_HEADER 63 @@ -157,8 +156,11 @@ public U0 PrtDsk(U8 drv_let=0) temppp=root.next; drv_let2=bdev->first_drv_let; while (temppp!=&root) { - "Drive %C:%08X %s\n",drv_let2,temppp->size, - temppp->pri ? "Primary":"Logical"; + "Drive %C:%08X ",drv_let2,temppp->size; + if (temppp->pri) + "Primary\n"; + else + "Logical\n"; temppp=temppp->next; drv_let2++; } @@ -174,7 +176,7 @@ public U0 PrtDsk(U8 drv_let=0) mbr.p[i].active=0x80; mbr.p[i].start_head=0; mbr.p[i].start_cyl=0x101; - mbr.p[i].type=1; //Will get set to MBR_PT_NATIVE + mbr.p[i].type=1; //Will get set to MBR_PT_REDSEA mbr.p[i].end_head=0xFE; mbr.p[i].end_cyl=0xFFFF; mbr.p[i].offset=PRT_HEADER+offset; @@ -205,7 +207,7 @@ public U0 PrtDsk(U8 drv_let=0) mbr.p[0].active=0x80; mbr.p[0].start_head=1; mbr.p[0].start_cyl=0x101; - mbr.p[0].type=1; //Will get set to MBR_PT_NATIVE + mbr.p[0].type=1; //Will get set to MBR_PT_REDSEA mbr.p[0].end_head=0xFE; mbr.p[0].end_cyl=0xFFFF; mbr.p[0].offset=PRT_HEADER; @@ -241,7 +243,7 @@ pd_done: #help_index "Info;File/Cmd Line (Typically);Cmd Line (Typically)" -U0 NativeFSDrvView(U8 drv_let=0) +U0 RedSeaFSDrvView(U8 drv_let=0) { CPrt *p=Drv2Prt(drv_let); I64 lohi,c1,i,x,y,l,s; @@ -335,8 +337,8 @@ public U0 DrvView(U8 drv_let=0) CPrt *p=Drv2Prt(drv_let),*p_old=Fs->cur_prt; Drv(drv_let); switch (p->type) { - case PT_NATIVE: - NativeFSDrvView(drv_let); + case PT_REDSEA: + RedSeaFSDrvView(drv_let); break; case PT_FAT32: FAT32DrvView(drv_let); @@ -366,7 +368,7 @@ public U0 DskView(U8 drv_let=0) radius=0.4*h; else radius=0.4*v; - dc->color=ROP_EQU+BLACK; + dc->color=BLACK; GrCircle(dc,h>>1,v>>1,radius); j=1; @@ -375,7 +377,7 @@ public U0 DskView(U8 drv_let=0) if (bdev==p->bdev && p->type) { sect_start=-(p->offset*2*ã/(bdev->max_blk+1)); sect_end =-((p->offset+p->size)*2*ã/(bdev->max_blk+1)); - dc->color=ROP_EQU+BLACK; + dc->color=BLACK; GrLine(dc,h>>1,v>>1, h>>1+radius*Cos(sect_start), v>>1+radius*Sin(sect_start)); @@ -383,7 +385,7 @@ public U0 DskView(U8 drv_let=0) h>>1+radius*Cos(sect_end), v>>1+radius*Sin(sect_end)); - dc->color=ROP_EQU+j; + dc->color=j; GrPrintF(dc,0,v-FONT_HEIGHT*j,"%C %-8Z",Prt2Drv(p), p->type.u16[0],"ST_PRT_TYPES"); GrFloodFill(dc, @@ -393,13 +395,13 @@ public U0 DskView(U8 drv_let=0) } } - GetChar(NULL,FALSE); + GetChar(,FALSE); SettingsPop; DCFill; DCDel(dc); } -#help_index "Info;File/Cmd Line (Typically);Cmd Line (Typically);File/Install Related;Install" +#help_index "Info;File/Cmd Line (Typically);Cmd Line (Typically);Install" public U0 BlkDevRep() { I64 i; diff --git a/TempleOS/Adam/Dsk/FileMgr.CPP b/TempleOS/Adam/Dsk/FileMgr.CPP index 2194f2f..f060616 100644 --- a/TempleOS/Adam/Dsk/FileMgr.CPP +++ b/TempleOS/Adam/Dsk/FileMgr.CPP @@ -153,10 +153,10 @@ U0 FMRebuildDoc(CDoc **_doc,CDirEntry **_root,I64 mode) CDocEntry *doc_ce; CDirEntry *tempm,*tempm1,*cur_tree_entry; if (!doc) - parent_doc=DocCur; + parent_doc=DocPut; else { parent_doc=doc->parent_doc; - DocQueRem(doc); + Fs->put_doc=Fs->display_doc=NULL; DocUnlock(doc); WinMgrSync; DocLock(doc); @@ -204,20 +204,21 @@ U0 FMRebuildDoc(CDoc **_doc,CDirEntry **_root,I64 mode) doc->flags|=DOCF_FORM; switch (mode) { case FM_NORMAL: - DocPutS(doc,"$$FG,PURPLE$$File Manager$$FG$$\n\n$$LK,\"Click for Help\",\"FI:::/TempleOS/Doc/FileMgr.TXT\"$$\n\n"); + DocPutS(doc,"$$FG,PURPLE$$File Manager\n\n$$LK,\"Click for Help\",\"FI:::/TempleOS/Doc/FileMgr.TXT\"$$\n\n"); break; case FM_PICK_FILE: - DocPutS(doc,"$$FG,PURPLE$$Pick file and press $$FG$$\n\n"); + DocPutS(doc,"$$FG,PURPLE$$Pick file and press \n\n"); doc->flags|=DOCF_MIN_SIZE; break; case FM_PICK_DIR: - DocPutS(doc,"$$FG,PURPLE$$Pick directory and press $$FG$$\n\n"); + DocPutS(doc,"$$FG,PURPLE$$Pick directory and press \n\n"); doc->flags|=DOCF_MIN_SIZE; break; } + DocPutS(doc,"$$FG,LTBLUE$$"); for (i=0;itype==PT_NATIVE||p->type==PT_FAT32) + if (p->type==PT_REDSEA||p->type==PT_FAT32) FMRebuildDocDrv(Prt2Drv(p),doc,_root,TRUE); else if (p->type==PT_ISO9660) { if (p->bdev->flags&BDF_INITIALIZED) @@ -238,8 +239,7 @@ U0 FMRebuildDoc(CDoc **_doc,CDirEntry **_root,I64 mode) Free(next_entry); *_doc=doc; DocLock(doc); - DocQueRem(DocCur); - DocQueIns(doc,Fs->last_doc); + Fs->put_doc=Fs->display_doc=doc; } U0 FMRename(CDoc *doc) @@ -550,7 +550,7 @@ public U8 *FileMgr(I64 mode=FM_NORMAL,CTask *mem_task=NULL) { CDirEntry *root=NULL,*tempm,*tempm1,*tempm2; I64 sc,ch,p1,p2,msg_code; - CDoc *doc=NULL,*old_doc=DocCur; + CDoc *doc=NULL,*old_put_doc=DocPut,*old_display_doc=DocDisplay; U8 *result=NULL,*st,*st2,*old_cur_dir=CurDir; CDocEntry *doc_ce=NULL,*doc_e; Bool okay; @@ -559,7 +559,7 @@ public U8 *FileMgr(I64 mode=FM_NORMAL,CTask *mem_task=NULL) fp_old_final_screen_update=fp_final_screen_update; MenuFilePush("::/TempleOS/Doc/FileMgrPullDown.TXT"); FMRebuildDoc(&doc,&root,mode); - if (tempm1=CdDir(root,old_cur_dir)) + if (tempm1=Cd2DirEntry(root,old_cur_dir)) doc->cur_entry=tempm1->user_data; while (tempm1) { if (tempm1->attr&_ATTR_DIR) @@ -750,8 +750,8 @@ regular_key: } } while (ch!=CH_ESC && ch!=CH_SHIFT_ESC); fp_final_screen_update=fp_old_final_screen_update; - DocQueRem(doc); - DocQueIns(old_doc,Fs->last_doc); + Fs->put_doc =old_put_doc; + Fs->display_doc=old_display_doc; SettingsPop; DocDel(doc); CDirLstDel(root); diff --git a/TempleOS/Adam/Gr/CSpriteBitMap.CPP b/TempleOS/Adam/Gr/CSpriteBitMap.CPP index c78d894..b695f68 100644 --- a/TempleOS/Adam/Gr/CSpriteBitMap.CPP +++ b/TempleOS/Adam/Gr/CSpriteBitMap.CPP @@ -1,10 +1,10 @@ -#define GEBM_END 0 -#define GEBM_CONT 1 +#define GEBM_EXIT 0 +#define GEBM_MAIN_MENU 1 #define GEBM_COLOR 2 #define GEBM_DITHER_COLOR 3 #define GEBM_WIDTH 4 #define GEBM_SNAP 5 -#define GEBM_PT 6 +#define GEBM_PT 6 #define GEBM_LINE 7 #define GEBM_ARROW 8 #define GEBM_RECT 9 @@ -16,13 +16,26 @@ #define GEBM_FLOOD_FILL_NOT 15 #define GEBM_POLYLINE 16 #define GEBM_POLYPT 17 -#define GEBM_CUT 18 +#define GEBM_COPY 18 #define GEBM_DELETE 19 #define GEBM_PASTE 20 #define GEBM_PASTE_TRANSPARENT 21 #define GEBM_FIND_AND_REPLACE 22 #define GEBM_TRIM_TO_EXTENTS 23 -#define GEBM_UNDO 24 +#define GEBM_ADD_OUTLINE 24 +#define GEBM_ETCH 25 +#define GEBM_UNDO 26 + +U0 GrInit3() +{ + DefineLstLoad("ST_SPRITE_BITMAP_MENU", + "Exit\0Main Menu\0Color\0Dither Color\0Width\0Snap\0Point\0Line\0Arrow\0" + "Rect\0Circle\0Text\0Text Box\0Text Diamond\0Flood Fill\0" + "Flood Fill Not Color\0PolyLine\0PolyPoint\0Copy\0Delete\0Paste\0" + "Paste Transparent\0Find and Replace\0Trim to Extents\0Add Outline\0" + "Etch\0Undo\0"); +} +GrInit3; I64 PopUpSpriteBitMap(CColorROPU32 color,I64 width,I64 snap,F64 ip_scaler) { @@ -39,16 +52,17 @@ I64 PopUpSpriteBitMap(CColorROPU32 color,I64 width,I64 snap,F64 ip_scaler) st2=""; } - DocPrintF(doc,"$$FG,PURPLE$$$$TX+CX,\"BitMap Menu\"$$$$FG$$\n" - "$$FG,RED$$Settings$$FG$$\n" - "$$MU-UL,\"Color %s\",GEBM_COLOR$$\n" + DocPrintF(doc,"$$FG,PURPLE$$$$TX+CX,\"Sprite BitMap Menu\"$$\n" + "$$LK+PU+CX,\"Click for Help\",\"FI:::/TempleOS/Doc/SpriteBitMap.TXT.Z\"$$\n" + "\n$$FG,LTBLUE$$$$MU-UL,\"Color %s\",GEBM_COLOR$$\n" "$$MU-UL,\"Dither Color %s\",GEBM_DITHER_COLOR$$\n" "$$MU-UL,\"Width %d\",GEBM_WIDTH$$\n" "$$MU-UL,\"Snap %d %5.3f\",GEBM_SNAP$$\n" "$$MU-UL,\"Find & Replace Color\",GEBM_FIND_AND_REPLACE$$\n" "$$MU-UL,\"Trim to Extents\",GEBM_TRIM_TO_EXTENTS$$\n" - "\n$$FG,RED$$Objects$$FG$$\n" - "$$MU-UL,\"Point\",GEBM_PT$$\n" + "$$MU-UL,\"Add Outline\",GEBM_ADD_OUTLINE$$\n" + "$$MU-UL,\"Etch\",GEBM_ETCH$$\n" + "\n$$MU-UL,\"Point\",GEBM_PT$$\n" "$$MU-UL,\"Line\",GEBM_LINE$$\n" "$$MU-UL,\"Arrow\",GEBM_ARROW$$\n" "$$MU-UL,\"Rect\",GEBM_RECT$$\n" @@ -60,15 +74,15 @@ I64 PopUpSpriteBitMap(CColorROPU32 color,I64 width,I64 snap,F64 ip_scaler) "$$MU-UL,\"Flood Fill Not Color\",GEBM_FLOOD_FILL_NOT$$\n" "$$MU-UL,\"PolyLine\",GEBM_POLYLINE$$\n" "$$MU-UL,\"PolyPoint\",GEBM_POLYPT$$\n" - "\n$$FG,RED$$Clipboard$$FG$$\n" - "$$MU-UL,\"Cut\",GEBM_CUT$$\n" - "$$MU-UL,\"Delete\",GEBM_DELETE$$\n" - "$$MU-UL,\"Paste\",GEBM_PASTE$$\n" - "$$MU-UL,\"Paste Transparent\",GEBM_PASTE_TRANSPARENT$$\n" + "\n$$MU-UL,\"Copy to Clipboard\",GEBM_COPY$$\n" + "$$MU-UL,\"Delete to Clipboard\",GEBM_DELETE$$\n" + "$$MU-UL,\"Paste Clipboard\",GEBM_PASTE$$\n" + "$$MU-UL,\"Paste Transparent Clipboard\",GEBM_PASTE_TRANSPARENT$$\n" "\n$$MU-UL,\"Undo\",GEBM_UNDO$$\n" - "\n$$FM,PURPLE$$$$MU-UL,\"+] Vect Object Menu\",GEBM_CONT$$$$FM,LTBLUE$$\n" - "$$MU-UL,\"End\",GEBM_END$$\n" - "$$MU-UL,\"Cancel\",DOCM_CANCEL$$\n",st1,st2,width,snap,ip_scaler); + "\n$$FG,PURPLE$$$$MU-UL,\"+] Sprite Main Menu\",GEBM_MAIN_MENU$$$$FG,LTBLUE$$\n" + "$$MU-UL,\"Exit Sprite\",GEBM_EXIT$$\n" + "$$MU-UL,\"Abort Sprite\",DOCM_CANCEL$$\n",st1,st2,width,snap,ip_scaler); + DocPutS(doc,"\nRight-Click to get back to this menu."); i=PopUpMenu(doc); DocDel(doc); return i; @@ -80,17 +94,6 @@ U0 GrBMEdPrepPersistentDC(CDC *dc,I64 xx1,I64 yy1,CDC *img) GrBlot(dc,xx1,yy1,img); } -U0 GrBMEFindReplaceColor(CDC *img,I64 pattern,I64 replace) -{ - U8 *dst=img->body; - I64 d0=img->height*img->width_internal; - while (d0--) { - if (*dst==pattern) - *dst=replace; - dst++; - } -} - U0 GrBMETrimToExtents(CDC **_img,I64 *_xx1,I64 *_yy1,I64 *_xx2,I64 *_yy2,CColorROPU32 bkcolor) { CDC *img=*_img; @@ -138,40 +141,95 @@ tr_done: DCDel(img); } -I64 SpriteBitMap(CDC *dc,I64 *_xx1,I64 *_yy1,I64 *_xx2,I64 *_yy2,CDC **_img,CColorROPU32 bkcolor,I64 *_import_snap=NULL,F64 *_import_ip_scaler=NULL) + +U0 GrBMEAddOutline(CDC *img,I64 width,CColorROPU32 color,CColorROPU32 bkcolor) { - I64 i,j,mode=GEBM_LINE,color=BLACK,width=1,msg_code,p1,p2,x1,y1,x11,y11,x22,y22,new_snap=1, - result,xx1=*_xx1,yy1=*_yy1,xx2=*_xx2,yy2=*_yy2; + I64 i,j,k,c; + CColorROPU32 old_color; + CDC *src; + if (img->width && img->height) { + old_color=img->color; + img->color=color; + while (width-->0) { + src=DCExtract(img,0,0,img->width-1,img->height-1); + for (i=0;iheight;i++) + for (j=0;jwidth;j++) + if (GrPeek(src,j,i)==bkcolor) + for (k=0;k<8;k++) { + c=GrPeek(src,j+gr_x_offsets[k],i+gr_y_offsets[k]); + if (c>=0 && c!=bkcolor) { + GrPlot(img,j,i); + break; + } + } + DCDel(src); + } + img->color=old_color; + } +} + +U0 GrBMEEtch(CDC *img,I64 width,CColorROPU32 bkcolor) +{ + I64 i,j,k,c; + CColorROPU32 old_color; + CDC *src; + if (img->width && img->height) { + old_color=img->color; + img->color=bkcolor; + while (width-->0) { + src=DCExtract(img,0,0,img->width-1,img->height-1); + for (i=0;iheight;i++) + for (j=0;jwidth;j++) + if (GrPeek(src,j,i)!=bkcolor) + for (k=0;k<8;k++) { + c=GrPeek(src,j+gr_x_offsets[k],i+gr_y_offsets[k]); + if (c<0 || c==bkcolor) { + GrPlot(img,j,i); + break; + } + } + DCDel(src); + } + img->color=old_color; + } +} + +I64 SpriteBitMap(CDoc *,CDocEntry *doc_e,CDC *dc,I64 *_xx1,I64 *_yy1,I64 *_xx2,I64 *_yy2,CDC **_img,CColorROPU32 bkcolor,I64 *_ip_snap,F64 *_ip_scaler) +{ + I64 i,j,mode=GEBM_LINE,color=BLACK,width=1,msg_code,p1,p2,x1,y1,x11,y11,x22,y22,ip_snap=1, + result,xx1=*_xx1,yy1=*_yy1,xx2=*_xx2,yy2=*_yy2, + old_e_flags1=doc_e->flags1; Bool down=FALSE; - F64 new_ip_scaler=1.0; + F64 ip_scaler=1.0; U8 *st=NULL; CDC *img=*_img, - *clipboard=NULL,*undo=NULL,*dc2; + *clipboard=NULL,*undo=NULL,*dc2; SettingsPush; //See $LK,"SettingsPush","MN:SettingsPush"$ - if (_import_snap) new_snap=*_import_snap; - if (_import_ip_scaler) new_ip_scaler=*_import_ip_scaler; - SetSnap(&Fs->snap,new_snap,new_ip_scaler); + if (_ip_snap) ip_snap=*_ip_snap; + if (_ip_scaler) ip_scaler=*_ip_scaler; + SetSnap(&Fs->snap,ip_snap,ip_scaler); + doc_e->flags1|=DOCEF1_DONT_DRAW; goto bm_menu; while (TRUE) { if (sys_cur_scan_code&SCF_CTRL)//grab scroll update? GrBMEdPrepPersistentDC(dc,xx1,yy1,img); - dc->color=ROPF_DITHER+WHITE<<16+ROP_EQU+BLACK; + dc->color=ROPF_DITHER+WHITE<<16+BLACK; dc->pen_width=1; GrLineRect4(dc,xx1-1,yy1-1,xx2,yy2);//This is done little bit too often. while (msg_code=ScanMsg(&p1,&p2,1<task_title,"Sprite BitMap Menu"); + i=PopUpSpriteBitMap(color,width,ip_snap,ip_scaler); + if (i>=0) + StrCpy(Fs->task_title,DefineSub(i,"ST_SPRITE_BITMAP_MENU")); + switch (i) { case DOCM_CANCEL: - result=GE_CANCEL; + result=GE_ABORT; goto bm_done; - case GEBM_END: - result=GE_OKAY_DONE; + case GEBM_EXIT: + result=GE_EXIT; goto bm_done; - case GEBM_CONT: - result=GE_OKAY_CONT; + case GEBM_MAIN_MENU: + result=GE_CONT; goto bm_done; case GEBM_COLOR: @@ -200,7 +262,7 @@ bm_menu: if (i>=0) { j=PopUpColor("Replace Color\n",,FALSE); if (j>=0) { - GrBMEFindReplaceColor(img,i,j); + DCColorChg(img,i,j); GrBMEdPrepPersistentDC(dc,xx1,yy1,img); } } @@ -211,9 +273,24 @@ bm_menu: GrBMEdPrepPersistentDC(dc,xx1,yy1,img); goto bm_menu; + case GEBM_ADD_OUTLINE: + i=PopUpRangeI64(1,16,1,"Outline Width\n"); + if (i>=0) { + GrBMEAddOutline(img,i,color,bkcolor); + GrBMEdPrepPersistentDC(dc,xx1,yy1,img); + } + goto bm_menu; + + case GEBM_ETCH: + i=PopUpRangeI64(1,16,1,"Etch Width\n"); + if (i>=0) { + GrBMEEtch(img,i,bkcolor); + GrBMEdPrepPersistentDC(dc,xx1,yy1,img); + } + goto bm_menu; case GEBM_DITHER_COLOR: - i=PopUpDitherColor; + i=PopUpColorDither; if (i>=0) color=i; goto bm_menu; @@ -224,8 +301,8 @@ bm_menu: case GEBM_SNAP: PopUpSnap(&Fs->snap); - new_snap=Fs->snap.x; - new_ip_scaler=Fs->snap.dx; + ip_snap=Fs->snap.x; + ip_scaler=Fs->snap.dx; goto bm_menu; case GEBM_UNDO: @@ -247,7 +324,7 @@ bm_menu: case GEBM_FLOOD_FILL_NOT: case GEBM_POLYPT: case GEBM_POLYLINE: - case GEBM_CUT: + case GEBM_COPY: case GEBM_DELETE: case GEBM_PASTE: case GEBM_PASTE_TRANSPARENT: @@ -285,7 +362,7 @@ bm_menu: case GEBM_ARROW: case GEBM_RECT: case GEBM_CIRCLE: - case GEBM_CUT: + case GEBM_COPY: case GEBM_DELETE: if (down) GrBMEdPrepPersistentDC(dc,xx1,yy1,img); @@ -306,9 +383,9 @@ bm_menu: case GEBM_CIRCLE: GrCircle3(dc,x1,y1,0,1); break; - case GEBM_CUT: + case GEBM_COPY: case GEBM_DELETE: - dc->color=ROPF_DITHER+WHITE<<16+ROP_EQU+BLACK; + dc->color=ROPF_DITHER+WHITE<<16+BLACK; dc->pen_width=1; GrLineRect4(dc,x1,y1,x1,y1); break; @@ -410,7 +487,7 @@ bm_menu: GrRect(dc,x11,y11,x22-x11+1,y22-y11+1); } break; - case GEBM_CUT: + case GEBM_COPY: case GEBM_DELETE: if (down) { GrBMEdPrepPersistentDC(dc,xx1,yy1,img); @@ -428,7 +505,7 @@ bm_menu: y11=p2; y22=y1; } - dc->color=ROPF_DITHER+WHITE<<16+ROP_EQU+BLACK; + dc->color=ROPF_DITHER+WHITE<<16+BLACK; dc->pen_width=1; GrLineRect4(dc,x11,y11,x22,y22); } @@ -521,7 +598,7 @@ bm_menu: down=FALSE; GrBMEdPrepPersistentDC(dc,xx1,yy1,img); break; - case GEBM_CUT: + case GEBM_COPY: case GEBM_DELETE: if (x1flags1=old_e_flags1; + if (_ip_snap) *_ip_snap=ip_snap; + if (_ip_scaler) *_ip_scaler=ip_scaler; *_img=img; *_xx1=xx1,*_yy1=yy1,*_xx2=xx2,*_yy2=yy2; return result; diff --git a/TempleOS/Adam/Gr/CSpriteEd.CPP b/TempleOS/Adam/Gr/CSpriteEd.CPP index 247e406..2a15360 100644 --- a/TempleOS/Adam/Gr/CSpriteEd.CPP +++ b/TempleOS/Adam/Gr/CSpriteEd.CPP @@ -1,5 +1,92 @@ #help_index "Graphics/CSprite" +#define CSPRITE_WIF (WIF_ALL-WIF_BORDER-WIF_GRAB_SCROLL) + +U8 GrSpOffset[9]={0,1,2,3,0,4,5,6,7}; + +Bool GrPolyPtPlot(CSprite *root,I64 x,I64 y,I64) +{ + CSprite *tempg=CAlloc(gr_sprite_qued_base_size[GRST_PT]); + tempg->type=GRST_PT; + tempg->x1=x; + tempg->y1=y; + QueIns(tempg,root->last); + return TRUE; +} + +CSprite *GrNum2Que(CSprite *root,I64 num,I64 *x=NULL,I64 *y=NULL) +{ + I64 xx=0,yy=0; + CSprite *result=root->next; + while (result!=root && num--) { + if (result->type==GRST_SHIFT) { + xx+=result->x1; + yy+=result->y1; + } + result=result->next; + } + if (x) *x=xx; + if (y) *y=yy; + return result; +} + +CSprite *Sprite2Que(U8 *elems) +{ + I64 s; + CSprite *result=CAlloc(sizeof(CSprite)), + *tempg=elems-offset(CSprite.start), + *tempg1; + result->next=result->last=result; + while (tempg->type) { + tempg1=MAlloc(SpriteElemSize(tempg)+offset(CSprite.start)); + s=SpriteElemSize(tempg); + MemCpy(&tempg1->start,&tempg->start,s); + QueIns(tempg1,result->last); + tempg(U8 *)+=s; + } + return result; +} + +I64 SpriteCntQue(CSprite *root) +{ + CSprite *tempg=root->next; + I64 result=0; + while (tempg->type) { + result++; + tempg=tempg->next; + } + return result; +} + +U0 GrEdUpdate(CDoc *doc,CDocBin *tempb,CSprite *root) +{ + I64 i,size=gr_sprite_base_size[GRST_END]; + CSprite *tempg=root->next; + U8 *dst; + Bool unlock=DocLock(doc); + + while (tempg!=root) { + size+=SpriteElemSize(tempg); + tempg=tempg->next; + } + + Free(tempb->data); + tempb->data=dst=MAlloc(size); + tempb->size=size; + + tempg=root->next; + while (tempg!=root) { + i=SpriteElemSize(tempg); + MemCpy(dst,&tempg->start,i); + dst+=i; + tempg=tempg->next; + } + *dst=GRST_END; + + if (unlock) + DocUnlock(doc); +} + U0 GrSetOrigin(CSprite *root,I64 dx,I64 dy,I64 dz) { I64 i; @@ -24,7 +111,7 @@ U0 GrSetOrigin(CSprite *root,I64 dx,I64 dy,I64 dz) break; case GRST_BITMAP8: case GRST_ELLIPSE: - case GRST_REG_POLY: + case GRST_POLYGON: tempg->x2+=dx; tempg->y2+=dy; break; @@ -117,7 +204,7 @@ CSprite *GrTransformEllipse(I64 r[4][4],CSprite *tempg) F64 m1,a1,m2,a2,s,c,x_radius=tempg->width<<16,y_radius=tempg->height<<16; CSprite *tempg1=CAlloc(gr_sprite_qued_base_size[tempg->type]); tempg1->type=tempg->type; - if (tempg->type==GRST_REG_POLY) + if (tempg->type==GRST_POLYGON) tempg1->sides=tempg->sides; x=tempg->x2; y=tempg->y2; z=0; @@ -351,7 +438,7 @@ U0 SpriteTransform(I64 r[4][4],CSprite *root) tempg=tempg1; break; case GRST_ELLIPSE: - case GRST_REG_POLY: + case GRST_POLYGON: tempg1=GrTransformEllipse(r,tempg); QueIns(tempg1,tempg); QueRem(tempg); @@ -449,7 +536,7 @@ U0 SpriteTransform(I64 r[4][4],CSprite *root) tempg->x1=x; tempg->y1=y; tempg->z1=z; - p=(&tempg->shiftable_triangle_cnt)(U8 *)+sizeof(I32); + p=(&tempg->shiftable_tri_cnt)(U8 *)+sizeof(I32); for (i=0;ishiftable_vertex_cnt;i++,p++) { x=p->x; y=p->y; z=p->z; GrRot(r,&x,&y,&z); @@ -473,7 +560,7 @@ U0 SpriteTransform(I64 r[4][4],CSprite *root) } } -CSprite *SpriteDoc2Que(CDoc *doc,CSprite *root,I64 *cur_num) +CSprite *SpriteDoc2Que(CDoc *doc,CSprite *root,I64 *_cur_num) { CSprite *result=CAlloc(sizeof(CSprite)),*tempg; CDocEntry *doc_e=doc->root.next; @@ -485,8 +572,8 @@ CSprite *SpriteDoc2Que(CDoc *doc,CSprite *root,I64 *cur_num) tempg=GrNum2Que(root,doc_e->left_exp); if (tempg!=root) { tempg=MAllocIdentical(tempg); - if (*cur_num==doc_e->left_exp) { - *cur_num=num; + if (*_cur_num==doc_e->left_exp) { + *_cur_num=num; found=TRUE; } QueIns(tempg,result->last); @@ -496,7 +583,7 @@ CSprite *SpriteDoc2Que(CDoc *doc,CSprite *root,I64 *cur_num) doc_e=doc_e->next; } if (!found) - *cur_num=num; + *_cur_num=num; QueDel(root); Free(root); return result; @@ -509,24 +596,27 @@ U0 PickSpriteDocNew(CDoc *doc,CSprite *root,I64 old_num) I64 cur_num=0; U8 *st; + DocPutS(doc,"$$FG,PURPLE$$$$TX+CX,\"Sprite SideBar\"$$\n" + "$$LK+PU+CX,\"Click for Help\",\"FI:::/TempleOS/Doc/SpriteSideBar.TXT.Z\"$$\n\n"); + tempg=root->next; while (tempg!=root) { st=Sprite2Text(tempg); if (cur_num==old_num) { - DocPutS(doc,"$$FM,LTRED$$"); + DocPutS(doc,"$$FG,LTRED$$"); doc_e=DocPrintF(doc,"$$MU-UL,\"%Q\",%d$$\n",st,cur_num++); } else { - DocPutS(doc,"$$FM,LTBLUE$$"); + DocPutS(doc,"$$FG,LTBLUE$$"); DocPrintF(doc,"$$MU-UL,\"%Q\",%d$$\n",st,cur_num++); } Free(st); tempg=tempg->next; } if (cur_num==old_num) { - DocPutS(doc,"$$FM,LTRED$$"); + DocPutS(doc,"$$FG,LTRED$$"); doc_e=DocPrintF(doc,"$$MU-UL,\"END\",%d$$\n",cur_num); } else { - DocPutS(doc,"$$FM,LTBLUE$$"); + DocPutS(doc,"$$FG,LTBLUE$$"); DocPrintF(doc,"$$MU-UL,\"END\",%d$$\n",cur_num); } if (doc_e) @@ -549,24 +639,24 @@ U0 SpriteSideBarTask2(CTask *grand_parent) } } -U0 SpriteSideBarTask(CTask *parent,CSprite **_root,I64 *cur_num) +U0 SpriteSideBarTask(CTask *parent,CSprite **_root,I64 *_cur_num) { CDocEntry *doc_e; - CDoc *doc=DocCur; - Spawn(&SpriteSideBarTask2,parent,"CSpriteTask",Fs); + CDoc *doc=DocPut; + Spawn(&SpriteSideBarTask2,parent,"CSpriteTask",,Fs); doc->flags|=DOCF_MIN_SIZE|DOCF_FORM; while (TRUE) { - PickSpriteDocNew(doc,*_root,*cur_num); + PickSpriteDocNew(doc,*_root,*_cur_num); View; doc_e=doc->cur_entry; if (doc_e->type_u8==DOCT_MENU_VAL) - *cur_num=doc_e->left_exp; - *_root=SpriteDoc2Que(doc,*_root,cur_num); + *_cur_num=doc_e->left_exp; + *_root=SpriteDoc2Que(doc,*_root,_cur_num); DocClear(doc); } } -U8 *SpriteHexDoc2Sprite(CDoc *doc,I64 *cur_num,CTask *mem_task=NULL) +U8 *SpriteHexDoc2Sprite(CDoc *doc,I64 *_cur_num,CTask *mem_task=NULL) { I64 num=0,size=gr_sprite_base_size[GRST_END]; U8 *result,*dst; @@ -577,13 +667,13 @@ U8 *SpriteHexDoc2Sprite(CDoc *doc,I64 *cur_num,CTask *mem_task=NULL) size+=doc_e->len; doc_e=doc_e->next; } - *cur_num=0; + *_cur_num=0; dst=result=MAlloc(size,mem_task); doc_e=doc->root.next; while (doc_e!=doc) { if (doc_e->type_u8==DOCT_HEX_ED) { if (doc_e==doc->cur_entry) - *cur_num=num; + *_cur_num=num; MemCpy(dst,doc_e->data,doc_e->len); dst+=doc_e->len; num++; @@ -596,7 +686,7 @@ U8 *SpriteHexDoc2Sprite(CDoc *doc,I64 *cur_num,CTask *mem_task=NULL) return result; } -Bool SpriteTextEd(CSprite **_root,I64 *cur_num) +Bool SpriteTextEd(CSprite **_root,I64 *_cur_num) { Bool result; U8 *st; @@ -604,6 +694,8 @@ Bool SpriteTextEd(CSprite **_root,I64 *cur_num) CSprite *root=*_root,*tempg; CDocEntry *doc_e; doc->flags|=DOCF_FORM; + DocPutS(doc,"$$FG,PURPLE$$$$TX+CX,\"Sprite Edit as Text\"$$$$FG$$\n" + "$$LK+PU+CX,\"Click for Help\",\"FI:::/TempleOS/Doc/SpriteEdText.TXT.Z\"$$\n\n"); tempg=root->next; while (tempg!=root) { st=Sprite2Text(tempg); @@ -613,8 +705,8 @@ Bool SpriteTextEd(CSprite **_root,I64 *cur_num) doc_e->data=&tempg->start; tempg=tempg->next; } - if (result=ServantUser("DocDo(0x%X,0x%X);",doc,0)) { - tempg=SpriteHexDoc2Sprite(doc,cur_num); + if (result=SrvUser("DocDo(0x%X,0x%X);",doc,0)) { + tempg=SpriteHexDoc2Sprite(doc,_cur_num); QueDel(root); Free(root); root=Sprite2Que(tempg); @@ -631,29 +723,30 @@ Bool SpriteTextEd(CSprite **_root,I64 *cur_num) #define GED_SHIFT_RECTS 4 #define GED_TRANSFORM 5 #define GED_SHIFT_SUB_ORIGIN 6 -#define GED_VECT 7 +#define GED_MAIN_MENU 7 #define GED_INS_CLIPBOARD 8 #define GED_DELETE 9 -#define GED_ED 10 +#define GED_TEXT_ED 10 #define GED_SNAP 11 -#define GED_END 12 +#define GED_EXIT 12 U0 GrInit2() { - DefineLstLoad("ST_CSPRITE_ED_MENU"," \0Pick Graphically\0Set Origin\0" - "Shift Origin\0Shift Points\0Shift Rects\0Transform\0Shift SubOrigin\0Insert Object\0" - "Insert Clipboard\0Delete Object\0Edit\0Snap\0"); + DefineLstLoad("ST_SPRITE_ED_MENU","Pick Graphically\0Set Origin\0" + "Shift Origin\0Shift Points\0Shift Rects\0Transform\0Shift SubOrigin\0Main Menu\0" + "Insert Clipboard\0Delete Object\0Edit as Text\0Snap\0"); } GrInit2; -I64 PopUpSpriteEd(CSprite **_root,I64 snap,F64 ip_scaler,I64 *cur_num) +I64 PopUpSpriteEd(CSprite **_root,I64 snap,F64 ip_scaler,I64 *_cur_num) { U8 *st; CTask *pu_task; I64 i; CDoc *doc=DocNew; - DocPrintF(doc,"$$FG,PURPLE$$$$TX+CX,\"Edit Menu\"$$$$FG$$\n" - "$$MU-UL,\"Shift Points\",GED_SHIFT_PTS$$\n" + DocPrintF(doc,"$$FG,PURPLE$$$$TX+CX,\"Sprite Edit Menu\"$$\n" + "$$LK+PU+CX,\"Click for Help\",\"FI:::/TempleOS/Doc/SpriteEd.TXT.Z\"$$\n\n" + "$$FG,LTBLUE$$$$MU-UL,\"Shift Points\",GED_SHIFT_PTS$$\n" "$$MU-UL,\"Shift Points with Rects\",GED_SHIFT_RECTS$$\n" "$$MU-UL,\"Shift Origin\",GED_SHIFT_ORIGIN$$\n" "$$MU-UL,\"Set Origin\",GED_SET_ORIGIN$$\n" @@ -662,17 +755,17 @@ I64 PopUpSpriteEd(CSprite **_root,I64 snap,F64 ip_scaler,I64 *cur_num) "$$MU-UL,\"Pick or Delete Objects Graphically\",GED_PICK_GRAPHICALLY$$\n" "$$MU-UL,\"Transform\",GED_TRANSFORM$$\n" "$$MU-UL,\"Delete\",GED_DELETE$$\n" - "$$MU-UL,\"Edit as Text\",GED_ED$$\n" - "\n$$FM,PURPLE$$$$MU-UL,\"+] Vect Object Menu\",GED_VECT$$$$FM,LTBLUE$$\n" - "$$MU-UL,\"Insert Clipboard CSprite's\",GED_INS_CLIPBOARD$$\n" - "\n$$MU-UL,\"End\",GED_END$$\n" - "$$MU-UL,\"Cancel\",DOCM_CANCEL$$",snap,ip_scaler); - st=MSPrintF("SpriteSideBarTask(0x%X,0x%X,0x%X);",Fs,_root,cur_num); + "$$MU-UL,\"Edit as Text\",GED_TEXT_ED$$\n" + "$$MU-UL,\"Insert Clipboard Sprite's\",GED_INS_CLIPBOARD$$\n" + "\n$$FG,PURPLE$$$$MU-UL,\"+] Sprite Main Menu\",GED_MAIN_MENU$$$$FG,LTBLUE$$\n" + "$$MU-UL,\"Exit Sprite\",GED_EXIT$$\n" + "$$MU-UL,\"Abort Sprite\",DOCM_CANCEL$$",snap,ip_scaler); + st=MSPrintF("SpriteSideBarTask(0x%X,0x%X,0x%X);",Fs,_root,_cur_num); PopUp(st,NULL,&pu_task); Free(st); i=PopUpMenu(doc); if (TaskValidate(pu_task)) { - *_root=SpriteDoc2Que(DocCur(pu_task),*_root,cur_num); + *_root=SpriteDoc2Que(DocPut(pu_task),*_root,_cur_num); Kill(pu_task); } DocDel(doc); @@ -693,7 +786,7 @@ class CSpritePt U0 SpritePtQueNew(U8 *elems,I64 x,I64 y,CSpritePt *root) { - I64 i,cur_num=0; + I64 i,num=0; I32 *ptr; CD3I32 *p; CSpritePt *temppe; @@ -712,7 +805,7 @@ U0 SpritePtQueNew(U8 *elems,I64 x,I64 y,CSpritePt *root) temppe->yy=y; temppe->x=&tempg->x2; temppe->y=&tempg->y2; - temppe->num=cur_num; + temppe->num=num; QueIns(temppe,root->last); case GRST_TEXT: case GRST_TEXT_BOX: @@ -727,7 +820,7 @@ U0 SpritePtQueNew(U8 *elems,I64 x,I64 y,CSpritePt *root) temppe->yy=y; temppe->x=&tempg->x1; temppe->y=&tempg->y1; - temppe->num=cur_num; + temppe->num=num; QueIns(temppe,root->last); break; case GRST_SHIFT: @@ -735,7 +828,7 @@ U0 SpritePtQueNew(U8 *elems,I64 x,I64 y,CSpritePt *root) y+=tempg->y1; break; case GRST_ELLIPSE: - case GRST_REG_POLY: + case GRST_POLYGON: temppe=CAlloc(sizeof(CSpritePt)); temppe->type=GESPT_WIDTH_HEIGHT; temppe->xx=x; @@ -744,7 +837,7 @@ U0 SpritePtQueNew(U8 *elems,I64 x,I64 y,CSpritePt *root) temppe->y=&tempg->y2; temppe->w=&tempg->width; temppe->h=&tempg->height; - temppe->num=cur_num; + temppe->num=num; QueIns(temppe,root->last); case GRST_BITMAP8: temppe=CAlloc(sizeof(CSpritePt)); @@ -753,7 +846,7 @@ U0 SpritePtQueNew(U8 *elems,I64 x,I64 y,CSpritePt *root) temppe->yy=y; temppe->x=&tempg->x2; temppe->y=&tempg->y2; - temppe->num=cur_num; + temppe->num=num; QueIns(temppe,root->last); break; case GRST_POLYLINE: @@ -765,7 +858,7 @@ U0 SpritePtQueNew(U8 *elems,I64 x,I64 y,CSpritePt *root) temppe->yy=y; temppe->x=&ptr[i<<1]; temppe->y=&ptr[i<<1+1]; - temppe->num=cur_num; + temppe->num=num; QueIns(temppe,root->last); } break; @@ -777,7 +870,7 @@ U0 SpritePtQueNew(U8 *elems,I64 x,I64 y,CSpritePt *root) temppe->yy=y; temppe->x=&ptr[0]; temppe->y=&ptr[1]; - temppe->num=cur_num; + temppe->num=num; QueIns(temppe,root->last); break; case GRST_BSPLINE2: @@ -793,7 +886,7 @@ U0 SpritePtQueNew(U8 *elems,I64 x,I64 y,CSpritePt *root) temppe->x=&p[i].x; temppe->y=&p[i].y; temppe->z=&p[i].z; - temppe->num=cur_num; + temppe->num=num; QueIns(temppe,root->last); } break; @@ -807,12 +900,12 @@ U0 SpritePtQueNew(U8 *elems,I64 x,I64 y,CSpritePt *root) temppe->x=&tempg->x1; temppe->y=&tempg->y1; temppe->z=&tempg->z1; - temppe->num=cur_num; + temppe->num=num; QueIns(temppe,root->last); break; } tempg(U8 *)+=SpriteElemSize(tempg); - cur_num++; + num++; } } @@ -909,10 +1002,7 @@ Bool SpriteShiftPts(U8 *elems,I64 x,I64 y,I64 *_cur_num,I64 mode) xx2=xx=p1; yy2=yy=p2; while (TRUE) { GESPCtrlPtsDraw(dc,&root); - if (Blink) - dc->color=ROPF_DITHER+RED<<16+WHITE; - else - dc->color=ROPF_DITHER+WHITE<<16+RED; + dc->color=ROPF_DITHER+WHITE<<16+RED; GrLineRect4(dc,xx,yy,xx2,yy2); if (msg_code=ScanMsg(&p1,&p2,1<flags&(DOCF_ATTR_BY_PRT|DOCF_ATTR_BY_FILENAME), - old_ce_flags1; - F64 new_ip_scaler=1.0; - CSprite *cur_elem,*old_CSprite, - *root,*root2,*next,*last,*tempg,*insert_pt; - Fs->task_title[TASK_TITLE_LEN]=0; - U8 *old_desc=StrNew(Fs->task_title), - *old_filename=StrNew(doc->filename.name); + Bool unlock,del_down; + I64 i,r[16],msg_code,p1,p2,xx,yy,ip_snap=1, + old_e_flags1; + F64 ip_scaler=1.0; + CSprite *cur_elem,*root2,*next,*last,*tempg,*insert_pt; - WinMgrSync(2,TRUE); - SettingsPush; //See $LK,"SettingsPush","MN:SettingsPush"$ - WordStat; - if (_import_snap) new_snap=*_import_snap; - if (_import_ip_scaler) new_ip_scaler=*_import_ip_scaler; - SetSnap(&Fs->snap,new_snap,new_ip_scaler); - Fs->win_inhibit=CSPRITE_WIF; - doc_ce=doc->cur_entry; - old_ce_flags1=doc_ce->flags1; - tempb=doc_ce->bin_data; - old_size=tempb->size; - old_CSprite=tempb->data; - root=Sprite2Que(old_CSprite); - - cur_num=SpriteCntQue(root); - tempb->data=MAllocIdentical(old_CSprite); + if (_ip_snap) ip_snap=*_ip_snap; + if (_ip_scaler) ip_scaler=*_ip_scaler; + SetSnap(&Fs->snap,ip_snap,ip_scaler); + old_e_flags1=doc_e->flags1; + tempb=doc_e->bin_data; DocUnlock(doc); do { - StrCpy(Fs->task_title,old_desc); - StrCpy(doc->filename.name,old_filename); - doc->flags|=old_doc_flags; - doc_ce->flags1|=DOCEF1_DONT_DRAW; - i=PopUpSpriteEd(&root,new_snap,new_ip_scaler,&cur_num); - GrEdUpdate(doc,tempb,root); - if (i>=0) { - StrCpy(Fs->task_title,DefineSub(i,"ST_CSPRITE_ED_MENU")); - StrCpy(doc->filename.name,Fs->task_title); - doc->flags&=~(DOCF_ATTR_BY_PRT|DOCF_ATTR_BY_FILENAME); - } - switch (i) { - case GED_PICK_GRAPHICALLY: - AcctOneTimePopUp(ARf_CSPRITE_PICK_GRAPHICALLY, - "You can delete elements by\n" - "holding $$FG,GREEN$$Delete$$FG$$ and clicking.\n"); - doc_ce->flags1=old_ce_flags1; - doc->cur_sprite=tempb->data; - doc->cur_sprite_elem_num=0; - del_down=FALSE; - do { - msg_code=GetMsg(&p1,&p2,1<cur_sprite_elem_num; - cur_elem=GrNum2Que(root,cur_num); - if (cur_elem!=root) { - QueRem(cur_elem); - Free(cur_elem); - GrEdUpdate(doc,tempb,root); + if (win_actual_refresh<10) + doc_e->flags1|=DOCEF1_DONT_DRAW; + StrCpy(Fs->task_title,"Sprite Edit Menu"); + i=PopUpSpriteEd(_root,ip_snap,ip_scaler,_cur_num); + GrEdUpdate(doc,tempb,*_root); + if (0<=itask_title,DefineSub(i,"ST_SPRITE_ED_MENU")); + switch (i) { + case GED_PICK_GRAPHICALLY: + AcctOneTimePopUp(ARf_CSPRITE_PICK_GRAPHICALLY, + "You can delete elements by\n" + "holding $$FG,GREEN$$Delete$$FG$$ and clicking.\n"); + doc_e->flags1=old_e_flags1; + doc->cur_sprite=tempb->data; + doc->cur_sprite_elem_num=0; + del_down=FALSE; + do { + msg_code=GetMsg(&p1,&p2,1<cur_sprite=tempb->data; - doc->cur_sprite_elem_num=0; - if (msg_code==MSG_KEY_DOWN) - GetMsg(&p1,&p2,1<cur_sprite_elem_num; - doc->cur_sprite=NULL; - break; - case GED_SNAP: - PopUpSnap(&Fs->snap); - new_snap=Fs->snap.x; - new_ip_scaler=Fs->snap.dx; - break; - case GED_SET_ORIGIN: - doc_ce->flags1=old_ce_flags1; - GetMsg(&p1,&p2,1<flags1=old_ce_flags1; - GetMsg(&p1,&p2,1<flags1=old_ce_flags1; - if (SpriteShiftPts(tempb->data,x,y,&cur_num,i)) { - QueDel(root); - Free(root); - root=Sprite2Que(tempb->data); - } else - GrEdUpdate(doc,tempb,root); - break; - case GED_TRANSFORM: - if (PopUpTransform(r)) { - SpriteTransform(r,root); - GrEdUpdate(doc,tempb,root); - } - break; - case GED_SHIFT_SUB_ORIGIN: - doc_ce->flags1=old_ce_flags1; - insert_pt=GrNum2Que(root,cur_num); - tempg=MAlloc(gr_sprite_qued_base_size[GRST_SHIFT]); - tempg->type=GRST_SHIFT; - tempg->x1=0; - tempg->y1=0; - QueIns(tempg,insert_pt->last); - GetMsg(&p1,&p2,1<x1=p1-xx; - tempg->y1=p2-yy; - GrEdUpdate(doc,tempb,root); - } while (msg_code!=MSG_IP_L_UP); - cur_num++; - break; - case GED_INS_CLIPBOARD: - AcctOneTimePopUp(ARf_CSPRITE_INS_CLIPBOARD, - "You will probably want to shift around\n" - "the location of element groups. Use\n" - "'Insert shift sub-origin' after picking the\n" - "element to insert before. Or,\n" - "use 'shift points'.\n"); - insert_pt=GrNum2Que(root,cur_num); - unlock2=DocLock(sys_clipboard_doc); - doc_e=sys_clipboard_doc->root.next; - while (doc_e!=sys_clipboard_doc) { - if (doc_e->type_u8==DOCT_SPRITE) { - root2=Sprite2Que(doc_e->bin_data->data); - if (root2->next!=root2) { - tempg=root2->next; - while (tempg!=root2) { - cur_num++; - tempg=tempg->next; + if (msg_code==MSG_IP_L_UP && sys_cur_scan_code&SCF_DELETE || + msg_code==MSG_KEY_DOWN && p2&SCF_IP_L_DOWN && p2.u8[0]==SC_DELETE) { + *_cur_num=doc->cur_sprite_elem_num; + cur_elem=GrNum2Que(*_root,*_cur_num); + if (cur_elem!=*_root) { + QueRem(cur_elem); + Free(cur_elem); + GrEdUpdate(doc,tempb,*_root); } - next=root2->next; - last=root2->last; - insert_pt->last->next=next; - next->last=insert_pt->last; - insert_pt->last=last; - last->next=insert_pt; + doc->cur_sprite=tempb->data; + doc->cur_sprite_elem_num=0; + if (msg_code==MSG_KEY_DOWN) + GetMsg(&p1,&p2,1<cur_sprite_elem_num; + doc->cur_sprite=NULL; + break; + case GED_SNAP: + PopUpSnap(&Fs->snap); + ip_snap=Fs->snap.x; + ip_scaler=Fs->snap.dx; + break; + case GED_SET_ORIGIN: + doc_e->flags1=old_e_flags1; + GetMsg(&p1,&p2,1<flags1=old_e_flags1; + GetMsg(&p1,&p2,1<flags1=old_e_flags1; + if (SpriteShiftPts(tempb->data,x,y,_cur_num,i)) { + QueDel(*_root); + Free(*_root); + *_root=Sprite2Que(tempb->data); + } else + GrEdUpdate(doc,tempb,*_root); + break; + case GED_TRANSFORM: + if (PopUpTransform(r)) { + SpriteTransform(r,*_root); + GrEdUpdate(doc,tempb,*_root); } - doc_e=doc_e->next; - } - if (unlock2) - DocUnlock(sys_clipboard_doc); - GrEdUpdate(doc,tempb,root); - break; - case GED_VECT: - doc_ce->flags1=old_ce_flags1; - switch (SpriteVect(doc,doc_ce,&root,&cur_num,x,y,FALSE,&new_snap,&new_ip_scaler)) { - case GE_OKAY_DONE: - i=GED_END; - break; - case GE_CANCEL: - i=DOCM_CANCEL; - break; - } - break; - case GED_DELETE: - cur_elem=GrNum2Que(root,cur_num); - if (cur_elem!=root) { - QueRem(cur_elem); - Free(cur_elem); - GrEdUpdate(doc,tempb,root); - } - break; - case GED_ED: - if (SpriteTextEd(&root,&cur_num)) - GrEdUpdate(doc,tempb,root); - break; + break; + case GED_SHIFT_SUB_ORIGIN: + doc_e->flags1=old_e_flags1; + insert_pt=GrNum2Que(*_root,*_cur_num); + tempg=MAlloc(gr_sprite_qued_base_size[GRST_SHIFT]); + tempg->type=GRST_SHIFT; + tempg->x1=0; + tempg->y1=0; + QueIns(tempg,insert_pt->last); + GetMsg(&p1,&p2,1<x1=p1-xx; + tempg->y1=p2-yy; + GrEdUpdate(doc,tempb,*_root); + } while (msg_code!=MSG_IP_L_UP); + *_cur_num+=1; + break; + case GED_INS_CLIPBOARD: + AcctOneTimePopUp(ARf_CSPRITE_INS_CLIPBOARD, + "You will probably want to shift around\n" + "the location of element groups. Use\n" + "'Insert shift sub-origin' after picking the\n" + "element to insert before. Or,\n" + "use 'shift points'.\n"); + insert_pt=GrNum2Que(*_root,*_cur_num); + unlock=DocLock(sys_clipboard_doc); + doc_e2=sys_clipboard_doc->root.next; + while (doc_e2!=sys_clipboard_doc) { + if (doc_e2->type_u8==DOCT_SPRITE) { + root2=Sprite2Que(doc_e2->bin_data->data); + if (root2->next!=root2) { + tempg=root2->next; + while (tempg!=root2) { + *_cur_num+=1; + tempg=tempg->next; + } + next=root2->next; + last=root2->last; + insert_pt->last->next=next; + next->last=insert_pt->last; + insert_pt->last=last; + last->next=insert_pt; + } + Free(root2); + } + doc_e2=doc_e2->next; + } + if (unlock) + DocUnlock(sys_clipboard_doc); + GrEdUpdate(doc,tempb,*_root); + break; + case GED_DELETE: + cur_elem=GrNum2Que(*_root,*_cur_num); + if (cur_elem!=*_root) { + QueRem(cur_elem); + Free(cur_elem); + GrEdUpdate(doc,tempb,*_root); + } + break; + case GED_TEXT_ED: + if (SpriteTextEd(_root,_cur_num)) + GrEdUpdate(doc,tempb,*_root); + break; + } } - } while (i!=DOCM_CANCEL && i!=GED_END); - doc_ce->flags1=old_ce_flags1; - DocLock(doc); - if (i==GED_END) - Free(old_CSprite); - else { - Free(tempb->data); - tempb->data=old_CSprite; - tempb->size=old_size; + } while (i!=DOCM_CANCEL && i!=GED_EXIT && i!=GED_MAIN_MENU); + doc_e->flags1=old_e_flags1; + + if (_ip_snap) *_ip_snap=ip_snap; + if (_ip_scaler) *_ip_scaler=ip_scaler; + switch (i) { + case DOCM_CANCEL: return GE_ABORT; + case GED_EXIT: return GE_EXIT; + case GED_MAIN_MENU: return GE_CONT; } - if (unlock) - DocUnlock(doc); - if (_import_snap) *_import_snap=new_snap; - if (_import_ip_scaler) *_import_ip_scaler=new_ip_scaler; - QueDel(root); - Free(root); - StrCpy(Fs->task_title,old_desc); - Free(old_desc); - StrCpy(doc->filename.name,old_filename); - Free(old_filename); - SettingsPop; - doc->flags|=old_doc_flags; } + #help_index "Graphics" diff --git a/TempleOS/Adam/Gr/CSpriteVect.CPP b/TempleOS/Adam/Gr/CSpriteMain.CPP similarity index 66% rename from TempleOS/Adam/Gr/CSpriteVect.CPP rename to TempleOS/Adam/Gr/CSpriteMain.CPP index f1107c1..fb10032 100644 --- a/TempleOS/Adam/Gr/CSpriteVect.CPP +++ b/TempleOS/Adam/Gr/CSpriteMain.CPP @@ -1,33 +1,32 @@ #help_index "Graphics/CSprite" -#define CSPRITE_WIF (WIF_ALL-WIF_BORDER-WIF_GRAB_SCROLL) #define GRST_MENU -2 #define GRST_SNAP -3 -#define GRST_INS_SCREEN_BITMAP -5 +#define GRST_INS_SCREEN_BITMAP -5 #define GRST_INS_TRANSPARENT_SCREEN_BITMAP -6 -#define GRST_ED -7 +#define GRST_ED_MENU -7 +#define GRST_EXIT -8 -I64 PopUpSpriteVect(Bool new_sprite,CSprite **_root,I64 snap,F64 ip_scaler,I64 *cur_num) +I64 PopUpSpriteMain(CSprite **_root,I64 snap,F64 ip_scaler,I64 *_cur_num) { U8 *st; CTask *pu_task; I64 i; CDoc *doc=DocNew; - DocPrintF(doc,"$$FG,PURPLE$$$$TX+CX,\"Vect Object Menu\"$$$$FG$$\n" - "$$FG,RED$$Settings$$FG$$\n" - "$$MU-UL,\"Color (4-bit)\",GRST_COLOR8$$\n" + DocPrintF(doc,"$$FG,PURPLE$$$$TX+CX,\"Sprite Main Menu\"$$\n" + "$$LK+PU+CX,\"Click for Help\",\"FI:::/TempleOS/Doc/SpriteMain.TXT.Z\"$$\n" + "\n$$FG,LTBLUE$$$$MU-UL,\"Color (4-bit)\",GRST_COLOR8$$\n" "$$MU-UL,\"Dither Color (4-bit)\",GRST_DITHER_COLOR8$$\n" "$$MU-UL,\"Width\",GRST_WIDTH$$\n" "$$MU-UL,\"Snap %d %5.3f\",GRST_SNAP$$\n" "$$MU-UL,\"Planar Symmetry\",GRST_PLANAR_SYMMETRY$$\n" - "\n$$FG,RED$$Objects$$FG$$\n" - "$$MU-UL,\"Point\",GRST_PT$$\n" + "\n$$MU-UL,\"Point\",GRST_PT$$\n" "$$MU-UL,\"Line\",GRST_LINE$$\n" "$$MU-UL,\"Arrow\",GRST_ARROW$$\n" "$$MU-UL,\"Rect\",GRST_RECT$$\n" "$$MU-UL,\"Circle\",GRST_CIRCLE$$\n" "$$MU-UL,\"Ellipse\",GRST_ELLIPSE$$\n" - "$$MU-UL,\"Reg Polygon\",GRST_REG_POLY$$\n" + "$$MU-UL,\"Polygon\",GRST_POLYGON$$\n" "$$MU-UL,\"Text\",GRST_TEXT$$\n" "$$MU-UL,\"Text Box\",GRST_TEXT_BOX$$\n" "$$MU-UL,\"Text Diamond\",GRST_TEXT_DIAMOND$$\n" @@ -39,115 +38,60 @@ I64 PopUpSpriteVect(Bool new_sprite,CSprite **_root,I64 snap,F64 ip_scaler,I64 * "$$MU-UL,\"BSpline3\",GRST_BSPLINE3$$\n" "$$MU-UL,\"BSpline2 Closed\",GRST_BSPLINE2_CLOSED$$\n" "$$MU-UL,\"BSpline3 Closed\",GRST_BSPLINE3_CLOSED$$\n" - "$$MU-UL,\"Insert Screen BitMap\",GRST_INS_SCREEN_BITMAP$$\n" - "$$MU-UL,\"Insert Transparent Screen BitMap\",GRST_INS_TRANSPARENT_SCREEN_BITMAP$$\n" - "$$FM,PURPLE$$$$MU-UL,\"+] Create/Edit 3D Mesh\",GRST_MESH$$\n" - "$$MU-UL,\"+] Create/Edit Shiftable 3D Mesh\",GRST_SHIFTABLE_MESH$$\n" - "$$MU-UL,\"+] Create/Edit as BitMap\",GRST_BITMAP8$$\n" - "\n$$FG,RED$$Advanced$$FG$$\n" - "$$MU-UL,\"Transform On (For use with icons)\",GRST_TRANSFORM_ON$$\n" - "$$MU-UL,\"Transform Off(For use with icons)\",GRST_TRANSFORM_OFF$$\n" + "$$MU-UL,\"Insert Screen-Captured BitMap\",GRST_INS_SCREEN_BITMAP$$\n" + "$$MU-UL,\"Insert Transparent Screen-Captured BitMap\",GRST_INS_TRANSPARENT_SCREEN_BITMAP$$\n" + "$$FG,PURPLE$$$$MU-UL,\"+] Create or Edit 3D Mesh\",GRST_MESH$$\n" + "$$MU-UL,\"+] Create or Edit Shiftable 3D Mesh\",GRST_SHIFTABLE_MESH$$\n" + "$$MU-UL,\"+] Convert to BitMap or Edit BitMap\",GRST_BITMAP8$$$$FG,LTBLUE$$\n" + "\n$$MU-UL,\"Transform On (for use with 3D icons)\",GRST_TRANSFORM_ON$$\n" + "$$MU-UL,\"Transform Off (for use with 3D icons)\",GRST_TRANSFORM_OFF$$\n" "\n" - "$$FM,PURPLE$$$$MU-UL,\"+] Edit Menu\",GRST_ED$$$$FM,LTBLUE$$\n" - "$$MU-UL,\"End\",GRST_END$$\n",snap,ip_scaler); - if (new_sprite) - DocPutS(doc,"$$MU-UL,\"Cancel\",DOCM_CANCEL$$\n"); + "$$FG,PURPLE$$$$MU-UL,\"+] Sprite Edit Menu\",GRST_ED_MENU$$$$FG,LTBLUE$$\n" + "$$MU-UL,\"Exit Sprite\",GRST_EXIT$$\n" + "$$MU-UL,\"Abort Sprite\",DOCM_CANCEL$$\n",snap,ip_scaler); DocPutS(doc,"\nRight-Click to get back to this menu."); - st=MSPrintF("SpriteSideBarTask(0x%X,0x%X,0x%X);",Fs,_root,cur_num); + st=MSPrintF("SpriteSideBarTask(0x%X,0x%X,0x%X);",Fs,_root,_cur_num); PopUp(st,NULL,&pu_task); Free(st); i=PopUpMenu(doc); if (TaskValidate(pu_task)) { - *_root=SpriteDoc2Que(DocCur(pu_task),*_root,cur_num); + *_root=SpriteDoc2Que(DocPut(pu_task),*_root,_cur_num); Kill(pu_task); } DocDel(doc); return i; } -U8 GrSpOffset[9]={0,1,2,3,0,4,5,6,7}; - -Bool GrPolyPtPlot(CSprite *root,I64 x,I64 y,I64) +Bool PopUpExtents(I64 *_x1,I64 *_x2,I64 *_y1,I64 *_y2) { - CSprite *tempg=CAlloc(gr_sprite_qued_base_size[GRST_PT]); - tempg->type=GRST_PT; - tempg->x1=x; - tempg->y1=y; - QueIns(tempg,root->last); - return TRUE; -} + I64 i; + CDoc *doc=DocNew; + CDocEntry *doc_e; + doc_e=DocPutS(doc," $$DA,32,\"x1:%d\"$$\n"); + doc_e->data=_x1; + DocDataFmt(doc_e); + doc_e=DocPutS(doc," $$DA,32,\"x2:%d\"$$\n"); + doc_e->data=_x2; + DocDataFmt(doc_e); + doc_e=DocPutS(doc," $$DA,32,\"y1:%d\"$$\n"); + doc_e->data=_y1; + DocDataFmt(doc_e); + doc_e=DocPutS(doc," $$DA,32,\"y2:%d\"$$\n\n"); + doc_e->data=_y2; + DocDataFmt(doc_e); -CSprite *SpriteQueFrom(CSprite *root,U32 *_size=NULL) -{ - I64 s,size=gr_sprite_base_size[GRST_END]; - CSprite *result,*tempg; - U8 *dst; - - tempg=root->next; - while (tempg!=root) { - size+=SpriteElemSize(tempg); - tempg=tempg->next; - } - result=MAlloc(size); - dst=result; - tempg=root->next; - while (tempg!=root) { - s=SpriteElemSize(tempg); - MemCpy(dst,&tempg->start,s); - dst+=s; - tempg=tempg->next; - } - *dst=GRST_END; - if (_size) *_size=size; - return result; -} - -CSprite *Sprite2Que(U8 *elems) -{ - I64 s; - CSprite *result=CAlloc(sizeof(CSprite)), - *tempg=elems-offset(CSprite.start), - *tempg1; - result->next=result->last=result; - while (tempg->type) { - tempg1=MAlloc(SpriteElemSize(tempg)+offset(CSprite.start)); - s=SpriteElemSize(tempg); - MemCpy(&tempg1->start,&tempg->start,s); - QueIns(tempg1,result->last); - tempg(U8 *)+=s; - } - return result; -} - -CSprite *GrNum2Que(CSprite *root,I64 num,I64 *x=NULL,I64 *y=NULL) -{ - I64 xx=0,yy=0; - CSprite *result=root->next; - while (result!=root && num--) { - if (result->type==GRST_SHIFT) { - xx+=result->x1; - yy+=result->y1; - } - result=result->next; - } - if (x) *x=xx; - if (y) *y=yy; - return result; -} - -U0 GrEdUpdate(CDoc *doc,CDocBin *tempb,CSprite *root) -{ - Bool unlock=DocLock(doc); - Free(tempb->data); - tempb->data=SpriteQueFrom(root,&tempb->size); - if (unlock) - DocUnlock(doc); + DocPutS(doc," $$BT,\"Use These Extents\",TRUE$$"); + DocPutS(doc,"$$CM,3,0$$$$BT,\"Drag-Out New Extents\",FALSE$$\n\n"); + do i=PopUpMenu(doc); + while (i!=FALSE && i!=TRUE); + DocDel(doc); + return i; } U0 GrSetSettings(CDC *dc,CSprite *root,I64 cur_num,CColorROPU32 *_color,I64 *_width,I64 x,I64 y) { CSprite *tempg; - *_color=ROP_EQU|BLACK; + *_color=BLACK; *_width=1; DCRst(dc); @@ -189,13 +133,13 @@ U0 GrScreenInit(CDC *dc,I64,I64) dc->pen_width=1; xx=dc->sym.sny*8192; yy=-dc->sym.snx*8192; - dc->color=ROP_EQU+RED; + dc->color=RED; GrLine3(dc,dc->sym.sx-xx.i32[1],dc->sym.sy-yy.i32[1],0, dc->sym.sx+xx.i32[1],dc->sym.sy+yy.i32[1],0,3,0); - dc->color=ROP_EQU+WHITE; + dc->color=WHITE; GrLine3(dc,dc->sym.sx-xx.i32[1],dc->sym.sy-yy.i32[1],0, dc->sym.sx+xx.i32[1],dc->sym.sy+yy.i32[1],0,3,1); - dc->color=ROP_EQU+BLACK; + dc->color=BLACK; GrLine3(dc,dc->sym.sx-xx.i32[1],dc->sym.sy-yy.i32[1],0, dc->sym.sx+xx.i32[1],dc->sym.sy+yy.i32[1],0,3,2); dc->flags|=DCF_SYMMETRY; @@ -204,48 +148,49 @@ U0 GrScreenInit(CDC *dc,I64,I64) dc->pen_width=old_pen_width; } -I64 SpriteVect(CDoc *doc,CDocEntry *doc_e,CSprite **_root,I64 *cur_num,I64 x,I64 y,Bool new_sprite,I64 *_import_snap=NULL,F64 *_import_ip_scaler=NULL) +I64 SpriteMain(CDoc *doc,CDocEntry *doc_e,I64 x,I64 y) { I64 result,i,msg_code,z,x1,y1,z1,x2,y2,x3,y3,p1,p2,xx1,yy1,xx2,yy2, - num,old_width,size,eletype=GRST_MENU,width,new_snap=1, - old_doc_flags=doc->flags&(DOCF_ATTR_BY_PRT|DOCF_ATTR_BY_FILENAME), - old_ce_flags1=doc_e->flags1,old_flags; + num,old_width,size,eletype=GRST_MENU,width,ip_snap=1,cur_num, + old_border_src=Fs->border_src, + old_title_src =Fs->title_src, + old_e_flags1=doc_e->flags1,old_flags; CColorROPU32 bm_bkcolor,color; - CSprite root2,*tempg,*tempg1,*tempg2,*insert_pt; - CDC *dc=DCAlias(gr_dc2,Fs), - *dc2=DCAlias(gr_dc2,sys_winmgr_task), - *dc3, - *img; + CSprite *root,root2,*tempg,*tempg1,*tempg2,*insert_pt; + CDC *dc=DCAlias(gr_dc,Fs), + *dc2=DCAlias(gr_dc,sys_winmgr_task), + *dc3, + *img; CD3I32 *p; CDocBin *tempb=doc_e->bin_data; - F64 a1,a2,new_ip_scaler=1.0; - Fs->task_title[TASK_TITLE_LEN]=0; + F64 a1,a2,ip_scaler=1.0; I32 *ptr,*mesh,*old_mesh; - U8 *st,*old_desc=StrNew(Fs->task_title), - *old_filename=StrNew(doc->filename.name); + U8 *st,*old_task_title=StrNew(Fs->task_title); - WinMgrSync(2,TRUE); SettingsPush; //See $LK,"SettingsPush","MN:SettingsPush"$ + WordStat; + WinMgrSync(2,TRUE); dc2->flags|=DCF_ON_TOP; - insert_pt=GrNum2Que(*_root,*cur_num,&x1,&y1); + root=Sprite2Que(tempb->data); + cur_num=SpriteCntQue(root); + insert_pt=GrNum2Que(root,cur_num,&x1,&y1); x+=x1; y+=y1; - if (_import_snap) new_snap=*_import_snap; - if (_import_ip_scaler) new_ip_scaler=*_import_ip_scaler; - SetSnap(&Fs->snap,new_snap,new_ip_scaler); + SetSnap(&Fs->snap,ip_snap,ip_scaler); Fs->win_inhibit=CSPRITE_WIF; while (TRUE) { - GrSetSettings(dc,*_root,*cur_num,&color,&width,x,y); + GrSetSettings(dc,root,cur_num,&color,&width,x,y); DCFill; if (eletype==GRST_MENU) { - doc_e->flags1|=DOCEF1_DONT_DRAW; - StrCpy(Fs->task_title,old_desc); - StrCpy(doc->filename.name,old_filename); - doc->flags|=old_doc_flags; + if (win_actual_refresh<10) + doc_e->flags1|=DOCEF1_DONT_DRAW; + StrCpy(Fs->task_title,old_task_title); + Fs->border_src=old_border_src; + Fs->title_src =old_title_src; - eletype=PopUpSpriteVect(new_sprite,_root,new_snap,new_ip_scaler,cur_num); - GrEdUpdate(doc,tempb,*_root); - insert_pt=GrNum2Que(*_root,*cur_num); + eletype=PopUpSpriteMain(&root,ip_snap,ip_scaler,&cur_num); + GrEdUpdate(doc,tempb,root); + insert_pt=GrNum2Que(root,cur_num); switch (eletype) { case GRST_FLOOD_FILL: case GRST_FLOOD_FILL_NOT: @@ -262,9 +207,10 @@ I64 SpriteVect(CDoc *doc,CDocEntry *doc_e,CSprite **_root,I64 *cur_num,I64 x,I64 "Right-click to turn-off symmetry.\n"); break; } - doc_e->flags1=old_ce_flags1; + doc_e->flags1=old_e_flags1; } + Fs->title_src=TTS_CONST; //Violates TTS_LOCKED_CONST if (eletype<0) switch (eletype) { case GRST_INS_SCREEN_BITMAP: @@ -275,52 +221,64 @@ I64 SpriteVect(CDoc *doc,CDocEntry *doc_e,CSprite **_root,I64 *cur_num,I64 x,I64 break; } else - StrCpy(Fs->task_title,DefineSub(eletype,"ST_CSPRITE_TYPES")); - StrCpy(doc->filename.name,Fs->task_title); - doc->flags&=~(DOCF_ATTR_BY_PRT|DOCF_ATTR_BY_FILENAME); + StrCpy(Fs->task_title,DefineSub(eletype,"ST_SPRITE_TYPES")); + Fs->border_src=BDS_CONST; switch (eletype) { case GRST_COLOR8: doc_e->flags1|=DOCEF1_DONT_DRAW; i=PopUpColor(,,FALSE); if (i>=0) { - color=ROP_EQU|i; + color=i; tempg=MAlloc(gr_sprite_qued_base_size[GRST_COLOR8]); tempg->type=GRST_COLOR8; tempg->color8=color; QueIns(tempg,insert_pt->last); - GrEdUpdate(doc,tempb,*_root); - *cur_num+=1; + GrEdUpdate(doc,tempb,root); + cur_num++; } - doc_e->flags1=old_ce_flags1; + doc_e->flags1=old_e_flags1; eletype=GRST_MENU; break; case GRST_DITHER_COLOR8: doc_e->flags1|=DOCEF1_DONT_DRAW; - i=PopUpDitherColor; + i=PopUpColorDither; if (i>=0) { - color=ROP_EQU|i; + color=i; tempg=MAlloc(gr_sprite_qued_base_size[GRST_DITHER_COLOR8]); tempg->type=GRST_DITHER_COLOR8; tempg->dither_color8=color.c0.color|color.c1.color<<8; QueIns(tempg,insert_pt->last); - GrEdUpdate(doc,tempb,*_root); - *cur_num+=1; + GrEdUpdate(doc,tempb,root); + cur_num++; } - doc_e->flags1=old_ce_flags1; + doc_e->flags1=old_e_flags1; eletype=GRST_MENU; break; + case GRST_ED_MENU: + switch (SpriteEd(doc,doc_e,x,y,&root,&cur_num,&ip_snap,&ip_scaler)) { + case GE_ABORT: + eletype=DOCM_CANCEL; + break; + case GE_EXIT: + eletype=GRST_EXIT; + break; + case GE_CONT: + eletype=GRST_MENU; + break; + } + break; case GRST_MESH: doc_e->flags1|=DOCEF1_DONT_DRAW; tempg1=insert_pt; - if (tempg1!=*_root && tempg1->type==GRST_MESH) + if (tempg1!=root && tempg1->type==GRST_MESH) old_mesh=&tempg1->vertex_cnt; - else if (tempg1!=*_root && tempg1->type==GRST_SHIFTABLE_MESH) { + else if (tempg1!=root && tempg1->type==GRST_SHIFTABLE_MESH) { x1=tempg1->x1; y1=tempg1->y1; z1=tempg1->z1; - p=(&tempg1->shiftable_triangle_cnt)(U8 *)+sizeof(I32); + p=(&tempg1->shiftable_tri_cnt)(U8 *)+sizeof(I32); for (i=0;ishiftable_vertex_cnt;i++,p++) { p->x+=x1; p->y+=y1; @@ -335,67 +293,76 @@ I64 SpriteVect(CDoc *doc,CDocEntry *doc_e,CSprite **_root,I64 *cur_num,I64 x,I64 MemCpy(&tempg->vertex_cnt,mesh,size); Free(mesh); QueIns(tempg,insert_pt->last); - GrEdUpdate(doc,tempb,*_root); + GrEdUpdate(doc,tempb,root); if (old_mesh) { insert_pt=tempg; QueRem(tempg1); Free(tempg1); - GrEdUpdate(doc,tempb,*_root); + GrEdUpdate(doc,tempb,root); } else - *cur_num+=1; + cur_num++; } else if (old_mesh && tempg1->type==GRST_SHIFTABLE_MESH) { x1=tempg1->x1; y1=tempg1->y1; z1=tempg1->z1; - p=(&tempg1->shiftable_triangle_cnt)(U8 *)+sizeof(I32); + p=(&tempg1->shiftable_tri_cnt)(U8 *)+sizeof(I32); for (i=0;ishiftable_vertex_cnt;i++,p++) { p->x-=x1; p->y-=y1; p->z-=z1; } - } - doc_e->flags1=old_ce_flags1; + } + doc_e->flags1=old_e_flags1; eletype=GRST_MENU; break; case GRST_SHIFTABLE_MESH: doc_e->flags1|=DOCEF1_DONT_DRAW; if (PopUpNoYes("Use same origin?\n")) { - doc_e->flags1=old_ce_flags1; + doc_e->flags1=old_e_flags1; p1=x; p2=y; goto ei_shiftable_mesh; } PopUpOk("Select Origin.\n"); - doc_e->flags1=old_ce_flags1; + doc_e->flags1=old_e_flags1; break; case GRST_INS_SCREEN_BITMAP: doc_e->flags1|=DOCEF1_DONT_DRAW; PopUpOk("Drag-out a rect for the extents of the\n" - "bitmap.\n"); - doc_e->flags1=old_ce_flags1; + "bitmap.\n"); + doc_e->flags1=old_e_flags1; break; case GRST_BITMAP8: - case GRST_INS_TRANSPARENT_SCREEN_BITMAP: doc_e->flags1|=DOCEF1_DONT_DRAW; i=PopUpColor("Background Color\n\n",,FALSE); if (i<0) eletype=GRST_MENU; else { bm_bkcolor=i; - if (eletype!=GRST_INS_TRANSPARENT_SCREEN_BITMAP) { - GrEdUpdate(doc,tempb,*_root); - SpriteExtents(tempb->data,&xx1,&xx2,&yy1,&yy2); - if (xx1<=xx2 && yy1<=yy2 && PopUpNoYes("Use extents of the CSprite?\n")) { - doc_e->flags1=old_ce_flags1; - old_width=dc->pen_width; - xx1+=x; yy1+=y; - xx2+=x; yy2+=y; - goto ei_bitmap; - } + GrEdUpdate(doc,tempb,root); + SpriteExtents(tempb->data,&xx1,&xx2,&yy1,&yy2); + if (!(xx1<=xx2 && yy1<=yy2)) + xx1=xx2=yy1=yy2=0; + if (PopUpExtents(&xx1,&xx2,&yy1,&yy2)) { + doc_e->flags1=old_e_flags1; + old_width=dc->pen_width; + xx1+=x; yy1+=y; + xx2+=x; yy2+=y; + goto ei_bitmap; } + } + doc_e->flags1=old_e_flags1; + break; + case GRST_INS_TRANSPARENT_SCREEN_BITMAP: + doc_e->flags1|=DOCEF1_DONT_DRAW; + i=PopUpColor("Color to Become Transparent\n\n",,FALSE); + if (i<0) + eletype=GRST_MENU; + else { + bm_bkcolor=i; PopUpOk("Drag-out a rect for the extents of the\n" "bitmap.\n"); } - doc_e->flags1=old_ce_flags1; + doc_e->flags1=old_e_flags1; break; case GRST_WIDTH: doc_e->flags1|=DOCEF1_DONT_DRAW; @@ -406,10 +373,10 @@ I64 SpriteVect(CDoc *doc,CDocEntry *doc_e,CSprite **_root,I64 *cur_num,I64 x,I64 tempg->type=GRST_WIDTH; tempg->width=width; QueIns(tempg,insert_pt->last); - GrEdUpdate(doc,tempb,*_root); - *cur_num+=1; + GrEdUpdate(doc,tempb,root); + cur_num++; } - doc_e->flags1=old_ce_flags1; + doc_e->flags1=old_e_flags1; eletype=GRST_MENU; break; case GRST_TRANSFORM_ON: @@ -420,36 +387,36 @@ I64 SpriteVect(CDoc *doc,CDocEntry *doc_e,CSprite **_root,I64 *cur_num,I64 x,I64 else tempg->type=GRST_TRANSFORM_OFF; QueIns(tempg,insert_pt->last); - GrEdUpdate(doc,tempb,*_root); - *cur_num+=1; + GrEdUpdate(doc,tempb,root); + cur_num++; eletype=GRST_MENU; break; - case GRST_REG_POLY: + case GRST_POLYGON: doc_e->flags1|=DOCEF1_DONT_DRAW; i=PopUpRangeI64(3,16,1,"Num of Sides\n"); - doc_e->flags1=old_ce_flags1; + doc_e->flags1=old_e_flags1; if (i<3) eletype=GRST_MENU; break; case GRST_SNAP: doc_e->flags1|=DOCEF1_DONT_DRAW; PopUpSnap(&Fs->snap); - new_snap=Fs->snap.x; - new_ip_scaler=Fs->snap.dx; - doc_e->flags1=old_ce_flags1; + ip_snap=Fs->snap.x; + ip_scaler=Fs->snap.dx; + doc_e->flags1=old_e_flags1; eletype=GRST_MENU; break; case GRST_TEXT: doc_e->flags1|=DOCEF1_DONT_DRAW; st=PopUpMGetS("Enter text and press .\n"); - doc_e->flags1=old_ce_flags1; + doc_e->flags1=old_e_flags1; if (st && *st) { x1=0; y1=0; do { - dc->color=color&COLORROP_NO_ROP0_MASK|ROP_EQU; + dc->color=color&COLORROP_NO_ROP0_MASK; GrPutS3(dc,x1,y1,0,st); msg_code=GetMsg(&p1,&p2, - 1<y1=y1-y; StrCpy(tempg->st,st); QueIns(tempg,insert_pt->last); - GrEdUpdate(doc,tempb,*_root); - *cur_num+=1; + GrEdUpdate(doc,tempb,root); + cur_num++; } Free(st); eletype=GRST_MENU; @@ -468,14 +435,14 @@ I64 SpriteVect(CDoc *doc,CDocEntry *doc_e,CSprite **_root,I64 *cur_num,I64 x,I64 case GRST_TEXT_BOX: doc_e->flags1|=DOCEF1_DONT_DRAW; st=PopUpMGetS("Enter text and press .\n"); - doc_e->flags1=old_ce_flags1; + doc_e->flags1=old_e_flags1; if (st && *st) { x1=0; y1=0; do { - dc->color=color&COLORROP_NO_ROP0_MASK|ROP_EQU; + dc->color=color&COLORROP_NO_ROP0_MASK; GrTextBox3(dc,x1,y1,0,st); msg_code=GetMsg(&p1,&p2, - 1<y1=y1-y; StrCpy(tempg->st,st); QueIns(tempg,insert_pt->last); - GrEdUpdate(doc,tempb,*_root); - *cur_num+=1; + GrEdUpdate(doc,tempb,root); + cur_num++; } Free(st); eletype=GRST_MENU; @@ -494,14 +461,14 @@ I64 SpriteVect(CDoc *doc,CDocEntry *doc_e,CSprite **_root,I64 *cur_num,I64 x,I64 case GRST_TEXT_DIAMOND: doc_e->flags1|=DOCEF1_DONT_DRAW; st=PopUpMGetS("Enter text and press .\n"); - doc_e->flags1=old_ce_flags1; + doc_e->flags1=old_e_flags1; if (st && *st) { x1=0; y1=0; do { - dc->color=color&COLORROP_NO_ROP0_MASK|ROP_EQU; + dc->color=color&COLORROP_NO_ROP0_MASK; GrTextDiamond3(dc,x1,y1,0,st); msg_code=GetMsg(&p1,&p2, - 1<y1=y1-y; StrCpy(tempg->st,st); QueIns(tempg,insert_pt->last); - GrEdUpdate(doc,tempb,*_root); - *cur_num+=1; + GrEdUpdate(doc,tempb,root); + cur_num++; } Free(st); eletype=GRST_MENU; break; } - - if (eletype!=GRST_MENU) { ei_restart: GrScreenInit(dc,x,y); - if (eletype==GRST_END) { - result=GE_OKAY_DONE; - goto ei_done; - } else if (eletype==GRST_ED) { - result=GE_OKAY_CONT; + if (eletype==GRST_EXIT) { + result=GE_EXIT; goto ei_done; } else if (eletype==DOCM_CANCEL) { - result=GE_CANCEL; + result=GE_ABORT; goto ei_done; } msg_code=GetMsg(&p1,&p2,1<type=GRST_PLANAR_SYMMETRY; QueIns(tempg,insert_pt->last); - GrEdUpdate(doc,tempb,*_root); - *cur_num+=1; + GrEdUpdate(doc,tempb,root); + cur_num++; eletype=GRST_MENU; } else eletype=GRST_MENU; } if (msg_code==MSG_KEY_DOWN) { if (p1==CH_ESC) { - result=GE_OKAY_DONE; + result=GE_EXIT; goto ei_done; } else if (p1==CH_SHIFT_ESC) { - result=GE_CANCEL; + result=GE_ABORT; goto ei_done; } else goto ei_restart; @@ -561,14 +523,14 @@ ei_restart: x1=p1; y1=p2; x2=p1; y2=p2; do { - dc->color=color&COLORROP_NO_ROP0_MASK|ROP_EQU; + dc->color=color&COLORROP_NO_ROP0_MASK; GrLine3(dc,x1,y1,0,x2,y2,0); msg_code=GetMsg(&p1,&p2, - 1<color=color&COLORROP_NO_ROP0_MASK|ROP_EQU; + dc->color=color&COLORROP_NO_ROP0_MASK; GrLine3(dc,x1,y1,0,x2,y2,0); tempg=MAlloc(gr_sprite_qued_base_size[GRST_LINE]); tempg->type=GRST_LINE; @@ -577,21 +539,21 @@ ei_restart: tempg->x2=x2-x; tempg->y2=y2-y; QueIns(tempg,insert_pt->last); - GrEdUpdate(doc,tempb,*_root); - *cur_num+=1; + GrEdUpdate(doc,tempb,root); + cur_num++; break; case GRST_ARROW: x1=p1; y1=p2; x2=p1; y2=p2; do { - dc->color=color&COLORROP_NO_ROP0_MASK|ROP_EQU; + dc->color=color&COLORROP_NO_ROP0_MASK; GrArrow3(dc,x1,y1,0,x2,y2,0); msg_code=GetMsg(&p1,&p2, - 1<color=color&COLORROP_NO_ROP0_MASK|ROP_EQU; + dc->color=color&COLORROP_NO_ROP0_MASK; GrArrow3(dc,x1,y1,0,x2,y2,0); tempg=MAlloc(gr_sprite_qued_base_size[GRST_ARROW]); tempg->type=GRST_ARROW; @@ -600,8 +562,8 @@ ei_restart: tempg->x2=x2-x; tempg->y2=y2-y; QueIns(tempg,insert_pt->last); - GrEdUpdate(doc,tempb,*_root); - *cur_num+=1; + GrEdUpdate(doc,tempb,root); + cur_num++; break; case GRST_PLANAR_SYMMETRY: old_width=dc->pen_width; @@ -611,10 +573,10 @@ ei_restart: x1=p1; y1=p2; x2=p1; y2=p2; do { - dc->color=ROPF_DITHER+WHITE<<16+ROP_EQU+BLACK; + dc->color=ROPF_DITHER+WHITE<<16+BLACK; GrLine3(dc,x1,y1,0,x2,y2,0); msg_code=GetMsg(&p1,&p2, - 1<x2=x2-x; tempg->y2=y2-y; QueIns(tempg,insert_pt->last); - GrEdUpdate(doc,tempb,*_root); - *cur_num+=1; + GrEdUpdate(doc,tempb,root); + cur_num++; dc->flags=old_flags&DCF_SYMMETRY|dc->flags&~DCF_SYMMETRY; dc->pen_width=old_width; eletype=GRST_MENU; @@ -637,10 +599,10 @@ ei_restart: xx1=p1; yy1=p2; xx2=p1; yy2=p2; do { - dc->color=color&COLORROP_NO_ROP0_MASK|ROP_EQU; + dc->color=color&COLORROP_NO_ROP0_MASK; GrRect3(dc,xx1,yy1,0,xx2-xx1,yy2-yy1); msg_code=GetMsg(&p1,&p2, - 1<color=color&COLORROP_NO_ROP0_MASK|ROP_EQU; + dc->color=color&COLORROP_NO_ROP0_MASK; GrRect3(dc,xx1,yy1,0,xx2-xx1,yy2-yy1); tempg=MAlloc(gr_sprite_qued_base_size[GRST_RECT]); tempg->type=GRST_RECT; @@ -663,8 +625,8 @@ ei_restart: tempg->x2=xx2-x; tempg->y2=yy2-y; QueIns(tempg,insert_pt->last); - GrEdUpdate(doc,tempb,*_root); - *cur_num+=1; + GrEdUpdate(doc,tempb,root); + cur_num++; break; case GRST_BITMAP8: x1=p1; y1=p2; @@ -674,10 +636,10 @@ ei_restart: old_width=dc->pen_width; dc->pen_width=1; do { - dc->color=ROPF_DITHER+WHITE<<16+ROP_EQU+BLACK; + dc->color=ROPF_DITHER+WHITE<<16+BLACK; GrLineRect4(dc,xx1,yy1,xx2,yy2); msg_code=GetMsg(&p1,&p2, - 1<type=eletype; tempg->width=xx2-xx1; tempg->height=yy2-yy1; @@ -704,14 +666,14 @@ ei_bitmap: img->color=bm_bkcolor; GrRect(img,0,0,tempg->width,tempg->height); tempg1=insert_pt; - if (tempg1==*_root || tempg1->type!=GRST_BITMAP8) { - GrSetSettings(img,*_root,0,&color,&width,-(xx1-x),-(yy1-y)); + if (tempg1==root || tempg1->type!=GRST_BITMAP8) { + GrSetSettings(img,root,0,&color,&width,-(xx1-x),-(yy1-y)); SpritePlot3(img,-(xx1-x),-(yy1-y),0,tempb->data); - QueDel(*_root); - insert_pt=(*_root)->next=(*_root)->last=*_root; - *cur_num=1; + QueDel(root); + insert_pt=root->next=root->last=root; + cur_num=1; } else { - GrSetSettings(img,*_root,*cur_num,&color,&width,-(xx1-x),-(yy1-y)); + GrSetSettings(img,root,cur_num,&color,&width,-(xx1-x),-(yy1-y)); SpritePlot3(img,-(xx1-x),-(yy1-y),0,tempg1(U8 *)+offset(CSprite.start),TRUE); insert_pt=tempg1->next; QueRem(tempg1); @@ -719,13 +681,12 @@ ei_bitmap: } MemCpy(tempg(U8 *)+offset(CSprite.linespeed),img->body,((xx2-xx1+7)&~7)*(yy2-yy1)); - doc_e->flags1|=DOCEF1_DONT_DRAW; - switch (i=SpriteBitMap(dc,&xx1,&yy1,&xx2,&yy2,&img,bm_bkcolor,&new_snap,&new_ip_scaler)) { - case GE_OKAY_DONE: - case GE_OKAY_CONT: + switch (i=SpriteBitMap(doc,doc_e,dc,&xx1,&yy1,&xx2,&yy2,&img,bm_bkcolor,&ip_snap,&ip_scaler)) { + case GE_EXIT: + case GE_CONT: Free(tempg); tempg=CAlloc(gr_sprite_qued_base_size[GRST_BITMAP8]+ - ((xx2-xx1+7)&~7)*(yy2-yy1)); + ((xx2-xx1+7)&~7)*(yy2-yy1)); tempg->type=eletype; tempg->width=xx2-xx1; tempg->height=yy2-yy1; @@ -734,16 +695,16 @@ ei_bitmap: MemCpy(tempg(U8 *)+offset(CSprite.linespeed),img->body,((xx2-xx1+7)&~7)*(yy2-yy1)); break; } - SetSnap(&Fs->snap,new_snap,new_ip_scaler); - doc_e->flags1=old_ce_flags1; + SetSnap(&Fs->snap,ip_snap,ip_scaler); + doc_e->flags1=old_e_flags1; QueIns(tempg,insert_pt->last); DCDel(img); - GrEdUpdate(doc,tempb,*_root); + GrEdUpdate(doc,tempb,root); dc->pen_width=old_width; eletype=GRST_MENU; - if (i==GE_OKAY_DONE) { - result=GE_OKAY_DONE; + if (i==GE_EXIT) { + result=GE_EXIT; goto ei_done; } break; @@ -756,11 +717,11 @@ ei_bitmap: old_width=dc2->pen_width; dc2->pen_width=1; do { - dc2->color=ROPF_DITHER+WHITE<<16+ROP_EQU+BLACK; + dc2->color=ROPF_DITHER+WHITE<<16+BLACK; GrLineRect4(dc2,xx1+Fs->win_pixel_left+Fs->win_scroll_x,yy1+Fs->win_pixel_top+Fs->win_scroll_y, - xx2+Fs->win_pixel_left+Fs->win_scroll_x,yy2+Fs->win_pixel_top+Fs->win_scroll_y); + xx2+Fs->win_pixel_left+Fs->win_scroll_x,yy2+Fs->win_pixel_top+Fs->win_scroll_y); msg_code=GetMsg(&p1,&p2, - 1<type=GRST_BITMAP8; tempg->width=xx2-xx1; tempg->height=yy2-yy1; @@ -786,11 +747,11 @@ ei_bitmap: i=gr_screen_zoom; GrScaleZoom(1.0/i); WinMgrSync(2,TRUE); - + dc3=DCCaptureScreen; img=DCExtract(dc3, - Fs->win_pixel_left+Fs->win_scroll_x+xx1,Fs->win_pixel_top+Fs->win_scroll_y+yy1, - Fs->win_pixel_left+Fs->win_scroll_x+xx2-1,Fs->win_pixel_top+Fs->win_scroll_y+yy2-1); + Fs->win_pixel_left+Fs->win_scroll_x+xx1,Fs->win_pixel_top+Fs->win_scroll_y+yy1, + Fs->win_pixel_left+Fs->win_scroll_x+xx2-1,Fs->win_pixel_top+Fs->win_scroll_y+yy2-1); if (eletype==GRST_INS_TRANSPARENT_SCREEN_BITMAP) DCColorChg(img,bm_bkcolor); GrScaleZoom(i); @@ -799,22 +760,22 @@ ei_bitmap: DCDel(dc3); dc2->pen_width=old_width; QueIns(tempg,insert_pt->last); - GrEdUpdate(doc,tempb,*_root); - *cur_num+=1; + GrEdUpdate(doc,tempb,root); + cur_num++; eletype=GRST_MENU; break; case GRST_CIRCLE: x1=p1; y1=p2; x2=p1; y2=p2; do { - dc->color=color&COLORROP_NO_ROP0_MASK|ROP_EQU; + dc->color=color&COLORROP_NO_ROP0_MASK; GrCircle3(dc,x1,y1,0,Sqrt(SqrI64(x1-x2)+SqrI64(y1-y2))); msg_code=GetMsg(&p1,&p2, - 1<color=color&COLORROP_NO_ROP0_MASK|ROP_EQU; + dc->color=color&COLORROP_NO_ROP0_MASK; GrCircle3(dc,x1,y1,0,Sqrt(SqrI64(x1-x2)+SqrI64(y1-y2))); tempg=MAlloc(gr_sprite_qued_base_size[GRST_CIRCLE]); tempg->type=GRST_CIRCLE; @@ -822,18 +783,18 @@ ei_bitmap: tempg->y1=y1-y; tempg->x2=Sqrt(SqrI64(x1-x2)+SqrI64(y1-y2)); QueIns(tempg,insert_pt->last); - GrEdUpdate(doc,tempb,*_root); - *cur_num+=1; + GrEdUpdate(doc,tempb,root); + cur_num++; break; case GRST_ELLIPSE: x1=p1; y1=p2; x2=p1; y2=p2; do { - dc->color=color&COLORROP_NO_ROP0_MASK|ROP_EQU; + dc->color=color&COLORROP_NO_ROP0_MASK; GrEllipse3(dc,(x1+x2)>>1,(y1+y2)>>1,0, - AbsI64(x1-x2)>>1,AbsI64(y1-y2)>>1); + AbsI64(x1-x2)>>1,AbsI64(y1-y2)>>1); msg_code=GetMsg(&p1,&p2, - 1<rot_angle=-(a1-a2); else tempg->rot_angle=-(a1-a2)+ã/2.0; - dc->color=color&COLORROP_NO_ROP0_MASK|ROP_EQU; + dc->color=color&COLORROP_NO_ROP0_MASK; GrEllipse3(dc,tempg->x2+x,tempg->y2+y,0, - tempg->width,tempg->height,tempg->rot_angle); + tempg->width,tempg->height,tempg->rot_angle); msg_code=GetMsg(&p1,&p2, - 1<rot_angle=-(a1-a2)+ã/2.0; - dc->color=color&COLORROP_NO_ROP0_MASK|ROP_EQU; + dc->color=color&COLORROP_NO_ROP0_MASK; GrEllipse3(dc,tempg->x2+x,tempg->y2+y,0, - tempg->width,tempg->height,tempg->rot_angle); + tempg->width,tempg->height,tempg->rot_angle); QueIns(tempg,insert_pt->last); - GrEdUpdate(doc,tempb,*_root); - *cur_num+=1; + GrEdUpdate(doc,tempb,root); + cur_num++; break; - case GRST_REG_POLY: + case GRST_POLYGON: if (i>=3) { x1=p1; y1=p2; x2=p1; y2=p2; do { - dc->color=color&COLORROP_NO_ROP0_MASK|ROP_EQU; + dc->color=color&COLORROP_NO_ROP0_MASK; GrRegPoly3(dc,(x1+x2)>>1,(y1+y2)>>1,0, - AbsI64(x1-x2)>>1,AbsI64(y1-y2)>>1,i); + AbsI64(x1-x2)>>1,AbsI64(y1-y2)>>1,i); msg_code=GetMsg(&p1,&p2, - 1<type=GRST_REG_POLY; + tempg=MAlloc(gr_sprite_qued_base_size[GRST_POLYGON]); + tempg->type=GRST_POLYGON; tempg->x2=(x1+x2)>>1-x; tempg->y2=(y1+y2)>>1-y; tempg->width =AbsI64(x1-x2)>>1; @@ -903,11 +864,11 @@ ei_bitmap: tempg->rot_angle=-(a1-a2); else tempg->rot_angle=-(a1-a2)+ã/2.0; - dc->color=color&COLORROP_NO_ROP0_MASK|ROP_EQU; + dc->color=color&COLORROP_NO_ROP0_MASK; GrRegPoly3(dc,tempg->x2+x,tempg->y2+y,0, - tempg->width,tempg->height,tempg->sides,tempg->rot_angle); + tempg->width,tempg->height,tempg->sides,tempg->rot_angle); msg_code=GetMsg(&p1,&p2, - 1<rot_angle=-(a1-a2)+ã/2.0; - dc->color=color&COLORROP_NO_ROP0_MASK|ROP_EQU; + dc->color=color&COLORROP_NO_ROP0_MASK; GrRegPoly3(dc,tempg->x2+x,tempg->y2+y,0, - tempg->width,tempg->height,tempg->sides,tempg->rot_angle); + tempg->width,tempg->height,tempg->sides,tempg->rot_angle); QueIns(tempg,insert_pt->last); - GrEdUpdate(doc,tempb,*_root); - *cur_num+=1; + GrEdUpdate(doc,tempb,root); + cur_num++; } eletype=GRST_MENU; break; @@ -934,8 +895,8 @@ ei_bitmap: tempg->x1=x1-x; tempg->y1=y1-y; QueIns(tempg,insert_pt->last); - GrEdUpdate(doc,tempb,*_root); - *cur_num+=1; + GrEdUpdate(doc,tempb,root); + cur_num++; break; case GRST_FLOOD_FILL: case GRST_FLOOD_FILL_NOT: @@ -945,8 +906,8 @@ ei_bitmap: tempg->x1=x1-x; tempg->y1=y1-y; QueIns(tempg,insert_pt->last); - GrEdUpdate(doc,tempb,*_root); - *cur_num+=1; + GrEdUpdate(doc,tempb,root); + cur_num++; break; case GRST_POLYLINE: QueInit(&root2); @@ -956,16 +917,16 @@ ei_bitmap: x2=p1; y2=p2; do { do { - dc->color=color&COLORROP_NO_ROP0_MASK|ROP_EQU; + dc->color=color&COLORROP_NO_ROP0_MASK; GrLine3(dc,x1,y1,0,x2,y2,0); msg_code=GetMsg(&p1,&p2, - 1<color=ROP_EQU|COLOR_TRANSPARENT; + 1<color=COLOR_TRANSPARENT; GrLine3(dc,x1,y1,0,x2,y2,0); x2=p1; y2=p2; } while (msg_code!=MSG_IP_L_UP && msg_code!=MSG_IP_R_UP); - dc->color=color&COLORROP_NO_ROP0_MASK|ROP_EQU; + dc->color=color&COLORROP_NO_ROP0_MASK; if (msg_code==MSG_IP_L_UP) { GrLine3(dc,x1,y1,0,x2,y2,0); tempg=MAlloc(gr_sprite_qued_base_size[GRST_PT]); @@ -979,7 +940,7 @@ ei_bitmap: } while (msg_code!=MSG_IP_R_UP); if (num) { tempg2=CAlloc(gr_sprite_qued_base_size[GRST_POLYLINE]+ - (num+1)<<1*sizeof(I32)); + (num+1)<<1*sizeof(I32)); ptr=&tempg2->y1; tempg=root2.next; ptr[0]=x3; @@ -995,8 +956,8 @@ ei_bitmap: tempg2->type=GRST_POLYLINE; tempg2->num=num+1; QueIns(tempg2,insert_pt->last); - GrEdUpdate(doc,tempb,*_root); - *cur_num+=1; + GrEdUpdate(doc,tempb,root); + cur_num++; } break; case GRST_POLYPT: @@ -1004,10 +965,10 @@ ei_bitmap: x3=p1-x; y3=p2-y; x1=p1; y1=p2; x2=p1; y2=p2; - dc->color=color&COLORROP_NO_ROP0_MASK|ROP_EQU; + dc->color=color&COLORROP_NO_ROP0_MASK; do { msg_code=GetMsg(&p1,&p2, - 1<>3); + sizeof(I32)*2+(num*3+7)>>3); ptr=&tempg2->y1; ptr[0]=x3; ptr[1]=y3; @@ -1042,8 +1003,8 @@ ei_bitmap: while (tempg!=&root2) { tempg1=tempg->next; BFieldOrU32(ptr,i, - GrSpOffset[SignI64(tempg->x1-x1)+1+ - 3*(SignI64(tempg->y1-y1)+1)]); + GrSpOffset[SignI64(tempg->x1-x1)+1+ + 3*(SignI64(tempg->y1-y1)+1)]); i+=3; x1=tempg->x1;y1=tempg->y1; QueRem(tempg); @@ -1053,8 +1014,8 @@ ei_bitmap: tempg2->type=GRST_POLYPT; tempg2->num=num; QueIns(tempg2,insert_pt->last); - GrEdUpdate(doc,tempb,*_root); - *cur_num+=1; + GrEdUpdate(doc,tempb,root); + cur_num++; break; case GRST_BSPLINE2: case GRST_BSPLINE3: @@ -1067,16 +1028,16 @@ ei_bitmap: x2=p1; y2=p2; do { do { - dc->color=color&COLORROP_NO_ROP0_MASK|ROP_EQU; + dc->color=color&COLORROP_NO_ROP0_MASK; GrLine3(dc,x1,y1,0,x2,y2,0); msg_code=GetMsg(&p1,&p2, - 1<color=ROP_EQU|COLOR_TRANSPARENT; + 1<color=COLOR_TRANSPARENT; GrLine3(dc,x1,y1,0,x2,y2,0); x2=p1; y2=p2; } while (msg_code!=MSG_IP_L_UP && msg_code!=MSG_IP_R_UP); - dc->color=color&COLORROP_NO_ROP0_MASK|ROP_EQU; + dc->color=color&COLORROP_NO_ROP0_MASK; if (msg_code==MSG_IP_L_UP) { GrLine3(dc,x1,y1,0,x2,y2,0); tempg=MAlloc(gr_sprite_qued_base_size[GRST_PT]); @@ -1090,7 +1051,7 @@ ei_bitmap: } while (msg_code!=MSG_IP_R_UP); if (num) { tempg2=CAlloc(gr_sprite_qued_base_size[GRST_POLYLINE]+ - (num+1)*sizeof(CD3I32)); + (num+1)*sizeof(CD3I32)); p=&tempg2->y1; tempg=root2.next; p[0].x=x3; @@ -1105,17 +1066,17 @@ ei_bitmap: tempg2->type=eletype; tempg2->num=num+1; QueIns(tempg2,insert_pt->last); - GrEdUpdate(doc,tempb,*_root); - *cur_num+=1; + GrEdUpdate(doc,tempb,root); + cur_num++; } break; case GRST_SHIFTABLE_MESH: GetMsg(NULL,NULL,1<flags1|=DOCEF1_DONT_DRAW; + doc_e->flags1|=DOCEF1_DONT_DRAW; tempg1=insert_pt; - if (tempg1!=*_root && tempg1->type==GRST_MESH) { + if (tempg1!=root && tempg1->type==GRST_MESH) { z=0; x1=-(p1-x); y1=-(p2-y); @@ -1127,12 +1088,12 @@ ei_shiftable_mesh: p->z+=z1; } old_mesh=&tempg1->vertex_cnt; - } else if (tempg1!=*_root && tempg1->type==GRST_SHIFTABLE_MESH) { + } else if (tempg1!=root && tempg1->type==GRST_SHIFTABLE_MESH) { z=-tempg1->z1; x1=tempg1->x1-(p1-x); y1=tempg1->y1-(p2-y); z1=tempg1->z1+z; - p=(&tempg1->shiftable_triangle_cnt)(U8 *)+sizeof(I32); + p=(&tempg1->shiftable_tri_cnt)(U8 *)+sizeof(I32); for (i=0;ishiftable_vertex_cnt;i++,p++) { p->x+=x1; p->y+=y1; @@ -1152,25 +1113,25 @@ ei_shiftable_mesh: tempg->y1=p2-y; tempg->z1=-z; QueIns(tempg,insert_pt->last); - GrEdUpdate(doc,tempb,*_root); + GrEdUpdate(doc,tempb,root); if (old_mesh) { insert_pt=tempg; QueRem(tempg1); Free(tempg1); - GrEdUpdate(doc,tempb,*_root); + GrEdUpdate(doc,tempb,root); } else - *cur_num+=1; + cur_num++; } else if (old_mesh && tempg1->type==GRST_SHIFTABLE_MESH) { x1=tempg1->x1-(p1-x); y1=tempg1->y1-(p2-y); z1=tempg1->z1+z; - p=(&tempg1->shiftable_triangle_cnt)(U8 *)+sizeof(I32); + p=(&tempg1->shiftable_tri_cnt)(U8 *)+sizeof(I32); for (i=0;ishiftable_vertex_cnt;i++,p++) { p->x-=x1; p->y-=y1; p->z-=z1; } - } else if (old_mesh && tempg1->type==GRST_MESH) { + } else if (old_mesh && tempg1->type==GRST_MESH) { x1=-(p1-x); y1=-(p2-y); z1= z; @@ -1180,8 +1141,8 @@ ei_shiftable_mesh: p->y-=y1; p->z-=z1; } - } - doc_e->flags1=old_ce_flags1; + } + doc_e->flags1=old_e_flags1; eletype=GRST_MENU; break; } @@ -1191,27 +1152,15 @@ ei_shiftable_mesh: ei_done: DCFill; SettingsPop; - doc_e->flags1=old_ce_flags1; + doc_e->flags1=old_e_flags1; DCDel(dc); DCDel(dc2); - StrCpy(Fs->task_title,old_desc); - Free(old_desc); - StrCpy(doc->filename.name,old_filename); - Free(old_filename); - if (_import_snap) *_import_snap=new_snap; - if (_import_ip_scaler) *_import_ip_scaler=new_ip_scaler; - doc->flags|=old_doc_flags; - return result; -} - -I64 SpriteCntQue(CSprite *root) -{ - CSprite *tempg=root->next; - I64 result=0; - while (tempg->type) { - result++; - tempg=tempg->next; - } + StrCpy(Fs->task_title,old_task_title); + Free(old_task_title); + Fs->border_src=old_border_src; + Fs->title_src =old_title_src; + QueDel(root); + Free(root); return result; } @@ -1221,14 +1170,9 @@ U0 EdInsGraphic(CDoc *doc,I64 x,I64 y) U8 *st; CDocEntry *doc_e; CDocBin *tempb; - I64 cur_num=0,new_snap=1; - CSprite *root; - F64 new_ip_scaler=1.0; if (Fs!=doc->mem_task) Dbg; if (st=EdSprite(doc->cur_bin_num)) { - SettingsPush; //See $LK,"SettingsPush","MN:SettingsPush"$ - WordStat; unlock=DocLock(doc); tempb=CAlloc(sizeof(CDocBin),doc->mem_task); tempb->type=DOCBT_CSPRITE; @@ -1243,39 +1187,47 @@ U0 EdInsGraphic(CDoc *doc,I64 x,I64 y) if (doc_e && Bt(doc_tag_types,doc_e->type_u8) && doc_e->tag && *doc_e->tag) tempb->tag=StrNew(doc_e->tag,doc->mem_task); DocUnlock(doc); - root=Sprite2Que(tempb->data); x+=StrLen(doc_e->tag)*FONT_WIDTH; - WinMgrSync(2,TRUE); - switch (SpriteVect(doc,doc_e,&root,&cur_num,x,y,TRUE,&new_snap,&new_ip_scaler)) { - case GE_CANCEL: - QueDel(root); - Free(root); - DocLock(doc); - QueRem(doc_e); - Free(doc_e); - Free(doc_e->tag); - QueRem(tempb); - Free(tempb->data); - Free(tempb); - if (unlock) - DocUnlock(doc); - break; - case GE_OKAY_DONE: - QueDel(root); - Free(root); - break; - case GE_OKAY_CONT: - QueDel(root); - Free(root); - doc->cur_entry=doc_e; - doc->cur_data_col=0; - DocRecalc(doc); - EdExistingGraphic(doc,x,y,&new_snap,&new_ip_scaler); - break; + if (SpriteMain(doc,doc_e,x,y)==GE_ABORT) { + DocLock(doc); + QueRem(doc_e); + Free(doc_e); + Free(doc_e->tag); + DocBinDel(doc,tempb); + if (unlock) + DocUnlock(doc); } - SettingsPop; } if (!(doc->flags & (DOCF_PLAIN_TEXT|DOCF_PLAIN_TEXT_WITH_TABS))) DocBinsValidate(doc); } + +U0 EdExistingGraphic(CDoc *doc,I64 x,I64 y) +{ + CDocEntry *doc_e; + CDocBin *tempb; + I64 old_size; + CSprite *old_csprite; + Bool unlock; + + unlock=DocLock(doc); + doc_e=doc->cur_entry; + tempb=doc_e->bin_data; + old_size=tempb->size; + old_csprite=tempb->data; + tempb->data=MAllocIdentical(old_csprite); + DocUnlock(doc); + + if (SpriteMain(doc,doc_e,x,y)==GE_ABORT) { + DocLock(doc); + Free(tempb->data); + tempb->data=old_csprite; + tempb->size=old_size; + if (unlock) + DocUnlock(doc); + } else + Free(old_csprite); +} + +#help_index "Graphics" diff --git a/TempleOS/Adam/Gr/CSpriteMesh.CPP b/TempleOS/Adam/Gr/CSpriteMesh.CPP index 7a689bc..9c1c175 100644 --- a/TempleOS/Adam/Gr/CSpriteMesh.CPP +++ b/TempleOS/Adam/Gr/CSpriteMesh.CPP @@ -28,7 +28,7 @@ class CGrMTri CMeshTri mt; U0 end; - I32 cpu_num,flags; //Draw different triangles with different cores. + I32 cpu_num,flags; //Draw different tris with different cores. CGrMVertex *t[3]; }; @@ -40,13 +40,13 @@ class CGrMFrame I64 mode,cx,cy; CColorROPU32 cur_color; Bool grid_on,flip_y,select_rect,vertex_on,pad[4]; - I64 mp_done_flags; //Used for multiprocessing signaling. + I64 mp_not_done_flags; //Used for multiprocessing signaling. F64 view_scale; CDC *dc; I64 *w2s,*s2w; //Screen-to-world and world-to-screen transform matrices. - I64 vertex_cnt,triangle_cnt; //Set by GrMSize + I64 vertex_cnt,tri_cnt; //Set by GrMSize CGrMVertex vertex_root,*cur_vertex; - CGrMTri triangle_root,*cur_triangle; + CGrMTri tri_root,*cur_tri; I64 x1,y1,x2,y2,cur_snap; }; @@ -69,7 +69,7 @@ CGrMTri *GrMTriNew(CGrMFrame *e,CColorROPU32 color,CGrMVertex *v1,CGrMVertex *v2 tempt->t[0]=v1; tempt->t[1]=v2; tempt->t[2]=v3; - QueIns(tempt,e->triangle_root.last); + QueIns(tempt,e->tri_root.last); return tempt; } @@ -103,11 +103,11 @@ CGrMVertex *GrMVertexFindNum(CGrMFrame *e,I64 num) return NULL; } -U0 GrMTriangleDel(CGrMFrame *e,CGrMTri *tempt) +U0 GrMTriDel(CGrMFrame *e,CGrMTri *tempt) { if (tempt) { - if (tempt==e->cur_triangle) - e->cur_triangle=NULL; + if (tempt==e->cur_tri) + e->cur_tri=NULL; QueRem(tempt); Free(tempt); } @@ -118,14 +118,14 @@ U0 GrMVertexDel(CGrMFrame *e,CGrMVertex *tempv) I64 i; CGrMTri *tempt,*tempt1; if (tempv) { - tempt=e->triangle_root.next; - while (tempt!=&e->triangle_root) { + tempt=e->tri_root.next; + while (tempt!=&e->tri_root) { tempt1=tempt->next; for (i=0;i<3;i++) if (tempt->t[i]==tempv) break; if (i<3) - GrMTriangleDel(e,tempt); + GrMTriDel(e,tempt); tempt=tempt1; } if (tempv==e->cur_vertex) @@ -147,10 +147,10 @@ U0 GrMVertexSelectAll(CGrMFrame *e,Bool val) } } -U0 GrMTriangleSelectAll(CGrMFrame *e,Bool val) +U0 GrMTriSelectAll(CGrMFrame *e,Bool val) { - CGrMTri *tempt=e->triangle_root.next; - while (tempt!=&e->triangle_root) { + CGrMTri *tempt=e->tri_root.next; + while (tempt!=&e->tri_root) { if (val) tempt->flags|=TF_SELECTED; else @@ -213,12 +213,12 @@ U0 GrMVertexSelectRect(CGrMFrame *e,I64 mode,I64 x1,I64 x2,I64 y1,I64 y2) } } -U0 GrMTriangleSelectRect(CGrMFrame *e,I64 mode,I64 x1,I64 x2,I64 y1,I64 y2) +U0 GrMTriSelectRect(CGrMFrame *e,I64 mode,I64 x1,I64 x2,I64 y1,I64 y2) { - CGrMTri *tempt=e->triangle_root.next; + CGrMTri *tempt=e->tri_root.next; if (x1>x2) SwapU64(&x1,&x2); if (y1>y2) SwapU64(&y1,&y2); - while (tempt!=&e->triangle_root) { + while (tempt!=&e->tri_root) { if (x1<=tempt->t[0]->pt.x<=x2 && y1<=tempt->t[0]->pt.y<=y2 && x1<=tempt->t[1]->pt.x<=x2 && @@ -250,13 +250,13 @@ I64 GrMSelectCnt(CGrMFrame *e) { I64 result=0; CGrMVertex *tempv=e->vertex_root.next; - CGrMTri *tempt=e->triangle_root.next; + CGrMTri *tempt=e->tri_root.next; while (tempv!=&e->vertex_root) { if (tempv->flags&VF_SELECTED) result++; tempv=tempv->next; } - while (tempt!=&e->triangle_root) { + while (tempt!=&e->tri_root) { if (tempt->flags&TF_SELECTED) result++; tempt=tempt->next; @@ -324,22 +324,22 @@ U0 GrMTransformSelect(CGrMFrame *e) } } -U0 GrMFlipTriangles(CGrMFrame *e) +U0 GrMFlipTris(CGrMFrame *e) { Bool unselect; - CGrMTri *tempt=e->triangle_root.next; + CGrMTri *tempt=e->tri_root.next; if (!GrMSelectCnt(e)) { - GrMTriangleSelectAll(e,TRUE); + GrMTriSelectAll(e,TRUE); unselect=TRUE; } else unselect=FALSE; - while (tempt!=&e->triangle_root) { + while (tempt!=&e->tri_root) { if (tempt->flags & TF_SELECTED) SwapU64(&tempt->t[1],&tempt->t[2]); tempt=tempt->next; } if (unselect) - GrMTriangleSelectAll(e,FALSE); + GrMTriSelectAll(e,FALSE); } U0 GrMRecalcCxCy(CTask *task,CGrMFrame *e) @@ -383,7 +383,7 @@ U0 MPDrawIt(CGrMFrame *e) //Multiprocessing draw it, called by each core. //Makes a copy of e->dc so we can change dc->color member and stuff. CDC *dc=DCAlias(e->dc,e->dc->win_task); - CGrMTri *tempt=e->triangle_root.next; + CGrMTri *tempt=e->tri_root.next; I64 i,*old_r=dc->r; //$LK,"DCAlias","MN:DCAlias"$() allocates a new identity rotation matrix. @@ -425,17 +425,17 @@ U0 MPDrawIt(CGrMFrame *e) //Multiprocessing draw it, called by each core. GrLine3(dc,0,0,-500,0,0,0); } - while (tempt!=&e->triangle_root) { + while (tempt!=&e->tri_root) { if (tempt->cpu_num==Gs->num) { if (tempt->flags & TF_SELECTED) { if (Blink) dc->color=ROPF_DITHER+WHITE<<16+RED; else dc->color=ROPF_DITHER+RED<<16+WHITE; - GrFillTriangle0(dc,&tempt->t[0]->pt,&tempt->t[1]->pt,&tempt->t[2]->pt); + GrFillTri0(dc,&tempt->t[0]->pt,&tempt->t[1]->pt,&tempt->t[2]->pt); } else { (*dc->lighting)(dc,&tempt->t[0]->pt,&tempt->t[1]->pt,&tempt->t[2]->pt,tempt->mt.color); - GrFillTriangle0(dc,&tempt->t[0]->pt,&tempt->t[1]->pt,&tempt->t[2]->pt); + GrFillTri0(dc,&tempt->t[0]->pt,&tempt->t[1]->pt,&tempt->t[2]->pt); } } tempt=tempt->next; @@ -446,7 +446,7 @@ U0 MPDrawIt(CGrMFrame *e) //Multiprocessing draw it, called by each core. dc->depth_buf=NULL; DCDel(dc); - LBts(&e->mp_done_flags,Gs->num); + LBtr(&e->mp_not_done_flags,Gs->num); } I64 *GrMW2S(CGrMFrame *e,CTask *task) @@ -519,25 +519,25 @@ U0 GrMCursorW(CGrMFrame *e,CTask *task,I64 *_x,I64 *_y,I64 *_z) CGrMVertex sys_vertex_root; -CGrMTri sys_triangle_root; +CGrMTri sys_tri_root; U0 GrMClipBoardInit() { QueInit(&sys_vertex_root); - QueInit(&sys_triangle_root); + QueInit(&sys_tri_root); } U0 GrMClipBoardRst() { QueDel(&sys_vertex_root,TRUE); - QueDel(&sys_triangle_root,TRUE); + QueDel(&sys_tri_root,TRUE); GrMClipBoardInit; } U0 GrMClipBoardCopy(CGrMFrame *e) { CGrMVertex *tempv=e->vertex_root.next,*tempv2; - CGrMTri *tempt=e->triangle_root.next,*tempt2; + CGrMTri *tempt=e->tri_root.next,*tempt2; GrMClipBoardRst; while (tempv!=&e->vertex_root) { @@ -553,7 +553,7 @@ U0 GrMClipBoardCopy(CGrMFrame *e) } tempv=tempv->next; } - while (tempt!=&e->triangle_root) { + while (tempt!=&e->tri_root) { if (tempt->flags&TF_SELECTED && tempt->t[0]->copy && tempt->t[1]->copy && tempt->t[2]->copy) { tempt2=ACAlloc(sizeof(CGrMTri)); @@ -561,7 +561,7 @@ U0 GrMClipBoardCopy(CGrMFrame *e) tempt2->t[1]=tempt->t[1]->copy; tempt2->t[2]=tempt->t[2]->copy; tempt2->mt.color=tempt->mt.color; - QueIns(tempt2,sys_triangle_root.last); + QueIns(tempt2,sys_tri_root.last); tempt->flags|=TF_COPIED; tempt->flags&=~TF_SELECTED; } else @@ -573,47 +573,47 @@ U0 GrMClipBoardCopy(CGrMFrame *e) U0 GrMClipBoardCut(CGrMFrame *e) { CGrMVertex *tempv=e->vertex_root.next,*tempv1; - CGrMTri *tempt=e->triangle_root.next,*tempt1; + CGrMTri *tempt=e->tri_root.next,*tempt1; GrMClipBoardCopy(e); + while (tempt!=&e->tri_root) { + tempt1=tempt->next; + if (tempt->flags&TF_COPIED) + GrMTriDel(e,tempt); + tempt=tempt1; + } while (tempv!=&e->vertex_root) { tempv1=tempv->next; if (tempv->flags&VF_COPIED) GrMVertexDel(e,tempv); tempv=tempv1; } - while (tempt!=&e->triangle_root) { - tempt1=tempt->next; - if (tempt->flags&TF_COPIED) - GrMTriangleDel(e,tempt); - tempt=tempt1; - } } U0 GrMClipBoardDel(CGrMFrame *e) {//Technically not clipboard CGrMVertex *tempv=e->vertex_root.next,*tempv1; - CGrMTri *tempt=e->triangle_root.next,*tempt1; + CGrMTri *tempt=e->tri_root.next,*tempt1; + while (tempt!=&e->tri_root) { + tempt1=tempt->next; + if (tempt->flags&TF_SELECTED) + GrMTriDel(e,tempt); + tempt=tempt1; + } while (tempv!=&e->vertex_root) { tempv1=tempv->next; if (tempv->flags&VF_SELECTED) GrMVertexDel(e,tempv); tempv=tempv1; } - while (tempt!=&e->triangle_root) { - tempt1=tempt->next; - if (tempt->flags&TF_SELECTED) - GrMTriangleDel(e,tempt); - tempt=tempt1; - } } U0 GrMClipBoardPaste(CGrMFrame *e) { CGrMVertex *tempv2=sys_vertex_root.next,*tempv; - CGrMTri *tempt2=sys_triangle_root.next,*tempt; + CGrMTri *tempt2=sys_tri_root.next,*tempt; GrMVertexSelectAll(e,FALSE); - GrMTriangleSelectAll(e,FALSE); + GrMTriSelectAll(e,FALSE); while (tempv2!=&sys_vertex_root) { tempv2->copy=tempv=CAlloc(sizeof(CGrMVertex)); MemCpy(&tempv->p,&tempv2->p,sizeof(CD3I32)); @@ -622,7 +622,7 @@ U0 GrMClipBoardPaste(CGrMFrame *e) tempv2=tempv2->next; } - while (tempt2!=&sys_triangle_root) { + while (tempt2!=&sys_tri_root) { tempt=GrMTriNew(e,tempt2->mt.color,tempt2->t[0]->copy,tempt2->t[1]->copy,tempt2->t[2]->copy); tempt->flags|=TF_SELECTED; tempt2=tempt2->next; @@ -679,11 +679,10 @@ U0 DrawIt(CTask *task,CDC *dc) tempv=tempv->next; } - e->mp_done_flags=0; //Issue jobs to all cores. + e->mp_not_done_flags=1<dc=dc; - for (i=1;ivertex_root.next; while (tempv!=&e->vertex_root) { @@ -743,7 +742,7 @@ U0 DrawIt(CTask *task,CDC *dc) GrLineRect4(dc,e->x1,e->y1,e->x2,e->y2); } //Wait for all cores to complete. - while (e->mp_done_flags!=1<mp_not_done_flags) Yield; } @@ -752,7 +751,7 @@ U0 GrMInit(CGrMFrame *e,Bool flip_y) MemSet(e,0,sizeof(CGrMFrame)); e->task=Fs; e->vertex_root.next=e->vertex_root.last=&e->vertex_root; - e->triangle_root.next=e->triangle_root.last=&e->triangle_root; + e->tri_root.next=e->tri_root.last=&e->tri_root; e->mode='v'; e->grid_on=TRUE; e->vertex_on=TRUE; @@ -764,7 +763,7 @@ U0 GrMInit(CGrMFrame *e,Bool flip_y) e->cur_snap=5; e->flip_y=flip_y; e->select_rect=FALSE; - e->cur_triangle=NULL; + e->cur_tri=NULL; e->cur_vertex=NULL; } @@ -775,10 +774,10 @@ U0 GrMLoad(CGrMFrame *e,U8 *src) CGrMVertex *tempv,*va[3]; e->vertex_root.next=e->vertex_root.last=&e->vertex_root; - e->triangle_root.next=e->triangle_root.last=&e->triangle_root; + e->tri_root.next=e->tri_root.last=&e->tri_root; e->vertex_cnt =*src(I32 *)++; - e->triangle_cnt=*src(I32 *)++; + e->tri_cnt=*src(I32 *)++; for (i=0;ivertex_cnt;i++) { x=*src(I32 *)++; y=*src(I32 *)++; @@ -786,7 +785,7 @@ U0 GrMLoad(CGrMFrame *e,U8 *src) tempv=GrMVertexNew(e,x,y,z); tempv->num=i; } - for (i=0;itriangle_cnt;i++) { + for (i=0;itri_cnt;i++) { color=*src(I32 *)++; for (j=0;j<3;j++) va[j]=GrMVertexFindNum(e,*src(I32 *)++); @@ -798,7 +797,7 @@ I64 GrMSize(CGrMFrame *e) { I64 i; CGrMVertex *tempv=e->vertex_root.next; - CGrMTri *tempt=e->triangle_root.next; + CGrMTri *tempt=e->tri_root.next; e->vertex_cnt=0; while (tempv!=&e->vertex_root) { @@ -806,16 +805,16 @@ I64 GrMSize(CGrMFrame *e) tempv=tempv->next; } - e->triangle_cnt=0; - while (tempt!=&e->triangle_root) { - e->triangle_cnt++; + e->tri_cnt=0; + while (tempt!=&e->tri_root) { + e->tri_cnt++; for (i=0;i<3;i++) tempt->mt.nums[i]=tempt->t[i]->num; tempt=tempt->next; } return sizeof(I32)*2+ (offset(CGrMVertex.end)-offset(CGrMVertex.start))*e->vertex_cnt+ - (offset(CGrMTri.end)-offset(CGrMTri.start))*e->triangle_cnt; + (offset(CGrMTri.end)-offset(CGrMTri.start))*e->tri_cnt; } I32 *GrMSave(CGrMFrame *e,I64 *_size=NULL) @@ -823,10 +822,10 @@ I32 *GrMSave(CGrMFrame *e,I64 *_size=NULL) I64 size=GrMSize(e); U8 *result=MAlloc(size),*dst=result; CGrMVertex *tempv=e->vertex_root.next; - CGrMTri *tempt=e->triangle_root.next; + CGrMTri *tempt=e->tri_root.next; *dst(I32 *)++=e->vertex_cnt; - *dst(I32 *)++=e->triangle_cnt; + *dst(I32 *)++=e->tri_cnt; e->vertex_cnt=0; while (tempv!=&e->vertex_root) { @@ -835,8 +834,8 @@ I32 *GrMSave(CGrMFrame *e,I64 *_size=NULL) tempv=tempv->next; } - e->triangle_cnt=0; - while (tempt!=&e->triangle_root) { + e->tri_cnt=0; + while (tempt!=&e->tri_root) { MemCpy(dst,&tempt->start,offset(CGrMTri.end)-offset(CGrMTri.start)); dst+=offset(CGrMTri.end)-offset(CGrMTri.start); tempt=tempt->next; @@ -848,7 +847,7 @@ I32 *GrMSave(CGrMFrame *e,I64 *_size=NULL) U0 GrMCleanUp(CGrMFrame *e) { QueDel(&e->vertex_root,TRUE); - QueDel(&e->triangle_root,TRUE); + QueDel(&e->tri_root,TRUE); Free(e->w2s); Free(e->s2w); } @@ -866,7 +865,7 @@ U0 GrMUpdateMenu(CGrMFrame *e) tempse->checked=ToBool(e->mode=='m'); if (tempse=MenuEntryFind(Fs->cur_menu,"Mode/MoveVertexZ")) tempse->checked=ToBool(e->mode=='M'); - if (tempse=MenuEntryFind(Fs->cur_menu,"Mode/MakeTriangle")) + if (tempse=MenuEntryFind(Fs->cur_menu,"Mode/MakeTri")) tempse->checked=ToBool(e->mode=='t'); if (tempse=MenuEntryFind(Fs->cur_menu,"View/FlipY")) tempse->checked=ToBool(e->flip_y); @@ -878,9 +877,9 @@ I32 *CSpriteMesh(I32 *root=NULL,I64 *_size=NULL,Bool flip_y=FALSE) Fmt for mesh: { I32 vertex_cnt; -I32 triangle_cnt; +I32 tri_cnt; CD3I32 vertices[]; -CMeshTri triangles[]; +CMeshTri tris[]; } If root points to a mesh, it will load it. @@ -940,7 +939,7 @@ $WW,0$*/ " PlaceVertex(,'v');" " MoveVertex(,'m');" " MoveVertexZ(,'M');" - " MakeTriangle(,'t');" + " MakeTri(,'t');" "}" "Settings {" " Color(,'c');" @@ -967,12 +966,13 @@ $WW,0$*/ "}"); SettingsPush; //See $LK,"SettingsPush","MN:SettingsPush"$ + WordStat; Preempt(OFF); //We don't really want window update while modifying links AcctOneTimePopUp(ARf_MESH_ED, "$$FG,GREEN$$Right Mouse$$FG$$: Hold and move to shift cursor z\n" "$$FG,GREEN$$'j'$$FG$$: Jump cursor Z to nearest vertex's Z\n" "$$FG,GREEN$$'v'$$FG$$: Place Vertex Mode\n" - "$$FG,GREEN$$'t'$$FG$$: Make Triangle Mode\n" + "$$FG,GREEN$$'t'$$FG$$: Make Tri Mode\n" "$$FG,GREEN$$'m'$$FG$$: Move Vertex Mode\n" "$$FG,GREEN$$'M'$$FG$$: Move Vertex Z\n" "$$FG,GREEN$$'c'$$FG$$: Set color\n" @@ -982,7 +982,6 @@ $WW,0$*/ Fs->win_inhibit=WIF_ALL|WIF_DOC-WIF_BORDER-WIF_CTRLS-WIF_MENU-WIF_GRAB_SCROLL; Fs->horz_scroll.pos=0; Fs->vert_scroll.pos=0; - WordStat; GrMInit(&e,flip_y); if (root) GrMLoad(&e,root); @@ -1013,7 +1012,7 @@ gm_restart: else if (e.mode!='t') GrMVertexDel(&e,GrMVertexFindS(&e,ipx_presnap-Fs->win_pixel_left-Fs->win_scroll_x,ipy_presnap-Fs->win_pixel_top-Fs->win_scroll_y)); GrMVertexSelectAll(&e,FALSE); - GrMTriangleSelectAll(&e,FALSE); + GrMTriSelectAll(&e,FALSE); vn=0; } break; @@ -1039,16 +1038,16 @@ gm_restart: case 't': if (vn) { GrMVertexSelectAll(&e,FALSE); - GrMTriangleSelectAll(&e,FALSE); + GrMTriSelectAll(&e,FALSE); vn=0; } else - GrMTriangleDel(&e,e.cur_triangle); + GrMTriDel(&e,e.cur_tri); break; } break; case 't': GrMVertexSelectAll(&e,FALSE); - GrMTriangleSelectAll(&e,FALSE); + GrMTriSelectAll(&e,FALSE); case 'v': case 'm': case 'M': @@ -1062,7 +1061,7 @@ gm_restart: GrMTransformSelect(&e); break; case 'A': - GrMTriangleSelectAll(&e,TRUE); + GrMTriSelectAll(&e,TRUE); if (e.mode!='t') GrMVertexSelectAll(&e,TRUE); else @@ -1070,7 +1069,7 @@ gm_restart: vn=0; break; case 'U': - GrMTriangleSelectAll(&e,FALSE); + GrMTriSelectAll(&e,FALSE); GrMVertexSelectAll(&e,FALSE); vn=0; break; @@ -1104,7 +1103,7 @@ gm_restart: } } e.select_rect=FALSE; - GrMTriangleSelectRect(&e,i,e.x1,e.x2,e.y1,e.y2); + GrMTriSelectRect(&e,i,e.x1,e.x2,e.y1,e.y2); if (e.mode!='t') GrMVertexSelectRect(&e,i,e.x1,e.x2,e.y1,e.y2); else @@ -1147,7 +1146,7 @@ gm_restart: GrMScaleZoom(&e,1/1.5); break; case 'c': - e.cur_color=PopUpLightingColor; + e.cur_color=PopUpColorLighting; break; case 's': i=PopUpRangeI64(1,25,1,"New Snap\n"); @@ -1210,11 +1209,11 @@ gm_restart: GrMInvertAxis(&e,offset(CD3I32.z)); break; case 'f': - if (e.cur_triangle) - SwapU64(&e.cur_triangle->t[1],&e.cur_triangle->t[2]); + if (e.cur_tri) + SwapU64(&e.cur_tri->t[1],&e.cur_tri->t[2]); break; case 'F': - GrMFlipTriangles(&e); + GrMFlipTris(&e); break; } @@ -1283,7 +1282,7 @@ gm_restart: GrMCursorW(&e,Fs,&x,&y,&z); GrMP0Offset(&e,x-p0a.x,y-p0a.y,z-p0a.z); } - GrMTriangleSelectAll(&e,FALSE); + GrMTriSelectAll(&e,FALSE); GrMVertexSelectAll(&e,FALSE); moving=FALSE; } @@ -1300,7 +1299,7 @@ gm_restart: va[vn++]=tempv; tempv->flags|=VF_SELECTED; if (vn==3) { - e.cur_triangle=GrMTriNew(&e,e.cur_color,va[0],va[1],va[2]); + e.cur_tri=GrMTriNew(&e,e.cur_color,va[0],va[1],va[2]); for (i=0;iflags&=~VF_SELECTED; vn=0; diff --git a/TempleOS/Adam/Gr/CSpriteNew.CPP b/TempleOS/Adam/Gr/CSpriteNew.CPP index 95c066b..9a5ee15 100644 --- a/TempleOS/Adam/Gr/CSpriteNew.CPP +++ b/TempleOS/Adam/Gr/CSpriteNew.CPP @@ -28,12 +28,12 @@ offset(CSprite.linespeed)-offset(CSprite.start), //GRST_BITMAP8 1, offset(CSprite.st)-offset(CSprite.start), //GRST_TEXT offset(CSprite.sides)-offset(CSprite.start), //GRST_ELLIPSE -sizeof(CSprite)-offset(CSprite.start), //GRST_REG_POLY +sizeof(CSprite)-offset(CSprite.start), //GRST_POLYGON offset(CSprite.linespeed)-offset(CSprite.start), //GRST_PLANAR_SYMMETRY 2+offset(CSprite.dither_color8)-offset(CSprite.start), //GRST_DITHER_COLOR8 offset(CSprite.sides)-offset(CSprite.start), //GRST_ROTATED_RECT offset(CSprite.x2)-offset(CSprite.start), //GRST_MESH -offset(CSprite.shiftable_triangle_cnt)+sizeof(I32)-offset(CSprite.start), //GRST_SHIFTABLE_MESH +offset(CSprite.shiftable_tri_cnt)+sizeof(I32)-offset(CSprite.start), //GRST_SHIFTABLE_MESH offset(CSprite.x1)-offset(CSprite.start), //GRST_TRANSFORM_ON offset(CSprite.x1)-offset(CSprite.start), //GRST_TRANSFORM_OFF offset(CSprite.linespeed)-offset(CSprite.start), //GRST_ARROW @@ -68,12 +68,12 @@ offset(CSprite.linespeed), //GRST_BITMAP8 1, offset(CSprite.st), //GRST_TEXT offset(CSprite.sides), //GRST_ELLIPSE -sizeof(CSprite), //GRST_REG_POLY +sizeof(CSprite), //GRST_POLYGON offset(CSprite.linespeed), //GRST_PLANAR_SYMMETRY 2+offset(CSprite.dither_color8), //GRST_DITHER_COLOR8 offset(CSprite.sides), //GRST_ROTATED_RECT offset(CSprite.x2), //GRST_MESH -offset(CSprite.shiftable_triangle_cnt)+sizeof(I32), //GRST_SHIFTABLE_MESH +offset(CSprite.shiftable_tri_cnt)+sizeof(I32), //GRST_SHIFTABLE_MESH offset(CSprite.x1), //GRST_TRANSFORM_ON offset(CSprite.x1), //GRST_TRANSFORM_OFF offset(CSprite.linespeed), //GRST_ARROW @@ -107,10 +107,10 @@ I64 SpriteElemSize(CSprite *tempg) i+=tempg->num*sizeof(CD3I32); break; case GRST_MESH: - i+=tempg->vertex_cnt*sizeof(CD3I32)+tempg->triangle_cnt*sizeof(CMeshTri); + i+=tempg->vertex_cnt*sizeof(CD3I32)+tempg->tri_cnt*sizeof(CMeshTri); break; case GRST_SHIFTABLE_MESH: - i+=tempg->shiftable_vertex_cnt*sizeof(CD3I32)+tempg->shiftable_triangle_cnt*sizeof(CMeshTri); + i+=tempg->shiftable_vertex_cnt*sizeof(CD3I32)+tempg->shiftable_tri_cnt*sizeof(CMeshTri); break; } return i; @@ -171,7 +171,7 @@ public U8 *Sprite2Text(CSprite *tempg) { //Study $LK-A,"::/TempleOS/Demo/Graphics/SpriteText.CPP"$. U8 buf[256],buf2[256],buf3[136]; I32 *ptr; - SPrintF(buf,"%Z",tempg->type,"ST_CSPRITE_TYPES"); + SPrintF(buf,"%Z",tempg->type,"ST_SPRITE_TYPES"); *buf2=0; switch (tempg->type) { case GRST_COLOR8: @@ -212,7 +212,7 @@ public U8 *Sprite2Text(CSprite *tempg) SPrintF(buf2," %d %d,%d",tempg->num,ptr[0],ptr[1]); break; case GRST_ELLIPSE: - case GRST_REG_POLY: + case GRST_POLYGON: case GRST_BITMAP8: SPrintF(buf2," %dW,%dH:%d,%d", tempg->width,tempg->height,tempg->x2,tempg->y2); @@ -224,10 +224,10 @@ public U8 *Sprite2Text(CSprite *tempg) SPrintF(buf2," %d",tempg->num); break; case GRST_MESH: - SPrintF(buf2," %dV,%dT",tempg->vertex_cnt,tempg->triangle_cnt); + SPrintF(buf2," %dV,%dT",tempg->vertex_cnt,tempg->tri_cnt); break; case GRST_SHIFTABLE_MESH: - SPrintF(buf2," %dV,%dT",tempg->shiftable_vertex_cnt,tempg->shiftable_triangle_cnt); + SPrintF(buf2," %dV,%dT",tempg->shiftable_vertex_cnt,tempg->shiftable_tri_cnt); break; } StrCat(buf,buf2); diff --git a/TempleOS/Adam/Gr/Gr.CPP b/TempleOS/Adam/Gr/Gr.CPP index 1e90046..a14fd4a 100644 --- a/TempleOS/Adam/Gr/Gr.CPP +++ b/TempleOS/Adam/Gr/Gr.CPP @@ -1,15 +1,15 @@ #help_index "Graphics" -U0 GrInit() +U0 GrInit1() { - DefineLstLoad("ST_CSPRITE_TYPES","End\0 \0Color 8Bit\0 \0Point\0" + DefineLstLoad("ST_SPRITE_TYPES","End\0 \0Color 8Bit\0 \0Point\0" "Line\0PolyLine\0PolyPoint\0Width\0Shift\0" "BSpline2\0BSpline3\0BSpline2 Closed\0BSpline3 Closed\0" " \0 \0 \0Rect\0Circle\0Flood Fill Not Color\0Flood Fill\0BitMap 8Bit\0" - " \0Text\0Ellipse\0Reg Polygon\0Planar Symmetry\0" + " \0Text\0Ellipse\0Polygon\0Planar Symmetry\0" "Dither Color 8Bit\0Rotated Rect\0Mesh\0Shiftable Mesh\0" "Transform On\0Transform Off\0Arrow\0Text Box\0Text Diamond\0"); } -GrInit; +GrInit1; #help_index "Graphics/CSprite" #define GRST_END 0 @@ -37,7 +37,7 @@ GrInit; //Unused #define GRST_TEXT 23 #define GRST_ELLIPSE 24 -#define GRST_REG_POLY 25 +#define GRST_POLYGON 25 #define GRST_PLANAR_SYMMETRY 26 #define GRST_DITHER_COLOR8 27 #define GRST_ROTATED_RECT 28 @@ -75,7 +75,7 @@ public class CSprite union { I32 y1; I32 height; - I32 triangle_cnt; //Mesh + I32 tri_cnt; //Mesh } union { I32 z1; @@ -89,7 +89,7 @@ public class CSprite union { F64 linespeed; F64 rot_angle; - I32 shiftable_triangle_cnt //Shiftable Mesh + I32 shiftable_tri_cnt //Shiftable Mesh } I32 sides; }; @@ -99,9 +99,7 @@ public class CSprite extern CDC *DCNew(I64 type,I64 width,I64 height,CTask *task=NULL,Bool null_bitmap=FALSE); extern CDC *DCAlias(CDC *dc=NULL,CTask *task=NULL); extern U0 DCDel(CDC *dc); -extern U0 EdExistingGraphic(CDoc *doc,I64 x,I64 y,I64 *import_snap=NULL,F64 *import_ip_scaler=NULL); -extern CSprite *SpriteDoc2Que(CDoc *doc,CSprite *root,I64 *cur_num); -extern Bool GrBlot3(CDC *dc,I64 x1,I64 y1,I64 z1,CDC *img); +extern I64 GrBlot3(CDC *dc,I64 x1,I64 y1,I64 z1,CDC *img); extern U8 *GrBitMap4ToBitMap8(U8 *dst,U8 *src,I64 src_size,I64 bkcolor); #include "GrCfg" @@ -114,16 +112,15 @@ extern U8 *GrBitMap4ToBitMap8(U8 *dst,U8 *src,I64 src_size,I64 bkcolor); #include "GrComposites" #include "GrChar" -#define GE_CANCEL (-1) -#define GE_OKAY_DONE 0 -#define GE_OKAY_CONT 1 +#define GE_ABORT (-1) +#define GE_EXIT 0 +#define GE_CONT 1 #include "CSpriteNew" #include "GrSpritePlot" #include "CSpriteMesh" #include "CSpriteBitMap" -#include "CSpriteVect" #include "CSpriteEd" -#include "GrVectMap" +#include "CSpriteMain" #help_index "" diff --git a/TempleOS/Adam/Gr/GrAsm.CPP b/TempleOS/Adam/Gr/GrAsm.CPP index c6f156c..f5507fc 100644 --- a/TempleOS/Adam/Gr/GrAsm.CPP +++ b/TempleOS/Adam/Gr/GrAsm.CPP @@ -613,7 +613,7 @@ _IS_PIXEL_COVERED0:: RET1 24 // ************************************ _GR_ROP_EQU_U8_NO_CLIPPING:: -//Puts foreground char shape onto gr_dc. +//Puts foreground char shape onto gr_dc2. //ch.u8[1] is color as a whole byte //ch DOCEt_UNDERLINE attr flag is used. ENTER 0 diff --git a/TempleOS/Adam/Gr/GrBitMap.CPP b/TempleOS/Adam/Gr/GrBitMap.CPP index f7bcc87..ef7c73a 100644 --- a/TempleOS/Adam/Gr/GrBitMap.CPP +++ b/TempleOS/Adam/Gr/GrBitMap.CPP @@ -73,7 +73,7 @@ public I64 GrPeek0(CDC *dc,I64 x,I64 y) #help_index "Graphics;Graphics/DCs" -public Bool GrBlot(CDC *dc,I64 x,I64 y,CDC *img) +public I64 GrBlot(CDC *dc,I64 x,I64 y,CDC *img) { //Clipping but not transformation I64 i,j,k,k1,kk,kk1,w1,h1,w2,h2, leading_bits,leading_bit_mask,whole_bytes,trailing_bits,trailing_bit_mask, @@ -90,8 +90,14 @@ public Bool GrBlot(CDC *dc,I64 x,I64 y,CDC *img) x+=win_task->win_scroll_x; y+=win_task->win_scroll_y; } - w1=x<0 ?-x:0; - h1=y<0 ?-y:0; + if (x<0) + w1=-x; + else + w1=0; + if (y<0) + h1=-y; + else + h1=0; w2=img->width; h2=img->height; if (dc->flags & DCF_SCREEN_BITMAP) { @@ -126,7 +132,7 @@ public Bool GrBlot(CDC *dc,I64 x,I64 y,CDC *img) if (y+h2-1>dc->max_y) dc->max_y=y+h2-1; } if (dc->flags & DCF_DONT_DRAW) - return TRUE; + return 1; old_color=dc->color; db=dc->depth_buf; dc->depth_buf=NULL; @@ -171,7 +177,12 @@ public Bool GrBlot(CDC *dc,I64 x,I64 y,CDC *img) else { win_z_num=win_task->win_z_num; win_z_buf_ptr=gr_win_z_buf(U8 *)+((h1+y)/FONT_HEIGHT*TEXT_COLS+(w1+x)/FONT_WIDTH)*sizeof(U16); - win_z_buf_line_dec=((leading_bits?1:0)+whole_bytes+(trailing_bits?1:0))*sizeof(U16); + win_z_buf_line_dec=whole_bytes; + if (leading_bits) + win_z_buf_line_dec++; + if (trailing_bits) + win_z_buf_line_dec++; + win_z_buf_line_dec*=sizeof(U16); win_z_buf_line_inc=TEXT_COLS*sizeof(U16)-win_z_buf_line_dec; } kk = h1 *img ->width_internal+w1; @@ -186,7 +197,7 @@ public Bool GrBlot(CDC *dc,I64 x,I64 y,CDC *img) if (win_z_num>=*win_z_buf_ptr++) { if (bit_shift) *dst(I64 *)++=*dst(I64 *)&leading_bit_mask| - (*src(I64 *)++>>bit_shift|*src(I64 *)<<(64-bit_shift))&~leading_bit_mask&color_mask; + (*src(U64 *)++>>bit_shift|*src(I64 *)<<(64-bit_shift))&~leading_bit_mask&color_mask; else *dst(I64 *)++=*dst(I64 *)&leading_bit_mask| *src(I64 *)++&~leading_bit_mask&color_mask; @@ -198,7 +209,7 @@ public Bool GrBlot(CDC *dc,I64 x,I64 y,CDC *img) if (bit_shift) for (i=0;i=*win_z_buf_ptr++) - *dst(I64 *)++=(*src(I64 *)++>>bit_shift|*src(I64 *)<<(64-bit_shift))&color_mask; + *dst(I64 *)++=(*src(U64 *)++>>bit_shift|*src(I64 *)<<(64-bit_shift))&color_mask; else { src(I64 *)++; dst(I64 *)++; @@ -214,7 +225,7 @@ public Bool GrBlot(CDC *dc,I64 x,I64 y,CDC *img) if (trailing_bits && win_z_num>=*win_z_buf_ptr++) { if (bit_shift) *dst(I64 *)=*dst(I64 *)&trailing_bit_mask| - (*src(I64 *)++>>bit_shift|*src(I64 *)<<(64-bit_shift))&~trailing_bit_mask&color_mask; + (*src(U64 *)++>>bit_shift|*src(I64 *)<<(64-bit_shift))&~trailing_bit_mask&color_mask; else *dst(I64 *)=*dst(I64 *)&trailing_bit_mask| *src(I64 *)++&~trailing_bit_mask&color_mask; @@ -233,14 +244,14 @@ public Bool GrBlot(CDC *dc,I64 x,I64 y,CDC *img) if (leading_bits) { if (bit_shift) *dst(I64 *)++=*dst(I64 *)&leading_bit_mask| - (*src(I64 *)++>>bit_shift|*src(I64 *)<<(64-bit_shift))&~leading_bit_mask&color_mask; + (*src(U64 *)++>>bit_shift|*src(I64 *)<<(64-bit_shift))&~leading_bit_mask&color_mask; else *dst(I64 *)++=*dst(I64 *)&leading_bit_mask| *src(I64 *)++&~leading_bit_mask&color_mask; } if (bit_shift) for (i=0;i>bit_shift|*src(I64 *)<<(64-bit_shift))&color_mask; + *dst(I64 *)++=(*src(U64 *)++>>bit_shift|*src(I64 *)<<(64-bit_shift))&color_mask; else for (i=0;i>bit_shift|*src(I64 *)<<(64-bit_shift))&~trailing_bit_mask&color_mask; + (*src(U64 *)++>>bit_shift|*src(I64 *)<<(64-bit_shift))&~trailing_bit_mask&color_mask; else *dst(I64 *)=*dst(I64 *)&trailing_bit_mask| *src(I64 *)++&~trailing_bit_mask&color_mask; @@ -268,7 +279,12 @@ public Bool GrBlot(CDC *dc,I64 x,I64 y,CDC *img) } else { win_z_num =win_task->win_z_num; win_z_buf_ptr =gr_win_z_buf(U8 *)+((h1+y)/FONT_HEIGHT*TEXT_COLS+(w1+x)/FONT_WIDTH)*sizeof(U16); - win_z_buf_line_dec=((leading_bits?1:0)+whole_bytes+(trailing_bits?1:0))*sizeof(U16); + win_z_buf_line_dec=whole_bytes; + if (leading_bits) + win_z_buf_line_dec++; + if (trailing_bits) + win_z_buf_line_dec++; + win_z_buf_line_dec*=sizeof(U16); win_z_buf_line_inc=TEXT_COLS*sizeof(U16)-win_z_buf_line_dec; for (j=h1;j=*win_z_buf_ptr++) @@ -302,7 +318,12 @@ public Bool GrBlot(CDC *dc,I64 x,I64 y,CDC *img) else { win_z_num=win_task->win_z_num; win_z_buf_ptr=gr_win_z_buf(U8 *)+((h1+y)/FONT_HEIGHT*TEXT_COLS+(w1+x)/FONT_WIDTH)*sizeof(U16); - win_z_buf_line_dec=((leading_bits?1:0)+whole_bytes+(trailing_bits?1:0))*sizeof(U16); + win_z_buf_line_dec=whole_bytes; + if (leading_bits) + win_z_buf_line_dec++; + if (trailing_bits) + win_z_buf_line_dec++; + win_z_buf_line_dec*=sizeof(U16); win_z_buf_line_inc=TEXT_COLS*sizeof(U16)-win_z_buf_line_dec; } kk = h1 *img ->width_internal+w1; @@ -317,7 +338,7 @@ public Bool GrBlot(CDC *dc,I64 x,I64 y,CDC *img) if (win_z_num>=*win_z_buf_ptr++) { if (bit_shift) *dst(I64 *)++=*dst(I64 *)&leading_bit_mask| - (*src(I64 *)++>>bit_shift|*src(I64 *)<<(64-bit_shift))&~leading_bit_mask; + (*src(U64 *)++>>bit_shift|*src(I64 *)<<(64-bit_shift))&~leading_bit_mask; else *dst(I64 *)++=*dst(I64 *)&leading_bit_mask| *src(I64 *)++&~leading_bit_mask; @@ -329,7 +350,7 @@ public Bool GrBlot(CDC *dc,I64 x,I64 y,CDC *img) if (bit_shift) for (i=0;i=*win_z_buf_ptr++) - *dst(I64 *)++=*src(I64 *)++>>bit_shift|*src(I64 *)<<(64-bit_shift); + *dst(I64 *)++=*src(U64 *)++>>bit_shift|*src(I64 *)<<(64-bit_shift); else { src(I64 *)++; dst(I64 *)++; @@ -345,7 +366,7 @@ public Bool GrBlot(CDC *dc,I64 x,I64 y,CDC *img) if (trailing_bits && win_z_num>=*win_z_buf_ptr++) { if (bit_shift) *dst(I64 *)=*dst(I64 *)&trailing_bit_mask| - (*src(I64 *)++>>bit_shift|*src(I64 *)<<(64-bit_shift))&~trailing_bit_mask; + (*src(U64 *)++>>bit_shift|*src(I64 *)<<(64-bit_shift))&~trailing_bit_mask; else *dst(I64 *)=*dst(I64 *)&trailing_bit_mask| *src(I64 *)++&~trailing_bit_mask; @@ -364,14 +385,14 @@ public Bool GrBlot(CDC *dc,I64 x,I64 y,CDC *img) if (leading_bits) { if (bit_shift) *dst(I64 *)++=*dst(I64 *)&leading_bit_mask| - (*src(I64 *)++>>bit_shift|*src(I64 *)<<(64-bit_shift))&~leading_bit_mask; + (*src(U64 *)++>>bit_shift|*src(I64 *)<<(64-bit_shift))&~leading_bit_mask; else *dst(I64 *)++=*dst(I64 *)&leading_bit_mask| *src(I64 *)++&~leading_bit_mask; } if (bit_shift) for (i=0;i>bit_shift|*src(I64 *)<<(64-bit_shift); + *dst(I64 *)++=*src(U64 *)++>>bit_shift|*src(I64 *)<<(64-bit_shift); else for (i=0;i>bit_shift|*src(I64 *)<<(64-bit_shift))&~trailing_bit_mask; + (*src(U64 *)++>>bit_shift|*src(I64 *)<<(64-bit_shift))&~trailing_bit_mask; else *dst(I64 *)=*dst(I64 *)&trailing_bit_mask| *src(I64 *)++&~trailing_bit_mask; @@ -404,7 +425,12 @@ here1a: } else { win_z_num =win_task->win_z_num; win_z_buf_ptr =gr_win_z_buf(U8 *)+((h1+y)/FONT_HEIGHT*TEXT_COLS+(w1+x)/FONT_WIDTH)*sizeof(U16); - win_z_buf_line_dec=((leading_bits?1:0)+whole_bytes+(trailing_bits?1:0))*sizeof(U16); + win_z_buf_line_dec=whole_bytes; + if (leading_bits) + win_z_buf_line_dec++; + if (trailing_bits) + win_z_buf_line_dec++; + win_z_buf_line_dec*=sizeof(U16); win_z_buf_line_inc=TEXT_COLS*sizeof(U16)-win_z_buf_line_dec; for (j=h1;j=*win_z_buf_ptr++) @@ -443,7 +469,12 @@ here1a: else { win_z_num=win_task->win_z_num; win_z_buf_ptr=gr_win_z_buf(U8 *)+((h1+y)/FONT_HEIGHT*TEXT_COLS+(w1+x)/FONT_WIDTH)*sizeof(U16); - win_z_buf_line_dec=((leading_bits?1:0)+whole_bytes+(trailing_bits?1:0))*sizeof(U16); + win_z_buf_line_dec=whole_bytes; + if (leading_bits) + win_z_buf_line_dec++; + if (trailing_bits) + win_z_buf_line_dec++; + win_z_buf_line_dec*=sizeof(U16); win_z_buf_line_inc=TEXT_COLS*sizeof(U16)-win_z_buf_line_dec; } kk = h1 *img ->width_internal +w1; @@ -458,7 +489,7 @@ here1a: if (win_z_num>=*win_z_buf_ptr++) { if (bit_shift) *dst(I64 *)++=*dst(I64 *)&leading_bit_mask| - (*dst(I64 *)^(*src(I64 *)++>>bit_shift|*src(I64 *)<<(64-bit_shift)))&~leading_bit_mask; + (*dst(I64 *)^(*src(U64 *)++>>bit_shift|*src(I64 *)<<(64-bit_shift)))&~leading_bit_mask; else *dst(I64 *)++=*dst(I64 *)&leading_bit_mask| (*dst(I64 *)^*src(I64 *)++)&~leading_bit_mask; @@ -470,7 +501,7 @@ here1a: if (bit_shift) for (i=0;i=*win_z_buf_ptr++) - *dst(I64 *)++^=*src(I64 *)++>>bit_shift|*src(I64 *)<<(64-bit_shift); + *dst(I64 *)++^=*src(U64 *)++>>bit_shift|*src(I64 *)<<(64-bit_shift); else { src(I64 *)++; dst(I64 *)++; @@ -486,7 +517,7 @@ here1a: if (trailing_bits && win_z_num>=*win_z_buf_ptr++) { if (bit_shift) *dst(I64 *)=*dst(I64 *)&trailing_bit_mask| - (*dst(I64 *)^(*src(I64 *)++>>bit_shift|*src(I64 *)<<(64-bit_shift)))&~trailing_bit_mask; + (*dst(I64 *)^(*src(U64 *)++>>bit_shift|*src(I64 *)<<(64-bit_shift)))&~trailing_bit_mask; else *dst(I64 *)=*dst(I64 *)&trailing_bit_mask| (*dst(I64 *)^*src(I64 *)++)&~trailing_bit_mask; @@ -505,21 +536,21 @@ here1a: if (leading_bits) { if (bit_shift) *dst(I64 *)++=*dst(I64 *)&leading_bit_mask| - (*dst(I64 *)^(*src(I64 *)++>>bit_shift|*src(I64 *)<<(64-bit_shift)))&~leading_bit_mask; + (*dst(I64 *)^(*src(U64 *)++>>bit_shift|*src(I64 *)<<(64-bit_shift)))&~leading_bit_mask; else *dst(I64 *)++=*dst(I64 *)&leading_bit_mask| (*dst(I64 *)^*src(I64 *)++)&~leading_bit_mask; } if (bit_shift) for (i=0;i>bit_shift|*src(I64 *)<<(64-bit_shift); + *dst(I64 *)++^=*src(U64 *)++>>bit_shift|*src(I64 *)<<(64-bit_shift); else for (i=0;i>bit_shift|*src(I64 *)<<(64-bit_shift)))&~trailing_bit_mask; + (*dst(I64 *)^(*src(U64 *)++>>bit_shift|*src(I64 *)<<(64-bit_shift)))&~trailing_bit_mask; else *dst(I64 *)=*dst(I64 *)&trailing_bit_mask| (*dst(I64 *)^*src(I64 *)++)&~trailing_bit_mask; @@ -534,9 +565,9 @@ here1a: } dc->depth_buf=db; dc->color=old_color; - return TRUE; + return 1; } else - return FALSE; + return 0; } U8 *GrBitMap4ToBitMap8(U8 *dst,U8 *src,I64 src_size,I64 bkcolor) @@ -587,7 +618,7 @@ public CDC *DCExtract(CDC *dc,I64 x1,I64 y1,I64 x2,I64 y2,CTask *task=NULL) #help_index "Graphics/Char;Char/Graphics" -public Bool GrPutChar(CDC *dc,I64 x,I64 y,U8 ch) +public I64 GrPutChar(CDC *dc,I64 x,I64 y,U8 ch) { //Clipping but not transformation U8 reg *src,reg *dst,*font_ptr; I64 i,m,leading_bits,trailing_bits,leading_bit_mask,trailing_bit_mask, @@ -601,8 +632,14 @@ public Bool GrPutChar(CDC *dc,I64 x,I64 y,U8 ch) y+=win_task->win_scroll_y; } - w1=x<0 ?-x:0; - h1=y<0 ?-y:0; + if (x<0) + w1=-x; + else + w1=0; + if (y<0) + h1=-y; + else + h1=0; w2=FONT_WIDTH; h2=FONT_HEIGHT; @@ -638,7 +675,7 @@ public Bool GrPutChar(CDC *dc,I64 x,I64 y,U8 ch) if (y+h2-1>dc->max_y) dc->max_y=y+h2-1; } if (dc->flags & DCF_DONT_DRAW) - return TRUE; + return 1; color=dc->color; if (dc->type==DCT_COLOR8) { leading_bits=-(w1+x)&7; @@ -789,16 +826,17 @@ public Bool GrPutChar(CDC *dc,I64 x,I64 y,U8 ch) } } } - return TRUE; + return 1; } else - return FALSE; + return 0; } -public Bool GrPutS(CDC *dc,I64 x,I64 y,U8 *_s) +public I64 GrPutS(CDC *dc,I64 x,I64 y,U8 *_s) { - I64 x0=x,ch; - Bool result=FALSE,first=TRUE; - if (!_s) return FALSE; + I64 x0,ch,result; + if (!_s) return 0; + x0=x; + result=0; while (ch=*_s++) { if (ch=='\n') { x=x0; @@ -806,23 +844,21 @@ public Bool GrPutS(CDC *dc,I64 x,I64 y,U8 *_s) } else if (ch=='\t') x=x0+CeilU64(x-x0+FONT_WIDTH,8*FONT_WIDTH); else { - if (first) { - result=GrPutChar(dc,x,y,ch); - first=FALSE; - } else - GrPutChar(dc,x,y,ch); + result+=GrPutChar(dc,x,y,ch); x+=FONT_WIDTH; } } return result; } -public Bool GrVPutS(CDC *dc,I64 x,I64 y,U8 *_s) +public I64 GrVPutS(CDC *dc,I64 x,I64 y,U8 *_s) { //Vertical text - I64 y0=y; + I64 y0,result; U8 buf[2]; - Bool result=FALSE,first=TRUE; - if (!_s) return FALSE; + if (!_s) return 0; + y0=y; + result=0; + buf[1]=0; while (*buf=*_s++) { if (*buf=='\n') { @@ -831,11 +867,7 @@ public Bool GrVPutS(CDC *dc,I64 x,I64 y,U8 *_s) } else if (*buf=='\t') y=y0+CeilU64(y-y0+FONT_HEIGHT,8*FONT_HEIGHT); else { - if (first) { - result=GrPutS(dc,x,y,buf); - first=FALSE; - } else - GrPutS(dc,x,y,buf); + result+=GrPutS(dc,x,y,buf); y+=FONT_HEIGHT; } } @@ -875,8 +907,14 @@ public I64 GrRect(CDC *dc,I64 x,I64 y,I64 w,I64 h) y+=win_task->win_scroll_y; } - w1=x<0 ?-x:0; - h1=y<0 ?-y:0; + if (x<0) + w1=-x; + else + w1=0; + if (y<0) + h1=-y; + else + h1=0; w2=w; h2=h; @@ -972,7 +1010,12 @@ public I64 GrRect(CDC *dc,I64 x,I64 y,I64 w,I64 h) else { win_z_num=win_task->win_z_num; win_z_buf_ptr=gr_win_z_buf(U8 *)+((h1+y)/FONT_HEIGHT*TEXT_COLS+(w1+x)/FONT_WIDTH)*sizeof(U16); - win_z_buf_line_dec=((leading_bits?1:0)+whole_bytes+(trailing_bits?1:0))*sizeof(U16); + win_z_buf_line_dec=whole_bytes; + if (leading_bits) + win_z_buf_line_dec++; + if (trailing_bits) + win_z_buf_line_dec++; + win_z_buf_line_dec*=sizeof(U16); win_z_buf_line_inc=TEXT_COLS*sizeof(U16)-win_z_buf_line_dec; } kk1=(h1+y)*dc->width_internal+x+w1; @@ -1118,7 +1161,12 @@ public I64 GrRect(CDC *dc,I64 x,I64 y,I64 w,I64 h) else { win_z_num=win_task->win_z_num; win_z_buf_ptr=gr_win_z_buf(U8 *)+((h1+y)/FONT_HEIGHT*TEXT_COLS+(w1+x)/FONT_WIDTH)*sizeof(U16); - win_z_buf_line_dec=((leading_bits?1:0)+whole_bytes+(trailing_bits?1:0))*sizeof(U16); + win_z_buf_line_dec=whole_bytes; + if (leading_bits) + win_z_buf_line_dec++; + if (trailing_bits) + win_z_buf_line_dec++; + win_z_buf_line_dec*=sizeof(U16); win_z_buf_line_inc=TEXT_COLS*sizeof(U16)-win_z_buf_line_dec; } color_mask=gr_1_to_8_colors[color.c0.color]; diff --git a/TempleOS/Adam/Gr/GrComposites.CPP b/TempleOS/Adam/Gr/GrComposites.CPP index 8258c77..b67e242 100644 --- a/TempleOS/Adam/Gr/GrComposites.CPP +++ b/TempleOS/Adam/Gr/GrComposites.CPP @@ -1,7 +1,7 @@ #help_index "Graphics" public U0 GrLineRect4(CDC *dc,I64 x1,I64 y1,I64 x2,I64 y2,I64 step=1,I64 start=0) { -//Can be used with ROPF_DITHER+WHITE<<16+ROP_EQU+BLACK +//Can be used with ROPF_DITHER+WHITE<<16+BLACK //for dotted rect. GrLine3(dc,x1,y1,0,x2,y1,0,step,start); GrLine3(dc,x2,y1,0,x2,y2,0,step,start); @@ -9,9 +9,9 @@ public U0 GrLineRect4(CDC *dc,I64 x1,I64 y1,I64 x2,I64 y2,I64 step=1,I64 start=0 GrLine3(dc,x1,y2,0,x1,y1,0,step,start); } -public U0 GrArrow3(CDC *dc,I64 x1,I64 y1,I64 z1,I64 x2,I64 y2,I64 z2,F64 w=2.75,I64 step=1,I64 start=0) +public I64 GrArrow3(CDC *dc,I64 x1,I64 y1,I64 z1,I64 x2,I64 y2,I64 z2,F64 w=2.75,I64 step=1,I64 start=0) { //transformation with pen width - I64 _x1,_y1,_z1,_x2,_y2,_z2,dx,dy; + I64 _x1,_y1,_z1,_x2,_y2,_z2,dx,dy,result=0; F64 d; Bool was_transform=FALSE,was_symmetry=FALSE; if (dc->flags & DCF_TRANSFORMATION) { @@ -26,40 +26,43 @@ public U0 GrArrow3(CDC *dc,I64 x1,I64 y1,I64 z1,I64 x2,I64 y2,I64 z2,F64 w=2.75, _x2=x2; _y2=y2; _z2=z2; GrReflect(dc,&_x2,&_y2,&_z2); dc->flags&=~DCF_SYMMETRY; - Line(dc,_x1,_y1,_z1,_x2,_y2,_z2,&GrPlot3,step,start); + result=Line(dc,_x1,_y1,_z1,_x2,_y2,_z2,&GrPlot3,step,start); dx=_x2-_x1; dy=_y2-_y1; if (d=Sqrt(dx*dx+dy*dy)) { d=w*dc->pen_width/d; - Line(dc,_x2-dx*d+dy*d+0.5,_y2-dy*d-dx*d+0.5,_z2,_x2,_y2,_z2,&GrPlot3,step); - Line(dc,_x2-dx*d-dy*d+0.5,_y2-dy*d+dx*d+0.5,_z2,_x2,_y2,_z2,&GrPlot3,step); + result+=Line(dc,_x2-dx*d+dy*d+0.5,_y2-dy*d-dx*d+0.5,_z2,_x2,_y2,_z2,&GrPlot3,step); + result+=Line(dc,_x2-dx*d-dy*d+0.5,_y2-dy*d+dx*d+0.5,_z2,_x2,_y2,_z2,&GrPlot3,step); } was_symmetry=TRUE; if (dc->flags&DCF_JUST_MIRROR) goto gr_done; } - Line(dc,x1,y1,z1,x2,y2,z2,&GrPlot3,step,start); + result+=Line(dc,x1,y1,z1,x2,y2,z2,&GrPlot3,step,start); dx=x2-x1; dy=y2-y1; if (d=Sqrt(dx*dx+dy*dy)) { d=w*dc->pen_width/d; - Line(dc,x2-dx*d+dy*d+0.5,y2-dy*d-dx*d+0.5,z2,x2,y2,z2,&GrPlot3,step); - Line(dc,x2-dx*d-dy*d+0.5,y2-dy*d+dx*d+0.5,z2,x2,y2,z2,&GrPlot3,step); + result+=Line(dc,x2-dx*d+dy*d+0.5,y2-dy*d-dx*d+0.5,z2,x2,y2,z2,&GrPlot3,step); + result+=Line(dc,x2-dx*d-dy*d+0.5,y2-dy*d+dx*d+0.5,z2,x2,y2,z2,&GrPlot3,step); } gr_done: if (was_transform) dc->flags|=DCF_TRANSFORMATION; if (was_symmetry) dc->flags|=DCF_SYMMETRY; + return result; } #help_index "Graphics/Char;Char/Graphics" -public Bool GrTextBox3(CDC *dc,I64 x1,I64 y1,I64 z1,U8 *s,I64 border=2) +public I64 GrTextBox3(CDC *dc,I64 x1,I64 y1,I64 z1,U8 *s,I64 border=2) { //transformation //DCF_SYMMETRY is silly. - Bool result; - U8 ch,*ptr=s; - I64 w=0,w_max=0,h=FONT_HEIGHT; - if (!s) return FALSE; + U8 ch,*ptr; + I64 w,w_max,h,result; + if (!s) return 0; + ptr=s; + w=0; w_max=0; h=FONT_HEIGHT; result=0; + if (dc->flags & DCF_TRANSFORMATION) (*dc->transform)(dc,&x1,&y1,&z1); while (ch=*ptr++) { @@ -74,21 +77,21 @@ public Bool GrTextBox3(CDC *dc,I64 x1,I64 y1,I64 z1,U8 *s,I64 border=2) } if (w>w_max) w_max=w; result=GrPutS(dc,x1,y1,s); - GrLine(dc,x1-border ,y1-border ,x1+w_max+border,y1-border); - GrLine(dc,x1-border ,y1+h+border,x1+w_max+border,y1+h+border); - GrLine(dc,x1-border ,y1-border ,x1-border,y1+h+border); - GrLine(dc,x1+w_max+border,y1-border ,x1+w_max+border,y1+h+border); + result+=GrLine(dc,x1-border ,y1-border ,x1+w_max+border,y1-border); + result+=GrLine(dc,x1-border ,y1+h+border,x1+w_max+border,y1+h+border); + result+=GrLine(dc,x1-border ,y1-border ,x1-border,y1+h+border); + result+=GrLine(dc,x1+w_max+border,y1-border ,x1+w_max+border,y1+h+border); return result; } #define MAX_DIAMOND_SLOPE 2.75 -public Bool GrTextDiamond3(CDC *dc,I64 x1,I64 y1,I64 z1,U8 *_s,I64 border=2) +public I64 GrTextDiamond3(CDC *dc,I64 x1,I64 y1,I64 z1,U8 *_s,I64 border=2) { //transformation //DCF_SYMMETRY is silly. - Bool result=FALSE,first=TRUE; + Bool first=TRUE; U8 ch,*ptr,*ptr_end,*st,*s; - I64 y,dx,dy,dx_old,dy_old,w,h=FONT_HEIGHT; + I64 y,dx,dy,dx_old,dy_old,w,h=FONT_HEIGHT,result=0; F64 m; if (!_s) return FALSE; if (dc->flags & DCF_TRANSFORMATION) @@ -96,7 +99,7 @@ public Bool GrTextDiamond3(CDC *dc,I64 x1,I64 y1,I64 z1,U8 *_s,I64 border=2) ptr=s=StrNew(_s); while (ch=*ptr) { - if (ch==CH_CARRIAGE_RETURN||ch=='\t') + if (ch=='\r'||ch=='\t') *ptr=CH_SPACE; if (ch=='\n') { *ptr=0; @@ -117,10 +120,10 @@ public Bool GrTextDiamond3(CDC *dc,I64 x1,I64 y1,I64 z1,U8 *_s,I64 border=2) w=(StrLen(st)*FONT_WIDTH)>>1; if (first) { - result=GrPutS(dc,x1-w,y,st); + result+=GrPutS(dc,x1-w,y,st); first=FALSE; } else - GrPutS(dc,x1-w,y,st); + result+=GrPutS(dc,x1-w,y,st); if (w) { w+=border; do { @@ -141,10 +144,10 @@ public Bool GrTextDiamond3(CDC *dc,I64 x1,I64 y1,I64 z1,U8 *_s,I64 border=2) } Free(s); - GrLine(dc,x1,y1-dy,x1+dx,y1); - GrLine(dc,x1+dx,y1,x1,y1+dy); - GrLine(dc,x1,y1+dy,x1-dx,y1); - GrLine(dc,x1-dx,y1,x1,y1-dy); + result+=GrLine(dc,x1,y1-dy,x1+dx,y1); + result+=GrLine(dc,x1+dx,y1,x1,y1+dy); + result+=GrLine(dc,x1,y1+dy,x1-dx,y1); + result+=GrLine(dc,x1-dx,y1,x1,y1-dy); return result; } diff --git a/TempleOS/Adam/Gr/GrDC.CPP b/TempleOS/Adam/Gr/GrDC.CPP index 4e1d328..ab605d1 100644 --- a/TempleOS/Adam/Gr/GrDC.CPP +++ b/TempleOS/Adam/Gr/GrDC.CPP @@ -23,7 +23,7 @@ public U0 DCRst(CDC *dc) public CDC *DCAlias(CDC *dc=NULL,CTask *task=NULL) { CDC *result; - if (!dc) dc=gr_dc2; + if (!dc) dc=gr_dc; if (!task) task=Fs; if (dc->dc_signature!=DCS_SIGNATURE_VAL) Dbg; @@ -255,9 +255,9 @@ public CDC *GRARead(U8 *filename,CTask *task=NULL) } #help_index "Graphics/CSprite;Graphics/DCs;Doc/Output" -public U0 DocPutGRAFile(CDoc *doc=NULL,U8 *fname) +public U0 DocPutGRAFile(CDoc *doc=NULL,U8 *filename) { - CDC *dc=GRARead(fname); + CDC *dc=GRARead(filename); CSprite *elems=DC2Sprite(dc); DocPutSprite(doc,elems); Free(elems); diff --git a/TempleOS/Adam/Gr/GrPrimatives.CPP b/TempleOS/Adam/Gr/GrPrimatives.CPP index 11f59b6..da07d1e 100644 --- a/TempleOS/Adam/Gr/GrPrimatives.CPP +++ b/TempleOS/Adam/Gr/GrPrimatives.CPP @@ -434,28 +434,32 @@ Bool GrLinePlot(CDC *dc,I64 x,I64 y,I64 z) return TRUE; } -public U0 GrLine(CDC *dc,I64 x1,I64 y1,I64 x2,I64 y2,I64 step=1,I64 start=0) +public I64 GrLine(CDC *dc,I64 x1,I64 y1,I64 x2,I64 y2,I64 step=1,I64 start=0) { + I64 result=0; I32 *db=dc->depth_buf; dc->depth_buf=NULL; if (step==1 && !start && !dc->brush && !dc->depth_buf) { if (DCClipLine(dc,&x1,&y1,&x2,&y2)) - Line(dc,x1,y1,0,x2,y2,0,&GrLinePlot0,step,start); + result=Line(dc,x1,y1,0,x2,y2,0,&GrLinePlot0,step,start); } else - Line(dc,x1,y1,0,x2,y2,0,&GrLinePlot,step,start); + result=Line(dc,x1,y1,0,x2,y2,0,&GrLinePlot,step,start); dc->depth_buf=db; + return result; } -public U0 GrCircle(CDC *dc,I64 cx,I64 cy,I64 radius, +public I64 GrCircle(CDC *dc,I64 cx,I64 cy,I64 radius, I64 step=1,F64 start_radians=0,F64 len_radians=2*ã) { + I64 result; I32 *db=dc->depth_buf; dc->depth_buf=NULL; - Circle(dc,cx,cy,0,radius,&GrLinePlot,step,start_radians,len_radians); + result=Circle(dc,cx,cy,0,radius,&GrLinePlot,step,start_radians,len_radians); dc->depth_buf=db; + return result; } -public U0 GrEllipse(CDC *dc, +public I64 GrEllipse(CDC *dc, I64 cx,I64 cy, I64 x_radius,I64 y_radius, F64 rot_angle=0, @@ -463,13 +467,15 @@ public U0 GrEllipse(CDC *dc, F64 start_radians=0, F64 len_radians=2*ã) { + I64 result; I32 *db=dc->depth_buf; dc->depth_buf=NULL; - Ellipse(dc,cx,cy,0,x_radius,y_radius,&GrLinePlot,rot_angle,step,start_radians,len_radians); + result=Ellipse(dc,cx,cy,0,x_radius,y_radius,&GrLinePlot,rot_angle,step,start_radians,len_radians); dc->depth_buf=db; + return result; } -public U0 GrRegPoly(CDC *dc, +public I64 GrRegPoly(CDC *dc, I64 cx,I64 cy, I64 x_radius,I64 y_radius,I64 sides, F64 rot_angle=0, @@ -477,36 +483,38 @@ public U0 GrRegPoly(CDC *dc, F64 start_radians=0, F64 len_radians=2*ã) { + I64 result; I32 *db=dc->depth_buf; dc->depth_buf=NULL; - RegPoly(dc,cx,cy,0,x_radius,y_radius,sides, + result=RegPoly(dc,cx,cy,0,x_radius,y_radius,sides, &GrLinePlot,rot_angle,step,start_radians,len_radians); dc->depth_buf=db; + return result; } -public U0 Gr2Bezier(CDC *dc,CD3I32 *ctrl) +public I64 Gr2Bezier(CDC *dc,CD3I32 *ctrl) { - Bezier2(dc,ctrl,&GrLinePlot); + return Bezier2(dc,ctrl,&GrLinePlot); } -public U0 Gr3Bezier(CDC *dc,CD3I32 *ctrl) +public I64 Gr3Bezier(CDC *dc,CD3I32 *ctrl) { - Bezier3(dc,ctrl,&GrLinePlot); + return Bezier3(dc,ctrl,&GrLinePlot); } -public U0 Gr2BSpline(CDC *dc,CD3I32 *ctrl,I64 cnt,Bool closed=FALSE) +public I64 Gr2BSpline(CDC *dc,CD3I32 *ctrl,I64 cnt,Bool closed=FALSE) { - BSpline2(dc,ctrl,cnt,&GrLinePlot,closed); + return BSpline2(dc,ctrl,cnt,&GrLinePlot,closed); } -public U0 Gr3BSpline(CDC *dc,CD3I32 *ctrl,I64 cnt,Bool closed=FALSE) +public I64 Gr3BSpline(CDC *dc,CD3I32 *ctrl,I64 cnt,Bool closed=FALSE) { - BSpline3(dc,ctrl,cnt,&GrLinePlot,closed); + return BSpline3(dc,ctrl,cnt,&GrLinePlot,closed); } -public U0 GrLine3(CDC *dc,I64 x1,I64 y1,I64 z1,I64 x2,I64 y2,I64 z2,I64 step=1,I64 start=0) +public I64 GrLine3(CDC *dc,I64 x1,I64 y1,I64 z1,I64 x2,I64 y2,I64 z2,I64 step=1,I64 start=0) { - I64 _x1,_y1,_z1,_x2,_y2,_z2; + I64 _x1,_y1,_z1,_x2,_y2,_z2,result=0; Bool was_transform=FALSE,was_symmetry=FALSE; if (dc->flags & DCF_TRANSFORMATION) { (*dc->transform)(dc,&x1,&y1,&z1); @@ -522,23 +530,24 @@ public U0 GrLine3(CDC *dc,I64 x1,I64 y1,I64 z1,I64 x2,I64 y2,I64 z2,I64 step=1,I dc->flags&=~DCF_SYMMETRY; if (step==1 && !start && !dc->brush && dc->pen_width<2 && !dc->depth_buf) { //TODO: clip z for depth buf if (DCClipLine(dc,&_x1,&_y1,&_x2,&_y2)) - Line(dc,_x1,_y1,0,_x2,_y2,0,&GrLinePlot0,step,start); + result=Line(dc,_x1,_y1,0,_x2,_y2,0,&GrLinePlot0,step,start); } else - Line(dc,_x1,_y1,_z1,_x2,_y2,_z2,&GrPlot3,step,start); + result=Line(dc,_x1,_y1,_z1,_x2,_y2,_z2,&GrPlot3,step,start); was_symmetry=TRUE; if (dc->flags&DCF_JUST_MIRROR) goto gr_done; } if (step==1 && !start && !dc->brush && dc->pen_width<2 && !dc->depth_buf) { //TODO: clip z for depth buf if (DCClipLine(dc,&x1,&y1,&x2,&y2)) - Line(dc,x1,y1,0,x2,y2,0,&GrLinePlot0,step,start); + result+=Line(dc,x1,y1,0,x2,y2,0,&GrLinePlot0,step,start); } else - Line(dc,x1,y1,z1,x2,y2,z2,&GrPlot3,step,start); + result+=Line(dc,x1,y1,z1,x2,y2,z2,&GrPlot3,step,start); gr_done: if (was_transform) dc->flags|=DCF_TRANSFORMATION; if (was_symmetry) dc->flags|=DCF_SYMMETRY; + return result; } #help_index "Graphics/Char;Char/Graphics" @@ -584,7 +593,7 @@ public U0 GrVPrintF3(CDC *dc,I64 x,I64 y,I64 z,U8 *fmt,...) #help_index "Graphics" -public U0 GrEllipse3(CDC *dc, +public I64 GrEllipse3(CDC *dc, I64 cx,I64 cy,I64 cz, I64 x_radius,I64 y_radius, F64 rot_angle=0, @@ -592,7 +601,7 @@ public U0 GrEllipse3(CDC *dc, F64 start_radians=0, F64 len_radians=2*ã) { - I64 x,y,z,xx,yy,zz; + I64 x,y,z,xx,yy,zz,result; F64 m1,a1,m2,a2,s,c; if (dc->flags & DCF_TRANSFORMATION) { dc->flags&=~DCF_TRANSFORMATION; @@ -628,23 +637,24 @@ public U0 GrEllipse3(CDC *dc, R2P(&m2,&a2,x,y); m2*=Abs(Sin(a2-a1)); - Ellipse(dc,cx,cy,cz, + result=Ellipse(dc,cx,cy,cz, m1/0x10000,m2/0x10000,&GrPlot3,-a1,step,start_radians,len_radians); dc->flags|=DCF_TRANSFORMATION; } else - Ellipse(dc,cx,cy,cz,x_radius,y_radius,&GrPlot3,rot_angle,step,start_radians,len_radians); + result=Ellipse(dc,cx,cy,cz,x_radius,y_radius,&GrPlot3,rot_angle,step,start_radians,len_radians); + return result; } -public U0 GrCircle3(CDC *dc,I64 cx,I64 cy,I64 cz,I64 radius, +public I64 GrCircle3(CDC *dc,I64 cx,I64 cy,I64 cz,I64 radius, I64 step=1,F64 start_radians=0,F64 len_radians=2*ã) { //transformation with pen width if (dc->flags & DCF_TRANSFORMATION) - GrEllipse3(dc,cx,cy,cz,radius,radius,0,step,start_radians,len_radians); + return GrEllipse3(dc,cx,cy,cz,radius,radius,0,step,start_radians,len_radians); else - Circle(dc,cx,cy,cz,radius,&GrPlot3,step,start_radians,len_radians); + return Circle(dc,cx,cy,cz,radius,&GrPlot3,step,start_radians,len_radians); } -public U0 GrRegPoly3(CDC *dc, +public I64 GrRegPoly3(CDC *dc, I64 cx,I64 cy,I64 cz, I64 x_radius,I64 y_radius,I64 sides, F64 rot_angle=0, @@ -652,7 +662,7 @@ public U0 GrRegPoly3(CDC *dc, F64 start_radians=0, F64 len_radians=2*ã) { - I64 x,y,z,xx,yy,zz; + I64 x,y,z,xx,yy,zz,result; F64 m1,a1,m2,a2,s,c; if (dc->flags & DCF_TRANSFORMATION) { dc->flags&=~DCF_TRANSFORMATION; @@ -688,11 +698,12 @@ public U0 GrRegPoly3(CDC *dc, R2P(&m2,&a2,x,y); m2*=Abs(Sin(a2-a1)); - RegPoly(dc,cx,cy,cz, + result=RegPoly(dc,cx,cy,cz, m1/0x10000,m2/0x10000,sides,&GrPlot3,-a1,step,start_radians,len_radians); dc->flags|=DCF_TRANSFORMATION; } else - RegPoly(dc,cx,cy,cz,x_radius,y_radius,sides,&GrPlot3,rot_angle,step,start_radians,len_radians); + result=RegPoly(dc,cx,cy,cz,x_radius,y_radius,sides,&GrPlot3,rot_angle,step,start_radians,len_radians); + return result; } public I64 GrFloodFill3(CDC *dc,I64 x1,I64 y1,I64 z1,Bool not_color=FALSE) @@ -720,9 +731,9 @@ gr_done: return result; } -public U0 GrRect3(CDC *dc,I64 x,I64 y,I64 z,I64 w,I64 h) +public I64 GrRect3(CDC *dc,I64 x,I64 y,I64 z,I64 w,I64 h) { //Clipping and transformation - I64 x2,y2,z2,x3,y3,z3; + I64 x2,y2,z2,x3,y3,z3,result=0; CDC *old_brush=dc->brush; if (dc->flags & DCF_TRANSFORMATION) { dc->brush=NULL; @@ -733,21 +744,21 @@ public U0 GrRect3(CDC *dc,I64 x,I64 y,I64 z,I64 w,I64 h) (*dc->transform)(dc,&x3,&y3,&z3); if (!(dc->flags&DCF_JUST_MIRROR) || !(dc->flags&DCF_SYMMETRY)) - Rect(dc,x,y,z,x2,y2,z2,x3,y3,z3,&GrLinePlot); + result=Rect(dc,x,y,z,x2,y2,z2,x3,y3,z3,&GrLinePlot); if (dc->flags & DCF_SYMMETRY) { GrReflect(dc,&x,&y,&z); GrReflect(dc,&x2,&y2,&z2); GrReflect(dc,&x3,&y3,&z3); - Rect(dc,x,y,z,x2,y2,z2,x3,y3,z3,&GrLinePlot); + result+=Rect(dc,x,y,z,x2,y2,z2,x3,y3,z3,&GrLinePlot); } dc->brush=old_brush; } else { if (!(dc->flags&DCF_JUST_MIRROR)|| !(dc->flags&DCF_SYMMETRY)) { if (dc->depth_buf) - Rect(dc,x,y,z,x+w,y,z,x,y+h,z,&GrLinePlot); + result=Rect(dc,x,y,z,x+w,y,z,x,y+h,z,&GrLinePlot); else - GrRect(dc,x,y,w,h); + result=GrRect(dc,x,y,w,h); } if (dc->flags & DCF_SYMMETRY) { dc->brush=NULL; @@ -756,15 +767,16 @@ public U0 GrRect3(CDC *dc,I64 x,I64 y,I64 z,I64 w,I64 h) GrReflect(dc,&x,&y,&z); GrReflect(dc,&x2,&y2,&z2); GrReflect(dc,&x3,&y3,&z3); - Rect(dc,x,y,z,x2,y2,z2,x3,y3,z3,&GrLinePlot); + result+=Rect(dc,x,y,z,x2,y2,z2,x3,y3,z3,&GrLinePlot); dc->brush=old_brush; } } + return result; } #help_index "Graphics;Graphics/DCs" -public Bool GrBlot3(CDC *dc,I64 x1,I64 y1,I64 z1,CDC *img) +public I64 GrBlot3(CDC *dc,I64 x1,I64 y1,I64 z1,CDC *img) { //Clipping and transformation //This uses $LK,"fixed-point","FI:::/TempleOS/Demo/Lectures/FixedPoint.CPP"$. CColorROPU32 old_color=dc->color; @@ -775,8 +787,8 @@ public Bool GrBlot3(CDC *dc,I64 x1,I64 y1,I64 z1,CDC *img) adx2,ady2,adz2, x2,y2,z2,x3,y3,z3, dw,reg dh,x,y,_x1,_y1,_z1,_x2,_y2,_z2,_x3,_y3,_z3, - last_x,last_y; - Bool first,result=FALSE; + last_x,last_y,result=0; + Bool first; CDC *old_brush=dc->brush; if (dc->depth_buf || dc->flags & (DCF_TRANSFORMATION | DCF_SYMMETRY)) { @@ -799,14 +811,28 @@ public Bool GrBlot3(CDC *dc,I64 x1,I64 y1,I64 z1,CDC *img) adx1=AbsI64(dx1); ady1=AbsI64(dy1); adz1=AbsI64(dz1); adx2=AbsI64(dx2); ady2=AbsI64(dy2); adz2=AbsI64(dz2); - if (adx1>=ady1) - d1=adx1>=adz1 ? adx1:adz1; - else - d1=ady1>=adz1 ? ady1:adz1; - if (adx2>=ady2) - d2=adx2>=adz2 ? adx2:adz2; - else - d2=ady2>=adz2 ? ady2:adz2; + if (adx1>=ady1) { + if (adx1>=adz1) + d1=adx1; + else + d1=adz1; + } else { + if (ady1>=adz1) + d1=ady1; + else + d1=adz1; + } + if (adx2>=ady2) { + if (adx2>=adz2) + d2=adx2; + else + d2=adz2; + } else { + if (ady2>=adz2) + d2=ady2; + else + d2=adz2; + } if (AbsI64(d1)!=w ||AbsI64(d2)!=h) { d1<<=1; @@ -866,7 +892,7 @@ public Bool GrBlot3(CDC *dc,I64 x1,I64 y1,I64 z1,CDC *img) _x1+=dx1; _y1+=dy1; _z1+=dz1; x+=dw; } - result=TRUE; + result=1; normal_image: if (dc->flags&DCF_JUST_MIRROR) goto gr_done; @@ -876,14 +902,28 @@ normal_image: adx1=AbsI64(dx1); ady1=AbsI64(dy1); adz1=AbsI64(dz1); adx2=AbsI64(dx2); ady2=AbsI64(dy2); adz2=AbsI64(dz2); - if (adx1>=ady1) - d1=adx1>=adz1 ? adx1:adz1; - else - d1=ady1>=adz1 ? ady1:adz1; - if (adx2>=ady2) - d2=adx2>=adz2 ? adx2:adz2; - else - d2=ady2>=adz2 ? ady2:adz2; + if (adx1>=ady1) { + if (adx1>=adz1) + d1=adx1; + else + d1=adz1; + } else { + if (ady1>=adz1) + d1=ady1; + else + d1=adz1; + } + if (adx2>=ady2) { + if (adx2>=adz2) + d2=adx2; + else + d2=adz2; + } else { + if (ady2>=adz2) + d2=ady2; + else + d2=adz2; + } if (AbsI64(d1)!=w ||AbsI64(d2)!=h) { d1<<=1; d2<<=1; @@ -942,7 +982,7 @@ normal_image: x1+=dx1; y1+=dy1; z1+=dz1; x+=dw; } - result=TRUE; //TODO: check off screen + result=1; //TODO: check off screen } else result=GrBlot(dc,x1,y1,img); gr_done: @@ -953,9 +993,9 @@ gr_done: #help_index "Graphics" -public U0 Gr2Bezier3(CDC *dc,CD3I32 *ctrl) +public I64 Gr2Bezier3(CDC *dc,CD3I32 *ctrl) { - I64 i,x,y,z, + I64 i,x,y,z,result=0, old_flags=dc->flags; CD3I32 *ctrl2=NULL,*ctrl3=NULL; if (dc->flags & DCF_TRANSFORMATION) { @@ -984,21 +1024,22 @@ public U0 Gr2Bezier3(CDC *dc,CD3I32 *ctrl) ctrl3[i].z=z; } dc->flags&=~DCF_SYMMETRY; - Bezier2(dc,ctrl3,&GrPlot3); + result=Bezier2(dc,ctrl3,&GrPlot3); if (dc->flags & DCF_JUST_MIRROR) goto gr_done; } - Bezier2(dc,ctrl,&GrPlot3); + result+=Bezier2(dc,ctrl,&GrPlot3); gr_done: Free(ctrl2); Free(ctrl3); dc->flags=old_flags; + return result; } -public U0 Gr3Bezier3(CDC *dc,CD3I32 *ctrl) +public I64 Gr3Bezier3(CDC *dc,CD3I32 *ctrl) { - I64 i,x,y,z, + I64 i,x,y,z,result=0, old_flags=dc->flags; CD3I32 *ctrl2=NULL,*ctrl3=NULL; if (dc->flags & DCF_TRANSFORMATION) { @@ -1027,21 +1068,22 @@ public U0 Gr3Bezier3(CDC *dc,CD3I32 *ctrl) ctrl3[i].z=z; } dc->flags&=~DCF_SYMMETRY; - Bezier3(dc,ctrl3,&GrPlot3); + result=Bezier3(dc,ctrl3,&GrPlot3); if (dc->flags & DCF_JUST_MIRROR) goto gr_done; } - Bezier3(dc,ctrl,&GrPlot3); + result+=Bezier3(dc,ctrl,&GrPlot3); gr_done: Free(ctrl2); Free(ctrl3); dc->flags=old_flags; + return result; } -public U0 Gr2BSpline3(CDC *dc,CD3I32 *ctrl,I64 cnt,Bool closed=FALSE) +public I64 Gr2BSpline3(CDC *dc,CD3I32 *ctrl,I64 cnt,Bool closed=FALSE) { - I64 i,x,y,z, + I64 i,x,y,z,result=0, old_flags=dc->flags; CD3I32 *ctrl2=NULL,*ctrl3=NULL; if (dc->flags & DCF_TRANSFORMATION) { @@ -1070,21 +1112,22 @@ public U0 Gr2BSpline3(CDC *dc,CD3I32 *ctrl,I64 cnt,Bool closed=FALSE) ctrl3[i].z=z; } dc->flags&=~DCF_SYMMETRY; - BSpline2(dc,ctrl3,cnt,&GrPlot3,closed); + result=BSpline2(dc,ctrl3,cnt,&GrPlot3,closed); if (dc->flags & DCF_JUST_MIRROR) goto gr_done; } - BSpline2(dc,ctrl,cnt,&GrPlot3,closed); + result+=BSpline2(dc,ctrl,cnt,&GrPlot3,closed); gr_done: Free(ctrl2); Free(ctrl3); dc->flags=old_flags; + return result; } -public U0 Gr3BSpline3(CDC *dc,CD3I32 *ctrl,I64 cnt,Bool closed=FALSE) +public I64 Gr3BSpline3(CDC *dc,CD3I32 *ctrl,I64 cnt,Bool closed=FALSE) { - I64 i,x,y,z, + I64 i,x,y,z,result=0, old_flags=dc->flags; CD3I32 *ctrl2=NULL,*ctrl3=NULL; if (dc->flags & DCF_TRANSFORMATION) { @@ -1113,19 +1156,20 @@ public U0 Gr3BSpline3(CDC *dc,CD3I32 *ctrl,I64 cnt,Bool closed=FALSE) ctrl3[i].z=z; } dc->flags&=~DCF_SYMMETRY; - BSpline3(dc,ctrl3,cnt,&GrPlot3,closed); + result=BSpline3(dc,ctrl3,cnt,&GrPlot3,closed); if (dc->flags & DCF_JUST_MIRROR) goto gr_done; } - BSpline3(dc,ctrl,cnt,&GrPlot3,closed); + result+=BSpline3(dc,ctrl,cnt,&GrPlot3,closed); gr_done: Free(ctrl2); Free(ctrl3); dc->flags=old_flags; + return result; } -public I64 GrFillTriangle0(CDC *dc,CD3I32 *p1,CD3I32 *p2,CD3I32 *p3) +public I64 GrFillTri0(CDC *dc,CD3I32 *p1,CD3I32 *p2,CD3I32 *p3) { //This uses $LK,"fixed-point","FI:::/TempleOS/Demo/Lectures/FixedPoint.CPP"$. //Returns cnt of pixels changed @@ -1383,7 +1427,7 @@ public I64 GrFillPoly3(CDC *dc,I64 n,CD3I32 *poly) GrReflect(dc,&x2,&y2,&z2); tri[2].x=x2; tri[2].y=y2; tri[2].z=z2; - result+=GrFillTriangle0(dc,&tri[0],&tri[1],&tri[2]); + result+=GrFillTri0(dc,&tri[0],&tri[1],&tri[2]); } } if (dc->flags&DCF_JUST_MIRROR) @@ -1413,14 +1457,14 @@ public I64 GrFillPoly3(CDC *dc,I64 n,CD3I32 *poly) (*dc->transform)(dc,&x2,&y2,&z2); tri[2].x=x2; tri[2].y=y2; tri[2].z=z2; - result+=GrFillTriangle0(dc,&tri[0],&tri[1],&tri[2]); + result+=GrFillTri0(dc,&tri[0],&tri[1],&tri[2]); } return result; } #help_index "Graphics/Mesh" -public I64 Gr3Mesh(CDC *dc,I64 vertex_cnt,CD3I32 *p,I64 triangle_cnt,CMeshTri *tri) +public I64 Gr3Mesh(CDC *dc,I64 vertex_cnt,CD3I32 *p,I64 tri_cnt,CMeshTri *tri) { //Returns cnt of pixels changed CColorROPU32 old_color=dc->color; @@ -1447,17 +1491,17 @@ public I64 Gr3Mesh(CDC *dc,I64 vertex_cnt,CD3I32 *p,I64 triangle_cnt,CMeshTri *t dst->x=x; dst->y=y; dst->z=z; } p_sym=pt_sym; - for (i=0;ilighting)(dc,&p_sym[tri_sym->nums[0]],&p_sym[tri_sym->nums[2]],&p_sym[tri_sym->nums[1]],tri_sym->color); - result+=GrFillTriangle0(dc,&p_sym[tri_sym->nums[0]],&p_sym[tri_sym->nums[2]],&p_sym[tri_sym->nums[1]]); + result+=GrFillTri0(dc,&p_sym[tri_sym->nums[0]],&p_sym[tri_sym->nums[2]],&p_sym[tri_sym->nums[1]]); } Free(pt_sym); if (dc->flags&DCF_JUST_MIRROR) goto mesh_done; } - for (i=0;ilighting)(dc,&p[tri->nums[0]],&p[tri->nums[1]],&p[tri->nums[2]],tri->color); - result+=GrFillTriangle0(dc,&p[tri->nums[0]],&p[tri->nums[1]],&p[tri->nums[2]]); + result+=GrFillTri0(dc,&p[tri->nums[0]],&p[tri->nums[1]],&p[tri->nums[2]]); } mesh_done: dc->color=old_color; diff --git a/TempleOS/Adam/Gr/GrScreen.CPP b/TempleOS/Adam/Gr/GrScreen.CPP index 666a8a2..2850199 100644 --- a/TempleOS/Adam/Gr/GrScreen.CPP +++ b/TempleOS/Adam/Gr/GrScreen.CPP @@ -2,10 +2,11 @@ public CDC *gr_screen_image; //This is read only #help_index "Graphics/DCs" -public CDC *gr_dc=NULL, //This is updated every refresh - *gr_dc_cache, - *gr_dc1=NULL, - *gr_dc2=NULL; +public CDC *gr_dc=NULL, //Persistent + *gr_dc1=NULL, + *gr_dc2=NULL, //Updated every refresh + *gr_dc_cache; + CDC *gr_zoomed_dc; U16 *gr_win_uncovered_bitmap=NULL,gr_highest_uncovered; @@ -13,7 +14,7 @@ U16 *gr_vga_text_cache; public U0 DCFill(CDC *dc=NULL,CColorROPU32 val=COLOR_TRANSPARENT) { - if (!dc) dc=gr_dc2; + if (!dc) dc=gr_dc; nobound_switch (dc->type) { case DCT_COLOR4: MemSet(dc->body,val,(dc->width_internal*dc->height)>>1); @@ -26,7 +27,7 @@ public U0 DCFill(CDC *dc=NULL,CColorROPU32 val=COLOR_TRANSPARENT) public U0 DCClear(CDC *dc=NULL) { - if (!dc) dc=gr_dc2; + if (!dc) dc=gr_dc; DCFill(dc,0); } @@ -40,32 +41,48 @@ public U0 (*fp_wall_paper)(CTask *task)=NULL; U0 WinZBufFill(CTask *task) { //Not public - I64 y,t,dc,l,r,w; + I64 y,t,b,l,r,w; if (!Bt(&task->display_flags,DISPLAYf_NO_BORDER)) { - t= task->win_top-1>0 - ? task->win_top-1 : 0, - dc= task->win_bottom+1win_bottom+1 : TEXT_ROWS-1, - l= task->win_left-1>0 - ? task->win_left-1 : 0, - r= task->win_right+1win_right+1 : TEXT_COLS-1; + if (task->win_top-1>0) + t=task->win_top-1; + else + t=0; + if (task->win_bottom+1win_bottom+1; + else + b=TEXT_ROWS-1; + if (task->win_left-1>0) + l=task->win_left-1; + else + l=0; + if (task->win_right+1win_right+1; + else + r=TEXT_COLS-1; } else { - t= task->win_top>0 - ? task->win_top : 0, - dc= task->win_bottomwin_bottom : TEXT_ROWS-1, - l= task->win_left>0 - ? task->win_left : 0, - r= task->win_rightwin_right : TEXT_COLS-1; + if (task->win_top>0) + t=task->win_top; + else + t=0; + if (task->win_bottomwin_bottom; + else + b=TEXT_ROWS-1; + if (task->win_left>0) + l=task->win_left; + else + l=0; + if (task->win_rightwin_right; + else + r=TEXT_COLS-1; } t=LimitI64(t,0,TEXT_ROWS-1); - dc=LimitI64(dc,t,TEXT_ROWS-1); + b=LimitI64(b,t,TEXT_ROWS-1); l=LimitI64(l,0,TEXT_COLS-1); r=LimitI64(r,l,TEXT_COLS-1); if (w=r-l+1) - for (y=t;y<=dc;y++) + for (y=t;y<=b;y++) MemSetU16(gr_win_z_buf(U8 *)+(y*TEXT_COLS+l)*sizeof(U16), task->win_z_num,w); } @@ -101,36 +118,29 @@ public U0 WinZBufUpdate() #help_index "Graphics/Char;Char" public U0 WinTextFill(I64 d,CTask *task=NULL) { + I64 y,w,t,b,l,r; if (!task) task=Fs; if (!TaskValidate(task)) return; - I64 y,w, - t= task->win_top>0 - ? task->win_top : 0, - dc= task->win_bottomwin_bottom : TEXT_ROWS-1, - l= task->win_left>0 - ? task->win_left : 0, - r= task->win_rightwin_right : TEXT_COLS-1; + if (task->win_top>0) + t=task->win_top; + else + t=0; + if (task->win_bottomwin_bottom; + else + b=TEXT_ROWS-1; + if (task->win_left>0) + l=task->win_left; + else + l=0; + if (task->win_rightwin_right; + else + r=TEXT_COLS-1; if (w=r-l+1) - for (y=t;y<=dc;y++) + for (y=t;y<=b;y++) MemSetU32(gr_text_base(U8 *)+(y*TEXT_COLS+l)*sizeof(U32), - d,w); -} - -public U0 WinTextClear(CTask *task=NULL) -{ - if (!task) task=Fs; - if (!TaskValidate(task)) return; - WinTextFill(task->text_attr<<8,task); -} - -public U0 SetWinBkColor(I64 c,CTask *task=NULL) -{ - if (!task) task=Fs; - if (!TaskValidate(task)) return; - task->text_attr=task->text_attr&0x0F | c<<4; - WinTextFill(c<<12,task); + d,w); } #help_index "Graphics/Color" @@ -340,7 +350,7 @@ U0 GrSetUpTables() gr_refresh_time_stamps[i]=tT; } -U0 GrInit() +U0 GrInit4() { SetStdPalette; fp_set_std_palette=&SetStdPalette; @@ -355,12 +365,12 @@ U0 GrInit() gr_win_uncovered_bitmap=CAlloc(65536/8); gr_highest_uncovered=0; - gr_dc=DCNew(DCT_COLOR8,GR_WIDTH,GR_HEIGHT); - gr_dc->flags|=DCF_SCREEN_BITMAP; - gr_dc_cache=DCNew(DCT_COLOR8,GR_WIDTH,GR_HEIGHT); - gr_dc2=DCNew(DCT_COLOR8,GR_WIDTH,GR_HEIGHT); gr_dc2->flags|=DCF_SCREEN_BITMAP; + gr_dc_cache=DCNew(DCT_COLOR8,GR_WIDTH,GR_HEIGHT); + + gr_dc=DCNew(DCT_COLOR8,GR_WIDTH,GR_HEIGHT); + gr_dc->flags|=DCF_SCREEN_BITMAP; DCFill; gr_dc1=DCNew(DCT_COLOR4,GR_WIDTH,GR_HEIGHT); @@ -401,7 +411,7 @@ U0 GrUpdateWins() try { if (!Bt(&task->display_flags,DISPLAYf_NO_BORDER)) DrawTaskBorder(task); - WinTextClear(task); + WinTextFill(task->text_attr<<8,task); Preempt(old_preempt); if (task==sys_winmgr_task) { if (fp_wall_paper) @@ -412,7 +422,7 @@ U0 GrUpdateWins() } if (TaskValidate(task)) { if (task->draw_it) { - dc=DCAlias(gr_dc,task); + dc=DCAlias(gr_dc2,task); (*task->draw_it)(task,dc); DCDel(dc); } @@ -573,8 +583,8 @@ U0 GrZoomInScreen() U0 GrUpdateBackgroundOfText() { - I64 reg RSI *dst=gr_dc->body,reg R13 c,row,col,,cur_ch, - reg R12 w1=gr_dc->width_internal,reg R10 w2=-7*w1+8,w3=7*w1, + I64 reg RSI *dst=gr_dc2->body,reg R13 c,row,col,,cur_ch, + reg R12 w1=gr_dc2->width_internal,reg R10 w2=-7*w1+8,w3=7*w1, reg *my_1_to_8_colors=gr_1_to_8_colors; U32 reg *src=gr_text_base; $HL,1$ Bool blink_flag=Blink; @@ -628,10 +638,10 @@ asm { U0 GrUpdateForegroundOfText() { U32 *src=gr_text_base; - I64 i,j,cur_ch,reg *dst=gr_dc->body, - reg w1=gr_dc->width_internal,w2=7*w1, + I64 i,j,cur_ch,reg *dst=gr_dc2->body, + reg w1=gr_dc2->width_internal,w2=7*w1, row,col; - U8 *dst_start=gr_dc->body,*dst_end=dst_start+w1*gr_dc->height-7*w1-8; + U8 *dst_start=gr_dc2->body,*dst_end=dst_start+w1*gr_dc2->height-7*w1-8; Bool blink_flag=Blink; for (row=TEXT_ROWS;row--;) { for (col=TEXT_COLS;col--;) { @@ -762,10 +772,10 @@ U0 GrUpdateScreen() GrUpdateBackgroundOfText; GrUpdateForegroundOfText; GrUpdateWins; - DCBlotColor8(gr_dc,gr_dc2); + DCBlotColor8(gr_dc2,gr_dc); } - dc=DCAlias(gr_dc,Fs); + dc=DCAlias(gr_dc2,Fs); dc->flags|=DCF_ON_TOP; if (fp_final_screen_update) (*fp_final_screen_update)(dc); @@ -774,8 +784,8 @@ U0 GrUpdateScreen() if (text_mode) GrUpdateTextModeText; else { - DCBlotColor4(gr_dc1->body,gr_dc->body,gr_dc_cache->body, - gr_dc->height*gr_dc->width_internal>>3); + DCBlotColor4(gr_dc1->body,gr_dc2->body,gr_dc_cache->body, + gr_dc2->height*gr_dc2->width_internal>>3); GrUpdateVGAGraphics; } Preempt(old_preempt); diff --git a/TempleOS/Adam/Gr/GrSpritePlot.CPP b/TempleOS/Adam/Gr/GrSpritePlot.CPP index 17f2dc9..1f91fea 100644 --- a/TempleOS/Adam/Gr/GrSpritePlot.CPP +++ b/TempleOS/Adam/Gr/GrSpritePlot.CPP @@ -6,7 +6,7 @@ each operation. The types available are lsted here, $LK,"GRST_PT","MN:GRST_PT"$. They are stored, one after another, in a chunk of memory terminated by a type $LK,"GRST_END","MN:GRST_END"$. -$LK,"SpritePlot3","MN:SpritePlot3"$() and $LK,"SpriteVect","MN:SpriteVect"$() shows how the +$LK,"SpritePlot3","MN:SpritePlot3"$() and $LK,"SpriteMain","MN:SpriteMain"$() shows how the unions are used. It's kind-of a mess using a union. $LK,"SpriteSize","MN:SpriteSize"$() will return the size of a single @@ -142,7 +142,7 @@ public U0 SpritePlot3(CDC *dc,I64 x,I64 y,I64 z,U8 *elems,Bool just_one=FALSE) case GRST_ELLIPSE: GrEllipse3(dc,tempg->x2+x,tempg->y2+y,z,tempg->width,tempg->height,tempg->rot_angle); break; - case GRST_REG_POLY: + case GRST_POLYGON: GrRegPoly3(dc,tempg->x2+x,tempg->y2+y,z,tempg->width,tempg->height,tempg->sides,tempg->rot_angle); break; case GRST_POLYLINE: @@ -237,7 +237,7 @@ public U0 SpritePlot3(CDC *dc,I64 x,I64 y,I64 z,U8 *elems,Bool just_one=FALSE) p->y+=y; p->z+=z; } - Gr3Mesh(dc,tempg->vertex_cnt,&tempg->x2,tempg->triangle_cnt,(&tempg->x2)(U8 *)+sizeof(CD3I32)*tempg->vertex_cnt); + Gr3Mesh(dc,tempg->vertex_cnt,&tempg->x2,tempg->tri_cnt,(&tempg->x2)(U8 *)+sizeof(CD3I32)*tempg->vertex_cnt); p=&tempg->x2; for (i=0;ivertex_cnt;i++,p++) { p->x-=x; @@ -258,15 +258,15 @@ public U0 SpritePlot3(CDC *dc,I64 x,I64 y,I64 z,U8 *elems,Bool just_one=FALSE) y1=tempg->y1+y; z1=tempg->z1+z; } - p=(&tempg->shiftable_triangle_cnt)(U8 *)+sizeof(I32); + p=(&tempg->shiftable_tri_cnt)(U8 *)+sizeof(I32); for (i=0;ishiftable_vertex_cnt;i++,p++) { p->x+=x1; p->y+=y1; p->z+=z1; } - p=(&tempg->shiftable_triangle_cnt)(U8 *)+sizeof(I32); - Gr3Mesh(dc,tempg->shiftable_vertex_cnt,p,tempg->shiftable_triangle_cnt,p(U8 *)+sizeof(CD3I32)*tempg->shiftable_vertex_cnt); - p=(&tempg->shiftable_triangle_cnt)(U8 *)+sizeof(I32); + p=(&tempg->shiftable_tri_cnt)(U8 *)+sizeof(I32); + Gr3Mesh(dc,tempg->shiftable_vertex_cnt,p,tempg->shiftable_tri_cnt,p(U8 *)+sizeof(CD3I32)*tempg->shiftable_vertex_cnt); + p=(&tempg->shiftable_tri_cnt)(U8 *)+sizeof(I32); for (i=0;ishiftable_vertex_cnt;i++,p++) { p->x-=x1; p->y-=y1; @@ -372,8 +372,6 @@ public U8 *SpriteInterpolate(U8 *elems0,U8 *elems1,F64 t) //The two CSprite should be identical //except for points shifted around. //t ranges from 0.0 to 1.0 -// -//See $LK-A,"::/TempleOS/Demo/Graphics/Golf.CPP"$ for an example. I64 i=SpriteSize(elems0), t1=gr_scale*t,t0=gr_scale-t1; I32 *ptr0,*ptr1,*ptrr; @@ -411,7 +409,7 @@ public U8 *SpriteInterpolate(U8 *elems0,U8 *elems1,F64 t) tempgr->y1=(tempg0->y1*t0+tempg1->y1*t1)>>32; break; case GRST_ELLIPSE: - case GRST_REG_POLY: + case GRST_POLYGON: tempgr->x2=(tempg0->x2*t0+tempg1->x2*t1)>>32; tempgr->y2=(tempg0->y2*t0+tempg1->y2*t1)>>32; tempgr->width=(tempg0->width*t0+tempg1->width*t1)>>32; @@ -461,9 +459,9 @@ public U8 *SpriteInterpolate(U8 *elems0,U8 *elems1,F64 t) } break; case GRST_SHIFTABLE_MESH: - p0=(&tempg0->shiftable_triangle_cnt)(U8 *)+sizeof(I32); - p1=(&tempg1->shiftable_triangle_cnt)(U8 *)+sizeof(I32); - pr=(&tempgr->shiftable_triangle_cnt)(U8 *)+sizeof(I32); + p0=(&tempg0->shiftable_tri_cnt)(U8 *)+sizeof(I32); + p1=(&tempg1->shiftable_tri_cnt)(U8 *)+sizeof(I32); + pr=(&tempgr->shiftable_tri_cnt)(U8 *)+sizeof(I32); for (i=0;ishiftable_vertex_cnt;i++) { pr[i].x=(p0[i].x*t0+p1[i].x*t1)>>32; pr[i].y=(p0[i].y*t0+p1[i].y*t1)>>32; @@ -488,7 +486,7 @@ public CDocEntry *DocPutSprite(CDoc *doc=NULL,U8 *elems,U8 *txt=NULL) Bool unlock; CDocEntry *doc_e; CDocBin *tempb; - if (!doc && !(doc=DocCur)) return NULL; + if (!doc && !(doc=DocPut)) return NULL; unlock=DocLock(doc); size=SpriteSize(elems); tempb=CAlloc(sizeof(CDocBin),doc->mem_task); @@ -520,7 +518,7 @@ public CDocEntry *PutSprite(U8 *elems,U8 *txt=NULL) //and leave a %d for the number. CDoc *doc; - if (doc=DocCur) + if (doc=DocPut) return DocPutSprite(doc,elems,txt); return NULL; } diff --git a/TempleOS/Adam/Gr/GrVectMap.CPP b/TempleOS/Adam/Gr/GrVectMap.CPP deleted file mode 100644 index 3b91435..0000000 --- a/TempleOS/Adam/Gr/GrVectMap.CPP +++ /dev/null @@ -1,486 +0,0 @@ -#help_index "Graphics/CGrVectMap" -/* -This processes a monocrome map, finds edges and generates vect graphic -representations of the map broken into small rectangles. The rectangles -are encoded a bit-oriented structure. - -PolyLineStruct { -1 Bit : set is valid polyline, clear is end of polyline lst -(R_BITS) : X-coordinate of polyline start -(R_BITS) : Y-coordinate of polyline start -(poly_line_cnt_bits): Number of polyline direction entries -N*3 : N-long seq of 1 pixel directional movements -} - -FloodFillStruct { -1 Bit : set is valid flood fill entry, clear is end of floodfill lst -(1+R_BITS): X-coordinate*2 of flood fill (half pixels) -(1+R_BITS): Y-coordinate*2 of flood fill (half pixels) -} - -Rect { -1 Bit : set is valid rectangle entry, clear is end of rectangle lst -PolyLineStructLst -FloodFillStructLst -} -*/ - -#define R_BITS 6 -#define R_BORDER 1 -#define R_WIDTH (1<body; - F64 d=scale/2; - dc->pen_width=scale+0.5; - dc->color=rect_dft=Bt(body,bit++); - not_rect_dft=1-rect_dft; - - dc->bkcolor=vm->bkcolor; - GrRect(dc,0,0,dc->width,dc->height); - - dc->color=not_rect_dft; - while (Bt(body,bit++)) { - j=BFieldExtU32(body,bit,R_BITS); - bit+=R_BITS; - i=BFieldExtU32(body,bit,R_BITS); - bit+=R_BITS; - cnt=BFieldExtU32(body,bit,vm->poly_line_cnt_bits); - bit+=vm->poly_line_cnt_bits; - if (!cnt) - GrPlot3(dc,(j-R_BORDER)*scale+d,(i-R_BORDER)*scale+d,0); - else { - i0=i;j0=j; - while (cnt--) { - k=BFieldExtU32(body,bit,3); - bit+=3; - i+=gr_y_offsets[k]; - j+=gr_x_offsets[k]; - GrLine3(dc,(j0-R_BORDER)*scale+d,(i0-R_BORDER)*scale+d,0, - (j-R_BORDER)*scale+d,(i-R_BORDER)*scale+d,0); - i0=i; j0=j; - } - } - } - while (Bt(body,bit++)) { - j=BFieldExtU32(body,bit,R_BITS+1); - bit+=R_BITS+1; - i=BFieldExtU32(body,bit,R_BITS+1); - bit+=R_BITS+1; - if (GrPeek(dc,(j/2.0-R_BORDER)*scale+d,(i/2.0-R_BORDER)*scale+d)==rect_dft) - GrFloodFill(dc,(j/2.0-R_BORDER)*scale+d,(i/2.0-R_BORDER)*scale+d); - } -} - -class CMPVMBlot -{ - CDC *dc,*rect_dc; - CGrVectMap *vm; - I64 bit; - I64 xx,yy; - F64 scale; - I64 busy; -}; - - -U0 VectMapBlotRectMP(CMPVMBlot *mp) -{ - VectMapBlotRect(mp->rect_dc,mp->vm,mp->bit,mp->scale); - GrBlot(mp->dc,mp->xx,mp->yy,mp->rect_dc); - mp->busy=FALSE; -} - - -public U0 VectMapBlotMP(CDC *dc,I64 x,I64 y,CGrVectMap *vm,F64 scale=1.0,I64 _mp_cnt=0) -{ - I64 i,i_lo,i_hi,j,j_lo,j_hi,k,cpu,pass, - w=(vm->width +R_WIDTH-1)/R_WIDTH, - h=(vm->height+R_HEIGHT-1)/R_HEIGHT; - F64 xx,yy,r_scale=scale*(R_WIDTH+1.0/scale)/R_WIDTH; - CMPVMBlot *mp; - if (!dc || !vm) return; - if (Gs->num) - _mp_cnt=1; //Only core #0 can be master - else if (!_mp_cnt) - _mp_cnt=mp_cnt; - else if (_mp_cnt>mp_cnt) - _mp_cnt=mp_cnt; - cpu=_mp_cnt-1; - - mp=MAlloc(_mp_cnt*sizeof(CMPVMBlot)); - - for (i=0;i<_mp_cnt;i++) { - mp[i].rect_dc=DCNew(DCT_COLOR8,R_WIDTH*r_scale,R_HEIGHT*r_scale,Fs); - mp[i].dc=DCAlias(dc,dc->win_task); - mp[i].dc->color=dc->color; - mp[i].vm=vm; - mp[i].scale=r_scale; - mp[i].busy=FALSE; - } - - if (y<0) - i_lo=-y/(R_HEIGHT*scale); - else - i_lo=0; - if (R_HEIGHT*scale*h+y>dc->height) - i_hi=MinI64((dc->height-y)/(R_HEIGHT*scale)+1,h); - else - i_hi=h; - - if (x<0) - j_lo=-x/(R_WIDTH*scale); - else - j_lo=0; - if (R_WIDTH*scale*w+x>dc->width) - j_hi=MinI64((dc->width-x)/(R_WIDTH*scale)+1,w); - else - j_hi=w; - - xx=x+j_lo*R_WIDTH*scale; - for (j=j_lo;j1) { - pass=0; - //Does up to two passes - while (TRUE) - if (!pass && !cpu) { - pass++; - cpu=_mp_cnt-1; - } else if (mp[cpu].busy) //by the way, core #0 is never busy - cpu--; - else - break; - } - mp[cpu].xx=xx; - mp[cpu].yy=yy; - mp[cpu].bit=vm->rect_start_bits[k]; - if (!cpu) - VectMapBlotRectMP(mp); - else { - mp[cpu].busy=TRUE; - MPJob(&VectMapBlotRectMP,&mp[cpu],cpu); - } - k+=w; - yy+=R_HEIGHT*scale; - } - xx+=R_WIDTH*scale; - } - for (i=_mp_cnt-1;i>=0;i--) { - while(mp[i].busy) - Yield; - DCDel(mp[i].rect_dc); - DCDel(mp[i].dc); - } - Free(mp); -} - -Bool IsSolidSquare(CDC *dc,I64 x,I64 y,I64 edge,CColorROPU32 color) -{ - I64 i,j; - edge>>=1; - for (i=-edge;ibody; - Bool found; - if (_max_poly_line_cnt_bits) - max_poly_line_cnt_bits=*_max_poly_line_cnt_bits; - else - max_poly_line_cnt_bits=3; - - //Count ON pixels - for (y=0;y=R_WIDTH*R_HEIGHT/2) - rect_dft=1; - else - rect_dft=0; - not_rect_dft=1-rect_dft; - - BEqu(body,bit++,rect_dft); - - if (!cnt || cnt==R_WIDTH*R_HEIGHT) { - //Rect is all ON or OFF - Btr(body,bit++); //End of poly-line lst - Btr(body,bit++); //End of flood-fill lst - } else { - for (y=0;ycolor=0; - if (GrPeek(b_desired,x,y)==not_rect_dft) - for (k=0;k<8;k++) - if (GrPeek(b_desired,x+gr_x_offsets[k],y+gr_y_offsets[k])==rect_dft) - b_edge->color=1; - GrPlot(b_edge,x,y); - } - - b_edge->color=0; - link_bit1=bit; - for (y=0;ymax_poly_line_cnt_bits) - max_poly_line_cnt_bits=Bsr(cnt)+1; - } - - //Connect adjacent groups with link to prevent flood-fill leaks. - link_bit_limit=bit; - while (link_bit1color=1; - GrPlot(b_link_check,xx,yy); - cnt=BFieldExtU32(body,link_bit2,poly_line_cnt_bits); - link_bit2+=poly_line_cnt_bits; - while (cnt--) { - kk=BFieldExtU32(body,link_bit2,3); - link_bit2+=3; - yy+=gr_y_offsets[kk]; - xx+=gr_x_offsets[kk]; - GrPlot(b_link_check,xx,yy); - } - - link_bit1=link_bit2; - } - Btr(body,bit++); //End of poly-line lst - - b_desired->color=rect_dft; - GrLineRect4(b_desired,0,0,R_WIDTH+2*R_BORDER-1,R_HEIGHT+2*R_BORDER-1); - Btr(body,bit); //Temp end of flood-fill lst - - for (step_bits=2;step_bits>=1;step_bits-=1) { - step=1<color=not_rect_dft; - GrLineRect4(b_actual,0,0,R_WIDTH+2*R_BORDER-1,R_HEIGHT+2*R_BORDER-1); - - //Flood fill - for (y=R_BORDER;y>step_bits,y>>step_bits)==rect_dft) { - Bts(body,bit++); //Show not end of flood-fill lst - yy=y; xx=x; - for (k=0;k<4;k++) { - yy2=yy; - while (yy2>step_bits,yy2>>step_bits)==rect_dft) - yy2++; - while (yy>R_BORDER && - IsSolidSquare(b_desired,xx,yy,step,not_rect_dft) && GrPeek(b_actual,xx>>step_bits,yy>>step_bits)==rect_dft) - yy--; - yy1=yy+yy2; - yy=yy1/2; - - xx2=xx; - while (xx2>step_bits,yy>>step_bits)==rect_dft) - xx2++; - while (xx>R_BORDER && - IsSolidSquare(b_desired,xx,yy,step,not_rect_dft) && GrPeek(b_actual,xx>>step_bits,yy>>step_bits)==rect_dft) - xx--; - xx1=xx+xx2; - xx=xx1/2; - - } - GrFloodFill(b_actual,xx>>step_bits,yy>>step_bits); - BFieldOrU32(body,bit,xx1); //Flood fill X-coordinate in rect - bit+=R_BITS+1; - BFieldOrU32(body,bit,yy1); //Flood fill Y-coordinate in rect - bit+=R_BITS+1; - } - DCDel(b_actual); - Btr(body,bit); //Temp end of flood-fill lst - } - bit++; //End of flood-fill lst - } - - DCDel(b_desired); - DCDel(b_edge); - DCDel(b_link_check); - - if (_max_poly_line_cnt_bits) *_max_poly_line_cnt_bits=max_poly_line_cnt_bits; - - return bit-_bit; -} - - -#define TEMP_BODY_SIZE 0x10000 -public CGrVectMap *DC2VectMap(CDC *dc,CTask *mem_task=NULL,I64 *_size=NULL) -{ //Currently does not convert outer 1 pixel border - I64 i,j,k,cnt,size, - w=(dc->width-R_BORDER*2+R_WIDTH-1)/R_WIDTH, - h=(dc->height-R_BORDER*2+R_HEIGHT-1)/R_HEIGHT, - rect_cnt=w*h,poly_line_cnt_bits=12,max_poly_line_cnt_bits=3; - U32 *rect_start_bits; - U8 *body; - CGrVectMap *result,tempv; - - body=MAlloc(TEMP_BODY_SIZE); - - //Pass 1: Get max_poly_line_cnt_bits - for (i=0;iwidth-R_BORDER*2; - tempv.height=dc->height-R_BORDER*2; - tempv.body=body; - tempv.rect_cnt=rect_cnt; - tempv.r_bits=R_BITS; - tempv.poly_line_cnt_bits=poly_line_cnt_bits; - VectizeRect(dc,R_BORDER+j*R_WIDTH,R_BORDER+i*R_HEIGHT,&tempv,0,poly_line_cnt_bits,&max_poly_line_cnt_bits); - } - - //Pass 2: Get cnt - poly_line_cnt_bits=max_poly_line_cnt_bits; - cnt=0; - for (i=0;iwidth-R_BORDER*2; - tempv.height=dc->height-R_BORDER*2; - tempv.body=body; - tempv.rect_cnt=rect_cnt; - tempv.r_bits=R_BITS; - tempv.poly_line_cnt_bits=poly_line_cnt_bits; - cnt+=VectizeRect(dc,R_BORDER+j*R_WIDTH,R_BORDER+i*R_HEIGHT,&tempv,0,poly_line_cnt_bits,NULL); - } - Free(body); - - //Pass 3 - size=(cnt+7)/8; - result=CAlloc(sizeof(CGrVectMap),mem_task); - result->body=CAlloc(size,mem_task); - rect_start_bits=MAlloc((rect_cnt+1)*sizeof(U32),mem_task); - result->width =dc->width-R_BORDER*2; - result->height=dc->height-R_BORDER*2; - result->rect_cnt=rect_cnt; - result->r_bits=R_BITS; - result->poly_line_cnt_bits=poly_line_cnt_bits; - result->rect_start_bits=rect_start_bits; - k=0; - cnt=0; - for (i=0;irect_start_bits); - Free(vm->body); - Free(vm); -} - -U32 *VectMapRectStartBits(CGrVectMap *vm,CTask *mem_task=NULL) -{ - I64 k=0,bit=0; - U8 *body=vm->body; - U32 *result=MAlloc((vm->rect_cnt+1)*sizeof(U32),mem_task); - for (k=0;krect_cnt;k++) { - result[k]=bit++; - while (Bt(body,bit++)) { - bit+=2*R_BITS; - bit+=vm->poly_line_cnt_bits+3*BFieldExtU32(body,bit,vm->poly_line_cnt_bits); - } - while (Bt(body,bit++)) - bit+=2*(R_BITS+1); - } - result[k]=bit; - return result; -} diff --git a/TempleOS/Adam/Gr/MathGr.CPP b/TempleOS/Adam/Gr/MathGr.CPP index 0162ac3..9db5088 100644 --- a/TempleOS/Adam/Gr/MathGr.CPP +++ b/TempleOS/Adam/Gr/MathGr.CPP @@ -5,7 +5,84 @@ public I64 gr_x_offsets[8]={-1, 0, 1,-1,1,-1,0,1}, gr_x_offsets2[4]={ 0,-1, 1, 0}, gr_y_offsets2[4]={-1, 0, 0, 1}; -public Bool Line(U8 *aux_data, +public I64 Line(U8 *aux_data, + I64 x1,I64 y1,I64 z1, + I64 x2,I64 y2,I64 z2, + Bool (*fp_plot)(U8 *aux,I64 x,I64 y,I64 z), + I64 step=1,I64 start=0) +{ +//This uses $LK,"fixed-point","FI:::/TempleOS/Demo/Lectures/FixedPoint.CPP"$. + I64 i,j,d,dx=x2-x1,dy=y2-y1,dz=z2-z1,_x,_y,_z, + adx=AbsI64(dx),ady=AbsI64(dy),adz=AbsI64(dz),result=0; + Bool first=TRUE; + if (adx>=ady) { + if (adx>=adz) { + if (d=adx) { + if (dx>=0) + dx=0x100000000; + else + dx=-0x100000000; + dy=dy<<32/d; + dz=dz<<32/d; + } + } else { + if (d=adz) { + dx=dx<<32/d; + dy=dy<<32/d; + if (dz>=0) + dz=0x100000000; + else + dz=-0x100000000; + } + } + } else { + if (ady>=adz) { + if (d=ady) { + dx=dx<<32/d; + if (dy>=0) + dy=0x100000000; + else + dy=-0x100000000; + dz=dz<<32/d; + } + } else { + if (d=adz) { + dx=dx<<32/d; + dy=dy<<32/d; + if (dz>=0) + dz=0x100000000; + else + dz=-0x100000000; + } + } + } + x1<<=32; y1<<=32; z1<<=32; + for (j=0;j=ady1) - d1=adx1>=adz1 ? adx1:adz1; - else - d1=ady1>=adz1 ? ady1:adz1; - if (adx2>=ady2) - d2=adx2>=adz2 ? adx2:adz2; - else - d2=ady2>=adz2 ? ady2:adz2; + if (adx1>=ady1) { + if (adx1>=adz1) + d1=adx1; + else + d1=adz1; + } else { + if (ady1>=adz1) + d1=ady1; + else + d1=adz1; + } + if (adx2>=ady2) { + if (adx2>=adz2) + d2=adx2; + else + d2=adz2; + } else { + if (ady2>=adz2) + d2=ady2; + else + d2=adz2; + } d1<<=1; d2<<=1; if (d1) { @@ -123,17 +214,16 @@ public Bool Rect(U8 *aux_data, for (j=0;j<=d1;j++) { x2=x1; y2=y1; z2=z1; for (i=0;i<=d2;i++) { - if (x2.i32[1]!=last_x || y2.i32[1]!=last_y || z2.i32[1]!=last_z ||first) { - if (!(*fp_plot)(aux_data,x2.i32[1],y2.i32[1],z2.i32[1])) - return FALSE; - } + if ((x2.i32[1]!=last_x || y2.i32[1]!=last_y || z2.i32[1]!=last_z ||first) && + (*fp_plot)(aux_data,x2.i32[1],y2.i32[1],z2.i32[1])) + result++; first=FALSE; last_x=x2.i32[1]; last_y=y2.i32[1]; last_z=z2.i32[1]; x2+=dx2; y2+=dy2; z2+=dz2; } x1+=dx1; y1+=dy1; z1+=dz1; } - return TRUE; + return result; } #help_index "Graphics/Math/3D Transformation" @@ -471,7 +561,7 @@ public U0 GrLighting(CDC *dc,CD3I32 *p1,CD3I32 *p2,CD3I32 *p3,CColorROPU32 color v2.z=p3->z-p2->z; //V1 and V2 are vects along two sides -//of the triangle joined at p2. +//of the tri joined at p2. vn_x=v1.y*v2.z-v1.z*v2.y; vn_y=v1.z*v2.x-v1.x*v2.z; @@ -523,7 +613,7 @@ public U0 GrLighting(CDC *dc,CD3I32 *p1,CD3I32 *p2,CD3I32 *p3,CColorROPU32 color #define SCALE2 8 #help_index "Graphics/Math" -public Bool Circle(U8 *aux_data, +public I64 Circle(U8 *aux_data, I64 cx,I64 cy,I64 cz, I64 radius, Bool (*fp_plot)(U8 *aux,I64 x,I64 y,I64 z), @@ -532,9 +622,9 @@ public Bool Circle(U8 *aux_data, F64 len_radians=2*ã) { I64 i,j,len=Ceil(len_radians*radius), - x,y,x1,y1,s1,s2,c; + x,y,x1,y1,s1,s2,c,result=0; F64 t; - if (radius<=0||!step) return TRUE; + if (radius<=0||!step) return 0; t=1.0/radius; c=1<>SCALE2,cy+y>>SCALE2,cz)) - return FALSE; + if ((*fp_plot)(aux_data,cx+x>>SCALE2,cy+y>>SCALE2,cz)) + result++; for (j=0;j>SCALE1; y1=(s2*x+c*y)>>SCALE1; x=x1; y=y1; } } - return TRUE; + return result; } -public Bool Ellipse(U8 *aux_data, +public I64 Ellipse(U8 *aux_data, I64 cx,I64 cy,I64 cz, I64 x_radius,I64 y_radius, Bool (*fp_plot)(U8 *aux,I64 x,I64 y,I64 z), @@ -576,11 +666,12 @@ public Bool Ellipse(U8 *aux_data, F64 len_radians=2*ã) { I64 i,j,len, - x,y,_x,_y,x1,y1,x2,y2, s1,s2,c, s12,s22,c2; + x,y,_x,_y,x1,y1,x2,y2, s1,s2,c, s12,s22,c2,result; F64 t; Bool first=TRUE; if (x_radius<=0 || y_radius<=0 || !step) - return TRUE; + return 0; + result=0; if (x_radius>=y_radius) { t=1.0/x_radius; len=Ceil(len_radians*x_radius); @@ -621,8 +712,8 @@ public Bool Ellipse(U8 *aux_data, for (i=0;i<=len;i+=step) { if (x>>SCALE2!=_x || y>>SCALE2!=_y || first) { - if (!(*fp_plot)(aux_data,cx+x>>SCALE2,cy+y>>SCALE2,cz)) - return FALSE; + if ((*fp_plot)(aux_data,cx+x>>SCALE2,cy+y>>SCALE2,cz)) + result++; } _x=x>>SCALE2; _y=y>>SCALE2; first=FALSE; for (j=0;j>SCALE1; } } - return TRUE; + return result; } -public Bool RegPoly(U8 *aux_data, +public I64 RegPoly(U8 *aux_data, I64 cx,I64 cy,I64 cz, I64 x_radius,I64 y_radius,I64 sides, Bool (*fp_plot)(U8 *aux,I64 x,I64 y,I64 z), @@ -649,11 +740,13 @@ public Bool RegPoly(U8 *aux_data, { I64 i,n,x,y,x1,y1,x2,y2, xx1,yy1,xx2,yy2, - s1,s2,c, s12,s22,c2; + s1,s2,c, s12,s22,c2,result; F64 angle_step; if (sides<=0 || x_radius<=0 || y_radius<=0) - return TRUE; + return 0; + + result=0; angle_step=2*ã/sides; n=len_radians*sides/(2*ã); @@ -694,11 +787,10 @@ public Bool RegPoly(U8 *aux_data, y=(s22*x1+c2*y1)>>SCALE1; xx2=cx+x>>SCALE2; yy2=cy+y>>SCALE2; - if (!Line(aux_data,xx1,yy1,cz,xx2,yy2,cz,fp_plot,step)) - return FALSE; + result+=Line(aux_data,xx1,yy1,cz,xx2,yy2,cz,fp_plot,step); xx1=xx2; yy1=yy2; } - return TRUE; + return result; } #help_index "Graphics/CD3I32;Math/CD3I32" @@ -718,9 +810,9 @@ public I64 P3I32SqrNorm(CD3I32 *p) } #help_index "Graphics/Math" -public Bool Bezier2(U8 *aux_data,CD3I32 *ctrl,Bool (*fp_plot)(U8 *aux,I64 x,I64 y,I64 z),Bool first=TRUE) +public I64 Bezier2(U8 *aux_data,CD3I32 *ctrl,Bool (*fp_plot)(U8 *aux,I64 x,I64 y,I64 z),Bool first=TRUE) {//2nd order - I64 x,y,z,xx,yy,zz,dx,dy,dz,d_max; + I64 x,y,z,xx,yy,zz,dx,dy,dz,d_max,result=0; F64 x0=ctrl[0].x,y0=ctrl[0].y,z0=ctrl[0].z, x1=ctrl[1].x-x0,y1=ctrl[1].y-y0,z1=ctrl[1].z-z0, x2=ctrl[2].x-x0,y2=ctrl[2].y-y0,z2=ctrl[2].z-z0, @@ -729,10 +821,8 @@ public Bool Bezier2(U8 *aux_data,CD3I32 *ctrl,Bool (*fp_plot)(U8 *aux,I64 x,I64 P3I32Dist(&ctrl[2],&ctrl[0]), s=0.5/d,t1,t2; xx=x0; yy=y0; zz=z0; - if (first) { - if (!(*fp_plot)(aux_data,xx,yy,zz)) - return FALSE; - } + if (first && (*fp_plot)(aux_data,xx,yy,zz)) + result++; for (t=0.0;t<=1.0;t+=s) { t1=t*(1.0-t); t2=t*t; @@ -752,22 +842,21 @@ public Bool Bezier2(U8 *aux_data,CD3I32 *ctrl,Bool (*fp_plot)(U8 *aux,I64 x,I64 s*=1.1; else { s*=0.9; - if (!(*fp_plot)(aux_data,x,y,z)) - return FALSE; + if ((*fp_plot)(aux_data,x,y,z)) + result++; xx=x;yy=y;zz=z; } } x=ctrl[2].x; y=ctrl[2].y; z=ctrl[2].z; - if (xx!=x || yy!=y || zz!=z) { - if (!(*fp_plot)(aux_data,x,y,z)) - return FALSE; - } - return TRUE; + if ((xx!=x || yy!=y || zz!=z) && + (*fp_plot)(aux_data,x,y,z)) + result++; + return result; } -public Bool Bezier3(U8 *aux_data,CD3I32 *ctrl,Bool (*fp_plot)(U8 *aux,I64 x,I64 y,I64 z),Bool first=TRUE) +public I64 Bezier3(U8 *aux_data,CD3I32 *ctrl,Bool (*fp_plot)(U8 *aux,I64 x,I64 y,I64 z),Bool first=TRUE) { //3rd order - I64 x,y,z,xx,yy,zz,dx,dy,dz,d_max; + I64 x,y,z,xx,yy,zz,dx,dy,dz,d_max,result=0; F64 x0=ctrl[0].x,y0=ctrl[0].y,z0=ctrl[0].z, x1=ctrl[1].x-x0,y1=ctrl[1].y-y0,z1=ctrl[1].z-z0, x2=ctrl[2].x-x0,y2=ctrl[2].y-y0,z2=ctrl[2].z-z0, @@ -778,10 +867,8 @@ public Bool Bezier3(U8 *aux_data,CD3I32 *ctrl,Bool (*fp_plot)(U8 *aux,I64 x,I64 P3I32Dist(&ctrl[3],&ctrl[0]), s=0.5/d,nt,t1,t2,t3; xx=x0; yy=y0; zz=z0; - if (first) { - if (!(*fp_plot)(aux_data,xx,yy,zz)) - return FALSE; - } + if (first && (*fp_plot)(aux_data,xx,yy,zz)) + result++; for (t=0.0;t<=1.0;t+=s) { nt=1.0-t; t1=t*nt*nt; @@ -803,25 +890,26 @@ public Bool Bezier3(U8 *aux_data,CD3I32 *ctrl,Bool (*fp_plot)(U8 *aux,I64 x,I64 s*=1.1; else { s*=0.9; - if (!(*fp_plot)(aux_data,x,y,z)) - return FALSE; + if ((*fp_plot)(aux_data,x,y,z)) + result++; xx=x;yy=y;zz=z; } } x=ctrl[3].x; y=ctrl[3].y; z=ctrl[3].z; - if (xx!=x || yy!=y || zz!=z) { - if (!(*fp_plot)(aux_data,x,y,z)) - return FALSE; - } - return TRUE; + if ((xx!=x || yy!=y || zz!=z) && + (*fp_plot)(aux_data,x,y,z)) + result++; + return result; } -public Bool BSpline2(U8 *aux_data,CD3I32 *ctrl,I64 cnt,Bool (*fp_plot)(U8 *aux,I64 x,I64 y,I64 z),Bool closed=FALSE) +public I64 BSpline2(U8 *aux_data,CD3I32 *ctrl,I64 cnt,Bool (*fp_plot)(U8 *aux,I64 x,I64 y,I64 z),Bool closed=FALSE) { //2nd order - I64 i,j; + I64 i,j,result; CD3I32 *c; - Bool first=TRUE; - if (cnt<3) return TRUE; + Bool first; + if (cnt<3) return 0; + first=TRUE; + result=0; if (closed) { cnt++; c=MAlloc(sizeof(CD3I32)*(cnt*2-1)); @@ -873,23 +961,22 @@ public Bool BSpline2(U8 *aux_data,CD3I32 *ctrl,I64 cnt,Bool (*fp_plot)(U8 *aux,I } } for (i=0;inext_added; while (temph!=tempht) { if (!(temph->type & (HTF_IMPORT | HTF_PRIVATE)) && - temph->type & mask && - (temph->type & HTF_PUBLIC || !publics)) + temph->type & mask && + (temph->type & HTF_PUBLIC || !publics)) if (!index) cnt++; else if (temph->type&HTG_SRC_SYM && - (cur_index=temph->index)) - cnt+=HelpIndexCnt(cur_index,index); + (cur_index=temph->index)) + cnt+=HelpIndexCnt(cur_index,index); temph=temph->next_added; } if (recurse) @@ -199,19 +197,19 @@ public U0 HashRep(CHashTable *h=NULL, temph=tempht->next_added; while (temph!=tempht) { if (!(temph->type & (HTF_IMPORT | HTF_PRIVATE)) && - temph->type & mask && - (temph->type & HTF_PUBLIC || !publics)) + temph->type & mask && + (temph->type & HTF_PUBLIC || !publics)) if (!index) lst[j++].h=temph; else if (temph->type&HTG_SRC_SYM && - (cur_index=temph->index)) - if (k=HelpIndexCnt(cur_index,index)) { - while (k--) { - lst[j].index=HelpIndexStr(&cur_index,index); - lst[j++].h=temph; + (cur_index=temph->index)) + if (k=HelpIndexCnt(cur_index,index)) { + while (k--) { + lst[j].index=HelpIndexStr(&cur_index,index); + lst[j++].h=temph; + } } - } temph=temph->next_added; } if (recurse) @@ -242,24 +240,19 @@ public U0 HashRep(CHashTable *h=NULL, "$$FG,GREEN$$%s$$FG$$\n",cur_index; } } - if (index && ptr->type & HTT_HELP_FILE) { - if (doc) { - doc1=DocRead(ptr->str); - DocInsDoc(doc,doc1); - DocDel(doc1); - } else - Type(ptr->str); - } else { + if (index && ptr->type & HTT_HELP_FILE) + DocType(doc,ptr->str); + else { if (ptr->type&HTG_SRC_SYM && ptr(CHashSrcSym *)->src_link) { buf4=StrNew(ptr(CHashSrcSym *)->src_link); if (mapfile_drv && StrLen(buf4)>4 && buf[1]==':' && buf4[4]==':') buf4[3]=mapfile_drv; - dbg=indent=NULL; + dbg=NULL; if (outname && doc && ptr->type & HTT_FUN) { if (dbg=ptr(CHashFun *)->debug) { size=offset(CDbgInfo.body)+ - sizeof(U8 *)* - (dbg->max_line-dbg->min_line+2); + sizeof(U8 *)* + (dbg->max_line-dbg->min_line+2); if (size>MSize(dbg)) { "Corrupt Map Entry\n"; dbg=NULL; @@ -277,46 +270,14 @@ public U0 HashRep(CHashTable *h=NULL, dbg=NULL; } } - if (indent=ptr(CHashFun *)->indent) { - size=offset(CIndentInfo.body)+ - sizeof(U8)* - (indent->max_line-indent->min_line+2); - if (size>MSize(indent)) { - "Corrupt Indent Entry\n"; - indent=NULL; - } else { - if (indent->min_line<=indent->max_line) { - tempb=CAlloc(sizeof(CDocBin)); - tempb->type=DOCBT_INDENTS; - tempb->size=size; - tempb->data=MAlloc(size); - MemCpy(tempb->data,indent,size); - indent_bin_num=tempb->num=doc->cur_bin_num++; - tempb->use_cnt=1; - QueIns(tempb,doc->bin_root.last); - } else - indent=NULL; - } - } } - if (dbg || indent) { - if (dbg) { - SPrintF(buf,"$$LK+BI,\"%-26s\",\"%s\",%d$$", + if (dbg) { + SPrintF(buf,"$$LK+BI,\"%-26s\",\"%s\",%d$$", ptr->str,buf4,dbg_bin_num); - DocPutS(doc,buf); - } - if (indent) { - if (dbg) - SPrintF(buf,"$$LK+BI,\"\",\"%s\",%d$$", - ptr->str,indent_bin_num); - else - SPrintF(buf,"$$LK+BI,\"%-26s\",\"%s\",%d$$", - ptr->str,buf4,indent_bin_num); - DocPutS(doc,buf); - } + DocPutS(doc,buf); } else { SPrintF(buf,"$$LK,\"%-26s\",\"%s\"$$", - ptr->str,buf4); + ptr->str,buf4); if (doc) DocPutS(doc,buf); else @@ -370,7 +331,7 @@ public U0 HashRep(CHashTable *h=NULL, } Free(lst); -end_hash: + end_hash: Preempt(old_preempt); if (doc) { DocBinsValidate(doc); @@ -464,7 +425,7 @@ public U0 DocHelpIndex(CDoc *doc,U8 *index) public U0 PopUpHelpIndex(U8 *index,CTask *parent=NULL) { U8 *buf; - buf=MSPrintF("DocHelpIndex(DocCur,\"%s\");View;",index); + buf=MSPrintF("DocHelpIndex(DocPut,\"%s\");View;",index); PopUp(buf,parent); Free(buf); } @@ -479,7 +440,6 @@ public U0 MapFileLoad(U8 *filename) CHashSrcSym *temph; I64 i,j,base=0; CDbgInfo *dbg; - CIndentInfo *indent; FileExtRem(absname); if (absname[1]==':' && StrLen(absname)>2 && @@ -501,13 +461,12 @@ public U0 MapFileLoad(U8 *filename) ptr=temph->src_link; if (ptr[0] && ptr[1] && ptr[2]==':' && ptr[3]==':') - ptr[3]=dft_drv; + ptr[3]=*sys_acct; doc_e->aux_str=NULL; } if (temph->type&(HTT_FUN|HTT_EXPORT_SYS_SYM)) { dbg =temph->debug; - indent=temph->indent; if (!dbg && doc_e->bin_data && doc_e->bin_data->type==DOCBT_DEBUG_LINES) { if (dbg=doc_e->bin_data->data) { if (doc_e->bin_data->size>MSize(dbg)) @@ -523,16 +482,6 @@ public U0 MapFileLoad(U8 *filename) } } } - if (!indent && doc_e->bin_data && doc_e->bin_data->type==DOCBT_INDENTS) { - if (indent=doc_e->bin_data->data) { - if (doc_e->bin_data->size>MSize(indent)) - "Corrupt Indent Entry\n"; - else { - doc_e->bin_data->data=NULL; - temph->indent=indent; - } - } - } } } Free(st); diff --git a/TempleOS/Adam/LogIn.CPP b/TempleOS/Adam/LogIn.CPP index ff7ef0e..a3aad81 100644 --- a/TempleOS/Adam/LogIn.CPP +++ b/TempleOS/Adam/LogIn.CPP @@ -4,7 +4,6 @@ U0 UserStartUp() { //Run each time a user a spawned UseTermDoc; - DocCurAttr(WHITE<<4+BLUE); Type("::/TempleOS/Doc/Start.TXT"); LBts(&Fs->display_flags,DISPLAYf_SHOW); WinZBufUpdate; @@ -13,8 +12,8 @@ U0 UserStartUp() } //This is temporary until defined in $LK-A,"HOME/Adam3fSys.CPP"$. -U0 ServantStartUp() -{ //Run each time a servant task is spawned. +U0 SrvStartUp() +{ //Run each time a srv task is spawned. UseTermDoc; LBts(&Fs->display_flags,DISPLAYf_SHOW); WinZBufUpdate; @@ -92,7 +91,7 @@ public Bool AcctRegSetDftEntry(U8 *path,U8 *val,Bool is_adam_entry=FALSE) else Adam("%s",val); } - if (IsDrvWritable(dft_drv)) + if (IsDrvWritable(*sys_acct)) DocWrite(sys_registry_doc); result=FALSE; } else @@ -102,7 +101,7 @@ public Bool AcctRegSetDftEntry(U8 *path,U8 *val,Bool is_adam_entry=FALSE) return result; } -public I64 AcctRegExecuteBranch(U8 *path) +public I64 AcctRegExeBranch(U8 *path) { AcctCacheRegistry; return DocTreeBranchExe(sys_registry_doc,path); @@ -119,7 +118,7 @@ public Bool AcctRegWriteBranch(U8 *path,U8 *fmt,...) DocCut(sys_registry_doc,tree_branch,end_indent); DocTreeMake(sys_registry_doc,path); DocPutS(sys_registry_doc,buf); - if (IsDrvWritable(dft_drv)) + if (IsDrvWritable(*sys_acct)) DocWrite(sys_registry_doc); if (unlock_doc) DocUnlock(sys_registry_doc); @@ -148,20 +147,14 @@ U0 AcctOneTimePopUp(I64 flag_num,U8 *msg) U0 RegistryInit() { U8 buf[136]; - Bool existed=FileFind(ACCT_REGISTRY_FILENAME),version_present; + Bool version_present; AcctRegSetDftEntry("Adam/TempleOS/SysMsgFlags","sys_msg_flags[0]=0;\n",TRUE); SPrintF(buf,"registry_version=%4.3f;\n",os_version); version_present=AcctRegSetDftEntry("Adam/TempleOS/SysRegVer",buf,TRUE); - AcctRegExecuteBranch("Adam"); - - //Convert old registries - if (existed && !version_present) - registry_version=5.10; + AcctRegExeBranch("Adam"); if (registry_version!=os_version) { - if (registry_version<5.101) - AcctRegWriteBranch("TempleOS",""); AcctRegWriteBranch("Adam/TempleOS/SysRegVer",buf); - AcctRegExecuteBranch("Adam"); + AcctRegExeBranch("Adam"); } } diff --git a/TempleOS/Adam/MathODE.CPP b/TempleOS/Adam/MathODE.CPP index 64ca203..86b1919 100644 --- a/TempleOS/Adam/MathODE.CPP +++ b/TempleOS/Adam/MathODE.CPP @@ -1,7 +1,7 @@ #help_index "Math/CMathODE;CMathODE" #help_file "::/TempleOS/Doc/ODE" -//See $LK-A,"::/TempleOS/Doc/Acknowledgements.TXT"$ (5). +//See $LK-A,"::/TempleOS/Doc/Acknowledgements.TXT"$. F64 LowPass1(F64 a,F64 y0,F64 y,F64 dt=1.0) { //First order low pass filter diff --git a/TempleOS/Adam/Menu.CPP b/TempleOS/Adam/Menu.CPP index 4a058e9..9b60e8b 100644 --- a/TempleOS/Adam/Menu.CPP +++ b/TempleOS/Adam/Menu.CPP @@ -1,6 +1,14 @@ #help_index "Menus" #help_file "::/TempleOS/Doc/Menus" +CTask *MenuTask() +{ + CTask *result=sys_focus_task; + while (result && !result->cur_menu) + result=result->parent_task; + return result; +} + CMenuEntry *sys_cur_submenu_entry=NULL; public CMenuEntry *MenuSubEntryFind(CMenuEntry *first,U8 *entry_name) @@ -170,7 +178,7 @@ U0 DrawMenu(CDC *dc) CMenu *m; CMenuEntry *tempme,*tempse,*cur_submenu=NULL; U8 *st=NULL; - CTask *task=sys_focus_task; + CTask *task=MenuTask; I64 i,w,x0,y0,x1=ipx,y1=ipy; if (!TaskValidate(task) || !(m=task->cur_menu) || m->mu_signature!=MENU_SIGNATURE_VAL) { diff --git a/TempleOS/Adam/Snd/HDAudio.CPP b/TempleOS/Adam/Snd/HDAudio.CPP deleted file mode 100644 index 86194c1..0000000 --- a/TempleOS/Adam/Snd/HDAudio.CPP +++ /dev/null @@ -1,651 +0,0 @@ -#help_index "Snd/HDAudio" - -#define HD_1_CHAN 0 -#define HD_2_CHAN 1 -#define HD_3_CHAN 2 -#define HD_4_CHAN 3 - -#define HD_8_BIT 0 -#define HD_16_BIT 1 -#define HD_20_BIT 2 -#define HD_24_BIT 3 -#define HD_32_BIT 4 - -#define HD_48kHz 0 - -#define HD_DFT_OUT_FMT (HD_2_CHAN+HD_24_BIT<<4+HD_48kHz<<8) -#define HD_DFT_IN_FMT (HD_2_CHAN+HD_16_BIT<<4+HD_48kHz<<8) - -#define HD_POS_BUF_MULTIPLES 0x1000 - -#define HD_CORB_ENTRIES 256 -#define HD_RIRB_ENTRIES 256 -#define HD_BDL_ENTRIES 256 - -#define HD_GCTL 0x08 -#define HD_STATESTS 0x0E -#define HD_GSTS 0x10 -#define HD_CORBLBASE 0x40 -#define HD_CORBUBASE 0x44 -#define HD_CORBWP 0x48 -#define HD_CORBRP 0x4A -#define HD_CORBCTL 0x4C -#define HD_CORBST 0x4D -#define HD_RIRBLBASE 0x50 -#define HD_RIRBUBASE 0x54 -#define HD_RIRBWP 0x58 -#define HD_RIRBCTL 0x5C -#define HD_RIRBSTS 0x5D - -#define STRCTL 0x00 -#define STRSTS 0x03 -#define STRLPIB 0x04 -#define STRCBL 0x08 -#define STRLVI 0x0C -#define STRFIFOW 0x0E -#define STRFIFOS 0x10 -#define STRFMT 0x12 -#define STRBDPL 0x18 -#define STRBDPU 0x1C - -#define ISTR0 0x080 -#define ISTR1 0x0A0 -#define ISTR2 0x0C0 -#define ISTR3 0x0E0 -#define OSTR0 0x100 -#define OSTR1 0x120 -#define OSTR2 0x140 -#define OSTR3 0x160 - -#define VERB_GET_PARAM 0xF0000 -#define VERB_CONNECT_SELECT_GET 0xF0100 -#define VERB_CONNECT_SELECT_SET 0x70100 -#define VERB_GET_CONNECT_LST 0xF0200 -#define VERB_PROCESS_STATE_GET 0xF0300 -#define VERB_PROCESS_STATE_SET 0x70300 -#define VERB_COEFF_INDEX_GET 0xD0000 -#define VERB_COEFF_INDEX_SET 0x50000 -#define VERB_PROCESS_COEFF_GET 0xC0000 -#define VERB_PROCESS_COEFF_SET 0x40000 -#define VERB_AMPLIFIER_GAIN_GET 0xB0000 -#define VERB_AMPLIFIER_GAIN_SET 0x30000 -#define VERB_STREAM_FMT_GET 0xA0000 -#define VERB_STREAM_FMT_SET 0x20000 -#define VERB_DIGIT_CONVERT1_GET 0xF0D00 -#define VERB_DIGIT_CONVERT1_SET 0x70D00 -#define VERB_DIGIT_CONVERT2_GET 0xF0D00 -#define VERB_DIGIT_CONVERT2_SET 0x70E00 -#define VERB_POWER_STATE_GET 0xF0500 -#define VERB_POWER_STATE_SET 0x70500 -#define VERB_CHAN_STREAM_ID_GET 0xF0600 -#define VERB_CHAN_STREAM_ID_SET 0x70600 -#define VERB_SDI_SELECT_GET 0xF0400 -#define VERB_SDI_SELECT_SET 0x70400 -#define VERB_PIN_WIDGET_CTL_GET 0xF0700 -#define VERB_PIN_WIDGET_CTL_SET 0x70700 -#define VERB_UNSOL_ENABLE_GET 0xF0800 -#define VERB_UNSOL_ENABLE_SET 0x70800 -#define VERB_PIN_SENSE_GET 0xF0900 -#define VERB_PIN_SENSE_SET 0x70900 -#define VERB_EAPDBTL_ENABLE_GET 0xF0C00 -#define VERB_EAPDBTL_ENABLE_SET 0x70C00 -#define VERB_BEEP_CTL_GET 0xF0A00 -#define VERB_BEEP_CTL_SET 0x70A00 -#define VERB_GPI_CTRL0_GET 0xF1000 -#define VERB_GPI_CTRL0_SET 0x71000 -#define VERB_GPI_CTRL1_GET 0xF1100 -#define VERB_GPI_CTRL1_SET 0x71100 -#define VERB_GPI_CTRL2_GET 0xF1200 -#define VERB_GPI_CTRL2_SET 0x71200 -#define VERB_GPI_CTRL3_GET 0xF1300 -#define VERB_GPI_CTRL3_SET 0x71300 -#define VERB_GPI_CTRL4_GET 0xF1400 -#define VERB_GPI_CTRL4_SET 0x71400 -#define VERB_GPI_CTRL5_GET 0xF1500 -#define VERB_GPI_CTRL5_SET 0x71500 -#define VERB_GPI_CTRL6_GET 0xF1600 -#define VERB_GPI_CTRL6_SET 0x71600 -#define VERB_GPI_CTRL7_GET 0xF1700 -#define VERB_GPI_CTRL7_SET 0x71700 -#define VERB_GPI_CTRL8_GET 0xF1800 -#define VERB_GPI_CTRL8_SET 0x71800 -#define VERB_GPI_CTRL9_GET 0xF1900 -#define VERB_GPI_CTRL9_SET 0x71900 -#define VERB_GPI_CTRLA_GET 0xF1A00 -#define VERB_GPI_CTRLA_SET 0x71A00 -#define VERB_VOL_CTL_GET 0xF0F00 -#define VERB_VOL_CTL_SET 0x70F00 -#define VERB_SUB_SYS_ID0_GET 0xF2000 -#define VERB_SUB_SYS_ID0_SET 0x72000 -#define VERB_SUB_SYS_ID1_GET 0xF2000 -#define VERB_SUB_SYS_ID1_SET 0x72100 -#define VERB_SUB_SYS_ID2_GET 0xF2000 -#define VERB_SUB_SYS_ID2_SET 0x72200 -#define VERB_SUB_SYS_ID3_GET 0xF2000 -#define VERB_SUB_SYS_ID3_SET 0x72300 -#define VERB_CFG_DFT0_GET 0xF1C00 -#define VERB_CFG_DFT0_SET 0x71C00 -#define VERB_CFG_DFT1_GET 0xF1C00 -#define VERB_CFG_DFT1_SET 0x71D00 -#define VERB_CFG_DFT2_GET 0xF1C00 -#define VERB_CFG_DFT2_SET 0x71E00 -#define VERB_CFG_DFT3_GET 0xF1C00 -#define VERB_CFG_DFT3_SET 0x71F00 -#define VERB_STRIPE_CTL_GET 0xF2400 -#define VERB_STRIPE_CTL_SET 0x72400 -#define VERB_RST 0x7FF00 - - -//Parameters -#define P_VENDOR_ID 0x00 -#define P_REVISION_ID 0x02 -#define P_SUBNODE_CNT 0x04 -#define P_FUN_GRP_TYPE 0x05 -#define P_AUDIO_FUN_CAP 0x08 -#define P_AUDIO_WIDGET_CAP 0x09 -#define P_SAMPLE_SIZE_RATE_CAP 0x0A -#define P_STREAM_FMTS 0x0B -#define P_PIN_CAP 0x0C -#define P_INPUT_AMP_CAP 0x0D -#define P_OUTPUT_AMP_CAP 0x12 -#define P_CONNECT_LST_LEN 0x0E -#define P_POWER_STATES 0x0F -#define P_PROCESSING_CAP 0x10 -#define P_GPIO_CNT 0x11 -#define P_VOL_KNOB_CAP 0x13 - -//Function Group Types -//00 reserved -#define FGT_AUDIO 1 -#define FGT_VENDOR_MODEM 2 -//03-7F reserved -//80-FF vendor function group - -//Audio Widget Types -#define AWT_OUTPUT 0x0 -#define AWT_INPUT 0x1 -#define AWT_MIXER 0x2 -#define AWT_SELECTOR 0x3 -#define AWT_PIN_COMPLEX 0x4 -#define AWT_POWER_WIDGET 0x5 -#define AWT_VOL_KNOB_WIDGET 0x6 -#define AWT_BEEP_GEN_WIDGET 0x7 -#define AWT_VENDOR 0xF -#define AWT_NODE 0x10 -DefineLstLoad("ST_AUDIO_WIDGET_TYPES", -"Output\0Input\0Mixer\0Selector\0Pin Complex\0" -"Power Widget\0Vol Knob\0Beep Gen\0 \0 \0 \0 \0 \0 \0 \0Vendor\0Node\0"); - -class CHDBufDesc -{ - I32 *buf; - U32 len; - U32 ctrl; -}; - -#define HD_TONES 8 - -class CHDAudioCtrl -{ - U8 *bar; - I64 cad; - U32 *corb; - I64 *rirb; - CHDBufDesc *ostr0_bdl,*istr0_bdl; - SND_OUT_CONTAINER *ostr0_buf[2],*o_temp_buf; - SND_IN_CONTAINER *istr0_buf[2]; - CTask *task; - I64 waveform; - F64 freq,amp; - CSndWaveCtrl *tone_swcs[HD_TONES]; - U8 rirb_rp,corb_wp; - Bool audio_task_started,in_running,out_running; -} *_hda=NULL; - -I64 AudioSize() -{//$LK,"MemRep","MN:MemRep"$ uses this for Adam Heap - I64 result=MSize2(snd_reverb_buf); - if (_hda) { - result+=MSize2(_hda)+MSize2(_hda->o_temp_buf); -/* uncached heap - result+=MSize2(_hda->corb)+MSize(_hda->rirb)+ - MSize2(_hda->ostr0_bdl)+MSize2(_hda->istr0_bdl); - for (i=0;i<2;i++) - result+=MSize2(_hda->ostr0_buf[i]); - for (i=0;i<2;i++) - result+=MSize2(_hda->istr0_buf[i]); -*/ - } - return result; -} - -U0 HDSyncCORB() -{ - U16 *wp,*rp; - wp =_hda->bar+HD_CORBWP; - *wp=_hda->corb_wp; - rp =_hda->bar+HD_CORBRP; - while (*rp&255!=_hda->corb_wp) - Yield; -} - -U0 HDWriteCORB(I64 cad,I64 nid,U32 val) -{ - val|=cad<<28+nid<<20; - _hda->corb[++_hda->corb_wp]=val; -} - -I64 HDSyncRIRB() -{ - U16 *_w; - I64 wp,result=0; - _w=_hda->bar+HD_RIRBWP; - wp=*_w; - while (_hda->rirb_rp!=wp) - result=_hda->rirb[++_hda->rirb_rp]; - return result; -} - -I64 HDReadRIRB() -{ - U16 *_w; - I64 wp,result=0; - _w=_hda->bar+HD_RIRBWP; - do { - Yield; - wp=*_w; - } while (wp==_hda->rirb_rp); - result=_hda->rirb[++_hda->rirb_rp]; - return result; -} - -I64 HDWriteCORBSync(I64 cad,I64 nid,U32 val) -{ - HDSyncCORB; - HDSyncRIRB; - HDWriteCORB(cad,nid,val); - HDSyncCORB; - return HDReadRIRB; -} - -Bool HDTestCORBSync(I64 cad,I64 nid,U32 val) -{ //Checks for a response - U16 *_w; - U8 wp; - - HDSyncCORB; - HDSyncRIRB; - HDWriteCORB(cad,nid,val); - HDSyncCORB; - - Sleep(1); - _w=_hda->bar+HD_RIRBWP; - wp=*_w; - if (wp==_hda->rirb_rp) - return FALSE; - HDReadRIRB; - return TRUE; -} - -U0 HDTraverse(I64 cad,I64 nid) -{ - I64 i,len,aud_cap,type; - HDWriteCORBSync(cad,nid,VERB_POWER_STATE_SET+0x00); //0 is on - HDWriteCORBSync(cad,nid,VERB_EAPDBTL_ENABLE_SET+0x02); - HDWriteCORBSync(cad,nid,VERB_PROCESS_STATE_SET+0x02); - HDWriteCORBSync(cad,nid,VERB_CONNECT_SELECT_SET+0x00); - aud_cap=HDWriteCORBSync(cad,nid,VERB_GET_PARAM+P_SUBNODE_CNT); - if (aud_cap.u16[0]) { - for (i=aud_cap.u16[1];i>20&15; - if (Bt(&aud_cap,8)) - len=HDWriteCORBSync(cad,nid,VERB_GET_PARAM+P_CONNECT_LST_LEN)&127; - else - len=0; - HDWriteCORBSync(cad,nid,VERB_AMPLIFIER_GAIN_SET+0xF07F); //set I/O amp #0 - for (i=1;ibar) { - if (out) { - _d=_hda->bar+OSTR0+STRCTL; - *_d=0x100002; - _hda->out_running=TRUE; - } - if (in) { - _d=_hda->bar+ISTR0+STRCTL; - *_d=0x200002; - _hda->in_running=TRUE; - } - } -} - -U0 HDStop(Bool in,Bool out) -{ - U32 *_d; - if (_hda->bar) { - if (out) { - _d=_hda->bar+OSTR0+STRCTL; - *_d=0; - _hda->out_running=FALSE; - } - if (in) { - _d=_hda->bar+ISTR0+STRCTL; - *_d=0; - _hda->in_running=FALSE; - } - } -} - -U0 HDSnd(F64 freq,I64 waveform=WF_SQUARE,F64 amp=1.0) -{ - _hda->waveform=waveform; - _hda->amp=amp; - _hda->freq=freq; -} - -U0 HDFillBuf(SND_OUT_CONTAINER *buf,I64) -{ - I64 i,size=SND_BUF_LEN*sizeof(SND_OUT_CONTAINER); - if (!_hda->o_temp_buf) - _hda->o_temp_buf=AMAlloc(size); - MemSet(_hda->o_temp_buf,0,size); - for (i=0;itone_swcs[i],_hda->o_temp_buf,SND_BUF_LEN/SND_OCHANNELS,_hda->freq,_hda->waveform,snd_vol*_hda->amp); - MemCpy(buf,_hda->o_temp_buf,size); -} - -U0 HDAudioTaskEndCB() -{ - I64 i; - HDStop(FALSE,TRUE); - fp_snd=NULL; - for (i=0;itone_swcs[i]); - _hda->tone_swcs[i]=NULL; - } - Exit; -} - -public U0 HDTonesInit() -{ - I64 i; - if (_hda) { - for (i=0;itone_swcs[i]->freq_multiplier=1.0; - _hda->tone_swcs[i]->amp_multiplier=0; - } - _hda->tone_swcs[0]->amp_multiplier=1.0; - } -} - -U0 HDAudioTask(I64) -{ -//I didn't feel like messing around with PCI interrupts -//so this task polls every millisecond to know when to -//switch buffers. - I64 i,next_obuf_trigger=SND_BUF_LEN*sizeof(SND_OUT_CONTAINER)/2, - obuf_rollover=0, - next_ibuf_trigger=SND_BUF_LEN*sizeof(SND_IN_CONTAINER), - ibuf_rollover=0; - U32 *pos_in_obuf=_hda->bar+OSTR0+STRLPIB, - *pos_in_ibuf=_hda->bar+ISTR0+STRLPIB; - Fs->task_end_cb=&HDAudioTaskEndCB; - for (i=0;itone_swcs[i]=SndWaveCtrlNew; - HDTonesInit; - _hda->freq=0; - Snd(0); - fp_snd=&HDSnd; - fp_snd_fill_buf=&HDFillBuf; - fp_snd_copy_buf=NULL; - if (!IsSysDeterministic) - Preempt(ON); - snd_obuf_num=1; - snd_ibuf_num=1; - HDRun(FALSE,TRUE); - _hda->audio_task_started=TRUE; //This flag is probably not necessary - while (TRUE) { - if (next_obuf_trigger-obuf_rollover<=*pos_in_obuf=HD_POS_BUF_MULTIPLES*SND_BUF_LEN*sizeof(SND_OUT_CONTAINER)) - obuf_rollover+=HD_POS_BUF_MULTIPLES*SND_BUF_LEN*sizeof(SND_OUT_CONTAINER); - if (fp_snd_fill_buf) { - LBts(&snd_flags,Sf_FILLING_OUT); - (*fp_snd_fill_buf)(_hda->ostr0_buf[snd_obuf_num&1],snd_obuf_num); - if (IsMute) - MemSet(_hda->ostr0_buf[snd_obuf_num&1],0,SND_BUF_LEN*sizeof(SND_OUT_CONTAINER)); - else if (snd_reverb_intensity && - 0ostr0_buf[snd_obuf_num&1],snd_obuf_num); - LBtr(&snd_flags,Sf_FILLING_OUT); - } - snd_obuf_num++; - } - if (next_ibuf_trigger-ibuf_rollover<=*pos_in_ibuf=HD_POS_BUF_MULTIPLES*SND_BUF_LEN*sizeof(SND_IN_CONTAINER)) - ibuf_rollover+=HD_POS_BUF_MULTIPLES*SND_BUF_LEN*sizeof(SND_IN_CONTAINER); - if (fp_snd_copy_buf) - (*fp_snd_copy_buf)(_hda->istr0_buf[snd_obuf_num&1],snd_ibuf_num); - snd_ibuf_num++; - } - Sleep(1); - } -} - -U0 HDRst() -{ - U32 d,*_d; - HDStop(TRUE,TRUE); - _d=_hda->bar+HD_GCTL; - *_d=0; //rst - do { - Sleep(1); - d=*_d; - } while (d & 1); - *_d=1; - do { - Sleep(1); - d=*_d; - } while (!(d & 1)); - Sleep(1); -} - -public U0 HDAudioEnd(Bool rst=TRUE) -{ - snd_dev=SD_PC_SPEAKER; - if (_hda && _hda->bar) { - Kill(_hda->task); - _hda->task=NULL; - if (rst) - HDRst; - Free(_hda->corb); - Free(_hda->rirb); - Free(_hda->o_temp_buf); - Free(_hda->ostr0_buf[0]); - Free(_hda->ostr0_buf[1]); - Free(_hda->istr0_buf[0]); - Free(_hda->istr0_buf[1]); - Free(_hda->ostr0_bdl); - Free(_hda->istr0_bdl); - Mem32DevFree(_hda->bar); - Free(_hda); - _hda=NULL; - } -} - -public Bool HDAudioInit(I64 hd_bus,I64 hd_dev,I64 hd_fun) -{ - I64 i; - U32 *_d; - U16 w,*_w; - U8 *_b; - if (_hda) - HDAudioEnd; - if (PCIReadU16(hd_bus,hd_dev,hd_fun,0)==0x8086 && - (_hda=ACAlloc(sizeof(CHDAudioCtrl))) && - (_hda->bar=Mem32DevAlloc(0x4000,0x4000)) ) { - PCIWriteU32(hd_bus,hd_dev,hd_fun,0x14,_hda->bar(I64).u32[1]); - PCIWriteU32(hd_bus,hd_dev,hd_fun,0x10,_hda->bar(I64).u32[0]); - PCIWriteU16(hd_bus,hd_dev,hd_fun,0x04, - PCIReadU16(hd_bus,hd_dev,hd_fun,0x04)|0x406); - - HDRst; - - _hda->corb=CAllocAligned(HD_CORB_ENTRIES*sizeof(U32),128,sys_uncached_heap); - _d=_hda->bar+HD_CORBLBASE; - *_d=_hda->corb(I64).u32[0]; - _d=_hda->bar+HD_CORBUBASE; - *_d=_hda->corb(I64).u32[1]; - - _hda->rirb=CAllocAligned(HD_RIRB_ENTRIES*sizeof(I64),128,sys_uncached_heap); - _d=_hda->bar+HD_RIRBLBASE; - *_d=_hda->rirb(I64).u32[0]; - _d=_hda->bar+HD_RIRBUBASE; - *_d=_hda->rirb(I64).u32[1]; - - _w=_hda->bar+HD_CORBRP; - *_w=0x8000; //Rst read ptr - do { - Yield; - w=*_w; - } while (!(w&0x8000)); - *_w=0x0000; //Rst read ptr - do { - Yield; - w=*_w; - } while (w&0x8000); - - _w=_hda->bar+HD_RIRBWP; - *_w=0x8000; //Rst write ptr - - _b=_hda->bar+HD_CORBCTL; - *_b=0x02; //Run - _b=_hda->bar+HD_RIRBCTL; - *_b=0x02; //Run - - _w=_hda->bar+HD_CORBWP; - _hda->corb_wp=*_w; - _w=_hda->bar+HD_RIRBWP; - _hda->rirb_rp=*_w; - - _hda->ostr0_bdl =CAllocAligned(HD_BDL_ENTRIES*sizeof(CHDBufDesc),128,sys_uncached_heap); - _d=_hda->bar+OSTR0+STRBDPL; - *_d=_hda->ostr0_bdl(I64).u32[0]; - _d=_hda->bar+OSTR0+STRBDPU; - *_d=_hda->ostr0_bdl(I64).u32[1]; - for (i=0;i<2;i++) { - _hda->ostr0_bdl[i].buf=_hda->ostr0_buf[i]=CAllocAligned(SND_BUF_LEN*sizeof(SND_OUT_CONTAINER),128,sys_uncached_heap); - _hda->ostr0_bdl[i].len=SND_BUF_LEN*sizeof(SND_OUT_CONTAINER); - _hda->ostr0_bdl[i].ctrl=1; - } - - _hda->istr0_bdl =CAllocAligned(HD_BDL_ENTRIES*sizeof(CHDBufDesc),128,sys_uncached_heap); - _d=_hda->bar+ISTR0+STRBDPL; - *_d=_hda->istr0_bdl(I64).u32[0]; - _d=_hda->bar+ISTR0+STRBDPU; - *_d=_hda->istr0_bdl(I64).u32[1]; - for (i=0;i<2;i++) { - _hda->istr0_bdl[i].buf=_hda->istr0_buf[i]=CAllocAligned(SND_BUF_LEN*sizeof(SND_IN_CONTAINER),128,sys_uncached_heap); - _hda->istr0_bdl[i].len=SND_BUF_LEN*sizeof(SND_IN_CONTAINER); - _hda->istr0_bdl[i].ctrl=1; - } - - _w=_hda->bar+HD_STATESTS; - w=*_w; - while (w) { - _hda->cad=Bsf(w); - if (HDTestCORBSync(_hda->cad,0,VERB_GET_PARAM+P_SUBNODE_CNT)) { - HDTraverse(_hda->cad,0); - - _d=_hda->bar+OSTR0+STRLPIB; - *_d=0; - _d=_hda->bar+OSTR0+STRCBL; - *_d=HD_POS_BUF_MULTIPLES*SND_BUF_LEN*sizeof(SND_OUT_CONTAINER); - _w=_hda->bar+OSTR0+STRLVI; - *_w=1; //last valid index - _w=_hda->bar+OSTR0+STRFMT; - *_w=HD_DFT_OUT_FMT; - - _d=_hda->bar+ISTR0+STRLPIB; - *_d=0; - _d=_hda->bar+ISTR0+STRCBL; - *_d=HD_POS_BUF_MULTIPLES*SND_BUF_LEN*sizeof(SND_IN_CONTAINER); - _w=_hda->bar+ISTR0+STRLVI; - *_w=1; //last valid index - _w=_hda->bar+ISTR0+STRFMT; - *_w=HD_DFT_IN_FMT; - - LBts(&sys_semas[SYS_SEMA_SND],0); //turn off until cfg completed - LBtr(&snd_flags,Sf_FILLING_OUT); - _hda->audio_task_started=FALSE; - if (mp_cnt>1) - _hda->task=MPSpawn(&HDAudioTask,NULL,"HD Audio"); - else - _hda->task=Spawn(&HDAudioTask,NULL,"HD Audio"); - while (!_hda->audio_task_started) - Yield; - snd_dev=SD_HD_AUDIO; - return TRUE; - } - Btr(&w,_hda->cad); - } - HDAudioEnd(FALSE); - } else { - Free(_hda); - _hda=NULL; - } - return FALSE; -} - -Bool HDAudioScan() -{ - I64 i=-1,j; - while (TRUE) { - j=PCIClassFind(0x040300,++i); - if (j<0) - return FALSE; - - //!!! Remove the following line. !!! - if (j.u8[1]!=0x1B) break; - //!!! We got problems with $LK,"0xF0000000","FF:::/TempleOS/Kernel/Memory.CPP,0xF000000"$ !!! - - if (HDAudioInit(j.u8[2],j.u8[1],j.u8[0])) - return TRUE; - } -} - -HDAudioScan; - -//$BK,1$Run $LK-A,"::/TempleOS/Adam/Snd/HDCfg.CPP"$.$BK,0$ -#help_index "" diff --git a/TempleOS/Adam/Snd/HDCfg.CPP b/TempleOS/Adam/Snd/HDCfg.CPP deleted file mode 100644 index de233a8..0000000 --- a/TempleOS/Adam/Snd/HDCfg.CPP +++ /dev/null @@ -1,638 +0,0 @@ -#define MAX_CONNECTS 16 - -class MyMass:CMass -{ - F64 radius; - U8 nid,type,num_connects,cur_connect; - U32 audio_widget_capabilities; - U8 connect_lst[MAX_CONNECTS]; - U8 gain_lst[MAX_CONNECTS]; - U32 pin_capabilities,pin_sense, - pcm_size_rates, - in_amp_cap,out_amp_cap; - U8 pin_widget_ctl; - Bool disabled; -}; - -class MySpring:CSpring -{ - I64 color; -}; - -CMathODE *ode=NULL; - -#define BORDER 10 - - -U0 DrawIt(CTask *task,CDC *dc) -{ - Bool old_suspend,old_preempt; - I16 *buf; - I64 i,cxx,cyy, - cy=task->win_pixel_height>>1; - F64 dx,dy,d; - MyMass *tempm; - MySpring *temps; - - old_preempt=Preempt(OFF); - old_suspend=Suspend(task); - temps=ode->next_spring; - while (temps!=&ode->next_spring) { - dc->color=temps->color; - GrLine(dc,temps->end1->x,temps->end1->y, - temps->end2->x,temps->end2->y); - cxx=(temps->end1->x+temps->end2->x)/2; - cyy=(temps->end1->y+temps->end2->y)/2; - dx=temps->end1->x-temps->end2->x; - dy=temps->end1->y-temps->end2->y; - d=Sqrt(dx*dx+dy*dy); - dx/=d; - dy/=d; - GrLine(dc,cxx,cyy,cxx+3.0*dy-3.0*dx,cyy-3.0*dx-3.0*dy); - GrLine(dc,cxx,cyy,cxx-3.0*dy-3.0*dx,cyy+3.0*dx-3.0*dy); - temps=temps->next; - } - - tempm=ode->next_mass; - while (tempm!=&ode->next_mass) { - if (tempm->disabled) - dc->color=BLUE; - else - dc->color=LTBLUE; - GrCircle(dc,tempm->x,tempm->y,tempm->radius); - GrPrintF(dc,tempm->x,tempm->y-FONT_HEIGHT/2,"%02X %3tZ", - tempm->nid,tempm->type, - "ST_AUDIO_WIDGET_TYPES"); - tempm=tempm->next; - } - Suspend(task,old_suspend); - Preempt(old_preempt); - dc->color=BLUE; - buf=_hda->istr0_buf[0]; - for (i=0;iwin_pixel_width/SND_BUF_LEN, - cy-buf[i]*cy/MAX_I16); -} - - -U0 MyDerivative(CMathODE *ode,F64,COrder2D3 *,COrder2D3 *) -{ -//The forces due to springs and drag are -//automatically handled by the -//ode code. We can add new forces -//here. - CTask *task=ode->win_task; - I64 h=task->win_pixel_width,v=task->win_pixel_height; - F64 d,dd; - CD3 p; - MyMass *tempm1,*tempm2; - - tempm1=ode->next_mass; - while (tempm1!=&ode->next_mass) { - tempm2=tempm1->next; - while (tempm2!=&ode->next_mass) { - D3Sub(&tempm2->state->x,&tempm1->state->x,&p); - dd=D3SqrNorm(&p); - if (dd<=Sqr(tempm1->radius+tempm2->radius)) { - d=Sqrt(dd)+0.0001; - dd=10.0*Sqr(Sqr(Sqr(tempm1->radius+tempm2->radius)-dd)); - D3MulEqu(&p,dd/d); - D3AddEqu(&tempm2->DstateDt->DxDt,&p); - D3SubEqu(&tempm1->DstateDt->DxDt,&p); - } else { - D3MulEqu(&p,100000.0/dd); - D3AddEqu(&tempm2->DstateDt->DxDt,&p); - D3SubEqu(&tempm1->DstateDt->DxDt,&p); - } - tempm2=tempm2->next; - } - if (tempm1->state->xDstateDt->DxDt+=1000*Sqr(tempm1->state->x-BORDER); - if (tempm1->state->yDstateDt->DyDt+=1000*Sqr(tempm1->state->y-BORDER); - if (tempm1->state->x>h-BORDER-FONT_WIDTH*6) - tempm1->DstateDt->DxDt-=1000*Sqr(tempm1->state->x-(h-BORDER-FONT_WIDTH*6)); - if (tempm1->state->y>v-BORDER) - tempm1->DstateDt->DyDt-=1000*Sqr(tempm1->state->y-(v-BORDER)); - tempm1=tempm1->next; - } -} - -MyMass *PlaceMass(I64 nid) -{ - MyMass *tempm=CAlloc(sizeof(MyMass)); - tempm->mass=1.0; - tempm->drag_profile_factor=100.0; - tempm->radius=5; - tempm->nid=nid; - tempm->gain_lst[0]=0x7F; - MemSet(tempm->gain_lst+1,0x80,(MAX_CONNECTS-1)*sizeof(U8)); - QueIns(tempm,ode->last_mass); - return tempm; -} - -MyMass *FindMassByNID(I64 nid) -{ - MyMass *tempm; - tempm=ode->next_mass; - while (tempm!=&ode->next_mass) { - if (tempm->nid==nid) - return tempm; - tempm=tempm->next; - } - return NULL; -} - -MyMass *FindMassByXY(I64 x,I64 y) -{ - I64 dd,best_dd=MAX_I64; - MyMass *tempm,*result=NULL; - tempm=ode->next_mass; - while (tempm!=&ode->next_mass) { - dd=SqrI64(tempm->x-x)+SqrI64(tempm->y-y); - if (ddnext; - } - return result; -} - -I64 FindConnectIndex(MyMass *tempm,I64 nid) -{ - I64 i; - for (i=0;inum_connects;i++) - if (tempm->connect_lst[i]==nid) - return i; - return -1; -} - - -MySpring *PlaceSpring(MyMass *tempm1,MyMass *tempm2) -{ - MySpring *temps=CAlloc(sizeof(MySpring)); - temps->end1=tempm1; - temps->end2=tempm2; - temps->constant=10; - temps->rest_len=0; - temps->color=LTGRAY; - QueIns(temps,ode->last_spring); - return temps; -} - -U0 RedoSprings() -{ - I64 i,k; - MyMass *tempm,*tempm1; - MySpring *temps; - - QueDel(&ode->next_spring,TRUE); - tempm=ode->next_mass; - while (tempm!=&ode->next_mass) { - for (i=0;inum_connects;i++) { - if ((k=tempm->connect_lst[i]) && - (tempm1=FindMassByNID(k)) ) { - temps=PlaceSpring(tempm,tempm1); - switch (tempm->type) { - case AWT_MIXER: - if (!(tempm->gain_lst[i]&0x80)) { //If not mute - temps->color=GREEN; - temps->constant=100; - } - break; - case AWT_INPUT: - case AWT_SELECTOR: - case AWT_PIN_COMPLEX: - case AWT_VENDOR: - if (i==tempm->cur_connect) { - temps->color=RED; - temps->constant=100; - } - break; - } - } - } - tempm=tempm->next; - } -} - -U0 Init() -{ - ode=ODENew(0,1e-4,ODEF_HAS_MASSES); - ode->derivative=&MyDerivative; - ode->drag_v2=0.002; - ode->drag_v3=0.00001; - ode->acceleration_limit=5e3; - - QueIns(ode,Fs->last_ode); -} - -U0 CleanUp() -{ - QueRem(ode); - QueDel(&ode->next_mass,TRUE); - QueDel(&ode->next_spring,TRUE); - ODEDel(ode); -} - -U0 HDCfgConnectLst(MyMass *tempm,I64 cad,I64 nid) -{ - I64 i,j,connection_lst_len; - j=HDWriteCORBSync(cad,nid,VERB_GET_PARAM+P_CONNECT_LST_LEN); - connection_lst_len=j&127; - if (j&128) { //Long form? - for (i=0;iconnect_lst[tempm->num_connects++]=j.u16[0]; - if (i+1connect_lst[tempm->num_connects++]=j.u16[1]; - } - } else { - for (i=0;iconnect_lst[tempm->num_connects++]=j.u8[0]; - if (i+1connect_lst[tempm->num_connects++]=j.u8[1]; - if (i+2connect_lst[tempm->num_connects++]=j.u8[2]; - if (i+3connect_lst[tempm->num_connects++]=j.u8[3]; - } - } -} - -U0 HDCfgTraverse(I64 cad,I64 nid) -{ - I64 i,j; - MyMass *tempm=PlaceMass(nid); - j=HDWriteCORBSync(cad,nid,VERB_GET_PARAM+P_SUBNODE_CNT); - if (j.u16[0]) { - tempm->type=AWT_NODE; - for (i=j.u16[1];iaudio_widget_capabilities=HDWriteCORBSync(cad,nid,VERB_GET_PARAM+P_AUDIO_WIDGET_CAP); - tempm->pcm_size_rates=HDWriteCORBSync(cad,nid,VERB_GET_PARAM+P_SAMPLE_SIZE_RATE_CAP); - tempm->in_amp_cap=HDWriteCORBSync(cad,nid,VERB_GET_PARAM+P_INPUT_AMP_CAP); - tempm->out_amp_cap=HDWriteCORBSync(cad,nid,VERB_GET_PARAM+P_OUTPUT_AMP_CAP); - tempm->type=tempm->audio_widget_capabilities>>20&15; - switch (tempm->type) { - case AWT_PIN_COMPLEX: - tempm->pin_widget_ctl=HDWriteCORBSync(cad,nid,VERB_PIN_WIDGET_CTL_GET); - tempm->pin_capabilities=HDWriteCORBSync(cad,nid,VERB_GET_PARAM+P_PIN_CAP); - if (Bt(&tempm->pin_capabilities,0) || - Bt(&tempm->pin_capabilities,2)) - tempm->pin_sense=HDWriteCORBSync(cad,nid,VERB_PIN_SENSE_GET); - HDWriteCORBSync(cad,nid,VERB_CONNECT_SELECT_SET+0x00); - break; - case AWT_INPUT: - tempm->disabled=TRUE; - case AWT_SELECTOR: - case AWT_VENDOR: - HDWriteCORBSync(cad,nid,VERB_CONNECT_SELECT_SET+0x00); - break; - } - if (Bt(&tempm->audio_widget_capabilities,8)) - HDCfgConnectLst(tempm,cad,nid); - } -} - -U0 HDCfgRandomizeXY() -{ - I64 h=Fs->win_pixel_width,v=Fs->win_pixel_height; - MyMass *tempm; - tempm=ode->next_mass; - while (tempm!=&ode->next_mass) { - tempm->x=RandU32%(h-2*BORDER-FONT_WIDTH*6)+BORDER; - tempm->y=RandU32%(v-2*BORDER)+BORDER; - tempm=tempm->next; - } -} - -U0 HDCfgPopUpInfoTask(MyMass *tempm) -{ - I64 i; - "$$FG,RED$$NID:$$FG$$0x%02X $$FG,RED$$Type:$$FG$$%Z\n", - tempm->nid,tempm->type,"ST_AUDIO_WIDGET_TYPES"; - - i=tempm->audio_widget_capabilities; - "\n$$FG,RED$$Audio Widget Capabilities:$$FG$$\n"; - if (Bt(&i,0)) - "Stereo, "; - if (Bt(&i,1)) - "In Amp, "; - if (Bt(&i,2)) - "Out Amp, "; - if (Bt(&i,3)) - "Amp Override, "; - if (Bt(&i,4)) - "Fmt Override, "; - if (Bt(&i,5)) - "Stripe, "; - if (Bt(&i,6)) - "Proc Wgt, "; - if (Bt(&i,7)) - "Unsolicited, "; - if (Bt(&i,8)) - "Cnt Lst, "; - if (Bt(&i,9)) - "Digital, "; - if (Bt(&i,10)) - "Power Ctrl, "; - if (Bt(&i,11)) - "Left/Right Swap, "; - "Delay:%d\n",i.u16[1]&0xF; - - i=tempm->in_amp_cap; - "\n$$FG,RED$$Input Amp Capabilities:$$FG$$\n" - "Offset:0x%02X Steps:0x%02X StepSize:%5.2fdB Mutable:%d\n", - i&127,i.u8[1]&127+1,0.25*(i.u16[1]&127),Bt(&i,31); - - i=tempm->out_amp_cap; - "\n$$FG,RED$$Output Amp Capabilities:$$FG$$\n" - "Offset:0x%02X Steps:0x%02X StepSize:%5.2fdB Mutable:%d\n", - i&127,i.u8[1]&127+1,0.25*(i.u16[1]&127),Bt(&i,31); - - "\n$$FG,RED$$Size Rates Capabilities:$$FG$$\n"; - for (i=0;i<21;i++) - if (Bt(&tempm->pcm_size_rates,i)) - "%z",i, - " 8.0kHz\0 11.025kHz\0 16.0kHz\0 22.05kHz\0" - " 32.0kHz\0 44.1kHz\0 48.0kHz\0 88.2kHz\0" - " 96.0kHz\0 176.4kHz\0 192.0kHz\0 384kHz\0" - " \0 \0 \0 \0" - " 8Bit\0 16bit\0 20Bit\0 24Bit\0 32Bit\0"; - NewLine; - - - "\n$$FG,RED$$Connection Lst:$$FG$$\n"; - for (i=0;inum_connects;i++) - "%02X,",tempm->connect_lst[i]; - NewLine; - - "\n$$FG,RED$$Gain Lst:$$FG$$\n"; - for (i=0;inum_connects;i++) - "%02X,",tempm->gain_lst[i]; - NewLine; - - switch (tempm->type) { - case AWT_PIN_COMPLEX: - "\n$$FG,RED$$Pin Capabilities:$$FG$$\n"; - i=tempm->pin_capabilities; - if (Bt(&i,0)) - "Impedance Sense, "; - if (Bt(&i,1)) - "Trigger Required, "; - if (Bt(&i,2)) - "Presence Detect, "; - if (Bt(&i,3)) - "Headphone Drive, "; - if (Bt(&i,4)) - "Output, "; - if (Bt(&i,5)) - "Input, "; - if (Bt(&i,6)) - "Balanced, "; - if (Bt(&i,16)) - "EAPD, "; - "Vref:%02X\n\n",i.u8[1]; - if (Bt(&tempm->pin_capabilities,0) || - Bt(&tempm->pin_capabilities,2)) - tempm->pin_sense=HDWriteCORBSync(_hda->cad,tempm->nid,VERB_PIN_SENSE_GET); - if (Bt(&tempm->pin_capabilities,0)) - "Impedance Measurement:%08X\n",tempm->pin_sense&0x7FFFFFFF; - if (Bt(&tempm->pin_capabilities,2)) - "Presence:%d\n",Bt(&tempm->pin_sense,31); - "\n\nPin widget ctrl bits:\n" - " 7: High phn enable (low impedance output amp)\n" - " 6: Output Enable\n" - " 5: Input Enable\n" - "0-2: Vref 0=HiZ 1=50% 2=Gnd 4=80% 5=100%\n"; - tempm->pin_widget_ctl=PmtI64("Widget Ctrl (0x%02X):",tempm->pin_widget_ctl,0,0xFF); - HDWriteCORBSync(_hda->cad,tempm->nid,VERB_PIN_WIDGET_CTL_SET+tempm->pin_widget_ctl); - break; - case AWT_INPUT: - "Disable"; - if (tempm->disabled=YorN) - HDWriteCORBSync(_hda->cad,tempm->nid,VERB_CHAN_STREAM_ID_SET+0x00); - else - HDWriteCORBSync(_hda->cad,tempm->nid,VERB_CHAN_STREAM_ID_SET+0x20); - NewLine; - break; - case AWT_OUTPUT: - "Disable"; - if (tempm->disabled=YorN) - HDWriteCORBSync(_hda->cad,tempm->nid,VERB_CHAN_STREAM_ID_SET+0x00); - else - HDWriteCORBSync(_hda->cad,tempm->nid,VERB_CHAN_STREAM_ID_SET+0x10); - NewLine; - break; - } -} - -U0 HDCfgPopUpInfo(MyMass *tempm) -{ - U8 buf[136]; - SPrintF(buf,"HDCfgPopUpInfoTask(0x%X);\"\\n\\nPress SHIFT-ESC\\n\\n\\n\\n\";View;",tempm); - Fs->win_inhibit|=WIF_ODE; - Fs->draw_it=NULL; - WinMgrSync; - PopUp(buf,Fs); - Fs->win_inhibit&=~WIF_ODE; - Fs->draw_it=&DrawIt; -} - -U0 HDCfgEdLink(MyMass *tempm_out,MyMass *tempm_in) -{ - I64 i,j; - if ((i=FindConnectIndex(tempm_in,tempm_out->nid))>=0) { - switch (tempm_in->type) { - case AWT_MIXER: - MemSet(tempm_in->gain_lst,0x80,sizeof(U8)*MAX_CONNECTS); - tempm_in->gain_lst[i]=0x7F; - for (j=0;jnum_connects;j++) - HDWriteCORBSync(_hda->cad,tempm_in->nid, - VERB_AMPLIFIER_GAIN_SET+0x7000+tempm_in->gain_lst[j]+j<<8); - break; - case AWT_INPUT: - case AWT_SELECTOR: - case AWT_PIN_COMPLEX: - case AWT_VENDOR: - tempm_in->cur_connect=i; - HDWriteCORBSync(_hda->cad,tempm_in->nid,VERB_CONNECT_SELECT_SET+i); - break; - } - RedoSprings; - } -} - -U0 HDCfgSave() -{ - CDoc *doc=DocNew; - I64 i; - MyMass *tempm; - DocPutS(doc,"//This file was generated by $$LK,\"::/TempleOS/Adam/Snd/HDCfg.CPP.Z\",\"FI:::/TempleOS/Adam/Snd/HDCfg.CPP\"$$\n\n" - "U0 MyHDCfg()\n{\n"); - tempm=ode->next_mass; - while (tempm!=&ode->next_mass) { - DocPrintF(doc," //0x%02X %Z\n",tempm->nid,tempm->type,"ST_AUDIO_WIDGET_TYPES"); - if (tempm->num_connects) { - DocPutS(doc," //Connection Lst:"); - for (i=0;inum_connects;i++) { - if (i==tempm->cur_connect) - DocPutS(doc,"*"); - DocPrintF(doc,"0x%02X ",tempm->connect_lst[i]); - } - DocPutS(doc,"\n"); - if (tempm->type==AWT_MIXER) { - DocPutS(doc," //Gain Lst:"); - for (i=0;inum_connects;i++) - DocPrintF(doc,"0x%02X ",tempm->gain_lst[i]); - DocPutS(doc,"\n"); - } - } - switch (tempm->type) { - case AWT_OUTPUT: - if (tempm->disabled) - DocPrintF(doc," HDWriteCORBSync(_hda->cad,0x%02X,VERB_CHAN_STREAM_ID_SET+0x00);\n", - tempm->nid); - else - DocPrintF(doc," HDWriteCORBSync(_hda->cad,0x%02X,VERB_CHAN_STREAM_ID_SET+0x10);\n", - tempm->nid); - break; - case AWT_MIXER: - DocPrintF(doc," HDWriteCORBSync(_hda->cad,0x%02X,VERB_AMPLIFIER_GAIN_SET+0xB07F);\n", - tempm->nid); - for (i=0;inum_connects;i++) - DocPrintF(doc," HDWriteCORBSync(_hda->cad,0x%02X,VERB_AMPLIFIER_GAIN_SET+0x%04X);\n", - tempm->nid,0x7000+tempm->gain_lst[i]+i<<8); - break; - case AWT_INPUT: - if (tempm->disabled) - DocPrintF(doc," HDWriteCORBSync(_hda->cad,0x%02X,VERB_CHAN_STREAM_ID_SET+0x00);\n", - tempm->nid); - else - DocPrintF(doc," HDWriteCORBSync(_hda->cad,0x%02X,VERB_CHAN_STREAM_ID_SET+0x20);\n", - tempm->nid); - goto here; - case AWT_PIN_COMPLEX: - DocPrintF(doc," HDWriteCORBSync(_hda->cad,0x%02X,VERB_PIN_WIDGET_CTL_SET+0x%02X);\n", - tempm->nid,tempm->pin_widget_ctl); - case AWT_SELECTOR: - case AWT_VENDOR: -here: - if (tempm->num_connects>1) - DocPrintF(doc," HDWriteCORBSync(_hda->cad,0x%02X,VERB_CONNECT_SELECT_SET+0x%02X);\n", - tempm->nid,tempm->cur_connect); - break; - } - DocPutS(doc,"\n"); - tempm=tempm->next; - } - DocPutS(doc," LBtr(&sys_semas[SYS_SEMA_SND],0);\n" - "}\n\nif (snd_dev==SD_HD_AUDIO)\n" - " MyHDCfg;\n"); - StrCpy(doc->filename.name,"HOME/HDAudioCfg.CPP.Z"); - DocWrite(doc); - DocDel(doc); -} - -U0 HDCfg() -{ - I64 p1,p2; - MyMass *tempm1=NULL,*tempm2=NULL; - - if (snd_dev!=SD_HD_AUDIO) { - "HD Audio not detected\n"; - return; - } - HDAudioInit(0,27,0); - - MenuPush( -"File {" -" Abort(,CH_SHIFT_ESC);" -" Exit(,CH_ESC);" -"}" -"Edit {" -" Randomize(,'\n');" -" Options(,CH_SPACE);" -"}" - ); - SettingsPush; //See $LK,"SettingsPush","MN:SettingsPush"$ - Preempt(OFF); - DocBottom; - WordStat; - WinMax; - WinBorder; - Fs->win_inhibit=WIF_IP_L|WIF_IP_R|WIF_DBL_CLICK|WIF_DOC; - Init; - - HDCfgTraverse(_hda->cad,0); - HDCfgRandomizeXY; - RedoSprings; - DocCursor; - DocClear; - Fs->draw_it=&DrawIt; - PopUpOk( -"This is a tool to cfgure\n" -"HD Audio. It creates $$FG,RED$$HOME/HDAudioCfg.CPP.Z$$FG$$\n" -"which you should $$FG,GREEN$$#include$$FG$$ in your\n" -"$$FG,RED$$HOME/Adam3cSnd.CPP.Z$$FG$$ file.\n\n\n" -"Left click to see info and cfgure a widget.\n" -"Right click drag to connect output to input.\n\n" -"You will need to set input and output amplifier\n" -"gains by hand -- edit $$FG,RED$$HOME/HDAudioCfg.CPP.Z$$FG$$.\n\n" -"The $$FG,BLUE$$BLUE$$FG$$ line in the middle is microphone waveform.\n\n" -); - - HDRun(TRUE,TRUE); //run input output - Snd(500,WF_SINE,0.50); - - try { - while (TRUE) { - switch (GetMsg(&p1,&p2,1<win_pixel_left-Fs->win_scroll_x,ipy-Fs->win_pixel_top-Fs->win_scroll_y)) - HDCfgPopUpInfo(tempm1); - tempm1=NULL; - break; - case '\n': - HDCfgRandomizeXY; - break; - case CH_ESC: - HDCfgSave; - case CH_SHIFT_ESC: - goto hd_done; - } - break; - } - } -hd_done: //Don't goto out of try - GetMsg(,,1<catch_except=TRUE; - SettingsPop; - HDStop(TRUE,FALSE); //stop input - CleanUp; - MenuPop; - "$$BK,1$$Note: #include \"HOME/HDAudioCfg\" in your start-up scripts.$$BK,0$$\n"; -} - -HDCfg; - diff --git a/TempleOS/Adam/Snd/MathAudio.CPP b/TempleOS/Adam/Snd/MathAudio.CPP index f61a5ba..adf04f6 100644 --- a/TempleOS/Adam/Snd/MathAudio.CPP +++ b/TempleOS/Adam/Snd/MathAudio.CPP @@ -98,8 +98,8 @@ F64 SinPhaseCont(F64 last_y,F64 last_dydt, return phase-phase_offset; } -public CSndWaveCtrl *SndWaveCtrlNew(I64 sample_rate=SND_SAMPLE_RATE,I64 sample_bits=SND_SAMPLE_BITS, - I64 channels=SND_OCHANNELS,CTask *mem_task=NULL) +public CSndWaveCtrl *SndWaveCtrlNew(I64 sample_rate=8000,I64 sample_bits=24, + I64 channels=2,CTask *mem_task=NULL) { CSndWaveCtrl *swc=CAlloc(sizeof(CSndWaveCtrl),mem_task); swc->freq_multiplier=1.0; @@ -116,6 +116,14 @@ public U0 SndWaveCtrlDel(CSndWaveCtrl *swc) Free(swc); } +#define WF_NULL 0 +#define WF_SQUARE 1 +#define WF_SINE 2 +#define WF_TRI 3 +#define WF_SAWTOOTH 4 +#define WF_NOISE 5 +#define WF_NUM_WAVEFORMS 6 + public U0 SndWaveAddBuf(CSndWaveCtrl *swc,U8 *buf,I64 num_samples, F64 _freq,I64 _waveform=WF_SQUARE,F64 _amp=1.0,F64 _left=1.0, F64 _right=1.0) { @@ -162,7 +170,7 @@ public U0 SndWaveAddBuf(CSndWaveCtrl *swc,U8 *buf,I64 num_samples, case WF_SINE: j=amp*Sin(phase); break; - case WF_TRIANGLE: + case WF_TRI: if (phase>=ã) { swc->last_y=swc->next_y; swc->next_y=-amp*Sign(swc->last_y)+.00001; @@ -223,31 +231,4 @@ public U0 SndWaveAddBuf(CSndWaveCtrl *swc,U8 *buf,I64 num_samples, } } -#help_index "Snd/HDAudio" -I64 snd_reverb_buf_cnt; -SND_OUT_CONTAINER *snd_reverb_buf=NULL; - -U0 SndReverb(SND_OUT_CONTAINER *buf,I64 buf_num) -{ - I64 i,j,mask,span=RoundI64(SND_SAMPLE_RATE*SND_OCHANNELS*snd_reverb_delay,SND_OCHANNELS); - if (!snd_reverb_buf || span>snd_reverb_buf_cnt) { - Free(snd_reverb_buf); - snd_reverb_buf_cnt=1<<(Bsr(span)+1); - snd_reverb_buf=ACAlloc(snd_reverb_buf_cnt*sizeof(SND_OUT_CONTAINER)); - } - j=buf_num*SND_BUF_LEN; - mask=snd_reverb_buf_cnt-1; - for (i=0;ifreq=freq; - d->time_stamp=tT; - d->waveform=waveform; - d->amp=amp; - QueIns(d,snd_record_root.last); -} - -U0 CtrlAltV(I64 sc) -{ - if (sc&SCF_SHIFT) - snd_vol/=1.5; - else - snd_vol*=1.5; -} -SetCtrlAltLetCB('V',&CtrlAltV,"Sys/Snd Volume +/-"); - -U0 SndInit() -{ - QueInit(&snd_record_root); - snd_record_root.freq=0; - snd_record_root.time_stamp=tT; - fp_snd_record=&SndRecord; -} - -SndInit; - #include "MathAudio" #include "Music" #include "SndEffects" diff --git a/TempleOS/Adam/Snd/SndEffects.CPP b/TempleOS/Adam/Snd/SndEffects.CPP index 074a834..262aee1 100644 --- a/TempleOS/Adam/Snd/SndEffects.CPP +++ b/TempleOS/Adam/Snd/SndEffects.CPP @@ -3,7 +3,7 @@ class CSoundEffectFrame { - I32 type,waveform; + I32 type; F64 duration,freq1,freq2; }; @@ -25,7 +25,7 @@ U0 SoundEffectTask(CSoundEffectFrame *ns) i=MaxI64(ns->freq2-ns->freq1,1); while (tSfreq1) { - Snd(f,ns->waveform); + Snd(f); Sleep(MaxI64(3000/f,1)); } else break; @@ -34,7 +34,7 @@ U0 SoundEffectTask(CSoundEffectFrame *ns) while (tSduration; if (f=(1.0-t)*ns->freq1+t*ns->freq2) { - Snd(f,ns->waveform); + Snd(f); Sleep(MaxI64(3000/f,1)); } else break; @@ -43,26 +43,32 @@ U0 SoundEffectTask(CSoundEffectFrame *ns) } } -public CTask *Noise(I64 mS,F64 min_freq,F64 max_freq,I64 waveform=WF_NOISE) +public CTask *Noise(I64 mS,F64 min_freq,F64 max_freq) { - CSoundEffectFrame *ns=MAlloc(sizeof(CSoundEffectFrame)); - ns->type=SE_NOISE; - ns->waveform=waveform; - ns->duration=mS/1000.0; - ns->freq1=min_freq; - ns->freq2=max_freq; - music_mute++; - return Spawn(&SoundEffectTask,ns,"Noise",Fs); + CSoundEffectFrame *ns; + if (mS>0) { + ns=MAlloc(sizeof(CSoundEffectFrame)); + ns->type=SE_NOISE; + ns->duration=mS/1000.0; + ns->freq1=min_freq; + ns->freq2=max_freq; + music_mute++; + return Spawn(&SoundEffectTask,ns,"Noise",,Fs); + } else + return NULL; } -public CTask *Sweep(I64 mS,F64 freq1,F64 freq2,I64 waveform=WF_SINE) +public CTask *Sweep(I64 mS,F64 freq1,F64 freq2) { - CSoundEffectFrame *ns=MAlloc(sizeof(CSoundEffectFrame)); - ns->type=SE_SWEEP; - ns->waveform=waveform; - ns->duration=mS/1000.0; - ns->freq1=freq1; - ns->freq2=freq2; - music_mute++; - return Spawn(&SoundEffectTask,ns,"Noise",Fs); + CSoundEffectFrame *ns; + if (mS>0) { + ns=MAlloc(sizeof(CSoundEffectFrame)); + ns->type=SE_SWEEP; + ns->duration=mS/1000.0; + ns->freq1=freq1; + ns->freq2=freq2; + music_mute++; + return Spawn(&SoundEffectTask,ns,"Noise",,Fs); + } else + return NULL; } diff --git a/TempleOS/Adam/Snd/SndFile.CPP b/TempleOS/Adam/Snd/SndFile.CPP index 2947fb3..8c521aa 100644 --- a/TempleOS/Adam/Snd/SndFile.CPP +++ b/TempleOS/Adam/Snd/SndFile.CPP @@ -16,17 +16,13 @@ class CFileSND #define MAX_SND_FILE_DATA 0x7FF00 -public I64 SndFileCreate(U8 *base_filename,F64 normalized_vol=1.0,F64 averaging=0.0,I64 waveform=WF_NULL, +public I64 SndFileCreate(U8 *base_filename,F64 normalized_vol=1.0,F64 averaging=0.0,I64 waveform=WF_SQUARE, F64 reverb_delay=0,F64 reverb_intensity=0) //Use "snd_record" flag to start or stop //recording, then call this routine. - //Averaging should be a num from 0.0 to 0.999. //Vol should be from 0.0 to 1.0. -//If waveform is $LK,"WF_NULL","MN:WF_NULL"$, the original passed to $LK,"Snd","MN:Snd"$() will be used. - //Set reverb_delay to like 0.3 sec and reverb_intensity to like 0.4. - { I64 i,k,cnt,cnt2,level,file_num; F64 avg,dt; @@ -58,7 +54,7 @@ public I64 SndFileCreate(U8 *base_filename,F64 normalized_vol=1.0,F64 averaging= d1=d->next; dt=d1->time_stamp-d->time_stamp; cnt2=dt*SNDFILE_SAMPLE_RATE; - SndWaveAddBuf(swc,&s->body[k],cnt2,d->freq,waveform ?waveform:d->waveform,d->amp*normalized_vol); + SndWaveAddBuf(swc,&s->body[k],cnt2,d->freq,waveform,normalized_vol); k+=cnt2; QueRem(d); Free(d); @@ -123,193 +119,4 @@ public I64 SndFileCreate(U8 *base_filename,F64 normalized_vol=1.0,F64 averaging= return cnt; } -public U0 SndFileWrite(U8 *filename,SND_IN_CONTAINER *buf,I64 cnt) -{ - CFileSND *s; - I64 i,j,l=SND_SAMPLE_RATE/SNDFILE_SAMPLE_RATE; - F64 level,a1,a2; - - cnt/=l; - s=CAlloc(offset(CFileSND.body)+cnt*sizeof(I16)); - s->signature=0x646e732e; - s->offset=EndianU32(offset(CFileSND.body)); - s->coding=EndianU32(3); - s->sample_rate=EndianU32(SNDFILE_SAMPLE_RATE); - s->channels=EndianU32(1); - s->data_size=EndianU32(cnt*sizeof(I16)); - - //Get rid of D.C. component - j=cnt*l; - level=0; - for (i=0;ibody[i]=EndianU16(buf[j]); - j+=l; - } - FileWrite(filename,s,offset(CFileSND.body)+cnt*sizeof(I16)); - Free(s); -} - -public U0 SndFileView(U8 *name,Bool zoom=FALSE) -{ - I64 i,start,end,w=Fs->win_pixel_width,h=Fs->win_pixel_height; - F64 x_scale,y_scale; - CFileSND *s=FileRead(name); - if (s) { - s->data_size=EndianU32(s->data_size)/sizeof(I16); - for (i=0;idata_size;i++) - s->body[i]=EndianU16(s->body[i]); - start=1; - end=s->data_size; - if (zoom) { - for (i=1;ibody[i]!=s->body[i-1]) { - start=i; - break; - } - if (s->data_size-start>w) - end=start+w; - } - "$$CL$$"; - DCFill; - CDC *dc=DCAlias; - dc->color=GREEN; - x_scale=ToF64(w)/(end-start+1); - y_scale=ToF64(h)/MAX_U16; - for (i=start;ibody[i]+MAX_I16), - x_scale*(i-start-1),y_scale*(s->body[i-1]+MAX_I16)); - Free(s); - PressAKey; - DCFill; - DCDel(dc); - } -} - - -CFileSND *snd_play_snd_file=NULL; -I64 snd_play_start_buf_num,snd_play_samples_per_sample; -Bool snd_play_done=TRUE,snd_play_single_done; -U0 (*fp_snd_play_task_end_cb)()=NULL; -U0 (*fp_snd_play_old_fill_buf)(SND_OUT_CONTAINER *buf,I64 buf_num)=NULL; - -CFileSND *SndFileLoad(U8 *name) -{ - I64 i; - CFileSND *s=FileRead(name); - if (s) { - s->data_size=EndianU32(s->data_size)/sizeof(I16); - for (i=0;idata_size;i++) - s->body[i]=EndianU16(s->body[i]); - } - return s; -} - -U0 SndFileFillBuf(SND_OUT_CONTAINER *buf,I64 buf_num) -{ - I64 i,j,k,m; - if (snd_play_done) return; - buf_num-=snd_play_start_buf_num; - j=buf_num*(SND_BUF_LEN/SND_OCHANNELS*SNDFILE_SAMPLE_RATE/SND_SAMPLE_RATE); - i=j%snd_play_snd_file->data_size; - k=j%snd_play_samples_per_sample; - j=0; - while (jbody[i++]<<16; - while (j=snd_play_snd_file->data_size) { - while (jtask_end_cb; - Fs->task_end_cb=&SndFilePlayTaskEndCB; - snd_play_start_buf_num=snd_obuf_num; - snd_play_done=FALSE; - fp_snd_play_old_fill_buf=fp_snd_fill_buf; - fp_snd_fill_buf=&SndFileFillBuf; - try { - while (!snd_play_done) - Sleep(1); - } catch { - snd_play_done=TRUE; - fp_snd_fill_buf=fp_snd_play_old_fill_buf; - Fs->task_end_cb=fp_snd_play_task_end_cb; - Free(snd_play_snd_file); - snd_play_snd_file=NULL; - } - fp_snd_fill_buf=fp_snd_play_old_fill_buf; - Fs->task_end_cb=fp_snd_play_task_end_cb; - Free(snd_play_snd_file); - snd_play_snd_file=NULL; - } - snd_play_single_done=TRUE; -} - -public U0 SndFilePlaySeq(U8 *snz_filename,I64 num) -{ //This has gaps between files. I might fix it someday. You fix it;-) - I64 i; - Bool old_preempt=Preempt(OFF),old_idle; - U8 *fname=StrNew(snz_filename),*fname2; - FileExtRem(fname); - old_idle=LBts(&Fs->task_flags,TASKf_IDLE); - for (i=0;itask_flags,TASKf_IDLE,old_idle); - Free(fname); - Preempt(old_preempt); -} - #help_index "" diff --git a/TempleOS/Adam/Start.CPP b/TempleOS/Adam/Start.CPP index 6e34209..1186f6c 100644 --- a/TempleOS/Adam/Start.CPP +++ b/TempleOS/Adam/Start.CPP @@ -1,10 +1,5 @@ -#if snd_dev==SD_HD_AUDIO -#include "::/TempleOS/Demo/Snd/PolyPhonic" -#endif - U0 Start() { - CTask *task; Type("::/TempleOS/Doc/Splash.TXT"); SetWinHorz(TEXT_COLS/4-1,3*TEXT_COLS/4); SetWinVert(TEXT_ROWS/4-3,Fs->win_bottom); @@ -12,16 +7,7 @@ U0 Start() "$$FG,GREEN$$Tip of day$$FG$$\n"; TipOfDay; "$$FG,GREEN$$$$FG$$ to exit.\n"; -#if snd_dev==SD_HD_AUDIO - PopUp("#include \"::/TempleOS/Demo/Snd/SndScope\";",NULL,&task); - TaskWait(task); - WinToTop; - PolyPhonic; - Kill(task); -#else - nounusedwarn task; View; -#endif } Start; diff --git a/TempleOS/Adam/TaskSettings.CPP b/TempleOS/Adam/TaskSettings.CPP index c5d51f4..e077430 100644 --- a/TempleOS/Adam/TaskSettings.CPP +++ b/TempleOS/Adam/TaskSettings.CPP @@ -26,13 +26,10 @@ public CTaskSettings *SettingsPush(CTask *task=NULL,I64 flags=0) Suspend(task->animate_task); task->animate_task=NULL; - if (doc=DocCur(task)) { + if (doc=DocPut(task)) { tempse->cursor=!Bt(&doc->flags,DOCf_HIDE_CURSOR); tempse->scroll=!Bt(&doc->flags,DOCf_NO_SCROLL_BARS); - tempse->doc_cur_attr=doc->start_text_attr; } - if (doc=DocAux(task)) - tempse->doc_aux_attr=doc->start_text_attr; tempse->left=task->win_left; tempse->right=task->win_right; @@ -48,7 +45,10 @@ public CTaskSettings *SettingsPush(CTask *task=NULL,I64 flags=0) tempse->win_max_refresh=task->win_max_refresh; tempse->text_attr=task->text_attr; + StrCpy(tempse->task_title,task->task_title); + tempse->title_src =task->title_src; tempse->border_attr=task->border_attr; + tempse->border_src =task->border_src; tempse->border=!Bt(&task->display_flags,DISPLAYf_NO_BORDER); tempse->preempt=Bt(&task->task_flags,TASKf_PREEMPT); if (TaskValidate(ws_task)) @@ -61,10 +61,37 @@ public CTaskSettings *SettingsPush(CTask *task=NULL,I64 flags=0) return tempse; } +U0 SettingsPop2(CTask *task,CTaskSettings *tempse) +{ + CDoc *doc; + + if (doc=DocPut(task)) { + LBEqu(&doc->flags,DOCf_HIDE_CURSOR,!tempse->cursor); + LBEqu(&doc->flags,DOCf_NO_SCROLL_BARS,!tempse->scroll); + } + + WinBorder(tempse->border,task); + SetWinHorz(tempse->left,tempse->right,task); + SetWinVert(tempse->top,tempse->bottom,task); + task->win_scroll_x=tempse->scroll_x; + task->win_scroll_y=tempse->scroll_y; + task->win_scroll_z=tempse->scroll_z; + MemCpy(&task->snap,&tempse->snap,sizeof(CSnap)); + task->win_inhibit=tempse->win_inhibit; + task->win_max_refresh=tempse->win_max_refresh; + task->text_attr=tempse->text_attr; + task->border_attr=tempse->border_attr; + task->border_src =tempse->border_src; + task->title_src =tempse->title_src; + StrCpy(task->task_title,tempse->task_title); + WordStat(tempse->wordstat); + SetVGAPalette4(tempse->palette4); + Snd(0); +} + public U0 SettingsPop(CTask *task=NULL,I64 flags=0) { CTaskSettings *tempse; - CDoc *doc; Bool old_preempt=Preempt(OFF); if (!task) task=Fs; if (!TaskValidate(task)) { @@ -74,7 +101,6 @@ public U0 SettingsPop(CTask *task=NULL,I64 flags=0) if (tempse=task->next_settings) { task->next_settings=tempse->next; task->draw_it=tempse->draw_it; - SetVGAPalette4(tempse->palette4); task->task_end_cb=tempse->task_end_cb; if (task->animate_task) @@ -89,31 +115,13 @@ public U0 SettingsPop(CTask *task=NULL,I64 flags=0) Suspend(task->song_task,FALSE); } - if (doc=DocCur(task)) { - LBEqu(&doc->flags,DOCf_HIDE_CURSOR,!tempse->cursor); - LBEqu(&doc->flags,DOCf_NO_SCROLL_BARS,!tempse->scroll); - doc->start_text_attr=tempse->doc_cur_attr; - } - if (doc=DocAux(task)) - doc->start_text_attr=tempse->doc_aux_attr; - - WinBorder(tempse->border,task); - SetWinHorz(tempse->left,tempse->right,task); - SetWinVert(tempse->top,tempse->bottom,task); - task->win_scroll_x=tempse->scroll_x; - task->win_scroll_y=tempse->scroll_y; - task->win_scroll_z=tempse->scroll_z; - MemCpy(&task->snap,&tempse->snap,sizeof(CSnap)); - task->win_inhibit=tempse->win_inhibit; - task->win_max_refresh=tempse->win_max_refresh; - task->text_attr=tempse->text_attr; - task->border_attr=tempse->border_attr; - WordStat(tempse->wordstat); - Snd(0); - Free(tempse); + SettingsPop2(task,tempse); //Do it to get results fast WinMgrSync(,TRUE); + SettingsPop2(task,tempse); //Redo in case was lost by old update + Preempt(old_preempt); LBEqu(&task->task_flags,TASKf_PREEMPT,tempse->preempt); + Free(tempse); } else Preempt(old_preempt); } diff --git a/TempleOS/Adam/Training.CPP b/TempleOS/Adam/Training.CPP index 27be504..48af848 100644 --- a/TempleOS/Adam/Training.CPP +++ b/TempleOS/Adam/Training.CPP @@ -220,7 +220,7 @@ public U0 TipOfDay(U8 *tip_file="::/TempleOS/Doc/Tips.TXT") break; } } - DocInsDoc(DocCur,doc2); + DocInsDoc(DocPut,doc2); DocDel(doc2); DocDel(doc); } diff --git a/TempleOS/Adam/BinRep.CPP b/TempleOS/Adam/Utils/BinRep.CPP similarity index 95% rename from TempleOS/Adam/BinRep.CPP rename to TempleOS/Adam/Utils/BinRep.CPP index fa8e4c5..e57931d 100644 --- a/TempleOS/Adam/BinRep.CPP +++ b/TempleOS/Adam/Utils/BinRep.CPP @@ -22,7 +22,7 @@ DefineLstLoad("ST_BIN_FILE_TYPES", public Bool BinRep(U8 *filename) {//This reports imports, exports, etc - //for a .BI? file. + //for a .BI* file. //See $LK,"Loader Patch Table Generation","FF:::/TempleOS/Compiler/CmpMain.CPP,EIE_MODULE_ALIGNMENT"$ and $LK,"Load","MN:Load"$(). U8 *fbuf,*ptr,etype,*sptr,*absname; I64 i,j,size; @@ -35,7 +35,7 @@ public Bool BinRep(U8 *filename) } bfh=bfh2; - if (ArcXSum(bfh,bfh->file_size)!=NATIVE_XSUM) { + if (ArcXSum(bfh,bfh->file_size)!=TEMPLEOS_XSUM) { "Bad XSum\n\n"; return FALSE; } diff --git a/TempleOS/Adam/Diff.CPP b/TempleOS/Adam/Utils/Diff.CPP similarity index 97% rename from TempleOS/Adam/Diff.CPP rename to TempleOS/Adam/Utils/Diff.CPP index 67aa9fa..ba03a7d 100644 --- a/TempleOS/Adam/Diff.CPP +++ b/TempleOS/Adam/Utils/Diff.CPP @@ -56,9 +56,12 @@ U0 DiffSelect(CDoc *doc,I64 *_df_flags,I64 j1_lo,I64 j1_hi, else "***"; "---------------------$$FG$$\n"; - i= j1_lo<=0 ? 0:j1_lo-1; + if (j1_lo<=0) + i=0; + else + i=j1_lo-1; while (iflags&DOCF_PLAIN_TEXT; cur_l->flags|=DOCF_PLAIN_TEXT; } @@ -68,9 +71,12 @@ U0 DiffSelect(CDoc *doc,I64 *_df_flags,I64 j1_lo,I64 j1_hi, NewLine; } "$$FG,CYAN$$"; - i= j2_lo<=0 ? 0:j2_lo-1; + if (j2_lo<=0) + i=0; + else + i=j2_lo-1; while (iflags&DOCF_PLAIN_TEXT; cur_l->flags|=DOCF_PLAIN_TEXT; } diff --git a/TempleOS/Adam/FileBMP.CPP b/TempleOS/Adam/Utils/FileBMP.CPP similarity index 97% rename from TempleOS/Adam/FileBMP.CPP rename to TempleOS/Adam/Utils/FileBMP.CPP index 94fbe5d..e983b14 100644 --- a/TempleOS/Adam/FileBMP.CPP +++ b/TempleOS/Adam/Utils/FileBMP.CPP @@ -266,9 +266,9 @@ public CDC *BMPFileRead(U8 *filename,Bool use_ms_paint_palette=FALSE) } #help_index "Graphics/CSprite;Graphics/Windows BMP Files;Doc/Output" -public U0 DocPutBMPFile(CDoc *doc=NULL,U8 *fname,Bool use_ms_paint_palette=FALSE) +public U0 DocPutBMPFile(CDoc *doc=NULL,U8 *filename,Bool use_ms_paint_palette=FALSE) { - CDC *dc=BMPFileRead(fname,use_ms_paint_palette); + CDC *dc=BMPFileRead(filename,use_ms_paint_palette); CSprite *elems=DC2Sprite(dc); DocPutSprite(doc,elems); Free(elems); diff --git a/TempleOS/Adam/Grep.CPP b/TempleOS/Adam/Utils/Grep.CPP similarity index 92% rename from TempleOS/Adam/Grep.CPP rename to TempleOS/Adam/Utils/Grep.CPP index d25accd..dea9a0e 100644 --- a/TempleOS/Adam/Grep.CPP +++ b/TempleOS/Adam/Utils/Grep.CPP @@ -34,7 +34,10 @@ I64 GrepFile(U8 *pattern,U8 *name,I64 *_fuf_flags,U8 *replace_text) CDoc *cur_l,*doc=DocRead(name,DOCF_PLAIN_TEXT_WITH_TABS|DOCF_NO_CURSOR); CDocEntry *doc_e; - ss_flags=Bt(_fuf_flags,FUf_IGNORE) ? SRF_IGNORE_CASE :0; + if (Bt(_fuf_flags,FUf_IGNORE)) + ss_flags=SRF_IGNORE_CASE; + else + ss_flags=0; if (Bt(_fuf_flags,FUf_WHOLE_LABELS)) ss_flags|=SRG_WHOLE_LABELS; if (Bt(_fuf_flags,FUf_WHOLE_LABELS_FRONT)) @@ -57,7 +60,7 @@ I64 GrepFile(U8 *pattern,U8 *name,I64 *_fuf_flags,U8 *replace_text) first_on_line=FALSE; PutFileLink(name,doc_e->y+1,TRUE); name_buf=MSPrintF("%s,%d",name,doc_e->y+1); - if (cur_l=DocCur) { + if (cur_l=DocPut) { old_flags=cur_l->flags&DOCF_PLAIN_TEXT; cur_l->flags|=DOCF_PLAIN_TEXT; } @@ -96,7 +99,7 @@ I64 GrepFile(U8 *pattern,U8 *name,I64 *_fuf_flags,U8 *replace_text) *dst++=doc_e->tag[i]; Free(doc_e->tag); doc_e->tag=dst2; - if (cur_l=DocCur) { + if (cur_l=DocPut) { old_flags=cur_l->flags&DOCF_PLAIN_TEXT; cur_l->flags|=DOCF_PLAIN_TEXT; } @@ -166,14 +169,16 @@ 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 var, "doc_e" 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 "doc_e" are label characters. +"+r" =recurse +"+i" =ignore case +"+l" =whole labels only. + This will check for a nonlabel character before + and after. If you have a var, "dd" and don't + want to match words like "Add", you + set this flag and it will see that the characters + before or after "ll" are label characters. +"+lf"=only checks for label chars in front +"+lb"=only checks for label chars behind (after). */ { @@ -222,7 +227,7 @@ I64 GrepWiz() I64 result=0; g->recurse=TRUE; StrCpy(g->filemask,FILENAME_MASK_TXT); - if (doc=DocCur) { + if (doc=DocPut) { StrCpy(g->find_text,doc->find_replace->find_text); StrCpy(g->replace_text,doc->find_replace->replace_text); g->replace=doc->find_replace->replace; diff --git a/TempleOS/Adam/HeapLog.CPP b/TempleOS/Adam/Utils/HeapLog.CPP similarity index 100% rename from TempleOS/Adam/HeapLog.CPP rename to TempleOS/Adam/Utils/HeapLog.CPP diff --git a/TempleOS/Adam/LineCnt.CPP b/TempleOS/Adam/Utils/LineCnt.CPP similarity index 98% rename from TempleOS/Adam/LineCnt.CPP rename to TempleOS/Adam/Utils/LineCnt.CPP index 294471c..33287f7 100644 --- a/TempleOS/Adam/LineCnt.CPP +++ b/TempleOS/Adam/Utils/LineCnt.CPP @@ -55,7 +55,7 @@ public I64 LineCntRep(U8 *files_find_mask="/TempleOS/*",U8 *fu_flags=NULL) DocPutS(doc,"$$ID,-2$$"); CDirLstDel(tempm1); } - DocInsDoc(DocCur,doc); + DocInsDoc(DocPut,doc); DocDel(doc); return result; } @@ -105,7 +105,7 @@ public I64 TreeSizeRep(U8 *files_find_mask="/TempleOS/*",U8 *fu_flags=NULL) DocPutS(doc,"$$ID,-2$$"); CDirLstDel(tempm1); } - DocInsDoc(DocCur,doc); + DocInsDoc(DocPut,doc); DocDel(doc); return result; } diff --git a/TempleOS/Adam/LinkChk.CPP b/TempleOS/Adam/Utils/LinkChk.CPP similarity index 92% rename from TempleOS/Adam/LinkChk.CPP rename to TempleOS/Adam/Utils/LinkChk.CPP index d28c6f1..a46d729 100644 --- a/TempleOS/Adam/LinkChk.CPP +++ b/TempleOS/Adam/Utils/LinkChk.CPP @@ -4,7 +4,7 @@ I64 LinkChkDoc(CDoc *doc,I64 *_fuf_flags) { U8 *st; Bool found,unlock=DocLock(doc); - CDoc *old_doc=DocCur; + CDoc *old_doc; CDocEntry *doc_e=doc->root.next; I64 result=0; while (doc_e!=doc) { @@ -13,12 +13,11 @@ I64 LinkChkDoc(CDoc *doc,I64 *_fuf_flags) break; } if (st=DocEntryLink(doc,doc_e)) { + old_doc=DocPut; DocLock(old_doc); - DocQueRem(old_doc); - DocQueIns(doc,Fs->last_doc); + Fs->put_doc=doc; found=DocLinkChk(st); - DocQueRem(doc); - DocQueIns(old_doc,Fs->last_doc); + Fs->put_doc=old_doc; DocUnlock(old_doc); if (!found) { PutFileLink(doc->filename.name,doc_e->y); diff --git a/TempleOS/Adam/MemRep.CPP b/TempleOS/Adam/Utils/MemRep.CPP similarity index 85% rename from TempleOS/Adam/MemRep.CPP rename to TempleOS/Adam/Utils/MemRep.CPP index 513dbe8..ae4ae34 100644 --- a/TempleOS/Adam/MemRep.CPP +++ b/TempleOS/Adam/Utils/MemRep.CPP @@ -41,23 +41,28 @@ I64 TaskStkSize(CTask *task) I64 TaskQueSize(CTask *task) { - CTaskCmd *tempc,*tempc1; + CSrvCmd *tempc,*tempc1; I64 result=0; PushFD; Cli; - while (LBts(&task->locked_flags,TASKLf_TASK_LOCK)) + while (LBts(&task->srv_ctrl.flags,SVCRf_LOCKED)) Pause; - tempc1=&task->next_servant_cmd; + + tempc1=&task->srv_ctrl.next_waiting; tempc=tempc1->next; while (tempc!=tempc1) { - result+=MSize2(tempc); - if (tempc->cmd_code==TASKCT_EXECUTE_STR || - tempc->cmd_code==TASKCT_EXECUTE_FILE || - tempc->cmd_code==TASKCT_TEXT_INPUT) - result+=MSize2(tempc->data); + result+=MSize2(tempc)+MSize2(tempc->aux_str); tempc=tempc->next; } - LBtr(&task->locked_flags,TASKLf_TASK_LOCK); + + tempc1=&task->srv_ctrl.next_done; + tempc=tempc1->next; + while (tempc!=tempc1) { + result+=MSize2(tempc)+MSize2(tempc->aux_str); + tempc=tempc->next; + } + + LBtr(&task->srv_ctrl.flags,SVCRf_LOCKED); PopFD; return result; } @@ -71,7 +76,7 @@ I64 BlkDevsSize() if (bdev->bd_signature==BD_SIGNATURE_VAL) { if (bdev->type==BDT_RAM) "RAMDsk %C\t:%010X Unused:%010X\n", - bdev->first_drv_let,MSize2(bdev->RAM_dsk), + bdev->first_drv_let,(bdev->max_blk+1)<first_drv_let); result+=MSize2(bdev->dev_id_record); } @@ -92,7 +97,7 @@ Bool MemRepTask(CTask *task,Bool override_validate=FALSE) { I64 i,j,k,m,n; U8 *st; - CDoc *doc; + CDoc *pdoc,*ddoc,*bdoc; CLex *lx; CMathODE *o; CCPU *c; @@ -109,36 +114,36 @@ Bool MemRepTask(CTask *task,Bool override_validate=FALSE) TaskAllocatedMem(task,override_validate), TaskUsedMem(task,override_validate), TaskUnusedAllocatedMem(task,override_validate); - "HashTable:%010X\n",HashTableSize2(task->hash_table); + "HashTable\t:%010X\n",HashTableSize2(task->hash_table); i=UnusedStk(task); if (0<=i<=task->stk->stk_size) - "Stk Size :%010X Unused:%010X\n",TaskStkSize(task),i; + "Stk Size\t:%010X Unused:%010X\n",TaskStkSize(task),i; else - "Stk Size :%010X $$FG,RED$$$$BK,1$$Overflow$$BK,0$$$$FG$$\n",TaskStkSize(task); + "Stk Size\t:%010X $$FG,RED$$$$BK,1$$Overflow$$BK,0$$$$FG$$\n",TaskStkSize(task); - doc=task->last_doc; - while (doc!=(&task->next_doc)(U8 *)-offset(CDoc.next_doc) && - doc->doc_in_que_signature==DOC_IN_QUE_SIGNATURE_VAL) { - "Doc :%010X\n",DocSize(doc); - doc=doc->last_doc; - } + if (pdoc=DocPut(task)) + "PutDoc\t:%010X\n",DocSize(pdoc); + if ((ddoc=DocDisplay(task)) && pdoc!=ddoc) + "DisplayDoc\t:%010X\n",DocSize(ddoc); + if (bdoc=DocBorder(task)) + "BorderDoc\t:%010X\n",DocSize(bdoc); lx=task->next_lex; while (lx!=&task->next_lex) { - "Lex :%010X\n",LexSize(lx); + "Lex\t\t:%010X\n",LexSize(lx); lx=lx->next; } o=task->next_ode; while (o!=&task->next_ode) { - "CMathODE :%010X\n",ODESize(o); + "CMathODE\t:%010X\n",ODESize(o); o=o->next; } if (task==sys_winmgr_task) { - "gr_dc2\t\t:%010X\n",DCSize(gr_dc2); "gr_dc\t\t:%010X\n",DCSize(gr_dc); + "gr_dc2\t\t:%010X\n",DCSize(gr_dc2); "gr_dc_cache\t\t:%010X\n",DCSize(gr_dc_cache); "gr_screen_image\t:%010X\n",DCSize(gr_screen_image); "gr_zoomed_dc\t:%010X\n",DCSize(gr_zoomed_dc); diff --git a/TempleOS/Adam/Merge.CPP b/TempleOS/Adam/Utils/Merge.CPP similarity index 89% rename from TempleOS/Adam/Merge.CPP rename to TempleOS/Adam/Utils/Merge.CPP index 7fe4318..687f7a5 100644 --- a/TempleOS/Adam/Merge.CPP +++ b/TempleOS/Adam/Utils/Merge.CPP @@ -60,30 +60,30 @@ public U0 MergeChk( #help_index "Utils;Cmd Line (Typically)" -U0 LstNewFilesLst(CDirEntry *tempm,CDate spdt) +U0 LstNewFilesLst(CDirEntry *tempm,CDate cdt) { while (tempm) { - if (tempm->datetime>spdt) { + if (tempm->datetime>cdt) { "" tempm->full_name; NewLine; } - LstNewFilesLst(tempm->sub,spdt); + LstNewFilesLst(tempm->sub,cdt); tempm=tempm->next; } } -public U0 LstNewFiles(U8 *files_find_mask="/TempleOS/*",CDate spdt=0, +public U0 LstNewFiles(U8 *files_find_mask="/TempleOS/*",CDate cdt=0, U8 *fu_flags=NULL) //"+T"=is just text files { I64 fuf_flags=0; CDirEntry *tempm1=NULL; - if (!spdt) - spdt=sys_compile_time; + if (!cdt) + cdt=sys_compile_time; GetFFlags(&fuf_flags,Define("ST_FILE_UTIL_FLAGS"),"+r+T"); GetFFlags(&fuf_flags,Define("ST_FILE_UTIL_FLAGS"),fu_flags); if (tempm1=FilesFind(files_find_mask,fuf_flags)) { - LstNewFilesLst(tempm1,spdt); + LstNewFilesLst(tempm1,cdt); CDirLstDel(tempm1); } } diff --git a/TempleOS/Adam/Profiler.CPP b/TempleOS/Adam/Utils/Profiler.CPP similarity index 100% rename from TempleOS/Adam/Profiler.CPP rename to TempleOS/Adam/Utils/Profiler.CPP diff --git a/TempleOS/Adam/S2T.CPP b/TempleOS/Adam/Utils/S2T.CPP similarity index 100% rename from TempleOS/Adam/S2T.CPP rename to TempleOS/Adam/Utils/S2T.CPP diff --git a/TempleOS/Adam/ToHtml.CPP b/TempleOS/Adam/Utils/ToHtml.CPP similarity index 96% rename from TempleOS/Adam/ToHtml.CPP rename to TempleOS/Adam/Utils/ToHtml.CPP index 5b2274c..f2bb833 100644 --- a/TempleOS/Adam/ToHtml.CPP +++ b/TempleOS/Adam/Utils/ToHtml.CPP @@ -1,6 +1,6 @@ #help_index "Utils;Cmd Line (Typically);Doc/Html" -//See $LK-A,"::/TempleOS/Doc/Acknowledgements.TXT"$ (12). +//See $LK-A,"::/TempleOS/Doc/Acknowledgements.TXT"$. U0 HtmlPutS(CDoc *doc,I64 c,I64 *_old_c,U8 *st,I64 *_col,U8 *style_bitmap=NULL) { @@ -131,7 +131,7 @@ public CDoc *Doc2Html(CDoc *doc_in, { CDocEntry *doc_e,*style,*doc_e2; CDocSettings *s; - I64 i,y,old_y=MIN_I64,cur_u8_attr,col,old_c=-1; + I64 i,y,old_y=MIN_I64,cur_u8_attr,col,old_c=-1,old_attr; U32 *hl,*src; U8 *st,st_2[2],*link_st,*style_bitmap=CAlloc(256/8); CBGR p[16]; @@ -139,6 +139,9 @@ public CDoc *Doc2Html(CDoc *doc_in, CDoc *doc_out=DocNew; Bool unlock_doc_in=DocLock(doc_in),no_backward; + old_attr=doc_in->win_task->text_attr; + doc_in->win_task->text_attr=DOC_ATTR_DFT_TEXT; + for (i=0xF0;i<=0xFF;i++) LBts(style_bitmap,i); @@ -274,7 +277,7 @@ public CDoc *Doc2Html(CDoc *doc_in, break; case DOCT_SPRITE: HtmlPutS(doc_out,cur_u8_attr,&old_c,doc_e->tag,&col,style_bitmap); - HtmlPutS(doc_out,s->comment_attr&15+old_c&0xF0,&old_c,"/* Graphics Not Rendered in HTML */",&col,style_bitmap); + HtmlPutS(doc_out,DOC_COLOR_COMMENT+old_c&0xF0,&old_c,"/* Graphics Not Rendered in HTML */",&col,style_bitmap); break; default: if (Bt(doc_tag_types,doc_e->type_u8)) @@ -310,6 +313,8 @@ public CDoc *Doc2Html(CDoc *doc_in, doc_out->cur_entry=&doc_out->root; DocRecalc(doc_out); + doc_in->win_task->text_attr=old_attr; + if (unlock_doc_in) DocUnlock(doc_in); return doc_out; diff --git a/TempleOS/Adam/ToTXT.CPP b/TempleOS/Adam/Utils/ToTXT.CPP similarity index 100% rename from TempleOS/Adam/ToTXT.CPP rename to TempleOS/Adam/Utils/ToTXT.CPP diff --git a/TempleOS/Adam/WallPaper.CPP b/TempleOS/Adam/WallPaper.CPP index ef9cc3a3d41727538cfbb21336ccf0d1f0a52e66..a1799d04230c195d30c060f31adfee7ca40f1f83 100644 GIT binary patch delta 1205 zcmca$w%lNXczvjWLU>|MPC!v+UWuEArKz1N`UPr6A zWbz57cvA(1_>#opY+bvO)QXaLkVUo_UPOu{9Rr;lUERrHY@w4kuo(zq%4oAIYZesc zrx&Fb7aQupSVmx%W2)Z9t~~i3y97&)uCDduH7w?v3ppwoHIURry88I|heK@DDKALT zwM$OS$w@7WFD}W}ob1Y#I(aph;pDqq?O2?W&uuw*CHL&f%Xw0Skc@;HHd&1~kPGZA zkmX#HFYqc%{=}<4S((pp@>M>`$yt2bY@l?YpfGtFpMha5mx4kq7c|8bR~E;oB$gz` zCl$bw3x)-gfAWQ5anv&YV3}G4c#^@?CM@7H*_gvl9YaP(N!7qOMM2e4Cq+po6CB|R z3JQ~D1*Ili3YtvL7c^!CyLaMx$;rC~MPQD9$%ejX^rfK+iQC?uzp*t(~dIF}ZMWag$$j$;lL;!;4)+&Tt229pmk zYqBP%l;|W+{=lp=*_A~>8p-$|R~H=0n&_Srl~cndoKUBh69 delta 2138 zcmZ2(aKUVXIJ2jj$>b@F(UapCrKGtO6cln2i%a5@6LXT|i&E2yQj0U3X zy4u*7Xoq`vhPY~CQRf^G8Xw{s5fbn0@55qoo2YwGyoal&yGMw=o4;QOls)+z zQ>SBbK}v}=mx4m5g+fwkTC|a=S*%V{X_^s)rBw`;baru8&`L?Rb#Zpg$xJNPNH2;{ zN!E!kNi5FRoSe%XZ_cHl0Osl1m84db#3z=N6xpJ>+?tC^K>=i$t$S*Tb7@gXW^StU zDH_%zu;%5;hgCb#hEs44{HD{`lozDv+9fCE}y-)XBftQW=dV$FmzU8cm+S-j0%zH8?C8 zjV32@%#OwukRU@*U4|#-K#Fm=;0s5NG{|W=nhMq6kVG|fauH`>qz+g@K>?9ZKq(WR zEfI;0lc(BJUH9Bv4WYc@a5R#c>Bq zDJaw;7YoSJXSsdSL0VA5l0XEJ8H9>F@{=7{MU}yUfl@l_D5)A4rzoge>ZB;?Wa@Bn zPOjsTV&dYQJcGw%@+lruM$XA=dBi8n@QN~WPB!P&VC0;f%Bxln3s?nk6@y+{knAl; zv|^?WkU`+MLyM$(4JGG*Pz42r;PS+RV*O$z9WG9i6CTKL)WBB)2`MNz=jVayJUoV~ ogA`(q3sA^FbFLNFWCb?q$<6`>oG#8TsW}=c$(oz<1$M9l0K({U+yDRo diff --git a/TempleOS/Adam/Window.CPP b/TempleOS/Adam/Window.CPP index 8578595..ee2b699 100644 --- a/TempleOS/Adam/Window.CPP +++ b/TempleOS/Adam/Window.CPP @@ -126,7 +126,7 @@ U0 ExtendedASCII() { I64 i; CDoc *doc=DocNew; - DocPutS(doc,"Select Char and Press \n"); + DocPutS(doc,"Select Char and Press \n$$FG,LTBLUE$$"); for (i=0;i<256;i++) { if (i>=CH_SHIFT_SPACE && i!=127) { if (i==CH_SHIFT_SPACE) @@ -277,7 +277,7 @@ F64 last_refresh_time=tT, I64 win_calc_refresh_cnt=0, win_calc_refresh_skips=0; -I64 WinCalcRefreshTimeout(Bool was_forced) +I64 WinCalcRefreshTimeOut(Bool was_forced) { F64 d,d1; I64 i,k,total, @@ -360,7 +360,7 @@ I64 WinQueIPMsgs(Bool que) single_p2=single_ipy-task_focus->win_pixel_top-task_focus->win_scroll_y; if (old_ipx_presnap!=ipx_presnap || old_ipy_presnap!=ipy_presnap) { if (que) - QueMsg(task_focus,0, + TaskMsgQue(task_focus,0, MSG_IP_MOVE,p1,p2,0); msg_code=MSG_IP_MOVE; } @@ -370,14 +370,14 @@ I64 WinQueIPMsgs(Bool que) if (left_dbl) { if (!left_down_sent) { if (que) - QueMsg(task_focus,0, + TaskMsgQue(task_focus,0, MSG_IP_L_D_DOWN,p1,p2,0); left_down_sent=TRUE; msg_code=MSG_IP_L_D_DOWN; } if (!ip_lb) { if (que) - QueMsg(task_focus,0, + TaskMsgQue(task_focus,0, MSG_IP_L_D_UP,p1,p2,0); left_ip_dbl_time=0; msg_code=MSG_IP_L_D_UP; @@ -385,14 +385,14 @@ I64 WinQueIPMsgs(Bool que) } else { if (!left_down_sent) { if (que) - QueMsg(task_focus,0, + TaskMsgQue(task_focus,0, MSG_IP_L_DOWN,single_p1,single_p2,0); left_down_sent=TRUE; msg_code=MSG_IP_L_DOWN; } if (!ip_lb) { if (que) - QueMsg(task_focus,0, + TaskMsgQue(task_focus,0, MSG_IP_L_UP,p1,p2,0); left_ip_dbl_time=0; msg_code=MSG_IP_L_UP; @@ -408,12 +408,12 @@ I64 WinQueIPMsgs(Bool que) if (WinInhibit(WIf_DBL_CLICK)) { if (ip_lb && !ip_lb_last) { if (que) - QueMsg(task_focus,0, + TaskMsgQue(task_focus,0, MSG_IP_L_DOWN,p1,p2,0); msg_code=MSG_IP_L_DOWN; } else if (!ip_lb && ip_lb_last) { if (que) - QueMsg(task_focus,0, + TaskMsgQue(task_focus,0, MSG_IP_L_UP,p1,p2,0); msg_code=MSG_IP_L_UP; } @@ -433,14 +433,14 @@ I64 WinQueIPMsgs(Bool que) if (right_dbl) { if (!right_down_sent) { if (que) - QueMsg(task_focus,0, + TaskMsgQue(task_focus,0, MSG_IP_R_D_DOWN,p1,p2,0); right_down_sent=TRUE; msg_code=MSG_IP_R_D_DOWN; } if (!ip_rb) { if (que) - QueMsg(task_focus,0, + TaskMsgQue(task_focus,0, MSG_IP_R_D_UP,p1,p2,0); right_ip_dbl_time=0; msg_code=MSG_IP_R_D_UP; @@ -448,14 +448,14 @@ I64 WinQueIPMsgs(Bool que) } else { if (!right_down_sent) { if (que) - QueMsg(task_focus,0, + TaskMsgQue(task_focus,0, MSG_IP_R_DOWN,single_p1,single_p2,0); right_down_sent=TRUE; msg_code=MSG_IP_R_DOWN; } if (!ip_rb) { if (que) - QueMsg(task_focus,0, + TaskMsgQue(task_focus,0, MSG_IP_R_UP,p1,p2,0); right_ip_dbl_time=0; msg_code=MSG_IP_R_UP; @@ -471,12 +471,12 @@ I64 WinQueIPMsgs(Bool que) if (WinInhibit(WIf_DBL_CLICK)) { if (ip_rb && !ip_rb_last) { if (que) - QueMsg(task_focus,0, + TaskMsgQue(task_focus,0, MSG_IP_R_DOWN,p1,p2,0); msg_code=MSG_IP_R_DOWN; } else if (!ip_rb && ip_rb_last) { if (que) - QueMsg(task_focus,0, + TaskMsgQue(task_focus,0, MSG_IP_R_UP,p1,p2,0); msg_code=MSG_IP_R_UP; } @@ -537,9 +537,9 @@ I64 WinMgrSleep(Bool flush_msgs=FALSE) TimeStampFreqCal; if (!flush_msgs && old_sys_focus_task!=sys_focus_task) { - QueMsg(old_sys_focus_task,0, + TaskMsgQue(old_sys_focus_task,0, MSG_FOCUS,FALSE,0,0); - QueMsg(sys_focus_task,0, + TaskMsgQue(sys_focus_task,0, MSG_FOCUS,TRUE,0,0); old_sys_focus_task=sys_focus_task; } @@ -547,7 +547,7 @@ I64 WinMgrSleep(Bool flush_msgs=FALSE) if (flush_msgs) FifoI64Flush(scan_code_fifo); else if (TaskValidate(sys_focus_task)) { - KbdQueMsgs; + KbdMsgsQue; que=TRUE; if (!WinInhibit(WIf_CTRLS)) { @@ -570,7 +570,7 @@ I64 WinMgrSleep(Bool flush_msgs=FALSE) if (sys_focus_task) LBtr(&sys_focus_task->task_flags,TASKf_HAS_SONG); - timeout_val=WinCalcRefreshTimeout(was_forced); + timeout_val=WinCalcRefreshTimeOut(was_forced); WinIPUpdate; LBts(&sys_semas[SYS_SEMA_REFRESH_IN_PROGRESS],0); last_refresh_start_time=tT; @@ -620,7 +620,7 @@ public U0 WinMgrSync(I64 cnt=1,Bool force=FALSE) Bool old_preempt=Preempt(OFF), old_full_refresh, old_idle=LBts(&Fs->task_flags,TASKf_IDLE); - CDoc *old_doc=DocCur; + CDoc *old_doc=DocPut; I64 update_cnt; while (Bt(&sys_semas[SYS_SEMA_REFRESH_IN_PROGRESS],0)) { if (force) { @@ -751,7 +751,6 @@ public Bool SetWinHorz(I64 left,I64 right,CTask *task=NULL) Cli; //TODO Multiprocessor safe if (task->win_left!=left || task->win_right!=right) { LBts(&task->display_flags,DISPLAYf_HAS_BEEN_RESIZED); - LBts(&task->display_flags,DISPLAYf_USER_HAS_BEEN_RESIZED); task->win_left=left; task->win_right=right; TaskDerivedValsUpdate(task); @@ -787,7 +786,6 @@ public Bool SetWinVert(I64 top,I64 bottom,CTask *task=NULL) Cli; //TODO Multiprocessor safe if (task->win_top!=top || task->win_bottom!=bottom) { LBts(&task->display_flags,DISPLAYf_HAS_BEEN_RESIZED); - LBts(&task->display_flags,DISPLAYf_USER_HAS_BEEN_RESIZED); task->win_top=top; task->win_bottom=bottom; TaskDerivedValsUpdate(task); @@ -799,57 +797,38 @@ public Bool SetWinVert(I64 top,I64 bottom,CTask *task=NULL) } } -Bool SetCursorPos(CTask *task,I64 iptx,I64 ipty,Bool set_cursor=TRUE) +CDoc *SetCursorPos(CTask *task,I64 iptx,I64 ipty,Bool set_cursor=TRUE) { - CDoc *doc; + CDoc *result=NULL; Bool unlock; I64 x0,y0; if (!task) task=Fs; if (!TaskValidate(task)) return FALSE; - if (task->win_top<=ipty<=task->win_bottom && - task->win_left <=iptx<=task->win_right) { - doc=task->next_doc; - while (doc!=(&task->next_doc)(U8 *)-offset(CDoc.next_doc) && - doc->doc_in_que_signature==DOC_IN_QUE_SIGNATURE_VAL) { - if (set_cursor) { - unlock=DocLock(doc); - if (doc->doc_in_que_signature==DOC_IN_QUE_SIGNATURE_VAL) { - if (doc->flags&DOCF_AUX_DOC) { - doc->x=iptx-task->win_left; - doc->y=ipty-task->win_top; - DocRecalc(doc,FALSE,DOC_RECALC_FIND_CURSOR); - } else { - x0=doc->line_start_col; - y0=doc->cur_top_line_num; - DocRecalc(doc,TRUE); - - doc->x=iptx-task->win_left-task->win_scroll_x/FONT_WIDTH +x0; - doc->y=ipty-task->win_top -task->win_scroll_y/FONT_HEIGHT+y0; - DocRecalc(doc,FALSE,DOC_RECALC_FIND_CURSOR); - task->win_scroll_x=0; - task->win_scroll_y=0; - task->win_scroll_z=0; - } - if (!(doc->flags&DOCF_DONT_SHOW) && - (!doc->best_d || !(doc->flags&DOCF_AUX_DOC))) { - if (unlock) - DocUnlock(doc); - break; - } - if (unlock) - DocUnlock(doc); - } else { - if (unlock) - DocUnlock(doc); - break; - } + if (task->win_top <=ipty<=task->win_bottom && + task->win_left<=iptx<=task->win_right) { + if ((result=DocDisplay(task)) && result->flags&DOCF_DONT_SHOW) + result=NULL; + else if (set_cursor) { + unlock=DocLock(result); + if (result->doc_signature!=DOC_SIGNATURE_VAL) + result=NULL; + else { + x0=result->line_start_col; + y0=result->cur_top_line_num; + DocRecalc(result,TRUE); + result->x=iptx-task->win_left-task->win_scroll_x/FONT_WIDTH +x0; + result->y=ipty-task->win_top -task->win_scroll_y/FONT_HEIGHT+y0; + DocRecalc(result,FALSE,DOC_RECALC_FIND_CURSOR); + task->win_scroll_x=0; + task->win_scroll_y=0; + task->win_scroll_z=0; + if (unlock) + DocUnlock(result); } - doc=doc->next_doc; } WinToTop(task); - return TRUE; } - return FALSE; + return result; } public U0 WinTileHorz() @@ -981,11 +960,11 @@ U0 WinChkMoveSize(CTask *task) { if (task->win_left!=task->win_old_left || task->win_top!=task->win_old_top) - QueMsg(task,0, + TaskMsgQue(task,0, MSG_MOVE,task->win_left,task->win_top,0); if (task->win_right-task->win_left!=task->win_old_right-task->win_old_left || task->win_bottom-task->win_top!=task->win_old_bottom-task->win_old_top) - QueMsg(task,0, + TaskMsgQue(task,0, MSG_RESIZE,task->win_right-task->win_left+1,task->win_bottom-task->win_top+1,0); task->win_old_left =task->win_left; task->win_old_right =task->win_right; @@ -1000,9 +979,9 @@ Bool WinKeyNavMenu() new_ipx,new_ipy; CMenu *m; CMenuEntry *tempme; + CTask *focus=MenuTask; if (Bt(key_down_bitmap,SC_GUI) && - sys_focus_task && - (m=sys_focus_task->cur_menu)) { + focus && (m=focus->cur_menu)) { win_show_menu=TRUE; sys_cur_submenu_entry=NULL; old_ipx=ipx; old_ipy=ipy; @@ -1062,7 +1041,7 @@ Bool WinKeyNavMenu() ipy=new_ipy=0; } if (sys_cur_submenu_entry) { - QueMsg(sys_focus_task,0, + TaskMsgQue(sys_focus_task,0, sys_cur_submenu_entry->msg_code, sys_cur_submenu_entry->p1, sys_cur_submenu_entry->p2,0); @@ -1094,7 +1073,7 @@ U0 WinMgrTask(I64) SetWinVert(0,TEXT_ROWS-1); LBts(&Fs->display_flags,DISPLAYf_NO_BORDER); LBts(&Fs->display_flags,DISPLAYf_SHOW); - GrInit; + GrInit4; LBts(&sys_run_level,RLf_WINMGR); while (TRUE) { try { @@ -1158,7 +1137,7 @@ wmt_start: while (ip_lb) WinMgrSleep(TRUE); if (sys_cur_submenu_entry) { - QueMsg(sys_focus_task,0, + TaskMsgQue(sys_focus_task,0, sys_cur_submenu_entry->msg_code, sys_cur_submenu_entry->p1, sys_cur_submenu_entry->p2,0); @@ -1321,26 +1300,16 @@ wmt_start: if (!WinInhibit(WIf_IP_L)) { if (!old_ip_lb && ip_lb) { - if (SetCursorPos(task,iptx,ipty)) { - doc=task->next_doc; - while (doc!=(&task->next_doc)(U8 *)-offset(CDoc.next_doc) && - doc->doc_in_que_signature==DOC_IN_QUE_SIGNATURE_VAL) { - DocLock(doc); - if (!(doc->flags&DOCF_DONT_SHOW) && - (!doc->best_d || !(doc->flags&DOCF_AUX_DOC))) { - if (doc->doc_in_que_signature==DOC_IN_QUE_SIGNATURE_VAL) { - doc_e=doc->cur_entry; - if (doc_e!=doc) { - if (doc_e->flags1 & DOCEF1_HAS_BORDER) - doc_e->flags1|=DOCEF1_SOLID_BORDER; - } - } - DocUnlock(doc); - break; + if (doc=SetCursorPos(task,iptx,ipty)) { + DocLock(doc); + if (doc->doc_signature==DOC_SIGNATURE_VAL) { + doc_e=doc->cur_entry; + if (doc_e!=doc) { + if (doc_e->flags1 & DOCEF1_HAS_BORDER) + doc_e->flags1|=DOCEF1_SOLID_BORDER; } - DocUnlock(doc); - doc=doc->next_doc; } + DocUnlock(doc); old_ip_lb=TRUE; goto wmt_start; } @@ -1358,13 +1327,13 @@ wmt_start: if (old_ip_lb && !ip_lb) { if (ipty==task->win_top-1) { if (task->win_left<=iptxwin_left+4) { - QueMsg(task,0,MSG_KEY_DOWN,CH_CTRLM,0x43200000432,0); + TaskMsgQue(task,0,MSG_KEY_DOWN,CH_CTRLM,0x43200000432,0); old_ip_lb=FALSE; goto wmt_start; } else if (task->win_right-2<=iptx<=task->win_right) { if (Bt(&task->display_flags,DISPLAYf_HAS_CLOSE_WIN)) { - if (DocCur(task)) - QueMsg(task,0,MSG_KEY_DOWN,CH_SHIFT_ESC,0,0); + if (DocPut(task)) + TaskMsgQue(task,0,MSG_KEY_DOWN,CH_SHIFT_ESC,0,0); else Kill(task,FALSE); old_ip_lb=FALSE; @@ -1376,39 +1345,30 @@ wmt_start: } if (!WinInhibit(WIf_IP_L)) { if (old_ip_lb && !ip_lb) { - if (SetCursorPos(task,iptx,ipty,FALSE)) { - doc=task->next_doc; - while (doc!=(&task->next_doc)(U8 *)-offset(CDoc.next_doc) && - doc->doc_in_que_signature==DOC_IN_QUE_SIGNATURE_VAL) { - if (!(doc->flags&DOCF_DONT_SHOW) && - (!doc->best_d || !(doc->flags&DOCF_AUX_DOC))) { - do msg_code=WinMgrSleep; - while (TaskValidate(task) && - (ip_lb || left_ip_dbl_time)); - if (TaskValidate(task)) { - if (msg_code==MSG_IP_L_UP) { - if (doc->doc_in_que_signature==DOC_IN_QUE_SIGNATURE_VAL) { - DocLock(doc); - if (TaskValidate(task)) { - if (doc->doc_in_que_signature==DOC_IN_QUE_SIGNATURE_VAL) { - doc_e=doc->cur_entry; - if (doc_e!=doc) { - if (doc_e->flags1 & DOCEF1_HAS_BORDER) - doc_e->flags1&=~DOCEF1_SOLID_BORDER; - if (doc_e->flags1 & (DOCEF1_TREE|DOCEF1_LINK|DOCEF1_CHECK_COLLAPSABLE| - DOCEF1_LEFT_CB|DOCEF1_LEFT_MACRO|DOCEF1_LEFT_EXP)) - QueMsg(task,0,MSG_KEY_DOWN,CH_SPACE,0,0); - } - } - DocUnlock(doc); + if (doc=SetCursorPos(task,iptx,ipty,FALSE)) { + do msg_code=WinMgrSleep; + while (TaskValidate(task) && + (ip_lb || left_ip_dbl_time)); + if (TaskValidate(task)) { + if (msg_code==MSG_IP_L_UP) { + if (doc->doc_signature==DOC_SIGNATURE_VAL) { + DocLock(doc); + if (TaskValidate(task)) { + if (doc->doc_signature==DOC_SIGNATURE_VAL) { + doc_e=doc->cur_entry; + if (doc_e!=doc) { + if (doc_e->flags1 & DOCEF1_HAS_BORDER) + doc_e->flags1&=~DOCEF1_SOLID_BORDER; + if (doc_e->flags1 & (DOCEF1_TREE|DOCEF1_LINK|DOCEF1_CHECK_COLLAPSABLE| + DOCEF1_LEFT_CB|DOCEF1_LEFT_MACRO|DOCEF1_LEFT_EXP)) + TaskMsgQue(task,0,MSG_KEY_DOWN,CH_SPACE,0,0); } } - } else if (msg_code==MSG_IP_L_D_UP) - QueMsg(task,0,MSG_KEY_DOWN,CH_ESC,0,0); + DocUnlock(doc); + } } - break; - } - doc=doc->next_doc; + } else if (msg_code==MSG_IP_L_D_UP) + TaskMsgQue(task,0,MSG_KEY_DOWN,CH_ESC,0,0); } old_ip_lb=FALSE; goto wmt_start; @@ -1418,37 +1378,28 @@ wmt_start: if (!WinInhibit(WIf_IP_R)) { if (old_ip_rb && !ip_rb) { - if (SetCursorPos(task,iptx,ipty,FALSE)) { - doc=task->next_doc; - while (doc!=(&task->next_doc)(U8 *)-offset(CDoc.next_doc) && - doc->doc_in_que_signature==DOC_IN_QUE_SIGNATURE_VAL) { - if (!(doc->flags&DOCF_DONT_SHOW) && - (!doc->best_d || !(doc->flags&DOCF_AUX_DOC))) { - do msg_code=WinMgrSleep; - while (TaskValidate(task) && - (ip_rb || right_ip_dbl_time)); - if (TaskValidate(task)) { - if (msg_code==MSG_IP_R_UP) { - if (doc->doc_in_que_signature==DOC_IN_QUE_SIGNATURE_VAL) { - DocLock(doc); - if (TaskValidate(task)) { - if (doc->doc_in_que_signature==DOC_IN_QUE_SIGNATURE_VAL) { - doc_e=doc->cur_entry; - if (doc_e!=doc) { - if (doc_e->flags1&(DOCEF1_LINK| - DOCEF1_RIGHT_CB|DOCEF1_RIGHT_MACRO|DOCEF1_RIGHT_EXP)) - QueMsg(task,0,MSG_KEY_DOWN,'\n',0,0); - } - } - DocUnlock(doc); + if (doc=SetCursorPos(task,iptx,ipty,FALSE)) { + do msg_code=WinMgrSleep; + while (TaskValidate(task) && + (ip_rb || right_ip_dbl_time)); + if (TaskValidate(task)) { + if (msg_code==MSG_IP_R_UP) { + if (doc->doc_signature==DOC_SIGNATURE_VAL) { + DocLock(doc); + if (TaskValidate(task)) { + if (doc->doc_signature==DOC_SIGNATURE_VAL) { + doc_e=doc->cur_entry; + if (doc_e!=doc) { + if (doc_e->flags1&(DOCEF1_LINK| + DOCEF1_RIGHT_CB|DOCEF1_RIGHT_MACRO|DOCEF1_RIGHT_EXP)) + TaskMsgQue(task,0,MSG_KEY_DOWN,'\n',0,0); } } - } else if (msg_code==MSG_IP_R_D_UP) - QueMsg(task,0,MSG_KEY_DOWN,CH_SHIFT_ESC,0,0); + DocUnlock(doc); + } } - break; - } - doc=doc->next_doc; + } else if (msg_code==MSG_IP_R_D_UP) + TaskMsgQue(task,0,MSG_KEY_DOWN,CH_SHIFT_ESC,0,0); } old_ip_rb=FALSE; goto wmt_start; diff --git a/TempleOS/Adam/WordStat/WSDict.CPP b/TempleOS/Adam/WordStat/WSDict.CPP index 53626f6..74a57d5 100644 --- a/TempleOS/Adam/WordStat/WSDict.CPP +++ b/TempleOS/Adam/WordStat/WSDict.CPP @@ -257,7 +257,7 @@ public U0 WSDDisplayDefs(CDoc *doc,U8 *st,I64 num=-1) U0 WSDPopUpDef(U8 *st,I64 num=-1,CTask *parent=NULL) { U8 *buf; - buf=MSPrintF("WSDDisplayDefs(DocCur,\"%s\",%d);View;",st,num); + buf=MSPrintF("WSDDisplayDefs(DocPut,\"%s\",%d);View;",st,num); PopUp(buf,parent); Free(buf); } diff --git a/TempleOS/Adam/WordStat/WSDictGen.CPP b/TempleOS/Adam/WordStat/WSDictGen.CPP index cbfb41d..b020b0b 100644 --- a/TempleOS/Adam/WordStat/WSDictGen.CPP +++ b/TempleOS/Adam/WordStat/WSDictGen.CPP @@ -10,7 +10,7 @@ and #include this file. I ran $LK-A,"::/TempleOS/Misc/Dollar.CPP"$ on it, first. -See $LK-A,"::/TempleOS/Doc/Acknowledgements.TXT"$ (20). +See $LK-A,"::/TempleOS/Doc/Acknowledgements.TXT"$. */ I64 WSDNextCmd(U8 **_ptr) diff --git a/TempleOS/Adam/WordStat/WSMain.CPP b/TempleOS/Adam/WordStat/WSMain.CPP index c442e49..978ea7d 100644 --- a/TempleOS/Adam/WordStat/WSMain.CPP +++ b/TempleOS/Adam/WordStat/WSMain.CPP @@ -319,12 +319,10 @@ U0 WSSingleFileAdd(U8 *buf,I64 pass) ptr--; while (TRUE) { if (ch=*ptr2++) { - if (ch!=CH_CURSOR) { - if (!Bt(alpha_numeric_bitmap,ch)) - break; - else - *ptr3++=ch; - } + if (Bt(alpha_numeric_bitmap,ch)) + *ptr3++=ch; + else if (ch!=CH_CURSOR) + break; } else { ptr2--; break; @@ -460,7 +458,7 @@ U0 WSPutChoices(CDoc *focus_l,CDocEntry *doc_e,CTask *focus_task) CHashWS *w2; F64 timeout_time=tS+0.5; CHashSrcSym *temph; - CDoc *doc=DocCur; + CDoc *doc=DocPut; src=DocGetLine(focus_l,doc_e,&data_col); DocUnlock(focus_l); @@ -503,8 +501,9 @@ pc_done: DocRst(doc,TRUE); doc->flags|=DOCF_MIN_SIZE; DocCursor; - DocCurAttr(LTBLUE<<4+WHITE); - DocAuxAttr(LTBLUE<<4+BLACK); + Fs->text_attr=LTBLUE<<4+WHITE; + Fs->border_src =BDS_CONST; + Fs->border_attr=LTBLUE<<4+BLACK; DocPrintF(doc,"Word:%s\n",ws_cur_word); for (i=0;istr; @@ -543,12 +542,11 @@ U0 WSTask(I64) original_focus_task=focus_task=sys_focus_task; while (TaskValidate(focus_task) && Bt(&focus_task->task_flags,TASKf_INPUT_FILTER_TASK)) focus_task=focus_task->parent_task; - if (TaskValidate(focus_task) && (doc=DocCur(focus_task)) && + if (TaskValidate(focus_task) && (doc=DocPut(focus_task)) && focus_task!=Fs && Bt(&focus_task->display_flags,DISPLAYf_SHOW)) { DocLock(doc); if (TaskValidate(focus_task) && original_focus_task==sys_focus_task && - doc->doc_signature==DOC_SIGNATURE_VAL && doc==DocCur(focus_task) && - (doc_e=doc->cur_entry)) { + doc && doc==DocPut(focus_task) && (doc_e=doc->cur_entry)) { if (doc_e==doc) doc_e=doc_e->last; while (doc_e->last!=doc && (doc_e->type_u8==DOCT_NEW_LINE || doc_e->type_u8==DOCT_SOFT_NEW_LINE)) diff --git a/TempleOS/Apps/AfterEgypt/AENotes.TXT b/TempleOS/Apps/AfterEgypt/AENotes.TXT deleted file mode 100644 index 7db7c64..0000000 --- a/TempleOS/Apps/AfterEgypt/AENotes.TXT +++ /dev/null @@ -1,7 +0,0 @@ -$FG,5$After Egypt Help$FG$ ----------------- - - $LK,"Part 1","FI:::/TempleOS/Apps/HolySpirit/HSNotes.TXT"$ - - $LK,"Part 2","FI:::/TempleOS/Apps/AfterEgypt/AENotesPart2.TXT"$ - diff --git a/TempleOS/Apps/AfterEgypt/AENotesPart2.TXT b/TempleOS/Apps/AfterEgypt/AENotesPart2.TXT deleted file mode 100644 index dc2d32c..0000000 --- a/TempleOS/Apps/AfterEgypt/AENotesPart2.TXT +++ /dev/null @@ -1,51 +0,0 @@ -$WW,1$$FG,5$$TX+CX,"Using this Program, AfterEgypt"$$FG$ - -This game is not about leaving Egypt and it's not about leaving the wilderness. It's about being in the wilderness after Egypt. The whole point is they went from the frying-pan to the fire. $LK,"Numbers,11:1","BF:Numbers,11:1"$ People misrepresent Exodus when they claim it for liberation struggles. Actually, though, the wilderness generation was very blessed because they had first class entertainment -- miracles and excitement. As far as God's concerned, you need food, clothing and entertainment. Just imagine all the prehistoric and primiative people who have lived. - -In this game, hold-up your end of the conversation and talk to God. When you pray try to put your best foot forward. God told me, "excessive contricians wearysome", for example, when I was worried about sin. I joke, don't remind Him of sins because He might have forgotten. - -God loved Jacob and hated Esau. Jacob was like a little rascal. Ironically, holier-than-thou, do-gooder, attitudes are hated. Jesus was "meek and humble of heart", $LK,"Matthew,11:27","BF:Matthew,11:27"$. What does "humble of head" mean? To know God is to know justice. Everyone, rich and poor, has highs and lows. Do not covet. Get your eye off of money. Relax! Don't feel sorry for the poor and don't envy the rich. The poor are mostly lazy and rich suffer plenty. Chavez of Venezuala was fussing and God said, "Japan industrious". What planet do you live on, people! You wouldn't cannonize a ugly man for not committing adultery. When the poor get money, they make buffoons of themselves as nouveau riche. Proud of heart means you won't accept a gift from God, like your birthright being American and not a day laborer. Grace. $LK,"Ecclesiastes,2:24","BF:Ecclesiastes,2:24"$ Jesus' burden is light. He's meek. You don't have to save the world. The poor are richer than Jesus and there is justice. Everything is vanity and the sinner collects possessions for the just. - -After the Haiti quake, I used my program to pick a random passage from some books. Adam Smith came-up: - -$FG,2$The value of a free-stone quarry, for example, will necessarily increase -with the increasing improvement and population of the country round -about it, especially if it should be the only one in the neighbourhood. -But the value of a silver mine, even though there should not be another -within a thousand miles of it, will not necessarily increase with the -improvement of the country in which it is situated. The market for the -produce of a free-stone quarry can seldom extend more than a few miles -round about it, and the demand must generally be in proportion to the -improvement and population of that small district; but the market for -the produce of a silver mine may extend over the whole known world.$FG$ - -God's not a schmuck. God is just. If you are out of work, find anything productive to do. I'd go so far as to say, it's impossible not to be rewarded for honest work. I bank on that. I have an incredible entertainment budget ;-) - -Sometimes, puppet-generated stuff will sound prophetic and relevant enough to scare you. In my experience it's not prophetic, but might be designed to get your attention. Focus on enjoying His company and growing. - -Is this tongues program voodoo? How did they talk with God in the Bible? Did they hear voices? If animal sacrifices were not voodoo, this program is certainly not voodoo. Tongues is a perfectly acceptible Christian doctrine. In fact, $LK,"1 Corinthians,14:39","BF:1 Corinthians,14:39"$, says not to forbid tongues! It is common Christian belief that we are temples of the Holy Spirit, that God dwells in us. I figure idolatry is doing this and thinking the intelligence resides in the object instead of in the person consulting God. - -If any preacher calls this witchcraft, let me retaliate by saying anyone who does not do miracles is not saved. $LK,"Matthew,17:19","BF:Matthew,17:19"$ "... with faith... say to this mountain..." Do a text search for "dumb ass" in the King James Bible. $LK,"2 Peter,2:16","BF:2 Peter,2:16"$ The king of Babylon was made crazy and restored. $LK,"Daniel,4:25","BF:Daniel,4:25"$ If you don't believe in omens, read $LK,"Matthew,26:74","BF:Matthew,26:74"$. If you don't believe in astrology, read $LK,"Matthew,2:10","BF:Matthew,2:10"$. God has a plan and clockwork for Creation. It's nothing to do with power of planets. This is voodoo -- $LK,"Leviticus,3:4","BF:Leviticus,3:4"$? - -We are not to test God, and we are to "live on the word of God." $LK,"Matthew,4:3","BF:Matthew,4:3"$ Do not attempt to box God in a corner, attempting to force him to answer, as in, "should I do such and such, yes or no?" I think it is okay to meditate and offer God the option to comment. - -Don't bug God too much, especially, don't enquire if you haven't offered any meditations or whatever. $LK,"Isaiah,7:13","BF:Isaiah,7:13"$ This, $LK,"Genesis,18:27","BF:Genesis,18:27"$, is funny, though. - -I'll let you work-out how to interpret what you hear from God. It can be the start of a real, personal, relationship with the Father that even has a history. God gift-wraps His talk in riddles. Here's a hint: $LK,"Daniel,5:27","BF:Daniel,5:27"$. "It's mean to tickle the President or a person." God hides from the arrogant and reveals to the child-like. Don't feel foolish if you interpret based on what pops-into your head anagram-wise, analogy-wise or whatever. $LK,"1 Corinthians,2:13","BF:1 Corinthians,2:13"$ - -When God gives me a response in a random passage, it's like He picked a greeting card for me. That's love. I try to return love by being just as thoughtful. - - -$FG,5$$TX+CX,"This Game"$$FG$ - -This $FG,2$AfterEgypt$FG$ game is not really done. - -I thought about a sucker option to $WW,1$take a census -- God say's "why have you done this? You want to battle... Fine. You must pick a penalty..." This is based on something king David did. $LK,"2 Samuel,24:10","BF:2 Samuel,24:10"$ My thinking is that God punished because the act of taking a census reflected a military inclination. Instead of census, you see a crowd of people and must guess how many. I wish not to turn this into another conquest game. - -$FG,5$$TX+CX,"Parting Wisdom"$$FG$ - -The story of God asking Abraham to sacrifice his son, Issac, is deceptive. It turns-out that was actually God imposing justice on Abraham because he almost killed his other son, Ishmael. $LK,"Genesis,21:16","BF:Genesis,21:16"$ - -I just heard in the news that some woman starved her kids because she expected God to provide food. That's testing God. If you find yourself in need, God promises to help, but if you place yourself in need voluntarily, that's attempting to force God and is putting Him to the test. $LK,"Matthew,4:3","BF:Matthew,4:3"$ I gave all my possessions away, once, in 1996, quit my job and expected some mission from God to turn-up. Nothing happened and I was depressed. $LK,"Matthew,19:21","BF:Matthew,19:21"$ I just went back to doing my thing. I guess it eventually paid-off. - - diff --git a/TempleOS/Apps/AfterEgypt/AESplash.TXT b/TempleOS/Apps/AfterEgypt/AESplash.TXT index 677d06c4ff8623950949e9d02a44f9f93dc86f7f..b5d451f965cccc08068ce0fe5ade0077c7bdeb2f 100644 GIT binary patch delta 12276 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 R^qAV;=`nAAr^n)y3jpp<>yiKf delta 1746 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 diff --git a/TempleOS/Apps/AfterEgypt/Battle.CPP b/TempleOS/Apps/AfterEgypt/Battle.CPP index 57b36f01a2df9da8dbf287d6edca1326a11a1b1b..e519e9bc3eac7eb54bd83d098f00a93fd8cfc4fd 100644 GIT binary patch delta 98 zcmX>v*(bFji&fUGSl6y3wW1_Gv81HPHqzC{$3NW0#zfo6C)Cw?b1Lf_MhOK4_tX;K z;&cri9YY%%-(dH6Z`a89(16K4?6Mp#`N_^Xsfk6Ki`nlpF*0us;#$qf$UONk_ay)w CE+1|H delta 41 xcmeB^Ixo2)i*<7k>vP7*6WArVlvGrl+*MR!@{~4jV873_c>>pJ#>qB3mjEin4nP0^ diff --git a/TempleOS/Apps/AfterEgypt/Comics.CPP b/TempleOS/Apps/AfterEgypt/Comics.CPP index 356f822..393a2a6 100644 --- a/TempleOS/Apps/AfterEgypt/Comics.CPP +++ b/TempleOS/Apps/AfterEgypt/Comics.CPP @@ -4,16 +4,17 @@ U0 ViewComics() U8 *st; CDirEntry *tempm,*tempm1; CDoc *doc=DocNew; + DocPutS(doc,"$$FG,LTBLUE$$"); tempm=FilesFind("Comics/*.TXT*"); tempm1=tempm; while (tempm1) { - if (!(i++&3)) - DocPutS(doc,"\n"); st=StrNew(tempm1->name); FileExtRem(st); tempm1->user_data=DocPrintF(doc,"$$MU-UL,\"%-10ts\",%d$$ ",st,tempm1); Free(st); tempm1=tempm1->next; + if ((i++&3)==3) + DocPutS(doc,"\n"); } while (TRUE) { if ((tempm1=PopUpMenu(doc))>0) diff --git a/TempleOS/Apps/AfterEgypt/Comics/Moses65.TXT b/TempleOS/Apps/AfterEgypt/Comics/Moses65.TXT deleted file mode 100644 index 7ee824d962c1e1d331bf700b4dd482da1851416a..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 460 zcmY!h57#kN;o{=t^i;@5EK5~LR4B?!Ny$l7(A8Ba&qyp$FXrOpEJ{sLNX$!7NH0oF z&4aM=Q;QW66}UJ#GfMMPK=QenIUu1tg^c{tB706w6*qSs6BS2=w4(fUh4lQ)ymW<< zjH3L~^bCc{{L&&WPB2KxOiwK?$t+7%D6T9nNzJwAf&-P{039VIuurn|)^h3o#{NMlo{|E8k|NsC0Fara_TO|54R6UHo zk0cK=?<|xLqc1WrFx>wC|38f059Pz?-B9%)^B({I{~wut{r~^}lMDxbD&&*3#D9KmIOHEBtD9K3W;^ZtyEH2J3OD$4J%u7$r zQAkWr%*@l{Cs z7#JBKK#>u_=44=CsApne0MSg093W+!ehdr@|Nj5~ug<{0z|6qFpwGa-@cIA$|1dfd zDh{K285kJ8{{R0UMq4s4FnomaLHZ6dFfgz)FfjB(#XIp8lnNGwq=R*1|mEmBBJEXyy-EJ;;J&dYd5{19|Bp<+{{R2~Nd^W65Dg9_PzZp6X*7@+7+`?~3LJPK0RX{S5-b1! literal 0 HcmV?d00001 diff --git a/TempleOS/Apps/AfterEgypt/GodTalking.CPP b/TempleOS/Apps/AfterEgypt/GodTalking.CPP new file mode 100644 index 0000000000000000000000000000000000000000..91636c8f0321c052b7616d162e3df6f61a2e673e GIT binary patch literal 1904 zcmd<$;^I;X4$x7uF|cLA=%{!)!CjzN)#O+2Ph~gsTM0J>69187v~q1q^3ZukIqy@c1^6VU2#bf zD0+~?C$KcXBo!1u3bYO(o#M=@RGl1KV*>+_BSI|{w30HDa#G{dGILV%5_3~+T~gCP zajg^_67S^ce4h@x6GW>pwz?^4OFc>{T^D zDs^)-sUHbRrD@Tb+BvbdVE-v7C@Co+rS)i=L1 zuOu-u4-^Z?$q6P7(%_L_l$vDC#igJSoLW+nnU`K1P+FX!;a02@66_Wq?C9$nAMEev z4)#@WYN`S_c_AxR(oypDvqBL8B^|e7UAvOhijw%ml9D3ZNLL>p|8N@{6KyA-P*;$> zAo-M{#Paye5?eLYvI``wq@v>Ft^?7gqM`!LVJa%lzB&dv#s(@X?)fPS!HJc{dU|>) zDsJvNL9Q+;DlvIVAkCnd0%g%qV52fQ1#{SsA1+HK#ZgEDX{N zPQM^gC6M_bvt#lCic*V<6+qS*sn`U2c)Eq?x&}MjskphT=t1oc%S2k?WcFsvn z1ZN9);N%xz30SULE(RtB1_nk32>8ap0Om6>a)5;SA)>+z3=Dt&|Njr8^%xi!SQr=> zU~~Xf9!5(tFfjc2|Np-~lrCamVBln6VDN+TOQ1FeGB7aw{{R1fK9nwi(iIF03>*v$ z3^2Nhfq~)Y|Ns9Bq57+!d>CEJz`*eC|Ns9m8e|@b52Lf8>dP1y7(V^~{~ty}ybAFn zLp{vvOkl4IF)%PNGcYjdGB7Zl|NsBL3IhYfga7~k+b}RN-1z_hzZwGr!%e6-NM444 zf#L1{|No^J7#Obq|Nmc_fq~)k|Ns9D7#J8{{r~@887i;Cz`*eM|NsBu3=9n4{{R0k N%D}+zVX_0eRG6t9 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 JPP`h73;>J+pnd=V delta 3706 zcmcb$jd8&w#tHMy6*Md~^|%m#Q$ayNB{)DwNlC|41tHAE#f2nerZQQdNi)nZ)HmMW z$t#%C$kdFBOF1PqEi*4w0VEpk>gn#`>Jsni>mJN$Xk@_^YN4Q&nVVi5jV>E&%T>*# z;_0NLWMgQjq+_U}GkHFv!sJbi>PjYdN;)PgIuJ=HXH+RMAz*3;iai}-l#Yfg-VhLj z%0d#MnVpi3nF?2}_2hac3oWPo{2Ybi%3Ph?{Iblvbe)34lxU+^Yc2%^Xll3Ss#VBO z$|{cDe3yxvaq}x?ZN|ystb5rY>L-h^?U;OyO?C5EwzZ6$sksIDx^|hl>65o}xUqnA zZ5HC3!ZdjWw>eC`JkNPX>&X_px|7p+*VZd2C@7S`b=iV5SEedP_5wLaK_N3uK_gRD z16@|%NYmC9o2ag#CKt#8xD^m5+lB;%x>_sf>lbIRr=}KgDJax#KErp6Y4R4qJSim= z6=xq66%`dHcO9P)=SW9C6%{40^^+Zh6j?y#O->Xlo_tm4=H&Il(UaE;t4!7xF#*#Z zB4(5Ki#(dVR#dUxB|q6YCpEDMq*V!I8q^ry)V$Jw`~qvPS}rbq{g8~zVuj3Nh2ne# zPle>fJcZKYRD}|dU|MEQszPx|VqS_uVorWuDwn=~evv|Au|lFka(-?>eqL%`i9&vw zLZU)JQGR++Vy+&Sa%P%>XI^qnX-cY#dTK#QhK&)IM}ARik~NodYF+3{95!kqu}J{Vy_q#H(wH$Wn|Rf{6S)uwAdwn2C!;TBL)Tr4+aK?C;$Kd z-!(bVMTwn*ogIWH%j%0yzF;WM$Ud3hRCKbYKKJAchNArJ92{(HENm<+Y-}KflNIzu zCSNcV5oG6JV`F1ufdG)yWJP`9$rlWTg~2i`ENmE zRS;{ko`o8ijsw$zjO>&9EEKuf+5i8C`e^bd3te#}K9ZX`CI?!IDubd09Ko4MP+xj4BFBBA~zoiHb0?PtLVcV&s^7&=AC)3u8|{V3rGUe5xKWELzb37p8;*jU)vIlut{ z(hKqp2(yEn12zyNO@XrjSPeT2fPxVu!p6qV0n-T8SI@uzi!gSG5;ita8UPD|atKtA z1C&$18HIy`1CkiQO8)4z^RP#}o#~E68XTl#uw(&c?#Vz{1WB zwiYA@N@F0q5y=GVQsj{T{~sjCz{0@}PR4BP?EgWD8m14LEQNFWNCFgHh@t^(-+y)v22hR34w4524J3rwpk)gK z!+&VFpxFm5ARze{ssL23vmxo@0E@G*aZLW;BBBho3@idJEZIPj2(3w>B_rEpL0M^O zc5ncIT?9&^kk|pM;F#PfCo2w;2Zs-Xo|M1|=HB9=<94`6E&N-=xMU%I(dQUE7>j3~>b{fCK+BX1qHv&+?D9%^#R7g(DQz$J?RVV=ore)@&DioI_=A|ek=H%z4a_Q^m7bzqbDcJxwmJY3Ry0Ha diff --git a/TempleOS/Apps/AfterEgypt/Quail.CPP b/TempleOS/Apps/AfterEgypt/Quail.CPP index 5c17ea887f00f8d4933df9edaec2a9068da1302e..4a2fba9489a778acb60bb51d772644a2ba7df164 100644 GIT binary patch delta 300 zcmew)I!SzjT|E~nPzesub_&o@vN5q!(lOCdva-?-NzEUEXc@A zF4lKW%q`G!4hYbT(lJv~QP9^9$j{6xNi9++$yX>YD9S8JRj@I$Q^?FyK&Vtm%gjmT z;!;jYP0P$nRqzY-o#=T}I~c4wASb`XSR*A_$3Q38J2KwG)zjT0M8`l!#nTDq92L#Y za*SJ&*px~09?37f_@duA-u3%{6%s>tqdlYJEbSBOU#~Y858uvYGI3DJb}*miuJprD_;YUd@)v T12)^qT}34(PieCldkqT!i1R2A diff --git a/TempleOS/Apps/AfterEgypt/WaterRock.CPP b/TempleOS/Apps/AfterEgypt/WaterRock.CPP index b4c507450d25c4e34d8614f1946effc6efc2cfea..bff87a817e7367070402957de5077156321a0a03 100644 GIT binary patch delta 85 zcmbO&eNB49UKUxmVqLqE)QXb$#FCOC+elX*AOCP08xw6OpHNrp&AV7+m?RVw+*3<@ pi_YLjxvXWRvA^$xn99Nlh%;{DW;V8vwcW8~gwO delta 32 ocmca6JzILiUY5;wStOYz3$sgbDXFM9xvQwetriangle_cnt++; + I64 result=b->tri_cnt++; b->t[result].color=c; b->t[result].nums[0]=n0; b->t[result].nums[1]=n1; @@ -64,15 +64,15 @@ U8 *Ball2CSprite() { //See $LK,"::/TempleOS/Adam/Gr/GrSpritePlot.CPP","FL:::/TempleOS/Adam/Gr/GrSpritePlot.CPP,1"$ for how CSprite are stored. U8 *result=MAlloc(sizeof(U8)+2*sizeof(I32)+ - b->vertex_cnt*sizeof(CD3I32)+b->triangle_cnt*sizeof(CMeshTri)+gr_sprite_base_size[GRST_END]), + b->vertex_cnt*sizeof(CD3I32)+b->tri_cnt*sizeof(CMeshTri)+gr_sprite_base_size[GRST_END]), *dst=result; *dst(U8 *)++ =GRST_MESH; *dst(I32 *)++ =b->vertex_cnt; - *dst(I32 *)++ =b->triangle_cnt; + *dst(I32 *)++ =b->tri_cnt; MemCpy(dst,&b->v,b->vertex_cnt*sizeof(CD3I32)); dst+=b->vertex_cnt*sizeof(CD3I32); - MemCpy(dst,&b->t,b->triangle_cnt*sizeof(CMeshTri)); - dst+=b->triangle_cnt*sizeof(CMeshTri); + MemCpy(dst,&b->t,b->tri_cnt*sizeof(CMeshTri)); + dst+=b->tri_cnt*sizeof(CMeshTri); *dst(U8 *)++ =GRST_END; return result; } @@ -92,7 +92,7 @@ public U8 *BallGen() MemCpy(&bd2,&bd1,sizeof(BallDefineStruct)); BDCorrect(&bd2); - c=PopUpLightingColor; + c=PopUpColorLighting; if (c<0) return NULL; b=CAlloc(sizeof(Ball)); @@ -111,8 +111,8 @@ public U8 *BallGen() p2=AddVertex(&bd2,r1*Cos((2*i+2+j)*d_a2),r1*Sin((2*i+2+j)*d_a2),z1); p3=AddVertex(&bd2,r2*Cos((2*i+1+j)*d_a2),r2*Sin((2*i+1+j)*d_a2),z2); p4=AddVertex(&bd2,r2*Cos((2*i+3+j)*d_a2),r2*Sin((2*i+3+j)*d_a2),z2); - AddTriangle(&bd2,c,p1,p2,p3); - AddTriangle(&bd2,c,p3,p2,p4); + AddTri(&bd2,c,p1,p2,p3); + AddTri(&bd2,c,p3,p2,p4); } } diff --git a/TempleOS/Apps/GrModels/ManGen.CPP b/TempleOS/Apps/GrModels/ManGen.CPP index f676969..4a9bdd4 100644 --- a/TempleOS/Apps/GrModels/ManGen.CPP +++ b/TempleOS/Apps/GrModels/ManGen.CPP @@ -4,14 +4,14 @@ This makes a mesh man. #define MAX_VERTICES 1024 -#define MAX_TRIANGLES 1024 +#define MAX_TRIS 1024 class Man { I32 vertex_cnt; - I32 triangle_cnt; + I32 tri_cnt; CD3I32 v[MAX_VERTICES]; - CMeshTri t[MAX_TRIANGLES]; + CMeshTri t[MAX_TRIS]; } *m; @@ -126,9 +126,9 @@ I64 AddVertex(ManDefineStruct *md,I64 x,I64 y,I64 z) return result; } -I64 AddTriangle(ManDefineStruct *,I64 c,I64 n0,I64 n1,I64 n2) +I64 AddTri(ManDefineStruct *,I64 c,I64 n0,I64 n1,I64 n2) { - I64 result=m->triangle_cnt++; + I64 result=m->tri_cnt++; m->t[result].color=c; m->t[result].nums[0]=n1; m->t[result].nums[1]=n0; @@ -158,24 +158,24 @@ U0 AddBox(ManDefineStruct *md,I64 c,I64 x1,I64 y1,I64 z1,F64 w,F64 h,F64 d,F64 h p2a=AddVertex(md,x1+dx +wx+h2x,y1+dy +wy+h2y,z1+dz +wz+h2z); p3a=AddVertex(md,x1+dx+hx-wx ,y1+dy+hy-wy ,z1+dz+hz-wz); p4a=AddVertex(md,x1+dx+hx+wx ,y1+dy+hy+wy ,z1+dz+hz+wz); - AddTriangle(md,c,p1a,p2a,p3a); - AddTriangle(md,c,p4a,p3a,p2a); + AddTri(md,c,p1a,p2a,p3a); + AddTri(md,c,p4a,p3a,p2a); p1b=AddVertex(md,x1-dx -wx+h2x,y1-dy -wy+h2y,z1-dz -wz+h2z); p2b=AddVertex(md,x1-dx +wx+h2x,y1-dy +wy+h2y,z1-dz +wz+h2z); p3b=AddVertex(md,x1-dx+hx-wx ,y1-dy+hy-wy ,z1-dz+hz-wz); p4b=AddVertex(md,x1-dx+hx+wx ,y1-dy+hy+wy ,z1-dz+hz+wz); - AddTriangle(md,c,p1b,p2b,p3b); - AddTriangle(md,c,p4b,p3b,p2b); + AddTri(md,c,p1b,p2b,p3b); + AddTri(md,c,p4b,p3b,p2b); - AddTriangle(md,c,p1a,p2a,p1b); - AddTriangle(md,c,p2b,p1b,p2a); - AddTriangle(md,c,p3a,p4a,p3b); - AddTriangle(md,c,p4b,p3b,p4a); - AddTriangle(md,c,p1a,p3a,p1b); - AddTriangle(md,c,p3b,p1b,p3a); - AddTriangle(md,c,p2a,p4a,p2b); - AddTriangle(md,c,p4b,p2b,p4a); + AddTri(md,c,p1a,p2a,p1b); + AddTri(md,c,p2b,p1b,p2a); + AddTri(md,c,p3a,p4a,p3b); + AddTri(md,c,p4b,p3b,p4a); + AddTri(md,c,p1a,p3a,p1b); + AddTri(md,c,p3b,p1b,p3a); + AddTri(md,c,p2a,p4a,p2b); + AddTri(md,c,p4b,p2b,p4a); *ox=x1+hx-h3x; *oy=y1+hy-h3y; @@ -189,15 +189,15 @@ U8 *Man2CSprite() { //See $LK,"::/TempleOS/Adam/Gr/GrSpritePlot.CPP","FL:::/TempleOS/Adam/Gr/GrSpritePlot.CPP,1"$ for how CSprite are stored. U8 *result=MAlloc(sizeof(U8)+2*sizeof(I32)+ - m->vertex_cnt*sizeof(CD3I32)+m->triangle_cnt*sizeof(CMeshTri)+gr_sprite_base_size[GRST_END]), + m->vertex_cnt*sizeof(CD3I32)+m->tri_cnt*sizeof(CMeshTri)+gr_sprite_base_size[GRST_END]), *dst=result; *dst(U8 *)++ =GRST_MESH; *dst(I32 *)++ =m->vertex_cnt; - *dst(I32 *)++ =m->triangle_cnt; + *dst(I32 *)++ =m->tri_cnt; MemCpy(dst,&m->v,m->vertex_cnt*sizeof(CD3I32)); dst+=m->vertex_cnt*sizeof(CD3I32); - MemCpy(dst,&m->t,m->triangle_cnt*sizeof(CMeshTri)); - dst+=m->triangle_cnt*sizeof(CMeshTri); + MemCpy(dst,&m->t,m->tri_cnt*sizeof(CMeshTri)); + dst+=m->tri_cnt*sizeof(CMeshTri); *dst(U8 *)++ =GRST_END; return result; } @@ -215,13 +215,13 @@ public U8 *ManGen() MemCpy(&md2,&md1,sizeof(ManDefineStruct)); MDCorrect(&md2); - c1=PopUpLightingColor("$$BK,1$$Shirt$$BK,0$$\n"); + c1=PopUpColorLighting("$$BK,1$$Shirt$$BK,0$$\n"); if (c1<0) return NULL; - c2=PopUpLightingColor("$$BK,1$$Pants$$BK,0$$\n"); + c2=PopUpColorLighting("$$BK,1$$Pants$$BK,0$$\n"); if (c2<0) return NULL; - c3=PopUpLightingColor("$$BK,1$$Skin$$BK,0$$\n"); + c3=PopUpColorLighting("$$BK,1$$Skin$$BK,0$$\n"); if (c3<0) return NULL; - c4=PopUpLightingColor("$$BK,1$$Shoes$$BK,0$$\n"); + c4=PopUpColorLighting("$$BK,1$$Shoes$$BK,0$$\n"); if (c4<0) return NULL; m=CAlloc(sizeof(Man)); diff --git a/TempleOS/Apps/GrModels/Models.CPP b/TempleOS/Apps/GrModels/Models.CPP index 93e6c75..e67a409 100644 --- a/TempleOS/Apps/GrModels/Models.CPP +++ b/TempleOS/Apps/GrModels/Models.CPP @@ -4,15 +4,15 @@ U0 Models() { I64 i; - Bool old_form=LBts(&(DocCur)->flags,DOCf_FORM); + Bool old_form=LBts(&(DocPut)->flags,DOCf_FORM); DocClear; "Make a CSprite model. Then, cut-and-Paste it.\n\n"; "$$LM,4$$"; "\n\n$$BT,\"Man\",T_MAN$$\n\n"; "\n\n$$BT,\"Ball\",T_BALL$$\n\n"; "$$LM,0$$"; - i=DocMenuDo(DocCur); - LBEqu(&(DocCur)->flags,DOCf_FORM,old_form); + i=DocMenuDo(DocPut); + LBEqu(&(DocPut)->flags,DOCf_FORM,old_form); DocBottom; switch (i) { case T_MAN: diff --git a/TempleOS/Apps/HolySpirit/HSNotes.TXT b/TempleOS/Apps/HolySpirit/HSNotes.TXT index 5728d9d..0ecc634 100644 --- a/TempleOS/Apps/HolySpirit/HSNotes.TXT +++ b/TempleOS/Apps/HolySpirit/HSNotes.TXT @@ -1,41 +1,31 @@ $FG,5$$TX+CX,"The Purpose of Life"$$FG$ -$WW,1$The purpose of life is to know God, love God and obey God.$FG$ Modern Christianity focuses on loving neighbor, not God. That is secular humanism. Loving God is more important than loving neighbor if you read $LK,"Matthew,22:37","BF:Matthew,22:37"$. Note: It does not say with half your mind behind your back. +$WW,1$The purpose of life is to know, love and obey God.$FG$ Christianity is loving neighbor, not God -- secular humanism. Jesus said loving God is more important than loving neighbor. $LK,"Matthew,22:36","BF:Matthew,22:36"$ He did not say with half your brain behind your back. -$FG,5$$TX+CX,"Knowing God"$$FG$ +You don't know God. $LK,"1 Chronicles,28:9","BF:1 Chronicles,28:9"$, $LK,"Matthew,11:27","BF:Matthew,11:27"$, $LK,"Luke,13:25","BF:Luke,13:25"$, $LK,"1 Samuel,3:7","BF:1 Samuel,3:7"$ You must talk with God to know Him. $LK,"Matthew,6:6","BF:Matthew,6:6"$ Seek Him by taking the initiative. $LK,"Luke,11:9","BF:Luke,11:9"$, $LK,"Isaiah,30:2","BF:Isaiah,30:2"$ -Most people don't know God. $LK,"1 Chronicles,28:9","BF:1 Chronicles,28:9"$, $LK,"Matthew,11:27","BF:Matthew,11:27"$, $LK,"Luke,13:25","BF:Luke,13:25"$ You must talk with Him to know Him. $LK,"Matthew,6:6","BF:Matthew,6:6"$ You must seek Him by taking the initiative. $LK,"Luke,11:9","BF:Luke,11:9"$, $LK,"Isaiah,30:2","BF:Isaiah,30:2"$ +There's something obviously different about people in the Bible compared to people today -- God talked! Did they hear voices? Maybe. More likely, they used occult techniques such as an oracle. $LK,"1 Kings,6:20","BF:1 Kings,6:20"$ Have you heard of "tongues?" $LK,"1 Corinthians,14:1","BF:1 Corinthians,14:1"$ The idea is, you let yourself be puppeted by a spirit, so you say things. You try to get a spirit -- the Holy Spirit -- to talk. You might as well use a Ouija board. However, it turns-out that a Ouija board is bad for technical reasons. A really good technique is just randomly opening a book. God said it is a covenant that you hold-up your end of the conversation. -Have you heard of "tongues?" Read $LK,"1 Corinthians,14:1","BF:1 Corinthians,14:1"$. Basically, when you follow impulses, you can be puppeted by spirits. "Promptings of the Holy Spirit" is a phrase. Some people say strange words when they speak in tongues. $LK,"Acts,2:1","BF:Acts,2:1"$ I use a different technique -- in this program, I read a nanosecond-range stop-watch when I press a button and use the high-speed time as a random number to pick words or passages. I can also just randomly crack-open a book and get a response. +You can't tell if He's talking unless you have a context of conversation, but, more importantly, you are commanded to do an offerring of love, like communion preparation. When you pick a greeting card for someone, that is love effort. God said, "honest measures" applies between your offering of love and His response, like a fair barter. You get out of prayer what you put into it. God wants praise, hymns, or whatever you think He might want. Try and see, like Cain and Abel. $LK,"Genesis,4:1","BF:Genesis,4:1"$, $LK,"Ephesians,5:10","BF:Ephesians,5:10"$ God told Cain his offering was not good and told him to try again. Cain really loved God! Can you imagine being so heart-broken? -Since seeking the word of the Holy Spirit, I have come to know God much better than I've heard others explain. God said, for example, that war was, "servicemen competing." That sounds more like the immutable God of our planet than what you hear from most religious people. God is not Venus (god of love) and not Mars (god of war), He's the God of Earth. (There is a book, $UL,1$Men are from Mars, Women from Venus$UL,0$. If Mammon is a false god of money, Mars or Venus might be useful words to describe other false gods.) I figure the greatest challenge for the Creator is boredom, ours and His. +Do a text search for "new song" in the Bible. It's mentioned nine times. I did $MA+A-X+PU+HTML,"hymns","#include \"::/TempleOS/Apps/MusicOrgan/Load\";JukeBox(\"::/TempleOS/Apps/MusicOrgan/Examples\");","http://www.templeos.org/Wb/Accts/TS/Wb2/Hymns.html"$. I did Moses $MA+A-X+PU+HTML,"comics","Dir(\"::/TempleOS/Apps/AfterEgypt/Comics\");View;\n","http://www.templeos.org/Wb/Apps/AfterEgypt/Comics/"$. Count the ways you love God. I praised God for sand castles, popcorn, snowmen, bubbles... You try putting effort into praise! $LK,"Matthew,11:25","BF:Matthew,11:25"$, $LK,"Matthew,6:29","BF:Matthew,6:29"$ -God's ways are far above man's ways. Mom said Heaven was a never-ending family reunion. Yikes! A friend said, "Most guy's idea of Heaven would be running around doing things they'd get locked up for on Earth." Most people are like King Midas. When you realize how silly most notions of Heaven are, you come to appreciate that Earth is not that bad. This is the first step in loving God, the Creator -- praising Creation. +This is funny -- $LK,"Acts,2:1","BF:Acts,2:1"$ -- they didn't bother to record anything the Holy Spirit said. The Holy Spirit is supposed to be a really good gift. $LK,"Luke,11:13","BF:Luke,11:13"$ Just remember, "Boys are made of snakes and snails and puppy-dog tails." -Just remember, "Little boys are made of snakes and snails and puppy-dog tails." $LK,"Luke,11:11","BF:Luke,11:11"$ God gives toys on Christmas, not just cloths, or at least the Holy Spirit! What does it mean that God gives the Holy Spirit? Basically, it means you get lucky because you're puppeted. "Puppeted" is a pagan word, but I'm putting it in terms everyone can understand. You act with God-like intellect when you accidentally say stuff more clever than you know you are. You'll know it when it happens. You'll be, like, "I know I'm not that smart." Basically, being puppeted affects chance on random things. God does not play with dice. The world is not random. How is being full of the Holy Spirit any different from what people call "luck"? Why else is it such a good thing? Be warned -- it can also lead to blessings in disguise or causing you to stupidly give away secrets you'd rather keep, for example. +The technique I use to consult the Holy Spirit is reading a microsecond-range stop-watch each button press for random numbers. Then, I pick words or passages. You can use the $MA+A-X+PU+HTML,"AfterEgypt","#include \"::/TempleOS/Apps/AfterEgypt/Run\"","http://www.youtube.com/watch?v=P0MsDl39UL0"$ in God's official temple, $FG,4$$TX+HTML,"TempleOS","http://www.templeos.org"$$FG$. +Since seeking the word of the Holy Spirit, I have come to know God much better than I've heard others explain. God said, for example, that war was, "servicemen competing." That sounds more like the immutable God of our planet than what you hear from most religious people. God is not Venus (god of love) and not Mars (god of war), He's our dearly beloved God of Earth. If Mammon is a false god of money, Mars or Venus might be useful words to describe other false gods. I figure the greatest challenge for the Creator is boredom, ours and His. What would teen-age male video games be like if war had never happened? Christ said live by the sword, die by the sword, which is loving neighbor as self. $LK,"Matthew,26:52","BF:Matthew,26:52"$ +I asked God if the World was perfectly just. God asked if I was calling Him lazy. I think highs and lows balance. $LK,"Luke,6:20","BF:Luke,6:20"$ I don't think God likes complaining. $LK,"Numbers,11:1","BF:Numbers,11:1"$ Food and clothing is all we're to ask for or demand, in fact -- daily bread. $LK,"1 Timothy,6:8","BF:1 Timothy,6:8"$ Just think about man in the last 100,000 years mostly living like Native Americans and how God must see us. You need food, clothing and entertainment, money is to get those. Man does not live on bread alone. $LK,"Luke,4:4","BF:Luke,4:4"$, $LK,"Amos,8:11","BF:Amos,8:11"$ -$FG,5$$TX+CX,"Loving God"$$FG$ +God's favorite animals are bears and elephants. They are funny shaped -- I think God must have seen too much starvation over the years. -Imagine a billionare. Everyone around him can't forget his money even for a moment. The truth is, most people are after God's, "money." They fear for salvation. Here's a test -- would you pray to and praise God even if there were no salvation? +God's ways are far above man's ways. Mom said Heaven was a never-ending family reunion. Yikes! A friend said, "Most guy's idea of Heaven would be running around doing things they'd get locked up for on Earth." Most people are like King Midas. When you realize how silly most notions of Heaven are, you come to appreciate that Earth is not that bad. This is the first step in loving God, the Creator -- praising Creation. My parents spend their retired days watching TV and going to casinos. That's not a good argument for getting extended-play! -Love God and don't be a "user". Asking for stuff is annoying. $LK,"Luke,11:5","BF:Luke,11:5"$. Instead, offer Him praise. Make-up songs. You get out of prayer what you put into it. He knows better than you about the poor suffering people on the planet. It's silly and holier-than-thou praying for them. Since He does know, there's a good chance He might be doing it! "Thy will be done" means such prayers are wrong and annoying. Helping in a meaningful way is different, but don't fill your prayers with stupid requests for others. +Imagine a billionare. Everyone around him can't forget his money for even a moment. The truth is, most people are after God's "money" -- they fear for their salvation. Here's a test -- would you pray to and praise God even if there were no salvation? Love God and don't be a "user". Asking for stuff is annoying. $LK,"Luke,11:5","BF:Luke,11:5"$ -The book of $LK,"Job,1:5","BF:Job,1:5"$ begins with God hanging-out on the porch with Satan, chatting. I hope God doesn't play me like He played Job! I decided Job's problem was being so holier-than-thou that he did offerings for his kids, in case they sinned. I think highs and lows balance -- $LK,"Luke,6:20","BF:Luke,6:20"$. +All those sophisticated theological "infinity" things -- omniscience, omnipotence, omnipresence, omnivorous -- will mess you up. Trust me that anthropomorphic is far better, in practice. Christ suggested thinking of God as "Abba" which is Aramaic for "Daddy" and said the childlike had an advantage. $LK,"Matthew,11:25","BF:Matthew,11:25"$ Pray out-loud because God doesn't want the hastle of reading your brain. The best way to stop people from testing God is to suggest He can't do everything. -A simple rule of thumb for prayer should be, "Would I want to hear this prayer?" If you are not honestly pondering what pleases God, you're not even close to loving Him. $LK,"Ephesians,5:10","BF:Ephesians,5:10"$ and $LK,"Genesis,4:7","BF:Genesis,4:7"$ suggests experimenting to find what pleases God. God liked Abel's offering and not Cain's. Is it just me or is the entire planet brain dead! These people in the Bible obviously got feedback! I do hymns and I do comics, a little like parables. Praise, thanks and love are better than sacrifice. $LK,"Psalms,50:14","BF:Psalms,50:14"$, $LK,"Hosea,6:6","BF:Hosea,6:6"$ Obviously, animal sacrifices are really stupid. The whole notion of sacrifice is a little warped if you think about it. A loving God who wants you to hurt and deny yourself is bat-shit crazy! That's a demon! How would you feel if your wife abused herself to please you? Wha? If I were God, I might feel merciful to someone groveling, but I'd begin to get pissed if they were being emotionally manipulative. People become brain dead forgetting God is a thinking, emotional, being and not some sadistic accountant. +Just as ego causes most to love neighbor, not God, people skip knowing and loving God and cowardly get stuck on obeying Him. This hardly needs encouragement. -All those sophisticated theological "infinity" things such as omnicient, omnipotent, omnipresent, etc. will mess you up and you do far worse than a simple person. Trust me -- anthropomorphic is far better, in practice. Christ suggested thinking of God as "Abba" which is Aramaic for "Daddy." - -Do a text search for "new song" in the Bible. It's mentioned nine times. You get out of prayer what you put into it and people are very lazy. The first commandment is to love God. You better be able to count the ways. - -You have, basically, two things you can praise God for -- Creation and Exodus. Am I right? You could do other historic events or maybe evidence of justice. I crack-up laughing because the New Testament has Egypt mentioned several time. Jesus praised God for flowers. $LK,"Matthew,6:29","BF:Matthew,6:29"$ - - - -$FG,5$$TX+CX,"Obeying God"$$FG$ - -Just as ego cause most to love neighbor, not God, people skip knowing and loving God and cowardly get stuck on obeying Him. This command hardly needs more encouragement. - -God does not want pawns to push around. God will talk, but won't tell you what to do, even if you want Him to. +God does not want pawns to push around. God will talk, but won't tell you what to do, even if you want Him to. You'll quickly learn that prophecy does not come true and should smack yourself for wanting more than just enjoying God's company. diff --git a/TempleOS/Apps/HolySpirit/HolySpirit.CPP b/TempleOS/Apps/HolySpirit/HolySpirit.CPP index 0eb91be..6d0adb3 100644 --- a/TempleOS/Apps/HolySpirit/HolySpirit.CPP +++ b/TempleOS/Apps/HolySpirit/HolySpirit.CPP @@ -41,7 +41,7 @@ I64 TimerPickedU16(U8 *msg=NULL) st=CAlloc(256); StrCat(st,"\n\nPress $$FG,GREEN$$OKAY$$FG$$ to generate \n" "a random num from a timer.\n"); - PopUpTimerOk(st,"\n\nThe $WW,1$$LK,"Holy Spirit","FI:::/TempleOS/Apps/HolySpirit/HSNotes.TXT"$ can puppet you.\n\n"); + PopUpTimerOk(st,"\n\nThe $WW,1$$LK+PU,"Holy Spirit","FI:::/TempleOS/Apps/HolySpirit/HSNotes.TXT"$ can puppet you.\n\n"); Free(st); return KbdMouseEvtTime/CLK_DIVISOR; } diff --git a/TempleOS/Apps/HolySpirit/Vocab.TXT b/TempleOS/Apps/HolySpirit/Vocab.TXT index a1689f8..26a73a2 100644 --- a/TempleOS/Apps/HolySpirit/Vocab.TXT +++ b/TempleOS/Apps/HolySpirit/Vocab.TXT @@ -313,7 +313,7 @@ back brought formed invisible -servant +srv understood wert why @@ -841,7 +841,7 @@ pray readily rule saidst -servants +srvs several sides speaketh diff --git a/TempleOS/Apps/KeepAway/KeepAway.CPP b/TempleOS/Apps/KeepAway/KeepAway.CPP index bc2c3dd..bdfcb54 100644 --- a/TempleOS/Apps/KeepAway/KeepAway.CPP +++ b/TempleOS/Apps/KeepAway/KeepAway.CPP @@ -223,7 +223,7 @@ air is approximated by V and V$SY,-3$2$SY,0$ terms and is smaller. However, I use this to produce a rolling friction value, too. If you want to see my -best attempt at realstic physics +best attempt at realistic physics download SimStructure. http://www.templeos.org/files/SimStrSetUp.zip @@ -276,7 +276,7 @@ Frame man_imgs[LAST_STOPPED_DRIBBLING+1]={ }; AcctRegSetDftEntry("TempleOS/KeepAway","I64 best_score0=0,best_score1=9999;\n"); -AcctRegExecuteBranch("TempleOS/KeepAway"); +AcctRegExeBranch("TempleOS/KeepAway"); F64 game_t_end,foul_t_end; I64 score0,score1; @@ -519,15 +519,15 @@ U0 AnimateTask(CTask *parent_task) o->has_ball=TRUE; if (o==human) { if (ball_stolen && team) { - Noise(250,2000,2000,WF_SQUARE); + Noise(250,2000,2000); score0+=2; } } else { if (o->team) { - Noise(250,1000,1000,WF_SQUARE); + Noise(250,1000,1000); score1+=2; } else { - Noise(250,2000,2000,WF_SQUARE); + Noise(250,2000,2000); score0+=2; } } @@ -563,7 +563,7 @@ U0 AnimateTask(CTask *parent_task) d=(dx-objs[j].DxDt)*dx2+(dy-objs[j].DyDt)*dy2; if (o==human && t0>o->foul_t0+1.0 && dt && d/dt>FOUL_VELOCITY_THRESHOLD && objs[j].team) { - Noise(250,500,500,WF_SQUARE); + Noise(250,500,500); score1+=1; foul_t_end=t0+1.0; } @@ -668,10 +668,10 @@ U0 KeepAway() "Left-Click to pass.\n" "Right-Click to jump.\n"); SettingsPush; //See $LK,"SettingsPush","MN:SettingsPush"$ + Fs->text_attr=BLACK+YELLOW<<4; WinMax; WinBorder; Preempt(OFF); - DocCurAttr(BLACK+YELLOW<<4); Fs->win_inhibit|=WIF_DBL_CLICK; WordStat; @@ -692,7 +692,7 @@ U0 KeepAway() DocCursor; DocClear; Fs->draw_it=&DrawIt; - Fs->animate_task=Spawn(&AnimateTask,Fs,"Animate",Fs); + Fs->animate_task=Spawn(&AnimateTask,Fs,"Animate",,Fs); try { while (TRUE) { @@ -724,6 +724,7 @@ ka_jump: } } ka_done: //Don't goto out of try + GetMsg(,,1<text_attr=LTCYAN<<4+BLACK; Fs->draw_it=&DrawIt; Fs->task_end_cb=&SndTaskEndCB; MusicSettingsRst; @@ -52,16 +53,16 @@ U0 Song() TaskWait(task); SetWinHorz(Fs->win_left,Fs->win_right,task); SetWinVert(Fs->win_bottom+3,Fs->win_bottom+15,task); - "$$BD+H,LTCYAN$$$$FD+H,BLACK$$"; + "$$BG+H,LTCYAN$$$$FD+H,BLACK$$"; while (!ScanKey) { "$$FG,WHITE$$To God...\n$$FG$$"; - Play("W13etCFE!!sDDDDD2G!3D2G!!3qC2eG3EqEetAA!F2qG", + Play("3etCFEsDDDDD2G3D2G3qC2eG3EqEetAAF2qG", "I \0am \0a\0biding \0 \0 \0 \0in \0 \0Your \0 \0presence.\n\0 \0 \0 \0 \0 \0 \0 \0"); - Play("3etCFE!!sDDDDD2G!3D2G!!3qC2eG3EqEetAA!F2qG", + Play("3etCFEsDDDDD2G3D2G3qC2eG3EqEetAAF2qG", "I \0am \0a\0biding \0 \0 \0 \0in \0 \0Your \0 \0presence.\n\0 \0 \0 \0 \0 \0 \0 \0"); - Play("!3DBsFGF!G2eG!!3FRDqEGeB!E", + Play("3DBsFGFG2eG3FRDqEGeBE", "What \0a \0joy!\n\0 \0 \0 \0 \0 \0 \0 \0 \0 \0 \0 \0"); - Play("!qDBsFGF!G2eG!!3FRDqEGeB!E", + Play("qDBsFGFG2eG3FRDqEGeBE", "I'm \0so \0coy!\n\0 \0 \0 \0 \0 \0 \0 \0 \0 \0 \0 \0"); } } catch diff --git a/TempleOS/Apps/MusicOrgan/Examples/abyss.CPP b/TempleOS/Apps/MusicOrgan/Examples/abyss.CPP index 3bec3d0..bb912e1 100644 --- a/TempleOS/Apps/MusicOrgan/Examples/abyss.CPP +++ b/TempleOS/Apps/MusicOrgan/Examples/abyss.CPP @@ -20,7 +20,7 @@ U0 Song() SetWinHorz(Fs->win_left,Fs->win_right,task); SetWinVert(Fs->win_bottom+3,Fs->win_bottom+15,task); while (!ScanKey) { - Play("W13sBBBBqCq.BeAqBh.A", + Play("3sBBBBqCq.BeAqBh.A", "Can't \0 \0 \0 \0get \0there, \0from \0he\0re.\n\0"); Play("M2/4"); Play("eECqAM4/4"); @@ -28,9 +28,9 @@ U0 Song() "Can't \0 \0 \0 \0get \0there, \0from \0he\0re.\n\0"); Play("M2/4"); Play("eDDqDM4/4"); - Play("DeEDqG!CeF2G3qG!!sFGFG!!eD!C", + Play("DeEDqGCeF2G3qGsFGFGeDC", "Oh, \0my \0 \0God, \0some\0thing's... \0 \0 \0ver\0 \0y \0 \0wrong!\n\0 \0"); - Play("qDeEDqG!CeF2G3qG!!sFGFG!!eD!C", + Play("qDeEDqGCeF2G3qGsFGFGeDC", "Oh, \0my \0 \0God, \0some\0thing's... \0 \0 \0ver\0 \0y \0 \0wrong!\n\0 \0"); } } catch diff --git a/TempleOS/Apps/MusicOrgan/Examples/awake.CPP b/TempleOS/Apps/MusicOrgan/Examples/awake.CPP index 8044511..a06cb6a 100644 --- a/TempleOS/Apps/MusicOrgan/Examples/awake.CPP +++ b/TempleOS/Apps/MusicOrgan/Examples/awake.CPP @@ -57,13 +57,13 @@ U0 Song() SetWinVert(Fs->win_bottom+3,Fs->win_bottom+15,task); while (!ScanKey) { "$$FG,GREEN$$Jesus talking...$$FG$$\n"; - Play("W13eBC!qB2sG3D2G3DetC!!GFsCBCB!etCGBeB!!GsBCB!C", + Play("3eBCqB2sG3D2G3DetCGFsCBCBetCGBeBGsBCBC", "Stay \0a\0wake.\n\0 \0 \0 \0 \0 \0 \0 \0 \0 \0 \0 \0 \0 \0 \0 \0 \0 \0 \0 \0 \0"); - Play("eBC!qB2sG3D2G3DetC!!GFsCBCB!etCGBeB!!GsBCB!C", + Play("eBCqB2sG3D2G3DetCGFsCBCBetCGBeBGsBCBC", "Stay \0a\0wake.\n\0 \0 \0 \0 \0 \0 \0 \0 \0 \0 \0 \0 \0 \0 \0 \0 \0 \0 \0 \0 \0"); - Play("qD!sD!BD!BetA2G3GqB2G3sAD!ADqD!etGF!D", + Play("qDsDBDBetA2G3GqB2G3sADADqDetGFD", " \0 \0 \0 \0 \0 \0 \0 \0 \0 \0 \0I \0 \0am \0a \0dead \0 \0man.\n\0"); - Play("qD!sD!BD!BetA2G3GqB2G3sAD!ADqD!etGF!D", + Play("qDsDBDBetA2G3GqB2G3sADADqDetGFD", " \0 \0 \0 \0 \0 \0 \0 \0 \0 \0 \0I \0 \0am \0a \0dead \0 \0man.\n\0"); } } catch diff --git a/TempleOS/Apps/MusicOrgan/Examples/battlehymnsolo.CPP b/TempleOS/Apps/MusicOrgan/Examples/battlehymnsolo.CPP index 4e9cba6b703cb6cf31c3f1368493c209f6aa5524..ad238f827c195c22f16261caaefda4235cf8f05a 100644 GIT binary patch literal 1189 zcmdPbH&@6=ELKP_N-W68OfKf)3N=s&&d*EN(B!J-Qcws^Eh)*&OD_&6EzYo3(AN)6 zO;u3w@zzm7mQd1B^7XSq5mDh%P;e{OwJS-jD2Y!jDJimb@^N(bwy`nM4)^d3akYlY zCl+VNr{<-^Cnwpe1?Q!NBo=48=A}40ffV?b7H1~Ij14L-0g2^;#Nta*a|`lq6^!&u zEDR8$#U+W!i6tfZ@o9<4CHY0R3I=+XAlZ_lN(GQ-6coxcGILTDG!%oA6Z5=ND>b3Q z3JNay$<8^ciA5mg3JMAeN-8Q&?mA#MtEi}`xVh_qovor0lLv$0iJ2t|Y57G8B^jv- zsd*`SdU{GQ?S84{KACx`8m5{sk>G;FWC>f{f zxfi>G2)9%{*J5{*R6XZn7ZB4GM7R_>g9MzE;M$;0g}E~TY)Y!0W3eNMa006a5sn~} zO^U%(v1=jN3U`9W5O9k#0RvoIoSicCoC|{ps5908xrczFV&o9Xa4pnxP9p1y1I(viIZtgna9-bktDk?E~Fc_YgS)!1ZU!+iy zk*biIm!hYqr)15=>6cpWlbM&QVXA4(#Ti_Xn4DUyVQ3EG1eBHp7Zhcdq-v;mI_W6c z7}|lt11yu1SgE08oT}$u><%K_QuSPm-Az*UoQqvROji)$Qs@j4a8d&4fZAfs#TfwB zo2utn>N%%kH=|Gkm|EiM>R#wv?BeX=?B?v| zT>EPqH#IuO;gbPp&PuoXMt zgaVd?v)~Mxy9bgih%SFIqbPs7s z8KRn&?jbQLgG)$Sx`(u+3{g!>_drrHJjq}(up}ayy9bgiM$1F=f(%r@gCY!)EQV}( zi0&<_@j>B(nS$XWSdubWj%xO!8^nOEM*&aVL#DsXPAkBGtw#Y*+*rC65ILHcKe!SK zDDPpBqq%$FNd}XFB@vDGPmz)pmPAB{@Bt?jH~}3I0=Wt`4Alon*SdubW z5qdF3HU2Ou52+R&=mwEl9-z7yv^+#F0a5v*;e#3;=)BSJK@SmB{%CnfpghDcO?TPR_`)CLgD!kfv)h34M$1F| SQ7{@lqv3-;1n|o;FaQ9kJznGh diff --git a/TempleOS/Apps/MusicOrgan/Examples/born.CPP b/TempleOS/Apps/MusicOrgan/Examples/born.CPP index 934c46e..35336d9 100644 --- a/TempleOS/Apps/MusicOrgan/Examples/born.CPP +++ b/TempleOS/Apps/MusicOrgan/Examples/born.CPP @@ -37,13 +37,13 @@ U0 Song() try { while (!ScanKey) { t0=tMBeat; - Play("3qB!eB2G!3qA!!eF!!AsF!AFA!!qC2sG!3A!2G3ARBRB", + Play("3qBeB2G3qAeFAsFAFAqC2sG3A2G3ARBRB", "New \0day \0is \0born.\n\0 \0 \0 \0 \0 \0 \0 \0 \0 \0 \0 \0 \0 \0 \0 \0"); - Play("qB!eB2G!3qA!!eF!!AsF!AFA!!qC2sG!3A!2G3ARBRB", + Play("qBeB2G3qAeFAsFAFAqC2sG3A2G3ARBRB", "Though \0it's \0the \0mourn',\n\0 \0 \0 \0 \0 \0 \0 \0 \0 \0 \0 \0 \0 \0 \0 \0"); - Play("!eDDR!!CqG!2eGR3qE!!etEA!!FqCsDGDG", + Play("eDDRCqG2eGR3qEetEAFqCsDGDG", "cheer-\0up \0 \0the \0heart\n\0 \0 \0 \0 \0 \0 \0 \0 \0as \0 \0you \0"); - Play("!eDDR!!CqG!2eGR3qE!!etEA!!FqCsDGDG", + Play("eDDRCqG2eGR3qEetEAFqCsDGDG", "hitch-\0up \0 \0the \0cart.\n\0 \0 \0 \0 \0 \0 \0 \0 \0 \0 \0 \0"); } } catch diff --git a/TempleOS/Apps/MusicOrgan/Examples/childish.CPP b/TempleOS/Apps/MusicOrgan/Examples/childish.CPP index 07f418c..ee62adb 100644 --- a/TempleOS/Apps/MusicOrgan/Examples/childish.CPP +++ b/TempleOS/Apps/MusicOrgan/Examples/childish.CPP @@ -7,7 +7,7 @@ U0 Song() music_stacatto_factor= 0.902; try { while (!ScanKey) { - Play("W13qEsCDCDqCDeEGsEBEBeCBsDADA", + Play("3qEsCDCDqCDeEGsEBEBeCBsDADA", "Be \0like \0 \0a \0 \0child \0 \0 \0 \0some \0 \0re\0 \0spect.\n\0 \0 \0 \0 \0 \0"); Play("qEsCDCDqCDeEGsEBEBeCBsDADA", "Ma\0tur\0 \0i\0 \0ty \0 \0 \0 \0don't \0 \0ne\0 \0glect.\n\0 \0 \0 \0 \0 \0"); diff --git a/TempleOS/Apps/MusicOrgan/Examples/compassions.CPP b/TempleOS/Apps/MusicOrgan/Examples/compassions.CPP index 681af72..740974c 100644 --- a/TempleOS/Apps/MusicOrgan/Examples/compassions.CPP +++ b/TempleOS/Apps/MusicOrgan/Examples/compassions.CPP @@ -7,13 +7,13 @@ U0 Song() music_stacatto_factor= 0.902; try { while (!ScanKey) { - Play("W13qBAeEE!qAeA!EDB!2qG3F", + Play("3qBAeEEqAeAEDB2qG3F", "$$FG,RED$$You \0need \0help!\n\0 \0 \0 \0Po\0-o\0-o\0r \0dear.\n\0"); - Play("BAeEE!qAeA!EDB!2qG3F", + Play("BAeEEqAeAEDB2qG3F", "You \0need \0help!\n\0 \0 \0 \0Po\0-o\0-o\0r \0dear.\n$$FG$$\0"); - Play("!4eFG!!qDetF!E!D!eD!EetADEC3G4GqD3G", + Play("4eFGqDetFEDeDEetADEC3G4GqD3G", "Pat\0ron\0ize? \0No, \0 \0thank \0you!\n\0 \0Too \0 \0man\0y \0strings \0a\0ttach\0ed.\n\0"); - Play("!4eFG!!qDetF!E!D!eD!EetADEC3G4GqD3G", + Play("4eFGqDetFEDeDEetADEC3G4GqD3G", "Pat\0ron\0ize? \0No, \0 \0thank \0you!\n\0 \0Too \0 \0man\0y \0strings \0a\0ttach\0ed.\n\0"); } } catch diff --git a/TempleOS/Apps/MusicOrgan/Examples/completed.CPP b/TempleOS/Apps/MusicOrgan/Examples/completed.CPP index 450f5347880003a8c244f327b7793ec95df88ba7..dd944a9dd5b0a4505db95dcf4e138ecc1bc8bb64 100644 GIT binary patch delta 131 zcmbQk{)=tGTWO=z5_e-K=R)^X7pFpJBX{FscSm=}R9ClR_sIf`6U1@L1x@B>Vv|fQ nad&nrbV)67a&vvQ=cmIwn5jLU$*}VpkVemqKTEr^$zy0@$ET8Rh^U7Z)dYr$VPxS4UTu$qmd| MC<2@RF$b~%06^asR{#J2 delta 98 zcmdlga$aP^Iwp~DL*qhsC&yw}7e!YW#X@IyCq>1{dzb>akhnt30V0YnE{aa>ii%E! YPN}Ynj*1}Z$$89KSS2<;VGd*i067#H)c^nh diff --git a/TempleOS/Apps/MusicOrgan/Examples/dream.CPP b/TempleOS/Apps/MusicOrgan/Examples/dream.CPP index 313adf2..cb6ce32 100644 --- a/TempleOS/Apps/MusicOrgan/Examples/dream.CPP +++ b/TempleOS/Apps/MusicOrgan/Examples/dream.CPP @@ -7,13 +7,13 @@ U0 Song() music_stacatto_factor= 0.902; try { while (!ScanKey) { - Play("W13qA!!sDGD!!GqAsCA!CAeCBsFDF!D!!etCGAsAD!A!!D", + Play("3qAsDGDGqAsCACAeCBsFDFDetCGAsADAD", " \0I\0mag\0 \0ine.\n\0 \0 \0 \0 \0 \0 \0 \0 \0 \0 \0 \0 \0 \0 \0 \0 \0 \0 \0"); - Play("qA!!sDGD!!GqAsCA!CAeCBsFDF!D!!etCGAsAD!A!!D", + Play("qAsDGDGqAsCACAeCBsFDFDetCGAsADAD", " \0 \0Fa\0 \0thom.\n\0 \0 \0 \0 \0 \0 \0 \0 \0 \0 \0 \0 \0 \0 \0 \0 \0 \0 \0"); - Play("!!GF!G!!FE!!BE!BeCB2qG3sFAFAqCEA", + Play("GFGFEBEBeCB2qG3sFAFAqCEA", "Hi-\0 \0i-\0gh \0as \0 \0your \0 \0thoughts \0will \0go.\n\0 \0 \0 \0 \0 \0 \0 \0"); - Play("!!sGF!G!!FE!!BE!BeCB2qG3sFAFAqCEA", + Play("sGFGFEBEBeCB2qG3sFAFAqCEA", "Deep \0 \0 \0as \0 \0 \0we \0 \0ought \0to \0know.\n\0 \0 \0 \0 \0 \0 \0 \0"); } } catch diff --git a/TempleOS/Apps/MusicOrgan/Examples/elijah.CPP b/TempleOS/Apps/MusicOrgan/Examples/elijah.CPP index bd01a08091d105211c86031d6451b11a71e3b0aa..c802ec809106ff3bc289a786df5bb0648a69c642 100644 GIT binary patch delta 88 zcmdnf$+)PKal>b3R-;1qRQJihnKLKg-nN UQtam9Hu)DzDsI`$&8(L80FlrhkN^Mx delta 115 zcmZ3~$+)MJal>b3j&MVxLibd6#mR{*vXezwd>BEjLKVf-5+_9$Mb}gpMYlp%C&glC iH)pq0XGKM~LYHDU7ez%kMa9XlSyG8oxH*&6(jEY)9w34M diff --git a/TempleOS/Apps/MusicOrgan/Examples/environeth.CPP b/TempleOS/Apps/MusicOrgan/Examples/environeth.CPP index fca4552..2e6c9d8 100644 --- a/TempleOS/Apps/MusicOrgan/Examples/environeth.CPP +++ b/TempleOS/Apps/MusicOrgan/Examples/environeth.CPP @@ -9,10 +9,10 @@ U0 Song() while (!ScanKey) { "$$FG,GREEN$$To God...$$FG$$\n"; Play("M5/4"); - Play("W13eEqCeEFEDCqBeEqCeEFEDCqB", + Play("3eEqCeEFEDCqBeEqCeEFEDCqB", "Fa\0ther, \0for\0give \0them \0if \0you \0must.\n\0I'd \0like \0to \0see \0them \0turn \0to \0dust.\n\0"); Play("M4/4"); - Play("sGBGBetAF!2G3eEF!sEGEGqDsB!!D!BDGFGF2etG3GB"); + Play("sGBGBetAF2G3eEFsEGEGqDsBDBDGFGF2etG3GB"); } } catch CatchAll; diff --git a/TempleOS/Apps/MusicOrgan/Examples/epicurus.CPP b/TempleOS/Apps/MusicOrgan/Examples/epicurus.CPP index 051eac7..c706bc4 100644 --- a/TempleOS/Apps/MusicOrgan/Examples/epicurus.CPP +++ b/TempleOS/Apps/MusicOrgan/Examples/epicurus.CPP @@ -22,7 +22,7 @@ U0 Song() SetWinHorz(Fs->win_left,Fs->win_right,task); SetWinVert(Fs->win_bottom+3,Fs->win_bottom+15,task); while (!ScanKey) { - Play("W13qBeCDqCAetAACeECsF2G3F2GqG", + Play("3qBeCDqCAetAACeECsF2G3F2GqG", "I'm \0on \0a \0mis\0sion \0from \0 \0 \0my \0 \0God.\n\0 \0 \0 \0 \0"); Play("3BeCDqCAetAACeECsF2G3F2GqG", "I'm \0on \0a \0mis\0sion \0from \0 \0 \0my \0 \0God.\n\0 \0 \0 \0 \0"); diff --git a/TempleOS/Apps/MusicOrgan/Examples/exalt.CPP b/TempleOS/Apps/MusicOrgan/Examples/exalt.CPP index 10c4f7c..5fec839 100644 --- a/TempleOS/Apps/MusicOrgan/Examples/exalt.CPP +++ b/TempleOS/Apps/MusicOrgan/Examples/exalt.CPP @@ -14,6 +14,7 @@ U0 DrawIt(CTask *task,CDC *dc) U0 Song() { SettingsPush; //See $LK,"SettingsPush","MN:SettingsPush"$ + Fs->text_attr=LTCYAN<<4+BLACK; Fs->draw_it=&DrawIt; Fs->task_end_cb=&SndTaskEndCB; diff --git a/TempleOS/Apps/MusicOrgan/Examples/exiled.CPP b/TempleOS/Apps/MusicOrgan/Examples/exiled.CPP index 9f9e266..e08ddcb 100644 --- a/TempleOS/Apps/MusicOrgan/Examples/exiled.CPP +++ b/TempleOS/Apps/MusicOrgan/Examples/exiled.CPP @@ -38,6 +38,7 @@ U0 DrawIt(CTask *,CDC *dc) U0 Song() { SettingsPush; //See $LK,"SettingsPush","MN:SettingsPush"$ + Fs->text_attr=LTCYAN<<4+BLACK; Fs->draw_it=&DrawIt; Fs->task_end_cb=&SndTaskEndCB; MusicSettingsRst; @@ -46,13 +47,13 @@ U0 Song() try { "$$BG+H,LTCYAN$$"; while (!ScanKey) { - Play("W13qE!AA!etF2G3G!qDF!!etFE!D2eG!3G", + Play("3qEAAetF2G3GqDFetFED2eG3G", "A\0dam... \0 \0no \0 \0 \0long\0er \0sees \0Your \0face.\n\0 \0 \0"); - Play("qE!AA!etF2G3G!qDF!!etFE!D2eG!3G", + Play("qEAAetF2G3GqDFetFED2eG3G", "Oh! \0 \0 \0What \0 \0a \0wretch\0ed \0bar\0ren \0waste!\n\0 \0 \0"); - Play("qACFeB!CB2GqG3E!D", + Play("qACFeBCB2GqG3ED", " \0 \0 \0 \0 \0 \0 \0 \0Ex\0iled.\n\0"); - Play("ACFeB!CB2GqG3E!D"); + Play("ACFeBCB2GqG3ED"); } } catch CatchAll; diff --git a/TempleOS/Apps/MusicOrgan/Examples/feigned.CPP b/TempleOS/Apps/MusicOrgan/Examples/feigned.CPP index f1b208e..2e3dca1 100644 --- a/TempleOS/Apps/MusicOrgan/Examples/feigned.CPP +++ b/TempleOS/Apps/MusicOrgan/Examples/feigned.CPP @@ -7,14 +7,14 @@ U0 Song() music_stacatto_factor= 0.857; try { while (!ScanKey) { - Play("W13eEDEFqDDeEDEDqCC", + Play("3eEDEFqDDeEDEDqCC", "$$CL$$Sit\0ting \0in \0a \0church\n\0 \0wond\0ering \0to \0my\0self,\n\0 \0"); Play("eD2G3BCqDsGGGGeD2G3BCqDsGGGG", "\"Is \0 \0God \0 \0real?\"\n\0 \0 \0 \0 \0\"At \0 \0the \0 \0wheel?\"\n\0 \0 \0 \0 \0"); "$$FG,GREEN$$God talking...\n$$FG$$"; - Play("qF!FFetREA!qG!sG!FG!!F!GEGEqC", + Play("qFFFetREAqGsGFGFGEGEqC", "$$FG,RED$$Oh, \0Hell \0yes!\n\0 \0 \0 \0 \0 \0 \0 \0 \0 \0 \0 \0 \0 \0"); - Play("F!FFetREA!qG!sG!FG!!F!GEGEqC", + Play("FFFetREAqGsGFGFGEGEqC", "Pass \0the \0test.$$FG$$\n\0 \0 \0 \0 \0 \0 \0 \0 \0 \0 \0 \0 \0 \0"); } } catch diff --git a/TempleOS/Apps/MusicOrgan/Examples/finger.CPP b/TempleOS/Apps/MusicOrgan/Examples/finger.CPP index 8d948671f0d317ea01f1863d185bfaa4f0018cc0..daf140b1e918c247814de548878b3a2c7d6694c5 100644 GIT binary patch delta 36 rcmew-_fKv^Ig7YUezJ2;YGRQ!mx4lYYDr0EUV3pre!=EGmJeJ209p;a delta 36 rcmew-_fKv^Ig5C3YDr0EUV3pret|WYf`UtavU5&qV$tS4mJeJ22lx%V diff --git a/TempleOS/Apps/MusicOrgan/Examples/first.CPP b/TempleOS/Apps/MusicOrgan/Examples/first.CPP index 9115c426bd758b610e35b63c9565853f8eda992e..170efdb6cb70f0d08fc113284bad008019425513 100644 GIT binary patch delta 11 ScmbQsH5lc6b7Z1xVpF% a1{t{r89N)Lmbg#;&FFz$W^*i4I~xFC?IJ?} delta 138 zcmX>h_(X8RYngCEMdQ>G7ez%QcXxM1V`s-g7e&`pH$`_vXT^zs<0KVvONvi!X7rI# tOm$LpDGW+2admMk3^H;LGImx}G)gUTSDfs~Br^F2qX`}*n;n_j*#Ip+C{+Le diff --git a/TempleOS/Apps/MusicOrgan/Examples/freaks.CPP b/TempleOS/Apps/MusicOrgan/Examples/freaks.CPP index a5911af..4600704 100644 --- a/TempleOS/Apps/MusicOrgan/Examples/freaks.CPP +++ b/TempleOS/Apps/MusicOrgan/Examples/freaks.CPP @@ -7,13 +7,13 @@ U0 Song() music_stacatto_factor= 0.604; try { while (!ScanKey) { - Play("W13sEqAsDeCqAsEqAsDeCqAsDeEqEsE", + Play("3sEqAsDeCqAsEqAsDeCqAsDeEqEsE", "Jes\0us \0kind \0of \0freaks,\n\0Jes\0us \0kind \0of \0freaks,\n\0are \0dif\0ferent \0 \0"); - Play("eDqCsDeCqBsBeBqAetBED!qBeC!B", + Play("eDqCsDeCqBsBeBqAetBEDqBeCB", "from \0 \0oth\0er\n\0 \0 \0peo\0ple.\n\0 \0 \0 \0 \0They \0don't \0"); - Play("2qGeG!3FsCDC!!DqFetB!ACBED!qBeC!B", + Play("2qGeG3FsCDCDqFetBACBEDqBeCB", "care,\n\0for \0God \0 \0is \0their \0 \0joy!\n\0 \0 \0 \0 \0 \0 \0 \0They \0don't \0"); - Play("2qGeG!3FsCDC!!DqFetB!AC", + Play("2qGeG3FsCDCDqFetBAC", "care,\n\0for \0God \0 \0is \0their \0 \0joy!\n\0 \0 \0 \0"); } } catch diff --git a/TempleOS/Apps/MusicOrgan/Examples/free.CPP b/TempleOS/Apps/MusicOrgan/Examples/free.CPP index a81d80a..da68c25 100644 --- a/TempleOS/Apps/MusicOrgan/Examples/free.CPP +++ b/TempleOS/Apps/MusicOrgan/Examples/free.CPP @@ -120,7 +120,7 @@ U0 Song() SettingsPush; //See $LK,"SettingsPush","MN:SettingsPush"$ Preempt(OFF); Init; - Fs->animate_task=Spawn(&AnimateTask,NULL,"Animate",Fs); + Fs->animate_task=Spawn(&AnimateTask,NULL,"Animate",,Fs); Fs->draw_it=&DrawIt; Fs->task_end_cb=&SndTaskEndCB; MusicSettingsRst; @@ -134,13 +134,13 @@ U0 Song() SetWinHorz(Fs->win_left,Fs->win_right,task); SetWinVert(Fs->win_bottom+3,Fs->win_bottom+15,task); while (!ScanKey) { - Play("W13qEEBeBDsBBB!BqDsBFB!!FD2G3D!2G", + Play("3qEEBeBDsBBBBqDsBFBFD2G3D2G", "Free \0will... \0 \0 \0 \0 \0 \0 \0 \0 \0I \0 \0 \0 \0fail.\n\0 \0 \0 \0"); - Play("3qEEBeBDsBBB!BqDsBFB!!FD2G3D!2G", + Play("3qEEBeBDsBBBBqDsBFBFD2G3D2G", "God \0still... \0 \0 \0 \0 \0 \0 \0 \0 \0I \0 \0 \0 \0hail.\n\0 \0 \0 \0"); - Play("3qD2G3eA2G3qCetEC!AqBsA!!C!ACqA", + Play("3qD2G3eA2G3qCetECAqBsACACqA", "All \0things \0work \0for \0good... \0to \0the \0Lord.\n\0 \0 \0 \0 \0 \0 \0"); - Play("D2G3eA2G3qCetEC!AqBsA!!C!ACqA", + Play("D2G3eA2G3qCetECAqBsACACqA", "It's \0all \0good... \0 \0 \0as\0 \0sured.\n\0 \0 \0 \0 \0 \0 \0"); } } catch diff --git a/TempleOS/Apps/MusicOrgan/Examples/furnishing.CPP b/TempleOS/Apps/MusicOrgan/Examples/furnishing.CPP index 6cdf9e0a4ba4b3713be7aa77be4f2f6460fcbfcd..496cc8fe75d119a29b5804d41a0ed4c8ad2364c2 100644 GIT binary patch delta 84 zcmbQK*{`{Qg=I4v3p=BeacYUXi?dOoyK$SQUoy&Ec$0`~cRn7f1jA delta 72 zcmeCzoT<5ig@q~Ha5D=FJEORwacYUXi?dOoyK$B_mOi<=$rm0-UsU@yP?#AwgE|aG+hazz|e`h|y F3IJny6V?C# delta 113 zcmZ24ykB^OIg>)Tp>eUZqN1a-qGPI~Q=wz3n`3H;i<^;qs=KjUp}XSbK&D1%eDW`u frt&HprFF; delta 102 zcmca6{7QI(CKFS*;bcuF4>d(cBX>pPVkdV+Cq;KRXGJ$>CpRaz)DkyEcgJEkcQ-|M X#X@(*$$dWZmEsoku|yp;_AkLnwM diff --git a/TempleOS/Apps/MusicOrgan/Examples/limit.CPP b/TempleOS/Apps/MusicOrgan/Examples/limit.CPP index 640b197087de8c97277eb8f965f47d0b154413cc..087c6a297213fac91920d3abdaaa4e9cf4f57041 100644 GIT binary patch delta 32 ocmdnay_I{zXU53^OtF&>FpE#-V{(}+&muNioLOP>W2P%i0KSn5!~g&Q delta 19 acmdnWy`6i*XGW%Q!^wV3v6};!Qkelq?gm}} diff --git a/TempleOS/Apps/MusicOrgan/Examples/mary.CPP b/TempleOS/Apps/MusicOrgan/Examples/mary.CPP index 73c41d2..4d0e2b1 100644 --- a/TempleOS/Apps/MusicOrgan/Examples/mary.CPP +++ b/TempleOS/Apps/MusicOrgan/Examples/mary.CPP @@ -7,10 +7,10 @@ U0 Song() music_stacatto_factor= 0.538; try { while (!ScanKey) { - Play("W13qEDCDeEEqEeDDqD"); + Play("3qEDCDeEEqEeDDqD"); Play("EDCDeEEqEeDDqD"); - Play("eD!!AsFDF!DqFsFBFB2qG3etBB!BqFC"); - Play("eD!!AsFDF!DqFsFBFB2qG3etBB!BqFC"); + Play("eDAsFDFDqFsFBFB2qG3etBBBqFC"); + Play("eDAsFDFDqFsFBFB2qG3etBBBqFC"); } } catch CatchAll; diff --git a/TempleOS/Apps/MusicOrgan/Examples/mildly.CPP b/TempleOS/Apps/MusicOrgan/Examples/mildly.CPP index adf7358699ff238f1a347d80da7aa808852ce6ad..657caa1433521f56cf8592760c6adec1daf9d30d 100644 GIT binary patch delta 37 scmZ3-cb0F%WJZaS)QXb$#FCOCTjxkeKN}kpZ6_Z`XK(AxJ&cQ30skKikpKVy delta 12 UcmX@hw~lYaWX8>#7-zEr03w_O;s5{u diff --git a/TempleOS/Apps/MusicOrgan/Examples/night.CPP b/TempleOS/Apps/MusicOrgan/Examples/night.CPP index e9efa1bb88058f79ec45051336a3e7e500b80034..7a92c5fccf2f1890a43568c11d6a4d4f241d17e0 100644 GIT binary patch delta 39 ucmbOwwOeY#d}gVV)QXb$#FCOCTPGh!XKx!D6K$Um_aMhe>&-Kmn>Ya&j14US delta 12 TcmdljHA`y4eCEvun5#JfB2EO> diff --git a/TempleOS/Apps/MusicOrgan/Examples/o.CPP b/TempleOS/Apps/MusicOrgan/Examples/o.CPP index 77bc483..468a6cb 100644 --- a/TempleOS/Apps/MusicOrgan/Examples/o.CPP +++ b/TempleOS/Apps/MusicOrgan/Examples/o.CPP @@ -7,10 +7,10 @@ U0 Song() music_stacatto_factor= 0.902; try { while (!ScanKey) { - Play("W13sC!G!CG!!etA!DD2sG!3G2G3G!F!A!!FADD!!DD!qGsB2G3B2G3qG"); - Play("sC!G!CG!!etA!DD2sG!3G2G3G!F!A!!FADD!!DD!qGsB2G3B2G3qG"); - Play("eG!2G3qEeAsA2G3qAsEAEAD!E!!DEqFeA!2G"); - Play("3G!2G3qEeAsA2G3qAsEAEAD!E!!DEqFeA!2G"); + Play("3sCGCGetADD2sG3G2G3GFAFADDDDqGsB2G3B2G3qG"); + Play("sCGCGetADD2sG3G2G3GFAFADDDDqGsB2G3B2G3qG"); + Play("eG2G3qEeAsA2G3qAsEAEADEDEqFeA2G"); + Play("3G2G3qEeAsA2G3qAsEAEADEDEqFeA2G"); } } catch CatchAll; diff --git a/TempleOS/Apps/MusicOrgan/Examples/population.CPP b/TempleOS/Apps/MusicOrgan/Examples/population.CPP index 09620c1..886a1d5 100644 --- a/TempleOS/Apps/MusicOrgan/Examples/population.CPP +++ b/TempleOS/Apps/MusicOrgan/Examples/population.CPP @@ -7,10 +7,10 @@ U0 Song() music_stacatto_factor= 0.780; try { while (!ScanKey) { - Play("W13eCDBCA2FFF3C2F3E2F3A2F3sEEeD"); + Play("3eCDBCA2FFF3C2F3E2F3A2F3sEEeD"); Play("F2FFF3qCeF2F3F2FFF3qCeF2F"); - Play("!3qG!sEAEAqB!etDC!F2qG3D!sGDGDetCRC"); - Play("!qG!sEAEAqB!etDC!F2qG3D!sGDGDetCRC"); + Play("3qGsEAEAqBetDCF2qG3DsGDGDetCRC"); + Play("qGsEAEAqBetDCF2qG3DsGDGDetCRC"); } } catch CatchAll; diff --git a/TempleOS/Apps/MusicOrgan/Examples/prosper.CPP b/TempleOS/Apps/MusicOrgan/Examples/prosper.CPP index 8f5bfea346e10c247ec0a4fd410d7fab1e523c90..15afc9d3060d961ce757a9a9ea57beb4179c64f5 100644 GIT binary patch delta 46 zcmdm|{YZO419NFn>c)ouj8Y}36(#YBB_&0+?m@1uel|8H+L5k4KK|j>n=6>ygaNbw B5TXD8 delta 15 XcmaE)y-#~W!^YzK63`; diff --git a/TempleOS/Apps/MusicOrgan/Examples/psalm.CPP b/TempleOS/Apps/MusicOrgan/Examples/psalm.CPP index fa72396..151d687 100644 --- a/TempleOS/Apps/MusicOrgan/Examples/psalm.CPP +++ b/TempleOS/Apps/MusicOrgan/Examples/psalm.CPP @@ -8,13 +8,13 @@ U0 Song() try { while (!ScanKey) { Play("M5/4"); - Play("W12qGGG3qtCBA2qGGG3qtCetBBqtA", + Play("2qGGG3qtCBA2qGGG3qtCetBBqtA", "Hymn's \0not \0long.\n\0 \0 \0 \0Nor \0this \0song.\n\0 \0 \0 \0 \0"); Play("qEeCCqDqtCBAM4/4", "For\0 \0 \0give!\n\0 \0 \0 \0"); - Play("qD!eA!2G3DG2G3DF!FAC!!2qG3eAE", + Play("qDeA2G3DG2G3DFFAC2qG3eAE", "That's \0 \0 \0all \0 \0I \0 \0say.\n\0 \0 \0 \0 \0 \0 \0"); - Play("qD!eA!2G3DG2G3DF!FAC!!2qG3eAE", + Play("qDeA2G3DG2G3DFFAC2qG3eAE", "This \0 \0 \0I \0 \0 \0 \0pray.\n\0 \0 \0 \0 \0 \0 \0"); } } catch diff --git a/TempleOS/Apps/MusicOrgan/Examples/reposes.CPP b/TempleOS/Apps/MusicOrgan/Examples/reposes.CPP index 43cc569..6b248b2 100644 --- a/TempleOS/Apps/MusicOrgan/Examples/reposes.CPP +++ b/TempleOS/Apps/MusicOrgan/Examples/reposes.CPP @@ -7,13 +7,13 @@ U0 Song() music_stacatto_factor= 0.902; try { while (!ScanKey) { - Play("W13eC2G3DDEDqCeEEGFGFqE", + Play("3eC2G3DDEDqCeEEGFGFqE", "Sit\0ting \0 \0 \0on \0the \0fence,\n\0is \0 \0 \0 \0no \0de\0fence.\n\0"); Play("sFFeGFEFEqDsCCeDCBqBB", "Is \0this \0seat \0 \0 \0tak\0 \0en?\n\0An\0 \0y\0one \0op\0 \0pose?\n\0"); - Play("etB2GG!3qE!2eG3F!EEetFBA!qFDetF!CC", + Play("etB2GG3qE2eG3FEEetFBAqFDetFCC", "Take \0 \0a \0step.\n\0 \0 \0 \0 \0 \0 \0 \0 \0 \0 \0 \0 \0"); - Play("B2GG!3qE!2eG3F!EEetFBA!qFDetF!CC", + Play("B2GG3qE2eG3FEEetFBAqFDetFCC", "Take \0 \0the \0step,\n\0 \0 \0 \0 \0 \0 \0 \0not \0back.\n\0 \0 \0 \0"); } } catch diff --git a/TempleOS/Apps/MusicOrgan/Examples/restless.CPP b/TempleOS/Apps/MusicOrgan/Examples/restless.CPP index b613806..a50c7a8 100644 --- a/TempleOS/Apps/MusicOrgan/Examples/restless.CPP +++ b/TempleOS/Apps/MusicOrgan/Examples/restless.CPP @@ -14,11 +14,11 @@ U0 Song() SetWinHorz(Fs->win_left,Fs->win_right,task); SetWinVert(Fs->win_bottom+3,Fs->win_bottom+15,task); while (!ScanKey) { - Play("W13sDDDACCADDACCAe.DsCCC2G3FD2G3FD2G3CCAe.D", + Play("3sDDDACCADDACCAe.DsCCC2G3FD2G3FD2G3CCAe.D", "I \0 \0 \0 \0got \0 \0 \0paid, \0 \0 \0to\0 \0 \0day.\n\0 \0 \0 \0 \0 \0 \0 \0 \0 \0 \0 \0 \0 \0 \0"); - Play("qD2sG3G2G3G!etGDAeF2GqG3etF!BA!!EACE!CE", + Play("qD2sG3G2G3GetGDAeF2GqG3etFBAEACECE", " \0 \0 \0 \0 \0 \0 \0 \0 \0 \0 \0I \0 \0 \0can't \0 \0 \0get \0 \0to \0"); - Play("qD2sG3G2G3G!etGDAeF2GqG3etF!BA!!EACE!CE", + Play("qD2sG3G2G3GetGDAeF2GqG3etFBAEACECE", "sleep.\n\0 \0 \0 \0 \0 \0 \0 \0 \0 \0 \0 \0 \0 \0 \0 \0 \0 \0 \0 \0"); } } catch diff --git a/TempleOS/Apps/MusicOrgan/Examples/rifled.CPP b/TempleOS/Apps/MusicOrgan/Examples/rifled.CPP index b4f18c9..140842d 100644 --- a/TempleOS/Apps/MusicOrgan/Examples/rifled.CPP +++ b/TempleOS/Apps/MusicOrgan/Examples/rifled.CPP @@ -8,10 +8,10 @@ U0 Song() try { while (!ScanKey) { Play("M9/8"); - Play("W13qAeCBAq.CsAAqAeCBA2q.G3sBC"); + Play("3qAeCBAq.CsAAqAeCBA2q.G3sBC"); Play("qAeDCAhBeFsEEeDq.CM4/4"); - Play("sAFAFeF!!2GsG3B2G!!3BqGeA!sAAetEGDE2G!3DeGsGG"); - Play("AFAFeF!!2GsG3B2G!!3BqGeA!sAAetEGDE2G!3DeGsGG"); + Play("sAFAFeF2GsG3B2G3BqGeAsAAetEGDE2G3DeGsGG"); + Play("AFAFeF2GsG3B2G3BqGeAsAAetEGDE2G3DeGsGG"); } } catch CatchAll; diff --git a/TempleOS/Apps/MusicOrgan/Examples/risen.CPP b/TempleOS/Apps/MusicOrgan/Examples/risen.CPP index 3f09ea9..3ea152c 100644 --- a/TempleOS/Apps/MusicOrgan/Examples/risen.CPP +++ b/TempleOS/Apps/MusicOrgan/Examples/risen.CPP @@ -63,6 +63,7 @@ U0 Song() { I64 i; SettingsPush; //See $LK,"SettingsPush","MN:SettingsPush"$ + Fs->text_attr=LTCYAN<<4+BLACK; Fs->draw_it=&DrawIt; Fs->task_end_cb=&SndTaskEndCB; MusicSettingsRst; @@ -73,10 +74,10 @@ U0 Song() by[i]=RANGE*RandI16/RANGE; } try { - "$$BG+H,LTCYAN$$$$FD+H,BLACK$$"; + "$$BG+H,LTCYAN$$"; while (!ScanKey) { t0=tMBeat; - Play("W13eDEqFFetEEFqDeCDDEetCGF"); + Play("3eDEqFFetEEFqDeCDDEetCGF"); Play("eDEqFFetEEFqDeCDDEetCGF"); Play("eDCqDEeAAetEEFEDGBDCqF"); Play("eDCqDEeAAetEEFEDGBDCqF"); diff --git a/TempleOS/Apps/MusicOrgan/Examples/satisfaction.CPP b/TempleOS/Apps/MusicOrgan/Examples/satisfaction.CPP index 60a52387c313f70b9e90995a848a51ea531d3a72..1f6686d3e1653d61c3d3270fbba91b97d79857b5 100644 GIT binary patch delta 12 TcmbO!GF@atI@{(win_left,Fs->win_right,task); SetWinVert(Fs->win_bottom+3,Fs->win_bottom+15,task); while (!ScanKey) { - Play("W13hDeDA2qG3hDeD2GqF", + Play("3hDeDA2qG3hDeD2GqF", "It \0sig\0ni\0fies\n\0a \0big \0sur\0prise.\n\0"); Play("3hDeD2sFG3qAhDeDA2qG", "Why \0 \0im\0pro\0vise?\n\0$$FG,RED$$\"Be\0cause,\"$$FG$$ \0re\0plies.\n\0"); - Play("3eC!!EsACACeD2G3qA!AFeE2G!3etFCC", + Play("3eCEsACACeD2G3qAAFeE2G3etFCC", "If \0 \0you \0 \0 \0 \0love \0your \0god,\n\0 \0don't \0bore \0 \0Him!\n\0 \0 \0"); - Play("eC!!EsACACeD2G3qA!AFeE2G!3etFCC", + Play("eCEsACACeD2G3qAAFeE2G3etFCC", "If \0 \0you \0 \0 \0 \0love \0your \0god,\n\0 \0sur\0prise \0 \0Him!\n\0 \0 \0"); } } catch diff --git a/TempleOS/Apps/MusicOrgan/Examples/silver.CPP b/TempleOS/Apps/MusicOrgan/Examples/silver.CPP index 0c815f8..7c6e7f0 100644 --- a/TempleOS/Apps/MusicOrgan/Examples/silver.CPP +++ b/TempleOS/Apps/MusicOrgan/Examples/silver.CPP @@ -8,13 +8,13 @@ U0 Song() music_stacatto_factor= 0.902; try { while (!ScanKey) { - Play("W13qF!2GsGG!!GG3GFG!FqAeD!2G!3etDBEsFCFC", + Play("3qF2GsGGGG3GFGFqAeD2G3etDBEsFCFC", "Love \0 \0 \0 \0 \0 \0ev\0 \0ery \0 \0sec\0ond.\n\0 \0 \0 \0 \0 \0 \0 \0 \0"); - Play("qF!2GsGG!!GG3GFG!FqAeD!2G!3etDBEsFCFC", + Play("qF2GsGGGG3GFGFqAeD2G3etDBEsFCFC", "World -- \0 \0 \0 \0 \0 \0all \0 \0that \0 \0beck\0ons.\n\0 \0 \0 \0 \0 \0 \0 \0 \0"); - Play("qBG!!FsEAEAqEFGeF!C", + Play("qBGFsEAEAqEFGeFC", " \0Life \0is \0too \0 \0 \0 \0prec\0i\0ous.\n\0 \0 \0"); - Play("qBG!!FsEAEAqEFGeF!C", + Play("qBGFsEAEAqEFGeFC", " \0Can \0be \0 \0 \0 \0 \0worr\0i\0ous.\n\0 \0 \0"); } } catch diff --git a/TempleOS/Apps/MusicOrgan/Examples/teachings.CPP b/TempleOS/Apps/MusicOrgan/Examples/teachings.CPP index a5ba030..b519cfe 100644 --- a/TempleOS/Apps/MusicOrgan/Examples/teachings.CPP +++ b/TempleOS/Apps/MusicOrgan/Examples/teachings.CPP @@ -15,13 +15,13 @@ U0 Song() SetWinHorz(Fs->win_left,Fs->win_right,task); SetWinVert(Fs->win_bottom+3,Fs->win_bottom+15,task); while (!ScanKey) { - Play("W12eG3CD!AqE!!sACACG!EGEqDsAAA!AetCDD", + Play("2eG3CDAqEsACACGEGEqDsAAAAetCDD", "Ple\0ase \0te\0ach \0me.\n\0 \0 \0 \0 \0 \0 \0 \0 \0 \0 \0 \0 \0 \0 \0 \0 \0"); - Play("2eG3CD!AqE!!sACACG!EGEqDsAAA!AetCDD", + Play("2eG3CDAqEsACACGEGEqDsAAAAetCDD", "Wa\0ter \0thi\0s \0tree.\n\0 \0 \0 \0 \0 \0 \0 \0 \0 \0 \0 \0 \0 \0 \0 \0 \0"); - Play("2qG!G3eEBqAGeFE!!sF!GFG!etD!BD", + Play("2qGG3eEBqAGeFEsFGFGetDBD", " \0 \0$$FG,RED$$I \0will \0teach \0thee.\n\0 \0 \0 \0 \0 \0 \0 \0 \0 \0"); - Play("2qG!G3eEBqAGeFE!!sF!GFG!etD!BD", + Play("2qGG3eEBqAGeFEsFGFGetDBD", " \0 \0Wat\0er \0that \0tree.$$FG$$\n\0 \0 \0 \0 \0 \0 \0 \0 \0 \0"); } } catch diff --git a/TempleOS/Apps/MusicOrgan/Examples/thereupon.CPP b/TempleOS/Apps/MusicOrgan/Examples/thereupon.CPP index 8a6c94d..e997d68 100644 --- a/TempleOS/Apps/MusicOrgan/Examples/thereupon.CPP +++ b/TempleOS/Apps/MusicOrgan/Examples/thereupon.CPP @@ -30,6 +30,7 @@ U0 Song() I64 i; CTask *task; SettingsPush; //See $LK,"SettingsPush","MN:SettingsPush"$ + Fs->text_attr=LTCYAN<<4+BLACK; Fs->draw_it=&DrawIt; Fs->task_end_cb=&SndTaskEndCB; MusicSettingsRst; @@ -52,17 +53,17 @@ U0 Song() TaskWait(task); SetWinHorz(Fs->win_left,Fs->win_right,task); SetWinVert(Fs->win_bottom+3,Fs->win_bottom+15,task); - "$$BD+H,LTCYAN$$$$FD+H,BLACK$$"; + "$$BG+H,LTCYAN$$$$FG+H,BLACK$$"; while (!ScanKey) { - Play("W12qG3eCB2hGqG3eCB2qG3A", + Play("2qG3eCB2hGqG3eCB2qG3A", "Umm... \0God?\n\0 \0 \0Let \0Your \0 \0 \0 \0"); Play("CeBA2G3DqEeDCBA2qG3A", "face \0shine \0on \0down\n\0on \0us, \0Your \0 \0luck\0y \0 \0peo\0"); - Play("eBA2h.G3qE!!CAF", + Play("eBA2h.G3qECAF", " \0ple.\n\0 \0Fath\0e\0r \0a\0"); - Play("FD!A!eEDqE!!CAF", + Play("FDAeEDqECAF", "bove,\n\0 \0 \0I \0 \0feel \0 \0 \0Your \0"); - Play("FD!A!eED", + Play("FDAeED", "love.\n\0 \0 \0 \0 \0"); } } catch diff --git a/TempleOS/Apps/MusicOrgan/Examples/thither.CPP b/TempleOS/Apps/MusicOrgan/Examples/thither.CPP index ee38d04..d56ca9f 100644 --- a/TempleOS/Apps/MusicOrgan/Examples/thither.CPP +++ b/TempleOS/Apps/MusicOrgan/Examples/thither.CPP @@ -7,13 +7,13 @@ U0 Song() music_stacatto_factor= 0.902; try { while (!ScanKey) { - Play("W13sC#C#D#D#C#C#CCC#C#D#D#C#C#CCEEDDC#C#DDEEDDC#C#DD", + Play("3sC#C#D#D#C#C#CCC#C#D#D#C#C#CCEEDDC#C#DDEEDDC#C#DD", "Still \0 \0 \0 \0there.\n\0 \0 \0 \0Still \0 \0 \0 \0there.\n\0 \0 \0 \0Not \0 \0 \0 \0fair.\n\0 \0 \0 \0Not \0 \0 \0 \0fair.\n\0 \0 \0 \0"); Play("C#C#D#D#C#C#CCC#C#D#D#C#C#CCEEDDC#C#DDEEDDC#C#DD", "Un\0 \0 \0 \0aware!\n\0 \0 \0 \0Un\0 \0 \0 \0aware!\n\0 \0 \0 \0Every\0 \0 \0 \0where!\n\0 \0 \0 \0Every\0 \0 \0 \0where!\n\0 \0 \0 \0"); - Play("eB!!DetFGAeF!EBE!etE!FEqCeFEDA", + Play("eBDetFGAeFEBEetEFEqCeFEDA", "$$FG,RED$$Running \0 \0 \0a\0way \0 \0 \0 \0 \0 \0from \0the \0Lord \0won't \0 \0work.\n\0 \0"); - Play("B!!DetFGAeF!EBE!etE!FEqCeFEDA", + Play("BDetFGAeFEBEetEFEqCeFEDA", "Running \0 \0 \0a\0way \0 \0 \0 \0 \0 \0from \0the \0Lord \0won't \0 \0work.$$FG$$\n\0 \0"); } } catch diff --git a/TempleOS/Apps/MusicOrgan/Examples/twins.CPP b/TempleOS/Apps/MusicOrgan/Examples/twins.CPP index 00b7f02..57b8930 100644 --- a/TempleOS/Apps/MusicOrgan/Examples/twins.CPP +++ b/TempleOS/Apps/MusicOrgan/Examples/twins.CPP @@ -8,7 +8,7 @@ U0 Song() try { while (!ScanKey) { "$$FG,GREEN$$As I look back on my sinful past...$$FG$$\n"; - Play("W13qCAABAeAECEqB", + Play("3qCAABAeAECEqB", "Who \0was \0that \0per\0son? \0 \0It \0wasn't \0 \0me?\n\0"); Play("CAABAeAECEqB", "Who \0was \0that \0per\0son? \0 \0It \0wasn't \0 \0me?\n\0"); diff --git a/TempleOS/Apps/MusicOrgan/Examples/verses.CPP b/TempleOS/Apps/MusicOrgan/Examples/verses.CPP index cc5b558..662160f 100644 --- a/TempleOS/Apps/MusicOrgan/Examples/verses.CPP +++ b/TempleOS/Apps/MusicOrgan/Examples/verses.CPP @@ -16,7 +16,7 @@ U0 PutVerse() U8 *ch; I64 *start; - "$$CL$$"; + DocClear; start=GetTimeStamp/16%size; if (start>size-LEN) start=size-LEN; ch=bible[start+LEN-1]; @@ -38,12 +38,12 @@ U0 Song() "$$WW,1$$This shows a random passage based on " "the time at the moment this song was run. " "Talk to God as an offering, then run $MA+A-X+PU,"AfterEgypt","Cd(\"::/TempleOS/Apps/AfterEgypt\");;#include \"Run\"\\n"$ if you " - "want God to talk some more. The $LK,"Holy Spirit","FI:::/TempleOS/Apps/HolySpirit/HSNotes.TXT"$ can " + "want God to talk some more. The $LK+PU,"Holy Spirit","FI:::/TempleOS/Apps/HolySpirit/HSNotes.TXT"$ can " "puppet you.\n"); TaskWait(task); SetWinHorz(Fs->win_left,Fs->win_right,task); SetWinVert(Fs->win_bottom+3,Fs->win_bottom+15,task); - DocRecalc(DocCur(task)); //Reformat word-wrap with new window size. + DocRecalc(DocPut(task)); //Reformat word-wrap with new window size. while (!ScanKey) { PutVerse; Play("3qAeABCBqCetABBqCetAAREE2G"); diff --git a/TempleOS/Apps/MusicOrgan/Examples/villa.CPP b/TempleOS/Apps/MusicOrgan/Examples/villa.CPP index 8fe51a7..1b6d738 100644 --- a/TempleOS/Apps/MusicOrgan/Examples/villa.CPP +++ b/TempleOS/Apps/MusicOrgan/Examples/villa.CPP @@ -7,12 +7,12 @@ U0 Song() music_stacatto_factor= 0.902; try { while (!ScanKey) { - Play("W14etEEEqBetDDqtDqBetCCqtCqBhB"); + Play("4etEEEqBetDDqtDqBetCCqtCqBhB"); Play("etEEEqBetDDqtDqBetCCqtCqBhB"); Play("etABCqDetBCCqDetDCBqAhA"); Play("etABCqDetBCCqDetDCBqAhA"); - Play("!qAetC!!AEsG!!CGCetBC3G4ADAqAGetDAD"); - Play("!qAetC!!AEsG!!CGCetBC3G4ADAqAGetDAD"); + Play("qAetCAEsGCGCetBC3G4ADAqAGetDAD"); + Play("qAetCAEsGCGCetBC3G4ADAqAGetDAD"); } } catch CatchAll; diff --git a/TempleOS/Apps/MusicOrgan/Examples/worship.CPP b/TempleOS/Apps/MusicOrgan/Examples/worship.CPP index 06991a7..cdc8351 100644 --- a/TempleOS/Apps/MusicOrgan/Examples/worship.CPP +++ b/TempleOS/Apps/MusicOrgan/Examples/worship.CPP @@ -7,12 +7,12 @@ U0 Song() music_stacatto_factor= 0.902; try { while (!ScanKey) { - Play("W13qEDeCC!etEAAqEetCDCA!!GFqG", + Play("3qEDeCCetEAAqEetCDCAGFqG", "I \0don't \0know \0 \0 \0 \0 \0 \0 \0 \0what \0 \0to \0 \0pray.\n\0"); - Play("EDeCC!etEAAqEetCDCA!!GFqG"); - Play("eGEetFDAqF!sGF!GF!G!!FG!F!etBGFqGeDE", + Play("EDeCCetEAAqEetCDCAGFqG"); + Play("eGEetFDAqFsGFGFGFGFetBGFqGeDE", "It's \0a \0blah \0 \0 \0day.\n\0 \0 \0 \0 \0 \0 \0 \0 \0 \0 \0 \0 \0 \0 \0"); - Play("GEetFDAqF!sGF!GF!G!!FG!F!etBGFqGeDE"); + Play("GEetFDAqFsGFGFGFGFetBGFqGeDE"); } } catch CatchAll; diff --git a/TempleOS/Apps/MusicOrgan/Examples/you.CPP b/TempleOS/Apps/MusicOrgan/Examples/you.CPP index e0e1910..0b9a286 100644 --- a/TempleOS/Apps/MusicOrgan/Examples/you.CPP +++ b/TempleOS/Apps/MusicOrgan/Examples/you.CPP @@ -8,14 +8,14 @@ U0 Song() try { while (!ScanKey) { DocClear; - Play("W13qDsCCCCeBBCCqDsCCCCeBBCC", + Play("3qDsCCCCeBBCCqDsCCCCeBBCC", "I'm \0 \0 \0 \0 \0on \0my \0way.\n\0 \0Got \0a \0 \0 \0 \0bus\0y \0day.\n\0 \0"); Play("sBBBBeAAsBA2G3AqAsBBBBeAAsBA2G3AqA", "Woe, \0 \0 \0 \0I \0for\0got \0 \0to \0 \0pray.\n\0What's \0 \0 \0 \0God \0 \0have \0 \0to \0 \0say?\n\0"); "$$FG,GREEN$$God talking...\n$$FG$$"; - Play("AeB2G3GGqE2etG3F!B!eFGqFeEC", + Play("AeB2G3GGqE2etG3FBeFGqFeEC", "$$FG,RED$$Oh, \0 \0 \0hi-\0a \0you!\n\0What\0ch\0u \0been \0 \0do\0ing?\n\0 \0"); - Play("qAeB2G3GGqE2etG3F!B!eFGqFeEC", + Play("qAeB2G3GGqE2etG3FBeFGqFeEC", "Oh, \0 \0 \0hi-\0a \0you!\n\0What\0ch\0u \0been \0 \0do\0ing?$$FG$$\n\0 \0"); } } catch diff --git a/TempleOS/Apps/MusicOrgan/Help.TXT b/TempleOS/Apps/MusicOrgan/Help.TXT index 36223c2..46c9dd9 100644 --- a/TempleOS/Apps/MusicOrgan/Help.TXT +++ b/TempleOS/Apps/MusicOrgan/Help.TXT @@ -4,9 +4,9 @@ $WW,1$$FG,5$$TX+CX,"Music Organ Help"$$FG$ * The clipboard can be used to cut and paste. -* $FG,2$MusicOrgan$FG$ uses $FG,2$C+$FG$ files as it's fmt! See $LK-A,"::/TempleOS/Apps/MusicOrgan/Examples/personal.CPP"$. It does not fully parse them when loading back in, so changes made outside $FG,2$MusicOrgan$FG$ can be lost. +* $FG,2$MusicOrgan$FG$ uses $LK,"Holy C","FI:::/TempleOS/Doc/HolyC.TXT"$ files as it's fmt! See $LK-A,"::/TempleOS/Apps/MusicOrgan/Examples/personal.CPP"$. It does not fully parse them when loading back in, so changes made outside $FG,2$MusicOrgan$FG$ can be lost. -* The first line of the $FG,2$C+$FG$ files has a comment with a category recognized by $LK,"JukeBox","FF:::/TempleOS/Apps/MusicOrgan/JukeBox.CPP,JukeBox"$(). The categories are $FG,2$"no nothing"$FG$, $FG,2$"has words"$FG$, $FG,2$"has graphics"$FG$, or $FG,2$"special"$FG$. The third character in the comment is a digit rating number. +* The first line of the $LK,"Holy C","FI:::/TempleOS/Doc/HolyC.TXT"$ files has a comment with a category recognized by $LK,"JukeBox","FF:::/TempleOS/Apps/MusicOrgan/JukeBox.CPP,JukeBox"$(). The categories are $FG,2$"no nothing"$FG$, $FG,2$"has words"$FG$, $FG,2$"has graphics"$FG$, or $FG,2$"special"$FG$. The third character in the comment is a digit rating number. * You can take the $LK,"Play","MN:Play"$() statements out of a song file and place them in your programs. You can also add a song to a document with $FG,2$$FG$, but you should do it after pressing $FG,2$$FG$ because the clipboard-insert in $FG,2$$FG$ is screwy. See this $SO,"","2qG3ECB2eGG3qCeFDsBGBG2qG3ECB2eGG3qCeFDsBGBGqEeEFqEB2eG3FetCAGqFCEeEFqEB2eG3FetCAGqFC"$ after pressing $FG,2$$FG$, now. @@ -22,5 +22,5 @@ $FG,5$U0 CtrlAltR(I64) SetCtrlAltLetCB('R',&CtrlAltR,"Toggle snd_record");$FG$ -* The note accent feature only works when exporting songs. When calling $LK,"SndFileCreate","MN:SndFileCreate"$() you can set a waveform. The PC speaker is $LK,"WF_SQUARE","MN:WF_SQUARE"$. You can select reverb and averaging, also. +* When calling $LK,"SndFileCreate","MN:SndFileCreate"$() you can set a waveform. The PC speaker is $LK,"WF_SQUARE","MN:WF_SQUARE"$. You can select reverb and averaging, also. diff --git a/TempleOS/Apps/MusicOrgan/JukeBox.CPP b/TempleOS/Apps/MusicOrgan/JukeBox.CPP index 53da4dd..9a18493 100644 --- a/TempleOS/Apps/MusicOrgan/JukeBox.CPP +++ b/TempleOS/Apps/MusicOrgan/JukeBox.CPP @@ -1,15 +1,15 @@ CTask *SingleSong(U8 *msg,U8 *name) { Bool old_preempt=Preempt(OFF); - CTask *task=Spawn(&ServantUserCmdLine,NULL,name,Fs); - LBts(&task->task_flags,TASKf_LOCK_TITLE); + CTask *task=Spawn(&SrvUserCmdLine,NULL,name,,Fs); StrCpy(task->task_title,name); - TaskRqstQue(task,Fs,";",1<title_src=TTS_LOCKED_CONST; + TaskExeStrQue(task,Fs,";",1<win_left,task->win_left+50,task); SetWinVert(2,2+8,task); Preempt(old_preempt); - TaskRqstQue(task,NULL,msg,1<max_entries=100; + TaskExeStrQue(task,NULL,msg,1<max_entries=100; return task; } @@ -93,15 +93,15 @@ public U0 JukeBox(U8 *dirname=NULL,U8 **_filename=NULL) if ('0'<=doc_e->tag[2]<='9') rating=doc_e->tag[2]; if (StrStr(doc_e->tag,"incomplete")) - DocPutS(doc,"$$FM,BLACK$$"); + DocPutS(doc,"$$FG,BLACK$$"); else if (StrStr(doc_e->tag,"has graphics")) - DocPutS(doc,"$$FM,GREEN$$"); + DocPutS(doc,"$$FG,GREEN$$"); else if (StrStr(doc_e->tag,"has words")) - DocPutS(doc,"$$FM,BLUE$$"); + DocPutS(doc,"$$FG,BLUE$$"); else if (StrStr(doc_e->tag,"special")) - DocPutS(doc,"$$FM,CYAN$$"); + DocPutS(doc,"$$FG,CYAN$$"); else if (StrStr(doc_e->tag,"no nothing")) { - DocPutS(doc,"$$FM,RED$$"); + DocPutS(doc,"$$FG,RED$$"); if (FileOcc("\\0",tempm1->full_name,"")) { s->cur_entry=doc_e->next; s->cur_data_col=0; @@ -118,7 +118,7 @@ public U0 JukeBox(U8 *dirname=NULL,U8 **_filename=NULL) } tempm1=tempm1->next; } - DocPrintF(doc,"\n$$FM,CYAN$$$$MU-UL,\"DONE\",%d$$\n",DOCM_CANCEL); + DocPrintF(doc,"\n$$FG,CYAN$$$$MU-UL,\"DONE\",%d$$\n",DOCM_CANCEL); while (TRUE) { if (_filename) tempm1=PopUpMenu(doc,DOF_INTERCEPT_TASK_END); diff --git a/TempleOS/Apps/MusicOrgan/MakeSong.CPP b/TempleOS/Apps/MusicOrgan/MakeSong.CPP index ba59cc4..080053b 100644 --- a/TempleOS/Apps/MusicOrgan/MakeSong.CPP +++ b/TempleOS/Apps/MusicOrgan/MakeSong.CPP @@ -4,9 +4,8 @@ class MakeSongSettings Bool normal_rhythms fmtstr "$$CB,\"Normal Rhythms\"$$\n"; Bool complex_rhythms fmtstr "$$CB,\"Complex Rhythms\"$$\n"; Bool rests fmtstr "$$CB,\"Rests\"$$\n"; - Bool change_waveforms fmtstr "$$CB,\"Change Waveforms\"$$\n"; Bool six_eight fmtstr "$$CB,\"Six Eight\"$$\n"; - I64 octave fmtstr "$$DA-T,32,\"Octave:%d\"$$\n"; + I64 octave fmtstr "$$DA-T,32,\"Octave:%d\"$$\n"; }; U0 InsNote(MakeSongSettings *mss,U8 *buf,I64 k,I64 *j) @@ -60,14 +59,12 @@ U8 *MakeSong() { MakeSongSettings mss; U8 *buf; - I64 i,j=0,k,n,k2,duration,last_duration=-1, - wf[2],w=0,len; + I64 i,j=0,k,n,k2,duration,last_duration=-1,len; mss.simple_rhythms=FALSE; mss.normal_rhythms=TRUE; mss.complex_rhythms=FALSE; mss.rests=FALSE; - mss.change_waveforms=FALSE; mss.octave=music_octave; if (!PopUpForm(&mss,"MakeSongSettings")) @@ -81,18 +78,6 @@ U8 *MakeSong() else progress4_max=8; - n=TimerPickedNi$WW,0$bble/2; - if (WF_NULLdraw_it() for the staff region, drawn every refresh. - 3) The gr_dc2 persistent layer for the note chooser, meter chooser. The persistent layer is used during drag-and-drop. + 3) The gr_dc persistent layer for the note chooser, meter chooser. The persistent layer is used during drag-and-drop. 4) The Fs->next_ctrl for the tempo/stacatto sliders. @@ -60,7 +60,7 @@ class OrgNote I64 octave; I64 meter_bottom; } - I64 duration,accent,width,waveform; + I64 duration,width; U8 ascii[32]; }; @@ -143,16 +143,10 @@ U8 org_note_inverse_map[7]={10,8,7,5,3,2,0}; $SP,"<15>",15$ + + $SP,"<16>",16$ - - $SP,"<17>",17$ - - - - - $SP,"<18>",18$ - #define ORG_NOTE_SPACING 9 #define ORG_NUM_DURATIONS 12 @@ -349,9 +343,9 @@ U0 DrawNote(CDC *dc,I64 x,I64 y,I64 duration) if (0<=duration<=ORG_NUM_DURATIONS) { SpritePlot3(dc,x,y,0,org_duration_imgs[duration]); if (org_triplet_durations[duration]) - SpritePlot3(dc,x,y,0,$IB,"<18>",18$); + SpritePlot3(dc,x,y,0,$IB,"<16>",16$); if (OrgIsDotted(duration)) - SpritePlot3(dc,x,y,0,$IB,"<19>",19$); + SpritePlot3(dc,x,y,0,$IB,"<15>",15$); } } @@ -416,18 +410,13 @@ U0 DrawIt(CTask *task,CDC *dc) if (OrgHasWords(tempo->word)) dc->color=GREEN; } - if (tempo->accent==1) - SpritePlot3(dc,x,y,0,$IB,"<20>",20$); - else if (tempo->accent==2) - SpritePlot3(dc,x,y,0,$IB,"<21>",21$); DrawNote(dc,x,y,tempo->duration); if (OrgIsDotted(tempo->duration)) x+=ORG_NOTE_SPACING/2; - if (Bt(&tempo->flags,Of_SHARP)) - SpritePlot3(dc,x,y,0,$IB,"<22>",22$); + SpritePlot3(dc,x,y,0,$IB,"<13>",13$); else if (Bt(&tempo->flags,Of_FLAT)) - SpritePlot3(dc,x,y,0,$IB,"<23>",23$); + SpritePlot3(dc,x,y,0,$IB,"<14>",14$); measure_left-=org_durations[tempo->duration]; } tempo=tempo->next; @@ -437,7 +426,7 @@ U0 DrawIt(CTask *task,CDC *dc) dc->color=BROWN; else dc->color=BLACK; - SpritePlot3(dc,oc.root.x,50,0,$IB,"<24>",24$); + SpritePlot3(dc,oc.root.x,50,0,$IB,"<12>",12$); Preempt(old_preempt); } @@ -456,7 +445,7 @@ F64 PopUpDuration() { I64 i; CDoc *doc=DocNew; - DocPutS(doc,"$$FM,GREEN$$$$MU,\"Set Word\",ORGR_SET_WORD$$\n" + DocPutS(doc,"$$FG,GREEN$$$$MU,\"Set Word\",ORGR_SET_WORD$$\n" "$$MU,\"Toggle Sharp\",ORGR_SHARP$$\n" "$$MU,\"Toggle Flat\",ORGR_FLAT$$\n" "$$MU,\"Toggle Tie\",ORGR_TIE$$\n" @@ -479,7 +468,7 @@ U0 OrgRightClick(I64 x,I64 y) U8 *st,*st2; OrgNote *tempo,*tempo1; I64 i,old_doc_flags; - if (DocCur) old_doc_flags=DocCur->flags; + if (DocPut) old_doc_flags=DocPut->flags; oc.cur_note=tempo=OrgFindNote(x,y); if (tempo!=&oc.root) { Fs->win_inhibit=0; @@ -493,8 +482,6 @@ U0 OrgRightClick(I64 x,I64 y) if (tempo->type==OT_NOTE) { tempo->octave=OCTAVE_REST; tempo->note=NOTE_REST; - tempo->accent=0; - tempo->waveform=WF_SQUARE; } break; case ORGR_SHARP: @@ -537,7 +524,7 @@ U0 OrgRightClick(I64 x,I64 y) break; case ORGR_SET_WORD: if (tempo->type==OT_NOTE) { - if (DocCur) DocCur->flags&=~DOCF_FORM; + if (DocPut) DocPut->flags&=~DOCF_FORM; if (OrgHasWords(tempo->word)) st2=MSPrintF("\nWord(\"%Q\"):",tempo->word); else @@ -551,7 +538,7 @@ U0 OrgRightClick(I64 x,I64 y) Free(st); } else tempo->word=StrNew(" "); - if (DocCur) DocCur->flags=DocCur->flags&~DOCF_FORM|old_doc_flags&DOCF_FORM; + if (DocPut) DocPut->flags=DocPut->flags&~DOCF_FORM|old_doc_flags&DOCF_FORM; } break; case ORGR_INS_NOTE: @@ -563,18 +550,6 @@ U0 OrgRightClick(I64 x,I64 y) QueRem(tempo); OrgNoteDel(tempo); break; - case ORGR_NO_ACCENT: - if (tempo->type==OT_NOTE && tempo->octave!=OCTAVE_REST) - tempo->accent=0; - break; - case ORGR_ACCENT: - if (tempo->type==OT_NOTE && tempo->octave!=OCTAVE_REST) - tempo->accent=1; - break; - case ORGR_STRONG_ACCENT: - if (tempo->type==OT_NOTE && tempo->octave!=OCTAVE_REST) - tempo->accent=2; - break; } } OrgSetWidth(oc.cur_note); @@ -631,16 +606,16 @@ U0 DrawPickNoteBox() U0 DrawPickTools() { if (oc.tool==OTT_BOX_TOOL) - oc.dc2->color=ROPF_DITHER+WHITE<<16+ROP_EQU+RED; + oc.dc2->color=ROPF_DITHER+WHITE<<16+RED; else - oc.dc2->color=ROPF_DITHER+WHITE<<16+ROP_EQU+BLACK; + oc.dc2->color=ROPF_DITHER+WHITE<<16+BLACK; GrLineRect4(oc.dc2,ORG_TOOLS_X,ORG_TOOLS_Y, ORG_TOOLS_X+10,ORG_TOOLS_Y+10); if (oc.tool==OTT_PTR_TOOL) - oc.dc2->color=ROP_EQU+RED; + oc.dc2->color=RED; else - oc.dc2->color=ROP_EQU+BLACK; + oc.dc2->color=BLACK; (*fp_draw_input_ptr)(oc.dc2,ORG_TOOLS_X+15,ORG_TOOLS_Y); oc.dc2->color=BLACK; } @@ -728,7 +703,6 @@ U0 OrgLeftClickPickNoteBox(I64 duration) tempo->note=n; tempo->octave=o; tempo->duration=duration; - tempo->waveform=tempo1->waveform; OrgSetWidth(tempo); QueIns(tempo,tempo1); oc.cur_note=tempo->next; @@ -758,7 +732,6 @@ U0 OrgLeftClickPickMeterBox(I64 top,I64 bottom) tempo->type=OT_METER; tempo->meter_top=top; tempo->meter_bottom=bottom; - tempo->waveform=tempo1->waveform; OrgSetWidth(tempo); QueIns(tempo,tempo1); oc.cur_note=tempo->next; @@ -769,14 +742,12 @@ U0 OrgLeftClickPickMeterBox(I64 top,I64 bottom) U0 OrgLeftClickStaffPtr(I64 x,I64 y) { OrgNote *tempo,*tempo1; - I64 o,n,msg_code,p1,p2,n_original,o_original,a_original,wf_original; + I64 o,n,msg_code,p1,p2,n_original,o_original; oc.cur_note=tempo=OrgFindNote(x,y); if (tempo!=&oc.root) { if (tempo->type==OT_NOTE) { n_original=tempo->note; o_original=tempo->octave; - a_original=tempo->accent; - wf_original=tempo->waveform; do { msg_code=GetMsg(&p1,&p2,1<word=NULL; tempo->note=n_original; tempo->octave=o_original; - tempo->accent=a_original; - tempo->waveform=wf_original; } } else { move_note: @@ -818,7 +787,7 @@ U0 OrgLeftClickStaffBox(I64 x,I64 y) do { msg_code=GetMsg(&p1,&p2,1<color=ROPF_DITHER+WHITE<<16+ROP_EQU+BLACK; + oc.dc2->color=ROPF_DITHER+WHITE<<16+BLACK; GrLineRect4(oc.dc2,x,y,p1,p2); if (msg_code==MSG_IP_L_UP) { if (x>p1) SwapU64(&x,&p1); @@ -866,7 +835,7 @@ U0 OrgPlayTask(I64) case ORGPM_NORMAL: if (org_play_f!=f) { f=org_play_f; - Snd(f,music_waveform); + Snd(f); } break; case ORGPM_REVERB1: @@ -877,9 +846,9 @@ U0 OrgPlayTask(I64) } if (!(i&15)) { if (i&16) - Snd(f,music_waveform); + Snd(f); else - Snd(f2,music_waveform); + Snd(f2); } break; } @@ -932,15 +901,13 @@ U8 *OrgMusicSetNoteLen(U8 *st,F64 *org_duration) U0 OrgLoadSongStr(U8 *st,I64 *org_octave,F64 *org_duration) { OrgNote *tempo,*tempo1; - I64 note,i=0,waveform=WF_SQUARE; + I64 note,i=0; while (*st) { tempo=CAlloc(sizeof(OrgNote)); - tempo->waveform=WF_SQUARE; while (*st && !('A'<=*st<='G') && *st!='R') { if (*st=='M') { tempo1=CAlloc(sizeof(OrgNote)); tempo1->type=OT_METER; - tempo1->waveform=tempo->waveform; st++; if ('1'<=*st<='9') tempo1->meter_top=*st++-'0'; @@ -955,15 +922,6 @@ U0 OrgLoadSongStr(U8 *st,I64 *org_octave,F64 *org_duration) OrgSetWidth(tempo1); QueIns(tempo1,oc.root.last); } - if (*st=='W') { - st++; - tempo->waveform=*st++-'0'; - waveform=tempo->waveform; - } - while (*st=='!') { - tempo->accent++; - st++; - } while (*st=='(') { Bts(&tempo->flags,Of_TIE); st++; @@ -999,8 +957,6 @@ U0 OrgLoadSongStr(U8 *st,I64 *org_octave,F64 *org_duration) } else { tempo->note=NOTE_REST; tempo->octave=OCTAVE_REST; - tempo->accent=0; - tempo->waveform=WF_SQUARE; } if (*org_duration<=2*.25/3) i=0; @@ -1037,7 +993,7 @@ U0 OrgLoadSong(U8 *filename,I64 *org_octave,F64 *org_duration) { U8 *st; OrgNote *tempo; - CLex *lx=LexNew(TextFileRead(filename),0,StrNew(filename)); + CLex *lx=LexNew(TextFileRead(filename),0,filename); Lex(lx); if (FileOcc("incomplete",filename,"")) oc.incomplete_entry->checked=TRUE; @@ -1084,13 +1040,12 @@ U8 *OrgCvtSong() { OrgNote *tempo; U8 *st,*src,*dst; - I64 i,note,octave,last_octave,last_duration,accent,waveform,last_waveform; + I64 i,note,octave,last_octave,last_duration; i=0; tempo=oc.root.next; last_octave=OCTAVE_REST; last_duration=-1; - last_waveform=-1; while (tempo!=&oc.root) { dst=&tempo->ascii; if (tempo->type==OT_METER) { @@ -1115,17 +1070,8 @@ U8 *OrgCvtSong() } note=music_note_map[*LstEntryPt(note,org_note_lst)-'A']; } - accent=tempo->accent; - waveform=tempo->waveform; - if (waveform!=last_waveform && note!=NOTE_REST) { - *dst++='W'; - *dst++=waveform+'0'; - last_waveform=waveform; - } if (Bt(&tempo->flags,Of_TIE)) *dst++='('; - while (accent--) - *dst++='!'; if (octave!=last_octave && note!=NOTE_REST) { *dst++=octave+'0'; last_octave=octave; @@ -1296,25 +1242,8 @@ U0 OrgSetOctave(I64 octave) tempse->checked=org_play_mode==1; } -U0 OrgSetWaveform(I64 waveform) -{ - CMenuEntry *tempse; - if (tempse=MenuEntryFind(Fs->cur_menu,"Snd/Square")) - tempse->checked=waveform==WF_SQUARE; - if (tempse=MenuEntryFind(Fs->cur_menu,"Snd/Sine")) - tempse->checked=waveform==WF_SINE; - if (tempse=MenuEntryFind(Fs->cur_menu,"Snd/Triangle")) - tempse->checked=waveform==WF_TRIANGLE; - if (tempse=MenuEntryFind(Fs->cur_menu,"Snd/Sawtooth")) - tempse->checked=waveform==WF_SAWTOOTH; - if (tempse=MenuEntryFind(Fs->cur_menu,"Snd/Noise")) - tempse->checked=waveform==WF_NOISE; -} - - - -$SP,"<25>",25$ +$SP,"<17>",17$ @@ -1393,11 +1322,11 @@ U0 OrgUpKey(I64 x,I64 y) } } -U0 OrgMenu(I64 org_octave,I64 org_waveform) +U0 OrgMenu(I64 org_octave) { DocClear; - "$$BD,WHITE$$$$FD,GREEN$$$$FU,GREEN$$$$FM,GREEN$$$$CM,0,12$$\n"; - PutSprite($IB,"<25>",25$); + "$$BD,WHITE$$$$FD,GREEN$$$$CM,0,12$$\n"; + PutSprite($IB,"<17>",17$); NewLine(5); DrawDC2; @@ -1422,15 +1351,14 @@ U0 OrgMenu(I64 org_octave,I64 org_waveform) PutSprite($IB,"<7>",7$,"$$SP+LM+LA,\"\",\"Msg(MSG_KEY_DOWN,0,SCF_CTRL|SC_CURSOR_RIGHT);\",%d$$"); "$$CM+LX,0,6$$"; OrgSetOctave(org_octave); - OrgSetWaveform(org_waveform); WinMgrSync(2); } -U0 OrgPushMode(I64 org_octave,I64 org_waveform) +U0 OrgPushMode(I64 org_octave) { Fs->win_inhibit=WIF_ALL-WIF_BORDER-WIF_MENU-WIF_CTRLS; - OrgMenu(org_octave,org_waveform); + OrgMenu(org_octave); } U0 OrgPopMode() @@ -1446,16 +1374,16 @@ U0 MusicOrgan(U8 *dirname=NULL) { Bool is_note,was_playing; I64 p1,p2,ch,sc,msg_code=0,col, - note=NOTE_REST,octave=OCTAVE_REST,accent=0,org_waveform=WF_SQUARE,org_octave=3,timeout_val,timeout_val2, + note=NOTE_REST,octave=OCTAVE_REST,org_octave=3,timeout_val,timeout_val2, old_doc_flags; U8 *filename=NULL,*st,*st2; - CTask *play_task=Spawn(&OrgPlayTask,NULL,"Organ Play",Fs); + CTask *play_task=Spawn(&OrgPlayTask,NULL,"Organ Play",,Fs); OrgNote *tempo; F64 f=0,last_f=0,org_duration=1.0, d,evt_time=tT,note_down_time=tT; CCtrl *c=TempoNew; - if (DocCur) old_doc_flags=DocCur->flags; + if (DocPut) old_doc_flags=DocPut->flags; SettingsPush; //See $LK,"SettingsPush","MN:SettingsPush"$ WinBorder; WordStat; @@ -1466,13 +1394,12 @@ U0 MusicOrgan(U8 *dirname=NULL) tempo_state.tempo=Round(TEMPO_RANGE*(music_tempo-0.5)/4.4); tempo_state.stacatto=Round(TEMPO_RANGE*(music_stacatto_factor-0.12)/0.88); - if (DocCur) DocCur->flags|=DOCF_FORM; + if (DocPut) DocPut->flags|=DOCF_FORM; MemSet(&oc,0,sizeof(OrgCtrl)); oc.screen_x=0; oc.root.next=oc.root.last=&oc.root; oc.clipboard.next=oc.clipboard.last=&oc.clipboard; - oc.root.waveform=WF_SQUARE; oc.cur_note=&oc.root; oc.dc2=DCAlias; @@ -1505,11 +1432,6 @@ U0 MusicOrgan(U8 *dirname=NULL) " MarkIncomplete(MSG_CMD,ORGF_INCOMPLETE);" "}" "Snd {" - " Square(,'!');" - " Sine(,'@');" - " Triangle(,'#');" - " Sawtooth(,'$$');" - " Noise(,'%');" " Reverb(,'c');" " Octave0(,'0');" " Octave1(,'1');" @@ -1532,7 +1454,7 @@ U0 MusicOrgan(U8 *dirname=NULL) dirname=StrNew("HOME/MusicOrgan"); else dirname=StrNew(dirname); - OrgPushMode(org_octave,org_waveform); + OrgPushMode(org_octave); col=0; Fs->draw_it=&DrawIt; @@ -1556,8 +1478,8 @@ got_msg: } if (msg_code!=MSG_IP_MOVE) { DocBottom; - if (was_playing || DocCur->cur_entry->y>=Fs->win_height-2) { - OrgMenu(org_octave,org_waveform); + if (was_playing || DocPut->cur_entry->y>=Fs->win_height-2) { + OrgMenu(org_octave); col=0; } } @@ -1579,7 +1501,7 @@ got_msg: oc.incomplete_entry->checked=!oc.incomplete_entry->checked; break; } - OrgPushMode(org_octave,org_waveform); + OrgPushMode(org_octave); is_note=FALSE; col=0; break; @@ -1589,7 +1511,7 @@ got_msg: sc=p2; if ('0'<=ch<='9') { org_octave=ch-'0'; - OrgMenu(org_octave,org_waveform); + OrgMenu(org_octave); col=0; } else { is_note=TRUE; @@ -1647,7 +1569,7 @@ got_msg: case SC_F1: OrgPopMode; PopUp("Ed(\"::/TempleOS/Apps/MusicOrgan/Help.TXT.Z\");",Fs); - OrgPushMode(org_octave,org_waveform); + OrgPushMode(org_octave); col=0; is_note=FALSE; break; @@ -1686,7 +1608,7 @@ got_msg: OrgLoadSongStr(st2,&org_octave,&org_duration); Free(st2); } - OrgPushMode(org_octave,org_waveform); + OrgPushMode(org_octave); is_note=FALSE; col=0; break; @@ -1697,7 +1619,7 @@ got_msg: "$$FG,GREEN$$$$FG$$ to load it into MusicOrgan.\n\n" ST_WARN_ST " Graphics and other embelishments\n" "will be lost because MusicOrgan can't\n" - "parse C/C++ programs completely.\n"); + "parse Holy C programs completely.\n"); Free(filename); filename=NULL; JukeBox(dirname,&filename); @@ -1711,14 +1633,14 @@ got_msg: oc.record_entry->checked=FALSE; oc.cur_note=oc.root.next; } - OrgPushMode(org_octave,org_waveform); + OrgPushMode(org_octave); is_note=FALSE; col=0; break; case CH_CTRLA: OrgPopMode; filename=OrgSaveSong(dirname,filename); - OrgPushMode(org_octave,org_waveform); + OrgPushMode(org_octave); is_note=FALSE; break; case CH_CTRLC: @@ -1734,7 +1656,7 @@ got_msg: is_note=FALSE; break; case '.': - OrgMenu(org_octave,org_waveform); + OrgMenu(org_octave); col=0; Free(filename); filename=NULL; @@ -1757,7 +1679,7 @@ got_msg: } col=0; oc.playing=TRUE; - OrgMenu(org_octave,org_waveform); + OrgMenu(org_octave); tempo=oc.cur_note; while (tempo!=&oc.root) { if (tempo->type!=OT_METER) { @@ -1783,8 +1705,6 @@ got_msg: "" tempo->word; note=tempo->note; octave=tempo->octave; - accent=tempo->accent; - org_waveform=tempo->waveform; if (note!=NOTE_REST) f=Note2Freq(note,octave); else @@ -1797,7 +1717,6 @@ got_msg: music_tempo=4.4*tempo_state.tempo/TEMPO_RANGE+0.5; music_stacatto_factor=0.88*tempo_state.stacatto/TEMPO_RANGE+0.12; - music_waveform=org_waveform; d=JIFFY_FREQ*org_durations[tempo->duration]/music_tempo; if (Bt(&tempo->flags,Of_TIE)) { timeout_val+=d; @@ -1816,7 +1735,7 @@ got_msg: oc.cur_note=&oc.root; oc.screen_x+=oc.cur_note->x-GR_WIDTH/2; oc.playing=FALSE; - OrgMenu(org_octave,org_waveform); + OrgMenu(org_octave); col=0; f=0; org_play_f=0; @@ -1838,7 +1757,7 @@ got_msg: org_play_mode++; if (org_play_mode>=ORGPM_NUM_PLAY_MODES) org_play_mode=0; is_note=FALSE; - OrgMenu(org_octave,org_waveform); + OrgMenu(org_octave); col=0; break; case 'z': @@ -1850,44 +1769,14 @@ got_msg: org_octave=3; oc.screen_x=0; } - OrgMenu(org_octave,org_waveform); + OrgMenu(org_octave); col=0; is_note=FALSE; break; case CH_ESC: OrgPopMode; filename=OrgSaveSong(dirname,filename); - OrgPushMode(org_octave,org_waveform); - break; - case '!': - music_waveform=org_waveform=WF_SQUARE; - OrgMenu(org_octave,org_waveform); - col=0; - is_note=FALSE; - break; - case '@': - music_waveform=org_waveform=WF_SINE; - OrgMenu(org_octave,org_waveform); - col=0; - is_note=FALSE; - break; - case '#': - music_waveform=org_waveform=WF_TRIANGLE; - OrgMenu(org_octave,org_waveform); - col=0; - is_note=FALSE; - break; - case '$$': - music_waveform=org_waveform=WF_SAWTOOTH; - OrgMenu(org_octave,org_waveform); - col=0; - is_note=FALSE; - break; - case '%': - music_waveform=org_waveform=WF_NOISE; - OrgMenu(org_octave,org_waveform); - col=0; - is_note=FALSE; + OrgPushMode(org_octave); break; default: is_note=FALSE; @@ -1946,8 +1835,6 @@ got_msg: tempo->type=OT_NOTE; tempo->note=note; tempo->octave=octave; - tempo->accent=0; - tempo->waveform=org_waveform; if (st[1]=='#') Bts(&tempo->flags,Of_SHARP); } @@ -1961,6 +1848,7 @@ got_msg: } } } while (ch!=CH_ESC && ch!=CH_SHIFT_ESC); + GetMsg(,,1<flags=DocCur->flags&~DOCF_FORM|old_doc_flags&DOCF_FORM; + if (DocPut) DocPut->flags=DocPut->flags&~DOCF_FORM|old_doc_flags&DOCF_FORM; Free(dirname); - "$$CL$$\n"; MenuPop; } "òÿÿÿñÿÿÿñÿÿÿ @@ -2015,18 +1903,13 @@ got_msg:  ?   -  #þÿÿÿÖÿÿÿþÿÿÿ&Öÿÿÿ& Eúÿÿÿ úÿÿÿ - ýÿÿÿ V ýÿÿÿ +  #þÿÿÿÖÿÿÿþÿÿÿ&Öÿÿÿ& Eúÿÿÿ úÿÿÿ + ýÿÿÿ V ýÿÿÿ      -#ýÿÿÿýÿÿÿúÿÿÿúÿÿÿýÿÿÿEýÿÿÿýÿÿÿúÿÿÿúÿÿÿýÿÿÿýÿÿÿúÿÿÿ÷ÿÿÿ÷ÿÿÿúÿÿÿEþÿÿÿöÿÿÿöÿÿÿöÿÿÿòÿÿÿòÿÿÿþÿÿÿòÿÿÿôÿÿÿÿÿÿÿôÿÿÿò$ $ 0$0,444,,@$@<DDD<<|„„„||ltttll$À$ÄA$S4DDFTGdHtJ„K”L¤;´',E<RLTlU|IœP¬[¼]PPLTTTLL`$`p$p€$€�$� $ °$°À$Àœ¤¤¤œœ¬´´´¬¬¼ÄÄļ¼P$P0@Pp€ °À@ +Eþÿÿÿöÿÿÿöÿÿÿöÿÿÿòÿÿÿòÿÿÿþÿÿÿòÿÿÿôÿÿÿÿÿÿÿôÿÿÿò$ $ 0$0,444,,@$@<DDD<<|„„„||ltttll$À$ÄA$S4DDFTGdHtJ„K”L¤;´',E<RLTlU|IœP¬[¼]PPLTTTLL`$`p$p€$€�$� $ °$°À$Àœ¤¤¤œœ¬´´´¬¬¼ÄÄļ¼P$P0@Pp€ °À@ ~   -#ýÿÿÿýÿÿÿúÿÿÿúÿÿÿýÿÿÿEýÿÿÿýÿÿÿúÿÿÿúÿÿÿýÿÿÿýÿÿÿúÿÿÿ÷ÿÿÿ÷ÿÿÿúÿÿÿEúÿÿÿ úÿÿÿ - ýÿÿÿ V ýÿÿÿ - -   - -#þÿÿÿÖÿÿÿþÿÿÿ&Öÿÿÿ& P + P    \ No newline at end of file diff --git a/TempleOS/Apps/Pilgrims/Load.CPP b/TempleOS/Apps/Pilgrims/Load.CPP deleted file mode 100644 index ed923e6..0000000 --- a/TempleOS/Apps/Pilgrims/Load.CPP +++ /dev/null @@ -1,7 +0,0 @@ -#help_index "Games" - -Cd("/TempleOS/Apps/Pilgrims");; - -#include "Pilgrims" - -#help_index "" diff --git a/TempleOS/Apps/Pilgrims/NewEngland.GRA b/TempleOS/Apps/Pilgrims/NewEngland.GRA deleted file mode 100644 index d5bf162492718a03c20643f82902c3319df0fe9b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 14375 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 diff --git a/TempleOS/Apps/Pilgrims/Pilgrims.CPP b/TempleOS/Apps/Pilgrims/Pilgrims.CPP deleted file mode 100644 index cf268c4..0000000 --- a/TempleOS/Apps/Pilgrims/Pilgrims.CPP +++ /dev/null @@ -1,773 +0,0 @@ -/* -Ideas? - -How about clouds and rain for crops? - -How about achievement of Ben Franklin Almanac. - -How about a shipping company office. - -How about something like M.U.L.E. - -How about turkey shoot. - -Witch trials? Maybe, have God talk? - -Seven Cities of Gold or the game, Civilization, -is what's expected but that's dull. - -Rivals Spanish and French? - -*/ - - -$SP,"<1>",1$ - - - -$BG,14$ - - - - - - -$SP,"<2>",2$ - - - - - - - - -$SP,"<3>",3$ - - - - - -$SP,"<4>",4$ - - - -$SP,"<5>",5$ - -$BG,9$ - - - - - $SP,"<6>",6$ - - - - -$SP,"<7>",7$ - -$BG$ -#define AFT_MAST 16 -#define BOW_MAST 14 -#define MAST_HEIGHT 20 -#define AFT_LEN 36 -#define BOW_LEN 43 -#define BERTH 28 - -F64 screen_x,screen_y,d_screen_x,d_screen_y, - wind_speed, - - //This is on a wave close to ship - //in world coordinates. - ship_wave_x,ship_wave_y, - - church_x,church_y, - - wave_speed,wave_é,d_wave_é,wave_period, - wave_amplitude; - -Bool wave_sound,ship_landed; -F64 song_time,game_over_time; - -F64 view_scale,new_view_scale; -CDC *master_map; -U8 *vm; -F64 men; - -#define NUM_DOLPHINS 5 -#define NUM_PIGRAIMS 10 - -class Obj -{ - F64 x,y,radius, - é,d_é, - speed; -} ship,dolphins[NUM_DOLPHINS],pilgrims[NUM_PIGRAIMS]; - -#define MAX_BUBBLES 1024 -class Bubble -{ - I32 x,y; -} bubbles[MAX_BUBBLES]; - -#define MAX_GARDENS 128 -class Garden -{ - I32 x,y; -} gardens[MAX_GARDENS]; -I64 num_gardens; - - -F64 WaterHeight(F64 x,F64 y) -{ //Returns wave height at world coordinate pt - F64 dxn=Cos(wave_é), - dyn=Sin(wave_é),é; - é=2*ã*((x-ship_wave_x)*dxn+(y-ship_wave_y)*dyn)/wave_period; - return wave_amplitude*Cos(é); -} - -I64 *ShipMat() -{ //Returns rotation matrix for ship bobbing on waves - F64 x1,y1,z1,x2,y2,z2,a; - I64 *result; - - x1=ship.x-AFT_LEN/2*Cos(ship.é)/view_scale; - y1=ship.y-AFT_LEN/2*Sin(ship.é)/view_scale; - z1=WaterHeight(x1,y1); - x2=ship.x+BOW_LEN/2*Cos(ship.é)/view_scale; - y2=ship.y+BOW_LEN/2*Sin(ship.é)/view_scale; - z2=WaterHeight(x2,y2); - a=ASin((z2-z1)/((AFT_LEN/2+BOW_LEN/2)/view_scale)); - result=GrRotY(a); - - z1=WaterHeight(ship.x,ship.y); - x2=ship.x-BERTH/2*Sin(ship.é)/view_scale; - y2=ship.y+BERTH/2*Cos(ship.é)/view_scale; - z2=WaterHeight(x2,y2); - a=ASin((z2-z1)/(BERTH/view_scale)); - GrRotXEqu(result,a); - - GrRotZEqu(result,ship.é); - return result; -} - -U0 BubbleAdd(I64 x,I64 y) -{ - I64 i=RandU16&(MAX_BUBBLES-1); - bubbles[i].x=x; - bubbles[i].y=y; -} - -U0 PosChurch(F64 x,F64 y) -{ - I64 i; - CDC *dc=DCAlias(master_map,Fs); - dc->color =ROP_COLLISION; - dc->bkcolor=BLACK; - while (x>0) { - dc->collision_cnt=0; - SpritePlot3(dc,x,y,0,$IB,"<2>",2$); - if (dc->collision_cnt>2000) - break; - x--; - } - church_x=x; church_y=y; - DCDel(dc); - for (i=0;iwin_pixel_width, cx=w>>1, - h=task->win_pixel_height,cy=h>>1, - c=1.05*(MaxI64(cx,cy)+wave_period), - *ship_r,x,y,z; - F64 d,xx,yy,dx,dy,dx2,dy2,wave_x,wave_y; - Bool bow_down; - - task->text_attr=LTBLUE<<4; - - //Draw Bubbles - dc->color=BLUE; - for (i=0;icolor=BLUE; - if (Abs(dx)>Abs(dy)) { - xx=wave_x; yy=wave_y; - while (xx>-c) { - GrLine(dc,xx-dx2,yy-dy2,xx+dx2,yy+dy2); - if (dx>0) { xx-=dx; yy-=dy; - } else { xx+=dx; yy+=dy; } - } - xx=wave_x; yy=wave_y; - while (xx-c) { - GrLine(dc,xx-dx2,yy-dy2,xx+dx2,yy+dy2); - if (dy>0) { xx-=dx; yy-=dy; - } else { xx+=dx; yy+=dy; } - } - xx=wave_x; yy=wave_y; - while (yy",7$,dolphins[i].é); - - //Draw Land - dc->color=ROP_MONO+YELLOW; - VectMapBlotMP(dc,-screen_x,-screen_y,vm,view_scale); - - //Draw Ship - dc->color=ROP_EQU; - ship_r=ShipMat; - SpritePlotRotMat3b(dc,ship.x*view_scale-screen_x,ship.y*view_scale-screen_y,0,$IB,"<6>",6$,ship_r); - - //Rudder - x=-AFT_LEN; y=0; z=0; - GrRot(ship_r,&x,&y,&z); - x+=ship.x*view_scale; y+=ship.y*view_scale; - dc->color=BLACK; - dc->pen_width=2; - GrLine3(dc,x-screen_x,y-screen_y,0,x-8*Cos(ship.é-2.5*ship.d_é)-screen_x,y-8*Sin(ship.é-2.5*ship.d_é)-screen_y,0); - dc->pen_width=1; - - //Wake - x=(-(AFT_LEN+2)+RandU16%13-6)/view_scale; y=(RandU16%13-6)/view_scale; z=0; - GrRot(ship_r,&x,&y,&z); - x+=ship.x; y+=ship.y; - BubbleAdd(x,y); - for (i=0;icolor=BLACK; - GrLine3(dc,x-dx-screen_x,y-dy-screen_y,0,x+dx-screen_x,y+dy-screen_y,0); - - xx=x-screen_x; yy=y-screen_y; - - if (!bow_down) { - x=-AFT_MAST; y=0; z=MAST_HEIGHT; - GrRot(ship_r,&x,&y,&z); - x+=ship.x*view_scale; y+=ship.y*view_scale; - dc->color=DKGRAY; - dc->pen_width=4; - GrLine3(dc,x-screen_x,y-screen_y,0,xx,yy,0); - } - - dc->pen_width=2; - for (d=0;dcolor=WHITE; - GrLine3(dc,x-dx-screen_x,y-dy-screen_y,0,x+dx-screen_x,y+dy-screen_y,0); - } - dc->pen_width=1; - - x=-AFT_MAST; y=0; z=MAST_HEIGHT; - GrRot(ship_r,&x,&y,&z); - x+=ship.x*view_scale; y+=ship.y*view_scale; - dc->color=BLACK; - GrLine3(dc,x-dx-screen_x,y-dy-screen_y,0,x+dx-screen_x,y+dy-screen_y,0); - - if (bow_down) { - x=-AFT_MAST; y=0; z=MAST_HEIGHT; - GrRot(ship_r,&x,&y,&z); - x+=ship.x*view_scale; y+=ship.y*view_scale; - dc->color=DKGRAY; - dc->pen_width=4; - GrLine3(dc,x-screen_x,y-screen_y,0,xx,yy,0); - } - - dc->color=BLACK; - dc->pen_width=1; - GrCircle3(dc,x-screen_x,y-screen_y,0,2); - - //Bow Sail - x=BOW_MAST; y=0; z=0; - GrRot(ship_r,&x,&y,&z); - x+=ship.x*view_scale; y+=ship.y*view_scale; - dc->color=BLACK; - GrLine3(dc,x-dx-screen_x,y-dy-screen_y,0,x+dx-screen_x,y+dy-screen_y,0); - - xx=x-screen_x; yy=y-screen_y; - - if (!bow_down) { - x=BOW_MAST; y=0; z=MAST_HEIGHT; - GrRot(ship_r,&x,&y,&z); - x+=ship.x*view_scale; y+=ship.y*view_scale; - dc->color=DKGRAY; - dc->pen_width=4; - GrLine3(dc,x-screen_x,y-screen_y,0,xx,yy,0); - } - - dc->pen_width=2; - for (d=0;dcolor=WHITE; - GrLine3(dc,x-dx-screen_x,y-dy-screen_y,0,x+dx-screen_x,y+dy-screen_y,0); - } - dc->pen_width=1; - - x=BOW_MAST; y=0; z=MAST_HEIGHT; - GrRot(ship_r,&x,&y,&z); - x+=ship.x*view_scale; y+=ship.y*view_scale; - dc->color=BLACK; - GrLine3(dc,x-dx-screen_x,y-dy-screen_y,0,x+dx-screen_x,y+dy-screen_y,0); - - if (bow_down) { - x=BOW_MAST; y=0; z=MAST_HEIGHT; - GrRot(ship_r,&x,&y,&z); - x+=ship.x*view_scale; y+=ship.y*view_scale; - dc->color=DKGRAY; - dc->pen_width=4; - GrLine3(dc,x-screen_x,y-screen_y,0,xx,yy,0); - } - - dc->color=BLACK; - dc->pen_width=1; - GrCircle3(dc,x-screen_x,y-screen_y,0,2); - - dc->color=BLACK; - GrPrintF(dc,0,0,"Speed:%5.1f Knots",ship.speed); - GrPrintF(dc,0,FONT_HEIGHT,"Men:%f",men); - - //Check for wreck - x=BOW_LEN; y=0; z=0; - GrRot(ship_r,&x,&y,&z); - x+=ship.x*view_scale; y+=ship.y*view_scale; - if (!ship_landed && GrPeek(dc,x-screen_x,y-screen_y)==YELLOW) { - Noise(500,500,1000); - song_time =tT+0.5; - game_over_time=tT+1.0; - wave_sound=FALSE; - ship_landed=TRUE; - PosChurch(x/view_scale,y/view_scale); - } - - if (ship_landed) { - //Draw Gardens - for (i=0;i",5$); - - //Draw Church - SpritePlot3(dc,church_x*view_scale-screen_x,church_y*view_scale-screen_y,0,$IB,"<2>",2$); - //Draw Pilgrims - for (i=0;i",3$:$IB,"<4>",4$); - if (tT>game_over_time && Blink) { - dc->color=LTRED; - GrPrintF(dc,(task->win_pixel_width-14*FONT_WIDTH)/2, - (task->win_pixel_height-FONT_HEIGHT)/2,"Game Completed"); - } - } - Free(ship_r); -} - - -CColorROPU32 pray_colors[1]={RED}; -CTask *pray_task; - -U0 LeftClickPrayButton(CCtrl *,I64,I64,Bool down) -{ //$LK-A,"::/TempleOS/Apps/AfterEgypt/AENotes.TXT"$ - I64 i,size,l=512; - U8 *bible_filename,*buf; - if (down && !TaskValidate(pray_task)) { - bible_filename=Define("ST_BIBLE_FILE"); - if (buf=FileRead(bible_filename,&size)) { - i=GetTimeStamp>>4%(size-l); - buf[i+l]=0; - pray_task=PopUpViewStr(buf+i); - Free(buf); - } - } -} - -U0 Init() -{ - I64 i; - Fs->draw_it=NULL; - Kill(Fs->song_task); - Fs->song_task=NULL; - WinMgrSync; - - men=102.0; - pray_task=NULL; - - screen_x=400; d_screen_x=0; - screen_y=500; d_screen_y=0; - view_scale=1.0; new_view_scale=1.0; - MemSetU32(&bubbles,MAX_I32,sizeof(bubbles)/sizeof(U32)); - - num_gardens=0; - MemSetU32(&gardens,MAX_I32,sizeof(gardens)/sizeof(U32)); - - MemSet(&dolphins,0,sizeof(dolphins)); - for (i=0;idraw_it=&DrawIt; -} - - -U0 AnimateObj(Obj *tempo,F64 dt) -{ - tempo->x+=tempo->speed*dt*Cos(tempo->é); - tempo->y+=tempo->speed*dt*Sin(tempo->é); - tempo->é=Wrap(tempo->é+tempo->d_é*dt); - tempo->d_é=LowPass1(0.5,tempo->d_é,0,dt); -} - -U0 SongTask(I64) -{ - Fs->task_end_cb=&SndTaskEndCB; - MusicSettingsRst; - music_tempo= 2.480; - music_stacatto_factor= 0.902; - Play("M3/4"); - Play("hRW13qDhG4eB3G"); - Play("4hBqA3hGqE"); - Play("hDqDhG4eB3G"); - Play("4hBqAh.DhD"); - Fs->parent_task->song_task=NULL; -} - -#define SCREEN_BUMP 100 - -U0 AnimateTask(I64) -{ - I64 i,j, - w=Fs->parent_task->win_pixel_width, cx=w/2, - h=Fs->parent_task->win_pixel_height, cy=h/2; - F64 die_timer=0,d,dx,dy,dx2,dy2,dxn,dyn,t0=tT,dt,old_view_scale; - - while (TRUE) { - if (TaskValidate(pray_task)) { - while (TaskValidate(pray_task)) - WinMgrSync; - pray_task=NULL; - t0=tT; - } - - dt=tT-t0; - t0=tT; - - for (die_timer+=dt;die_timer>0.1;die_timer-=0.1) - if (Rand<0.05) - men*=Exp(-0.05*(Rand+0.05)`20); - - old_view_scale=view_scale; - view_scale=Exp(0.5*dt*(Ln(new_view_scale)-Ln(view_scale))+Ln(view_scale)); - screen_x=(screen_x+cx)*view_scale/old_view_scale-cx; - screen_y=(screen_y+cy)*view_scale/old_view_scale-cy; - - for (i=0;iw-1-dolphins[i].radius) - dolphins[i].x-=(w-2*dolphins[i].radius)/view_scale; - if (dolphins[i].y-screen_yh-1-dolphins[i].radius) - dolphins[i].y-=(h-2*dolphins[i].radius)/view_scale; - } - - if (ship_landed) { - for (i=0;iw-1-w/4) - d_screen_x+=SCREEN_BUMP; - if (church_y*view_scale-screen_y-0.9*d_screen_yh-1-h/4) - d_screen_y+=SCREEN_BUMP; - } else { - d=Wrap(ship.é-Wrap(wave_é,ship.é-ã)); - if (Abs(d)<ã) - d=(Abs(d)-ã)*Sign(-d); - d=wind_speed*Cos(d/2); - ship.speed=LowPass1(0.25,ship.speed,d,dt); - AnimateObj(&ship,dt); - if (ship.x*view_scale-screen_x-0.9*d_screen_xw-1-w/4) - d_screen_x+=SCREEN_BUMP; - if (ship.y*view_scale-screen_y-0.9*d_screen_yh-1-h/4) - d_screen_y+=SCREEN_BUMP; - if (ship.x<0) ship.x=0; - if (ship.y<0) ship.y=0; - } - - if (screen_x<0) { - screen_x=0; - d_screen_x=0; - } - if (screen_y<0) { - screen_y=0; - d_screen_x=0; - } - - wave_é=Wrap(wave_é+d_wave_é*dt); - d_wave_é=Limit(LowPass1(1.0,d_wave_é, - d_wave_é+1.0*(Rand-0.5),dt),-0.05,0.05); - - screen_x+=0.9*d_screen_x*dt; - d_screen_x-=0.9*d_screen_x*dt; - screen_y+=0.9*d_screen_y*dt; - d_screen_y-=0.9*d_screen_y*dt; - - dxn=Cos(wave_é); - dyn=Sin(wave_é); - dx=wave_period*dxn; - dy=wave_period*dyn; - ship_wave_x-=wave_speed*dt/(2*ã)*dx; - ship_wave_y-=wave_speed*dt/(2*ã)*dy; - if (Abs(dx)>Abs(dy)) { - i=(ship_wave_x-ship.x)/dx; - ship_wave_x-=i*dx; - ship_wave_y-=i*dy; - dx2=ship_wave_x-ship.x; - dy2=ship_wave_y-ship.y; - d=dyn*dx2-dxn*dy2; - ship_wave_x-=dyn*d; - ship_wave_y+=dxn*d; - } else { - i=(ship_wave_y-ship.y)/dy; - ship_wave_x-=i*dx; - ship_wave_y-=i*dy; - dx2=ship_wave_x-ship.x; - dy2=ship_wave_y-ship.y; - d=dyn*dx2-dxn*dy2; - ship_wave_x-=dyn*d; - ship_wave_y+=dxn*d; - } - - if (wave_sound) - Snd(200+8*WaterHeight(ship.x,ship.y)); - else if (song_time && tT>song_time) { - Kill(Fs->parent_task->song_task); - Fs->parent_task->song_task=Spawn(&SongTask,NULL,"Song",Fs->parent_task); - song_time=0; - } - WinMgrSync; - } -} - -U0 Pilgrims() -{ - I64 msg_code,ch,sc; - CCtrl *bt_pray; - - "Initializing Maps...\n"; - master_map=GRARead("NewEngland"); //See $LK,"Acknowledgements","FF:::/TempleOS/Doc/Acknowledgements.TXT,US Geological"$ (7). - - vm=DC2VectMap(master_map); - PopUpOk("This is about the pilgrims who fled\n" - "religious persecution in England.\n" - "They sailed in 1620 on the Mayflower\n" - "and landed at Plymouth, Massachusetts.\n" - "\n" - "This game is comic, mostly. Be sure\n" - "to try 'z' or 'Z' for zooming.\n"); - SettingsPush; //See $LK,"SettingsPush","MN:SettingsPush"$ - - MenuPush( - "File {" - " Abort(,CH_SHIFT_ESC);" - " Exit(,CH_ESC);" - "}" - "Play {" - " Restart(,'\n');" - " Pray(,'p');" - " Port(,,SC_CURSOR_LEFT);" - " Starboard(,,SC_CURSOR_RIGHT);" - "}" - "View {" - " ZoomIn(,'z');" - " ZoomOut(,'Z');" - "}" - ); - - WordStat; - Preempt(OFF); - - bt_pray=CtrlButtonNew(0,2.5*FONT_HEIGHT,,,,"Pray\0",pray_colors), - bt_pray->left_click=&LeftClickPrayButton; - - WinMax; - DocCursor; - DocClear; - Fs->song_task=NULL; - Init; - Fs->animate_task=Spawn(&AnimateTask,NULL,"Animate",Fs); - try { - while (TRUE) { - switch (msg_code=GetMsg(&ch,&sc,1<0.1) - new_view_scale/=1.5; - break; - case '\n': - Init; - break; - case CH_ESC: - case CH_SHIFT_ESC: - goto pilgrim_done; - } - break; - } - } -pilgrim_done: - } catch - CatchAll; - MenuPop; - SettingsPop; - CtrlButtonDel(bt_pray); - VectMapDel(vm); - DCDel(master_map); -} - X#Õÿÿÿðÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ -øÿÿÿúÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿB/! êÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿJ1Aõÿÿÿ½ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ"!øÿÿÿâÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ øÿÿÿâÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ² ôÿÿÿúÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ - - - - -ÿÿÿÿÿÿÿÿÿÿÿ - - - - -ÿÿÿÿÿÿÿÿÿÿÿ - - - - -ÿÿÿÿÿÿÿÿÿÿÿ - - - - -ÿÿÿÿÿÿÿÿÿÿÿ - - - -ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ \ No newline at end of file diff --git a/TempleOS/Apps/Pilgrims/Run.CPP b/TempleOS/Apps/Pilgrims/Run.CPP deleted file mode 100644 index 215d9df..0000000 --- a/TempleOS/Apps/Pilgrims/Run.CPP +++ /dev/null @@ -1,2 +0,0 @@ -#include "/TempleOS/Apps/Pilgrims/Load" -Pilgrims; diff --git a/TempleOS/Apps/Span/Span.HPP b/TempleOS/Apps/Span/Span.HPP index 37de4ae..6fe0dd8 100644 --- a/TempleOS/Apps/Span/Span.HPP +++ b/TempleOS/Apps/Span/Span.HPP @@ -51,4 +51,4 @@ class SpanAnimateStruct extern MyMass PlaceMass(I64 x, I64 y); -extern F64 SpanTime(CTask *task); +extern F64 SpanTime(); diff --git a/TempleOS/Apps/Span/SpanBridge1.CPP b/TempleOS/Apps/Span/SpanBridge1.CPP index 56e900a..8ff56f8 100644 --- a/TempleOS/Apps/Span/SpanBridge1.CPP +++ b/TempleOS/Apps/Span/SpanBridge1.CPP @@ -2,7 +2,7 @@ #define SPRING_SCALE 6.0e6 #define COST_SCALE 375.0 #define MASS_RADIUS 3.0 -#define MASS_WEIGHT 10.0 +#define MASS_MASS 10.0 #define WIRE_PERCENT 0.99 #define RIVER_BANK_COLS 5 @@ -44,28 +44,20 @@ U0 SpanBridge1Init(CMathODE *) tempm->color=RED; } - "$$CL$$$$BG,LTCYAN$$"; - NewLine(SKY_LINES); + DocClear; + "$$BG,LTCYAN$$"; NewLine(SKY_LINES); for (i=0;i<10;i++) { - "$$BG,BROWN$$"; - Spaces(RIVER_BANK_COLS); - "$$BG,LTCYAN$$"; - Spaces(TEXT_COLS-2*RIVER_BANK_COLS); - "$$BG,BROWN$$"; - Spaces(RIVER_BANK_COLS); + "$$BG,BROWN$$"; Spaces(RIVER_BANK_COLS); + "$$BG,LTCYAN$$"; Spaces(TEXT_COLS-2*RIVER_BANK_COLS); + "$$BG,BROWN$$"; Spaces(RIVER_BANK_COLS); NewLine; } - for (i=0;i<5;i++) { - "$$BG,BROWN$$"; - Spaces(RIVER_BANK_COLS+i); - "$$BG,BLUE$$"; - Spaces(TEXT_COLS/2-RIVER_BANK_COLS-2*i); - "$$BG,BROWN$$"; - Spaces(2*i); - "$$BG,BLUE$$"; - Spaces(TEXT_COLS/2-RIVER_BANK_COLS-2*i); - "$$BG,BROWN$$"; - Spaces(RIVER_BANK_COLS+i); + for (i=0;i<5;i++) { + "$$BG,BROWN$$"; Spaces(RIVER_BANK_COLS+i); + "$$BG,BLUE$$"; Spaces(TEXT_COLS/2-RIVER_BANK_COLS-2*i); + "$$BG,BROWN$$"; Spaces(2*i); + "$$BG,BLUE$$"; Spaces(TEXT_COLS/2-RIVER_BANK_COLS-2*i); + "$$BG,BROWN$$"; Spaces(RIVER_BANK_COLS+i); NewLine; } } @@ -73,7 +65,7 @@ U0 SpanBridge1Init(CMathODE *) U0 AdjustLoads(CTask *task,CMathODE *ode) { MyMass *tempm=ode->next_mass; - F64 d,tt=SpanTime(task)/10.0; + F64 d,tt=SpanTime/10.0; while (tempm!=&ode->next_mass) { if (tempm->load_t) { if (tt) { @@ -81,7 +73,7 @@ U0 AdjustLoads(CTask *task,CMathODE *ode) tempm->mass=100.0*Sqr(Sqr(d+1.0)); tempm->radius=7.0*d+2.0; } else { - tempm->mass=MASS_WEIGHT; + tempm->mass=MASS_MASS; tempm->radius=MASS_RADIUS; } } diff --git a/TempleOS/Apps/Span/SpanMain.CPP b/TempleOS/Apps/Span/SpanMain.CPP index 8e8be8a..656a2d7 100644 --- a/TempleOS/Apps/Span/SpanMain.CPP +++ b/TempleOS/Apps/Span/SpanMain.CPP @@ -86,7 +86,7 @@ MyMass PlaceMass(I64 x, I64 y) tempm->drag_profile_factor=1.0; tempm->x=x; tempm->y=y; - tempm->mass=MASS_WEIGHT; + tempm->mass=MASS_MASS; tempm->radius=MASS_RADIUS; tempm->cost=25.0*COST_SCALE; tempm->color=YELLOW; @@ -243,11 +243,11 @@ U0 AnimateTask(SpanAnimateStruct *a) U0 Init(SpanAnimateStruct *a) { + SpanDel(ode); ode=SpanNew; run_button.state=0; - WinMgrSync; //Allow stop to register in animate task. - WinMgrSync; + WinMgrSync(2); //Allow stop to register in animate task. if (a->saved_ode) SpanLoad(ode,a->saved_ode); @@ -264,7 +264,7 @@ U0 SongTask(I64) music_tempo= 3.636; music_stacatto_factor= 0.902; while (TRUE) { - Play("W13q.EeDqED2G3DhE"); + Play("3q.EeDqED2G3DhE"); Play("q.EeDqED2G3DhE"); Play("q.FeEFEqF2G3EhF"); Play("q.FeEFEqF2G3EhF"); @@ -281,8 +281,9 @@ U0 Span() CDC *dc=DCAlias; SettingsPush; //See $LK,"SettingsPush","MN:SettingsPush"$ + Fs->text_attr=BROWN<<4+BLACK; WinMax; - Fs->song_task=Spawn(&SongTask,NULL,"Song",Fs); + Fs->song_task=Spawn(&SongTask,NULL,"Song",,Fs); bt_run =CtrlButtonNew(0,0, 80,,2,"Stopped\0Running\0",run_colors,&run_button), bt_snap=CtrlButtonNew(0,2.5*FONT_HEIGHT,80,,2,"Snap Off\0Snap On\0",snap_colors,&snap_button), @@ -329,8 +330,9 @@ U0 Span() "}" ); + ode=NULL; Init(&a); - Fs->animate_task=Spawn(&AnimateTask,&a,"Animate",Fs); + Fs->animate_task=Spawn(&AnimateTask,&a,"Animate",,Fs); Fs->draw_it=&DrawIt; PopUpOk( @@ -424,11 +426,9 @@ U0 Span() Free(a.saved_ode); a.saved_ode=SpanSave(ode); } - SpanDel(ode); Init(&a); break; case CH_CTRLN: - SpanDel(ode); Free(a.saved_ode); a.saved_ode=NULL; Init(&a); @@ -437,7 +437,6 @@ U0 Span() if (src=SpanRead) { Free(a.saved_ode); a.saved_ode=src; - SpanDel(ode); Init(&a); } break; @@ -446,7 +445,6 @@ U0 Span() Free(a.saved_ode); a.saved_ode=SpanSave(ode); } - SpanDel(ode); Init(&a); SpanWrite(ode); break; @@ -479,7 +477,6 @@ U0 Span() Free(a.saved_ode); a.saved_ode=SpanSave(ode); } - SpanDel(ode); Init(&a); SpanWrite(ode); case CH_SHIFT_ESC: @@ -489,8 +486,10 @@ U0 Span() } } span_done: //Don't goto out of try + GetMsg(,,1<derivative=&MyDerivative; ode->drag_v2=0.002; ode->drag_v3=0.00001; ode->acceleration_limit=5e3; - QueIns(ode,Fs->last_ode); return ode; } U0 SpanDel(CMathODE *ode) { - QueRem(ode); - QueDel(&ode->next_mass,TRUE); - QueDel(&ode->next_spring,TRUE); - ODEDel(ode); + if (ode) { + QueRem(ode); + QueDel(&ode->next_mass,TRUE); + QueDel(&ode->next_spring,TRUE); + ODEDel(ode); + } } -#define M_SIZE (sizeof(MyMass)-offset(CMass.start_saved_area)) +#define M_SIZE (sizeof(MyMass) -offset(CMass.start_saved_area)) #define S_SIZE (sizeof(MySpring)-offset(CSpring.start_saved_area)) U8 *SpanSave(CMathODE *ode,I64 *_size=NULL) diff --git a/TempleOS/Apps/Strut/Strut.CPP b/TempleOS/Apps/Strut/Strut.CPP index 9904d2b..3555494 100644 --- a/TempleOS/Apps/Strut/Strut.CPP +++ b/TempleOS/Apps/Strut/Strut.CPP @@ -74,7 +74,7 @@ U0 Zoom(F64 d) d=Exp(Ln(d)/ZOOM_STEPS); for (i=0;iwin_scroll_x=ipx-sx-task->win_pixel_left; task->win_scroll_y=ipy-sy-task->win_pixel_top; diff --git a/TempleOS/Apps/Tanks/Install.CPP b/TempleOS/Apps/Tanks/Install.CPP deleted file mode 100644 index 42dabf0..0000000 --- a/TempleOS/Apps/Tanks/Install.CPP +++ /dev/null @@ -1,2 +0,0 @@ -MkDir("HOME/Tanks"); - diff --git a/TempleOS/Apps/Tanks/Load.CPP b/TempleOS/Apps/Tanks/Load.CPP deleted file mode 100644 index d6a8cef..0000000 --- a/TempleOS/Apps/Tanks/Load.CPP +++ /dev/null @@ -1 +0,0 @@ -#include "/TempleOS/Apps/Tanks/Tanks" diff --git a/TempleOS/Apps/Tanks/Run.CPP b/TempleOS/Apps/Tanks/Run.CPP deleted file mode 100644 index 8c980b5..0000000 --- a/TempleOS/Apps/Tanks/Run.CPP +++ /dev/null @@ -1,2 +0,0 @@ -#include "/TempleOS/Apps/Tanks/Load" -Tanks; \ No newline at end of file diff --git a/TempleOS/Apps/TimeClock/Install.CPP b/TempleOS/Apps/TimeClock/Install.CPP index 0102d5b..1a84ee3 100644 --- a/TempleOS/Apps/TimeClock/Install.CPP +++ b/TempleOS/Apps/TimeClock/Install.CPP @@ -1,5 +1,6 @@ MkDir("HOME/TimeClock"); -"$$CL$$After Loading, type $$FG,GREEN$$PunchIn;$$FG$$, " -"$$FG,GREEN$$PunchOut;$$FG$$ or $$FG,GREEN$$TimeRep;$$FG$$" -" You might want to make PLUGINS for hot keys.\n\n\n"; +DocClear; +"After Loading, type $$FG,GREEN$$PunchIn;$$FG$$, " +"$$FG,GREEN$$PunchOut;$$FG$$ or $$FG,GREEN$$TimeRep;$$FG$$\n" +"You might want to make PLUGINS for hot keys.\n\n\n"; diff --git a/TempleOS/Apps/TimeClock/TimeClk.CPP b/TempleOS/Apps/TimeClock/TimeClk.CPP index 3ea46a9..f8016c2 100644 --- a/TempleOS/Apps/TimeClock/TimeClk.CPP +++ b/TempleOS/Apps/TimeClock/TimeClk.CPP @@ -85,7 +85,7 @@ public Bool TimeRep(TimeEntry **_header=NULL) if (week!=cur_week) { if (!first) { if (is_in) - week_total+=GetCurTimeCDate; + week_total+=GetCurTimeDate; "Week Total:%h7T\n",week_total; } else first=FALSE; @@ -107,7 +107,7 @@ public Bool TimeRep(TimeEntry **_header=NULL) tempt=tempt->next; } if (is_in) - week_total+=GetCurTimeCDate; + week_total+=GetCurTimeDate; "$$FG,RED$$Week Total:%h7T$$FG$$\n",week_total; if (!_header) TimeEntriesDel(header); @@ -124,7 +124,7 @@ public U0 PunchOut() else { tempt=MAlloc(sizeof(TimeEntry)); tempt->type=TET_PUNCH_OUT; - tempt->datetime=GetCurTimeCDate; + tempt->datetime=GetCurTimeDate; "\nEnter Description.\nPress when done.\n"; if (!(tempt->desc=MGetS(GETSF_WITH_NEW_LINE))) tempt->desc=CAlloc(1); @@ -144,7 +144,7 @@ public U0 PunchIn() else { tempt=MAlloc(sizeof(TimeEntry)); tempt->type=TET_PUNCH_IN; - tempt->datetime=GetCurTimeCDate; + tempt->datetime=GetCurTimeDate; "\nEnter Description.\nPress when done.\n"; if (!(tempt->desc=MGetS(GETSF_WITH_NEW_LINE))) tempt->desc=CAlloc(1); diff --git a/TempleOS/Apps/TimeOut/Load.CPP b/TempleOS/Apps/TimeOut/Load.CPP new file mode 100644 index 0000000..992cecc --- /dev/null +++ b/TempleOS/Apps/TimeOut/Load.CPP @@ -0,0 +1,5 @@ +#help_index "Games" + +#include "/TempleOS/Apps/TimeOut/TimeOut" + +#help_index "" diff --git a/TempleOS/Apps/TimeOut/Run.CPP b/TempleOS/Apps/TimeOut/Run.CPP new file mode 100644 index 0000000..6711002 --- /dev/null +++ b/TempleOS/Apps/TimeOut/Run.CPP @@ -0,0 +1,2 @@ +#include "/TempleOS/Apps/TimeOut/Load" +TimeOut; \ No newline at end of file diff --git a/TempleOS/Apps/Timeout/Timeout.CPP b/TempleOS/Apps/TimeOut/TimeOut.CPP similarity index 93% rename from TempleOS/Apps/Timeout/Timeout.CPP rename to TempleOS/Apps/TimeOut/TimeOut.CPP index 8150321..1f99670 100644 --- a/TempleOS/Apps/Timeout/Timeout.CPP +++ b/TempleOS/Apps/TimeOut/TimeOut.CPP @@ -1,5 +1,5 @@ -AcctRegSetDftEntry("TempleOS/Timeout","I64 best_score=0;\n"); -AcctRegExecuteBranch("TempleOS/Timeout"); +AcctRegSetDftEntry("TempleOS/TimeOut","I64 best_score=0;\n"); +AcctRegExeBranch("TempleOS/TimeOut"); #define MAP_HEIGHT 4096 #define SHOT_LEN 10 @@ -32,33 +32,27 @@ class Man I64 total_score,friendly_fire,enemy_by_friendly,friendly_left,enemy_left, main_loop_pass; Bool game_over; -$BG,14$$FB,1$ +$BG,14$ - - -$SP,"fighter",1$ +$SP,"<1>",1$ -$SP,"friendly",2$ +$SP,"<2>",2$ -$SP,"enemy",3$ +$SP,"<3>",3$ -$SP,"dead friendly",4$ - - -$SP,"dead enemy",5$ - - +$SP,"<4>",4$ +$SP,"<5>",5$ #define LANDSCAPE_TYPES 4 @@ -66,18 +60,20 @@ $SP,"dead enemy",5$ -$SP,"Tree",6$ + + +$SP,"<6>",6$ -$SP,"rock",7$ +$SP,"<7>",7$ -$SP,"mountain",8$ +$SP,"<8>",8$ @@ -85,7 +81,7 @@ $SP,"mountain",8$ -$SP,"castle",9$ +$SP,"<9>",9$ @@ -121,7 +117,6 @@ U0 DrawIt(CTask *task,CDC *dc) Man *tempm; Shot *temps; - task->text_attr=YELLOW<<4; for (i=0;iwin_pixel_bottom+32) @@ -419,7 +414,7 @@ U0 MenFight(I64 phase_group) } } -U0 Timeout() +U0 TimeOut() { I64 i,msg_code,p1,p2; Bool gun_on; @@ -456,6 +451,7 @@ U0 Timeout() "\n"; PressAKey; + Fs->text_attr=YELLOW<<4+CYAN; Init; DocCursor; DocClear; @@ -595,7 +591,7 @@ to_done: CatchAll; SettingsPop; MenuPop; - AcctRegWriteBranch("TempleOS/Timeout","I64 best_score=%d;\n",best_score); + AcctRegWriteBranch("TempleOS/TimeOut","I64 best_score=%d;\n",best_score); } Á (OîÿÿÿÁÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ @@ -797,4 +793,4 @@ to_done: ñÿÿÿîÿÿÿ éÿÿÿçÿÿÿ âÿÿÿàÿÿÿÛÿÿÿÑÿÿÿ -õÿÿÿ óÿÿÿ‚$ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ’y=ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ Ê8ryÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿâ 66æÿÿÿêÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ úÿÿÿþÿÿÿÿÿÿÿÿÿÿ  ÿÿÿÿ  ÿÿÿÿÿ ÿÿÿÿÿÿÿÿÿ ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿò÷ÿÿÿöÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ ÿÿÿÿÿÿÿÿÿ ÿÿÿÿÿ  ÿÿÿ ÿÿÿ ÿÿ ÿÿÿÿÿ ÿÿÿÿ ÿÿÿÿÿÿÿÿÿ ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿòùÿÿÿøÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ ÿÿÿÿÿÿÿÿ ÿÿÿÿÿÿÿ ÿÿÿ ÿÿÿÿÿÿÿ ÿÿ ÿÿÿÿÿÿ ÿÿÿÿ ÿÿÿÿÿÿÿ ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ øÿÿÿþÿÿÿÿÿÿÿÿÿÿÿÿÿ  ÿÿÿ  ÿÿ ÿÿÿÿ ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ \ No newline at end of file +õÿÿÿ óÿÿÿ‚$ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ’y=ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ Ê8ryÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿâ 66æÿÿÿêÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ  ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ  ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ  ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ  ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ  ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ   ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ  ÿÿÿÿÿÿÿÿ  ÿÿÿÿÿÿÿÿÿÿÿ  ÿÿÿÿÿÿÿÿÿÿÿ  ÿÿÿÿÿÿÿÿÿÿÿÿÿ  ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ  ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ  ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ  ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ  ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ úÿÿÿþÿÿÿÿÿÿÿÿÿÿ  ÿÿÿÿ  ÿÿÿÿÿ ÿÿÿÿÿÿÿÿÿ ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿò÷ÿÿÿöÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ ÿÿÿÿÿÿÿÿÿ ÿÿÿÿÿ  ÿÿÿ ÿÿÿ ÿÿ ÿÿÿÿÿ ÿÿÿÿ ÿÿÿÿÿÿÿÿÿ ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿòùÿÿÿøÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ ÿÿÿÿÿÿÿÿ ÿÿÿÿÿÿÿ ÿÿÿ ÿÿÿÿÿÿÿ ÿÿ ÿÿÿÿÿÿ ÿÿÿÿ ÿÿÿÿÿÿÿ ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ øÿÿÿþÿÿÿÿÿÿÿÿÿÿÿÿÿ  ÿÿÿ  ÿÿ ÿÿÿÿ ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ \ No newline at end of file diff --git a/TempleOS/Apps/Timeout/Load.CPP b/TempleOS/Apps/Timeout/Load.CPP deleted file mode 100644 index 45d183b..0000000 --- a/TempleOS/Apps/Timeout/Load.CPP +++ /dev/null @@ -1,5 +0,0 @@ -#help_index "Games" - -#include "/TempleOS/Apps/Timeout/Timeout" - -#help_index "" diff --git a/TempleOS/Apps/Timeout/Run.CPP b/TempleOS/Apps/Timeout/Run.CPP deleted file mode 100644 index d3933e7..0000000 --- a/TempleOS/Apps/Timeout/Run.CPP +++ /dev/null @@ -1,2 +0,0 @@ -#include "/TempleOS/Apps/Timeout/Load" -Timeout; \ No newline at end of file diff --git a/TempleOS/Apps/Tanks/AIs/Human.CPP b/TempleOS/Apps/ToTheFront/AIs/Human.CPP similarity index 93% rename from TempleOS/Apps/Tanks/AIs/Human.CPP rename to TempleOS/Apps/ToTheFront/AIs/Human.CPP index e0adab5..56e01c6 100644 --- a/TempleOS/Apps/Tanks/AIs/Human.CPP +++ b/TempleOS/Apps/ToTheFront/AIs/Human.CPP @@ -6,7 +6,7 @@ U0 TanksPlot() SetViewPlayer(cur_player); while (TRUE) { if (!alive_cnt[0] || !alive_cnt[1]) - throw (EXCEPT_LOCAL,T_GAME_OVER); + throw(EXCEPT_LOCAL,T_GAME_OVER); msg_code=GetMsg(&p1,&p2,1<row,tempu->col,enemy_player,TRUE,tempu->range*2*HEX_RADIUS))) PlotShot(tempu,target->row,target->col); } - throw (EXCEPT_LOCAL,T_TURN_OVER); + throw(EXCEPT_LOCAL,T_PHASE_OVER); } U0 TanksMove() @@ -56,7 +56,7 @@ U0 TanksMove() } } } - throw (EXCEPT_LOCAL,T_TURN_OVER); + throw(EXCEPT_LOCAL,T_PHASE_OVER); } U0 TanksFire() @@ -72,5 +72,6 @@ U0 TanksFire() Sleep(250*ANIMATION_DELAY); } } - throw (EXCEPT_LOCAL,T_TURN_OVER); + throw(EXCEPT_LOCAL,T_PHASE_OVER); } + diff --git a/TempleOS/Apps/ToTheFront/Install.CPP b/TempleOS/Apps/ToTheFront/Install.CPP new file mode 100644 index 0000000..5ed4b7a --- /dev/null +++ b/TempleOS/Apps/ToTheFront/Install.CPP @@ -0,0 +1,2 @@ +MkDir("HOME/ToTheFront"); + diff --git a/TempleOS/Apps/ToTheFront/Load.CPP b/TempleOS/Apps/ToTheFront/Load.CPP new file mode 100644 index 0000000..a3c402a --- /dev/null +++ b/TempleOS/Apps/ToTheFront/Load.CPP @@ -0,0 +1 @@ +#include "/TempleOS/Apps/ToTheFront/ToTheFront" diff --git a/TempleOS/Apps/ToTheFront/Run.CPP b/TempleOS/Apps/ToTheFront/Run.CPP new file mode 100644 index 0000000..a3bedd1 --- /dev/null +++ b/TempleOS/Apps/ToTheFront/Run.CPP @@ -0,0 +1,2 @@ +#include "/TempleOS/Apps/ToTheFront/Load" +ToTheFront; \ No newline at end of file diff --git a/TempleOS/Apps/Tanks/Tanks.CPP b/TempleOS/Apps/ToTheFront/ToTheFront.CPP similarity index 92% rename from TempleOS/Apps/Tanks/Tanks.CPP rename to TempleOS/Apps/ToTheFront/ToTheFront.CPP index f75c5a9..a6d2247 100644 --- a/TempleOS/Apps/Tanks/Tanks.CPP +++ b/TempleOS/Apps/ToTheFront/ToTheFront.CPP @@ -30,14 +30,14 @@ Alteration Ideas: This is an advantage of just-in-time compilation. You can't change them when you start a game over, however. A down-side of this -is you can't use the auto-indent feature. +is you can't use the compile chk feature. */ - #define HEX_SIDE 11 + #exe { - CTask *task; - PopUpFile("/TempleOS/Demo/Graphics/RotateTank.CPP",FALSE,NULL,&task); + CTask *rotate_tank_task; F64 d; + PopUpFile("/TempleOS/Demo/Graphics/RotateTank.CPP",FALSE,NULL,&rotate_tank_task); PopUpOk("This aspires to be a rip-off of\n" "the Perfect General, but has tank\n" "facing like the board game,\n" @@ -60,11 +60,10 @@ is you can't use the auto-indent feature. DefinePrintF("HEX_RADIUS","%12.9f",DSIN+0.01); //slop d=PopUpRangeF64(0,100,25,"%3f% %%","Animation Delay\n"); DefinePrintF("ANIMATION_DELAY","%5.3f",d/100.0); - XTalk(task," "); - TaskWait(task); - Kill(task); -}; - + XTalk(rotate_tank_task," "); + TaskWait(rotate_tank_task); + Kill(rotate_tank_task); +} I64 map_cols=(MAP_WIDTH-DCOS)/(2*HEX_SIDE+2*DCOS), map_rows=ToI64((MAP_HEIGHT-DSIN)/DSIN)&~1, @@ -74,7 +73,6 @@ I64 map_cols=(MAP_WIDTH-DCOS)/(2*HEX_SIDE+2*DCOS), CDC *map; U8 terrain[map_rows][map_cols]; - //Centers of hexes class Pt { @@ -154,8 +152,8 @@ class Unit Unit units[2][MAX_UNITS]; -// Bt(visible_unit_bitmap,p1+p0*MAX_UNITS) -U8 visible_unit_bitmap[2][MAX_UNITS*MAX_UNITS>>3]; +// Bt(visible_unit_bitmap,p1+p0*((MAX_UNITS+7)&~7)) +U8 visible_unit_bitmap[2][(((MAX_UNITS+7)&~7)*MAX_UNITS)>>3]; #define PHASE_START 0 #define PHASE_PLOT 0 @@ -172,7 +170,6 @@ U8 visible_unit_bitmap[2][MAX_UNITS*MAX_UNITS>>3]; I64 phase,cur_player,enemy_player,view_player,turn,cursor_row,cursor_col,alive_cnt[2], plot_routines[2],move_routines[2],fire_routines[2]; - U0 Toward(I64 *_row,I64 *_col,I64 direction) { switch (direction) { @@ -296,7 +293,7 @@ Bool LOS(I64 r1,I64 c1,I64 r2,I64 c2) l.r1=r1; l.c1=c1; l.r2=r2; l.c2=c2; l.distance=Sqrt(SqrI64(x1-x2)+SqrI64(y1-y2)); - return Line(&l,x1,y1,0,x2,y2,l.distance,&LOSPlot); + return LOSLine(&l,x1,y1,0,x2,y2,l.distance,&LOSPlot); } #define RV_ONE_FRIENDLY_UNIT 0 @@ -327,11 +324,11 @@ U0 RVMerge(I64 player) { I64 i,j; Unit *ut1; - U8 *dst,*src,*mask=CAlloc(MAX_UNITS>>3); - src=&visible_unit_bitmap[player]; + U8 *dst,*src,*mask=CAlloc((MAX_UNITS+7)>>3); for (j=0;j>3]; dst=mask; - for (i=0;i>3;i++) //p1 + for (i=0;i<(MAX_UNITS+7)>>3;i++) //p1 *dst++|=*src++; } ut1=&units[player^1][0]; @@ -373,7 +370,7 @@ Bool MPRecalcVisible(MPCtrl1 *job) } } if (job->mode==RV_UPDATE_FRIENDLY_UNIT) - LBEqu(&visible_unit_bitmap[cur_player],i+job->tempu->num*MAX_UNITS,seen); + LBEqu(&visible_unit_bitmap[cur_player],i+job->tempu->num*((MAX_UNITS+7)&~7),seen); } break; case RV_ONE_ENEMY_UNIT: @@ -381,10 +378,10 @@ Bool MPRecalcVisible(MPCtrl1 *job) for (i=job->lo;ihi;i++,ut1++) if (ut1->life>0 && LOS(row,col,ut1->row,ut1->col)) { - LBts(&visible_unit_bitmap[enemy_player],job->tempu->num+i*MAX_UNITS); + LBts(&visible_unit_bitmap[enemy_player],job->tempu->num+i*((MAX_UNITS+7)&~7)); result=TRUE; } else - LBtr(&visible_unit_bitmap[enemy_player],job->tempu->num+i*MAX_UNITS); + LBtr(&visible_unit_bitmap[enemy_player],job->tempu->num+i*((MAX_UNITS+7)&~7)); break; case RV_ALL_UNITS: ut0=&units[cur_player][0]; @@ -396,13 +393,13 @@ Bool MPRecalcVisible(MPCtrl1 *job) if (ut1->life>0 && LOS(ut0->row,ut0->col,ut1->row,ut1->col)) { LBts(&ut1->visible[cur_player],0); - LBts(&visible_unit_bitmap[cur_player],j+i*MAX_UNITS); + LBts(&visible_unit_bitmap[cur_player],j+i*((MAX_UNITS+7)&~7)); } else - LBtr(&visible_unit_bitmap[cur_player],j+i*MAX_UNITS); + LBtr(&visible_unit_bitmap[cur_player],j+i*((MAX_UNITS+7)&~7)); } } else for (j=job->lo;jhi;j++) - LBtr(&visible_unit_bitmap[cur_player],j+i*MAX_UNITS); + LBtr(&visible_unit_bitmap[cur_player],j+i*((MAX_UNITS+7)&~7)); ut0=&units[enemy_player][0]; for (i=0;ilife>0) { @@ -412,13 +409,13 @@ Bool MPRecalcVisible(MPCtrl1 *job) if (ut1->life>0 && LOS(ut0->row,ut0->col,ut1->row,ut1->col)) { LBts(&ut1->visible[enemy_player],0); - LBts(&visible_unit_bitmap[enemy_player],j+i*MAX_UNITS); + LBts(&visible_unit_bitmap[enemy_player],j+i*((MAX_UNITS+7)&~7)); } else - LBtr(&visible_unit_bitmap[enemy_player],j+i*MAX_UNITS); + LBtr(&visible_unit_bitmap[enemy_player],j+i*((MAX_UNITS+7)&~7)); } } else for (j=job->lo;jhi;j++) - LBtr(&visible_unit_bitmap[enemy_player],j+i*MAX_UNITS); + LBtr(&visible_unit_bitmap[enemy_player],j+i*((MAX_UNITS+7)&~7)); break; } return result; @@ -438,11 +435,10 @@ stk size, so don't get in the habit. $LK,"MAlloc","MN:MAlloc"$() would probably be the better choice. */ MPCtrl1 job[mp_cnt]; - CMPCmd *cmd[mp_cnt]; - + CSrvCmd *cmd[mp_cnt]; if (mode==RV_FRIENDLY_UNIT_DIED) { - MemSet(&visible_unit_bitmap[enemy_player]+tempu->num*MAX_UNITS>>3,0,MAX_UNITS>>3); + MemSet((&visible_unit_bitmap[enemy_player])(U8 *)+(tempu->num*((MAX_UNITS+7)&~7))>>3,0,(MAX_UNITS+7)>>3); RVMerge(enemy_player); return 0; //return any value--don't care } @@ -468,12 +464,11 @@ $LK,"MAlloc","MN:MAlloc"$() would probably be the better choice. job[i].lo=k; } - - for (i=cnt-1;i>0;i--) - cmd[i]=MPJob(&MPRecalcVisible,&job[i],i,0); - result=MPRecalcVisible(&job[0]); - for (i=cnt-1;i>0;i--) - if (MPJobResult(cmd[i])) + result=FALSE; + for (i=0;i0;i--) - cmd[i]=MPJob(&MPRecalcVisibleMap,&job[i],i,0); - MPRecalcVisibleMap(&job[0]); - for (i=cnt-1;i>0;i--) - MPJobResult(cmd[i]); + for (i=0;ifired=TRUE; - if (hit) { r=target->row;c=target->col; if ((facing=MoveOneHex(&r,&c,x1,y1))>=0) @@ -851,7 +843,7 @@ U0 IndirectFireResolve() tempi->row+=row_offsets[i]; RowCol2XY(&x2,&y2,tempi->row,tempi->col); } - Line(NULL,x1,y1,0,x2,y2,0,&FirePlot); + LOSLine(NULL,x1,y1,0,x2,y2,0,&FirePlot); firing=FALSE; tempu->fired=TRUE; indirect_row=tempi->row; @@ -1263,13 +1255,15 @@ U0 NewPhase() IndirectFireResolve; NewTurn; } - + + Fs->border_src=BDS_CONST; if (phase&~1==PHASE_PLOT) Fs->border_attr=WHITE<<4+PURPLE; else if (phase&~1==PHASE_MOVE) Fs->border_attr=WHITE<<4+GREEN; else Fs->border_attr=WHITE<<4+RED; + SleepUntil(msg_off_timeout); msg_off_timeout=sys_jiffies+JIFFY_FREQ*2*ANIMATION_DELAY+1; Snd(1000); @@ -1323,25 +1317,21 @@ U0 CleanUp() QueDel(&indirect_root,TRUE); } -#define T_TURN_OVER 0 +#define T_PHASE_OVER 0 #define T_GAME_OVER 1 #define T_NEW_GAME 2 #define T_EXIT_GAME 3 -extern U0 DrawIt(CTask *task,CDC *dc); - U0 HandleChar(U8 ch) { + I64 old_inhibit,old_draw_it; + Bool old_cursor; switch (ch) { case CH_ESC: case CH_SHIFT_ESC: - if (Fs->draw_it==&DrawIt) - throw(EXCEPT_LOCAL,T_EXIT_GAME); - else - Fs->draw_it=&DrawIt; - break; + throw(EXCEPT_LOCAL,T_EXIT_GAME); case CH_SPACE: - throw(EXCEPT_LOCAL,T_TURN_OVER); + throw(EXCEPT_LOCAL,T_PHASE_OVER); case '\n': throw(EXCEPT_LOCAL,T_NEW_GAME); case '1': @@ -1351,11 +1341,17 @@ U0 HandleChar(U8 ch) SetViewPlayer(1); break; case '3': - if (Fs->draw_it==&DrawIt) { - Fs->draw_it=Fs->next_settings->draw_it; - View; - } - Fs->draw_it=&DrawIt; + old_draw_it=Fs->draw_it; + old_inhibit=Fs->win_inhibit; + Fs->draw_it=Fs->next_settings->draw_it; + Fs->win_inhibit=0; + old_cursor=DocCursor(ON); + DocBottom; + View; + DocBottom; + DocCursor(old_cursor); + Fs->win_inhibit=old_inhibit; + Fs->draw_it=old_draw_it; break; } } @@ -1364,7 +1360,7 @@ U0 CheckUser() { U8 ch; if (!alive_cnt[0] || !alive_cnt[1]) - throw (EXCEPT_LOCAL,T_GAME_OVER); + throw(EXCEPT_LOCAL,T_GAME_OVER); if (ch=ScanChar) HandleChar(ch); } @@ -1379,11 +1375,11 @@ U0 PickAI(U8 *dirname,I64 player) st=MSPrintF("%s/*.CPP*",dirname); tempm=FilesFind(st); Free(st); - tempm2=FilesFind("HOME/Tanks/*.CPP*"); + tempm2=FilesFind("HOME/ToTheFront/*.CPP*"); tempm1=tempm; Silent(old_silent); - DocPrintF(doc,"Player %d Type\n\n",player+1); + DocPrintF(doc,"Player %d Type\n\n$$FG,LTBLUE$$",player+1); while (tempm1) { if (!(i++&3)) DocPutS(doc,"\n"); @@ -1403,13 +1399,15 @@ U0 PickAI(U8 *dirname,I64 player) Free(st); tempm1=tempm1->next; } - DocPutS(doc,"\n\n\nCreate your own AI in HOME/Tanks."); + DocPutS(doc,"\n\n\n$$FG$$Create your own AI in HOME/ToTheFront."); while ((tempm1=PopUpMenu(doc))<0); ExeFile(tempm1->full_name); DocDel(doc); CDirLstDel(tempm); CDirLstDel(tempm2); - ExePrintF("plot_routines[%d]=&TanksPlot;move_routines[%d]=&TanksMove;fire_routines[%d]=&TanksFire;",player,player,player); + ExePrintF("plot_routines[%d]=&TanksPlot;" + "move_routines[%d]=&TanksMove;" + "fire_routines[%d]=&TanksFire;",player,player,player); } @@ -1622,7 +1620,27 @@ U0 TaskEndCB() Exit; } -U0 Tanks() +I64 DoPhase() +{ + I64 result=T_EXIT_GAME; + NewPhase; + try { + if (phase&~1==PHASE_PLOT) + Call(plot_routines[cur_player]); + else if (phase&~1==PHASE_MOVE) + Call(move_routines[cur_player]); + else + Call(fire_routines[cur_player]); + } catch { + if (Fs->except_argc==2 && Fs->except_argv[0]==EXCEPT_LOCAL) { + Fs->catch_except=TRUE; + result=Fs->except_argv[1]; + } + } + return result; +} + +U0 ToTheFront() { I64 result,ch; map=DCNew(DCT_COLOR8,MAP_WIDTH,MAP_HEIGHT); @@ -1652,8 +1670,8 @@ U0 Tanks() WinBorder(ON); Preempt(OFF); Init; - PickAI("/TempleOS/Apps/Tanks/AIs",0); - PickAI("/TempleOS/Apps/Tanks/AIs",1); + PickAI("/TempleOS/Apps/ToTheFront/AIs",0); + PickAI("/TempleOS/Apps/ToTheFront/AIs",1); PopUpOk("Left-click to move or fire units.\n" "$$FG,GREEN$$$$FG$$ or right-click to end phase.\n" @@ -1668,36 +1686,18 @@ U0 Tanks() Fs->draw_it=&DrawIt; "$$FG,GREEN$$$$FG$$ to return to game.\n"; - NewPhase; try { do { - try { - result=T_EXIT_GAME; - if (phase&~1==PHASE_PLOT) - CallInd(plot_routines[cur_player]); - else if (phase&~1==PHASE_MOVE) - CallInd(move_routines[cur_player]); - else - CallInd(fire_routines[cur_player]); - } catch { - if (Fs->except_argc==2 && Fs->except_argv[0]==EXCEPT_LOCAL) { - Fs->catch_except=TRUE; - result=Fs->except_argv[1]; - } - } - switch (result) { - case T_TURN_OVER: - NewPhase; - break; + switch (result=DoPhase) { case T_GAME_OVER: while (TRUE) { msg_off_timeout=0; StrCpy(msg_buf,"Game Over"); Snd(0); - ch=GetChar(NULL,FALSE); + ch=GetChar(,FALSE); if (ch=='\n') { + CleanUp; Init; - NewPhase; break; } else if (ch==CH_ESC || ch==CH_SHIFT_ESC) { result=T_EXIT_GAME; @@ -1711,7 +1711,6 @@ U0 Tanks() case T_NEW_GAME: CleanUp; Init; - NewPhase; break; } } while (result!=T_EXIT_GAME); diff --git a/TempleOS/Apps/X-Caliber/X-Caliber.CPP b/TempleOS/Apps/X-Caliber/X-Caliber.CPP index eb0a100..9ef49b7 100644 --- a/TempleOS/Apps/X-Caliber/X-Caliber.CPP +++ b/TempleOS/Apps/X-Caliber/X-Caliber.CPP @@ -32,7 +32,7 @@ public isn't interested in realism. // ********************************** Glbls AcctRegSetDftEntry("TempleOS/XCaliber","I64 best_score=0;\n"); -AcctRegExecuteBranch("TempleOS/XCaliber"); +AcctRegExeBranch("TempleOS/XCaliber"); class MyMass:CMass { @@ -100,20 +100,20 @@ CMathODE *ode=NULL; I64 level,score,remaining; $BG,0$ -$SP,"",1$ +$SP,"<1>",1$ -$SP,"",2$ +$SP,"<2>",2$ -$SP,"",3$ +$SP,"<3>",3$ -$SP,"",4$ +$SP,"<4>",4$ -$SP,"",5$ +$SP,"<5>",5$ -$SP,"",6$ +$SP,"<6>",6$ $BG$ // ********************************** Ship @@ -376,7 +376,6 @@ U0 DrawIt(CTask *task,CDC *dc) U8 *img; Bool draw_laser_line=FALSE; - task->text_attr=BLACK<<4+WHITE; if (ode!=task->last_ode) return; dc->color=WHITE; @@ -476,7 +475,6 @@ U0 DrawIt(CTask *task,CDC *dc) draw_laser_line=TRUE; Snd(1000); } - break; } ctrl_panel.laser_temperature=temps->laser_temperature; @@ -584,7 +582,7 @@ U0 DrawIt(CTask *task,CDC *dc) D3Sub(&human->p[2].x,&human->p[0].x,&p2); D3Unit(D3Add(&p1,&p2,&p)); dc->color=LTBLUE; - Line(dc,human->p[0].x-10*p.x,human->p[0].y-10*p.y,0,human->p[0].x-800*p.x,human->p[0].y-800*p.y,0,&LaserPlot); + LOSLine(dc,human->p[0].x-10*p.x,human->p[0].y-10*p.y,0,human->p[0].x-800*p.x,human->p[0].y-800*p.y,0,&LaserPlot); } } @@ -837,7 +835,6 @@ U0 CheckDamage() Noise(750,1000,3000); } } - break; } temps=temps1; } @@ -893,7 +890,6 @@ U0 HumanFireBegin() break; default: human->lasering=TRUE; - break; } } } @@ -909,7 +905,6 @@ U0 HumanFireEnd() default: human->lasering=FALSE; Snd(0); - break; } } @@ -997,6 +992,7 @@ U0 XCaliber() CCtrl *cp=CtrlPanelNew; SettingsPush; //See $LK,"SettingsPush","MN:SettingsPush"$ + Fs->text_attr=BLACK<<4+WHITE; Preempt(OFF); MenuPush( "File {" diff --git a/TempleOS/Compiler/Assembler.CPP b/TempleOS/Compiler/Assembler.CPP index 3cb2a7c..8db8a0d 100644 --- a/TempleOS/Compiler/Assembler.CPP +++ b/TempleOS/Compiler/Assembler.CPP @@ -182,23 +182,6 @@ U0 AsmStoreCodeU8At(CLex *lx,U8 b,I64 ip) a->num_code_U8s=ip+1; } -U0 AsmReserveCodeTo(CLex *lx,I64 ip) -{ - CAsmCtrl *a=lx->a; - I64 i=ip>>ASM_CODE_BLK_BITS+1; - CAsmCodeBlk *tempc=&a->code; - while (i--) { - if (!tempc->next) { - tempc->next=CAlloc(sizeof(CAsmCodeBlk)); - tempc->next->next=NULL; - } - tempc=tempc->next; - } - if (ip>a->num_code_U8s) - a->num_code_U8s=ip; -} - - I64 AsmExpressionEval(CLex *lx) { U8 *exp; @@ -279,10 +262,10 @@ U0 AsmLocalsResolve(CLex *lx) Free(tempu); tempu=tempu1; } - HashTableDel(lx->local_hash_table); - lx->local_hash_table=lx->hash_table_lst->next= + HashTableDel(lx->htc.local_hash_table); + lx->htc.local_hash_table=lx->htc.hash_table_lst->next= HashTableNew(16); - lx->local_hash_table->next=lx->glbl_hash_table; + lx->htc.local_hash_table->next=lx->htc.glbl_hash_table; a->local_unresolved=NULL; a->has_locals=FALSE; } @@ -311,7 +294,7 @@ U0 AsmGlblsResolve(CLex *lx,CExe *ex) if (tempess->type & HTT_EXPORT_SYS_SYM && tempess->type & HTF_UNRESOLVED && !(tempess->type & HTF_IMPORT) && - (tempf=HashFind(tempess->str,lx->hash_table_lst,HTT_FUN)) && + (tempf=HashFind(tempess->str,lx->htc.hash_table_lst,HTT_FUN)) && !Bt(tempf->flags,Cf_EXTERN)) { tempess->val=tempf->executable_addr; tempess->type&=~HTF_UNRESOLVED; @@ -373,8 +356,8 @@ U0 AsmGlblsResolve(CLex *lx,CExe *ex) tempu=tempu1; } - tempess=lx->glbl_hash_table->next_added; - while (tempess!=lx->glbl_hash_table) { + tempess=lx->htc.glbl_hash_table->next_added; + while (tempess!=lx->htc.glbl_hash_table) { if (tempess->type & HTF_IMPORT && tempess->use_cnt) { if (tempe=tempess->ie_lst) { if (tempess->import_name) @@ -1310,7 +1293,7 @@ U0 PrsAsmBlk(CLex *lx) { CAsmCtrl *a=lx->a; I64 i,j,k,argcnt, - old_hash_mask=lx->hash_mask, + old_hash_mask=lx->htc.hash_mask, old_flags=lx->flags & LF_ASM_EXPRESSIONS; CHashOpcode *tempo; CHashExport *tempess; @@ -1318,7 +1301,7 @@ U0 PrsAsmBlk(CLex *lx) a->seg_size=64; lx->flags|=LF_ASM_EXPRESSIONS; - lx->hash_mask=lx->hash_mask&~(HTF_FLAGS_MASK|HTT_FILE|HTT_INTERNAL_TYPE|HTT_MODULE)|HTT_ASM_KEYWORD; + lx->htc.hash_mask=lx->htc.hash_mask&~(HTF_FLAGS_MASK|HTT_FILE|HTT_INTERNAL_TYPE|HTT_MODULE)|HTT_ASM_KEYWORD; if (lx->token!='{') LexExcept(lx,"ST_EXPECTING_LEFT_BRACE"); else @@ -1340,7 +1323,7 @@ U0 PrsAsmBlk(CLex *lx) tempess->str=lx->ident; lx->ident=0; tempess->type=HTT_EXPORT_SYS_SYM|HTF_UNRESOLVED; - HashAdd(tempess,lx->glbl_hash_table); + HashAdd(tempess,lx->htc.glbl_hash_table); tempess->type|=HTF_IMPORT; if (Lex(lx)==',') Lex(lx); //skip ',' @@ -1352,7 +1335,7 @@ U0 PrsAsmBlk(CLex *lx) Lex(lx); //skip ';'; break; case AKW_MODULE_ORG: - if (lx->local_var_lst) + if (lx->htc.local_var_lst) LexExcept(lx,"ST_NO_FUN_ASM_ORG"); if (a->module_org!=INVALID_PTR) LexExcept(lx,"ST_JUST_ONE_ORG_ALLOWED"); @@ -1361,7 +1344,7 @@ U0 PrsAsmBlk(CLex *lx) a->module_org=AsmExpressionEval(lx); break; case AKW_ALIGN: - if (lx->local_var_lst) + if (lx->htc.local_var_lst) LexExcept(lx,"ST_NO_FUN_ASM_ALIGN"); i=AsmExpressionEval(lx); if (Bsf(i)!=Bsr(i)) @@ -1470,10 +1453,10 @@ U0 PrsAsmBlk(CLex *lx) if (*tempess->str=='@' && tempess->str[1]=='@') { if (lx->token==TK_DBL_COLON) LexExcept(lx,"ST_NO_LOCAL_GLBL_EXPORT"); - HashAdd(tempess,lx->local_hash_table); + HashAdd(tempess,lx->htc.local_hash_table); a->has_locals=TRUE; } else - HashAdd(tempess,lx->glbl_hash_table); + HashAdd(tempess,lx->htc.glbl_hash_table); if (lx->token==TK_DBL_COLON) { tempess->type|=HTF_EXPORT; SetSrcFileInfo(lx,tempess); @@ -1489,8 +1472,7 @@ U0 PrsAsmBlk(CLex *lx) } } AsmLocalsResolve(lx); - AsmReserveCodeTo(lx,a->ip); lx->flags&=lx->flags&~LF_ASM_EXPRESSIONS|old_flags; - lx->hash_mask=old_hash_mask; + lx->htc.hash_mask=old_hash_mask; } diff --git a/TempleOS/Compiler/BackEnd.CPP b/TempleOS/Compiler/BackEnd.CPP index d5f443d..873cf24 100644 --- a/TempleOS/Compiler/BackEnd.CPP +++ b/TempleOS/Compiler/BackEnd.CPP @@ -220,18 +220,13 @@ U0 ICAddRSP(CIntermediateCode *tempi,I64 i,Bool optimize=TRUE) #define CN_MAIN 0 #define CN_P1 1 #define CN_P2 2 -#define CN_P3 3 -#define CN_R 4 +#define CN_R 3 U0 CmpNoteFloatOp(CLex *lx,CIntermediateCode *tempi,Bool dont_pushable,Bool dont_popable,I64 pos) { Bool link=FALSE; if (lx->pass==7 && lx->last_float_op_ic && lx->last_dont_popable && dont_pushable) { nobound_switch (pos) { - case CN_P3: - if (lx->last_float_op_ic!=tempi && lx->dont_push_float) - link=TRUE; - break; case CN_P2: if (lx->last_float_op_ic!=tempi && lx->dont_push_float) link=TRUE; @@ -345,12 +340,21 @@ U0 ICCopyTemplate(CLex *lx,CIntermediateCode *tempi,I64 op, extern U0 ICMov(CIntermediateCode *tempi,I64 t1,I64 r1,I64 d1,I64 t2,I64 r2,I64 d2,I64 ip); -I64 ICModr(I64 r,I64 t2,I64 r2,I64 d2) +#define MDR_REG 0 +#define MDR_INDIRECT_REG 1 +#define MDR_D8_INDIRECT_REG 2 +#define MDR_D32_INDIRECT_REG 3 +#define MDR_SIB_INDIRECT_REG 4 +#define MDR_SIB_D8_INDIRECT_REG 5 +#define MDR_SIB_D32_INDIRECT_REG 6 +#define MDR_RIP_REL 7 + +I64 ICModr1(I64 r,I64 t2,I64 r2,I64 d2) { - //result.u[0] is type 0=[REG],1=disp8[REG],2=disp32[REG],3=REG,4=RIP_REL - //result.u[1] is REX - //result.u[2] is ModR - //result.u[3] is SIB + //result.u8[0] is type + //result.u8[1] is REX + //result.u8[2] is ModR + //result.u8[3] is SIB I64 result=0; if (t2&TY_MASK>TY_RIP_DISP32) { "Callers:%P;%P\n",Caller,Caller(2); @@ -365,21 +369,13 @@ I64 ICModr(I64 r,I64 t2,I64 r2,I64 d2) r&=7; } switch (t2>>4) { - case TY_RIP_DISP32>>4: - result.u8[2]=0x05+r<<3; - result.u8[0]=4; - if (result.u8[1]==0x40 && - (t2&IT_MASK>=IT_I16 || - r<4)) - result.u8[1]=0; - break; case TY_REG>>4: if (r2>7) { result.u8[1]++; r2&=7; } result.u8[2]=0xC0+r<<3+r2; - result.u8[0]=3; + result.u8[0]=MDR_REG; if (result.u8[1]==0x40 && (t2&IT_MASK>=IT_I16 || r<4 && r2<4)) @@ -392,13 +388,13 @@ I64 ICModr(I64 r,I64 t2,I64 r2,I64 d2) } if (!d2 && r2!=CREG_RBP) { result.u8[2]=r<<3+r2; - result.u8[0]=0; + result.u8[0]=MDR_INDIRECT_REG; } else if (MIN_I8<=d2<=MAX_I8) { result.u8[2]=0x40+r<<3+r2; - result.u8[0]=1; + result.u8[0]=MDR_D8_INDIRECT_REG; } else { result.u8[2]=0x80+r<<3+r2; - result.u8[0]=2; + result.u8[0]=MDR_D32_INDIRECT_REG; } if (result.u8[1]==0x40 && (t2&IT_MASK>=IT_I16 || @@ -413,18 +409,18 @@ I64 ICModr(I64 r,I64 t2,I64 r2,I64 d2) if (r2.u8[0]==CREG_NONE) { result.u8[3]=5+(r2.u8[1]&7)<<3+r2.u8[1]&0xC0; result.u8[2]=4+r<<3; - result.u8[0]=2; + result.u8[0]=MDR_SIB_D32_INDIRECT_REG; } else { result.u8[3]=r2.u8[0]&7+(r2.u8[1]&7)<<3+r2.u8[1]&0xC0; if (!d2 && r2.u8[0]&7!=CREG_RBP) { result.u8[2]=4+r<<3; - result.u8[0]=0; + result.u8[0]=MDR_SIB_INDIRECT_REG; } else if (MIN_I8<=d2<=MAX_I8) { result.u8[2]=0x44+r<<3; - result.u8[0]=1; + result.u8[0]=MDR_SIB_D8_INDIRECT_REG; } else { result.u8[2]=0x84+r<<3; - result.u8[0]=2; + result.u8[0]=MDR_SIB_D32_INDIRECT_REG; } } if (result.u8[1]==0x40 && @@ -432,37 +428,76 @@ I64 ICModr(I64 r,I64 t2,I64 r2,I64 d2) r<4)) result.u8[1]=0; break; + case TY_RIP_DISP32>>4: + result.u8[2]=0x05+r<<3; + result.u8[0]=MDR_RIP_REL; + if (result.u8[1]==0x40 && + (t2&IT_MASK>=IT_I16 || + r<4)) + result.u8[1]=0; + break; } return result; } -#define SLASH_OP_INC 0x00000000FFFE00 -#define SLASH_OP_DEC 0x00000000FFFE01 -#define SLASH_OP_NOT 0x00000000F7F602 -#define SLASH_OP_NEG 0x00000000F7F603 -#define SLASH_OP_MUL 0x00000000F7F604 -#define SLASH_OP_IMUL 0x00000000F7F605 -#define SLASH_OP_DIV 0x00000000F7F606 -#define SLASH_OP_MOV 0x00000000898800 -#define SLASH_OP_PUSH 0x00000000FFFF06 -#define SLASH_OP_POP 0x000000008F8F00 -#define SLASH_OP_FADD 0x01C1DE00DCDC00 -#define SLASH_OP_FSUB 0x01E9DE00DCDC04 -#define SLASH_OP_FSUBR 0x01E1DE00DCDC05 -#define SLASH_OP_FMUL 0x01C9DE00DCDC01 -#define SLASH_OP_FDIV 0x01F9DE00DCDC06 -#define SLASH_OP_FDIVR 0x01F1DE00DCDC07 -#define SLASH_OP_FLD 0x01000000DDDD00 -#define SLASH_OP_FSTP 0x01000000DDDD03 -#define SLASH_OP_FISTTP 0x01000000DDDD01 -#define SLASH_OP_FILD 0x01000000DFDF05 +U0 ICModr2(CIntermediateCode *tempi,I64 i,I64 d,I64 ip=0) +{//t=0 means no SIB + nobound_switch (i.u8[0]) { + case MDR_REG: + break; + case MDR_INDIRECT_REG: + break; + case MDR_D8_INDIRECT_REG: + ICU8(tempi,d); + break; + case MDR_D32_INDIRECT_REG: + ICU32(tempi,d); + break; + case MDR_SIB_INDIRECT_REG: + ICU8(tempi,i.u8[3]); + break; + case MDR_SIB_D8_INDIRECT_REG: + ICU8(tempi,i.u8[3]); + ICU8(tempi,d); + break; + case MDR_SIB_D32_INDIRECT_REG: + ICU8(tempi,i.u8[3]); + ICU32(tempi,d); + break; + case MDR_RIP_REL: + ICU32(tempi,d-(ip+tempi->ic_cnt)); + tempi->ic_flags&=~ICF_CODE_FINAL; + break; + } +} + +#define SLASH_OP_INC 0x0003000000FFFE00 +#define SLASH_OP_DEC 0x052B000000FFFE01 +#define SLASH_OP_NOT 0x0000000000F7F602 +#define SLASH_OP_NEG 0x0000000000F7F603 +#define SLASH_OP_MUL 0x0000000000F7F604 +#define SLASH_OP_IMUL 0x0000000000F7F605 +#define SLASH_OP_DIV 0x0000000000F7F606 +#define SLASH_OP_MOV 0x0000000000898800 +#define SLASH_OP_PUSH 0x0000000000FFFF06 +#define SLASH_OP_POP 0x00000000008F8F00 +#define SLASH_OP_FADD 0x0000C1DE01DCDC00 +#define SLASH_OP_FSUB 0x0000E9DE01DCDC04 +#define SLASH_OP_FSUBR 0x0000E1DE01DCDC05 +#define SLASH_OP_FMUL 0x0000C9DE01DCDC01 +#define SLASH_OP_FDIV 0x0000F9DE01DCDC06 +#define SLASH_OP_FDIVR 0x0000F1DE01DCDC07 +#define SLASH_OP_FLD 0x0000000001DDDD00 +#define SLASH_OP_FSTP 0x0000000001DDDD03 +#define SLASH_OP_FISTTP 0x0000000001DDDD01 +#define SLASH_OP_FILD 0x0000000001DFDF05 U0 ICSlashOp(CIntermediateCode *tempi,I64 t1,I64 r1,I64 d1,I64 op,I64 ip) { I64 i; - if (t1&TY_MASK==TY_REG && !op.u8[6]) + if (t1&TY_MASK==TY_REG && !op.u8[3]) t1=t1&(TY_MASK|1)+IT_I64; //Set to 64 bit, preserving signed/unsigned - i=ICModr(op.u8[0],t1,r1,d1); + i=ICModr1(op.u8[0],t1,r1,d1); if (tempi->ic_flags&ICF_LOCK && op!=SLASH_OP_MOV && t1&TY_MASK!=TY_REG) ICU8(tempi,OC_LOCK_PREFIX); @@ -478,20 +513,11 @@ U0 ICSlashOp(CIntermediateCode *tempi,I64 t1,I64 r1,I64 d1,I64 op,I64 ip) ICU16(tempi,i.u8[2]<<8+op.u8[2]); break; default: - if (i.u8[1]!=0x48 || !op.u8[6]) + if (i.u8[1]!=0x48 || !op.u8[3]) ICRex(tempi,i.u8[1]); ICU16(tempi,i.u8[2]<<8+op.u8[2]); } - if (t1&TY_MASK==TY_SIB) - ICU8(tempi,i.u8[3]); - if (i.u8[0]==1) - ICU8(tempi,d1); - else if (i.u8[0]==2) - ICU32(tempi,d1); - else if (i.u8[0]==4) { - ICU32(tempi,d1-(ip+tempi->ic_cnt+4)); - tempi->ic_flags&=~ICF_CODE_FINAL; - } + ICModr2(tempi,i,d1,ip+4); } U0 ICPush(CIntermediateCode *tempi,I64 t1,I64 r1,I64 d1,I64 ip) @@ -629,7 +655,7 @@ I64 ICBuiltInFloatConst(F64 d) U0 ICMov(CIntermediateCode *tempi,I64 t1,I64 r1,I64 d1,I64 t2,I64 r2,I64 d2,I64 ip) { - I64 i,last_cnt=tempi->ic_cnt; + I64 i,j,last_cnt=tempi->ic_cnt; CIntermediateCode *tempil1; U8 *body; Bool old_lock=Btr(&tempi->ic_flags,ICf_LOCK); @@ -696,15 +722,17 @@ U0 ICMov(CIntermediateCode *tempi,I64 t1,I64 r1,I64 d1,I64 t2,I64 r2,I64 d2,I64 t2=TY_REG+IT_I64; if (ICLastIns(tempi,&tempil1,&body)) { i=tempil1->ic_cnt; + j=0x48+(r1>7); + if (r2>7) j+=4; if (tempil1->ic_last_cnt==i-3 && body[i-2]==0x8B && body[i-1]==0xC0+r1&7+(r2&7)<<3 && - body[i-3]==0x48+ (r2>7 ? 4:0)+(r1>7) ) { + body[i-3]==j ) { goto move_done; } } } - i=ICModr(r1,t2,r2,d2); + i=ICModr1(r1,t2,r2,d2); if (t2&IT_MASK!=IT_U32) i|=0x4800; ICRex(tempi,i.u8[1]); @@ -728,16 +756,7 @@ U0 ICMov(CIntermediateCode *tempi,I64 t1,I64 r1,I64 d1,I64 t2,I64 r2,I64 d2,I64 default: ICU16(tempi,i.u8[2]<<8+0x8B); } - if (t2&TY_MASK==TY_SIB) - ICU8(tempi,i.u8[3]); - if (i.u8[0]==1) - ICU8(tempi,d2); - else if (i.u8[0]==2) - ICU32(tempi,d2); - else if (i.u8[0]==4) { - ICU32(tempi,d2-(ip+tempi->ic_cnt+4)); - tempi->ic_flags&=~ICF_CODE_FINAL; - } + ICModr2(tempi,i,d2,ip+4); } break; case TY_STK>>4: @@ -751,7 +770,7 @@ U0 ICMov(CIntermediateCode *tempi,I64 t1,I64 r1,I64 d1,I64 t2,I64 r2,I64 d2,I64 case TY_SIB>>4: if (t2&TY_MASK==TY_IMM && (t1&IT_MASKic_cnt+4); switch (t1&IT_MASK) { case IT_I8: @@ -790,6 +805,7 @@ U0 ICMov(CIntermediateCode *tempi,I64 t1,I64 r1,I64 d1,I64 t2,I64 r2,I64 d2,I64 ICU32(tempi,i); tempi->ic_flags&=~ICF_CODE_FINAL; } + switch (t1&IT_MASK) { case IT_I8: case IT_U8: @@ -824,19 +840,10 @@ U0 ICLea(CIntermediateCode *tempi,I64 t1,I64 r1,I64 d1,I64 t2,I64 r2,I64 d2,CLex CExeAbsAddr *tempa; switch (t1>>4) { case TY_REG>>4: - i=ICModr(r1,t2,r2,d2); + i=ICModr1(r1,t2,r2,d2); i.u8[1]|=0x48; ICU24(tempi,i.u8[2]<<16+0x8D00+i.u8[1]); - if (t2&TY_MASK==TY_SIB) - ICU8(tempi,i.u8[3]); - if (i.u8[0]==1) - ICU8(tempi,d2); - else if (i.u8[0]==2) - ICU32(tempi,d2); - else if (i.u8[0]==4) { - ICU32(tempi,d2-(ip+tempi->ic_cnt+4)); - tempi->ic_flags&=~ICF_CODE_FINAL; - } + ICModr2(tempi,i,d2,ip+4); break; case TY_STK>>4: if (t2&TY_MASK==TY_RIP_DISP32) { @@ -863,19 +870,19 @@ U0 ICLea(CIntermediateCode *tempi,I64 t1,I64 r1,I64 d1,I64 t2,I64 r2,I64 d2,CLex U0 ICDeref(CIntermediateCode *tempi,I64 ip) { - I64 ty; - ty=tempi->r.type&IT_MASK; - if (ty>tempi->p1.ptype) - ty=tempi->p1.ptype; + I64 t; + t=tempi->r.type&IT_MASK; + if (t>tempi->p1.ptype) + t=tempi->p1.ptype; if (tempi->p1.type&TY_MASK==TY_REG) ICMov(tempi,tempi->r.type,tempi->r.reg,tempi->r.disp, - TY_DISP+ty,tempi->p1.reg,tempi->p1.disp,ip); + TY_DISP+t,tempi->p1.reg,tempi->p1.disp,ip); else { ICMov(tempi,TY_REG+IT_I64,CREG_RCX,0, tempi->p1.type,tempi->p1.reg,tempi->p1.disp,ip); ICMov(tempi,tempi->r.type,tempi->r.reg,tempi->r.disp, - TY_DISP+ty,CREG_RCX,0,ip); + TY_DISP+t,CREG_RCX,0,ip); } } @@ -895,21 +902,12 @@ U0 ICAddEct(CIntermediateCode *tempi,I64 t1,I64 r1,I64 d1, if (t1&TY_MASK==TY_REG && !(r2==r1 && TY_REG<=t2&TY_MASK<=TY_SIB)) result_reg=r1; ICMov(tempi,TY_REG+IT_I64,result_reg,0,t3,r3,d3,ip); - i=ICModr(result_reg,t2,r2,d2); + i=ICModr1(result_reg,t2,r2,d2); if (tempi->ic_flags&ICF_LOCK) ICU8(tempi,OC_LOCK_PREFIX); ICRex(tempi,i.u8[1]); ICU16(tempi,i.u8[2]<<8+op); - if (t2&TY_MASK==TY_SIB) - ICU8(tempi,i.u8[3]); - if (i.u8[0]==1) - ICU8(tempi,d2); - else if (i.u8[0]==2) - ICU32(tempi,d2); - else if (i.u8[0]==4) { - ICU32(tempi,d2-(ip+tempi->ic_cnt+4)); - tempi->ic_flags&=~ICF_CODE_FINAL; - } + ICModr2(tempi,i,d2,ip+4); } else { if (t2&TY_MASK==TY_REG) temp=r2; @@ -945,12 +943,12 @@ U0 ICAddEct(CIntermediateCode *tempi,I64 t1,I64 r1,I64 d1, } U0 ICAddConst(CIntermediateCode *tempi,I64 t1,I64 r1,I64 d1, - I64 t2,I64 r2,I64 d2,I64 disp,I64 op,I64 ip) + I64 t2,I64 r2,I64 d2,I64 d,I64 op,I64 ip) { I64 i,r; if (op.u8[0]==0x2B) { op=0x0003; - disp=-disp; + d=-d; } if (t1&TY_MASK==TY_REG) { if (t2&TY_MASK!=TY_REG) { @@ -964,39 +962,32 @@ U0 ICAddConst(CIntermediateCode *tempi,I64 t1,I64 r1,I64 d1, i=0x49; else i=0x48; - if (!disp && + if (!d && (op.u8[0]==0x03||op.u8[0]==0x2B|| op.u8[0]==0x33||op.u8[0]==0x0B)) return; - else if (disp==1 && op.u8[0]==0x03) { + else if (d==1 && op.u8[0]==0x03) { ICU24(tempi,0xC0FF00+op.u8[1]<<19+i+(r1&7)<<16); return; - } else if (disp==-1 && op.u8[0]==0x03) { + } else if (d==-1 && op.u8[0]==0x03) { ICU24(tempi,0xC8FF00+i+(r1&7)<<16); return; - } else if (MIN_I8<=disp<=MAX_I8) { + } else if (MIN_I8<=d<=MAX_I8) { ICU24(tempi,0xC08300+op.u8[1]<<19+i+(r1&7)<<16); - ICU8(tempi,disp); + ICU8(tempi,d); return; - } else if (MIN_I32<=disp<=MAX_I32) { + } else if (MIN_I32<=d<=MAX_I32) { ICU24(tempi,0xC08100+op.u8[1]<<19+i+(r1&7)<<16); - ICU32(tempi,disp); + ICU32(tempi,d); return; } } - if (op.u8[0]==0x03 && MIN_I32<=disp<=MAX_I32 && + if (op.u8[0]==0x03 && MIN_I32<=d<=MAX_I32 && !Bt(&non_ptr_vars_mask,r2)) { - i=ICModr(r1,TY_DISP+IT_I64,r2,disp); + i=ICModr1(r1,TY_DISP+IT_I64,r2,d); i.u8[1]|=0x48; ICU24(tempi,i.u8[2]<<16+0x8D00+i.u8[1]); - if (i.u8[0]==1) - ICU8(tempi,disp); - else if (i.u8[0]==2) - ICU32(tempi,disp); - else if (i.u8[0]==4) { - ICU32(tempi,disp-(ip+tempi->ic_cnt+4)); - tempi->ic_flags&=~ICF_CODE_FINAL; - } + ICModr2(tempi,i,d,ip+4); return; } } @@ -1012,16 +1003,16 @@ U0 ICAddConst(CIntermediateCode *tempi,I64 t1,I64 r1,I64 d1, d2=d1; } - if (!disp && + if (!d && (op.u8[0]==0x03||op.u8[0]==0x2B|| op.u8[0]==0x33||op.u8[0]==0x0B)) return; r=op.u8[1]; //not a register but a slash val - if (op.u8[0]==0x03 && disp==-1) //add -1 + if (op.u8[0]==0x03 && d==-1) //add -1 r=1; //Decrement slash val - if (op.u8[0]==0x03 && (disp==1 || disp==-1)) { //Add - i=ICModr(r,t1,r1,d1); + if (op.u8[0]==0x03 && (d==1 || d==-1)) { //Add + i=ICModr1(r,t1,r1,d1); if (t1!=TY_REG && tempi->ic_flags&ICF_LOCK) ICU8(tempi,OC_LOCK_PREFIX); switch (t1&IT_MASK) { @@ -1039,21 +1030,12 @@ U0 ICAddConst(CIntermediateCode *tempi,I64 t1,I64 r1,I64 d1, ICRex(tempi,i.u8[1]); ICU16(tempi,i.u8[2]<<8+0xFF); } - if (t1&TY_MASK==TY_SIB) - ICU8(tempi,i.u8[3]); - if (i.u8[0]==1) - ICU8(tempi,d1); - else if (i.u8[0]==2) - ICU32(tempi,d1); - else if (i.u8[0]==4) { - ICU32(tempi,d1-(ip+tempi->ic_cnt+4)); - tempi->ic_flags&=~ICF_CODE_FINAL; - } + ICModr2(tempi,i,d1,ip+4); return; } - if (MIN_I8<=disp<=MAX_I8 || + if (MIN_I8<=d<=MAX_I8 || t1&(IT_MASK-1)==IT_I8) { - i=ICModr(r,t1,r1,d1); + i=ICModr1(r,t1,r1,d1); if (tempi->ic_flags&ICF_LOCK) ICU8(tempi,OC_LOCK_PREFIX); switch (t1&IT_MASK) { @@ -1071,22 +1053,13 @@ U0 ICAddConst(CIntermediateCode *tempi,I64 t1,I64 r1,I64 d1, ICRex(tempi,i.u8[1]); ICU16(tempi,i.u8[2]<<8+0x83); } - if (t1&TY_MASK==TY_SIB) - ICU8(tempi,i.u8[3]); - if (i.u8[0]==1) - ICU8(tempi,d1); - else if (i.u8[0]==2) - ICU32(tempi,d1); - else if (i.u8[0]==4) { - ICU32(tempi,d1-(ip+tempi->ic_cnt+5)); - tempi->ic_flags&=~ICF_CODE_FINAL; - } - ICU8(tempi,disp); + ICModr2(tempi,i,d1,ip+5); + ICU8(tempi,d); return; } - if (MIN_I32<=disp<=MAX_I32 || + if (MIN_I32<=d<=MAX_I32 || t1&IT_MASKic_flags&ICF_LOCK) ICU8(tempi,OC_LOCK_PREFIX); switch (t1&IT_MASK) { @@ -1099,13 +1072,9 @@ U0 ICAddConst(CIntermediateCode *tempi,I64 t1,I64 r1,I64 d1, ICRex(tempi,i.u8[1]); ICU16(tempi,i.u8[2]<<8+0x81); } - if (t1&TY_MASK==TY_SIB) - ICU8(tempi,i.u8[3]); - if (i.u8[0]==1) - ICU8(tempi,d1); - else if (i.u8[0]==2) - ICU32(tempi,d1); - else if (i.u8[0]==4) { + if (i.u8[0]!=MDR_RIP_REL) + ICModr2(tempi,i,d1,); + else { if (t1&(IT_MASK-1)==IT_I16) ICU32(tempi,d1-(ip+tempi->ic_cnt+6)); else @@ -1113,18 +1082,18 @@ U0 ICAddConst(CIntermediateCode *tempi,I64 t1,I64 r1,I64 d1, tempi->ic_flags&=~ICF_CODE_FINAL; } if (t1&(IT_MASK-1)==IT_I16) - ICU16(tempi,disp); + ICU16(tempi,d); else - ICU32(tempi,disp); + ICU32(tempi,d); return; } break; case TY_STK>>4: - ICAddConst(tempi,TY_REG+IT_I64,CREG_RAX,0,t2,r2,d2,disp,op,ip); + ICAddConst(tempi,TY_REG+IT_I64,CREG_RAX,0,t2,r2,d2,d,op,ip); ICPushRegs(tempi,1<ic_flags&ICF_LOCK) ICU8(tempi,OC_LOCK_PREFIX); ICRex(tempi,i.u8[1]); ICU16(tempi,i.u8[2]<<8+op); - if (t2&TY_MASK==TY_SIB) - ICU8(tempi,i.u8[3]); - if (i.u8[0]==1) - ICU8(tempi,d2); - else if (i.u8[0]==2) - ICU32(tempi,d2); - else if (i.u8[0]==4) { - ICU32(tempi,d2-(ip+tempi->ic_cnt+4)); - tempi->ic_flags&=~ICF_CODE_FINAL; - } + ICModr2(tempi,i,d2,ip+4); ICMov(tempi,t1,r1,d1,TY_REG+IT_I64,CREG_RAX,0,ip); } else { if (tempi->ic_flags & ICF_P1_FIRST) { @@ -1374,7 +1334,7 @@ U0 ICFPow(CLex *lx,CIntermediateCode *tempi,U8 *buf,I64 ip) { //for POW I64 i; CExeImportExport *tempe; - CHashExport *tempess=HashFind("SYS_POW",lx->hash_table_lst,HTT_EXPORT_SYS_SYM); + CHashExport *tempess=HashFind("SYS_POW",lx->htc.hash_table_lst,HTT_EXPORT_SYS_SYM); if (tempi->ic_flags & ICF_P1_FIRST) { ICMov(tempi,TY_REG+IT_I64,CREG_RDX,0, @@ -1392,7 +1352,7 @@ U0 ICFPow(CLex *lx,CIntermediateCode *tempi,U8 *buf,I64 ip) tempess=CAlloc(sizeof(CHashExport)); tempess->str=StrNew("SYS_POW"); tempess->type=HTT_EXPORT_SYS_SYM|HTF_UNRESOLVED|HTF_IMPORT; - HashAdd(tempess,lx->glbl_hash_table); + HashAdd(tempess,lx->htc.glbl_hash_table); } if (tempess->type&HTF_IMPORT) { if (GetOpt(OPTf_USE_LIT64)) { @@ -2083,10 +2043,10 @@ U0 ICFCmpAndBranch(CLex *lx,CIntermediateCode *tempi,I64 ip, I64 us,I64 not_us,U8 *buf,I64 ip2) { CICArg *p1,*p2; - Bool dont_push_float,dont_pop_float,alt,short_jmp=FALSE; + Bool dont_push_float,dont_pop_float,alt,short_jmp; I64 i,rsp_size=0,builtin1=0,builtin2=0, - t1,r1,d1,t2,r2,d2; - CCodeBlkMisc *lb,*lb1; + t1,r1,d1,t2,r2,d2; + CCodeBlkMisc *lb; U8 *buf2; if (tempi->ic_flags&ICF_ALTERNATE_TEMPLATE) { @@ -2111,16 +2071,16 @@ U0 ICFCmpAndBranch(CLex *lx,CIntermediateCode *tempi,I64 ip, rsp_size+=8; } else { if (p2->type&IT_MASK>=IT_I64 && - (p2->type&TY_MASK==TY_DISP || - p2->type&TY_MASK==TY_RIP_DISP32 || - p2->type&TY_MASK==TY_SIB)) { + (p2->type&TY_MASK==TY_DISP || + p2->type&TY_MASK==TY_RIP_DISP32 || + p2->type&TY_MASK==TY_SIB)) { t2=p2->type; r2=p2->reg; d2=p2->disp; } else { if (p2->type&TY_MASK==TY_IMM) { if (!(builtin2=ICBuiltInFloatConst(p2->disp(F64))) || - tempi->ic_flags&ICF_PUSH_CMP) { + tempi->ic_flags&ICF_PUSH_CMP) { t2=TY_RIP_DISP32+IT_I64; r2=CREG_RIP; d2=CBFloatConstFind(lx,p2->disp(F64))+buf2; @@ -2140,9 +2100,9 @@ U0 ICFCmpAndBranch(CLex *lx,CIntermediateCode *tempi,I64 ip, rsp_size+=8; } else { if (p1->type&IT_MASK>=IT_I64 && - (p1->type&TY_MASK==TY_DISP || - p1->type&TY_MASK==TY_RIP_DISP32 || - p1->type&TY_MASK==TY_SIB)) { + (p1->type&TY_MASK==TY_DISP || + p1->type&TY_MASK==TY_RIP_DISP32 || + p1->type&TY_MASK==TY_SIB)) { t1=p1->type; r1=p1->reg; d1=p1->disp; @@ -2161,16 +2121,16 @@ U0 ICFCmpAndBranch(CLex *lx,CIntermediateCode *tempi,I64 ip, } } if (p2->type&IT_MASK>=IT_I64 && - (p2->type&TY_MASK==TY_DISP || - p2->type&TY_MASK==TY_RIP_DISP32 || - p2->type&TY_MASK==TY_SIB)) { + (p2->type&TY_MASK==TY_DISP || + p2->type&TY_MASK==TY_RIP_DISP32 || + p2->type&TY_MASK==TY_SIB)) { t2=p2->type; r2=p2->reg; d2=p2->disp; } else { if (p2->type&TY_MASK==TY_IMM) { if (!(builtin2=ICBuiltInFloatConst(p2->disp(F64))) || - tempi->ic_flags&ICF_PUSH_CMP) { + tempi->ic_flags&ICF_PUSH_CMP) { t2=TY_RIP_DISP32+IT_I64; r2=CREG_RIP; d2=CBFloatConstFind(lx,p2->disp(F64))+buf2; @@ -2188,7 +2148,7 @@ U0 ICFCmpAndBranch(CLex *lx,CIntermediateCode *tempi,I64 ip, ICPopRegs(tempi,1<type,p1->reg,p1->disp,ip2); + p1->type,p1->reg,p1->disp,ip2); ICMov(tempi,TY_REG+IT_I64,CREG_RAX,0, p2->type,p2->reg,p2->disp,ip2); ICU16(tempi,0x5052); //PUSH EDX PUSH EAX @@ -2199,16 +2159,16 @@ U0 ICFCmpAndBranch(CLex *lx,CIntermediateCode *tempi,I64 ip, } else { if (p1->type&TY_MASK!=TY_STK) { if (p2->type&IT_MASK>=IT_I64 && - (p2->type&TY_MASK==TY_DISP || - p2->type&TY_MASK==TY_RIP_DISP32 || - p2->type&TY_MASK==TY_SIB)) { + (p2->type&TY_MASK==TY_DISP || + p2->type&TY_MASK==TY_RIP_DISP32 || + p2->type&TY_MASK==TY_SIB)) { t2=p2->type; r2=p2->reg; d2=p2->disp; } else { if (p2->type&TY_MASK==TY_IMM) { if (!(builtin2=ICBuiltInFloatConst(p2->disp(F64))) || - tempi->ic_flags&ICF_PUSH_CMP) { + tempi->ic_flags&ICF_PUSH_CMP) { t2=TY_RIP_DISP32+IT_I64; r2=CREG_RIP; d2=CBFloatConstFind(lx,p2->disp(F64))+buf2; @@ -2226,9 +2186,9 @@ U0 ICFCmpAndBranch(CLex *lx,CIntermediateCode *tempi,I64 ip, d2+=8; } else { if (p1->type&IT_MASK>=IT_I64 && - (p1->type&TY_MASK==TY_DISP || - p1->type&TY_MASK==TY_RIP_DISP32 || - p1->type&TY_MASK==TY_SIB)) { + (p1->type&TY_MASK==TY_DISP || + p1->type&TY_MASK==TY_RIP_DISP32 || + p1->type&TY_MASK==TY_SIB)) { t1=p1->type; r1=p1->reg; d1=p1->disp; @@ -2250,12 +2210,12 @@ U0 ICFCmpAndBranch(CLex *lx,CIntermediateCode *tempi,I64 ip, } } else { ICMov(tempi,TY_REG+IT_I64,CREG_RAX,0, - p2->type,p2->reg,p2->disp,ip2); + p2->type,p2->reg,p2->disp,ip2); if (tempi->ic_flags&ICF_POP_CMP) ICPopRegs(tempi,1<type,p1->reg,p1->disp,ip2); + p1->type,p1->reg,p1->disp,ip2); ICU16(tempi,0x5052); //PUSH EDX PUSH EAX rsp_size=16; t1=TY_SIB+IT_I64; r1=CREG_RSP+CREG_RSP<<8; d1=8; @@ -2320,21 +2280,18 @@ U0 ICFCmpAndBranch(CLex *lx,CIntermediateCode *tempi,I64 ip, } ip+=tempi->ic_cnt; - lb=tempi->ic_data; - while (lb1=lb->fwd) - lb=lb1; - if (lb->addr!=INVALID_PTR) { + lb=OptLabelFwd(tempi->ic_data); + short_jmp=ToBool(tempi->ic_flags&ICF_SHORT_JMP); + if (!buf && lb->addr!=INVALID_PTR) { i=lb->addr-ip; if (lb->flags&CBMF_POP_CMP) if(tempi->ic_flags&ICF_PUSH_CMP) i+=4; else i+=8; - if (MIN_I8+2ic_flags&ICF_SHORT_JMP); if (short_jmp) { tempi->ic_flags|=ICF_SHORT_JMP; @@ -2774,21 +2731,12 @@ U0 ICAddSubEctEqual(CIntermediateCode *tempi,I64 ptype,I64 t1,I64 r1,I64 d1, temp=CREG_RCX; ICMov(tempi,TY_REG+IT_I64,temp,0,t3,r3,d3,ip); } - i=ICModr(temp,t2&TY_MASK+ptype,r2,d2); + i=ICModr1(temp,t2&TY_MASK+ptype,r2,d2); if (tempi->ic_flags&ICF_LOCK) ICU8(tempi,OC_LOCK_PREFIX); ICRex(tempi,i.u8[1]); ICU16(tempi,i.u8[2]<<8+op.u8[5]); - if (t2&TY_MASK==TY_SIB) - ICU8(tempi,i.u8[3]); - if (i.u8[0]==1) - ICU8(tempi,d2); - else if (i.u8[0]==2) - ICU32(tempi,d2); - else if (i.u8[0]==4) { - ICU32(tempi,d2-(ip+tempi->ic_cnt+4)); - tempi->ic_flags&=~ICF_CODE_FINAL; - } + ICModr2(tempi,i,d2,ip+4); return; } if (t3&IT_MASK>=IT_I64 && @@ -2799,21 +2747,12 @@ U0 ICAddSubEctEqual(CIntermediateCode *tempi,I64 ptype,I64 t1,I64 r1,I64 d1, result_reg=CREG_RCX; ICMov(tempi,TY_REG+IT_I64,CREG_RCX,0,t2,r2,d2,ip); } - i=ICModr(result_reg,t3&TY_MASK+ptype,r3,d3); + i=ICModr1(result_reg,t3&TY_MASK+ptype,r3,d3); if (tempi->ic_flags&ICF_LOCK) ICU8(tempi,OC_LOCK_PREFIX); ICRex(tempi,i.u8[1]); ICU16(tempi,i.u8[2]<<8+op.u8[0]); - if (t3&TY_MASK==TY_SIB) - ICU8(tempi,i.u8[3]); - if (i.u8[0]==1) - ICU8(tempi,d3); - else if (i.u8[0]==2) - ICU32(tempi,d3); - else if (i.u8[0]==4) { - ICU32(tempi,d3-(ip+tempi->ic_cnt+4)); - tempi->ic_flags&=~ICF_CODE_FINAL; - } + ICModr2(tempi,i,d3,ip+4); ICMov(tempi,t2&TY_MASK+ptype,r2,d2,TY_REG+IT_I64,result_reg,0,ip); done=TRUE; } @@ -3023,19 +2962,10 @@ U0 ICNot(CIntermediateCode *tempi,I64 ip) I64 i; if (tempi->p1.type&IT_MASK<=IT_U8 && TY_DISP<=tempi->p1.type&TY_MASK<=TY_RIP_DISP32) { - i=ICModr(tempi,tempi->p1.type,tempi->p1.reg,tempi->p1.disp); + i=ICModr1(tempi,tempi->p1.type,tempi->p1.reg,tempi->p1.disp); ICRex(tempi,i.u8[1]); ICU16(tempi,i.u8[2]<<8+0xF6); //TEST ?,0xFF - if (tempi->p1.type&TY_MASK==TY_SIB) - ICU8(tempi,i.u8[3]); - if (i.u8[0]==1) - ICU8(tempi,tempi->p1.disp); - else if (i.u8[0]==2) - ICU32(tempi,tempi->p1.disp); - else if (i.u8[0]==4) { - ICU32(tempi,tempi->p1.disp-(ip+tempi->ic_cnt+5)); - tempi->ic_flags&=~ICF_CODE_FINAL; - } + ICModr2(tempi,i,tempi->p1.disp,ip+5); ICU8(tempi,0xFF); } else { ICMov(tempi,TY_REG+IT_I64,CREG_RAX,0,tempi->p1.type,tempi->p1.reg,tempi->p1.disp,ip); @@ -3141,40 +3071,6 @@ U0 ICXorXor(CIntermediateCode *tempi,I64 ip) ICMov(tempi,tempi->r.type,tempi->r.reg,tempi->r.disp,TY_REG+IT_I64,CREG_RAX,0,ip); } -U0 ICColon(CIntermediateCode *tempi,I64 ip) -{ - I64 r2; - if (tempi->p1.type&TY_MASK==TY_REG && - tempi->p1.reg==CREG_RAX) { - ICMov(tempi,TY_REG+IT_I64,CREG_RDX,0,tempi->p1.type,tempi->p1.reg,tempi->p1.disp,ip); - r2=CREG_RDX; - ICMov(tempi,TY_REG+IT_I64,CREG_RAX,0,tempi->p3.type,tempi->p3.reg,tempi->p3.disp,ip); - ICMov(tempi,TY_REG+IT_I64,CREG_RCX,0,tempi->p2.type,tempi->p2.reg,tempi->p2.disp,ip); - } else if (tempi->p2.type&TY_MASK==TY_REG && - tempi->p2.reg==CREG_RAX) { - ICMov(tempi,TY_REG+IT_I64,CREG_RCX,0,tempi->p2.type,tempi->p2.reg,tempi->p2.disp,ip); - ICMov(tempi,TY_REG+IT_I64,CREG_RAX,0,tempi->p3.type,tempi->p3.reg,tempi->p3.disp,ip); - if (tempi->p1.type&TY_MASK!=TY_REG) { - ICMov(tempi,TY_REG+IT_I64,CREG_RDX,0,tempi->p1.type,tempi->p1.reg,tempi->p1.disp,ip); - r2=CREG_RDX; - } else - r2=tempi->p1.reg; - } else { - ICMov(tempi,TY_REG+IT_I64,CREG_RAX,0,tempi->p3.type,tempi->p3.reg,tempi->p3.disp,ip); - ICMov(tempi,TY_REG+IT_I64,CREG_RCX,0,tempi->p2.type,tempi->p2.reg,tempi->p2.disp,ip); - if (tempi->p1.type&TY_MASK!=TY_REG || - tempi->p1.type&IT_MASKp1.type,tempi->p1.reg,tempi->p1.disp,ip); - r2=CREG_RDX; - } else - r2=tempi->p1.reg; - } - ICOr(tempi,r2); - ICU16(tempi,0x0374); - ICU24(tempi,0xC18B48); - ICMov(tempi,tempi->r.type,tempi->r.reg,tempi->r.disp,TY_REG+IT_I64,CREG_RAX,0,ip); -} - U0 ICCmp(CIntermediateCode *tempi,I64 us,I64 is,I64 ip) { I64 r1,d1,r2,i=0x48,j=tempi->p2.disp; @@ -3380,35 +3276,17 @@ U0 ICBitOps(CIntermediateCode *tempi,CICArg *p1,CICArg *p2,CIntermediateCode *te if (op!=0xA30F) ICU8(tempi,OC_LOCK_PREFIX); } - if ((p1->type&TY_MASK!=TY_IMM || p1->disp<32) && t2&TY_MASK!=TY_REG) + if (p1->type&TY_MASK==TY_IMM && p1->disp<32) t2=t2&TY_MASK+IT_U32; - i=ICModr(r1,t2,r2,d2); + i=ICModr1(r1,t2,r2,d2); ICRex(tempi,i.u8[1]); if (p1->type&TY_MASK==TY_IMM && p1->disp<64) { ICU24(tempi,i.u8[2]<<16+op_imm); - if (t2&TY_MASK==TY_SIB) - ICU8(tempi,i.u8[3]); - if (i.u8[0]==1) - ICU8(tempi,d2); - else if (i.u8[0]==2) - ICU32(tempi,d2); - else if (i.u8[0]==4) { - ICU32(tempi,d2-(ip+tempi->ic_cnt+5)); - tempi->ic_flags&=~ICF_CODE_FINAL; - } + ICModr2(tempi,i,d2,ip+5); ICU8(tempi,p1->disp); } else { ICU24(tempi,i.u8[2]<<16+op); - if (t2&TY_MASK==TY_SIB) - ICU8(tempi,i.u8[3]); - if (i.u8[0]==1) - ICU8(tempi,d2); - else if (i.u8[0]==2) - ICU32(tempi,d2); - else if (i.u8[0]==4) { - ICU32(tempi,d2-(ip+tempi->ic_cnt+4)); - tempi->ic_flags&=~ICF_CODE_FINAL; - } + ICModr2(tempi,i,d2,ip+4); } if (!no_depend) { ICU32(tempi,0xD08348); @@ -3417,60 +3295,6 @@ U0 ICBitOps(CIntermediateCode *tempi,CICArg *p1,CICArg *p2,CIntermediateCode *te } } -U0 ICBEqu(CIntermediateCode *tempi,CIntermediateCode *tempi2,I64 ip) -{ - I64 i,cnt; - -//This might be paranoid. - if (tempi->p2.type&TY_MASK==TY_REG && - tempi->p2.reg==CREG_RAX) - tempi->ic_flags|=ICF_P1_FIRST; //p2 is the p1 of Bts or Btr - - if (tempi->p1.type&TY_MASK==TY_REG) - ICOr(tempi,tempi->p1.reg); - else { - if (tempi->p1.type&IT_MASK<=IT_U8 && - TY_DISP<=tempi->p1.type&TY_MASK<=TY_RIP_DISP32) { - i=ICModr(tempi,tempi->p1.type,tempi->p1.reg,tempi->p1.disp); - ICRex(tempi,i.u8[1]); - ICU16(tempi,i.u8[2]<<8+0xF6); - if (tempi->p1.type&TY_MASK==TY_SIB) - ICU8(tempi,i.u8[3]); - if (i.u8[0]==1) - ICU8(tempi,tempi->p1.disp); - else if (i.u8[0]==2) - ICU32(tempi,tempi->p1.disp); - else if (i.u8[0]==4) { - ICU32(tempi,tempi->p1.disp-(ip+tempi->ic_cnt+5)); - tempi->ic_flags&=~ICF_CODE_FINAL; - } - ICU8(tempi,0xFF); - } else { - ICMov(tempi,TY_REG+IT_I64,CREG_RDX,0,tempi->p1.type,tempi->p1.reg,tempi->p1.disp,ip); - ICOr(tempi,CREG_RDX); - } - } - //Perform trial op, to get byte cnt - cnt=tempi->ic_cnt; - ICBitOps(tempi,&tempi->p2,&tempi->p3,tempi2, - 0xAB0F,0x28BA0F,ip); - i=tempi->ic_cnt+2-cnt; - - //back-up - tempi->ic_cnt=cnt; - ICU16(tempi,i<<8+0x74); - ICBitOps(tempi,&tempi->p2,&tempi->p3,tempi2, - 0xAB0F,0x28BA0F,ip); - cnt=tempi->ic_cnt; - ICBitOps(tempi,&tempi->p2,&tempi->p3,tempi2, - 0xB30F,0x30BA0F,ip); - i=tempi->ic_cnt-cnt; - tempi->ic_cnt=cnt; - ICU16(tempi,i<<8+0xEB); - ICBitOps(tempi,&tempi->p2,&tempi->p3,tempi2, - 0xB30F,0x30BA0F,ip); -} - U0 ICPreempt(CIntermediateCode *tempi,I64 ip) { CIntermediateCode *tempi2=tempi+1; @@ -3562,7 +3386,7 @@ U0 ICPreIncDec(CIntermediateCode *tempi,I64 op,I64 ip) if (tempc->ptr_cnt && tempc1->size!=1) { ICAddConst(tempi,tempi->p1.type&TY_MASK+tempi->p1.ptype,tempi->p1.reg,tempi->p1.disp, tempi->p1.type&TY_MASK+tempi->p1.ptype,tempi->p1.reg,tempi->p1.disp, - tempc1->size,op==SLASH_OP_INC ? 0x0003:0x052B,ip); + tempc1->size,op.u16[3],ip); } else ICSlashOp(tempi, tempi->p1.type&TY_MASK+tempi->p1.ptype,tempi->p1.reg,tempi->p1.disp,op,ip); @@ -3580,7 +3404,7 @@ U0 ICPreIncDec(CIntermediateCode *tempi,I64 op,I64 ip) tempc1->size!=1) { ICAddConst(tempi,TY_DISP+tempi->p1.ptype,r,0, TY_DISP+tempi->p1.ptype,r,0, - tempc1->size,op==SLASH_OP_INC ? 0x0003:0x052B,ip); + tempc1->size,op.u16[3],ip); } else ICSlashOp(tempi, TY_DISP+tempi->p1.ptype,r,0,op,ip); @@ -3604,7 +3428,7 @@ U0 ICPostIncDec(CIntermediateCode *tempi,I64 op,I64 ip) tempc1->size!=1) { ICAddConst(tempi,tempi->p1.type&TY_MASK+tempi->p1.ptype,tempi->p1.reg,tempi->p1.disp, tempi->p1.type&TY_MASK+tempi->p1.ptype,tempi->p1.reg,tempi->p1.disp, - tempc1->size,op==SLASH_OP_INC ? 0x0003:0x052B,ip); + tempc1->size,op.u16[3],ip); } else ICSlashOp(tempi, tempi->p1.type&TY_MASK+tempi->p1.ptype,tempi->p1.reg,tempi->p1.disp,op,ip); @@ -3624,7 +3448,7 @@ U0 ICPostIncDec(CIntermediateCode *tempi,I64 op,I64 ip) tempc1->size!=1) { ICAddConst(tempi,TY_DISP+tempi->p1.ptype,r,0, TY_DISP+tempi->p1.ptype,r,0, - tempc1->size,op==SLASH_OP_INC ? 0x0003:0x052B,ip); + tempc1->size,op.u16[3],ip); } else ICSlashOp(tempi, TY_DISP+tempi->p1.ptype,r,0,op,ip); @@ -3633,11 +3457,11 @@ U0 ICPostIncDec(CIntermediateCode *tempi,I64 op,I64 ip) U0 ICDerefPostIncDec(CIntermediateCode *tempi,I64 op,I64 ip) { - I64 ty,r; + I64 t,r; CHashClass *tempc1=tempi->ic_class; - ty=tempi->r.type&IT_MASK; - if (ty>tempi->p1.ptype) - ty=tempi->p1.ptype; + t=tempi->r.type&IT_MASK; + if (t>tempi->p1.ptype) + t=tempi->p1.ptype; if (tempi->ic_flags & ICF_NOT_ADDR) { if (tempi->p1.type&TY_MASK==TY_REG) r=tempi->p1.reg; @@ -3646,11 +3470,11 @@ U0 ICDerefPostIncDec(CIntermediateCode *tempi,I64 op,I64 ip) r=CREG_RDX; } ICMov(tempi,tempi->r.type,tempi->r.reg,tempi->r.disp, - TY_DISP+ty,r,0,ip); + TY_DISP+t,r,0,ip); if (tempc1->size!=1) { ICAddConst(tempi,tempi->p1.type&TY_MASK+IT_I64,tempi->p1.reg,tempi->p1.disp, tempi->p1.type&TY_MASK+IT_I64,tempi->p1.reg,tempi->p1.disp, - tempc1->size,op==SLASH_OP_INC ? 0x0003:0x052B,ip); + tempc1->size,op.u16[3],ip); } else ICSlashOp(tempi, tempi->p1.type&TY_MASK+IT_I64,tempi->p1.reg,tempi->p1.disp,op,ip); @@ -3666,11 +3490,11 @@ U0 ICDerefPostIncDec(CIntermediateCode *tempi,I64 op,I64 ip) if (tempc1->size!=1) { ICAddConst(tempi,TY_DISP+IT_I64,r,0, TY_DISP+IT_I64,r,0, - tempc1->size,op==SLASH_OP_INC ? 0x0003:0x052B,ip); + tempc1->size,op.u16[3],ip); } else ICSlashOp(tempi,TY_DISP+IT_I64,r,0,op,ip); ICMov(tempi,tempi->r.type,tempi->r.reg,tempi->r.disp, - TY_DISP+ty,CREG_RDX,0,ip); + TY_DISP+t,CREG_RDX,0,ip); } } @@ -3693,7 +3517,7 @@ U0 ICAssignPostIncDec(CIntermediateCode *tempi,I64 op,I64 ip) if (tempc1->size!=1 || tempi->p1.type&TY_MASK==TY_STK) { ICAddConst(tempi,tempi->p1.type,tempi->p1.reg,tempi->p1.disp, TY_REG+IT_I64,r,0, - tempc1->size,op==SLASH_OP_INC ? 0x0003:0x052B,ip); + tempc1->size,op.u16[3],ip); } else ICSlashOp(tempi,tempi->p1.type,tempi->p1.reg,tempi->p1.disp,op,ip); } else { @@ -3709,7 +3533,7 @@ U0 ICAssignPostIncDec(CIntermediateCode *tempi,I64 op,I64 ip) if (tempc1->size!=1) { ICAddConst(tempi,TY_DISP+IT_I64,CREG_RDX,0, TY_REG+IT_I64,CREG_RCX,0, - tempc1->size,op==SLASH_OP_INC ? 0x0003:0x052B,ip); + tempc1->size,op.u16[3],ip); } else ICSlashOp(tempi,TY_DISP+IT_I64,CREG_RDX,0,op,ip); } @@ -3721,8 +3545,8 @@ U0 ICCmpAndBranch(CIntermediateCode *tempi,Bool has_result,I64 ip, U8 *buf,I64 ip2) { I64 r1,d1,r2,i=0x48,j,t1,t2,result_reg; - Bool short_jmp=FALSE,done; - CCodeBlkMisc *lb,*lb1; + Bool short_jmp,done; + CCodeBlkMisc *lb; CICArg *p1=&tempi->p1,*p2=&tempi->p2,*swap; j=p1->disp; @@ -3737,15 +3561,15 @@ U0 ICCmpAndBranch(CIntermediateCode *tempi,Bool has_result,I64 ip, j=p2->disp; if (p2->type&TY_MASK==TY_IMM && MIN_I32<=j<=MAX_I32) { if (!has_result && - p1->type&TY_MASK==TY_DISP && //TODO, other modes - p1->type&IT_MASK>=IT_I64) { + p1->type&TY_MASK==TY_DISP && //TODO, other modes + p1->type&IT_MASK>=IT_I64) { r1=p1->reg; d1=p1->disp; if (r1>7) { i++; r1&=7; } - if (MIN_I8<=j<=MAX_I8) + if (MIN_I8<=j<=MAX_I8) i+=0x388300; else i+=0x388100; @@ -3758,7 +3582,7 @@ U0 ICCmpAndBranch(CIntermediateCode *tempi,Bool has_result,I64 ip, ICU24(tempi,0x800000+i+r1<<16); ICU32(tempi,d1); } - if (MIN_I8<=j<=MAX_I8) + if (MIN_I8<=j<=MAX_I8) ICU8(tempi,j); else ICU32(tempi,j); @@ -3787,7 +3611,7 @@ U0 ICCmpAndBranch(CIntermediateCode *tempi,Bool has_result,I64 ip, } else { if (r1>7) i++; - if (MIN_I8<=j<=MAX_I8) { + if (MIN_I8<=j<=MAX_I8) { ICU24(tempi,0xF88300+i+(r1&7)<<16); ICU8(tempi,j); } else { @@ -3810,27 +3634,18 @@ U0 ICCmpAndBranch(CIntermediateCode *tempi,Bool has_result,I64 ip, r2=p2->reg; t2=p2->type; if (t2&IT_MASK>=IT_I64 && !has_result && - TY_DISP<=t2&TY_MASK<=TY_RIP_DISP32) { + TY_DISP<=t2&TY_MASK<=TY_RIP_DISP32) { if (t1&TY_MASK!=TY_REG || t1&IT_MASKtype,p1->reg,p1->disp,ip2); r1=CREG_RAX; } - i=ICModr(r1,t2,r2,p2->disp); + i=ICModr1(r1,t2,r2,p2->disp); ICRex(tempi,i.u8[1]); ICU16(tempi,i.u8[2]<<8+0x3B); - if (t2&TY_MASK==TY_SIB) - ICU8(tempi,i.u8[3]); - if (i.u8[0]==1) - ICU8(tempi,p2->disp); - else if (i.u8[0]==2) - ICU32(tempi,p2->disp); - else if (i.u8[0]==4) { - ICU32(tempi,p2->disp-(ip2+tempi->ic_cnt+4)); - tempi->ic_flags&=~ICF_CODE_FINAL; - } + ICModr2(tempi,i,p2->disp,ip2+4); done=TRUE; } else if (t1&IT_MASK>=IT_I64 && - TY_REG<=t1&TY_MASK<=TY_RIP_DISP32) { + TY_REG<=t1&TY_MASK<=TY_RIP_DISP32) { if (t2&TY_MASK!=TY_REG || t2&IT_MASKtype,p2->reg,p2->disp,ip2); @@ -3840,19 +3655,10 @@ U0 ICCmpAndBranch(CIntermediateCode *tempi,Bool has_result,I64 ip, r2=CREG_RAX; } } - i=ICModr(r2,t1,r1,p1->disp); + i=ICModr1(r2,t1,r1,p1->disp); ICRex(tempi,i.u8[1]); ICU16(tempi,i.u8[2]<<8+0x39); - if (t1&TY_MASK==TY_SIB) - ICU8(tempi,i.u8[3]); - if (i.u8[0]==1) - ICU8(tempi,p1->disp); - else if (i.u8[0]==2) - ICU32(tempi,p1->disp); - else if (i.u8[0]==4) { - ICU32(tempi,p1->disp-(ip2+tempi->ic_cnt+4)); - tempi->ic_flags&=~ICF_CODE_FINAL; - } + ICModr2(tempi,i,p1->disp,ip2+4); if (has_result) result_reg=r2; done=TRUE; @@ -3894,22 +3700,20 @@ U0 ICCmpAndBranch(CIntermediateCode *tempi,Bool has_result,I64 ip, result_reg=r2; } } + ip+=tempi->ic_cnt; - lb=tempi->ic_data; - while (lb1=lb->fwd) - lb=lb1; - if (lb->addr!=INVALID_PTR) { + lb=OptLabelFwd(tempi->ic_data); + short_jmp=ToBool(tempi->ic_flags&ICF_SHORT_JMP); + if (!buf && lb->addr!=INVALID_PTR) { i=lb->addr-ip; if (lb->flags&CBMF_POP_CMP) if(tempi->ic_flags&ICF_PUSH_CMP) i+=4; else i+=8; - if (MIN_I8+2ic_flags&ICF_SHORT_JMP); if (short_jmp) { tempi->ic_flags|=ICF_SHORT_JMP; @@ -3938,25 +3742,16 @@ U0 ICCmpAndBranch(CIntermediateCode *tempi,Bool has_result,I64 ip, U0 ICTestAndBranch(CIntermediateCode *tempi,I64 ip,I64 is,U8 *buf,I64 ip2) { I64 i; - Bool short_jmp=FALSE; - CCodeBlkMisc *lb,*lb1; + Bool short_jmp; + CCodeBlkMisc *lb; if (tempi->p1.type&TY_MASK!=TY_REG) { if (tempi->p1.type&IT_MASK<=IT_U8 && - TY_DISP<=tempi->p1.type&TY_MASK<=TY_RIP_DISP32) { - i=ICModr(tempi,tempi->p1.type,tempi->p1.reg,tempi->p1.disp); + TY_DISP<=tempi->p1.type&TY_MASK<=TY_RIP_DISP32) { + i=ICModr1(tempi,tempi->p1.type,tempi->p1.reg,tempi->p1.disp); ICRex(tempi,i.u8[1]); ICU16(tempi,i.u8[2]<<8+0xF6); - if (tempi->p1.type&TY_MASK==TY_SIB) - ICU8(tempi,i.u8[3]); - if (i.u8[0]==1) - ICU8(tempi,tempi->p1.disp); - else if (i.u8[0]==2) - ICU32(tempi,tempi->p1.disp); - else if (i.u8[0]==4) { - ICU32(tempi,tempi->p1.disp-(ip2+tempi->ic_cnt+5)); - tempi->ic_flags&=~ICF_CODE_FINAL; - } + ICModr2(tempi,i,tempi->p1.disp,ip2+5); ICU8(tempi,0xFF); } else { ICMov(tempi,TY_REG+IT_I64,CREG_RAX,0,tempi->p1.type,tempi->p1.reg,tempi->p1.disp,ip2); @@ -3964,20 +3759,18 @@ U0 ICTestAndBranch(CIntermediateCode *tempi,I64 ip,I64 is,U8 *buf,I64 ip2) } } else ICOr(tempi,tempi->p1.reg); - ip+=tempi->ic_cnt; - lb=tempi->ic_data; - while (lb1=lb->fwd) - lb=lb1; - if (lb->addr!=INVALID_PTR) { + ip+=tempi->ic_cnt; + lb=OptLabelFwd(tempi->ic_data); + short_jmp=ToBool(tempi->ic_flags&ICF_SHORT_JMP); + if (!buf && lb->addr!=INVALID_PTR) { i=lb->addr-ip; if (lb->flags&CBMF_POP_CMP) i+=8; if (MIN_I8+2ic_flags&ICF_SHORT_JMP); + if (short_jmp) { tempi->ic_flags|=ICF_SHORT_JMP; i=lb->addr-(ip+2); @@ -3997,23 +3790,20 @@ U0 ICTestAndBranch(CIntermediateCode *tempi,I64 ip,I64 is,U8 *buf,I64 ip2) U0 ICZFlagBranch(CIntermediateCode *tempi,I64 ip,I64 is,U8 *buf) { I64 i; - Bool short_jmp=FALSE; - CCodeBlkMisc *lb,*lb1; + Bool short_jmp; + CCodeBlkMisc *lb; ip+=tempi->ic_cnt; - - lb=tempi->ic_data; - while (lb1=lb->fwd) - lb=lb1; - if (lb->addr!=INVALID_PTR) { + lb=OptLabelFwd(tempi->ic_data); + short_jmp=ToBool(tempi->ic_flags&ICF_SHORT_JMP); + if (!buf && lb->addr!=INVALID_PTR) { i=lb->addr-ip; if (lb->flags&CBMF_POP_CMP) i+=8; if (MIN_I8+2ic_flags&ICF_SHORT_JMP); + if (short_jmp) { tempi->ic_flags|=ICF_SHORT_JMP; i=lb->addr-(ip+2); @@ -4034,10 +3824,10 @@ U0 ICAndBranch(CIntermediateCode *tempi,I64 ip,I64 is,U8 *buf,I64 ip2) { U64 i; I64 it,t1,r1,d1,r2; - Bool short_jmp=FALSE,swap,override; - CCodeBlkMisc *lb,*lb1; + Bool short_jmp,swap,override; + CCodeBlkMisc *lb; CICArg *p1,*p2; - + if (tempi->p1.type&TY_MASK==TY_IMM) { swap=TRUE; p1=&tempi->p2; @@ -4094,7 +3884,7 @@ U0 ICAndBranch(CIntermediateCode *tempi,I64 ip,I64 is,U8 *buf,I64 ip2) d1=p2->disp; } else ICMov(tempi,TY_REG+IT_I64,r2,0,p2->type,p2->reg,p2->disp,ip2); - i=ICModr(r1,t1,r2,d1); + i=ICModr1(r1,t1,r2,d1); } else { if (TY_REG<=p1->type&TY_MASK<=TY_RIP_DISP32) { t1=p1->type&TY_MASK+it; @@ -4104,7 +3894,7 @@ U0 ICAndBranch(CIntermediateCode *tempi,I64 ip,I64 is,U8 *buf,I64 ip2) ICMov(tempi,TY_REG+IT_I64,r1,0,p1->type,p1->reg,p1->disp,ip2); if (p2->type&TY_MASK!=TY_REG || r2!=p2->reg) ICMov(tempi,TY_REG+IT_I64,r2,0,p2->type,p2->reg,p2->disp,ip2); - i=ICModr(r2,t1,r1,d1); + i=ICModr1(r2,t1,r1,d1); } } else { if (p2->type&TY_MASK==TY_REG) { @@ -4130,7 +3920,7 @@ U0 ICAndBranch(CIntermediateCode *tempi,I64 ip,I64 is,U8 *buf,I64 ip2) ICMov(tempi,TY_REG+IT_I64,r2,0,p2->type,p2->reg,p2->disp,ip2); if (p1->type&TY_MASK!=TY_REG || r1!=p1->reg) ICMov(tempi,TY_REG+IT_I64,r1,0,p1->type,p1->reg,p1->disp,ip2); - i=ICModr(r1,t1,r2,d1); + i=ICModr1(r1,t1,r2,d1); } else { if (p2->type&TY_MASK!=TY_REG || r2!=p2->reg) ICMov(tempi,TY_REG+IT_I64,r2,0,p2->type,p2->reg,p2->disp,ip2); @@ -4140,7 +3930,7 @@ U0 ICAndBranch(CIntermediateCode *tempi,I64 ip,I64 is,U8 *buf,I64 ip2) d1=p1->disp; } else ICMov(tempi,TY_REG+IT_I64,r1,0,p1->type,p1->reg,p1->disp,ip2); - i=ICModr(r2,t1,r1,d1); + i=ICModr1(r2,t1,r1,d1); } } switch (it) { @@ -4158,31 +3948,20 @@ U0 ICAndBranch(CIntermediateCode *tempi,I64 ip,I64 is,U8 *buf,I64 ip2) ICRex(tempi,i.u8[1]); ICU16(tempi,i.u8[2]<<8+0x85); } - if (t1&TY_MASK==TY_SIB) - ICU8(tempi,i.u8[3]); - if (i.u8[0]==1) - ICU8(tempi,d1); - else if (i.u8[0]==2) - ICU32(tempi,d1); - else if (i.u8[0]==4) { - ICU32(tempi,d1-(ip2+tempi->ic_cnt+4)); - tempi->ic_flags&=~ICF_CODE_FINAL; - } + ICModr2(tempi,i,d1,ip2+4); } - ip+=tempi->ic_cnt; - lb=tempi->ic_data; - while (lb1=lb->fwd) - lb=lb1; - if (lb->addr!=INVALID_PTR) { + ip+=tempi->ic_cnt; + lb=OptLabelFwd(tempi->ic_data); + short_jmp=ToBool(tempi->ic_flags&ICF_SHORT_JMP); + if (!buf && lb->addr!=INVALID_PTR) { i=lb->addr-ip; if (lb->flags&CBMF_POP_CMP) i+=8; if (MIN_I8+2ic_flags&ICF_SHORT_JMP); + if (short_jmp) { tempi->ic_flags|=ICF_SHORT_JMP; i=lb->addr-(ip+2); @@ -4230,9 +4009,8 @@ U0 ICAssign(CIntermediateCode *tempi,I64 ip) tempi->p2.type,tempi->p2.reg,tempi->p2.disp,ip); } else { tempi->ic_flags=(tempi->ic_flags|tempi1->ic_flags)&~ICF_CODE_FINAL|ICF_DONT_RESTORE; - tempi1->ic_opcode=IC_NOP; //This better not be last pass! - tempi1->ic_flags=0; tempi->p1.disp=tempi1->ic_data; + OptSetNOP1(tempi1); //This better not be last pass! ICMov(tempi,TY_DISP+tempi->p1.ptype,tempi->p1.reg,tempi->p1.disp, tempi->p2.type,tempi->p2.reg,tempi->p2.disp,ip); } @@ -4251,16 +4029,16 @@ U0 ICAssign(CIntermediateCode *tempi,I64 ip) U0 ICBrBitOps(CIntermediateCode *tempi,I64 ip,I64 op,I64 op_imm,I64 is,U8 *buf,I64 ip2) { - I64 i,ty,r1,r2,d1,d2,t1,t2; + I64 i,t,r1,r2,d1,d2,t1,t2; CICArg *p1=&tempi->p1,*p2=&tempi->p2; - Bool short_jmp=FALSE; - CCodeBlkMisc *lb,*lb1; + Bool short_jmp; + CCodeBlkMisc *lb; if (tempi->ic_flags & ICF_NOT_ADDR) { if (tempi->ic_flags & ICF_P1_FIRST) { if (!(tempi->ic_flags&ICF_SWAP) && p1->type&TY_MASK!=TY_REG && (p1->type&TY_MASK!=TY_IMM || p1->disp>63) || - tempi->ic_flags&ICF_SWAP && p1->type&TY_MASK==TY_IMM && p1->disp<64 || - p1->type&TY_MASK==TY_STK) { + tempi->ic_flags&ICF_SWAP && p1->type&TY_MASK==TY_IMM && p1->disp<64 || + p1->type&TY_MASK==TY_STK) { ICMov(tempi,TY_REG+IT_I64,CREG_RCX,0,p1->type,p1->reg,p1->disp,ip2); t1=TY_REG+IT_I64; r1=CREG_RCX; @@ -4274,8 +4052,8 @@ U0 ICBrBitOps(CIntermediateCode *tempi,I64 ip,I64 op,I64 op_imm,I64 is,U8 *buf,I d1=p1->disp; } if (tempi->ic_flags&ICF_SWAP && p2->type&TY_MASK!=TY_REG && (p2->type&TY_MASK!=TY_IMM || p2->disp>63) || - !(tempi->ic_flags&ICF_SWAP) && p2->type&TY_MASK==TY_IMM && p2->disp<64 || - p2->type&TY_MASK==TY_STK) { + !(tempi->ic_flags&ICF_SWAP) && p2->type&TY_MASK==TY_IMM && p2->disp<64 || + p2->type&TY_MASK==TY_STK) { ICMov(tempi,TY_REG+IT_I64,CREG_RDX,0,p2->type,p2->reg,p2->disp,ip2); t2=TY_REG+IT_I64; r2=CREG_RDX; @@ -4290,8 +4068,8 @@ U0 ICBrBitOps(CIntermediateCode *tempi,I64 ip,I64 op,I64 op_imm,I64 is,U8 *buf,I } } else { if (tempi->ic_flags&ICF_SWAP && p2->type&TY_MASK!=TY_REG && (p2->type&TY_MASK!=TY_IMM ||p2->disp>63)|| - !(tempi->ic_flags&ICF_SWAP) && p2->type&TY_MASK==TY_IMM && p2->disp<64 || - p2->type&TY_MASK==TY_STK) { + !(tempi->ic_flags&ICF_SWAP) && p2->type&TY_MASK==TY_IMM && p2->disp<64 || + p2->type&TY_MASK==TY_STK) { ICMov(tempi,TY_REG+IT_I64,CREG_RCX,0,p2->type,p2->reg,p2->disp,ip2); t2=TY_REG+IT_I64; r2=CREG_RCX; @@ -4305,8 +4083,8 @@ U0 ICBrBitOps(CIntermediateCode *tempi,I64 ip,I64 op,I64 op_imm,I64 is,U8 *buf,I d2=p2->disp; } if (!(tempi->ic_flags&ICF_SWAP) && p1->type&TY_MASK!=TY_REG && (p1->type&TY_MASK!=TY_IMM || p1->disp>63) || - tempi->ic_flags&ICF_SWAP && p1->type&TY_MASK==TY_IMM && p1->disp<64|| - p1->type&TY_MASK==TY_STK) { + tempi->ic_flags&ICF_SWAP && p1->type&TY_MASK==TY_IMM && p1->disp<64|| + p1->type&TY_MASK==TY_STK) { ICMov(tempi,TY_REG+IT_I64,CREG_RDX,0,p1->type,p1->reg,p1->disp,ip2); t1=TY_REG+IT_I64; r1=CREG_RDX; @@ -4362,60 +4140,40 @@ U0 ICBrBitOps(CIntermediateCode *tempi,I64 ip,I64 op,I64 op_imm,I64 is,U8 *buf,I ICU8(tempi,OC_LOCK_PREFIX); } if (tempi->ic_flags&ICF_SWAP) { - if ((p2->type&TY_MASK!=TY_IMM || p2->disp<32) && t1&TY_MASK!=TY_REG) - ty=t1&TY_MASK+IT_U32; + if (p2->type&TY_MASK==TY_IMM && p2->disp<32) + t=t1&TY_MASK+IT_U32; else - ty=t1; - i=ICModr(r2,ty,r1,d1); + t=t1; + i=ICModr1(r2,t,r1,d1); SwapU64(&p1,&p2); } else { - if ((p1->type&TY_MASK!=TY_IMM || p1->disp<32) && t2&TY_MASK!=TY_REG) - ty=t2&TY_MASK+IT_U32; + if (p1->type&TY_MASK==TY_IMM && p1->disp<32) + t=t2&TY_MASK+IT_U32; else - ty=t2; - i=ICModr(r1,ty,r2,d2); + t=t2; + i=ICModr1(r1,t,r2,d2); } ICRex(tempi,i.u8[1]); if (p1->type&TY_MASK==TY_IMM && p1->disp<64) { ICU24(tempi,i.u8[2]<<16+op_imm); - if (ty&TY_MASK==TY_SIB) - ICU8(tempi,i.u8[3]); - if (i.u8[0]==1) - ICU8(tempi,p2->disp); - else if (i.u8[0]==2) - ICU32(tempi,p2->disp); - else if (i.u8[0]==4) { - ICU32(tempi,p2->disp-(ip2+tempi->ic_cnt+5)); - tempi->ic_flags&=~ICF_CODE_FINAL; - } + ICModr2(tempi,i,p2->disp,ip2+5); ICU8(tempi,p1->disp); } else { ICU24(tempi,i.u8[2]<<16+op); - if (ty&TY_MASK==TY_SIB) - ICU8(tempi,i.u8[3]); - if (i.u8[0]==1) - ICU8(tempi,p2->disp); - else if (i.u8[0]==2) - ICU32(tempi,p2->disp); - else if (i.u8[0]==4) { - ICU32(tempi,p2->disp-(ip2+tempi->ic_cnt+4)); - tempi->ic_flags&=~ICF_CODE_FINAL; - } + ICModr2(tempi,i,p2->disp,ip2+4); } ip+=tempi->ic_cnt; - lb=tempi->ic_data; - while (lb1=lb->fwd) - lb=lb1; - if (lb->addr!=INVALID_PTR) { + lb=OptLabelFwd(tempi->ic_data); + short_jmp=ToBool(tempi->ic_flags&ICF_SHORT_JMP); + if (!buf && lb->addr!=INVALID_PTR) { i=lb->addr-ip; if (lb->flags&CBMF_POP_CMP) i+=8; if (MIN_I8+2ic_flags&ICF_SHORT_JMP); + if (short_jmp) { tempi->ic_flags|=ICF_SHORT_JMP; i=lb->addr-(ip+2); @@ -4544,64 +4302,6 @@ U0 ICQueRem(CIntermediateCode *tempi,I64 ip2) ICU32(tempi,sizeof(U8 *)<<24+0x538948); } -U0 ICLimit(CIntermediateCode *tempi,I64 op,I64 ip2) -{ - I64 r2,r1,i2=0x48,i1=0x48; - if (tempi->ic_flags & ICF_P1_FIRST) { //TODO--does this come-up? checks for only 2 param before setting flag - if (tempi->p1.type==TY_REG+IT_I64 && tempi->p1.reg!=CREG_RAX) { - r1=tempi->p1.reg; - if (r1>7) { - i1++; - r1&=7; - } - } else { - ICMov(tempi,TY_REG+IT_I64,CREG_RDX,0, - tempi->p1.type,tempi->p1.reg,tempi->p1.disp,ip2); - r1=CREG_RDX; - } - if (tempi->p2.type==TY_REG+IT_I64 && tempi->p2.reg!=CREG_RAX) { - r2=tempi->p2.reg; - if (r2>7) { - i2++; - r2&=7; - } - } else { - ICMov(tempi,TY_REG+IT_I64,CREG_RCX,0, - tempi->p2.type,tempi->p2.reg,tempi->p2.disp,ip2); - r2=CREG_RCX; - } - } else { - if (tempi->p2.type==TY_REG+IT_I64 && tempi->p2.reg!=CREG_RAX) { - r2=tempi->p2.reg; - if (r2>7) { - i2++; - r2&=7; - } - } else { - ICMov(tempi,TY_REG+IT_I64,CREG_RCX,0, - tempi->p2.type,tempi->p2.reg,tempi->p2.disp,ip2); - r2=CREG_RCX; - } - if (tempi->p1.type==TY_REG+IT_I64 && tempi->p1.reg!=CREG_RAX) { - r1=tempi->p1.reg; - if (r1>7) { - i1++; - r1&=7; - } - } else { - ICMov(tempi,TY_REG+IT_I64,CREG_RDX,0, - tempi->p1.type,tempi->p1.reg,tempi->p1.disp,ip2); - r1=CREG_RDX; - } - } - ICMov(tempi,TY_REG+IT_I64,CREG_RAX,0, - tempi->p3.type,tempi->p3.reg,tempi->p3.disp,ip2); - ICU24(tempi,0xC03B00+r2<<16+i2); - ICU32(tempi,0xC0000F00+op.u8[0]<<16+r2<<24+i2); - ICU24(tempi,0xC03B00+r1<<16+i1); - ICU32(tempi,0xC0000F00+op.u8[1]<<16+r1<<24+i1); -} - U0 ICMinMax(CIntermediateCode *tempi,I64 op,I64 ip2) { I64 r1,i1=0x48; @@ -4850,12 +4550,11 @@ U0 ICXorEqual(CIntermediateCode *tempi,I64 ip2) tempi->p2.type,tempi->p2.reg,tempi->p2.disp,0x310635340633,ip2); } - U0 ICSwitch(CIntermediateCode *tempi,I64 ip,Bool fast,CLex *lx,U8 *buf,I64 ip2) { I64 i,j,r; - CCodeBlkMisc *lb,*lb1; - Bool short_jmp=FALSE; + CCodeBlkMisc *lb; + Bool short_jmp; CExeAbsAddr *tempa; if (tempi->p1.type&TY_MASK==TY_REG) r=tempi->p1.reg; @@ -4863,50 +4562,53 @@ U0 ICSwitch(CIntermediateCode *tempi,I64 ip,Bool fast,CLex *lx,U8 *buf,I64 ip2) r=CREG_RDX; if (fast) ICMov(tempi,TY_REG+IT_I64,r,0, - tempi->p1.type,tempi->p1.reg,tempi->p1.disp,ip2); + tempi->p1.type,tempi->p1.reg,tempi->p1.disp,ip2); else { if (tempi->p2.type&TY_MASK==TY_IMM) { j=tempi->p2.disp; ICMov(tempi,TY_REG+IT_I64,r,0, - tempi->p1.type,tempi->p1.reg,tempi->p1.disp,ip2); - if (MIN_I8<=j<=MAX_I8) { - ICU24(tempi,0xF88348+(r&7)<<16+(r>7?1:0)); + tempi->p1.type,tempi->p1.reg,tempi->p1.disp,ip2); + if (MIN_I8<=j<=MAX_I8) { + i=0xF88348+(r&7)<<16; + if (r>7) i++; + ICU24(tempi,i); ICU8(tempi,j); } else if (MIN_I32<=j<=MAX_I32) { - ICU24(tempi,0xF88148+(r&7)<<16+(r>7?1:0)); + i=0xF88148+(r&7)<<16; + if (r>7) i++; + ICU24(tempi,i); ICU32(tempi,j); } else { ICMov(tempi,TY_REG+IT_I64,CREG_RCX,0, - tempi->p2.type,tempi->p2.reg,tempi->p2.disp,ip2); - ICU24(tempi,0xC13B48+(r&7)<<19+(r>7?4:0)); + tempi->p2.type,tempi->p2.reg,tempi->p2.disp,ip2); + i=0xC13B48+(r&7)<<19; + if (r>7) i+=4; + ICU24(tempi,i); } } else { if (tempi->ic_flags & ICF_P1_FIRST) { ICMov(tempi,TY_REG+IT_I64,r,0, - tempi->p1.type,tempi->p1.reg,tempi->p1.disp,ip2); + tempi->p1.type,tempi->p1.reg,tempi->p1.disp,ip2); ICMov(tempi,TY_REG+IT_I64,CREG_RCX,0, - tempi->p2.type,tempi->p2.reg,tempi->p2.disp,ip2); + tempi->p2.type,tempi->p2.reg,tempi->p2.disp,ip2); } else { ICMov(tempi,TY_REG+IT_I64,CREG_RCX,0, - tempi->p2.type,tempi->p2.reg,tempi->p2.disp,ip2); + tempi->p2.type,tempi->p2.reg,tempi->p2.disp,ip2); ICMov(tempi,TY_REG+IT_I64,r,0, - tempi->p1.type,tempi->p1.reg,tempi->p1.disp,ip2); + tempi->p1.type,tempi->p1.reg,tempi->p1.disp,ip2); } - ICU24(tempi,0xC13B48+(r&7)<<19+(r>7?4:0)); + i=0xC13B48+(r&7)<<19; + if (r>7) i+=4; + ICU24(tempi,i); } - lb=tempi->ic_data; - lb=lb->dft; ip+=tempi->ic_cnt; - while (lb1=lb->fwd) - lb=lb1; - if (lb->addr!=INVALID_PTR) { - i=lb->addr-ip; - if (MIN_I8+2ic_flags&ICF_SHORT_JMP); + lb=OptLabelFwd(tempi->ic_data(CCodeBlkMisc *)->dft); + short_jmp=ToBool(tempi->ic_flags&ICF_SHORT_JMP); + if (!buf && lb->addr!=INVALID_PTR && + MIN_I8+2addr-ipic_flags|=ICF_SHORT_JMP; i=lb->addr-(ip+2); @@ -4920,7 +4622,9 @@ U0 ICSwitch(CIntermediateCode *tempi,I64 ip,Bool fast,CLex *lx,U8 *buf,I64 ip2) } lb=tempi->ic_data; - ICU32(tempi,0xC524FF48+(r&7)<<27+(r>7?2:0)); + i=0xC524FF48+(r&7)<<27; + if (r>7) i+=2; + ICU32(tempi,i); if (lx->flags&LF_AOT_COMPILE) i=lb->addr+lx->a->ip; else @@ -4949,172 +4653,3 @@ U0 ICLocalVarInit(CIntermediateCode *tempi) ICU16(tempi,0xAAF3); ICU16(tempi,0x5F48); } - -U0 ICMemCpy(CIntermediateCode *tempi,I64 ip2) -{ - I64 i,j,cnt; - if (tempi->p1.type&TY_MASK==TY_IMM) { - if (!(cnt=tempi->p1.disp)) return; - if (tempi->p2.type&TY_MASK==TY_REG && - tempi->p2.reg==CREG_RAX) { - ICMov(tempi,TY_REG+IT_I64,CREG_RDX,0, - tempi->p2.type,tempi->p2.reg,tempi->p2.disp,ip2); - ICMov(tempi,TY_REG+IT_I64,CREG_RAX,0, - tempi->p3.type,tempi->p3.reg,tempi->p3.disp,ip2); - } else { - ICMov(tempi,TY_REG+IT_I64,CREG_RAX,0, - tempi->p3.type,tempi->p3.reg,tempi->p3.disp,ip2); - ICMov(tempi,TY_REG+IT_I64,CREG_RDX,0, - tempi->p2.type,tempi->p2.reg,tempi->p2.disp,ip2); - } - if (!(cnt&7)) - i=3; - else if (!(cnt&3)) - i=2; - else if (!(cnt&1)) - i=1; - else - i=0; - cnt>>=i; - - if (cnt<=2) { - j=0; - while (cnt--) { - switch (i) { - case 0: - ICMov(tempi,TY_REG+IT_I8,CREG_RCX,0,TY_DISP+IT_I8,CREG_RDX,j,ip2); - ICMov(tempi,TY_DISP+IT_I8,CREG_RAX,j,TY_REG+IT_I64,CREG_RCX,0,ip2); - break; - case 1: - ICMov(tempi,TY_REG+IT_I16,CREG_RCX,0,TY_DISP+IT_I16,CREG_RDX,j,ip2); - ICMov(tempi,TY_DISP+IT_I16,CREG_RAX,j,TY_REG+IT_I64,CREG_RCX,0,ip2); - break; - case 2: - ICMov(tempi,TY_REG+IT_I32,CREG_RCX,0,TY_DISP+IT_I32,CREG_RDX,j,ip2); - ICMov(tempi,TY_DISP+IT_I32,CREG_RAX,j,TY_REG+IT_I64,CREG_RCX,0,ip2); - break; - case 3: - ICMov(tempi,TY_REG+IT_I64,CREG_RCX,0,TY_DISP+IT_I64,CREG_RDX,j,ip2); - ICMov(tempi,TY_DISP+IT_I64,CREG_RAX,j,TY_REG+IT_I64,CREG_RCX,0,ip2); - break; - } - j+=1<p1.type,tempi->p1.reg,cnt,ip2); - - ICPushRegs(tempi,1<p1.type&TY_MASK==TY_REG && - tempi->p1.reg==CREG_RAX) { - ICMov(tempi,TY_REG+IT_I64,CREG_RCX,0, - tempi->p1.type,tempi->p1.reg,tempi->p1.disp,ip2); - ICMov(tempi,TY_REG+IT_I64,CREG_RAX,0, - tempi->p3.type,tempi->p3.reg,tempi->p3.disp,ip2); - ICMov(tempi,TY_REG+IT_I64,CREG_RDX,0, - tempi->p2.type,tempi->p2.reg,tempi->p2.disp,ip2); - } else if (tempi->p2.type&TY_MASK==TY_REG && - tempi->p2.reg==CREG_RAX) { - ICMov(tempi,TY_REG+IT_I64,CREG_RDX,0, - tempi->p2.type,tempi->p2.reg,tempi->p2.disp,ip2); - ICMov(tempi,TY_REG+IT_I64,CREG_RAX,0, - tempi->p3.type,tempi->p3.reg,tempi->p3.disp,ip2); - ICMov(tempi,TY_REG+IT_I64,CREG_RCX,0, - tempi->p1.type,tempi->p1.reg,tempi->p1.disp,ip2); - } else { - ICMov(tempi,TY_REG+IT_I64,CREG_RAX,0, - tempi->p3.type,tempi->p3.reg,tempi->p3.disp,ip2); - ICMov(tempi,TY_REG+IT_I64,CREG_RDX,0, - tempi->p2.type,tempi->p2.reg,tempi->p2.disp,ip2); - ICMov(tempi,TY_REG+IT_I64,CREG_RCX,0, - tempi->p1.type,tempi->p1.reg,tempi->p1.disp,ip2); - } - ICPushRegs(tempi,1<p1.type&TY_MASK==TY_IMM && - tempi->p2.type&TY_MASK==TY_IMM && !tempi->p2.disp ) { //Set to zero - if (!(cnt=tempi->p1.disp)) return; - cnt<<=op; - if (!(cnt&7)) - op=3; - else if (!(cnt&3)) - op=2; - else if (!(cnt&1)) - op=1; - else - op=0; - cnt>>=op; - ICMov(tempi,TY_REG+IT_I64,CREG_RAX,0, - tempi->p3.type,tempi->p3.reg,tempi->p3.disp,ip2); - ICMov(tempi,TY_REG+IT_I64,CREG_RCX,0, - tempi->p1.type,tempi->p1.reg,cnt,ip2); - ICPushRegs(tempi,1<p1.type&TY_MASK==TY_REG && - tempi->p1.reg==CREG_RAX) { - ICMov(tempi,TY_REG+IT_I64,CREG_RCX,0, - tempi->p1.type,tempi->p1.reg,tempi->p1.disp,ip2); - ICMov(tempi,TY_REG+IT_I64,CREG_RAX,0, - tempi->p3.type,tempi->p3.reg,tempi->p3.disp,ip2); - ICMov(tempi,TY_REG+IT_I64,CREG_RDX,0, - tempi->p2.type,tempi->p2.reg,tempi->p2.disp,ip2); - } else if (tempi->p2.type&TY_MASK==TY_REG && - tempi->p2.reg==CREG_RAX) { - ICMov(tempi,TY_REG+IT_I64,CREG_RDX,0, - tempi->p2.type,tempi->p2.reg,tempi->p2.disp,ip2); - ICMov(tempi,TY_REG+IT_I64,CREG_RAX,0, - tempi->p3.type,tempi->p3.reg,tempi->p3.disp,ip2); - ICMov(tempi,TY_REG+IT_I64,CREG_RCX,0, - tempi->p1.type,tempi->p1.reg,tempi->p1.disp,ip2); - } else { - ICMov(tempi,TY_REG+IT_I64,CREG_RAX,0, - tempi->p3.type,tempi->p3.reg,tempi->p3.disp,ip2); - ICMov(tempi,TY_REG+IT_I64,CREG_RDX,0, - tempi->p2.type,tempi->p2.reg,tempi->p2.disp,ip2); - ICMov(tempi,TY_REG+IT_I64,CREG_RCX,0, - tempi->p1.type,tempi->p1.reg,tempi->p1.disp,ip2); - } - ICPushRegs(tempi,1<r.type&TY_MASK) - ICMov(tempi,TY_REG+IT_I64,CREG_RAX,0,TY_REG+IT_I64,CREG_RDI,0,ip2); - ICPopRegs(tempi,1<hash_table_lst=NULL; + lx=LexNew(TextFileRead("OpCodes.TXT"),0,"OpCodes.TXT.Z"); + lx->htc.hash_table_lst=NULL; Lex(lx); while (lx->token) { if (lx->token!=TK_IDENT) @@ -227,7 +227,6 @@ U0 CmpLoadDefines() DefineLoad("ST_MISSING_EXPRESSION","missing Expression at "); DefineLoad("ST_MISSING_RIGHT_PAREN","missing ')' at "); DefineLoad("ST_MISSING_RIGHT_BRACKET","missing ']' at "); - DefineLoad("ST_MISSING_COLON","missing ':' at"); DefineLoad("ST_UNDEFINED_SYM","undefined sym at "); DefineLoad("ST_UNDEFINED_SYM_LINE","undefined sym at line:"); DefineLoad("ST_UNDEFINED_IDENTIFIER","undefined identifier at "); @@ -315,6 +314,7 @@ U0 CmpLoadDefines() DefineLoad("ST_UNNECESSARY_PARENTHESIS","Unnecessary parenthesis"); DefineLoad("ST_STATIC_UNION","Static unions are not implemented"); DefineLoad("ST_IMPORT_HASH_TABLE_NOT_ALLOWED","import_hash_table only allowed in AOT compiled #exe{} mode."); + DefineLoad("ST_STREAM_EXE_PUTS_NOT_ALLOWED","StreamExePutS only allowed in AOT compiled #exe{} mode."); DefineLoad("ST_CANT_INIT_GLBL_ON_HEAP","Can't init glbl var on data heap in AOT module"); DefineLoad("ST_INVALID_ARRAY_SIZE","Invalid array size at "); DefineLoad("ST_NO_FUN_ASM_ALIGN","ALIGN not allowed in fun asm blk "); @@ -365,17 +365,17 @@ $AN,"Anchor for inserting Compiler Defines","COMPILE_DEFINE"$ // arg cnt,result cnt,deref/assign/cmp,nonconst,might not fill result "00..END\0" "00..START\0" -"00..NOP\0" -"10..END_EXP\0" "00..NOP1\0" +"10..END_EXP\0" +"00..NOP2\0" "00..LABEL\0" "00..CALL_START\0" "01..CALL_END\0" "00..CALL_END2\0" "10..RETURN_VAL\0" "00..RETURN_VAL2\0" -"01..IMM\0" -"01..F64\0" +"01..IMM_U64\0" +"01..IMM_F64\0" "01.NSTR_CONST\0" "01.NABS_ADDR\0" "01.NADDR_IMPORT\0" @@ -395,7 +395,7 @@ $AN,"Anchor for inserting Compiler Defines","COMPILE_DEFINE"$ "10..TO_F64\0" "10..TO_BOOL\0" "10..TOUPPER\0" -"11..NATIVE_TYPECAST\0" +"11..HOLYC_TYPECAST\0" "11.NADDR\0" "11..COM\0" "11..NOT\0" @@ -432,8 +432,6 @@ $AN,"Anchor for inserting Compiler Defines","COMPILE_DEFINE"$ "21..AND_AND\0" "21..OR_OR\0" "21..XOR_XOR\0" -"31..COLON\0" -"00..QUESTION\0" "21=NASSIGN\0" "21=NASSIGN_PP\0" "21=NASSIGN_MM\0" @@ -477,12 +475,12 @@ $AN,"Anchor for inserting Compiler Defines","COMPILE_DEFINE"$ "00.NPAUSE\0" "10.NCLFLUSH\0" "10.NINVLPG\0" -"10.NINU8\0" -"10.NINU16\0" -"10.NINU32\0" -"20.NOUTU8\0" -"20.NOUTU16\0" -"20.NOUTU32\0" +"10.NIN_U8\0" +"10.NIN_U16\0" +"10.NIN_U32\0" +"20.NOUT_U8\0" +"20.NOUT_U16\0" +"20.NOUT_U32\0" "00.NGET_FLAGS\0" "00.NCARRY\0" "10.NSET_FLAGS\0" @@ -499,11 +497,9 @@ $AN,"Anchor for inserting Compiler Defines","COMPILE_DEFINE"$ "20.NBTS\0" "20.NBTR\0" "20.NBTC\0" -"30.NBEQU\0" "20.NLBTS\0" "20.NLBTR\0" "20.NLBTC\0" -"30.NLBEQU\0" "10.NBSF\0" "10.NBSR\0" "10.NQUE_INIT\0" @@ -511,11 +507,6 @@ $AN,"Anchor for inserting Compiler Defines","COMPILE_DEFINE"$ "20.NQUE_INS_REV\0" "10.NQUE_REM\0" "10.NSTRLEN\0" -"30.NMEMCPY\0" -"30.NMEMSET\0" -"30.NMEMSET_U16\0" -"30.NMEMSET_U32\0" -"30.NMEMSET_U64\0" "10..BR_ZERO\0" "10..BR_NOT_ZERO\0" "20..BR_NOT_EQUAL\0" @@ -562,8 +553,6 @@ $AN,"Anchor for inserting Compiler Defines","COMPILE_DEFINE"$ "20..MIN_U64\0" "20..MAX_I64\0" "20..MAX_U64\0" -"30..LIMIT_I64\0" -"30..LIMIT_U64\0" "20..MOD_U64\0" "10..SQRI64\0" "10..SQRU64\0" @@ -727,9 +716,6 @@ U0 CmpFillTables() d4[TK_OR_OR] =PREC_OR_OR<<16+IC_OR_OR; - d4[':'] =(PREC_QUEST+ASSOCF_LEFT)<<16+IC_COLON; - d4['?'] =(PREC_QUEST+ASSOCF_LEFT)<<16+IC_QUESTION; - d4['='] =(PREC_ASSIGN+ASSOCF_RIGHT)<<16+IC_ASSIGN; d4[TK_SHL_EQUAL]=(PREC_ASSIGN+ASSOCF_RIGHT)<<16+IC_SHL_EQUAL; d4[TK_SHR_EQUAL]=(PREC_ASSIGN+ASSOCF_RIGHT)<<16+IC_SHR_EQUAL; diff --git a/TempleOS/Compiler/CmpMain.CPP b/TempleOS/Compiler/CmpMain.CPP index d68271d..bfc29f7 100644 --- a/TempleOS/Compiler/CmpMain.CPP +++ b/TempleOS/Compiler/CmpMain.CPP @@ -1,4 +1,4 @@ -U0 StreamPutS(U8 *st) +U0 StreamPutS(U8 *buf) //Inss text into the stream of //characters being compiled. Called //from withing #exe{} block. @@ -6,7 +6,7 @@ U0 StreamPutS(U8 *st) CLex *lx=Fs->last_lex; CStreamBlk *tempe=lx->last_stream_blk; if (tempe!=&lx->next_stream_blk) - tempe->body=StrAdd(tempe->body,st); + tempe->body=StrAdd(tempe->body,buf); else PrintFErr("No exe{} blk\n"); } @@ -17,7 +17,7 @@ U0 StreamPrintF(U8 *src,...) //from withing #exe{} block. { U8 *buf=SPrintFJoin(NULL,src,argc,argv); -StreamPutS(buf); + StreamPutS(buf); Free(buf); } @@ -37,7 +37,7 @@ U8 *CmpStatement(CLex *lx,I64 *type) CBICAdd(lx,IC_RETURN_VAL2,0,NULL); CBICAdd(lx,IC_RET,0,0); CBICAdd(lx,IC_END,0,0); - if (result=CBCompile(lx,NULL,&size,NULL,NULL,type)) { + if (result=CBCompile(lx,NULL,&size,NULL,type)) { if (lx->flags&LF_AOT_COMPILE) { j=lx->a->ip; k=(size+7)>>3; @@ -65,12 +65,8 @@ CExe *CmpJoin(CLex *lx,CHashFun *locals,Bool first_lex,Bool asm_blk=FALSE, CAsmCodeBlk *tempc; CExeImportExport *tempe; Bool okay=TRUE; - CHashTable *ht1=lx->hash_table_lst, - *ht2=lx->define_hash_table, - *ht3=lx->glbl_hash_table, - *ht4=lx->local_hash_table, - *asm_hash_alias=MAllocIdentical(asm_hash); - CHashFun *old_var_lst=lx->local_var_lst; + CLexHashTableContext *htc=MAlloc(sizeof(CLexHashTableContext)); + CHashTable *asm_hash_alias=MAllocIdentical(asm_hash); CExe *result=CAlloc(sizeof(CExe)); result->parent_exe=lx->exe_struct; lx->exe_struct=result; @@ -83,19 +79,20 @@ CExe *CmpJoin(CLex *lx,CHashFun *locals,Bool first_lex,Bool asm_blk=FALSE, a->max_align=1; a->module_org=INVALID_PTR; - lx->local_hash_table=HashTableNew(16); - lx->glbl_hash_table =HashTableNew(2048); + MemCpy(htc,&lx->htc,sizeof(CLexHashTableContext)); + lx->htc.local_hash_table=HashTableNew(16); + lx->htc.glbl_hash_table =HashTableNew(2048); - asm_hash_alias->next=lx->local_hash_table; - lx->local_hash_table->next=lx->glbl_hash_table; + asm_hash_alias->next=lx->htc.local_hash_table; + lx->htc.local_hash_table->next=lx->htc.glbl_hash_table; if (lx->flags&LF_AOT_COMPILE) - lx->define_hash_table=lx->glbl_hash_table; + lx->htc.define_hash_table=lx->htc.glbl_hash_table; else - lx->glbl_hash_table->next=Fs->hash_table; - lx->hash_table_lst =asm_hash_alias; + lx->htc.glbl_hash_table->next=Fs->hash_table; + lx->htc.hash_table_lst =asm_hash_alias; - lx->local_var_lst=locals; //C+ local vars + lx->htc.local_var_lst=locals; //Holy C local vars try { if (first_lex) Lex(lx); @@ -134,9 +131,9 @@ CExe *CmpJoin(CLex *lx,CHashFun *locals,Bool first_lex,Bool asm_blk=FALSE, result=NULL; } else { if (map_name && !cmp_do_not_write_to_dsk) - HashRep(lx->glbl_hash_table,HTG_ALL,map_name,"-r-p",mapfile_drv); - HashTableDel(lx->local_hash_table); - HashTableDel(lx->glbl_hash_table); + HashRep(lx->htc.glbl_hash_table,HTG_ALL,map_name,"-r-p",mapfile_drv); + HashTableDel(lx->htc.local_hash_table); + HashTableDel(lx->htc.glbl_hash_table); if (!a->num_code_U8s) result->code=NULL; @@ -170,11 +167,8 @@ CExe *CmpJoin(CLex *lx,CHashFun *locals,Bool first_lex,Bool asm_blk=FALSE, result->module_org=a->module_org; lx->exe_struct=result->parent_exe; } - lx->hash_table_lst =ht1, - lx->define_hash_table=ht2; - lx->glbl_hash_table =ht3; - lx->local_hash_table =ht4; - lx->local_var_lst=old_var_lst; + MemCpy(&lx->htc,htc,sizeof(CLexHashTableContext)); + Free(htc); Free(asm_hash_alias); Free(a); lx->a=old_a; @@ -189,7 +183,7 @@ CExe *CmpBuf(U8 *buf,U8 *map_name=NULL, CExe *result=NULL; if (!is_first_compiler) "$$FG,PURPLE$$**** Not First Compiler ****$$FG$$\n"; - lx=LexNew(buf,LF_DONT_FREE_BUF,NULL); + lx=LexNew(buf,LF_DONT_FREE_BUF); lx->flags|=LF_AOT_COMPILE; QueIns(lx,Fs->last_lex); result=CmpJoin(lx,NULL,TRUE,FALSE,map_name,mapfile_drv); @@ -501,7 +495,7 @@ I64 Cmp(U8 *filename,U8 *map_name=NULL,U8 *out_name=NULL,U8 mapfile_drv=0) *ptr++=EIE_END; MemSet(ptr,0,16); i=ptr-patch_table; - //$LK,"NATIVE_XSUM","FF:::/TempleOS/Kernel/KStart.CPP,NATIVE_XSUM"$ needs 16 ALIGN + //$LK,"TEMPLEOS_XSUM","FF:::/TempleOS/Kernel/KStart.CPP,TEMPLEOS_XSUM"$ needs 16 ALIGN size=(sizeof(CBinFile)+code_U8s+i+15)&-16; bfh=MAlloc(size); bfh->jmp=0xEB+256*(sizeof(CBinFile)-2); @@ -509,7 +503,7 @@ I64 Cmp(U8 *filename,U8 *map_name=NULL,U8 *out_name=NULL,U8 mapfile_drv=0) bfh->type=0; bfh->loader_patch_table_offset=sizeof(CBinFile)+code_U8s; bfh->file_size=size; - bfh->xsum=NATIVE_XSUM; + bfh->xsum=TEMPLEOS_XSUM; MemCpy(bfh(U8 *)+sizeof(CBinFile),ex->code,code_U8s); MemCpy(bfh(U8 *)+sizeof(CBinFile)+code_U8s,patch_table, size-code_U8s-sizeof(CBinFile)); @@ -533,18 +527,24 @@ I64 Cmp(U8 *filename,U8 *map_name=NULL,U8 *out_name=NULL,U8 mapfile_drv=0) return error_cnt; } -I64 ExePutS(U8 *buf,U8 *filename=NULL,Bool just_load=FALSE) +I64 ExePutS(U8 *buf,U8 *filename=NULL,Bool just_load=FALSE,CLexHashTableContext *htc=NULL) { I64 result; Bool okay=TRUE; CLex *lx; if (!filename) filename=sys_temp_filename; - lx=LexNew(buf,LF_DONT_FREE_BUF,FileNameAbs(filename)); + lx=LexNew(buf,LF_DONT_FREE_BUF,filename); if (just_load) lx->flags|=LF_JUST_LOAD; - if (Fs->last_lex!=&Fs->next_lex) + if (Fs->last_lex!=&Fs->next_lex) { lx->opts=Fs->last_lex->opts; + if (htc) { + lx->flags=lx->flags &~LF_ASM_EXPRESSIONS | + htc->old_flags&LF_ASM_EXPRESSIONS; + MemCpy(&lx->htc,htc,sizeof(CLexHashTableContext)); + } + } QueIns(lx,Fs->last_lex); try { Lex(lx); @@ -592,7 +592,7 @@ I64 ExePutS2(U8 *buf,U8 *filename=NULL,Bool just_load=FALSE) CLex *lx; if (!filename) filename=sys_temp_filename; - lx=LexNew(buf,LF_DONT_FREE_BUF,FileNameAbs(filename)); + lx=LexNew(buf,LF_DONT_FREE_BUF,filename); if (just_load) lx->flags|=LF_JUST_LOAD; if (Fs->last_lex!=&Fs->next_lex) @@ -643,7 +643,7 @@ I64 ExePutS3(U8 *buf,U8 *filename=NULL,Bool just_load=FALSE) CLex *lx; if (!filename) filename=sys_temp_filename; - lx=LexNew(buf,LF_DONT_FREE_BUF,FileNameAbs(filename)); + lx=LexNew(buf,LF_DONT_FREE_BUF,filename); if (just_load) lx->flags|=LF_JUST_LOAD; if (Fs->last_lex!=&Fs->next_lex) @@ -677,6 +677,32 @@ I64 ExeFile3(U8 *name,Bool just_load=FALSE) return result; } +I64 StreamExePutS(U8 *buf) +{//Suppose you want a value from the stream to be used in an #exe block... + CLexHashTableContext *htc; + I64 result=0; + CLex *lx=Fs->last_lex; + if (lx==&Fs->next_lex) { + PutErr; + "Not Compiling\n"; + } else { + if (!(lx->flags&LF_EXE_BLK)) + LexExcept(lx,"ST_STREAM_EXE_PUTS_NOT_ALLOWED"); + if (htc=lx->htc.next) + result=ExePutS(buf,,,htc); + } + return result; +} + +I64 StreamExePrintF(U8 *fmt,...) +{ + I64 result; + U8 *buf=SPrintFJoin(NULL,fmt,argc,argv); + result=StreamExePutS(buf); + Free(buf); + return result; +} + U0 CmpInit() { if (!sys_num_installed_compilers++) { @@ -693,7 +719,7 @@ U0 CmpInit() MemSet(&opt_nop,0,sizeof(CIntermediateCode)); opt_nop.ic_class=sys_internal_types[IT_I64]; - opt_nop.ic_opcode=IC_NOP; + opt_nop.ic_opcode=IC_NOP1; AsmHashLoad(is_first_compiler); UnasmHashLoad; } diff --git a/TempleOS/Compiler/CmpQueVect.CPP b/TempleOS/Compiler/CmpQueVect.CPP deleted file mode 100644 index 01aecb7..0000000 --- a/TempleOS/Compiler/CmpQueVect.CPP +++ /dev/null @@ -1,67 +0,0 @@ -CQueVectU8 *QueVectU8New(I64 min_index=0) -{ - CQueVectU8 *result=MAlloc(sizeof(CQueVectU8)); - result->next=result->last=result; - result->total_cnt=result->node_cnt=0; - result->min_index=min_index; - return result; -} - -U0 QueVectU8Put(CQueVectU8 *v,I64 index,U8 ch) -{ - CQueVectU8 *tempv; - index-=v->min_index; - if (index<0) return; - if (indextotal_cnt) { - tempv=v; - do { - index-=tempv->node_cnt; - if (index<0) { - tempv->body[index+tempv->node_cnt]=ch; - return; - } - tempv=tempv->next; - } while (tempv!=v); - } else - index-=v->total_cnt; - - while (TRUE) { - tempv=v->last; - if (tempv->node_cnt>=QUE_VECT_U8_CNT) { - tempv=MAlloc(sizeof(CQueVectU8)); - tempv->node_cnt=0; - QueIns(tempv,v->last); - } - if (index--) { - tempv->body[tempv->node_cnt++]=0; - v->total_cnt++; - } else { - tempv->body[tempv->node_cnt++]=ch; - v->total_cnt++; - break; - } - } -} - -U0 QueVectU8Del(CQueVectU8 *v) -{ - if (v) { - QueDel(v); - Free(v); - } -} - -I64 QueVectU8Get(CQueVectU8 *v,I64 index) -{ - CQueVectU8 *tempv; - index-=v->min_index; - if (!(0<=indextotal_cnt)) return 0; - tempv=v; - do { - index-=tempv->node_cnt; - if (index<0) - return tempv->body[index+tempv->node_cnt]; - tempv=tempv->next; - } while (tempv!=v); - return 0; -} diff --git a/TempleOS/Compiler/CodeGen.CPP b/TempleOS/Compiler/CodeGen.CPP index 81df4b5..f75fa4d 100644 --- a/TempleOS/Compiler/CodeGen.CPP +++ b/TempleOS/Compiler/CodeGen.CPP @@ -71,7 +71,7 @@ U0 CBPutICArg(CICArg *p) U0 CBPutIC(CIntermediateCode *tempi) { I64 opcode=tempi->ic_opcode,i; - if (opcode>=IC_END_EXP && opcode!=IC_NOP1) { + if (opcode>=IC_END_EXP && opcode!=IC_NOP2) { "%15ts %016X ", DefineSub(opcode,"ST_INTERMEDIATE_CODE")+4, tempi->ic_data; @@ -84,17 +84,10 @@ U0 CBPutIC(CIntermediateCode *tempi) ','; if (tempi->p2.type&TY_MASK) CBPutICArg(&tempi->p2); - ','; - if (tempi->p3.type&TY_MASK) - CBPutICArg(&tempi->p3); '' CH_SPACE; CBPutClass(tempi->ic_class); if (tempi->ic_flags & ICF_LOCK) "$$FG,BROWN$$lock$$FG$$ "; - if (tempi->ic_flags & ICF_P3_TO_F64) - "$$FG,LTBLUE$$p3d$$FG$$ "; - if (tempi->ic_flags & ICF_P3_TO_INT) - "$$FG,GREEN$$p3i$$FG$$ "; if (tempi->ic_flags & ICF_P2_TO_F64) "$$FG,LTBLUE$$p2d$$FG$$ "; if (tempi->ic_flags & ICF_P2_TO_INT) @@ -157,7 +150,6 @@ CIntermediateCode *CBICAdd(CLex *lx, flags|=ICF_LOCK; tempi->ic_flags=flags; tempi->ic_line=lx->last_line_num; - tempi->ic_indent_level=lx->indent_level; if (lx->opts & OPTF_PARSE_TRACE) CBPutIC(tempi); tempi++; @@ -382,28 +374,12 @@ U0 CBCombine(CLex *lx) } } -CIndentInfo *CBIndents(CLex *lx) -{ - CIndentInfo *result; - I64 i,num_lines=lx->max_line-lx->min_line+1; - result=CAlloc(offset(CIndentInfo.body)+sizeof(U8)*(num_lines+1)); - result->min_line=lx->min_line; - result->max_line=lx->max_line; - for (i=0;ibody[i]=QueVectU8Get(lx->indent_que_vect,i+lx->min_line); - return result; -} - U8 *CBCompile(CLex *lx,CHashFun *fun_class, - I64 *code_size,CDbgInfo **_dbg,CIndentInfo **_indent,I64 *type=NULL) + I64 *code_size,CDbgInfo **_dbg,I64 *type=NULL) { U8 *result; COptReg register_offsets[NUM_REGS]; - if (_dbg) - *_dbg=NULL; - if (_indent) - *_indent=NULL; - + if (_dbg) *_dbg=NULL; CBCombine(lx); if (Bt(&lx->flags,Lf_OPT_TRACE_PRESENT)) { if (Bt(&lx->pass_trace_mask,0)) { @@ -489,9 +465,6 @@ U8 *CBCompile(CLex *lx,CHashFun *fun_class, *code_size=OptPass789A(lx,fun_class,register_offsets,result,_dbg); compiled_bytes+=*code_size; - if (_indent && lx->indent_que_vect) - *_indent=CBIndents(lx); - LinkedLstDel(lx->cbh.cb_out_first); CBMiscLstDel(lx); if (Bt(&lx->opts,OPTf_COMPILE_TRACE)) { diff --git a/TempleOS/Compiler/Compiler.BIN b/TempleOS/Compiler/Compiler.BIN index b33ae5c9a78067a0c0a146c77cf13261f1c83b1a..16192b0e6348b25839ed1bf656146de44c71a4be 100644 GIT binary patch literal 250107 zcmaFO$H1Tw%ghjPg_+?t`^{=5hQR?&FfcHLdvyB>cyxzKcyv1ncyu~}Xbz7~CjpOc zCXY@h4v$VQkM3U{-3QZ}Ett!gJXU*jJ8>Yf1(4VhaQ5*7ARl@(A5wS?(qjFq=x6-N zLjnvW+gJqB4z&@=2HOZ_gKY$}sb?d|cPu5y_9BZwY)2M>xB(%8%Oze+3=APm3=DBh z3=FkQ3=FfG7#MakF)&&$WU$NdLsD;ZcyzulF- zd*J5x2#@9?96=mB%;1qP6`NAnSZpa786T^1E0WEmM47(AM9AnQdk z8C}++`$Ct5$NvLdw@bf!Xdm+Ue}do8(d6z}y=0iB^7o7DE&iW5$eS&-bz|HS)(HA#A!^LG(BJMLY zFuY`DVE9ZV{>{w50KzN`4E!t%43aDi49YAF47w}~49+YJ4B;&BI1z!z35a!kHy^@Tzu>HYaMph~3&ksNQ6#T`#8$H~Fl=XGU^ooLPgxik{;@DHh%+!)A|Xcx z1_<(IUQuND2V4ASnRM0;d2l3!DPLEN}_{vrvK! zX3kBdU;~MLWMKHqz`)5y8s=tWVBlqAVBlwCU=Uf8z_5pnf#Dt-1H*SRG2xg2g*!L` zKrumD6u}Kg*9tOo6w@#SP8cvSgoS$sc?Nric!qk0d4_v*mkM}v*Gl*r-}W_r;={kK zj?ssITR9{Dt~55TVrI|(=lOS~Ls;j0Eq~W)`dWUjRq^8A<|4=B#lOu*fyqPrpilP$ zP$}d3j`5d0zhdi~9BAaRtH`N-V*#u%F$aQi|KFSw;jX@@W zxC%@@$}cfZ_{#uu7pL)o4U8|}g83j{b8qy8h-A7)lfL+~y;%X2N$#0_?t(!?1aDn|9f=Ce(?D3`@ysOmo)>?4 zb|3OM_<-4iITfU$+rZcOiLdc(AO3B5Tps+}>bO1lx5Y7fbjEIgBm@?Z|Gpc1tYbIS z`grqilTq;Kj0FXd8>7en6P}ibOL;)bn2SA{QxE*`>Gfms>^|)I|F9?XK@a|I5+0qg zJ3P8w4|r(1?trF;KRRIchR5!|BJXh_!ryG z`1AjNv4Zh|4F|mWxA7==C?E7_`~hmtmU8+7hR>I@B<-afgz9%mi zfO1dsUw!_TX^fy+;lDnAOAjL`@tt(s$PPB$NBN{ruNxD>W1s+IfO)F>kjM8Mp3I;u z`7#)6M6HBCsW2!+7>ng#)>uNF!%z%!pgL5oLy53w^I!22UXSMg;w9`LeZ@u~-!A_B z|381ze{iy1Y&#Xq`v}e`X>9ELP0zqN1ngH(W&!Ca{Qdubktis9(m^b4kXh{f&3hOa z7+~($0MX^qjLnggp{64o*$A?|xmLoVga_)j|BJ%F z78dz?aQ`or^KAahQp4%lebl4*2Ya2hXY*ek7?;0J2NFxKRX`@~0_hb5IeP<$1r7rC zVos=&Uo&_%|6!;T_O<*}%I4D@`r);@Z}+E{U;q67@5}w9QVN^{k9jozV66A;zV@2a zr!(}!%WHrB|A%J`k6-`)dvs&Tbf7GUD4)YT!+p9%AOHCO-}t}BalT*wK|#;pahw~* z+TGC6(ZF$lfx)9wmI-9$@&7;n|L6O_z~FKG&rgu@4-B5&MI1hs*Gi-vryV!(> z2c&Kb2>1AJYW4H~{}&(s{|A>okdo&xxU&}qs*^Gb_!$_&UOf5m|39c|VKY9kf#bDH zMiE%_9FnNOYrTw8u;>mXQH9qM85LmBMM$C!ubGSw#GO3E!C=8)XvSb{#9(H^0Lo|# zCoI^|E5_rlpw!9WaolwU$kiUlT_=Eg7#_!6J0Nsx28jOu|G&ra)&vAI0?KsU3d+)N zJ&w0}{0GGbC|+6}5KIdgv)fm~qubD<+f@VPQ*MuLUk#7rj384ynrjsVN(Fq4|2u9M z@Hp;zLx6#S;k7DASOF@m01{RJ3G;!Kf%y&$3=GFwUw~4|vDO!$wD4l~dvHLOYI^kc zzWDS1e_$44*o!uZV2MbEnFa#`Oy))Y`~Ux6vma{(sbdJsV$876U|{g+1@k?i6h_a? zllefv3saDR%|{f7Q0&p!`r#ia-QD(V{>@fv>BYZIM$RKRi!s9<>XyI%{|CN!{0>xc z9#H@}4kQ4gLC$}1>fQhUpmxT=3>T<+u<&M(`d&Y_z%0fLH>kvKkU_IR5>Ti8{{J83 z4-kdTA0C~pFCb2H+|1_L{F?{ab-qwTL5_Lh3N;kuDv$t(2HU0sbKSAl6QJ-v)@uI$ z|9?gg{%vd?|BrbzAGqbw{KJXAxq+F1!Q;Qm(IBv?V6~W?UXSJ<68ya}%nS?}Nm}4| z0+|{3;`rPD|6jU-Oz6d{QwgLq4OwR|NGCU8oiCUe7&5Yubq0fUUStBf0F9C16_k5HrP<4)Fi|Iu z8!0oJarjw}$=s|KH>PInVI0 z7jM4&{|{=|Hvd;B%>|Xa4y9>X4q-2@d;wLEtqTAD|M#(+3ZhDcJi5Vr5B}{AZ2Y?( za1@!MiEtKcL0WC#ZqEV74eUP32aFGFU(L#00n}&N@bUluVmXih zr5mysGulBKdV61hO1T$)FCm5UYZ<6)53;NQR2Jk0ka7_H3seM)zx@9{VZ{2v@J z&A&MKdzwM*%|gu7KD&7sLnIx&mVBOb{Pr>k5diQz5pNNQZks zZOn$*2oAs4=b$!g=mn4FUjj9}9$=pf^Y=M|+yF`~&A&uyI3dE~b$TA%p(ns9p+drS z(oi80{+{)q(Jrt7;{5%Kz#KfP{lGSW0$QBEA7WkX32-N|JN5#k{};Q$qce7aM|bQ7 zkIvW`pg{TwO3b|spnTHX3u*;+h{L1#7e}#x$8oS1KrPspHyIchjQ@Ky*X~d+ zmGWrb3-TL(|9p_0y|%^z3=A(p-8_%(&>bGlzj$D2i=V%*2BZWc%mNc;=kH4e2{+fy z;NWkSV*u6bfB%>8c=XzS;b&lY=>d}LwfzoagX6lnc7_0dD-T5YHAq+$#BQ#gp#T?t z021bd3PZBPO@3%5l!9hLkgH#WKLKUJ|64&R;f2?e|Nl{AhQIY9$dGPux4?t@0Dmi} zTJ%WxRISb-dkJ&&;`hZ2xDqA&B35!670qzq>M z-b5w_22>xj@VDLr6{ZL+5P8=QL|U%^<-%^)4v&LBP}4f7LiXrvEkMX4@=a)iM{{ih zGk+^D$VbOr8$iMH(gMV3u5DmKh_f&-FuVlyen9FO5#pfP(w87j9>-l9AfwE+3J&ln z=j3Bxc*zbjuGbdC_GsPSsYxtCqIB! zdItQ>GA!Vp+EpnXa6xMZDriA{<5{{$1+4){OEYS361nCWC2Bm3`Ru-_<&B$8wacK<$X_Ww3+YQpn0oJ+$S*r;y ztVnLMFJ9zr&9F)2otfsC{O83`${VJ03!HZhPC6IDPag1V3JRs*Cl68M4( zY)tJ24oJrG;RjdSuyX8%0HhrA;olDS8@QlCu98n7J89otXt+UJ$nY>)diVeTm+6cQ z3>oL4>cK(R2NDhd3131ME(ZyNMuju3A`2&ggq1+5Zy*bMf`qw2!gr8`jX=U*7#J8b z9v}-#gM>ld$Bf6w!Ym-+V<6SfkcHpg`TzgrdXVr-WZ`Qd;Ta&|H^{>KLBgP6;f(jl z!Ye?+Ss>M)kcB6Lgo8oCUy+5YK*Hem!vAv_KXpL~6+BFXvu_ai!u<}YpnyfFZk0A?B1PQ|u`YC;I@&t`X;z{UnH=zj~9H;>|q5Wv?VrGy3 z$6UUF2bur#x2S_0d>v{Rc;G?xCTNfq-2Dm!6-r=1ft&yTgEam8{~xC5CbFgvHz1lo zmccdMzVZKm#%*L}CqW{2p(5b%*6lYy2D=*k=WlHVH37h5>Wm)WZ+I{t^Xb0f+5DT0 zzZc|4&+fw>7aw>qg9o3FF(`QTvc!TLh;R|mpz?VSOaplMd$mB#l3wRu5EDRS#K#yE zJfQ;r4|p(x$BjW^{|~=D1M`5#|5AY$Vh9InpgYi``3D<+pCCxMxAz6eKVU77uY*bz zUkQ&+L+~64(hRKz0~dp;kx5B_0)wi7Q3Qhm3U3prxx>J~P$LSOxFDTop-{gah59Sd z^v@NB_+tf>-Up?xKQ$nO1nYnSSVcrrMsatIMoG*#C!UM#QQn=x(0)aSp$;@25{m~ zH83=bU{D2>z)%cIQ4G#L430hwju8y5ju8w&ju8wl5e&h>3@*V8uE7j$!3^%f49=k3 zV*pBeZowhmkhHu(4HCDw=(|uiNvJ^7g+S?kD2+=WOq^2vFmuSIPeI*@i%tNI%P}x8 zltbx0D7_R)dqU|wP#WDGm!aaXpfn>iJSCvCK9qKY(y>sw1WJSBS`{sFDTz={1|0@2 z1}=tOCpcKZD+@fjYZZJzYvw^Sk)j#V1`G^Yj2T%53=A)Ro(DH=B{FhByw~Ud|2O{T zV|lGsGm9aMA>5h{{z%8c;O4`W%u?%I0rx){~vpODWe3Wb0dh`?J59S#U%ks zVTNW-o+0s}evZMu464BlDjq&MhALpnK!pJ`2gz_k0OCH+V2BH2C5*rMbcYJ~GGF$9 zIF-#1>{L-h28I`YAS;@WNMuNWcn;@5(_f(iSX~P4e#2ZU2GaNc*z1cK3LuT_Aa3_D z*n%^{PGw*KZ375{ELY^;S1S=7W_%#Uqq`vjG%VA2z=M&2A>hS^bN~NC7O+9pgI1D& z7CP+z|NlRD-G?5;9I!Y;*o);@#4*eTFS7ICUu+0kzy~%ZRTE}D|GrXzuq>t*aWI3R z=0n7pU$`N}IY6uFJi2QIkSyrl0P3M233ToN33zlL19<~9fQe!r%ZqRSpdLXHXMAxF zt2o1pV<_TT$}dF!|NnpTuwE3y2~_uN00ku2Aq*ak2LeE$YI&?wIE&#$^x6OaGh~e! z7+wUP{r~@U8vm{|3E?8%EQSmnW6%HZ1pn5@i^>+ra`fvnLGW z|1YozfAKPtf#J2JM|ax|sB&J9|Jy+9@E7MY85lge?O(5h_}?$TM8P>fw;(eoGcTPB zl%PF*1N?(R;yoOLJ>o+goqSy5{rp4X9esTK!(ClKWh2;MV2^;kIt+7 zFfuS0pWNu-G1KGw&$yF^i;Ec;PDp^_1+*mAhksuzICA*6H_QSJeg8iJp2@L38$oTX&EC9)L9|J9?@?<{X@!tTF zUKxCP8xEjLWie;em@+WD_;?yz4rsiN$88L58GIJ7WK05CFactLfye)IFZKWb{|_o( zUR0k3PjQ2yiO)0WMb7E}|2>0Vq@Mo&Kg;e#-0A=SUqphmaUUoVeBlpev1c*7a0aPh zd|?C8?#q3fzoiG%Kk7b&Wd%$3hb#tHHC|T0kSAo0G3=l!$8HkPj{?rA?U|?kMINk=z^|hc(cf1X>>g?}t(CiYZ zd{Y1kcD7vr<&;iHhUshrEiLuvYy%}lNB&)pIEn?~A=lXk8YFwok0#*Jxet{1J$l159VYiv*}B$PR{Lo-BqemKQ!JL8;}2 zPv<-i&{Eaz!ycXP8XleQ93GwQ9>?85mN0m9AM=cZ1+xT0eo?v-!wG1(feJv6?(HCT z9=+}0tZ8|yM9Zf;%mB1PlKVgjyJyggXD2|3!tBL8FkPnb;wp&Id~C<-Qy%}fgG!kf zhe0C$%M@PhI`RKM|E_ci#v%@n|7I^%gT>1YUMzwzJYLK^@&AALi^(Vc|A$nJkYW{) z?Ylz-JiB*+Tx9&sv$qN2rsE~XKHc#Kpy2}U10`IZ!7qY9<}n`g_;3Eg9mXtIcwr4? zHy_{e`k=@Ea)lR~5E0ON0|~|=Zjc5sh>++1B7+xPPQK=VK)Tpo>e0*s6d45fS?|H}+sI3NH2|K)N}s%)$iU;>Ftdi*a_$YRW> zuw-C(p#sv|d_>}93sea+NQoF!Nj*pjBUH)j6p+y@FnNtE#thKB*Ncb8z+RMi?c&i~ zC%{$8lhFs#cIw#w|E~>UiPWPzOaNR^aC`hO6L_%}Bq;)7W-(^W1Sy{lH6>#nh}U}z zT77!@g;=RZFoarwNH-sU#}F&kR0bPA*YJ2BPd`^X2C%e}0t0A?Gbq47i*unhCTPP1 zBsX<~Gl55EJckFUR#YhF_vnsG=!kdl;NMjyq41jJn7ac5q$Y#w2h}v7$b}Xj3LuR_ z#daS5%RFAZJNo~>XRv3`i>F6HLq9*lvlugitr!?yTm|u)k4SiQx_NjUcMAZ`Z-&3v ze-u71cmUWBY^!yr>F+Z}k9Kr%=odap22FP;J`=%E=!8!IV$;4G-=E zrJNrB`#_?vg+2MVF?;?$?9u6#09vOQ<^a+G_B}Yy@i&{ZFfjOZmmBzWhg=QXZZ08gNUS-36FD{%4)}|KG!U zp9CnC3VC$93wT(&71VKfbjJ&LbjB6%?^*^f%!}Ex7+pbFs!OhvbY2}qS3ln+(|WqbTDF!2n3!4A^U zS!Vzh1*zzav+y|XmY~YW!0_@7X!ZnGfFYbA0N1YI(HW-zD%sq?;~wyc1NrB;TY?(M zQ1G%-QVi9>ZzyQD#7ig8x>9h`RRAp*Bt7Y_1|>dRu7btve|G`T=BfaOT3%2PfrhGI zo&?prAh9~I7^pCKxfN8cA9qV&1|_-`;Dw!_%^1GjLa*H+`KubV+?o48i9TBXQa}zd zjGXhD6S6k~l(o5^@V83;`Tzel11Oib9t0T(ZC+a*F9mIskYFrg_Y8ZXauAe$K{L1v zunGrUGxC7N-NEtnn!%$RT#mq+N|whM8Ya*p5flrc3gNZe%LAZwVh~S&3&Ucj*M^`% z%HzM)3D5?Jcnw&QAqg)s_+drH>zDN)?ag%w3Z)z%LqVYe&%&x6jdcm2inmr8l<^oq zjpFXG1aMWy>G8iT;l;lFpen*G0X#JT-@3)YuobitjDdmSuRX|>xaoZa`qp2fS zA58x!jXxen!)G*nKp`-i4nU!RySy3=pV9CEg}`V!0EGhXeDWSz|5sZ>)TP@&=ol#d z98Fvkv>t?kfdQs&py@-l5cksB9XU{cOF-?*h0?UPchr3P#P4W0kA^cS1V+;VC=>=y z`92ySw2cpl>EKz=aL{B+_=^vq{g~Y!;NuAViw%liLPw=RQ%K!D-g40;Uk zX$a3?&oIckfKUO@{HTUccd3MD(2F-O{{Q!EZURkBczAYi0@Iy#9-Vcdp$rg@!K1TI z~(5^?Y(6VH0kIE$Nt$8k5%I4Z+y8RW^Pck2+cAU}9^?gEWKBPNnS<0Bvm z2GByu2cYqElqnpa?pTQ|h8N30#&rMiIPUraq}YcuKEgA|qqjeSk%1xbMdv!mq^C!( z>x%%-pcj>3)u4&p5>Ah9*B79%Z>g{sNf2d>FCwAxP}4mAm%a!Kf8o6D|NpQTwqQB< zbRy)SLg?X2kb{*ZJi2QQe7Zvwe7a*Te7Z{oe7b8je7P@`@@IgCc09vhSpEkMo?h_a z{#GjH8TMk@b5N*)r>Q+WySIVD5p;M7vuC$e7K3MR7sL}s)2RMz{m1> ziGs%ti$IXq85lsv2uXm4jF?_?dUV^nbjMq~z70}T&>e5%5!@Yb;SuZ^{Gxa*$Q3t0 zG3JpRZ{pDzC*bklO#q^u`%M`xV{WZX&)Ld9{sR`vi7zQtL1AUT5#nd1gZ3!p6{ z46k*4jc>!EJ&PfW@dX3e517h9US{yw-b67oLOHFvvawEgyDw_+P^2 z!M`g{LLti|+%xD!)EdN`VQ@&ik84CcXvLO)m}`)mkAFBMl#!-3K`{)TuJh^b1H0pY zAILrrsB^&XIOx&+0}^zQ$s>$$OVC_Wo`k|{kW0#7F1fH8;SxyR22Byx3V>#jJiCh= zJh;D=NQHa+FXMQzbT#Cp4>pf(H;LEm9^GcI9~vKkP56QG4R{_4Q@2gA_cQe=*dv zfe(VY;?Z3u@cNubcYOuuz!~lXrTdHzz~-+6;6)Fp@Pc|T17y0ahjpDrDabGp5UUns zn8fQR9^GXMukRt8ctQbv)~i;+r#n@{2fY5OT*EWmGwcQEFb>cdv2(_aFz^nnyj9>p zD>2Hr0}+UY3Mghgg$VdS1q8AfGTwxN_JWlPyjX4s+JgFrvDDk6+ugu}f15*$N9KVJ z(1vtWc-2|*I>ZF@R}KPURGzk zg=epOf=BlUpKdYe#JI9&nCJf@jTeVj{{QdM{DYyM)3eu!!=wAd>)W2apu<-`yuReo zX$LBBZ9IG3Gf*@u`C3O=)Pi(KfOI?qaqB=_1rYbT@we9upg?B!=(O`V?hc+J2TkXL zlDNllcL^vBE`xo$!wWn+>kB-(k9&49fwLxj{8@paATfoZD784Xs4O*wAwDrLKQA7% zZpS4wAl}#2*U2>q#sjT82Bk(se1U2j0cc|4Z|Mi^XzrE+r>OHQKL@0h;Vj z^IHGl#h8VR67d%)}e+d!fLFM3vh5@nc!FZZPqP2X-K&;Lan zFUnUy_A>}D6mxq1FOqnXwgSBRC4R;K|DfZWE`_}a0f}^fehJ!*?Qz^4v_Y4_0~9r# z?gbvl-9aZ#fhIXJKp}M8Jpx4W?@Cu-E9N@h4oV0h0YoLn!EizYo<74sb%Mun*B>A? z9=)zVKqpOfmx1yUf6E;P1_scwkt@sp|M%=<^69<+p3K*HaTqM%qygqeyx0QaM)2h+3)*`X{=(@2D3w0& z<$hAa=Gpv5sZ_+X`>5ytqn^x%jxjKJb{~Do0Gf4d{u9IBI-QY$A^e2^M2AQ7fqNd! zKf?K&Gr={V%2A&fum+fBuGdqLjN*OWhQw2PS^6Jz)EC?)^_MBA0tqjJQ3YaNI-v@1 zzBK#~TDThiq7Jk~wfRS44VOprkE(hWkLCjpe7YaN+MhoBixrC1Je&Vm)(e2vY#n^S z;>mo(qqpF~>%%Dgldm_!-RRI^;K9EuUqa#K>3Edrpu4{sAx9{(+Vxg@X5i{!rm>`35>H@whu^6&M55 zpO60{#fVFX!plp4|NnP9#tcdXsK+%bFf>MiN)QHyW6}8ONkpn6WKILr9&%|y=94OK z19cCn`bbq@LnV8z5r~H^1mqW^$3(cK0rWI@G@tjGUtU^c{~fiIlF2UfL# zni{XUJ&uDJpaAsf1~Wlzbsdjx$jVag10@Psj2{2DftI3r{NDy%ZVEHVX+9`aE`XX* zY_8o|3ZVAtTSxv~Pnn91LBY*bqyt)3?D@Ya;Dy-y|NjF()o9p@<)D)RyCIRZTmz5p*dHE{B|_k}h%dcG85n#zQ-63g zyZ*Qk_JZdoxIK(s-*`6vi6|`zd+`>ur<6c-WCX5`#5}rPe}K-~0+srmt`PHI@5Lf| z^7V44s}vypMUUfd;8l<>*NcFA1Wu)XVK0hrfP(4)sER7(1)Fm5fk&t7kJnE;oBtS= z3L*)CQsL{fILwTOnCV~Y8TLW}VP=g2thRzV99&(&9exRiaXcan@I}7h${3RLA^_$>y0wb0 z_riu|K*x_ZuGCt}g;!m|(c#wKPZ`EGdp5iRQ#6AyBaSK(y&jO!1}c1@xgzYv!ml77y#Sro3M#pd2E1558zgeWgZqDpp2z>v zAE5r_?Af3e#?;xMM#OK=P*|n{b-0;be+0a!p8fy-YhllBB)RYxX&{3bbAPyebG`n* zqzRlUgJ%B+oecZG^v4VL+0YCLvI8t>3bsWbBo57_poLaKpxgjjEBtbyAjpH+S3&Lr z9T5&bW$^`QA2#?9Mp#ntZ2qIp-vVmc`WnCWZ2rr^-wQf~(G%Rvoxun)Lmg@cyqQ}7 zZRYYeFfceBbJ2al^>P*?l*#+DAI4OA*#cv#zpR8Y6JF-Qm@zMtVNA}K5gDf2%CGx@?750G3tpZ2qHC!V6LV+N~o+_eI!?WQYRrDL0_4 z$)H#-1)tL7`TyukW>9OoJN5-=;Uy^jfEJ9ujOPcR%r3zWt;7AnNBSQ9{{O#6;}6gn zYROA$eo)^PT!}!&N%%o^_)BGe1_n?^PJxpjbg0uyA%0MAC`!YlGxmpPx08lP^AC0Y z=D8q~{;M24+5}2tSs-5H4^YbG2d!Iwd54dIA>(f|Xt1Zu;Dyr+PzZhik7b+90Ik0J z;TiTqXU6~kJHRz*@&W!`3f%n7pxxx4Dli;GguS@^^8bJE(Og-Kpg!}T>Hq%+gonMD z@B)-U-%bDj|D_nn-ex}umarGkzQMi5-};*gGz5@U@Z!XDkj)o7y5kHyJEJ5#j=OI^8_3{$5JON!ZsM{0|aTgbVODH4gv|(@q4aIm+Acwt>Kyt4lM2|jyt1sBX zKNrB>_iX;7&)+Ho7J3O0g2fQ1vMGA`5;Qk}=?HyDdVL967Y-?VK#OU2GoV(N{LP@V z{n2%U{10-VXX9T`dgJd21P$$Dgc}1=vHfu>$hDwio4*BovKy#a^$dP-b1EohT%L-n z=-xT?|NocZ41`*GF9hp2>hb@C2czo`U*oqg&qBJQG5jr@pr#gH*CgX`jW^geu3)o~ zDhqf;qK(5f!XO=;RRNyIoj^xx{eO`K+V8=AfWHNFtOB@s37UNJ40`c$%K!f_!3XgD z-v$-BHU%`yS0=&q^59k()uyta?GQ-_J<6A3ur?+h$+k8 zA_hva&9y(|;79HKP=FoNcl0Hw`~)df;BN)_#`FK#moV3X62Z%bTnr4p+;90?LHj~q znqc}t8ni0CnhSKqzn=t0*o!xxz~j&St)NWx zyMe}&pMuKE<{#|*%_bmY{;M2iZed_}z5Znh$mp3&3=A*#fi5aq$-=_R2M%2RmL@0<orXOfM&MfGV*v2_{fDfhsLX z8i zasn)v*0Li9lfws$U;-tUm+kEEVEO^-4x$EACOg((3Iu6F1QWP&zxy5$Obp=tr`S`| z1eh(Luw`QhrKVfk=$o1hK~8`LQ!^WKFp0g#2qsW2dKn8k6c^N$R^kVpGyL-HJA`iq zPT@`z3qXg_gTfT#TQN3}Z(nVtuWubePJsD#GO}mY-eLD_E@+y1SDJ(pq?z{jEyAw~ z;H{?EV|K$^Xn6_ps~X6wzqZiVtAQXFz`VMc1=+7=Z{dE`hN=P;h%Z4Ke8XOReuL!n zOcs#aQ#U~h`PL{FP>V0ax&U2E8~368iQU5_XW}@a#2cgeXnmr42Kva7dG2<8KCSiUSYm zX@GXMf%1tWe>1460q<#4d}$7@NNyhkxf(q7!rucr#uw7vvE=WERMe3E^~>P*;K6!5 z{#HQNEUQo(o4`TGmte0A24|^ zr%wL=zncLx+yiP_gIgn@P7!}A=(M)57glihsUX<_O3k3noxa>p_*+0`hP@DkCOH%l_ZLLKs!KRvVo5C0}Xxt1^emvQBaV)@ZjI>`@_@vEPpHL zAX0Fr^572vutPz^U!Vd6w67OjaWjU!m zA>9s8hufnwPT(b|F9T0T+NeGOH@Dys2ySliZ;$;2)(7f$LW}}u4^UcK_yUx-Pl0xH zf>W&rWUDy;E(Jz@P-Vmr_TnLEPhPj1fM-1FtP%%<9jHGCYPUh@P$(S>rQ1OV-!m{U z5KEgEgQAak^~9P>Yjt0t?v?;`j~N&kbkiaJfQh5iuc7MD#R>5Pp!UGjIVM8vp%x7@ zmsmO#8qcM}jE4CimTq8t7!C6;Iv*xJ)M=Q%aM7@E8S4HVbw8y17!8NfZ~%n>sp$Y# z4vf;E(8JwsafjC1=rk=4a%qLY|1nM4A^^vMRmP+=_ zCJ+y;1mvsGcF-+73=9n4p)@}MdyAm*E1YXmzw_m{%{0zQ_L) z0WU;A0>LkMK~&faw(9@?U$=qQNHF_$s)Lq?qxC5T(6?@Q27^}kgZ2=Bw#Bd;A9z_0 znh@x22JHj!=ys6c-}Qj8Sj02P6Dst-z~IIFs{j9AM|pOCg59Rs4Z1m{#K@!hKUXQg z2mdxPkLF*zrAi+EkG+=lX#UR&7vw7C1qpJ5zla8zu^+s-#^e9FEXEgJRUj`PLq1AN z0Cvb{cd0&$+y_cD5HiS$vY0Yj+87vK zJgNlEi5^jS?FE_%#A@7rkP^7@Xohry44Dg3(R@T9OX0;N5EHIgBkaXO*omLubKMje zz!Yc%1C$&=(`%qDN*>*%3a|yqpp{%go^4;FHCy7a?M|Lvf?O^{705}=c6!RIc=yM_8Os0OR67OU%VF{l=EF{t=>>pJQv zsTM1#Km1B*VgcqX#urH-i@Cp*2!bxn zk?de#co6^+X+9$H!X3omK2RzFJxDVkiz!0}q(ToQ(R@T9{KXs4GTr~}pj9GS3@^kg zP-gxGig>aZGPFQC{*;5(%w%OTz4%xT@jPg|9oSzXiN)DgssTsR~MN znHAQcv#KE*dq9W7d2oL#eF>UJ23-~(=BhHP!4__hWAX^jV#;U-DNunZ zPlUV6@nbF z2&Cc&RD}os_An;U{fVWVSt@d!M`1>fDd$)V6ho^IV~tyo`MuPL#%oZVw;25Vi~VN zY;6#mE8{(gtxyWxB^n$O9})?@JOGqgL0r&90?2IDCC;g9I+TuO&@zf;&@zc-(6Wey-XRV@;D@j|Nm#{yl8;RS|G_<1iZ)u$tt`^0?Ga_ zlXx)^au6DaTrpQhB*;{cV(_3h2TL(mMlMLe94b)EmC*>|t3mlp#atOvKmwvr0p?<^ zj1?dO7N`J2F;~WJkih36h?$JVTp8y;0*{~qY{gs|4?qGJp#tp1Tp7#Z3WyYQWhj6IJc~g0cb7lB|WNsINkDa?x zh}hBz$~1l5{S64rk0;5cX5KNgNrZPiJWkndOilB<3-ONm46&RvR z^NKUm^HNhl?99B9SOo@M7uNs<25m42K9$?WB}joGAT-zmLdHA$1}HED_y<53F0MYF ze!&V1F8+QY@gP;opzB8x^Ua>C6-G=`54*=xqlb)ycn0fw`F1qt{)6f0qWQ zBmb^9{2txy6F_A%_kj`+U(Tm94RpX~MQ5A_|E}dAO-#jXVK0P1hdnkP1MTheu-?9a zk%6JcK8qovfuE7##s7TJ6wn3F0 zJUaV926%KroZj6Iaysff3}_+=R5-%6-THuzEADOT0QnJgsy4*pwtP_Q^oPfB=rM_P z0?@tqpes=sJbK+cJUZP1JbFRrG`lHybjN{C&6MzHbdvx(10t>gX@7y1$iPkj09E52 z-E|xuoplCK-3}hzaiEhHEj$|CEI_(JZ5s~gwp~!8(xbN>qq)1LXvMP%xeWoqh-j#@7!aMu5DD6wM&Be7fTuJbO1o0=wLzM#iUiTEmBb|9!iK z&_mMS!lSd?!L$1?Y%4LUKWYWC7_uT>#O8ql>O)op%#~p;yg)*|?H54Kv~0ftI^vZB z9%7x_L4HAYA854=_+$l-Zm?WdL>SDh7yolX_gA@jcv!jxl=68%4ebOQ8usF0F045P z+V=`J2eAv=qkB8p1>E0Cl)J+eJeq$omWp}?d4P)R6(D1|4}dp6gEw^FK*q1k`(U#%Z{8hADu~ppF9h61=Mhn_x~$hd7O;G}8FLhjpDntr}<{;K2vX9?WhQ9^DKc)~*tuy$;7g2j6=zyJ@`6 z0TqB(Jeuna1Zq`0y4?&s{<|4KWi33qVPrKvC!fi|{FWNe-S?g<^9!ocuC7~~pIAB-X6

myKJ(N6 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ⅆEQmWDYJH90zUBmp`0#Jf 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 WPGV+WNGho2)r1zXL8%1{3=9B+^r+te literal 266886 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

T=w%6j7iDIVQBK+f{$-tGa~@7vq%0HQ39l?ZwU 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 W2dYpRIJBUpa8N3!Mg?DA3?=})=$%af diff --git a/TempleOS/Compiler/Compiler.HPP b/TempleOS/Compiler/Compiler.HPP index 7207604..8109c63 100644 --- a/TempleOS/Compiler/Compiler.HPP +++ b/TempleOS/Compiler/Compiler.HPP @@ -15,6 +15,7 @@ public extern U8 *LexExtStr(CLex *lx,I64 *_size=NULL); public extern U0 LexPutLine(CLex *lx,U8 *start); public extern U0 LexPutPos(CLex *lx); public extern U0 LexPutWarn(CLex *lx,U8 *name=NULL,CHashFun *fun_class=NULL); +public extern I64 PrsKeyWord(CLex *lx); public extern U0 LexExcept(CLex *lx,U8 *name=NULL,CHashFun *fun_class=NULL); public extern U8 *CmpExpression(CLex *lx,I64 *type=NULL); public extern U8 *CmpStatement(CLex *lx,I64 *type); @@ -26,12 +27,16 @@ extern U0 MemberLstDel(CHashClass *c); public extern CMemberLstMeta *MemberMetaFind(U8 *st,CMemberLst *ml); public extern CMemberLst *MemberFind(U8 *st,CHashClass *c); public extern CMemberLst *MemberFind2(CHashClass *pattern,CHashClass *tempc); -public extern U0 LexIncludeDoc(CLex *lx,U8 *filename,CDoc *_doc); +public extern U0 LexAttachDoc(CLex *lx,CLexFile *tempf=NULL, + CDoc *doc=NULL,U8 *abs_filename=NULL,CDocEntry *doc_e=NULL,I64 col=0); +public extern CHashClass *OptClassFwd(CHashClass *tempc); #help_index "Compiler/Directive" #help_file "::/TempleOS/Doc/Directives" -public extern U0 StreamPutS(U8 *st); +public extern U0 StreamPutS(U8 *buf); public extern U0 StreamPrintF(U8 *src,...); +public extern I64 StreamExePutS(U8 *buf); +public extern I64 StreamExePrintF(U8 *fmt,...); public extern Bool PTrace(Bool val); public extern Bool OTrace(Bool val); public extern I64 OPassTraceMask(I64 i=0b1001111101); @@ -58,7 +63,8 @@ public extern I64 HashTableSize2(CHashTable *table); public extern I64 Cmp(U8 *filename,U8 *map_name=NULL,U8 *out_name=NULL,U8 mapfile_drv=0); #help_index "Compiler" -public extern I64 ExePutS(U8 *buf,U8 *filename=NULL,Bool just_load=FALSE); +public extern I64 ExePutS(U8 *buf,U8 *filename=NULL,Bool just_load=FALSE, + CLexHashTableContext *htc=NULL); public extern I64 ExePrintF(U8 *fmt,...); public extern I64 ExeFile(U8 *name,Bool just_load=FALSE); public extern I64 ExePutS2(U8 *buf,U8 *filename=NULL,Bool just_load=FALSE); diff --git a/TempleOS/Compiler/Compiler.MAP b/TempleOS/Compiler/Compiler.MAP index fecb450..7d30b51 100644 --- a/TempleOS/Compiler/Compiler.MAP +++ b/TempleOS/Compiler/Compiler.MAP @@ -1,736 +1,530 @@ -$LK+BI,"AsmCodeInstruction ","FL:D:/TempleOS/Compiler/Assembler.CPP.Z,824",1$$LK+BI,"","AsmCodeInstruction",2$000000CC7E 0001 0000001423 Funct -$LK+BI,"AsmExpressionEval ","FL:D:/TempleOS/Compiler/Assembler.CPP.Z,202",3$$LK+BI,"","AsmExpressionEval",4$000000B280 0004 00000000B8 Funct -$LK+BI,"AsmGlblsResolve ","FL:D:/TempleOS/Compiler/Assembler.CPP.Z,290",5$$LK+BI,"","AsmGlblsResolve",6$000000B668 0001 00000005D7 Funct -$LK+BI,"AsmHashLoad ","FL:D:/TempleOS/Compiler/CmpInit.CPP.Z,77",7$$LK+BI,"","AsmHashLoad",8$0000034C80 0001 0000000665 Funct -$LK+BI,"AsmLineLst ","FL:D:/TempleOS/Compiler/Assembler.CPP.Z,29",9$$LK+BI,"","AsmLineLst",10$000000AC78 0001 0000000143 Funct -$LK+BI,"AsmLocalsResolve ","FL:D:/TempleOS/Compiler/Assembler.CPP.Z,224",11$$LK+BI,"","AsmLocalsResolve",12$000000B338 0003 0000000329 Funct -$LK+BI,"AsmMakeArgMask ","FL:D:/TempleOS/Compiler/Assembler.CPP.Z,601",13$$LK+BI,"","AsmMakeArgMask",14$000000C208 0002 000000045D Funct -$LK+BI,"AsmPrsInsFlags ","FL:D:/TempleOS/Compiler/CmpInit.CPP.Z,27",15$$LK+BI,"","AsmPrsInsFlags",16$0000034420 0001 000000085D Funct -$LK+BI,"AsmReserveCodeTo ","FL:D:/TempleOS/Compiler/Assembler.CPP.Z,185",17$$LK+BI,"","AsmReserveCodeTo",18$000000B200 0001 000000007D Funct -$LK+BI,"AsmStoreCodeU32 ","FL:D:/TempleOS/Compiler/Assembler.CPP.Z,90",19$$LK+BI,"","AsmStoreCodeU32",20$000000AEC0 0001 0000000149 Funct -$LK+BI,"AsmStoreCodeU64 ","FL:D:/TempleOS/Compiler/Assembler.CPP.Z,129",21$$LK+BI,"","AsmStoreCodeU64",22$000000B010 0005 000000014A Funct -$LK+BI,"AsmStoreCodeU8 ","FL:D:/TempleOS/Compiler/Assembler.CPP.Z,61",23$$LK+BI,"","AsmStoreCodeU8",24$000000ADC0 001C 00000000FF Funct -$LK+BI,"AsmStoreCodeU8At ","FL:D:/TempleOS/Compiler/Assembler.CPP.Z,168",25$$LK+BI,"","AsmStoreCodeU8At",26$000000B160 0016 00000000A0 Funct -$LK+BI,"AsmStoreNum ","FL:D:/TempleOS/Compiler/Assembler.CPP.Z,685",27$$LK+BI,"","AsmStoreNum",28$000000C668 0004 000000060E Funct -$LK+BI,"AsmUnresolvedAdd ","FL:D:/TempleOS/Compiler/Assembler.CPP.Z,1",29$$LK+BI,"","AsmUnresolvedAdd",30$000000AB98 0008 00000000DF Funct -$LK+BI,"CBAppend ","FL:D:/TempleOS/Compiler/CodeGen.CPP.Z,336",31$$LK+BI,"","CBAppend",32$0000009EE0 0002 000000009D Funct -$LK+BI,"CBCombine ","FL:D:/TempleOS/Compiler/CodeGen.CPP.Z,357",33$$LK+BI,"","CBCombine",34$0000009F80 0001 00000000EA Funct -$LK+BI,"CBCompile ","FL:D:/TempleOS/Compiler/CodeGen.CPP.Z,397",35$$LK+BI,"","CBCompile",36$000000A0E0 0006 00000004D6 Funct -$LK+BI,"CBFloatConstFind ","FL:D:/TempleOS/Compiler/CodeGen.CPP.Z,265",37$$LK+BI,"","CBFloatConstFind",38$0000009C40 000F 00000000BE Funct -$LK+BI,"CBGetIC1 ","FL:D:/TempleOS/Compiler/CodeGen.CPP.Z,209",39$$LK+BI,"","CBGetIC1",40$0000009AA0 0004 000000004C Funct -$LK+BI,"CBGoToLabelFind ","FL:D:/TempleOS/Compiler/CodeGen.CPP.Z,242",41$$LK+BI,"","CBGoToLabelFind",42$0000009BA8 0002 0000000048 Funct -$LK+BI,"CBICAdd ","FL:D:/TempleOS/Compiler/CodeGen.CPP.Z,142",43$$LK+BI,"","CBICAdd",44$00000098B0 00B9 0000000104 Funct -$LK+BI,"CBInPtrsInit ","FL:D:/TempleOS/Compiler/CodeGen.CPP.Z,189",45$$LK+BI,"","CBInPtrsInit",46$0000009A28 0003 0000000030 Funct -$LK+BI,"CBIndents ","FL:D:/TempleOS/Compiler/CodeGen.CPP.Z,385",47$$LK+BI,"","CBIndents",48$000000A070 0001 0000000069 Funct -$LK+BI,"CBMiscLstDel ","FL:D:/TempleOS/Compiler/CodeGen.CPP.Z,287",49$$LK+BI,"","CBMiscLstDel",50$0000009D00 0001 000000018D Funct -$LK+BI,"CBMiscNew ","FL:D:/TempleOS/Compiler/CodeGen.CPP.Z,255",51$$LK+BI,"","CBMiscNew",52$0000009BF0 001A 000000004A Funct -$LK+BI,"CBOutPtrsInit ","FL:D:/TempleOS/Compiler/CodeGen.CPP.Z,176",53$$LK+BI,"","CBOutPtrsInit",54$00000099B8 000A 000000006C Funct -$LK+BI,"CBPop ","FL:D:/TempleOS/Compiler/CodeGen.CPP.Z,233",55$$LK+BI,"","CBPop",56$0000009B50 0009 0000000051 Funct -$LK+BI,"CBPopNoFree ","FL:D:/TempleOS/Compiler/CodeGen.CPP.Z,327",57$$LK+BI,"","CBPopNoFree",58$0000009E90 0001 000000004E Funct -$LK+BI,"CBPush ","FL:D:/TempleOS/Compiler/CodeGen.CPP.Z,224",59$$LK+BI,"","CBPush",60$0000009AF0 000E 000000005D Funct -$LK+BI,"CBPutAllIC ","FL:D:/TempleOS/Compiler/CodeGen.CPP.Z,197",61$$LK+BI,"","CBPutAllIC",62$0000009A58 0007 0000000043 Funct -$LK+BI,"CBPutClass ","FL:D:/TempleOS/Compiler/CodeGen.CPP.Z,1",63$$LK+BI,"","CBPutClass",64$0000009128 0001 00000000C5 Funct -$LK+BI,"CBPutIC ","FL:D:/TempleOS/Compiler/CodeGen.CPP.Z,71",65$$LK+BI,"","CBPutIC",66$00000094E8 0006 00000003C7 Funct -$LK+BI,"CBPutICArg ","FL:D:/TempleOS/Compiler/CodeGen.CPP.Z,26",67$$LK+BI,"","CBPutICArg",68$00000091F0 0004 00000002F3 Funct -$LK,"CInternalType ","FL:D:/TempleOS/Compiler/CmpInit.CPP.Z,4"$007FD11CB0 0002 000000000A Class +$LK+BI,"AsmCodeInstruction ","FL:D:/TempleOS/Compiler/Assembler.CPP.Z,807",1$000000C1AE 0001 0000001367 Funct +$LK+BI,"AsmExpressionEval ","FL:D:/TempleOS/Compiler/Assembler.CPP.Z,185",2$000000A7B8 0004 00000000B8 Funct +$LK+BI,"AsmGlblsResolve ","FL:D:/TempleOS/Compiler/Assembler.CPP.Z,273",3$000000ABA0 0001 00000005D7 Funct +$LK+BI,"AsmHashLoad ","FL:D:/TempleOS/Compiler/CmpInit.CPP.Z,77",4$0000030D18 0001 000000064F Funct +$LK+BI,"AsmLineLst ","FL:D:/TempleOS/Compiler/Assembler.CPP.Z,29",5$000000A230 0001 0000000143 Funct +$LK+BI,"AsmLocalsResolve ","FL:D:/TempleOS/Compiler/Assembler.CPP.Z,207",6$000000A870 0003 0000000329 Funct +$LK+BI,"AsmMakeArgMask ","FL:D:/TempleOS/Compiler/Assembler.CPP.Z,584",7$000000B738 0002 000000045D Funct +$LK+BI,"AsmPrsInsFlags ","FL:D:/TempleOS/Compiler/CmpInit.CPP.Z,27",8$00000304B8 0001 000000085D Funct +$LK+BI,"AsmStoreCodeU32 ","FL:D:/TempleOS/Compiler/Assembler.CPP.Z,90",9$000000A478 0001 0000000149 Funct +$LK+BI,"AsmStoreCodeU64 ","FL:D:/TempleOS/Compiler/Assembler.CPP.Z,129",10$000000A5C8 0005 000000014A Funct +$LK+BI,"AsmStoreCodeU8 ","FL:D:/TempleOS/Compiler/Assembler.CPP.Z,61",11$000000A378 001C 00000000FF Funct +$LK+BI,"AsmStoreCodeU8At ","FL:D:/TempleOS/Compiler/Assembler.CPP.Z,168",12$000000A718 0016 00000000A0 Funct +$LK+BI,"AsmStoreNum ","FL:D:/TempleOS/Compiler/Assembler.CPP.Z,668",13$000000BB98 0004 000000060E Funct +$LK+BI,"AsmUnresolvedAdd ","FL:D:/TempleOS/Compiler/Assembler.CPP.Z,1",14$000000A150 0008 00000000DF Funct +$LK+BI,"CBAppend ","FL:D:/TempleOS/Compiler/CodeGen.CPP.Z,328",15$0000009560 0002 000000009D Funct +$LK+BI,"CBCombine ","FL:D:/TempleOS/Compiler/CodeGen.CPP.Z,349",16$0000009600 0001 00000000CA Funct +$LK+BI,"CBCompile ","FL:D:/TempleOS/Compiler/CodeGen.CPP.Z,377",17$00000096D0 0006 00000004AA Funct +$LK+BI,"CBFloatConstFind ","FL:D:/TempleOS/Compiler/CodeGen.CPP.Z,257",18$00000092C8 000F 00000000BE Funct +$LK+BI,"CBGetIC1 ","FL:D:/TempleOS/Compiler/CodeGen.CPP.Z,201",19$0000009140 0004 000000004C Funct +$LK+BI,"CBGoToLabelFind ","FL:D:/TempleOS/Compiler/CodeGen.CPP.Z,234",20$0000009228 0002 0000000049 Funct +$LK+BI,"CBICAdd ","FL:D:/TempleOS/Compiler/CodeGen.CPP.Z,135",21$0000008F58 00B9 00000000FA Funct +$LK+BI,"CBInPtrsInit ","FL:D:/TempleOS/Compiler/CodeGen.CPP.Z,181",22$00000090C8 0003 0000000030 Funct +$LK+BI,"CBMiscLstDel ","FL:D:/TempleOS/Compiler/CodeGen.CPP.Z,279",23$0000009388 0001 000000018D Funct +$LK+BI,"CBMiscNew ","FL:D:/TempleOS/Compiler/CodeGen.CPP.Z,247",24$0000009278 001A 000000004A Funct +$LK+BI,"CBOutPtrsInit ","FL:D:/TempleOS/Compiler/CodeGen.CPP.Z,168",25$0000009058 000A 000000006C Funct +$LK+BI,"CBPop ","FL:D:/TempleOS/Compiler/CodeGen.CPP.Z,225",26$00000091E0 0009 0000000045 Funct +$LK+BI,"CBPopNoFree ","FL:D:/TempleOS/Compiler/CodeGen.CPP.Z,319",27$0000009518 0001 0000000042 Funct +$LK+BI,"CBPush ","FL:D:/TempleOS/Compiler/CodeGen.CPP.Z,216",28$0000009190 000E 000000004B Funct +$LK+BI,"CBPutAllIC ","FL:D:/TempleOS/Compiler/CodeGen.CPP.Z,189",29$00000090F8 0007 0000000043 Funct +$LK+BI,"CBPutClass ","FL:D:/TempleOS/Compiler/CodeGen.CPP.Z,1",30$0000008838 0001 00000000C5 Funct +$LK+BI,"CBPutIC ","FL:D:/TempleOS/Compiler/CodeGen.CPP.Z,71",31$0000008BF8 0006 000000035E Funct +$LK+BI,"CBPutICArg ","FL:D:/TempleOS/Compiler/CodeGen.CPP.Z,26",32$0000008900 0003 00000002F3 Funct +$LK,"CInternalType ","FL:D:/TempleOS/Compiler/CmpInit.CPP.Z,4"$007FD83B48 0002 000000000A Class CMP_OPT_NOP 0000000000 0003 ExportSysSym -$LK,"CMP_TEMPLATES ","FL:D:/TempleOS/Compiler/CmpAsm.CPP.Z,164"$0000000206 0001 ExportSysSym -$LK,"CMP_TEMPLATES_DONT_POP ","FL:D:/TempleOS/Compiler/CmpAsm.CPP.Z,338"$000000039B 0001 ExportSysSym -$LK,"CMP_TEMPLATES_DONT_PUSH ","FL:D:/TempleOS/Compiler/CmpAsm.CPP.Z,427"$0000000467 0001 ExportSysSym -$LK,"CMP_TEMPLATES_DONT_PUSH2 ","FL:D:/TempleOS/Compiler/CmpAsm.CPP.Z,618"$000000063D 0001 ExportSysSym -$LK,"CMP_TEMPLATES_DONT_PUSH_POP","FL:D:/TempleOS/Compiler/CmpAsm.CPP.Z,554"$00000005AD 0001 ExportSysSym +$LK,"CMP_TEMPLATES ","FL:D:/TempleOS/Compiler/CmpAsm.CPP.Z,164"$00000001F6 0001 ExportSysSym +$LK,"CMP_TEMPLATES_DONT_POP ","FL:D:/TempleOS/Compiler/CmpAsm.CPP.Z,338"$000000038B 0001 ExportSysSym +$LK,"CMP_TEMPLATES_DONT_PUSH ","FL:D:/TempleOS/Compiler/CmpAsm.CPP.Z,427"$0000000457 0001 ExportSysSym +$LK,"CMP_TEMPLATES_DONT_PUSH2 ","FL:D:/TempleOS/Compiler/CmpAsm.CPP.Z,618"$000000062D 0001 ExportSysSym +$LK,"CMP_TEMPLATES_DONT_PUSH_POP","FL:D:/TempleOS/Compiler/CmpAsm.CPP.Z,554"$000000059D 0001 ExportSysSym $LK,"CN_MAIN ","FL:D:/TempleOS/Compiler/BackEnd.CPP.Z,220"$0 0028 0000000008 DefineStr -$LK,"CN_P1 ","FL:D:/TempleOS/Compiler/BackEnd.CPP.Z,221"$1 000A 0000000008 DefineStr -$LK,"CN_P2 ","FL:D:/TempleOS/Compiler/BackEnd.CPP.Z,222"$2 0007 0000000008 DefineStr -$LK,"CN_P3 ","FL:D:/TempleOS/Compiler/BackEnd.CPP.Z,223"$3 0003 0000000008 DefineStr -$LK,"CN_R ","FL:D:/TempleOS/Compiler/BackEnd.CPP.Z,224"$4 0003 0000000008 DefineStr -$LK,"CSwitchCase ","FL:D:/TempleOS/Compiler/StmtParser.CPP.Z,1424"$007FC32130 0004 0000000018 Class -$LK+BI,"CTrace ","FL:D:/TempleOS/Compiler/Directives.CPP.Z,38",69$$LK+BI,"","CTrace",70$0000003A40 0000 0000000017 Funct -$LK,"CVI2 ","FL:D:/TempleOS/Compiler/StmtParser.CPP.Z,214"$007FC35730 0003 0000000010 Class -$LK+BI,"Cmp ","FL:D:/TempleOS/Compiler/CmpMain.CPP.Z,378",71$$LK+BI,"","Cmp",72$0000038FF0 0000 00000005BE Funct -$LK+BI,"CmpBuf ","FL:D:/TempleOS/Compiler/CmpMain.CPP.Z,185",73$$LK+BI,"","CmpBuf",74$00000388C0 0001 00000000F7 Funct -$LK+BI,"CmpExpression ","FL:D:/TempleOS/Compiler/ExpParser.CPP.Z,1262",75$$LK+BI,"","CmpExpression",76$0000013376 0004 00000000BB Funct -$LK+BI,"CmpF1PushPop ","FL:D:/TempleOS/Compiler/OptPass3.CPP.Z,23",77$$LK+BI,"","CmpF1PushPop",78$000002C290 0002 0000000033 Funct -$LK+BI,"CmpF2PushPop ","FL:D:/TempleOS/Compiler/OptPass3.CPP.Z,29",79$$LK+BI,"","CmpF2PushPop",80$000002C2C8 0005 0000000080 Funct -$LK+BI,"CmpFillTables ","FL:D:/TempleOS/Compiler/CmpInit.CPP.Z,581",81$$LK+BI,"","CmpFillTables",82$00000379E8 0001 000000064C Funct -$LK+BI,"CmpFixUpAOTAsm ","FL:D:/TempleOS/Compiler/CmpMain.CPP.Z,312",83$$LK+BI,"","CmpFixUpAOTAsm",84$0000038D90 0000 000000025B Funct -$LK+BI,"CmpFixUpJITAsm ","FL:D:/TempleOS/Compiler/CmpMain.CPP.Z,204",85$$LK+BI,"","CmpFixUpJITAsm",86$00000389B8 0000 00000003D8 Funct -$LK+BI,"CmpInit ","FL:D:/TempleOS/Compiler/CmpMain.CPP.Z,680",87$$LK+BI,"","CmpInit",88$0000039B80 0001 00000000B9 Funct -$LK+BI,"CmpJoin ","FL:D:/TempleOS/Compiler/CmpMain.CPP.Z,60",89$$LK+BI,"","CmpJoin",90$0000038220 0001 00000006A0 Funct -$LK+BI,"CmpLoadDefines ","FL:D:/TempleOS/Compiler/CmpInit.CPP.Z,222",91$$LK+BI,"","CmpLoadDefines",92$00000352E8 0001 0000002700 Funct -$LK+BI,"CmpNoteFloatOp ","FL:D:/TempleOS/Compiler/BackEnd.CPP.Z,226",93$$LK+BI,"","CmpNoteFloatOp",94$0000018FC6 000E 0000000251 Funct -$LK+BI,"CmpOffset2Reg ","FL:D:/TempleOS/Compiler/OptPass012.CPP.Z,133",95$$LK+BI,"","CmpOffset2Reg",96$000002720E 0005 0000000042 Funct -$LK+BI,"CmpPType ","FL:D:/TempleOS/Compiler/OptPass3.CPP.Z,11",97$$LK+BI,"","CmpPType",98$000002C250 0006 000000003F Funct -$LK+BI,"CmpPmt ","FL:D:/TempleOS/Compiler/Lex.CPP.Z,1",99$$LK+BI,"","CmpPmt",100$0000003B80 0001 0000000241 Funct -$LK+BI,"CmpSetFloatOpPushPop ","FL:D:/TempleOS/Compiler/BackEnd.CPP.Z,281",101$$LK+BI,"","CmpSetFloatOpPushPop",102$000001921E 000E 000000007B Funct -$LK+BI,"CmpStatement ","FL:D:/TempleOS/Compiler/CmpMain.CPP.Z,24",103$$LK+BI,"","CmpStatement",104$00000380D0 0001 000000014C Funct -$LK+BI,"CmpType ","FL:D:/TempleOS/Compiler/OptPass3.CPP.Z,1",105$$LK+BI,"","CmpType",106$000002C218 0007 0000000031 Funct -$LK+BI,"DefineU8s ","FL:D:/TempleOS/Compiler/Assembler.CPP.Z,1233",107$$LK+BI,"","DefineU8s",108$000000E0A6 0004 00000002D6 Funct -$LK+BI,"Echo ","FL:D:/TempleOS/Compiler/Directives.CPP.Z,48",109$$LK+BI,"","Echo",110$0000003A70 0000 0000000017 Funct -$LK+BI,"ExeFile ","FL:D:/TempleOS/Compiler/CmpMain.CPP.Z,577",111$$LK+BI,"","ExeFile",112$0000039750 0000 0000000075 Funct -$LK+BI,"ExeFile2 ","FL:D:/TempleOS/Compiler/CmpMain.CPP.Z,629",113$$LK+BI,"","ExeFile2",114$0000039978 0000 0000000075 Funct -$LK+BI,"ExeFile3 ","FL:D:/TempleOS/Compiler/CmpMain.CPP.Z,669",115$$LK+BI,"","ExeFile3",116$0000039B08 0000 0000000075 Funct -$LK+BI,"ExePrintF ","FL:D:/TempleOS/Compiler/CmpMain.CPP.Z,568",117$$LK+BI,"","ExePrintF",118$0000039708 0000 0000000043 Funct -$LK+BI,"ExePrintF2 ","FL:D:/TempleOS/Compiler/CmpMain.CPP.Z,620",119$$LK+BI,"","ExePrintF2",120$0000039930 0000 0000000043 Funct -$LK+BI,"ExePrintF3 ","FL:D:/TempleOS/Compiler/CmpMain.CPP.Z,659",121$$LK+BI,"","ExePrintF3",122$0000039AC0 0000 0000000043 Funct -$LK+BI,"ExePutS ","FL:D:/TempleOS/Compiler/CmpMain.CPP.Z,536",123$$LK+BI,"","ExePutS",124$00000395B0 0002 0000000151 Funct -$LK+BI,"ExePutS2 ","FL:D:/TempleOS/Compiler/CmpMain.CPP.Z,588",125$$LK+BI,"","ExePutS2",126$00000397C8 0002 0000000161 Funct -$LK+BI,"ExePutS3 ","FL:D:/TempleOS/Compiler/CmpMain.CPP.Z,640",127$$LK+BI,"","ExePutS3",128$00000399F0 0002 00000000CC Funct -$LK+BI,"Expression ","FL:D:/TempleOS/Compiler/ExpParser.CPP.Z,1287",129$$LK+BI,"","Expression",130$0000013466 0007 000000003B Funct -$LK+BI,"ExpressionDel ","FL:D:/TempleOS/Compiler/Lex.CPP.Z,372",131$$LK+BI,"","ExpressionDel",132$0000005894 000B 0000000014 Funct -$LK,"FBO1_F64 ","FL:D:/TempleOS/Compiler/OptPass012.CPP.Z,3"$2 0002 0000000008 DefineStr -$LK,"FBO1_INT ","FL:D:/TempleOS/Compiler/OptPass012.CPP.Z,2"$1 0013 0000000008 DefineStr -$LK,"FBO1_NOT_CONST ","FL:D:/TempleOS/Compiler/OptPass012.CPP.Z,1"$0 0004 0000000008 DefineStr -$LK+BI,"GetExpression ","FL:D:/TempleOS/Compiler/ExpParser.CPP.Z,1282",133$$LK+BI,"","GetExpression",134$0000013436 0000 0000000029 Funct -$LK+BI,"GetOpt ","FL:D:/TempleOS/Compiler/Directives.CPP.Z,16",135$$LK+BI,"","GetOpt",136$00000039A8 0005 000000002B Funct -$LK+BI,"HashEntryImportCopy ","FL:D:/TempleOS/Compiler/Hash1b.CPP.Z,1",137$$LK+BI,"","HashEntryImportCopy",138$000000A5B8 0002 0000000167 Funct -$LK+BI,"HashEntrySize ","FL:D:/TempleOS/Compiler/Hash1b.CPP.Z,72",139$$LK+BI,"","HashEntrySize",140$000000A808 0000 0000000164 Funct -$LK+BI,"HashEntrySize2 ","FL:D:/TempleOS/Compiler/Hash1b.CPP.Z,103",141$$LK+BI,"","HashEntrySize2",142$000000A970 0002 00000001B5 Funct -$LK+BI,"HashTableImport ","FL:D:/TempleOS/Compiler/Hash1b.CPP.Z,41",143$$LK+BI,"","HashTableImport",144$000000A720 0000 00000000E8 Funct -$LK+BI,"HashTableSize2 ","FL:D:/TempleOS/Compiler/Hash1b.CPP.Z,142",145$$LK+BI,"","HashTableSize2",146$000000AB28 0000 000000006B Funct -$LK+BI,"ICAddConst ","FL:D:/TempleOS/Compiler/BackEnd.CPP.Z,947",147$$LK+BI,"","ICAddConst",148$000001AEC6 000C 00000008B6 Funct -$LK+BI,"ICAddEct ","FL:D:/TempleOS/Compiler/BackEnd.CPP.Z,882",149$$LK+BI,"","ICAddEct",150$000001AB66 0005 000000035E Funct -$LK+BI,"ICAddRSP ","FL:D:/TempleOS/Compiler/BackEnd.CPP.Z,163",151$$LK+BI,"","ICAddRSP",152$0000018D3E 0016 0000000286 Funct -$LK+BI,"ICAddSubEctEqual ","FL:D:/TempleOS/Compiler/BackEnd.CPP.Z,2754",153$$LK+BI,"","ICAddSubEctEqual",154$0000020286 0005 000000073F Funct -$LK+BI,"ICAndAnd ","FL:D:/TempleOS/Compiler/BackEnd.CPP.Z,3050",155$$LK+BI,"","ICAndAnd",156$000002104E 0001 0000000149 Funct -$LK+BI,"ICAndBranch ","FL:D:/TempleOS/Compiler/BackEnd.CPP.Z,4033",157$$LK+BI,"","ICAndBranch",158$0000023C4E 0002 000000078D Funct -$LK+BI,"ICAndEqual ","FL:D:/TempleOS/Compiler/BackEnd.CPP.Z,4784",159$$LK+BI,"","ICAndEqual",160$0000025F26 0001 0000000109 Funct -$LK+BI,"ICAssign ","FL:D:/TempleOS/Compiler/BackEnd.CPP.Z,4202",161$$LK+BI,"","ICAssign",162$00000243DE 0001 000000030F Funct -$LK+BI,"ICAssignPostIncDec ","FL:D:/TempleOS/Compiler/BackEnd.CPP.Z,3677",163$$LK+BI,"","ICAssignPostIncDec",164$0000022D3E 0002 0000000248 Funct -$LK+BI,"ICBEqu ","FL:D:/TempleOS/Compiler/BackEnd.CPP.Z,3420",165$$LK+BI,"","ICBEqu",166$000002212E 0001 0000000256 Funct -$LK+BI,"ICBitOps ","FL:D:/TempleOS/Compiler/BackEnd.CPP.Z,3298",167$$LK+BI,"","ICBitOps",168$0000021B4E 000B 00000005DE Funct -$LK+BI,"ICBrBitOps ","FL:D:/TempleOS/Compiler/BackEnd.CPP.Z,4252",169$$LK+BI,"","ICBrBitOps",170$00000246EE 0008 0000000AC9 Funct -$LK+BI,"ICBuiltInFloatConst ","FL:D:/TempleOS/Compiler/BackEnd.CPP.Z,607",171$$LK+BI,"","ICBuiltInFloatConst",172$0000019E5E 000F 00000000BD Funct -$LK+BI,"ICCmp ","FL:D:/TempleOS/Compiler/BackEnd.CPP.Z,3178",173$$LK+BI,"","ICCmp",174$0000021666 0006 00000004E6 Funct -$LK+BI,"ICCmpAndBranch ","FL:D:/TempleOS/Compiler/BackEnd.CPP.Z,3719",175$$LK+BI,"","ICCmpAndBranch",176$0000022F86 000C 0000000936 Funct -$LK+BI,"ICColon ","FL:D:/TempleOS/Compiler/BackEnd.CPP.Z,3144",177$$LK+BI,"","ICColon",178$0000021456 0001 000000020F Funct -$LK+BI,"ICCopyTemplate ","FL:D:/TempleOS/Compiler/BackEnd.CPP.Z,293",179$$LK+BI,"","ICCopyTemplate",180$000001929E 0019 0000000286 Funct -$LK+BI,"ICDeref ","FL:D:/TempleOS/Compiler/BackEnd.CPP.Z,864",181$$LK+BI,"","ICDeref",182$000001AAAE 0001 00000000B5 Funct -$LK+BI,"ICDerefPostIncDec ","FL:D:/TempleOS/Compiler/BackEnd.CPP.Z,3634",183$$LK+BI,"","ICDerefPostIncDec",184$0000022B0E 0002 000000022B Funct -$LK+BI,"ICDiv ","FL:D:/TempleOS/Compiler/BackEnd.CPP.Z,2662",185$$LK+BI,"","ICDiv",186$000001FDB6 0001 00000000F2 Funct -$LK+BI,"ICDivEqual ","FL:D:/TempleOS/Compiler/BackEnd.CPP.Z,2681",187$$LK+BI,"","ICDivEqual",188$000001FEAE 0002 00000002E0 Funct -$LK+BI,"ICFAdd ","FL:D:/TempleOS/Compiler/BackEnd.CPP.Z,2533",189$$LK+BI,"","ICFAdd",190$000001F68E 0001 00000001FB Funct -$LK+BI,"ICFCmp ","FL:D:/TempleOS/Compiler/BackEnd.CPP.Z,1651",191$$LK+BI,"","ICFCmp",192$000001CD8E 0004 0000000188 Funct -$LK+BI,"ICFCmpAndBranch ","FL:D:/TempleOS/Compiler/BackEnd.CPP.Z,2082",193$$LK+BI,"","ICFCmpAndBranch",194$000001E37E 0004 0000000A6E Funct -$LK+BI,"ICFCvt ","FL:D:/TempleOS/Compiler/BackEnd.CPP.Z,1217",195$$LK+BI,"","ICFCvt",196$000001BBD6 0014 0000000188 Funct -$LK+BI,"ICFCvt2 ","FL:D:/TempleOS/Compiler/BackEnd.CPP.Z,1265",197$$LK+BI,"","ICFCvt2",198$000001BD5E 0010 0000000122 Funct -$LK+BI,"ICFDiv ","FL:D:/TempleOS/Compiler/BackEnd.CPP.Z,2509",199$$LK+BI,"","ICFDiv",200$000001F54E 0001 000000013D Funct -$LK+BI,"ICFMod ","FL:D:/TempleOS/Compiler/BackEnd.CPP.Z,1343",201$$LK+BI,"","ICFMod",202$000001C06E 0001 0000000142 Funct -$LK+BI,"ICFModEqual ","FL:D:/TempleOS/Compiler/BackEnd.CPP.Z,1691",203$$LK+BI,"","ICFModEqual",204$000001CF16 0001 00000003FA Funct -$LK+BI,"ICFMul ","FL:D:/TempleOS/Compiler/BackEnd.CPP.Z,2469",205$$LK+BI,"","ICFMul",206$000001F316 0001 0000000235 Funct -$LK+BI,"ICFOp ","FL:D:/TempleOS/Compiler/BackEnd.CPP.Z,1452",207$$LK+BI,"","ICFOp",208$000001C4A6 0004 00000008E5 Funct -$LK+BI,"ICFOpEqual ","FL:D:/TempleOS/Compiler/BackEnd.CPP.Z,1758",209$$LK+BI,"","ICFOpEqual",210$000001D316 0004 0000001066 Funct -$LK+BI,"ICFPostIncDec ","FL:D:/TempleOS/Compiler/BackEnd.CPP.Z,2383",211$$LK+BI,"","ICFPostIncDec",212$000001EEFE 0002 0000000151 Funct -$LK+BI,"ICFPow ","FL:D:/TempleOS/Compiler/BackEnd.CPP.Z,1373",213$$LK+BI,"","ICFPow",214$000001C1B6 0001 00000002ED Funct -$LK+BI,"ICFPreIncDec ","FL:D:/TempleOS/Compiler/BackEnd.CPP.Z,2361",215$$LK+BI,"","ICFPreIncDec",216$000001EDEE 0002 000000010A Funct -$LK+BI,"ICFSub ","FL:D:/TempleOS/Compiler/BackEnd.CPP.Z,2571",217$$LK+BI,"","ICFSub",218$000001F88E 0001 0000000120 Funct -$LK+BI,"ICFTemplateFun ","FL:D:/TempleOS/Compiler/BackEnd.CPP.Z,3541",219$$LK+BI,"","ICFTemplateFun",220$0000022616 0007 00000000A8 Funct -$LK+BI,"ICFUnaryMinus ","FL:D:/TempleOS/Compiler/BackEnd.CPP.Z,1292",221$$LK+BI,"","ICFUnaryMinus",222$000001BE86 0001 00000001E8 Funct -$LK+BI,"ICLastIns ","FL:D:/TempleOS/Compiler/BackEnd.CPP.Z,135",223$$LK+BI,"","ICLastIns",224$0000018C96 0002 00000000A1 Funct -$LK+BI,"ICLea ","FL:D:/TempleOS/Compiler/BackEnd.CPP.Z,821",225$$LK+BI,"","ICLea",226$000001A876 0004 0000000233 Funct -$LK+BI,"ICLimit ","FL:D:/TempleOS/Compiler/BackEnd.CPP.Z,4547",227$$LK+BI,"","ICLimit",228$00000255B6 0002 0000000227 Funct -$LK+BI,"ICLocalVarInit ","FL:D:/TempleOS/Compiler/BackEnd.CPP.Z,4941",229$$LK+BI,"","ICLocalVarInit",230$0000026676 0001 0000000078 Funct -$LK+BI,"ICMemCpy ","FL:D:/TempleOS/Compiler/BackEnd.CPP.Z,4953",231$$LK+BI,"","ICMemCpy",232$00000266EE 0001 000000047C Funct -$LK+BI,"ICMemSet ","FL:D:/TempleOS/Compiler/BackEnd.CPP.Z,5055",233$$LK+BI,"","ICMemSet",234$0000026B6E 0001 000000032C Funct -$LK+BI,"ICMinMax ","FL:D:/TempleOS/Compiler/BackEnd.CPP.Z,4605",235$$LK+BI,"","ICMinMax",236$00000257DE 0004 00000002B7 Funct -$LK+BI,"ICMod ","FL:D:/TempleOS/Compiler/BackEnd.CPP.Z,2735",237$$LK+BI,"","ICMod",238$000002018E 0001 00000000F2 Funct -$LK+BI,"ICModU64 ","FL:D:/TempleOS/Compiler/BackEnd.CPP.Z,4684",239$$LK+BI,"","ICModU64",240$0000025AE6 0001 00000001BB Funct -$LK+BI,"ICModr ","FL:D:/TempleOS/Compiler/BackEnd.CPP.Z,348",241$$LK+BI,"","ICModr",242$0000019526 0018 0000000331 Funct -$LK+BI,"ICMov ","FL:D:/TempleOS/Compiler/BackEnd.CPP.Z,630",243$$LK+BI,"","ICMov",244$0000019F1E 01DD 0000000957 Funct -$LK+BI,"ICMul ","FL:D:/TempleOS/Compiler/BackEnd.CPP.Z,2411",245$$LK+BI,"","ICMul",246$000001F056 0001 00000002BA Funct -$LK+BI,"ICMulEqual ","FL:D:/TempleOS/Compiler/BackEnd.CPP.Z,2594",247$$LK+BI,"","ICMulEqual",248$000001F9AE 0001 0000000408 Funct -$LK+BI,"ICNot ","FL:D:/TempleOS/Compiler/BackEnd.CPP.Z,3021",249$$LK+BI,"","ICNot",250$0000020EDE 0001 000000016E Funct -$LK+BI,"ICOpSizeRex ","FL:D:/TempleOS/Compiler/BackEnd.CPP.Z,46",251$$LK+BI,"","ICOpSizeRex",252$00000188BE 0006 0000000121 Funct -$LK+BI,"ICOr ","FL:D:/TempleOS/Compiler/BackEnd.CPP.Z,597",253$$LK+BI,"","ICOr",254$0000019E0E 000F 000000004A Funct -$LK+BI,"ICOrEqual ","FL:D:/TempleOS/Compiler/BackEnd.CPP.Z,4807",255$$LK+BI,"","ICOrEqual",256$0000026036 0001 0000000109 Funct -$LK+BI,"ICOrOr ","FL:D:/TempleOS/Compiler/BackEnd.CPP.Z,3079",257$$LK+BI,"","ICOrOr",258$000002119E 0001 000000015E Funct -$LK+BI,"ICPop ","FL:D:/TempleOS/Compiler/BackEnd.CPP.Z,548",259$$LK+BI,"","ICPop",260$0000019C46 000A 000000010B Funct -$LK+BI,"ICPopRegs ","FL:D:/TempleOS/Compiler/BackEnd.CPP.Z,575",261$$LK+BI,"","ICPopRegs",262$0000019D56 000F 0000000054 Funct -$LK+BI,"ICPostIncDec ","FL:D:/TempleOS/Compiler/BackEnd.CPP.Z,3594",263$$LK+BI,"","ICPostIncDec",264$00000228D6 0002 0000000237 Funct -$LK+BI,"ICPreIncDec ","FL:D:/TempleOS/Compiler/BackEnd.CPP.Z,3557",265$$LK+BI,"","ICPreIncDec",266$00000226BE 0004 0000000213 Funct -$LK+BI,"ICPreempt ","FL:D:/TempleOS/Compiler/BackEnd.CPP.Z,3474",267$$LK+BI,"","ICPreempt",268$0000022386 0001 0000000122 Funct -$LK+BI,"ICPush ","FL:D:/TempleOS/Compiler/BackEnd.CPP.Z,497",269$$LK+BI,"","ICPush",270$0000019A26 0020 00000001C1 Funct -$LK+BI,"ICPushRegs ","FL:D:/TempleOS/Compiler/BackEnd.CPP.Z,535",271$$LK+BI,"","ICPushRegs",272$0000019BEE 000A 0000000052 Funct -$LK+BI,"ICQueInit ","FL:D:/TempleOS/Compiler/BackEnd.CPP.Z,4435",273$$LK+BI,"","ICQueInit",274$00000251BE 0001 0000000070 Funct -$LK+BI,"ICQueIns ","FL:D:/TempleOS/Compiler/BackEnd.CPP.Z,4449",275$$LK+BI,"","ICQueIns",276$000002522E 0001 0000000179 Funct -$LK+BI,"ICQueInsRev ","FL:D:/TempleOS/Compiler/BackEnd.CPP.Z,4490",277$$LK+BI,"","ICQueInsRev",278$00000253AE 0001 0000000179 Funct -$LK+BI,"ICQueRem ","FL:D:/TempleOS/Compiler/BackEnd.CPP.Z,4531",279$$LK+BI,"","ICQueRem",280$000002552E 0001 0000000088 Funct -$LK+BI,"ICRex ","FL:D:/TempleOS/Compiler/BackEnd.CPP.Z,32",281$$LK+BI,"","ICRex",282$0000018836 0017 0000000088 Funct -$LK+BI,"ICShift ","FL:D:/TempleOS/Compiler/BackEnd.CPP.Z,2910",283$$LK+BI,"","ICShift",284$00000209C6 0004 0000000196 Funct -$LK+BI,"ICShiftEqual ","FL:D:/TempleOS/Compiler/BackEnd.CPP.Z,2944",285$$LK+BI,"","ICShiftEqual",286$0000020B5E 0002 000000030D Funct -$LK+BI,"ICSlashOp ","FL:D:/TempleOS/Compiler/BackEnd.CPP.Z,460",287$$LK+BI,"","ICSlashOp",288$000001985E 0027 00000001C4 Funct -$LK+BI,"ICSqr ","FL:D:/TempleOS/Compiler/BackEnd.CPP.Z,4677",289$$LK+BI,"","ICSqr",290$0000025A96 0002 000000004A Funct -$LK+BI,"ICSub ","FL:D:/TempleOS/Compiler/BackEnd.CPP.Z,1130",291$$LK+BI,"","ICSub",292$000001B77E 0001 0000000454 Funct -$LK+BI,"ICSwap ","FL:D:/TempleOS/Compiler/BackEnd.CPP.Z,4726",293$$LK+BI,"","ICSwap",294$0000025CA6 0001 000000027C Funct -$LK+BI,"ICSwitch ","FL:D:/TempleOS/Compiler/BackEnd.CPP.Z,4854",295$$LK+BI,"","ICSwitch",296$000002624E 0002 0000000427 Funct -$LK+BI,"ICTestAndBranch ","FL:D:/TempleOS/Compiler/BackEnd.CPP.Z,3938",297$$LK+BI,"","ICTestAndBranch",298$00000238BE 0002 0000000273 Funct -$LK+BI,"ICToBool ","FL:D:/TempleOS/Compiler/BackEnd.CPP.Z,3526",299$$LK+BI,"","ICToBool",300$000002259E 0001 0000000071 Funct -$LK+BI,"ICToF64 ","FL:D:/TempleOS/Compiler/BackEnd.CPP.Z,3521",301$$LK+BI,"","ICToF64",302$000002255E 0001 000000003D Funct -$LK+BI,"ICToI64 ","FL:D:/TempleOS/Compiler/BackEnd.CPP.Z,3516",303$$LK+BI,"","ICToI64",304$000002251E 0001 000000003D Funct -$LK+BI,"ICToUpper ","FL:D:/TempleOS/Compiler/BackEnd.CPP.Z,3505",305$$LK+BI,"","ICToUpper",306$00000224AE 0001 000000006B Funct -$LK+BI,"ICU16 ","FL:D:/TempleOS/Compiler/BackEnd.CPP.Z,72",307$$LK+BI,"","ICU16",308$00000189E6 0099 00000000AF Funct -$LK+BI,"ICU24 ","FL:D:/TempleOS/Compiler/BackEnd.CPP.Z,87",309$$LK+BI,"","ICU24",310$0000018A96 0069 00000000DA Funct -$LK+BI,"ICU32 ","FL:D:/TempleOS/Compiler/BackEnd.CPP.Z,104",311$$LK+BI,"","ICU32",312$0000018B76 007B 0000000089 Funct -$LK+BI,"ICU64 ","FL:D:/TempleOS/Compiler/BackEnd.CPP.Z,120",313$$LK+BI,"","ICU64",314$0000018C06 0009 0000000089 Funct -$LK+BI,"ICU8 ","FL:D:/TempleOS/Compiler/BackEnd.CPP.Z,20",315$$LK+BI,"","ICU8",316$00000187AE 0089 0000000083 Funct -$LK+BI,"ICUnaries ","FL:D:/TempleOS/Compiler/BackEnd.CPP.Z,3012",317$$LK+BI,"","ICUnaries",318$0000020E6E 0002 0000000069 Funct -$LK+BI,"ICXorEqual ","FL:D:/TempleOS/Compiler/BackEnd.CPP.Z,4830",319$$LK+BI,"","ICXorEqual",320$0000026146 0001 0000000103 Funct -$LK+BI,"ICXorXor ","FL:D:/TempleOS/Compiler/BackEnd.CPP.Z,3111",321$$LK+BI,"","ICXorXor",322$00000212FE 0001 0000000153 Funct -$LK+BI,"ICZFlagBranch ","FL:D:/TempleOS/Compiler/BackEnd.CPP.Z,3997",323$$LK+BI,"","ICZFlagBranch",324$0000023B36 0002 0000000112 Funct -$LK+BI,"ICZero ","FL:D:/TempleOS/Compiler/BackEnd.CPP.Z,588",325$$LK+BI,"","ICZero",326$0000019DAE 0018 000000005E Funct -$LK+BI,"ImportHashTable ","FL:D:/TempleOS/Compiler/Directives.CPP.Z,56",327$$LK+BI,"","ImportHashTable",328$0000003A98 0000 00000000B3 Funct -$LK+BI,"IncludeDepth ","FL:D:/TempleOS/Compiler/Directives.CPP.Z,75",329$$LK+BI,"","IncludeDepth",330$0000003B50 0000 000000002C Funct -$LK+BI,"InstEntriesCompare ","FL:D:/TempleOS/Compiler/Unassembler.CPP.Z,1",331$$LK+BI,"","InstEntriesCompare",332$0000000A18 0001 0000000227 Funct -$LK+BI,"InstEntryFind ","FL:D:/TempleOS/Compiler/Unassembler.CPP.Z,71",333$$LK+BI,"","InstEntryFind",334$0000000C40 0002 000000037A Funct -$LK+BI,"IsReplaceSyms ","FL:D:/TempleOS/Compiler/Directives.CPP.Z,52",335$$LK+BI,"","IsReplaceSyms",336$0000003A88 000A 000000000D Funct -$LK+BI,"LTrace ","FL:D:/TempleOS/Compiler/Directives.CPP.Z,43",337$$LK+BI,"","LTrace",338$0000003A58 0000 0000000017 Funct -$LK+BI,"Lex ","FL:D:/TempleOS/Compiler/Lex.CPP.Z,796",339$$LK+BI,"","Lex",340$0000006740 00FC 00000025F8 Funct -$LK+BI,"LexBackupLastChar ","FL:D:/TempleOS/Compiler/Lex.CPP.Z,142",341$$LK+BI,"","LexBackupLastChar",342$00000041CC 0003 000000003D Funct -$LK+BI,"LexDel ","FL:D:/TempleOS/Compiler/Lex.CPP.Z,67",343$$LK+BI,"","LexDel",344$0000003F10 0005 000000008D Funct -$LK+BI,"LexDocRead ","FL:D:/TempleOS/Compiler/Lex.CPP.Z,408",345$$LK+BI,"","LexDocRead",346$0000005950 0001 0000000090 Funct -$LK+BI,"LexDollar ","FL:D:/TempleOS/Compiler/Lex.CPP.Z,153",347$$LK+BI,"","LexDollar",348$000000420C 0003 000000006C Funct -$LK+BI,"LexExcept ","FL:D:/TempleOS/Compiler/Lex.CPP.Z,1686",349$$LK+BI,"","LexExcept",350$0000009060 00A0 00000000C6 Funct -$LK+BI,"LexExtStr ","FL:D:/TempleOS/Compiler/Lex.CPP.Z,1604",351$$LK+BI,"","LexExtStr",352$0000008D38 0004 00000000DB Funct -$LK+BI,"LexGetChar ","FL:D:/TempleOS/Compiler/Lex.CPP.Z,167",353$$LK+BI,"","LexGetChar",354$000000427C 0030 00000015EE Funct -$LK+BI,"LexInStr ","FL:D:/TempleOS/Compiler/Lex.CPP.Z,698",355$$LK+BI,"","LexInStr",356$0000006210 0001 000000052C Funct -$LK+BI,"LexIncludeDoc ","FL:D:/TempleOS/Compiler/Lex.CPP.Z,426",357$$LK+BI,"","LexIncludeDoc",358$00000059E0 0001 0000000162 Funct -$LK+BI,"LexIncludeStr ","FL:D:/TempleOS/Compiler/Lex.CPP.Z,377",359$$LK+BI,"","LexIncludeStr",360$00000058AC 0003 0000000095 Funct -$LK+BI,"LexNew ","FL:D:/TempleOS/Compiler/Lex.CPP.Z,38",361$$LK+BI,"","LexNew",362$0000003DC8 0005 0000000141 Funct -$LK+BI,"LexPop ","FL:D:/TempleOS/Compiler/Lex.CPP.Z,489",363$$LK+BI,"","LexPop",364$0000005BD8 0004 000000007E Funct -$LK+BI,"LexPush ","FL:D:/TempleOS/Compiler/Lex.CPP.Z,477",365$$LK+BI,"","LexPush",366$0000005B48 000F 0000000090 Funct -$LK+BI,"LexPutLine ","FL:D:/TempleOS/Compiler/Lex.CPP.Z,1629",367$$LK+BI,"","LexPutLine",368$0000008E18 0003 000000009D Funct -$LK+BI,"LexPutPos ","FL:D:/TempleOS/Compiler/Lex.CPP.Z,1656",369$$LK+BI,"","LexPutPos",370$0000008EB8 0003 00000000CA Funct -$LK+BI,"LexPutToken ","FL:D:/TempleOS/Compiler/Lex.CPP.Z,119",371$$LK+BI,"","LexPutToken",372$00000040B8 0002 0000000110 Funct -$LK+BI,"LexPutWarn ","FL:D:/TempleOS/Compiler/Lex.CPP.Z,1670",373$$LK+BI,"","LexPutWarn",374$0000008F88 0011 00000000D3 Funct -$LK+BI,"LexSize ","FL:D:/TempleOS/Compiler/Lex.CPP.Z,87",375$$LK+BI,"","LexSize",376$0000003FA0 0000 0000000098 Funct -$LK+BI,"LexSkipEol ","FL:D:/TempleOS/Compiler/Lex.CPP.Z,365",377$$LK+BI,"","LexSkipEol",378$000000586C 0004 0000000026 Funct -$LK+BI,"MemberAdd ","FL:D:/TempleOS/Compiler/Lex.CPP.Z,558",379$$LK+BI,"","MemberAdd",380$0000005D80 0004 00000001AE Funct -$LK+BI,"MemberFind ","FL:D:/TempleOS/Compiler/Lex.CPP.Z,523",381$$LK+BI,"","MemberFind",382$0000005CD8 0005 0000000063 Funct -$LK+BI,"MemberFind2 ","FL:D:/TempleOS/Compiler/Lex.CPP.Z,543",383$$LK+BI,"","MemberFind2",384$0000005D40 0001 0000000040 Funct -$LK+BI,"MemberLstCopy ","FL:D:/TempleOS/Compiler/Lex.CPP.Z,643",385$$LK+BI,"","MemberLstCopy",386$0000006028 0001 0000000118 Funct -$LK+BI,"MemberLstDel ","FL:D:/TempleOS/Compiler/Lex.CPP.Z,606",387$$LK+BI,"","MemberLstDel",388$0000005F30 0001 00000000F1 Funct -$LK+BI,"MemberLstNew ","FL:D:/TempleOS/Compiler/StmtParser.CPP.Z,81",389$$LK+BI,"","MemberLstNew",390$0000013616 0003 0000000026 Funct -$LK+BI,"MemberLstSize ","FL:D:/TempleOS/Compiler/Lex.CPP.Z,671",391$$LK+BI,"","MemberLstSize",392$0000006140 0002 00000000CB Funct -$LK+BI,"MemberMetaData ","FL:D:/TempleOS/Compiler/Lex.CPP.Z,501",393$$LK+BI,"","MemberMetaData",394$0000005C58 0000 000000003D Funct -$LK+BI,"MemberMetaFind ","FL:D:/TempleOS/Compiler/Lex.CPP.Z,512",395$$LK+BI,"","MemberMetaFind",396$0000005C98 0000 000000003C Funct +$LK,"CN_P1 ","FL:D:/TempleOS/Compiler/BackEnd.CPP.Z,221"$1 0006 0000000008 DefineStr +$LK,"CN_P2 ","FL:D:/TempleOS/Compiler/BackEnd.CPP.Z,222"$2 0005 0000000008 DefineStr +$LK,"CN_R ","FL:D:/TempleOS/Compiler/BackEnd.CPP.Z,223"$3 0003 0000000008 DefineStr +$LK,"CSwitchCase ","FL:D:/TempleOS/Compiler/StmtParser.CPP.Z,1396"$007FCBA0A8 0004 0000000018 Class +$LK+BI,"CTrace ","FL:D:/TempleOS/Compiler/Directives.CPP.Z,38",33$0000003220 0000 0000000017 Funct +$LK,"CVI2 ","FL:D:/TempleOS/Compiler/StmtParser.CPP.Z,213"$007FCBD098 0003 0000000010 Class +$LK+BI,"Cmp ","FL:D:/TempleOS/Compiler/CmpMain.CPP.Z,372",34$0000034FB8 0000 000000059B Funct +$LK+BI,"CmpBuf ","FL:D:/TempleOS/Compiler/CmpMain.CPP.Z,179",35$0000034880 0001 00000000F7 Funct +$LK+BI,"CmpExpression ","FL:D:/TempleOS/Compiler/ExpParser.CPP.Z,1233",36$00000123A6 0004 00000000B4 Funct +$LK+BI,"CmpF1PushPop ","FL:D:/TempleOS/Compiler/OptPass3.CPP.Z,21",37$0000029030 0002 0000000034 Funct +$LK+BI,"CmpF2PushPop ","FL:D:/TempleOS/Compiler/OptPass3.CPP.Z,27",38$0000029068 0005 0000000080 Funct +$LK+BI,"CmpFillTables ","FL:D:/TempleOS/Compiler/CmpInit.CPP.Z,570",39$0000033A28 0001 0000000640 Funct +$LK+BI,"CmpFixUpAOTAsm ","FL:D:/TempleOS/Compiler/CmpMain.CPP.Z,306",40$0000034D58 0000 000000025C Funct +$LK+BI,"CmpFixUpJITAsm ","FL:D:/TempleOS/Compiler/CmpMain.CPP.Z,198",41$0000034978 0000 00000003DC Funct +$LK+BI,"CmpInit ","FL:D:/TempleOS/Compiler/CmpMain.CPP.Z,706",42$0000035C58 0001 00000000B8 Funct +$LK+BI,"CmpJoin ","FL:D:/TempleOS/Compiler/CmpMain.CPP.Z,60",43$0000034248 0001 0000000636 Funct +$LK+BI,"CmpLoadDefines ","FL:D:/TempleOS/Compiler/CmpInit.CPP.Z,222",44$0000031368 0001 00000026BC Funct +$LK+BI,"CmpNoteFloatOp ","FL:D:/TempleOS/Compiler/BackEnd.CPP.Z,225",45$0000017C6E 000E 000000021F Funct +$LK+BI,"CmpOffset2Reg ","FL:D:/TempleOS/Compiler/OptPass012.CPP.Z,96",46$0000024540 0005 0000000042 Funct +$LK+BI,"CmpPType ","FL:D:/TempleOS/Compiler/OptPass3.CPP.Z,10",47$0000028FF8 0005 0000000033 Funct +$LK+BI,"CmpPmt ","FL:D:/TempleOS/Compiler/Lex.CPP.Z,1",48$0000003380 0001 000000022A Funct +$LK+BI,"CmpSetFloatOpPushPop ","FL:D:/TempleOS/Compiler/BackEnd.CPP.Z,276",49$0000017E8E 000E 000000007B Funct +$LK+BI,"CmpStatement ","FL:D:/TempleOS/Compiler/CmpMain.CPP.Z,24",50$0000034100 0001 0000000148 Funct +$LK+BI,"CmpType ","FL:D:/TempleOS/Compiler/OptPass3.CPP.Z,1",51$0000028FD0 0006 0000000025 Funct +$LK+BI,"DefineU8s ","FL:D:/TempleOS/Compiler/Assembler.CPP.Z,1216",52$000000D516 0004 00000002D2 Funct +$LK+BI,"Echo ","FL:D:/TempleOS/Compiler/Directives.CPP.Z,48",53$0000003250 0000 0000000017 Funct +$LK+BI,"ExeFile ","FL:D:/TempleOS/Compiler/CmpMain.CPP.Z,577",54$0000035748 0000 0000000077 Funct +$LK+BI,"ExeFile2 ","FL:D:/TempleOS/Compiler/CmpMain.CPP.Z,629",55$0000035968 0000 0000000075 Funct +$LK+BI,"ExeFile3 ","FL:D:/TempleOS/Compiler/CmpMain.CPP.Z,669",56$0000035AF0 0000 0000000075 Funct +$LK+BI,"ExePrintF ","FL:D:/TempleOS/Compiler/CmpMain.CPP.Z,568",57$0000035700 0000 0000000045 Funct +$LK+BI,"ExePrintF2 ","FL:D:/TempleOS/Compiler/CmpMain.CPP.Z,620",58$0000035920 0000 0000000043 Funct +$LK+BI,"ExePrintF3 ","FL:D:/TempleOS/Compiler/CmpMain.CPP.Z,659",59$0000035AA8 0000 0000000043 Funct +$LK+BI,"ExePutS ","FL:D:/TempleOS/Compiler/CmpMain.CPP.Z,530",60$0000035558 0003 00000001A1 Funct +$LK+BI,"ExePutS2 ","FL:D:/TempleOS/Compiler/CmpMain.CPP.Z,588",61$00000357C0 0002 0000000159 Funct +$LK+BI,"ExePutS3 ","FL:D:/TempleOS/Compiler/CmpMain.CPP.Z,640",62$00000359E0 0002 00000000C4 Funct +$LK+BI,"Expression ","FL:D:/TempleOS/Compiler/ExpParser.CPP.Z,1258",63$000001248E 0007 000000003B Funct +$LK+BI,"ExpressionDel ","FL:D:/TempleOS/Compiler/Lex.CPP.Z,372",64$0000005084 000B 0000000014 Funct +$LK,"FBO1_F64 ","FL:D:/TempleOS/Compiler/OptPass012.CPP.Z,107"$2 0002 0000000008 DefineStr +$LK,"FBO1_INT ","FL:D:/TempleOS/Compiler/OptPass012.CPP.Z,106"$1 0013 0000000008 DefineStr +$LK,"FBO1_NOT_CONST ","FL:D:/TempleOS/Compiler/OptPass012.CPP.Z,105"$0 0004 0000000008 DefineStr +$LK+BI,"GetExpression ","FL:D:/TempleOS/Compiler/ExpParser.CPP.Z,1253",65$000001245E 0000 0000000029 Funct +$LK+BI,"GetOpt ","FL:D:/TempleOS/Compiler/Directives.CPP.Z,16",66$0000003188 0005 000000002C Funct +$LK+BI,"HashEntryImportCopy ","FL:D:/TempleOS/Compiler/Hash1b.CPP.Z,1",67$0000009B80 0002 000000015F Funct +$LK+BI,"HashEntrySize ","FL:D:/TempleOS/Compiler/Hash1b.CPP.Z,71",68$0000009DC8 0000 0000000164 Funct +$LK+BI,"HashEntrySize2 ","FL:D:/TempleOS/Compiler/Hash1b.CPP.Z,102",69$0000009F30 0002 00000001A9 Funct +$LK+BI,"HashTableImport ","FL:D:/TempleOS/Compiler/Hash1b.CPP.Z,40",70$0000009CE0 0000 00000000E8 Funct +$LK+BI,"HashTableSize2 ","FL:D:/TempleOS/Compiler/Hash1b.CPP.Z,139",71$000000A0E0 0000 000000006B Funct +$LK+BI,"ICAddConst ","FL:D:/TempleOS/Compiler/BackEnd.CPP.Z,945",72$00000199F6 000C 000000074A Funct +$LK+BI,"ICAddEct ","FL:D:/TempleOS/Compiler/BackEnd.CPP.Z,889",73$0000019706 0005 00000002EF Funct +$LK+BI,"ICAddRSP ","FL:D:/TempleOS/Compiler/BackEnd.CPP.Z,163",74$00000179E6 0016 0000000286 Funct +$LK+BI,"ICAddSubEctEqual ","FL:D:/TempleOS/Compiler/BackEnd.CPP.Z,2711",75$000001EB26 0005 0000000673 Funct +$LK+BI,"ICAndAnd ","FL:D:/TempleOS/Compiler/BackEnd.CPP.Z,2980",76$000001F7B6 0001 0000000147 Funct +$LK+BI,"ICAndBranch ","FL:D:/TempleOS/Compiler/BackEnd.CPP.Z,3823",77$0000021BC6 0002 000000070C Funct +$LK+BI,"ICAndEqual ","FL:D:/TempleOS/Compiler/BackEnd.CPP.Z,4484",78$0000023A9E 0001 0000000109 Funct +$LK+BI,"ICAssign ","FL:D:/TempleOS/Compiler/BackEnd.CPP.Z,3981",79$00000222D6 0001 0000000308 Funct +$LK+BI,"ICAssignPostIncDec ","FL:D:/TempleOS/Compiler/BackEnd.CPP.Z,3501",80$0000020E9E 0002 000000020C Funct +$LK+BI,"ICBitOps ","FL:D:/TempleOS/Compiler/BackEnd.CPP.Z,3194",81$000002009E 0007 00000004FB Funct +$LK+BI,"ICBrBitOps ","FL:D:/TempleOS/Compiler/BackEnd.CPP.Z,4030",82$00000225DE 0008 0000000980 Funct +$LK+BI,"ICBuiltInFloatConst ","FL:D:/TempleOS/Compiler/BackEnd.CPP.Z,633",83$0000018B1E 000F 00000000BD Funct +$LK+BI,"ICCmp ","FL:D:/TempleOS/Compiler/BackEnd.CPP.Z,3074",84$000001FBB6 0006 00000004E6 Funct +$LK+BI,"ICCmpAndBranch ","FL:D:/TempleOS/Compiler/BackEnd.CPP.Z,3543",85$00000210AE 000C 000000081C Funct +$LK+BI,"ICCopyTemplate ","FL:D:/TempleOS/Compiler/BackEnd.CPP.Z,288",86$0000017F0E 0019 000000026C Funct +$LK+BI,"ICDeref ","FL:D:/TempleOS/Compiler/BackEnd.CPP.Z,871",87$000001964E 0001 00000000B5 Funct +$LK+BI,"ICDerefPostIncDec ","FL:D:/TempleOS/Compiler/BackEnd.CPP.Z,3458",88$0000020CAE 0002 00000001ED Funct +$LK+BI,"ICDiv ","FL:D:/TempleOS/Compiler/BackEnd.CPP.Z,2619",89$000001E656 0001 00000000F2 Funct +$LK+BI,"ICDivEqual ","FL:D:/TempleOS/Compiler/BackEnd.CPP.Z,2638",90$000001E74E 0002 00000002E0 Funct +$LK+BI,"ICFAdd ","FL:D:/TempleOS/Compiler/BackEnd.CPP.Z,2490",91$000001DF2E 0001 00000001FB Funct +$LK+BI,"ICFCmp ","FL:D:/TempleOS/Compiler/BackEnd.CPP.Z,1611",92$000001B6C6 0004 0000000187 Funct +$LK+BI,"ICFCmpAndBranch ","FL:D:/TempleOS/Compiler/BackEnd.CPP.Z,2042",93$000001CC46 0004 0000000A47 Funct +$LK+BI,"ICFCvt ","FL:D:/TempleOS/Compiler/BackEnd.CPP.Z,1177",94$000001A53E 000C 000000017B Funct +$LK+BI,"ICFCvt2 ","FL:D:/TempleOS/Compiler/BackEnd.CPP.Z,1225",95$000001A6BE 0010 0000000112 Funct +$LK+BI,"ICFDiv ","FL:D:/TempleOS/Compiler/BackEnd.CPP.Z,2466",96$000001DDEE 0001 000000013D Funct +$LK+BI,"ICFMod ","FL:D:/TempleOS/Compiler/BackEnd.CPP.Z,1303",97$000001A9B6 0001 0000000141 Funct +$LK+BI,"ICFModEqual ","FL:D:/TempleOS/Compiler/BackEnd.CPP.Z,1651",98$000001B84E 0001 00000003FA Funct +$LK+BI,"ICFMul ","FL:D:/TempleOS/Compiler/BackEnd.CPP.Z,2426",99$000001DBB6 0001 0000000235 Funct +$LK+BI,"ICFOp ","FL:D:/TempleOS/Compiler/BackEnd.CPP.Z,1412",100$000001ADEE 0004 00000008D3 Funct +$LK+BI,"ICFOpEqual ","FL:D:/TempleOS/Compiler/BackEnd.CPP.Z,1718",101$000001BC4E 0004 0000000FF3 Funct +$LK+BI,"ICFPostIncDec ","FL:D:/TempleOS/Compiler/BackEnd.CPP.Z,2340",102$000001D79E 0002 0000000151 Funct +$LK+BI,"ICFPow ","FL:D:/TempleOS/Compiler/BackEnd.CPP.Z,1333",103$000001AAFE 0001 00000002ED Funct +$LK+BI,"ICFPreIncDec ","FL:D:/TempleOS/Compiler/BackEnd.CPP.Z,2318",104$000001D68E 0002 000000010A Funct +$LK+BI,"ICFSub ","FL:D:/TempleOS/Compiler/BackEnd.CPP.Z,2528",105$000001E12E 0001 0000000120 Funct +$LK+BI,"ICFTemplateFun ","FL:D:/TempleOS/Compiler/BackEnd.CPP.Z,3365",106$000002082E 0007 00000000A8 Funct +$LK+BI,"ICFUnaryMinus ","FL:D:/TempleOS/Compiler/BackEnd.CPP.Z,1252",107$000001A7D6 0001 00000001DC Funct +$LK+BI,"ICLastIns ","FL:D:/TempleOS/Compiler/BackEnd.CPP.Z,135",108$0000017946 0002 00000000A0 Funct +$LK+BI,"ICLea ","FL:D:/TempleOS/Compiler/BackEnd.CPP.Z,837",109$000001947E 0004 00000001CD Funct +$LK+BI,"ICLocalVarInit ","FL:D:/TempleOS/Compiler/BackEnd.CPP.Z,4645",110$000002416E 0001 0000000078 Funct +$LK+BI,"ICMinMax ","FL:D:/TempleOS/Compiler/BackEnd.CPP.Z,4305",111$0000023356 0004 00000002B7 Funct +$LK+BI,"ICMod ","FL:D:/TempleOS/Compiler/BackEnd.CPP.Z,2692",112$000001EA2E 0001 00000000F2 Funct +$LK+BI,"ICModU64 ","FL:D:/TempleOS/Compiler/BackEnd.CPP.Z,4384",113$000002365E 0001 00000001BB Funct +$LK+BI,"ICModr1 ","FL:D:/TempleOS/Compiler/BackEnd.CPP.Z,352",114$000001817E 0017 0000000326 Funct +$LK+BI,"ICModr2 ","FL:D:/TempleOS/Compiler/BackEnd.CPP.Z,443",115$00000184A6 0015 00000000D5 Funct +$LK+BI,"ICMov ","FL:D:/TempleOS/Compiler/BackEnd.CPP.Z,656",116$0000018BDE 01A4 000000089C Funct +$LK+BI,"ICMul ","FL:D:/TempleOS/Compiler/BackEnd.CPP.Z,2368",117$000001D8F6 0001 00000002BA Funct +$LK+BI,"ICMulEqual ","FL:D:/TempleOS/Compiler/BackEnd.CPP.Z,2551",118$000001E24E 0001 0000000408 Funct +$LK+BI,"ICNot ","FL:D:/TempleOS/Compiler/BackEnd.CPP.Z,2960",119$000001F6B6 0001 00000000FB Funct +$LK+BI,"ICOpSizeRex ","FL:D:/TempleOS/Compiler/BackEnd.CPP.Z,46",120$000001759E 0006 0000000113 Funct +$LK+BI,"ICOr ","FL:D:/TempleOS/Compiler/BackEnd.CPP.Z,623",121$0000018ACE 000C 000000004A Funct +$LK+BI,"ICOrEqual ","FL:D:/TempleOS/Compiler/BackEnd.CPP.Z,4507",122$0000023BAE 0001 0000000109 Funct +$LK+BI,"ICOrOr ","FL:D:/TempleOS/Compiler/BackEnd.CPP.Z,3009",123$000001F8FE 0001 000000015E Funct +$LK+BI,"ICPop ","FL:D:/TempleOS/Compiler/BackEnd.CPP.Z,574",124$0000018906 000A 000000010B Funct +$LK+BI,"ICPopRegs ","FL:D:/TempleOS/Compiler/BackEnd.CPP.Z,601",125$0000018A16 000C 0000000055 Funct +$LK+BI,"ICPostIncDec ","FL:D:/TempleOS/Compiler/BackEnd.CPP.Z,3418",126$0000020AAE 0002 00000001FB Funct +$LK+BI,"ICPreIncDec ","FL:D:/TempleOS/Compiler/BackEnd.CPP.Z,3381",127$00000208D6 0004 00000001D7 Funct +$LK+BI,"ICPreempt ","FL:D:/TempleOS/Compiler/BackEnd.CPP.Z,3298",128$000002059E 0001 0000000122 Funct +$LK+BI,"ICPush ","FL:D:/TempleOS/Compiler/BackEnd.CPP.Z,523",129$00000186E6 0020 00000001C1 Funct +$LK+BI,"ICPushRegs ","FL:D:/TempleOS/Compiler/BackEnd.CPP.Z,561",130$00000188AE 0006 0000000053 Funct +$LK+BI,"ICQueInit ","FL:D:/TempleOS/Compiler/BackEnd.CPP.Z,4193",131$0000022F5E 0001 0000000070 Funct +$LK+BI,"ICQueIns ","FL:D:/TempleOS/Compiler/BackEnd.CPP.Z,4207",132$0000022FCE 0001 0000000179 Funct +$LK+BI,"ICQueInsRev ","FL:D:/TempleOS/Compiler/BackEnd.CPP.Z,4248",133$000002314E 0001 0000000179 Funct +$LK+BI,"ICQueRem ","FL:D:/TempleOS/Compiler/BackEnd.CPP.Z,4289",134$00000232CE 0001 0000000088 Funct +$LK+BI,"ICRex ","FL:D:/TempleOS/Compiler/BackEnd.CPP.Z,32",135$0000017516 0016 0000000081 Funct +$LK+BI,"ICShift ","FL:D:/TempleOS/Compiler/BackEnd.CPP.Z,2849",136$000001F19E 0004 0000000197 Funct +$LK+BI,"ICShiftEqual ","FL:D:/TempleOS/Compiler/BackEnd.CPP.Z,2883",137$000001F336 0002 000000030C Funct +$LK+BI,"ICSlashOp ","FL:D:/TempleOS/Compiler/BackEnd.CPP.Z,495",138$000001857E 0027 0000000164 Funct +$LK+BI,"ICSqr ","FL:D:/TempleOS/Compiler/BackEnd.CPP.Z,4377",139$000002360E 0002 000000004A Funct +$LK+BI,"ICSub ","FL:D:/TempleOS/Compiler/BackEnd.CPP.Z,1099",140$000001A146 0001 00000003F2 Funct +$LK+BI,"ICSwap ","FL:D:/TempleOS/Compiler/BackEnd.CPP.Z,4426",141$000002381E 0001 000000027C Funct +$LK+BI,"ICSwitch ","FL:D:/TempleOS/Compiler/BackEnd.CPP.Z,4553",142$0000023DC6 0002 00000003A1 Funct +$LK+BI,"ICTestAndBranch ","FL:D:/TempleOS/Compiler/BackEnd.CPP.Z,3742",143$00000218CE 0002 00000001EA Funct +$LK+BI,"ICToBool ","FL:D:/TempleOS/Compiler/BackEnd.CPP.Z,3350",144$00000207B6 0001 0000000071 Funct +$LK+BI,"ICToF64 ","FL:D:/TempleOS/Compiler/BackEnd.CPP.Z,3345",145$0000020776 0001 000000003D Funct +$LK+BI,"ICToI64 ","FL:D:/TempleOS/Compiler/BackEnd.CPP.Z,3340",146$0000020736 0001 000000003D Funct +$LK+BI,"ICToUpper ","FL:D:/TempleOS/Compiler/BackEnd.CPP.Z,3329",147$00000206C6 0001 000000006B Funct +$LK+BI,"ICU16 ","FL:D:/TempleOS/Compiler/BackEnd.CPP.Z,72",148$00000176B6 0090 00000000A8 Funct +$LK+BI,"ICU24 ","FL:D:/TempleOS/Compiler/BackEnd.CPP.Z,87",149$000001775E 0063 00000000D3 Funct +$LK+BI,"ICU32 ","FL:D:/TempleOS/Compiler/BackEnd.CPP.Z,104",150$0000017836 0051 0000000082 Funct +$LK+BI,"ICU64 ","FL:D:/TempleOS/Compiler/BackEnd.CPP.Z,120",151$00000178BE 0009 0000000082 Funct +$LK+BI,"ICU8 ","FL:D:/TempleOS/Compiler/BackEnd.CPP.Z,20",152$0000017496 0062 000000007C Funct +$LK+BI,"ICUnaries ","FL:D:/TempleOS/Compiler/BackEnd.CPP.Z,2951",153$000001F646 0002 0000000069 Funct +$LK+BI,"ICXorEqual ","FL:D:/TempleOS/Compiler/BackEnd.CPP.Z,4530",154$0000023CBE 0001 0000000103 Funct +$LK+BI,"ICXorXor ","FL:D:/TempleOS/Compiler/BackEnd.CPP.Z,3041",155$000001FA5E 0001 0000000151 Funct +$LK+BI,"ICZFlagBranch ","FL:D:/TempleOS/Compiler/BackEnd.CPP.Z,3790",156$0000021ABE 0002 0000000104 Funct +$LK+BI,"ICZero ","FL:D:/TempleOS/Compiler/BackEnd.CPP.Z,614",157$0000018A6E 0017 000000005E Funct +$LK+BI,"ImportHashTable ","FL:D:/TempleOS/Compiler/Directives.CPP.Z,56",158$0000003278 0000 00000000D5 Funct +$LK+BI,"IncludeDepth ","FL:D:/TempleOS/Compiler/Directives.CPP.Z,76",159$0000003350 0000 000000002C Funct +$LK+BI,"InstEntriesCompare ","FL:D:/TempleOS/Compiler/Unassembler.CPP.Z,1",160$0000000858 0001 000000022B Funct +$LK+BI,"InstEntryFind ","FL:D:/TempleOS/Compiler/Unassembler.CPP.Z,71",161$0000000A88 0002 0000000375 Funct +$LK+BI,"IsReplaceSyms ","FL:D:/TempleOS/Compiler/Directives.CPP.Z,52",162$0000003268 000A 000000000D Funct +$LK+BI,"LTrace ","FL:D:/TempleOS/Compiler/Directives.CPP.Z,43",163$0000003238 0000 0000000017 Funct +$LK+BI,"Lex ","FL:D:/TempleOS/Compiler/Lex.CPP.Z,789",164$0000005F08 00FC 000000254A Funct +$LK+BI,"LexAttachDoc ","FL:D:/TempleOS/Compiler/Lex.CPP.Z,425",165$00000051D0 0001 0000000169 Funct +$LK+BI,"LexBackupLastChar ","FL:D:/TempleOS/Compiler/Lex.CPP.Z,140",166$00000039AC 0003 000000003D Funct +$LK+BI,"LexDel ","FL:D:/TempleOS/Compiler/Lex.CPP.Z,65",167$00000036E8 0005 000000008D Funct +$LK+BI,"LexDocRead ","FL:D:/TempleOS/Compiler/Lex.CPP.Z,407",168$0000005140 0001 0000000090 Funct +$LK+BI,"LexDollar ","FL:D:/TempleOS/Compiler/Lex.CPP.Z,151",169$00000039EC 0003 000000006C Funct +$LK+BI,"LexExcept ","FL:D:/TempleOS/Compiler/Lex.CPP.Z,1670",170$0000008770 00A1 00000000C6 Funct +$LK+BI,"LexExtStr ","FL:D:/TempleOS/Compiler/Lex.CPP.Z,1588",171$0000008458 0004 00000000C1 Funct +$LK+BI,"LexGetChar ","FL:D:/TempleOS/Compiler/Lex.CPP.Z,165",172$0000003A5C 0030 00000015FA Funct +$LK+BI,"LexInStr ","FL:D:/TempleOS/Compiler/Lex.CPP.Z,691",173$00000059E0 0001 0000000524 Funct +$LK+BI,"LexIncludeStr ","FL:D:/TempleOS/Compiler/Lex.CPP.Z,377",174$000000509C 0003 0000000095 Funct +$LK+BI,"LexNew ","FL:D:/TempleOS/Compiler/Lex.CPP.Z,37",175$00000035B0 0005 0000000133 Funct +$LK+BI,"LexPop ","FL:D:/TempleOS/Compiler/Lex.CPP.Z,482",176$00000053C8 0004 0000000070 Funct +$LK+BI,"LexPush ","FL:D:/TempleOS/Compiler/Lex.CPP.Z,470",177$0000005340 000F 0000000082 Funct +$LK+BI,"LexPutLine ","FL:D:/TempleOS/Compiler/Lex.CPP.Z,1613",178$0000008520 0003 00000000A7 Funct +$LK+BI,"LexPutPos ","FL:D:/TempleOS/Compiler/Lex.CPP.Z,1640",179$00000085C8 0003 00000000CA Funct +$LK+BI,"LexPutToken ","FL:D:/TempleOS/Compiler/Lex.CPP.Z,117",180$0000003890 0002 0000000111 Funct +$LK+BI,"LexPutWarn ","FL:D:/TempleOS/Compiler/Lex.CPP.Z,1654",181$0000008698 0011 00000000D3 Funct +$LK+BI,"LexSize ","FL:D:/TempleOS/Compiler/Lex.CPP.Z,85",182$0000003778 0000 0000000098 Funct +$LK+BI,"LexSkipEol ","FL:D:/TempleOS/Compiler/Lex.CPP.Z,365",183$000000505C 0004 0000000027 Funct +$LK,"MDR_D32_INDIRECT_REG ","FL:D:/TempleOS/Compiler/BackEnd.CPP.Z,346"$3 0002 0000000008 DefineStr +$LK,"MDR_D8_INDIRECT_REG ","FL:D:/TempleOS/Compiler/BackEnd.CPP.Z,345"$2 0002 0000000008 DefineStr +$LK,"MDR_INDIRECT_REG ","FL:D:/TempleOS/Compiler/BackEnd.CPP.Z,344"$1 0002 0000000008 DefineStr +$LK,"MDR_REG ","FL:D:/TempleOS/Compiler/BackEnd.CPP.Z,343"$0 0002 0000000008 DefineStr +$LK,"MDR_RIP_REL ","FL:D:/TempleOS/Compiler/BackEnd.CPP.Z,350"$7 0004 0000000008 DefineStr +$LK,"MDR_SIB_D32_INDIRECT_REG ","FL:D:/TempleOS/Compiler/BackEnd.CPP.Z,349"$6 0003 0000000008 DefineStr +$LK,"MDR_SIB_D8_INDIRECT_REG ","FL:D:/TempleOS/Compiler/BackEnd.CPP.Z,348"$5 0002 0000000008 DefineStr +$LK,"MDR_SIB_INDIRECT_REG ","FL:D:/TempleOS/Compiler/BackEnd.CPP.Z,347"$4 0002 0000000008 DefineStr +$LK+BI,"MemberAdd ","FL:D:/TempleOS/Compiler/Lex.CPP.Z,551",184$0000005558 0004 00000001AE Funct +$LK+BI,"MemberFind ","FL:D:/TempleOS/Compiler/Lex.CPP.Z,516",185$00000054B8 0005 0000000060 Funct +$LK+BI,"MemberFind2 ","FL:D:/TempleOS/Compiler/Lex.CPP.Z,536",186$0000005518 0001 0000000040 Funct +$LK+BI,"MemberLstCopy ","FL:D:/TempleOS/Compiler/Lex.CPP.Z,636",187$00000057F8 0001 0000000118 Funct +$LK+BI,"MemberLstDel ","FL:D:/TempleOS/Compiler/Lex.CPP.Z,599",188$0000005708 0001 00000000F0 Funct +$LK+BI,"MemberLstNew ","FL:D:/TempleOS/Compiler/StmtParser.CPP.Z,81",189$000001263E 0003 0000000026 Funct +$LK+BI,"MemberLstSize ","FL:D:/TempleOS/Compiler/Lex.CPP.Z,664",190$0000005910 0002 00000000CB Funct +$LK+BI,"MemberMetaData ","FL:D:/TempleOS/Compiler/Lex.CPP.Z,494",191$0000005438 0000 000000003D Funct +$LK+BI,"MemberMetaFind ","FL:D:/TempleOS/Compiler/Lex.CPP.Z,505",192$0000005478 0000 000000003C Funct $LK,"NUM_INTERNAL_TYPES ","FL:D:/TempleOS/Compiler/CmpInit.CPP.Z,1"$16 0002 0000000008 DefineStr -$LK+BI,"OPassTraceMask ","FL:D:/TempleOS/Compiler/Directives.CPP.Z,31",397$$LK+BI,"","OPassTraceMask",398$0000003A08 0000 0000000035 Funct -$LK+BI,"OTrace ","FL:D:/TempleOS/Compiler/Directives.CPP.Z,26",399$$LK+BI,"","OTrace",400$00000039F0 0000 0000000017 Funct -$LK+BI,"OptBrNotZero ","FL:D:/TempleOS/Compiler/OptPass012.CPP.Z,374",401$$LK+BI,"","OptBrNotZero",402$0000027BB8 0004 00000006C3 Funct -$LK+BI,"OptBrZero ","FL:D:/TempleOS/Compiler/OptPass012.CPP.Z,209",403$$LK+BI,"","OptBrZero",404$00000274F0 0006 00000006C3 Funct -$LK+BI,"OptEnd ","FL:D:/TempleOS/Compiler/OptPass012.CPP.Z,165",405$$LK+BI,"","OptEnd",406$00000273D0 0005 000000006F Funct -$LK+BI,"OptEqu ","FL:D:/TempleOS/Compiler/Directives.CPP.Z,1",407$$LK+BI,"","OptEqu",408$0000003930 0007 0000000045 Funct -$LK+BI,"OptFixSizeOf ","FL:D:/TempleOS/Compiler/OptPass012.CPP.Z,538",409$$LK+BI,"","OptFixSizeOf",410$0000028280 0003 00000000CC Funct -$LK+BI,"OptFixupBinaryOp1 ","FL:D:/TempleOS/Compiler/OptPass012.CPP.Z,6",411$$LK+BI,"","OptFixupBinaryOp1",412$0000026E9E 0013 0000000223 Funct -$LK+BI,"OptFixupBinaryOp2 ","FL:D:/TempleOS/Compiler/OptPass012.CPP.Z,80",413$$LK+BI,"","OptFixupBinaryOp2",414$00000270C6 0001 0000000058 Funct -$LK+BI,"OptFixupUnaryOp ","FL:D:/TempleOS/Compiler/OptPass012.CPP.Z,96",415$$LK+BI,"","OptFixupUnaryOp",416$000002711E 0003 00000000EF Funct -$LK+BI,"OptIC4 ","FL:D:/TempleOS/Compiler/OptPass4.CPP.Z,1",417$$LK+BI,"","OptIC4",418$000002DD30 0001 0000000826 Funct -$LK+BI,"OptIC6 ","FL:D:/TempleOS/Compiler/OptPass6.CPP.Z,1",419$$LK+BI,"","OptIC6",420$0000030138 0001 0000000162 Funct -$LK+BI,"OptLag ","FL:D:/TempleOS/Compiler/OptPass012.CPP.Z,175",421$$LK+BI,"","OptLag",422$0000027440 0004 0000000030 Funct -$LK+BI,"OptLag1 ","FL:D:/TempleOS/Compiler/OptPass012.CPP.Z,186",423$$LK+BI,"","OptLag1",424$0000027470 0005 000000003A Funct -$LK+BI,"OptLead1 ","FL:D:/TempleOS/Compiler/OptPass012.CPP.Z,197",425$$LK+BI,"","OptLead1",426$00000274B0 0002 0000000039 Funct -$LK+BI,"OptMVCompare ","FL:D:/TempleOS/Compiler/OptPass3.CPP.Z,46",427$$LK+BI,"","OptMVCompare",428$000002C348 0001 000000001A Funct -$LK,"OptMemberVar ","FL:D:/TempleOS/Compiler/OptPass3.CPP.Z,41"$007FC17530 0005 0000000020 Class -$LK+BI,"OptMissing ","FL:D:/TempleOS/Compiler/OptPass012.CPP.Z,142",429$$LK+BI,"","OptMissing",430$0000027256 0004 0000000070 Funct -$LK,"OptNext ","FL:D:/TempleOS/Compiler/CmpAsm.CPP.Z,687"$0000000098 0002 Funct -$LK,"OptNext2 ","FL:D:/TempleOS/Compiler/CmpAsm.CPP.Z,690"$000000010A 0001 Funct -$LK,"OptNext3 ","FL:D:/TempleOS/Compiler/CmpAsm.CPP.Z,693"$000000017C 0001 Funct -$LK+BI,"OptOff ","FL:D:/TempleOS/Compiler/Directives.CPP.Z,11",431$$LK+BI,"","OptOff",432$0000003990 0000 0000000016 Funct -$LK+BI,"OptOn ","FL:D:/TempleOS/Compiler/Directives.CPP.Z,6",433$$LK+BI,"","OptOn",434$0000003978 0000 0000000016 Funct -$LK+BI,"OptPass012 ","FL:D:/TempleOS/Compiler/OptPass012.CPP.Z,564",435$$LK+BI,"","OptPass012",436$0000028350 0000 0000003EC1 Funct -$LK+BI,"OptPass3 ","FL:D:/TempleOS/Compiler/OptPass3.CPP.Z,51",437$$LK+BI,"","OptPass3",438$000002C368 0000 00000019C7 Funct -$LK+BI,"OptPass4 ","FL:D:/TempleOS/Compiler/OptPass4.CPP.Z,224",439$$LK+BI,"","OptPass4",440$000002E558 0000 0000001609 Funct -$LK+BI,"OptPass5 ","FL:D:/TempleOS/Compiler/OptPass5.CPP.Z,1",441$$LK+BI,"","OptPass5",442$000002FB68 0000 00000005CF Funct -$LK+BI,"OptPass6 ","FL:D:/TempleOS/Compiler/OptPass6.CPP.Z,146",443$$LK+BI,"","OptPass6",444$0000030658 0000 00000004E9 Funct -$LK+BI,"OptPass6Lag ","FL:D:/TempleOS/Compiler/OptPass6.CPP.Z,37",445$$LK+BI,"","OptPass6Lag",446$00000302A0 0001 00000003B2 Funct -$LK+BI,"OptPass789A ","FL:D:/TempleOS/Compiler/OptPass789A.CPP.Z,1",447$$LK+BI,"","OptPass789A",448$0000030B48 0000 0000003832 Funct -$LK+BI,"OptStart ","FL:D:/TempleOS/Compiler/OptPass012.CPP.Z,152",449$$LK+BI,"","OptStart",450$0000027360 0005 000000006D Funct -$LK,"PRST_CHECK_BINARY_OPS ","FL:D:/TempleOS/Compiler/ExpParser.CPP.Z,42"$4 0001 0000000008 DefineStr -$LK,"PRST_DEREFERENCE ","FL:D:/TempleOS/Compiler/ExpParser.CPP.Z,41"$3 0004 0000000008 DefineStr -$LK,"PRST_MAYBE_MODIFIERS ","FL:D:/TempleOS/Compiler/ExpParser.CPP.Z,39"$1 000F 0000000008 DefineStr -$LK,"PRST_UNARY_MODIFIERS ","FL:D:/TempleOS/Compiler/ExpParser.CPP.Z,40"$2 0009 0000000008 DefineStr -$LK,"PRST_UNARY_TERM ","FL:D:/TempleOS/Compiler/ExpParser.CPP.Z,38"$0 0005 0000000008 DefineStr -$LK+BI,"PTrace ","FL:D:/TempleOS/Compiler/Directives.CPP.Z,21",451$$LK+BI,"","PTrace",452$00000039D8 0000 0000000017 Funct -$LK+BI,"ParenWarning ","FL:D:/TempleOS/Compiler/ExpParser.CPP.Z,1",453$$LK+BI,"","ParenWarning",454$000000EC56 0004 0000000055 Funct -$LK+BI,"PrsArrayDims ","FL:D:/TempleOS/Compiler/StmtParser.CPP.Z,349",455$$LK+BI,"","PrsArrayDims",456$00000140BE 0001 0000000134 Funct -$LK+BI,"PrsAsmArg ","FL:D:/TempleOS/Compiler/Assembler.CPP.Z,460",457$$LK+BI,"","PrsAsmArg",458$000000BD88 0002 000000047E Funct -$LK+BI,"PrsAsmBlk ","FL:D:/TempleOS/Compiler/Assembler.CPP.Z,1309",459$$LK+BI,"","PrsAsmBlk",460$000000E37E 0001 00000008D2 Funct -$LK+BI,"PrsAsmImm ","FL:D:/TempleOS/Compiler/Assembler.CPP.Z,425",461$$LK+BI,"","PrsAsmImm",462$000000BC40 0006 0000000145 Funct -$LK+BI,"PrsClass ","FL:D:/TempleOS/Compiler/StmtParser.CPP.Z,844",463$$LK+BI,"","PrsClass",464$000001550E 0004 0000000267 Funct -$LK+BI,"PrsClassNew ","FL:D:/TempleOS/Compiler/StmtParser.CPP.Z,1",465$$LK+BI,"","PrsClassNew",466$00000134A6 0003 00000000B3 Funct -$LK+BI,"PrsDereference ","FL:D:/TempleOS/Compiler/ExpParser.CPP.Z,1232",467$$LK+BI,"","PrsDereference",468$00000132BE 0000 00000000B8 Funct -$LK+BI,"PrsDoWhile ","FL:D:/TempleOS/Compiler/StmtParser.CPP.Z,1359",469$$LK+BI,"","PrsDoWhile",470$0000016936 0001 0000000155 Funct -$LK+BI,"PrsDotDotDot ","FL:D:/TempleOS/Compiler/StmtParser.CPP.Z,387",471$$LK+BI,"","PrsDotDotDot",472$00000141F6 0001 0000000100 Funct -$LK+BI,"PrsExpression ","FL:D:/TempleOS/Compiler/ExpParser.CPP.Z,44",473$$LK+BI,"","PrsExpression",474$000000EDA6 0010 000000125F Funct -$LK+BI,"PrsFor ","FL:D:/TempleOS/Compiler/StmtParser.CPP.Z,1383",475$$LK+BI,"","PrsFor",476$0000016A8E 0001 00000001C7 Funct -$LK+BI,"PrsFun ","FL:D:/TempleOS/Compiler/StmtParser.CPP.Z,981",477$$LK+BI,"","PrsFun",478$00000159A6 0001 00000003CA Funct -$LK+BI,"PrsFunCall ","FL:D:/TempleOS/Compiler/ExpParser.CPP.Z,444",479$$LK+BI,"","PrsFunCall",480$000001035E 0003 00000008DF Funct -$LK+BI,"PrsFunJoin ","FL:D:/TempleOS/Compiler/StmtParser.CPP.Z,910",481$$LK+BI,"","PrsFunJoin",482$0000015776 0005 0000000229 Funct -$LK+BI,"PrsFunNew ","FL:D:/TempleOS/Compiler/StmtParser.CPP.Z,45",483$$LK+BI,"","PrsFunNew",484$000001355E 0001 00000000B3 Funct -$LK+BI,"PrsGlblInit ","FL:D:/TempleOS/Compiler/StmtParser.CPP.Z,303",485$$LK+BI,"","PrsGlblInit",486$0000013EC6 0002 0000000084 Funct -$LK+BI,"PrsGlblVarLst ","FL:D:/TempleOS/Compiler/StmtParser.CPP.Z,1057",487$$LK+BI,"","PrsGlblVarLst",488$0000015D76 0008 0000000958 Funct -$LK+BI,"PrsIf ","FL:D:/TempleOS/Compiler/StmtParser.CPP.Z,1305",489$$LK+BI,"","PrsIf",490$00000166CE 0001 000000015B Funct -$LK+BI,"PrsKeyWord ","FL:D:/TempleOS/Compiler/StmtParser.CPP.Z,88",491$$LK+BI,"","PrsKeyWord",492$000001363E 000B 000000003C Funct -$LK+BI,"PrsNoUnusedWarn ","FL:D:/TempleOS/Compiler/StmtParser.CPP.Z,1547",493$$LK+BI,"","PrsNoUnusedWarn",494$0000017196 0001 000000008F Funct -$LK+BI,"PrsOffsetOf ","FL:D:/TempleOS/Compiler/ExpParser.CPP.Z,413",495$$LK+BI,"","PrsOffsetOf",496$000001020E 0002 0000000149 Funct -$LK+BI,"PrsPop ","FL:D:/TempleOS/Compiler/ExpParser.CPP.Z,13",497$$LK+BI,"","PrsPop",498$000000ECD6 001B 0000000022 Funct -$LK+BI,"PrsPop2 ","FL:D:/TempleOS/Compiler/ExpParser.CPP.Z,23",499$$LK+BI,"","PrsPop2",500$000000ED36 0001 000000002D Funct -$LK+BI,"PrsPopDeref ","FL:D:/TempleOS/Compiler/ExpParser.CPP.Z,28",501$$LK+BI,"","PrsPopDeref",502$000000ED66 0004 000000003F Funct -$LK+BI,"PrsPush ","FL:D:/TempleOS/Compiler/ExpParser.CPP.Z,8",503$$LK+BI,"","PrsPush",504$000000ECAE 0017 0000000028 Funct -$LK+BI,"PrsPush2 ","FL:D:/TempleOS/Compiler/ExpParser.CPP.Z,18",505$$LK+BI,"","PrsPush2",506$000000ECFE 0004 0000000033 Funct -$LK+BI,"PrsSizeOf ","FL:D:/TempleOS/Compiler/ExpParser.CPP.Z,365",507$$LK+BI,"","PrsSizeOf",508$0000010006 0001 0000000207 Funct -$LK+BI,"PrsStatement ","FL:D:/TempleOS/Compiler/StmtParser.CPP.Z,1692",509$$LK+BI,"","PrsStatement",510$000001777E 0004 000000102C Funct -$LK+BI,"PrsStaticInit ","FL:D:/TempleOS/Compiler/StmtParser.CPP.Z,312",511$$LK+BI,"","PrsStaticInit",512$0000013F4E 0002 000000016E Funct -$LK+BI,"PrsStreamBlk ","FL:D:/TempleOS/Compiler/StmtParser.CPP.Z,1563",513$$LK+BI,"","PrsStreamBlk",514$0000017226 0001 0000000211 Funct -$LK+BI,"PrsSwitch ","FL:D:/TempleOS/Compiler/StmtParser.CPP.Z,1430",515$$LK+BI,"","PrsSwitch",516$0000016C56 0002 000000053B Funct -$LK+BI,"PrsTryBlk ","FL:D:/TempleOS/Compiler/StmtParser.CPP.Z,1613",517$$LK+BI,"","PrsTryBlk",518$000001743E 0001 0000000339 Funct -$LK+BI,"PrsType ","FL:D:/TempleOS/Compiler/StmtParser.CPP.Z,420",519$$LK+BI,"","PrsType",520$00000142F6 0002 000000039F Funct -$LK+BI,"PrsUnaryModifier ","FL:D:/TempleOS/Compiler/ExpParser.CPP.Z,1070",521$$LK+BI,"","PrsUnaryModifier",522$000001247E 0000 0000000E3A Funct -$LK+BI,"PrsUnaryTerm ","FL:D:/TempleOS/Compiler/ExpParser.CPP.Z,666",523$$LK+BI,"","PrsUnaryTerm",524$0000010C3E 0000 000000183E Funct -$LK+BI,"PrsVarInit ","FL:D:/TempleOS/Compiler/StmtParser.CPP.Z,99",525$$LK+BI,"","PrsVarInit",526$000001367E 0001 0000000513 Funct -$LK+BI,"PrsVarInit2 ","FL:D:/TempleOS/Compiler/StmtParser.CPP.Z,220",527$$LK+BI,"","PrsVarInit2",528$0000013B96 0004 000000032A Funct -$LK+BI,"PrsVarLst ","FL:D:/TempleOS/Compiler/StmtParser.CPP.Z,518",529$$LK+BI,"","PrsVarLst",530$0000014696 0006 0000000DD1 Funct -$LK+BI,"PrsWhile ","FL:D:/TempleOS/Compiler/StmtParser.CPP.Z,1337",531$$LK+BI,"","PrsWhile",532$000001682E 0001 0000000105 Funct -$LK+BI,"QueVectU8Del ","FL:D:/TempleOS/Compiler/CmpQueVect.CPP.Z,46",533$$LK+BI,"","QueVectU8Del",534$0000000990 0004 0000000021 Funct -$LK+BI,"QueVectU8Get ","FL:D:/TempleOS/Compiler/CmpQueVect.CPP.Z,54",535$$LK+BI,"","QueVectU8Get",536$00000009B8 0001 000000005E Funct -$LK+BI,"QueVectU8New ","FL:D:/TempleOS/Compiler/CmpQueVect.CPP.Z,1",537$$LK+BI,"","QueVectU8New",538$0000000868 0001 0000000040 Funct -$LK+BI,"QueVectU8Put ","FL:D:/TempleOS/Compiler/CmpQueVect.CPP.Z,10",539$$LK+BI,"","QueVectU8Put",540$00000008A8 0001 00000000E3 Funct -$LK,"SLASH_OP_DEC ","FL:D:/TempleOS/Compiler/BackEnd.CPP.Z,440"$0x00000000 0006 0000000018 DefineStr -$LK,"SLASH_OP_DIV ","FL:D:/TempleOS/Compiler/BackEnd.CPP.Z,445"$0x00000000 0001 0000000018 DefineStr -$LK,"SLASH_OP_FADD ","FL:D:/TempleOS/Compiler/BackEnd.CPP.Z,449"$0x01C1DE00 0002 0000000018 DefineStr -$LK,"SLASH_OP_FDIV ","FL:D:/TempleOS/Compiler/BackEnd.CPP.Z,453"$0x01F9DE00 0002 0000000018 DefineStr -$LK,"SLASH_OP_FDIVR ","FL:D:/TempleOS/Compiler/BackEnd.CPP.Z,454"$0x01F1DE00 0003 0000000018 DefineStr -$LK,"SLASH_OP_FILD ","FL:D:/TempleOS/Compiler/BackEnd.CPP.Z,458"$0x01000000 0002 0000000018 DefineStr -$LK,"SLASH_OP_FISTTP ","FL:D:/TempleOS/Compiler/BackEnd.CPP.Z,457"$0x01000000 0002 0000000018 DefineStr -$LK,"SLASH_OP_FLD ","FL:D:/TempleOS/Compiler/BackEnd.CPP.Z,455"$0x01000000 0008 0000000018 DefineStr -$LK,"SLASH_OP_FMUL ","FL:D:/TempleOS/Compiler/BackEnd.CPP.Z,452"$0x01C9DE00 0002 0000000018 DefineStr -$LK,"SLASH_OP_FSTP ","FL:D:/TempleOS/Compiler/BackEnd.CPP.Z,456"$0x01000000 000D 0000000018 DefineStr -$LK,"SLASH_OP_FSUB ","FL:D:/TempleOS/Compiler/BackEnd.CPP.Z,450"$0x01E9DE00 0002 0000000018 DefineStr -$LK,"SLASH_OP_FSUBR ","FL:D:/TempleOS/Compiler/BackEnd.CPP.Z,451"$0x01E1DE00 0003 0000000018 DefineStr -$LK,"SLASH_OP_IMUL ","FL:D:/TempleOS/Compiler/BackEnd.CPP.Z,444"$0x00000000 0001 0000000018 DefineStr -$LK,"SLASH_OP_INC ","FL:D:/TempleOS/Compiler/BackEnd.CPP.Z,439"$0x00000000 000C 0000000018 DefineStr -$LK,"SLASH_OP_MOV ","FL:D:/TempleOS/Compiler/BackEnd.CPP.Z,446"$0x00000000 0002 0000000018 DefineStr -$LK,"SLASH_OP_MUL ","FL:D:/TempleOS/Compiler/BackEnd.CPP.Z,443"$0x00000000 0001 0000000018 DefineStr -$LK,"SLASH_OP_NEG ","FL:D:/TempleOS/Compiler/BackEnd.CPP.Z,442"$0x00000000 0001 0000000018 DefineStr -$LK,"SLASH_OP_NOT ","FL:D:/TempleOS/Compiler/BackEnd.CPP.Z,441"$0x00000000 0001 0000000018 DefineStr -$LK,"SLASH_OP_POP ","FL:D:/TempleOS/Compiler/BackEnd.CPP.Z,448"$0x00000000 0001 0000000018 DefineStr -$LK,"SLASH_OP_PUSH ","FL:D:/TempleOS/Compiler/BackEnd.CPP.Z,447"$0x00000000 0001 0000000018 DefineStr -$LK+BI,"SetSrcFileInfo ","FL:D:/TempleOS/Compiler/Lex.CPP.Z,107",541$$LK+BI,"","SetSrcFileInfo",542$0000004038 0008 0000000079 Funct -$LK+BI,"StreamPrintF ","FL:D:/TempleOS/Compiler/CmpMain.CPP.Z,14",543$$LK+BI,"","StreamPrintF",544$0000038098 0000 0000000034 Funct -$LK+BI,"StreamPutS ","FL:D:/TempleOS/Compiler/CmpMain.CPP.Z,1",545$$LK+BI,"","StreamPutS",546$0000038038 0001 0000000060 Funct -$LK+BI,"U ","FL:D:/TempleOS/Compiler/Unassembler.CPP.Z,866",547$$LK+BI,"","U",548$00000037E8 0000 000000009B Funct -$LK+BI,"Ui ","FL:D:/TempleOS/Compiler/Unassembler.CPP.Z,220",549$$LK+BI,"","Ui",550$00000010D0 0002 0000002711 Funct -$LK+BI,"Un ","FL:D:/TempleOS/Compiler/Unassembler.CPP.Z,882",551$$LK+BI,"","Un",552$0000003888 0009 00000000A6 Funct -$LK+BI,"UnasmHashLoad ","FL:D:/TempleOS/Compiler/Unassembler.CPP.Z,181",553$$LK+BI,"","UnasmHashLoad",554$0000000FC0 0001 0000000109 Funct -$LK+BI,"UndefinedExtern ","FL:D:/TempleOS/Compiler/StmtParser.CPP.Z,831",555$$LK+BI,"","UndefinedExtern",556$000001546E 0001 0000000050 Funct -$LK+BI,"UnusedExternWarning ","FL:D:/TempleOS/Compiler/StmtParser.CPP.Z,838",557$$LK+BI,"","UnusedExternWarning",558$00000154BE 0004 000000004E Funct -$LK,"_OPTNEXT ","FL:D:/TempleOS/Compiler/CmpAsm.CPP.Z,10"$0000000098 0001 ExportSysSym -$LK,"_OPTNEXT2 ","FL:D:/TempleOS/Compiler/CmpAsm.CPP.Z,58"$000000010A 0001 ExportSysSym -$LK,"_OPTNEXT3 ","FL:D:/TempleOS/Compiler/CmpAsm.CPP.Z,107"$000000017C 0001 ExportSysSym -$LK,"asm_hash ","FL:D:/TempleOS/Compiler/CmpGlbls.CPP.Z,2"$0000000708 0009 0000000008 GlbVar -$LK,"asm_seg_prefixes ","FL:D:/TempleOS/Compiler/Assembler.CPP.Z,822"$000000CC78 0001 0000000006 GlbVar -$LK,"assign_bitmap ","FL:D:/TempleOS/Compiler/CmpGlbls.CPP.Z,8"$00000007B8 0003 0000000008 GlbVar -$LK,"binary_ops_table ","FL:D:/TempleOS/Compiler/CmpGlbls.CPP.Z,6"$0000000790 0003 0000000008 GlbVar -$LK,"cmp_arg_cnt ","FL:D:/TempleOS/Compiler/CmpGlbls.CPP.Z,7"$00000007A0 0009 0000000008 GlbVar -$LK,"cmp_bitmap ","FL:D:/TempleOS/Compiler/CmpGlbls.CPP.Z,8"$00000007C8 0004 0000000008 GlbVar -$LK,"cmp_do_not_write_to_dsk ","FL:D:/TempleOS/Compiler/CmpGlbls.CPP.Z,3"$0000000711 0003 0000000001 GlbVar -$LK,"cmp_result_cnt ","FL:D:/TempleOS/Compiler/CmpGlbls.CPP.Z,8"$00000007A8 0005 0000000008 GlbVar -$LK,"cmp_templates ","FL:D:/TempleOS/Compiler/CmpExts.CPP.Z,49"$0000000206 0002 0000000004 GlbVar -$LK,"cmp_templates_dont_pop ","FL:D:/TempleOS/Compiler/CmpExts.CPP.Z,50"$000000039B 0002 0000000004 GlbVar -$LK,"cmp_templates_dont_push ","FL:D:/TempleOS/Compiler/CmpExts.CPP.Z,51"$0000000467 0002 0000000004 GlbVar -$LK,"cmp_templates_dont_push2 ","FL:D:/TempleOS/Compiler/CmpExts.CPP.Z,53"$000000063D 0002 0000000004 GlbVar -$LK,"cmp_templates_dont_push_pop","FL:D:/TempleOS/Compiler/CmpExts.CPP.Z,52"$00000005AD 0002 0000000004 GlbVar -$LK,"compiled_bytes ","FL:D:/TempleOS/Compiler/CmpGlbls.CPP.Z,15"$0000000838 0002 0000000008 GlbVar -$LK,"compiled_funs ","FL:D:/TempleOS/Compiler/CmpGlbls.CPP.Z,14"$0000000830 0002 0000000008 GlbVar -$LK,"compiled_lines ","FL:D:/TempleOS/Compiler/CmpGlbls.CPP.Z,14"$0000000828 0003 0000000008 GlbVar -$LK,"deref_bitmap ","FL:D:/TempleOS/Compiler/CmpGlbls.CPP.Z,8"$00000007B0 0004 0000000008 GlbVar -$LK,"doc_stop_btypes ","FL:D:/TempleOS/Compiler/Lex.CPP.Z,399"$0000005948 0001 0000000008 GlbVar -$LK,"dual_U16_tokens1 ","FL:D:/TempleOS/Compiler/CmpGlbls.CPP.Z,5"$0000000778 0002 0000000008 GlbVar -$LK,"dual_U16_tokens2 ","FL:D:/TempleOS/Compiler/CmpGlbls.CPP.Z,5"$0000000780 0002 0000000008 GlbVar -$LK,"dual_U16_tokens3 ","FL:D:/TempleOS/Compiler/CmpGlbls.CPP.Z,6"$0000000788 0002 0000000008 GlbVar -$LK,"fpop_bitmap ","FL:D:/TempleOS/Compiler/CmpGlbls.CPP.Z,9"$00000007D0 0013 0000000008 GlbVar -$LK,"internal_types_table ","FL:D:/TempleOS/Compiler/CmpInit.CPP.Z,8"$0000034380 0001 00000000A0 GlbVar -$LK,"is_first_compiler ","FL:D:/TempleOS/Compiler/CmpGlbls.CPP.Z,2"$0000000710 0004 0000000001 GlbVar -$LK,"lex_zeros ","FL:D:/TempleOS/Compiler/Lex.CPP.Z,140"$00000041C8 000B 0000000004 GlbVar -$LK,"non_ptr_vars_mask ","FL:D:/TempleOS/Compiler/CmpGlbls.CPP.Z,11"$0000000800 0006 0000000008 GlbVar -$LK,"not_constant_bitmap ","FL:D:/TempleOS/Compiler/CmpGlbls.CPP.Z,8"$00000007C0 0003 0000000008 GlbVar -$LK,"num_non_ptr_vars ","FL:D:/TempleOS/Compiler/CmpGlbls.CPP.Z,10"$00000007E8 0005 0000000008 GlbVar -$LK,"num_reg_vars ","FL:D:/TempleOS/Compiler/CmpGlbls.CPP.Z,9"$00000007E0 0006 0000000008 GlbVar -$LK,"num_stk_temps ","FL:D:/TempleOS/Compiler/CmpGlbls.CPP.Z,9"$00000007D8 0004 0000000008 GlbVar -$LK,"opt_nop ","FL:D:/TempleOS/Compiler/OptPass012.CPP.Z,150"$00000272C8 0007 0000000098 GlbVar -$LK,"reg_vars_mask ","FL:D:/TempleOS/Compiler/CmpGlbls.CPP.Z,10"$00000007F8 0002 0000000008 GlbVar -$LK,"stk_temps_mask ","FL:D:/TempleOS/Compiler/CmpGlbls.CPP.Z,10"$00000007F0 0003 0000000008 GlbVar -$LK,"sys_internal_types ","FL:D:/TempleOS/Compiler/CmpGlbls.CPP.Z,4"$0000000718 00B5 0000000060 GlbVar -$LK,"to_non_ptr_vars_map ","FL:D:/TempleOS/Compiler/CmpGlbls.CPP.Z,14"$0000000820 0004 0000000008 GlbVar -$LK,"to_reg_vars_map ","FL:D:/TempleOS/Compiler/CmpGlbls.CPP.Z,13"$0000000818 0004 0000000008 GlbVar -$LK,"to_stk_temps_map_even ","FL:D:/TempleOS/Compiler/CmpGlbls.CPP.Z,13"$0000000810 0008 0000000008 GlbVar -$LK,"to_stk_temps_map_odd ","FL:D:/TempleOS/Compiler/CmpGlbls.CPP.Z,12"$0000000808 0008 0000000008 GlbVar -$LK,"uasm_ins64_mask ","FL:D:/TempleOS/Compiler/CmpGlbls.CPP.Z,19"$0000000850 000D 0000000008 GlbVar -$LK,"uasm_mem_mask ","FL:D:/TempleOS/Compiler/CmpGlbls.CPP.Z,20"$0000000860 0003 0000000008 GlbVar -$LK,"uasm_signed_arg_mask ","FL:D:/TempleOS/Compiler/CmpGlbls.CPP.Z,19"$0000000858 0003 0000000008 GlbVar -$LK,"unary_ops_table ","FL:D:/TempleOS/Compiler/CmpGlbls.CPP.Z,7"$0000000798 0002 0000000008 GlbVar -$LK,"unasm_table ","FL:D:/TempleOS/Compiler/CmpGlbls.CPP.Z,18"$0000000840 0006 0000000008 GlbVar -$LK,"unasm_table_entries ","FL:D:/TempleOS/Compiler/CmpGlbls.CPP.Z,19"$0000000848 0003 0000000008 GlbVar -à 8Ñ~Ì~Ì”Ì›Ì£Ì®Ì®ÌÆÌÐÌÐÌèÌòÌ Í#Í9Í=ÍaÍvÍ}͙̀ͣͣͶ͸ÍËÍËÍÖÍáÍêÍïÍôÍûÍÎÎ'Î4Î8Î8ÎBÎ\Î`Î`ÎrΆΚΚΡάηÎÀÎËÎÖÎßÎêÎõÎõÎÏÏ"Ï"Ï+ÏZÏZÏbÏmÏ|τϒϙÏ�ϟϟϱϱϱÏÃÏËÏñÏñÏÿÏÿÏÐ Ð%ÐDÐOÐOÐhÐmÐ{ЇÐ�Ð�ШЬбжккÐÉÐÎÐÝÐßÐîÐðÐÿÐ -ÑÑ$Ñ,Ñ:ÑAÑEÑdÑoÑtђњѨѯѳѻÑÉÑÐÑÔÑøÑýÑÒÒÒÒÒ"ÒAÒkÒpÒ{ÒŽÒ“ÒžÒ£Ò¨Ò³Ò¿ÒÃÒËÒÐÒâÒçÒòÒòÒòÒòÒÓÓ8ÓHÓPÓoÓÓ©Ó­ÓäÓÊÓùÓùÓÔÔ+Ô:ÔBÔTÔ_ÔcÔhÔwÔԑԜԠԠԥԥԻԻÔÑÔÑÔÑÔÛÔïÔ ÕÕ9ÕqÕqÕÕƒÕ±Õ¸Õ¿ÕÎÕÎÕåÕêÕõÕÖ Ö Ö*Ö.Ö3ÖCÖKÖ]ÖhÖlÖlÖlÖlÖ‚Ö�Ö™Ö¡Ö³Ö¾ÖÂÖÂÖÇÖÌÖÐÖÐÖãÖèÖûÖ×××+×6×<×P×X×j×u×y×˜×£×¨×Æ×Î×à×ë×ï×÷× ØØØ@ØEØPØVØVØVØ_؀ؑذػػØÔØÙØäØÙ1Ù6ÙAÙTÙYÙdÙiÙnÙyÙ‰Ù�Ù•ÙšÙ¬Ù±Ù¼Ù¼Ù¼Ù¼ÙØÙ÷Ù÷ÙÚ Ú$Ú@Ú_Ú_ÚxڈڌڞڿÚÞÚýÚ!ÛEÛJÛUÛ]Û]ÛjÛ‹ÛªÛÉÛíÛÜÜ!Ü)Ü)Ü)ÜCÜUÜg܀ܯܾÜùÜÝÝÝ6Ý\Ý\Ý`ÝvÝ}݅ݬݷÝÝÝåÝåÝ Þ Þ"ÞIÞRÞkÞ�Þ¬ÞêÞøÞß+ß;ß;ßWßWßsßs߃ߛ߳ßÃßÃßÃßÓßäßüß à àà!à*à8à¡à£8Ñ                   ÈÊà€²€²Š²Œ²—²Ÿ²ª²µ²À²Â²Â²Ü²Ü²ð²ò²þ²³³ -³8³ ÊàP"©h¶h¶|¶‡¶’¶š¶£¶«¶®¶µ¶¹¶Â¶Ó¶×¶×¶Þ¶ì¶ ··&·+·7·9·M·@·]·h·n·n·|··‘·‘· ·¥·©·º·Æ·Ñ·Ü·ä·ì·ñ·ü·¸>¸6¸S¸^¸’¸¸§¸§¸§¸¹¸Ä¸Ú¸å¸ü¸¹¹1¹H¹_¹v¹v¹v¹¹ˆ¹Ž¹’¹—¹¢¹¯¹Æ¹Ö¹Ö¹î¹ÿ¹ÿ¹º"º.º6ºFºMºfºqº}º‚º�º‘º º«º´º»ºØºêº»».»5»9»>»P»Z»Z»e»t»ƒ»Ÿ»£»¨»?¼‘"© MÞ€L€L’L’L¥L­L»L»LßLêLðLýLýLM)M)M;MAMAMXMjMjM}M…MŠM’MšM M¸MËMÖMÚMäMùMÿMNNN$N$N+N/N3NANVNZNcNxN|N|N�N¤NªN®N·NÔNØNØNØNØNÝNïNþNO#O>OPO`OeOeOeOqOyO�O‡O‡OžO¦O¬O´OÂOÉOÕOîOðOøOP PPPPPPPPPPP"P*P0P0PGPOPSP[PiPoPoPoPƒP‰P•P›P¨PÃPËPÓPßPçPôPQQ0Q7QCQ\Q_QdQåR›MÞ =x¬x¬ˆ¬�¬–¬š¬¾¬Ñ¬Ù¬ê¬û¬­­(­*­5­F­Q­h­s­u­|­…­‡­’­™­£­»­ -*= (à"8³8³L³S³Z³b³e³e³t³}³€³ƒ³‡³Œ³¬³™³Á³Ë³Ó³Ö³á³î³ù³´´H´;´]´g´•´ˆ´ª´ª´»´Æ´Û´æ´ü´µµ/µEµ[µqµqµqµqµzµƒµ‰µŒµ�µ�µ·µÈµÓµÛµa¶ Là" ¸Y­ÂÂÂ%Â0ÂFÂXÂjÂ|Ž ­­²¹¹ÂÏÂáÂæÂøÂÃÃ%Ã4ÃAÃAÃAÃaÃaÃwÉÃ�Ã�ÛêïïööÃÌÃÝÃßÃßÃõÃ Ä Ä Ä#Ä.Ä.ÄDÄ[ÄjĄēİĿÄÜÄëÄÅÅ5ÅDÅUÅWÅmÅtÅŠÅŠÅŠÅ©Å©ÅÆÅÆÅãÅãÅeÆ^Y­¨M D D0D0DMDMDkDoDtDtDtDtD€D…D•DšDšDšDŸDŸDµD¼DÏDÝDæDöDÿDEEEEEEEE$E+E2E9E@E@EBEBEHEME}L<M ¹Ê²²²²&²0²;²C²R²\²_²a²q²q²}²¹ÊPZ�À®À®Ò®Ù®à®î®õ®ú®¯¯¯"¯(¯8¯C¯M¯X¯X¯o¯r¯t¯†¯Œ¯œ¯¦¯°¯·¯Â¯×¯ß¯ß¯õ¯õ¯ °1Z�P�¨°°"°)°0°>°E°J°W°i°k°r°x°ˆ°“°�°¨°¨°¿°Â°Ä°Ö°Ý°í°÷°±±±'±/±/±E±E±Z±1�¨=ZÀ­À­Õ­Ü­ã­ê­ð­® ®® ® ®7®:®<®W®a®k®r®}®�®—®—®­®­®¿®'=Z ¨¹`±`±{±‚±�±—±¢±ª±¹±Ã±Æ±Ú±Þ±ò±ò±²¨¹`­6hÆhƉÆ�Æ�ƩƵÆÀÆÀÆÉÆ÷ÆùÆÇ0Ç2ÇMÇ[Ç[ÇdÇkÇwÇ�LjÇ�ǓǕǜǨDzǹÇÀÇÄÇÄÇÑÇáÇáÇêÇÈÈ#ÈQÈtȂȋȒȞȨȯȶȺȼÈÃÈÏÈÙÈàÈçÈëÈëÈøÈÉ)ÉPÉ^ÉeÉpÉpÉyɧɩɲÉàÉéÉðÉüÉÊ ÊÊÊÊ!Ê-Ê7Ê>ÊEÊIÊIÊTÊwʞʬʳʾʾÊÇÊõÊ÷ÊË.Ë7ËBËNËXË_ËfËjËlËsËˉË�˗˛˛˥ËÀËÛËéËíËíËðËùËvÌ“­6ø˜«˜«È«Ô«Ü«ä«è«ì«ð«ô«ø«ü«¬ ¬¬¬'¬:¬A¬K¬K¬M¬W¬^¬e¬e¬w¬& ÀPeàžàžòžøžøžŸ -Ÿ -Ÿ1Ÿ8ŸAŸJŸTŸbŸmŸsŸ}Ÿ Pe!øe�€Ÿ€Ÿ”Ÿ›Ÿ¤Ÿ©Ÿ¬Ÿ¯Ÿ»ŸÐŸ×ŸÞŸåŸèŸóŸöŸ    M S Z Z j "&e�# �þà à ¡¡¡¡¡¡ ¡*¡7¡A¡G¡G¡R¡\¡f¡s¡}¡ƒ¡ƒ¡Ž¡˜¡¢¡¯¡¹¡¿¡¿¡Ê¡Ú¡ä¡ñ¡û¡¢¢ ¢¢(¢5¢?¢E¢E¢P¢V¢`¢m¢w¢}¢}¢ˆ¢�¢š¢§¢±¢·¢·¢·¢Á¢Î¢Ø¢ã¢÷¢£££#£7£A£N£X£c£z£z£�£££££­£º£Ä£Ï£æ£ð£¤ -¤ -¤¤¤-¤5¤C¤U¤e¤w¤…¤…¤“¤“¤¶¥${�þ%È  @œ@œLœSœXœaœiœwœŠœ–œ­œºœºœ½œËœÛœòœöœþœ&   '�Ñà š š®š²š¹š¿šÆšÉšÐšÛšßšâšìš(Ñà)€òÿ¨›¨›¸›¿›Ä›Í›×›á›á›ä›è›ð›*òÿ+(ް°˜°˜Ð˜×˜Þ˜æ˜ï˜ó˜÷˜™ ™™™"™&™-™7™7™G™N™W™f™m™t™�™ˆ™–™�™¤™´™,,ް-X½Å(š(š2š6š:šBšRšXš.½Å/x��p p ~ Š ™ Ÿ ¦ ® Ê Ï Ù 0��1X G����� �#�4�4�;�?�G�P�i�w�y�y�‚�„�„�������˜�š�š�£�£�¬�²�µ�¿�Õ�Û�é�é��ž22 G3hÿ ð›ð›œ œœœ+œ/œ2œ:œ4ÿ 5€°½¸™¸™Ä™Î™Ý™ä™ì™ô™ü™ššš$š6°½7`éòP›P›Z›a›}›�›•›››¡›8éò9`GP�ž�žšž¡ž½žÁžÕžØžÞž:GP;`àéðšðšúš›(›/›@›G›M›<àé=xÅÑXšXšbšošvšššŒš“š•š›š>ÅÑ?à(‘(‘2‘<‘G‘^‘^‘c‘e‘q‘{‘Œ‘Œ‘ž‘ ‘°‘°‘µ‘·‘¾‘í‘@#APGŽè”è”ô”ø”!•• •1•>•H•R•R•i•p•p•‡•ޕޕ¥•¬•µ•µ•ǕǕؕؕé•é•ú•ú• – –––-–-–>–>–O–O–`–`–q–q–‚–‚–“–“–¤–¤–µ–µ–Æ–Æ–×–×–è–è–ú–——!—/—@—C—E—W—^—^—¯˜BQGŽC€Gð‘ð‘ù‘ù‘ ’’’A’Q’C’r’Œ’Œ’–’›’›’¯’´’´’Ð’Õ’Õ’õ’ú’ú’““““0“0“B“f“Œ“£“¯“»“Ǔѓѓѓã”D7GE@&+@:J:R:W:F&+Gzð�ð���*�J�J�\�t�t���°�¹�Á�Å�Ë�Õ�Û�ë�ñ�û�‘‘‘ ‘ ‘‘‘"‘(‘/‘5‘9‘>‘H‘H‘Z‘a‘h‘j‘n‘w‘�‘„‘ˆ‘�‘�‘“‘ž‘¤‘«‘´‘Í‘é‘ò‘û‘’’’’!’+’2’9’;’B’I’N’R’_’f’u’ƒ’�’—’ ’¹’Õ’Þ’ç’ï’ø’þ’““ ““ “-“7“A“J“c““ˆ“‘“™“¢“¨“¬“±“·“ȓғғî“ý“””&”4”B”i”]”ˆ”¤”­”­”Ȕܔܔý”••••'•0•9•_•c•®•H¨zI°¹ÌÀˆÀˆåˆçˆçˆûˆ ‰‰-‰@‰O‰^‰l‰l‰w‰z‰·‰J¹ÌK¸îv3v3ˆ3œ3¢3¨3¶3Ç3Õ3ã3ñ34 44$4'414LîMH�Â�žµ½½ÂÃÂNOp(ÈÂÈÂÜÂðÂ÷ÂÃÃ0Ã8Ã@Ã@ÃHÃP(Q8Eéèyèyôyôyzz$z4zDzWzjzwz†z›z±z±zÆzÈzÝzßzôzôz {'{,{8{D{P{\{h{t{€{Œ{›{ª{¹{È{×{æ{õ{õ{|||#|,|D|I|Y|d|o|w|€|˜|�|­|½|È|Ó|Û|ä|ü|}}})}.}=}D}O}Z}e}p}{}†}‘}œ}§}²}½}È}Ó}Ó}â}é}ô}ÿ} -~~ ~+~6~A~A~P~W~b~m~m~|~ƒ~�~—~¡~«~µ~µ~Ä~Ë~Õ~ß~é~ó~ý~%/9CMWaku‰“�§±»ÅÏÙãí÷€ €4€R®EéS(8z����¨�³�³�·�À�Ç�Ñ�Þ�Þ�ô�ù�ù�ŽŽŽ+Ž-Ž-ŽDŽFŽFŽZŽ\Ž\ŽpŽrŽrŽˆŽŠŽŠŽ Ž Ž§Ž«Ž¯Ž´Ž¸ŽÅŽÈŽÖŽÖŽåŽùŽ����7�9�Q�S�m�q�����›�ë�TL8zUxÌ8¸‰¸‰Ò‰Õ‰Õ‰Ù‰â‰é‰ö‰ö‰ ŠŠŠ'Š,Š,ŠCŠEŠEŠ\Š^Š^ŠrŠtŠtŠˆŠŠŠŠŠ Š¢Š¢Š¸Š¸Š¿ŠÊÌŠÙŠàŠéŠðŠôŠ‹‹‹‹‹‹0‹=‹E‹M‹R‹i‹{‹†‹š‹À‹׋Ü‹ã‹ê‹î‹î‹ŒŒŒ Œ Œ2ŒEŒGŒGŒRŒ^Œ^Œ^ŒxŒzŒ•Œ—Œ¯Œ±ŒËŒËŒËŒÔŒÚŒÞŒêŒ �� ���VvÌ8WÀ¨½€›€›„›š›¡›¹››Í›Ø›ã›ê›ï›ô› œœ#œ2œ7œ9œX ¨½Y<¹ ‚ ‚$‚3‚7‚F‚U‚d‚s‚…‚”‚¡‚¹‚Ë‚í‚ ƒƒ7ƒIƒaƒzƒ–ƒ¨ƒƒʃ샄„+„:„:„J„]„n„}„�„š„¥„´„ԄԄ݄݄݄ð„ý„…$…1…T…r…{…ˆ…Œ…”…Ÿ…·…Ï…Ø…è…ð…õ…†.†>†N†Y†i†n†v†–†˜†£†Іä†ä†ü† ‡‡"‡+‡3‡3‡E‡j‡r‡z‡…‡‡‡—‡¯‡LJ߇÷‡ˆ!ˆ3ˆEˆWˆiˆrˆ{ˆ�ˆ›ˆŸˆÀˆZ‡<¹[P ÞEèRèRìRýRS S0SASRScStS…S–S§S¸SÉSÚSëSüS TT/T@TQTbTsT„T•T¦T·TÈTÙTêTûT UU.U?UPUaUrUƒU”U¥U½U¶UÎUÇUßUØUðUéUVúU VV-VEV>VOV`VqV‚V“V¤VµVÆV×VèVùV -WW,W=WNW_WpW�W’W£W´WÅWÖWçWøW XX+XâGâGâ[âaâaâiâqâ|â�â“â â¤â³âµâ¹âÈâÈâÈâÙâÙâÞâòâúâúâ|ãlVÑm804p:z:‚:‡:n04opALP—P—e—t—ˆ—•—›—¡—¤—Å—pALqpu€x™x™�™œ™°™½™Ùə̙í™ru€sp�¨›››,›@›M›S›Y›\›}›t�¨u`8A———-—:—@—C—K—v8Aw`lu0™0™B™U™b™h™k™s™xluyh“�ÀšÀšÒšåšòšøšûš›z“�{8°•°•´•¸•¸•Í•è•è•û•–9–[–j–s–€–‡–—–¤–½–Ê–ΖÖ–Ö–Ö–é–é–ù–ý–—|*8}LlÈ—È—Ì—ЗЗå—˜˜˜*˜a˜ƒ˜’˜›˜¨˜¯˜¿˜̘å˜ò˜ö˜þ˜þ˜þ˜™™!™%™)™~*Ll°€“ð™ð™ š šš.š.š8šOšlšŠš�š™š§š­š°š¼š€€“�pf4f4r4~4ƒ4Œ4’4–4¡4‚ƒ@ty”X”X�X£X¨X„ty…@6464D4Y4_4†‡@¨9±9Î9Ó9ˆ‰X)¸¥¸¥Â¥Í¥Ü¥ã¥ë¥ó¥û¥¦ ¦¦ ¦(¦3¦=¦E¦N¦S¦b¦g¦p¦p¦€¦�¦”¦›¦ ¦¨¦ª¦¹¦¾¦¾¦þ¦þ¦§§§ §Š2)‹Hg¨¨¨,¨,¨:¨:¨:¨:¨C¨C¨J¨q¨y¨y¨„¨„¨’¨¢¨¢¨°¨¶¨¶¨Î¨Î¨Ô¨l©Œ)Hg�PgŽp©p©|©…©…©˜©¥©±©½©É©Õ©à©ì©ø©ø©ªªª$ª-ªRªWªjªzª†ª†ªœªœªÅªÅªÇªÚªÜªöª««%«Ž1gŽ�)H § §6§@§M§[§d§q§q§§§–§Ÿ§°§²§µ§·§Ê§Ï§ß§ê§ê§ê§í§õ§ú§¨�))H‘ ŽŸ(«(«6«8«8«A«J«X«]«f«i«n«|«†«“«’ŽŸ“гjƮƮø®¯ ¯¯%¯2¯G¯J¯M¯Q¯Z¯Z¯h¯r¯w¯†¯¯¯´¯ůñ¯ö¯°'°,°;°g°o°t°‰°µ°½°°°á°ü° ±±0±0±C±H±[±o±‹±�±•±•±®±®±®±®±®±¾±Ó±Ö±Ù±ݱݱâ±ñ±² ²(²9²A²`²r²€²‹² ² ² ²­²IJƲƲƲÓ²ê²ì²ì²ù²³³³*³*³=³B³U³i³…³г�³˜³¯³Á³Á³Ô³é³é³é³ö³ ´´´´´3´5´5´B´Y´Y´`´s´s´†´ˆ´›´¨´Ä´É´Ñ´Ö´â´ü´µµ!µ6µ6µ6µCµZµ\µ\µiµ€µ€µ‡µšµšµ­µ²µŵٵ൶#¶(¶/¶=¶J¶O¶O¶O¶k¶s¶x¶x¶š¶|·”Á³j• r³f«f«Œ«�«’«˜«�«´«Ë«â«ô«¬A¬D¬]¬t¬t¬‡¬”¬§¬¯¬¬¬׬ܬñ¬­"­'­,­4­>­F­F­M­V­V­V­a­‰­£­©­­Û­Ý­÷­ý­®/®7®7®B®B®L®L®_®�®²®Ä®–Kr³—£â>�>�W�y�‚�¿�Ë�æ�÷� ŽŽQŽ]ŽwŽ…Ž™Ž�Ž�ޡަެ޵ޏŽÂŽÏŽìŽïŽïŽïŽôŽúŽúŽ�#�.�6�J�Q�Z�Z�u�€�‹�“�¤�¤�³�¸�¸�Ä�˜I£â™ø -^ ††´¿ôÌúú)..2<Hcjxz‚œ¸¸ËØð÷ - -"5Iejov›¢«­²Æããö"55JLan‹�¬°°»ÂÔ×ÙÞû-?BDIfffyy‡‘²ÎÎÓ×óÿÿ8BFZn…‡‡š®¸ÎÒèü(2FPYpz|�š°´´´¿ÆÚòô  7 < < O W x Ž Ž Ž ³ ³ Å š¦ -^ ›ê  NN^eq�¡¦­ÍÏïû +077?FQYdo�—œ'ê  �`ÁjN<N<h<l<~<„<‹<’<”<—<ž<¥<¥<Á<Å<Ë<Ë<ã<÷<===4=T=T=u=z=›= =¬=·=¼=É=Ì=>>> >!>'>*>;>@>C>K>T>o>�>¦>¹>¾>Â>ä>÷>ü>?&?+?/?Q?l?Œ?Ÿ?¤?µ?º?½?¿?Å?Ë?Ü?á?ç?ï?ï?ù?@@,@1@5@W@r@’@¥@ª@Å@å@ü@AAA:AMAMAcAcAcAqA‰A‹A‹A‹A™A±A³A³AÁAÙAÙAáAõAõA BB"B/BLBRBRB[B[BcBoB|B™B©B°B»BÑBÕBÕBÕBôBÿBC C&C1CICNCTCnCuC€CŽC™C™CÛCž³ÁjŸÐ°Ç&_&_8_D_Z_g_q_€_™_�_£_Â_¶_Ó_Õ_Õ_`ô_Õ_%`/` !°Ç¡¨jœÞCÞCîC DùC3D@DLDRDŒD‘D½D½DÂDØDêDêDE!ETETEcE›E‡E¶E¶EÃEïEôEF F(FDF0F_FxFdF˜F„F¬F¬F¹FåFåFåFåFíF¢<jœ£h]‡>->-V-a-l-x-ƒ-…-®-´-´-Û-Û-è-.Z.T.,.r.’.ª.—.½.¶.Ü.É.ð.ð.ý.(/]/W///i/z/z/z/†/¤4]‡¥È\ ’ .!.!D!P!`!e!q!„!‰!•!¿!Û!è!ÿ! """3"5"J"W"t"y"„"†"¥"­"­"­"½"²"Ï"ß"ä"#÷"#$##6#B#G#h#]#z#„#¦@\ ’ §èâ \ NNp�˜£²»¿ÊÕêï (.3F•›£¦«¾ë27Tsy��†Œ�š¥º¿Ùøþ#,1PX]h}†ˆ§¯ºÏÔî      % - - B B g r … ’ ² Æ Í à à ó ø   7 < F K _ f y y Œ ‘ ¤ ¸ Ô Ù Ù â í í !!!,!¨„â \ ©ÐœSîFîFGGG'G2GwGžG¼GæGìGòGúGüGH H"H-H9H~H¥HÃHíHóHùHIII)I,I7ICIHI�I´IÒIüIJJJJJ5J8JCJOJœJÃJáJ KKK K$K,KGKJKUKaKaKfKlKrKzK‚K�KŸK®KàK -LLL'L6LpLšL L¨L­L¿LÎLM2M8M=MOM^M˜MÂMÈMÍMÍMÍMÙMÙMîMîMùM8NCNHN[NrNwN¶NÁNÆNÙNæNO(O/OFOFOcOhO…O™O½OÂOÐOÕOéOðOPP$P)PFPZP~PƒPƒPƒPŒP�PœP¥P»PÇPÇPÔPîPòPòPòPQ Q%Q8Q8QIQ`QeQjQ}Q}QŽQ›Q¥Q¥Q·QªÁœS«Ð_v^ž^žbžbžužuž�ž–ž¢ž¢ž¹ž¹žООçžçžþžþžŸŸŸŸ¬!_v­Øj â ff„ŽÁÐæ -$3:CH]n�•—¶¾ÍÔàåìôúü ?EEMMVe„‹�¬³³³ÇÝáïú *19?AM]bd„ŠŠ–¦«°ÐÖÛç÷üþ$+39;GW\^~„„„ŒŒ••ŸŸ·çý"::L®‚j â ¯ð‡b†/†/ /¨/¬/º/º/¾/ä/ï/÷/ÿ/000!0S0^0s0ˆ0�0•0›0Ÿ0£0²0º0Ä0Í0ß0ô011181B1Q1Y1f1k1v1�1ƒ1¢1¨1±1¼1Ä1Ì1Ü1ä1ì122222>2F2K2K2U2d2„2Œ2Ž2®2¶2¶2¶2Á2Ê2Þ2æ2ï2ï2ô2ø2ü2333+3G3a3€3ƒ3˜3¥3¹3Á3Ô3Ô3é3ë34 4*4/434?4d4„4–4µ4»4½4Ü4ß4ß4ò4ÿ455-5-5B5G5\5i5†5‹5‹5–5š5¥5°5»5Æ5È5ç5ê5õ566$6*6/6:6E6G6f6i6t66„6£6©6©6©6³6³6¾6ï6ï6ú6ú6ú67 77$7A7Q7X7^7j7q7‹7�7�7�7²7²7½7Â7Ü7ã7í7ù7888!8;8B8L8\8f8s8}8}8ª8ª8¼8°å‡b±(H j VVfr‚¡§Æåö-L^}ƒ�’±ÐÜô  (3>]e²,H j ³À%Zž’ž’Æ’É’Î’Î’Ü’á’ó’õ’ù’ý’““,“N“W“b“i“‚“¤“©““ä“é“ð“ ”+”-”F”h”h”h”v””�”«”É”é”锕•$•´?%Zµ¨`r®ª®ª¾ª˪˪ÚªÚªæªìª«,««C«8«[«[«c«¶`r·p2]++(+,+:+:+I+T+`+k+m+—+œ+œ+¾+ -,î+Å+,,1,W,\,h,s,u,Ÿ,¤,¤,·,ì,ç,¾,÷,--+-+-9-¸52]¹°f -y -¶ý¶ýÄýËýêý þ þ*þIþXþ`þkþmþxþƒþ¢þ¨þºf -y -»Èy -¯ -®þ®þÃþÎþÕþÿ!ÿ#ÿBÿoÿ~ÿ†ÿ‘ÿ“ÿžÿ©ÿ©ÿ®ÿÛÿàÿ 8Wbdƒ¢¢½ÌÔßáì÷÷44AAe†††Ž¼@y -¯ -½Hå -ŽöŽö¨ö¹öÅöÜöãöüöôö÷4÷ ÷@÷Q÷V÷w÷c÷�÷ ÷·÷¾÷×÷Ï÷ï÷øû÷ø,øBø.øZøgøgøøø‰ø¾0å -¿Xs›ŽÍŽÍ¨ÍºÍÁÍÉÍÉÍØÍÝÍüÍüÍÎ Î%Î,Î,Î;Î=Î\Î\Î{Î�Î}ΜΜΫέÎÌÎÌÎÌÎÌÎÛÎôÎíÎ ÏÏÀ2s›ÁÐ"9 ~ã~ã”ã˜ã«ã³ãºãÁãÅãÇãÎãÕãÙãÙãáãúãäää#ä1äBäFäKäVägäxä�ä“äœä ä¥ä¶äÈäÓäÙäáäõäúäå&å*å*å*å/å]åråyåŠåŽå“åžå¯åÀå×åßåäåèåíåþåæææ2æ4æOæ`ædædædæoæ€æ‘æ¨æ¬æµæ¹æ¾æÏæáæìæòæúæçç.ç?çCçCçTçTçTçYçYçhçjç‹ç‹ç¬ç·ç½çÑçâçççüçèè)è@èDèMèQèVègèyè€è†èŽè¢è¤è¿èÐèÔèÔèÛèìèðèðèééé'é8éOéWé\é`éeévéŒé”éšé®é³éÎéßéãéãéõéõéõéõéêúéêê*ê,êMêXê^êrêƒêƒêƒêŠêŠê�ê¼ê¼ê¼êËêËêÞêýêëëë$ë.ë0ë<ë<ëGëRë]ëzëëŠë§ë³ëµëÀëÌëÜëçëòëì ììììì#ì'ì;ì=ìBìJìNìPìPìYìaìmìzì—ì§ì®ì¸ìÄìËìåìéìéìéì í ííí6í=íGíSí]ítíyí~í˜íŸí©í¹íÃíÐíÚíÚíìíÂ!"9 ØÁñÖ»Ö»ü»ÿ»¼¼¼¼&¼0¼0¼D¼O¼V¼c¼p¼ƒ¼�¼Ÿ¼¥¼§¼®¼´¼¾¼¾¼ͼϼÖ¼ܼæ¼æ¼æ¼ÿ¼½½½)½+½=½L½L½^½Ä:ÁñÅðñ ^½^½„½‡½޽˜½¢½¤½®½¸½¿½̽Ù½ì½ù½¾¾¾¾ ¾/¾A¾P¾n¾€¾Æ%ñ ÇØÍ å NõNõhõtõŠõ¨õ¹õÀõÙõÑõñõöýõö.ö0öQö=öiöiö�ö�ö‹öÈ"Í å É?]nÀnÀ‚À”À›À›À£ÀÂÀÇÀæÀëÀÁòÀ$ÁÁ0ÁEÁ2ÁdÁQÁpÁpÁ‚Á‚Á‰Á¨Á¨Á°ÁÊ(?]Ë0›ÞÏÏ*Ï<ÏGÏoÏNÏ{Ï{Ï�ÏÊÏ©ÏÖÏÖÏôÏôÏÐ(ÐÐUÐ4ÐaÐaÐÐББЯЯÐÜÐÜÐéÐ"Ñ'Ñ.Ñ\ÑMÑhÑhÑŠÑšÑÌѹÑçÑØÑóÑóÑÒ-ÒÒ9ÒgÒXÒsÒsÒ‘Ò‘Ò£Ò£ÒÁÒÜÒÜÒéÒÓÓÓÓÌM›ÞÍX¥ Í óó0óAóMócó�óˆó¡ó™ó¹óÙóÅóåóöóûóôô4ôEô[ôyô€ô™ô‘ô±ôÑô½ôÝôîôðôõýô)õ)õAõAõKõÎ2¥ Í ÏP¬s¦Ä¦ÄÈÄÛÄãÄêÄñÄ÷ÄùÄÅÅ -Å -Å -ÅÅÅ/Å:ÅEÅVÅgÅ~ņÅ�ŗŜŭÅÃÅËÅÓÅåÅêÅÆÆ Æ Æ%ÆQÆfÆqƂƓƪƲƻÆÃÆÈÆÙÆëÆóÆûÆ ÇÇ)ÇAÇEÇEÇPÇaÇrljǑǚǢǧǸÇÎÇÖÇÞÇðÇõÇÈ'È+È+È>È>È>ÈVÈCÈvÈcȃÈ�ȕȭÈÅÈÊÈßÈêÈûÈ É#É+É4É<ÉAÉRÉdÉlÉtɆɈɢɺɾɾÉÉÉÚÉëÉÊ -ÊÊÊ Ê1ÊGÊOÊWÊiÊnʈʠʤʤʷʷʷÊÏʼÊïÊÜÊüÊËË&Ë>Ë>Ë>ËJËPË[ËfË€Ë�˧˾ËÕËìËìËÌ"Ì"Ì"Ì:Ì:ÌHÌJÌJÌXÌXÌaÌlÌz̤̫̫̿̕ÌÄÌÄÌçÌòÌÍ&ÍAÍAÍ‹ÍÐѬsÑ8 -Þ"ÓÓ0Ó7Ó>ÓIÓQÓjÓjÓÓÓ•Ó•Ó¡Ó¥Ó°ÓÜÓ»ÓéÓÔÔ'Ô+Ô0Ô0ÔFÔWÔnÔ…ÔŽÔ–ÔšÔŸÔÇÔßÔãÔãÔôÔ5ÕÕBÕBÕdÕdÕ„Õ�Õ–Õ®Õ½ÕÂÕÂÕØÕéÕÖÖ Ö(Ö,Ö.ÖVÖnÖrÖ}ÖŽÖŸÖ¶ÖºÖ¿ÖÃÖÈÖÙÖïÖõÖûÖ××.×=×A×A×T×T×T×T×Y׌×y׺י×Ç×Ç×é×õ×ûר"Ø'Ø2ØCØTØkØoØtØxØ}؎ؠئجØÀØÂØÜØëØïØïØïØ ÙÙ1ÙHÙQÙYÙ]Ù_هٟ٣٣ٰٰٰٰÙÇÙÍÙØÙßÙßÙóÙÚÚ"Ú"Ú0Ú2Ú2Ú@Ú@ÚYÚjÚ€Ú Ú Ú´Ú¹Ú¹ÚÜÚçÚ -ÛÛ*Û9ÛXÛPÛ~Û¨Û¨Û¨ÛµÛïÛôÛôÛÜ ÜÜ4ÜSÜCÜ`Üw܆ܟܷܻÜÌÜìÜÝ Ý)Ý)ÝKÝKÝkÝwÝ}ݕݤݩÝÀÝØÝÜÝçÝüÝÞ(Þ,Þ1Þ5Þ:ÞOÞeÞkÞqÞ…ÞŠÞ¤Þ³Þ·Þ·ÞÊÞÊÞÊÞÊÞÏÞßïÞß?ß/ßLßLßnßz߀ߘߧ߬߷ßÌßáßøßüßàà -à à5à;àAàUàZàtàƒà‡à‡à§à¾àÖàÚàÚàçàçàçàá áá"á"á:áYáYáYápápá~áƒáƒá‘á‘áªá»áÕá÷á÷á âââ7âFâiâzâ‰â‰â¯âÌâÌâÙâúâúâúâ|ãÒNÞ"ÓøO k þîþîï@ï#ïLïLïYïlï…ï~ï�ïµï¢ïÈïÁïÔïÔïáïôï ðððð&ðEðEðOðÔ&O k Õ�]¬¶Á¶ÁÖÁîÁ ÂõÁ)ÂÂ5ÂKÂ7ÂkÂWÂwƒˆ”¤«¸ÂÃÂÏÂÚÂâÂçÂóÂøÂ ÃÃÃ"Ã'Ã2ÃKÃTÃ`ÃeÃyÀÄÄÉÉßäýÃÒÃáÃæÃñÃùÃùÃùÃûÃÄ)Ä4Ä>ÄIÄKÄVÄ^Ä^ÄkÄcăģÄÖY]¬×È9 O îíîíî,îî8îQîJîiî~îkî‘îŠî�î¶î¯îÂîÂîÏîîîîîøîØ 9 O ÙÐ -" -ŽøŽø¨ø´øËøÜøãøüøôøù4ù ù@ùQùgùSùùŒùŒù¤ù¤ù®ùÚ! -" -Û˜Õ å &&0&B&B&I&h&h&z&Ž&œ&•&´&´&¾&ÜÕ å ݰ ?†¾†¾¤¾«¾¶¾¶¾̾̾Þ¾é¾ô¾¿¿-¿1¿6¿:¿<¿M¿_¿e¿k¿}¿¿˜¿§¿«¿«¿«¿¾¿Ù¿Ù¿å¿ë¿õ¿ÀÀÀÀ$À&ÀBÀ\À\ÀnÀÞ= ?ßø‡£–Œ–Œ¬Œ¶Œ¶ŒÆŒÏŒÒŒØŒØŒâŒûŒûŒ �����$�+�-�-�-�7�à&‡£áp5`v¨v¨¤¨¾¨¾¨ѨÕ¨ô¨û¨©©!©&©9©M©i©n©s©s©€©ˆ©�©¥©±©©Ç©Ø©ì©ñ©ó© ª$ª&ª&ª?ªWªWª©ªâ55`ãèÃý¶U¶UÌUØUãUøUýUVV -V V V,V1VFVKVUVXV\VuVaV�V‡VŒV¡V¦V¬V¯V³VÉVµVÕVÛVðVõVûVþVWWW$W)W)W)WIWaWŒW¤WÏWÝWäDÃýåxMYvfvffŠf•f f«fµfÓfÞféfîfæMYçHY¿îfîfgg)g5gXgEgwgdgƒg˜g…g·g¤gÃgÃgÔgÖgçgégögûgh hhh/h/hBhUhZhZhmh€h‚h‚h•h¨hªhªh½hÐhÐhÝhóhâhÿhi -i$ii0i>iKiXieiqiqi|i�i�i°i�iÏi¼iîiÛiúi j.jjMj:jljYjxj�jzj¬j™jËj¸j×jéjâjüjõjkkkkjkèpY¿é(¿nknk†k�k™kÆk×kÝkÝkîkðkllll.llKl:lWlilblul}l‚lŽl±lžlÐl½lïlÜlûl m/mmNm;mmmZmymŽm{m­mšmÌm¹mØmêmãmýmöm nnn+n8nCnCnCncnšnêL¿ëXýEÞWÞWöWüWXX!X'X*X.X.XNXSX‰XuX•X®XšXºXÓX¿XßXêXïXùXüXYYY -Y*Y*Y*Y/YDYIYOYRYVYVYvY{Y±Y�Y½YÖYÂYâYøYäYZZZZZ!Z#ZûYû_ûnûƒû…û�û˜û³û¸ûÁûÍûÕûàûçûü3ü5üTü�ü�ü‰ü¶ü»üÂüáüýý!ý@ý[ýcý~ý~ý~ýªýªý¶ýøN" -f -ùÍ ê ÞÞìø">Kbn��–˜­º×Üçé.'FLú'Í ê ûè.H¾ˆ¾ˆ͈Òˆæˆïˆÿˆ‰+‰C‰H‰\‰e‰u‰‘‰¡‰±‰³‰Ɖىىى߉ü$.HýhU_žžž#ž)ž-ž1žPžXžþU_ÿÐÇÞ6`6`H`T`j`w`{`Š`©`­`³`Ò`Æ`ã`å`å`aaå`5a?a!ÇÞ ' žž°¶½ÉÙùþ%'GScƒˆ���•˜œ¤¼ÇÒòü* ' ð$?FœFœfœœœ‰œŽœŽœŽœ­œºœ¼œ¼œ¼œ¼œÉœÑœäœøœúœúœ���Q�%$?€?LV�V�`�j�s�s�’�Ÿ�Ÿ�¢�¤�ª�?LX -2Ö(Ö(ð(û()4))L)S)¢)‚)Z)È)Í)ö)û)*.*3*5*T*Z*v*g*Ž*•*Ò*Ä*œ*æ*è*ÿ*ÿ*ÿ* +2 -2 @å -¾&¾&Ø&ã&î&D'$'ü&j'l'•'•'¢'Û'à'ì'÷'ù'((%(b(T(,(v(x(�(�(œ(Ã(Ã(Ã(Ñ( -/å - ’ ± †#†#–#�#¯#·#Â#Â#Ñ#Ñ#å#ò#ý#$"$"$1$9$D$L$W$b$m$x$ƒ$Ž$Ž$ $ $¨$ )’ ±  Hñ&š&šFš_š_š_š~šŽš“š“š¢š´šΚ֚ݚߚòšúšúšúšüšüšüšüš››››#›%›%›%›8›C›ç›0ñ€$î›î›ø›œ œ œ(œ5œ5œ8œ:œ@œ$ˆSa¾Q¾QÎQÎQÞQôQàQRRR&R.RSa`aŠ.R.R@RKR`ReRzRgR†RŒRŒRœR´R¡RÀRÃRÈRÞRãRøRåRSSSS,SS8S>S>SQSdSwSŠS�S§S3aŠ`г®S®SÀSËSàSåSúSçST T TT4T!T@TCTHT^TcTxTeT„T‡T‡T—T¬T™T¸T¾T¾TÑTäT÷T -UU'U3г˜³Ã.U.U>U>UNUdUPUpUrU…U˜U£U®U¶U³Ãˆ .6ˆ6ˆEˆJˆ^ˆgˆwˆ“ˆ£ˆ¸ˆ¸ˆ¸ˆ¾ˆ .(^ € Æ Æ ð õ  - -% -3 -7 -7 -@ -@ -E -Y -Y -ƒ -ˆ -¬ -´ -¹ -À -Ô -ì -î -   0 J \ ,^ € 8€ Ä ^ ^ Œ ¢ ª µ ¼ à Ì Î Ñ ï ö    5 < E G J h h h v € � � ­ ¯ É Ñ Ñ í    + 2 M O V q …   £ « ¸ ¸ Ø Ú ô ü ü 33YYkN€ Ä  @Ìñ^˜^˜~˜’˜�˜²˜јܘñ˜ñ˜ñ˜þ˜™™™™%™=™?™?™Q™^™v™v™}™�™�™£™¥™¸™Å™á™æ™æ™"š /Ìñ!PEL–Z–Z½ZªZÉZØZàZ"EL#ÐjÁ~·~·¢·¯·²·¹·¿·Ö·í·¸G¸c¸}¸‚¸‡¸’¸©¸©¸¼¸ɸܸä¸÷¸÷¸ ¹¹#¹0¹M¹R¹f¹k¹v¹–¹›¹ž¹¸¹Ò¹Ú¹â¹ç¹ºº#º+º0ºJºRºWºwº|ºº™º³º»ºúźߺùº» » »%»-»-»2»7»B»B»M»M»Y»Y»l»¬»»»Ò»$ajÁ%èv°¦\¦\¸\Ä\Ï\Ô\à\ë\ð\÷\ü\ü\] ] ]+]J]L]Q]Q]\]a]a]€]Ÿ]¼]¼]Ï]â]õ]^ ^ ^ ^3^F^Y^^^^^q^„^—^ª^¬^¬^¿^Ò^å^ø^ø^"_&Dv°'ÐöMNbNblbpb|b‡b�b�b–b¶b»bÑbébÕbõbc:F:X:c:c:o:…:‹:‹:‹:¦:«:°:Â:Â:Î:å:ç:ì:þ:þ: -;;!;!;1;*Eb�+�Æ Õ ž%ž%®%º%Å%Û%Ç%ç%é%ð%û%&&,Æ Õ -@Á Æ ^%^%r%“%›%.Á Æ /@¼ Á %%2%S%[%0¼ Á 1p± ¼ ®$®$Ï$¼$Û$æ$ñ$ü$%%%2± ¼ 3�HWæ‰æ‰ï‰Š ŠŠ8ŠLŠ`ŠbŠyŠ�Š�Š•Š4HW5 Wh–Š–ŠŸŠ³Š¼ŠÌŠèŠüŠ‹$‹&‹=‹T‹k‹k‹p‹6Wh7˜hxv‹v‹†‹š‹£‹³‹Ï‹Þ‹à‹ï‹ò‹÷‹ÿ‹8hx9�x‡ŒŒŒ*Œ3ŒCŒ_ŒnŒŒ‚Œ‡Œ�Œ:x‡;x ®‡®‡½‡чڇꇈˆ+ˆ+ˆ1ˆ< =`Ä Í nn•‚¡·°Ï×>Ä Í ?ØÞöFaFaXadaza‡a‹aša³a·a½aÜaÐaíaïaïa bbïa?bIb@"ÞöA ' H þþ'GLSsu•§ÇÌÓÓÛâíø)IQB+' H C8�Á6;6;R;U;U;];];a;h;p;‚;Œ;Œ;—;©;¯;¯;¯;Ê;Ï;Ô;â;â;í;<< -<<<#<0<8<8<H<D.�ÁE`LU®�®�¼�Â�Æ�å�žž žFLUG°8K˜:˜:¢:¬:¾:Å:Ï:Ï:ã:è:è:;;;;K;H8KI@KPP;P;U;_;|;JKPKHG - -2 -B -B -L -L -V -V -` -r - -‚ -„ -� -š -š -š -´ -» -» -Õ -Ü +$LK+BI,"OPassTraceMask ","FL:D:/TempleOS/Compiler/Directives.CPP.Z,31",193$00000031E8 0000 0000000035 Funct +$LK+BI,"OTrace ","FL:D:/TempleOS/Compiler/Directives.CPP.Z,26",194$00000031D0 0000 0000000017 Funct +$LK+BI,"OptBrNotZero ","FL:D:/TempleOS/Compiler/OptPass012.CPP.Z,387",195$0000024F08 0004 0000000659 Funct +$LK+BI,"OptBrZero ","FL:D:/TempleOS/Compiler/OptPass012.CPP.Z,226",196$00000248A8 0006 0000000659 Funct +$LK+BI,"OptClassFwd ","FL:D:/TempleOS/Compiler/OptPass012.CPP.Z,40",197$00000243E8 0008 0000000027 Funct +$LK+BI,"OptEnd ","FL:D:/TempleOS/Compiler/OptPass012.CPP.Z,23",198$0000024350 0005 000000006F Funct +$LK+BI,"OptEqu ","FL:D:/TempleOS/Compiler/Directives.CPP.Z,1",199$0000003128 0007 000000002E Funct +$LK+BI,"OptFixSizeOf ","FL:D:/TempleOS/Compiler/OptPass012.CPP.Z,547",200$0000025568 0003 0000000099 Funct +$LK+BI,"OptFixupBinaryOp1 ","FL:D:/TempleOS/Compiler/OptPass012.CPP.Z,109",201$0000024588 0013 00000001EA Funct +$LK+BI,"OptFixupBinaryOp2 ","FL:D:/TempleOS/Compiler/OptPass012.CPP.Z,175",202$0000024778 0001 0000000058 Funct +$LK+BI,"OptFixupUnaryOp ","FL:D:/TempleOS/Compiler/OptPass012.CPP.Z,191",203$00000247D0 0003 00000000D4 Funct +$LK+BI,"OptIC4 ","FL:D:/TempleOS/Compiler/OptPass4.CPP.Z,1",204$000002A930 0001 000000060C Funct +$LK+BI,"OptIC6 ","FL:D:/TempleOS/Compiler/OptPass6.CPP.Z,1",205$000002C660 0001 000000013C Funct +$LK+BI,"OptLabelFwd ","FL:D:/TempleOS/Compiler/OptPass012.CPP.Z,32",206$00000243C0 0006 0000000024 Funct +$LK+BI,"OptLag ","FL:D:/TempleOS/Compiler/OptPass012.CPP.Z,64",207$0000024490 0004 0000000030 Funct +$LK+BI,"OptLag1 ","FL:D:/TempleOS/Compiler/OptPass012.CPP.Z,75",208$00000244C0 0004 000000003A Funct +$LK+BI,"OptLead1 ","FL:D:/TempleOS/Compiler/OptPass012.CPP.Z,86",209$0000024500 0002 0000000039 Funct +$LK+BI,"OptMVCompare ","FL:D:/TempleOS/Compiler/OptPass3.CPP.Z,44",210$00000290E8 0001 000000001A Funct +$LK,"OptMemberVar ","FL:D:/TempleOS/Compiler/OptPass3.CPP.Z,39"$007FCA2AA8 0005 0000000020 Class +$LK+BI,"OptMissing ","FL:D:/TempleOS/Compiler/OptPass012.CPP.Z,1",211$00000241E6 0004 0000000070 Funct +$LK,"OptNext ","FL:D:/TempleOS/Compiler/CmpAsm.CPP.Z,687"$0000000088 0002 Funct +$LK,"OptNext2 ","FL:D:/TempleOS/Compiler/CmpAsm.CPP.Z,690"$00000000FA 0001 Funct +$LK,"OptNext3 ","FL:D:/TempleOS/Compiler/CmpAsm.CPP.Z,693"$000000016C 0001 Funct +$LK+BI,"OptOff ","FL:D:/TempleOS/Compiler/Directives.CPP.Z,11",212$0000003170 0000 0000000016 Funct +$LK+BI,"OptOn ","FL:D:/TempleOS/Compiler/Directives.CPP.Z,6",213$0000003158 0000 0000000016 Funct +$LK+BI,"OptPass012 ","FL:D:/TempleOS/Compiler/OptPass012.CPP.Z,571",214$0000025608 0000 00000039C7 Funct +$LK+BI,"OptPass3 ","FL:D:/TempleOS/Compiler/OptPass3.CPP.Z,49",215$0000029108 0000 0000001827 Funct +$LK+BI,"OptPass4 ","FL:D:/TempleOS/Compiler/OptPass4.CPP.Z,171",216$000002AF40 0000 000000131D Funct +$LK+BI,"OptPass5 ","FL:D:/TempleOS/Compiler/OptPass5.CPP.Z,1",217$000002C260 0000 00000003FE Funct +$LK+BI,"OptPass6 ","FL:D:/TempleOS/Compiler/OptPass6.CPP.Z,131",218$000002CAF8 0000 0000000443 Funct +$LK+BI,"OptPass6Lag ","FL:D:/TempleOS/Compiler/OptPass6.CPP.Z,34",219$000002C7A0 0001 0000000354 Funct +$LK+BI,"OptPass789A ","FL:D:/TempleOS/Compiler/OptPass789A.CPP.Z,1",220$000002CF40 0000 00000034D5 Funct +$LK+BI,"OptSetNOP1 ","FL:D:/TempleOS/Compiler/OptPass012.CPP.Z,48",221$0000024410 0096 0000000039 Funct +$LK+BI,"OptSetNOP2 ","FL:D:/TempleOS/Compiler/OptPass012.CPP.Z,56",222$0000024450 000D 000000003B Funct +$LK+BI,"OptStart ","FL:D:/TempleOS/Compiler/OptPass012.CPP.Z,10",223$00000242E0 0005 000000006D Funct +$LK,"PE_CHECK_BINARY_OPS1 ","FL:D:/TempleOS/Compiler/ExpParser.CPP.Z,43"$5 0001 0000000008 DefineStr +$LK,"PE_CHECK_BINARY_OPS2 ","FL:D:/TempleOS/Compiler/ExpParser.CPP.Z,44"$6 0001 0000000008 DefineStr +$LK,"PE_DEREFERENCE ","FL:D:/TempleOS/Compiler/ExpParser.CPP.Z,42"$4 0004 0000000008 DefineStr +$LK,"PE_DO_BINARY_OP ","FL:D:/TempleOS/Compiler/ExpParser.CPP.Z,46"$8 0001 0000000008 DefineStr +$LK,"PE_DO_UNARY_OP ","FL:D:/TempleOS/Compiler/ExpParser.CPP.Z,45"$7 0001 0000000008 DefineStr +$LK,"PE_MAYBE_MODIFIERS ","FL:D:/TempleOS/Compiler/ExpParser.CPP.Z,40"$2 000F 0000000008 DefineStr +$LK,"PE_POP_ALL1 ","FL:D:/TempleOS/Compiler/ExpParser.CPP.Z,49"$11 0001 0000000008 DefineStr +$LK,"PE_POP_ALL2 ","FL:D:/TempleOS/Compiler/ExpParser.CPP.Z,50"$12 0001 0000000008 DefineStr +$LK,"PE_POP_HIGHER ","FL:D:/TempleOS/Compiler/ExpParser.CPP.Z,47"$9 0001 0000000008 DefineStr +$LK,"PE_PUSH_LOWER ","FL:D:/TempleOS/Compiler/ExpParser.CPP.Z,48"$10 0001 0000000008 DefineStr +$LK,"PE_UNARY_MODIFIERS ","FL:D:/TempleOS/Compiler/ExpParser.CPP.Z,41"$3 0009 0000000008 DefineStr +$LK,"PE_UNARY_TERM1 ","FL:D:/TempleOS/Compiler/ExpParser.CPP.Z,38"$0 0001 0000000008 DefineStr +$LK,"PE_UNARY_TERM2 ","FL:D:/TempleOS/Compiler/ExpParser.CPP.Z,39"$1 0005 0000000008 DefineStr +$LK+BI,"PTrace ","FL:D:/TempleOS/Compiler/Directives.CPP.Z,21",224$00000031B8 0000 0000000017 Funct +$LK+BI,"ParenWarning ","FL:D:/TempleOS/Compiler/ExpParser.CPP.Z,1",225$000000E0BE 0004 0000000054 Funct +$LK+BI,"PrsArrayDims ","FL:D:/TempleOS/Compiler/StmtParser.CPP.Z,347",226$000001309E 0001 0000000134 Funct +$LK+BI,"PrsAsmArg ","FL:D:/TempleOS/Compiler/Assembler.CPP.Z,443",227$000000B2C0 0002 0000000477 Funct +$LK+BI,"PrsAsmBlk ","FL:D:/TempleOS/Compiler/Assembler.CPP.Z,1292",228$000000D7EE 0001 00000008C9 Funct +$LK+BI,"PrsAsmImm ","FL:D:/TempleOS/Compiler/Assembler.CPP.Z,408",229$000000B178 0006 0000000145 Funct +$LK+BI,"PrsClass ","FL:D:/TempleOS/Compiler/StmtParser.CPP.Z,829",230$0000014466 0004 0000000264 Funct +$LK+BI,"PrsClassNew ","FL:D:/TempleOS/Compiler/StmtParser.CPP.Z,1",231$00000124CE 0003 00000000B3 Funct +$LK+BI,"PrsDoWhile ","FL:D:/TempleOS/Compiler/StmtParser.CPP.Z,1334",232$000001581E 0001 0000000153 Funct +$LK+BI,"PrsDotDotDot ","FL:D:/TempleOS/Compiler/StmtParser.CPP.Z,385",233$00000131D6 0001 0000000100 Funct +$LK+BI,"PrsExpression ","FL:D:/TempleOS/Compiler/ExpParser.CPP.Z,340",234$000000F006 0010 0000000172 Funct +$LK+BI,"PrsExpression2 ","FL:D:/TempleOS/Compiler/ExpParser.CPP.Z,52",235$000000E20E 0001 0000000DF2 Funct +$LK+BI,"PrsFor ","FL:D:/TempleOS/Compiler/StmtParser.CPP.Z,1358",236$0000015976 0001 0000000190 Funct +$LK+BI,"PrsFun ","FL:D:/TempleOS/Compiler/StmtParser.CPP.Z,966",237$00000148F6 0001 000000035F Funct +$LK+BI,"PrsFunCall ","FL:D:/TempleOS/Compiler/ExpParser.CPP.Z,456",238$000000F4D6 0003 00000008B2 Funct +$LK+BI,"PrsFunJoin ","FL:D:/TempleOS/Compiler/StmtParser.CPP.Z,895",239$00000146CE 0005 0000000221 Funct +$LK+BI,"PrsFunNew ","FL:D:/TempleOS/Compiler/StmtParser.CPP.Z,45",240$0000012586 0001 00000000B3 Funct +$LK+BI,"PrsGlblInit ","FL:D:/TempleOS/Compiler/StmtParser.CPP.Z,301",241$0000012EA6 0002 0000000084 Funct +$LK+BI,"PrsGlblVarLst ","FL:D:/TempleOS/Compiler/StmtParser.CPP.Z,1035",242$0000014C56 0008 0000000975 Funct +$LK+BI,"PrsIf ","FL:D:/TempleOS/Compiler/StmtParser.CPP.Z,1283",243$00000155CE 0001 0000000142 Funct +$LK+BI,"PrsKeyWord ","FL:D:/TempleOS/Compiler/StmtParser.CPP.Z,88",244$0000012666 000B 000000003C Funct +$LK+BI,"PrsNoUnusedWarn ","FL:D:/TempleOS/Compiler/StmtParser.CPP.Z,1512",245$0000015FF6 0001 000000008F Funct +$LK+BI,"PrsOffsetOf ","FL:D:/TempleOS/Compiler/ExpParser.CPP.Z,425",246$000000F386 0002 0000000149 Funct +$LK+BI,"PrsPop ","FL:D:/TempleOS/Compiler/ExpParser.CPP.Z,13",247$000000E13E 0017 0000000022 Funct +$LK+BI,"PrsPop2 ","FL:D:/TempleOS/Compiler/ExpParser.CPP.Z,23",248$000000E19E 0001 000000002D Funct +$LK+BI,"PrsPopDeref ","FL:D:/TempleOS/Compiler/ExpParser.CPP.Z,28",249$000000E1CE 0004 000000003F Funct +$LK+BI,"PrsPush ","FL:D:/TempleOS/Compiler/ExpParser.CPP.Z,8",250$000000E116 0017 0000000028 Funct +$LK+BI,"PrsPush2 ","FL:D:/TempleOS/Compiler/ExpParser.CPP.Z,18",251$000000E166 0004 0000000033 Funct +$LK+BI,"PrsSizeOf ","FL:D:/TempleOS/Compiler/ExpParser.CPP.Z,377",252$000000F17E 0001 0000000207 Funct +$LK+BI,"PrsStatement ","FL:D:/TempleOS/Compiler/StmtParser.CPP.Z,1629",253$00000164FE 0004 0000000F94 Funct +$LK+BI,"PrsStaticInit ","FL:D:/TempleOS/Compiler/StmtParser.CPP.Z,310",254$0000012F2E 0002 000000016D Funct +$LK+BI,"PrsStreamBlk ","FL:D:/TempleOS/Compiler/StmtParser.CPP.Z,1528",255$0000016086 0001 00000001C2 Funct +$LK+BI,"PrsSwitch ","FL:D:/TempleOS/Compiler/StmtParser.CPP.Z,1402",256$0000015B06 0002 00000004EE Funct +$LK+BI,"PrsTryBlk ","FL:D:/TempleOS/Compiler/StmtParser.CPP.Z,1568",257$000001624E 0001 00000002AF Funct +$LK+BI,"PrsType ","FL:D:/TempleOS/Compiler/StmtParser.CPP.Z,418",258$00000132D6 0002 000000039C Funct +$LK+BI,"PrsUnaryModifier ","FL:D:/TempleOS/Compiler/ExpParser.CPP.Z,1078",259$00000115C6 0000 0000000DDB Funct +$LK+BI,"PrsUnaryTerm ","FL:D:/TempleOS/Compiler/ExpParser.CPP.Z,674",260$000000FD8E 0000 0000001831 Funct +$LK+BI,"PrsVarInit ","FL:D:/TempleOS/Compiler/StmtParser.CPP.Z,99",261$00000126A6 0001 00000004F7 Funct +$LK+BI,"PrsVarInit2 ","FL:D:/TempleOS/Compiler/StmtParser.CPP.Z,219",262$0000012B9E 0004 0000000302 Funct +$LK+BI,"PrsVarLst ","FL:D:/TempleOS/Compiler/StmtParser.CPP.Z,514",263$0000013676 0006 0000000D49 Funct +$LK+BI,"PrsWhile ","FL:D:/TempleOS/Compiler/StmtParser.CPP.Z,1312",264$0000015716 0001 0000000103 Funct +$LK,"SLASH_OP_DEC ","FL:D:/TempleOS/Compiler/BackEnd.CPP.Z,475"$0x052B0000 0006 0000000018 DefineStr +$LK,"SLASH_OP_DIV ","FL:D:/TempleOS/Compiler/BackEnd.CPP.Z,480"$0x00000000 0001 0000000018 DefineStr +$LK,"SLASH_OP_FADD ","FL:D:/TempleOS/Compiler/BackEnd.CPP.Z,484"$0x0000C1DE 0002 0000000018 DefineStr +$LK,"SLASH_OP_FDIV ","FL:D:/TempleOS/Compiler/BackEnd.CPP.Z,488"$0x0000F9DE 0002 0000000018 DefineStr +$LK,"SLASH_OP_FDIVR ","FL:D:/TempleOS/Compiler/BackEnd.CPP.Z,489"$0x0000F1DE 0003 0000000018 DefineStr +$LK,"SLASH_OP_FILD ","FL:D:/TempleOS/Compiler/BackEnd.CPP.Z,493"$0x00000000 0002 0000000018 DefineStr +$LK,"SLASH_OP_FISTTP ","FL:D:/TempleOS/Compiler/BackEnd.CPP.Z,492"$0x00000000 0002 0000000018 DefineStr +$LK,"SLASH_OP_FLD ","FL:D:/TempleOS/Compiler/BackEnd.CPP.Z,490"$0x00000000 0008 0000000018 DefineStr +$LK,"SLASH_OP_FMUL ","FL:D:/TempleOS/Compiler/BackEnd.CPP.Z,487"$0x0000C9DE 0002 0000000018 DefineStr +$LK,"SLASH_OP_FSTP ","FL:D:/TempleOS/Compiler/BackEnd.CPP.Z,491"$0x00000000 000D 0000000018 DefineStr +$LK,"SLASH_OP_FSUB ","FL:D:/TempleOS/Compiler/BackEnd.CPP.Z,485"$0x0000E9DE 0002 0000000018 DefineStr +$LK,"SLASH_OP_FSUBR ","FL:D:/TempleOS/Compiler/BackEnd.CPP.Z,486"$0x0000E1DE 0003 0000000018 DefineStr +$LK,"SLASH_OP_IMUL ","FL:D:/TempleOS/Compiler/BackEnd.CPP.Z,479"$0x00000000 0001 0000000018 DefineStr +$LK,"SLASH_OP_INC ","FL:D:/TempleOS/Compiler/BackEnd.CPP.Z,474"$0x00030000 0004 0000000018 DefineStr +$LK,"SLASH_OP_MOV ","FL:D:/TempleOS/Compiler/BackEnd.CPP.Z,481"$0x00000000 0002 0000000018 DefineStr +$LK,"SLASH_OP_MUL ","FL:D:/TempleOS/Compiler/BackEnd.CPP.Z,478"$0x00000000 0001 0000000018 DefineStr +$LK,"SLASH_OP_NEG ","FL:D:/TempleOS/Compiler/BackEnd.CPP.Z,477"$0x00000000 0001 0000000018 DefineStr +$LK,"SLASH_OP_NOT ","FL:D:/TempleOS/Compiler/BackEnd.CPP.Z,476"$0x00000000 0001 0000000018 DefineStr +$LK,"SLASH_OP_POP ","FL:D:/TempleOS/Compiler/BackEnd.CPP.Z,483"$0x00000000 0001 0000000018 DefineStr +$LK,"SLASH_OP_PUSH ","FL:D:/TempleOS/Compiler/BackEnd.CPP.Z,482"$0x00000000 0001 0000000018 DefineStr +$LK+BI,"SetSrcFileInfo ","FL:D:/TempleOS/Compiler/Lex.CPP.Z,105",265$0000003810 0008 0000000079 Funct +$LK+BI,"StrStrBits ","FL:D:/TempleOS/Compiler/Unassembler.CPP.Z,220",266$0000000F08 0002 0000000073 Funct +$LK+BI,"StreamExePrintF ","FL:D:/TempleOS/Compiler/CmpMain.CPP.Z,697",267$0000035C18 0000 000000003F Funct +$LK+BI,"StreamExePutS ","FL:D:/TempleOS/Compiler/CmpMain.CPP.Z,680",268$0000035B68 0001 00000000AD Funct +$LK+BI,"StreamPrintF ","FL:D:/TempleOS/Compiler/CmpMain.CPP.Z,14",269$00000340C8 0000 0000000034 Funct +$LK+BI,"StreamPutS ","FL:D:/TempleOS/Compiler/CmpMain.CPP.Z,1",270$0000034068 0001 0000000060 Funct +$LK+BI,"U ","FL:D:/TempleOS/Compiler/Unassembler.CPP.Z,819",271$0000002FE0 0000 000000009B Funct +$LK+BI,"Ui ","FL:D:/TempleOS/Compiler/Unassembler.CPP.Z,233",272$0000000F80 0002 000000205F Funct +$LK+BI,"Un ","FL:D:/TempleOS/Compiler/Unassembler.CPP.Z,835",273$0000003080 0009 00000000A6 Funct +$LK+BI,"UnasmHashLoad ","FL:D:/TempleOS/Compiler/Unassembler.CPP.Z,181",274$0000000E00 0001 0000000107 Funct +$LK+BI,"UndefinedExtern ","FL:D:/TempleOS/Compiler/StmtParser.CPP.Z,816",275$00000143C6 0001 0000000050 Funct +$LK+BI,"UnusedExternWarning ","FL:D:/TempleOS/Compiler/StmtParser.CPP.Z,823",276$0000014416 0004 000000004E Funct +$LK,"_OPTNEXT ","FL:D:/TempleOS/Compiler/CmpAsm.CPP.Z,10"$0000000088 0001 ExportSysSym +$LK,"_OPTNEXT2 ","FL:D:/TempleOS/Compiler/CmpAsm.CPP.Z,58"$00000000FA 0001 ExportSysSym +$LK,"_OPTNEXT3 ","FL:D:/TempleOS/Compiler/CmpAsm.CPP.Z,107"$000000016C 0001 ExportSysSym +$LK,"asm_hash ","FL:D:/TempleOS/Compiler/CmpGlbls.CPP.Z,2"$00000006F8 0009 0000000008 GlbVar +$LK,"asm_seg_prefixes ","FL:D:/TempleOS/Compiler/Assembler.CPP.Z,805"$000000C1A8 0001 0000000006 GlbVar +$LK,"assign_bitmap ","FL:D:/TempleOS/Compiler/CmpGlbls.CPP.Z,8"$00000007A8 0003 0000000008 GlbVar +$LK,"binary_ops_table ","FL:D:/TempleOS/Compiler/CmpGlbls.CPP.Z,6"$0000000780 0002 0000000008 GlbVar +$LK,"cmp_arg_cnt ","FL:D:/TempleOS/Compiler/CmpGlbls.CPP.Z,7"$0000000790 0009 0000000008 GlbVar +$LK,"cmp_bitmap ","FL:D:/TempleOS/Compiler/CmpGlbls.CPP.Z,8"$00000007B8 0004 0000000008 GlbVar +$LK,"cmp_do_not_write_to_dsk ","FL:D:/TempleOS/Compiler/CmpGlbls.CPP.Z,3"$0000000701 0003 0000000001 GlbVar +$LK,"cmp_result_cnt ","FL:D:/TempleOS/Compiler/CmpGlbls.CPP.Z,8"$0000000798 0005 0000000008 GlbVar +$LK,"cmp_templates ","FL:D:/TempleOS/Compiler/CmpExts.CPP.Z,51"$00000001F6 0002 0000000004 GlbVar +$LK,"cmp_templates_dont_pop ","FL:D:/TempleOS/Compiler/CmpExts.CPP.Z,52"$000000038B 0002 0000000004 GlbVar +$LK,"cmp_templates_dont_push ","FL:D:/TempleOS/Compiler/CmpExts.CPP.Z,53"$0000000457 0002 0000000004 GlbVar +$LK,"cmp_templates_dont_push2 ","FL:D:/TempleOS/Compiler/CmpExts.CPP.Z,55"$000000062D 0002 0000000004 GlbVar +$LK,"cmp_templates_dont_push_pop","FL:D:/TempleOS/Compiler/CmpExts.CPP.Z,54"$000000059D 0002 0000000004 GlbVar +$LK,"compiled_bytes ","FL:D:/TempleOS/Compiler/CmpGlbls.CPP.Z,15"$0000000828 0002 0000000008 GlbVar +$LK,"compiled_funs ","FL:D:/TempleOS/Compiler/CmpGlbls.CPP.Z,14"$0000000820 0002 0000000008 GlbVar +$LK,"compiled_lines ","FL:D:/TempleOS/Compiler/CmpGlbls.CPP.Z,14"$0000000818 0003 0000000008 GlbVar +$LK,"deref_bitmap ","FL:D:/TempleOS/Compiler/CmpGlbls.CPP.Z,8"$00000007A0 0004 0000000008 GlbVar +$LK,"doc_stop_btypes ","FL:D:/TempleOS/Compiler/Lex.CPP.Z,398"$0000005138 0001 0000000008 GlbVar +$LK,"dual_U16_tokens1 ","FL:D:/TempleOS/Compiler/CmpGlbls.CPP.Z,5"$0000000768 0002 0000000008 GlbVar +$LK,"dual_U16_tokens2 ","FL:D:/TempleOS/Compiler/CmpGlbls.CPP.Z,5"$0000000770 0002 0000000008 GlbVar +$LK,"dual_U16_tokens3 ","FL:D:/TempleOS/Compiler/CmpGlbls.CPP.Z,6"$0000000778 0002 0000000008 GlbVar +$LK,"fpop_bitmap ","FL:D:/TempleOS/Compiler/CmpGlbls.CPP.Z,9"$00000007C0 0013 0000000008 GlbVar +$LK,"internal_types_table ","FL:D:/TempleOS/Compiler/CmpInit.CPP.Z,8"$0000030418 0001 00000000A0 GlbVar +$LK,"is_first_compiler ","FL:D:/TempleOS/Compiler/CmpGlbls.CPP.Z,2"$0000000700 0004 0000000001 GlbVar +$LK,"lex_zeros ","FL:D:/TempleOS/Compiler/Lex.CPP.Z,138"$00000039A8 000B 0000000004 GlbVar +$LK,"non_ptr_vars_mask ","FL:D:/TempleOS/Compiler/CmpGlbls.CPP.Z,11"$00000007F0 0006 0000000008 GlbVar +$LK,"not_constant_bitmap ","FL:D:/TempleOS/Compiler/CmpGlbls.CPP.Z,8"$00000007B0 0003 0000000008 GlbVar +$LK,"num_non_ptr_vars ","FL:D:/TempleOS/Compiler/CmpGlbls.CPP.Z,10"$00000007D8 0005 0000000008 GlbVar +$LK,"num_reg_vars ","FL:D:/TempleOS/Compiler/CmpGlbls.CPP.Z,9"$00000007D0 0006 0000000008 GlbVar +$LK,"num_stk_temps ","FL:D:/TempleOS/Compiler/CmpGlbls.CPP.Z,9"$00000007C8 0004 0000000008 GlbVar +$LK,"opt_nop ","FL:D:/TempleOS/Compiler/OptPass012.CPP.Z,9"$0000024258 0007 0000000088 GlbVar +$LK,"reg_vars_mask ","FL:D:/TempleOS/Compiler/CmpGlbls.CPP.Z,10"$00000007E8 0002 0000000008 GlbVar +$LK,"stk_temps_mask ","FL:D:/TempleOS/Compiler/CmpGlbls.CPP.Z,10"$00000007E0 0003 0000000008 GlbVar +$LK,"sys_internal_types ","FL:D:/TempleOS/Compiler/CmpGlbls.CPP.Z,4"$0000000708 00B0 0000000060 GlbVar +$LK,"to_non_ptr_vars_map ","FL:D:/TempleOS/Compiler/CmpGlbls.CPP.Z,14"$0000000810 0004 0000000008 GlbVar +$LK,"to_reg_vars_map ","FL:D:/TempleOS/Compiler/CmpGlbls.CPP.Z,13"$0000000808 0004 0000000008 GlbVar +$LK,"to_stk_temps_map_even ","FL:D:/TempleOS/Compiler/CmpGlbls.CPP.Z,13"$0000000800 0007 0000000008 GlbVar +$LK,"to_stk_temps_map_odd ","FL:D:/TempleOS/Compiler/CmpGlbls.CPP.Z,12"$00000007F8 0007 0000000008 GlbVar +$LK,"uasm_ins64_mask ","FL:D:/TempleOS/Compiler/CmpGlbls.CPP.Z,19"$0000000840 000D 0000000008 GlbVar +$LK,"uasm_mem_mask ","FL:D:/TempleOS/Compiler/CmpGlbls.CPP.Z,20"$0000000850 0003 0000000008 GlbVar +$LK,"uasm_signed_arg_mask ","FL:D:/TempleOS/Compiler/CmpGlbls.CPP.Z,19"$0000000848 0003 0000000008 GlbVar +$LK,"unary_ops_table ","FL:D:/TempleOS/Compiler/CmpGlbls.CPP.Z,7"$0000000788 0002 0000000008 GlbVar +$LK,"unasm_table ","FL:D:/TempleOS/Compiler/CmpGlbls.CPP.Z,18"$0000000830 0006 0000000008 GlbVar +$LK,"unasm_table_entries ","FL:D:/TempleOS/Compiler/CmpGlbls.CPP.Z,19"$0000000838 0003 0000000008 GlbVar +à 'À®Á®ÁÄÁËÁÓÁÞÁÞÁöÁÂÂÂ"Â=ÂSÂiÂm“§®±ÂÊÂÔÂÔÂæÂèÂúÂúÂÃÃÃÃ#Ã*Ã1ÃKÃVÃcÃgÃgÃqÉÃ�Ã�ßóÃÇÃÇÃÎÃÙÃäÃíÃøÃÄ ÄÄ"Ä"Ä-ÄKÄOÄOÄXććĎęĨİľÄÅÄÉÄËÄËÄÝÄÝÄÝÄïÄ÷ÄÅÅ+Å+Å/ÅHÅMÅ]ÅhÅhÅ�ņŔŠŨŶÅÁÅÅÅÊÅÏÅÓÅÓÅâÅçÅöÅøÅÆ ÆÆ#Æ)Æ=ÆEÆSÆZÆ^ÆnÆyÆ~ƜƤƲƹƽÆÅÆÓÆÚÆÞÆÇ ÇÇÇÇÇ%Ç0Ç@ÇjÇoÇzÇ�Ç’Ç�ǢǧDzǾÇÂÇÊÇÏÇáÇæÇñÇñÇñÇñÇÿÇÈ7ÈGÈOÈ_ÈoÈ™È�ÈÔȺÈéÈéÈôÈÉÉ)É1ÉCÉNÉRÉWÉfÉnɀɋÉ�É�ɔɔɪɪÉÀÉÀÉÀÉÊÉÞÉüÉÊ(Ê`Ê`ÊnÊrʠʧʮʽʽÊÔÊÙÊäÊôÊüÊËËË"Ë2Ë:ËLËWË[Ë[Ë[Ë[ËqË|ˈË�ˢ˭˱˱˶˻˿˿ËÒË×ËêËïËÌÌÌ%Ì+Ì?ÌGÌYÌdÌhÌx̦̮̃̈ÌÀÌËÌÏÌ×ÌéÌôÌøÌ Í%Í0Í6Í6Í6Í?Í`ÍqÍ�͌͌ͥͪ͵ÍÅÍóÍøÍÎÎÎ&Î+Î0Î;ÎKÎOÎWÎ\ÎnÎsÎ~Î~Î~Î~ΚΪΪÎÃÎÓÎ×ÎóÎÏÏÏ-Ï1ÏCÏdÏtϓϷÏÛÏàÏëÏóÏóÏÐ!Ð2ÐQÐuЙОЩбббÐËÐÝÐïÐÑ6ÑEÑ~ххљѺÑÔÑÔÑØÑîÑõÑýÑ$Ò/ÒUÒ]Ò]ÒƒÒƒÒšÒÁÒÊÒãÒÓ#Ó_ÓmÓ‡Ó Ó°Ó°ÓÌÓÌÓèÓèÓøÓÔ(Ô8Ô8Ô8ÔHÔYÔqÔ�Ô�ԌԕԞԬÔÕȹϸ§¸§Â§Ä§Ï§×§â§í§ø§ú§ú§¨¨(¨*¨6¨?¨?¨B¨p¨P˜ « «´«¿«Ê«Ò«Û«ã«æ«í«ñ«ú« ¬¬¬¬$¬A¬O¬^¬c¬o¬q¬…¬x¬•¬ ¬¦¬¦¬´¬·¬É¬É¬Ø¬Ý¬á¬ò¬þ¬ ­­­$­)­4­N­v­n­‹­–­Ê­·­ß­ß­ß­ñ­ü­®®4®K®R®i®€®—®®®®®®®·®À®Æ®Ê®Ï®Ú®ç®þ®¯¯&¯7¯7¯>¯Z¯f¯n¯~¯…¯ž¯©¯µ¯º¯Å¯É¯Ø¯ã¯ì¯ó¯°"°8°O°f°m°q°v°ˆ°’°’°�°¬°»°×°Û°à°w± MÞ  * * = E S S o z € � � ¤ ¹ ¹ Ë Ñ Ñ è ú ú $*BU`dnƒ‰‹˜š®®µ¹½Ëàäí.48A^bbbbgyˆ—¥ÀÒâçççóû   (.6DKWprzˆŽ���������œ¤¬²²ÉÑÕÝëñññ *EMUaivˆ–²¹ÅÞáæg=0¢0¢@¢G¢N¢R¢v¢‰¢‘¢¢¢³¢¾¢Õ¢à¢â¢í¢þ¢ £ £+£-£4£=£?£J£Q£[£s£(Ïp¨p¨„¨‹¨’¨š¨�¨�¨¬¨µ¨¸¨»¨¿¨Ä¨ä¨Ñ¨ù¨© ©©©&©1©9©S©€©s©•©Ÿ©Í©À©â©â©ó©þ©ªª4ªJªQªgª}ª“ª©ª©ª©ª©ª²ª»ªÁªÄªÕªÕªïª« ««™«¸Hœ8·8·N·U·`·v·ˆ·š·¬·¾·Ð·Ý·Ý·â·é·é·ÿ·¸¸(¸7¸F¸U¸d¸q¸q¸q¸‘¸‘¸§¸¹¸½¸½¸Ë¸Ú¸ß¸ß¸æ¸æ¸ü¸ ¹¹¹%¹=¹=¹=¹S¹^¹^¹t¹‹¹š¹´¹Ã¹à¹ï¹ ºº8ºGºeºtº…º‡º�º¤ºººººººÙºÙºöºöº»»•»¨M¸¸ÈÈåå    -22277MTgu~Ž—™™™™ §®µ¼ÃÊÑØØÚÚàå  PZ�x¤x¤Š¤‘¤˜¤¦¤­¤²¤¿¤Ñ¤Ó¤Ú¤à¤ð¤û¤¥¥¥'¥*¥,¥>¥D¥T¥^¥h¥o¥z¥�¥—¥—¥­¥­¥Á¥ +P�¨È¥È¥Ú¥á¥è¥ö¥ý¥¦¦!¦#¦*¦0¦@¦K¦U¦`¦`¦w¦z¦|¦Ž¦•¦¥¦¯¦¹¦À¦Ë¦ß¦ç¦ç¦ý¦ý¦§ =Zx£x£�£”£›£¢£¨£¸£Ã£Í£Ø£Ø£ï£ò£ô£¤¤#¤*¤5¤G¤O¤O¤e¤e¤w¤  ¨¹§§3§:§E§O§Z§b§q§{§~§’§–§ª§ª§¸§ `œ%˜»˜»¹»À»À»Ù»å»ð»ð»ù»&¼(¼1¼^¼`¼{¼‰¼‰¼’¼™¼¥¼¯¼¶¼½¼Â¼Ä¼Ë¼×¼á¼è¼ï¼ô¼ô¼½½½½G½I½R½½¢½°½¹½À½Ì½Ö½Ý½ä½é½ë½ò½þ½¾¾¾¾¾(¾6¾Y¾€¾Ž¾•¾ ¾ ¾©¾Ö¾Ø¾á¾¿¿¿*¿4¿;¿B¿G¿I¿P¿\¿f¿m¿t¿y¿y¿„¿§¿Î¿Ü¿ã¿î¿î¿÷¿$À&À/À\ÀeÀpÀ|À†À�À”À™À›À¢À®À¸À¿ÀÆÀËÀËÀÕÀðÀ ÁÁÁÁ Á)Á¦ÁøP¡P¡€¡Œ¡”¡œ¡ ¡¤¡¨¡¬¡°¡´¡¼¡Á¡Ë¡Ò¡ß¡ò¡ù¡¢¢¢¢¢¢¢/¢ÀH]`•`•r•x•x•�•ЕЕ±•¸•Á•ʕԕâ•í•ó•ý•ø]y––––$–)–,–/–;–P–W–^–e–h–s–v–„–‡–�–�–­–³–º–º–Ê–hyãЖЖò–þ–———%—+—+—6—@—J—W—a—g—g—r—|—†—“—�—£—£—®—¾—È—Õ—ß—å—å—ð—˜ +˜˜!˜'˜'˜2˜8˜B˜O˜Y˜_˜_˜j˜r˜|˜‰˜“˜™˜™˜™˜£˜°˜º˜Å˜Ù˜ã˜ð˜ú˜™™#™0™:™E™\™\™q™…™…™�™œ™¦™±™È™Ò™Þ™ä™ñ™ù™šš)š;šIšIšWšWšz›ÈÈ’È’Ô’Û’à’é’ñ’ÿ’““5“B“B“E“S“c“z“~“†“�ÉØ@‘@‘N‘R‘Y‘_‘f‘i‘p‘{‘‘‚‘Œ‘€ê÷(’(’8’?’D’M’X’b’b’e’i’q’ ‡¨X�X�x��†�Ž�—�›�Ÿ�¬�´�¹�¹�Ê�Î�Õ�Õ�å�ì�õ�� �� �&�4�;�B�R�Xµ½È�È�Ò�Ö�Ú�â�ò�ø�X?ˆ“ˆ“–“�“Ÿ“¨“«“¼“¼“ÓǓϓؓñ“ÿ“”” +” ” ”””” ”"”"”+”+”4”:”=”G”]”c”q”q”•h÷x’x’ˆ’”’ž’¥’³’·’º’Â’€¨µX�X�d�n�}�„�Œ�”�œ�¤�´�¼�Ä�`áêà‘à‘ê‘ñ‘’’’ ’%’`?H••"•)•9•=•Q•T•Z•`Øá�‘�‘𑦑¶‘½‘ΑՑۑx½Éø�ø�‘‘‘ ‘ ‘,‘3‘5‘;‘à8ˆ8ˆBˆLˆWˆnˆnˆsˆuˆ�ˆ‹ˆœˆœˆ®ˆ°ˆÀˆÀˆÅˆÇˆÎˆýˆ G‡ø‹ø‹ŒŒ1Œ ŒŒAŒNŒXŒbŒbŒyŒ€Œ€Œ—ŒžŒ§Œ§Œ¸Œ¸ŒÉŒÉŒÚŒÚŒëŒëŒüŒüŒ � ���/�/�@�@�Q�Q�b�b�s�s�„�„�•�•�¦�¦�·�·�É�Ñ�ß�ð�þ�ŽŽŽ%Ž,Ž,ŽV� €G‰‰ ‰ ‰0‰‰‰Q‰a‰S‰‚‰œ‰œ‰¦‰«‰«‰¿‰Ä‰Ä‰à‰å‰å‰Š +Š +ŠŠ#Š#Š#Š@Š@ŠRŠvŠœŠ³Š¿ŠËŠ×ŠáŠáŠáŠó‹!@&+ 2*22272"t¸O¸OÊOâOòO P P P7P7PRPsP|P€P„PŠP”PšPªP°PºPÀPÈPÌPÑPÑPÝPàPëPñPûPQQ +QQQ&Q-Q4Q6Q:QCQMQUQ`QlQpQ�Q�Q–Q Q©QÂQÓQÜQåQíQøQRR R1R=RKRMRTR[R`RdRqRxR‡R•RŸR©R²RËRÜRåRîRöRÿRS SSS S&S4S>SHSQSjS{S„S�S•SžS¤S¨S­S³S½SÇSÇSâSðSöSýSTTT1T%T@TOTXTXTsT‡T‡T¦T­TµT¼TÅTÎT×TàTUUSU#°³Æ€H€H¥H§H§H»HÉHÏHíHIII,I,I7I:IwI$¸Ñå¦#¦#¸#Ì#Ò#Ø#æ#÷#$$!$5$9$?$M$P$Z$%H0�0�>�V�^�^�d�&p&h�h�|���—�¯�·�Ñ�Ø�à�à�è�' :Û(:(:4:4:D:T:d:t:„:—:ª:·:Æ:Û:ñ:ñ:; ; ;!;7;7;M;k;p;|;ˆ;”; ;¬;¸;Ä;Ð;ß;î;ý; <<*<9<9<I<T<_<g<q<‰<Ž<ž<©<´<¼<Æ<Þ<ã<ó<===!=+=C=O=W=a=q=v=…=Œ=—=¢=­=¸=Ã=Î=Ù=ä=ï=ú=>>>>*>1><>G>R>]>h>s>~>‰>‰>˜>Ÿ>ª>µ>µ>Ä>Ë>Õ>ß>é>ó>ý>ý> ???'?1?;?E?O?Y?c?m?w?�?‹?•?Ÿ?©?³?½?Ç?Ñ?Û?å?ï?ù?@ @@!@+@5@?@h@((2tXMXMpM{M{MMˆM�M™M¦M¦M¼MÁMÁM×MÜMÜMóMõMõM NNN"N$N$N8N:N:NPNRNRNhNhNoNsNwN|N€N�N�NžNžN­NÁNÈNÈNâNäNÿNOOO5O9OUOXOdO´O)xÆ2xIxI’I•I•I™I¢I©I¶I¶IÌIÑIÑIçIìIìIJJJJJJ2J4J4JHJJJJJ`JbJbJxJxJJƒJŒJ™J J©J°J´JÃJÏJÓJÖJÞJÞJñJþJKKK+K>KIK]KƒKšKŸK¦K®K²K²KÄK×KáKåKåK÷K +L L LL#L#L#L=L?LZL\LtLvL�L�L�L™LŸL£L¯LÐLÞLäLTM*ÀÂ×X\X\\\r\y\‘\š\¥\°\»\Â\Ç\Ì\ã\ñ\ú\ ]]]+Ð<³HBHBLB[B_BlB~B‹B£BµB×B÷BC!C3CKCbC{C—C©CÃCËCíCDD,D;D;DKD^DoD~DŽD›D¦DµDÕDÕDÞDÞDÞDïDüDE#E0ESEqEzE‡E‹E“EžE¶EÎE×EçEïEôEF-F=FMFXFhFmFuF•F—F¢FÏFãFãFûF +GG!G*G2G2GDGbGjGrG}GG�G§G¿G×GïGHH'H0H9HKHYH]H~H,ø +Þ:hhl}ŽŸ°ÁÒãô'8IZk|�ž¯ÀÑâó&7HYj{Œ�®¿Ðáò,%=6NG_Xpiz‹œ´­¾Ïàñ$5FWhyŠ›¬½Îßð#4EVgx‰š«¼ÍÞï"3DUfwˆ™ª»ÌÝîÿ!2CTev‡˜©ºËÜôíþ$:-°án|n|’|•|Ê|Ò|Ò|í|ó|ø|ø|}}}}'}5}5}A}H}N}S}–} }§}­}¯}¯}Å}Ë}Ë}Ë}Ð}ì}û}~~~~~#~*~?~F~F~_~_~�~.€`m@E@EPEXEeEoEzE‚E/p +ø�ø������$�&�+�08%€3€3�3´3È34t4w4�4”4›4¢4¶4½4Ç4Ð4è4÷455 5"5'5>5J5V5Z5h5o5r5ª51x Ž~Ž~¨~²~¶~º~¿~Á~à~ÿ~ÿ~ 28<AAA"A.A6A6AFALAZAaAxA…A“A¡A¯AÈAÐAÚAéAñAþAB B B BBB%B%B5B8BHB3` +Ð�Ð�Ù�Þ�ç�î�ð�õ�4xÀ ÕÕ.Õ5Õ9ÕQÕYÕaÕkÕoÕvÕ|Õ�Õ˜Õ�Õ Õ«Õ¶Õ¾ÕÉÕÔÕÖÕÖÕðÕ÷ÕþÕ ÖÖÖÖ(Ö3Ö5ÖAÖJÖJÖdÖ…Ö‹Ö‘Ö¤ÖªÖ³Ö³ÖÇÖÍÖÍÖÕÖÝÖèÖíÖÿÖ ×× ×!×%×4×4×4×E×E×J×^×f×f×è×5804P2Z2b2g26pALHWHW]WlW€W�W•W›WžW¿W7pu€hYhY}YŒY Y­Y³Y¹Y¼YÝY8p�¨ðZðZ[[([5[;[A[D[e[9`8AWWW%W4W:W=WEW:`lu Y Y2YEYRYXY[YcY;h“�¨Z¨ZºZÍZÚZàZãZëZ<H8XUXU\U`U`UuUˆUˆU›U¸UÙUâUóUV1V1VSVbVkVxVV�VœVµVÂVÆVÎVÎVÎVáVáVñVõVùV=LlÀWÀWÄWÈWÈWÝWðWðWXXQXsX‚X‹X˜XŸX¯X¼XÕXâXæXîXîXîXYYYYY>°€“àYàYùYùY ZZZ Z7ZTZrZxZ�Z�Z•Z˜Z¤Z?pêõŽ$Ž$š$¦$«$´$º$¾$É$@@ty„P„P�P“P˜PA@åê^$^$l$�$‡$B@ˆ1‘1¯1´1CP(€›€›Š›•›¤›«›³›»›Ã›Ë›Ö›à›è›ó›ý›œœœ"œ'œ0œ0œ@œOœTœ[œ`œhœjœyœ~œ~œ¾œ¾œÀœÖœÙœßœDGfÈ�È�Ô�ì�ì�ú�ú�ú�ú�žž +ž1ž9ž9žDžDžRžbžbžpžvžvžŽžŽž”ž,ŸE@f‹0Ÿ0Ÿ<ŸEŸEŸXŸeŸqŸ}Ÿ‰Ÿ•Ÿ•Ÿ¬Ÿ¬Ÿ¼ŸÈŸÑŸØŸáŸ    . : : P P y y { Ž � ª ¶ ¹ Ù F(Gàœàœöœ� ��$�1�1�?�?�V�_�p�r�u�w�Š���Ÿ�ª�ª�ª�­�µ�º�È�G ‹œà à î ñ ñ ú ¡¡¡ ¡"¡'¡5¡>¡K¡Hè±Kö™ö™(š3š;šDšUšbšwšzš}š�šŠšŠš˜š¢š§š¶šßšäšõš!›&›7›W›\›k›—›Ÿ›¤›¹›å›í›ò›ò› œœ,œ0œOœ`œeœeœ~œ~œ~œ~œ~œŽœ£œ¦œ©œ­œ­œ²œÁœêœïœøœ ��0�B�O�Z�o�o�o�|�“�•�•�•�¢�¹�»�»�È�ß�ß�ð�õ�þ�ž'ž'ž9žNžNžNž[žržtžtžtž�ž˜žšžšž§ž¾ž¾žÏžמܞ螟ŸŸ&Ÿ;Ÿ;Ÿ;ŸHŸ_ŸaŸaŸnŸ…Ÿ…Ÿ…ŸžŸ£ŸªŸÌŸêŸïŸöŸ     2 : < < ^ @¡IØy±——,—/—2—8—=—T—k—‚—”—º—á—ä—ý—˜˜&˜3˜F˜Y˜^˜f˜p˜x˜x˜˜ˆ˜ˆ˜ˆ˜“˜»˜Õ˜Û˜ô˜ ™™)™/™H™a™i™i™t™t™~™~™�™Ιã™õ™J£áæyæyÿy!z*zgzszŽzŸz´z»zùz{ {-{A{E{E{I{N{T{]{`{j{w{”{—{—{—{œ{¢{¢{½{Ë{Ö{Þ{ò{ù{|||(|3|;|L|L|[|`|`|l|Kh— +! &ë&ëTë_ë’ëlë˜ë˜ëÆëËëËëÏëÙëåëìììì ì9ìTìTìfìsì‹ìŸì¤ì«ìÐì×ìàìâìèìûìíí+í8íPífí‚í†í†í‘í˜íªí­í¯íµíÑíéíëíîîîî î<î<î<îNîNî\îfî‡î£î£î¨î¬îÈîÔîÔîïî ïïï.ïAïXï[ï[ïmï�ï‹ï¢ï¦ï¼ïÏïæïéïéïûïðð#ð,ðCðMðOðcðmð„ðˆðˆðˆð“ðšð­ðÅðÇðßðòð ñññ!ñ)ñJñañañañ‡ñ‡ñ™ñL¤ Á ¶÷¶÷Æ÷Í÷Ù÷é÷øøø4ø6øUøaøqø�ø–ø�ø�ø¥ø­ø¸øÀøËøÖøõøýøMï�ÆÆàòøÿ 59??Wk||„¨ÈÈéî +0=@wˆ�“•›ž¯´·¿Èã-26Xkp‡šŸ£Åà   ) . 1 3 9 ? P U [ c c m v �   ¥ © Ë æ    9 Y p ƒ ˆ Œ ® Á Á × × × å ý ÿ ÿ ÿ  !%!'!'!5!M!M!_!_!h!u!‹!¯!¿!Æ!Ñ!ç!ë!ë!ë!ö!ü!""("@"E"K"e"l"w"…"�"�"Ò"NЄ›ž:ž:°:¼:Ò:ß:é:ø:;;;:;.;K;M;M;~;l;M;�;§;O �¾Ö"Ö"æ"#ñ"+#8#D#J#„#‰#µ#µ#º#Ð#â#â#ÿ#$L$L$[$“$$®$®$»$ç$ì$%%5%!%P%i%U%‰%u%�%�%ª%Ö%Ö%Ö%Ö%Þ%Ph­ × žž°»ÆÒÝß55Bm˜’†°Òê×ýö 00=h�{o�   ªQXz â žžÀàèó %:?Yx~ƒ–Ïåëóöû;QW_bm‚‡¤ÃÉÑÑÖÜßêõ +)HNS^s|� ¨­¸ÍÖØ÷ÿ + $>]chhhhu||‘‘©´ÇÔð !5FOZZ‡‡‡™R0¾aÞ%Þ%ø%&&&c&Š&¨&Ò&Ø&Þ&æ&è&ð& '''%'j'‘'¯'Ù'ß'å'è'í'õ'(((&(+(p(—(µ(ß(å(ë(î(ð(ø())!)))v)�)»)å)ë)ñ)ù)þ)*!*$*/*;*;*@*F*L*T*W*b*t*ƒ*µ*ß*å*ê*ü* +E+o+u+}+‚+”+£+Ý+, ,,$,3,m,—,�,¢,¢,¢,­,­,Â,Â,Í,û, --&-=-B-p-€-†-™-¦-Ô-è-ÿ- ..&.=.=.F.R.h.‰.•.•.¢.¼.À.À.À.Ë.Ð.ã.ã.ð./ //$/$/5/B/L/L/^/SÐy�‹‹"‹"‹5‹5‹O‹V‹b‹b‹y‹y‹�‹�‹§‹§‹¾‹¾‹Õ‹׋׋Û‹TØ z ¶û¶ûÔûÞûü ü6üZü_ücükükütüƒüŠü“ü˜ü­ü¾üÝüåüçüýýý$ý0ý5ý<ýDýJýLýXýhýmýoý�ý•ý•ý�ý�ý¦ýµýÔýÛýÝýüýþþþþ-þ1þ?þRþJþjþoþzþ�þ‰þ�þ‘þ�þ­þ²þ´þÔþÚþÚþæþöþûþÿ ÿ&ÿ+ÿ7ÿGÿLÿNÿnÿtÿ{ÿƒÿ‰ÿ‹ÿ—ÿ§ÿ¬ÿ®ÿÎÿÔÿÔÿÔÿÜÿÜÿåÿåÿïÿïÿ7MQ_rjŠŠœUP× ž®®ÈÐÞÞâ#9AAEw‚—¬±¹¿ÃÇÖÞèñ4>@\fu}Š�𥧯ÌÕàèð+388Bbjooyˆ¨°²ÒÚÚÚåî +$).6So‹ª­ÂÏãöú-I\{�ƒ¢¥¥ºÇÛîîùý)+JMXch‡�’�¨ªÉÌ×âä   OOZZZZco…¦²²ºÆÍãçççò÷ + +%<AFYYamt�‹‹¸¸ÊVÀ U69>>KPbdhlo‚›½ÆÑØñ€€1€S€X€_€x€š€œ€µ€×€×€×€å€î€þ€�(�?�?�Y�h�z�W¨gyN–N–^–k–k–z–z–†–Œ–¶–Ì–¸–ã–Ø–û–û–—Xp‚ ­ ® ®  Æ Ô Ô ã î ú   0 6 6 X ‡ k _ © ® Õ Ú æ ñ ó ""5NH<Zmm��›Y°; +N +VæVædækæŠæ©æ«æÊæéæøæç ç çç#çBçHçZÈN +„ +NçNçcçnçuç¢çÁçÃçâçèè&è1è3è>èIèIèNè{è€è­è²è¹èØè÷èéé#éBéBé]élétéé�éŒé—é—é·éÔéÔéáéáéê&ê&ê&ê.ê[Hº à .ß.ßHßYßeß|߃ߜߔߴßÔßÀßàßñßößàà/à@àWà^àwàoà�à¯à›à»àÌàâàÎàúàáá á á)á\XKsƶƶà¶ò¶ù¶····3·3·8·W·\·c·c·r·t·“·“·²·Ç·´·Ó·Ó·â·ä·¸¸¸¸¸+¸$¸C¸M¸]¸ú FÌFÌ`ÌsÌzÌ�̨̜̠̠̈̌̎̕ÌÁÌËÌËÌßÌêÌøÌ Í ÍÍÍ.Í?ÍVÍZÍcÍgÍlÍ}Í�͚ͨ͠ͼÍÁÍÚÍëÍïÍïÍïÍôÍ"Î7Î>ÎTÎXÎ]ÎhÎyΊΡΩήζλÎÌÎÞÎæÎìÎÏÏÏ2Ï6Ï6Ï6ÏAÏRÏcÏzÏ~χϋÏ�ϡϳϾÏÄÏÌÏàÏåÏþÏÐÐÐ%Ð%Ð%Ð*Ð*Ð9Ð;ÐZÐZÐyЄЊРбжÐËÐÖÐçÐøÐÑÑÑ Ñ%Ñ6ÑHÑOÑUÑ]ÑqÑsÑŒÑ�ѡѡѨѾÑÂÑÂÑÔÑÙÑäÑùÑ +Ò!Ò)Ò.Ò6Ò;ÒLÒbÒjÒpÒ…ÒŠÒ£Ò¹Ò½Ò½ÒÏÒÏÒÏÒÏÒçÒÔÒóÒóÒÓÓ#Ó.Ó4ÓJÓ[Ó[Ó[ÓbÓbÓuÓŽÓŽÓŽÓ�Ó�Ó°ÓÇÓÒÓãÓèÓîÓøÓúÓÔÔÔÔ#Ô8Ô=ÔHÔ]ÔiÔkÔvÔ‚Ô’Ô�Ô¬Ô¾ÔÆÔÊÔÎÔÐÔÕÔÝÔáÔóÔøÔýÔÕ Õ Õ ÕÕ!Õ7Õ_ÕoÕvՀՌՓթխխխոսÕ×ÕÞÕèÕôÕþÕÖÖ Ö9Ö@ÖJÖZÖdÖqÖ{Ö{Ö�Ö^˜™É>¥>¥d¥g¥n¥t¥z¥|¥‚¥ˆ¥ˆ¥š¥¥¥¬¥¹¥Æ¥Ù¥è¥ü¥¦¦ ¦¦¦¦,¦.¦5¦;¦E¦E¦E¦\¦n¦u¦u¦„¦†¦˜¦§¦§¦¹¦_ðÉ侦¾¦ä¦ç¦î¦ô¦ú¦ü¦§§§§)§<§I§X§^§`§f§p§§‘§ §¾§Ч`Ø¢ º îÝîÝÞÞ*ÞHÞYÞ`ÞyÞqÞ‘Þ±Þ�Þ½ÞÎÞÐÞñÞÝÞ ß ß!ß!ß+ßa5¶©¶©Ê©Ü©ã©ã©ê© ªª-ª2ªLª9ªkªXªwªŒªyª«ª˜ª·ª·ªɪɪЪïªïª÷ªb0s¶N¸N¸b¸t¸¸§¸†¸³¸³¸Õ¸¹á¸¹¹,¹,¹K¹`¹M¹�¹l¹™¹™¹·¹·¹ɹɹç¹ç¹ºº!ºZº_ºfº”º…º º ººÒº»ñº »»+»+»M»e»R»q»Ÿ»�»«»«»É»É»Û»Û»ù»¼¼!¼@¼@¼@¼H¼cXz ¢ ¶Û¶ÛÐÛáÛíÛÜ!Ü(ÜAÜ9ÜYÜyÜe܅ܖܛܼܨÜÔÜåÜûÜÝ Ý9Ý1ÝQÝqÝ]Ý}ÝŽÝ�ݱÝ�ÝÉÝÉÝáÝáÝëÝdP„Kî­î­®#®+®2®9®?®A®H®O®R®R®R®d®d®w®‚®�®ž®¯®Æ®ή׮߮ä®õ® ¯¯¯-¯2¯L¯d¯h¯h¯m¯™¯®¯¹¯ʯÛ¯ò¯ú¯° °°!°3°;°C°U°W°q°‰°�°�°˜°©°º°ѰÙ°â°ê°ï°±±±&±8±=±W±o±s±s±†±†±†±ž±‹±¾±«±˱×±ݱõ± ²²'²2²C²T²k²s²|²„²‰²š²¬²´²¼²βвê²³³³³"³3³J³R³[³c³h³y³�³—³Ÿ³±³¶³гè³ì³ì³ÿ³ÿ³ÿ³´´7´$´D´P´V´n´†´†´†´’´˜´£´®´È´Ø´ï´µµ4µ4µHµdµdµdµ|µ|µеŒµŒµšµšµ£µ®µ¼µ×µæµíµíµ¶¶¶#¶.¶K¶\¶w¶w¶Á¶e8 +¶úN¼N¼h¼o¼v¼�¼‰¼¢¼¢¼¶¼¶¼̼̼׼ۼ漽ñ¼½4½B½X½\½a½a½w½ˆ½Ÿ½¶½»½ýǽ̽ó½ ¾ ¾ ¾¾^¾=¾j¾j¾‹¾‹¾ª¾µ¾»¾Ѿâ¾ç¾ç¾ý¾¿%¿<¿A¿I¿M¿O¿v¿Œ¿�¿›¿¬¿½¿Ô¿Ü¿á¿å¿ê¿û¿ÀÀ À3À8ÀQÀbÀfÀfÀxÀxÀxÀxÀ}À°À�ÀÝÀ¼ÀéÀéÀ +ÁÁÁ1ÁBÁGÁRÁcÁtÁ‹Á“Á˜ÁœÁ¡Á²ÁÄÁÌÁÒÁæÁèÁÂÂÂÂÂ0ÂAÂXÂoÂtÂ|€‚©¿ÂÃÂÃÂÐÂÐÂÐÂÐÂçÂíÂ÷ÂþÂþÂÃ(Ã(Ã;Ã;ÃIÃKÃKÃYÃYÃoÃÑèèûÃÀÃÀÃÜÃçÃÄÄ"Ä0ÄNÄFÄsĜĜĜĩÄâÄçÄçÄöÄüÄÅ&ÅEÅ5ÅQÅgÅuÅ�ţŧŷÅÖÅÆöÅÆÆ3Æ3ÆRÆ]ÆcÆyÆŠÆ�ƥƻƿÆÊÆ߯ôÆ ÇÇÇÇ!Ç6ÇLÇTÇZÇnÇsÇŒÇ�ǡǡdzdzdzdzǸÇëÇØÇ÷Ç&ÈÈ2È2ÈSÈ^ÈdÈzÈ‹È�țȰÈÅÈäÈìÈñÈõÈúÈÉ%É-É3ÉGÉLÉeÉvÉzÉzəɯÉÅÉÉÉÉÉÖÉÖÉÖÉñÉ÷ÉÊ Ê Ê#Ê=Ê=Ê=ÊTÊTÊbÊgÊgÊuÊuʋʛʵÊÐÊÐÊãÊèÊèÊËË3ËCËQËQËv˒˒˟˿˿˿ËAÌfø$ @ ž×ž×¸×à×Ã×ì×ì×ù× Ø%ØØ=ØUØBØhØaØtØtØ�Ø”Ø­Ø¦Ø¹Ø¹ØÆØåØåØïØg�5„þªþª«6«Q«=«q«]«}«“««³«Ÿ«¿«Ë«ЫÜ«ì«ó«¬ ¬¬"¬*¬/¬;¬@¬T¬[¬_¬j¬o¬z¬“¬œ¬¨¬­¬Á¬Ȭ̬̬ѬѬç¬ì¬­­)­.­9­A­A­A­C­\­q­|­†­‘­“­ž­¦­¦­³­«­Ë­ë­hÈ $ ŽÖŽÖ¨ÖÌÖ¯ÖØÖñÖêÖ ×× ×1×*×=×V×O×b×b×o׎׎ט×iÐà ÷ .á.áHáTáká|áƒáœá”á´áÔáÀáàáñáâóá â,â,âDâDâNâj˜% 5 ..HZZa€€’¦´­ÌÌÖk°äÖ§Ö§ô§û§¨¨¨¨.¨9¨D¨U¨f¨}¨�¨†¨ЍŒ¨�¨¯¨µ¨»¨ͨϨè¨÷¨û¨û¨û¨©#©#©/©5©?©J©X©_©_©n©p©†© © ©²©lø‡£FyFy\yfyfyvyy‚yˆyˆy’yªyªyºyÃyÆyÌyÌyÓyÚyÜyÜyÜyæym(Eg~”~”¬”ƔƔٔݔü”•••"•*•2•G•S•d•i•z•Ž•“•••®•ƕȕȕá•ù•ù•K–np%0nAnAwA‚A�A˜A£A­AËAÖAæAoXÑV3V3n3t33”3™3Ÿ3¢3¦3¦3Æ3Ë34í3 4&4424K474W4b4g4q4t4x4}4–4‚4¢4¢4¢4§4¼4Á4Ç4Ê4Î4Î4î4ó4)5555N5:5Z5p5\5|5‡5Œ5’5•5™5›5´5 5À5À5À5À5Ø56 6p°„ +— +.ê.ê<êCêbê�êƒê¢êÁêÐêØêãêåêðêûêë ëqh J^6^6r6}6¤6¼6Á6Æ6Ê6Ì6Ò6Ø6î6Û6ú6ú67177=7d7|7�7†7Š7Œ7’7˜7®7›7º7º7Í7Õ7ç78ú7 88rð`»~�~�’�š�§�Ç�Ö�Ý�ç�í�ó�÷�û�‚‚‚‚#‚2‚6‚6‚L‚g‚k‚p‚p‚w‚z‚‚‹‚™‚�‚®‚½‚Á‚ÂÒ‚Ö‚Ö‚ì‚ü‚ƒƒƒƒƒ(ƒ2ƒ=ƒcƒnƒrƒwƒ­ƒăσÓƒäƒïƒóƒõƒ„„„„„"„&„(„(„3„7„7„I„U„Y„Y„Y„]„¤„s¸»ï¦„¦„º„DŽDŽDŽɄɄЄÒ„Ò„Ù„Û„Û„è„ê„ê„÷„þ„…… ………….…3…3…{…tÀ�EÞ‹Þ‹ŒŒ-ŒFŒFŒWŒWŒdŒ‚ŒŠŒŠŒ·Œ¼ŒåŒ��#�'�J�p�u�u�ž�¸�Þ�õ�û�ÿ�Ž Ž%Ž6Ž>Ž\ŽbŽfŽŽ‡Ž¦Ž«Ž¼ŽÄŽãŽèŽðŽöŽúŽþŽ��$�8�=�O�T�e�j�ƒ���¤�¯�¸�Õ��$�)�)�)�9�@�N�[�t�t�‹�����§�©�©�½�¿�¿�Ö�Ø�Ø�ï�ñ�ñ�‘‘‘‘‘.‘S‘e‘j‘j‘j‘j‘q‘¥‘¶‘ˑˑˑؑï‘ñ‘ñ‘ñ‘þ‘’’’$’;’;’;’T’V’o’„’„’„’ˆ’Š’Š’Š’�’‘’‘’–’–’ ’¥’¥’º’º’º’Â’Ç’Ç’Ç’Ï’Ô’Ô’Ü’Ü’á’è’“““-“-“-“-“-“@“X“`“`“z”uè@ z öØöØÙÙ%Ù,Ù3Ù8Ù:ÙAÙHÙLÙ_Ù‘ÙœÙÇÙÌÙíÙíÙùÙÚÚJÚOÚ|Ú„Ú‰Ú’ÚžÚ¦Ú­ÚÌÚÒÚñÚóÚÛÛ4ÛSÛYÛ`Û`ÛfÛiÛmÛ~ÛžÛ°Ûv8÷ ; +NâNâbâiâ|â¯âºâºâÊâùâùâã ããVãXã…ã�ã�ãºã¿ãÞãùãÿãä#ä%ä0ä8äSäXäaämäuä€ä‡ä´äÓäÕäôä!å0å)åVå[åbå�å å¢åÁåàåûåææææJæJæVæw¸� ¤ ¶ö¶öÄöÐöîö +÷÷.÷A÷L÷N÷m÷u÷€÷“÷Œ÷«÷±÷xè.Hžužu­u²uÆuÏußuôuvv!v5v>vNvcvsvƒv…v˜v«v«v«v±vyhoyΊΊÞŠãŠéŠíŠñŠ‹‹zЛ²®;®;À;Ì;â;ï;ó;<!<%<+<J<><[<]<]<Ž<|<]<­<·<{Á á þøþøùùù)ù9ùYù^ùeù…ù‡ù§ù³ùÃùãùèùïùïùïùõùøùüùúú'ú2úRú\ú|ð>Y‰‰&‰?‰?‰I‰N‰N‰N‰m‰z‰|‰|‰|‰|‰‰‰‘‰¤‰¸‰º‰º‰‰Õ‰Õ‰Š}€YfŠŠ Š*Š4Š4ŠSŠ`Š`ŠcŠeŠkŠ~XZ ‚ ® +® + +Í +Ø + å + % X 8 , ~ ƒ ® ³ ¿ æ ë í   .  F M n ` T ‚ „ � � � © @5 Z ÖÖêõ :   ` b � � š Ó Ø ä ï ñ  + + +> +0 +$ +R +T +m +m +z +¡ +¡ +¡ +­ +€â  žž®µÇÏÚÚééý +::IQ\doz…�›¦¦¸¸À�H 1æ†æ†‡ ‡ ‡ ‡>‡N‡S‡S‡b‡t‡އ–‡�‡Ÿ‡²‡º‡º‡º‡¼‡¼‡¼‡¼‡ччччã‡å‡å‡å‡ø‡ˆ§ˆ‚€1>®ˆ®ˆ¸ˆÀˆʈʈéˆöˆöˆùˆûˆ‰ƒˆao^/^/n/n/~/”/€/ /¢/´/Æ/Î/„`o˜Î/Î/à/ë/0000&0,0,0<0T0A0`0c0h0~0ƒ0˜0…0¤0§0§0·0Ì0¹0Ø0Þ0Þ0ñ011*1=1G1…`˜ÁN1N1`1k1€1…1š1‡1¦1¬1¬1¼1Ô1Á1à1ã1è1þ1222$2'2'272L292X2^2^2q2„2—2ª2½2Ç2†˜ÁÑÎ2Î2Þ2Þ2î23ð233%383C3N3V3‡ˆ .uu%u*u>uGuWulu|u‘u‘u‘u—uˆ(! C žñžñÈñÍñãñëñüñ +òòòòòò2ò2ò\òaò…ò�ò’ò™ò¯òÅòÇòÝòóòöò ó#ó5ó‰8C ‡ 6ó6ódózó‚ó�ó”ó›ó¤ó¦ó©óÈóÏóêóìóóóôôô ô#ôBôBôBôPôZôgôgô‡ô‰ô£ô«ô«ôÇôæôëôòôõõ*õ,õ3õNõdõ{õ~õ†õ“õ“õ³õµõÏõ×õ×õóõ +ö +ö0ö0öBöŠøï ~…~…ž…²…½…Ò…ð…û…††††5†7†7†7†D†\†^†^†p†}†•†•†¦†â†‹P 6656"6A6P6X6ŒˆK™F¡F¡j¡w¡z¡�¡‡¡ž¡µ¡Ì¡¢+¢E¢J¢O¢Z¢q¢q¢ƒ¢�¢£¢¹¢Í¢Ò¢Ý¢ý¢££ £9£A£I£N£h£‚£Š£’£—£±£¹£¾£Þ£ã£æ£¤¤"¤*¤,¤F¤`¤h¤p¤r¤Œ¤”¤”¤™¤ž¤©¤©¤´¤´¤À¤À¤Ò¤¥(¥(¥8¥�èJ„8808<8G8L8X8c8h8o8t8t88„8„8£8Â8Ä8É8É8Ô8Ù8Ù8ø894949G9Z9m9€9…9…9˜9«9¾9Ñ9Ö9Ö9é9ü9:":$:$:7:J:]:p:p:š:ŽøÉ%Æ=Æ=ä=ð=û=>> +>)>.>D>[>H>g>v>ˆ>‘>™>¡>»>Í>Ö>Þ>æ>þ>ë> +??&?.?3?M?:?l?Y?x?�?z?¬?™?¸?Ê?Ô?Ü?Ü?å?õ? @@;@?@?@F@K@]@o@q@v@ˆ@“@›@›@›@Ÿ@¸@Â@Ê@Ê@ã@í@í@AAA%A6A;ALAPAUAgA�˜žÎÎÎì,HUlŠŒ¬´´ÃÃË×í  /555:?NNZqsx‡‡“ ªª¸�� % ¶¶ÆÒÝóßÿ '‘@  vvŠ«³’@  66Jks“p ÆÆçÔóþ  +1”�HW¶v¶v¿vÓvÜvìvww)w+wBwYwYw^w• Wh^w^wgw{w„w”w©w½wÑwåwçwþwx,x,x1x–˜hx6x6xFxZxcxsxˆx—x™x¨x«x°x¸x—�x‡¾x¾xÎxâxëxûxy y0y3y8y@y˜x –t–t¥t¹tÂtÒtçt÷t u uu™`‡ � FöFömöZöyö�öˆö§ö¯öšÐ²É¾<¾<Ð<Ü<ò<ÿ<==+=/=5=T=H=e=g=g=˜=†=g=·=Á=› á  ^ú^únúuú‡ú¦ú¬ú³úÒúÔúóúû$û*û1û1û9ûAûLûWû_ûgûrû}ûˆû§û¯ûœ Îï¾¾ØØàì!!-?EEEJO]]i�†”” ­´´Â�`fonŠnŠ|ЂІХЯЯŠÌŠž¸8Lx2x2‚2Œ2ž2¥2¯2±2±2Å2Ê2æ2÷2ù23333M3Ÿ@LQP3P3U3_3|3 HGXXr‚‚ŒŒ–– ²¿ÂÄÍÚÚÚôûû  2 2 @ O ^ t t t t „ „ „ – – ¤ ² È È Þ  + +: +M +M +[ +i +q +q +q +ƒ +¡ˆGµˆ +ˆ +ž +¡ +° +° +½ +Î +Î +Ñ +Ô +Ô +Ù +Þ +ç +ç ò -ò -   4 4 4 4 D D D V V d r ˆ ˆ � ¿ Ô ö  % - - - ? LPGMˆGµ@ @ Z b q q  � � “ – – ›   © © ´ º Ã × Ü ñ ü    / : E h { � – › ¢ · ¾ Ã × $))06;;Tz€…£ªªª¯²¸¿ÆËËÒØÝÝï  068RYYY[[[agkmq{ˆŒŽ’’——¨ºNxGµO848ˆ:Œ:“:•:P48Q@+0X:b:j:o:R+0SXD@g@gVgrg}g‘gŸg®g®g®g¿g¿gÎgÎgÔgÖgÖgÜgÞgÞgägægægígñgögögögögögögþghhh"h+h5hBhWhYhthvh‘h–h±h¶h¼h¾h¾hÓhÖhÖhýh -i"i"iBiBiKiPipi^ivi…iŠi‘iši­iµi½iÂiÂiÂiËiäiîiîijjj/jEjGjOjUj]jbjbjhjhjqjqj‚j„j™j›j£j©j±j¶j¶j¼j¼jÅjÔjèjêjòjøjkkkkkk'k)k=k=kEkKkSkXkakikrkxk~k€k€k€kˆkˆk–kªk®k°k¼k¾kÙkßkçkìkõkll lllll)l7lyHyNy\yfy�y y¥y³yÍyÒyÒyÒyÚyßyèyíyíyøyzzzzzzz.z8z>zLzVz�z�z•z£z½zÂzÂzÂzÊzÏzØzÝzÝzèzðzõzõzõzûz {{%{*{*{0{>{S{X{X{^{p{y{�{‰{Ž{Ž{”{¦{²{Ã{Ð{×{ß{ç{ì{|||||||-|-|-|-|1|6|6|A|E|J|V|\|a|j|�|‰|Ž|˜|˜| |¦|¸|Ã|È|Î|Ö|Û|Û|Û|Û|Û|Û|Û|Û|Û|Û|ø|} }}}"}+}4}C}L}T}Y}Y}Y}_}g}l}l}p}u}u}~}Œ}˜}¥}«}«}´}Ì}Ì}Ö}ß}÷}÷}~~~~0~0~9~>~>~G~L~L~T~Y~Y~v~„~�~�~£~®~¶~»~»~»~×~à~ê~ê~   %%BPY^^^dhmmmmrx~�•™8�T2D - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -  - - - - - - - - - - -  - - -    - - - -  - - - - - - - - - - - - - - - -  - - - - - -   - - -UpŽ™ÌAÌAÖAÝAèAðA÷AýABB BVŽ™W¸CW???#?/?6?B?J?S?W?b?b?q?z?†?�?•?�?XCWY¨˜ªPYPYbYlYtYxY‡YšY¨Y®YºYÂYÍYÓYÖYàYZ˜ª[ˆ™§ B B"B)B2B>BSB[BaBgBiBiBxB\™§] –§`�`�n�|�‡�Ž�¤�©�Æ�Ì�Ó�Ú�è�ô�&‘^–§_àD]8�8�R�V�Z�b�p�s�v�…�‰���•���©�©�Ê�ã�ê�ñ�ñ�þ�ŽŽ`#D]aH§m|B|B�B˜BžB£B£B£B¹BÀBÂBÕBÕBÕBÜBçBëBïBòBûBþBCCCCECQCbCrCˆC�C“C–C›C›C³CºCÇCÎCáCéCéCúCDDD D+D+D>> >3>>>I>o>o>…>–>�>«>«>Ä>Ê>Ê>Ý>ò>ú>ý> ?j'&CkxéõØ[Ø[ä[ë[ -\\#\.\6\N\V\léõmxÝéH[H[T[[[z[z[‘[—[—[¤[¼[Ø[nÝéoð]xŽŽ*Ž6ŽAŽQŽQŽTŽcŽiŽiŽvŽxŽ~Ž~Ž‹Ž�Ž“Ž�ޤީޫ޵Žp%]xqˆx†¸Ž¸ŽÁŽÇŽâŽçŽ��1�W�^�o�‚�rx†sÀwŒ¸@¸@Á@È@Ü@å@ê@A A+A-AKAMA^AqAzA|A�AšAÈAt wŒu˜†–ˆ�ˆ�œ�³�¸�Ñ�Ö�ï�ñ����!�(�[�v†–w¸Wk ? ?®?µ?·?Ã?Ê?Ù?ä?ð?ô?@@@!@+@.@8@xWkyPmtlXlXvXXŒX’Xzmt{˜.^€]€]œ] ]á]ñ]÷]^0^@^@^E^I^I^P^[^f^s^|^|^�^†^�^˜^˜^¥^§^´^¶^¸^º^º^º^Â^Â^Â^Ê^Ò^Ú^â^æ^ð^._|:.^}¸  Ø\Ø\ê\ê\î\ó\] ]]]]]]/]1];]~  � .@]@]P]T]Y]Y]d]d]n]t]t]x]€]€ .�øƒŸ(`(`8`G`K`T`b`q`€`€`–`–`à`à`ä`ë`ð`þ` a a#a&a+a4a@a‚&ƒŸƒ@^ƒ0_0_@_D_M_P_Y_b_b_r_r_œ_ _¥_¨_±_±_Á_Ç_Ê_Ò_Õ_â_ê_ò_ú_````!`„/^ƒ…PQX66 6/63666<6†QX‡ðŸº@a@aNaPaTa]aiauauaˆaˆaµa¹a¾aÊaÊaÞaèaëaöaùab bˆ%Ÿº‰põX\X\h\l\q\{\†\‰\�\•\Šõ‹p ˜\˜\¨\¬\±\»\Å\È\Ì\Ô\Œ �P &::#:4:7:=:Ž &�@ ð9ú9::� ‘8v¸{¸{Î{×{í{í{ò{ú{| -|||%|2|2|7|<|<|A|F|F|K|P|P|U|Z|Z|_|d|d|i|n|n|s|x|x|}|‚|‚|‡|Œ|Œ|¥|¸|½|Â|Â|Ë|è|è|î|ö|û|}}}}}} }(}(}.}6};}@}H}H}N}V}[}`}h}h}n}t}|}�}†}Ž}Ž}”}š}¢}§}¬}´}´}º}À}È}Í}Ò}Ú}Ú}Ú}ë}ó}û}~ ~~'~,~4~4~K~[~l~q~x~x~‰~“~˜~Ÿ~Ÿ~£~´~¹~Á~Ï~Ý~å~é~î~ö~#.DPU]ao}…‰Ž–¤²º¾ÃÎÓ뀀 -€ €{‚’®v“@Ñvðtðtuu%u%u*u2u:uBuPuUu]ujujuoututuyu~u~uƒuˆuˆu�u’u’u—uœuœu¡u¦u¦u«u°u°uµuºuºu¿uÄuÄuÝuðuõuúuúuv v v&v.v3v8v@v@vFvNvSvXv`v`vfvnvsvxv€v€v†vŽv“v˜v v v¦v¬v´v¹v¾vÆvÆvÌvÒvÚvßvävìvìvòvøvww -wwww#w+w3w;wCwQw_wdwlwlwƒw“w¤w©w°w°wÁwËwÐw×w×wÛwìwñwùwx xx!x&x.xäFäKäSäbäqävä‚ä‹ä�ä˜ä˜ä˜ä¼äÄäÉäÎäåäîäöäÿäÿäÿä å#å/å7å<åBåBåDåVå¢éà£8%88DUXamm{‰ ¶Ôó-<AMV^fllqv‚Š�’š¤.%¥p¯º@t@tItItItWt^thtktpt¦¯º§pºÅptptytytyt‡tŽt¢t¥tªt¨ºÅ©hÅϰt°t¹t¹tÀtÀtÍtátätétªÅÏ«@.3HÃHÃVÃ\Ãbì.3­PŽ•VrVrdr{r�rŽrÆr®Ž•¯@ �9™9¡9¦9° ±@ x9�9‰9Ž9² ³�34£PƒPƒkƒvƒ‰ƒ‰ƒ•ƒ§ƒ±ƒ±ƒ½ƒσσäƒïƒ÷ƒÿƒ„„+„+„C„H„H„X„d„o„„„Ž„–„�„­„­„¼„Ą˄ۄۄۄë„ñ„ý„ý„……*…/…4…?…D…D…I…b…q…v…{…†…‹…‹…Ÿ…¨…³…º…Â…Ê…Ï…×…Ú…ß…è…ú…††$†$†)†1†9†>†F†I†I†N†N†N†W†^†e†p†~†¹†¾†Ć͆͆܆ã†ë†÷†ÿ†‡‡ ‡ ‡&‡-‡2‡8‡D‡L‡T‡T‡T‡T‡T‡T‡T‡T‡T‡Y‡Y‡]‡]‡k‡s‡{‡ƒ‡Œ‡›‡ ‡ ‡¯‡½‡ȇ͇Õ‡Ú‡â‡ç‡ñ‡ü‡ˆ ˆˆˆ(ˆ1ˆBˆRˆRˆWˆWˆfˆtˆ†ˆ‹ˆ“ˆ˜ˆ ˆ¥ˆ¯ˆÁˆƈΈÓˆÛˆíˆöˆ‰‰‰‰‰0‰6‰A‰F‰H‰X‰]‰]‰y‰ ‰²‰»‰̉܉܉á‰á‰ï‰÷‰ Š Š)Š.Š3Š;ŠCŠVŠ[Š`ŠhŠpŠpŠpŠuŠuŠuŠuŠuДФЩЩнŠÊÊÙŠêŠïŠñŠ -‹‹‹#‹+‹3‹8‹J‹S‹d‹t‹t‹y‹y‹‘‹—‹—‹­‹¾‹ËÈ‹á‹æ‹ò‹ú‹Œ -ŒŒ!Œ*Œ;ŒKŒKŒPŒPŒbŒoŒyŒ�ŒŠŒ•ŒžŒ©Œ²ŒÀŒÒŒÛŒìŒüŒüŒ���%�%�;�L�Q�V�e�j�y���‡���—�œ�®�·�È�Ø�Ø�Ý�Ý�÷�ŽŽŽ(Ž-Ž2ŽAŽFŽYŽaŽgŽoŽwŽ|ŽŽŽ—Ž¨Ž¸Ž¸Ž½Ž½Ž׎áŽáŽ÷Ž� ���$�)�.�J�c�c�h�h�t�y���†�Ž�–�™�ž�ž�Â�Ê�Ò�×�ß�ï�ô�ô�� � �%�%�1�7�?�D�L�T�W�\�\�€�ˆ�Ž�–�¦�«�Ì�á�é�‘ -‘‘‘ ‘'‘*‘D‘L‘g‘m‘u‘z‘‚‘Š‘�‘�‘�‘®‘‘ΑÔ‘Ü‘á‘é‘ñ‘ô‘’’(’F’L’T’Y’a’i’l’†’’’°’¶’¾’Ã’Ë’Ó’Ö’Ö’Ö’Ö’è’ñ’“““)“)“.“.“W“q“{“{“—“­“²“·“·“É“ΓÓ“ñ“û“” ”””"”*”-”V”^”d”l”|”�”�”�”“”œ”±”¶”̔ܔܔá”á” -•$•.•.•J•`•e•j•j•••š•­•ø•–––0–9–N–S–i–y–y–~–~–˜–¤–¤–¯–¹–¹–Ë–Ô–é–î–—————3—?—?—N—X—X—j—s—ˆ—�—£—³—³—¸—¸—Ò—Þ—Þ—í—÷—÷— ˜˜'˜,˜B˜R˜R˜W˜W˜q˜{˜‡˜Œ˜‘˜‘˜£˜¨˜­˜ɘÕ˜Ú˜â˜è˜ð˜ü˜™™"™/™;™@™H™M™U™]™`™e™�™–™ž™¹™¾™Æ™Ë™Ó™Û™Þ™ø™šš)šIšNšVš[šcškšnšnš�šŽššš š¨š­šµš½šÀšÅšášöšþš› ›'›,›4›<›?›Y›a›a›Š›ª›°›¸›½›Å›Í›ЛЛã›ð›ü›œ œœœœ!œ&œBœWœ_œ|œ�œ‰œŽœ–œžœ¡œ»œÜÜîœ���"�*�2�5�5�H�U�a�g�o�t�|�„�‡�Œ�¨�½�Å�ã�é�ñ�ö�þ�ž ž#ž+ž+žWžzž€žˆž�ž•ž�ž ž ž ž ž ž²ž»žОÕžëžûžûžŸŸŸ$Ÿ0Ÿ5Ÿ:Ÿ:ŸLŸQŸVŸdŸrŸŸ‹Ÿ‘Ÿ™ŸžŸ¦Ÿ®Ÿ±Ÿ¶ŸÒŸçŸïŸ -    % - 0 J R R { › ¡ © ® ¶ ¾ Á Á Á Ô á í ó û ¡¡¡¡¡4¡I¡U¡s¡y¡�¡†¡Ž¡–¡™¡³¡¿¡¿¡ë¡¢¢¢!¢)¢1¢4¢4¢4¢4¢4¢F¢O¢d¢i¢¢�¢�¢”¢”¢«¢Á¢Æ¢Ô¢ߢä¢ö¢ÿ¢££/£?£?£?£S£c£h£h££•£š£¨£·£¼£Σ×£ì£ñ£¤¤¤¤+¤;¤@¤@¤Z¤d¤d¤…¤ ¤¥¤¥¤ϤԤ٤٤é¤ò¤¥¥¥¥!¥6¥;¥Q¥a¥a¥a¥u¥…¥Š¥Š¥¤¥®¥®¥Ï¥ê¥ï¥ï¥¦¦#¦#¦3¦<¦K¦K¦P¦b¦k¦€¦…¦›¦«¦«¦«¦¿¦ϦÔ¦Ô¦î¦ø¦ø¦§4§9§9§c§h§m§m§}§†§•§•§š§¬§µ§ʧϧå§õ§õ§õ§ ¨¨¨¨8¨B¨B¨c¨~¨ƒ¨ƒ¨­¨²¨·¨·¨ǨШߨߨä¨ö¨ÿ¨©©/©?©?©?©S©c©h©h©©š©Ÿ©±©º©Ï©Ô©ê©ú©ú©ª -ª -ª!ª7ª<ªNªWªlªqª‡ª—ª—ª¢ª§ª§ª¾ªáªæªøª«««1«A«A«L«Q«Q«c«t«�«‰«œ«¥«´«½«Ó«Ó«å«î«¬¬¬¬¬X¬X¬X¬o¬Œ¬œ¬À¬ЬÕ¬Õ¬Õ¬Þ¬õ¬­­ ­ ­%­%­e­e­e­|­�­Í­Ý­â­ë­®®®-®-®2®2®r®r®r®‰®œ®Ú®â®ç®ð®¯¯#¯2¯2¯7¯7¯7¯w¯w¯€¯—¯ª¯³¯¯¯ǯǯ°°°#°2°7°@°O°O°p°~°ƒ°ˆ°�°˜° °³°¸°½°ŰͰÕ°Õ°Ú°Ú°Ú°Ú°Ú°Ú°±±#±2±7±7±7±F±K±K±]±i±u±~±�±�±�±�±�±�±�±�±�±�±�±�±�±�±�±�±�±�±�±�±�±�±�±�±�±�±�±�±�±�±�±�±�±�±�±�±�±�±�±�±�±�±�±�±�±�±�±�±�±�±�±�±�±�±�±�±�±�±�±�±�±�±�±�±�±�±�±�±�±�±�±�±�±�±�±�±�±�±�±�±’±’±’±’±’±˜±�±�±¦±´±±DZϱÔ±ã±î±ù±ù±²²²²²$²$²9²A²T²b²g²o²t²|²‡²’²’²™²™²®²¶²¶²½²½²Ò²Ú²å²ù²³³³³ ³ ³"³)³)³7³E³H³M³Z³a³i³i³l³s³s³�³�³’³—³¨³¯³·³·³¼³¼³ųÓ³á³æ³î³ó³´ ´´´ ´ ´4´<´<´C´C´X´`´s´�´†´Ž´“´›´¦´±´±´¸´¸´Í´Õ´Õ´Ü´Ü´ñ´ù´µµ µ%µ0µ;µ>µ>µAµHµHµVµdµgµlµ}µ„µŒµŒµ�µ–µ–µ¤µ²µµµºµ˵ҵڵڵߵߵ赶¶¶ ¶$¶6¶A¶L¶L¶S¶S¶h¶p¶p¶w¶w¶Œ¶”¶”¶”¶”¶”¶”¶”¶”¶”¶”¶™¶™¶™¶­¶²¶²¶²¶ƶƶƶƶƶƶƶƶƶƶƶƶƶƶƶƶƶƶƶƶƶƶƶƶƶƶƶƶƶƶ˶˶˶˶˶˶˶ѶÖ¶Ö¶ê¶í¶ô¶þ¶· ···%·*·*·5·@·[·h·ƒ·˜·¦·¬·º·Å·зë·¸¸¸"¸-¸8¸V¸Z¸h¸s¸~¸™¸¯¸µ¸½¸½¸½¸½¸½¸½¸½¸½¸½¸½¸½¸½¸½¸½¸½¸¸¸͸߸긹¹!¹<¹>¹g¹g¹l¹l¹t¹t¹�¹›¹º¹¿¹˹عع󹺺º'º6º@º@ºRºRºRºbºwºwºŠºÂ´y4£   - - - - - - - - - - - - - - - -   - -   - -   - -   - -   - -   - -     µà3ŒhÃhÃzÅÚÜåýÃÓÃâÃêÃøÃüÃÄÄÄ"Ä&Ä&Ä9ÄRÄ�ÄcĢĶÄÇÄ×ÄíÄíÄÅ!Å2Å4Å4Å?Å~Å~Å�ņʼnʼnŔŔťźÅÅÅÐÅØÅàÅäÅûÅûÅÆÆÆ(Æ0ÆBÆLÆ^ÆhÆxƄƉƉƙơƳƽÆÏÆÙÆéÆõÆúÆúÆ -ÇÇ$Ç.Ç@ÇJÇZÇfÇkÇkÇkÇÇ�ǗǜǩǵǵǺÇÅÇÔÇÙÇÞÇãÇãÇèÇóÇÈÈ È È È È È È È È ÈÈÈÈÈÈÈÈÈÈ!È!È0ÈBÈNÈWÈdÈpȃȋÈ�È�ȫȿÈÐÈñÈöÈ É É6É?ÉHÉUÉ]ÉpÉxÉ}É}ɂɂɂɂɂɎɎɎɖɳÉÌÉÔÉïÉÊ!Ê#Ê7Ê7Ê7Ê7Ê7Ê7Ê7Ê7Ê<Ê<Ê<ÊKÊYÊ^Ê^ÊiÊwÊ|ʔʠʩʩʾÊÊÊÏÊÞÊâÊêÊËËË!Ë'Ë:ËBËNËbËs˔˙˞˞˞˞˩˷˼ËÎËÚËãËïËôËøËýËýËýËýËýËýËÌÌÌÌÌÌÌÌÌÌÌÌÌÌ0Ì0Ì0Ì0Ì0Ì0Ì0Ì0Ì0Ì0Ì8ÌUÌrÌ~̙̪ÌËÌÍÌáÌíÌòÌòÌòÌûÌÍ%ÍPÍ\Í\ÍaÍaÍaÍaÍaÍaÍaÍaÍaÍzÍzÍzÍzÍzÍzÍzÍzÍzÍzÍzÍzÍzÍzÍzÍzÍzÍzÍzÍzÍzÍzÍzÍzÍzÍzÍzÍzÍzÍzÍzÍzÍzÍzÍzÍzÍzÍzÍzÍzÍzÍzÍzÍzÍzÍzÍzÍzÍzÍzÍzÍzÍzÍzÍzÍzÍzÍzÍzÍzÍzÍzÍzÍzÍzÍzÍzÍzÍzÍzÍzÍzÍzÍzÍzÍzÍzÍzÍzÍzÍzÍzÍzÍzÍzÍzÍzÍÍÍ͇͇͔̓͛ͨ͠͠͠ÍÀÍÉÍÍÍØÍ ÎÎÎ Î(Î-Î-Î-Î-Î?ÎSÎqÎ|Î�Ά΋΋Î�αÎ×ÎâÎêÎïÎïÎôÎôÎÏÏ8ÏCÏHÏMÏRÏRÏdÏxϞϩϱ϶϶ϻϻϻÏÃÏàÏýÏ Ð(Ð9ÐZÐ\ÐkÐmÐmÐmÐmÐmÐmЂЂЂЂЂЂЂЂЂЂЂЂЂЂЂЂЂЂЂЂЂЂЂЂЂЂІІÐ�ÐšÐ¡Ð¡Ð¡Ð¡Ð¡Ð¡Ð¡Ð¡Ð¡Ð¡Ð¡Ð¡Ð¡Ð¡Ð¡Ð¦Ð¦ÐºÐ¼Ð¼ÐÆÐÆÐÍÐßÐ Ñ"Ñ5ÑJÑbÑeÑrÑ~ѬÑÏÑùÑþÑÒÒhÒhÒkÒ~Ò’Ò•Ò²ÒÀÒÄÒÄÒ×ÒñÒñÒÓ Ó/ÓDÓeÓvӰӜӈÓÀÓÒÓÒÓÕÓÚÓÝÓúÓÔ:Ô\Ô\ÔˆÔ‹ÔšÔ¯ÔÐÔáÔÕóÔ#Õ#Õ#Õ&Õ+Õ+Õ1Õ/ݶc3Œ   ·ÀàUXåXåjåå†å†åšåšå¥å¥å¶åÆåÑåáåæåëåóåóåæ æææ"æ&æ*æ@æ@æXæZæZæiæqæqæ€æˆæˆæ—æŸæŸæŸæ§æ§æ§æ«æ³æ¸æ½æ½æÁæÉæÍæÒæÒæÒæÒæÒæÒæÒæÒæÒæÒæÒæÒæÒæÒæ׿׿ãæüæ çç(ç-ç5ç5ç:ç:çDçPçiçyç‚çŠç�ç”ç§ç¬ç´ç´ç¹çÃçÑçýç è èè%è-è2èAèPèUèaègèlèlèlèlèlèlèlèlèlèzè†è—è§è¬è´è¹èÁèÅèØèÝèåèêèïèïèïè÷èüèéééé!é&é+é5éCéoé{éƒéƒé•éŸé¤é³éÂéÎéÔéÙéÞéÞéèéê ê$ê/ê7êLêNê]êeêzêzêŒê‘ê™ê¨ê·êÉêÏêÔêØêÜêëêþêë'ë/ëDëDëPëUëaëlëqëqë•ë²ë·ëÁëÖëáëéëþëììì/ì4ìBì\ìkìsìˆìˆì”ì™ì¥ì°ìµìµìµìµìµìµìµìµìµìµìµìµìµìµìµìµìµìµìµìµìµìµìµìµìµìµìµìºìºìºìÂìÂìÂìÂìÂìÂìÂìÂìÂìÂìÂìÂìÐìðìí%í*í2í7í?íCíGíZí_ígílítíyí�í…í‰íœí¢íªí¬íÌíÔíÙíáíåíéíòíúíÿíîîîHîTî\î\înîxî}î…î”î£î§îºîÀîÅîÅîÅîÅîÅîÅîÅîÅîÅîÅîÅîÅîÅîÅîÅîÅîÅîÅîÅîÅîÅîÅîÅîÅîÅîÅîÅîÅîÅîÅîÅîÅîÅîÅîÅîÊîÊîÊî×îäîèîõî ïï%ï/ïAïWïYïYïdïiï†ï†ï†ï†ï†ï†ï†ï†ï†ï†ï†ï†ï†ï†ï†ï†ï†ï†ï†ï†ï†ï†ï†ï†ï†ï†ï†ï†ï†ï†ï†ï†ï†ï†ï†ï†ï†ï†ï†ï†ï†ï†ï†ï†ï†ï†ï†ï†ï†ï†ï†ï†ï†ï†ï†ï†ï†ï†ï†ï†ï†ï†ï†ï†ï†ï†ï‹ï‹ï‹ï‹ï‹ï‹ï‹ï‹ï‹ï‹ï‹ï‹ï‹ï‹ï‹ï‹ï‹ï‹ï‹ï‹ï‹ï‹ï‹ï¤ï°ïÐïßïßïéïóïððð#ð#ð5ðBðBðGðGðbðsðvðyð�ð†ð†ð�ð˜ð ð¦ð®ð¾ðÎðÛðáðéðùð ññ"ñ"ñ'ñ'ñ'ñ'ñ@ñLñlñññ�ñ›ñ¿ñÇñÊñÏñÏñáñîñîñóñóñò'ò*ò-ò5ò:ò:òCòLòTòZòbòrò‚ò�ò•ò�ò­ò½òÐòÖòÖòÛòÛòÛòÛòÛòÛòÛòÛòÛòÛòÛòÛòÛòÛòÛòæòñòÿòóóó!ó+ó<óAóAóHóMóMóaóaófófófó|ó�ó¬ó¿óÅóÍóïóüó ô ôôôôô%ô+ô9ôKôKôRôaû¸àU         - - -     ¹p¬hûhûzûˆûˆû“û“û¤û¹ûÄûËûÜûïûõûõûõûüü%ü.ü8ü;üGüPüZü]übübüxü‚ü‚üšü¡ü­üÂüÉüÒüÞüóüúüúüúüýý ý#ý1ý;ý>ýPýPýUýZýjýmýrý‚ý…ý‰ý’ýšý¬ý±ý¹ýÈý×ý×ý×ýíý÷ý÷ýþþ"þ7þ>þGþSþhþoþoþoþ}þ‹þ•þ˜þ¦þ°þ³þÅþÅþÊþÏþßþâþçþ÷þúþþþÿÿ!ÿ&ÿ.ÿ=ÿLÿLÿLÿbÿlÿlÿ„ÿ‹ÿ—ÿ¬ÿ¶ÿÆÿØÿßÿîÿÿÿÿÿ",/=GJ\\afvy~–™�¦®ÀÅÍÜëë÷  7ºµ¬»à’ XXnq�‘™™´´ÂÊÍÖÖÝÝîþ  #+6B`etttzŒ¢®ÃÖÜä÷ý - ,ADDR]ky‡““Ÿ³¿ÈÜáø    9 < A A J ] c k ~ „ Œ Œ £ ¯ ¼ Ï Õ Ý ð ö þ þ þ þ ' -' -, -H -K -R -b -o -Œ -¥ -¶ -À -Í -é -ý -ý -A ¼ƒ’  - - - - - - - - -½€%’  ÂÔÜÜèèï##+088G`bjƒ‘›£¥°»»ÃÌ×àëõþ +=@EXXq…���Ÿ¢§ººÓçïï 5IQQ]ru~‘˜­ÆÈÝöþþ $))0;R¾w%’¿ð)<H H b u ƒ Œ ® ¸ Æ Æ ã ð ð ú ú   ! ! , , 3 = C I P e p Š � “ “ ¨ ­ ¸ à Ý ç ï  ' < H X ] ] c i t � ˆ © ­ ³ » À É ê î ô ü 0<@FNStx~†–±�½ÁÇÏÔõùÿ  AEKS\}�‡�›¨¯ÐÔÚâë *7>_ciq�¢¦¬´´¹ÆÍîòø15;CCCCHHHU\}�‡�˜¹½ÃËËØß -<@FNNNNZZeox˜¤µºËßßÿ  $-MZix’’²·¼¼ÇÏäïü!3EXPpuzzz~~—  ÃÈÍÍÕéò#..BPY^chhp{€€ˆ“˜˜ ¾¨ÖÛÛãë)?`l}‚“§§ÇÌÑåÑý!!->PUUiU�††Ž““ ¥¥²···ËÛàààô   -222FV[r[Š��šŸÛÉŸóø4"øLQQQ`puuu„”™™™¨¶»ãÑ»û(@Em[E…ŠŠŠ«•Õåêêê õ3CHHTYYejjj}�’’’¥µºººÍÝâââõ - - $$,119>>FKKX]]jo½«™oÊÏ ùÏ*///>Y^^^oŠ��� ®³³»ÀÀÈÍÍÕÚÚÚå5PUUU‘`°ËÐ ðÐ  Q ?  i n ˆ n   ¥  ¥ Ú ß ß ß ÿ    & 6 C U x } ” š ³ À ù !!!?!A!p!x!x!x!„!„!‰!‰!š!¿!Ê!Ô!ß!ä!ï!÷!ü!"" """("8"P"h"|"�"†"†"¡"¬"¶"»"Æ"Ð"Õ"Õ"à"ó"ý"#)#5#F#K#\#`#e#j#j#z#…#�#–#¡#®#¹#Ó#å#÷#$$$#$,$7$D$O$i${$�$�$’$—$—$¢$§$§$²$·$·$Â$Ç$Ç$Ò$×$×$ñ$ö$ö$þ$%%%%%%#%#%.%3%G%3%S%^%c%w%c%ƒ%Ž%“%“%ž%£%£%®%¼%Á%Á%Ì%×%Ü%Ü%í%ò%ò%&&&"&-&2&:&2&F&K&_&K&k&p&x&p&„&‰&�&‰&©&©&®&®&Â&®&Î&Î&Ó&ß&Ó&÷&ü&ü&'ü& '%'%'1'%'I'N'N'Z'N'r'w'w'w'‡'Œ' 'Œ'¬'¸'Ã'Î'Ó'ç'Ó'ó'ÿ' -(((.((:(K(P(P(X(](](e(j(j(s(x(x(�(†(†(�(”(”(Ÿ(¤(¤(¯(´(´(¿(Ä(Ä(Ï(Ô(Ô(ß(ä(ä(ï(ô(ô(ÿ()))$)/):)E)J)J)W)\)\)i)n)n)x)})})‡)Œ)Œ)–)›)›)¥)ª)ª)²)·)·)Ä)É)É)Ö)Û)Û)Û)Û)Û)ã)è)è)ð)õ)õ)ý)** -******$*)*)*)*)*)*=*B*V*B*b*s*x*x*Ž*™*™*½*Â*Ø*ã*ü*è*+++#+#+9+D+D+h+m+ƒ+Ž+§+“+³+¾+É+Î+Î+ä+ï+ï+,,.,9,R,>,^,i,t,y,y,£,�,¯,¯,Ó,Ø,î,ù,þ,- -=-)-I-b-N-‚-n-Ž-™-ž-ž-È-´-Ô-Ô-ø-ý-..#.B...b.N.n.‡.s.§.“.³.¾.Ã.Ã.í.Ù.ù.ù./"/8/C/H/g/S/‡/s/“/¬/˜/Ì/¸/Ø/ã/è/è/÷/ü/ü/ 000!0&0+0+0<0A0F0F0S0b0g0l0l0y0ˆ0�0’0’0´0¹0¾0¾0à0å0ê0ê0 111181=1B1B1B1d1‹1�1•1•1·1¼1Á1Á1Á1ã1 -222262;2@2@2@2b2‰2Ž2“2“2µ2º2¿2¿2¿2á23 3334393>3>3Y3^3c3c3c3~3ƒ3ˆ3ˆ3ˆ3£3¨3­3­3­3È3Í3Ò3Ò3í3ò3÷3÷3÷34444474<4A4A4A4\4a4f4f4w4|4�4�4’4—4œ4œ4©4»4Þ4ü4ü4ü455&545S5^5ƒ5§5¹5Ä5Ù5é5î5î5ù5þ5þ566'606;6O6Y6l6s6s6s6�6†6—6¬6±6Â6Í6Õ6Ú6Ú6ß6ß6ã6ç6ó6ý67 7 7777&7&7&7&7+7+7+75757:7:7D7D7Q7q7v7v7€7€7…7…7Œ7Œ7™7¤7²7½7È7Ó7Þ7ã7 88$848]8U8u8u8u8�8Š8�8ž8ž8´8Á8Ù8â8ê8 -9 -9 -9 -9.989M9k9k9k9š9¤9¤9½9Â9Þ9ó9ý9ý9/:6:;:A:G:N:S:Z:c:y:y:}:}:ž:¥:ª:ª:®:·:Ä:Ö:ë:;; ;%;6;U;q;ˆ;‹;�;›; ; ;¤;¤;Ï;Ú;Ú;Ý;ï;ï;!<D<D<D<zCÀE<   - - - - - - - -  - - - - - - - -   -  Á€˜¥`s`srs�sŽs•s s s­s¾sÃsÍs˜¥Ã@Ø9â9ê9ï9ÄÅPVìVì_ìlì~ì‹ì‹ì«ìÆÇH]ƒ¾@¾@Ô@Ú@á@é@ñ@ô@ÿ@AAA A(A:A:A=AEA[A^AlAoArAyA}A…A“A“A§A­AµAòAÈ0]ƒÉ€ÌYˆ½ˆ½š½«½³½»½Ã½Ë½Ó½Ó½á½ô½ ¾¾#¾#¾+¾4¾:¾?¾?¾G¾P¾V¾[¾[¾c¾l¾r¾w¾w¾¾ˆ¾Ž¾“¾“¾œ¾¨¾¬¾±¾·¾¼¾¼¾Ä¾Í¾Ó¾Ø¾Ø¾ò¾¿¿¿¿¿¿¿¿¿¿¿$¿&¿&¿&¿.¿0¿0¿=¿=¿C¿H¿O¿Z¿Z¿j¿j¿j¿q¿|¿|¿Œ¿Œ¿—¿›¿¡¿¹¿Ç¿Ú¿æ¿ÀÀ À À'À0À;À;ÀFÀLÀQÀXÀcÀhÀoÀzÀ†ÀŒÀŒÀ£À«À±À±ÀÓÀßÀåÀêÀñÀüÀüÀÁÁÁ Á"Á"Á)Á4Á4ÁAÁAÁAÁAÁÂÊ—ÌY  ËøÙ~ã~ã”ã›ã¦ã³ã¾ãÃããããã÷ãÿãää;äOäZä`äyäyä‰ä‰ä ä¢ä¥ä±ä¹äÁäÉä×äÝäãäïäïäñäååååå.å.åNåNåcåpåuåuåuåŽå—å²åÄåÒåßåïåüåüå ææ æ,æ.æ.æ6æ;æ;æCæHæHæPæUæUæ]æbæbæiænænæuæzæzæ…æŠæŠæ•æšæšæ¥æªæªæ·æ·æÌæÓæÙæÜæãæææñæøæûæûæççç"ç"ç"ç,çEçZçjç{ç�ç”çšçŸç©ç¼çÍçØçÞçïçüçèè"è(è/è5èJèPèaènètè†è†è˜è�è«è·è¿èÇèÏèÖèÜèíèúèÿèéé3éAéHéXébéhépévé�é‡éŒé™é«é«é«é¶é¿éÓéPìÌÆÙÍ0©Ì@¼@¼N¼N¼b¼f¼n¼v¼�¼Œ¼”¼Ÿ¼ª¼¯¼¯¼É¼Ð¼×¼â¼í¼ï¼ú¼½½½$½/½:½C½K½K½O½…½Î-©ÌÏ(LŽUU.U.UEUJURUZUbUgU{UŠU“UšU U¥U­UÉUÓUÕU×UçUçUéUVVVV#V#V#V(V0V8V@VEVYVhVjVsV|V…V…V‘V˜VŸV«VÉVÑVÞVäV÷VþVWWW)W)W,WuWÐLLŽÑx-¦4¦4¬4À4Ã4Ë4Ò4Ö4Ú4Ú4á4è4ì4ô4ø4ø4ÿ45 -55555$5(5054545;5B5F5N5R5U5Y5Ò6-ÓÐî¾2¾2Ì2Ì2à2â2â2î2ð2ü2þ2 -333 3/3/3=3?3J3J3]3l3l3v3Ô(ÐîÕØOg6i6iNiNiYidiqi�i‡iši i³i¹iÅiÙiÙiíiýi jj$j*j‹jÖ"Og× ƒ¤öAöABBB'B-B8BHBPBUB`B`BjBpB{B‹B“B£BªB²BºBÂBÇBÒBÒBàBàBöBØ+ƒ¤Ù -,m¦í¦íªí®íÉíÑíáíìíûíî*î>î>îKîKî\î^înîyî‹î–î¡î°î°î¸îÖîï ï ïïïïBïKïYïeï‹ï�ï•ï—ï—ï—ï—ï—ï ï²ïÅïÎïÖïØïèïèïèïèïøïøïøïðð.ðGðGð]ðfðoð|ð‰ð¡ð®ð²ð¶ð»ðÊðÖðïð÷ðññ&ñ/ñ7ñBñVñXñvñzññŒñ™ñ¥ñºñÕñÕñÕñäñúñò'ò=ò?ò?ò?òUòWòWò[ò]ò]òfònòtòtòtò{ò{ò�òºòÃòÇòËòÐòßòíòùòóóó#ó@ókótótóˆó‘ó¦óµóÁóÌóàóöóô"ô+ô/ô/ô<ôIôMôZô}ô}ôˆô§ô±ô±ôµôÀôÛôÛôíôüôõ)õ?õUõUõZõZõlõ{õ‘õ¤õºõÐõÙõÙõÞõÞõÞõôõùõùõùõöö3ö3ö3öLöWöcöyö’ö¼öÈöÞöñöõö÷&÷1÷A÷S÷o÷…÷�÷�÷•÷¢÷¯÷Ç÷Ô÷Ø÷Ü÷Þ÷Þ÷Þ÷Þ÷é÷ô÷ô÷øøø!ø8ø8ø=ø=øeø|ø’ø¨ø­ø­øÖøìøùù!ù!ù&ù&ù&ù<ùAùAùAùSùiùùùù˜ù£ù¯ùÅùÞùéùùù ú'ú=úHúHúHúMúWúkú‚ú”ú¦úÊúÚúìúðúýúýúýúûû#û,û:ûKûKûbûbûvû‡û«û½ûÂûÚK,m -  - - - - - - - - - - -    - - - Û`g�ŽjŽj¨j½j½jÑj×jçjçjòjk k k+k;k;kOkUk[kakakxk†kŒk•k›k›k¯kµkÊkÙkákïköklUlÜ3g�ÝxÕ!¦Y¦Y¼YÊYÝYéYùYþYZZ Z(Z.ZÆ>Ú>.? ?ç>å>B?J?æ/8çØ!v]v]Œ]“]“]“]À]À]Î]Î]Î]Þ]ç]î]õ]þ]þ]^^*^7^C^K^K^V^m^m^€^‹^“^œ^¡^¡^´^¿^È^Ó^Ø^Ø^è^í^í^í^í^___ _ _:_N_N_S_S_c_h_h_m_t_|_ƒ_…_�_”_”_£_©_¶_½_À_×_×_ß_î_ù_```!`(`-`2`2`2`2`G`L`[`b`b`|`�`�`•`•`�`¬`³`¸`Ì`Ó`Ø`Ø`ä`ö`ö` -aa,a0a?aIaPaXa_a}aŠa�ažažaµa¼a¼aÏaÑaØaëaíaôabbb,b3b?bQbhbjbvb�bƒbƒb‘b¥bµb½b¿bÓbèbïbÿb c-c4c@cicicicqcqc}c�c‰c�c˜cŸc¦c¼cÁcÁcÑcÚcâcçcçcöcûcdd-d8dCdQdWd]dcdldsd…d…d’dždªd½dÔdÖdãdîdðdüd%e+e1e7e@e@eQeue~eŒe˜e­eÂeÂeÏeÔeÔeèeîeðeðeðeðeÎfè!     é9ÎfÎfîfîfggg(g(g6>6H6H6a6h6n6t6t6z6ìXcí˜ –q–q qªq´qÆqËqÑqÝqßqßqóqóqóqõq%rî ï�¼3=FHO_lnyy’’••¶ÃÅÞåéõWð)�¼ñ@ ÖìÖìßìóìøìò ó@6í6í?í^ícíôõ˜,fífípízíƒíŽí•íŸíŸí¥íö,÷@ ®ì®ì¼ìÐìÖìø ù@þìþì í+í1íúû˜m�-<@NTccjz‡Ž•§ÒØÝáñññ  7DF_cqvv}‰‘¤ ü:m�ý€ œ ~w~wœw§w¼w¼wÁwÄwÈwÍwÔwÔwáwêwðw÷w x x%x.x5xJxPx\xhxqxxx~xƒx‘x¤x¯x·xÃxÃxÉxÉxåxóxóxyyyyy'y*y/y/y5y?yByGyGyMyWyZy_y_yeyqytyyyyyy‹yŽy“y“y™y y°y·yºy¿y¿y¿yÑy×yåyêyòy zz z'z-z9zRz]zjzpzz‚zˆz�z�z�zŸz¥z¥z¥z¼zÄzÌzêzõz{{{ {#{){.{.{.{@{F{P{i{t{�{‡{–{™{Ÿ{¤{¤{¤{¶{¼{¼{Ó{Ú{æ{ì{ø{ ||| |0|=|K|P|V|c|f|l|q|q|q|ƒ|‰|¢|­|º|º|À|Í|Ð|Ö|Û|Û|à|ô| }}}(}.}4}F}L}N}b}x}~}ƒ}†}‹}‹}‘}›}ž}£}£}©}©}¿}Ï}Ô}Ô}Ô}æ}ï}ï}~~,~3~3~;~P~U~r~r~�~”~™~©~´~Æ~Ò~æ~ù~þ~ 055;;Rdow„’˜��£©®®´Ã×äêíòòø€€(€.€1€6€6€<€N€T€W€\€\€b€t€z€}€‚€‚€ˆ€š€ €£€¨€¨€®€À€Æ€É€΀΀Ô€Ù€߀â€ç€ç€ç€ë€ë€û€� �� �0�0�:�E�J�P�]�c�f�o�t�t�„�‰�Ÿ�ª�²�º�¿�Ô�Ù�ß�ê�ø�ÿ�‚‚‚)‚,‚,‚2‚=‚Y‚e‚v‚ނނނœ‚°‚°‚½‚ςςςӂç‚ü‚ª‡þwœ      -             - -    - - - - -    - -  - -      ÿ@8]N?N?l?t?x?†?Œ?’? ?§?×?í?ú?@@1@7@C@G@U@t@}@�@�@–@–@¤@ª@ª@¼@/8]¨M&r&rt>tXt_twt�t™t¦t¦t«t¶tÂtÍtÍtÚtÜtñtôtôtuu"u,u3u3uHu]u]uqu�uœu«u¸uÆuÝuÝu÷u÷uvvv$v$v9vNvNvbvov}v�v“v¦v¦v¬v¬v¹v»vÐvÓvávøvøvw w/wwwYMœ(¤öBöBC#C&C.C1C1CACNCNCUC\CcCiCoCvCxC„CŠC¨C¯C²CºCÂCÇCÓCÙC÷CþCD DDDDD#D6D > X c n ‹ ‹ ‹ ‹ ˜ ˜ ´ Ë Ñ Ú Ú Ú ç ï      # 2 > [ j y ~ ‡ ‡ ‡ ” œ ¤ ¬ ¸ Õ ä ó ø þ )/88erww„�™¡±ÅÅÕÕéï  5@@R^d�” ¤¶ÈÐ×ò ):1DFbNjjxxz––�£¬´·ÎÚîáöü(5<CCP[ahhv€€�˜ž£ª´´ÁÌÒ×Þééöý'GIIf~~„�šš­­ºÌ׿ïô$/4<DTiny†��¥ºÁÇÐÐóúÿ ++18AAATThkk|„Œ”±¹¾Óæëóó'7777CCCPPfrr†“ž¬··ÇÎí277F[[ajjvvƒ‰œ¨¨µ¸ÃÕáìñý 5::Yqqqv‚‰�«ÃÃÉÕÞã  (((AWWWdjmx~�‰˜˜°¶ÁÁÁÎÔ×âèëó +++<BEPVY[‰œ´ºÉÉáçòòÿ|$ žš. - -  ¨cÕ~6~6œ6§6²6²6Å6×6×6ë6ò6ø6þ67(7(75787A7A7U7[7`7‡7š7ž7¤7»7Â7Ð7Ö7â7ð7õ788*838C8E8L8Q8Y8x8†8†8’8¯8Î8Õ8ß8ó8ù8ÿ89 99/9P9d9p9„9�9—9¦9³9À9Î9Ü9÷9:::5:G:^:g:m:y:~:…:…:™:¤:±:¸:¸:¸:Ê:Ù:Û:í:ü:;;";E;P;‘;|cÕ°Ü/–;–;½;½;Ð;å;ð; -<< <.<5<=<S<[<[<n<ƒ<š<¤<¦<½<Í<Ö<Ü<á<è<ï<õ<û<====5===W=l=l=y=|=„=ˆ=š=©=´=¼=¼=Ó=ì=ð=ù=>>&>->1>:>?>Q>h>v>|>€>‚>�>�>�>‘>¨>®>®>À>]Ü/à ?–F–F´F¼FÂFÂFÓFðFþFGGGGGG(G/G;GHGNGXGXGcGmGmG�G‡G—G�G¢GªG³G¹GÁGÐGåGêGîGôGôGüGH -H -H H+H0H8HBHMHVHVHlHrHxHŽH“HšH¯H³H³H»HÁHÓHÙHïHõHõHI I I(I4I?IEIIIcIlIrIvI}IƒI’I§I¬I°I·I½IÃIÃIËIÏIÖIÜIâIâIâI J JJJ5JBJFJFJJJXJoJoJtJwJ{J�J�J•J¦J¦J»JÏJÛJéJíJÿJK K&K(K.K?KAKMKsKzK…K¨K³K¹K¿KÅKÎKÕKãKôKLLLL L=L?LELVLXLdLŠL�L–LœL¥L¬L¬L¼LÚLãLéLéLþLMM -MM#M(M(M(MBMGMeMjMˆMŽM–M¡MÄMÊMÐMÜMðM÷MýM NNNNN$N6N;NCNHNSNYNaNfNuNuN�NšNšN­N¾N¾NØNÝNÝN÷N÷NOOO O$O1O8O=O=OHOLOSOeOjOrOvO„O�O—O›O£O«O³OÆOÒO×OãOãOìOìOPP P&P+P/P4P4P4P4P:P?P?PbPhPnP—PœPœPœP©P©P©P®P½PÃPÙPÙPüPgTC? - -È9O.h.hFhFhZh`hkhyh…h™h™h­h³h³h¾hÎhÝhëhøh3i 9OX.6� � ™ ž ¦ ¬ ¬ ± .6ˆ6D¸ ¸ È Ï á ä ä ë ë  - - - -6D` -hhr�‹›Ÿ¢¨ -8 -.¨¨¿ÆÐÖÙÙàåöûþ   ) 1 F Q c g i {  � � � ‹ . -.xkw8@8@H@O@k@y@~@~@–@ @ @±@kw h˜€˜€¨€º€À€Æ€Ì€ !€8€8€D€N€U€\€p€‚€‚€˜€"#˜brè7è7ø7ø788$8;8K8W8[8ƒ8$br%HÜbÐÐâòGNbiow€†Ž�–ž¥¬³ÁÜêóó @Ot‰™¶àï-/6==ZqˆŸ¶Íäääðû!!&++0;@@EPUUZepuuz…ŠŠ�š¥ªª¯ºÅÊÊÏÚåðõõú -  %06;;@KV\aafqw||�Œ—�ŸŸ¤¯ºÀÂÂÇÒÝèîðð÷÷(77SŽœœœ«ÓÓáõõ%%:Kai{–ž°ËÓå #9ASnvˆ ¨ºÒÚììì(0B]ew’š¬ËÓåê5=Ojr„œ¤¶¶¶¾ÆÜß!<GGl�•»Àæè"--Rv{¡¦ÌÑ÷  /Fgt•œª²ºÂÊÙäú ,CN\c}Œš¡»ÊÖçìóó" > U ` ` Ž · ¼ ë ð $ S S g ˆ � š � « ® É Í è ì ÿ !!!,!3!8!F!W!^!t!”!¥!¥!µ!º!Ê!Ï!ß!ê!"")"8"8"i"”"£"¶"¶"å"##"#"#-#_#d#–#¥#ª#±#±#Û#à# -$.$=$B$I$T$T$}$¡$¦$Ð$Õ$ÿ$%.%=%=%=%X%m%x%%™%®%¾%Æ%à%õ%ú%&&0&0&0&K&`&k&r&Œ&¡&±&¹&Ó&è&í&ô&'#'#'#'9'9'9'@'Z'o'ˆ'¤'¶'Ê'Ê'Ï'Ï'Ï'×'ñ'( ( ( ((,(A(F(F(F(M(g(|(�(�(ˆ(‹(¥(¹(Î(Ó(Ó(Û(Þ(ø( )!)&)&)-)0)J)^)s)x)x)Š)�)�)¡)¦)¦)¸)½)½)Ï)Ô)Ô)æ)ë)ë)ý)*****+*0*0*B*G*G*Y*^*^*p*u*u*‡*Œ*Œ*ž*£*£*¦*ò*+++++$+>+S+X+X+X+`+z+�+”+”+”+›+µ+Ê+Ï+Ï+Ï+Ö+ð+, -, -,,!,!,3,8,8,J,O,O,a,f,f,x,},},�,”,”,¦,«,«,½,Â,Â,Ô,Ù,Ù,ë,ð,ð,------0-5-5-8-„-™-™-¥-®-®-¼-Ê-Û-é-÷-../.@.X.v.‹.§.©.·.Ù.ê.ø.ÿ.á7&�Üb'˜r‚ˆ8ˆ8š8œ8£8£8¾8È8Î8å8ò8õ89.9(r‚)PµÜÀÀÎÕØØãîÿÿ -26??BX\amt�•œž¢¤½É*1µÜ+P?FnTnTrT|T”T¡T¾T,?F-HFL¾T¾TÌTåTìT U.FL \ No newline at end of file +ø +   / : D D D m x ƒ ¦ º Ï Õ Ú á ö ý   J O V ] d i i p v { { • ¼ Â Ç æ í í í ò õ ü  +     ! ! 4 S S a v | ~ ™       ¢ ¢ ¢ ¨ ­ ± ³ ¶ À Ì Ï Ñ Õ Õ Ú Ú ë ý ¢848h2l2s2u2£@+082B2J2O2¤4___-_-_-_>_>_M_M_S_U_U_[_]_]_c_e_e_l_p_u_u_u_u_u_u_}_’_’_œ_¡_ª_´_Á_Ö_Ø_ó_õ_``0`5`;`=`=`R`U`U`|`‰`¡`¡`Á`Á`Ê`Ï`ï`Ý`õ`a aaa,a4aiPiZicimivi„i‰i‰iœi¢i§i¶iÈiÛiàiôijjj'j-j0jGjLjOj_jijljlj{jŽj j©jµj»j¾jÕjÚjÝjíjñjùjþjk*k*k/k4k4k?kGkLkLkRkRkdknktk‚kŒkÃkÆkËkÙkÙkÞkækëkôkùkùkl llll%l*l/l>lCl`lblglllqlvl{l€l…l…lŠl�l«lñl÷lmmmm$m2mnHnNn\nfn�n n¥n³nÍnÒnÒnÒnÚnßnènínínønooo +ooo#o(o(o;o;oPoVoVohoroxo†o�oÇoÊoÏoÝo÷oüoüoüop pppp"p*p/p/p/p@pFpFpXpbphpvp€p·pºp¿pÍpçpìpìpìpôpùpqqqqq q q q0q6q6qHqRqXqfqpq§qªq¯q½q×qÜqÜqÜqäqéqòq÷q÷qr +rrrrr#r)r?rDrDrJrXrmrrrrrxrŠr“r›r£r¨r¨r®rÀrÌrÝrêrñrùrss s2s2s2s7s7s7sGsGsGsGsKsPsPs[s_sdspsvs{s„s›s£s¨s²s²sºsÀsÒsÝsâsèsðsõsõsõsõsõsõsõsõsõsõstt%t/t7t>'>.>6>;>B>J>O>O>W>\>\>\>\>b>e>g>g>g>†>’>£>¥>«>®>®>¹>¹>Â>Õ>Ü>ë>ô>ü>þ>þ>þ>???"?*?1?5?@?K?^?d?i?o?t?{?ƒ?ƒ?œ?¡?¡?´?¼?¾?¾?¾?¾?¾?¾?Ã?Ã?Ê?Ê?Ó?Ó?×?Þ?â?õ?ý?ý?ý?ý?ÿ?ÿ?@@@@9@B@F@VP­(³àYàYZZZZZ(Z4Z[>[G[V[c[e[e[q[w[|[|[|[~[€[€[‡[‡[‡[�[Ÿ[­[¯[¯[»[Á[Æ[Æ[Ì[Ø[Ø[ã[ï[ï[ü[\\ \ \0\0\9\<\_®¸y�œPœP¹PÀPÏPÒPÖPÞPâPæPëPøPQQQQ%Q1Q¯ø%A°5°5È5×5á5î5õ5ù5666@6@6V6g6n6|6|6Ž6¤6¤6·6Ì6Ô6×6ã6°xâîÈSÈSÔSÛSúSTTT&T0T8T±xÖâ@S@SLSSSrSrS‰S�S�SœS¦SÂS²ðMh … …2…>…I…c…c…f…u…{…{…ˆ…Š…�…�…�…Ÿ…¥…¯…¶…»…½…Ç…³ˆhvÈ…È…Ñ…×…ò…÷…"†$†A†g†n††’†´ÀuŠ�8�8™8 8´8½8Â8à8å899#9%969J9S9U9i9s9¡9µ˜v†˜†˜†¬†Ã†È†á†æ†ÿ†‡‡)‡)‡1‡8‡k‡¶¸Uix7x7†7�7�7›7¢7±7¼7È7Ì7Ú7Ú7í7ù7888·Pmt\P\PfPoP}PƒP¸˜'WXUXUtUxU¹UÉUÏUéUVVVV!V!V(V3V>VKVTVTVYV^VeVpVpV}VVŒVŽV�V’V’V’VšVšVšV¢VªV²VºV¾VÈVW¹¸¸T¸TÊTÊTÎTÓTæTéTîTîTøTþTþT UUUº�'UU(U,U1U1U&>&H&W&[&^&d&¾ð˜³YYY Y$Y-Y9YEYEYXYXY…Y‰YŽYšYšY®Y¸Y»YÆYÉYÑYÛY¿pîù8T8THTLTQT[TfTiTmTuTÀpùxTxTˆTŒT‘T›T¥T¨T¬T´TÁP &è1ò12222Â@ Ð1Ú1â1ç1Ã#OOO'O=O=OBOJOROZObOhOuOuOzOOO„O‰O‰OŽO“O“O˜O�O�O¢O§O§O¬O±O±O¶O»O»OÀOÅOÅOÊOÏOÏOèOûOPPPP+P+P1P9P>PDPLPLPRPZP_PePmPmPsP{P€P†PŽPŽP”PœP¡P§P¯P¯PµP»PÃPÈPÎPÖPÖPÜPâPêPïPõPýPýPQ QQQQ$Q$Q$Q5Q=QEQMQUQ]QeQkQkQ‚Q’Q£Q¨Q¯Q¯QÀQÆQÌQÌQÐQÝQèQðQøQüQR RRR$R(R-R8R>RPR\RaRiRmRxR€RˆRŒR‘R™R¤R¬R´R¸R½RÈRÍRâRîRóRøRûRaUÄ âƒ¨H¨H¾HÇHÝHÝHâHêHòHúHIIIII I I$I)I)I.I3I3I8I=I=IBIGIGILIQIQIVI[I[I`IeIeIjIoIoIˆI›I I¥I¥I®IËIËIÑIÙIÞIäIìIìIòIúIÿIJ J JJJ J&J.J.J4JÇCÇOÇXÇ`ÇhÇnÇnÇsÇxDŽnjǒǔǜÇÎX (ÀCÀCÊCÑCÙCÞCäCÏp@K�D�D™D™D™D§D®D¸D»DÀDÐpKVÀDÀDÉDÉDÉD×DÞDòDõDúDÑhV`EE E EEEE1E4E9EÒ@,1è�è�ö�ü�‘ÓPæAæAôA BBBVBÔ@ p1y1�1†1Õ@ X1a1i1n1Ö0/;VV#V+V>V>VJV\VfVfVrV„V„V™V¤V¬V´V·VÅVÜVÜVôVöVöVW WW!W!W0W8Wm]memhmnmtmtm‡m”m m¨m«m²m¸m½mÙmëmómnnn n&n=nEnEnnnŽn–n™n n¦n¦n¦n¦n¦n¸nÁnÖnÛnñnoooo o*o6o;o@o@oRoWo\ojoxo…o‘o™oœo£o©o®oÊoÜoäoüopppp+p3p3pYpvp~p�pˆpŽpŽpŽp¡p®pºpÂpÅpÌpÒp×pópqq,q4q7q>qDq[qgqgq�q°q¸q»qÂqÈqÈqÈqÈqÈqÚqãqøqýqr#r#r(r(r?rUrZrhrsrxrŠr“r¨r­rÃrÓrÓrÓrçr÷rürürs)s.s€>€>€>€C€H€H€Q€_€m€r€�€Œ€—€�€�€¤€¤€¹€€€É€É€Þ€ç€ú€� �� �+�1�1�8�8�M�V�V�]�]�r�{�†�š�¥�°�³�¹�¹�¼�Ã�Ã�Ñ�ß�â�ç�ô�û�‚‚‚‚‚‚*‚-‚2‚?‚F‚O‚O‚T‚T‚]‚k‚y‚~‚�‚˜‚£‚©‚©‚°‚°‚Å‚΂΂Õ‚Õ‚ê‚󂃃ƒ!ƒ,ƒ7ƒ=ƒ=ƒDƒDƒYƒbƒbƒiƒiƒ~ƒ‡ƒ’ƒ¦ƒ¬ƒ·ƒƒŃŃȃσσ݃ëƒîƒóƒ„ „„„„„„,„:„=„B„S„Z„c„c„h„h„q„�„›„ „²„½„È„΄΄Õ„Õ„ê„ó„ó„ú„ú„……………………………………1…6…6…6…J…J…J…J…J…J…J…J…J…J…J…J…J…J…J…J…J…J…J…J…J…J…J…J…J…J…J…J…J…J…O…O…O…O…O…O…O…T…Y…Y…m…p…w…�…‡…Œ…‘…‘…¨…­…­…½…È…ã…ø…† ††%†0†K†a†i†p†ƒ†ކ™†·†»†ɆÔ†߆ú†‡‡ ‡ ‡ ‡ ‡ ‡ ‡ ‡ ‡ ‡ ‡ ‡ ‡ ‡ ‡$‡$‡6‡F‡Z‡Z‡ƒ‡ƒ‡ˆ‡ˆ‡�‡�‡©‡·‡Ö‡Û‡ç‡ô‡ô‡ˆ ˆ-ˆ:ˆCˆRˆ\ˆ\ˆkˆkˆkˆ{ˆ�ˆ�ˆ£ˆÏ�×è1k‘‘‘)‘<‘?‘H‘`‘v‘…‘�‘›‘Ÿ‘±‘´‘¼‘őё葒ú‘1’E’V’f’|’|’ž’°’Á’Ã’Ã’Î’“““ “““““(“=“H“S“[“c“g“~“~“–“›“›“«“³“Ä“Γß“é“ù“” +” +””"”3”=”N”X”h”t”y”y”y”�”›”¥”ª”·”ÔÔȔӔâ”ç”ì”ñ”ñ”ö”•••••••••••• • •$•*•*•*•*•*•*•/•/•>•P•\•i•u•ˆ•�•••ž•ž•¹•͕ޕë•ð•––0–=–E–X–`–e–n–w–w–|–|–|–|–|–ˆ–ˆ–ˆ–�–­––Ê–å–ö–—————————————-—;—@—@—K—Y—^—v—‚—‚—”— —¥—´—¸—Á—É—æ—ò—÷—ý—˜˜ ˜4˜E˜R˜T˜b˜b˜g˜g˜r˜€˜…˜—˜£˜¯˜´˜¸˜Á˜ƘƘƘƘƘƘߘߘߘߘߘߘߘä˜ä˜ä˜ä˜ä˜ä˜ù˜ù˜ù˜ù˜ù˜ù˜ù˜ù˜ù˜ù˜™™7™?™Z™k™x™z™Ž™š™Ÿ™Ÿ™Ÿ™¨™Æ™Ò™ý™ š šššššššššš'š'š'š'š'š'š'š'š'š'š'š'š'š'š'š'š'š'š'š'š'š'š'š'š'š'š'š'š'š'š'š'š'š'š'š'š'š'š'š'š'š'š'š'š'š'š'š'š'š'š'š'š'š'š'š'š'š'š'š'š'š'š'š'š'š'š'š'š'š'š'š'š'š'š'š'š'š'š,š,š,š=šHšMšMšMšmš¦š¯š³š¸š½šÆšÌšÑšÑšÑšÑšãš÷š› ›%›*›/›/›A›U›{›†›Ž›“›“›˜›˜›ª›¾›à›ë›ð›õ›ú›ú› œ œFœQœYœ^œ^œcœcœcœkœˆœ¥œ±œÌœÝœêœìœûœýœýœýœýœýœýœ���������������������������!�0�;�;�;�;�;�;�;�;�;�;�;�;�;�;�@�@�T�V�V�^�^�e�w�¤�¶�Â�Ø�ò�õ�ÿ� ž9žYž}ž‚ž•žŸžäžäžçž÷žŸ Ÿ%Ÿ3Ÿ?ŸWŸWŸƒŸ†Ÿ•Ÿ©ŸÊŸÛŸ ýŸéŸ! 3 3 6 ; > X f ˜ º º æ é ø  ¡-¡>¡`¡L¡|¡|¡|¡¡„¡„¡‹¡/©ØX«Ó@¯@¯V¯k¯r¯r¯~¯~¯‰¯‰¯š¯ª¯µ¯ů˯Яددæ¯ó¯°°°°°&°&°>°@°@°P°\°\°k°s°s°‚°ааа’°’°’°–°ž°£°¨°¨°¬°´°¸°½°½°½°½°½°½°½°½°½°½°½°½°½°½°°°ΰç°÷°±±± ± ±%±%±/±;±T±d±m±u±z±�±’±š± ± ±¥±¯±½±é±ô±ô±²²²²)²/²5²:²:²:²:²:²:²:²:²:²H²T²e²u²z²‚²•²š²¢²§²¯²´²´²´²¼²IJͲÕ²Ú²â²ç²ñ²ÿ²+³6³>³>³P³Z³f³l³q³w³|³|³†³Ÿ³©³³ͳÕ³ê³ì³û³´´´4´<´C´H´L´P´_´r´Œ´›´£´¸´¸´Ä´É´Õ´à´å´å´ µ&µ+µ5µJµUµ]µrµwµ†µ޵£µ¨µ¶µеßµçµüµüµ¶ ¶¶$¶)¶)¶)¶)¶)¶)¶)¶)¶)¶)¶)¶)¶)¶)¶)¶)¶)¶)¶)¶)¶)¶)¶)¶)¶)¶)¶.¶.¶.¶6¶6¶6¶6¶6¶6¶6¶6¶6¶6¶6¶6¶D¶d¶‰¶™¶ž¶¦¶¹¶¾¶ƶζÓ¶Û¶î¶ô¶ü¶··&·.·7·?·G·L·Q·[·i·•· ·¨·¨·º·Ä·×·Ý·â·ê·ê·ê·ê·ê·ê·ê·ê·ê·ê·ê·ê·ê·ê·ê·ê·ê·ê·ê·ê·ê·ê·ê·ê·ê·ê·ê·ê·ê·ê·ê·ê·ê·ê·ê·ï·ï·ï·ü·¸¸¸¸¸+¸-¸<¸J¸L¸L¸W¸\¸q¸q¸q¸q¸q¸q¸q¸q¸q¸q¸q¸q¸q¸q¸q¸q¸q¸q¸q¸q¸q¸q¸q¸q¸q¸q¸q¸q¸q¸q¸q¸q¸q¸q¸q¸q¸q¸q¸q¸q¸q¸q¸q¸q¸q¸q¸q¸q¸q¸q¸q¸q¸q¸q¸q¸q¸q¸q¸v¸v¸v¸v¸v¸v¸v¸v¸v¸v¸v¸v¸v¸v¸v¸v¸v¸v¸v¸v¸v¸v¸�¸�¸›¸»¸θθظ⸹ +¹ ¹¹¹$¹1¹1¹6¹6¹Q¹b¹e¹h¹p¹u¹u¹~¹ƒ¹‹¹’¹Ÿ¹²¹¸¹¿¹Ĺ޹蹺 º(º5ºHºNºUºUºZºZºZºZºZºZºZºZºZºZºZºZºZºZºZºeºpº~º�º•º•º ºªº»ºÀºÀºǺ̺̺àºàºåºåºåºûº»»0»6»>»S»Z»b»b»d»d»n»n»y»»�»Ÿ»Ÿ»¦»]ÂÙàz`Â`Âr€€‹‹œ±¼ÂÃÂÔÂçÂíÂíÂíÂüÂÃÃ&Ã0Ã3Ã?ÃHÃRÃUÃZÃZÃpÃzÃzÒÙåúÃÁÃÊÃÖÃëÃòÃòÃòÃÄÄÄÄ)Ä3Ä6ÄHÄHÄMÄRÄbÄeÄjÄzÄ}Ä�ĊĒĤĬĬĬÄÂÄÌÄÌÄäÄëÄ÷Ä ÅÅÅ.Å5ÅDÅUÅUÅ\Å\Å\ÅjÅxłŅœÅ�ŠŲŲŷżÅÌÅÏÅÔÅäÅçÅëÅôÅüÅÆÆÆ"Æ0Æ0Æ7Æ^ÆÚpƒîøÊøÊËË%Ë5Ë8Ë8ËKËKËYËaËiËvËvË}Ë}ˎ˞˩˭˷ËÃËËËÖËâËÌÌÌÌÌÌ Ì5ÌAÌVÌYÌYÌgÌr̴̨̨̜̀̎ÌÉÌ×ÌèÌøÌÍÍ Í(Í(ÍPÍSÍYÍ^Í^ÍgÍz͈̀͛ͩͩ͡ÍÀÍÌÍÙÍìÍòÍúÍ ÎÎÎÎÎDÎDÎIÎeÎhÎoÎΈΓΨγνÎÊÎãÎ÷Î÷Î;ÏÛ "ƒ Ç ÇÂÇÔÇØÇØÇãÇãÇêÇûÇ ÈÈÈÈÈ%È*È2È2È@ÈYÈ[ÈbÈ{ȎȜȤȦȴÈÂÈÂÈÊÈÓÈÞÈæÈñÈûÈÉÉÉÉ/ÉAÉDÉIÉ\É\ÉuɉɑɑɣɦɫɾɾÉ×ÉëÉóÉóÉÿÉÊÊ Ê3Ê:ÊOÊhÊjÊÊ˜Ê Ê Ê«Ê¹ÊÆÊËÊËÊÒÊÝÊôÊÜ'Þ@Ï@ÏZÏmÏ{τϦϰϾϾÏÛÏèÏèÏòÏòÏüÏÐÐÐ%Ð%Ð,Ð6Ð<ÐBÐIÐ^ÐiЄЊÐ�Ð�ТЧвнÐ×ÐáÐéÐÑÑ5ÑEÑJÑPÑVÑaÑnÑuіњѠѨѭѶÑ×ÑÛÑáÑéÑîÑîÑûÑÒÒ Ò)Ò-Ò3Ò;Ò@ÒaÒeÒkÒsÒƒÒžÒŠÒªÒ®Ò´Ò¼ÒÁÒâÒæÒìÒôÒôÒùÒÓ Ó.Ó2Ó8Ó@ÓIÓjÓnÓtÓ|Ó|Ó‰Ó�Ó±ÓµÓ»ÓÃÓÌÓíÓñÓ÷ÓÿÓÿÓÿÓ Ô ÔÔ Ô)ÔEÔQÔbÔgÔxԌԌԬԱԶԶÔÁÔÉÔÑÔÚÔöÔÕÕ!Õ;Õ;Õ[Õ`ÕeÕeÕpÕxÕ�Õ˜Õ¥Õ°ÕÊÕÜÕîÕÖùÕÖÖ#Ö#Ö#Ö'Ö'Ö@ÖIÖIÖlÖqÖvÖvÖ~Ö’Ö›Ö´ÖÀÖËÖËÖßÖíÖöÖûÖ××× ××××%×0×5×5×=×[×E×s×x×x×€×ž×ˆ×¶×»×»×Æ×Ü×õ×ØØØ(Ø<Ø<Ø\ØaØfØzØfؒؗؗؤةةرضضØÂØÓØåØêØêØþØêØÙÙÙ#Ù(Ù(Ù;Ù@Ù@ÙSÙXÙXÙXÙrقههه١ٱٶٶٶÙÐÙàÙåÙåÙåÙÿÙÚÚ+ÚÚCÚHÚHÚSÚXÚ”Ú‚ÚXÚ¬Ú±ÚíÚÛÚ±ÚÛ +Û +Û +ÛÛ)Û.Û.Û.Û=ÛMÛRÛRÛRÛaÛoÛtۜۊÛtÛ´Û¹ÛáÛÏÛ¹ÛùÛþÛ&ÜÜþÛ>ÜCÜCÜCÜ`ÜJ܊ܚܟܟܟܾܪÜèÜøÜýÜýÜ ÝÝÝÝ Ý Ý Ý2ÝBÝGÝGÝGÝZÝjÝoÝoÝo݂ݒݗݗݗݪݺݿݿÝÇÝÌÝÌÝÔÝÙÝÙÝáÝæÝæÝîÝóÝóÝÞ Þ ÞÞ#ÞqÞ_ÞMÞ#Þ~ÞƒÞÑÞ¿Þ­ÞƒÞÞÞãÞãÞãÞòÞ ßßßß#ß>ßCßCßCßTßbßgßgßoßtßtß|ß�ß�߉ߎߎߎßÊ߸ߙßéßà à à àEà3ààdàà„à¶à¤à„àÎàÓàáóàÓàá"á<á"áTáYáváYáŽá“á“á“á³á¸áÎáÆáÚáêá÷á â,â1âHâNâgâtâ­âïâÌâûâããããããã%ãJãUã_ãjãlãwãã„ã‰ã‰ã”ãœã¥ã°ãÀãØãðãä äää)ä4ä>äCäNäXä]ä]ähä{ä…ä�ä±ä½äÎäÓäääèäíäòäòäå ååå)å6åAå[åmååŠå�åšå«å´å¿åÌå×åñåææææ æ æ*æ/æ/æ:æ?æ?æJæOæOæZæ_æ_æyæ~æ~æ†æ‹æ‹æ–æ›æ›æ¦æ«æ«æ¶æ»æÏæ»æÛæææëæÿæëæ çççç&ç+ç+ç6çDçIçIçTç_çdçdçuçzçzç‹ç�ç�çªçµçºçÂçºçÎçÓçççÓçóçøçèøç èè%èè1è1è6è6èJè6èVèVè[ègè[èè„è„è�è„è¨è­è­è¹è­èÑèÖèÖèâèÖèúèÿèéÿè é+é6éAéFéZéFéféré}éˆé�é¡é�é­é¾éÃéÃéËéÐéÐéØéÝéÝéæéëéëéôéùéùéêêêêêê"ê'ê'ê2ê7ê7êBêGêGêRêWêWêbêgêgêrêwê‹êwê—ê¢ê­ê¸ê½ê½êÇêÌêÌêÖêÛêÛêåêêêêêôêùêùêëëëëëë%ë*ë*ë*ë*ë*ë2ë7ë7ë?ëDëDëLëQëQëYë^ë^ëfëkëëkë‹ëœë¡ë¡ë·ëÂëÂëæëëëì ì%ìì1ì<ìGìLìLìbìmìmì‘ì–ì¬ì·ìÐì¼ìÜìçìòì÷ì÷ì ííí<íAíWíbí{ígí‡í’í�í¢í¢íÌí¸íØíØíüíîî"î'îFî2îfîRîrî‹îwî«î—î·îÂîÇîÇîñîÝîýîýî!ï&ï<ïGïLïkïWï‹ïwï—ï°ïœïÐï¼ïÜïçïìïìïðð"ð"ðFðKðaðlðqð�ð|ð°ðœð¼ðÕðÁðõðáðñ ñññ ñ%ñ%ñ4ñ9ñ9ñJñOñTñTñeñjñoñoñ‚ñ‘ñ–ñ›ñ›ñ®ñ½ñÂñÇñÇñéñîñóñóñòò ò òAòFòKòKòmòròwòwòwò™òÀòÅòÊòÊòìòñòöòöòöòó?óDóIóIókópóuóuóuó—ó¾óÃóÈóÈóêóïóôóôóôóô=ôBôGôGôiônôsôsôŽô“ô˜ô˜ô˜ô³ô¸ô½ô½ô½ôØôÝôâôâôâôýôõõõ"õ'õ,õ,õ,õGõLõQõQõQõlõqõvõvõvõ‘õ–õ›õ›õ¬õ±õ¶õ¶õÇõÌõÑõÑõÞõðõö1ö1ö1öFöKöWöeö„ö�ö´öØöêöõö +÷÷ ÷ ÷*÷/÷/÷;÷T÷]÷„÷‹÷™÷ž÷¯÷Ä÷É÷Ú÷å÷í÷ò÷÷÷÷÷û÷ÿ÷ øø ø$ø)ø)ø4ø>ø>ø>ø>øCøCøCøMøMøRøRø\ø\øiø‰øŽøŽø˜ø˜ø˜ø�ø�ø¤ø¤ø±ø¼øÊøÕøàøëøöøûø$ùù<ùLùuùmù�ù�ù�ù™ù¢ù¨ù¶ù¶ùÌùÙùëùôùüùúúúú8úBúWúuúuúuú¥ú¯ú¯úÈúÍúéúþúûû0û7û<ûBûHûOûTû[ûdûzûzû~û~û™û û¥û¥û©û²û¿ûÑûæûþû +üü ü1üPülüƒü†ü‹ü–ü›ü›üŸüŸüÂüÍüÍüÐüâüâüý7ý7ý7ýÝX08DDDD&D5DDDIDÞX8@PDPD^DcDgDvD…D‹D߀ +àBàBòBCCC C C-C>CCCMCà@¸1Â1Ê1Ï1áP¾à¾àÇàÔàåàòàòàáâH[�ž0ž0´0º0Á0É0Ñ0Ô0ß0ó0ú0ý0ÿ01111%1;1>1L1O1R1Y1]1e1s1s1‡1�1•1Ò1〻HÀ²À²Ò²Ü²ä²ì²ô²ü²³³³%³>³A³T³T³\³e³k³p³p³x³�³‡³Œ³Œ³”³�³£³¨³¨³°³¹³¿³Ä³Ä³Í³Ù³Ý³â³è³í³í³õ³þ³´ ´ ´#´9´9´9´A´C´C´C´K´M´M´M´U´W´W´W´_´a´a´n´n´t´y´€´‹´‹´›´›´›´¢´­´­´½´½´È´Ì´Ò´ê´ø´ µµ4µ7µ>µPµXµaµlµlµwµ}µ‚µ‰µ”µ™µ µ«µ·µ½µ½µÔµÜµâµâµ¶¶¶¶"¶-¶-¶2¶F¶K¶Q¶S¶S¶Z¶e¶e¶r¶r¶r¶r¶7·äð Çî×îר ØØ Ø*Ø/ØOØOØcØkØƒØ‰Ø§Ø»ØÆØÌØåØåØõØõØ ÙÙÙÙ%Ù-Ù5ÙCÙIÙOÙ[Ù[Ù]ÙqÙ|Ù�Ù�Ù�ٚٚٺٺÙÏÙÜÙáÙáÙáÙúÙÚÚ0Ú>ÚKÚ[ÚhÚhÚuÚÚ‹Ú˜ÚšÚšÚ¢Ú§Ú§Ú¯Ú´Ú´Ú¼ÚÁÚÁÚÉÚÎÚÎÚÕÚÚÚÚÚáÚæÚæÚñÚöÚöÚÛÛÛÛÛÛ#Û#Û8Û?ÛEÛHÛOÛRÛ]ÛdÛgÛgÛ{Û}ÛƒÛŽÛŽÛŽÛ˜Û±ÛÆÛÖÛçÛíÛÜÜ ÜÜ(Ü9ÜHÜNÜ_ÜlÜv܅ܒܘܣܩܾÜÄÜÕÜâÜèÜúÜúÜ ÝÝ Ý+Ý3Ý;ÝCÝJÝPÝaÝnÝsÝ�Ý�ݧݵݼÝÌÝÖÝÜÝäÝêÝõÝûÝÞ Þ Þ Þ Þ*Þ>Þ·àå0˜»x±x±†±†±š±ž±¦±®±¹±Ä±Ì±×±â±ç±ç±²²²²%²'²2²=²N²P²\²g²r²{²ƒ²ƒ²‡²½²æ(=fDfD†D†D�D¢DªD²DºD¿DÓDâDëDòDøDýDE!E+E-E/E?E?EAE]EgEiEkE{E{E{E€EˆE�E˜E�E±EÀEÂEËEÔEÝEÝEéEðE÷EF!F)F6F%>%E%L%P%X%\%\%c%j%n%v%z%}%�%èØ6NXX6X6XAXLXYXgXmX€X†X™XŸX«X¿X¿XÓXãXñX÷X +YYqYé �¢Ö1Ö1î1ö1ý12 22(20252@2@2J2P2[2k2s2ƒ2Š2’2š2¢2§2²2²2À2À2Ö2ê@Tyðð +ðððð+ð-ð=ðHðZðeðpð—ð—ð§ðºðÌðÞðâðïðïðïðùðñññ,ñ=ñYñ^ñxñë 4Tââ(â0â6â>â@â@âLâLâLâTâ\ânânâ“â•â•â°â²â²â½âÂâÝâââââââââ÷âùâùâãããã$ã,ã4ã;ãJãJãXãZãnã{ã{ã{ã„ã–ã©ã¯ã·ã¹ãÆãÆãÛãÛãÛãæãðãä ä ä ä ä#ä)ä.ä6äAäSä^äcäcäjänä€ä‡ä”ä›ä¬ä²ä¹äÂäÂäÞäãäãäãäãäëäöäöäåå å å å&å4åCåVåiåkåkåkå~å~å…åŒå‘å—å—å©å³åÎå÷åýåýåææ(æ/æ;æLæ]æjæpætætætætææ‰æ‰æ—æ¹æ¹æÅæâæìæìæïæ +ç +ççç.çAçTçgçgçlçlçwç~çŒç›ç®çÁçÌçÌçÑçÑçÑçäçæçæçæçíçèèèè&è-è9èLèbèŠè–è©è¶èºèÕèèèñèøèéé+é2é2é7é7é7é?éJé\égélélélélé‚é¯éµéµéµéÀéÊéÍéÔéëéëéðéðé ê ê3êFêKêKêiêwêŠê�ê¨ê¨ê­ê­ê­êÀêÅêÅêÅêÌêßêòêòêòêëëë(ë>ëGëNëYënë�ëˆëˆë�ë�ë’ë’ë¦ë¦ëðìHNtvYvY�Y�Y¤YªY¸Y¸YÃYÑYÝYñYüY Z Z Z&Z,Z2Z2ZGZUZ[ZdZjZjZ~Z„Z‘Z™Z§Z´Z[í@Æ öHöH II-I2IGINITI\IbIpI~I…I”I™I¦I½IÊIÝIäI÷IJ +JJ#J(J>JGJVJ^JkJtJvJ�J§J¬J·JÉJÔJÝJãJîJòJûJKFK(K[K�KrK¥K¨K¸KULîèÈ¢ÖôÖôðôöôÿô õ!õ3õ<õBõEõIõKõcõuõ‚õˆõŒõ’õ”õ—õ›õ›õÁõÅõËõËõÒõÒõôõ öö/ö5ö<öGöQöUöXö_öeöiöoö€ö†ö‹ö�ö�ö�öŸö³öµö¼ö¼öÉöËößößößößößö÷÷÷(÷E÷i÷ƒ÷ˆ÷Ÿ÷¤÷²÷Æ÷Ë÷Ñ÷ß÷ê÷ô÷ÿ÷ øø ø,øDøSøXøcøxø}ø}ø}ø‹ø‘ø”ø—ø¨øÀøÒøÕøêøðøùùù ù+ù+ù0ù0ù=ùLùLùRù`ùtù‚ùˆù‹ùŽù•ù¥ù°ù°ùµùµùÂùÑùÑù×ùåùùùú úúúúú!ú(ú(ú5úDúDúKúUú\úbúiútútúˆúˆú¢ú§ú®ú¶úÀúÏúÓúßú÷úüúüú%û8û?ûKûKûdû{û{û™û›û³ûÙûäûüü@üEüEüOüqüqüqüŠü–ü¤ü¼üÀüˆýïPÆÎFÎFîFõFþFG G G)G+G;G;G=GWGaGcGeGuGuGuGuGyG‚GŠG”GžG¢G¢G´GÇGÐGÐGßGßGîGîGýGHHH*H*H,H6H?HHHOHUHiHpHwH~HŒH•H¸HÁHÅHÊHÏHÒHÜHßHïHð8-Q†%†%Œ% %£%«%²%¶%º%º%Á%È%Ì%Ô%Ø%Ø%ß%æ%ê%ò%ö%ö%ý%&&&&&&"&&&.&2&5&9&ñ`-6¦.¦.º./ÿ.Ç.Å."/*/òØ VLVLlLwLwLwL¤L¤L²L²L²LÂLËLÒLÙLâLâLêLîL MM%M+M+M6MOMOMbMmMuM~MƒMƒM–M¡MªMµMºMºMÊMÏMÏMÏMÏMäMéMüMN NN2N2N7N7NGNLNLNQNXN`NgNiNqNxNxN‡N�NšN¡N¤N½N½NÅNÔNßNæNèNüNOOOOOOO-O2OAOHOOOdOxOxO}O}O…O”O›O O´O»OÀOÀOÌOÞOÞOòOPPP'P5PCPKPRPpP}P‚P‘P‘P¨P¯P¶PÆPÈPÖPæPèPöPQQQ1Q8QDQVQmQoQ{Q†QˆQˆQ–QªQºQÂQÄQØQíQôQRR2R9RERgRgRgRoRoR{RR‡R‹R–R�R¤R¾RÃRÊRÕRÞRæRëRëRúRÿRS"S1Sá>áGá[á`áø@žážá§áÆáËáùØ4ÎáÎáØáâáëáöáýáââ âú@ áá$á8á>áû@fáfátá“á™áü˜y©~ñ~ñŽñŽñ¥ñ´ñ¸ñÆñÌñÛñÛñâñòñÿñò ò òJòPòUòYòiòiòiò�òƒòŽò¯ò¼ò¾ò×òÛòéòîòîòõòó óó…óý8 ]Áþdþdeee"e%e)e.e5e5eBeKeQeXeXeqeze�e‡e“eŸe¨e¯eµeºeÈeÛeæeîeúeúeffffff*f-f2f2f8fDfGfLfLfRf^faffffflfzf}f‚f‚fˆf–f™fžfžf¤f«f»fÂfÅfÊfÊfÊfÜfâfðfõfýfgg*g2g8gDg]ghgug{gŠg�g“g˜g˜g˜gªg°g°g°gÇgÏg×gõgh hh"h+h.h4h9h9h9hKhQh[hthhŒh’h¡h¤hªh¯h¯h¯hÁhÇhÇhÞhåhñh÷hiii&i+i;iHiViXi^ikinitiyiyiyi‹i‘iªiµiÂiÂiÈiÕiØiÞiãiãièiüijjj0j6jlClClIlIl`lrl}l…l�l’l l¦l«l«l±l·l¼l¼lÂlÑlålòlølûlmmmm)m6m5E5S5_5j5j5s5z5‰5š5§5§5§5»5Ï5ß5â5r6ð6ÑÆÆèï,,,688CCq‚‚‚‚‘ µÂÂÑØëñ7=HXjsz‡Ž³¸ÆÏÏÖÖåüü '18=HNV|…Œ”Ÿ«ºÊÏ×ãññ"22FLUUUdj~‡™¨½ÆØëö *=AMa}}‘—¢®¾ÎÓÜÜîòþ..BHS_o‘———¦¬±···ÆÌÑ××Û¡#¸ ¢6ŽýŽý¨ý³ý¾ýÛýÛýÛýÛýèýèýþþ!þ*þ*þ*þ7þ?þWþ]þfþfþfþsþ�þ�þªþ¹þÄþÉþÒþÒþÒþßþãþëþóþÿþÿ+ÿ6ÿ;ÿAÿJÿJÿJÿJÿWÿlÿrÿ{ÿ{ÿ¨ÿµÿºÿºÿÇÿÒÿÜÿâÿòÿ,2Zccxƒƒ•¡§Ä×ãçù 5CCCPlW}t‡‰¥‘­­»»½ÙÙàæï÷ú1$9?HHH[``kx�ˆˆ• ¦¯¯½ÇÇÔßåêóýý + )44AHOOr’””±ÆÆÌÕââõõ .7<clw|„Œœ±¶ÁÎÕÕí ;BGUessy€‰‰‰œœ°³³ÄÌÔÜù.3;;PZo‹‹‹˜˜®ººÎÛæôÿÿ0CH`uzz‰žž¤­­¹¹ÆÌßëëøû$/4@LY^^x}}œ´´´¹ÅÌàî    ! & G P \ b k k k „ š š š § ­ ° » Á Ä Ì Û Û ó ù  + + + + + +% ++ +. +6 +E +E +] +c +n +n +n + +… +ˆ +“ +™ +œ +ž +Ì +ß +÷ +ý +  $ * 5 5 B ¿ cÔ¦&¦&Ä&Ï&Ö&Ö&ß&ï&ï&' +''''@'@'M'P'Y'Y'm's'x'Ÿ'²'¶'¼'Ó'Ú'è'î'ú'( (()(3(<(L(N(U(Z(b(�(�(�(›(¸(×(Þ(è(÷(ý() )))3)T)h)t)ˆ)“)›)ª)·)Ä)Ò)à)ý) +****M*_*v**…*‘*–*�*�*±*¼*É*Ð*Ð*Ð*â*ñ*ó*++&+&+.+Q+\+�+¨Û-ž+ž+Å+Ï+â+í+,,,+,2,:,P,X,X,k,€,�,š,œ,¬,¼,Å,Ë,Ð,×,Þ,ä,ê,õ,-- +-$-,-F-[-[-h-k-s-w-‰-˜-£-«-«-Â-Û-ß-è-ï-. .... .1.H.V.\.`.b.o.o.o.q.ˆ.Ž.Ž. .ˆ 0v6v6”6œ6¢6¢6³6Ð6Þ6ä6ä6ä6ñ6ó6þ6777(7.78787C7M7M7a7g7w7}7‚7‰7’7˜7ž7­7Â7Ç7Ê7Ð7Ð7Ø7Þ7ä7ä7ù78888%8.8.8D8J8P8f8k8r8‡8‹8‹8“8™8«8±8¹8Ã8Î8Ô8Ø8ò8û899 99!969;9?9F9L9R9R9Z9^9e9k9q9q9q9œ9œ9­9­9Ä9Ñ9Õ9Õ9Ý9ò9 : ::::::/:@:@:U:i:u:ƒ:‡:™:�:£:À:Â:È:Õ:×:ã:; ;;7;B;H;N;T;];d;y;Š;–;š;¬;°;¶;Ó;Õ;Û;ì;î;ú;< <%<+<4<;<;<K<i<r<x<x<�<’<’<™< <²<·<·<·<Ñ<Ö<ð<õ<==!=,=O=U=[=g={=‚=ˆ=”=™=™=¤=¨=¯=Á=Æ=Î=Ó=Þ=ä=ì=ñ=>>>%>2>E>E>_>d>d>~>~>‰>˜>�>¦>«>¸>¿>Ä>Ä>Ï>Ó>Ú>ì>ñ>ù>ý> ???"?*?2?:?M?Y?^?j?j?s?s?�?�?£?©?®?²?·?·?·?·?½?Â?Â?å?ë?ñ?@ @ @ @,@,@,@1@1@T@¿CÈ 6WW.W.WBWHWSWaWmW�W�W•W›W›W¦W¶WÃWÑWÞWX xiu88 8'8C8Q8V8V8n8x8x8‰8 +€Üé'2=HS^ik{ `¹Â\\*\=\F\L\O\W\  ¨¹h[h[v[x[‚[”[›[¥[§[§[»[Å[Ú[Ú[Ý[\ hÈ@È@Ø@ê@ð@ö@ü@€h@h@t@~@…@Œ@ @²@²@È@˜3Cà/à/ð/ð/ 00030C0O0S0{0hé3€€’¢²û#+4:BDJRY`‘ššÏù!9Mj” ¿×Ùàçç>x²ì&```lw|||‹˜��£¨¨®¹¾¾ÄÏÔÔÚåðõõû  ',,2=HMMS^ityy…ŠŠ�›¡¦¦¬·½ÂÂÈÓÞäééïú !'))/:EKMMS^itz||ƒƒ‘””Ÿ¬»»Ð 77E]]foŒš¶Ôéé0Nccor£¥ÀÇÇÔÝßíïýÿ  16==JSUcesuƒƒ££££°ÇÚû)19AIWejrz‚Š˜¦¦ºÅÛñ,7ELfz�”®ÂÂØÝßææû.99FRWin€…“““¶¶Ûâíð $(CGZ^^xŒ—œª¿Êà&+>CVccu�Ÿ¦ÀÔø  ?SX„˜��¯´ÆÒò   ) 5 : L Q c h z z � � � � � ³ ³ ³ º Ô é û  % 3 3 8 8 8 @ Z o t t t { • ª ¯ ¯ ¯ ¶ Ð å ê ê ñ ô !"!7!>ITTX]]qu~~�—› ¬³ÀÔÛÝáãûP07ÆCÆCÊCÔCìCùCDH7=DD$D=DDDdD \ No newline at end of file diff --git a/TempleOS/Compiler/Compiler.PRJ b/TempleOS/Compiler/Compiler.PRJ index 5d8a3d5..cfcbcbf 100644 --- a/TempleOS/Compiler/Compiler.PRJ +++ b/TempleOS/Compiler/Compiler.PRJ @@ -5,7 +5,6 @@ #include "CmpAsm" #include "CmpExts" #include "CmpGlbls" -#include "CmpQueVect" #include "Unassembler" #include "Directives" #include "Lex" diff --git a/TempleOS/Compiler/Directives.CPP b/TempleOS/Compiler/Directives.CPP index c69d736..45bd71d 100644 --- a/TempleOS/Compiler/Directives.CPP +++ b/TempleOS/Compiler/Directives.CPP @@ -55,20 +55,21 @@ Bool IsReplaceSyms() { U0 ImportHashTable(CHashTable *src) { //called from #exe {} in AOT modules -// See $LK-A,"::/TempleOS/Kernel/AOTAdam.HPP"$. + // See $LK-A,"::/TempleOS/Kernel/AOTAdam.HPP"$. CLex *lx=Fs->last_lex; if (lx==&Fs->next_lex) { PutErr; "Not Compiling\n"; - } - if (!(lx->flags&LF_EXE_BLK)) - LexExcept(lx,"ST_IMPORT_HASH_TABLE_NOT_ALLOWED"); - while (src) { - if (lx->stream_parent_glbl_hash_table) - HashTableImport(src,lx->stream_parent_glbl_hash_table); - else - HashTableImport(src,lx->glbl_hash_table); - src=src->next; + } else { + if (!(lx->flags&LF_EXE_BLK)) + LexExcept(lx,"ST_IMPORT_HASH_TABLE_NOT_ALLOWED"); + while (src) { + if (lx->htc.next && lx->htc.next->glbl_hash_table) + HashTableImport(src,lx->htc.next->glbl_hash_table); + else if (lx->htc.glbl_hash_table) + HashTableImport(src,lx->htc.glbl_hash_table); + src=src->next; + } } } diff --git a/TempleOS/Compiler/ExpParser.CPP b/TempleOS/Compiler/ExpParser.CPP index 9a46149..1c5fe48 100644 --- a/TempleOS/Compiler/ExpParser.CPP +++ b/TempleOS/Compiler/ExpParser.CPP @@ -35,30 +35,313 @@ U0 PrsPopDeref(CPrsStk *ps) } } -#define PRST_UNARY_TERM 0 -#define PRST_MAYBE_MODIFIERS 1 -#define PRST_UNARY_MODIFIERS 2 -#define PRST_DEREFERENCE 3 -#define PRST_CHECK_BINARY_OPS 4 +#define PE_UNARY_TERM1 0 +#define PE_UNARY_TERM2 1 +#define PE_MAYBE_MODIFIERS 2 +#define PE_UNARY_MODIFIERS 3 +#define PE_DEREFERENCE 4 +#define PE_CHECK_BINARY_OPS1 5 +#define PE_CHECK_BINARY_OPS2 6 +#define PE_DO_UNARY_OP 7 +#define PE_DO_BINARY_OP 8 +#define PE_POP_HIGHER 9 +#define PE_PUSH_LOWER 10 +#define PE_POP_ALL1 11 +#define PE_POP_ALL2 12 + +U0 PrsExpression2(CLex *lx,I64 *_max_prec,CPrsStk *ps) +{ + Bool div_sizeof; + I64 i,cur_op,stk_op,state,max_prec=PREC_NULL,unary_pre_prec,paren_prec, + unary_post_prec,left_prec=PREC_MAX; + CIntermediateCode *tempi,*tempi2; + CHashClass *tempc,*tempc1; + CMemberLst *local_var; + CArrayDim *tempad=NULL; + + goto pe_unary_term1; + while (TRUE) { + nobound_switch (state) { + case PE_UNARY_TERM1: +pe_unary_term1: + unary_pre_prec=PREC_NULL; + unary_post_prec=PREC_NULL; + lx->flags&=~(LF_PAREN+LF_PREINC+LF_PREDEC+LF_POSTINC+LF_POSTDEC+LF_FUN_EXP); + case PE_UNARY_TERM2: + state=PrsUnaryTerm(lx,ps,&local_var,&tempad,&max_prec,&unary_pre_prec,&paren_prec); + break; + case PE_UNARY_MODIFIERS: + state=PrsUnaryModifier(lx,ps,&local_var,&tempad,&unary_post_prec); + break; + case PE_MAYBE_MODIFIERS: + if (lx->token=='(') { + lx->flags|=LF_RAX; + state=PrsUnaryModifier(lx,ps,&local_var,&tempad,&unary_post_prec); + } else + goto pe_check_binary_ops1; + break; + case PE_DEREFERENCE: + if (!(lx->flags&(LF_PREINC|LF_PREDEC|LF_POSTINC|LF_POSTDEC))) + i=IC_DEREF+PREC_UNARY_PRE<<16; + else { + if (lx->flags & LF_POSTINC) + i=IC__PP+PREC_UNARY_POST<<16; + else if (lx->flags & LF_POSTDEC) + i=IC__MM+PREC_UNARY_POST<<16; + else if (lx->flags & LF_PREDEC) + i=IC_MM_+PREC_UNARY_PRE<<16; + else + i=IC_PP_+PREC_UNARY_PRE<<16; + lx->flags&=~(LF_PREINC|LF_PREDEC|LF_POSTINC|LF_POSTDEC); + } + tempi=lx->cbh.cb_last_out_ptr; + if (lx->flags & (LF_RAX|LF_ARRAY)) { + if (tempi->ic_opcode==IC_DEREF) + tempi->ic_opcode=i; + } else { + tempc=OptClassFwd(tempi->ic_class-1); + CBICAdd(lx,i,0,tempc); + } + case PE_CHECK_BINARY_OPS1: +pe_check_binary_ops1: + if (paren_prec) { + if (unary_pre_prec || unary_post_prec) { + if (paren_prec<=unary_pre_prec && !unary_post_prec) + ParenWarning(lx); + paren_prec=PREC_NULL; + } else if (paren_prec<=PREC_UNARY_PRE+ASSOC_MASK) + ParenWarning(lx); + } + cur_op=binary_ops_table[lx->token]; + + case PE_CHECK_BINARY_OPS2: +pe_check_binary_ops2: + stk_op=PrsPop(ps); + tempc=PrsPop(ps); + if (!(0cbh.cb_last_out_ptr->ic_class); + PrsPush(ps,cur_op); + goto pe_unary_term1; + } else { + tempi=lx->cbh.cb_last_out_ptr; + tempc=tempi->ic_class; + if (stk_op.u16[0]==IC_DEREF && tempc->ptr_cnt) + tempc--; + else if (stk_op.u16[0]==IC_ADDR) { + lx->abs_cnts.c_addres++; + if (Bt(deref_bitmap,tempi->ic_opcode)) + tempi->ic_opcode=IC_NOP1; + tempc++; + } + tempc=OptClassFwd(tempc); + if (stk_op) + CBICAdd(lx,stk_op,0,tempc); + goto pe_check_binary_ops2; + } + + case PE_DO_BINARY_OP: +pe_do_binary_op: + PrsPush(ps,tempc); + PrsPush(ps,stk_op); + if (!cur_op) + goto pe_pop_all1; + + switch (cur_op.u16[0]) { + case IC_ADD: + case IC_SUB: + tempi=lx->cbh.cb_last_out_ptr; + if (!tempi->ic_class->ptr_cnt && + tempi->ic_class->sub_type!=IT_F64) { + CBICAdd(lx,IC_SIZEOF,1,sys_internal_types[IT_I64]); + CBICAdd(lx,IC_MUL,0,sys_internal_types[IT_I64]); + } + break; + case IC_AND_AND: + case IC_OR_OR: + CBICAdd(lx,IC_NOP1,0,sys_internal_types[IT_I64]); + break; + } + if (lx->flags & LF_FUN_EXP) { + ps->ptr2--; + lx->flags&=~LF_FUN_EXP; + } + Lex(lx); //skip op + if (paren_prec>PREC_UNARY_PRE+ASSOC_MASK && + paren_prec&~ASSOC_MASKmax_prec) + max_prec=cur_op.u8[2]; + left_prec=cur_op.u8[2]; + if (Bt(assign_bitmap,cur_op.u16[0])) { + tempi=lx->cbh.cb_last_out_ptr; + tempc=OptClassFwd(tempi->ic_class); + if (!Bt(deref_bitmap,tempi->ic_opcode) || + !tempc->ptr_cnt && !Bt(&tempc->flags,Cf_INTERNAL_TYPE)) + LexExcept(lx,"ST_INVALID_LVAL"); + tempi->ic_opcode=IC_NOP1; + cur_op.u8[2]=PREC_ASSIGN|ASSOCF_RIGHT; + } + + case PE_POP_HIGHER: +pe_pop_higher: + stk_op=PrsPop(ps); //pop ops of higher prec + tempc=PrsPop(ps); + if (!stk_op) + goto pe_push_lower; + else if (cur_op.u8[2]&~ASSOC_MASK==stk_op.u8[2]&~ASSOC_MASK) { + if (cur_op.u8[2]&ASSOCF_RIGHT) + goto pe_push_lower; + } else if (cur_op.u8[2]&~ASSOC_MASK<=stk_op.u8[2]&~ASSOC_MASK) + goto pe_push_lower; + + div_sizeof=FALSE; + switch (stk_op.u16[0]) { + case IC_ADD: + if (tempc->ptr_cnt) { + tempi=lx->cbh.cb_last_out_ptr; + if (!tempi->ic_class->ptr_cnt && + tempi->ic_class->sub_type!=IT_F64) { + CBICAdd(lx,IC_SIZEOF,1,sys_internal_types[IT_I64]); + CBICAdd(lx,IC_MUL,0,sys_internal_types[IT_I64]); + } + } + break; + case IC_SUB: + if (tempc->ptr_cnt) { + tempi=lx->cbh.cb_last_out_ptr; + if (!tempi->ic_class->ptr_cnt && + tempi->ic_class->sub_type!=IT_F64) { + CBICAdd(lx,IC_SIZEOF,1,sys_internal_types[IT_I64]); + CBICAdd(lx,IC_MUL,0,sys_internal_types[IT_I64]); + } else + div_sizeof=TRUE; + } + break; + case IC_AND_AND: + case IC_OR_OR: + CBICAdd(lx,IC_NOP1,0,sys_internal_types[IT_I64]); + break; + case IC_ADD_EQUAL: + case IC_SUB_EQUAL: + if (tempc->ptr_cnt) { + CBICAdd(lx,IC_SIZEOF,1,sys_internal_types[IT_I64]); + CBICAdd(lx,IC_MUL,0,sys_internal_types[IT_I64]); + } + break; + } + tempi2=CBICAdd(lx,stk_op,0,tempc); + if (stk_op.u8[3]&ECF_HAS_PUSH_CMP) { + tempi2->ic_flags|=ICF_POP_CMP; + CBICAdd(lx,IC_NOP1,0,sys_internal_types[IT_I64]); + CBICAdd(lx,IC_AND_AND,0,sys_internal_types[IT_I64],ICF_POP_CMP); + } + if (Bt(cmp_bitmap,cur_op.u16[0]) && Bt(cmp_bitmap,stk_op.u16[0])) { + tempi2->ic_flags|=ICF_PUSH_CMP; + CBICAdd(lx,IC_NOP1,0,sys_internal_types[IT_I64]); + CBICAdd(lx,IC_PUSH_CMP,0,tempc); + cur_op.u8[3]|=ECF_HAS_PUSH_CMP; + } else if (cur_op.u16[0]==IC_AND_AND || cur_op.u16[0]==IC_OR_OR) + CBICAdd(lx,IC_NOP1,0,sys_internal_types[IT_I64]); + if (div_sizeof) { + tempc1=tempc-1; + if (tempc1->size!=1) { + CBICAdd(lx,IC_IMM_U64,tempc1->size,sys_internal_types[IT_I64]); + CBICAdd(lx,IC_DIV,0,sys_internal_types[IT_I64]); + tempc=sys_internal_types[IT_I64]; + } + } + goto pe_pop_higher; + + case PE_PUSH_LOWER: +pe_push_lower: + PrsPush(ps,tempc); + PrsPush(ps,stk_op); + PrsPush(ps,lx->cbh.cb_last_out_ptr->ic_class); + PrsPush(ps,cur_op); + goto pe_unary_term1; + + case PE_POP_ALL1: +pe_pop_all1: + if (paren_prec>PREC_UNARY_PRE+ASSOC_MASK && + paren_prec&~ASSOC_MASK<=left_prec&~ASSOC_MASK- + paren_prec&ASSOCF_LEFT-left_prec&ASSOCF_LEFT) + ParenWarning(lx); + case PE_POP_ALL2: +pe_pop_all2: + stk_op=PrsPop(ps); + tempc=PrsPop(ps); + div_sizeof=FALSE; + tempi=lx->cbh.cb_last_out_ptr; + switch (stk_op.u16[0]) { + case 0: + goto pe_done; + case IC_ADD: + if (tempc->ptr_cnt && !tempi->ic_class->ptr_cnt && + tempi->ic_class->sub_type!=IT_F64) { + CBICAdd(lx,IC_SIZEOF,1,sys_internal_types[IT_I64]); + CBICAdd(lx,IC_MUL,0,sys_internal_types[IT_I64]); + } + break; + case IC_SUB: + if (tempc->ptr_cnt && tempi->ic_class->sub_type!=IT_F64) { + if (!tempi->ic_class->ptr_cnt) { + CBICAdd(lx,IC_SIZEOF,1,sys_internal_types[IT_I64]); + CBICAdd(lx,IC_MUL,0,sys_internal_types[IT_I64]); + } else + div_sizeof=TRUE; + } + break; + case IC_AND_AND: + case IC_OR_OR: + CBICAdd(lx,IC_NOP1,0,sys_internal_types[IT_I64]); + break; + case IC_ADD_EQUAL: + case IC_SUB_EQUAL: + if (tempc->ptr_cnt) { + CBICAdd(lx,IC_SIZEOF,1,sys_internal_types[IT_I64]); + CBICAdd(lx,IC_MUL,0,sys_internal_types[IT_I64]); + } + break; + } + tempi=CBICAdd(lx,stk_op,0,tempc); + if (stk_op.u8[3]&ECF_HAS_PUSH_CMP) { + tempi->ic_flags|=ICF_POP_CMP; + CBICAdd(lx,IC_NOP1,0,sys_internal_types[IT_I64]); + CBICAdd(lx,IC_AND_AND,0,sys_internal_types[IT_I64],ICF_POP_CMP); + } + if (div_sizeof) { + tempc1=tempc-1; + if (tempc1->size!=1) { + CBICAdd(lx,IC_IMM_U64,tempc1->size,sys_internal_types[IT_I64]); + CBICAdd(lx,IC_DIV,0,sys_internal_types[IT_I64]); + tempc=sys_internal_types[IT_I64]; + } + } + goto pe_pop_all2; + } + } +pe_done: + if (_max_prec) + *_max_prec=max_prec; +} Bool PrsExpression(CLex *lx,I64 *_max_prec,Bool end_exp,CPrsStk *_ps=NULL) { - Bool result=TRUE,cont_unary,cont_check_binary_ops,is_lower,div_sizeof; - I64 i,k,old_flags=lx->flags,old_expression_start_line_num=lx->expression_start_line_num, - max_prec=PREC_NULL,unary_pre_prec,paren_prec,unary_post_prec, - left_prec=PREC_MAX,quest=0; - CIntermediateCode *tempi,*tempi2; - CHashClass *tempc,*tempc1; + Bool result=TRUE; + I64 old_flags=lx->flags; CPrsStk *ps; - CMemberLst *local_var; - CArrayDim *tempad=NULL; - if (!(lx->flags&LF_INSIDE_EXPRESSION)) { - if (lx->fun_lfn) - lx->expression_start_line_num=lx->fun_lfn->line_num; - else - lx->expression_start_line_num=1; - } - lx->flags|=LF_INSIDE_EXPRESSION; if (_ps) ps=_ps; else { @@ -68,278 +351,13 @@ Bool PrsExpression(CLex *lx,I64 *_max_prec,Bool end_exp,CPrsStk *_ps=NULL) } PrsPush(ps,0); //terminate PrsPush(ps,0); //terminate - try { - do { - unary_pre_prec=PREC_NULL; - lx->flags&=~(LF_PAREN+LF_PREINC+LF_PREDEC+LF_POSTINC+LF_POSTDEC+LF_FUN_EXP); - do i=PrsUnaryTerm(lx,ps,&local_var,&tempad,&max_prec,&unary_pre_prec,&paren_prec); - while (i==PRST_UNARY_TERM); - - unary_post_prec=PREC_NULL; - while (TRUE) { - if (i==PRST_UNARY_MODIFIERS) - i=PrsUnaryModifier(lx,ps,&local_var,&tempad,&unary_post_prec); - else if (i==PRST_MAYBE_MODIFIERS) { - if (lx->token=='(') { - lx->flags|=LF_RAX; - i=PrsUnaryModifier(lx,ps,&local_var,&tempad,&unary_post_prec); - } else { - i=PRST_CHECK_BINARY_OPS; - break; - } - } else - break; - } - - if (paren_prec) { - if (unary_pre_prec || unary_post_prec) { - if (paren_prec<=unary_pre_prec && !unary_post_prec) - ParenWarning(lx); - paren_prec=PREC_NULL; - } else if (paren_prec<=PREC_UNARY_PRE+ASSOC_MASK) - ParenWarning(lx); - } - - if (i==PRST_DEREFERENCE) - PrsDereference(lx); - - //Check for binary Ops - do { - i=PrsPop(ps); - tempc=PrsPop(ps); - if (0token]; - if (k.u16[0]==IC_POWER && - i.u16[0]==IC_UNARY_MINUS) { - Lex(lx); //skip ` op - left_prec=k.i8[2]; - PrsPush(ps,tempc); - PrsPush(ps,i); - PrsPush(ps,lx->cbh.cb_last_out_ptr->ic_class); - PrsPush(ps,k); - cont_check_binary_ops=FALSE; - cont_unary=TRUE; - } else { - tempi=lx->cbh.cb_last_out_ptr; - tempc=tempi->ic_class; - if (i.u16[0]==IC_DEREF && tempc->ptr_cnt) - tempc--; - else if (i.u16[0]==IC_ADDR) { - lx->abs_cnts.c_addres++; - if (Bt(deref_bitmap,tempi->ic_opcode)) - tempi->ic_opcode=IC_NOP; - tempc++; - } - while (tempc->fwd_class) - tempc=tempc->fwd_class; - if (i) - CBICAdd(lx,i,0,tempc); - cont_check_binary_ops=TRUE; - } - } else { - PrsPush(ps,tempc); - PrsPush(ps,i); - i=lx->token; - k=binary_ops_table[i]; - switch (k.u16[0]) { - case IC_ADD: - case IC_SUB: - tempi=lx->cbh.cb_last_out_ptr; - if (!tempi->ic_class->ptr_cnt && - tempi->ic_class->sub_type!=IT_F64) { - CBICAdd(lx,IC_SIZEOF,1,sys_internal_types[IT_I64]); - CBICAdd(lx,IC_MUL,0,sys_internal_types[IT_I64]); - } - break; - case IC_AND_AND: - case IC_OR_OR: - CBICAdd(lx,IC_NOP,0,sys_internal_types[IT_I64]); - break; - case IC_QUESTION: - quest++; - break; - case IC_COLON: - if (!quest) //case statement colons or labels - k=0; - else - quest--; - break; - } - if (!k.u8[2]) { - if (paren_prec>PREC_UNARY_PRE+ASSOC_MASK && - paren_prec&~ASSOC_MASK<=left_prec&~ASSOC_MASK- - paren_prec&ASSOCF_LEFT-left_prec&ASSOCF_LEFT) - ParenWarning(lx); - cont_check_binary_ops=FALSE; - cont_unary=FALSE; //DONE - } else { - if (lx->flags & LF_FUN_EXP) { - ps->ptr2--; - lx->flags&=~LF_FUN_EXP; - } - Lex(lx); //skip op - if (paren_prec>PREC_UNARY_PRE+ASSOC_MASK && - paren_prec&~ASSOC_MASKmax_prec) - max_prec=k.u8[2]; - left_prec=k.u8[2]; - if (Bt(assign_bitmap,k.u16[0])) { - tempi=lx->cbh.cb_last_out_ptr; - tempc=tempi->ic_class; - while (tempc->fwd_class) - tempc=tempc->fwd_class; - if (!Bt(deref_bitmap,tempi->ic_opcode) || - !tempc->ptr_cnt && !Bt(&tempc->flags,Cf_INTERNAL_TYPE)) - LexExcept(lx,"ST_INVALID_LVAL"); - tempi->ic_opcode=IC_NOP; - k.u8[2]=PREC_ASSIGN|ASSOCF_RIGHT; - } - while (TRUE) { - i=PrsPop(ps); //pop ops of higher prec - tempc=PrsPop(ps); - is_lower=FALSE; - if (i) { - if (k.u8[2]&~ASSOC_MASK==i.u8[2]&~ASSOC_MASK) { - if (!(k.u8[2]&ASSOCF_RIGHT)) - is_lower=TRUE; - } else if (k.u8[2]&~ASSOC_MASK>i.u8[2]&~ASSOC_MASK) - is_lower=TRUE; - } - div_sizeof=FALSE; - if (is_lower) { - switch (i.u16[0]) { - case IC_ADD: - if (tempc->ptr_cnt) { - tempi=lx->cbh.cb_last_out_ptr; - if (!tempi->ic_class->ptr_cnt && - tempi->ic_class->sub_type!=IT_F64) { - CBICAdd(lx,IC_SIZEOF,1,sys_internal_types[IT_I64]); - CBICAdd(lx,IC_MUL,0,sys_internal_types[IT_I64]); - } - } - break; - case IC_SUB: - if (tempc->ptr_cnt) { - tempi=lx->cbh.cb_last_out_ptr; - if (!tempi->ic_class->ptr_cnt && - tempi->ic_class->sub_type!=IT_F64) { - CBICAdd(lx,IC_SIZEOF,1,sys_internal_types[IT_I64]); - CBICAdd(lx,IC_MUL,0,sys_internal_types[IT_I64]); - } else - div_sizeof=TRUE; - } - break; - case IC_AND_AND: - case IC_OR_OR: - CBICAdd(lx,IC_NOP,0,sys_internal_types[IT_I64]); - break; - case IC_ADD_EQUAL: - case IC_SUB_EQUAL: - if (tempc->ptr_cnt) { - CBICAdd(lx,IC_SIZEOF,1,sys_internal_types[IT_I64]); - CBICAdd(lx,IC_MUL,0,sys_internal_types[IT_I64]); - } - break; - } - tempi2=CBICAdd(lx,i,0,tempc); - if (i.u8[3]&ECF_HAS_PUSH_CMP) { - tempi2->ic_flags|=ICF_POP_CMP; - CBICAdd(lx,IC_NOP,0,sys_internal_types[IT_I64]); - CBICAdd(lx,IC_AND_AND,0,sys_internal_types[IT_I64],ICF_POP_CMP); - } - if (Bt(cmp_bitmap,k.u16[0]) && Bt(cmp_bitmap,i.u16[0])) { - tempi2->ic_flags|=ICF_PUSH_CMP; - CBICAdd(lx,IC_NOP,0,sys_internal_types[IT_I64]); - CBICAdd(lx,IC_PUSH_CMP,0,tempc); - k.u8[3]|=ECF_HAS_PUSH_CMP; - } else if (k.u16[0]==IC_AND_AND || k.u16[0]==IC_OR_OR) - CBICAdd(lx,IC_NOP,0,sys_internal_types[IT_I64]); - if (div_sizeof) { - tempc1=tempc-1; - if (tempc1->size!=1) { - CBICAdd(lx,IC_IMM,tempc1->size,sys_internal_types[IT_I64]); - CBICAdd(lx,IC_DIV,0,sys_internal_types[IT_I64]); - tempc=sys_internal_types[IT_I64]; - } - } - } else { - PrsPush(ps,tempc); - PrsPush(ps,i); - PrsPush(ps,lx->cbh.cb_last_out_ptr->ic_class); - PrsPush(ps,k); - cont_check_binary_ops=FALSE; - cont_unary=TRUE; - break; - } - } - } - } - } while (cont_check_binary_ops); - } while (cont_unary); - while (TRUE) { - i=PrsPop(ps); - tempc=PrsPop(ps); - div_sizeof=FALSE; - tempi=lx->cbh.cb_last_out_ptr; - switch (i.u16[0]) { - case 0: - goto done3; - case IC_ADD: - if (tempc->ptr_cnt && !tempi->ic_class->ptr_cnt && - tempi->ic_class->sub_type!=IT_F64) { - CBICAdd(lx,IC_SIZEOF,1,sys_internal_types[IT_I64]); - CBICAdd(lx,IC_MUL,0,sys_internal_types[IT_I64]); - } - break; - case IC_SUB: - if (tempc->ptr_cnt && tempi->ic_class->sub_type!=IT_F64) { - if (!tempi->ic_class->ptr_cnt) { - CBICAdd(lx,IC_SIZEOF,1,sys_internal_types[IT_I64]); - CBICAdd(lx,IC_MUL,0,sys_internal_types[IT_I64]); - } else - div_sizeof=TRUE; - } - break; - case IC_AND_AND: - case IC_OR_OR: - CBICAdd(lx,IC_NOP,0,sys_internal_types[IT_I64]); - break; - case IC_ADD_EQUAL: - case IC_SUB_EQUAL: - if (tempc->ptr_cnt) { - CBICAdd(lx,IC_SIZEOF,1,sys_internal_types[IT_I64]); - CBICAdd(lx,IC_MUL,0,sys_internal_types[IT_I64]); - } - break; - } - tempi=CBICAdd(lx,i,0,tempc); - if (i.u8[3]&ECF_HAS_PUSH_CMP) { - tempi->ic_flags|=ICF_POP_CMP; - CBICAdd(lx,IC_NOP,0,sys_internal_types[IT_I64]); - CBICAdd(lx,IC_AND_AND,0,sys_internal_types[IT_I64],ICF_POP_CMP); - } - if (div_sizeof) { - tempc1=tempc-1; - if (tempc1->size!=1) { - CBICAdd(lx,IC_IMM,tempc1->size,sys_internal_types[IT_I64]); - CBICAdd(lx,IC_DIV,0,sys_internal_types[IT_I64]); - tempc=sys_internal_types[IT_I64]; - } - } - } -done3: - } catch { + try + PrsExpression2(lx,_max_prec,ps); //try catch causes noreg vars in function + catch { if (Fs->except_argc>0) { if (Fs->except_argv[0]==EXCEPT_COMPILER) { lx->statement_cnt=0; lx->braces_cnt=0; - lx->temp_indent_level=lx->indent_level=0; - QueVectU8Del(lx->indent_que_vect); - lx->indent_que_vect=NULL; result=FALSE; Fs->catch_except=TRUE; } @@ -352,13 +370,7 @@ done3: } if (end_exp && result) CBICAdd(lx,IC_END_EXP,0,0); - if (quest>0) - LexExcept(lx,"ST_MISSING_COLON"); - if (_max_prec) - *_max_prec=max_prec; - lx->flags=lx->flags&~LF_INSIDE_EXPRESSION | - old_flags&(LF_INSIDE_EXPRESSION|LF_PREINC|LF_PREDEC); - lx->expression_start_line_num=old_expression_start_line_num; + lx->flags|=old_flags&(LF_PREINC|LF_PREDEC); return result; } @@ -407,7 +419,7 @@ pu_sizeof_member: while (Lex(lx)=='*'); i=sizeof(U8 *); } - CBICAdd(lx,IC_IMM,i,sys_internal_types[IT_I64]); + CBICAdd(lx,IC_IMM_U64,i,sys_internal_types[IT_I64]); } U0 PrsOffsetOf(CLex *lx) @@ -438,7 +450,7 @@ U0 PrsOffsetOf(CLex *lx) i+=tempm->offset; tempc=tempm->member_class; } while (Lex(lx)=='.'); - CBICAdd(lx,IC_IMM,i,sys_internal_types[IT_I64]); + CBICAdd(lx,IC_IMM_U64,i,sys_internal_types[IT_I64]); } I64 PrsFunCall(CLex *lx,CPrsStk *ps,Bool indirect,CHashFun *tempf) @@ -453,14 +465,14 @@ I64 PrsFunCall(CLex *lx,CPrsStk *ps,Bool indirect,CHashFun *tempf) if (!tempf) { if (lx->token==TK_U8) { - if (!(tempf=HashFind("PutChar",lx->hash_table_lst,HTT_FUN))) + if (!(tempf=HashFind("PutChar",lx->htc.hash_table_lst,HTT_FUN))) LexExcept(lx,"ST_HEADER_FOR_PRINTF"); if (!lx->cur_i) //empty char signals PutChar with variable Lex(lx); is_str_out=FALSE; is_putchar=TRUE; } else { - if (!(tempf=HashFind("PrintF",lx->hash_table_lst,HTT_FUN))) + if (!(tempf=HashFind("PrintF",lx->htc.hash_table_lst,HTT_FUN))) LexExcept(lx,"ST_HEADER_FOR_PRINTF"); if (!*lx->ident) //empty string signals PrintF with variable fmt_str Lex(lx); @@ -482,7 +494,7 @@ I64 PrsFunCall(CLex *lx,CPrsStk *ps,Bool indirect,CHashFun *tempf) CBICAdd(lx,IC_DEREF,0,sys_internal_types[IT_PTR]); lx->cbh.cb_last_out_ptr->ic_class=sys_internal_types[IT_PTR]; CBICAdd(lx,IC_SET_RAX,0,sys_internal_types[IT_PTR]); - CBICAdd(lx,IC_NOP1,1,sys_internal_types[IT_PTR]); //balance the books + CBICAdd(lx,IC_NOP2,1,sys_internal_types[IT_PTR]); //balance the books } CBPush(lx); tempcbh=lx->cbh.cb_next; @@ -522,7 +534,7 @@ I64 PrsFunCall(CLex *lx,CPrsStk *ps,Bool indirect,CHashFun *tempf) mc->str=StrNew(tempm->dft_val); lx->flags|=LF_HAS_MISC_DATA; } else - CBICAdd(lx,IC_IMM,tempm->dft_val,tempm->member_class); + CBICAdd(lx,IC_IMM_U64,tempm->dft_val,tempm->member_class); } else { if (!PrsExpression(lx,NULL,FALSE,ps)) throw(EXCEPT_COMPILER,3); @@ -534,13 +546,9 @@ I64 PrsFunCall(CLex *lx,CPrsStk *ps,Bool indirect,CHashFun *tempf) lx->pass=1; tempi=OptPass012(lx,NULL,FALSE); CBPop(lx); - tempc1=tempi->ic_class; - while (tempc1->fwd_class) - tempc1=tempc1->fwd_class; - tempc2=tempm->member_class; - while (tempc2->fwd_class) - tempc2=tempc2->fwd_class; - if (tempc2->sub_type==IT_F64 && + tempc1=OptClassFwd(tempi->ic_class); + tempc2=OptClassFwd(tempm->member_class); + if (tempc2->sub_type==IT_F64 && !tempm->dim.next && tempc1->sub_type!=IT_F64) tempi->ic_flags|=ICF_R_TO_F64; else @@ -555,13 +563,13 @@ I64 PrsFunCall(CLex *lx,CPrsStk *ps,Bool indirect,CHashFun *tempf) tempm=tempm->next; } if (is_str_out && lx->token==';') { - if (!(tempf=HashFind("PutS",lx->hash_table_lst,HTT_FUN))) + if (!(tempf=HashFind("PutS",lx->htc.hash_table_lst,HTT_FUN))) LexExcept(lx,"ST_HEADER_FOR_PRINTF"); tempm=NULL; } if (tempm && tempm->flags & MLF_DOT_DOT_DOT) { CBOutPtrsInit(lx); - tempi=CBICAdd(lx,IC_IMM,0,tempm->member_class); + tempi=CBICAdd(lx,IC_IMM_U64,0,tempm->member_class); CBICAdd(lx,IC_END,0,0); CBPush(lx); if (is_str_out) { @@ -660,7 +668,7 @@ I64 PrsFunCall(CLex *lx,CPrsStk *ps,Bool indirect,CHashFun *tempf) if (is_str_out||is_putchar) CBICAdd(lx,IC_END_EXP,0,0); lx->flags=(lx->flags|LF_RAX) & ~(LF_ARRAY|LF_FUN_EXP); - return PRST_UNARY_MODIFIERS; + return PE_UNARY_MODIFIERS; } I64 PrsUnaryTerm(CLex *lx,CPrsStk *ps,CMemberLst **_local_var,CArrayDim **_tempad, @@ -684,18 +692,18 @@ I64 PrsUnaryTerm(CLex *lx,CPrsStk *ps,CMemberLst **_local_var,CArrayDim **_tempa if (PREC_TERM>*max_prec) *max_prec=PREC_TERM; if (lx->cur_i<0) - CBICAdd(lx,IC_IMM,lx->cur_i,sys_internal_types[IT_U64]); + CBICAdd(lx,IC_IMM_U64,lx->cur_i,sys_internal_types[IT_U64]); else - CBICAdd(lx,IC_IMM,lx->cur_i,sys_internal_types[IT_I64]); + CBICAdd(lx,IC_IMM_U64,lx->cur_i,sys_internal_types[IT_I64]); Lex(lx); - return PRST_MAYBE_MODIFIERS; + return PE_MAYBE_MODIFIERS; case TK_F64: if (PREC_TERM>*max_prec) *max_prec=PREC_TERM; i_ptr=&lx->cur_f; - CBICAdd(lx,IC_F64,*i_ptr,sys_internal_types[IT_F64]); + CBICAdd(lx,IC_IMM_F64,*i_ptr,sys_internal_types[IT_F64]); Lex(lx); - return PRST_MAYBE_MODIFIERS; + return PE_MAYBE_MODIFIERS; case TK_STR: if (PREC_TERM>*max_prec) *max_prec=PREC_TERM; @@ -705,7 +713,7 @@ I64 PrsUnaryTerm(CLex *lx,CPrsStk *ps,CMemberLst **_local_var,CArrayDim **_tempa mc->st_len=size; mc->str=d; lx->flags|=LF_HAS_MISC_DATA; - return PRST_MAYBE_MODIFIERS; + return PE_MAYBE_MODIFIERS; case TK_INS_BINARY: if (PREC_TERM>*max_prec) *max_prec=PREC_TERM; @@ -718,14 +726,14 @@ I64 PrsUnaryTerm(CLex *lx,CPrsStk *ps,CMemberLst **_local_var,CArrayDim **_tempa mc->str=d; lx->flags|=LF_HAS_MISC_DATA; Lex(lx); - return PRST_MAYBE_MODIFIERS; + return PE_MAYBE_MODIFIERS; case TK_INS_BINARY_TYPE: case TK_INS_BINARY_SIZE: if (PREC_TERM>*max_prec) *max_prec=PREC_TERM; - CBICAdd(lx,IC_IMM,lx->cur_i,sys_internal_types[IT_U64]); + CBICAdd(lx,IC_IMM_U64,lx->cur_i,sys_internal_types[IT_U64]); Lex(lx); - return PRST_MAYBE_MODIFIERS; + return PE_MAYBE_MODIFIERS; case '(': if (Lex(lx)==TK_IDENT && lx->hash_entry && lx->hash_entry->type & (HTT_CLASS|HTT_INTERNAL_TYPE)) LexExcept(lx,"ST_USE_POSTFIX_CAST"); @@ -744,7 +752,7 @@ I64 PrsUnaryTerm(CLex *lx,CPrsStk *ps,CMemberLst **_local_var,CArrayDim **_tempa LexExcept(lx,"ST_MISSING_RIGHT_PAREN"); Lex(lx); //skip ) lx->flags= lx->flags & ~LF_ARRAY | LF_RAX | LF_PAREN; - return PRST_UNARY_MODIFIERS; + return PE_UNARY_MODIFIERS; } } i=unary_ops_table[lx->token]; @@ -761,7 +769,7 @@ I64 PrsUnaryTerm(CLex *lx,CPrsStk *ps,CMemberLst **_local_var,CArrayDim **_tempa if (Bt(tempf->flags,Cf_EXTERN)) { if (lx->flags&LF_AOT_COMPILE) { if (lx->flags&LF_ASM_EXPRESSIONS) { - if (tempess=HashFind(tempf->str,lx->hash_table_lst,HTT_EXPORT_SYS_SYM)) + if (tempess=HashFind(tempf->str,lx->htc.hash_table_lst,HTT_EXPORT_SYS_SYM)) goto pu_export_sys_sym; else goto pu_new_sys_sym; @@ -769,7 +777,7 @@ I64 PrsUnaryTerm(CLex *lx,CPrsStk *ps,CMemberLst **_local_var,CArrayDim **_tempa LexExcept(lx,"ST_ADDR_EXTERN"); } lx->abs_cnts.externs++; - CBICAdd(lx,IC_IMM, + CBICAdd(lx,IC_IMM_U64, &tempf->executable_addr,sys_internal_types[IT_PTR]); CBICAdd(lx,IC_DEREF,0, sys_internal_types[IT_PTR]); @@ -780,22 +788,22 @@ I64 PrsUnaryTerm(CLex *lx,CPrsStk *ps,CMemberLst **_local_var,CArrayDim **_tempa if (lx->flags&LF_ASM_EXPRESSIONS) lx->abs_cnts.abs_addres++; } else - CBICAdd(lx,IC_IMM, + CBICAdd(lx,IC_IMM_U64, tempf->executable_addr,sys_internal_types[IT_PTR]); } lx->abs_cnts.c_addres++; Lex(lx); - return PRST_MAYBE_MODIFIERS; + return PE_MAYBE_MODIFIERS; } } else if (tempc->type & HTT_EXPORT_SYS_SYM) { tempess=tempc; if (lx->flags&LF_ASM_EXPRESSIONS && !(lx->flags&LF_AOT_COMPILE) && tempess->type&HTF_LIT) { lx->abs_cnts.c_addres++; - CBICAdd(lx,IC_IMM, + CBICAdd(lx,IC_IMM_U64, tempess->val,sys_internal_types[IT_PTR]); Lex(lx); - return PRST_MAYBE_MODIFIERS; + return PE_MAYBE_MODIFIERS; } else goto pu_export_sys_sym; } @@ -804,14 +812,14 @@ I64 PrsUnaryTerm(CLex *lx,CPrsStk *ps,CMemberLst **_local_var,CArrayDim **_tempa } PrsPush(ps,tempc); PrsPush(ps,i); - return PRST_UNARY_TERM; + return PE_UNARY_TERM2; } if (lx->token=='+') { if (PREC_UNARY_PRE>*max_prec) *max_prec=PREC_UNARY_PRE; *unary_pre_prec=PREC_UNARY_PRE; Lex(lx); - return PRST_UNARY_TERM; + return PE_UNARY_TERM2; } if (lx->token!=TK_IDENT) { @@ -821,7 +829,7 @@ I64 PrsUnaryTerm(CLex *lx,CPrsStk *ps,CMemberLst **_local_var,CArrayDim **_tempa *unary_pre_prec=PREC_UNARY_PRE; Lex(lx); lx->flags|=LF_PREINC; - return PRST_UNARY_TERM; + return PE_UNARY_TERM2; } if (lx->token==TK_MINUS_MINUS) { if (PREC_UNARY_PRE>*max_prec) @@ -829,7 +837,7 @@ I64 PrsUnaryTerm(CLex *lx,CPrsStk *ps,CMemberLst **_local_var,CArrayDim **_tempa *unary_pre_prec=PREC_UNARY_PRE; Lex(lx); lx->flags|=LF_PREDEC; - return PRST_UNARY_TERM; + return PE_UNARY_TERM2; } if (lx->token=='$$') { if (PREC_TERM>*max_prec) @@ -839,15 +847,15 @@ I64 PrsUnaryTerm(CLex *lx,CPrsStk *ps,CMemberLst **_local_var,CArrayDim **_tempa if (lx->flags&LF_AOT_COMPILE) CBICAdd(lx,IC_ABS_ADDR,lx->a->ip,sys_internal_types[IT_PTR]); else - CBICAdd(lx,IC_IMM,lx->a->ip,sys_internal_types[IT_PTR]); + CBICAdd(lx,IC_IMM_U64,lx->a->ip,sys_internal_types[IT_PTR]); } else { if (lx->flags&LF_CLASS_IP) - CBICAdd(lx,IC_IMM,lx->class_ip,sys_internal_types[IT_I64]); + CBICAdd(lx,IC_IMM_U64,lx->class_ip,sys_internal_types[IT_I64]); else CBICAdd(lx,IC_RIP,0,sys_internal_types[IT_PTR]); } Lex(lx); - return PRST_MAYBE_MODIFIERS; + return PE_MAYBE_MODIFIERS; } LexExcept(lx,"ST_MISSING_EXPRESSION"); } @@ -873,30 +881,30 @@ I64 PrsUnaryTerm(CLex *lx,CPrsStk *ps,CMemberLst **_local_var,CArrayDim **_tempa // else CBICAdd(lx,IC_ABS_ADDR,tempm->static_data_ip,tempc); } else - CBICAdd(lx,IC_IMM,tempm->static_data,tempc); + CBICAdd(lx,IC_IMM_U64,tempm->static_data,tempc); } else { if (lx->flags&LF_ASM_EXPRESSIONS) { i=PrsPop(ps); ps->ptr--; if (i.u16[0]!=IC_ADDR) LexExcept(lx,"ST_EXPECTING_AMPERSAND"); - CBICAdd(lx,IC_IMM,tempm->offset,sys_internal_types[IT_PTR]); + CBICAdd(lx,IC_IMM_U64,tempm->offset,sys_internal_types[IT_PTR]); *_local_var=tempm; Lex(lx); - return PRST_MAYBE_MODIFIERS; + return PE_MAYBE_MODIFIERS; } else { if (tempm->dim.next && tempm->offset>0 && StrCmp(tempm->str,"argv")) { tempc++; lx->flags&=~LF_ARRAY; } CBICAdd(lx,IC_RBP,0,tempc); - CBICAdd(lx,IC_IMM,tempm->offset,tempc); + CBICAdd(lx,IC_IMM_U64,tempm->offset,tempc); CBICAdd(lx,IC_ADD,0,tempc); } } Lex(lx); //skip var name *_local_var=tempm; - return PRST_UNARY_MODIFIERS; + return PE_UNARY_MODIFIERS; } pu_ident_but_not_local_var: @@ -912,17 +920,17 @@ pu_new_sys_sym: tempess->str[1]=='@') { tempess->type=HTT_EXPORT_SYS_SYM | HTF_UNRESOLVED | HTF_LOCAL; if (IsReplaceSyms) - HashReplace(tempess,lx->local_hash_table); + HashReplace(tempess,lx->htc.local_hash_table); else - HashAdd(tempess,lx->local_hash_table); + HashAdd(tempess,lx->htc.local_hash_table); } else { tempess->type=HTT_EXPORT_SYS_SYM | HTF_UNRESOLVED; if (tempc) - HashAddAfter(tempess,tempc,lx->glbl_hash_table); + HashAddAfter(tempess,tempc,lx->htc.glbl_hash_table); else if (IsReplaceSyms) - HashReplace(tempess,lx->glbl_hash_table); + HashReplace(tempess,lx->htc.glbl_hash_table); else - HashAdd(tempess,lx->glbl_hash_table); + HashAdd(tempess,lx->htc.glbl_hash_table); } } @@ -943,7 +951,7 @@ pu_export_sys_sym: lx->flags|=LF_UNRESOLVED|LF_LOCAL; else lx->flags|=LF_UNRESOLVED; - CBICAdd(lx,IC_IMM,&tempess->val,sys_internal_types[IT_PTR],ICF_NO_RIP); + CBICAdd(lx,IC_IMM_U64,&tempess->val,sys_internal_types[IT_PTR],ICF_NO_RIP); CBICAdd(lx,IC_DEREF,0,sys_internal_types[IT_PTR]); } else { if (lx->flags&LF_AOT_COMPILE && !(tempess->type & HTF_LIT)) @@ -951,11 +959,11 @@ pu_export_sys_sym: else { if (tempess->type&HTF_LIT) lx->abs_cnts.c_addres++; - CBICAdd(lx,IC_IMM,tempess->val,sys_internal_types[IT_PTR]); + CBICAdd(lx,IC_IMM_U64,tempess->val,sys_internal_types[IT_PTR]); } } Lex(lx); - return PRST_MAYBE_MODIFIERS; + return PE_MAYBE_MODIFIERS; } if (tempess->type & HTT_FUN) { @@ -990,10 +998,10 @@ pu_export_sys_sym: } else { if (tempg->flags & GVAF_EXTERN) { lx->abs_cnts.externs++; - CBICAdd(lx,IC_IMM,&tempg->data_addr,tempc); + CBICAdd(lx,IC_IMM_U64,&tempg->data_addr,tempc); CBICAdd(lx,IC_DEREF,0,tempc); } else - CBICAdd(lx,IC_IMM,tempg->data_addr,tempc); + CBICAdd(lx,IC_IMM_U64,tempg->data_addr,tempc); } Lex(lx); if (tempg->flags & GVAF_FUN) { @@ -1001,10 +1009,10 @@ pu_export_sys_sym: lx->flags|=LF_FUN_EXP; PrsPush2(ps,tempg->fun_ptr-tempg->fun_ptr->ptr_cnt); } - return PRST_UNARY_MODIFIERS; + return PE_UNARY_MODIFIERS; } else if (tempess->type & HTT_CLASS) { PrsOffsetOf(lx); - return PRST_MAYBE_MODIFIERS; + return PE_MAYBE_MODIFIERS; } if (!(tempess->type & HTT_KEYWORD)) @@ -1025,7 +1033,7 @@ pu_export_sys_sym: LexExcept(lx,"ST_MISSING_RIGHT_PAREN"); Lex(lx); } - return PRST_MAYBE_MODIFIERS; + return PE_MAYBE_MODIFIERS; case KW_OFFSET: if (PREC_TERM>*max_prec) *max_prec=PREC_TERM; @@ -1041,7 +1049,7 @@ pu_export_sys_sym: LexExcept(lx,"ST_MISSING_RIGHT_PAREN"); Lex(lx); } - return PRST_MAYBE_MODIFIERS; + return PE_MAYBE_MODIFIERS; case KW_DEFINED: if (PREC_TERM>*max_prec) *max_prec=PREC_TERM; @@ -1053,16 +1061,16 @@ pu_export_sys_sym: } if (lx->token==TK_IDENT && (lx->hash_entry || lx->local_var_entry)) - CBICAdd(lx,IC_IMM,TRUE,sys_internal_types[IT_I64]); + CBICAdd(lx,IC_IMM_U64,TRUE,sys_internal_types[IT_I64]); else - CBICAdd(lx,IC_IMM,FALSE,sys_internal_types[IT_I64]); + CBICAdd(lx,IC_IMM_U64,FALSE,sys_internal_types[IT_I64]); Lex(lx); while (j--) { if (lx->token!=')') LexExcept(lx,"ST_MISSING_RIGHT_PAREN"); Lex(lx); } - return PRST_MAYBE_MODIFIERS; + return PE_MAYBE_MODIFIERS; } LexExcept(lx,"ST_MISSING_EXPRESSION"); } @@ -1077,24 +1085,21 @@ I64 PrsUnaryModifier(CLex *lx,CPrsStk *ps,CMemberLst **_local_var,CArrayDim **_t CCodeBlkMisc *mc; I64 mode,old_flags; Bool was_paren=Btr(&lx->flags,Lf_PAREN); - if (lx->token==TK_DEREFERENCE) { - if (!*unary_post_prec) - *unary_post_prec=PREC_TERM; - tempi=lx->cbh.cb_last_out_ptr; - if (!(lx->flags & (LF_RAX | LF_ARRAY))) - CBICAdd(lx,IC_DEREF+PREC_UNARY_PRE<<16,0,tempi->ic_class-1); - else - tempi->ic_class--; - } else if (lx->token=='.') { - if (!*unary_post_prec) - *unary_post_prec=PREC_TERM; - if (tempm) - tempm->register=CREG_NONE; - } *_local_var=NULL; switch (lx->token) { case '.': + if (tempm) + tempm->register=CREG_NONE; + goto um_join; + case TK_DEREFERENCE: + tempi=lx->cbh.cb_last_out_ptr; + if (!(lx->flags & (LF_RAX | LF_ARRAY))) + CBICAdd(lx,IC_DEREF+PREC_UNARY_PRE<<16,0,tempi->ic_class-1); + else + tempi->ic_class--; + +um_join: if (!*unary_post_prec) *unary_post_prec=PREC_TERM; tempc=lx->cbh.cb_last_out_ptr->ic_class; @@ -1105,13 +1110,13 @@ I64 PrsUnaryModifier(CLex *lx,CPrsStk *ps,CMemberLst **_local_var,CArrayDim **_t if (!(tempc->type & HTT_CLASS)) LexExcept(lx,"ST_INVALID_CLASS"); if (Lex(lx)!=TK_IDENT || - !(tempm=MemberFind(lx->ident,tempc))) + !(tempm=MemberFind(lx->ident,tempc))) LexExcept(lx,"ST_INVALID_MEMBER"); else if (lx->local_var_entry) lx->local_var_entry->use_cnt--; Lex(lx); //skip member name tempc1=tempm->member_class+1; - CBICAdd(lx,IC_IMM,tempm->offset,tempc1); + CBICAdd(lx,IC_IMM_U64,tempm->offset,tempc1); lx->flags&=~(LF_RAX|LF_ARRAY|LF_FUN_EXP); if (tempm->dim.next) { *_tempad=tempm->dim.next; @@ -1123,7 +1128,7 @@ I64 PrsUnaryModifier(CLex *lx,CPrsStk *ps,CMemberLst **_local_var,CArrayDim **_t lx->flags|=LF_FUN_EXP; } CBICAdd(lx,IC_ADD,0,tempc1); - return PRST_UNARY_MODIFIERS; + return PE_UNARY_MODIFIERS; case '(': if (lx->flags & LF_FUN_EXP) { if (!*unary_post_prec) @@ -1158,31 +1163,27 @@ I64 PrsUnaryModifier(CLex *lx,CPrsStk *ps,CMemberLst **_local_var,CArrayDim **_t tempc++; tempi=lx->cbh.cb_last_out_ptr; tempi->ic_class=tempc; - CBICAdd(lx,IC_NATIVE_TYPECAST,was_paren,tempc); + CBICAdd(lx,IC_HOLYC_TYPECAST,was_paren,tempc); if (lx->token!=')') LexExcept(lx,"ST_MISSING_RIGHT_PAREN"); Lex(lx); - return PRST_UNARY_MODIFIERS; + return PE_UNARY_MODIFIERS; case '[': if (!*unary_post_prec) *unary_post_prec=PREC_TERM; Lex(lx); - tempc=lx->cbh.cb_last_out_ptr->ic_class; - while (tempc->fwd_class) - tempc=tempc->fwd_class; + tempc=OptClassFwd(lx->cbh.cb_last_out_ptr->ic_class); if (!tempc->ptr_cnt) LexExcept(lx,"ST_NOT_ARRAY_OR_PTR"); if (!(lx->flags & (LF_ARRAY | LF_RAX))) { - tempc--; - while (tempc->fwd_class) - tempc=tempc->fwd_class; + tempc=OptClassFwd(tempc-1); if (!tempc->ptr_cnt) LexExcept(lx,"ST_NOT_ARRAY_OR_PTR"); CBICAdd(lx,IC_DEREF+PREC_UNARY_PRE<<16,0,tempc); } tempc1=tempc-1; if (tempad1=*_tempad) { - CBICAdd(lx,IC_IMM,tempad1->total_cnt*tempc1->size,tempc); + CBICAdd(lx,IC_IMM_U64,tempad1->total_cnt*tempc1->size,tempc); if (*_tempad=tempad1->next) { old_flags=lx->flags; if (!PrsExpression(lx,NULL,FALSE,ps)) @@ -1196,10 +1197,10 @@ I64 PrsUnaryModifier(CLex *lx,CPrsStk *ps,CMemberLst **_local_var,CArrayDim **_t CBICAdd(lx,IC_MUL,0,tempc); CBICAdd(lx,IC_ADD,0,tempc); lx->flags|=LF_RAX; - return PRST_UNARY_MODIFIERS; + return PE_UNARY_MODIFIERS; } } else - CBICAdd(lx,IC_IMM,tempc1->size,tempc); + CBICAdd(lx,IC_IMM_U64,tempc1->size,tempc); old_flags=lx->flags; if (!PrsExpression(lx,NULL,FALSE,ps)) throw(EXCEPT_COMPILER,5); @@ -1212,51 +1213,21 @@ I64 PrsUnaryModifier(CLex *lx,CPrsStk *ps,CMemberLst **_local_var,CArrayDim **_t CBICAdd(lx,IC_MUL,0,tempc); CBICAdd(lx,IC_ADD,0,tempc); lx->flags&=~(LF_RAX|LF_ARRAY); - return PRST_UNARY_MODIFIERS; + return PE_UNARY_MODIFIERS; case TK_PLUS_PLUS: if (!*unary_post_prec) *unary_post_prec=PREC_UNARY_POST; Lex(lx); lx->flags|=LF_POSTINC; - return PRST_DEREFERENCE; + return PE_DEREFERENCE; case TK_MINUS_MINUS: if (!*unary_post_prec) *unary_post_prec=PREC_UNARY_POST; Lex(lx); lx->flags|=LF_POSTDEC; - return PRST_DEREFERENCE; - } - return PRST_DEREFERENCE; -} - -U0 PrsDereference(CLex *lx) -{ - I64 i; - CHashClass *tempc; - CIntermediateCode *tempi; - if (!(lx->flags&(LF_PREINC|LF_PREDEC|LF_POSTINC|LF_POSTDEC))) - i=IC_DEREF+PREC_UNARY_PRE<<16; - else { - if (lx->flags & LF_PREINC) - i=IC_PP_+PREC_UNARY_PRE<<16; - else if (lx->flags & LF_PREDEC) - i=IC_MM_+PREC_UNARY_PRE<<16; - else if (lx->flags & LF_POSTINC) - i=IC__PP+PREC_UNARY_POST<<16; - else - i=IC__MM+PREC_UNARY_POST<<16; - lx->flags&=~(LF_PREINC|LF_PREDEC|LF_POSTINC|LF_POSTDEC); - } - tempi=lx->cbh.cb_last_out_ptr; - if (lx->flags & (LF_RAX|LF_ARRAY)) { - if (tempi->ic_opcode==IC_DEREF) - tempi->ic_opcode=i; - } else { - tempc=tempi->ic_class-1; - while (tempc->fwd_class) - tempc=tempc->fwd_class; - CBICAdd(lx,i,0,tempc); + return PE_DEREFERENCE; } + return PE_DEREFERENCE; } U8 *CmpExpression(CLex *lx,I64 *type=NULL) @@ -1271,7 +1242,7 @@ U8 *CmpExpression(CLex *lx,I64 *type=NULL) CBICAdd(lx,IC_RETURN_VAL,0,NULL); CBICAdd(lx,IC_RET,0,0); CBICAdd(lx,IC_END,0,0); - result=CBCompile(lx,NULL,&size,NULL,NULL,type); + result=CBCompile(lx,NULL,&size,NULL,type); } else result=NULL; CBPop(lx); diff --git a/TempleOS/Compiler/Hash1b.CPP b/TempleOS/Compiler/Hash1b.CPP index 97cf3dd..1dc9ee2 100644 --- a/TempleOS/Compiler/Hash1b.CPP +++ b/TempleOS/Compiler/Hash1b.CPP @@ -7,7 +7,6 @@ CHashSrcSym *HashEntryImportCopy(CHashSrcSym *temph) result->index=NULL; result->ie_lst=NULL; result->debug=NULL; - result->indent=NULL; if (temph->type & (HTT_FUN | HTT_CLASS)) { result(CHashClass *)->member_lst =MemberLstCopy(temph); result(CHashClass *)->member_lst2=temph(CHashClass *)->member_lst2; @@ -111,10 +110,8 @@ I64 HashEntrySize2(CHashSrcSym *temph) result+=MSize2(temph->index); result+=MSize2(temph->import_name); result+=LinkedLstSize(temph->ie_lst); - if (temph->type & (HTT_FUN | HTT_EXPORT_SYS_SYM)) { + if (temph->type & (HTT_FUN | HTT_EXPORT_SYS_SYM)) result+=MSize2(temph->debug); - result+=MSize2(temph->indent); - } if (temph->type & HTT_CLASS) result+=MemberLstSize(temph); else if (temph->type & HTT_FUN) { diff --git a/TempleOS/Compiler/Lex.CPP b/TempleOS/Compiler/Lex.CPP index e51e10e..b3457e9 100644 --- a/TempleOS/Compiler/Lex.CPP +++ b/TempleOS/Compiler/Lex.CPP @@ -18,7 +18,7 @@ U8 *CmpPmt(Bool dbl_semicolon=FALSE) st=MGetS(GETSF_SHIFT_ESC_EXIT); if (dbl_semicolon) { i=StrLen(st); - result=MAlloc(i+4); + result=MAlloc(i+1+2); MemCpy(result,st,i+1); i--; while (i>=0 && Bt(white_space_bitmap,result[i])) @@ -26,8 +26,7 @@ U8 *CmpPmt(Bool dbl_semicolon=FALSE) 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++]='\n';//#define goes to '\n' result[i]=0; } else result=StrNew(st); @@ -43,20 +42,19 @@ CLex *LexNew(U8 *buf,I64 flags,U8 *filename=NULL) QueInit(lx); lx->flags=flags; lx->opts=1<expression_start_line_num=lx->last_line_num=1; lx->pass_trace_mask=0b10001111101; - lx->hash_mask=HTG_ALL-HTT_IMPORT_SYS_SYM-HTT_ASM_KEYWORD; - lx->define_hash_table=lx->hash_table_lst=lx->glbl_hash_table=lx->local_hash_table=Fs->hash_table; + lx->htc.hash_mask=HTG_ALL-HTT_IMPORT_SYS_SYM-HTT_ASM_KEYWORD; + lx->htc.define_hash_table=lx->htc.hash_table_lst=lx->htc.glbl_hash_table=lx->htc.local_hash_table=Fs->hash_table; if (flags&LF_KEEP_AT_SIGN) lx->alpha_numeric_bitmap=alpha_numeric_no_at_bitmap; else lx->alpha_numeric_bitmap=alpha_numeric_bitmap; lx->cur_lfn=tempf; QueInit(&lx->next_stream_blk); - if (!filename) - tempf->name=StrNew(sys_temp_filename); + if (filename) + tempf->name=FileNameAbs(filename); else - tempf->name=filename; + tempf->name=StrNew(sys_temp_filename); if (flags & LF_PMT) buf=CAlloc(4); tempf->buf=tempf->buf_ptr=tempf->line_start=lx->cur_buf_ptr=buf; @@ -75,11 +73,11 @@ U0 LexDel(CLex *lx) Free(tempf->name); tempf--; } + LinkedLstDel(lx->htc.next); Free(tempf->name); if (!(lx->flags & LF_DONT_FREE_BUF)) Free(tempf->buf); Free(lx->ident); - QueVectU8Del(lx->indent_que_vect); Free(lx->dollar); Free(lx); } @@ -194,7 +192,7 @@ lgc_here2: tempf->cur_entry=doc_e; nobound_switch (doc_e->type_u8) { case DOCT_TEXT: - if (doc_e->flags1 & ~(DOCG_BL_IV_UL|DOCEF1_WORD_WRAP|DOCEF1_HIGHLIGHT|DOCEF1_LOCK_TO_PAGE|DOCEF1_LOCK_TO_CENTER|DOCEF1_SKIP|DOCEF1_HARD_SKIP|DOCEF1_FILTER_SKIP) && + if (doc_e->flags1 & ~(DOCEF1_DEFINE|DOCEF1_TAG_CB|DOCG_BL_IV_UL|DOCEF1_WORD_WRAP|DOCEF1_HIGHLIGHT|DOCEF1_LOCK_TO_PAGE|DOCEF1_LOCK_TO_CENTER|DOCEF1_SKIP|DOCEF1_HARD_SKIP|DOCEF1_FILTER_SKIP) && LexDollar(lx,doc,doc_e) && *(src=lx->dollar)) { tempf->line_num=doc_e->y+1; tempf->buf=tempf->buf_ptr=lx->cur_buf_ptr=src; @@ -299,7 +297,8 @@ lgc_here2: if (!cont) break; } if (doc_e==doc) { - DocDel(doc); + if (tempf!=&lx->lfns[0] || !(lx->flags&LF_DONT_FREE_BUF)) + DocDel(doc); tempf->doc=tempf->buf=NULL; Free(tempf->name); tempf->name=NULL; @@ -327,7 +326,8 @@ lgc_here: lx->cur_buf_ptr=tempf->line_start= tempf->buf_ptr=tempf->buf=CmpPmt(TRUE); } else { - lx->cur_buf_ptr=src-1; + if (src) + lx->cur_buf_ptr=src-1; lx->last_U16=TK_EOF; goto lgc_done; } @@ -374,8 +374,7 @@ U0 ExpressionDel(U8 *code) Free(code); } -U0 LexIncludeStr(CLex *lx,U8 *abs_fname, - U8 *src,Bool actual_file) +U0 LexIncludeStr(CLex *lx,U8 *abs_filename,U8 *src,Bool actual_file) { CLexFile *tempf; LexBackupLastChar(lx); @@ -386,7 +385,7 @@ U0 LexIncludeStr(CLex *lx,U8 *abs_fname, tempf->line_start=src; tempf->last_U16=0; if (actual_file) { - tempf->name=StrNew(abs_fname); + tempf->name=StrNew(abs_filename); tempf->flags=LFSF_IS_INCLUDED; } else { tempf->name=StrNew(sys_temp_filename); @@ -405,14 +404,14 @@ I64 doc_stop_btypes[(DOCT_NUM_TYPES+63)/64]= }; -CDoc *LexDocRead(U8 *abs_fname,I64 flags) +CDoc *LexDocRead(U8 *abs_filename,I64 flags) { CDoc *doc=DocNew; U8 *src; I64 size=0; doc->flags|=flags; - StrCpy(doc->filename.name,abs_fname); - src=FileRead(abs_fname,&size); + StrCpy(doc->filename.name,abs_filename); + src=FileRead(abs_filename,&size); if (!src || !size) { Free(src); src=CAlloc(1); @@ -423,27 +422,28 @@ CDoc *LexDocRead(U8 *abs_fname,I64 flags) return doc; } -U0 LexIncludeDoc(CLex *lx,U8 *abs_fname,CDoc *_doc) -{ //If doc==null load - Bool is_null; - CDocEntry *doc_e; - CLexFile *tempf; - CDoc *doc; - LexBackupLastChar(lx); - tempf=++lx->cur_lfn; +U0 LexAttachDoc(CLex *lx,CLexFile *tempf=NULL, + CDoc *doc=NULL,U8 *abs_filename=NULL,CDocEntry *doc_e=NULL,I64 col=0) +{//Give either doc or abs_filename. + if (!doc) + doc=LexDocRead(abs_filename,DOCF_DBL_DOLLARS); + if (!tempf) { + LexBackupLastChar(lx); + tempf=++lx->cur_lfn; + } + if (!doc_e) + doc_e=doc->root.next; + tempf->name=StrNew(doc->filename.name); tempf->line_start=&lex_zeros; - if (_doc) - doc=_doc; - else - doc=LexDocRead(abs_fname,DOCF_DBL_DOLLARS); tempf->doc=doc; - doc_e=doc->root.next; while (doc_e!=doc) { if (Bt(doc_stop_btypes,doc_e->type_u8)) break; doc_e=doc_e->next; + col=doc_e->min_col; } if (doc_e!=doc) { + col=LimitI64(col,doc_e->min_col,doc_e->max_col); tempf->line_start=doc_e; tempf->line_num=doc_e->y+1; if (doc_e->type_u8==DOCT_TEXT) { @@ -455,23 +455,16 @@ U0 LexIncludeDoc(CLex *lx,U8 *abs_fname,CDoc *_doc) tempf->buf=&lex_zeros; tempf->buf_ptr=&lex_zeros; } - is_null=FALSE; - } else - is_null=TRUE; - if (!abs_fname) - tempf->name=StrNew(sys_temp_filename); - else - tempf->name=StrNew(abs_fname); - if (is_null) { -// DocDel(lx); TODO + tempf->flags=LFSF_IS_INCLUDED|LFSF_IS_DOC; + } else { //TODO: DocDel(doc)? + col=0; tempf->flags=LFSF_IS_INCLUDED; tempf->buf=CAlloc(1); tempf->buf_ptr=&lex_zeros; tempf->line_num=1; - } else - tempf->flags=LFSF_IS_INCLUDED|LFSF_IS_DOC; + } + lx->cur_buf_ptr=tempf->buf_ptr+col; tempf->last_U16=0; - lx->cur_buf_ptr=tempf->buf_ptr; } U0 LexPush(CLex *lx) @@ -711,7 +704,7 @@ I64 LexInStr(CLex *lx, buf[i++]='\n'; break; case 'r': - buf[i++]=CH_CARRIAGE_RETURN; + buf[i++]='\r'; break; case '"': buf[i++]='"'; @@ -799,14 +792,6 @@ I64 Lex(CLex *lx) CHash *temph; Bool str_done,neg_e; U8 *fbuf,*buf2,*buf3,buf[LEX_MAX_IDENT]; - if (lx->cur_lfn==lx->fun_lfn && lx->indent_que_vect) { - i=lx->temp_indent_level; -// if (lx->flags&LF_INSIDE_EXPRESSION && -// lx->fun_lfn->line_num>lx->expression_start_line_num) -// i+=2; - QueVectU8Put(lx->indent_que_vect,lx->last_line_num,i); - } - lx->temp_indent_level=lx->indent_level; lx->last_line_num=lx->cur_lfn->line_num; while (TRUE) { lex_cont: @@ -854,13 +839,13 @@ lex_ident: } buf[i++]=0; temph=NULL; - if (lx->local_var_lst) - lx->local_var_entry=MemberFind(buf,lx->local_var_lst); + if (lx->htc.local_var_lst) + lx->local_var_entry=MemberFind(buf,lx->htc.local_var_lst); else lx->local_var_entry=NULL; - if (!lx->local_var_entry && lx->hash_table_lst) + if (!lx->local_var_entry && lx->htc.hash_table_lst) temph=HashFind(buf, - lx->hash_table_lst,lx->hash_mask); + lx->htc.hash_table_lst,lx->htc.hash_mask); if (temph) j=temph->type; else @@ -1020,7 +1005,7 @@ lex_float_start: k.u8[j]='\n'; break; case 'r': - k.u8[j]=CH_CARRIAGE_RETURN; + k.u8[j]='\r'; break; case '"': k.u8[j]='"'; @@ -1086,7 +1071,6 @@ lex_octal: default: lx->flags|=LF_USE_LAST_U16; k.u8[j]='\\'; - break; } } else if (ch=='$$') { ch=LexGetChar(lx); @@ -1121,7 +1105,7 @@ lex_octal: buf2=FileNameAbs(fbuf); Free(fbuf); if (Bt(&sys_run_level,RLf_DOC)) - LexIncludeDoc(lx,buf2,NULL); + LexAttachDoc(lx,,,buf2); else LexIncludeStr(lx,buf2,TextFileRead(buf2),TRUE); Free(buf2); @@ -1144,10 +1128,10 @@ lex_octal: do { if (ch=='\\') { if (ch=LexGetChar(lx)) { - if (ch!=CH_CARRIAGE_RETURN && ch!='\n') { + if (ch!='\r' && ch!='\n') { buf[j++]='\\'; buf[j++]=ch; - } else if (ch==CH_CARRIAGE_RETURN && LexGetChar(lx)!='\n') + } else if (ch=='\r' && LexGetChar(lx)!='\n') lx->flags|=LF_USE_LAST_U16; } else { buf[j++]='\\'; @@ -1206,9 +1190,9 @@ lex_octal: temph(CHashDefineStr *)->data=buf2; temph(CHashDefineStr *)->cnt=-1; if (IsReplaceSyms) - HashReplace(temph,lx->define_hash_table); + HashReplace(temph,lx->htc.define_hash_table); else - HashAdd(temph,lx->define_hash_table); + HashAdd(temph,lx->htc.define_hash_table); } lx->flags&=~LF_NO_DEFINES; break; @@ -1253,11 +1237,11 @@ lex_if: case TK_IF: goto lex_if; case TK_IFDEF: goto lex_ifdef; case TK_IFNDEF: goto lex_ifndef; - case TK_IFAOT: goto lex_ifaot; - case TK_IFJIT: goto lex_ifjit; + case TK_IFAOT: goto lex_ifaot; + case TK_IFJIT: goto lex_ifjit; case TK_ELSE: goto lex_else; case TK_ENDIF: goto lex_cont; - default: goto lex_end; + default: goto lex_end; } } else { lx->flags&=~LF_IN_IF; @@ -1449,9 +1433,9 @@ lex_ifjit: temph->type=HTT_HELP_FILE|HTF_PUBLIC; SetSrcFileInfo(lx,temph); if (IsReplaceSyms) - HashReplace(temph,lx->glbl_hash_table); + HashReplace(temph,lx->htc.glbl_hash_table); else - HashAdd(temph,lx->glbl_hash_table); + HashAdd(temph,lx->htc.glbl_hash_table); break; } break; @@ -1631,15 +1615,15 @@ U8 *LexPutLine(CLex *lx,U8 *start) U8 *ptr,ch; if (!start) return NULL; if (lx->cur_lfn->flags&LFSF_IS_DOC) - return DocPutLine(start); + return DocPutLine(lx->cur_lfn->doc,start); else { ptr=start; while (ch=*ptr++) { if (ch=='\n') { - if (*ptr==CH_CARRIAGE_RETURN) + if (*ptr=='\r') ptr++; break; - } else if (ch==CH_CARRIAGE_RETURN) { + } else if (ch=='\r') { if (*ptr=='\n') ptr++; break; diff --git a/TempleOS/Compiler/OpCodes.TXT b/TempleOS/Compiler/OpCodes.TXT index 190c8ab..7127914 100644 --- a/TempleOS/Compiler/OpCodes.TXT +++ b/TempleOS/Compiler/OpCodes.TXT @@ -164,8 +164,8 @@ KEYWORD import 26; KEYWORD _import 27; KEYWORD ifdef 28; KEYWORD ifndef 29; -KEYWORD ifaot 30; -KEYWORD ifjit 31; +KEYWORD ifaot 30; +KEYWORD ifjit 31; KEYWORD endif 32; KEYWORD assert 33; KEYWORD reg 34; diff --git a/TempleOS/Compiler/OptPass012.CPP b/TempleOS/Compiler/OptPass012.CPP index 3312afb..0f0ae5e 100644 --- a/TempleOS/Compiler/OptPass012.CPP +++ b/TempleOS/Compiler/OptPass012.CPP @@ -1,144 +1,3 @@ -#define FBO1_NOT_CONST 0 -#define FBO1_INT 1 -#define FBO1_F64 2 - - -Bool OptFixupBinaryOp1(CIntermediateCode *tempi, - CIntermediateCode *tempi1,CIntermediateCode *tempi2, - Bool *is_unsigned) -{ - CHashClass *tempc=tempi->ic_class,*tempc1,*tempc2; - - if (tempi1->ic_flags&ICF_R_TO_INT) - tempc1=sys_internal_types[IT_I64]; - else if (tempi1->ic_flags&ICF_R_TO_F64) - tempc1=sys_internal_types[IT_F64]; - else { - tempc1=tempi1->ic_class; - while (tempc1->fwd_class) - tempc1=tempc1->fwd_class; - } - - if (tempi2->ic_flags&ICF_R_TO_INT) - tempc2=sys_internal_types[IT_I64]; - else if (tempi2->ic_flags&ICF_R_TO_F64) - tempc2=sys_internal_types[IT_F64]; - else { - tempc2=tempi2->ic_class; - while (tempc2->fwd_class) - tempc2=tempc2->fwd_class; - } - - if (tempc1->sub_type>tempc2->sub_type) - tempc=tempi->ic_class=tempc1; - else - tempc=tempi->ic_class=tempc2; - - if (tempc->sub_type==IT_F64) { - if (tempi1->ic_opcode==IC_IMM) { - tempi1->ic_data(F64)=tempi1->ic_data; - tempi1->ic_class=sys_internal_types[IT_F64]; - tempi1->ic_opcode=IC_F64; - tempi1->ic_flags&=~ICF_R_TO_F64; - } else - if (tempc1->sub_type!=IT_F64) - tempi1->ic_flags|=ICF_R_TO_F64; - if (tempi2->ic_opcode==IC_IMM) { - tempi2->ic_data(F64)=tempi2->ic_data; - tempi2->ic_class=sys_internal_types[IT_F64]; - tempi2->ic_opcode=IC_F64; - tempi2->ic_flags&=~ICF_R_TO_F64; - } else - if (tempc2->sub_type!=IT_F64) - tempi2->ic_flags|=ICF_R_TO_F64; - if (tempi1->ic_opcode==IC_F64 && - tempi2->ic_opcode==IC_F64 && - !(tempi->ic_flags&(ICF_PUSH_CMP|ICF_POP_CMP))) { - tempi->ic_flags|=tempi1->ic_flags|tempi2->ic_flags; - tempi1->ic_opcode=IC_NOP; - tempi1->ic_flags=0; - tempi2->ic_opcode=IC_NOP; - tempi2->ic_flags=0; - return FBO1_F64; - } else - return FBO1_NOT_CONST; - } - *is_unsigned=tempc1->sub_type&1 || tempc2->sub_type&1; - if (tempi1->ic_opcode==IC_IMM && - tempi2->ic_opcode==IC_IMM && - !(tempi->ic_flags&(ICF_PUSH_CMP|ICF_POP_CMP))) { - tempi->ic_flags|=tempi1->ic_flags|tempi2->ic_flags; - tempi1->ic_opcode=IC_NOP; - tempi1->ic_flags=0; - tempi2->ic_opcode=IC_NOP; - tempi2->ic_flags=0; - return FBO1_INT; - } else - return FBO1_NOT_CONST; -} - -Bool OptFixupBinaryOp2(CIntermediateCode **tempi1,CIntermediateCode **tempi2) -{ - CIntermediateCode *tempii1=*tempi1, - *tempii2=*tempi2; - if (tempii1->ic_opcode==IC_IMM && - !(tempii1->ic_flags & ICF_R_TO_F64)) - return TRUE; - if (tempii2->ic_opcode==IC_IMM && - !(tempii2->ic_flags & ICF_R_TO_F64)) { - *tempi1=tempii2; - *tempi2=tempii1; - return TRUE; - } - return FALSE; -} - -Bool OptFixupUnaryOp(CIntermediateCode *tempi, - CIntermediateCode *tempi1, - Bool *is_unsigned) -{ - CHashClass *tempc,*tempc1; - tempc1=tempi1->ic_class; - while (tempc1->fwd_class) - tempc1=tempc1->fwd_class; - tempi->ic_class=tempc1; - tempc=tempi->ic_class; - if (tempc->sub_type==IT_F64) { - if (tempi1->ic_opcode==IC_IMM) { - tempi1->ic_data(F64)=tempi1->ic_data; - tempi1->ic_class=sys_internal_types[IT_F64]; - tempi1->ic_opcode=IC_F64; - tempi1->ic_flags&=~ICF_R_TO_F64; - } else - if (tempc1->sub_type!=IT_F64) - tempi1->ic_flags|=ICF_R_TO_F64; - if (tempi1->ic_opcode==IC_F64) { - tempi->ic_flags|=tempi1->ic_flags; - tempi1->ic_opcode=IC_NOP; - tempi1->ic_flags=0; - return FBO1_F64; - } else - return FBO1_NOT_CONST; - } - *is_unsigned=tempc1->sub_type&1; - if (tempi1->ic_opcode==IC_IMM) { - tempi->ic_flags|=tempi1->ic_flags; - tempi1->ic_opcode=IC_NOP; - tempi1->ic_flags=0; - return FBO1_INT; - } else - return FBO1_NOT_CONST; -} - -I64 CmpOffset2Reg(I64 offset,COptReg *register_offsets) -{ - I64 i; - for (i=0;ipass; @@ -148,7 +7,6 @@ U0 OptMissing(CLex *lx,CIntermediateCode *tempi) CIntermediateCode opt_nop; - CPrsStk *OptStart(CLex *lx,CIntermediateCode **temp_lag=NULL) { I64 i; @@ -171,6 +29,37 @@ U0 OptEnd(CLex *lx,CPrsStk *ps) Free(ps); } +CCodeBlkMisc *OptLabelFwd(CCodeBlkMisc *lb) +{ + CCodeBlkMisc *lb1; + while (lb1=lb->fwd) + lb=lb1; + return lb; +} + +CHashClass *OptClassFwd(CHashClass *tempc) +{ + CHashClass *tempc1; + while (tempc1=tempc->fwd_class) + tempc=tempc1; + return tempc; +} + +U0 OptSetNOP1(CIntermediateCode *tempi) +{ + tempi->ic_opcode=IC_NOP1; + tempi->ic_flags=0; + tempi->p1.type=TY_NULL+tempi->p1.type&IT_MASK; + tempi->r.type =TY_NULL+tempi->r.type &IT_MASK; +} + +U0 OptSetNOP2(CIntermediateCode *tempi,I64 stk_delta=1) +{ + tempi->ic_opcode=IC_NOP2; + tempi->ic_data=stk_delta; + tempi->p1.type=TY_NULL+tempi->p1.type&IT_MASK; + tempi->r.type =TY_NULL+tempi->r.type &IT_MASK; +} CIntermediateCode *OptLag(CIntermediateCode *tempi) { @@ -190,7 +79,7 @@ CIntermediateCode *OptLag1(CIntermediateCode *tempi) return NULL; else tempi--; - } while (tempi->ic_opcode==IC_NOP||tempi->ic_opcode==IC_NOP1); + } while (tempi->ic_opcode==IC_NOP1||tempi->ic_opcode==IC_NOP2); return tempi; } @@ -200,10 +89,138 @@ CIntermediateCode *OptLead1(CLex *,CIntermediateCode *tempi) tempi++; if (tempi->ic_opcode==IC_END) return NULL; - } while (tempi->ic_opcode==IC_NOP||tempi->ic_opcode==IC_NOP1); + } while (tempi->ic_opcode==IC_NOP1||tempi->ic_opcode==IC_NOP2); return tempi; } +I64 CmpOffset2Reg(I64 offset,COptReg *register_offsets) +{ + I64 i; + for (i=0;iic_class,*tempc1,*tempc2; + + if (tempi1->ic_flags&ICF_R_TO_INT) + tempc1=sys_internal_types[IT_I64]; + else if (tempi1->ic_flags&ICF_R_TO_F64) + tempc1=sys_internal_types[IT_F64]; + else { + tempc1=OptClassFwd(tempi1->ic_class); + } + + if (tempi2->ic_flags&ICF_R_TO_INT) + tempc2=sys_internal_types[IT_I64]; + else if (tempi2->ic_flags&ICF_R_TO_F64) + tempc2=sys_internal_types[IT_F64]; + else { + tempc2=OptClassFwd(tempi2->ic_class); + } + + if (tempc1->sub_type>tempc2->sub_type) + tempc=tempi->ic_class=tempc1; + else + tempc=tempi->ic_class=tempc2; + + if (tempc->sub_type==IT_F64) { + if (tempi1->ic_opcode==IC_IMM_U64) { + tempi1->ic_data(F64)=tempi1->ic_data; + tempi1->ic_class=sys_internal_types[IT_F64]; + tempi1->ic_opcode=IC_IMM_F64; + tempi1->ic_flags&=~ICF_R_TO_F64; + } else + if (tempc1->sub_type!=IT_F64) + tempi1->ic_flags|=ICF_R_TO_F64; + if (tempi2->ic_opcode==IC_IMM_U64) { + tempi2->ic_data(F64)=tempi2->ic_data; + tempi2->ic_class=sys_internal_types[IT_F64]; + tempi2->ic_opcode=IC_IMM_F64; + tempi2->ic_flags&=~ICF_R_TO_F64; + } else + if (tempc2->sub_type!=IT_F64) + tempi2->ic_flags|=ICF_R_TO_F64; + if (tempi1->ic_opcode==IC_IMM_F64 && + tempi2->ic_opcode==IC_IMM_F64 && + !(tempi->ic_flags&(ICF_PUSH_CMP|ICF_POP_CMP))) { + tempi->ic_flags|=tempi1->ic_flags|tempi2->ic_flags; + OptSetNOP1(tempi1); + OptSetNOP1(tempi2); + return FBO1_F64; + } else + return FBO1_NOT_CONST; + } + *is_unsigned=tempc1->sub_type&1 || tempc2->sub_type&1; + if (tempi1->ic_opcode==IC_IMM_U64 && + tempi2->ic_opcode==IC_IMM_U64 && + !(tempi->ic_flags&(ICF_PUSH_CMP|ICF_POP_CMP))) { + tempi->ic_flags|=tempi1->ic_flags|tempi2->ic_flags; + OptSetNOP1(tempi1); + OptSetNOP1(tempi2); + return FBO1_INT; + } else + return FBO1_NOT_CONST; +} + +Bool OptFixupBinaryOp2(CIntermediateCode **tempi1,CIntermediateCode **tempi2) +{ + CIntermediateCode *tempii1=*tempi1, + *tempii2=*tempi2; + if (tempii1->ic_opcode==IC_IMM_U64 && + !(tempii1->ic_flags & ICF_R_TO_F64)) + return TRUE; + if (tempii2->ic_opcode==IC_IMM_U64 && + !(tempii2->ic_flags & ICF_R_TO_F64)) { + *tempi1=tempii2; + *tempi2=tempii1; + return TRUE; + } + return FALSE; +} + +Bool OptFixupUnaryOp(CIntermediateCode *tempi, + CIntermediateCode *tempi1, + Bool *is_unsigned) +{ + CHashClass *tempc,*tempc1; + tempc1=OptClassFwd(tempi1->ic_class); + tempi->ic_class=tempc1; + tempc=tempi->ic_class; + if (tempc->sub_type==IT_F64) { + if (tempi1->ic_opcode==IC_IMM_U64) { + tempi1->ic_data(F64)=tempi1->ic_data; + tempi1->ic_class=sys_internal_types[IT_F64]; + tempi1->ic_opcode=IC_IMM_F64; + tempi1->ic_flags&=~ICF_R_TO_F64; + } else + if (tempc1->sub_type!=IT_F64) + tempi1->ic_flags|=ICF_R_TO_F64; + if (tempi1->ic_opcode==IC_IMM_F64) { + tempi->ic_flags|=tempi1->ic_flags; + OptSetNOP1(tempi1); + return FBO1_F64; + } else + return FBO1_NOT_CONST; + } + *is_unsigned=tempc1->sub_type&1; + if (tempi1->ic_opcode==IC_IMM_U64) { + tempi->ic_flags|=tempi1->ic_flags; + OptSetNOP1(tempi1); + return FBO1_INT; + } else + return FBO1_NOT_CONST; +} + extern U0 OptBrNotZero(CLex *lx,CIntermediateCode *tempi); CIntermediateCode *OptBrZero(CLex *lx,CIntermediateCode *tempi) @@ -217,8 +234,7 @@ CIntermediateCode *OptBrZero(CLex *lx,CIntermediateCode *tempi) tempi->ic_flags|=tempii->ic_flags; tempi->t.p1c=tempii->t.p1c; tempi->t.p1t=tempii->t.p1t; - tempii->ic_opcode=IC_NOP; - tempii->ic_flags=0; + OptSetNOP1(tempii); return OptBrNotZero(lx,tempi); case IC_EQUAL_EQUAL: tempi->ic_opcode=IC_BR_NOT_EQUAL; @@ -259,46 +275,46 @@ CIntermediateCode *OptBrZero(CLex *lx,CIntermediateCode *tempi) tempii2->ic_opcode=IC_BR_NOT_BT; tempii2->ic_data=tempi->ic_data; tempii->ic_opcode=IC_CALL_END2; - tempi->ic_opcode=IC_NOP; + OptSetNOP1(tempi); return tempii; case IC_BTS: tempii2->ic_opcode=IC_BR_NOT_BTS; tempii2->ic_data=tempi->ic_data; tempii->ic_opcode=IC_CALL_END2; - tempi->ic_opcode=IC_NOP; + OptSetNOP1(tempi); return tempii; case IC_BTR: tempii2->ic_opcode=IC_BR_NOT_BTR; tempii2->ic_data=tempi->ic_data; tempii->ic_opcode=IC_CALL_END2; - tempi->ic_opcode=IC_NOP; + OptSetNOP1(tempi); return tempii; case IC_BTC: tempii2->ic_opcode=IC_BR_NOT_BTC; tempii2->ic_data=tempi->ic_data; tempii->ic_opcode=IC_CALL_END2; - tempi->ic_opcode=IC_NOP; + OptSetNOP1(tempi); return tempii; case IC_LBTS: tempii2->ic_opcode=IC_BR_NOT_LBTS; tempii2->ic_flags|=ICF_LOCK; tempii2->ic_data=tempi->ic_data; tempii->ic_opcode=IC_CALL_END2; - tempi->ic_opcode=IC_NOP; + OptSetNOP1(tempi); return tempii; case IC_LBTR: tempii2->ic_opcode=IC_BR_NOT_LBTR; tempii2->ic_flags|=ICF_LOCK; tempii2->ic_data=tempi->ic_data; tempii->ic_opcode=IC_CALL_END2; - tempi->ic_opcode=IC_NOP; + OptSetNOP1(tempi); return tempii; case IC_LBTC: tempii2->ic_opcode=IC_BR_NOT_LBTC; tempii2->ic_flags|=ICF_LOCK; tempii2->ic_data=tempi->ic_data; tempii->ic_opcode=IC_CALL_END2; - tempi->ic_opcode=IC_NOP; + OptSetNOP1(tempi); return tempii; } break; @@ -310,8 +326,7 @@ CIntermediateCode *OptBrZero(CLex *lx,CIntermediateCode *tempi) tempi->t.p2c=tempii->t.p2c; tempi->t.p1t=tempii->t.p1t; tempi->t.p2t=tempii->t.p2t; - tempii->ic_opcode=IC_NOP; - tempii->ic_flags=0; + OptSetNOP1(tempii); if (tempi->ic_flags&ICF_PUSH_CMP && IC_BR_NOT_EQUAL<=tempi->ic_opcode<=IC_BR_LESS && @@ -321,15 +336,12 @@ CIntermediateCode *OptBrZero(CLex *lx,CIntermediateCode *tempi) tempii =tempi+1; //IC_PUSH_CMP instruction while (tempii->ic_opcode!=IC_PUSH_CMP) tempii++; - tempii->ic_flags=0; - tempii->ic_opcode=IC_NOP; tempii->t.p1t=tempi; + OptSetNOP1(tempii); } lb_true=tempi->ic_data; if (tempi->ic_opcode==IC_BR_AND_AND_ZERO) { - tempi->ic_opcode=IC_NOP; - tempi->ic_flags=0; tempii=tempi->t.p1t+1; tempii->ic_data=lb_true; tempii->t.p1t=tempi->t.p1t; @@ -342,6 +354,7 @@ CIntermediateCode *OptBrZero(CLex *lx,CIntermediateCode *tempi) tempii->ic_data=lb_true; tempii->ic_opcode=IC_BR_ZERO; tempii=OptBrZero(lx,tempii); + OptSetNOP1(tempi);; } else if (tempi->ic_opcode==IC_BR_OR_OR_ZERO) { lb_false=CBMiscNew(lx,CBMT_LABEL); tempi->ic_opcode=IC_LABEL; @@ -361,7 +374,7 @@ CIntermediateCode *OptBrZero(CLex *lx,CIntermediateCode *tempi) tempii=OptBrZero(lx,tempii); } else tempii=tempi; - if (tempi->ic_flags&ICF_POP_CMP && tempi->t.p1t->ic_opcode==IC_NOP) { + if (tempi->ic_flags&ICF_POP_CMP && tempi->t.p1t->ic_opcode==IC_NOP1) { tempi->t.p1t=tempi->t.p1t->t.p1t; tempi->ic_flags&=~ICF_POP_CMP; } @@ -382,8 +395,7 @@ CIntermediateCode *OptBrNotZero(CLex *lx,CIntermediateCode *tempi) tempi->ic_flags|=tempii->ic_flags; tempi->t.p1c=tempii->t.p1c; tempi->t.p1t=tempii->t.p1t; - tempii->ic_opcode=IC_NOP; - tempii->ic_flags=0; + OptSetNOP1(tempii); return OptBrZero(lx,tempi); case IC_EQUAL_EQUAL: tempi->ic_opcode=IC_BR_EQUAL_EQUAL; @@ -424,46 +436,46 @@ CIntermediateCode *OptBrNotZero(CLex *lx,CIntermediateCode *tempi) tempii2->ic_opcode=IC_BR_BT; tempii2->ic_data=tempi->ic_data; tempii->ic_opcode=IC_CALL_END2; - tempi->ic_opcode=IC_NOP; + OptSetNOP1(tempi); return tempii; case IC_BTS: tempii2->ic_opcode=IC_BR_BTS; tempii2->ic_data=tempi->ic_data; tempii->ic_opcode=IC_CALL_END2; - tempi->ic_opcode=IC_NOP; + OptSetNOP1(tempi); return tempii; case IC_BTR: tempii2->ic_opcode=IC_BR_BTR; tempii2->ic_data=tempi->ic_data; tempii->ic_opcode=IC_CALL_END2; - tempi->ic_opcode=IC_NOP; + OptSetNOP1(tempi); return tempii; case IC_BTC: tempii2->ic_opcode=IC_BR_BTC; tempii2->ic_data=tempi->ic_data; tempii->ic_opcode=IC_CALL_END2; - tempi->ic_opcode=IC_NOP; + OptSetNOP1(tempi); return tempii; case IC_LBTS: tempii2->ic_opcode=IC_BR_LBTS; tempii2->ic_flags|=ICF_LOCK; tempii2->ic_data=tempi->ic_data; tempii->ic_opcode=IC_CALL_END2; - tempi->ic_opcode=IC_NOP; + OptSetNOP1(tempi); return tempii; case IC_LBTR: tempii2->ic_opcode=IC_BR_LBTR; tempii2->ic_flags|=ICF_LOCK; tempii2->ic_data=tempi->ic_data; tempii->ic_opcode=IC_CALL_END2; - tempi->ic_opcode=IC_NOP; + OptSetNOP1(tempi); return tempii; case IC_LBTC: tempii2->ic_opcode=IC_BR_LBTC; tempii2->ic_flags|=ICF_LOCK; tempii2->ic_data=tempi->ic_data; tempii->ic_opcode=IC_CALL_END2; - tempi->ic_opcode=IC_NOP; + OptSetNOP1(tempi); return tempii; } break; @@ -475,8 +487,7 @@ CIntermediateCode *OptBrNotZero(CLex *lx,CIntermediateCode *tempi) tempi->t.p2c=tempii->t.p2c; tempi->t.p1t=tempii->t.p1t; tempi->t.p2t=tempii->t.p2t; - tempii->ic_opcode=IC_NOP; - tempii->ic_flags=0; + OptSetNOP1(tempii); if (tempi->ic_flags&ICF_PUSH_CMP && IC_BR_NOT_EQUAL<=tempi->ic_opcode<=IC_BR_LESS && @@ -486,15 +497,12 @@ CIntermediateCode *OptBrNotZero(CLex *lx,CIntermediateCode *tempi) tempii =tempi+1; //IC_PUSH_CMP instruction while (tempii->ic_opcode!=IC_PUSH_CMP) tempii++; - tempii->ic_flags=0; - tempii->ic_opcode=IC_NOP; tempii->t.p1t=tempi; + OptSetNOP1(tempii); } lb_true=tempi->ic_data; if (tempi->ic_opcode==IC_BR_OR_OR_NOT_ZERO) { - tempi->ic_opcode=IC_NOP; - tempi->ic_flags=0; tempii=tempi->t.p1t+1; tempii->t.p1t=tempi->t.p1t; tempii->t.p1c=tempi->t.p1c; @@ -507,6 +515,7 @@ CIntermediateCode *OptBrNotZero(CLex *lx,CIntermediateCode *tempi) tempii->ic_data=lb_true; tempii->ic_opcode=IC_BR_NOT_ZERO; tempii=OptBrNotZero(lx,tempii); + OptSetNOP1(tempi);; } else if (tempi->ic_opcode==IC_BR_AND_AND_NOT_ZERO) { lb_false=CBMiscNew(lx,CBMT_LABEL); tempi->ic_opcode=IC_LABEL; @@ -526,7 +535,7 @@ CIntermediateCode *OptBrNotZero(CLex *lx,CIntermediateCode *tempi) tempii=OptBrNotZero(lx,tempii); } else tempii=tempi; - if (tempi->ic_flags&ICF_POP_CMP && tempi->t.p1t->ic_opcode==IC_NOP) { + if (tempi->ic_flags&ICF_POP_CMP && tempi->t.p1t->ic_opcode==IC_NOP1) { tempi->t.p1t=tempi->t.p1t->t.p1t; tempi->ic_flags&=~ICF_POP_CMP; } @@ -539,7 +548,7 @@ U0 OptFixSizeOf(CIntermediateCode *tempi1,CIntermediateCode *tempi_push,CHashCla { if (tempi1->ic_opcode==IC_MUL && tempi1->t.p2t->ic_opcode==IC_SIZEOF) { - tempi1->t.p2t->ic_opcode=IC_IMM; + tempi1->t.p2t->ic_opcode=IC_IMM_U64; tempi1->t.p2t->ic_class=tempcc; tempi_push->ic_class=tempcc; if (tempcc->ptr_cnt) { @@ -552,10 +561,8 @@ here: if (tempi_push==tempi1) tempi1->t.p2t->ic_data=1; else { - tempi1->ic_opcode=IC_NOP; - tempi1->ic_flags=0; - tempi1->t.p2t->ic_opcode=IC_NOP; - tempi1->t.p2t->ic_flags=0; + OptSetNOP1(tempi1); + OptSetNOP1(tempi1->t.p2t); } } } @@ -572,9 +579,9 @@ args. */ I64 code,i; Bool is_unsigned; - CHashClass *tempc,*tempc1,*tempc2,*tempc3; + CHashClass *tempc,*tempc1,*tempc2; CIntermediateCode *tempi,*tempi1,*tempi2,*tempi3,*tempi_push, - *temp_lag[4],*last_with_class=NULL,*tempii; + *temp_lag[4],*last_with_class=NULL,*tempii; CPrsStk *ps=OptStart(lx,temp_lag); CCodeBlkMisc *lb,*lb1,*lb2; if (combined) @@ -587,7 +594,7 @@ args. else tempi=CBGetIC1(&lx->cbh); } - #assert !IC_END +#assert !IC_END while (code=tempi->ic_opcode) { OptNext(tempi,temp_lag); tempc=tempi->ic_class; @@ -598,11 +605,6 @@ args. case 9: ps->ptr-=tempi->ic_data>>2; break; - case 3: - tempi3=PrsPop(ps); - tempc3=tempi3->ic_class; - tempi->t.p3t=tempi3; - tempi->t.p3c=PrsPop(ps); case 2: tempi2=PrsPop(ps); tempc2=tempi2->ic_class; @@ -620,35 +622,34 @@ args. if (Bt(not_constant_bitmap,code)) lx->flags|=LF_NOT_CONSTANT; nobound_switch (code) { - case IC_F64: + case IC_IMM_F64: tempi->ic_flags&=~ICF_R_TO_F64; if (lx->pass==2 && tempi->ic_flags&ICF_R_TO_INT) { tempi->ic_data=ToI64(tempi->ic_data(F64)); tempi->ic_flags&=~ICF_R_TO_INT; - tempi->ic_opcode=IC_IMM; + tempi->ic_opcode=IC_IMM_U64; tempi->ic_class=sys_internal_types[IT_I64]; } break; - case IC_IMM: + case IC_IMM_U64: tempi->ic_flags&=~ICF_R_TO_INT; if (lx->pass==2 && tempi->ic_flags&ICF_R_TO_F64) { tempi->ic_data(F64)=ToF64(tempi->ic_data); tempi->ic_flags&=~ICF_R_TO_F64; - tempi->ic_opcode=IC_F64; + tempi->ic_opcode=IC_IMM_F64; tempi->ic_class=sys_internal_types[IT_F64]; } break; - case IC_NATIVE_TYPECAST: - if (tempi1->ic_opcode==IC_IMM || tempi1->ic_opcode==IC_F64) { + case IC_HOLYC_TYPECAST: + if (tempi1->ic_opcode==IC_IMM_U64 || tempi1->ic_opcode==IC_IMM_F64) { if (tempi->ic_class->sub_type==IT_F64) - tempi1->ic_opcode=IC_F64; + tempi1->ic_opcode=IC_IMM_F64; else - tempi1->ic_opcode=IC_IMM; + tempi1->ic_opcode=IC_IMM_U64; tempi1->ic_class=tempi->ic_class; tempi1->ic_flags|=tempi->ic_flags; - tempi->ic_opcode=IC_NOP; - tempi->ic_flags=0; tempi_push=tempi1; + OptSetNOP1(tempi);; } else { if (tempi->ic_data) { //was paren if (!tempi_push->ic_class->ptr_cnt) { @@ -660,42 +661,37 @@ args. } else { tempi1->ic_class=tempi->ic_class; tempi1->ic_flags|=tempi->ic_flags; - tempi->ic_opcode=IC_NOP; - tempi->ic_flags=0; tempi_push=tempi1; + OptSetNOP1(tempi);; } } break; case IC_FS: case IC_GS: - //CALL,FS/GS,CALL_END,IMM,ADD,DEREF-->MOV_FS/GS +//CALL,FS/GS,CALL_END,IMM,ADD,DEREF-->MOV_FS/GS if (combined) { tempi1=tempi+2; //IMM tempi2=tempi+3; //ADD tempi3=tempi+4; //DEREF - if (tempi1->ic_opcode==IC_IMM && tempi2->ic_opcode==IC_ADD && - tempi3->ic_opcode==IC_DEREF && !(tempi3->ic_flags&~ICF_NO_CVT_MASK)) { - tempi1->ic_opcode=IC_NOP; - tempi2->ic_opcode=IC_NOP; - tempi3->ic_opcode=IC_NOP; + if (tempi1->ic_opcode==IC_IMM_U64 && tempi2->ic_opcode==IC_ADD && + tempi3->ic_opcode==IC_DEREF && !(tempi3->ic_flags&~ICF_NO_CVT_MASK)) { + tempi->ic_flags|=tempi1->ic_flags|tempi2->ic_flags|tempi3->ic_flags; if (tempi->ic_opcode==IC_FS) tempi->ic_opcode=IC_MOV_FS; else tempi->ic_opcode=IC_MOV_GS; tempi->ic_data=tempi1->ic_data; - tempi->ic_flags|=tempi1->ic_flags|tempi2->ic_flags; - tempi1->ic_flags=0; - tempi2->ic_flags=0; tempi->ic_class =tempi3->ic_class; tempi->ic_class2=tempi3->ic_class2; + OptSetNOP1(tempi1); + OptSetNOP1(tempi2); + OptSetNOP1(tempi3); tempi1=tempi-1; //CALL tempi2=tempi+1; //CALL_END - tempi1->ic_opcode=IC_NOP; - tempi2->ic_opcode=IC_NOP; tempi->ic_flags|=tempi1->ic_flags|tempi2->ic_flags; - tempi1->ic_flags=0; - tempi2->ic_flags=0; + OptSetNOP1(tempi1); + OptSetNOP1(tempi2); } } break; @@ -717,47 +713,29 @@ args. tempi->ic_flags|=ICF_USE_F64; break; case IC_COM: - if (tempc->sub_type==IT_F64) { - if (tempi1->ic_opcode==IC_F64) { - tempi->ic_data(F64)=~tempi1->ic_data(F64); - tempi->ic_opcode=IC_F64; - tempi->ic_flags|=tempi1->ic_flags; - tempi1->ic_opcode=IC_NOP; - tempi1->ic_flags=0; - } - break; - } - if (tempi1->ic_opcode==IC_IMM) { + if (tempi1->ic_opcode==IC_IMM_U64) { tempi->ic_data=~tempi1->ic_data; - tempi->ic_opcode=IC_IMM; + tempi->ic_opcode=IC_IMM_U64; tempi->ic_flags|=tempi1->ic_flags; - tempi1->ic_opcode=IC_NOP; - tempi1->ic_flags=0; - } - if (!tempi_push->ic_class->ptr_cnt) { - if (tempi_push->ic_class->sub_type==IT_F64) - tempi_push->ic_class2=sys_internal_types[IT_F64]; - else - tempi_push->ic_class2=sys_internal_types[IT_I64]; + OptSetNOP1(tempi1); } + tempi_push->ic_class2=sys_internal_types[IT_I64]; break; case IC_NOT: if (tempc->sub_type==IT_F64) { - if (tempi1->ic_opcode==IC_F64) { + if (tempi1->ic_opcode==IC_IMM_F64) { tempi->ic_data(F64)=!tempi1->ic_data(F64); - tempi->ic_opcode=IC_F64; + tempi->ic_opcode=IC_IMM_F64; tempi->ic_flags|=tempi1->ic_flags; - tempi1->ic_opcode=IC_NOP; - tempi1->ic_flags=0; + OptSetNOP1(tempi1); } break; } - if (tempi1->ic_opcode==IC_IMM) { + if (tempi1->ic_opcode==IC_IMM_U64) { tempi->ic_data=!tempi1->ic_data; - tempi->ic_opcode=IC_IMM; + tempi->ic_opcode=IC_IMM_U64; tempi->ic_flags|=tempi1->ic_flags; - tempi1->ic_opcode=IC_NOP; - tempi1->ic_flags=0; + OptSetNOP1(tempi1); } if (!tempi_push->ic_class->ptr_cnt) { if (tempi_push->ic_class->sub_type==IT_F64) @@ -770,10 +748,10 @@ args. if (i=OptFixupUnaryOp(tempi,tempi1,&is_unsigned)) { if (i==FBO1_INT) { tempi->ic_data=-tempi1->ic_data(I64); - tempi->ic_opcode=IC_IMM; + tempi->ic_opcode=IC_IMM_U64; } else { tempi->ic_data(F64)=-tempi1->ic_data(F64); - tempi->ic_opcode=IC_F64; + tempi->ic_opcode=IC_IMM_F64; } } if (tempc1->type&HTT_INTERNAL_TYPE && tempc1->sub_type& 1) @@ -792,14 +770,12 @@ args. if (tempi1->ic_class->sub_type!=IT_F64) { if (tempi1->ic_opcode==IC__PP) { tempi->ic_opcode=IC_DEREF_PP; - tempi1->ic_opcode=IC_NOP; tempi->ic_flags|=tempi1->ic_flags; - tempi1->ic_flags=0; + OptSetNOP1(tempi1); } else if (tempi1->ic_opcode==IC__MM) { tempi->ic_opcode=IC_DEREF_MM; - tempi1->ic_opcode=IC_NOP; tempi->ic_flags|=tempi1->ic_flags; - tempi1->ic_flags=0; + OptSetNOP1(tempi1); } } } @@ -818,16 +794,15 @@ args. tempi->ic_data=tempi1->ic_data(U64)<ic_data(U64); else tempi->ic_data=tempi1->ic_data(I64)<ic_data(I64); - tempi->ic_opcode=IC_IMM; + tempi->ic_opcode=IC_IMM_U64; } else { tempi->ic_data(F64)=tempi1->ic_data(F64)<ic_data; - tempi->ic_opcode=IC_F64; + tempi->ic_opcode=IC_IMM_F64; } } else if (tempi1->ic_opcode==IC_SHL_CONST) { tempi->ic_flags|=tempi1->ic_flags; - tempi1->ic_flags=0; tempi->ic_data+=tempi1->ic_data; - tempi1->ic_opcode=IC_NOP; + OptSetNOP1(tempi1); } if (!tempi_push->ic_class->ptr_cnt) { if (tempi_push->ic_class->sub_type==IT_F64) @@ -843,16 +818,15 @@ args. tempi->ic_data=tempi1->ic_data(U64)>>tempi->ic_data(U64); else tempi->ic_data=tempi1->ic_data(I64)>>tempi->ic_data(I64); - tempi->ic_opcode=IC_IMM; + tempi->ic_opcode=IC_IMM_U64; } else { tempi->ic_data(F64)=tempi1->ic_data(F64)>>tempi->ic_data; - tempi->ic_opcode=IC_F64; + tempi->ic_opcode=IC_IMM_F64; } } else if (tempi1->ic_opcode==IC_SHR_CONST) { tempi->ic_flags|=tempi1->ic_flags; - tempi1->ic_flags=0; tempi->ic_data+=tempi1->ic_data; - tempi1->ic_opcode=IC_NOP; + OptSetNOP1(tempi1); } if (!tempi_push->ic_class->ptr_cnt) { if (tempi_push->ic_class->sub_type==IT_F64) @@ -888,17 +862,16 @@ args. tempi->ic_data=tempi1->ic_data(U64)<ic_data(U64); else tempi->ic_data=tempi1->ic_data(I64)<ic_data(I64); - tempi->ic_opcode=IC_IMM; + tempi->ic_opcode=IC_IMM_U64; } else { tempi->ic_data(F64)=tempi1->ic_data(F64) << tempi2->ic_data(F64); - tempi->ic_opcode=IC_F64; + tempi->ic_opcode=IC_IMM_F64; } - } else if (tempi2->ic_opcode==IC_IMM) { + } else if (tempi2->ic_opcode==IC_IMM_U64) { tempi->ic_flags|=tempi2->ic_flags; - tempi2->ic_opcode=IC_NOP; - tempi2->ic_flags=0; tempi->ic_data=tempi2->ic_data; tempi->ic_opcode=IC_SHL_CONST; + OptSetNOP1(tempi2); } if (!tempi_push->ic_class->ptr_cnt) { if (tempi_push->ic_class->sub_type==IT_F64) @@ -914,17 +887,16 @@ args. tempi->ic_data=tempi1->ic_data(U64)>>tempi2->ic_data(U64); else tempi->ic_data=tempi1->ic_data(I64)>>tempi2->ic_data(I64); - tempi->ic_opcode=IC_IMM; + tempi->ic_opcode=IC_IMM_U64; } else { tempi->ic_data(F64)=tempi1->ic_data(F64) >> tempi2->ic_data(F64); - tempi->ic_opcode=IC_F64; + tempi->ic_opcode=IC_IMM_F64; } - } else if (tempi2->ic_opcode==IC_IMM) { + } else if (tempi2->ic_opcode==IC_IMM_U64) { tempi->ic_flags|=tempi2->ic_flags; - tempi2->ic_opcode=IC_NOP; - tempi2->ic_flags=0; tempi->ic_data=tempi2->ic_data; tempi->ic_opcode=IC_SHR_CONST; + OptSetNOP1(tempi2); } if (!tempi_push->ic_class->ptr_cnt) { if (tempi_push->ic_class->sub_type==IT_F64) @@ -940,106 +912,90 @@ args. tempi->ic_data=tempi1->ic_data(U64)*tempi2->ic_data(U64); else tempi->ic_data=tempi1->ic_data(I64)*tempi2->ic_data(I64); - tempi->ic_opcode=IC_IMM; + tempi->ic_opcode=IC_IMM_U64; } else { tempi->ic_data(F64)=tempi1->ic_data(F64)* - tempi2->ic_data(F64); - tempi->ic_opcode=IC_F64; + tempi2->ic_data(F64); + tempi->ic_opcode=IC_IMM_F64; } } else { - if (tempi1->ic_opcode==IC_IMM && lx->pass==2) { + if (tempi1->ic_opcode==IC_IMM_U64 && lx->pass==2) { switch (i=tempi1->ic_data) { case 0: break; case 1: tempi2->ic_flags|=tempi->ic_flags|tempi1->ic_flags; - tempi1->ic_opcode=IC_NOP; - tempi1->ic_flags=0; - tempi->ic_opcode=IC_NOP; - tempi->ic_flags=0; tempi2->ic_class2=tempi->ic_class2; tempi_push=tempi2; + OptSetNOP1(tempi1); + OptSetNOP1(tempi);; break; default: if (Bsf(i)==Bsr(i)) { tempi->ic_flags|=tempi1->ic_flags; tempi->t.p1c=tempi->t.p2c; - tempi1->ic_opcode=IC_NOP; - tempi1->ic_flags=0; tempi->ic_data=Bsf(i); tempi->ic_opcode=IC_SHL_CONST; + OptSetNOP1(tempi1); } } - } else if (tempi2->ic_opcode==IC_IMM) { + } else if (tempi2->ic_opcode==IC_IMM_U64) { switch (i=tempi2->ic_data) { case 0: break; case 1: tempi1->ic_flags|=tempi->ic_flags|tempi2->ic_flags; - tempi2->ic_opcode=IC_NOP; - tempi2->ic_flags=0; - tempi->ic_opcode=IC_NOP; - tempi->ic_flags=0; tempi1->ic_class2=tempi->ic_class2; tempi_push=tempi1; + OptSetNOP1(tempi2); + OptSetNOP1(tempi);; break; default: if (Bsf(i)==Bsr(i)) { tempi->ic_flags|=tempi2->ic_flags; - tempi2->ic_opcode=IC_NOP; - tempi2->ic_flags=0; tempi->ic_data=Bsf(i); tempi->ic_opcode=IC_SHL_CONST; + OptSetNOP1(tempi2); } else if (tempi1->ic_opcode==IC_MUL && lx->pass==2) { - if (tempi1->t.p1t->ic_opcode==IC_IMM) { + if (tempi1->t.p1t->ic_opcode==IC_IMM_U64) { tempi1->ic_flags|=tempi->ic_flags; tempi1->t.p1t->ic_data*=tempi2->ic_data; - tempi2->ic_opcode=IC_NOP; - tempi2->ic_flags=0; - tempi->ic_opcode=IC_NOP; - tempi->ic_flags=0; tempi1->ic_class2=tempi->ic_class2; tempi_push=tempi1; - } else if (tempi1->t.p2t->ic_opcode==IC_IMM) { + OptSetNOP1(tempi2); + OptSetNOP1(tempi);; + } else if (tempi1->t.p2t->ic_opcode==IC_IMM_U64) { tempi1->ic_flags|=tempi->ic_flags; tempi1->t.p2t->ic_data*=tempi2->ic_data; - tempi2->ic_opcode=IC_NOP; - tempi2->ic_flags=0; - tempi->ic_opcode=IC_NOP; - tempi->ic_flags=0; tempi1->ic_class2=tempi->ic_class2; tempi_push=tempi1; + OptSetNOP1(tempi2); + OptSetNOP1(tempi);; } } } - } else if (tempi2->ic_opcode==IC_F64 && lx->pass==2) { + } else if (tempi2->ic_opcode==IC_IMM_F64 && lx->pass==2) { if (tempi2->ic_data(F64)==1.0) { tempi1->ic_flags|=tempi2->ic_flags|tempi->ic_flags; - tempi2->ic_opcode=IC_NOP; - tempi2->ic_flags=0; - tempi->ic_opcode=IC_NOP; - tempi->ic_flags=0; tempi1->ic_class2=tempi->ic_class2; tempi_push=tempi1; + OptSetNOP1(tempi2); + OptSetNOP1(tempi);; } else if (tempi1->ic_opcode==IC_MUL) { - if (tempi1->t.p1t->ic_opcode==IC_F64) { + if (tempi1->t.p1t->ic_opcode==IC_IMM_F64) { tempi1->ic_flags|=tempi->ic_flags|tempi2->ic_flags; tempi1->t.p1t->ic_data(F64)*=tempi2->ic_data(F64); - tempi2->ic_opcode=IC_NOP; - tempi2->ic_flags=0; - tempi->ic_opcode=IC_NOP; - tempi->ic_flags=0; tempi1->ic_class2=tempi->ic_class2; tempi_push=tempi1; - } else if (tempi1->t.p2t->ic_opcode==IC_F64) { + OptSetNOP1(tempi2); + OptSetNOP1(tempi);; + } else if (tempi1->t.p2t->ic_opcode==IC_IMM_F64) { tempi1->ic_flags|=tempi->ic_flags|tempi2->ic_flags; tempi1->t.p2t->ic_data(F64)*=tempi2->ic_data(F64); - tempi2->ic_opcode=IC_NOP; - tempi2->ic_flags=0; - tempi->ic_opcode=IC_NOP; - tempi->ic_flags=0; tempi1->ic_class2=tempi->ic_class2; tempi_push=tempi1; + OptSetNOP1(tempi2); + OptSetNOP1(tempi);; } } } @@ -1054,35 +1010,32 @@ args. } break; case IC_DIV: - if ((tempi2->ic_data || tempi2->ic_opcode!=IC_IMM && tempi2->ic_opcode!=IC_F64) && - (i=OptFixupBinaryOp1(tempi,tempi1,tempi2,&is_unsigned))) { + if ((tempi2->ic_data || tempi2->ic_opcode!=IC_IMM_U64 && tempi2->ic_opcode!=IC_IMM_F64) && + (i=OptFixupBinaryOp1(tempi,tempi1,tempi2,&is_unsigned))) { if (i==FBO1_INT) { if (is_unsigned) tempi->ic_data=tempi1->ic_data(U64)/tempi2->ic_data(U64); else tempi->ic_data=tempi1->ic_data(I64)/tempi2->ic_data(I64); - tempi->ic_opcode=IC_IMM; + tempi->ic_opcode=IC_IMM_U64; } else { tempi->ic_data(F64)=tempi1->ic_data(F64)/ - tempi2->ic_data(F64); - tempi->ic_opcode=IC_F64; + tempi2->ic_data(F64); + tempi->ic_opcode=IC_IMM_F64; } } else { - if (tempi2->ic_opcode==IC_IMM && (i=tempi2->ic_data)) { + if (tempi2->ic_opcode==IC_IMM_U64 && (i=tempi2->ic_data)) { if (i==1) { tempi1->ic_flags|=tempi2->ic_flags|tempi->ic_flags; - tempi2->ic_opcode=IC_NOP; - tempi2->ic_flags=0; - tempi->ic_opcode=IC_NOP; - tempi->ic_flags=0; tempi1->ic_class2=tempi->ic_class2; tempi_push=tempi1; + OptSetNOP1(tempi2); + OptSetNOP1(tempi);; } else if (Bsf(i)==Bsr(i)) { tempi->ic_flags|=tempi2->ic_flags; - tempi2->ic_opcode=IC_NOP; - tempi2->ic_flags=0; tempi->ic_data=Bsf(i); tempi->ic_opcode=IC_SHR_CONST; + OptSetNOP1(tempi2); } } } @@ -1096,22 +1049,22 @@ args. } break; case IC_MOD: - if ((tempi2->ic_data || tempi2->ic_opcode!=IC_IMM && tempi2->ic_opcode!=IC_F64) && - (i=OptFixupBinaryOp1(tempi,tempi1,tempi2,&is_unsigned))) { + if ((tempi2->ic_data || tempi2->ic_opcode!=IC_IMM_U64 && tempi2->ic_opcode!=IC_IMM_F64) && + (i=OptFixupBinaryOp1(tempi,tempi1,tempi2,&is_unsigned))) { if (i==FBO1_INT) { if (is_unsigned) tempi->ic_data=tempi1->ic_data(U64)%tempi2->ic_data(U64); else tempi->ic_data=tempi1->ic_data(I64)%tempi2->ic_data(I64); - tempi->ic_opcode=IC_IMM; + tempi->ic_opcode=IC_IMM_U64; } else { tempi->ic_data(F64)=tempi1->ic_data(F64)% - tempi2->ic_data(F64); - tempi->ic_opcode=IC_F64; + tempi2->ic_data(F64); + tempi->ic_opcode=IC_IMM_F64; } - } else if (lx->pass==2 && tempi2->ic_opcode==IC_IMM && - (i=tempi2->ic_data) && Bsf(i)==Bsr(i) && tempi_push->ic_class->sub_type!=IT_F64 && - tempi_push->ic_class->sub_type&1) { //do only unsigned + } else if (lx->pass==2 && tempi2->ic_opcode==IC_IMM_U64 && + (i=tempi2->ic_data) && Bsf(i)==Bsr(i) && tempi_push->ic_class->sub_type!=IT_F64 && + tempi_push->ic_class->sub_type&1) { //do only unsigned tempi2->ic_data=i-1; tempi->ic_opcode=IC_AND; } @@ -1128,9 +1081,9 @@ args. if (i=OptFixupBinaryOp1(tempi,tempi1,tempi2,&is_unsigned)) { tempi->ic_data=tempi1->ic_data&tempi2->ic_data; if (i==FBO1_INT) - tempi->ic_opcode=IC_IMM; + tempi->ic_opcode=IC_IMM_U64; else - tempi->ic_opcode=IC_F64; + tempi->ic_opcode=IC_IMM_F64; } if (!tempi_push->ic_class->ptr_cnt) { if (tempi_push->ic_class->sub_type==IT_F64) @@ -1145,9 +1098,9 @@ args. if (i=OptFixupBinaryOp1(tempi,tempi1,tempi2,&is_unsigned)) { tempi->ic_data=tempi1->ic_data|tempi2->ic_data; if (i==FBO1_INT) - tempi->ic_opcode=IC_IMM; + tempi->ic_opcode=IC_IMM_U64; else - tempi->ic_opcode=IC_F64; + tempi->ic_opcode=IC_IMM_F64; } if (!tempi_push->ic_class->ptr_cnt) { if (tempi_push->ic_class->sub_type==IT_F64) @@ -1162,9 +1115,9 @@ args. if (i=OptFixupBinaryOp1(tempi,tempi1,tempi2,&is_unsigned)) { tempi->ic_data=tempi1->ic_data^tempi2->ic_data; if (i==FBO1_INT) - tempi->ic_opcode=IC_IMM; + tempi->ic_opcode=IC_IMM_U64; else - tempi->ic_opcode=IC_F64; + tempi->ic_opcode=IC_IMM_F64; } if (!tempi_push->ic_class->ptr_cnt) { if (tempi_push->ic_class->sub_type==IT_F64) @@ -1179,156 +1132,130 @@ args. if (i=OptFixupBinaryOp1(tempi,tempi1,tempi2,&is_unsigned)) { if (i==FBO1_INT) { tempi->ic_data=tempi1->ic_data+tempi2->ic_data; - tempi->ic_opcode=IC_IMM; + tempi->ic_opcode=IC_IMM_U64; } else { tempi->ic_data(F64)=tempi1->ic_data(F64)+ - tempi2->ic_data(F64); - tempi->ic_opcode=IC_F64; + tempi2->ic_data(F64); + tempi->ic_opcode=IC_IMM_F64; } } else { - if (tempi1->ic_opcode==IC_ABS_ADDR&&tempi2->ic_opcode==IC_IMM) { + if (tempi1->ic_opcode==IC_ABS_ADDR&&tempi2->ic_opcode==IC_IMM_U64) { tempi->ic_flags|=tempi1->ic_flags|tempi2->ic_flags; - tempi1->ic_opcode=IC_NOP; - tempi1->ic_flags=0; - tempi2->ic_opcode=IC_NOP; - tempi2->ic_flags=0; tempi->ic_data=tempi1->ic_data+tempi2->ic_data; tempi->ic_opcode=IC_ABS_ADDR; + OptSetNOP1(tempi1); + OptSetNOP1(tempi2); } else if (lx->pass==2) { - if (tempi1->ic_opcode==IC_IMM) { + if (tempi1->ic_opcode==IC_IMM_U64) { if (!tempi1->ic_data) { tempi2->ic_flags|=tempi1->ic_flags|tempi->ic_flags; - tempi1->ic_opcode=IC_NOP; - tempi1->ic_flags=0; - tempi->ic_opcode=IC_NOP; - tempi->ic_flags=0; tempi2->ic_class2=tempi->ic_class2; tempi_push=tempi2; + OptSetNOP1(tempi1); + OptSetNOP1(tempi);; } else if (tempi2->ic_opcode==IC_ADD|| - tempi2->ic_opcode==IC_SUB) { - if (tempi2->t.p1t->ic_opcode==IC_IMM) { + tempi2->ic_opcode==IC_SUB) { + if (tempi2->t.p1t->ic_opcode==IC_IMM_U64) { tempi2->ic_flags|=tempi->ic_flags; tempi2->t.p1t->ic_data+=tempi1->ic_data; - tempi1->ic_opcode=IC_NOP; - tempi1->ic_flags=0; - tempi->ic_opcode=IC_NOP; - tempi->ic_flags=0; tempi2->ic_class2=tempi->ic_class2; tempi_push=tempi2; - } else if (tempi2->t.p2t->ic_opcode==IC_IMM) { + OptSetNOP1(tempi1); + OptSetNOP1(tempi);; + } else if (tempi2->t.p2t->ic_opcode==IC_IMM_U64) { tempi2->ic_flags|=tempi->ic_flags; if (tempi2->ic_opcode==IC_ADD) tempi2->t.p2t->ic_data+=tempi1->ic_data; else tempi2->t.p2t->ic_data-=tempi1->ic_data; - tempi1->ic_opcode=IC_NOP; - tempi1->ic_flags=0; - tempi->ic_opcode=IC_NOP; - tempi->ic_flags=0; tempi2->ic_class2=tempi->ic_class2; tempi_push=tempi2; + OptSetNOP1(tempi1); + OptSetNOP1(tempi);; } } - } else if (tempi2->ic_opcode==IC_IMM) { + } else if (tempi2->ic_opcode==IC_IMM_U64) { if (!tempi2->ic_data) { tempi1->ic_flags|=tempi2->ic_flags|tempi->ic_flags; - tempi2->ic_opcode=IC_NOP; - tempi2->ic_flags=0; - tempi->ic_opcode=IC_NOP; - tempi->ic_flags=0; tempi1->ic_class2=tempi->ic_class2; tempi_push=tempi1; + OptSetNOP1(tempi2); + OptSetNOP1(tempi);; } else if (tempi1->ic_opcode==IC_ADD || - tempi1->ic_opcode==IC_SUB) { - if (tempi1->t.p1t->ic_opcode==IC_IMM) { + tempi1->ic_opcode==IC_SUB) { + if (tempi1->t.p1t->ic_opcode==IC_IMM_U64) { tempi1->ic_flags|=tempi->ic_flags; tempi1->t.p1t->ic_data+=tempi2->ic_data; - tempi2->ic_opcode=IC_NOP; - tempi2->ic_flags=0; - tempi->ic_opcode=IC_NOP; - tempi->ic_flags=0; tempi1->ic_class2=tempi->ic_class2; tempi_push=tempi1; - } else if (tempi1->t.p2t->ic_opcode==IC_IMM) { + OptSetNOP1(tempi2); + OptSetNOP1(tempi);; + } else if (tempi1->t.p2t->ic_opcode==IC_IMM_U64) { tempi1->ic_flags|=tempi->ic_flags; if (tempi1->ic_opcode==IC_ADD) tempi1->t.p2t->ic_data+=tempi2->ic_data; else tempi1->t.p2t->ic_data-=tempi2->ic_data; - tempi2->ic_opcode=IC_NOP; - tempi2->ic_flags=0; - tempi->ic_opcode=IC_NOP; - tempi->ic_flags=0; tempi1->ic_class2=tempi->ic_class2; tempi_push=tempi1; + OptSetNOP1(tempi2); + OptSetNOP1(tempi);; } } - } else if (tempi1->ic_opcode==IC_F64) { + } else if (tempi1->ic_opcode==IC_IMM_F64) { if (!tempi1->ic_data) { tempi2->ic_flags|=tempi1->ic_flags|tempi->ic_flags; - tempi1->ic_opcode=IC_NOP; - tempi1->ic_flags=0; - tempi->ic_opcode=IC_NOP; - tempi->ic_flags=0; tempi2->ic_class2=tempi->ic_class2; tempi_push=tempi2; + OptSetNOP1(tempi1); + OptSetNOP1(tempi);; } else if (tempi2->ic_opcode==IC_ADD|| - tempi2->ic_opcode==IC_SUB) { - if (tempi2->t.p1t->ic_opcode==IC_F64) { + tempi2->ic_opcode==IC_SUB) { + if (tempi2->t.p1t->ic_opcode==IC_IMM_F64) { tempi2->ic_flags|=tempi->ic_flags; tempi2->t.p1t->ic_data(F64)+=tempi1->ic_data(F64); - tempi1->ic_opcode=IC_NOP; - tempi1->ic_flags=0; - tempi->ic_opcode=IC_NOP; - tempi->ic_flags=0; tempi2->ic_class2=tempi->ic_class2; tempi_push=tempi2; - } else if (tempi2->t.p2t->ic_opcode==IC_F64) { + OptSetNOP1(tempi1); + OptSetNOP1(tempi);; + } else if (tempi2->t.p2t->ic_opcode==IC_IMM_F64) { tempi2->ic_flags|=tempi->ic_flags; if (tempi2->ic_opcode==IC_ADD) tempi2->t.p2t->ic_data(F64)+=tempi1->ic_data(F64); else tempi2->t.p2t->ic_data(F64)-=tempi1->ic_data(F64); - tempi1->ic_opcode=IC_NOP; - tempi1->ic_flags=0; - tempi->ic_opcode=IC_NOP; - tempi->ic_flags=0; tempi2->ic_class2=tempi->ic_class2; tempi_push=tempi2; + OptSetNOP1(tempi1); + OptSetNOP1(tempi);; } } - } else if (tempi2->ic_opcode==IC_F64) { + } else if (tempi2->ic_opcode==IC_IMM_F64) { if (!tempi2->ic_data) { tempi1->ic_flags|=tempi2->ic_flags|tempi->ic_flags; - tempi2->ic_opcode=IC_NOP; - tempi2->ic_flags=0; - tempi->ic_opcode=IC_NOP; - tempi->ic_flags=0; tempi1->ic_class2=tempi->ic_class2; tempi_push=tempi1; + OptSetNOP1(tempi2); + OptSetNOP1(tempi);; } else if (tempi1->ic_opcode==IC_ADD || - tempi1->ic_opcode==IC_SUB) { - if (tempi1->t.p1t->ic_opcode==IC_F64) { + tempi1->ic_opcode==IC_SUB) { + if (tempi1->t.p1t->ic_opcode==IC_IMM_F64) { tempi1->ic_flags|=tempi->ic_flags; tempi1->t.p1t->ic_data(F64)+=tempi2->ic_data(F64); - tempi2->ic_opcode=IC_NOP; - tempi2->ic_flags=0; - tempi->ic_opcode=IC_NOP; - tempi->ic_flags=0; tempi1->ic_class2=tempi->ic_class2; tempi_push=tempi1; - } else if (tempi1->t.p2t->ic_opcode==IC_F64) { + OptSetNOP1(tempi2); + OptSetNOP1(tempi);; + } else if (tempi1->t.p2t->ic_opcode==IC_IMM_F64) { tempi1->ic_flags|=tempi->ic_flags; if (tempi1->ic_opcode==IC_ADD) tempi1->t.p2t->ic_data(F64)+=tempi2->ic_data(F64); else tempi1->t.p2t->ic_data(F64)-=tempi2->ic_data(F64); - tempi2->ic_opcode=IC_NOP; - tempi2->ic_flags=0; - tempi->ic_opcode=IC_NOP; - tempi->ic_flags=0; tempi1->ic_class2=tempi->ic_class2; tempi_push=tempi1; + OptSetNOP1(tempi2); + OptSetNOP1(tempi);; } } } @@ -1347,86 +1274,74 @@ args. if (i=OptFixupBinaryOp1(tempi,tempi1,tempi2,&is_unsigned)) { if (i==FBO1_INT) { tempi->ic_data=tempi1->ic_data-tempi2->ic_data; - tempi->ic_opcode=IC_IMM; + tempi->ic_opcode=IC_IMM_U64; } else { tempi->ic_data(F64)=tempi1->ic_data(F64)- - tempi2->ic_data(F64); - tempi->ic_opcode=IC_F64; + tempi2->ic_data(F64); + tempi->ic_opcode=IC_IMM_F64; } } else { if (lx->pass==2) { - if (tempi2->ic_opcode==IC_IMM) { + if (tempi2->ic_opcode==IC_IMM_U64) { if (!tempi2->ic_data) { tempi1->ic_flags|=tempi2->ic_flags|tempi->ic_flags; - tempi2->ic_opcode=IC_NOP; - tempi2->ic_flags=0; - tempi->ic_opcode=IC_NOP; - tempi->ic_flags=0; tempi1->ic_class2=tempi->ic_class2; tempi_push=tempi1; + OptSetNOP1(tempi2); + OptSetNOP1(tempi);; } else - if (tempi1->ic_opcode==IC_ADD || - tempi1->ic_opcode==IC_SUB) { - if (tempi1->t.p1t->ic_opcode==IC_IMM) { - tempi1->ic_flags|=tempi->ic_flags; - tempi1->t.p1t->ic_data-=tempi2->ic_data; - tempi2->ic_opcode=IC_NOP; - tempi2->ic_flags=0; - tempi->ic_opcode=IC_NOP; - tempi->ic_flags=0; - tempi1->ic_class2=tempi->ic_class2; - tempi_push=tempi1; - } else if (tempi1->t.p2t->ic_opcode==IC_IMM) { - tempi1->ic_flags|=tempi->ic_flags; - if (tempi1->ic_opcode==IC_ADD) - tempi1->t.p2t->ic_data-=tempi2->ic_data; - else - tempi1->t.p2t->ic_data+=tempi2->ic_data; - tempi2->ic_opcode=IC_NOP; - tempi2->ic_flags=0; - tempi->ic_opcode=IC_NOP; - tempi->ic_flags=0; - tempi1->ic_class2=tempi->ic_class2; - tempi_push=tempi1; + if (tempi1->ic_opcode==IC_ADD || + tempi1->ic_opcode==IC_SUB) { + if (tempi1->t.p1t->ic_opcode==IC_IMM_U64) { + tempi1->ic_flags|=tempi->ic_flags; + tempi1->t.p1t->ic_data-=tempi2->ic_data; + tempi1->ic_class2=tempi->ic_class2; + tempi_push=tempi1; + OptSetNOP1(tempi2); + OptSetNOP1(tempi);; + } else if (tempi1->t.p2t->ic_opcode==IC_IMM_U64) { + tempi1->ic_flags|=tempi->ic_flags; + if (tempi1->ic_opcode==IC_ADD) + tempi1->t.p2t->ic_data-=tempi2->ic_data; + else + tempi1->t.p2t->ic_data+=tempi2->ic_data; + tempi1->ic_class2=tempi->ic_class2; + tempi_push=tempi1; + OptSetNOP1(tempi2); + OptSetNOP1(tempi);; + } } - } } else - if (tempi2->ic_opcode==IC_F64) { - if (!tempi2->ic_data) { - tempi1->ic_flags|=tempi2->ic_flags|tempi->ic_flags; - tempi2->ic_opcode=IC_NOP; - tempi2->ic_flags=0; - tempi->ic_opcode=IC_NOP; - tempi->ic_flags=0; - tempi1->ic_class2=tempi->ic_class2; - tempi_push=tempi1; - } else - if (tempi1->ic_opcode==IC_ADD || - tempi1->ic_opcode==IC_SUB) { - if (tempi1->t.p1t->ic_opcode==IC_F64) { - tempi1->ic_flags|=tempi->ic_flags|tempi2->ic_flags; - tempi1->t.p1t->ic_data(F64)-=tempi2->ic_data(F64); - tempi2->ic_opcode=IC_NOP; - tempi2->ic_flags=0; - tempi->ic_opcode=IC_NOP; - tempi->ic_flags=0; + if (tempi2->ic_opcode==IC_IMM_F64) { + if (!tempi2->ic_data) { + tempi1->ic_flags|=tempi2->ic_flags|tempi->ic_flags; tempi1->ic_class2=tempi->ic_class2; tempi_push=tempi1; - } else if (tempi1->t.p2t->ic_opcode==IC_F64) { - tempi1->ic_flags|=tempi->ic_flags|tempi2->ic_flags; - if (tempi1->ic_opcode==IC_ADD) - tempi1->t.p2t->ic_data(F64)-=tempi2->ic_data(F64); - else - tempi1->t.p2t->ic_data(F64)+=tempi2->ic_data(F64); - tempi2->ic_opcode=IC_NOP; - tempi2->ic_flags=0; - tempi->ic_opcode=IC_NOP; - tempi->ic_flags=0; - tempi1->ic_class2=tempi->ic_class2; - tempi_push=tempi1; - } + OptSetNOP1(tempi2); + OptSetNOP1(tempi);; + } else + if (tempi1->ic_opcode==IC_ADD || + tempi1->ic_opcode==IC_SUB) { + if (tempi1->t.p1t->ic_opcode==IC_IMM_F64) { + tempi1->ic_flags|=tempi->ic_flags|tempi2->ic_flags; + tempi1->t.p1t->ic_data(F64)-=tempi2->ic_data(F64); + tempi1->ic_class2=tempi->ic_class2; + tempi_push=tempi1; + OptSetNOP1(tempi2); + OptSetNOP1(tempi);; + } else if (tempi1->t.p2t->ic_opcode==IC_IMM_F64) { + tempi1->ic_flags|=tempi->ic_flags|tempi2->ic_flags; + if (tempi1->ic_opcode==IC_ADD) + tempi1->t.p2t->ic_data(F64)-=tempi2->ic_data(F64); + else + tempi1->t.p2t->ic_data(F64)+=tempi2->ic_data(F64); + tempi1->ic_class2=tempi->ic_class2; + tempi_push=tempi1; + OptSetNOP1(tempi2); + OptSetNOP1(tempi);; + } + } } - } } } @@ -1442,10 +1357,10 @@ args. case IC_EQUAL_EQUAL: if (OptFixupBinaryOp1(tempi,tempi1,tempi2,&is_unsigned)) { tempi->ic_data=tempi1->ic_data==tempi2->ic_data; - tempi->ic_opcode=IC_IMM; + tempi->ic_opcode=IC_IMM_U64; } else - if (tempi->ic_class->sub_type==IT_F64) - tempi->ic_flags|=ICF_USE_F64; + if (tempi->ic_class->sub_type==IT_F64) + tempi->ic_flags|=ICF_USE_F64; tempi->ic_flags&=~ICF_R_TO_INT; if (!tempi_push->ic_class->ptr_cnt) { if (tempi_push->ic_class->sub_type==IT_F64) @@ -1463,10 +1378,10 @@ args. case IC_NOT_EQUAL: if (OptFixupBinaryOp1(tempi,tempi1,tempi2,&is_unsigned)) { tempi->ic_data=tempi1->ic_data!=tempi2->ic_data; - tempi->ic_opcode=IC_IMM; + tempi->ic_opcode=IC_IMM_U64; } else - if (tempi->ic_class->sub_type==IT_F64) - tempi->ic_flags|=ICF_USE_F64; + if (tempi->ic_class->sub_type==IT_F64) + tempi->ic_flags|=ICF_USE_F64; tempi->ic_flags&=~ICF_R_TO_INT; if (!tempi_push->ic_class->ptr_cnt) { if (tempi_push->ic_class->sub_type==IT_F64) @@ -1490,9 +1405,9 @@ args. tempi->ic_data=tempi1->ic_data(I64)ic_data(I64); } else { tempi->ic_data=tempi1->ic_data(F64)< - tempi2->ic_data(F64); + tempi2->ic_data(F64); } - tempi->ic_opcode=IC_IMM; + tempi->ic_opcode=IC_IMM_U64; } else { if (is_unsigned) tempi->ic_flags|=ICF_USE_UNSIGNED; @@ -1522,9 +1437,9 @@ args. tempi->ic_data=tempi1->ic_data(I64)>tempi2->ic_data(I64); } else { tempi->ic_data=tempi1->ic_data(F64)> - tempi2->ic_data(F64); + tempi2->ic_data(F64); } - tempi->ic_opcode=IC_IMM; + tempi->ic_opcode=IC_IMM_U64; } else { if (is_unsigned) tempi->ic_flags|=ICF_USE_UNSIGNED; @@ -1554,9 +1469,9 @@ args. tempi->ic_data=tempi1->ic_data(I64)<=tempi2->ic_data(I64); } else { tempi->ic_data=tempi1->ic_data(F64)<= - tempi2->ic_data(F64); + tempi2->ic_data(F64); } - tempi->ic_opcode=IC_IMM; + tempi->ic_opcode=IC_IMM_U64; } else { if (is_unsigned) tempi->ic_flags|=ICF_USE_UNSIGNED; @@ -1586,9 +1501,9 @@ args. tempi->ic_data=tempi1->ic_data(I64)>=tempi2->ic_data(I64); } else { tempi->ic_data=tempi1->ic_data(F64)>= - tempi2->ic_data(F64); + tempi2->ic_data(F64); } - tempi->ic_opcode=IC_IMM; + tempi->ic_opcode=IC_IMM_U64; } else { if (is_unsigned) tempi->ic_flags|=ICF_USE_UNSIGNED; @@ -1612,7 +1527,7 @@ args. case IC_AND_AND: if (OptFixupBinaryOp1(tempi,tempi1,tempi2,&is_unsigned)) { tempi->ic_data=tempi1->ic_data&&tempi2->ic_data; - tempi->ic_opcode=IC_IMM; + tempi->ic_opcode=IC_IMM_U64; } if (!tempi_push->ic_class->ptr_cnt) { if (tempi_push->ic_class->sub_type==IT_F64) @@ -1627,7 +1542,7 @@ args. case IC_OR_OR: if (OptFixupBinaryOp1(tempi,tempi1,tempi2,&is_unsigned)) { tempi->ic_data=tempi1->ic_data||tempi2->ic_data; - tempi->ic_opcode=IC_IMM; + tempi->ic_opcode=IC_IMM_U64; } if (!tempi_push->ic_class->ptr_cnt) { if (tempi_push->ic_class->sub_type==IT_F64) @@ -1642,7 +1557,7 @@ args. case IC_XOR_XOR: if (OptFixupBinaryOp1(tempi,tempi1,tempi2,&is_unsigned)) { tempi->ic_data=tempi1->ic_data^^tempi2->ic_data; - tempi->ic_opcode=IC_IMM; + tempi->ic_opcode=IC_IMM_U64; } if (!tempi_push->ic_class->ptr_cnt) { if (tempi_push->ic_class->sub_type==IT_F64) @@ -1654,31 +1569,12 @@ args. } tempi->ic_class=sys_internal_types[IT_I64]; break; - case IC_COLON: - if (tempc2->sub_type>tempc3->sub_type) - tempi->ic_class=tempc2; - else - tempi->ic_class=tempc3; - tempc=tempi->ic_class; - if (tempc->sub_type==IT_F64) { - if (tempc2->sub_type!=IT_F64) - tempi2->ic_flags|=ICF_R_TO_F64; - if (tempc3->sub_type!=IT_F64) - tempi3->ic_flags|=ICF_R_TO_F64; - } - if (!tempi_push->ic_class->ptr_cnt) { - if (tempi_push->ic_class->sub_type==IT_F64) - tempi_push->ic_class2=sys_internal_types[IT_F64]; - else - tempi_push->ic_class2=sys_internal_types[IT_I64]; - } - break; case IC_MUL_EQUAL: if (lx->pass==2 && (!tempc->size||!tempc2->size)) LexPutWarn(lx,"ST_ASSIGN_U0",fun_class); - if (tempi2->ic_opcode==IC_IMM && - tempc->sub_type!=IT_F64 && - tempc2->sub_type!=IT_F64) { + if (tempi2->ic_opcode==IC_IMM_U64 && + tempc->sub_type!=IT_F64 && + tempc2->sub_type!=IT_F64) { if (i=tempi2->ic_data) { if (Bsf(i)==Bsr(i)) { tempi2->ic_data=Bsf(i); @@ -1696,10 +1592,10 @@ args. case IC_DIV_EQUAL: if (lx->pass==2 && (!tempc->size||!tempc2->size)) LexPutWarn(lx,"ST_ASSIGN_U0",fun_class); - if (tempi2->ic_opcode==IC_IMM && - tempc->sub_type!=IT_F64 && - tempc2->sub_type!=IT_F64 && - (i=tempi2->ic_data) && Bsf(i)==Bsr(i)) { + if (tempi2->ic_opcode==IC_IMM_U64 && + tempc->sub_type!=IT_F64 && + tempc2->sub_type!=IT_F64 && + (i=tempi2->ic_data) && Bsf(i)==Bsr(i)) { tempi2->ic_data=Bsf(i); tempi->ic_opcode=IC_SHR_EQUAL; } @@ -1713,10 +1609,10 @@ args. case IC_MOD_EQUAL: if (lx->pass==2 && (!tempc->size||!tempc2->size)) LexPutWarn(lx,"ST_ASSIGN_U0",fun_class); - if (tempi2->ic_opcode==IC_IMM && - tempc->sub_type!=IT_F64 && - tempc2->sub_type!=IT_F64 && - (i=tempi2->ic_data) && Bsf(i)==Bsr(i)) { + if (tempi2->ic_opcode==IC_IMM_U64 && + tempc->sub_type!=IT_F64 && + tempc2->sub_type!=IT_F64 && + (i=tempi2->ic_data) && Bsf(i)==Bsr(i)) { tempi2->ic_data=i-1; tempi->ic_opcode=IC_AND_EQUAL; } @@ -1751,16 +1647,14 @@ args. if (lx->pass==2 && tempi1->ic_class->sub_type!=IT_F64) { if (tempi1->ic_opcode==IC__PP) { tempi->ic_opcode=IC_ASSIGN_PP; - tempi1->ic_opcode=IC_NOP; tempi->ic_flags|=tempi1->ic_flags; - tempi1->ic_flags=0; - tempi->t.p3c=tempi1->ic_class; + tempi->t.class2=tempi1->ic_class; + OptSetNOP1(tempi1); } else if (tempi1->ic_opcode==IC__MM) { tempi->ic_opcode=IC_ASSIGN_MM; - tempi1->ic_opcode=IC_NOP; tempi->ic_flags|=tempi1->ic_flags; - tempi1->ic_flags=0; - tempi->t.p3c=tempi1->ic_class; + tempi->t.class2=tempi1->ic_class; + OptSetNOP1(tempi1); } } break; @@ -1782,8 +1676,7 @@ args. if (temp_lag[1]->ic_opcode==IC_ADD_RSP) { tempi->ic_data+=temp_lag[1]->ic_data; tempi->ic_flags|=temp_lag[1]->ic_flags; - temp_lag[1]->ic_opcode=IC_NOP; - temp_lag[1]->ic_flags=0; + OptSetNOP1(temp_lag[1]); } case IC_ADD_RSP1: break; @@ -1829,8 +1722,6 @@ args. case IC_SIGN_I64: case IC_TOUPPER: case IC_ABS_I64: - case IC_LIMIT_I64: - case IC_LIMIT_U64: case IC_MIN_I64: case IC_MAX_I64: case IC_MIN_U64: @@ -1842,32 +1733,25 @@ args. case IC_SWAP_U16: case IC_SWAP_U32: case IC_SWAP_U64: - case IC_INU32: - case IC_INU16: - case IC_INU8: + case IC_IN_U32: + case IC_IN_U16: + case IC_IN_U8: case IC_STRLEN: case IC_BT: case IC_BTS: case IC_BTR: case IC_BTC: - case IC_BEQU: case IC_QUE_INIT: case IC_QUE_REM: case IC_QUE_INS: case IC_QUE_INS_REV: - case IC_OUTU32: - case IC_OUTU16: - case IC_OUTU8: + case IC_OUT_U32: + case IC_OUT_U16: + case IC_OUT_U8: case IC_NOBOUND_SWITCH: case IC_SWITCH: - case IC_MEMCPY: - case IC_MEMSET: - case IC_MEMSET_U16: - case IC_MEMSET_U32: - case IC_MEMSET_U64: case IC_ASM: break; - case IC_LBEQU: case IC_LBTS: case IC_LBTR: case IC_LBTC: @@ -1875,52 +1759,47 @@ args. break; case IC_TO_I64: if (combined) { - if (tempi1->ic_opcode==IC_F64) { + if (tempi1->ic_opcode==IC_IMM_F64) { tempi->ic_flags|=tempi1->ic_flags&~ICF_R_TO_INT; - tempi1->ic_opcode=IC_NOP; - tempi1->ic_flags=0; - tempi->ic_opcode=IC_IMM; + tempi->ic_opcode=IC_IMM_U64; tempi->ic_data=ToI64(tempi1->ic_data(F64)); tempi->ic_class=sys_internal_types[IT_I64]; tempi->ic_class2=sys_internal_types[IT_I64]; + OptSetNOP1(tempi1); tempii=tempi1-1; while (tempii->ic_opcode!=IC_CALL_START) tempii--; - tempii->ic_opcode=IC_NOP; + OptSetNOP1(tempii); tempii=tempi+1; while (tempii->ic_opcode!=IC_CALL_END) tempii++; - tempii->ic_opcode=IC_NOP; - - } else if (tempi1->ic_opcode==IC_IMM) { + OptSetNOP1(tempii); + } else if (tempi1->ic_opcode==IC_IMM_U64) { tempi->ic_flags|=tempi1->ic_flags&~ICF_R_TO_F64; - tempi1->ic_opcode=IC_NOP; - tempi1->ic_flags=0; - tempi->ic_opcode=IC_IMM; + tempi->ic_opcode=IC_IMM_U64; tempi->ic_data=tempi1->ic_data; tempi->ic_class=sys_internal_types[IT_I64]; tempi->ic_class2=sys_internal_types[IT_I64]; + OptSetNOP1(tempi1); tempii=tempi1-1; while (tempii->ic_opcode!=IC_CALL_START) tempii--; - tempii->ic_opcode=IC_NOP; + OptSetNOP1(tempii); tempii=tempi+1; while (tempii->ic_opcode!=IC_CALL_END) tempii++; - tempii->ic_opcode=IC_NOP; - + OptSetNOP1(tempii); } if (tempi1->ic_flags&ICF_R_TO_F64) { tempi1->ic_flags=tempi->ic_flags|tempi1->ic_flags&~(ICF_R_TO_F64|ICF_PUSH_RESULT); - tempi->ic_flags=0; - tempi->ic_opcode=IC_NOP; tempi1->ic_class=sys_internal_types[IT_I64]; tempi1->ic_class2=sys_internal_types[IT_I64]; tempi_push=tempi1; + OptSetNOP1(tempi);; i=0; tempii=tempi1-1; @@ -1932,7 +1811,7 @@ args. i++; tempii--; } - tempii->ic_opcode=IC_NOP; + OptSetNOP1(tempii); i=0; tempii=tempi1+1; @@ -1944,53 +1823,50 @@ args. i++; tempii++; } - tempii->ic_opcode=IC_NOP; + OptSetNOP1(tempii); } } break; case IC_TO_F64: if (combined) { - if (tempi1->ic_opcode==IC_IMM) { + if (tempi1->ic_opcode==IC_IMM_U64) { tempi->ic_flags|=tempi1->ic_flags&~ICF_R_TO_F64; - tempi1->ic_opcode=IC_NOP; - tempi1->ic_flags=0; - tempi->ic_opcode=IC_F64; + tempi->ic_opcode=IC_IMM_F64; tempi->ic_data(F64)=ToF64(tempi1->ic_data); tempi->ic_class=sys_internal_types[IT_F64]; tempi->ic_class2=sys_internal_types[IT_F64]; + OptSetNOP1(tempi1); tempii=tempi1-1; while (tempii->ic_opcode!=IC_CALL_START) tempii--; - tempii->ic_opcode=IC_NOP; + OptSetNOP1(tempii); tempii=tempi+1; while (tempii->ic_opcode!=IC_CALL_END) tempii++; - tempii->ic_opcode=IC_NOP; - } else if (tempi1->ic_opcode==IC_F64) { + OptSetNOP1(tempii); + } else if (tempi1->ic_opcode==IC_IMM_F64) { tempi->ic_flags|=tempi1->ic_flags&~ICF_R_TO_INT; - tempi1->ic_opcode=IC_NOP; - tempi1->ic_flags=0; - tempi->ic_opcode=IC_F64; + tempi->ic_opcode=IC_IMM_F64; tempi->ic_data=tempi1->ic_data; tempi->ic_class=sys_internal_types[IT_F64]; tempi->ic_class2=sys_internal_types[IT_F64]; + OptSetNOP1(tempi1); tempii=tempi1-1; while (tempii->ic_opcode!=IC_CALL_START) tempii--; - tempii->ic_opcode=IC_NOP; + OptSetNOP1(tempii); tempii=tempi+1; while (tempii->ic_opcode!=IC_CALL_END) tempii++; - tempii->ic_opcode=IC_NOP; + OptSetNOP1(tempii); } if (tempi1->ic_flags&ICF_R_TO_INT) { tempi1->ic_flags=tempi->ic_flags|tempi1->ic_flags&~(ICF_R_TO_INT|ICF_PUSH_RESULT); - tempi->ic_flags=0; - tempi->ic_opcode=IC_NOP; + OptSetNOP1(tempi);; tempi1->ic_class=sys_internal_types[IT_F64]; tempi1->ic_class2=sys_internal_types[IT_F64]; tempi_push=tempi1; @@ -2005,7 +1881,7 @@ args. i++; tempii--; } - tempii->ic_opcode=IC_NOP; + OptSetNOP1(tempii); i=0; tempii=tempi1+1; @@ -2017,31 +1893,29 @@ args. i++; tempii++; } - tempii->ic_opcode=IC_NOP; + OptSetNOP1(tempii); } } break; case IC_TO_BOOL: if (combined) { - if (tempi1->ic_opcode==IC_IMM || tempi1->ic_opcode==IC_F64) { + if (tempi1->ic_opcode==IC_IMM_U64 || tempi1->ic_opcode==IC_IMM_F64) { tempi->ic_flags|=tempi1->ic_flags&~ICF_R_TO_F64; - tempi1->ic_opcode=IC_NOP; - tempi1->ic_flags=0; - tempi->ic_opcode=IC_IMM; + tempi->ic_opcode=IC_IMM_U64; tempi->ic_data=ToBool(tempi1->ic_data); tempi->ic_class=sys_internal_types[IT_I64]; tempi->ic_class2=sys_internal_types[IT_I64]; + OptSetNOP1(tempi1); tempii=tempi1-1; while (tempii->ic_opcode!=IC_CALL_START) tempii--; - tempii->ic_opcode=IC_NOP; + OptSetNOP1(tempii); tempii=tempi+1; while (tempii->ic_opcode!=IC_CALL_END) tempii++; - tempii->ic_opcode=IC_NOP; - + OptSetNOP1(tempii); } } break; @@ -2101,22 +1975,20 @@ args. tempi->ic_flags|=ICF_LOCK; break; - case IC_NOP: + case IC_NOP1: if (combined && tempi->ic_flags&ICF_PUSH_RESULT) { tempii=tempi; do tempii--; - while (tempii->ic_opcode==IC_NOP); + while (tempii->ic_opcode==IC_NOP1); tempii->ic_flags|=ICF_PUSH_RESULT; tempi->ic_flags&=~ICF_PUSH_RESULT; } break; - case IC_NOP1: + case IC_NOP2: ps->ptr+=tempi->ic_data<<1; break; case IC_LABEL: - lb=tempi->ic_data; - while (lb->fwd) - lb=lb->fwd; + lb=OptLabelFwd(tempi->ic_data); lb1=tempi->ic_data; while (lb2=lb1->fwd) { lb1->fwd=lb; @@ -2128,8 +2000,8 @@ args. while (lb1->fwd) lb1=lb1->fwd; if (lb1==lb) { - tempii->ic_opcode=IC_NOP; tempi->ic_flags|=tempii->ic_flags; + OptSetNOP1(tempii); } } else if (tempii->ic_opcode==IC_LABEL) { lb1=tempii->ic_data; @@ -2141,15 +2013,14 @@ args. while (lb1->fwd) lb1=lb1->fwd; if (lb1==lb) { - tempii->ic_opcode=IC_NOP; tempi->ic_flags|=tempii->ic_flags; + OptSetNOP1(tempii); } } } break; case IC_END: case IC_ADDR: - case IC_QUESTION: case IC_RET: case IC_END_EXP: case IC_CALL_START: @@ -2160,13 +2031,9 @@ args. case IC_IRQ: break; case IC_JMP: - lb=tempi->ic_data; if (temp_lag[1]->ic_opcode==IC_LABEL) { - while (lb->fwd) - lb=lb->fwd; - lb1=temp_lag[1]->ic_data; - while (lb1->fwd) - lb1=lb1->fwd; + lb=OptLabelFwd(tempi->ic_data); + lb1=OptLabelFwd(temp_lag[1]->ic_data); if (lb!=lb1) lb1->fwd=lb; } @@ -2202,9 +2069,9 @@ args. OptEnd(lx,ps); /* - This is for determining type conversions - for passing args to funs. - */ +This is for determining type conversions +for passing args to funs. +*/ return last_with_class; } diff --git a/TempleOS/Compiler/OptPass3.CPP b/TempleOS/Compiler/OptPass3.CPP index 898fe54..2846c91 100644 --- a/TempleOS/Compiler/OptPass3.CPP +++ b/TempleOS/Compiler/OptPass3.CPP @@ -1,8 +1,7 @@ I64 CmpType(CHashClass *tempc) { if (tempc) { - while (tempc->fwd_class) - tempc=tempc->fwd_class; + tempc=OptClassFwd(tempc); return tempc->sub_type; } return 0; @@ -13,8 +12,7 @@ I64 CmpPType(CHashClass *tempc) if (tempc) { if (tempc->ptr_cnt) tempc--; - while (tempc->fwd_class) - tempc=tempc->fwd_class; + tempc=OptClassFwd(tempc); return tempc->sub_type; } return 0; @@ -28,7 +26,7 @@ U0 CmpF1PushPop(CIntermediateCode *tempi,CIntermediateCode *tempi2) U0 CmpF2PushPop(CIntermediateCode *tempi,CIntermediateCode *tempi1,CIntermediateCode *tempi2) { - if ((tempi2->ic_opcode==IC_MOV || tempi2->ic_opcode==IC_F64) && + if ((tempi2->ic_opcode==IC_MOV || tempi2->ic_opcode==IC_IMM_F64) && !(tempi2->ic_flags&ICF_R_TO_F64) && (Bt(fpop_bitmap,tempi1->ic_opcode) || tempi1->ic_flags&ICF_R_TO_F64)) Bts(&tempi->ic_flags,ICf_DONT_PUSH_FLOAT0); @@ -50,11 +48,11 @@ I64 OptMVCompare(OptMemberVar *mv1,OptMemberVar *mv2) U0 OptPass3(CLex *lx,CHashFun *fun_class,COptReg *register_offsets) { - CHashClass *tempc,*tempc1,*tempc2,*tempc3; + CHashClass *tempc,*tempc1,*tempc2; CCodeBlkMisc *lb; - CIntermediateCode *tempi,*tempi1,*tempi2,*tempi3, - *tempil1,*tempil2, - *temp_lag[4]; + CIntermediateCode *tempi,*tempi1,*tempi2, + *tempil1,*tempil2, + *temp_lag[4]; I64 code,i,j,l,member_cnt,used_reg_mask=0; CMemberLst *tempm; CPrsStk *ps=OptStart(lx,temp_lag); @@ -71,17 +69,15 @@ U0 OptPass3(CLex *lx,CHashFun *fun_class,COptReg *register_offsets) member_cnt=0; tempm=fun_class->member_lst; while (tempm) { - tempc=tempm->member_class; - while (tempc->fwd_class) - tempc=tempc->fwd_class; + tempc=OptClassFwd(tempm->member_class); if (0<=tempm->registerregister)) PrintFWarn("%S\n $$LK-A,\"FL:%s,%d\"$$ '%s' in '%s'\n","ST_REG_IN_USE", - lx->cur_lfn->name,lx->cur_lfn->line_num,tempm->str,fun_class->str); + lx->cur_lfn->name,lx->cur_lfn->line_num,tempm->str,fun_class->str); register_offsets[tempm->register].offset=tempm->offset; register_offsets[tempm->register].m=tempm; } else if (tempc->sub_type!=IT_F64 && tempm->register!=CREG_NONE || - tempm->register==CREG_ALLOC) { + tempm->register==CREG_ALLOC) { if (tempm->register==CREG_ALLOC) mv[member_cnt].score=MAX_I64/2; //big but not too big mv[member_cnt].offset=tempm->offset; @@ -89,7 +85,7 @@ U0 OptPass3(CLex *lx,CHashFun *fun_class,COptReg *register_offsets) } else { if (tempm->register==CREG_ALLOC) PrintFWarn("%S\n $$LK-A,\"FL:%s,%d\"$$ '%s' in '%s'\n","ST_CANT_REG_VAR", - lx->cur_lfn->name,lx->cur_lfn->line_num,tempm->str,fun_class->str); + lx->cur_lfn->name,lx->cur_lfn->line_num,tempm->str,fun_class->str); } tempm=tempm->next; } @@ -100,7 +96,7 @@ U0 OptPass3(CLex *lx,CHashFun *fun_class,COptReg *register_offsets) if (tempi->ic_opcode==IC_START) tempi++; while (code=tempi->ic_opcode) { - if (code!=IC_NOP) { + if (code!=IC_NOP1) { OptNext(tempi,temp_lag); tempil1=temp_lag[1]; tempil2=temp_lag[2]; @@ -109,17 +105,6 @@ U0 OptPass3(CLex *lx,CHashFun *fun_class,COptReg *register_offsets) case 9: ps->ptr-=tempi->ic_data>>3; break; - case 3: - tempi3=PrsPop(ps); - if (tempi3->ic_flags&ICF_R_TO_F64) - tempc3=sys_internal_types[IT_F64]; - else if (tempi3->ic_flags & ICF_R_TO_INT) - tempc3=sys_internal_types[IT_I64]; - else - tempc3=tempi->t.p3c; - tempi->p3.type=TY_STK+CmpType(tempc3); - tempi->p3.ptype=CmpPType(tempc3); - tempi->ic_flags|=ICF_P3_WAS_STK; case 2: tempi2=PrsPop(ps); if (tempi2->ic_flags&ICF_R_TO_F64) @@ -153,20 +138,20 @@ U0 OptPass3(CLex *lx,CHashFun *fun_class,COptReg *register_offsets) PrsPush(ps,tempi); } nobound_switch (code) { - case IC_F64: + case IC_IMM_F64: tempi->ic_flags&=~ICF_R_TO_F64; if (tempi->ic_flags&ICF_R_TO_INT) { tempi->ic_data=ToI64(tempi->ic_data(F64)); tempi->ic_flags&=~ICF_R_TO_INT; - tempi->ic_opcode=IC_IMM; + tempi->ic_opcode=IC_IMM_U64; } break; - case IC_IMM: + case IC_IMM_U64: tempi->ic_flags&=~ICF_R_TO_INT; if (tempi->ic_flags&ICF_R_TO_F64) { tempi->ic_data(F64)=ToF64(tempi->ic_data); tempi->ic_flags&=~ICF_R_TO_F64; - tempi->ic_opcode=IC_F64; + tempi->ic_opcode=IC_IMM_F64; } break; case IC_STR_CONST: @@ -183,7 +168,7 @@ U0 OptPass3(CLex *lx,CHashFun *fun_class,COptReg *register_offsets) break; case IC_REG: case IC_COM: - case IC_NATIVE_TYPECAST: + case IC_HOLYC_TYPECAST: case IC_NOT: case IC_UNARY_MINUS: break; @@ -191,29 +176,29 @@ U0 OptPass3(CLex *lx,CHashFun *fun_class,COptReg *register_offsets) tempi->p1.ptype=tempi->r.type&IT_MASK; if (tempi1->ic_opcode==IC_LEA) { tempi->ic_flags|=tempi1->ic_flags; - tempi1->ic_opcode=IC_NOP; tempi->p1.reg=tempi1->p1.reg; tempi->p1.disp=tempi1->p1.disp; tempi->p1.type=TY_DISP+tempi->r.type&IT_MASK; tempi->p1.ptype=tempi->r.ptype; tempi->ic_opcode=IC_MOV; + OptSetNOP1(tempi1); if (tempi->p1.reg==CREG_RBP) for (i=0;ip1.disp) { mv[i].lea_balance--; - mv[i].score+=1+tempi->ic_indent_level; + mv[i].score++; break; } - } else if (tempil1->ic_opcode==IC_ADD_CONST) { + } else if (tempil1->ic_opcode==IC_ADD_CONST) { if (tempil2->ic_opcode==IC_REG) { tempi->ic_flags|=tempil2->ic_flags|tempil1->ic_flags; - tempil2->ic_opcode=IC_NOP; - tempil1->ic_opcode=IC_NOP; tempi->p1.reg=tempil2->p1.reg; tempi->p1.disp=tempi->ic_data; tempi->p1.type=TY_DISP+tempi->r.type&IT_MASK; tempi->p1.ptype=tempi->r.ptype; tempi->ic_opcode=IC_MOV; + OptSetNOP1(tempil2); + OptSetNOP1(tempil1); } } break; @@ -225,12 +210,12 @@ U0 OptPass3(CLex *lx,CHashFun *fun_class,COptReg *register_offsets) case IC_DEREF_PP: case IC_DEREF_MM: if (tempi1->ic_opcode==IC_LEA && - tempi1->p1.type&TY_MASK==TY_DISP && - tempi1->p1.reg==CREG_RBP) + tempi1->p1.type&TY_MASK==TY_DISP && + tempi1->p1.reg==CREG_RBP) for (i=0;ip1.disp) { mv[i].lea_balance--; - mv[i].score+=1+tempi->ic_indent_level; + mv[i].score++; break; } tempi->p1.ptype=tempi->r.type&IT_MASK; @@ -258,17 +243,16 @@ U0 OptPass3(CLex *lx,CHashFun *fun_class,COptReg *register_offsets) } if (OptFixupBinaryOp2(&tempi1,&tempi2)) { tempi->ic_flags|=tempi1->ic_flags; - tempi1->ic_opcode=IC_NOP; if (tempi->t.p1t!=tempi2) tempi->t.p1c=tempi->t.p2c; tempi->ic_data=tempi1->ic_data; tempi->ic_opcode=IC_ADD_CONST; tempi->p1.ptype=tempi->r.type&IT_MASK; tempi->p2.type=TY_NULL; + OptSetNOP1(tempi1); if (tempil2->ic_opcode==IC_REG && - tempil2->p1.reg==CREG_RBP) { + tempil2->p1.reg==CREG_RBP) { tempi->ic_flags|=tempil2->ic_flags; - tempil2->ic_opcode=IC_NOP; tempi->ic_opcode=IC_LEA; tempi->p1.reg=CREG_RBP; tempi->p1.type=TY_DISP+tempi->p1.type&IT_MASK; @@ -276,10 +260,11 @@ U0 OptPass3(CLex *lx,CHashFun *fun_class,COptReg *register_offsets) for (i=0;iic_data) { mv[i].lea_balance++; - mv[i].score+=1+tempi->ic_indent_level; + mv[i].score++; break; } - } + OptSetNOP1(tempil2); + } } break; case IC_SUB: @@ -287,12 +272,12 @@ U0 OptPass3(CLex *lx,CHashFun *fun_class,COptReg *register_offsets) CmpF2PushPop(tempi,tempi1,tempi2); break; } - if (tempi2->ic_opcode==IC_IMM) { + if (tempi2->ic_opcode==IC_IMM_U64) { tempi->ic_flags|=tempi2->ic_flags; - tempi2->ic_opcode=IC_NOP; tempi->ic_data=tempi2->ic_data; tempi->ic_opcode=IC_SUB_CONST; tempi->p2.type=TY_NULL; + OptSetNOP1(tempi2); } break; case IC_LESS: @@ -307,7 +292,6 @@ U0 OptPass3(CLex *lx,CHashFun *fun_class,COptReg *register_offsets) case IC_AND_AND: case IC_OR_OR: case IC_XOR_XOR: - case IC_COLON: break; case IC_MUL_EQUAL: @@ -326,15 +310,15 @@ U0 OptPass3(CLex *lx,CHashFun *fun_class,COptReg *register_offsets) case IC_OR_EQUAL: case IC_XOR_EQUAL: if (tempi1->ic_opcode==IC_LEA && - tempi1->p1.type&TY_MASK==TY_DISP && - tempi1->p1.reg==CREG_RBP) + tempi1->p1.type&TY_MASK==TY_DISP && + tempi1->p1.reg==CREG_RBP) for (i=0;ip1.disp) { mv[i].lea_balance--; - mv[i].score+=1+tempi->ic_indent_level; + mv[i].score++; break; } - tempi->p1.ptype=tempi->r.type&IT_MASK; + tempi->p1.ptype=tempi->r.type&IT_MASK; tempi->r.ptype=CmpPType(tempi->t.p1c); break; case IC_RETURN_VAL: @@ -397,11 +381,9 @@ U0 OptPass3(CLex *lx,CHashFun *fun_class,COptReg *register_offsets) case IC_BTS: case IC_BTR: case IC_BTC: - case IC_BEQU: case IC_LBTS: case IC_LBTR: case IC_LBTC: - case IC_LBEQU: case IC_BSF: case IC_BSR: case IC_PREEMPT: @@ -411,8 +393,6 @@ U0 OptPass3(CLex *lx,CHashFun *fun_class,COptReg *register_offsets) case IC_TO_F64: case IC_TO_BOOL: case IC_ABS_I64: - case IC_LIMIT_I64: - case IC_LIMIT_U64: case IC_MIN_I64: case IC_MAX_I64: case IC_MIN_U64: @@ -428,46 +408,36 @@ U0 OptPass3(CLex *lx,CHashFun *fun_class,COptReg *register_offsets) case IC_QUE_INS: case IC_QUE_INS_REV: case IC_QUE_REM: - case IC_MEMCPY: - case IC_MEMSET: - case IC_MEMSET_U16: - case IC_MEMSET_U32: - case IC_MEMSET_U64: - case IC_INU32: - case IC_INU16: - case IC_INU8: + case IC_IN_U32: + case IC_IN_U16: + case IC_IN_U8: case IC_STRLEN: - case IC_OUTU32: - case IC_OUTU16: - case IC_OUTU8: + case IC_OUT_U32: + case IC_OUT_U16: + case IC_OUT_U8: case IC_ASM: break; case IC_NOBOUND_SWITCH: case IC_SWITCH: - lb=tempi->ic_data; - lb=lb->dft; - while (lb->fwd) - lb=lb->fwd; + lb=OptLabelFwd(tempi->ic_data(CCodeBlkMisc *)->dft); lb->flags|=CBMF_USED; break; case IC_BR_ZERO: case IC_BR_NOT_ZERO: - if (tempi1->ic_opcode==IC_IMM || - tempi1->ic_opcode==IC_F64) { - tempi1->ic_opcode=IC_NOP; - tempi->p1.type=TY_NULL; - tempi1->r.type=TY_NULL; - if (code==IC_BR_ZERO ^^ tempi1->ic_data) + if (tempi1->ic_opcode==IC_IMM_U64 || tempi1->ic_opcode==IC_IMM_F64) { + if (code==IC_BR_ZERO ^^ tempi1->ic_data) { + OptSetNOP1(tempi1); + tempi->p1.type=TY_NULL; tempi->ic_opcode=IC_JMP; - else { - tempi->ic_opcode=IC_NOP; - tempi->ic_class=NULL; + } else { + OptSetNOP1(tempi1); + OptSetNOP1(tempi); break; } } goto here1; case IC_BR_AND_ZERO: - if (tempi1->ic_opcode==IC_IMM) { + if (tempi1->ic_opcode==IC_IMM_U64) { i=Bsr(tempi1->ic_data); if (0<=i==Bsf(tempi1->ic_data)) { tempi1->ic_data=i; @@ -476,7 +446,7 @@ U0 OptPass3(CLex *lx,CHashFun *fun_class,COptReg *register_offsets) goto here1; } } - if (tempi2->ic_opcode==IC_IMM) { + if (tempi2->ic_opcode==IC_IMM_U64) { i=Bsr(tempi2->ic_data); if (0<=i==Bsf(tempi2->ic_data)) { tempi2->ic_data=i; @@ -486,7 +456,7 @@ U0 OptPass3(CLex *lx,CHashFun *fun_class,COptReg *register_offsets) } goto here1; case IC_BR_AND_NOT_ZERO: - if (tempi1->ic_opcode==IC_IMM) { + if (tempi1->ic_opcode==IC_IMM_U64) { i=Bsr(tempi1->ic_data); if (0<=i==Bsf(tempi1->ic_data)) { tempi1->ic_data=i; @@ -495,7 +465,7 @@ U0 OptPass3(CLex *lx,CHashFun *fun_class,COptReg *register_offsets) goto here1; } } - if (tempi2->ic_opcode==IC_IMM) { + if (tempi2->ic_opcode==IC_IMM_U64) { i=Bsr(tempi2->ic_data); if (0<=i==Bsf(tempi2->ic_data)) { tempi2->ic_data=i; @@ -507,12 +477,12 @@ U0 OptPass3(CLex *lx,CHashFun *fun_class,COptReg *register_offsets) case IC_BR_MM_ZERO: case IC_BR_MM_NOT_ZERO: if (tempi1->ic_opcode==IC_LEA && - tempi1->p1.type&TY_MASK==TY_DISP && - tempi1->p1.reg==CREG_RBP) + tempi1->p1.type&TY_MASK==TY_DISP && + tempi1->p1.reg==CREG_RBP) for (i=0;ip1.disp) { mv[i].lea_balance--; - mv[i].score+=1+tempi->ic_indent_level; + mv[i].score++; break; } tempi->p1.ptype=CmpType(tempc); @@ -548,19 +518,18 @@ U0 OptPass3(CLex *lx,CHashFun *fun_class,COptReg *register_offsets) case IC_BR_NOT_LBTC: case IC_JMP: here1: - lb=tempi->ic_data; - if (!(tempi->ic_flags&ICF_PUSH_CMP)) - while (lb->fwd) - lb=lb->fwd; + if (tempi->ic_flags&ICF_PUSH_CMP) + lb=tempi->ic_data; + else + lb=OptLabelFwd(tempi->ic_data); lb->flags|=CBMF_USED; break; case IC_LEAVE: case IC_RET: break; case IC_ADDR: - case IC_NOP: + case IC_NOP1: case IC_END: - case IC_QUESTION: case IC_IRQ: case IC_END_EXP: case IC_CALL_END: @@ -570,7 +539,7 @@ here1: case IC_POP_REGS: case IC_LABEL: break; - case IC_NOP1: + case IC_NOP2: ps->ptr+=tempi->ic_data; break; @@ -583,7 +552,7 @@ here1: if (fun_class) { fun_class->used_reg_mask=fun_class->used_reg_mask&~(CREG_VARS_MASK|CREG_NON_PTR_MASK)|used_reg_mask; if (!Bt(&lx->opts,OPTf_NO_REG_VAR) && - !(lx->flags & LF_NO_REG_OPT)) { + !(lx->flags & LF_NO_REG_OPT)) { QSort(mv,member_cnt,sizeof(OptMemberVar),&OptMVCompare); while (member_cnt && !mv[member_cnt-1].score) member_cnt--; @@ -595,7 +564,7 @@ here1: } else { if (mv[i].m->register==CREG_ALLOC) PrintFWarn("%S\n $$LK-A,\"FL:%s,%d\"$$ '%s' in '%s'\n","ST_CANT_REG_VAR", - lx->cur_lfn->name,lx->cur_lfn->line_num,mv[i].m->str,fun_class->str); + lx->cur_lfn->name,lx->cur_lfn->line_num,mv[i].m->str,fun_class->str); } } if (j>0) { @@ -603,12 +572,10 @@ here1: l=0; for (i=0;imember_class; - while (tempc->fwd_class) - tempc=tempc->fwd_class; + tempc=OptClassFwd(tempm->member_class); if (!tempc->ptr_cnt && !tempm->dim.next) { while (lused_reg_mask,to_non_ptr_vars_map[l])) + Bts(&fun_class->used_reg_mask,to_non_ptr_vars_map[l])) l++; if (lregister=to_non_ptr_vars_map[l++]; @@ -616,8 +583,8 @@ here1: register_offsets[tempm->register].m=tempm; if (Bt(&lx->flags,Lf_OPT_TRACE_PRESENT)) "Fun:%s\nReg %Z Var \"%s\" %08X[RBP]\n", - fun_class->str,tempm->register,"ST_U64_REGS", - tempm->str,register_offsets[tempm->register].offset; + fun_class->str,tempm->register,"ST_U64_REGS", + tempm->str,register_offsets[tempm->register].offset; mv[i].offset=0; //flag as reg var } } @@ -626,11 +593,11 @@ here1: l=0; for (i=0;idim.next|| - tempm->offset>0 && StrCmp(tempm->str,"argv"))) { + tempm->offset>0 && StrCmp(tempm->str,"argv"))) { while (lused_reg_mask,to_reg_vars_map[l])) + Bts(&fun_class->used_reg_mask,to_reg_vars_map[l])) l++; if (lregister=to_reg_vars_map[l++]; @@ -638,7 +605,7 @@ here1: register_offsets[tempm->register].m=tempm; if (Bt(&lx->flags,Lf_OPT_TRACE_PRESENT)) "Reg %Z Var \"%s\" %08X[RBP]\n",tempm->register,"ST_U64_REGS", - tempm->str,register_offsets[tempm->register].offset; + tempm->str,register_offsets[tempm->register].offset; } } } diff --git a/TempleOS/Compiler/OptPass4.CPP b/TempleOS/Compiler/OptPass4.CPP index 014765e..9856ab8 100644 --- a/TempleOS/Compiler/OptPass4.CPP +++ b/TempleOS/Compiler/OptPass4.CPP @@ -3,7 +3,7 @@ Bool OptIC4(CIntermediateCode *tempi) I64 i,ty,pt,ty1,pt1; CIntermediateCode *tempil1,*tempil2; - if (tempi->ic_opcodeic_opcodep1.reg)) { tempil1->ic_flags|=tempil2->ic_flags&ICF_NO_CVT_MASK; - tempil2->ic_opcode=IC_NOP; - tempil2->p1.type=TY_NULL+tempil2->p1.type&IT_MASK; - tempil2->r.type=TY_NULL+tempil2->r.type&IT_MASK; tempil1->ic_opcode=IC_LEA; tempil1->p1.type=TY_DISP+tempil1->p1.type&IT_MASK; tempil1->p1.reg=tempil2->p1.reg; tempil1->p1.disp=i; + OptSetNOP1(tempil2); return TRUE; } } else if (tempil2->ic_opcode==IC_SHL_CONST && @@ -36,9 +34,6 @@ Bool OptIC4(CIntermediateCode *tempi) tempil2->p1.reg!=CREG_RSP && 1<=tempil2->ic_data<=3) { tempil1->ic_flags|=tempil2->ic_flags&ICF_NO_CVT_MASK; - tempil2->ic_opcode=IC_NOP; - tempil2->p1.type=TY_NULL+tempil2->p1.type&IT_MASK; - tempil2->r.type=TY_NULL+tempil2->r.type&IT_MASK; tempil1->ic_opcode=IC_LEA; tempil1->p1.type=TY_SIB+tempil1->p1.type&IT_MASK; tempil1->p1.reg=tempil2->p1.reg<<8+CREG_NONE; @@ -49,52 +44,13 @@ Bool OptIC4(CIntermediateCode *tempi) else tempil1->p1.reg|=0xC000; tempil1->p1.disp=i; + OptSetNOP1(tempil2); return TRUE; } } } if (tempil2->ic_opcode==IC_MOV || tempil2->ic_opcode==IC_REG) { - if (tempil1->p3.type&TY_MASK==TY_STK) { - if (tempil2->ic_flags & ICF_R_TO_INT) { - if (tempil2->p1.type&TY_MASK==TY_IMM) - tempil2->p1.disp=tempil2->p1.disp(F64); - else - tempil1->ic_flags|=ICF_P3_TO_INT; - } else if (tempil2->ic_flags&ICF_R_TO_F64) { - if (tempil2->p1.type&TY_MASK==TY_IMM) - tempil2->p1.disp(F64)=tempil2->p1.disp; - else - tempil1->ic_flags|=ICF_P3_TO_F64; - } - - ty=tempil1->p3.type&IT_MASK; - ty1=tempil2->p1.type&IT_MASK; - if (ty1 && ty1r.type&IT_MASK; - if (ty1 && ty1p3.type=tempil2->p1.type&TY_MASK+ty; - - pt=tempil1->p3.ptype; - pt1=tempil2->p1.ptype; - if (pt1 && pt1r.ptype; - if (pt1 && pt1p3.ptype=pt; - - tempil1->p3.reg=tempil2->p1.reg; - tempil1->p3.disp=tempil2->p1.disp; - tempil1->ic_flags|=tempil2->ic_flags&ICF_NO_CVT_MASK; - tempil2->ic_opcode=IC_NOP1; - tempil2->ic_data=1; - tempil2->p1.type=TY_NULL+tempil2->p1.type&IT_MASK; - tempil2->r.type=TY_NULL+tempil2->r.type&IT_MASK; - return TRUE; - } if (tempil1->p2.type&TY_MASK==TY_STK) { if (tempil2->ic_flags & ICF_R_TO_INT) { if (tempil2->p1.type&TY_MASK==TY_IMM) @@ -129,10 +85,7 @@ Bool OptIC4(CIntermediateCode *tempi) tempil1->p2.reg=tempil2->p1.reg; tempil1->p2.disp=tempil2->p1.disp; tempil1->ic_flags|=tempil2->ic_flags&ICF_NO_CVT_MASK; - tempil2->ic_opcode=IC_NOP1; - tempil2->ic_data=1; - tempil2->p1.type=TY_NULL+tempil2->p1.type&IT_MASK; - tempil2->r.type=TY_NULL+tempil2->r.type&IT_MASK; + OptSetNOP2(tempil2); return TRUE; } if (tempil1->p1.type&TY_MASK==TY_STK) { @@ -172,10 +125,7 @@ Bool OptIC4(CIntermediateCode *tempi) tempil1->p1.reg=tempil2->p1.reg; tempil1->p1.disp=tempil2->p1.disp; tempil1->ic_flags|=tempil2->ic_flags&ICF_NO_CVT_MASK; - tempil2->ic_opcode=IC_NOP1; - tempil2->ic_data=1; - tempil2->p1.type=TY_NULL+tempil2->p1.type&IT_MASK; - tempil2->r.type=TY_NULL+tempil2->r.type&IT_MASK; + OptSetNOP2(tempil2); return TRUE; } } @@ -187,25 +137,22 @@ Bool OptIC4(CIntermediateCode *tempi) if (MIN_I32<=i<=MAX_I32 && !Bt(&non_ptr_vars_mask,tempil2->p1.reg)) { tempil1->ic_flags|=tempil2->ic_flags; - tempil2->ic_opcode=IC_NOP1; - tempil2->ic_data=-1; - tempil2->p1.type=TY_NULL+tempil2->p1.type&IT_MASK; - tempil2->r.type=TY_NULL+tempil2->r.type&IT_MASK; tempil1->ic_opcode=IC_MOV; tempil1->p1.type=TY_DISP+tempil1->p1.ptype; tempil1->p1.reg=tempil2->p1.reg; tempil1->p1.disp=i; + OptSetNOP2(tempil2,-1); return TRUE; } } if (tempil2->ic_opcode==IC_LEA && tempil1->p1.type&TY_MASK==TY_STK) { tempil1->ic_flags|=tempil2->ic_flags; - tempil2->ic_opcode=IC_NOP; tempil1->ic_opcode=IC_MOV; tempil1->p1.type=tempil2->p1.type&TY_MASK+tempil1->p1.ptype; tempil1->p1.reg=tempil2->p1.reg; tempil1->p1.disp=tempil2->p1.disp; + OptSetNOP1(tempil2); return TRUE; } } @@ -225,7 +172,7 @@ U0 OptPass4(CLex *lx,COptReg *register_offsets,I64 *_type) { CHashClass *tempc,*tempc1,*tempc2,*tempc3; CIntermediateCode *tempi,*tempi1,*tempi2,*tempi3,*tempil1,*tempil2,*tempil3, - *temp_lag[4]; + *temp_lag[4]; I64 code,i; CPrsStk *ps=OptStart(lx,temp_lag); Bool dead_code=FALSE; @@ -240,7 +187,7 @@ U0 OptPass4(CLex *lx,COptReg *register_offsets,I64 *_type) while (code=tempi->ic_opcode) { OptNext2(tempi,temp_lag); if (dead_code&&code!=IC_LABEL) - tempi->ic_opcode=IC_NOP; + OptSetNOP1(tempi); else { tempc=tempi->ic_class; @@ -269,13 +216,13 @@ U0 OptPass4(CLex *lx,COptReg *register_offsets,I64 *_type) break; } nobound_switch (code) { - case IC_IMM: + case IC_IMM_U64: case IC_TYPE: tempi->p1.type=TY_IMM+IT_I64; tempi->p1.disp=tempi->ic_data; tempi->ic_opcode=IC_MOV; break; - case IC_F64: + case IC_IMM_F64: tempi->p1.type=TY_IMM+IT_I64; tempi->p1.disp=tempi->ic_data; tempi->p1.ptype=IT_F64; @@ -290,14 +237,14 @@ U0 OptPass4(CLex *lx,COptReg *register_offsets,I64 *_type) case IC_RBP: case IC_REG: case IC_COM: - case IC_NATIVE_TYPECAST: + case IC_HOLYC_TYPECAST: case IC_NOT: case IC_UNARY_MINUS: case IC_PUSH_CMP: break; case IC_MOV: if (tempi->p1.type&TY_MASK==TY_DISP && - tempi->p1.reg==CREG_RBP) { + tempi->p1.reg==CREG_RBP) { i=CmpOffset2Reg(tempi->p1.disp,register_offsets); if (i>=0) { tempi->p1.type=TY_REG+tempi->p1.type&IT_MASK; @@ -309,38 +256,36 @@ U0 OptPass4(CLex *lx,COptReg *register_offsets,I64 *_type) case IC_DEREF: if (tempi1->ic_opcode==IC_LEA) { if (tempi1->p1.type&TY_MASK==TY_DISP && - tempi1->p1.reg==CREG_RBP) { + tempi1->p1.reg==CREG_RBP) { i=CmpOffset2Reg(tempi1->p1.disp,register_offsets); if (i>=0) { tempi->ic_flags|=tempi1->ic_flags; - tempi1->ic_opcode=IC_NOP; tempi->ic_opcode=IC_REG; tempi->p1.type=TY_REG+tempi->p1.type&IT_MASK; tempi->p1.reg=i; tempi->p1.disp=0; + OptSetNOP1(tempi1); } } } else if ((tempi1->ic_opcode==IC_ABS_ADDR || - tempi1->ic_opcode==IC_MOV && - tempi1->p1.type==TY_IMM+IT_I64 && - 0<=tempi1->p1.disp<=MAX_I32) && - !(tempi1->ic_flags&ICF_NO_RIP)) { + tempi1->ic_opcode==IC_MOV && + tempi1->p1.type==TY_IMM+IT_I64 && + 0<=tempi1->p1.disp<=MAX_I32) && + !(tempi1->ic_flags&ICF_NO_RIP)) { if (tempi1->ic_opcode==IC_ABS_ADDR) tempi->p1.disp=tempi1->ic_data; else tempi->p1.disp=tempi1->p1.disp; tempi->ic_flags|=tempi1->ic_flags; - tempi1->ic_opcode=IC_NOP; - tempi1->p1.type=TY_NULL+tempi1->p1.type&IT_MASK; - tempi1->r.type=TY_NULL+tempi1->r.type&IT_MASK; tempi->ic_opcode=IC_MOV; tempi->p1.type=TY_RIP_DISP32+tempi->p1.ptype; tempi->p1.reg=CREG_RIP; + OptSetNOP1(tempi1); } break; case IC_BR_MM_ZERO: case IC_BR_MM_NOT_ZERO: - //(branch ++ to zero is unlikely) +//(branch ++ to zero is unlikely) case IC_DEREF_PP: case IC_DEREF_MM: case IC__PP: @@ -349,53 +294,47 @@ U0 OptPass4(CLex *lx,COptReg *register_offsets,I64 *_type) case IC_MM_: if (tempi1->ic_opcode==IC_LEA) { if (tempi1->p1.type&TY_MASK==TY_DISP && - tempi1->p1.reg==CREG_RBP) { + tempi1->p1.reg==CREG_RBP) { i=CmpOffset2Reg(tempi1->p1.disp,register_offsets); if (i>=0) { tempi->ic_flags|=tempi1->ic_flags; - tempi1->ic_opcode=IC_NOP1; - tempi1->ic_data=1; - tempi1->r.type=TY_NULL; tempi->p1.type=TY_REG+tempi->p1.type&IT_MASK; tempi->p1.reg=i; tempi->p1.disp=0; tempi->ic_flags|=ICF_NOT_ADDR; + OptSetNOP2(tempi1); } else goto lea_gone; } else { - lea_gone: +lea_gone: tempi->ic_flags|=tempi1->ic_flags; - tempi1->ic_opcode=IC_NOP1; - tempi1->ic_data=1; - tempi1->r.type=TY_NULL; tempi->p1.type=tempi1->p1.type; tempi->p1.reg=tempi1->p1.reg; tempi->p1.disp=tempi1->p1.disp; tempi->ic_flags|=ICF_NOT_ADDR; + OptSetNOP2(tempi1); } } else if ((tempi1->ic_opcode==IC_ABS_ADDR || - tempi1->ic_opcode==IC_MOV && - tempi1->p1.type==TY_IMM+IT_I64 && - 0<=tempi1->p1.disp<=MAX_I32) && - !(tempi1->ic_flags&ICF_NO_RIP)) { + tempi1->ic_opcode==IC_MOV && + tempi1->p1.type==TY_IMM+IT_I64 && + 0<=tempi1->p1.disp<=MAX_I32) && + !(tempi1->ic_flags&ICF_NO_RIP)) { tempi->ic_flags|=tempi1->ic_flags; if (tempi1->ic_opcode==IC_ABS_ADDR) tempi->p1.disp=tempi1->ic_data; else tempi->p1.disp=tempi1->p1.disp; - tempi1->ic_opcode=IC_NOP; - tempi1->p1.type=TY_NULL+tempi1->p1.type&IT_MASK; - tempi1->r.type=TY_NULL+tempi1->r.type&IT_MASK; tempi->p1.type=TY_RIP_DISP32+tempi->p1.ptype; tempi->p1.reg=CREG_RIP; tempi->ic_flags|=ICF_NOT_ADDR; + OptSetNOP1(tempi1); } break; case IC_ADD: if (tempi1->ic_opcode==IC_MOV && tempi1->p1.type==TY_REG+IT_I64 || - tempi1->ic_opcode==IC_REG) { + tempi1->ic_opcode==IC_REG) { if (tempi2->ic_opcode==IC_MOV && tempi2->p1.type==TY_REG+IT_I64 || - tempi2->ic_opcode==IC_REG) { + tempi2->ic_opcode==IC_REG) { if (tempi2->p1.reg!=CREG_RSP) { tempi->p1.disp=0; tempi->p1.reg=tempi1->p1.reg+tempi2->p1.reg<<8; @@ -404,14 +343,9 @@ U0 OptPass4(CLex *lx,COptReg *register_offsets,I64 *_type) tempi->p1.disp=0; tempi->p1.reg=tempi2->p1.reg+tempi1->p1.reg<<8; sib: - tempi->ic_flags|=tempi1->ic_flags&ICF_NO_CVT_MASK; - tempi1->ic_opcode=IC_NOP1; - tempi1->ic_data=1; - tempi1->p1.type=TY_NULL+tempi1->p1.type&IT_MASK; - tempi1->r.type=TY_NULL+tempi1->r.type&IT_MASK; - - tempi->ic_flags|=tempi2->ic_flags&ICF_NO_CVT_MASK; - tempi2->ic_opcode=IC_NOP; + tempi->ic_flags|=(tempi1->ic_flags|tempi2->ic_flags)&ICF_NO_CVT_MASK; + OptSetNOP2(tempi1); + OptSetNOP1(tempi2); tempi->ic_opcode=IC_LEA; tempi->p1.type=TY_SIB+IT_I64; @@ -420,7 +354,7 @@ sib: tempi->p2.type=TY_NULL+tempi->p2.type&IT_MASK; } } else if (tempi2->ic_opcode==IC_SHL_CONST && tempi2->p1.type==TY_REG+IT_I64 && - tempi2->ic_data<=3) { + tempi2->ic_data<=3) { if (tempi2->p1.reg!=CREG_RSP) { tempi->p1.disp=0; tempi->p1.reg=tempi1->p1.reg+tempi2->p1.reg<<8; @@ -437,7 +371,7 @@ sib: if (tempi1->p1.reg==CREG_RBP && CmpOffset2Reg(tempi1->p1.disp,register_offsets)>=0) break; if (tempi2->ic_opcode==IC_MOV && tempi2->p1.type==TY_REG+IT_I64 || - tempi2->ic_opcode==IC_REG) { + tempi2->ic_opcode==IC_REG) { if (tempi2->p1.reg!=CREG_RSP) { tempi->p1.disp=tempi1->p1.disp; tempi->p1.reg=tempi1->p1.reg+tempi2->p1.reg<<8; @@ -448,7 +382,7 @@ sib: goto sib; } } else if (tempi2->ic_opcode==IC_SHL_CONST && tempi2->p1.type==TY_REG+IT_I64 && - tempi2->ic_data<=3) { + tempi2->ic_data<=3) { if (tempi2->p1.reg!=CREG_RSP) { tempi->p1.disp=tempi1->p1.disp; tempi->p1.reg=tempi1->p1.reg+tempi2->p1.reg<<8; @@ -485,12 +419,11 @@ sib: case IC_AND_AND: case IC_OR_OR: case IC_XOR_XOR: - case IC_COLON: break; case IC_ASSIGN_PP: case IC_ASSIGN_MM: - //this val was stashed during pass012 for pointer arithmetic - tempi->ic_class2=tempi->t.p3c; +//this val was stashed during pass012 for pointer arithmetic + tempi->ic_class2=tempi->t.class2; case IC_ASSIGN: case IC_SHL_EQUAL: case IC_SHR_EQUAL: @@ -508,53 +441,40 @@ sib: i=CmpOffset2Reg(tempi1->p1.disp,register_offsets); if (i>=0) { tempi->ic_flags|=tempi1->ic_flags; - tempi1->ic_opcode=IC_NOP1; - tempi1->ic_data=1; - tempi1->p1.type=TY_NULL; - tempi1->r.type=TY_NULL; tempi->p1.type=TY_REG+tempi->p1.type&IT_MASK; tempi->p1.reg=i; tempi->p1.disp=0; + OptSetNOP2(tempi1); } else { tempi->ic_flags|=tempi1->ic_flags; - tempi1->ic_opcode=IC_NOP1; - tempi1->ic_data=1; - tempi1->r.type=TY_NULL; - tempi1->p1.type=TY_NULL; tempi->p1.type=TY_DISP+tempi->p1.type&IT_MASK; tempi->p1.reg=CREG_RBP; tempi->p1.disp=tempi1->p1.disp; + OptSetNOP2(tempi1); } } else { tempi->p1.type=tempi1->p1.type&TY_MASK+tempi->p1.type&IT_MASK; tempi->ic_flags|=tempi1->ic_flags; - tempi1->ic_opcode=IC_NOP1; - tempi1->ic_data=1; - tempi1->r.type=TY_NULL; - tempi1->p1.type=TY_NULL; tempi->p1.reg=tempi1->p1.reg; tempi->p1.disp=tempi1->p1.disp; + OptSetNOP2(tempi1); } tempi->ic_flags|=ICF_NOT_ADDR; } } else if ((tempi1->ic_opcode==IC_ABS_ADDR || - tempi1->ic_opcode==IC_MOV && - tempi1->p1.type==TY_IMM+IT_I64 && - 0<=tempi1->p1.disp<=MAX_I32) && - !(tempi1->ic_flags&ICF_NO_RIP)) { + tempi1->ic_opcode==IC_MOV && + tempi1->p1.type==TY_IMM+IT_I64 && + 0<=tempi1->p1.disp<=MAX_I32) && + !(tempi1->ic_flags&ICF_NO_RIP)) { tempi->ic_flags|=tempi1->ic_flags; if (tempi1->ic_opcode==IC_ABS_ADDR) tempi->p1.disp=tempi1->ic_data; else tempi->p1.disp=tempi1->p1.disp; - tempi1->ic_opcode=IC_NOP1; - tempi1->ic_data=1; - tempi1->p1.type=TY_NULL+tempi1->p1.type&IT_MASK; - tempi1->r.type=TY_NULL+tempi1->r.type&IT_MASK; - tempi1->r.type=TY_NULL; tempi->p1.type=TY_RIP_DISP32+tempi->p1.type&IT_MASK; tempi->p1.reg=CREG_RIP; tempi->ic_flags|=ICF_NOT_ADDR; + OptSetNOP2(tempi1); } break; case IC_ADD_CONST: @@ -631,8 +551,6 @@ sib: case IC_TAN: case IC_ATAN: case IC_ABS_I64: - case IC_LIMIT_I64: - case IC_LIMIT_U64: case IC_MIN_I64: case IC_MAX_I64: case IC_MIN_U64: @@ -648,26 +566,20 @@ sib: case IC_QUE_INS: case IC_QUE_INS_REV: case IC_QUE_REM: - case IC_MEMCPY: - case IC_MEMSET: - case IC_MEMSET_U16: - case IC_MEMSET_U32: - case IC_MEMSET_U64: - case IC_INU32: - case IC_INU16: - case IC_INU8: + case IC_IN_U32: + case IC_IN_U16: + case IC_IN_U8: case IC_STRLEN: - case IC_OUTU32: - case IC_OUTU16: - case IC_OUTU8: + case IC_OUT_U32: + case IC_OUT_U16: + case IC_OUT_U8: case IC_NOBOUND_SWITCH: case IC_SWITCH: case IC_RET: case IC_END: case IC_ADDR: - case IC_QUESTION: case IC_IRQ: - case IC_NOP: + case IC_NOP1: case IC_CALL_START: case IC_LEAVE: case IC_PUSH_REGS: @@ -697,95 +609,53 @@ sib: case IC_LBTS: case IC_LBTR: case IC_LBTC: - if (tempi2->ic_opcode==IC_ADDR && - !(tempi->ic_flags&ICF_NOT_ADDR)) { - if (tempi2->p1.type&TY_MASK==TY_STK && - tempi2->r.type&TY_MASK==TY_STK) { - if (!(tempil2=OptLag1(tempi2)) || - tempil2->ic_opcode!=IC_ABS_ADDR && - !(tempil2->ic_opcode==IC_MOV && - tempil2->p1.type==TY_IMM+IT_I64 && - 0<=tempil2->p1.disp<=MAX_I32) || - tempil2->ic_flags&ICF_NO_RIP) - tempil2=NULL; - else { - if (tempil2->ic_opcode==IC_ABS_ADDR) - tempi->p2.disp=tempil2->ic_data; - else + if (!(tempi->ic_flags&ICF_NOT_ADDR)) { + if (tempi2->ic_opcode==IC_ADDR) { + if (tempi2->p1.type&TY_MASK==TY_STK && + tempi2->r.type&TY_MASK==TY_STK) { + if (!(tempil2=OptLag1(tempi2)) || + tempil2->ic_opcode!=IC_ABS_ADDR && + !(tempil2->ic_opcode==IC_MOV && + tempil2->p1.type==TY_IMM+IT_I64 && + 0<=tempil2->p1.disp<=MAX_I32) || + tempil2->ic_flags&ICF_NO_RIP) + tempil2=NULL; + else { + if (tempil2->ic_opcode==IC_ABS_ADDR) + tempi->p2.disp=tempil2->ic_data; + else + tempi->p2.disp=tempil2->p1.disp; + } + } else { + if (tempi2->p1.type==TY_IMM+IT_I64 && + 0<=tempi2->p1.disp<=MAX_I32 && + !(tempi2->ic_flags&ICF_NO_RIP)) { + tempil2=tempi2; + tempi2=NULL; tempi->p2.disp=tempil2->p1.disp; + } else + tempil2=NULL; } - } else { - if (tempi2->p1.type==TY_IMM+IT_I64 && + if (tempil2) { + if (tempi2) { + tempi->ic_flags|=tempi2->ic_flags; + OptSetNOP1(tempi2); + } + tempi->ic_flags|=tempil2->ic_flags|ICF_NOT_ADDR; + tempi->p2.type=TY_RIP_DISP32+tempi->p2.type&IT_MASK; + tempi->p2.reg=CREG_RIP; + OptSetNOP1(tempil2); + } + } else if (tempi2->ic_opcode==IC_MOV && + tempi2->r.type&TY_MASK==TY_STK && + tempi2->p1.type==TY_IMM+IT_I64 && 0<=tempi2->p1.disp<=MAX_I32 && !(tempi2->ic_flags&ICF_NO_RIP)) { - tempil2=tempi2; - tempi2=NULL; - tempi->p2.disp=tempil2->p1.disp; - } else - tempil2=NULL; - } - if (tempil2) { - if (tempi2) { - tempi->ic_flags|=tempi2->ic_flags; - tempi2->ic_opcode=IC_NOP; - tempi2->ic_flags=0; - tempi2 ->p1.type=TY_NULL+tempi2 ->p1.type&IT_MASK; - tempi2 ->r .type=TY_NULL+tempi2 ->r .type&IT_MASK; - } - tempi->ic_flags|=tempil2->ic_flags|ICF_NOT_ADDR; - tempil2->ic_opcode=IC_NOP; - tempil2->ic_flags=0; - tempil2->p1.type=TY_NULL+tempil2->p1.type&IT_MASK; - tempil2->r .type=TY_NULL+tempil2->r .type&IT_MASK; + tempi->p2.disp=tempi2->p1.disp; + tempi->ic_flags|=tempi2->ic_flags|ICF_NOT_ADDR; tempi->p2.type=TY_RIP_DISP32+tempi->p2.type&IT_MASK; tempi->p2.reg=CREG_RIP; - } - } - break; - case IC_BEQU: - case IC_LBEQU: - if (tempi3->ic_opcode==IC_ADDR && - !(tempi->ic_flags&ICF_NOT_ADDR)) { - if (tempi3->p1.type&TY_MASK==TY_STK && - tempi3->r.type&TY_MASK==TY_STK) { - if (!(tempil3=OptLag1(tempi3)) || - tempil3->ic_opcode!=IC_ABS_ADDR && - !(tempil3->ic_opcode==IC_MOV && - tempil3->p1.type==TY_IMM+IT_I64 && - 0<=tempil3->p1.disp<=MAX_I32) || - tempil3->ic_flags&ICF_NO_RIP) - tempil3=NULL; - else { - if (tempil3->ic_opcode==IC_ABS_ADDR) - tempi->p3.disp=tempil3->ic_data; - else - tempi->p3.disp=tempil3->p1.disp; - } - } else { - if (tempi3->p1.type==TY_IMM+IT_I64 && - 0<=tempi3->p1.disp<=MAX_I32 && - !(tempi3->ic_flags&ICF_NO_RIP)) { - tempil3=tempi3; - tempi3=NULL; - tempi->p3.disp=tempil3->p1.disp; - } else - tempil3=NULL; - } - if (tempil3) { - if (tempi3) { - tempi->ic_flags|=tempi3->ic_flags; - tempi3->ic_opcode=IC_NOP; - tempi3->ic_flags=0; - tempi3 ->p1.type=TY_NULL+tempi3 ->p1.type&IT_MASK; - tempi3 ->r .type=TY_NULL+tempi3 ->r .type&IT_MASK; - } - tempi->ic_flags|=tempil3->ic_flags|ICF_NOT_ADDR; - tempil3->ic_opcode=IC_NOP; - tempil3->ic_flags=0; - tempil3->p1.type=TY_NULL+tempil3->p1.type&IT_MASK; - tempil3->r .type=TY_NULL+tempil3->r .type&IT_MASK; - tempi->p3.type=TY_RIP_DISP32+tempi->p3.type&IT_MASK; - tempi->p3.reg=CREG_RIP; + OptSetNOP1(tempi2); } } break; @@ -818,7 +688,7 @@ sib: case IC_JMP: dead_code=TRUE; break; - case IC_NOP1: + case IC_NOP2: ps->ptr+=tempi->ic_data; break; case IC_CALL_END2: @@ -827,7 +697,7 @@ sib: case IC_END_EXP: if (tempi->p1.type&TY_MASK==TY_STK) { if (tempil1->r.type&TY_MASK==TY_STK && - !(tempil1->ic_flags&ICF_PUSH_RESULT)) { + !(tempil1->ic_flags&ICF_PUSH_RESULT)) { tempi->p1.type=TY_REG+tempi->p1.type&IT_MASK; tempi->p1.reg=CREG_RAX; tempi->p1.disp=0; diff --git a/TempleOS/Compiler/OptPass5.CPP b/TempleOS/Compiler/OptPass5.CPP index 8ad5100..4212de4 100644 --- a/TempleOS/Compiler/OptPass5.CPP +++ b/TempleOS/Compiler/OptPass5.CPP @@ -8,7 +8,7 @@ U0 OptPass5(CLex *lx) if (tempi->ic_opcode==IC_START) tempi++; while (code=tempi->ic_opcode) { - if (code>IC_NOP1) { + if (code>IC_NOP2) { if (tempi->ic_flags&ICF_TRACE) { if (Bt(&lx->pass_trace_mask,5)) { "%2d:",ps->ptr; @@ -28,50 +28,6 @@ U0 OptPass5(CLex *lx) ps->ptr--; } - if (tempi->p3.type&TY_MASK==TY_STK) { - tempi1=PrsPop(ps); - if (tempi1->ic_opcode==IC_MOV || - tempi1->ic_opcode==IC_REG) { - if (tempi1->ic_flags & ICF_R_TO_INT) { - if (tempi1->p1.type&TY_MASK==TY_IMM) - tempi1->p1.disp=tempi1->p1.disp(F64); - else - tempi->ic_flags|=ICF_P3_TO_INT; - } else if (tempi1->ic_flags&ICF_R_TO_F64) { - if (tempi1->p1.type&TY_MASK==TY_IMM) - tempi1->p1.disp(F64)=tempi1->p1.disp; - else - tempi->ic_flags|=ICF_P3_TO_F64; - } - - ty=tempi->p3.type&IT_MASK; - ty1=tempi1->p1.type&IT_MASK; - if (ty1 && ty1r.type&IT_MASK; - if (ty1 && ty1p3.type=tempi1->p1.type&TY_MASK+ty; - - pt=tempi->p3.ptype; - pt1=tempi1->p1.ptype; - if (pt1 && pt1r.ptype; - if (pt1 && pt1p3.ptype=pt; - - tempi->p3.reg=tempi1->p1.reg; - tempi->p3.disp=tempi1->p1.disp; - tempi->ic_flags|=tempi1->ic_flags&ICF_NO_CVT_MASK; - tempi1->ic_opcode=IC_NOP1; - tempi1->ic_data=1; - tempi1->p1.type=TY_NULL+tempi1->p1.type&IT_MASK; - tempi1->r.type=TY_NULL+tempi1->r.type&IT_MASK; - } - } - if (tempi->p2.type&TY_MASK==TY_STK) { tempi1=PrsPop(ps); if (tempi1->ic_opcode==IC_MOV || @@ -109,10 +65,7 @@ U0 OptPass5(CLex *lx) tempi->p2.reg=tempi1->p1.reg; tempi->p2.disp=tempi1->p1.disp; tempi->ic_flags|=tempi1->ic_flags&ICF_NO_CVT_MASK; - tempi1->ic_opcode=IC_NOP1; - tempi1->ic_data=1; - tempi1->p1.type=TY_NULL+tempi1->p1.type&IT_MASK; - tempi1->r.type=TY_NULL+tempi1->r.type&IT_MASK; + OptSetNOP2(tempi1); } } @@ -156,10 +109,7 @@ U0 OptPass5(CLex *lx) tempi->p1.reg=tempi1->p1.reg; tempi->p1.disp=tempi1->p1.disp; tempi->ic_flags|=tempi1->ic_flags&ICF_NO_CVT_MASK; - tempi1->ic_opcode=IC_NOP1; - tempi1->ic_data=1; - tempi1->p1.type=TY_NULL+tempi1->p1.type&IT_MASK; - tempi1->r.type=TY_NULL+tempi1->r.type&IT_MASK; + OptSetNOP2(tempi1); } } if (tempi->r.type&TY_MASK==TY_STK) diff --git a/TempleOS/Compiler/OptPass6.CPP b/TempleOS/Compiler/OptPass6.CPP index 55586ad..d1d9420 100644 --- a/TempleOS/Compiler/OptPass6.CPP +++ b/TempleOS/Compiler/OptPass6.CPP @@ -1,7 +1,7 @@ Bool OptIC6(CIntermediateCode *tempi) { CIntermediateCode *tempil1,*tempil2; - if (tempi->ic_opcodeic_opcodep1.type&TY_MASK==TY_REG) { tempil1->ic_flags= tempil1->ic_flags & ~ICF_P1_WAS_STK | tempil2->ic_flags; - tempil2->ic_opcode=IC_NOP1; - tempil2->p1.type=TY_NULL+tempil2->p1.type&IT_MASK; - tempil2->r.type=TY_NULL+tempil2->r.type&IT_MASK; tempil1->ic_opcode=IC_MOV; tempil1->p1.type=TY_DISP+tempil1->p1.ptype; tempil1->p1.reg=tempil2->p1.reg; tempil1->p1.disp=tempil2->ic_data; - tempil2->ic_data=-1; + OptSetNOP2(tempil2,-1); return TRUE; } else { tempil2->ic_opcode=IC_MOV; @@ -41,7 +38,7 @@ U0 OptPass6Lag(CLex *lx, I64 i=*i_,j,k,l,code,clobbered_reg_mask=*_clobbered_reg_mask; CHashFun *tempf; code=tempi->ic_opcode; - if (code<=IC_NOP1) + if (code<=IC_NOP2) return; else { if (tempi->ic_flags&ICF_TRACE) { @@ -85,18 +82,6 @@ U0 OptPass6Lag(CLex *lx, } if (cmp_arg_cnt[code]==9) i-=tempi->ic_data>>3; - if (tempi->p3.type&TY_MASK==TY_STK) { - i--; - if (ip3.type=TY_REG+tempi->p3.type&IT_MASK; - if (fun_num&1) - tempi->p3.reg=to_stk_temps_map_odd[i]; - else - tempi->p3.reg=to_stk_temps_map_even[i]; - tempi->p3.disp=0; - } - } - if (tempi->p2.type&TY_MASK==TY_STK) { i--; if (iopts,OPTf_NO_REG_VAR) || - lx->flags&LF_NO_REG_OPT) + lx->flags&LF_NO_REG_OPT) num_stk=0; else num_stk=num_stk_temps; @@ -167,9 +152,9 @@ U0 OptPass6(CLex *lx,CHashFun *fun_class) OptNext3(tempi,temp_lag); tempil1=temp_lag[1]; if (tempil1->ic_opcode==IC_END_EXP) { - if (code!=IC_RETURN_VAL2 && code!=IC_NOP) { + if (code!=IC_RETURN_VAL2 && code!=IC_NOP1) { if (!(temp_lag[2]->ic_flags& - (ICF_R_TO_F64|ICF_R_TO_INT|ICF_PUSH_RESULT|ICF_DEPEND_RESULT))) { + (ICF_R_TO_F64|ICF_R_TO_INT|ICF_PUSH_RESULT|ICF_DEPEND_RESULT))) { temp_lag[2]->ic_flags|=ICF_NO_DEPEND_RESULT; temp_lag[2]->r.type=TY_NULL+temp_lag[2]->r.type&IT_MASK; tempil1->ic_flags|=ICF_NO_DEPEND_RESULT; @@ -177,69 +162,55 @@ U0 OptPass6(CLex *lx,CHashFun *fun_class) } } } - if (code<=IC_NOP1) { - } else { - if (tempi->p3.type&TY_MASK) { - if (tempi->p3.type&TY_MASK==TY_STK) { - if (tempil1->r.type&TY_MASK==TY_STK && + if (code<=IC_NOP2) { + } else { + if (tempi->p2.type&TY_MASK==TY_STK) { + if (tempil1->r.type&TY_MASK==TY_STK && !(tempil1->ic_flags&ICF_PUSH_RESULT)) { - tempi->p3.type=TY_REG+tempi->p3.type&IT_MASK; - tempi->p3.reg=CREG_RAX; - tempi->p3.disp=0; - tempil1->r.type=TY_REG+tempil1->r.type&IT_MASK; - tempil1->r.reg=CREG_RAX; - tempil1->r.disp=0; - } - } - } else { - if (tempi->p2.type&TY_MASK==TY_STK) { - if (tempil1->r.type&TY_MASK==TY_STK && - !(tempil1->ic_flags&ICF_PUSH_RESULT)) { - tempif2=NULL; - if (tempi->ic_opcode==IC_ASSIGN && + tempif2=NULL; + if (tempi->ic_opcode==IC_ASSIGN && tempi->ic_flags&ICF_NOT_ADDR && tempil1->ic_opcode!=IC_CALL_END && tempil1->ic_opcode!=IC_CALL_END2 && tempil1->ic_opcode!=IC_SET_RAX && !(tempi->ic_flags& - (ICF_P2_TO_F64|ICF_P2_TO_INT)) && + (ICF_P2_TO_F64|ICF_P2_TO_INT)) && !(tempil1->ic_flags& - (ICF_R_TO_F64|ICF_R_TO_INT))) { - if (tempif1=OptLead1(lx,tempi)) //predict NO_DEPEND - if (tempif2=OptLead1(lx,tempif1)) - if (tempif1->ic_opcode==IC_END_EXP && + (ICF_R_TO_F64|ICF_R_TO_INT))) { + if (tempif1=OptLead1(lx,tempi)) //predict NO_DEPEND + if (tempif2=OptLead1(lx,tempif1)) + if (tempif1->ic_opcode==IC_END_EXP && tempif2->ic_opcode!=IC_RETURN_VAL2) { - tempi->ic_opcode=IC_NOP; - tempil1->r.type =tempi->p1.type&TY_MASK+tempi->p1.ptype; - tempil1->r.ptype=tempi->p1.ptype; - tempil1->r.reg =tempi->p1.reg; - tempil1->r.disp =tempi->p1.disp; - tempil1->ic_flags=tempil1->ic_flags&~(ICF_NO_DEPEND_RESULT|ICF_R_WAS_STK)| + tempil1->r.type =tempi->p1.type&TY_MASK+tempi->p1.ptype; + tempil1->r.ptype=tempi->p1.ptype; + tempil1->r.reg =tempi->p1.reg; + tempil1->r.disp =tempi->p1.disp; + tempil1->ic_flags=tempil1->ic_flags&~(ICF_NO_DEPEND_RESULT|ICF_R_WAS_STK)| tempi->ic_flags&~(ICF_NOT_ADDR|ICF_P1_WAS_STK|ICF_P2_WAS_STK)|ICF_DEPEND_RESULT; - old_tempil1=NULL; - } else - tempif2=NULL; - } - if (!tempif2) { - tempi->p2.type=TY_REG+tempi->p2.type&IT_MASK; - tempi->p2.reg=CREG_RAX; - tempi->p2.disp=0; - tempil1->r.type=TY_REG+tempil1->r.type&IT_MASK; - tempil1->r.reg=CREG_RAX; - tempil1->r.disp=0; - } + old_tempil1=NULL; + OptSetNOP1(tempi); + } else + tempif2=NULL; } - } else if (tempi->p1.type&TY_MASK==TY_STK) { - if (tempil1->r.type&TY_MASK==TY_STK && - !(tempil1->ic_flags&ICF_PUSH_RESULT)) { - tempi->p1.type=TY_REG+tempi->p1.type&IT_MASK; - tempi->p1.reg=CREG_RAX; - tempi->p1.disp=0; + if (!tempif2) { + tempi->p2.type=TY_REG+tempi->p2.type&IT_MASK; + tempi->p2.reg=CREG_RAX; + tempi->p2.disp=0; tempil1->r.type=TY_REG+tempil1->r.type&IT_MASK; tempil1->r.reg=CREG_RAX; tempil1->r.disp=0; } } + } else if (tempi->p1.type&TY_MASK==TY_STK) { + if (tempil1->r.type&TY_MASK==TY_STK && + !(tempil1->ic_flags&ICF_PUSH_RESULT)) { + tempi->p1.type=TY_REG+tempi->p1.type&IT_MASK; + tempi->p1.reg=CREG_RAX; + tempi->p1.disp=0; + tempil1->r.type=TY_REG+tempil1->r.type&IT_MASK; + tempil1->r.reg=CREG_RAX; + tempil1->r.disp=0; + } } if (tempi->ic_flags & ICF_PUSH_RESULT) tempi->r.type==TY_STK+tempi->r.type&IT_MASK; @@ -258,9 +229,9 @@ U0 OptPass6(CLex *lx,CHashFun *fun_class) fun_class->used_reg_mask|=clobbered_reg_mask; fun_class->clobbered_reg_mask=clobbered_reg_mask; if (Bt(&lx->flags,Lf_OPT_TRACE_PRESENT) && - Bt(&lx->pass_trace_mask,6)) { - "Used Reg Mask:%04X\n",fun_class->used_reg_mask; - "Clobbered Reg Mask:%04X\n",clobbered_reg_mask; + Bt(&lx->pass_trace_mask,6)) { + "Used Reg Mask:%04X\n",fun_class->used_reg_mask; + "Clobbered Reg Mask:%04X\n",clobbered_reg_mask; } } } diff --git a/TempleOS/Compiler/OptPass789A.CPP b/TempleOS/Compiler/OptPass789A.CPP index 0bbd437..ce38c38 100644 --- a/TempleOS/Compiler/OptPass789A.CPP +++ b/TempleOS/Compiler/OptPass789A.CPP @@ -30,8 +30,8 @@ I64 OptPass789A(CLex *lx,CHashFun *fun_class, dbg=NULL; if (Bt(&lx->flags,Lf_OPT_TRACE_PRESENT) && - Bt(&lx->pass_trace_mask,lx->pass)) - "$$BK,1$$$$FG,LTRED$$$$IV,1$$This code gets merged together and patched.\n$$FG$$$$IV,0$$$$BK,0$$"; + Bt(&lx->pass_trace_mask,lx->pass)) + "$$BK,1$$$$FG,LTRED$$$$IV,1$$This code gets merged together and patched.\n$$FG$$$$IV,0$$$$BK,0$$"; lx->last_float_op_ic=NULL; @@ -58,11 +58,9 @@ I64 OptPass789A(CLex *lx,CHashFun *fun_class, lx->dont_push_float=Btr(&tempi->ic_flags,ICf_DONT_PUSH_FLOAT0); } MemCpy(saved_p123,&tempi->p1,3*sizeof(CICArg)); - if (cmp_arg_cnt[code]==2) { - if (tempi->p1.type&TY_MASK==TY_REG && + if (cmp_arg_cnt[code]==2 && tempi->p1.type&TY_MASK==TY_REG && tempi->p1.reg==CREG_RAX) - tempi->ic_flags|=ICF_P1_FIRST; - } + tempi->ic_flags|=ICF_P1_FIRST; tempi->ic_cnt=0; tempi->ic_last_cnt=-1; if (tempi->ic_flags & ICF_P1_FIRST) { @@ -85,7 +83,7 @@ I64 OptPass789A(CLex *lx,CHashFun *fun_class, if (tempi->ic_flags & ICF_P2_TO_F64) { if (tempi->ic_flags&ICF_P1_FIRST) { ICMov(tempi,TY_REG+IT_I64,CREG_RDX,0, - tempi->p1.type,tempi->p1.reg,tempi->p1.disp,ip2); + tempi->p1.type,tempi->p1.reg,tempi->p1.disp,ip2); tempi->p1.type=TY_REG+IT_I64; tempi->p1.reg=CREG_RDX; tempi->p1.disp=0; @@ -98,7 +96,7 @@ I64 OptPass789A(CLex *lx,CHashFun *fun_class, } else if (tempi->ic_flags & ICF_P2_TO_INT) { if (tempi->ic_flags&ICF_P1_FIRST) { ICMov(tempi,TY_REG+IT_I64,CREG_RDX,0, - tempi->p1.type,tempi->p1.reg,tempi->p1.disp,ip2); + tempi->p1.type,tempi->p1.reg,tempi->p1.disp,ip2); tempi->p1.type=TY_REG+IT_I64; tempi->p1.reg=CREG_RDX; tempi->p1.disp=0; @@ -111,90 +109,30 @@ I64 OptPass789A(CLex *lx,CHashFun *fun_class, } } } else { - if (tempi->p3.type&TY_MASK) { - if (tempi->ic_flags & ICF_P3_TO_F64) { - ICFCvt(lx,tempi,CREG_RAX,tempi->p3.type,tempi->p3.reg,tempi->p3.disp,FALSE,CN_P3,ip2); - tempi->p3.type=TY_REG+IT_I64; - tempi->p3.reg=CREG_RAX; - tempi->p3.disp=0; - } else if (tempi->ic_flags & ICF_P3_TO_INT) { - ICFCvt(lx,tempi,CREG_RAX,tempi->p3.type,tempi->p3.reg,tempi->p3.disp,TRUE,CN_P3,ip2); - tempi->p3.type=TY_REG+IT_I64; - tempi->p3.reg=CREG_RAX; - tempi->p3.disp=0; + if (tempi->p2.type&TY_MASK) { + if (tempi->ic_flags & ICF_P2_TO_F64) { + ICFCvt(lx,tempi,CREG_RAX,tempi->p2.type,tempi->p2.reg,tempi->p2.disp,FALSE,CN_P2,ip2); + tempi->p2.type=TY_REG+IT_I64; + tempi->p2.reg=CREG_RAX; + tempi->p2.disp=0; + } else if (tempi->ic_flags & ICF_P2_TO_INT) { + ICFCvt(lx,tempi,CREG_RAX,tempi->p2.type,tempi->p2.reg,tempi->p2.disp,TRUE,CN_P2,ip2); + tempi->p2.type=TY_REG+IT_I64; + tempi->p2.reg=CREG_RAX; + tempi->p2.disp=0; } - if (tempi->ic_flags & (ICF_P3_TO_F64 | ICF_P3_TO_INT)) { - if (tempi->p2.type&TY_MASK) { - if (tempi->ic_flags & ICF_P2_TO_F64) { - ICFCvt(lx,tempi,CREG_RDX,tempi->p2.type,tempi->p2.reg,tempi->p2.disp,FALSE,CN_P2,ip2); - tempi->p2.type=TY_REG+IT_I64; - tempi->p2.reg=CREG_RDX; - tempi->p2.disp=0; - } else if (tempi->ic_flags & ICF_P2_TO_INT) { - ICFCvt(lx,tempi,CREG_RDX,tempi->p2.type,tempi->p2.reg,tempi->p2.disp,TRUE,CN_P2,ip2); - tempi->p2.type=TY_REG+IT_I64; - tempi->p2.reg=CREG_RDX; - tempi->p2.disp=0; - } - } - if (tempi->ic_flags & (ICF_P2_TO_F64 | ICF_P2_TO_INT)) { - if (tempi->p1.type&TY_MASK) { //TODO: RCX might cause problems - if (tempi->ic_flags & ICF_P1_TO_F64) { - ICFCvt(lx,tempi,CREG_RCX,tempi->p1.type,tempi->p1.reg,tempi->p1.disp,FALSE,CN_P1,ip2); - tempi->p1.type=TY_REG+IT_I64; - tempi->p1.reg=CREG_RCX; - tempi->p1.disp=0; - } else if (tempi->ic_flags & ICF_P1_TO_INT) { - ICFCvt(lx,tempi,CREG_RCX,tempi->p1.type,tempi->p1.reg,tempi->p1.disp,TRUE,CN_P1,ip2); - tempi->p1.type=TY_REG+IT_I64; - tempi->p1.reg=CREG_RCX; - tempi->p1.disp=0; - } - } - } else { - if (tempi->p1.type&TY_MASK) { - if (tempi->ic_flags & ICF_P1_TO_F64) { - ICFCvt(lx,tempi,CREG_RDX,tempi->p1.type,tempi->p1.reg,tempi->p1.disp,FALSE,CN_P1,ip2); - tempi->p1.type=TY_REG+IT_I64; - tempi->p1.reg=CREG_RDX; - tempi->p1.disp=0; - } else if (tempi->ic_flags & ICF_P1_TO_INT) { - ICFCvt(lx,tempi,CREG_RDX,tempi->p1.type,tempi->p1.reg,tempi->p1.disp,TRUE,CN_P1,ip2); - tempi->p1.type=TY_REG+IT_I64; - tempi->p1.reg=CREG_RDX; - tempi->p1.disp=0; - } - } - } - } else - goto p2_RAX_p1_RDX; - } else { - p2_RAX_p1_RDX: - if (tempi->p2.type&TY_MASK) { - if (tempi->ic_flags & ICF_P2_TO_F64) { - ICFCvt(lx,tempi,CREG_RAX,tempi->p2.type,tempi->p2.reg,tempi->p2.disp,FALSE,CN_P2,ip2); - tempi->p2.type=TY_REG+IT_I64; - tempi->p2.reg=CREG_RAX; - tempi->p2.disp=0; - } else if (tempi->ic_flags & ICF_P2_TO_INT) { - ICFCvt(lx,tempi,CREG_RAX,tempi->p2.type,tempi->p2.reg,tempi->p2.disp,TRUE,CN_P2,ip2); - tempi->p2.type=TY_REG+IT_I64; - tempi->p2.reg=CREG_RAX; - tempi->p2.disp=0; - } - } - if (tempi->p1.type&TY_MASK) { - if (tempi->ic_flags & ICF_P1_TO_F64) { - ICFCvt(lx,tempi,CREG_RDX,tempi->p1.type,tempi->p1.reg,tempi->p1.disp,FALSE,CN_P1,ip2); - tempi->p1.type=TY_REG+IT_I64; - tempi->p1.reg=CREG_RDX; - tempi->p1.disp=0; - } else if (tempi->ic_flags & ICF_P1_TO_INT) { - ICFCvt(lx,tempi,CREG_RDX,tempi->p1.type,tempi->p1.reg,tempi->p1.disp,TRUE,CN_P1,ip2); - tempi->p1.type=TY_REG+IT_I64; - tempi->p1.reg=CREG_RDX; - tempi->p1.disp=0; - } + } + if (tempi->p1.type&TY_MASK) { + if (tempi->ic_flags & ICF_P1_TO_F64) { + ICFCvt(lx,tempi,CREG_RDX,tempi->p1.type,tempi->p1.reg,tempi->p1.disp,FALSE,CN_P1,ip2); + tempi->p1.type=TY_REG+IT_I64; + tempi->p1.reg=CREG_RDX; + tempi->p1.disp=0; + } else if (tempi->ic_flags & ICF_P1_TO_INT) { + ICFCvt(lx,tempi,CREG_RDX,tempi->p1.type,tempi->p1.reg,tempi->p1.disp,TRUE,CN_P1,ip2); + tempi->p1.type=TY_REG+IT_I64; + tempi->p1.reg=CREG_RDX; + tempi->p1.disp=0; } } } @@ -203,7 +141,7 @@ I64 OptPass789A(CLex *lx,CHashFun *fun_class, ICU16(tempi,0xB848); ICU64(tempi,tempi->ic_data); if (buf && lx->flags&LF_AOT_COMPILE && - !(lx->flags&(LF_NO_ABSS|LF_ASM_EXPRESSIONS))) { + !(lx->flags&(LF_NO_ABSS|LF_ASM_EXPRESSIONS))) { tempa=CAlloc(sizeof(CExeAbsAddr)); tempa->next=a->abss; tempa->type=EAA_ADD_U64; @@ -211,7 +149,7 @@ I64 OptPass789A(CLex *lx,CHashFun *fun_class, tempa->ip=ip2+tempi->ic_cnt-8; } ICMov(tempi,tempi->r.type,tempi->r.reg,tempi->r.disp, - TY_REG+IT_I64,CREG_RAX,0,ip2); + TY_REG+IT_I64,CREG_RAX,0,ip2); tempi->ic_flags&=~ICF_CODE_FINAL; break; case IC_HEAP_GLBL: @@ -219,14 +157,14 @@ I64 OptPass789A(CLex *lx,CHashFun *fun_class, ICU64(tempi,0); temphg=tempi->ic_data; if (buf && lx->flags&LF_AOT_COMPILE && - !(lx->flags&(LF_NO_ABSS|LF_ASM_EXPRESSIONS))) { //is this necessary--flags? + !(lx->flags&(LF_NO_ABSS|LF_ASM_EXPRESSIONS))) { //is this necessary--flags? temphgr=CAlloc(sizeof(CExeHeapGlblRef)); temphgr->next=temphg->references; temphg->references=temphgr; temphgr->ip=ip2+tempi->ic_cnt-8; } ICMov(tempi,tempi->r.type,tempi->r.reg,tempi->r.disp, - TY_REG+IT_I64,CREG_RAX,0,ip2); + TY_REG+IT_I64,CREG_RAX,0,ip2); tempi->ic_flags&=~ICF_CODE_FINAL; break; case IC_ADDR_IMPORT: @@ -242,7 +180,7 @@ I64 OptPass789A(CLex *lx,CHashFun *fun_class, } ICU24(tempi,0xC06348); ICMov(tempi,tempi->r.type,tempi->r.reg,tempi->r.disp, - TY_REG+IT_I64,CREG_RAX,0,ip2); + TY_REG+IT_I64,CREG_RAX,0,ip2); tempi->ic_flags&=~ICF_CODE_FINAL; break; case IC_STR_CONST: @@ -253,7 +191,7 @@ I64 OptPass789A(CLex *lx,CHashFun *fun_class, else i=lb->addr+buf; ICLea(tempi,tempi->r.type,tempi->r.reg,tempi->r.disp, - TY_RIP_DISP32+IT_PTR,0,i,lx,buf,ip2); + TY_RIP_DISP32+IT_PTR,0,i,lx,buf,ip2); tempi->ic_flags&=~ICF_CODE_FINAL; break; case IC_ASM: @@ -283,16 +221,16 @@ I64 OptPass789A(CLex *lx,CHashFun *fun_class, case IC_MOV_FS: ICZero(tempi,CREG_RAX); ICU8(tempi,0x64); - //It's ugly to use ic_class here +//It's ugly to use ic_class here ICMov(tempi,tempi->r.type,tempi->r.reg,tempi->r.disp, - TY_DISP+CmpType(tempi->ic_class),CREG_RAX,tempi->ic_data,ip2); + TY_DISP+CmpType(tempi->ic_class),CREG_RAX,tempi->ic_data,ip2); break; case IC_MOV_GS: ICZero(tempi,CREG_RAX); ICU8(tempi,0x65); - //It's ugly to use ic_class here +//It's ugly to use ic_class here ICMov(tempi,tempi->r.type,tempi->r.reg,tempi->r.disp, - TY_DISP+CmpType(tempi->ic_class),CREG_RAX,tempi->ic_data,ip2); + TY_DISP+CmpType(tempi->ic_class),CREG_RAX,tempi->ic_data,ip2); break; case IC_RIP: ICU16(tempi,0xB848); @@ -305,12 +243,12 @@ I64 OptPass789A(CLex *lx,CHashFun *fun_class, tempa->ip=ip2+tempi->ic_cnt-8; } ICMov(tempi,tempi->r.type,tempi->r.reg,tempi->r.disp, - TY_REG+IT_I64,CREG_RAX,0,ip2); + TY_REG+IT_I64,CREG_RAX,0,ip2); tempi->ic_flags&=~ICF_CODE_FINAL; break; - case IC_NATIVE_TYPECAST: + case IC_HOLYC_TYPECAST: ICMov(tempi,tempi->r.type,tempi->r.reg,tempi->r.disp, - tempi->p1.type,tempi->p1.reg,tempi->p1.disp,ip2); + tempi->p1.type,tempi->p1.reg,tempi->p1.disp,ip2); break; case IC_COM: ICUnaries(tempi,SLASH_OP_NOT,ip2); @@ -327,7 +265,7 @@ I64 OptPass789A(CLex *lx,CHashFun *fun_class, case IC_ADDR: case IC_MOV: ICMov(tempi,tempi->r.type,tempi->r.reg,tempi->r.disp, - tempi->p1.type,tempi->p1.reg,tempi->p1.disp,ip2); + tempi->p1.type,tempi->p1.reg,tempi->p1.disp,ip2); break; case IC_DEREF: ICDeref(tempi,ip2); @@ -364,20 +302,20 @@ I64 OptPass789A(CLex *lx,CHashFun *fun_class, break; case IC_LEA: ICLea(tempi,tempi->r.type,tempi->r.reg,tempi->r.disp, - tempi->p1.type,tempi->p1.reg,tempi->p1.disp,lx,buf,ip2); + tempi->p1.type,tempi->p1.reg,tempi->p1.disp,lx,buf,ip2); break; case IC_POWER: ICFPow(lx,tempi,buf,ip2); break; case IC_SHL: ICShift(tempi,tempi->r.type,tempi->r.reg,tempi->r.disp, - tempi->p1.type,tempi->p1.reg,tempi->p1.disp, - tempi->p2.type,tempi->p2.reg,tempi->p2.disp,0xE0D1E0D3E0C1,0xE0D1E0D3E0C1,ip2); + tempi->p1.type,tempi->p1.reg,tempi->p1.disp, + tempi->p2.type,tempi->p2.reg,tempi->p2.disp,0xE0D1E0D3E0C1,0xE0D1E0D3E0C1,ip2); break; case IC_SHR: ICShift(tempi,tempi->r.type,tempi->r.reg,tempi->r.disp, - tempi->p1.type,tempi->p1.reg,tempi->p1.disp, - tempi->p2.type,tempi->p2.reg,tempi->p2.disp,0xE8D1E8D3E8C1,0xF8D1F8D3F8C1,ip2); + tempi->p1.type,tempi->p1.reg,tempi->p1.disp, + tempi->p2.type,tempi->p2.reg,tempi->p2.disp,0xE8D1E8D3E8C1,0xF8D1F8D3F8C1,ip2); break; case IC_MUL: if (tempi->ic_flags&ICF_USE_INT) @@ -399,32 +337,32 @@ I64 OptPass789A(CLex *lx,CHashFun *fun_class, break; case IC_AND: ICAddEct(tempi,tempi->r.type,tempi->r.reg,tempi->r.disp, - tempi->p1.type,tempi->p1.reg,tempi->p1.disp, - tempi->p2.type,tempi->p2.reg,tempi->p2.disp,0x23,ip2); + tempi->p1.type,tempi->p1.reg,tempi->p1.disp, + tempi->p2.type,tempi->p2.reg,tempi->p2.disp,0x23,ip2); break; case IC_OR: ICAddEct(tempi,tempi->r.type,tempi->r.reg,tempi->r.disp, - tempi->p1.type,tempi->p1.reg,tempi->p1.disp, - tempi->p2.type,tempi->p2.reg,tempi->p2.disp,0x0B,ip2); + tempi->p1.type,tempi->p1.reg,tempi->p1.disp, + tempi->p2.type,tempi->p2.reg,tempi->p2.disp,0x0B,ip2); break; case IC_XOR: ICAddEct(tempi,tempi->r.type,tempi->r.reg,tempi->r.disp, - tempi->p1.type,tempi->p1.reg,tempi->p1.disp, - tempi->p2.type,tempi->p2.reg,tempi->p2.disp,0x33,ip2); + tempi->p1.type,tempi->p1.reg,tempi->p1.disp, + tempi->p2.type,tempi->p2.reg,tempi->p2.disp,0x33,ip2); break; case IC_ADD: if (tempi->ic_flags&ICF_USE_INT) ICAddEct(tempi,tempi->r.type,tempi->r.reg,tempi->r.disp, - tempi->p1.type,tempi->p1.reg,tempi->p1.disp, - tempi->p2.type,tempi->p2.reg,tempi->p2.disp,0x03,ip2); + tempi->p1.type,tempi->p1.reg,tempi->p1.disp, + tempi->p2.type,tempi->p2.reg,tempi->p2.disp,0x03,ip2); else ICFAdd(lx,tempi,buf,ip2); break; case IC_SUB: if (tempi->ic_flags&ICF_USE_INT) ICSub(tempi,tempi->r.type,tempi->r.reg,tempi->r.disp, - tempi->p1.type,tempi->p1.reg,tempi->p1.disp, - tempi->p2.type,tempi->p2.reg,tempi->p2.disp,ip2); + tempi->p1.type,tempi->p1.reg,tempi->p1.disp, + tempi->p2.type,tempi->p2.reg,tempi->p2.disp,ip2); else ICFSub(lx,tempi,buf,ip2); break; @@ -467,9 +405,6 @@ I64 OptPass789A(CLex *lx,CHashFun *fun_class, case IC_XOR_XOR: ICXorXor(tempi,ip2); break; - case IC_COLON: - ICColon(tempi,ip2); - break; case IC_ASSIGN: ICAssign(tempi,ip2); break; @@ -481,15 +416,15 @@ I64 OptPass789A(CLex *lx,CHashFun *fun_class, break; case IC_SHL_EQUAL: ICShiftEqual(tempi,tempi->p1.ptype, - tempi->r.type,tempi->r.reg,tempi->r.disp, - tempi->p1.type,tempi->p1.reg,tempi->p1.disp, - tempi->p2.type,tempi->p2.reg,tempi->p2.disp,0xE0D1E0D3E0C1,0xE0D1E0D3E0C1,ip2); + tempi->r.type,tempi->r.reg,tempi->r.disp, + tempi->p1.type,tempi->p1.reg,tempi->p1.disp, + tempi->p2.type,tempi->p2.reg,tempi->p2.disp,0xE0D1E0D3E0C1,0xE0D1E0D3E0C1,ip2); break; case IC_SHR_EQUAL: ICShiftEqual(tempi,tempi->p1.ptype, - tempi->r.type,tempi->r.reg,tempi->r.disp, - tempi->p1.type,tempi->p1.reg,tempi->p1.disp, - tempi->p2.type,tempi->p2.reg,tempi->p2.disp,0xE8D1E8D3E8C1,0xF8D1F8D3F8C1,ip2); + tempi->r.type,tempi->r.reg,tempi->r.disp, + tempi->p1.type,tempi->p1.reg,tempi->p1.disp, + tempi->p2.type,tempi->p2.reg,tempi->p2.disp,0xE8D1E8D3E8C1,0xF8D1F8D3F8C1,ip2); break; case IC_MUL_EQUAL: if (tempi->ic_flags&ICF_USE_INT) @@ -521,38 +456,38 @@ I64 OptPass789A(CLex *lx,CHashFun *fun_class, case IC_ADD_EQUAL: if (tempi->ic_flags&ICF_USE_INT) ICAddSubEctEqual(tempi,tempi->p1.ptype, - tempi->r.type,tempi->r.reg,tempi->r.disp, - tempi->p1.type,tempi->p1.reg,tempi->p1.disp, - tempi->p2.type,tempi->p2.reg,tempi->p2.disp,0x010000000003,ip2); + tempi->r.type,tempi->r.reg,tempi->r.disp, + tempi->p1.type,tempi->p1.reg,tempi->p1.disp, + tempi->p2.type,tempi->p2.reg,tempi->p2.disp,0x010000000003,ip2); else ICFOpEqual(lx,tempi,SLASH_OP_FADD,buf,ip2); break; case IC_SUB_EQUAL: if (tempi->ic_flags&ICF_USE_INT) ICAddSubEctEqual(tempi,tempi->p1.ptype, - tempi->r.type,tempi->r.reg,tempi->r.disp, - tempi->p1.type,tempi->p1.reg,tempi->p1.disp, - tempi->p2.type,tempi->p2.reg,tempi->p2.disp,0x29000000052B,ip2); + tempi->r.type,tempi->r.reg,tempi->r.disp, + tempi->p1.type,tempi->p1.reg,tempi->p1.disp, + tempi->p2.type,tempi->p2.reg,tempi->p2.disp,0x29000000052B,ip2); else ICFOpEqual(lx,tempi,SLASH_OP_FSUB,buf,ip2); break; case IC_SHL_CONST: ICShift(tempi,tempi->r.type,tempi->r.reg,tempi->r.disp, - tempi->p1.type,tempi->p1.reg,tempi->p1.disp, - TY_IMM+IT_I64,0,tempi->ic_data,0xE0D1E0D3E0C1,0xE0D1E0D3E0C1,ip2); + tempi->p1.type,tempi->p1.reg,tempi->p1.disp, + TY_IMM+IT_I64,0,tempi->ic_data,0xE0D1E0D3E0C1,0xE0D1E0D3E0C1,ip2); break; case IC_SHR_CONST: ICShift(tempi,tempi->r.type,tempi->r.reg,tempi->r.disp, - tempi->p1.type,tempi->p1.reg,tempi->p1.disp, - TY_IMM+IT_I64,0,tempi->ic_data,0xE8D1E8D3E8C1,0xF8D1F8D3F8C1,ip2); + tempi->p1.type,tempi->p1.reg,tempi->p1.disp, + TY_IMM+IT_I64,0,tempi->ic_data,0xE8D1E8D3E8C1,0xF8D1F8D3F8C1,ip2); break; case IC_ADD_CONST: ICAddConst(tempi,tempi->r.type,tempi->r.reg,tempi->r.disp, - tempi->p1.type,tempi->p1.reg,tempi->p1.disp,tempi->ic_data,0x0003,ip2); + tempi->p1.type,tempi->p1.reg,tempi->p1.disp,tempi->ic_data,0x0003,ip2); break; case IC_SUB_CONST: ICAddConst(tempi,tempi->r.type,tempi->r.reg,tempi->r.disp, - tempi->p1.type,tempi->p1.reg,tempi->p1.disp,tempi->ic_data,0x052B,ip2); + tempi->p1.type,tempi->p1.reg,tempi->p1.disp,tempi->ic_data,0x052B,ip2); break; case IC_ENTER: if (tempi->ic_data<=MAX_I16) @@ -560,7 +495,7 @@ I64 OptPass789A(CLex *lx,CHashFun *fun_class, else { ICPush(tempi,TY_REG+IT_I64,CREG_RBP,0,ip2); ICMov(tempi,TY_REG+IT_I64,CREG_RBP,0, - TY_REG+IT_I64,CREG_RSP,0,ip2); + TY_REG+IT_I64,CREG_RSP,0,ip2); ICAddRSP(tempi,-tempi->ic_data); } if (fun_class) { @@ -573,11 +508,9 @@ I64 OptPass789A(CLex *lx,CHashFun *fun_class, } for (i=0;i0 && register_offsets[i].offset!=MAX_I64) { - tempc=register_offsets[i].m->member_class; - while (tempc->fwd_class) - tempc=tempc->fwd_class; + tempc=OptClassFwd(register_offsets[i].m->member_class); ICMov(tempi,TY_REG+IT_I64,i,0, - TY_DISP+tempc->sub_type,CREG_RBP,register_offsets[i].offset,ip2); + TY_DISP+tempc->sub_type,CREG_RBP,register_offsets[i].offset,ip2); } } break; @@ -688,12 +621,12 @@ I64 OptPass789A(CLex *lx,CHashFun *fun_class, break; case IC_INVLPG: ICMov(tempi,TY_REG+IT_I64,CREG_RAX,0, - tempi->p1.type,tempi->p1.reg,tempi->p1.disp,ip2); + tempi->p1.type,tempi->p1.reg,tempi->p1.disp,ip2); ICU24(tempi,0x38010F); break; case IC_CLFLUSH: ICMov(tempi,TY_REG+IT_I64,CREG_RAX,0, - tempi->p1.type,tempi->p1.reg,tempi->p1.disp,ip2); + tempi->p1.type,tempi->p1.reg,tempi->p1.disp,ip2); ICU24(tempi,0x38AE0F); break; case IC_PAUSE: @@ -719,69 +652,65 @@ I64 OptPass789A(CLex *lx,CHashFun *fun_class, break; case IC_GET_BASE_PTR: ICMov(tempi,TY_REG+IT_I64,CREG_RAX,0, - TY_REG+IT_I64,CREG_RBP,0,ip2); + TY_REG+IT_I64,CREG_RBP,0,ip2); break; case IC_SET_BASE_PTR: ICMov(tempi,TY_REG+IT_I64,CREG_RBP,0, - tempi->p1.type,tempi->p1.reg,tempi->p1.disp,ip2); + tempi->p1.type,tempi->p1.reg,tempi->p1.disp,ip2); break; case IC_GET_STK_PTR: ICMov(tempi,TY_REG+IT_I64,CREG_RAX,0, - TY_REG+IT_I64,CREG_RSP,0,ip2); + TY_REG+IT_I64,CREG_RSP,0,ip2); break; case IC_SET_STK_PTR: ICMov(tempi,TY_REG+IT_I64,CREG_RSP,0, - tempi->p1.type,tempi->p1.reg,tempi->p1.disp,ip2); + tempi->p1.type,tempi->p1.reg,tempi->p1.disp,ip2); break; case IC_RETURN_VAL2: break; case IC_RETURN_VAL: case IC_SET_RAX: ICMov(tempi,TY_REG+IT_I64,CREG_RAX,0, - tempi->p1.type,tempi->p1.reg,tempi->p1.disp,ip2); + tempi->p1.type,tempi->p1.reg,tempi->p1.disp,ip2); break; case IC_GET_RAX: break; case IC_BT: ICBitOps(tempi,&tempi->p1,&tempi->p2,tempi+1, - 0xA30F,0x20BA0F,ip2); + 0xA30F,0x20BA0F,ip2); break; case IC_BTS: case IC_LBTS: ICBitOps(tempi,&tempi->p1,&tempi->p2,tempi+1, - 0xAB0F,0x28BA0F,ip2); + 0xAB0F,0x28BA0F,ip2); break; case IC_BTR: case IC_LBTR: ICBitOps(tempi,&tempi->p1,&tempi->p2,tempi+1, - 0xB30F,0x30BA0F,ip2); + 0xB30F,0x30BA0F,ip2); break; case IC_BTC: case IC_LBTC: ICBitOps(tempi,&tempi->p1,&tempi->p2,tempi+1, - 0xBB0F,0x38BA0F,ip2); - break; - case IC_BEQU: - case IC_LBEQU: - ICBEqu(tempi,tempi+1,ip2); + 0xBB0F,0x38BA0F,ip2); break; case IC_BSF: ICMov(tempi,TY_REG+IT_I64,CREG_RAX,0, - tempi->p1.type,tempi->p1.reg,tempi->p1.disp,ip2); + tempi->p1.type,tempi->p1.reg,tempi->p1.disp,ip2); ICU32(tempi,0xC0BC0F48); ICU16(tempi,0x0375); ICU24(tempi,0xD0F748); break; case IC_BSR: ICMov(tempi,TY_REG+IT_I64,CREG_RAX,0, - tempi->p1.type,tempi->p1.reg,tempi->p1.disp,ip2); + tempi->p1.type,tempi->p1.reg,tempi->p1.disp,ip2); ICU32(tempi,0xC0BD0F48); ICU16(tempi,0x0375); ICU24(tempi,0xD0F748); break; case IC_SIGN_I64: ICMov(tempi,TY_REG+IT_I64,CREG_RAX,0, - tempi->p1.type,tempi->p1.reg,tempi->p1.disp,ip2); + tempi->p1.type,tempi->p1.reg,tempi->p1.disp,ip2); ICCopyTemplate(lx,tempi,CMP_TEMPLATE_SIGN_I64,TRUE,FALSE,FALSE,CN_MAIN); break; case IC_PREEMPT: @@ -822,17 +751,11 @@ I64 OptPass789A(CLex *lx,CHashFun *fun_class, break; case IC_ABS_I64: ICMov(tempi,TY_REG+IT_I64,CREG_RAX,0, - tempi->p1.type,tempi->p1.reg,tempi->p1.disp,ip2); + tempi->p1.type,tempi->p1.reg,tempi->p1.disp,ip2); ICU24(tempi,0xC00B48); ICU16(tempi,0x0379); ICU24(tempi,0xD8F748); break; - case IC_LIMIT_I64: - ICLimit(tempi,0x4F4C,ip2); - break; - case IC_LIMIT_U64: - ICLimit(tempi,0x4742,ip2); - break; case IC_MIN_I64: ICMinMax(tempi,0x4F,ip2); break; @@ -872,21 +795,12 @@ I64 OptPass789A(CLex *lx,CHashFun *fun_class, case IC_QUE_REM: ICQueRem(tempi,ip2); break; - case IC_MEMCPY: - ICMemCpy(tempi,ip2); - break; - case IC_MEMSET: - case IC_MEMSET_U16: - case IC_MEMSET_U32: - case IC_MEMSET_U64: - ICMemSet(tempi,code-IC_MEMSET,ip2); - break; case IC_STRLEN: ICMov(tempi,TY_REG+IT_I64,CREG_RAX,0, - tempi->p1.type,tempi->p1.reg,tempi->p1.disp,ip2); + tempi->p1.type,tempi->p1.reg,tempi->p1.disp,ip2); ICCopyTemplate(lx,tempi,CMP_TEMPLATE_STRLEN,TRUE,FALSE,FALSE,CN_MAIN); break; - case IC_INU32: + case IC_IN_U32: if (tempi->p1.type&TY_MASK==TY_IMM) { ICU16(tempi,0xC033); if (tempi->p1.disp<=MAX_U8) @@ -897,12 +811,12 @@ I64 OptPass789A(CLex *lx,CHashFun *fun_class, } } else { ICMov(tempi,TY_REG+IT_I64,CREG_RDX,0, - tempi->p1.type,tempi->p1.reg,tempi->p1.disp,ip2); + tempi->p1.type,tempi->p1.reg,tempi->p1.disp,ip2); ICU16(tempi,0xC033); ICU8(tempi,0xED); } break; - case IC_INU16: + case IC_IN_U16: if (tempi->p1.type&TY_MASK==TY_IMM) { ICU16(tempi,0xC033); if (tempi->p1.disp<=MAX_U8) @@ -913,12 +827,12 @@ I64 OptPass789A(CLex *lx,CHashFun *fun_class, } } else { ICMov(tempi,TY_REG+IT_I64,CREG_RDX,0, - tempi->p1.type,tempi->p1.reg,tempi->p1.disp,ip2); + tempi->p1.type,tempi->p1.reg,tempi->p1.disp,ip2); ICU16(tempi,0xC033); ICU16(tempi,0xED00+OC_OP_SIZE_PREFIX); } break; - case IC_INU8: + case IC_IN_U8: if (tempi->p1.type&TY_MASK==TY_IMM) { ICU16(tempi,0xC033); if (tempi->p1.disp<=MAX_U8) @@ -929,15 +843,15 @@ I64 OptPass789A(CLex *lx,CHashFun *fun_class, } } else { ICMov(tempi,TY_REG+IT_I64,CREG_RDX,0, - tempi->p1.type,tempi->p1.reg,tempi->p1.disp,ip2); + tempi->p1.type,tempi->p1.reg,tempi->p1.disp,ip2); ICU16(tempi,0xC033); ICU8(tempi,0xEC); } break; - case IC_OUTU32: + case IC_OUT_U32: if (tempi->p2.type&TY_MASK==TY_IMM) { ICMov(tempi,TY_REG+IT_I64,CREG_RAX,0, - tempi->p1.type,tempi->p1.reg,tempi->p1.disp,ip2); + tempi->p1.type,tempi->p1.reg,tempi->p1.disp,ip2); if (tempi->p2.disp<=MAX_U8) ICU16(tempi,0xE7+tempi->p2.disp<<8); else { @@ -947,22 +861,22 @@ I64 OptPass789A(CLex *lx,CHashFun *fun_class, } else { if (tempi->ic_flags & ICF_P1_FIRST) { ICMov(tempi,TY_REG+IT_I64,CREG_RAX,0, - tempi->p1.type,tempi->p1.reg,tempi->p1.disp,ip2); + tempi->p1.type,tempi->p1.reg,tempi->p1.disp,ip2); ICMov(tempi,TY_REG+IT_I64,CREG_RDX,0, - tempi->p2.type,tempi->p2.reg,tempi->p2.disp,ip2); + tempi->p2.type,tempi->p2.reg,tempi->p2.disp,ip2); } else { ICMov(tempi,TY_REG+IT_I64,CREG_RDX,0, - tempi->p2.type,tempi->p2.reg,tempi->p2.disp,ip2); + tempi->p2.type,tempi->p2.reg,tempi->p2.disp,ip2); ICMov(tempi,TY_REG+IT_I64,CREG_RAX,0, - tempi->p1.type,tempi->p1.reg,tempi->p1.disp,ip2); + tempi->p1.type,tempi->p1.reg,tempi->p1.disp,ip2); } ICU8(tempi,0xEF); } break; - case IC_OUTU16: + case IC_OUT_U16: if (tempi->p2.type&TY_MASK==TY_IMM) { ICMov(tempi,TY_REG+IT_I64,CREG_RAX,0, - tempi->p1.type,tempi->p1.reg,tempi->p1.disp,ip2); + tempi->p1.type,tempi->p1.reg,tempi->p1.disp,ip2); if (tempi->p2.disp<=MAX_U8) ICU24(tempi,0xE700+OC_OP_SIZE_PREFIX+tempi->p2.disp<<16); else { @@ -972,22 +886,22 @@ I64 OptPass789A(CLex *lx,CHashFun *fun_class, } else { if (tempi->ic_flags & ICF_P1_FIRST) { ICMov(tempi,TY_REG+IT_I64,CREG_RAX,0, - tempi->p1.type,tempi->p1.reg,tempi->p1.disp,ip2); + tempi->p1.type,tempi->p1.reg,tempi->p1.disp,ip2); ICMov(tempi,TY_REG+IT_I64,CREG_RDX,0, - tempi->p2.type,tempi->p2.reg,tempi->p2.disp,ip2); + tempi->p2.type,tempi->p2.reg,tempi->p2.disp,ip2); } else { ICMov(tempi,TY_REG+IT_I64,CREG_RDX,0, - tempi->p2.type,tempi->p2.reg,tempi->p2.disp,ip2); + tempi->p2.type,tempi->p2.reg,tempi->p2.disp,ip2); ICMov(tempi,TY_REG+IT_I64,CREG_RAX,0, - tempi->p1.type,tempi->p1.reg,tempi->p1.disp,ip2); + tempi->p1.type,tempi->p1.reg,tempi->p1.disp,ip2); } ICU16(tempi,0xEF00+OC_OP_SIZE_PREFIX); } break; - case IC_OUTU8: + case IC_OUT_U8: if (tempi->p2.type&TY_MASK==TY_IMM) { ICMov(tempi,TY_REG+IT_I64,CREG_RAX,0, - tempi->p1.type,tempi->p1.reg,tempi->p1.disp,ip2); + tempi->p1.type,tempi->p1.reg,tempi->p1.disp,ip2); if (tempi->p2.disp<=MAX_U8) ICU16(tempi,0xE6+tempi->p2.disp<<8); else { @@ -997,14 +911,14 @@ I64 OptPass789A(CLex *lx,CHashFun *fun_class, } else { if (tempi->ic_flags & ICF_P1_FIRST) { ICMov(tempi,TY_REG+IT_I64,CREG_RAX,0, - tempi->p1.type,tempi->p1.reg,tempi->p1.disp,ip2); + tempi->p1.type,tempi->p1.reg,tempi->p1.disp,ip2); ICMov(tempi,TY_REG+IT_I64,CREG_RDX,0, - tempi->p2.type,tempi->p2.reg,tempi->p2.disp,ip2); + tempi->p2.type,tempi->p2.reg,tempi->p2.disp,ip2); } else { ICMov(tempi,TY_REG+IT_I64,CREG_RDX,0, - tempi->p2.type,tempi->p2.reg,tempi->p2.disp,ip2); + tempi->p2.type,tempi->p2.reg,tempi->p2.disp,ip2); ICMov(tempi,TY_REG+IT_I64,CREG_RAX,0, - tempi->p1.type,tempi->p1.reg,tempi->p1.disp,ip2); + tempi->p1.type,tempi->p1.reg,tempi->p1.disp,ip2); } ICU8(tempi,0xEE); } @@ -1166,17 +1080,11 @@ I64 OptPass789A(CLex *lx,CHashFun *fun_class, ICU8(tempi,0xC3); break; case IC_JMP: + lb=OptLabelFwd(tempi->ic_data); short_jmp=ToBool(tempi->ic_flags&ICF_SHORT_JMP); - lb=tempi->ic_data; - while (lb1=lb->fwd) - lb=lb1; - if (!buf) { - if (lb->addr!=INVALID_PTR) { - i=lb->addr-ip; - if (MIN_I8+5addr!=INVALID_PTR && + MIN_I8+5addr-ipic_flags|=ICF_SHORT_JMP; i=lb->addr-(ip+2); @@ -1188,8 +1096,6 @@ I64 OptPass789A(CLex *lx,CHashFun *fun_class, } tempi->ic_flags&=~ICF_CODE_FINAL; break; - case IC_END: - break; case IC_LABEL: lb=tempi->ic_data; lb->addr=ip; @@ -1199,14 +1105,12 @@ I64 OptPass789A(CLex *lx,CHashFun *fun_class, } tempi->ic_flags&=~ICF_CODE_FINAL; break; - case IC_QUESTION: - break; case IC_IRQ: ICU8(tempi,0xCD); ICU8(tempi,tempi->ic_data); break; - case IC_NOP: case IC_NOP1: + case IC_NOP2: case IC_PUSH_CMP: break; case IC_CALL_START: @@ -1219,13 +1123,15 @@ I64 OptPass789A(CLex *lx,CHashFun *fun_class, ICPopRegs(tempi,tempi->ic_data); if (tempi->r.type&TY_MASK) ICMov(tempi,tempi->r.type,tempi->r.reg,tempi->r.disp, - TY_REG+IT_I64,CREG_RAX,0,ip2); + TY_REG+IT_I64,CREG_RAX,0,ip2); break; case IC_POP_REGS: ICPopRegs(tempi,tempi->ic_data); break; case IC_END_EXP: break; + case IC_END: + break; default: OptMissing(lx,tempi); @@ -1240,12 +1146,12 @@ I64 OptPass789A(CLex *lx,CHashFun *fun_class, } else { ICFCvt(lx,tempi,CREG_RAX,tempi->r.type,tempi->r.reg,tempi->r.disp,FALSE,CN_R,ip2); ICMov(tempi,tempi->r.type,tempi->r.reg,tempi->r.disp, - TY_REG+IT_I64,CREG_RAX,0,ip2); + TY_REG+IT_I64,CREG_RAX,0,ip2); } } else if (tempi->ic_flags & ICF_R_TO_INT) { ICFCvt(lx,tempi,CREG_RAX,tempi->r.type,tempi->r.reg,tempi->r.disp,TRUE,CN_R,ip2); ICMov(tempi,tempi->r.type,tempi->r.reg,tempi->r.disp, - TY_REG+IT_I64,CREG_RAX,0,ip2); + TY_REG+IT_I64,CREG_RAX,0,ip2); } } } @@ -1264,7 +1170,7 @@ I64 OptPass789A(CLex *lx,CHashFun *fun_class, MemCpy(buf+ip,tempi->ic_body,cnt); } -skip_copy: + skip_copy: if (dbg && lx->min_line<=tempi->ic_line<=lx->max_line) { i=tempi->ic_line-lx->min_line; if (!dbg->body[i]) diff --git a/TempleOS/Compiler/StmtParser.CPP b/TempleOS/Compiler/StmtParser.CPP index bdbfb12..840145c 100644 --- a/TempleOS/Compiler/StmtParser.CPP +++ b/TempleOS/Compiler/StmtParser.CPP @@ -107,8 +107,7 @@ U0 PrsVarInit(CLex *lx,U8 **_dst,CHashClass *tempc,CArrayDim *tempad,U8 *data_ad CExeImportExport *tempe; Bool is_str; - while (tempc->fwd_class) - tempc=tempc->fwd_class; + tempc=OptClassFwd(tempc); if (tempm=tempc->member_lst) { if (lx->token!='{') LexExcept(lx,"ST_EXPECTING_LEFT_BRACE"); @@ -163,18 +162,18 @@ U0 PrsVarInit(CLex *lx,U8 **_dst,CHashClass *tempc,CArrayDim *tempad,U8 *data_ad CBOutPtrsInit(lx); CBICAdd(lx,IC_START,0,0); //So we can scan back an instruction CBICAdd(lx,IC_ABS_ADDR,data_addr_ip,tempc+1); - CBICAdd(lx,IC_IMM,dst-*_base,tempc+1); + CBICAdd(lx,IC_IMM_U64,dst-*_base,tempc+1); CBICAdd(lx,IC_ADD,0,tempc+1); if (!PrsExpression(lx,NULL,TRUE)) throw(EXCEPT_COMPILER,10); tempi=lx->cbh.cb_last_out_ptr; if (tempi->ic_opcode==IC_END_EXP) - tempi->ic_opcode=IC_NOP; + tempi->ic_opcode=IC_NOP1; CBICAdd(lx,IC_ASSIGN,0,tempc); CBICAdd(lx,IC_END_EXP,0,tempc); CBICAdd(lx,IC_RET,0,0); CBICAdd(lx,IC_END,0,0); - if (ex=CBCompile(lx,NULL,&size,NULL,NULL)) { + if (ex=CBCompile(lx,NULL,&size,NULL)) { tempe=CAlloc(sizeof(CExeImportExport)); tempe->type=EIE_MAIN; tempe->ip=lx->a->ip; @@ -223,8 +222,7 @@ U0 PrsVarInit2(CLex *lx,U8 **_dst,CHashClass *tempc,CArrayDim *tempad,U8 *data_a U8 *st,*_b; CVI2 root,*tempvi,*tempvi1; CArrayDim *tempad1; - while (tempc->fwd_class) - tempc=tempc->fwd_class; + tempc=OptClassFwd(tempc); if (tempad1=tempad->next) { if (!tempc->ptr_cnt && (tempc->sub_type==IT_I8 || tempc->sub_type==IT_U8) && @@ -328,7 +326,7 @@ U0 PrsStaticInit(CLex *lx,CMemberLst *tempm,I64 pass) if (tempi!=lx->cbh.cb_last_out_ptr) { CBICAdd(lx,IC_RET,0,0); CBICAdd(lx,IC_END,0,0); - if (ex=CBCompile(lx,NULL,&size,NULL,NULL)) { + if (ex=CBCompile(lx,NULL,&size,NULL)) { if (pass==2) { tempe=CAlloc(sizeof(CExeImportExport)); tempe->type=EIE_MAIN; @@ -442,7 +440,7 @@ start: if (PrsKeyWord(lx)==KW_UNION) { Lex(lx); - tempc2=PrsClass(lx,TRUE,cps_flags,mode.u8[0]==PRS0_EXTERN); + tempc2=PrsClass(lx,TRUE,cps_flags,mode&255==PRS0_EXTERN); tempc2->fwd_class=tempc1; tempc1=tempc2; if (_tempc1) *_tempc1=tempc1; @@ -450,7 +448,7 @@ start: goto start; } else if (PrsKeyWord(lx)==KW_CLASS) { Lex(lx); - tempc2=PrsClass(lx,FALSE,cps_flags,mode.u8[0]==PRS0_EXTERN); + tempc2=PrsClass(lx,FALSE,cps_flags,mode&255==PRS0_EXTERN); tempc2->fwd_class=tempc1; tempc1=tempc2; if (_tempc1) *_tempc1=tempc1; @@ -500,9 +498,7 @@ start: tempad->next=tempad2; } - tempc2=tempc1; - while (tempc2->fwd_class) - tempc2=tempc2->fwd_class; + tempc2=OptClassFwd(tempc1); if (tempc2->ptr_cnt) { tempc2-=tempc2->ptr_cnt; if (tempc2->type&HTT_INTERNAL_TYPE && !tempc2->size) @@ -592,15 +588,9 @@ U0 PrsVarLst(CLex *lx,CHashClass *tempc, restart: tempc1=temph; LexPush(lx); - if (lx->token!=',' && mode.u8[1]==PRS1B_LOCAL_VAR) { + if (lx->token!=',' && mode.u8[1]==PRS1B_LOCAL_VAR) Lex(lx); //skip type - lx->temp_indent_level=lx->indent_level=1; - lx->flags|=LF_INSIDE_EXPRESSION; - if (lx->fun_lfn) - lx->expression_start_line_num=lx->fun_lfn->line_num; - else - lx->expression_start_line_num=1; - } else + else Lex(lx); //skip type or ',' tempm=MemberLstNew(register); if (mode.u8[1]==PRS1B_STATIC_LOCAL_VAR) { @@ -750,8 +740,7 @@ restart: if (!ex) throw(EXCEPT_COMPILER,8); tempm->dft_val=Call(ex); - while (tempc2->fwd_class) - tempc2=tempc2->fwd_class; + tempc2=OptClassFwd(tempc2); if (tempc2->sub_type==IT_F64) { if (type!=IT_F64) tempm->dft_val(F64)=tempm->dft_val; @@ -820,10 +809,6 @@ restart: } } pvl_done: - if (mode.u8[1]==PRS1B_LOCAL_VAR) { - lx->flags&=~LF_INSIDE_EXPRESSION; - lx->temp_indent_level=lx->indent_level=1; - } lx->flags=lx->flags&~(LF_CLASS_IP|LF_DONT_MAKE_RESULT)| old_flags& (LF_CLASS_IP|LF_DONT_MAKE_RESULT); } @@ -851,22 +836,22 @@ CHashClass *PrsClass(CLex *lx,Bool is_union,I64 cps_flags,Bool is_extern) tempc->str=lx->ident; lx->ident=NULL; if (IsReplaceSyms) - HashReplace(tempc,lx->glbl_hash_table); + HashReplace(tempc,lx->htc.glbl_hash_table); else - HashAdd(tempc,lx->glbl_hash_table); + HashAdd(tempc,lx->htc.glbl_hash_table); LBts(tempc->flags,Cf_EXTERN); SetSrcFileInfo(lx,tempc); Lex(lx); } else { if (lx->flags&LF_AOT_COMPILE) { - if (tempc=HashFind(lx->ident,lx->glbl_hash_table,HTT_CLASS)) { + if (tempc=HashFind(lx->ident,lx->htc.glbl_hash_table,HTT_CLASS)) { if (!Bt(tempc->flags,Cf_EXTERN)) tempc=NULL; else if (tempc->use_cnt<3) UnusedExternWarning(lx,tempc); } } else { - if (tempc=HashSingleTableFind(lx->ident,lx->glbl_hash_table,HTT_CLASS)) { + if (tempc=HashSingleTableFind(lx->ident,lx->htc.glbl_hash_table,HTT_CLASS)) { if (!Bt(tempc->flags,Cf_EXTERN)) tempc=NULL; else if (tempc->use_cnt<3) @@ -878,9 +863,9 @@ CHashClass *PrsClass(CLex *lx,Bool is_union,I64 cps_flags,Bool is_extern) tempc->str=lx->ident; lx->ident=NULL; if (IsReplaceSyms) - HashReplace(tempc,lx->glbl_hash_table); + HashReplace(tempc,lx->htc.glbl_hash_table); else - HashAdd(tempc,lx->glbl_hash_table); + HashAdd(tempc,lx->htc.glbl_hash_table); } else { Free(tempc->src_link); Free(tempc->index); @@ -915,7 +900,7 @@ CHashFun *PrsFunJoin(CLex *lx, CHashFun *tempf; if (name) { //if not fun_ptr if (lx->flags&LF_AOT_COMPILE) { - if (tempf=HashFind(name,lx->glbl_hash_table,HTT_FUN)) { + if (tempf=HashFind(name,lx->htc.glbl_hash_table,HTT_FUN)) { if (tempf->type & HTF_IMPORT) tempf=NULL; else @@ -923,7 +908,7 @@ CHashFun *PrsFunJoin(CLex *lx, UnusedExternWarning(lx,tempf); } } else { - if (tempf=HashSingleTableFind(name,lx->glbl_hash_table,HTT_FUN)) { + if (tempf=HashSingleTableFind(name,lx->htc.glbl_hash_table,HTT_FUN)) { if (!Bt(tempf->flags,Cf_EXTERN)) tempf=NULL; else if (tempf->use_cnt<3) @@ -950,9 +935,9 @@ CHashFun *PrsFunJoin(CLex *lx, Bts(tempf->flags,Ff_NOARGPOP); if (name) { //if not fun_ptr if (IsReplaceSyms) - HashReplace(tempf,lx->glbl_hash_table); + HashReplace(tempf,lx->htc.glbl_hash_table); else - HashAdd(tempf,lx->glbl_hash_table); + HashAdd(tempf,lx->htc.glbl_hash_table); } } else { tempf->used_reg_mask=CALWAYS_CLOBBERED_MASK+CSTK_TEMPS_MASK; @@ -989,19 +974,16 @@ U0 PrsFun(CLex *lx, lx->fun_lfn=lx->cur_lfn; lx->min_line=lx->max_line=lx->cur_lfn->line_num; - QueVectU8Del(lx->indent_que_vect); - lx->indent_que_vect=QueVectU8New(lx->min_line); lx->flags&=~LF_NO_REG_OPT; tempf=PrsFunJoin(lx,temp_return,name,cps_flags); - lx->local_var_lst=tempf; + lx->htc.local_var_lst=tempf; CBPush(lx); Btr(&lx->flags,Lf_OPT_TRACE_PRESENT); CBOutPtrsInit(lx); CBICAdd(lx,IC_START,0,0); //So we can scan back an instruction - lx->temp_indent_level=lx->indent_level=0; CBICAdd(lx,IC_ENTER,0,0); saved_leave_label=lx->lb_leave; lx->lb_leave=CBMiscNew(lx,CBMT_LABEL); @@ -1009,7 +991,6 @@ U0 PrsFun(CLex *lx, PrsStatement(lx,tempf,0,NULL,FALSE); if (tempf->return_class->size && !(lx->flags&LF_HAS_RETURN)) LexPutWarn(lx,"ST_SHOULD_RETURN_VAL"); - lx->temp_indent_level=lx->indent_level=0; CBICAdd(lx,IC_LABEL,lx->lb_leave,0); lx->lb_leave=saved_leave_label; CBICAdd(lx,IC_LEAVE,0,tempf->return_class); @@ -1018,7 +999,7 @@ U0 PrsFun(CLex *lx, if (lx->flags&LF_AOT_COMPILE) { tempf->executable_addr=lx->a->ip; tempf->type|=HTF_EXPORT; - r=CBCompile(lx,tempf,&size,&tempf->debug,&tempf->indent); + r=CBCompile(lx,tempf,&size,&tempf->debug); if (r) { j=(size+7)>>3; for (i=0;iopts,OPTf_COMPILE_TRACE); - tempf->executable_addr=CBCompile(lx,tempf,&size,&tempf->debug,&tempf->indent); + tempf->executable_addr=CBCompile(lx,tempf,&size,&tempf->debug); if (old_ctrace) { Bts(&lx->opts,OPTf_COMPILE_TRACE); Un(tempf->executable_addr,size,64); @@ -1036,7 +1017,7 @@ U0 PrsFun(CLex *lx, } LBtr(tempf->flags,Cf_EXTERN); CBPop(lx); - lx->local_var_lst=NULL; + lx->htc.local_var_lst=NULL; tempm=tempf->member_lst; while (tempm) { if (tempm->flags & MLF_NO_UNUSED_WARN) { @@ -1048,9 +1029,6 @@ U0 PrsFun(CLex *lx, lx->cur_lfn->name,lx->cur_lfn->line_num,tempm->str,tempf->str); tempm=tempm->next; } - - QueVectU8Del(lx->indent_que_vect); - lx->indent_que_vect=NULL; lx->fun_lfn=NULL; } @@ -1083,14 +1061,14 @@ U0 PrsGlblVarLst(CLex *lx,I64 saved_mode,CHashClass *saved_tempc, val=saved_val; mode=saved_mode; - if (tempess && mode.u8[0]==PRS0_EXTERN && !(lx->flags&LF_AOT_COMPILE)) { + if (tempess && mode&255==PRS0_EXTERN && !(lx->flags&LF_AOT_COMPILE)) { if (tempess->type & HTT_EXPORT_SYS_SYM) { val=tempess->val; mode=PRS0__EXTERN|PRS1_NULL; } } if (lx->token=='(') { - switch (mode.u8[0]) { + switch (mode&255) { case PRS0__INTERN: tempf=PrsFunJoin(lx,tempc,st,cps_flags); tempf->executable_addr=val; @@ -1113,7 +1091,7 @@ U0 PrsGlblVarLst(CLex *lx,I64 saved_mode,CHashClass *saved_tempc, else { tempf=PrsFunJoin(lx,tempc,st,cps_flags); tempf->type|=HTF_IMPORT; - if (mode.u8[0]==PRS0__IMPORT) + if (mode&255==PRS0__IMPORT) tempf->import_name=StrNew(val); else tempf->import_name=StrNew(st); @@ -1138,7 +1116,7 @@ U0 PrsGlblVarLst(CLex *lx,I64 saved_mode,CHashClass *saved_tempc, j*=i; has_alias=FALSE; temphg=NULL; - switch (mode.u8[0]) { + switch (mode&255) { case PRS0__EXTERN: if (lx->flags&LF_AOT_COMPILE) { tempg=CAlloc(sizeof(CHashGlblVar)); @@ -1158,7 +1136,7 @@ U0 PrsGlblVarLst(CLex *lx,I64 saved_mode,CHashClass *saved_tempc, else { tempg=CAlloc(sizeof(CHashGlblVar)); tempg->type=HTT_GLBL_VAR | HTF_IMPORT; - if (mode.u8[0]==PRS0__IMPORT) + if (mode&255==PRS0__IMPORT) tempg->import_name=StrNew(val); else tempg->import_name=StrNew(st); @@ -1239,9 +1217,9 @@ U0 PrsGlblVarLst(CLex *lx,I64 saved_mode,CHashClass *saved_tempc, tempg->dim.total_cnt=i; tempg->use_cnt=0; SetSrcFileInfo(lx,tempg); - if (mode.u8[0]==PRS0_IMPORT || mode.u8[0]==PRS0__IMPORT) + if (mode&255==PRS0_IMPORT || mode&255==PRS0__IMPORT) tempg->flags|=GVAF_IMPORT; - if (mode.u8[0]==PRS0_EXTERN) + if (mode&255==PRS0_EXTERN) tempg->flags|=GVAF_EXTERN; if (tempf_fun_ptr) { tempg->fun_ptr=tempf_fun_ptr; @@ -1250,9 +1228,9 @@ U0 PrsGlblVarLst(CLex *lx,I64 saved_mode,CHashClass *saved_tempc, if (is_array) tempg->flags|=GVAF_ARRAY; if (IsReplaceSyms) - HashReplace(tempg,lx->glbl_hash_table); + HashReplace(tempg,lx->htc.glbl_hash_table); else - HashAdd(tempg,lx->glbl_hash_table); + HashAdd(tempg,lx->htc.glbl_hash_table); if (!(lx->flags&LF_AOT_COMPILE) && !(tempg->flags&GVAF_EXTERN)) SysSymImportsResolve(tempg->str); if (lx->token=='=') { @@ -1317,18 +1295,15 @@ U0 PrsIf(CLex *lx,CHashFun *locals,I64 try_cnt, LexExcept(lx,"ST_MISSING_RIGHT_PAREN"); Lex(lx); lb=CBMiscNew(lx,CBMT_LABEL); - lx->temp_indent_level++; CBICAdd(lx,IC_BR_ZERO,lb,0); PrsStatement(lx,locals,try_cnt,lb_break); k=PrsKeyWord(lx); if (k==KW_ELSE) { - lx->temp_indent_level--; Lex(lx); - lx->temp_indent_level++; lb1=CBMiscNew(lx,CBMT_LABEL); CBICAdd(lx,IC_JMP,lb1,0); CBICAdd(lx,IC_LABEL,lb,0); - PrsStatement(lx,locals,try_cnt,lb_break,TRUE,TRUE); + PrsStatement(lx,locals,try_cnt,lb_break,TRUE); CBICAdd(lx,IC_LABEL,lb1,0); } else CBICAdd(lx,IC_LABEL,lb,0); @@ -1385,7 +1360,6 @@ U0 PrsFor(CLex *lx,CHashFun *locals,I64 try_cnt) CLexCodeBlkCtrl *tempcbh; CCodeBlkMisc *lb,*lb_done; - lx->temp_indent_level=lx->indent_level--; if (lx->token!='(') LexExcept(lx,"ST_EXPECTING_LEFT_PAREN"); Lex(lx); @@ -1413,11 +1387,9 @@ U0 PrsFor(CLex *lx,CHashFun *locals,I64 try_cnt) LexExcept(lx,"ST_MISSING_RIGHT_PAREN"); Lex(lx); - lx->temp_indent_level=lx->indent_level++; PrsStatement(lx,locals,try_cnt,lb_done); CBAppend(lx,tempcbh); CBICAdd(lx,IC_JMP,lb,0); - lx->temp_indent_level--; CBICAdd(lx,IC_LABEL,lb_done,0); } @@ -1432,7 +1404,7 @@ U0 PrsSwitch(CLex *lx,Bool nobound,CHashFun *locals,I64 try_cnt) CSwitchCase *header=NULL,*temps,*temps1; CCodeBlkMisc *lb_break,*lb_dft,*mc_jt,*lb_entry,**jmp_table; CIntermediateCode *tempi_sub,*tempi_cmp; - Bool dft_found=FALSE,first=TRUE; + Bool dft_found=FALSE; I64 i,k,k2,lo=MAX_I64,hi=MIN_I64,range; if (lx->token!='(') @@ -1445,9 +1417,9 @@ U0 PrsSwitch(CLex *lx,Bool nobound,CHashFun *locals,I64 try_cnt) mc_jt=CBMiscNew(lx,CBMT_JMP_TABLE); if (!PrsExpression(lx,NULL,FALSE)) throw(EXCEPT_COMPILER,15); - tempi_sub=CBICAdd(lx,IC_IMM,0,sys_internal_types[IT_I64]); + tempi_sub=CBICAdd(lx,IC_IMM_U64,0,sys_internal_types[IT_I64]); CBICAdd(lx,IC_SUB,0,sys_internal_types[IT_I64]); - tempi_cmp=CBICAdd(lx,IC_IMM,0,sys_internal_types[IT_I64]); + tempi_cmp=CBICAdd(lx,IC_IMM_U64,0,sys_internal_types[IT_I64]); if (nobound) CBICAdd(lx,IC_NOBOUND_SWITCH,mc_jt,0); else @@ -1457,7 +1429,6 @@ U0 PrsSwitch(CLex *lx,Bool nobound,CHashFun *locals,I64 try_cnt) if (Lex(lx)!='{') LexExcept(lx,"ST_EXPECTING_LEFT_BRACE"); Lex(lx); - lx->temp_indent_level=lx->indent_level++; while (lx->token && lx->token!='}') { k=PrsKeyWord(lx); if (k==KW_CASE) { @@ -1495,24 +1466,18 @@ U0 PrsSwitch(CLex *lx,Bool nobound,CHashFun *locals,I64 try_cnt) LexExcept(lx,"ST_EXPECTING_COLON"); } else LexExcept(lx,"ST_EXPECTING_COLON"); - first=TRUE; } else if (k==KW_DFT) { Lex(lx); CBICAdd(lx,IC_LABEL,lb_dft,0); if (lx->token==':') Lex(lx); + else + LexExcept(lx,"ST_EXPECTING_COLON"); dft_found=TRUE; - first=TRUE; - } else { - if (first) { - lx->temp_indent_level++; - first=FALSE; - } + } else PrsStatement(lx,locals,try_cnt,lb_break); - } } - lx->temp_indent_level=--lx->indent_level; if (!dft_found) CBICAdd(lx,IC_LABEL,lb_dft,0); CBICAdd(lx,IC_LABEL,lb_break,0); @@ -1523,9 +1488,9 @@ U0 PrsSwitch(CLex *lx,Bool nobound,CHashFun *locals,I64 try_cnt) if (00x4000) + if (lo>hi || !(0ic_data=lo; tempi_cmp->ic_data=range; @@ -1562,16 +1527,8 @@ U0 PrsNoUnusedWarn(CLex *lx) U0 PrsStreamBlk(CLex *lx) { - CHashTable *ht1=lx->hash_table_lst, - *ht2=lx->define_hash_table, - *ht3=lx->glbl_hash_table, - *ht4=lx->local_hash_table, - *ht5=lx->stream_parent_glbl_hash_table; - I64 old_hash_mask=lx->hash_mask, - old_flags=lx->flags & (LF_ASM_EXPRESSIONS | LF_EXE_BLK|LF_AOT_COMPILE); + CLexHashTableContext *htc=MAlloc(sizeof(CLexHashTableContext)); CStreamBlk *tempe=MAlloc(sizeof(CStreamBlk)); - CHashFun *old_var_lst=lx->local_var_lst; - lx->local_var_lst=NULL; tempe->body=StrNew(""); QueIns(tempe,lx->last_stream_blk); @@ -1579,9 +1536,12 @@ U0 PrsStreamBlk(CLex *lx) lx->cbh.cb_misc_lst=NULL; lx->cbh.cb_misc_lst_end=&lx->cbh.cb_misc_lst; - lx->stream_parent_glbl_hash_table=lx->glbl_hash_table; - lx->hash_mask=HTG_ALL-HTT_IMPORT_SYS_SYM-HTT_ASM_KEYWORD; - lx->define_hash_table=lx->hash_table_lst=lx->glbl_hash_table=lx->local_hash_table=Fs->hash_table; + MemCpy(htc,&lx->htc,sizeof(CLexHashTableContext)); + htc->old_flags=lx->flags; + lx->htc.next=htc; + lx->htc.local_var_lst=NULL; + lx->htc.hash_mask=HTG_ALL-HTT_IMPORT_SYS_SYM-HTT_ASM_KEYWORD; + lx->htc.define_hash_table=lx->htc.hash_table_lst=lx->htc.glbl_hash_table=lx->htc.local_hash_table=Fs->hash_table; lx->flags=lx->flags & ~(LF_ASM_EXPRESSIONS|LF_AOT_COMPILE) | LF_EXE_BLK; if (lx->token=='{') Lex(lx); @@ -1590,15 +1550,11 @@ U0 PrsStreamBlk(CLex *lx) while (lx->token && lx->token!='}') ExeCmdLine(lx); - lx->hash_table_lst =ht1, - lx->define_hash_table=ht2; - lx->glbl_hash_table =ht3; - lx->local_hash_table =ht4; - lx->stream_parent_glbl_hash_table=ht5; + MemCpy(&lx->htc,htc,sizeof(CLexHashTableContext)); + lx->flags=lx->flags&~LF_EXE_BLK | + htc->old_flags & (LF_ASM_EXPRESSIONS|LF_EXE_BLK|LF_AOT_COMPILE); + Free(htc); - lx->local_var_lst=old_var_lst; - lx->hash_mask=old_hash_mask; - lx->flags= lx->flags&~LF_EXE_BLK | old_flags; CBPop(lx); QueRem(tempe); if (*tempe->body) @@ -1609,14 +1565,12 @@ U0 PrsStreamBlk(CLex *lx) Lex(lx); //Skip "}" } - U0 PrsTryBlk(CLex *lx,CHashFun *locals,I64 try_cnt) { CCodeBlkMisc *lb_catch,*lb_done,*lb_untry; - Bool has_brace; CHashClass *tempc=sys_internal_types[IT_PTR]; - CHashFun *temp_try=HashFind("SysTry",lx->hash_table_lst,HTT_FUN), - *temp_untry=HashFind("SysUntry",lx->hash_table_lst,HTT_FUN); + CHashFun *temp_try=HashFind("SysTry",lx->htc.hash_table_lst,HTT_FUN), + *temp_untry=HashFind("SysUntry",lx->htc.hash_table_lst,HTT_FUN); if (!temp_try || !temp_untry) LexExcept(lx,"ST_HEADER_FOR_SYSTRY"); @@ -1627,13 +1581,6 @@ U0 PrsTryBlk(CLex *lx,CHashFun *locals,I64 try_cnt) lb_done =CBMiscNew(lx,CBMT_LABEL); lb_untry=CBMiscNew(lx,CBMT_LABEL); - if (lx->token=='{') - has_brace=TRUE; - else { - lx->temp_indent_level=++lx->indent_level; - has_brace=FALSE; - } - CBICAdd(lx,IC_CALL_START,0,0); CBICAdd(lx,IC_GET_LABEL,lb_untry,tempc,ICF_PUSH_RESULT); CBICAdd(lx,IC_GET_LABEL,lb_catch,tempc,ICF_PUSH_RESULT); @@ -1653,8 +1600,6 @@ U0 PrsTryBlk(CLex *lx,CHashFun *locals,I64 try_cnt) CBICAdd(lx,IC_END_EXP,0,0); PrsStatement(lx,locals,try_cnt+1); - if (!has_brace) - lx->temp_indent_level=lx->indent_level--; CBICAdd(lx,IC_LABEL,lb_untry,0); CBICAdd(lx,IC_CALL_START,0,0); @@ -1675,22 +1620,14 @@ U0 PrsTryBlk(CLex *lx,CHashFun *locals,I64 try_cnt) LexExcept(lx,"ST_MISSING_CATCH"); Lex(lx); - if (lx->token=='{') - has_brace=TRUE; - else { - lx->temp_indent_level=++lx->indent_level; - has_brace=FALSE; - } CBICAdd(lx,IC_LABEL,lb_catch,0); PrsStatement(lx,locals,try_cnt+1); - if (!has_brace) - lx->temp_indent_level=lx->indent_level--; CBICAdd(lx,IC_RET,0,tempc); CBICAdd(lx,IC_LABEL,lb_done,0); } Bool PrsStatement(CLex *lx,CHashFun *locals,I64 try_cnt=0, - CCodeBlkMisc *lb_break=NULL,Bool saved_prs_semicolon=TRUE,Bool if_else=FALSE) + CCodeBlkMisc *lb_break=NULL,Bool saved_prs_semicolon=TRUE) { Bool prs_exp,cont,prs_semicolon; I64 i,cps_flags=0,last_cps_flags=0; @@ -1700,7 +1637,6 @@ Bool PrsStatement(CLex *lx,CHashFun *locals,I64 try_cnt=0, CHashFun *temp_untry; CExe *tempex; - lx->temp_indent_level=lx->indent_level++; do { cps_flags&=~CPS_FUN_FLAGS; cont=FALSE; @@ -1712,12 +1648,10 @@ Bool PrsStatement(CLex *lx,CHashFun *locals,I64 try_cnt=0, if (lx->token=='{') { Lex(lx); lx->braces_cnt++; - lx->temp_indent_level=lx->indent_level--; while (lx->token!='}') PrsStatement(lx,locals,try_cnt,lb_break); lx->braces_cnt--; lx->statement_cnt--; - lx->temp_indent_level=lx->indent_level++; Lex(lx); } else if (lx->token==TK_EOF) ; else if (lx->token==';') { @@ -1733,11 +1667,7 @@ Bool PrsStatement(CLex *lx,CHashFun *locals,I64 try_cnt=0, nobound_switch (i) { case KW_IF: Lex(lx); - if (if_else) - lx->temp_indent_level=lx->indent_level--; PrsIf(lx,locals,try_cnt,lb_break); - if (if_else) - lx->temp_indent_level=lx->indent_level++; prs_semicolon=FALSE; break; case KW_FOR: @@ -1898,7 +1828,7 @@ keyword_import: LexExcept(lx,"ST_CANT_RETURN_VAL"); if (try_cnt) { temp_untry=HashFind("SysUntry", - lx->hash_table_lst,HTT_FUN); + lx->htc.hash_table_lst,HTT_FUN); for (i=0;iflags,Cf_EXTERN)) { lx->abs_cnts.externs++; @@ -2022,7 +1952,6 @@ keyword_import: LexExcept(lx,"ST_DUP_GOTO_LABEL"); g_lb->flags|=CBMF_DEFINED; Lex(lx); //skip ident - lx->temp_indent_level=0; CBICAdd(lx,IC_LABEL,g_lb,0); if (lx->token==':') //skip ident Lex(lx); //skip colon @@ -2051,6 +1980,5 @@ keyword_import: } last_cps_flags=cps_flags; } while (lx->token==',' || cont); - lx->temp_indent_level=lx->indent_level--; return cps_flags&CPS_IS_ASM; } diff --git a/TempleOS/Compiler/Unassembler.CPP b/TempleOS/Compiler/Unassembler.CPP index 7c333f7..482c1f4 100644 --- a/TempleOS/Compiler/Unassembler.CPP +++ b/TempleOS/Compiler/Unassembler.CPP @@ -217,18 +217,32 @@ U0 UnasmHashLoad() QSortI64(unasm_table,cnt,&InstEntriesCompare); } +I64 StrStrBits(U8 *st) +{ + if (StrStr(st,"8")) + return 8; + if (StrStr(st,"16")) + return 16; + if (StrStr(st,"32")) + return 32; + if (StrStr(st,"64")) + return 64; + return 0; +} + U0 Ui(U8 *buf,U8 **_ip,I64 seg_size=64,I64 *_jmp_dst=NULL,Bool just_ins=FALSE) //Unassembles one instruction { - I64 disp,imm,opsize,opadd, - i,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,REX=-1,REX_r=0,REX_x=0,REX_b=0; + I64 i,disp,imm,opsize,opadd, + a1,a2,reloced_a1,reloced_a2, + a1_size=0,a2_size=0,reloced_a1_size,reloced_a2_size, + ModrM=-1,SIB=-1,scale,r1,r2, + Mod=-1,RM1=-1,RM2=-1,REX=-1,REX_r=0,REX_x=0,REX_b=0; Bool cont; CInstruction *tempi,*tempi2; CHashOpcode *tempo; - U8 *ip=*_ip,*ptr,*a1_st,*a2_st,*bin_data_area,*bin_data_area2, - buf2[256],buf3[256],seg_overrides[40],arg1_st[256],arg2_st[256]; + U8 *ip=*_ip,*ptr,*reloced_a1_st,*reloced_a2_st,*bin_data_area1,*bin_data_area2, + buf2[256],line1[256],line2[256],a1_st[256],a2_st[256],seg_overrides[32]; if (_jmp_dst) *_jmp_dst=-1; if (seg_size==16) { @@ -241,41 +255,38 @@ U0 Ui(U8 *buf,U8 **_ip,I64 seg_size=64,I64 *_jmp_dst=NULL,Bool just_ins=FALSE) opsize=32; opadd=64; } - *arg1_st=0; - *arg2_st=0; - a1_st=arg1_st; - a2_st=arg2_st; - - if (!IsRaw && PutSrcLink(ip,1,buf)) - StrCat(buf,"\n"); + *a1_st=0; + *a2_st=0; + if (!IsRaw && PutSrcLink(ip,1,line1)) + StrCat(line1,"\n"); else - *buf=0; + *line1=0; - SPrintF(buf+StrLen(buf),"%24tP ",ip); - bin_data_area=buf+StrLen(buf); + SPrintF(line1+StrLen(line1),"%24tP ",ip); + bin_data_area1=line1+StrLen(line1); for (i=0;i<6;i++) { SPrintF(buf2,"%02X",ip[i]); - StrCat(buf,buf2); + StrCat(line1,buf2); } - StrCat(buf," "); + StrCat(line1," "); - SPrintF(buf3,"%24tP ",ip+6); - bin_data_area2=buf3+StrLen(buf3); + SPrintF(line2,"%24tP ",ip+6); + bin_data_area2=line2+StrLen(line2); for (i=6;i<12;i++) { SPrintF(buf2,"%02X",ip[i]); - StrCat(buf3,buf2); + StrCat(line2,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 0x2E: if (StrLen(seg_overrides)<24) StrCat(seg_overrides,"CS:"); break; + case 0x36: if (StrLen(seg_overrides)<24) StrCat(seg_overrides,"SS:"); break; + case 0x3E: if (StrLen(seg_overrides)<24) StrCat(seg_overrides,"DS:"); break; + case 0x26: if (StrLen(seg_overrides)<24) StrCat(seg_overrides,"ES:"); break; + case 0x64: if (StrLen(seg_overrides)<24) StrCat(seg_overrides,"FS:"); break; + case 0x65: if (StrLen(seg_overrides)<24) StrCat(seg_overrides,"GS:"); break; case OC_OP_SIZE_PREFIX: if (opsize==16) opsize=32; @@ -384,186 +395,147 @@ U0 Ui(U8 *buf,U8 **_ip,I64 seg_size=64,I64 *_jmp_dst=NULL,Bool just_ins=FALSE) if (opsize==32 && seg_size==64) { tempi2=InstEntryFind(ip,64); if (tempi2!=tempi && - tempi2->flags&IEF_REX_ONLY_R8_R15 || - tempi2->flags&IEF_REX_XOR_LIKE&& ip[1]>>3&7==ip[1]&7) + tempi2->flags&IEF_REX_ONLY_R8_R15 || + tempi2->flags&IEF_REX_XOR_LIKE&& ip[1]>>3&7==ip[1]&7) tempi=tempi2; } ip+=tempi->opcode_cnt; tempo=tempi(U8 *)-tempi->ins_entry_num*sizeof(CInstruction)-offset(CHashOpcode.ins); if (just_ins) - *buf=0; - StrCat(buf,tempo->str); + *line1=0; + StrCat(line1,tempo->str); a1=tempi->arg1; a2=tempi->arg2; - aa1=a1; - aa2=a2; - ptr=DefineSub(a1,"ST_ARG_TYPES"); - if (Bt(&uasm_signed_arg_mask,a1)) { - if (StrStr(ptr,"8")) { - arg1_size=1; - StrCat(arg1_st,"I8 "); - } else if (StrStr(ptr,"16")) { - arg1_size=2; - StrCat(arg1_st,"I16 "); - } else if (StrStr(ptr,"32")) { - arg1_size=4; - StrCat(arg1_st,"I32 "); - } else if (StrStr(ptr,"64")) { - arg1_size=8; - StrCat(arg1_st,"I64 "); - } - } else { - if (StrStr(ptr,"8")) { - arg1_size=1; - StrCat(arg1_st,"U8 "); - } else if (StrStr(ptr,"16")) { - arg1_size=2; - StrCat(arg1_st,"U16 "); - } else if (StrStr(ptr,"32")) { - arg1_size=4; - StrCat(arg1_st,"U32 "); - } else if (StrStr(ptr,"64")) { - arg1_size=8; - StrCat(arg1_st,"U64 "); - } + if (a1_size=StrStrBits(DefineSub(a1,"ST_ARG_TYPES"))) { + if (Bt(&uasm_signed_arg_mask,a1)) + SPrintF(buf2,"I%d ",a1_size); + else + SPrintF(buf2,"U%d ",a1_size); + StrCat(a1_st,buf2); } - ptr=DefineSub(a2,"ST_ARG_TYPES"); - if (Bt(&uasm_signed_arg_mask,a2)) { - if (StrStr(ptr,"8")) { - arg2_size=1; - StrCat(arg2_st,"I8 "); - } else if (StrStr(ptr,"16")) { - arg2_size=2; - StrCat(arg2_st,"I16 "); - } else if (StrStr(ptr,"32")) { - arg2_size=4; - StrCat(arg2_st,"I32 "); - } else if (StrStr(ptr,"64")) { - arg2_size=8; - StrCat(arg2_st,"I64 "); - } - } else { - if (StrStr(ptr,"8")) { - arg2_size=1; - StrCat(arg2_st,"U8 "); - } else if (StrStr(ptr,"16")) { - arg2_size=2; - StrCat(arg2_st,"U16 "); - } else if (StrStr(ptr,"32")) { - arg2_size=4; - StrCat(arg2_st,"U32 "); - } else if (StrStr(ptr,"64")) { - arg2_size=8; - StrCat(arg2_st,"U64 "); - } + if (a2_size=StrStrBits(DefineSub(a2,"ST_ARG_TYPES"))) { + if (Bt(&uasm_signed_arg_mask,a2)) + SPrintF(buf2,"I%d ",a2_size); + else + SPrintF(buf2,"U%d ",a2_size); + StrCat(a2_st,buf2); } - a1_size=arg1_size; - a2_size=arg2_size; if (tempi->flags & IEF_PLUS_OPCODE) { ip--; RM1=*ip++ - tempi->opcode[tempi->opcode_cnt-1]+REX_b; - *buf2=0; + ptr=NULL; if (ARGT_R8<=a1<=ARGT_R64) { - if (a1_size==1) { + if (a1_size==8) { if (REX!=-1) - SPrintF(buf2,"%Z",RM1,"ST_U8_REX_REGS"); + ptr="ST_U8_REX_REGS"; else - SPrintF(buf2,"%Z",RM1,"ST_U8_REGS"); - } else if (a1_size==2) - SPrintF(buf2,"%Z",RM1,"ST_U16_REGS"); - else if (a1_size==4) - SPrintF(buf2,"%Z",RM1,"ST_U32_REGS"); - else if (a1_size==8) - SPrintF(buf2,"%Z",RM1,"ST_U64_REGS"); - StrCat(a1_st,buf2); + ptr="ST_U8_REGS"; + } else if (a1_size==16) + ptr="ST_U16_REGS"; + else if (a1_size==32) + ptr="ST_U32_REGS"; + else if (a1_size==64) + ptr="ST_U64_REGS"; + if (ptr) + StrCat(a1_st,DefineSub(RM1,ptr)); } else { - if (a2_size==1) { + if (a2_size==8) { if (REX!=-1) - SPrintF(buf2,"%Z",RM1,"ST_U8_REX_REGS"); + ptr="ST_U8_REX_REGS"; else - SPrintF(buf2,"%Z",RM1,"ST_U8_REGS"); - } else if (a2_size==2) - SPrintF(buf2,"%Z",RM1,"ST_U16_REGS"); - else if (a2_size==4) - SPrintF(buf2,"%Z",RM1,"ST_U32_REGS"); - else if (a2_size==8) - SPrintF(buf2,"%Z",RM1,"ST_U64_REGS"); - StrCat(a2_st,buf2); + ptr="ST_U8_REGS"; + } else if (a2_size==16) + ptr="ST_U16_REGS"; + else if (a2_size==32) + ptr="ST_U32_REGS"; + else if (a2_size==64) + ptr="ST_U64_REGS"; + if (ptr) + StrCat(a2_st,DefineSub(RM1,ptr)); } } + if (ARGT_RM8<=a1<=ARGT_RM64 || - ARGT_M8<=a1<=ARGT_M64 || - ARGT_RM8<=a2<=ARGT_RM64 || - ARGT_M8<=a2<=ARGT_M64) { - if (ARGT_RM8<=a2<=ARGT_RM64 || + ARGT_M8<=a1<=ARGT_M64 || + ARGT_RM8<=a2<=ARGT_RM64 || ARGT_M8<=a2<=ARGT_M64) { - a1_st=arg2_st; - a2_st=arg1_st; - a1_size=arg2_size; - a2_size=arg1_size; - aa1=a2; - aa2=a1; + if (ARGT_RM8<=a2<=ARGT_RM64 || + ARGT_M8<=a2<=ARGT_M64) { + reloced_a1=a2; + reloced_a2=a1; + reloced_a1_size=a2_size; + reloced_a2_size=a1_size; + reloced_a1_st=a2_st; + reloced_a2_st=a1_st; + } else { + reloced_a1=a1; + reloced_a2=a2; + reloced_a1_size=a1_size; + reloced_a2_size=a2_size; + reloced_a1_st=a1_st; + reloced_a2_st=a2_st; } - StrCat(a1_st,seg_overrides); + + StrCat(reloced_a1_st,seg_overrides); ModrM=*ip++; Mod=ModrM>>6 & 3; RM1=ModrM & 7+REX_b; RM2=ModrM>>3 & 7+REX_r; - if (Mod<3 && RM1&7==4) { + if (Mod<3 && RM1&7==4) SIB=*ip++; - } if (Mod==1) { disp=*ip(U8 *)++; SPrintF(buf2,"%02X",disp); - StrCat(a1_st,buf2); - } - if (Mod==2) { + StrCat(reloced_a1_st,buf2); + } else if (Mod==2) { disp=*ip(U32 *)++; SPrintF(buf2,"%08X",disp); - StrCat(a1_st,buf2); + StrCat(reloced_a1_st,buf2); } if (tempi->slash_val<8) RM2=-1; else { - *buf2=0; - if (aa2==ARGT_SREG) - SPrintF(buf2,"%Z",RM2,"ST_SEG_REGS"); - else if (!(ARGT_IMM8<=aa2<=ARGT_IMM64) && - !(ARGT_UIMM8<=aa2<=ARGT_UIMM64)) { - if (a2_size==1) { + ptr=NULL; + if (reloced_a2==ARGT_SREG) { + if (RM2<=5) + ptr="ST_SEG_REGS"; + } else if (!(ARGT_IMM8<=reloced_a2<=ARGT_IMM64) && + !(ARGT_UIMM8<=reloced_a2<=ARGT_UIMM64)) { + if (reloced_a2_size==8) { if (REX!=-1) - SPrintF(buf2,"%Z",RM2,"ST_U8_REX_REGS"); + ptr="ST_U8_REX_REGS"; else - SPrintF(buf2,"%Z",RM2,"ST_U8_REGS"); - }else if (a2_size==2) - SPrintF(buf2,"%Z",RM2,"ST_U16_REGS"); - else if (a2_size==4) - SPrintF(buf2,"%Z",RM2,"ST_U32_REGS"); - else if (a2_size==8) - SPrintF(buf2,"%Z",RM2,"ST_U64_REGS"); + ptr="ST_U8_REGS"; + } else if (reloced_a2_size==16) + ptr="ST_U16_REGS"; + else if (reloced_a2_size==32) + ptr="ST_U32_REGS"; + else if (reloced_a2_size==64) + ptr="ST_U64_REGS"; } - StrCat(a2_st,buf2); + if (ptr) + StrCat(reloced_a2_st,DefineSub(RM2,ptr)); } if (RM1&7==5 && !Mod) { disp=*ip(I32 *)++; if (seg_size==64) { disp+=ip; - if (aa2==ARGT_IMM8 || aa2==ARGT_UIMM8) + if (reloced_a2==ARGT_IMM8 || reloced_a2==ARGT_UIMM8) disp++; - else if (aa2==ARGT_IMM16 || aa2==ARGT_UIMM16) + else if (reloced_a2==ARGT_IMM16 || reloced_a2==ARGT_UIMM16) disp+=2; - else if (aa2==ARGT_IMM32 || aa2==ARGT_UIMM32) + else if (reloced_a2==ARGT_IMM32 || reloced_a2==ARGT_UIMM32) disp+=4; - else if (aa2==ARGT_IMM64 || aa2==ARGT_UIMM64) + else if (reloced_a2==ARGT_IMM64 || reloced_a2==ARGT_UIMM64) disp+=8; } SPrintF(buf2,"[%X] ",disp); - StrCat(a1_st,buf2); + StrCat(reloced_a1_st,buf2); RM1=-1; } else { if (Mod<3) { @@ -580,101 +552,62 @@ U0 Ui(U8 *buf,U8 **_ip,I64 seg_size=64,I64 *_jmp_dst=NULL,Bool just_ins=FALSE) scale=2; else scale=1; + if (seg_size==64) + ptr="ST_U64_REGS"; + else + ptr="ST_U32_REGS"; if (r1==CREG_RBP && !Mod) { disp=*ip(U32 *)++; SPrintF(buf2,"%08X",disp); - StrCat(a1_st,buf2); - if (seg_size!=64) - SPrintF(buf2,"[%Z*%d]",r2,"ST_U32_REGS",scale); - else - SPrintF(buf2,"[%Z*%d]",r2,"ST_U64_REGS",scale); - StrCat(a1_st,buf2); + StrCat(reloced_a1_st,buf2); + SPrintF(buf2,"[%Z*%d]",r2,ptr,scale); + StrCat(reloced_a1_st,buf2); } else if (r2==4) { - if (seg_size!=64) - SPrintF(buf2,"[%Z]",r1,"ST_U32_REGS"); - else - SPrintF(buf2,"[%Z]",r1,"ST_U64_REGS"); - StrCat(a1_st,buf2); + SPrintF(buf2,"[%Z]",r1,ptr); + StrCat(reloced_a1_st,buf2); } else { - if (seg_size!=64) - SPrintF(buf2,"[%Z+%Z*%d]",r1,"ST_U32_REGS", - r2,"ST_U32_REGS",scale); - else - SPrintF(buf2,"[%Z+%Z*%d]",r1,"ST_U64_REGS", - r2,"ST_U64_REGS",scale); - StrCat(a1_st,buf2); + SPrintF(buf2,"[%Z+%Z*%d]",r1,ptr,r2,ptr,scale); + StrCat(reloced_a1_st,buf2); } } else { - *buf2=0; if (opadd==16) - SPrintF(buf2,"[%Z]",RM1,"ST_U16_REGS"); + ptr="ST_U16_REGS"; else if (opadd==32) - SPrintF(buf2,"[%Z]",RM1,"ST_U32_REGS"); + ptr="ST_U32_REGS"; else - SPrintF(buf2,"[%Z]",RM1,"ST_U64_REGS"); - StrCat(a1_st,buf2); + ptr="ST_U64_REGS"; + SPrintF(buf2,"[%Z]",RM1,ptr); + StrCat(reloced_a1_st,buf2); } } else { - *buf2=0; - if (a1_size==1) { + ptr=NULL; + if (reloced_a1_size==8) { if (REX!=-1) - SPrintF(buf2,"%Z",RM1,"ST_U8_REX_REGS"); + ptr="ST_U8_REX_REGS"; else - SPrintF(buf2,"%Z",RM1,"ST_U8_REGS"); - } else if (a1_size==2) - SPrintF(buf2,"%Z",RM1,"ST_U16_REGS"); - else if (a1_size==4) - SPrintF(buf2,"%Z",RM1,"ST_U32_REGS"); - else if (a1_size==8) - SPrintF(buf2,"%Z",RM1,"ST_U64_REGS"); - StrCat(a1_st,buf2); + ptr="ST_U8_REGS"; + } else if (reloced_a1_size==16) + ptr="ST_U16_REGS"; + else if (reloced_a1_size==32) + ptr="ST_U32_REGS"; + else if (reloced_a1_size==64) + ptr="ST_U64_REGS"; + if (ptr) + StrCat(reloced_a1_st,DefineSub(RM1,ptr)); } } } - if (ARGT_MOFFS8<=a1<=ARGT_MOFFS64) { - StrCat(arg1_st,seg_overrides); - if (arg1_size==1) { - disp=*ip(U8 *)++; - SPrintF(buf2,"[%X]",disp); - StrCat(arg1_st,buf2); - } else if (opadd==16) { - disp=*ip(U16 *)++; - SPrintF(buf2,"[%X]",disp); - StrCat(arg1_st,buf2); - } else { - disp=*ip(U32 *)++; - SPrintF(buf2,"[%X]",disp); - StrCat(arg1_st,buf2); - } - } - - if (ARGT_MOFFS8<=a2<=ARGT_MOFFS64) { - StrCat(arg2_st,seg_overrides); - if (arg2_size==1) { - disp=*ip(U8 *)++; - SPrintF(buf2,"[%X]",disp); - StrCat(arg2_st,buf2); - } else if (opadd==16) { - disp=*ip(U16 *)++; - SPrintF(buf2,"[%X]",disp); - StrCat(arg2_st,buf2); - } else { - disp=*ip(U32 *)++; - SPrintF(buf2,"[%X]",disp); - StrCat(arg2_st,buf2); - } - } switch (a1) { case ARGT_IMM8: case ARGT_UIMM8: imm=*ip(U8 *)++; SPrintF(buf2,"%02X",imm); - StrCat(arg1_st,buf2); + StrCat(a1_st,buf2); if (tempi->opcode[0]==0xCD) { if (ptr=DefineSub(imm,"ST_INT_NAMES")) { - StrCat(arg1_st," "); - StrCat(arg1_st,ptr); + StrCat(a1_st," "); + StrCat(a1_st,ptr); } } break; @@ -682,84 +615,94 @@ U0 Ui(U8 *buf,U8 **_ip,I64 seg_size=64,I64 *_jmp_dst=NULL,Bool just_ins=FALSE) case ARGT_UIMM16: imm=*ip(U16 *)++; SPrintF(buf2,"%04X",imm); - StrCat(arg1_st,buf2); + StrCat(a1_st,buf2); break; case ARGT_IMM32: case ARGT_UIMM32: imm=*ip(U32 *)++; SPrintF(buf2,"%08X",imm); - StrCat(arg1_st,buf2); + StrCat(a1_st,buf2); break; case ARGT_IMM64: case ARGT_UIMM64: imm=*ip(I64 *)++; SPrintF(buf2,"%016X",imm); - StrCat(arg1_st,buf2); + StrCat(a1_st,buf2); break; case ARGT_REL8: disp=*ip(I8 *)++; disp+=ip; SPrintF(buf2,"%P ",disp); if (_jmp_dst) *_jmp_dst=disp; - StrCat(arg1_st,buf2); + StrCat(a1_st,buf2); break; case ARGT_REL16: disp=*ip(I16 *)++; disp+=ip; SPrintF(buf2,"%P ",disp); if (_jmp_dst) *_jmp_dst=disp; - StrCat(arg1_st,buf2); + StrCat(a1_st,buf2); break; case ARGT_REL32: disp=*ip(I32 *)++; disp+=ip; SPrintF(buf2,"%P ",disp); if (_jmp_dst) *_jmp_dst=disp; - StrCat(arg1_st,buf2); + StrCat(a1_st,buf2); + break; + case ARGT_MOFFS8...ARGT_MOFFS64: + StrCat(a1_st,seg_overrides); + if (a1_size==8) + disp=*ip(U8 *)++; + else if (opadd==16) + disp=*ip(U16 *)++; + else + disp=*ip(U32 *)++; + SPrintF(buf2,"[%X]",disp); + StrCat(a1_st,buf2); break; case ARGT_CL: - StrCat(arg1_st,"CL"); + StrCat(a1_st,"CL"); break; case ARGT_AL: - StrCat(arg1_st,"AL"); + StrCat(a1_st,"AL"); break; case ARGT_AX: - StrCat(arg1_st,"AX"); + StrCat(a1_st,"AX"); break; case ARGT_EAX: - StrCat(arg1_st,"EAX"); + StrCat(a1_st,"EAX"); break; case ARGT_RAX: - StrCat(arg1_st,"RAX"); + StrCat(a1_st,"RAX"); break; case ARGT_DX: - StrCat(arg1_st,"DX"); + StrCat(a1_st,"DX"); break; case ARGT_SS: - StrCat(arg1_st,"SS"); + StrCat(a1_st,"SS"); break; case ARGT_DS: - StrCat(arg1_st,"DS"); + StrCat(a1_st,"DS"); break; case ARGT_ES: - StrCat(arg1_st,"ES"); + StrCat(a1_st,"ES"); break; case ARGT_FS: - StrCat(arg1_st,"FS"); + StrCat(a1_st,"FS"); break; case ARGT_GS: - StrCat(arg1_st,"GS"); + StrCat(a1_st,"GS"); break; case ARGT_CS: - StrCat(arg1_st,"CS"); + StrCat(a1_st,"CS"); break; case ARGT_ST0: - StrCat(arg1_st,"ST0"); + StrCat(a1_st,"ST0"); break; case ARGT_STI: ip--; - SPrintF(buf2,"%Z",*ip++ - tempi->opcode[tempi->opcode_cnt-1],"ST_FSTK_REGS"); - StrCat(arg1_st,buf2); + StrCat(a1_st,DefineSub(*ip++ - tempi->opcode[tempi->opcode_cnt-1],"ST_FSTK_REGS")); break; } @@ -768,97 +711,107 @@ U0 Ui(U8 *buf,U8 **_ip,I64 seg_size=64,I64 *_jmp_dst=NULL,Bool just_ins=FALSE) case ARGT_UIMM8: imm=*ip(U8 *)++; SPrintF(buf2,"%02X",imm); - StrCat(arg2_st,buf2); + StrCat(a2_st,buf2); break; case ARGT_IMM16: case ARGT_UIMM16: imm=*ip(U16 *)++; SPrintF(buf2,"%04X",imm); - StrCat(arg2_st,buf2); + StrCat(a2_st,buf2); break; case ARGT_IMM32: case ARGT_UIMM32: imm=*ip(U32 *)++; SPrintF(buf2,"%08X",imm); - StrCat(arg2_st,buf2); + StrCat(a2_st,buf2); break; case ARGT_IMM64: case ARGT_UIMM64: imm=*ip(I64 *)++; SPrintF(buf2,"%016X",imm); - StrCat(arg2_st,buf2); + StrCat(a2_st,buf2); + break; + case ARGT_MOFFS8...ARGT_MOFFS64: + StrCat(a2_st,seg_overrides); + if (a2_size==8) + disp=*ip(U8 *)++; + else if (opadd==16) + disp=*ip(U16 *)++; + else + disp=*ip(U32 *)++; + SPrintF(buf2,"[%X]",disp); + StrCat(a2_st,buf2); break; case ARGT_CL: - StrCat(arg2_st,"CL"); + StrCat(a2_st,"CL"); break; case ARGT_AL: - StrCat(arg2_st,"AL"); + StrCat(a2_st,"AL"); break; case ARGT_AX: - StrCat(arg2_st,"AX"); + StrCat(a2_st,"AX"); break; case ARGT_EAX: - StrCat(arg2_st,"EAX"); + StrCat(a2_st,"EAX"); break; case ARGT_RAX: - StrCat(arg2_st,"RAX"); + StrCat(a2_st,"RAX"); break; case ARGT_DX: - StrCat(arg2_st,"DX"); + StrCat(a2_st,"DX"); break; case ARGT_SS: - StrCat(arg2_st,"SS"); + StrCat(a2_st,"SS"); break; case ARGT_DS: - StrCat(arg2_st,"DS"); + StrCat(a2_st,"DS"); break; case ARGT_ES: - StrCat(arg2_st,"ES"); + StrCat(a2_st,"ES"); break; case ARGT_FS: - StrCat(arg2_st,"FS"); + StrCat(a2_st,"FS"); break; case ARGT_GS: - StrCat(arg2_st,"GS"); + StrCat(a2_st,"GS"); break; case ARGT_CS: - StrCat(arg2_st,"CS"); + StrCat(a2_st,"CS"); break; case ARGT_ST0: - StrCat(arg2_st,"ST0"); + StrCat(a2_st,"ST0"); break; case ARGT_STI: ip--; - SPrintF(buf2,"%Z",*ip++ - tempi->opcode[tempi->opcode_cnt-1],"ST_FSTK_REGS"); - StrCat(arg2_st,buf2); + StrCat(a2_st,DefineSub(*ip++ - tempi->opcode[tempi->opcode_cnt-1],"ST_FSTK_REGS")); break; } if (tempi->flags&IEF_ENDING_ZERO) ip++; - if (*arg1_st) { - StrCat(buf,"\t"); - StrCat(buf,arg1_st); + if (*a1_st) { + StrCat(line1,"\t"); + StrCat(line1,a1_st); } - if (*arg2_st) { - StrCat(buf,","); - StrCat(buf,arg2_st); + if (*a2_st) { + StrCat(line1,","); + StrCat(line1,a2_st); } + StrCat(line1,"\n"); + StrCat(line2,"\n"); if (!just_ins) { for (i=ip-(*_ip)(I64);i<6;i++) { - bin_data_area[i<<1]=CH_SPACE; - bin_data_area[i<<1+1]=CH_SPACE; + bin_data_area1[i<<1]=CH_SPACE; + bin_data_area1[i<<1+1]=CH_SPACE; } for (i=ip-(*_ip)(I64);i<12;i++) { bin_data_area2[(i-6)<<1]=CH_SPACE; bin_data_area2[(i-6)<<1+1]=CH_SPACE; } } - StrCat(buf,"\n"); - if (!just_ins && ip-(*_ip)(I64)>6) { - StrCat(buf,buf3); - StrCat(buf,"\n"); - } + StrCpy(buf,line1); + if (!just_ins && ip-(*_ip)(I64)>6) + StrCat(buf,line2); *_ip=ip; } diff --git a/TempleOS/Demo/AcctExample/Adam3bPkgs.CPP b/TempleOS/Demo/AcctExample/Adam3bPkgs.CPP index c10725a..7001c54 100644 --- a/TempleOS/Demo/AcctExample/Adam3bPkgs.CPP +++ b/TempleOS/Demo/AcctExample/Adam3bPkgs.CPP @@ -5,5 +5,4 @@ Cd("HOME");; #include "/TempleOS/Accts/TS/TSAdam" #include "/TempleOS/Accts/TS/TSDistro" -#include "/TempleOS/Demo/WebLogExample/WebLogRep" Cd("HOME");; diff --git a/TempleOS/Demo/AcctExample/Adam3dKeyPlugIns.CPP b/TempleOS/Demo/AcctExample/Adam3dKeyPlugIns.CPP index 50eaabd..60a6a03 100644 --- a/TempleOS/Demo/AcctExample/Adam3dKeyPlugIns.CPP +++ b/TempleOS/Demo/AcctExample/Adam3dKeyPlugIns.CPP @@ -3,13 +3,13 @@ U0 FillInTime() { - CDate spdt; - spdt=GetCurTimeCDate; - "$$IV,1$$----%D %T----$$IV,0$$\n",spdt,spdt; + CDate cdt; + cdt=GetCurTimeDate; + "$$IV,1$$----%D %T----$$IV,0$$\n",cdt,cdt; } U0 RandQuote(I64 num) -{ //$LK-A,"::/TempleOS/Apps/AfterEgypt/AENotes.TXT"$ +{ //$LK-A,"::/TempleOS/Apps/HolySpirit/HSNotes.TXT"$ I64 i,size,l=512; U8 *bible_filename=Define("ST_BIBLE_FILE"), *buf=FileRead(bible_filename,&size); @@ -22,7 +22,7 @@ U0 RandQuote(I64 num) } U0 BadCodeJump(I64 num) -{ //$LK-A,"::/TempleOS/Apps/AfterEgypt/AENotes.TXT"$ +{ //$LK-A,"::/TempleOS/Apps/HolySpirit/HSNotes.TXT"$ CDirEntry *root=FilesFind("/TempleOS/*",FUF_JUST_FILES|FUF_RECURSE|FUF_FLATTEN_TREE|FUF_JUST_SRC_FILES), *tempm=root; I64 cnt=0; @@ -129,7 +129,7 @@ Bool MyPutKey(I64 ch,I64 sc) else SetKeyDesc("God Word"); } else { - //$LK-A,"::/TempleOS/Apps/AfterEgypt/AENotes.TXT"$ + //$LK-A,"::/TempleOS/Apps/HolySpirit/HSNotes.TXT"$ if (sc & SCF_SHIFT) RandQuote(KbdMouseEvtTime>>4); else @@ -157,7 +157,7 @@ Bool MyPutKey(I64 ch,I64 sc) SetKeyDesc("Misc/Insert Datetime"); } else { if (sc & SCF_SHIFT) - DocInsSafe(DocCur, + DocInsSafe(DocPut, "$$HS+C$$$$FG$$$$HE$$"); else FillInTime(); @@ -202,7 +202,7 @@ Bool MyPutKey(I64 ch,I64 sc) else { ClipBoardDel; DocPrintF(sys_clipboard_doc,"$$LK-A,\"FL:%s,%d\"$$", - DocCur->filename.name,DocCur->cur_entry->y+1); + DocPut->filename.name,DocPut->cur_entry->y+1); } return TRUE; case 'L': @@ -212,7 +212,7 @@ Bool MyPutKey(I64 ch,I64 sc) i=RandU32; ClipBoardDel; DocPrintF(sys_clipboard_doc,"$$LK,\"\",\"FA:%s,ANC%d\"$$", - DocCur->filename.name,i); + DocPut->filename.name,i); "$$AN,\"\",\"ANC%d\"$$",i; } return TRUE; @@ -234,7 +234,7 @@ Bool MyPutKey(I64 ch,I64 sc) case 'b': if (sc&SCF_KEY_DESC) SetKeyDesc("Cmd/Jump to Bad Code"); - else //$LK-A,"::/TempleOS/Apps/AfterEgypt/AENotes.TXT"$ + else //$LK-A,"::/TempleOS/Apps/HolySpirit/HSNotes.TXT"$ BadCodeJump(KbdMouseEvtTime>>4); return TRUE; diff --git a/TempleOS/Demo/AcctExample/Adam3fSys.CPP b/TempleOS/Demo/AcctExample/Adam3fSys.CPP index 5c2f209..cff1eaa 100644 --- a/TempleOS/Demo/AcctExample/Adam3fSys.CPP +++ b/TempleOS/Demo/AcctExample/Adam3fSys.CPP @@ -1,7 +1,6 @@ U0 UserStartUp() { //Run each time a user a spawned UseTermDoc; - DocCurAttr(WHITE<<4+BLUE); Type("::/TempleOS/Doc/Start.TXT"); LBts(&Fs->display_flags,DISPLAYf_SHOW); WinZBufUpdate; @@ -22,8 +21,8 @@ U0 UserStartUp() CPURep; } -U0 ServantStartUp() -{ //Run each time a servant task is spawned. +U0 SrvStartUp() +{ //Run each time a srv task is spawned. UseTermDoc; LBts(&Fs->display_flags,DISPLAYf_SHOW); WinZBufUpdate; diff --git a/TempleOS/Demo/AcctExample/DbgAdam1.CPP b/TempleOS/Demo/AcctExample/DbgAdam1.CPP new file mode 100644 index 0000000..df5ed8e --- /dev/null +++ b/TempleOS/Demo/AcctExample/DbgAdam1.CPP @@ -0,0 +1,11 @@ +//This is executed by Adam at boot. +//See $LK,"Adam1 Start-up","FF:::/TempleOS/Kernel/KEnd.CPP,Adam1:2"$ +extern I8i OptEqu(I64i num,I8i val); +OptEqu(0,0); //(0,0)=EchoOff (0,1)=EchoOn +#include "/TempleOS/Kernel/BootDefs.HPP" +#include "/TempleOS/Kernel/Adam1a.HPP" +#include "/TempleOS/Compiler/CmpDefs.HPP" +#include "/TempleOS/Kernel/Adam1b.HPP" +#include "/TempleOS/Kernel/Adam1c.HPP" +#include "/TempleOS/Compiler/Compiler.HPP" +Dbg("Type 'G;'"); diff --git a/TempleOS/Demo/AcctExample/DoItOnce.CPP b/TempleOS/Demo/AcctExample/DoItOnce.CPP index 92000b3..7af498c 100644 --- a/TempleOS/Demo/AcctExample/DoItOnce.CPP +++ b/TempleOS/Demo/AcctExample/DoItOnce.CPP @@ -1,6 +1,6 @@ //This file is executed by the //first terminal window upon start-up. -//See $LK,"DoItOnce","FF:HOME/Adam3fSys.CPP,DoItOnce"$. +//See $LK,"DoItOnce","FF:HOME/Adam3fSys.CPP,DoItOnce"$ and $LK,"Acct Files","FF:::/TempleOS/Doc/GuideLines.TXT,ACCT FILES"$. //It goes in your HOME directory and //you can customize it. diff --git a/TempleOS/Demo/AcctExample/PersonalMenu.TXT b/TempleOS/Demo/AcctExample/PersonalMenu.TXT index 00f8840c9990a3ba1a227acc8dfaa58df962ea7c..48ea010061197c0814a2acda8dd76afdad036605 100644 GIT binary patch delta 5869 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 P11$-mCn*d*69WSPhVEv~ delta 7563 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 diff --git a/TempleOS/Accts/TS/Adam3.CPP b/TempleOS/Demo/AcctExample/TAD/Adam3.CPP similarity index 92% rename from TempleOS/Accts/TS/Adam3.CPP rename to TempleOS/Demo/AcctExample/TAD/Adam3.CPP index 7bdfb98..0fa67b9 100644 --- a/TempleOS/Accts/TS/Adam3.CPP +++ b/TempleOS/Demo/AcctExample/TAD/Adam3.CPP @@ -5,7 +5,6 @@ #exe {OptOn(OPTf_WARN_DUP_TYPES);}; #include "HOME/Adam3aLocalize" #include "HOME/Adam3bPkgs" -#include "HOME/Adam3cSnd" #include "HOME/Adam3dKeyPlugIns" #include "HOME/Adam3eWrappers" #include "HOME/Adam3fSys" diff --git a/TempleOS/Demo/AcctExample/TAD/Adam3aLocalize.CPP b/TempleOS/Demo/AcctExample/TAD/Adam3aLocalize.CPP index ee77a09..fff1cf1 100644 --- a/TempleOS/Demo/AcctExample/TAD/Adam3aLocalize.CPP +++ b/TempleOS/Demo/AcctExample/TAD/Adam3aLocalize.CPP @@ -7,8 +7,6 @@ SetTypeMatic(0); //Set Time Zone local_time_offset=-7*60*60*CDATE_FREQ; //Pacific -snd_vol=0.1; - //$AN,"","mouse_move_scale"$adjust these to set mouse move scale mxx_scale=0.5; myy_scale=0.5; diff --git a/TempleOS/Demo/AcctExample/TAD/Archive/FileSysISO3.CPP b/TempleOS/Demo/AcctExample/TAD/Archive/FileSysISO3.CPP deleted file mode 100644 index 77df7d0..0000000 --- a/TempleOS/Demo/AcctExample/TAD/Archive/FileSysISO3.CPP +++ /dev/null @@ -1,488 +0,0 @@ -//ISO1 is ISO9660 -//ISO2 is ISO13490 -//ISO3 is ISO13346 - -//ISO13346 tag id types -#define ISO3T_PRI_VOL_DESC 1 -#define ISO3T_ANCHOR_VOL_DESC_PTR 2 -#define ISO3T_VOL_DESC_PTR 3 -#define ISO3T_IMPLEMENTATION_VOL_DESC 4 -#define ISO3T_PRT_DESC 5 -#define ISO3T_LOG_VOL_DESC 6 -#define ISO3T_UNALLOCATED_SPACE_DESC 7 -#define ISO3T_TERMINATOR_DESC 8 -#define ISO3T_LOG_VOL_INTEGRITY_DESC 9 -#define ISO3T_FILE_SET_DESC 256 -#define ISO3T_FILE_ID_DESC 257 -#define ISO3T_ALLOC_EXTENT_DESC 258 -#define ISO3T_INDIRECT_ENTRY 259 -#define ISO3T_TERMINAL_ENTRY 260 -#define ISO3T_FILE_ENTRY 261 -#define ISO3T_EXT_ATTR_HEADER_DESC 262 -#define ISO3T_UNALLOC_SPACE_ENTRY 263 -#define ISO3T_SPACE_BITMAP_DESC 264 -#define ISO3T_PRT_INTEGRITY_ENTRY 265 -#define ISO3T_EXT_FILE_ENTRY 266 - -class CISO3Tag -{ - U16 id; - U16 version; - U8 xsum; - U8 reserved; - U16 serial_num; - U16 desc_crc; - U16 desc_crc_len; - U32 loc; -}; - -class CISO3Date -{ - U16 time_zone; - I16 year; - U8 mon; - U8 day; - U8 hour; - U8 min; - U8 sec; - U8 sec100; - U8 sec10000; - U8 sec1000000; -}; - - -class CISO3DString32 -{ - U8 body[31]; - U8 len; -}; - -class CISO3DString128 -{ - U8 body[127]; - U8 len; -}; - -class CISO3CharSpec -{ - U8 type; - U8 body[63]; -}; - -class CISO3RegId -{ - U8 flags; - U8 id[23]; - U8 id_suffix[8]; -}; - -class CISO3ExtentAD -{ - U32 len; - U32 loc; -}; - -class CISO3LBAdd -{ - U32 log_blk_num; - U16 prt_ref_num; -}; - -class CISO3LongAD -{ - U32 len; - CISO3LBAdd loc; - U8 implementation_use[6]; -}; - -class CISO3ICBTag -{ - U32 prior_record_direct_entries; - U16 strategy_type; - U16 strategy_param; - U16 max_entries; - U8 reserved; - U8 file_type; - CISO3LBAdd parent_icb_loc; - U16 flags; -}; - -class CISO3PriDesc -{ - CISO3Tag tag; - U32 vol_desc_seq_num; - U32 pri_vol_desc_num; - CISO3DString32 vol_id; - U16 vol_seq_num; - U16 max_vol_seq_num; - U16 interchg_level; - U16 max_interchg_level; - U32 char_set_lst; - U32 max_char_set_lst; - CISO3DString128 vol_set_id; - CISO3CharSpec desc_char_set; - CISO3CharSpec explanatory_char_set; - CISO3ExtentAD vol_abstract; - CISO3ExtentAD vol_copyright_notice; - CISO3RegId app_id; - CISO3Date recording_date_time; - CISO3RegId implementation_id[32]; - U8 implementation_use[64]; - U32 pred_vol_desc_seq_loc; - U16 flags; - U8 reserved[22]; -}; - -class CISO3PrtMap -{ - U8 type; - U8 len; - U0 mapping; -}; - -class CISO3PrtMap1 -{ - U8 type; - U8 len; - U16 vol_seq_num; - U16 prt_num; -}; - -class CISO3PrtMap2 -{ - U8 type; - U8 len; - U8 prt_id[62]; -}; - -class CISO3LogVolDesc -{ - CISO3Tag tag; - U32 vol_desc_seq_num; - CISO3CharSpec desc_char_set; - CISO3DString128 log_vol_id; - U32 blk_size; - CISO3RegId domain_id; - U8 log_vol_contents_use[16]; - U32 map_table_len; - U32 num_prt_maps; - CISO3RegId implementation_id; - U8 implementation_use[128]; - CISO3ExtentAD integrity_seq_extent; - U0 prt_maps; -}; - -class CISO3Prt -{ - CISO3Tag tag; - U32 vol_desc_seq_num; - U16 flags; - U16 num; - CISO3RegId contents; - U8 contents_use[128]; - U32 access_type; - U32 starting_loc; - U32 len; - CISO3RegId implementation_id; - U8 implementation_use[128]; - U8 reserved[156]; -}; - -class CISO3FileSetDesc -{ - CISO3Tag tag; - CISO3Date recording_date_time; - U16 interchg_level; - U16 max_interchg_level; - U32 char_set_lst; - U32 max_char_set_lst; - U32 file_set_num; - U32 file_set_desc_num; - CISO3CharSpec log_vol_id_char_set; - CISO3DString128 log_vol_id; - CISO3CharSpec file_set_char_set; - CISO3DString32 file_set_id; - CISO3DString32 copyright_file_id; - CISO3DString32 abstract_file_id; - CISO3LongAD root_dir_icb; - CISO3RegId domain_id; - CISO3LongAD next_extent; - CISO3LongAD sys_stream_dir_icb; - U8 reserved[32]; -}; - -class CISO3FileIdDesc -{ - CISO3Tag tag; - U16 version; - U8 characteristics; - U8 len_of_file_id; - CISO3LongAD icb; - U16 len_of_implementation_use; - U0 implementation_use; - U0 file_id; -}; - -class CISO3File -{ - CISO3Tag tag; - CISO3ICBTag icb_tag; - U32 uid; - U32 gid; - U32 permissions; - U16 file_link_cnt; - U8 record_fmt; - U8 record_display_attr; - U32 record_len; - I64 info_len; - I64 log_blks_recorded; - CISO3Date access_date_time; - CISO3Date modification_date_time; - CISO3Date attr_date_time; - U32 chk_pt; - CISO3LongAD ext_attr_icb; - CISO3RegId implementation_id; - I64 unique_id; - U32 ext_attr_len; - U32 alloc_desc_len; - U0 ext_attr; - U0 alloc_desc; -}; - -class CISO3FileExt -{ - CISO3Tag tag; - CISO3ICBTag icb_tag; - U32 uid; - U32 gid; - U32 permissions; - U16 file_link_cnt; - U8 record_fmt; - U8 record_display_attr; - U32 record_len; - I64 info_len; - I64 object_size; - I64 log_blks_recorded; - CISO3Date access_date_time; - CISO3Date modification_date_time; - CISO3Date creation_date_time; - CISO3Date attr_date_time; - U32 chk_pt; - U32 reserved; - CISO3LongAD ext_attr_icb; - CISO3LongAD stream_dir_icb; - CISO3RegId implementation_id; - I64 unique_id; - U32 ext_attr_len; - U32 alloc_desc_len; - U0 ext_attr; - U0 alloc_desc; -}; - -import U0 ClassRep(U8 *class_name,U8 *d,I64 max_depth=2,Bool fun=FALSE,I64 offset=0); - -Bool ISO3PrtInitPrt(CPrt *p,I64 blk) -{ - CBlkDev *bdev=p->bdev; - I64 spc=bdev->blk_size>>BLK_SIZE_BITS,i=blk/spc; - CISO3FileSetDesc *iso=MAlloc(bdev->blk_size); - Bool unlock,result=FALSE; - try { - unlock=PrtLock(p); - while (TRUE) { - p->size=MaxI64(p->size,(i+1)*spc); - RBlks(p,iso,i*spc,spc); - "%X:%X\n",i,iso->tag.id; - switch (iso->tag.id) { - case ISO3T_FILE_SET_DESC: - ClassRep("CISO3FileSetDesc",iso,3); -// p->offset=blk; -// p->root_cluster=iso->root_dir_icb.loc.log_blk_num+p->offset/spc; - result=TRUE; - break; - case ISO3T_EXT_FILE_ENTRY: - ClassRep("CISO3FileExt",iso,3); - break; - case ISO3T_FILE_ENTRY: - ClassRep("CISO3File",iso,3); - break; - case ISO3T_FILE_ID_DESC: - ClassRep("CISO3FileIdDesc",iso,3); - break; - case ISO3T_ALLOC_EXTENT_DESC: - case ISO3T_INDIRECT_ENTRY: - case ISO3T_TERMINAL_ENTRY: - case ISO3T_EXT_ATTR_HEADER_DESC: - case ISO3T_UNALLOC_SPACE_ENTRY: - case ISO3T_SPACE_BITMAP_DESC: - case ISO3T_PRT_INTEGRITY_ENTRY: - break; - default - goto i3pip_done; - } - i++; - } -i3pip_done: - Free(iso); - if (unlock) - PrtUnlock(p); - } catch { - Free(iso); - if (unlock) - PrtUnlock(p); - } - return result; -} - -Bool ISO3PrtInit(CPrt *p,I64 blk) -{ - CBlkDev *bdev=p->bdev; - I64 spc=bdev->blk_size>>BLK_SIZE_BITS,i=blk/spc,offset=0; - CISO3Prt *iso=MAlloc(bdev->blk_size); - Bool unlock,result=FALSE; - - try { - unlock=PrtLock(p); - while (TRUE) { - p->size=MaxI64(p->size,(i+1)*spc); - RBlks(p,iso,i*spc,spc); -"%X:%X\n",i,iso->tag.id; - switch (iso->tag.id) { - case ISO3T_PRT_DESC: - ClassRep("CISO3Prt",iso,3); - offset=iso->starting_loc*spc; //one partition for now - break; - case ISO3T_PRI_VOL_DESC: - ClassRep("CISO3PriDesc",iso,3); - break; - case ISO3T_LOG_VOL_DESC: - ClassRep("CISO3LogVolDesc",iso,3); - D(&iso(CISO3LogVolDesc *)->prt_maps); - break; - case ISO3T_ANCHOR_VOL_DESC_PTR: - case ISO3T_VOL_DESC_PTR: - case ISO3T_IMPLEMENTATION_VOL_DESC: - case ISO3T_UNALLOCATED_SPACE_DESC: - case ISO3T_LOG_VOL_INTEGRITY_DESC: - break; - case ISO3T_TERMINATOR_DESC: - goto i3pi_done; - default: - PutDefineErr("ST_UNSUPPORTED_FILE_SYSTEM"); - throw(EXCEPT_PRT,10); - } - i++; - } -i3pi_done: - if (offset) - result=ISO3PrtInitPrt(p,offset); - Free(iso); - if (unlock) - PrtUnlock(p); - } catch { - Free(iso); - if (unlock) - PrtUnlock(p); - } - return result; -} - - -/**** -U0 CDate2ISO3(CISO3Date *dst,CDate spdt) -{ - CDateStruct ds; - CDate2CDateStruct(&ds,spdt); - MemSet(dst,0,sizeof(CISO3Date)); - dst->year=ds.year; - dst->mon=ds.mon; - dst->day=ds.day_of_mon; - dst->hour=ds.hour; - dst->min=ds.min; - dst->sec=ds.sec; - dst->sec100=ds.sec100; -} - -CDate ISO3Date2CDate(CISO3Date *dt) -{ - CDateStruct ds; - MemSet(&ds,0,sizeof(CDateStruct)); - ds.day_of_mon=dt->day; - ds.mon=dt->mon; - ds.year=dt->year; - ds.sec100=dt->sec100; - ds.sec=dt->sec; - ds.min=dt->min; - ds.hour=dt->hour; - return CDateStruct2CDate(&ds); -} -****/ - - -Bool ISOPrtInit(CPrt *p,I64 blk) -{ - CBlkDev *bdev=p->bdev; - I64 spc=bdev->blk_size>>BLK_SIZE_BITS,i=blk/spc; - CISO1PriDesc *iso=MAlloc(bdev->blk_size); - CISO1DirEntry *de; - Bool unlock,result=FALSE; - U8 buf[8]; - - try { - unlock=PrtLock(p); - p->type=PT_ISO9660; //default - p->spc=spc; - p->offset=p->data=p->root_cluster=p->size=0; - while (TRUE) { - p->size=MaxI64(p->size,(i+1)*spc); - RBlks(p,iso,i*spc,spc); - buf[0](U32)=iso->id[0](U32); - buf[4](U16)=iso->id[4](U8); - switch (LstEntryMatch(buf,"CD001\0CDW02\0BEA01\0BOOT2\0NSR02\0NSR03\0TEA01\0",LEF_EXACT)) { - case 0: - p->type=PT_ISO9660; - switch (iso->type) { - case ISO1T_SUPPLEMENTARY_DESC: - p->data=0; - de=&iso->root_dir_record; - p->root_cluster=de->loc.little; - p->size=iso->vol_space_size.little*bdev->blk_size>>BLK_SIZE_BITS; - result=TRUE; - goto ipi_done; - case ISO1T_TERMINATOR: - throw(EXCEPT_PRT,11); - } - break; - case 2...6: - p->type=PT_ISO13346; - break; - case 1: //PT_ISO13490 (Not supported) - default: //Its normal for ISO13346 to read NULL blk as terminator - switch (p->type) { - case PT_ISO13346: - i++; //Terminator is blk after last valid. Advance to next blk - if (ISO3PrtInit(p,i*spc)) { - result=TRUE; - goto ipi_done; - } - break; - } - PutDefineErr("ST_UNSUPPORTED_FILE_SYSTEM"); - throw(EXCEPT_PRT,12); - } - i++; - } -ipi_done: - Free(iso); - if (unlock) - PrtUnlock(p); - } catch { - p->type=PT_ISO9660; - p->spc=spc; - p->offset=p->data=p->root_cluster=0; - Free(iso); - if (unlock) - PrtUnlock(p); - } - return result; -} diff --git a/TempleOS/Demo/AcctExample/TAD/Archive/Logo.TXT b/TempleOS/Demo/AcctExample/TAD/Archive/Logo.TXT deleted file mode 100644 index 6281b43dba79e958fbe25c9f820f219cb2cdb9e7..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 33204 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 W{{R2~(hU3}poAsIz`(%7&Hw;P67%u^ diff --git a/TempleOS/Demo/AcctExample/TAD/Archive/Marketing.TXT b/TempleOS/Demo/AcctExample/TAD/Archive/Marketing.TXT deleted file mode 100644 index 06e9928..0000000 --- a/TempleOS/Demo/AcctExample/TAD/Archive/Marketing.TXT +++ /dev/null @@ -1,21 +0,0 @@ -$WW,1$I have a million metaphors. Linux is a semi; Windows is a car; and TempleOS is a motorcycle. Or, it's like a 1960's muscle car that wouldn't be street legal, now, with all the safety crap regulations complicating and gunking-up, but boy is it fun and beautiful under the hood. Maybe, it's a tree-house -- you don't need building codes to mod it and it has no networking. It's a kayak, not a Titanic -- just reset it. Why do you want a 1970's main frame operating system, anyway, that has ugly 32-bit crap all over its C language? 7-bit ASCII for source code? Please! Why not fix all the standard C library to pure 64-bit? How awful PrintF() with "%ld" instead of "%d" and crap for long constants! Yuck! You'll love $LK,"TempleOS C","FI:::/TempleOS/Doc/Differences.TXT"$. - -Okay, here's a $LK,"Pop Quiz","FI:::/TempleOS/Demo/Lectures/64BitAsmQuiz.TXT"$ to get you psyched-up for TempleOS! Assembly language knowledge is not required, but anyone interested in TempleOS is probably at least curious about assembly language. - -TempleOS has a good chance of running natively on $FG,4$x86_64$FG$ machines from about 2003-2010. After that, it will probably work just in VMware. - -1) Download the free $FG,4$$TX+HTML,"TempleOSCD.ISO (24.0 MB)","http://www.templeos.org/TempleOSCD.ISO"$$FG$. -2) Download the free $FG,4$$TX+HTML,"VMware Player","https://my.vmware.com/web/vmware/free#desktop_end_user_computing/vmware_player/5_0"$$FG$ (The $FG,4$$TX+HTML,"VMware","https://my.vmware.com/web/vmware/free#desktop_end_user_computing/vmware_player/5_0"$$FG$ web page takes a whole minute to load completely. Be patient. When it finally shows, pick the first ".exe" to download.) -3) Create an "Other 64-Bit" virtual machine. Aim its CD-ROM to TempleOSCD.ISO -4) Play the virtual machine. -5) Log-in as "Accts/Install". -6) Optionally, purchase $FG,4$$TX+HTML,"VMware WorkStation","http://www.vmware.com"$$FG$ or download $FG,4$$TX+HTML,"WinImage","http://www.winimage.com/winimage.htm"$$FG$ if you wish to transfer files in and out. - -If you want to install my personal version for $FG,4$$TX+HTML,"VMware","https://my.vmware.com/web/vmware/free#desktop_end_user_computing/vmware_player/5_0"$$FG$... -1b) Download the free $FG,4$$TX+HTML,"TempleOSTS.ISO (24.5 MB)","http://www.templeos.org/TempleOSTS.ISO"$$FG$. -3b) Create an "Other 64-Bit" virtual machine. Aim its CD-ROM to TempleOSTS.ISO -5b) Type >$FG,4$TSInstall;$FG$ or >$FG,4$TSUpgrade;$FG$ at the command-line. -7b) See $FG,4$MakeBackUp$FG$ to reproduce the ISO's in $FG,4$E:/Wb$FG$. It makes this website, too. - - -* "WinImage" is a trademark of Gilles Vollant. diff --git a/TempleOS/Demo/AcctExample/TAD/Archive/USB.CPP b/TempleOS/Demo/AcctExample/TAD/Archive/USB.CPP deleted file mode 100644 index 3bdb2bb..0000000 --- a/TempleOS/Demo/AcctExample/TAD/Archive/USB.CPP +++ /dev/null @@ -1,217 +0,0 @@ -/* -You can play with this if you are -interested in USB. I'm not planning -on doing USB unless the legacy PS2 -keyboard/mouse mode disappears. -There EHCI UHCI in various ICH chips and -others and God knows how many custom packet -formats for different keyboards and mice. Okay, -I suppose if BIOS can make a universal -packet, it is done just one way for -different mice. PS2 is more compatible. - -*/ -#help_index "USB" -extern I64 sys_num_usb; -extern CUSB sys_usb_devs[MAX_USB]; -extern CUSBTD *USBAllocTD(); -extern U0 USBFreeTD(CUSBTD *temptd); -extern U0 USBEndAll(); -extern U0 USBInitAll(); -extern U32 *USBAllocFrameLst(I64 usb_num,I64 size); - -U8 *StatCB(CDoc *,CDocEntry *doc_e,CTask *mem_task) -{ //This routine shows the stat of the USB ports - U8 *st=MAlloc(128,mem_task); - U16 w1,w2,w3,w4; - U32 d1; - CUSB *u=doc_e->user_data; - I64 d=u->ports; - w3=InU16(d+USBP_STS); - w1=InU16(d+USBP_PORTSC0); w2=InU16(d+USBP_PORTSC1); - w4=InU16(d+USBP_FRNUM); - d1=InU32(d+USBP_FRBASEADD); - SPrintF(st,"%X:Stat:%04X P0:%04X P1:%04X FRAME:%04X",d1,w3,w1,w2,w4); - return st; -} - -U0 PutStat() -{ - I64 i; - Bool old_preempt=Preempt(OFF); - CDocEntry *doc_e; - CUSB *u; - WinMax; - - "$$FG,GREEN$$Dev Stat Bits\n$$FG$$" - " 0:IRQ\n" - " 1:IRQ err\n" - " 2:Resume\n" - " 3:Host Sys Err\n" - " 4:Host Process Err\n" - " 5:Halted\n" - "$$FG,GREEN$$Port Stat Bits\n$$FG$$" - " 0:Connection Stat\n" - " 1:Connection Stat Change\n" - " 2:Port Enabled\n" - " 3:Port Enabled Change\n" - "4-5:Line Stat\n" - " 6:Resume Detect\n" - " 8:Low Speed\n" - " 9:Port Rst\n" - " 10:Overcurrent Active\n" - " 11:Overcurrent Indicator\n" - " 12:Suspend\n\n"; - - for (i=0;iports; - doc_e=DocPutS(DocCur,"$$TX+TC,\" \"$$"); - doc_e->user_data=&sys_usb_devs[i]; - doc_e->tag_cb=&StatCB; - "$$FG$$\n"; - } - - Preempt(old_preempt); - NewLine; -} - - -extern U0 PutQH(U32 h); - -U32 *P(U32 d) -{ - return d&~3; -} - - -U0 PutTD(U32 t) -{ - "TD:$$FG,GREEN$$%08X$$FG$$\n",t; - "%08X\n",*P(t); - DocDm(t+4,8); - if (*P(t+12)) - DocDm(*P(t+12),16); -// DocDm(*P(t+12),*P(t+4)>>21&0x7FF); - if (!(*P(t)&1)) { - if (*P(t)&2) - PutQH(*P(t)); - else - PutTD(*P(t)); - } -} - -U0 PutQH(U32 h) -{ - "QH:$$FG,RED$$%08X$$FG$$\n",h; - "%08X\n",*P(h); - "%08X\n",*P(h+4); - - if (!(*P(h)&1)) { - if (*P(h)&2) - PutQH(*P(h)); - else - PutTD(*P(h)); - } - - if (!(*P(h+4)&1)) { - if (*P(h+4)&2) - PutQH(*P(h+4)); - else - PutTD(*P(h+4)); - } -} - -U0 PutFrame(U32 f) -{ - PutQH(f); -} - -U0 PutFrames() -{ - I64 i,d,f,w1,w2; - CUSB *u; - for (i=0;iports; - w1=InU16(d+USBP_PORTSC0); w2=InU16(d+USBP_PORTSC1); - if (w1&1 || w2&1) { - f=InU32(d+USBP_FRBASEADD); - PutFrame(f); - } - } - -} - -U0 Main() -{ - USBInitAll; - PutStat; - PutFrames; - "$$FG,RED$$The BIOS sets-up the USB in PS/2 legacy mode.$$FG$$\n"; -} - -Main; - - -/* Not Finished -#define PORT 5 - -#define DEV_ADD_INIT 1 -#define DEV_ADD 1 -#define END_PT0 0 -#define END_PT1 1 -#define END_PT2 2 -#define MAX_LEN 8 -#define TERMINATE 1 - -U0 SetUpTD() -{ - CUSB *u=&sys_usb_devs[PORT]; - I64 i,d=u->ports; - U32 *frm=CAllocAligned(0x1000,0x1000,Fs->code_heap), - *tds=CAllocAligned(256,16,Fs->code_heap), - *buf=CAlloc(128,Fs->code_heap); - DocD(buf,128); - - "<0>\n"; Sleep(100); - OutU16(d+USBP_CMD,2); //Reset - "<1>\n"; Sleep(100); - OutU16(d+USBP_CMD,0); - "<2>\n"; Sleep(100); - OutU16(d+USBP_PORTSC0,4); //Enable - OutU16(d+USBP_PORTSC1,4); - "<3>\n"; Sleep(100); - - tds[0]=&tds[4](U8 *); - tds[1]=0; - tds[2]=PID_SETUP+DEV_ADD_INIT<<8+END_PT0<<15+MAX_LEN<<21; - tds[3]=buf; - buf[0]=0+RQ_SET_ADDR<<8+DEV_ADD<<16; - buf[1]=0+0<<16; - - - tds[4]=TERMINATE; - tds[5]=0; - tds[6]=PID_SETUP+DEV_ADD_INIT<<8+END_PT0<<15+MAX_LEN<<21; - tds[7]=buf(U8 *)+8; - buf[2]=0+RQ_SET_ADDR<<8+DEV_ADD<<16; - buf[3]=0+0<<16; - - frm[0]=&tds[0](U8 *); - for (i=1;i<0x1000/4;i++) - frm[i]=TERMINATE; - - OutU16(d+USBP_FRNUM,frm); - OutU32(d+USBP_FRBASEADD,frm); - "<4>\n"; Sleep(200); - OutU16(d+USBP_CMD,1); - "<5>\n"; Sleep(1000); - OutU16(d+USBP_CMD,0); - "<6>\n"; Sleep(200); -} - -SetUpTD; - -*/ - diff --git a/TempleOS/Demo/AcctExample/TAD/Archive/USB1a.CPP b/TempleOS/Demo/AcctExample/TAD/Archive/USB1a.CPP deleted file mode 100644 index 55c7f6c..0000000 --- a/TempleOS/Demo/AcctExample/TAD/Archive/USB1a.CPP +++ /dev/null @@ -1,114 +0,0 @@ -#define USBP_CMD 0x00 -#define USBP_STS 0x02 -#define USBP_INTR 0x04 -#define USBP_FRNUM 0x06 -#define USBP_FRBASEADD 0x08 -#define USBP_SOFMOD 0x0C -#define USBP_PORTSC0 0x10 -#define USBP_PORTSC1 0x12 -#define MAX_USB 16 - -class CUSBTD //Not implemented -{ - U32 td[4]; -}; - -class CUSB //Not implemented -{ - U8 num, //USB dev num - bus,dev,fun; - U16 ports,pad; - U32 *frame_lst; -}; - -//USB Pkt ID's -#define PID_OUT 0xE1 -#define PID_IN 0x69 -#define PID_SOF 0xA5 -#define PID_SETUP 0x2D -#define PID_DATA0 0xC3 -#define PID_DATA1 0x4B -#define PID_DATA2 0x87 -#define PID_MDATA 0x0F -#define PID_ACK 0xD2 -#define PID_NAK 0x5A -#define PID_STALL 0x1E -#define PID_NYET 0x96 -#define PID_PRE 0x3C -#define PID_ERR 0x3C -#define PID_SPLIT 0x78 -#define PID_PING 0xB4 - -//USB Std Rqsts -#define RQ_GET_STAT 0x0 -#define RQ_CLR_FEAT 0x1 -#define RQ_SET_FEAT 0x3 -#define RQ_SET_ADDR 0x5 -#define RQ_SET_DESC 0x7 -#define RQ_GET_CFG 0x8 -#define RQ_SET_CFG 0x9 -#define RQ_GET_INTERFACE 0xA -#define RQ_SET_INTERFACE 0xB -#define RQ_SYNC_FRAME 0xC - -I64 sys_num_usb=0; -CUSB sys_usb_devs[MAX_USB]; -MemSet(sys_usb_devs,0,MAX_USB*sizeof(CUSB)); - - -U0 USBInitOne(I64 b,I64 d,I64 f) -{ - CUSB *u; - if (sys_num_usbnum=sys_num_usb; - u->bus=b; - u->dev=d; - u->fun=f; - u->ports=PCIReadU32(b,d,f,0x20)&~0x1F; - } -} - -U0 USBEndAll() -{ - sys_num_usb=0; -} - -U0 USBInitAll() //This is only valid for my ICH10 dev -{ - if (sys_num_usb) - USBEndAll; - USBInitOne(0,29,0); - USBInitOne(0,29,1); - USBInitOne(0,29,2); - USBInitOne(0,29,3); - USBInitOne(0,26,0); - USBInitOne(0,26,1); - USBInitOne(0,26,2); -} - -CUSBTD *USBAllocTD() -{ - return MAllocAligned(sizeof(CUSBTD),0x10,sys_uncached_heap); -} - -U0 USBFreeTD(CUSBTD *temptd) -{ - Free(temptd); -} - -U32 *USBAllocFrameLst(I64 usb_num,I64 size) -{ //aligned to 0x1000 - CUSB *u; - if (0<=usb_numframe_lst); - u->frame_lst=MAllocAligned(size*sizeof(U32),0x1000,sys_uncached_heap); - OutU16(u->ports+USBP_CMD,0); //Stop - OutU16(u->ports+USBP_FRNUM,0); - OutU32(u->ports+USBP_FRBASEADD,u->frame_lst); - return u->frame_lst; - } - return NULL; -} diff --git a/TempleOS/Demo/AcctExample/TAD/MakeDistro.CPP b/TempleOS/Demo/AcctExample/TAD/MakeDistro.CPP deleted file mode 100644 index 67d8d92..0000000 --- a/TempleOS/Demo/AcctExample/TAD/MakeDistro.CPP +++ /dev/null @@ -1,54 +0,0 @@ -/*$HL,0$ -$FG,5$$TX+CX,"Roll Your Own Distro"$$FG$ - -It's unlikely you will get it running on bare hardware, so you'll probably -run it in a virtual machine such as VMware. Download the free 64-bit -$FG,4$$TX+HTML,"VMware Player","https://my.vmware.com/web/vmware/free#desktop_end_user_computing/vmware_player/5_0"$$FG$ for Linux or Windows and point the CDROM at the $FG,4$$TX+HTML,"TempleOSCD.ISO","http://www.templeos.org/TempleOSCD.ISO"$$FG$. -(The $FG,4$$TX+HTML,"VMware","https://my.vmware.com/web/vmware/free#desktop_end_user_computing/vmware_player/5_0"$$FG$ web page takes a whole minute to load. They hide the free version.) - -Purchase $FG,4$$TX+HTML,"VMware WorkStation","http://www.vmware.com"$$FG$ or download $FG,4$$TX+HTML,"WinImage","http://www.winimage.com/winimage.htm"$$FG$ if you wish to transfer files -in and out. The VMWare Workstation will stretch to full-screen and make drives -accessible from Windows. - -$HL,1$*/ - -#define STD_DISTRO_CDROM_CFG "b10x20000\nt3 \n\n\n\n\n" - -U0 MakeMyISO(U8 *out_iso_filename) -{//Does everything with current drive. - if (!IsDrvWritable) { - "Drive must be writable. Install on Hard drive, first.\n"; - return; - } - DelTree("/Distro"); - Auto(STD_DISTRO_CDROM_CFG); - MakeOSInstallPrtBootLoader(,'T'); - CopyTree("/0000Boot","/Distro/0000Boot"); - CopyTree("/TempleOS","/Distro/TempleOS"); - //To save space, optionally delete dictionary. - Del("/Distro/TempleOS/Adam/WordStat/WSDefs.DAT"); - Del("/Distro/TempleOS/Misc/Bible.TXT.Z"); - Del("/Distro/TempleOS/Misc/PCIDevices.TXT.Z"); - MkDir("/Distro/Temp"); - MkDir("/Distro/Temp/ScreenShots"); - CDFileCreate(out_iso_filename,"/Distro/*","",BOOTCD_BIN_Z); - //CDImageWrite('T',out_iso_filename,MT_CD); //Uncomment to burn a CD-ROM or (MT_DVD) - //DelTree("/Distro"); -} - -MakeMyISO("/MyDistro.ISO"); - -// Study my account examples $LK,"Cfg Strs","FL:::/TempleOS/Demo/AcctExample/TSAdam.CPP,1"$ $LK,"Update Funs","FL:::/TempleOS/Demo/AcctExample/TSDistro.CPP,1"$. - - - - - -/* - -* "Linux" is probably a trademark owned by Linus Torvalds. -* "VMware Player" and "VMware WorkStation" are trademarks of VMware, Inc. -* "Windows" is a trademark of MicroSoft Corp. -* "WinImage" is a trademark of Gilles Vollant. - -*/ diff --git a/TempleOS/Demo/AcctExample/TAD/PersonalNotes.TXT b/TempleOS/Demo/AcctExample/TAD/PersonalNotes.TXT index 8f6ea6a..d3cfaa7 100644 --- a/TempleOS/Demo/AcctExample/TAD/PersonalNotes.TXT +++ b/TempleOS/Demo/AcctExample/TAD/PersonalNotes.TXT @@ -1,23 +1,32 @@ -* Cursor is not solid $LK,"Dbg","MN:Dbg"$ when entered in Adam2. +* fix result on Blot ect -* ata base- base1 temp blkdev +* Tour TestSuite on 256Meg NoMP runs out of mem. Leak,too? + +* CTRL-R transform individual elements + +* Size zero files don't copy out from VMware. + +* FileMgr header + +* ATA/ATAPI ID in VMware, when not booted to CD? I forgot. + +* I use fixed-point in $LK,"Circle","MN:Circle"$(), $LK,"Ellipse","MN:Ellipse"$(), $LK,"GrRot","MN:GrRot"$(), $LK,"GrMulMat","MN:GrMulMat"$() and others. +God says I might want to change to float. +$LK-A,"::/TempleOS/Demo/Lectures/FixedPoint.CPP"$. +$LK-A,"::/TempleOS/Demo/Lectures/FixedPointAdvanced.CPP"$. + +* DOCF_DBL_DOLLARS in reindention +* # in reindention +* reindent $LK,"DocRecalc","MN:DocRecalc"$().skip_soft_cr + +* HexEdit with odd size, ASCII cannot be edited. * clean-up addDev pmt -* indent - -* TestSuite Strut - * Might want to convert some Preempt() to Cli -* Bug: Back-up-script cause jumps back and forth in ToHtml. - -* Bug? Hung after pressing CmpMain in personal menu. Haven't seen in a while. -* Crashes after back-up-script. Went away maybe after spurious IRQ fix. * Music organ hangs when cursoring around. Haven't seen in while. -* $LK,"DocUpdateTaskDocs","MN:DocUpdateTaskDocs"$() used to skips locked docs. $LK,"WinMgrSync","MN:WinMgrSync"$() needs to check? - * Why was wordstat so slow on "OldMasterBootWrite" for example. * $LK,"Plain","MN:Plain"$() might be better not saving $LK,"CH_CURSOR","MN:CH_CURSOR"$. @@ -26,16 +35,12 @@ * It would be nice if $LK,"U","MN:U"$() NOP were better. -* Autoindent is very bad. - -* Make native file system expanded size set in Copy. +* Make RedSea file system expanded size set in Copy. * unhandled exception on MP message gets overwritten by WinMgr * Cmd to enable/disable compiler warnings -* make aware of ctrl-r side bar - * fix documentation problem -- remembering 0 terminator in str or not for $$DA * GetS, crazy putkey code * editor page formatting is FUBAR @@ -44,17 +49,14 @@ >Might want to do ZOOM in U8 graphics and convert screen capture to U8 >Might want to reverse bit order -* wenceslas crashes in testsuite, sometimes. went away? +* wenceslas crashes in testsuite, sometimes. -* CGrVectMap sucks -- Pilgrim * return vals for grrect, grblot, grputchar? * collisions for grrect, grblot, grputchar? * 32-bit devices should be in free spot address space of E820. -* RAM drive too small for TempleOSCD.ISO -$WW,1$ -* Race condition in Navy.CPP.Z torpedo +* Race condition in FlatTops.CPP.Z torpedo * {Lock|Rep}{Seg|2E=NotBr|3E=Br}{OP}{ADD}{REX} * Virtual Box MP reboot @@ -70,7 +72,6 @@ GrEdit: Move sidebar selected elems. GrEdit: Strip origin shift cmds. GrEditBitMap, grabscroll? -GrEditBitMap, cut/paste boxes. extern of fun with dft arg of str? @@ -78,7 +79,7 @@ extern of fun with dft arg of str? * FileMgr bad with lots of files. -* This $LK,"Fs->catch_except=TRUE","FF:::/TempleOS/Kernel/TaskCmd.CPP,Fs->catch_except=TRUE"$ causes problems because it catches divide and out-of-mem. Not sure what to do, yet. +* This $LK,"Fs->catch_except=TRUE","FF:::/TempleOS/Kernel/SrvCmd.CPP,Fs->catch_except=TRUE"$ causes problems because it catches divide and out-of-mem. Not sure what to do, yet. * $LK,"MPStart","MN:MPStart"$() free old task memory. (Prolly never gonna do anything about this.) * $LK,"sys_var_init_flag","MN:sys_var_init_flag"$ local vars. * sprite shift pts, ctrl pt for ellipse/polygon w,h is off when rotated. @@ -94,7 +95,6 @@ $HC,"tag+i"$ * Mouseinstall throws exceptions, doesn't work, investigate Mouse $LK,"0x9FC30","FF:::/TempleOS/Kernel/KbdMouse/Mouse.CPP,9FC"$ * get kbd lights working. -* figure-out hyperthread vs nonhyperthread CPU's * Might have issue with compiler exceptions and restoring lex.hash tables. * Generates two compiler error messages for expressions in statements. * release semaphores or break lock sema,usb_td @@ -106,8 +106,6 @@ $HC,"type==BDT_ATAPI) { ATARep(FALSE,,&root); - ATAIDDrvs(root,dft_drv,&ata_drv,&atapi_drv); + ATAIDDrvs(root,*sys_acct,&ata_drv,&atapi_drv); if (ata_drv) DefinePrintF("CFG_HARD_DRVS","\"d2p%d\n\"",ata_drv->num); if (atapi_drv) @@ -154,28 +153,26 @@ U0 TSInit() DefinePrintF("TS_BAK_DRV","\"E\""); DefinePrintF("TS_RAM_DRV","\"B\""); DefinePrintF("TS_WIN_DRV","\"\""); - DefinePrintF("TS_IMG_DRV","\"Z\""); DefinePrintF("TS_CDROM_DRV","\"T\""); } } TSInit; -Bool ts_has_main_drv =ToBool(StrLen(TS_MAIN_DRV)), - ts_has_bak_drv =ToBool(StrLen(TS_BAK_DRV)), - ts_has_ram_drv =ToBool(StrLen(TS_BAK_DRV)), - ts_has_win_drv =ToBool(StrLen(TS_WIN_DRV)), - ts_has_img_drv =ToBool(StrLen(TS_IMG_DRV)), - ts_has_cdrom_drv=ToBool(StrLen(TS_CDROM_DRV)); - U0 TSInit2() { DefinePrintF("TS_MAIN_DRV_LET","'%s'",TS_MAIN_DRV); DefinePrintF("TS_BAK_DRV_LET","'%s'",TS_BAK_DRV); DefinePrintF("TS_RAM_DRV_LET","'%s'",TS_RAM_DRV); DefinePrintF("TS_WIN_DRV_LET","'%s'",TS_WIN_DRV); - DefinePrintF("TS_IMG_DRV_LET","'%s'",TS_IMG_DRV); DefinePrintF("TS_CDROM_DRV_LET","'%s'",TS_CDROM_DRV); + } TSInit2; +Bool ts_has_main_drv =ToBool(StrLen(TS_MAIN_DRV)), + ts_has_bak_drv =ToBool(StrLen(TS_BAK_DRV)), + ts_has_ram_drv =ToBool(StrLen(TS_BAK_DRV)), + ts_has_win_drv =ToBool(StrLen(TS_WIN_DRV)), + ts_has_cdrom_drv=ToBool(StrLen(TS_CDROM_DRV)); + if (ts_has_main_drv) SetDrvTextAttr(TS_MAIN_DRV_LET, WHITE <<4|BLUE); if (ts_has_bak_drv) @@ -184,20 +181,21 @@ if (ts_has_ram_drv) SetDrvTextAttr(TS_RAM_DRV_LET, BLUE <<4|YELLOW); if (ts_has_win_drv) SetDrvTextAttr(TS_WIN_DRV_LET, LTRED <<4|BLACK); -if (ts_has_img_drv) - SetDrvTextAttr(TS_IMG_DRV_LET, BLUE <<4|LTRED); if (ts_has_cdrom_drv) SetDrvTextAttr(TS_CDROM_DRV_LET,LTGRAY<<4|BLUE); -#define TS_ISO_NAME TS_RAM_DRV ":/TempleOSCD.ISO" +#define TS_ISO_NAME TS_RAM_DRV ":/TempleOSCD.ISO" +#define TS_DISTRO_DIR TS_RAM_DRV ":/Distro" #define CFG_OPTS "ProtectLow\nAutoMountIDE\nDT\n" -#define CFG_DBG_OPTS "ProtectLow\nAutoMountIDE\nDTDet\nHeapInit\n130\nMemInit\n131\nVarInit\n132\n\n" -#define CFG_DBGZ_OPTS "ProtectLow\nAutoMountIDE\nDTDet\nHeapInit\n0\nMemInit\n0\nVarInit\n0\n\n" +#define CFG_DBG_OPTS "ProtectLow\nAutoMountIDE\nDT"\ + "Det\nHeapInit\n130\nMemInit\n131\nVarInit\n132\n\n" +#define CFG_DBGZ_OPTS "ProtectLow\nAutoMountIDE\nDT"\ + "Det\nHeapInit\n0\nMemInit\n0\nVarInit\n0\n\n" #define TS_CFG CFG_RAM_DRVS CFG_CDROM_DRVS CFG_HARD_DRVS CFG_ACCT CFG_DSK_CACHE CFG_OPTS #define TS_MENU_CFG CFG_RAM_DRVS CFG_CDROM_DRVS CFG_HARD_DRVS "\n\n" CFG_DSK_CACHE CFG_OPTS -#define TS_CDROM_CFG "b10x20000\nt3 \n\nTS\n\nAutoMountIDE\nDT\n" +#define TS_CDROM_CFG "b1\n0x20000\nt3 \n\nTS\n\nAutoMountIDE\nDT\n" //$BK,1$Change these, too...$BK,0$ //$MA+A-X+PU,"STD_DISTRO_CDROM_CFG","F(\"STD_DISTRO_CDROM_CFG\");View;"$ @@ -221,12 +219,12 @@ public U0 MyScreenShot(I64 bits=4) U8 *st; CDirEntry *tempm; I64 cnt=0; - tempm=FilesFind("::/Temp/ScreenShots/*.BMP"); + tempm=FilesFind("::/Temp/ScreenShots/*.BMP.Z"); while (tempm) { cnt++; tempm=tempm->next; } - st=MSPrintF("::/Temp/ScreenShots/SCRN%04d.BMP",cnt); + st=MSPrintF("::/Temp/ScreenShots/SCRN%04d.BMP.Z",cnt); BMPFileCaptureScreen(st,bits); Free(st); Beep; @@ -249,7 +247,7 @@ Boot Windows Download "ffmpeg" from the Internet >CD SCREENSHOTS - >TSZ -expand . + >TSZ . >ffmpeg -r 8 -i VID%05d.BMP -y Movie.avi */ @@ -288,7 +286,7 @@ U0 CopyVideo() { if (ts_has_bak_drv) { Del(TS_BAK_DRV ":/Temp/*.SND"); - SndFileCreate(TS_BAK_DRV ":/Temp/Audio",0.23,0.0,WF_NULL,0.45,0.35); + SndFileCreate(TS_BAK_DRV ":/Temp/Audio",0.23,0.0,WF_SQUARE,0.45,0.35); DelTree(TS_BAK_DRV ":/Temp/ScreenShots"); CopyTree("::/Temp/ScreenShots",TS_BAK_DRV ":/Temp/ScreenShots"); } @@ -328,25 +326,6 @@ U0 CtrlAltS(I64) } SetCtrlAltLetCB('S',&CtrlAltS,"Cmd/Screen Shot"); -public U0 Abbr(U8 *word,U8 *abbr) -{ - U8 buf1[136],buf2[136]; - StrCpy(buf1,word); - StrCpy(buf2,abbr); - - StrUtil(buf1,SUF_TO_LOWER); - StrUtil(buf2,SUF_TO_LOWER); - Grep(buf1,"/TempleOS/"FILENAME_MASK_TXT,"-l-i",buf2); - - *buf1=ToUpper(*buf1); - *buf2=ToUpper(*buf2); - Grep(buf1,"/TempleOS/"FILENAME_MASK_TXT,"-l-i",buf2); - - StrUtil(buf1,SUF_TO_UPPER); - StrUtil(buf2,SUF_TO_UPPER); - Grep(buf1,"/TempleOS/"FILENAME_MASK_TXT,"-l-i",buf2); -} - public U0 ChkAll() { U8 *ptr=TS_HDS; diff --git a/TempleOS/Demo/AcctExample/TSDistro.CPP b/TempleOS/Demo/AcctExample/TSDistro.CPP index 831557d..369f8e3 100644 --- a/TempleOS/Demo/AcctExample/TSDistro.CPP +++ b/TempleOS/Demo/AcctExample/TSDistro.CPP @@ -79,12 +79,6 @@ U0 TSCopyDrv(U8 src,U8 dst) SPrintF(buf_d,"%c:/Temp/ScreenShots",dst); MkDir(buf_d); - if (ts_has_bak_drv && dst==TS_BAK_DRV_LET) { - SPrintF(buf_d,"%c:/Logs",dst); - MkDir(buf_d); - SPrintF(buf_d,"%c:/Logs/TEMPLEOSLogs",dst); - MkDir(buf_d); - } DocClear; Drv(dst); TSMakeOSInstallPrtBootLoader(dst); @@ -178,12 +172,14 @@ U0 Uncollapse(U8 *files_find_mask=FILENAME_MASK_TXT,U8 *fu_flags=NULL) UncollapseLst(FilesFind(files_find_mask,f),&f); } -U0 CopySongDir(U8 *files_find_mask,U8 threshold) +public U0 CopySongs(U8 threshold='7') { CDoc *s; CDocEntry *doc_e; CDirEntry *tempm,*tempm1; - tempm1=tempm=FilesFind(files_find_mask); + DelTree("/TempleOS/Apps/MusicOrgan/Examples"); + MkDir("/TempleOS/Apps/MusicOrgan/Examples"); + tempm1=tempm=FilesFind("/TempleOS/Accts/TS/TAD/MusicOrgan/*.CPP*"); while (tempm1) { s=DocRead(tempm1->full_name); doc_e=s->root.next; @@ -194,17 +190,10 @@ U0 CopySongDir(U8 *files_find_mask,U8 threshold) CDirLstDel(tempm); } -public U0 CopySongs(U8 threshold='7') -{ - DelTree("/TempleOS/Apps/MusicOrgan/Examples"); - MkDir("/TempleOS/Apps/MusicOrgan/Examples"); - CopySongDir("/TempleOS/Accts/TS/TAD/MusicOrgan/*.CPP*",threshold); -} - U0 DistroPrep() { Del("/TempleOS/Demo/WebLogExample/WebLog.TXT*"); - Del("/TempleOS/Demo/GameStarters/EagleDive.BIN*"); + Del("/TempleOS/Demo/Games/EagleDive.BIN*"); DelTree("/TempleOS/Accts/*Temp.TXT.Z"); CopySongs; @@ -230,7 +219,7 @@ U0 DistroPrep() Cd("/TempleOS"); FilesCursorTop; - DelTree("/TempleOS/Demo/*.BI?"); + DelTree("/TempleOS/Demo/*.BI*"); Cd("/TempleOS"); S2T(FILENAME_MASK_SRC,"+r"); @@ -238,22 +227,6 @@ U0 DistroPrep() Move(WSD_DEF_FILENAME,WSD_DEF_FILENAME_Z); } -U0 TSDistroPrep() -{ - Drv(TS_MAIN_DRV_LET); - DistroPrep; - Auto(TS_CDROM_CFG); - MakeOSInstallPrtBootLoader(TS_MAIN_DRV_LET,TS_CDROM_DRV_LET); - Fmt(TS_IMG_DRV_LET,TRUE,FALSE,PT_NATIVE); - Drv(TS_IMG_DRV_LET); - CopyTree(TS_MAIN_DRV ":/TempleOS","/TempleOS"); - CopyTree(TS_MAIN_DRV ":/Windows","/Windows"); - CopyTree(TS_MAIN_DRV ":/Linux","/Linux"); - MkDir("/Temp"); - MkDir("/Temp/ScreenShots"); - CopyTree(TS_MAIN_DRV ":/0000Boot","/0000Boot"); -} - U0 MakeSymFiles() { CDoc *doc; @@ -262,7 +235,7 @@ U0 MakeSymFiles() DocClear; DocMax; HashRep(Fs->hash_table,HTG_ALL,NULL,"-p",0,NULL); - if (doc=DocCur) { + if (doc=DocPut) { st=StrNew(doc->filename.name); StrCpy(doc->filename.name,TS_BAK_DRV ":/Wb/Accts/TS/Wb2/SymsAlpha.TXT.Z"); DocWrite(doc); @@ -272,7 +245,7 @@ U0 MakeSymFiles() DocClear; DocMax; HashRep(Fs->hash_table,HTG_ALL,NULL,"-p+m",0,NULL); - if (doc=DocCur) { + if (doc=DocPut) { st=StrNew(doc->filename.name); StrCpy(doc->filename.name,TS_BAK_DRV ":/Wb/Accts/TS/Wb2/SymsAddress.TXT.Z"); DocWrite(doc); @@ -294,17 +267,22 @@ I64 MakeLineCntFile() Drv(TS_MAIN_DRV_LET); DistroPrep; + Cd(TS_MAIN_DRV ":/TempleOS"); + CopyTree(TS_MAIN_DRV ":/TempleOS/Accts/TS",TS_MAIN_DRV ":/Temp/TS"); + DelTree(TS_MAIN_DRV ":/TempleOS/Accts/TS"); + DocMax; DocClear; - Cd(TS_MAIN_DRV ":/TempleOS"); result=LineCntRep; - if (doc=DocCur) { + if (doc=DocPut) { st=StrNew(doc->filename.name); - StrCpy(doc->filename.name,TS_MAIN_DRV ":/TempleOS/Accts/TS/Wb2/LineCnt.TXT.Z"); + StrCpy(doc->filename.name,TS_MAIN_DRV ":/Temp/TS/Wb2/LineCnt.TXT.Z"); DocWrite(doc); StrCpy(doc->filename.name,st); Free(st); } + CopyTree(TS_MAIN_DRV ":/Temp/TS",TS_MAIN_DRV ":/TempleOS/Accts/TS"); + DelTree(TS_MAIN_DRV ":/Temp/TS"); DocClear; doc=DocRead(TS_MAIN_DRV ":/TempleOS/Adam/DocDefines.CPP.Z"); @@ -325,35 +303,49 @@ I64 MakeLineCntFile() return result; } -U0 StdDistroPrep(U8 *auto_cfg) +U0 TSDistroPrep() { Drv(TS_MAIN_DRV_LET); DistroPrep; - Auto(auto_cfg); + Auto(TS_CDROM_CFG); MakeOSInstallPrtBootLoader(TS_MAIN_DRV_LET,TS_CDROM_DRV_LET); - Fmt(TS_IMG_DRV_LET,TRUE,FALSE,PT_NATIVE); - Drv(TS_IMG_DRV_LET); - CopyTree(TS_MAIN_DRV ":/TempleOS","/TempleOS"); - CopyTree(TS_MAIN_DRV ":/Windows","/Windows"); - CopyTree(TS_MAIN_DRV ":/Linux","/Linux"); - MkDir("/Temp"); - DelTree("/TempleOS/Accts/TS"); - CopyTree(TS_MAIN_DRV ":/0000Boot","/0000Boot"); - Del("/0000Boot/OldMBR.BIN.C"); - Del("/0000Boot/BootMHD2.BIN.C"); + DelTree(TS_DISTRO_DIR); + CopyTree(TS_MAIN_DRV ":/TempleOS",TS_DISTRO_DIR "/TempleOS"); + CopyTree(TS_MAIN_DRV ":/Windows",TS_DISTRO_DIR "/Windows"); + CopyTree(TS_MAIN_DRV ":/Linux",TS_DISTRO_DIR "/Linux"); + MkDir(TS_DISTRO_DIR "/Temp"); + MkDir(TS_DISTRO_DIR "/Temp/ScreenShots"); + CopyTree(TS_MAIN_DRV ":/0000Boot",TS_DISTRO_DIR "/0000Boot"); +} + +U0 StdDistroPrep() +{ + Drv(TS_MAIN_DRV_LET); + DistroPrep; + Auto(STD_DISTRO_CDROM_CFG); + MakeOSInstallPrtBootLoader(TS_MAIN_DRV_LET,TS_CDROM_DRV_LET); + DelTree(TS_DISTRO_DIR); + CopyTree(TS_MAIN_DRV ":/TempleOS",TS_DISTRO_DIR "/TempleOS"); + CopyTree(TS_MAIN_DRV ":/Windows",TS_DISTRO_DIR "/Windows"); + CopyTree(TS_MAIN_DRV ":/Linux",TS_DISTRO_DIR "/Linux"); + MkDir(TS_DISTRO_DIR "/Temp"); + DelTree(TS_DISTRO_DIR "/TempleOS/Accts/TS"); + CopyTree(TS_MAIN_DRV ":/0000Boot",TS_DISTRO_DIR "/0000Boot"); + Del(TS_DISTRO_DIR "/0000Boot/OldMBR.BIN.C"); + Del(TS_DISTRO_DIR "/0000Boot/BootMHD2.BIN.C"); +} + +U0 MakeStdDistro() +{ + StdDistroPrep; + CDFileCreate(TS_ISO_NAME,TS_DISTRO_DIR "/*",,TS_DISTRO_DIR BOOT_DIR_KERNEL_BIN_C); + Drv(TS_MAIN_DRV_LET); } U0 MakeTSDistro() { TSDistroPrep; - CDFileCreate(TS_ISO_NAME,TS_IMG_DRV ":/*",NULL,BOOTCD_BIN_Z); - Drv(TS_MAIN_DRV_LET); -} - -U0 MakeStdDistro() -{ - StdDistroPrep(STD_DISTRO_CDROM_CFG); - CDFileCreate(TS_ISO_NAME,TS_IMG_DRV ":/*",NULL,BOOTCD_BIN_Z); + CDFileCreate(TS_ISO_NAME,TS_DISTRO_DIR "/*",,TS_DISTRO_DIR BOOT_DIR_KERNEL_BIN_C); Drv(TS_MAIN_DRV_LET); } @@ -382,6 +374,9 @@ U0 MakeWebSite() if (ts_has_bak_drv) { DocClear; Cd(TS_BAK_DRV ":/Wb"); + DelTree(TS_BAK_DRV ":/Wb/Accts/TS/TAD"); + Del(TS_BAK_DRV ":/Wb/Accts/TS/*"); + Touch(TS_BAK_DRV ":/Wb/Accts/TS/Wb2/index.TXT.Z","",,GetCurTimeDate); tempm=tempm2=FilesFind(FILENAME_MASK_TXT,FUF_RECURSE|FUF_FLATTEN_TREE|FUF_JUST_FILES); while (tempm) { TSWebFile(tempm->full_name); @@ -429,6 +424,19 @@ U0 TSUncompress() } } +U0 UpdateISODocDefines() +{ + I64 size; + size=10*FileSize(TS_BAK_DRV ":/Wb/TempleOSCD.ISO")/1024/1024; + DefinePrintF("DD_TEMPLEOSCD_SIZE", + "Download $TX+D,"TempleOS V1.03","DD_OS_NAME_VERSION"$ - Std. Distro (%0.1f MB)",0.1*size); + size=10*FileSize(TS_BAK_DRV ":/Wb/TempleOSTS.ISO")/1024/1024; + DefinePrintF("DD_TEMPLEOSTS_SIZE", + "Download $TX+D,"TempleOS V1.03","DD_OS_NAME_VERSION"$ - T.S. Company Internal Distro (%0.1f MB)",0.1*size); +} + +UpdateISODocDefines; + U0 MakeDistrosAndBackUp() { SettingsPush; //See $LK,"SettingsPush","MN:SettingsPush"$ @@ -444,12 +452,17 @@ U0 MakeDistrosAndBackUp() DelTree (TS_BAK_DRV ":/Wb"); progress4++; CopyTree(TS_MAIN_DRV ":/TempleOS",TS_BAK_DRV ":/Wb"); progress4++; DocClear; + MakeTSDistro; progress4++; DocClear; Copy(TS_ISO_NAME,TS_BAK_DRV ":/Wb/TempleOSTS.ISO"); progress4++; + MakeStdDistro; progress4++; DocClear; Copy(TS_ISO_NAME,TS_BAK_DRV ":/Wb/TempleOSCD.ISO"); progress4++; + + UpdateISODocDefines; + Cd(TS_MAIN_DRV ":/TempleOS"); if (LinkChk) throw; @@ -491,7 +504,7 @@ U0 TSPrtDsk() CATARep *root=NULL,*ata_drv=NULL,*atapi_drv=NULL; if (ts_cid==CID_DFT) {//Dangerous! don't do on my main machine ATARep(FALSE,TRUE,&root); - ATAIDDrvs(root,dft_drv,&ata_drv,&atapi_drv); + ATAIDDrvs(root,*sys_acct,&ata_drv,&atapi_drv); if (ata_drv) { XTalkWait(task,"PrtDsk;\nY%C2p%d\nYYY",TS_MAIN_DRV_LET,ata_drv->num); XTalkWait(task,"%d\nY\nY\n",(prt_dsk_dsk_size-PRT_HEADER)/2); diff --git a/TempleOS/Demo/Asm/AsmAndC.CPP b/TempleOS/Demo/Asm/AsmAndC.CPP index e9ed8cf..200144c 100644 --- a/TempleOS/Demo/Asm/AsmAndC.CPP +++ b/TempleOS/Demo/Asm/AsmAndC.CPP @@ -45,17 +45,14 @@ I64 AsmAndC() Beeps(i); asm { -//You can clobber RAX,RBX,RCX,RDX, but preserve the rest for code in a C+ routine. +//You can clobber RAX,RBX,RCX,RDX, but preserve the rest for code in a Holy C routine. USE64 //Defaults to 64, but this is a good habit. IMPORT Snd; MOV RCX,&i[RBP] //You can clobber RAX,RBX,RCX,RDX. //You better preserve the rest. @@05: PUSH RCX -//U0 Snd(F64 freq,I64 waveform=WF_SQUARE,F64 amp=1.0); - MOV RAX,1.0 //amplitude - PUSH RAX - PUSH WF_SQUARE +//U0 Snd(F64 freq); MOV RAX,RCX //freq=loop*100.0+100.0 IMUL2 RAX,100 //TempleOS uses nonstandard opcodes diff --git a/TempleOS/Demo/Asm/AsmAndC2.CPP b/TempleOS/Demo/Asm/AsmAndC2.CPP index 9617f41..2c71357 100644 --- a/TempleOS/Demo/Asm/AsmAndC2.CPP +++ b/TempleOS/Demo/Asm/AsmAndC2.CPP @@ -38,7 +38,7 @@ _BEEPS2:: POP RCX LOOP @@05 - PUSH RSI //we must preserve this register. + PUSH RSI //See $LK,"CREG_VARS_MASK","MN:CREG_VARS_MASK"$ & $LK,"CREG_NON_PTR_MASK","MN:CREG_NON_PTR_MASK"$ MOV RSI,JIFFIES_MSG CALL PUT_STR POP RSI @@ -67,15 +67,12 @@ U0 AsmAndC2() asm { LIST -//You can clobber RAX,RBX,RCX,RDX, but preserve the rest for code in a C+ routine. +//You can clobber RAX,RBX,RCX,RDX, but preserve the rest for code in a Holy C routine. USE64 //Defaults to 64, but this is a good habit. MOV RCX,R15 //You can clobber RAX,RBX,RCX,RDX. //You better preserve the rest. @@05: PUSH RCX -//U0 Snd(F64 freq,I64 waveform=WF_SQUARE,F64 amp=1.0); - MOV RAX,1.0 //amplitude - PUSH RAX - PUSH WF_SQUARE +//U0 Snd(F64 freq); MOV RAX,RCX //freq=loop*100.0+100.0 IMUL2 RAX,glbl_hz_step //evaluated at compile ttime diff --git a/TempleOS/Demo/Asm/AsmHelloWorld.CPP b/TempleOS/Demo/Asm/AsmHelloWorld.CPP index c138956..3cc65af 100644 --- a/TempleOS/Demo/Asm/AsmHelloWorld.CPP +++ b/TempleOS/Demo/Asm/AsmHelloWorld.CPP @@ -28,24 +28,29 @@ USE64 //Defaults to 64, but this is a good habit. IMPORT PUT_HEX_U8,PUT_CHAR; -MY_MSG: +MY_WORLD_MSG: //Define U8 does not put terminating zeros //on strings. - DU8 "Hello World\n",0; + DU8 "World\n",0; //My convention is to put an underscore //on C callable routines. _HELLO_WORLD:: + PUSH RSI //See $LK,"CREG_VARS_MASK","MN:CREG_VARS_MASK"$ & $LK,"CREG_NON_PTR_MASK","MN:CREG_NON_PTR_MASK"$ MOV RCX,10 @@05: MOV RAX,RCX CALL PUT_HEX_U8 MOV RAX,CH_SPACE CALL PUT_CHAR - MOV RSI,MY_MSG + MOV RAX,'Hello ' //Supports multi-byte char constants + CALL PUT_CHAR +//We broke it in two pieces to show different ways. + MOV RSI,MY_WORLD_MSG //Alternatively, if you use an '&', you don't need //to import a SYS_SYM. This only works for JIT asm. CALL &PUT_STR LOOP @@05 + POP RSI RET }; diff --git a/TempleOS/Demo/Asm/BuzzFizz.CPP b/TempleOS/Demo/Asm/BuzzFizz.CPP index 8b60262..b278f84 100644 --- a/TempleOS/Demo/Asm/BuzzFizz.CPP +++ b/TempleOS/Demo/Asm/BuzzFizz.CPP @@ -12,7 +12,7 @@ MSG_NEW_LINE: DU8 "\n\0"; _BUZZ_FIZZ:: ENTER 0 //Always use Enter/Leave - PUSH RSI //RSI must be preserved. + PUSH RSI //See $LK,"CREG_VARS_MASK","MN:CREG_VARS_MASK"$ & $LK,"CREG_NON_PTR_MASK","MN:CREG_NON_PTR_MASK"$ MOV RAX,RANGE_START MOV DX,(FIZZ_SPAN-RANGE_START%FIZZ_SPAN+1)<<8+ (BUZZ_SPAN-RANGE_START%BUZZ_SPAN+1) diff --git a/TempleOS/Demo/Asm/PutDec.CPP b/TempleOS/Demo/Asm/PutDec.CPP index 802cd51..2457d95 100644 --- a/TempleOS/Demo/Asm/PutDec.CPP +++ b/TempleOS/Demo/Asm/PutDec.CPP @@ -3,8 +3,12 @@ PUT_DEC_U64:: //RAX is number to print in decimal. //Preserves all regs. ENTER 24 //24 char buffer on stack - PUSH_C_REGS //$LK,"Save regs","FF:::/TempleOS/Kernel/Adam1a.HPP,PUSH_C_REGS"$ which C code is free to clobber - PUSH RSI //This reg is not saved. + +//$LK,"Save regs","FF:::/TempleOS/Kernel/Adam1a.HPP,PUSH_C_REGS"$ which C code is free to clobber. We don't have to for C callers, +//but this function will be nice for ASM callers if it saves all regs. + PUSH_C_REGS + + PUSH RSI //See $LK,"CREG_VARS_MASK","MN:CREG_VARS_MASK"$ & $LK,"CREG_NON_PTR_MASK","MN:CREG_NON_PTR_MASK"$ LEA RSI,-1[RBP] //Load addr of end of buffer. //We picked RSI because of PUT_STR //We'll move backward diff --git a/TempleOS/Demo/AutoFile/AFDir.AUT b/TempleOS/Demo/AutoFile/AFDir.AUT index 11aa089..4960271 100644 --- a/TempleOS/Demo/AutoFile/AFDir.AUT +++ b/TempleOS/Demo/AutoFile/AFDir.AUT @@ -11,5 +11,5 @@ for (i=0;i<3;i++) "$$FG,RED$$//Press a letter to complete the mask$$FG$$\n"; "Dir(\"*."; -I64 ch=GetChar(NULL,FALSE); //Prompt for first digit of mask +I64 ch=GetChar(,FALSE); //Prompt for first digit of mask "%c*\");\n",ch; \ No newline at end of file diff --git a/TempleOS/Demo/AutoFile/AFEd.TXT b/TempleOS/Demo/AutoFile/AFEd.TXT index d88dc0b..0e92516 100644 --- a/TempleOS/Demo/AutoFile/AFEd.TXT +++ b/TempleOS/Demo/AutoFile/AFEd.TXT @@ -1,20 +1,20 @@ //Intermediate compiler codes #define IC_END 0x00 #define IC_START 0x01 -#define IC_NOP 0x02 +#define IC_NOP1 0x02 #define IC_END_EXP 0x03 -#define IC_NOP1 0x04 +#define IC_NOP2 0x04 #define IC_LABEL 0x05 #define IC_CALL_START 0x06 #define IC_CALL_END 0x07 #define IC_CALL_END2 0x08 #define IC_RETURN_VAL 0x09 #define IC_RETURN_VAL2 0x0A -#define IC_IMM 0x0B -#define IC_F64 0x0C +#define IC_IMM_U64 0x0B +#define IC_IMM_F64 0x0C #define IC_STR_CONST 0x0D -#define IC_ABS_ADDR 0x0E -#define IC_ADDR_IMPORT 0x0F +#define IC_ABS_ADDR 0x0E +#define IC_ADDR_IMPORT 0x0F #define IC_HEAP_GLBL 0x10 #define IC_SIZEOF 0x11 #define IC_TYPE 0x12 @@ -31,9 +31,9 @@ #define IC_TO_F64 0x1B #define IC_TO_BOOL 0x1C #define IC_TOUPPER 0x1D -#define IC_NATIVE_TYPECAST 0x1E +#define IC_HOLYC_TYPECAST 0x1E -#define IC_ADDR 0x1F +#define IC_ADDR 0x1F #define IC_COM 0x20 #define IC_NOT 0x21 #define IC_UNARY_MINUS 0x22 @@ -132,12 +132,12 @@ #define IC_WBINVD 0x6F #define IC_INVD 0x70 -#define IC_INU8 0x71 -#define IC_INU16 0x72 -#define IC_INU32 0x73 -#define IC_OUTU8 0x74 -#define IC_OUTU16 0x75 -#define IC_OUTU32 0x76 +#define IC_IN_U8 0x71 +#define IC_IN_U16 0x72 +#define IC_IN_U32 0x73 +#define IC_OUT_U8 0x74 +#define IC_OUT_U16 0x75 +#define IC_OUT_U32 0x76 #define IC_GET_FLAGS 0x77 #define IC_SET_FLAGS 0x78 diff --git a/TempleOS/Demo/DateTime.CPP b/TempleOS/Demo/DateTime.CPP index a498a6d..07c7509 100644 --- a/TempleOS/Demo/DateTime.CPP +++ b/TempleOS/Demo/DateTime.CPP @@ -21,15 +21,15 @@ */ -CDate spdt=GetCurTimeCDate; +CDate cdt=GetCurTimeDate; I64 i; for (i=0;i to enter Dbg. Press to enter Dbg. > $LK,"Uf","MN:Uf"$("DbgDemo"); -> $LK,"U","MN:U"$(RIP); +> $LK,"U","MN:U"$(_RIP); See $LK,"Debugging","HI:Debugging"$ diff --git a/TempleOS/Demo/Doc/CallBack.CPP b/TempleOS/Demo/Doc/CallBack.CPP index 30b3e87..95b8848 100644 --- a/TempleOS/Demo/Doc/CallBack.CPP +++ b/TempleOS/Demo/Doc/CallBack.CPP @@ -5,36 +5,24 @@ U8 *tSCB(CDoc *,CDocEntry *,CTask *mem_task) //if the window mgr used it's own //heap, so we use the owning task's heap. U8 *st=MAlloc(64,mem_task); - CDate spdt=tS*CDATE_FREQ; + CDate cdt=tS*CDATE_FREQ; //Doesn't have to be fixed width!! - SPrintF(st,"%d=%h11T",spdt,spdt); + SPrintF(st,"%d=%h11T",cdt,cdt); return st; } U8 *CurTimeCB(CDoc *,CDocEntry *,CTask *mem_task) { U8 *st=MAlloc(64,mem_task); - CDate spdt=GetCurTimeCDate; - SPrintF(st,"%h0D %h0T",spdt,spdt); + CDate cdt=GetCurTimeDate; + SPrintF(st,"%h0D %h0T",cdt,cdt); return st; } U0 DoIt() { -/* The main window is kept at Fs->last_doc. -A second framework is kept at Fs->next_doc. -Normally, the next_doc is used for updating -the border, primarily. - -See $LK,"UseTermDoc","MN:UseTermDoc"$(). -See $LK,"DocUpdateTaskDocs","MN:DocUpdateTaskDocs"$(). - -Note: the next_doc is not to be confused -with the aux_str, a member of the $LK,"CDocEntry","MN:CDocEntry"$. - -*/ - CDoc *aux=DocAux, //Fetches Fs->next_doc basically. - *cur=DocCur; //Fetches Fs->last_doc basically. + CDoc *bdoc=DocBorder, + *pdoc=DocPut; CDocEntry *doc_e; // We don't want an update between @@ -43,32 +31,32 @@ with the aux_str, a member of the $LK,"CDocEntry","MN:CDocEntry"$. Bool old_preempt=Preempt(OFF); - DocBottom(aux); //Ins at the bottom - DocPutS(aux,"$$FG,RED$$$$CM+BY+LX,5,-3$$"); + DocBottom(bdoc); //Ins at the bottom + DocPutS(bdoc,"$$FG,RED$$$$CM+BY+LX,5,-3$$"); // The $LK,"DocPutS","MN:DocPutS"$() routine returns the addr of the last entry. - doc_e=DocPutS(aux,"$$TX+TC,\" \"$$"); + doc_e=DocPutS(bdoc,"$$TX+TC,\" \"$$"); // The TC flag is "has tag callback". // Flags are explained here: -// $LK-A,"::/TempleOS/Doc/CtrlL.TXT"$ +// $LK-A,"::/TempleOS/Doc/Widget.TXT"$ // $LK-A,"::/TempleOS/Doc/Dollar.TXT"$ // $LK,"Dollar Flags","MN:DOCEf1_AUX_STR"$ // $LK,"ST_DOC_FLAGS","FF:::/TempleOS/Adam/Doc/Doc.CPP,ST_DOC_FLAGS"$ doc_e->tag_cb=&tSCB; - DocPutS(aux,"$$FG$$"); + DocPutS(bdoc,"$$FG$$"); -//$BK,1$WARNING:$BK,0$ If you use the last_doc you +//$BK,1$WARNING:$BK,0$ If you use the put_doc you //run the risk of the user pressing // or using the clipboard, both //of which will crash. So, you might want -//to use the next_doc. +//to use the border_doc. - DocPutS(cur,"$$FG,LTRED$$"); - doc_e=DocPutS(cur,"$$TX+TC,\" \"$$"); + DocPutS(pdoc,"$$FG,LTRED$$"); + doc_e=DocPutS(pdoc,"$$TX+TC,\" \"$$"); doc_e->tag_cb=&CurTimeCB; - DocPutS(cur,"$$FG$$"); + DocPutS(pdoc,"$$FG$$"); Preempt(old_preempt); @@ -83,11 +71,8 @@ with the aux_str, a member of the $LK,"CDocEntry","MN:CDocEntry"$. U0 UndoIt() { //Clear-out entries without a +H hold flag. - DocBottom(Fs->next_doc); - DocPutS(Fs->next_doc,"$$CL$$"); + DocClear(Fs->border_doc); } DoIt; - -// See $LK-A,"::/TempleOS/Demo/Doc/CallBackAux2.CPP"$ for another way. diff --git a/TempleOS/Demo/Doc/CallBackAux2.CPP b/TempleOS/Demo/Doc/CallBackAux2.CPP deleted file mode 100644 index 05885e6..0000000 --- a/TempleOS/Demo/Doc/CallBackAux2.CPP +++ /dev/null @@ -1,35 +0,0 @@ -//See $LK-A,"::/TempleOS/Demo/Doc/CallBack.CPP"$ first. - -U8 *tSCB(CDoc *,CDocEntry *,CTask *mem_task) -{ - U8 *st=MAlloc(64,mem_task); - CDate spdt=tS*CDATE_FREQ; - SPrintF(st,"%d=%h11T",spdt,spdt); - return st; -} - -U0 DoIt() -{ - CDocEntry *doc_e; - CDoc *aux2=DocNew; - - aux2->flags|=DOCF_AUX_DOC; - - DocPutS(aux2,"$$FG,RED$$$$CM+BY+LX,5,-3$$"); - doc_e=DocPutS(aux2,"$$TX+TC,\" \"$$"); - doc_e->tag_cb=&tSCB; - DocPutS(aux2,"$$FG$$"); - - DocQueInsRev(aux2,DocAux); - - NewLine; -} - -U0 UndoIt() -{ - CDoc *aux2=DocAux; - DocQueRem(aux2); - DocDel(aux2); -} - -DoIt; diff --git a/TempleOS/Demo/Doc/Data.CPP b/TempleOS/Demo/Doc/Data.CPP index 9e908f9..d09b34a 100644 --- a/TempleOS/Demo/Doc/Data.CPP +++ b/TempleOS/Demo/Doc/Data.CPP @@ -6,9 +6,9 @@ +RD refreshes the data. +UD updates the val when you edit it. +U32 means the val is 4 bytes. - -I64 I64 is the default so we might + -U64 U64 is the default so we might want to turn-it-off. Strings - use I64. + use U64. ,32 sets the tag string width. See $LK,"Data Tag Width","FA:::/TempleOS/Adam/Doc/DocPlain.CPP,DataTagWidth"$. -P Means it is a string var, basically. @@ -33,7 +33,7 @@ U0 DataDemo() CDocEntry *doc_e; //This is the command line document. - CDoc *doc=DocCur; + CDoc *doc=DocPut; //We do this to prevent access to //doc_e->data before it is set. @@ -43,7 +43,7 @@ U0 DataDemo() // doc->flags|=DOCF_FORM //if you wish. - Spawn(&UpdateGlblTask,NULL,"Update Glbl",Fs); + Spawn(&UpdateGlblTask,NULL,"Update Glbl",,Fs); "Enter editor overstrike mode\n" "and you can modify the val.\n" @@ -62,3 +62,5 @@ U0 DataDemo() } DataDemo; + +//See $LK,"PopUpExtents","MN:PopUpExtents"$(). diff --git a/TempleOS/Demo/Doc/DefineStr.CPP b/TempleOS/Demo/Doc/DefineStr.CPP index f8362b8..2103b63 100644 --- a/TempleOS/Demo/Doc/DefineStr.CPP +++ b/TempleOS/Demo/Doc/DefineStr.CPP @@ -2,8 +2,8 @@ The +D flag causes a define-string look-up and substitution. -It is available in the menu -under text entries for use in +It is available in the text-widget +menu under text entries for use in documentation. */ @@ -12,11 +12,11 @@ documentation. DefineLoad("COMPANY","Trivial Solutions"); "Company: $$TX+D,\"\",\"COMPANY\"$$\n"; -DefinePrintF("COMPANY_TIME","%T",GetCurTimeCDate); +DefinePrintF("COMPANY_TIME","%T",GetCurTimeDate); #exe { StreamPrintF( - "#define COMPANY_AGE %h56D\n",GetCurTimeCDate-A2CDate("8/1/2003")); + "#define COMPANY_AGE %h56D\n",GetCurTimeDate-A2Date("8/1/2003")); }; diff --git a/TempleOS/Demo/Doc/Form.CPP b/TempleOS/Demo/Doc/Form.CPP index 0328e8c..d9dc3f4 100644 --- a/TempleOS/Demo/Doc/Form.CPP +++ b/TempleOS/Demo/Doc/Form.CPP @@ -16,15 +16,15 @@ class DStruct U0 FormDemo() { DStruct gtl; - CDate spdt; + CDate cdt; gtl.num1=12.3e-4; //Set defaults gtl.num2=4.5e3; gtl.num3=0x1234; gtl.num4=-567; StrCpy(>l.name,"John"); - spdt=GetCurTimeCDate; - gtl.datetime=spdt; + cdt=GetCurTimeDate; + gtl.datetime=cdt; if (DocFormDo(>l,"DStruct")) { "#1=%e\n",gtl.num1; "#2=%e\n",gtl.num2; diff --git a/TempleOS/Demo/Doc/MenuButton.CPP b/TempleOS/Demo/Doc/MenuButton.CPP index 008d333..573bfe5 100644 --- a/TempleOS/Demo/Doc/MenuButton.CPP +++ b/TempleOS/Demo/Doc/MenuButton.CPP @@ -27,9 +27,9 @@ U0 MenuButton() { Bool done=FALSE; I64 i,j=0,freq=100; - I64 old_flags=DocCur->flags; + I64 old_flags=DocPut->flags; //This allows keyboard navigation to skip nonselectible entries. - DocCur->flags|=DOCF_FORM; + DocPut->flags|=DOCF_FORM; do { DocClear; //Use to generate cursor movement expressions and check "Quote". @@ -43,7 +43,7 @@ U0 MenuButton() "\n$$BT,\"Set Freq\",MU_SET_FREQ$$\n\n\n" "\n$$BT,\"Nothing\",MU_NOTHING$$\n\n\n" "\n$$BT,\"Done\",DOCM_CANCEL$$\n\n\n"; - i=DocMenuDo(DocCur); + i=DocMenuDo(DocPut); DocBottom; switch (i) { case MU_NOTHING: @@ -67,7 +67,7 @@ U0 MenuButton() done=TRUE; } } while (!done); - DocCur->flags=DocCur->flags&~DOCF_FORM | + DocPut->flags=DocPut->flags&~DOCF_FORM | old_flags & DOCF_FORM; DocClear; Snd(0); diff --git a/TempleOS/Demo/Doc/MenuSprite.CPP b/TempleOS/Demo/Doc/MenuSprite.CPP index 41bc978c0d811abc0d7baa269bed1673d4a512c5..b9cb2dca8b8ebca3a888e0047de933f903c4f363 100644 GIT binary patch delta 47 ycmaFH@tI?S33EVc$wqTIMs7EE9iI>q*H%RubO+)TkBdUGO^5EB5}=?e7# diff --git a/TempleOS/Demo/Doc/TreeDemo.CPP b/TempleOS/Demo/Doc/TreeDemo.CPP index 0bb1d7d..1a03eaf 100644 --- a/TempleOS/Demo/Doc/TreeDemo.CPP +++ b/TempleOS/Demo/Doc/TreeDemo.CPP @@ -13,7 +13,31 @@ For this example, however, I wanted to use DocPrintF and disabled Preemption myself. */ -#include "/TempleOS/Demo/Shared/TreeDemoJoin" +U0 TreeSub(CDoc *doc,CDirEntry *tempm) +{ + CDirEntry *tempm1; + while (tempm) { + tempm1=tempm->next; + if (tempm->attr & _ATTR_DIR) { + DocPutS(doc,"$$TR,\"\"$$"); + DocPrintF(doc,"$$MA+A,\"%s\",\"Cd(\\\"%s\\\");Dir;\n\"$$\n", + tempm->name,tempm->full_name); + if (tempm->sub) { + DocPutS(doc,"$$ID,+2$$"); + TreeSub(doc,tempm->sub); + DocPutS(doc,"$$ID,-2$$"); + } + } else { + DocPrintF(doc,"$$LK,\"%s\",\"FI:%s\"$$\n", + tempm->name,tempm->full_name); + } + //Note there is also a routine + //to delete an entire CDirEntry tree. + //See $LK,"CDirLstDel","MN:CDirLstDel"$(). + CDirEntryDel(tempm); + tempm=tempm1; + } +} U0 TreeDemo() { @@ -24,7 +48,7 @@ U0 TreeDemo() DocPutS(doc,"$$ID,+2$$"); TreeSub(doc,FilesFind("/TempleOS/*",fuf_flags)); DocPutS(doc,"$$ID,-2$$"); - DocInsDoc(DocCur,doc); + DocInsDoc(DocPut,doc); DocDel(doc); } diff --git a/TempleOS/Demo/Doc/UnusedDefine.CPP b/TempleOS/Demo/Doc/UnusedDefine.CPP index f5a1f5b..5889c74 100644 --- a/TempleOS/Demo/Doc/UnusedDefine.CPP +++ b/TempleOS/Demo/Doc/UnusedDefine.CPP @@ -15,7 +15,7 @@ output $LK,"Silent","MN:Silent"$(). U0 UnusedDefineScan() { - CDoc *old_doc=DocCur,*doc; + CDoc *old_put_doc,*old_display_doc,*doc; I64 cnt=0; CHashTable *tempht; CHash *temph; @@ -50,18 +50,18 @@ U0 UnusedDefineScan() progress1++; if (FileOcc(temph->str,"/TempleOS/"FILENAME_MASK_TXT,"+l-i")==1) { doc=DocNew; - DocQueRem(old_doc); - DocQueIns(doc,Fs->last_doc); + old_put_doc=DocPut; + old_display_doc=DocDisplay; + Fs->put_doc=Fs->display_doc=doc; Grep(temph->str,"/TempleOS/"FILENAME_MASK_TXT,"+l-i"); - DocQueRem(doc); - DocQueIns(old_doc,Fs->last_doc); + Fs->put_doc=old_put_doc; + Fs->display_doc=old_display_doc; doc_e=doc->root.next; while (doc_e!=doc) { if (doc_e->type_u8==DOCT_LINK) { - NewLine; - "" temph->str; + "%s ",temph->str; doc_e2=DocEntryCopy(doc,doc_e); - DocIns(old_doc,doc_e2); + DocIns(old_put_doc,doc_e2); NewLine; } doc_e=doc_e->next; diff --git a/TempleOS/Demo/Dsk/FPrintF.CPP b/TempleOS/Demo/Dsk/FPrintF.CPP index 349c9a1..e19de0f 100644 --- a/TempleOS/Demo/Dsk/FPrintF.CPP +++ b/TempleOS/Demo/Dsk/FPrintF.CPP @@ -4,7 +4,31 @@ hold the file until you are done. The $LK,"CDoc","MN:CDoc"$ framework is convenient for this. */ -#include "/TempleOS/Demo/Shared/TreeDemoJoin" +U0 TreeSub(CDoc *doc,CDirEntry *tempm) +{ + CDirEntry *tempm1; + while (tempm) { + tempm1=tempm->next; + if (tempm->attr & _ATTR_DIR) { + DocPutS(doc,"$$TR,\"\"$$"); + DocPrintF(doc,"$$MA+A,\"%s\",\"Cd(\\\"%s\\\");Dir;\n\"$$\n", + tempm->name,tempm->full_name); + if (tempm->sub) { + DocPutS(doc,"$$ID,+2$$"); + TreeSub(doc,tempm->sub); + DocPutS(doc,"$$ID,-2$$"); + } + } else { + DocPrintF(doc,"$$LK,\"%s\",\"FI:%s\"$$\n", + tempm->name,tempm->full_name); + } + //Note there is also a routine + //to delete an entire CDirEntry tree. + //See $LK,"CDirLstDel","MN:CDirLstDel"$(). + CDirEntryDel(tempm); + tempm=tempm1; + } +} U0 FPrintFDemo(U8 *output_filename=NULL) { diff --git a/TempleOS/Demo/Dsk/UnusedSpaceRep.CPP b/TempleOS/Demo/Dsk/UnusedSpaceRep.CPP index 42453f2..de689ab 100644 --- a/TempleOS/Demo/Dsk/UnusedSpaceRep.CPP +++ b/TempleOS/Demo/Dsk/UnusedSpaceRep.CPP @@ -5,7 +5,7 @@ U0 UnusedSpaceRep() for (i=0;i<26;i++) { try { p=Drv2Prt(i+'A'); - if (p->type==PT_FAT32 || p->type==PT_NATIVE) + if (p->type==PT_FAT32 || p->type==PT_REDSEA) "%C: %7.3f%% Free\n", Prt2Drv(p),UnusedDrvSpace(Prt2Drv(p))*100.0/(p->size*BLK_SIZE); } catch diff --git a/TempleOS/Demo/GameStarters/Bomber.CPP b/TempleOS/Demo/GameStarters/Bomber.CPP deleted file mode 100644 index fd8fef7a653f7805facc6e1fcf8d11dd949b98fe..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 12893 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 Bc?",1$,$IB,"<7>",7$,$IB,"<2>",2$,$IB,"<8>",8$,$IB,"<3>",3$,$IB,"<9>",9$,$IB,"<4>",4$,$IB,"<10>",10$,$IB,"<5>",5$,$IB,"<11>",11$,$IB,"<6>",6$,$IB,"<12>",12$}; - -I64 piece_scores[6]={ -1<pieces,*cur_p=&p[piece_num]; - I64 result=0,i,j,k,x,y,xx=cur_p->x,yy=cur_p->y; - I8 brd[BD_SIDE*BD_SIDE*sizeof(I8)]; - BrdFill(brd,p); - nobound_switch (state->pieces[piece_num].type) { - case P_PAWN: - if (!state->cur_player) { - if (BrdPeek(brd,xx+1,yy)==T_CLR) { - mvs[result].x=xx+1; - mvs[result].y=yy; - result++; - if (xx==1 && BrdPeek(brd,xx+2,yy)==T_CLR) { - mvs[result].x=xx+2; - mvs[result].y=yy; - result++; - } - } - if (BrdPeek(brd,xx+1,yy-1)==T_PLAYER1 || - state->potential_en_passant_victim.x==xx && - state->potential_en_passant_victim.y==yy-1) { - mvs[result].x=xx+1; - mvs[result].y=yy-1; - result++; - } - if (BrdPeek(brd,xx+1,yy+1)==T_PLAYER1 || - state->potential_en_passant_victim.x==xx && - state->potential_en_passant_victim.y==yy+1) { - mvs[result].x=xx+1; - mvs[result].y=yy+1; - result++; - } - } else { - if (BrdPeek(brd,xx-1,yy)==T_CLR) { - mvs[result].x=xx-1; - mvs[result].y=yy; - result++; - if (xx==6 && BrdPeek(brd,xx-2,yy)==T_CLR) { - mvs[result].x=xx-2; - mvs[result].y=yy; - result++; - } - } - if (!BrdPeek(brd,xx-1,yy-1) || - state->potential_en_passant_victim.x==xx && - state->potential_en_passant_victim.y==yy-1) { - mvs[result].x=xx-1; - mvs[result].y=yy-1; - result++; - } - if (!BrdPeek(brd,xx-1,yy+1) || - state->potential_en_passant_victim.x==xx && - state->potential_en_passant_victim.y==yy+1) { - mvs[result].x=xx-1; - mvs[result].y=yy+1; - result++; - } - } - break; - case P_ROOK: - for (j=0;j<4;j++) { - x=xx; y=yy; - for (i=1;i<8;i++) { - x+=gr_x_offsets2[j]; - y+=gr_y_offsets2[j]; - k=BrdPeek(brd,x,y); - if (k==T_CLR || k==cur_p->player^1) { - mvs[result].x=x; - mvs[result].y=y; - result++; - if (k!=T_CLR) - break; - } else - break; - } - } - break; - case P_KNIGHT: - for (j=0;j<8;j++) { - x=xx+knight_x_offsets[j]; - y=yy+knight_y_offsets[j]; - k=BrdPeek(brd,x,y); - if (k==T_CLR || k==cur_p->player^1) { - mvs[result].x=x; - mvs[result].y=y; - result++; - } - } - break; - case P_BISHOP: - for (j=0;j<4;j++) { - x=xx; y=yy; - for (i=1;i<8;i++) { - x+=bishop_x_offsets3[j]; - y+=bishop_y_offsets3[j]; - k=BrdPeek(brd,x,y); - if (k==T_CLR || k==cur_p->player^1) { - mvs[result].x=x; - mvs[result].y=y; - result++; - if (k!=T_CLR) - break; - } else - break; - } - } - break; - case P_QUEEN: - for (j=0;j<8;j++) { - x=xx; y=yy; - for (i=1;i<8;i++) { - x+=gr_x_offsets[j]; - y+=gr_y_offsets[j]; - k=BrdPeek(brd,x,y); - if (k==T_CLR || k==cur_p->player^1) { - mvs[result].x=x; - mvs[result].y=y; - result++; - if (k!=T_CLR) - break; - } else - break; - } - } - break; - case P_KING: - for (j=0;j<8;j++) { - x=xx+gr_x_offsets[j]; - y=yy+gr_y_offsets[j]; - k=BrdPeek(brd,x,y); - if (k==T_CLR || k==cur_p->player^1) { - mvs[result].x=x; - mvs[result].y=y; - result++; - } - } - if (!Bt(&state->moved_mask,piece_num)) { - if (!state->cur_player) { - if (state->pieces[0].player>=0 && - !Bt(&state->moved_mask,0) && - BrdPeek(brd,0,1)==T_CLR && - BrdPeek(brd,0,2)==T_CLR && - BrdPeek(brd,0,3)==T_CLR) { - mvs[result].x=0; - mvs[result].y=2; - result++; - } - if (state->pieces[7].player>=0 && - !Bt(&state->moved_mask,7) && - BrdPeek(brd,0,6)==T_CLR && - BrdPeek(brd,0,5)==T_CLR) { - mvs[result].x=0; - mvs[result].y=6; - result++; - } - } else { - if (state->pieces[24].player>=0 && - !Bt(&state->moved_mask,24) && - BrdPeek(brd,7,1)==T_CLR && - BrdPeek(brd,7,2)==T_CLR && - BrdPeek(brd,7,3)==T_CLR) { - mvs[result].x=7; - mvs[result].y=2; - result++; - } - if (state->pieces[31].player>=0 && - !Bt(&state->moved_mask,31) && - BrdPeek(brd,7,6)==T_CLR && - BrdPeek(brd,7,5)==T_CLR) { - mvs[result].x=7; - mvs[result].y=6; - result++; - } - } - } - break; - } - for (i=0;ipieces[i].player==state->cur_player) { - mv_cnt=PieceMoves(state,i,mvs); - for (j=0;jpieces[piece_num]; - I64 j,ty=-1,score_adjust=0,x1=p->x,y1=p->y; - - j=PieceFind(x2,y2,state->cur_player^1); - if (j>=0) { - state->pieces[j].player-=2; //dead - ty=state->pieces[j].type; - score_adjust=piece_scores[ty]; - } else if (p->type==P_PAWN && AbsI64(y1-y2)==1) { //en passant? - if (!state->cur_player) - j=PieceFind(x2-1,y2,1); - else - j=PieceFind(x2+1,y2,0); - if (j>=0) { - state->pieces[j].player-=2; //dead - ty=state->pieces[j].type; - score_adjust=piece_scores[ty]; - } - } - if (p->type==P_PAWN && AbsI64(x1-x2)==2) { - state->potential_en_passant_victim.x=x2; - state->potential_en_passant_victim.y=y2; - } else { - state->potential_en_passant_victim.x=-1; - state->potential_en_passant_victim.y=-1; - } - if (p->type==P_PAWN && (!x2||x2==7)) { - if (!state->is_human[state->cur_player] || !final) - p->type=P_QUEEN; - else - p->type=PopUpPiece(state->cur_player); - score_adjust+=piece_scores[p->type]-piece_scores[P_PAWN]; - } else if (p->type==P_KING && AbsI64(y1-y2)==2) { //castling? - if (!state->cur_player) { - if (y2-y1<0) - state->pieces[6].y=y2+1; - else - state->pieces[7].y=y2-1; - } else { - if (y2-y1<0) - state->pieces[22].y=y2+1; - else - state->pieces[23].y=y2-1; - } - } - p->x=x2; - p->y=y2; - LBts(&state->moved_mask,piece_num); - if (!state->cur_player) - state->raw_score+=score_adjust; - else - state->raw_score-=score_adjust; - state->cur_player^=1; - state->mv_num++; - if (final) { - last_mv.x=x2; - last_mv.y=y2; - DocPrintF(chess_doc,"%02d)",state->mv_num); - if (state->cur_player) - DocPutS(chess_doc,"$$FG,LTGRAY$$"); - else - DocPutS(chess_doc,"$$FG,BLACK"); - DocPrintF(chess_doc,"%c:%c%c-%c%c",piece_letters[p->type], - y1+'A',x1+'1',y2+'A',x2+'1'); - if (ty>=0) { - if (state->cur_player) - DocPutS(chess_doc,"$$FG$$*$$FG,BLACK$$"); - else - DocPutS(chess_doc,"$$FG$$*$$FG,LTGRAY$$"); - DocPrintF(chess_doc,"%c",piece_letters[ty]); - } - DocPutS(chess_doc,"$$FG$$\n"); - if (!MoveCnt(&cur_state)) { - DocPutS(chess_doc,"$$FG,RED$$Game Over$$FG$$\n"); - game_over=TRUE; - } - GameSnapShot; - } - return ToBool(score_adjust); -} - -I64 MoveFind(I64 x,I64 y,Move *mvs,I64 mv_cnt) -{ - I64 i; - for (i=0;i=0 && MoveFind(x,y,mvs,mv_cnt)>=0) { - MoveDo(state,piece_num,x,y,TRUE); - return TRUE; - } else - return FALSE; -} - -I64 ChkPieceMoves(GameState *state,I64 piece_num,Move *src,I64 mv_cnt) -{ //Goes through moves lst for one piece, eliminating invalid moves. - I64 k,cnt=mv_cnt,result=0,x,y,dy; - GameState state2,*tempg; - Move *dst=src; - - if (state->cur_player) //Find King - k=16; - else - k=0; - while (cnt--) { - MemCpy(&state2,state,sizeof(GameState)); - MoveDo(&state2,piece_num,src->x,src->y,FALSE); - - //Don't repeat board position - tempg=cur_state.next; - while (tempg!=&cur_state) { - if (!MemCmp(tempg->pieces,state2.pieces,sizeof(PieceState)*32)) - goto cm_skip; - tempg=tempg->next; - } - - if (piece_num==k) { //If king is moving, check his new location. - x=state2.pieces[k].x; - y=state2.pieces[k].y; - dy=y-state->pieces[k].y; - if (AbsI64(dy)==2 && //castling? - (SqrInChk(&state2,x,y-dy) || SqrInChk(&state2,x,y-SignI64(dy)))) - goto cm_skip; // This really needs to go into PieceMoves - } else { - x=state->pieces[k].x; - y=state->pieces[k].y; - } - if (!SqrInChk(&state2,x,y)) { - MemCpy(dst++,src,sizeof(Move)); - result++; - } -cm_skip: - src++; - } - return result; -} - -I64 MoveCnt(GameState *state) -{ - I64 i,result=0,mv_cnt; - Move mvs[32]; - for (i=0;i<32;i++) - if (state->pieces[i].player==state->cur_player) { - mv_cnt=PieceMoves(state,i,mvs); - mv_cnt=ChkPieceMoves(state,i,mvs,mv_cnt); - result+=mv_cnt; - } - return result; -} - - -U0 DrawIt(CTask *task,CDC *dc) -{ - I64 i,x,y,z,k0,k1; - PieceState *s=cur_state.pieces; - brd_dc->flags|=DCF_NO_TRANSPARENTS; - GrBlot(dc,cx-cx2,cy-cy2,brd_dc); - - task->text_attr=YELLOW<<4; - dc->x=cx; - dc->y=cy; - - dc->flags|=DCF_TRANSFORMATION; - MemCpy(dc->r,w2s,sizeof(I64)*16); - - if (ai_thinking) { - if (cur_state.cur_player) - dc->color=BLACK; - else - dc->color=WHITE; - if (Blink) - GrPutS(dc,-11*FONT_WIDTH/2,2*FONT_HEIGHT-cy,"Thinking..."); - } - - dc->color=RED; - for (i=0;icolor=LTRED; - dc->pen_width=2; - GrLineRect4(dc,(cursor_x-4)*g+2,(cursor_y-4)*g+2,(cursor_x-3)*g-1,(cursor_y-3)*g-1); - - DCAllocDepthBuf(dc); - k0=k1=0; - for (i=0;i<32;i++,s++) { - if (s->player>=0) { //Alive? - if (s->x!=last_mv.x || s->y!=last_mv.y || Blink) { - x=g/2+(s->x-4)*g; - y=g/2+(s->y-4)*g; - z=0; - GrTransform(dc,&x,&y,&z); - z=GR_Z_ALL+s->x-s->y; - - dc->flags&=~DCF_TRANSFORMATION; - SpritePlot3(dc,x,y,z,imgs[s->type*2+s->player]); - dc->flags|=DCF_TRANSFORMATION; - } - } else { //Dead - if (s->player==-2) { - if (k1<8) { - x=cx+100+k1++*g/2; - y=cy-180; - } else { - x=cx+100+(k1++-8)*g/2; - y=cy-130; - } - z=0; - } else { - if (k0<8) { - x=cx+100+k0++*g/2; - y=cy+220; - } else { - x=cx+100+(k0++-8)*g/2; - y=cy+170; - } - z=0; - } - dc->flags&=~DCF_TRANSFORMATION; - SpritePlot3(dc,x,y,z,imgs[s->type*2+s->player+2]); - dc->flags|=DCF_TRANSFORMATION; - } - } - if (game_over && Blink) { - dc->color=LTRED; - GrPutS3(dc,-9*FONT_WIDTH/2,-FONT_HEIGHT/2,0,"Game Over"); - } -} - -#define DEPTH -5 - -CDC *BrdNew() -{ - I64 i,j,k,w=Fs->win_pixel_width,h=Fs->win_pixel_height; - CDC *dc; - - g=42; - cx=w/2+40; - cy=h/2; - - w=Sqrt(2.0)*(8*g+2*FONT_WIDTH); - h=8*g+2*FONT_HEIGHT; - cx2=w/2; - cy2=h/2; - - dc=DCNew(DCT_COLOR8,w,h); - dc->x=cx2; - dc->y=cy2; - - dc->flags|=DCF_TRANSFORMATION; - MemCpy(dc->r,w2s,sizeof(I64)*16); - - dc->color=YELLOW; - GrRect(dc,0,0,w,h); - - dc->color=BLACK; - for (i=-4;i<4;i++) { - GrPrintF3(dc,-4*g-4-FONT_WIDTH,i*g+g/2-4,0,"%C",i+4+'A'); - GrPrintF3(dc,4*g+14,i*g+g/2-4,0,"%C",i+4+'A'); - GrPrintF3(dc,i*g+g/2+6,-4*g-12-FONT_HEIGHT,0,"%C",i+4+'1'); - GrPrintF3(dc,i*g+g/2-2,4*g+9,0,"%C",i+4+'1'); - } - - dc->pen_width=1; - dc->color=BLACK; - for (i=-4;i<=4;i++) { - GrLine3(dc,-4*g,i*g,0,4*g,i*g,0); - GrLine3(dc,i*g,-4*g,0,i*g,4*g,0); - GrLine3(dc,-4*g,i*g,0,-4*g,i*g,DEPTH); - GrLine3(dc,i*g,4*g,0,i*g,4*g,DEPTH); - } - GrLine3(dc,-4*g,4*g,DEPTH,-4*g,-4*g,DEPTH); - GrLine3(dc,-4*g,4*g,DEPTH,4*g,4*g,DEPTH); - - k=0; - for (j=-4;j<4;j++) { - for (i=-4;i<4;i++) { - if ((i+j)&1) - dc->color=WHITE; - else - dc->color=DKGRAY; - GrFloodFill3(dc,i*g+g/2,j*g+g/2,0); - } - if (j&1) - dc->color=DKGRAY; - else - dc->color=WHITE; - GrFloodFill3(dc,-4*g,j*g+g/2,DEPTH/2); - if (j&1) - dc->color=WHITE; - else - dc->color=DKGRAY; - GrFloodFill3(dc,j*g+g/2,4*g,DEPTH/2); - } - - return dc; -} - -I64 AIStateScore(GameState *state,I64 player) -{ - if (player) - return -state->raw_score; - else - return state->raw_score; -} - -I64 move_depth,kill_depth; - -I64 AIMove2(GameState *state,I64 depth) -{ - I64 i,possible_moves=0,best_piece,score,best_score=MIN_I64,mv_cnt,score_adjust; - Move best_mv,mvs[32],*ptr; - GameState state2; - Bool first=TRUE; - - if (UnusedStk<0x1000) { //Shouldn't happen - DocPutS(chess_doc,"StkOverflow\n"); - return AIStateScore(state,state->cur_player); - } - - for (i=0;i<32;i++) - if (state->pieces[i].player==state->cur_player) { - mv_cnt=PieceMoves(state,i,mvs); - possible_moves+=mv_cnt; - ptr=mvs; - while (mv_cnt--) { - MemCpy(&state2,state,sizeof(GameState)); - state2.parent=state; - if (MoveDo(&state2,i,ptr->x,ptr->y,FALSE)&&depthcur_player); - if (score_adjust=AbsI64(state2.raw_score-state->raw_score)) - score+=score_adjust-piece_scores[state->pieces[i].type]; - } - if (first || score>best_score) { - best_score=score; - best_piece=i; - MemCpy(&best_mv,ptr,sizeof(Move)); - first=FALSE; - } - ptr++; - } - } - if (!first) - MoveDo(state,best_piece,best_mv.x,best_mv.y,FALSE); - return best_score+possible_moves<mv; - Bool old_preempt=Preempt(ON); - MemCpy(&state2,cj->state,sizeof(GameState)); - state2.parent=cj->state; - MoveDo(&state2,ptr->piece,ptr->x,ptr->y,FALSE); - ptr->score=-AIMove2(&state2,1); - Free(cj); - Preempt(old_preempt); -} - -I64 MoveCmp(Move *e1,Move *e2) -{ - if (e1->scorescore) - return 1; - else if (e1->score==e2->score) - return 0; - else - return -1; -} - -U0 AIMove(GameState *state) -{ - I64 i,cnt=0,mv_cnt,best_score; - Move mvs[32],*ptr,*ptr2; - ChessJob *cj; - - if (cnt=MoveCnt(state)) { - //Collect AI possible valid moves - ptr=ptr2=MAlloc(cnt*sizeof(Move)); - for (i=0;i<32;i++) - if (state->pieces[i].player==state->cur_player) { - mv_cnt=PieceMoves(state,i,mvs); - mv_cnt=ChkPieceMoves(state,i,mvs,mv_cnt); - MemCpy(ptr,mvs,mv_cnt*sizeof(Move)); - ptr+=mv_cnt; - } - - //Dispatch to MP scoring all moves - for (i=0,ptr=ptr2;iscore=-MAX_I32; - cj=MAlloc(sizeof(ChessJob)); - cj->state=state; - cj->mv=ptr; - if (i%mp_cnt==mp_cnt-1) - AIMove1(cj); - else - MPJob(&AIMove1,cj,1+i%(mp_cnt-1)); - } - - //Wait for finish - for (i=0,ptr=ptr2;iscore==-MAX_I32) - Yield; - QSort(ptr2,cnt,sizeof(Move),&MoveCmp); - - //Cnt ties for first - best_score=ptr2->score; - mv_cnt=0; - ptr=ptr2; - while (mv_cntscore==best_score) { - mv_cnt++; - ptr++; - } - - ptr=ptr2+RandU16%mv_cnt; - MoveDo(state,ptr->piece,ptr->x,ptr->y,TRUE); - Free(ptr2); - } -} - -U0 Init() -{ - chess_doc=DocCur; - DocClear; - "$$FD,BLACK$$$$BD,YELLOW$$"; - game_over=FALSE; - ai_thinking=FALSE; - move_depth=3; - kill_depth=5; - cur_mv_cnt=0; - last_mv.x=-1; - last_mv.y=-1; - MemCpy(&cur_state,&setup_state,sizeof(cur_state)); - QueInit(&cur_state); - cur_state.is_human[0]=PopUpNoYes("$$FG,BLACK$$WHITE is human?"); - cur_state.is_human[1]=PopUpNoYes("$$FG,BLACK$$BLACK is human?"); - - GameSnapShot; -} - -U0 CleanUp() -{ - QueDel(&cur_state,TRUE); -} - -U0 SetMouseCursor() -{ - I64 x=(cursor_x-4)*g+g/2, - y=(cursor_y-4)*g+g/2, - z=0; - GrRot(w2s,&x,&y,&z); - x+=cx+Fs->win_pixel_left+Fs->win_scroll_x; - y+=cy+Fs->win_pixel_top +Fs->win_scroll_y; - if (ipx!=x || ipy!=y) - SetIP(x,y); -} - -U0 SetKbdCursor(I64 x,I64 y) -{ - I64 z; - x-=cx; - y-=cy; - z=y; - GrRot(s2w,&x,&y,&z); - cursor_x=LimitI64((x+4*g)/g,0,7); - cursor_y=LimitI64((y+4*g)/g,0,7); -} - -U0 Chess() -{ - I64 p1,p2,cur_piece; - - SettingsPush; //See $LK,"SettingsPush","MN:SettingsPush"$ - WinMax; - WinBorder; - Preempt(OFF); - Init; - WordStat; - - MenuPush( - "File {" - " Abort(,CH_SHIFT_ESC);" - " Exit(,CH_ESC);" - "}" - "Play {" - " Move(,CH_SPACE);" - " Restart(,'\n');" - "}"); - - - Fs->win_inhibit=WIF_ALL-WIF_BORDER-WIF_MENU; - - cursor_x=cursor_y=3; - - w2s=GrIdent; //World-to-Screen - GrRotZEqu(w2s,-ã/4); - GrRotXEqu(w2s,ã/4); - - s2w=GrIdent; //Screen-to-World - GrRotXEqu(s2w,-ã/4); - GrRotZEqu(s2w,ã/4); - - brd_dc=BrdNew; - - SetMouseCursor; - Fs->draw_it=&DrawIt; - - try { - while (TRUE) { - switch (ScanMsg(&p1,&p2,1<=0) { - cur_mv_cnt=PieceMoves(&cur_state,cur_piece,cur_mvs); - cur_mv_cnt=ChkPieceMoves(&cur_state,cur_piece,cur_mvs,cur_mv_cnt); - } else - cur_mv_cnt=0; - } - break; - case MSG_IP_L_UP: - SetKbdCursor(p1,p2); -ch_mv_end: - if (!game_over && cur_state.is_human[cur_state.cur_player]) { - if (cur_piece>=0 && - HumanMove(&cur_state,cur_piece,cur_mvs,cur_mv_cnt, - cursor_x,cursor_y)) { - Beep(250); - cur_piece=-1; - cur_mv_cnt=0; - } else { - cur_piece=-1; - cur_mv_cnt=0; - } - } - break; - case MSG_KEY_UP: - if (p1==CH_SPACE) - goto ch_mv_end; - break; - case MSG_KEY_DOWN: - switch (p1) { - case '\n': - CleanUp; - Init; - break; - case CH_ESC: - case CH_SHIFT_ESC: - goto ch_done; - case CH_SPACE: - goto ch_mv_start; - case 0: - switch (p2.u8[0]) { - case SC_CURSOR_RIGHT: - cursor_y=LimitI64(cursor_y+1,0,7); - SetMouseCursor; - break; - case SC_CURSOR_LEFT: - cursor_y=LimitI64(cursor_y-1,0,7); - SetMouseCursor; - break; - case SC_CURSOR_DOWN: - cursor_x=LimitI64(cursor_x-1,0,7); - SetMouseCursor; - break; - case SC_CURSOR_UP: - cursor_x=LimitI64(cursor_x+1,0,7); - SetMouseCursor; - break; - } - } - break; - } - } -ch_done: - } catch - CatchAll; - DocClear; - SettingsPop; - MenuPop; - DCDel(brd_dc); - Free(s2w); - Free(w2s); - CleanUp; -} - -Chess; -R úÿÿÿðÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿòúÿÿÿæÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ"!úÿÿÿâÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ2"øÿÿÿâÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ -òúÿÿÿæÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ 2"øÿÿÿâÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ’úÿÿÿìÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÂúÿÿÿêÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿR úÿÿÿðÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ’úÿÿÿëÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ "!øÿÿÿãÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ Òøÿÿÿêÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ \ No newline at end of file diff --git a/TempleOS/Demo/GameStarters/MissileDefense.CPP b/TempleOS/Demo/GameStarters/MissileDefense.CPP deleted file mode 100644 index 3ea162a9bc00936996f7f0d8b3a20b5bda3415d4..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 11136 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 w4xt|*1Yv",1$ - - -$SP,"",2$ - - - -$SP,"",3$ - - -$SP,"",4$ - - - -$SP,"",5$ - - -$SP,"",6$ - - -$SP,"",7$ - - -$SP,"",8$ - - - -$SP,"",9$ - - -$SP,"",10$ - - - - -$SP,"",11$ - - -$SP,"",12$ - - -$SP,"",13$ - - - - -$SP,"",14$ - - -$BG$ - - -#define CMD_NULL 0 -#define CMD_SPIN_LEFT 1 -#define CMD_SPIN_RIGHT 2 -#define CMD_THRUST 3 -#define CMD_FIRE 4 -#define CMD_GAME_OVER 5 -I64 cmd_code=CMD_NULL; - -#define NUM_STARS 100 -I64 stars_x[NUM_STARS],stars_y[NUM_STARS]; - -Bool bounce; - -#define OT_SHIP 1 -#define OT_CARGO 2 -#define OT_BULLET 3 -#define OT_TINY_ROCK 4 -#define OT_SMALL_ROCK 5 -#define OT_MEDIUM_ROCK 6 -#define OT_LARGE_ROCK 7 - -#define A_TRANSITION -1 -#define A_INACTIVE 0 -#define A_ACTIVE 1 - -class Order2D2é -{ - F64 x,y,é; - F64 DxDt,DyDt,DéDt; -}; - -class Obj -{ - I32 active; - I32 type; - U8 *img; - F64 mass,radius; - F64 timeout; -}; - -#define NUM_OBJECTS 256 - -CMathODE *ode; -Order2D2é *o_state; -Obj *objs; - -U0 ObjInit(I64 i, I64 type) -{ - objs[i].active=A_ACTIVE; - objs[i].timeout=0; - objs[i].type=type; - switch (type) { - case OT_SHIP: - if (bounce) - objs[i].img=$IB,"",1$; - else - objs[i].img=$IB,"",3$; - objs[i].radius=15; - break; - case OT_CARGO: - objs[i].img=$IB,"",14$; - objs[i].radius=30; - break; - case OT_BULLET: - objs[i].img=$IB,"",15$; - objs[i].radius=7; - break; - case OT_TINY_ROCK: - if (i&1) - objs[i].img=$IB,"",5$; - else - objs[i].img=$IB,"",6$; - objs[i].radius=5; - break; - case OT_SMALL_ROCK: - if (i&1) - objs[i].img=$IB,"",16$; - else - objs[i].img=$IB,"",8$; - objs[i].radius=11; - break; - case OT_MEDIUM_ROCK: - if (i&1) - objs[i].img=$IB,"",17$; - else - objs[i].img=$IB,"",10$; - objs[i].radius=20; - break; - case OT_LARGE_ROCK: - if (i&1) - objs[i].img=$IB,"",18$; - else - objs[i].img=$IB,"",12$; - objs[i].radius=26; - break; - } - objs[i].mass=objs[i].radius*objs[i].radius*objs[i].radius; -} - -I64 ObjAlloc(I64 type) -{ - I64 i; - for (i=0;itext_attr=BLACK<<4+WHITE; - - dc->color=WHITE; - for (i=0;iGR_WIDTH) { - x%=GR_WIDTH; - o_state[i].x=x; - } - if (y<0) { - y=GR_HEIGHT-AbsI64(y)%GR_HEIGHT; - o_state[i].y=y; - } else if (y>GR_HEIGHT) { - y%=GR_HEIGHT; - o_state[i].y=y; - } - switch (objs[i].type) { - case OT_SHIP: - if (bounce) { - if (cmd_code==CMD_THRUST && RandU16&0x8000) - SpritePlotRotZ3b(dc,x,y,0,$IB,"",2$,o_state[i].é); - else - SpritePlotRotZ3b(dc,x,y,0,$IB,"",1$,o_state[i].é); - } else { - if (cmd_code==CMD_THRUST && RandU16&0x8000) - SpritePlotRotZ3b(dc,x,y,0,$IB,"",4$,o_state[i].é); - else - SpritePlotRotZ3b(dc,x,y,0,$IB,"",3$,o_state[i].é); - } - break; - case OT_BULLET: - case OT_TINY_ROCK: - case OT_SMALL_ROCK: - case OT_MEDIUM_ROCK: - case OT_LARGE_ROCK: - case OT_CARGO: - SpritePlotRotZ3b(dc,x,y,0,objs[i].img,o_state[i].é); - break; - } - } - } - } - dc->color=WHITE; - GrPutS(dc,0,0,"Escort the cargo ship."); -} - -U0 Init() -{ - I64 i,j; - - cmd_code=CMD_NULL; - - for (i=0;i1000000.0) f=1000000.0; - } - } else - f=-2.5*objs[i].mass*objs[j].mass/(dd+1.0); - - DstateDt[i].DxDt+=f*dx/objs[i].mass; - DstateDt[i].DyDt+=f*dy/objs[i].mass; - } - } - } - } - switch (cmd_code) { - case CMD_SPIN_LEFT: - DstateDt[0].DéDt-=10.0; - break; - case CMD_SPIN_RIGHT: - DstateDt[0].DéDt+=10.0; - break; - case CMD_THRUST: - DstateDt[0].DxDt+=100.0*Cos(state[0].é-ã/2.0); - DstateDt[0].DyDt+=100.0*Sin(state[0].é-ã/2.0); - break; - } - - DstateDt[1].DxDt+=2.0*Cos(state[1].é-ã/2.0); - DstateDt[1].DyDt+=2.0*Sin(state[1].é-ã/2.0); -} - -U0 Collision(I64 i,I64 j) -{ - I64 i2; - switch (objs[i].type) { - case OT_SHIP: - if (!bounce) { - cmd_code=CMD_GAME_OVER; - objs[i].active=A_INACTIVE; - } - break; - case OT_CARGO: - cmd_code=CMD_GAME_OVER; - objs[i].active=A_INACTIVE; - break; - case OT_TINY_ROCK: - if (objs[j].type==OT_BULLET && !bounce) - objs[i].active=A_INACTIVE; - break; - case OT_BULLET: - if (!bounce) - objs[i].active=A_INACTIVE; - break; - case OT_SMALL_ROCK: - case OT_MEDIUM_ROCK: - i2=ObjAlloc(objs[i].type-1); - objs[i2].active=A_TRANSITION; - o_state[i2].x=o_state[i].x+objs[i2].radius+2.0; - o_state[i2].y=o_state[i].y; - o_state[i2].é=o_state[i].é; - o_state[i2].DxDt=o_state[i].DxDt; - o_state[i2].DyDt=o_state[i].DyDt; - o_state[i2].DéDt=o_state[i].DéDt; - - i2=ObjAlloc(objs[i].type-1); - objs[i2].active=A_TRANSITION; - o_state[i2].x=o_state[i].x-objs[i2].radius-2.0; - o_state[i2].y=o_state[i].y; - o_state[i2].é=o_state[i].é; - o_state[i2].DxDt=o_state[i].DxDt; - o_state[i2].DyDt=o_state[i].DyDt; - o_state[i2].DéDt=o_state[i].DéDt; - - objs[i].active=A_INACTIVE; - break; - case OT_LARGE_ROCK: - i2=ObjAlloc(objs[i].type-1); - objs[i2].active=A_TRANSITION; - o_state[i2].x=o_state[i].x+objs[i2].radius+4.0; - o_state[i2].y=o_state[i].y+objs[i2].radius+4.0; - o_state[i2].é=o_state[i].é; - o_state[i2].DxDt=o_state[i].DxDt; - o_state[i2].DyDt=o_state[i].DyDt; - o_state[i2].DéDt=o_state[i].DéDt; - - i2=ObjAlloc(objs[i].type-1); - objs[i2].active=A_TRANSITION; - o_state[i2].x=o_state[i].x-objs[i2].radius-4.0; - o_state[i2].y=o_state[i].y-objs[i2].radius-4.0; - o_state[i2].é=o_state[i].é; - o_state[i2].DxDt=o_state[i].DxDt; - o_state[i2].DyDt=o_state[i].DyDt; - o_state[i2].DéDt=o_state[i].DéDt; - - i2=ObjAlloc(objs[i].type-1); - objs[i2].active=A_TRANSITION; - o_state[i2].x=o_state[i].x-objs[i2].radius-4.0; - o_state[i2].y=o_state[i].y+objs[i2].radius+4.0; - o_state[i2].é=o_state[i].é; - o_state[i2].DxDt=o_state[i].DxDt; - o_state[i2].DyDt=o_state[i].DyDt; - o_state[i2].DéDt=o_state[i].DéDt; - - i2=ObjAlloc(objs[i].type-1); - objs[i2].active=A_TRANSITION; - o_state[i2].x=o_state[i].x+objs[i2].radius+4.0; - o_state[i2].y=o_state[i].y-objs[i2].radius-4.0; - o_state[i2].é=o_state[i].é; - o_state[i2].DxDt=o_state[i].DxDt; - o_state[i2].DyDt=o_state[i].DyDt; - o_state[i2].DéDt=o_state[i].DéDt; - - objs[i].active=A_INACTIVE; - break; - } - - switch (objs[j].type) { - case OT_SHIP: - if (!bounce) { - cmd_code=CMD_GAME_OVER; - objs[j].active=A_INACTIVE; - } - break; - case OT_CARGO: - cmd_code=CMD_GAME_OVER; - objs[j].active=A_INACTIVE; - break; - case OT_TINY_ROCK: - if (objs[i].type==OT_BULLET && !bounce) - objs[j].active=A_INACTIVE; - break; - case OT_BULLET: - if (!bounce) - objs[j].active=A_INACTIVE; - break; - case OT_SMALL_ROCK: - case OT_MEDIUM_ROCK: - i2=ObjAlloc(objs[j].type-1); - objs[i2].active=A_TRANSITION; - o_state[i2].x=o_state[j].x+objs[i2].radius+2.0; - o_state[i2].y=o_state[j].y; - o_state[i2].é=o_state[j].é; - o_state[i2].DxDt=o_state[j].DxDt; - o_state[i2].DyDt=o_state[j].DyDt; - o_state[i2].DéDt=o_state[j].DéDt; - - i2=ObjAlloc(objs[j].type-1); - objs[i2].active=A_TRANSITION; - o_state[i2].x=o_state[j].x-objs[i2].radius-2.0; - o_state[i2].y=o_state[j].y; - o_state[i2].é=o_state[j].é; - o_state[i2].DxDt=o_state[j].DxDt; - o_state[i2].DyDt=o_state[j].DyDt; - o_state[i2].DéDt=o_state[j].DéDt; - - objs[j].active=A_INACTIVE; - break; - - case OT_LARGE_ROCK: - i2=ObjAlloc(objs[j].type-1); - objs[i2].active=A_TRANSITION; - o_state[i2].x=o_state[j].x+objs[i2].radius+4.0; - o_state[i2].y=o_state[j].y+objs[i2].radius+4.0; - o_state[i2].é=o_state[j].é; - o_state[i2].DxDt=o_state[j].DxDt; - o_state[i2].DyDt=o_state[j].DyDt; - o_state[i2].DéDt=o_state[j].DéDt; - - i2=ObjAlloc(objs[j].type-1); - objs[i2].active=A_TRANSITION; - o_state[i2].x=o_state[j].x-objs[i2].radius-4.0; - o_state[i2].y=o_state[j].y-objs[i2].radius-4.0; - o_state[i2].é=o_state[j].é; - o_state[i2].DxDt=o_state[j].DxDt; - o_state[i2].DyDt=o_state[j].DyDt; - o_state[i2].DéDt=o_state[j].DéDt; - - i2=ObjAlloc(objs[j].type-1); - objs[i2].active=A_TRANSITION; - o_state[i2].x=o_state[j].x-objs[i2].radius-4.0; - o_state[i2].y=o_state[j].y+objs[i2].radius+4.0; - o_state[i2].é=o_state[j].é; - o_state[i2].DxDt=o_state[j].DxDt; - o_state[i2].DyDt=o_state[j].DyDt; - o_state[i2].DéDt=o_state[j].DéDt; - - i2=ObjAlloc(objs[j].type-1); - objs[i2].active=A_TRANSITION; - o_state[i2].x=o_state[j].x+objs[i2].radius+4.0; - o_state[i2].y=o_state[j].y-objs[i2].radius-4.0; - o_state[i2].é=o_state[j].é; - o_state[i2].DxDt=o_state[j].DxDt; - o_state[i2].DyDt=o_state[j].DyDt; - o_state[i2].DéDt=o_state[j].DéDt; - - objs[j].active=A_INACTIVE; - break; - } -} - -U0 CheckCollisions() -{ - I64 i,j; - F64 d,d1,dd,dx,dy; - CDC *dc; - for (i=0;icolor=ROP_COLLISION; - dc->bkcolor=BLACK; - SpritePlotRotZ3b(dc,o_state[j].x-o_state[i].x+32, - o_state[j].y-o_state[i].y+32,0, - objs[j].img,o_state[j].é); - if (dc->collision_cnt>0) - Collision(i,j); - DCDel(dc); - } - } - } - } - } - for (i=0;iMUZZLE_VELOCITY*5.0) - Auto(" "); - } -} - -U0 SongTask(I64) -{ //Song by Terry A. Davis - Fs->task_end_cb=&SndTaskEndCB; - MusicSettingsRst; - while (TRUE) { - Play("W13eGGsGGeGGGe.GeCDsEDeCBAe.AeG"); - Play("GsGGeGGGe.GeFEsDEeDCBe.AeFD"); - Play("EDFDEDECDCECDCsGGeG"); - Play("GG2hG3sGGeGGG2hG"); - } -} - -U0 Rocks() -{ - I64 ch,sc,msg_code; - CMenuEntry *tempse; - - PopUpOk( - "I refuse to rip-off the original\n" - "so this is intentionally unplayable\n" - "and included for demonstration\n" - "purposes.\n\n" - "Write games, don't play them.\n"); - - SettingsPush; //See $LK,"SettingsPush","MN:SettingsPush"$ - Fs->song_task=Spawn(&SongTask,NULL,"Song",Fs); - Preempt(OFF), - WinBorder; - WordStat; - - MenuPush( -"File {" -" Abort(,CH_SHIFT_ESC);" -" Exit(,CH_ESC);" -"}" -"Play {" -" Restart(,'\n');" -" Fire(,CH_SPACE);" -" Fwd(,,SC_CURSOR_UP);" -" Left(,,SC_CURSOR_LEFT);" -" Right(,,SC_CURSOR_RIGHT);" -" ToggleBounce(,'b');" -"}" -); - tempse=MenuEntryFind(Fs->cur_menu,"Play/ToggleBounce"); - tempse->checked=bounce=TRUE; - - ode=ODENew(NUM_OBJECTS*6,0.01); - ode->derivative=&MyDerivative; - ode->min_tolerance=0.001*ode->max_tolerance; - o_state=ode->state; - objs=MAlloc(NUM_OBJECTS*sizeof(Obj)); - - WinMax; - - Init; - QueIns(ode,Fs->last_ode); - DocCursor; - DocClear; - Fs->draw_it=&DrawIt; - - try { - while (TRUE) { - while (msg_code=ScanMsg(&ch,&sc,1<cur_menu,"Play/ToggleBounce"); - tempse->checked=bounce=!bounce; - break; - } - else //MSG_KEY_UP - cmd_code=CMD_NULL; - } - CheckCollisions; - CheckCrazy; - if (cmd_code==CMD_GAME_OVER) { - Sleep(1000); - Init; - } - WinMgrSync; //msgs are only qued by winmngr - } -rk_done: - GetMsg(,,1<H&BYaJpb!AIB_y#p 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 yJzv; zn#TKcy4LrcDD*ma?ah)$IgKyZoV(L=_UX%W@Bb`*v!>-U&pFww^ZXs>pW2-HSTpyp z&w1@#=eaa4{F7New}HL)!ljyXv8OID=Pu-`Z4kVB;rgEo!C4oDdKZZ3Hb~cAJi&9} z4aX(Lxl80^8&uC;{M>oz_wq|>vFDY0=jhKp|Mcdi2#?F!Z|9oxF0ovD`TWVtpPpYf z@V#Kfd%#)tgzMak7F}2D=k`1D*8BQi5zf7`K;vrg-HV~JbHd+Vxx{f*d)n~8QzP(=0d!teJMk6l( DC&Z26 diff --git a/TempleOS/Demo/GameStarters/Wenceslas.CPP b/TempleOS/Demo/GameStarters/Wenceslas.CPP deleted file mode 100644 index 2c2c212..0000000 --- a/TempleOS/Demo/GameStarters/Wenceslas.CPP +++ /dev/null @@ -1,540 +0,0 @@ -AcctRegSetDftEntry("TempleOS/Wenceslas","F64 best_score=9999;\n"); -AcctRegExecuteBranch("TempleOS/Wenceslas"); - -#define BORDER 5 -#define KING_STEP 4 - - - - $SP,"<1>",1$ - - - - - $SP,"<2>",2$ - - - - - - - - - - - - $SP,"<3>",3$ - - - - - $SP,"<4>",4$ - - - - - - - - $SP,"<5>",5$ - - - - - - - - - - - - - - - - - - - - - $SP,"<6>",6$ - - - - - - - - - - $SP,"<7>",7$ - - - -#define NUM_FLAKES 0x8000 -class Flake -{ - U16 x,y; -} flakes[NUM_FLAKES]; - -#define NUM_TREES 8 -class Tree -{ - U16 x,y; - I64 fire_frame_index; -} trees[NUM_TREES]; - -I64 snow_x,snow_y; -I64 king_x,king_y,not_stopped_cnt; -F64 king_é,t0,tf,door_open_t0; - -#define NUM_PEASANTS 16 -class Peasant -{ - Peasant *next,*last; - F64 x,y,é,door_opened_t0; - Bool stopped; -} peasant_root; - -class Step -{ - Step *next,*last; - U16 x,y; - F64 t0; -} step_root,king_step_root; - -U0 DrawIt(CTask *task,CDC *dc) -{ - I64 r[16],i,w=task->win_pixel_width,h=task->win_pixel_height; - U8 *img; - Step *temps; - Peasant *tempp; - F64 tt; - Bool old_preempt=Preempt(OFF); - - dc->pen_width=1; - for (i=0;i",4$; - else - img=$IB,"<5>",5$; - } else - img=$IB,"<3>",3$; - SpritePlot3(dc,trees[i].x,trees[i].y,0,img); - } - } - - SpritePlot3(dc,w/2,h/2,0,$IB,"<6>",6$); - if (tT",7$); - - for (i=0;ih/2) { //Draw trees in front of house - if (trees[i].fire_frame_index) { - if (trees[i].fire_frame_index++&1) - img=$IB,"<4>",4$; - else - img=$IB,"<5>",5$; - } else - img=$IB,"<3>",3$; - SpritePlot3(dc,trees[i].x,trees[i].y,0,img); - } - } - - temps=step_root.next; - while (temps!=&step_root) { - if (tT-temps->t0<2.0) - dc->color=DKGRAY; - else - dc->color=LTGRAY; - dc->pen_width=2; - GrPlot3(dc,temps->x,temps->y,0); - temps=temps->next; - } - - dc->pen_width=1; - tempp=peasant_root.next; - while (tempp!=&peasant_root) { - GrIdentEqu(r); - GrRotYEqu(r,tempp->é+ã/2); - GrRotXEqu(r,ã/6); - if (tempp->stopped) - dc->color=LTCYAN; - else - dc->color=CYAN; - SpritePlotRotMat3b(dc,tempp->x,tempp->y,0,$IB,"<2>",2$,r); - tempp=tempp->next; - } - - dc->pen_width=1; - GrIdentEqu(r); - GrRotYEqu(r,king_é+ã/2); - GrRotXEqu(r,ã/6); - SpritePlotRotMat3b(dc,king_x,king_y,0,$IB,"<1>",1$,r); - - dc->pen_width=1; - dc->color=WHITE; - for (i=0;iwin_pixel_width, - (flakes[i].y+snow_y)%task->win_pixel_height); - - if (tf) { - dc->color=LTRED; - if (Blink) - GrPutS(dc,w/2-(FONT_WIDTH*14)/2,h/2+FONT_HEIGHT,"Game Completed"); - tt=tf; - } else { - tt=tT; - } - dc->color=LTBLUE; - GrPrintF(dc,0,0,"Freezing Peasants:%d Time:%3.2f Best:%3.2f", - not_stopped_cnt,tt-t0,best_score); - - Preempt(old_preempt); -} - -U0 StepNew(CTask *task,I64 x,I64 y,F64 é,Bool king) -{ - Step *temps; - - if (king) { - temps=MAlloc(sizeof(Step),task); - temps->x=x; - temps->y=y; - temps->t0=tT; - QueIns(temps,king_step_root.last); - } - - temps=MAlloc(sizeof(Step),task); - temps->x=x-3.5*Sin(é)+1.0*Cos(é); - temps->y=y+3.5*Cos(é)+1.0*Sin(é); - temps->t0=tT; - QueIns(temps,step_root.last); - - temps=MAlloc(sizeof(Step),task); - temps->x=x+3.5*Sin(é)-1.0*Cos(é); - temps->y=y-3.5*Cos(é)-1.0*Sin(é); - temps->t0=tT; - QueIns(temps,step_root.last); -} - -U0 Init() -{ - I64 i,min_x,max_x,min_y,max_y, - w=Fs->win_pixel_width,h=Fs->win_pixel_height; - Peasant *tempp; - snow_x=0; - snow_y=0; - for (i=0;i",3$,&min_x,&max_x,&min_y,&max_y); - for (i=0;i",1$,&min_x,&max_x,&min_y,&max_y); - QueInit(&peasant_root); - for (i=0;ix=RandU16%(w-2*BORDER-(max_x-min_x+1))+BORDER-min_x; - tempp->y=RandU16%(h-2*BORDER-(max_y-min_y+1))+BORDER-min_y; - tempp->é=ã*2*Rand; - tempp->door_opened_t0=0; - tempp->stopped=FALSE; - QueIns(tempp,peasant_root.last); - } - - king_x=w/2; - king_y=h/2; - king_é=-ã/2; - door_open_t0=0; - t0=tT; - tf=0; -} - -U0 CleanUp() -{ - QueDel(&peasant_root,TRUE); - QueDel(&step_root,TRUE); - QueDel(&king_step_root,TRUE); -} - -U0 Follow(CTask *,Peasant *tempp) -{ - Step *temps=king_step_root.next; - F64 d,best_d=MAX_F64; - while (temps!=&king_step_root) { - if ((d=Sqr(temps->x-tempp->x)+Sqr(temps->y-tempp->y)) && - d<15*15) { - d+=1000*Sqr(tT-temps->t0); - if (dé=Arg(temps->x-tempp->x,temps->y-tempp->y); - } - } - temps=temps->next; - } -} - -U0 AnimateTask(I64) -{//preempt off by default after Spawned - Step *temps,*temps1; - Peasant *tempp; - I64 i,animate_cnt=0,w,h; - while (TRUE) { - w=Fs->parent_task->win_pixel_width; - h=Fs->parent_task->win_pixel_height; - - temps=step_root.next; - while (temps!=&step_root) { - temps1=temps->next; - if (tT-temps->t0>4.0) { - QueRem(temps); - Free(temps); - } - temps=temps1; - } - - temps=king_step_root.next; - while (temps!=&king_step_root) { - temps1=temps->next; - if (tT-temps->t0>4.0) { - QueRem(temps); - Free(temps); - } - temps=temps1; - } - - not_stopped_cnt=0; - tempp=peasant_root.next; - while (tempp!=&peasant_root) { - if (tempp->stopped) { - if (tempp->door_opened_t0 && tT>tempp->door_opened_t0+1.0) { - tempp->door_opened_t0=0; - tempp->y=tempp->x=-9999; - } - } else { - if (Sqr(tempp->x-w/2)+Sqr(tempp->y-h/2)<20*20) { - tempp->stopped=TRUE; - tempp->door_opened_t0=door_open_t0=tT; - } - for (i=0;ix-trees[i].x)+Sqr(tempp->y-trees[i].y)<20*20) { - tempp->stopped=TRUE; - break; - } - if (!tempp->stopped) { - Follow(Fs->parent_task,tempp); - tempp->x+=Cos(tempp->é)/100; - tempp->y+=Sin(tempp->é)/100; - if (!(BORDER/2<=tempp->xyé+=ã; - tempp->x+=3*Cos(tempp->é)/100; - tempp->y+=3*Sin(tempp->é)/100; - } - if (!(animate_cnt&511)) - StepNew(Fs->parent_task,tempp->x,tempp->y,tempp->é,FALSE); - not_stopped_cnt++; - } - } - tempp=tempp->next; - } - if (!not_stopped_cnt && !tf) { - tf=tT; - music_mute=TRUE; - Snd(2000);Sleep(200);Snd(0);Sleep(100); - if (tf-t0task_end_cb=&SndTaskEndCB; - MusicSettingsRst; - music_tempo= 2.480; - music_stacatto_factor= 0.902; - while (TRUE) { - Play("W13eCCCDCC2qG3eA2G3ABqCC"); - Play("eCCCDCC2qG3eA2G3ABqCC"); - Play("eGFEDEDqCeA2G3ABqCC"); - } -} - -U0 Wenceslas() -{ - I64 sc; - - MenuPush( - "File {" - " Abort(,CH_SHIFT_ESC);" - " Exit(,CH_ESC);" - "}" - "Play {" - " Restart(,'\n');" - " BurnTree(,CH_SPACE);" - " Up(,,SC_CURSOR_UP);" - " Down(,,SC_CURSOR_DOWN);" - " Left(,,SC_CURSOR_LEFT);" - " Right(,,SC_CURSOR_RIGHT);" - "}" - ); - - SettingsPush; //See $LK,"SettingsPush","MN:SettingsPush"$ - WinMax; - Preempt(OFF); - Fs->song_task=Spawn(&SongTask,NULL,"Song",Fs); - - PopUpOk(" -Good King Wenceslas looked out -On the feast of Stephen -When the snow lay round about -Deep and crisp and even -Brightly shone the moon that night -Though the frost was cruel -When a poor man came in sight -Gath'ring winter fuel - -\"Hither, page, and stand by me -If thou know'st it, telling -Yonder peasant, who is he? -Where and what his dwelling?\" -\"Sire, he lives a good league hence -Underneath the mountain -Right against the forest fence -By Saint Agnes' fountain.\" - -\"Bring me flesh and bring me wine -Bring me pine logs hither -Thou and I will see him dine -When we bear him thither.\" -Page and monarch forth they went -Forth they went together -Through the rude wind's wild lament -And the bitter weather - -"); -PopUpOk(" -\"Sire, the night is darker now -And the wind blows stronger -Fails my heart, I know not how, -I can go no longer.\" -\"Mark my footsteps, my good page -Tread thou in them boldly -Thou shalt find the winter's rage -Freeze thy blood less coldly.\" - -In his master's steps he trod -Where the snow lay dinted -Heat was in the very sod -Which the Saint had printed -Therefore, Christian men, be sure -Wealth or rank possessing -Ye who now will bless the poor -Shall yourselves find blessing - -"); -PopUpOk(" -$$FG,PURPLE$$$$TX+CX,\"Winceslas Game\"$$$$FG$$ - -Start fires by pressing $$FG,GREEN$$$$FG$$ -on trees. (Yule logs) - -Lead peasants to fires. -"); - - Init; - Fs->animate_task=Spawn(&AnimateTask,NULL,"Animate",Fs); - WordStat; - - DocCursor; - DocClear; - Fs->draw_it=&DrawIt; - try { - while (TRUE) { - switch (GetKey(&sc)) { - case '\n': - CleanUp; - Init; - break; - case CH_ESC: - case CH_SHIFT_ESC: - goto ws_done; - case CH_SPACE: - BurnTrees; - break; - case 0: - switch (sc.u8[0]) { - case SC_CURSOR_RIGHT: - if (king_x+KING_STEPwin_pixel_width-BORDER) - king_x+=KING_STEP; - king_é=0; - StepNew(Fs,king_x,king_y,king_é,TRUE); - break; - case SC_CURSOR_LEFT: - if (king_x-KING_STEP>=BORDER) - king_x-=KING_STEP; - king_é=ã; - StepNew(Fs,king_x,king_y,king_é,TRUE); - break; - case SC_CURSOR_DOWN: - if (king_y+KING_STEPwin_pixel_height-BORDER) - king_y+=KING_STEP; - king_é=-ã/2; - StepNew(Fs,king_x,king_y,king_é,TRUE); - break; - case SC_CURSOR_UP: - if (king_y-KING_STEP>=BORDER) - king_y-=KING_STEP; - king_é=ã/2; - StepNew(Fs,king_x,king_y,king_é,TRUE); - break; - } - } - } -ws_done: - } catch - CatchAll; - SettingsPop; - MenuPop; - CleanUp; - AcctRegWriteBranch("TempleOS/Wenceslas","F64 best_score=%5.4f;\n",best_score); -} - -Wenceslas; -yþÿÿÿÚÿÿÿÊÿÿÿþÿÿÿÚÿÿÿ äÿÿÿÖÿÿÿ -ÐÿÿÿúÿÿÿÖÿÿÿôÿÿÿìÿÿÿüÿÿÿØÿÿÿúÿÿÿðÿÿÿüÿÿÿðÿÿÿÖÿÿÿüÿÿÿÔÿÿÿòÿÿÿæÿÿÿÒÿÿÿöÿÿÿÂÿÿÿþÿÿÿÔÿÿÿòÿÿÿ¼ÿÿÿþÿÿÿÎÿÿÿ ¼ÿÿÿþÿÿÿÔÿÿÿÊÿÿÿþÿÿÿØÿÿÿäÿÿÿÚÿÿÿÀÿÿÿþÿÿÿÎÿÿÿ´ÿÿÿÊÿÿÿªÿÿÿ¶ÿÿÿøÿÿÿÈÿÿÿ²ÿÿÿ¬ÿÿÿÆÿÿÿ -¶ÿÿÿÌÿÿÿ ÌÿÿÿüÿÿÿÔÿÿÿèÿÿÿÚÿÿÿÖÿÿÿ* ðÿÿÿüÿÿÿðÿÿÿðÿÿÿèÿÿÿþÿÿÿòÿÿÿüÿÿÿæÿÿÿþÿÿÿæÿÿÿàÿÿÿþÿÿÿèÿÿÿüÿÿÿòÿÿÿæÿÿÿðÿÿÿþÿÿÿâÿÿÿàÿÿÿàÿÿÿÞÿÿÿÞÿÿÿâÿÿÿÞÿÿÿÞÿÿÿýÿÿÿäÿÿÿâÿÿÿþÿÿÿäÿÿÿüÿÿÿèÿÿÿüÿÿÿèÿÿÿüÿÿÿòÿÿÿäÿÿÿêÿÿÿæÿÿÿþÿÿÿîÿÿÿìÿÿÿòÿÿÿxþÿÿÿèÿÿÿüÿÿÿòÿÿÿðÿÿÿèÿÿÿðÿÿÿüÿÿÿðÿÿÿþÿÿÿòÿÿÿüÿÿÿæÿÿÿþÿÿÿæÿÿÿàÿÿÿæÿÿÿðÿÿÿãöÿÿÿðÿÿÿøÿÿÿ -ôÿÿÿðÿÿÿòÿÿÿîÿÿÿêÿÿÿ öÿÿÿæÿÿÿúÿÿÿæÿÿÿöÿÿÿèÿÿÿøÿÿÿæÿÿÿæÿÿÿøÿÿÿîÿÿÿþÿÿÿòÿÿÿ  þÿÿÿöÿÿÿôÿÿÿîÿÿÿðÿÿÿðÿÿÿþÿÿÿ üÿÿÿþÿÿÿäÿÿÿþÿÿÿäÿÿÿîÿÿÿäÿÿÿöÿÿÿöÿÿÿöÿÿÿðÿÿÿøÿÿÿüÿÿÿüÿÿÿðÿÿÿ -ðÿÿÿøÿÿÿúÿÿÿþÿÿÿúÿÿÿúÿÿÿðÿÿÿüÿÿÿúÿÿÿ -üÿÿÿüÿÿÿøÿÿÿúÿÿÿøÿÿÿúÿÿÿðÿÿÿòÿÿÿìÿÿÿôöÿÿÿðÿÿÿøÿÿÿ -ôÿÿÿðÿÿÿòÿÿÿîÿÿÿêÿÿÿ öÿÿÿæÿÿÿúÿÿÿæÿÿÿöÿÿÿèÿÿÿøÿÿÿæÿÿÿæÿÿÿøÿÿÿîÿÿÿþÿÿÿòÿÿÿ  þÿÿÿöÿÿÿôÿÿÿîÿÿÿäÿÿÿúÿÿÿâÿÿÿúÿÿÿèÿÿÿúÿÿÿöÿÿÿòÿÿÿîÿÿÿöÿÿÿúÿÿÿöÿÿÿøÿÿÿðÿÿÿöÿÿÿäÿÿÿôÿÿÿôÿÿÿüÿÿÿêÿÿÿþÿÿÿþÿÿÿüÿÿÿôÿÿÿ ôÿÿÿöÿÿÿòÿÿÿâÿÿÿþÿÿÿúÿÿÿöÿÿÿòÿÿÿüÿÿÿøÿÿÿðÿÿÿøÿÿÿ -ôÿÿÿ -üÿÿÿJ³±»ÿÿÿfÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿò/ôÿÿÿÔÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ \ No newline at end of file diff --git a/TempleOS/Demo/GameStarters/ZoneOut.CPP b/TempleOS/Demo/GameStarters/ZoneOut.CPP deleted file mode 100644 index 9e7e5a41cf124e93d4b77f2710e3ec154ab0445f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 9241 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 diff --git a/TempleOS/Demo/GameStarters/WarGame.CPP b/TempleOS/Demo/Games/BattleLines.CPP similarity index 99% rename from TempleOS/Demo/GameStarters/WarGame.CPP rename to TempleOS/Demo/Games/BattleLines.CPP index f702304821fa394bc090710201556eca6b8ec14b..ed884b119d2c7ee512159075d2aa6d9d92a28ae0 100644 GIT binary patch delta 86 zcmaFi@Wo++9_Qp`e1e;!IaB$$of1n*a#DRV^HPf^AD4)daVyrfD@m;=iBBvkDYA7B ga&`5yu`$sO_wWpHo%~-?bg_{n3$muoma_WH08z3X$p8QV delta 68 zcmez3@WNq(9;akUVsW;vT}f(1Nqk~SNs+C4kgKbojg5)*W^K+&e)jOhBKO4H)XD25 SqBd(v3bMciHoMB|GXnriDi*l_ diff --git a/TempleOS/Demo/GameStarters/BigGuns.CPP b/TempleOS/Demo/Games/BigGuns.CPP similarity index 94% rename from TempleOS/Demo/GameStarters/BigGuns.CPP rename to TempleOS/Demo/Games/BigGuns.CPP index 0fa906c6b42af0144e1ac926be9ae89ff5023a28..b90b14a09de868451fc298ebdeb8075b6676d04c 100644 GIT binary patch delta 162 zcmaE9wAgrpzh-hyVsWv8Z>4Wyaj}&%h~%o~Qc!Tp&(Bdv&d*fkpZ?N1EHc2KX-^$7NINU*$8s{y3gi1F@pJ3O`++28 delta 118 zcmZ2%{L*NG|Hi6HMn>n&Um2G$bC(vU7R9F|mL%F5ZeGsn&B*TTn^;_|pfz~|i^SyP z+*+G$*e^0NI#1^3bZ2y)9Km@DNr%B^M=nQ@WDEC7PPjpv&3Kx*Chrn!o@^)Hv-!06 G4MqT|S}B$Q diff --git a/TempleOS/Demo/GameStarters/BlackDiamond.CPP b/TempleOS/Demo/Games/BlackDiamond.CPP similarity index 100% rename from TempleOS/Demo/GameStarters/BlackDiamond.CPP rename to TempleOS/Demo/Games/BlackDiamond.CPP diff --git a/TempleOS/Demo/GameStarters/BirdLand.CPP b/TempleOS/Demo/Games/BugBird.CPP similarity index 89% rename from TempleOS/Demo/GameStarters/BirdLand.CPP rename to TempleOS/Demo/Games/BugBird.CPP index 503aaf4f47812f7309cf95d1addecb569143325e..93eddf8666eb471f7317c18d3e3b05e7588c7c26 100644 GIT binary patch delta 175 zcmdm>cSLW39BXO1Q)bab6%BExqQt!93=O4_)ZBucRR3UoC$QAUj4zy< z;W^GYxr@(z^94R1CMg94_tX;K;&cri9YY%%-(dH6Z`a89&;U*A$&!M>5G|971oh;> zW~EqjF)%SOFfcMeKq?~xn9syKxlzP=^KU_QMn>kzPegq-=L-umGBR&&6iEV6Pegqf E0R*!#rT_o{ delta 160 zcmX@2w?S`$99w2licezRL}d+`=WrpZQv0Z@s_?Sgs=5N#>eTntPM3=E765Rl5q0Om8X lPo64by_sJ~osp4!@()p;&CSAsjEwA?r-~$js2`#}i~urnE&Bif diff --git a/TempleOS/Demo/Games/BulgeBomber.CPP b/TempleOS/Demo/Games/BulgeBomber.CPP new file mode 100644 index 0000000000000000000000000000000000000000..ef85d1d2f428fa460632d64919b8a77e7f176928 GIT binary patch literal 12656 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 F006&bSNi|} literal 0 HcmV?d00001 diff --git a/TempleOS/Demo/GameStarters/FPS.CPP b/TempleOS/Demo/Games/CastleFrankenstein.CPP similarity index 84% rename from TempleOS/Demo/GameStarters/FPS.CPP rename to TempleOS/Demo/Games/CastleFrankenstein.CPP index 7f8a588..b7b067b 100644 --- a/TempleOS/Demo/GameStarters/FPS.CPP +++ b/TempleOS/Demo/Games/CastleFrankenstein.CPP @@ -1,8 +1,8 @@ //This uses $LK,"fixed-point","FI:::/TempleOS/Demo/Lectures/FixedPoint.CPP"$. -AcctRegSetDftEntry("TempleOS/FPS","F64 best_score=9999;\n"); -AcctRegExecuteBranch("TempleOS/FPS"); +AcctRegSetDftEntry("TempleOS/CastleFrankenstein","F64 best_score=9999;\n"); +AcctRegExeBranch("TempleOS/CastleFrankenstein"); //Set snap to 4 and width to 4 //if you edit this map. @@ -70,6 +70,25 @@ $SP,"<1>",1$ + + + + + + + + + + $SP,"<6>",6$ + + + + + + + + + #define SCREEN_SCALE 512 #define PLOT_GRID_WIDTH 24 #define PLOT_GRID_HEIGHT 24 @@ -118,14 +137,14 @@ Bool LOSPlot(U8 *,I64 x,I64 y,I64) Bool LOS(I64 x1,I64 y1,I64 x2,I64 y2) { //Line of sight - return Line(NULL,x1*LOS_SCALE/SCREEN_SCALE,y1*LOS_SCALE/SCREEN_SCALE,0, + return LOSLine(NULL,x1*LOS_SCALE/SCREEN_SCALE,y1*LOS_SCALE/SCREEN_SCALE,0, x2*LOS_SCALE/SCREEN_SCALE,y2*LOS_SCALE/SCREEN_SCALE,0,&LOSPlot); } U0 DrawIt(CTask *task,CDC *dc) { I64 i,j,*r1,*r2,*r3,*s2w,xx,yy,zz,x,y,x1,y1,z1, - x1w,y1w,x1h,y1h,xh,yh,zh, + c,x1w,y1w,x1h,y1h,xh,yh,zh, cx=task->win_pixel_width/2, cy=task->win_pixel_height/2, _man_xx=man_xx,_man_yy=man_yy; @@ -133,7 +152,6 @@ U0 DrawIt(CTask *task,CDC *dc) F64 tt,_man_é=man_é; CD3I32 poly[4]; - task->text_attr=BLACK<<4; DCAllocDepthBuf(dc); MemSet(panels_processed_bitmap,0,(map_width*map_height+7)>>3); @@ -182,9 +200,13 @@ U0 DrawIt(CTask *task,CDC *dc) x=xx*SCREEN_SCALE-_man_xx; y=yy*SCREEN_SCALE-_man_yy; if (1<=xxcolor=map[yy*map_width+xx]) && + if ((c=map[yy*map_width+xx]) && LOS(xx*SCREEN_SCALE+SCREEN_SCALE/2,yy*SCREEN_SCALE+SCREEN_SCALE/2, _man_xx,_man_yy)) { + if (c==YELLOW) + dc->color=RED; + else + dc->color=c; poly[0].x=x; poly[0].y=y; poly[0].z=0; @@ -198,13 +220,20 @@ U0 DrawIt(CTask *task,CDC *dc) poly[3].y=y+SCREEN_SCALE; poly[3].z=0; GrFillPoly3(dc,4,poly); - if (dc->color==GREEN) { + if (c==GREEN) { x1=x+SCREEN_SCALE/2; y1=y+SCREEN_SCALE/2; z1=0; GrTransform(dc,&x1,&y1,&z1); if (z1>0) SpritePlotRotMat3b(dc,x+SCREEN_SCALE/2,y+SCREEN_SCALE/2,0,$IB,"<5>",5$,r3); + } else if (c==YELLOW) { + x1=x+SCREEN_SCALE/2; + y1=y+SCREEN_SCALE/2; + z1=0; + GrTransform(dc,&x1,&y1,&z1); + if (z1>0) + SpritePlotRotMat3b(dc,x+SCREEN_SCALE/2,y+SCREEN_SCALE/2,0,$IB,"<6>",6$,r3); } if (!map[(yy+1)*map_width+xx]) { @@ -379,6 +408,9 @@ U0 Init() I64 i,x,y; I64 min_map_x,max_map_x,min_map_y,max_map_y; CDC *dc; + DocClear; + "$$BG,BLACK$$"; NewLine(TEXT_ROWS/2); + SpriteExtents($IB,"<1>",1$,&min_map_x,&max_map_x,&min_map_y,&max_map_y); map_width =(max_map_x-min_map_x+1)/MAP_SCALE+2; map_height=(max_map_y-min_map_y+1)/MAP_SCALE+2; @@ -455,7 +487,7 @@ U0 SongTask(I64) Fs->task_end_cb=&SndTaskEndCB; MusicSettingsRst; while (TRUE) { - Play("W12q.A#1eG2AeA#qAq.A#1eG2eAeA#qA"); + Play("2q.A#1eG2AeA#qAq.A#1eG2eAeA#qA"); Play("q.A#1eG2A#A1qG2q.A#1eG2A#A1qG"); Play("3eA#A2qG3eA#A2qG3eA#A2G3AA#A2qG"); } @@ -489,17 +521,9 @@ U0 RotateMan(F64 d) } } -U0 FPS() +U0 CastleFrankenstein() { I64 sc; - - PopUpOk( - "I refuse to rip-off the original\n" - "so this is intentionally crappy\n" - "and included for demonstration\n" - "purposes.\n\n" - "Write games, don't play them.\n"); - MenuPush( "File {" " Abort(,CH_SHIFT_ESC);" @@ -516,14 +540,14 @@ U0 FPS() ); SettingsPush; //See $LK,"SettingsPush","MN:SettingsPush"$ + Fs->text_attr=RED<<4+WHITE; Preempt(OFF); WinMax; WordStat; Init; - Fs->animate_task=Spawn(&AnimateTask,NULL,"Animate",Fs); - Fs->song_task=Spawn(&SongTask,NULL,"Song",Fs); + Fs->animate_task=Spawn(&AnimateTask,NULL,"Animate",,Fs); + Fs->song_task=Spawn(&SongTask,NULL,"Song",,Fs); DocCursor; - DocClear; Fs->draw_it=&DrawIt; try { @@ -559,14 +583,15 @@ U0 FPS() fs_done: } catch CatchAll; + DocClear; SettingsPop; CleanUp; MenuPop; - AcctRegWriteBranch("TempleOS/FPS","F64 best_score=%5.4f;\n",best_score); + AcctRegWriteBranch("TempleOS/CastleFrankenstein","F64 best_score=%5.4f;\n",best_score); } -FPS; -Æ    <<<< ,,,$8888$$$$444 4 ( ( ((0,0T0T0TLTL,L,L,404P4P4PHPH0H0H0808L8L8LDLD4D4D4<4<H<H<H@H@8@T@l@l4lLlLˆLˆLˆ$ˆ$€$€$€0€0l0p4„4„(„H€HpHpDp8p8€8€8€D€DtHtDt<t<|<x@|@|DxD„ „„tppp\\\\llhlll````ddd h hXTPPPLLL(@@8HHHH8888DD D D <Z,u @ ZDD<DDD\D\DdT0T8THL0LLd d hh88x8|8|4x4Z<HñÿÿÿñÿÿÿØÿÿÿìÿÿÿØÿÿÿûÿÿÿ¿ÿÿÿ¿ÿÿÿØÿÿÿØÿÿÿìÿÿÿƒÿÿÿçÿÿÿƒÿÿÿûÿÿÿƒÿÿÿƒÿÿÿ +CastleFrankenstein; ++    <<<< ,,,$8888$$$$444 4 ( ( ((0,0T0T0TLTL,L,L,404P4P4PHPH0H0H0808L8L8LDLD4D4D4<4<H<H<H@H@8@T@l@l4lLlLˆLˆLˆ$ˆ$€$€$€0€0l0p4„4„(„H€HpHpDp8p8€8€8€D€DtHtDt<t<|<x@|@|DxD„ „„tppp\\\\llhlll````ddd h hXTPPPLLL(@@8HHHH8888DD D D <Z,u @ ZDD<DDD\D\DdT0T8THL0LLd d hh88x8|8|4x4tt$t@8HLL,L4L<LZ<HñÿÿÿñÿÿÿØÿÿÿìÿÿÿØÿÿÿûÿÿÿ¿ÿÿÿ¿ÿÿÿØÿÿÿØÿÿÿìÿÿÿƒÿÿÿçÿÿÿƒÿÿÿûÿÿÿƒÿÿÿƒÿÿÿ tÿÿÿöÿÿÿtÿÿÿ ¿ÿÿÿöÿÿÿ¿ÿÿÿƒÿÿÿ @@ -656,4 +681,10 @@ FPS;       -        \ No newline at end of file +       (Øÿÿÿ(ØÿÿÿØÿÿÿØÿÿÿìÿÿÿÎÿÿÿÎÿÿÿìÿÿÿ‚‚ìÿÿÿ‚ìÿÿÿìÿÿÿ‚öÿÿÿâÿÿÿ‚ +âÿÿÿ‚ìÿÿÿ   + + +   + +            \ No newline at end of file diff --git a/TempleOS/Demo/GameStarters/ChessNet.CPP b/TempleOS/Demo/Games/ChessNet.CPP similarity index 98% rename from TempleOS/Demo/GameStarters/ChessNet.CPP rename to TempleOS/Demo/Games/ChessNet.CPP index 5e05e24970c40c73f04e64b9f4da63cf36abb69f..bbd92a2b2a0647e7dda342f339d15fefa879dd74 100644 GIT binary patch delta 81 zcmZ3ee@K7BJ;upfctkeyF{Sazx)tl%m84db#3z=N6xq55xw`t<*qCUCdw7PpT5m2C l$YGUGP;gHz@hwi*(9topvGEOdkN0+sj1LXid_(jkBLG&W8d?AV delta 47 zcmX@4zfga}Jw}O=#NupSyOPw3lK8}uk|JC8AXisE8yl0&w;1dAHdhE_vTpt-dV~=G DxknNX diff --git a/TempleOS/Demo/GameStarters/CircleTrace.CPP b/TempleOS/Demo/Games/CircleTrace.CPP similarity index 96% rename from TempleOS/Demo/GameStarters/CircleTrace.CPP rename to TempleOS/Demo/Games/CircleTrace.CPP index 4f5ae91..ffe4dc1 100644 --- a/TempleOS/Demo/GameStarters/CircleTrace.CPP +++ b/TempleOS/Demo/Games/CircleTrace.CPP @@ -1,7 +1,7 @@ //Practice tracing circles AcctRegSetDftEntry("TempleOS/CircleTrace","F64 best_score=999;\n"); -AcctRegExecuteBranch("TempleOS/CircleTrace"); +AcctRegExeBranch("TempleOS/CircleTrace"); I64 cx,cy; F64 avg_error=0,elapsed_time=0,total_error=0,score=999; @@ -39,7 +39,7 @@ U0 CircleTrace() CDC *dc=DCAlias; SettingsPush; //See $LK,"SettingsPush","MN:SettingsPush"$ - Fs->song_task=Spawn(&SongTask,NULL,"Song",Fs); + Fs->song_task=Spawn(&SongTask,NULL,"Song",,Fs); WordStat; cx=Fs->win_pixel_width/2; @@ -115,6 +115,7 @@ U0 CircleTrace() break; } } while (msg_code!=MSG_KEY_DOWN || p1!=CH_SHIFT_ESC && p1!=CH_ESC); + GetMsg(,,1<n}>0;C(lYY0Km%?0{{R3 delta 69 zcmaE_`bl-eYbKVG#NzD9ubDz6Knz{GlGKWl_{5TuB3t($S64q98 diff --git a/TempleOS/Demo/Digits.CPP b/TempleOS/Demo/Games/Digits.CPP similarity index 91% rename from TempleOS/Demo/Digits.CPP rename to TempleOS/Demo/Games/Digits.CPP index e66e8b0..30caad4 100644 --- a/TempleOS/Demo/Digits.CPP +++ b/TempleOS/Demo/Games/Digits.CPP @@ -24,6 +24,8 @@ U0 Digits() I64 num,ch,i; U8 answer[1024]; + SettingsPush; //See $LK,"SettingsPush","MN:SettingsPush"$ + Fs->text_attr=DKGRAY<<4+WHITE; DocClear; //Set default background and foreground "$$WW,1$$$$BD,DKGRAY$$$$FD,WHITE$$" @@ -54,7 +56,7 @@ restart: "$$WW,1$$$$BD,DKGRAY$$$$FD,WHITE$$\n"; "Guess\nLength:%d\n\n",num; for (i=0;i",1$ @@ -15,70 +15,38 @@ $SP,"map",1$ +$SP,"<2>",2$ -$SP,"hero",2$ +$SP,"<3>",3$ - -$SP,"hero_attack",3$ - - - - - - -$SP,"template",4$ //This is a template you can copy and use to make a tile. +$SP,"<4>",4$ //This is a template you can copy and use to make a tile. //WHITE is the transparent color. - -$SP,"tree",5$ +$SP,"<5>",5$ +$SP,"<6>",6$ - -$SP,"path",6$ +$SP,"<7>",7$ - -$SP,"water1",7$ - - - -$SP,"water2",8$ - +$SP,"<8>",8$ -$SP,"goblin",9$ - - - - - - - - -$SP,"wall1",10$ - - - - - - - -$SP,"wall2",11$ - - - +$SP,"<9>",9$ +$SP,"<10>",10$ +$SP,"<11>",11$ @@ -133,18 +101,17 @@ Bool LOSPlot(U8 *,I64 x,I64 y,I64) Bool LOS(I64 x1,I64 y1,I64 x2,I64 y2) { //Line of sight - return Line(NULL,x1*LOS_SCALE+LOS_SCALE/2,y1*LOS_SCALE+LOS_SCALE/2,0, + return LOSLine(NULL,x1*LOS_SCALE+LOS_SCALE/2,y1*LOS_SCALE+LOS_SCALE/2,0, x2*LOS_SCALE+LOS_SCALE/2,y2*LOS_SCALE+LOS_SCALE/2,0,&LOSPlot); } U0 DrawIt(CTask *task,CDC *dc) { - CDC *dc_t=DCAlias(gr_dc,task); + CDC *dc_t=DCAlias(gr_dc2,task); I64 i,x,y,xx,yy,x1,y1,z1,color; CD3I32 poly[4]; U8 **_tiles; - task->text_attr=BLACK<<4; if (Blink(5)) _tiles=tiles1; else @@ -158,7 +125,7 @@ U0 DrawIt(CTask *task,CDC *dc) dc_t->flags|=DCF_TRANSFORMATION; //You could make it much more efficient - //if you did it like $LK-A,"::/TempleOS/Demo/GameStarters/BigGuns.CPP"$ + //if you did it like $LK-A,"::/TempleOS/Demo/Games/BigGuns.CPP"$ //with a $LK,"CDC","MN:CDC"$. for (y=-SCREEN_HEIGHT/2;ytext_attr=BLACK<<4+WHITE; Preempt(OFF); WinMax; WordStat; Init; - Fs->animate_task=Spawn(&AnimateTask,NULL,"Animate",Fs); + Fs->animate_task=Spawn(&AnimateTask,NULL,"Animate",,Fs); DocCursor; DocClear; Fs->draw_it=&DrawIt; @@ -505,5 +473,5 @@ DunGen; ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ -ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ -òþÿÿÿüÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ b ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ²'$ìÿÿÿäÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ ÿ  ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ²öÿÿÿèÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ ÿ  ÿÿÿÿÿÿÿÿÿÿÿÿÿÿ ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ \ No newline at end of file +ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ +òþÿÿÿüÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ b ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ²'$ìÿÿÿäÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ ÿ  ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ ÿÿÿ ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ ÿÿÿÿ ÿÿÿÿÿÿ ÿÿÿÿÿÿÿÿÿÿÿÿÿÿ ÿÿÿ ÿÿÿÿ  ÿÿÿÿÿÿÿÿÿÿÿÿÿÿ ÿÿÿÿÿÿ  ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ ÿÿ ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ ÿ ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ  ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ²öÿÿÿèÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ ÿ  ÿÿÿÿÿÿÿÿÿÿÿÿÿÿ ÿÿÿ ÿÿÿÿÿÿÿÿÿÿÿÿÿ ÿÿÿÿ ÿÿÿÿÿÿÿÿÿÿÿÿÿ ÿÿÿ ÿÿÿÿÿÿÿÿÿÿÿÿ ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ ÿÿÿÿÿÿÿÿÿÿÿ ÿÿÿÿÿÿÿÿÿ ÿÿÿÿÿÿÿÿÿÿÿ ÿÿÿÿÿÿÿÿÿÿÿÿ  ÿÿÿÿÿÿÿÿÿÿÿÿÿ  ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ \ No newline at end of file diff --git a/TempleOS/Demo/GameStarters/EagleDive.CPP b/TempleOS/Demo/Games/EagleDive.CPP similarity index 92% rename from TempleOS/Demo/GameStarters/EagleDive.CPP rename to TempleOS/Demo/Games/EagleDive.CPP index 92a0675..763525b 100644 --- a/TempleOS/Demo/GameStarters/EagleDive.CPP +++ b/TempleOS/Demo/Games/EagleDive.CPP @@ -7,7 +7,7 @@ I64 best_score=0; //Doesn't work yet for AOT #else AcctRegSetDftEntry("TempleOS/EagleDive","I64 best_score=0;\n"); -AcctRegExecuteBranch("TempleOS/EagleDive"); +AcctRegExeBranch("TempleOS/EagleDive"); #endif @@ -97,9 +97,8 @@ Bool game_over; class MPCtrl { I64 mp_cnt; - I64 doc_update; - F64 update_done_t[MP_MAX_PROCESSORS]; - I64 done_flags; + I64 init_not_done_flags,update_not_done_flags,app_not_done_flags; + F64 update_done_time[MP_MAX_PROCESSORS]; Bool app_done; } mp; @@ -129,7 +128,7 @@ U0 FSTransform(CDC *dc,I64 *x,I64 *y,I64 *z) U0 CalcNormals() { -/*The idea is that there are two triangles +/*The idea is that there are two tris forming every grid square and we find the normal vect with a curl. @@ -205,7 +204,7 @@ Bool TestSameSlope(I64 x,I64 y,I64 w,I64 h) I64 k1,k2,xx,yy,s; if (!(0<=x && x+wnum); + LBtr(&mp.init_not_done_flags,Gs->num); } @@ -385,12 +384,11 @@ U0 InitMap() panel_root=NULL; num_panels=0; - mp.done_flags=0; - for (i=1;i>3); } @@ -443,7 +441,7 @@ U0 MPDrawIt(CTask *task,CDC *dc) x3,y3,z3, cx=task->win_pixel_width>>1, cy=task->win_pixel_height>>1; - F64 h_grid_size,t0=tT; + F64 h_grid_size,t=tT; Panel reg *tempp; xx=x/(MAP_SCALE*COORDINATE_SCALE); @@ -544,7 +542,8 @@ U0 MPDrawIt(CTask *task,CDC *dc) y1h+=yh; } Free(s2w); - mp.update_done_t[Gs->num]=tT-t0; + mp.update_done_time[Gs->num]=Limit(tT-t,.001,0.5); + LBtr(&mp.update_not_done_flags,Gs->num); } U0 APEagleDiveTask(CTask *master_task) @@ -553,10 +552,8 @@ U0 APEagleDiveTask(CTask *master_task) if (!IsSysDeterministic) Preempt(ON); while (!mp.app_done) { - LBts(&Fs->task_flags,TASKf_IDLE); - while (!LBtr(&mp.doc_update,Gs->num) && !mp.app_done) - Yield; - LBtr(&Fs->task_flags,TASKf_IDLE); + while (!Bt(&mp.update_not_done_flags,Gs->num) && !mp.app_done) + Sleep(1); if (!mp.app_done) MPDrawIt(master_task,dc); } @@ -565,7 +562,7 @@ U0 APEagleDiveTask(CTask *master_task) dc->depth_buf=NULL; DCDel(dc); - LBts(&mp.done_flags,Gs->num); + LBtr(&mp.app_not_done_flags,Gs->num); } U0 DrawHorizon(CDC *dc) @@ -663,14 +660,13 @@ U0 DrawHorizon(CDC *dc) U0 BSPEagleDive() { CDC *dc=DCAlias(main_dc,Fs); - F64 last_t; + F64 max_t; I64 i,xx,yy,height,bkcolor, cx=Fs->win_pixel_width>>1, cy=Fs->win_pixel_height>>1; Fish *tempf; MemSet(panels_processed_bitmap,0,(num_panels+7)>>3); - MemSet(mp.update_done_t,0,sizeof(F64)*MP_MAX_PROCESSORS); xx=x/(MAP_SCALE*COORDINATE_SCALE); yy=y/(MAP_SCALE*COORDINATE_SCALE); @@ -694,13 +690,7 @@ U0 BSPEagleDive() DrawHorizon(dc); DCDepthBufRst(dc); - //Signal all cores to start update - mp.doc_update=1<next; } - //Wait for all cores to complete. - LBts(&Fs->task_flags,TASKf_IDLE); - for (i=1;itask_flags,TASKf_IDLE); + while (mp.update_not_done_flags) + Sleep(1); - last_t=mp.update_done_t[0]; + max_t=mp.update_done_time[0]; for (i=1;iwin_max_refresh)/last_t; + v_grid_size *=0.90+0.10*(0.65/Fs->win_max_refresh)/max_t; v_grid_size=Limit(v_grid_size,20,200); //Regulate how much grid expands in the distance. if (mp.mp_cnt>1) - span_factor*=0.90+0.10*mp.update_done_t[mp.mp_cnt-1]/mp.update_done_t[0]; + span_factor*=0.90+0.10*mp.update_done_time[mp.mp_cnt-1]/mp.update_done_time[0]; span_factor=Limit(span_factor,.30,3.0); } else { @@ -821,11 +807,11 @@ U0 AnimateTask(I64) U0 MPEnd() { - mp.done_flags=0; + mp.app_not_done_flags=1<task_end_cb=&TaskEndCB; game_t0=tT; } @@ -933,9 +919,9 @@ U0 EagleDive(I64 _mp_cnt=MP_MAX_PROCESSORS) WinMax; WinBorder; "Initializing...\n"; - Fs->song_task=Spawn(&SongTask,NULL,"Song",Fs); + Fs->song_task=Spawn(&SongTask,NULL,"Song",,Fs); Init(_mp_cnt); - Fs->animate_task=Spawn(&AnimateTask,NULL,"Animate",Fs); + Fs->animate_task=Spawn(&AnimateTask,NULL,"Animate",,Fs); DocCursor; DocClear; Fs->draw_it=&DrawIt; @@ -947,11 +933,11 @@ U0 EagleDive(I64 _mp_cnt=MP_MAX_PROCESSORS) case 0: switch (sc.u8[0]) { case SC_CURSOR_DOWN: - è +=-CTRLS_SCALE*Cos(tt1); + è +=-CTRLS_SCALE*Cos(tt1); é2+=-CTRLS_SCALE*Sin(tt1)*Sin(è); break; case SC_CURSOR_UP: - è -=-CTRLS_SCALE*Cos(tt1); + è -=-CTRLS_SCALE*Cos(tt1); é2-=-CTRLS_SCALE*Sin(tt1)*Sin(è); break; case SC_CURSOR_RIGHT: @@ -971,7 +957,7 @@ U0 EagleDive(I64 _mp_cnt=MP_MAX_PROCESSORS) break; } é1=Wrap(é1); - è =Wrap(è); + è =Wrap(è); é2=Wrap(é2); } else BSPEagleDive; @@ -987,4 +973,4 @@ U0 EagleDive(I64 _mp_cnt=MP_MAX_PROCESSORS) } EagleDive; -.¨¢¢¨¢¨¢¨˜˜¢ˆ¢ˆxx¢h¢hXX¢H¢H88¢(¢(¢¨¨""2¨2¨BBR¨R¨bbr¨r¨‚‚’¨’!r8P"!t2R!v,T!N*p@!L.lD!L4hH!Tx&!Xz !\|!ZDtLâÿÿÿ%ãÿÿÿ# \ No newline at end of file +.¨¢¢¨¢¨¢¨˜˜¢ˆ¢ˆxx¢h¢hXX¢H¢H88¢(¢(¢¨¨""2¨2¨BBR¨R¨bbr¨r¨‚‚’¨’!r8P"!t2R!v,T!N*p@!L.lD!L4hH!Tx&!Xz !\|!ZDt�àÿÿÿýÿÿÿýÿÿÿ""ÿÿÿÿ+ÿÿÿÿ+ & & üÿÿÿ üÿÿÿáÿÿÿáÿÿÿ) \ No newline at end of file diff --git a/TempleOS/Demo/GameStarters/Navy.CPP b/TempleOS/Demo/Games/FlatTops.CPP similarity index 99% rename from TempleOS/Demo/GameStarters/Navy.CPP rename to TempleOS/Demo/Games/FlatTops.CPP index 5911dae..10dc7b6 100644 --- a/TempleOS/Demo/GameStarters/Navy.CPP +++ b/TempleOS/Demo/Games/FlatTops.CPP @@ -152,8 +152,6 @@ U0 DrawIt(CTask *task,CDC *dc) Obj *tempo; Torpedo *tempt; Bool old_preempt=Preempt(OFF); - task->text_attr=BLUE<<4+WHITE; - tempt=torpedo_root.next; while (tempt!=&torpedo_root) { @@ -696,11 +694,12 @@ U0 AnimateTask(I64) } -U0 Navy() +U0 FlatTops() { I64 p1,p2; SettingsPush; //See $LK,"SettingsPush","MN:SettingsPush"$ + Fs->text_attr=BLUE<<4+WHITE; PopUpOk("$$FG,GREEN$${Left-Mouse}$$FG$$\t\tChange Course\n" "$$FG,GREEN$${Right-Mouse}$$FG$$\t\tLaunch Squadron\n" "$$FG,GREEN$${Right-Double-Mouse}$$FG$$\tReturn Squadron\n" @@ -726,7 +725,7 @@ U0 Navy() DocCursor; DocClear; Fs->draw_it=&DrawIt; - Fs->animate_task=Spawn(&AnimateTask,NULL,"Animate",Fs); + Fs->animate_task=Spawn(&AnimateTask,NULL,"Animate",,Fs); try { while (TRUE) switch(GetMsg(&p1,&p2,1<win_pixel_width,v=task->win_pixel_height; + I64 w=task->win_pixel_width,h=task->win_pixel_height; I64 i,x,y,xx; Bool old_preempt=Preempt(OFF); - xx=h>>1-car_x+road_x[road_ptr&(NUM_ROAD-1)]; + xx=w>>1-car_x+road_x[road_ptr&(NUM_ROAD-1)]; - task->text_attr=BLACK+BLACK<<4; dc->color=LTGRAY; for (i=0;i>1-car_x+road_x[(i+road_ptr)&(NUM_ROAD-1)]; - y=v-0.5*i; - if (y>1-car_x+road_x[(i+road_ptr)&(NUM_ROAD-1)]; + y=h-0.5*i; + if (y<(h+FONT_HEIGHT)>>1) break; GrPlot(dc,x+ROAD_WIDTH_BY_2-0.4*i,y); GrPlot(dc,x-ROAD_WIDTH_BY_2+0.4*i,y); } dc->color=WHITE; - x=h>>1-CAR_WIDTH_BY_2; + x=w>>1-CAR_WIDTH_BY_2; if (x>1+CAR_WIDTH_BY_2; + x=w>>1+CAR_WIDTH_BY_2; if (x>xx+ROAD_WIDTH_BY_2) crash=TRUE; - GrLine(dc,x-10,v,x-40,v-100); - GrLine(dc,x+10,v,x+40,v-100); + GrLine(dc,x-10,h,x-40,h-100); + GrLine(dc,x+10,h,x+40,h-100); dc->color=YELLOW; if (crash) - GrPutS(dc,h>>1-FONT_WIDTH*4,(v-FONT_HEIGHT)>>1,"Game Over"); + GrPutS(dc,w>>1-FONT_WIDTH*4,(h-FONT_HEIGHT)>>1,"Game Over"); Preempt(old_preempt); } @@ -61,6 +60,8 @@ U0 UpdateRoad() U0 Init() { I64 i,x=0; + DocClear; + "$$BG,DKGRAY$$"; NewLine((TEXT_ROWS-1)/2); speed=0; distance=0; road_trend=0; @@ -80,6 +81,7 @@ U0 Halogen() { I64 p1,p2,ch=0,sc=0; SettingsPush; //See $LK,"SettingsPush","MN:SettingsPush"$ + Fs->text_attr=BLACK<<4+WHITE; MenuPush( "File {" " Abort(,CH_SHIFT_ESC);" @@ -98,7 +100,6 @@ U0 Halogen() WinMax; Init; DocCursor; - DocClear; Fs->draw_it=&DrawIt; try { while (TRUE) { @@ -157,6 +158,7 @@ ha_done: } catch CatchAll; MenuPop; + DocClear; SettingsPop; } diff --git a/TempleOS/Demo/GameStarters/MassSpring.CPP b/TempleOS/Demo/Games/MassSpring.CPP similarity index 100% rename from TempleOS/Demo/GameStarters/MassSpring.CPP rename to TempleOS/Demo/Games/MassSpring.CPP diff --git a/TempleOS/Demo/Maze.CPP b/TempleOS/Demo/Games/Maze.CPP similarity index 100% rename from TempleOS/Demo/Maze.CPP rename to TempleOS/Demo/Games/Maze.CPP diff --git a/TempleOS/Demo/GameStarters/RainDrops.CPP b/TempleOS/Demo/Games/RainDrops.CPP similarity index 98% rename from TempleOS/Demo/GameStarters/RainDrops.CPP rename to TempleOS/Demo/Games/RainDrops.CPP index 055e049..092aa32 100644 --- a/TempleOS/Demo/GameStarters/RainDrops.CPP +++ b/TempleOS/Demo/Games/RainDrops.CPP @@ -168,7 +168,7 @@ U0 RainDrops() sc_1=A2ScanCode('1'); sc_2=A2ScanCode('2'); Init; - Fs->animate_task=Spawn(&AnimateTask,NULL,"Animate",Fs); + Fs->animate_task=Spawn(&AnimateTask,NULL,"Animate",,Fs); DocCursor; DocClear; Fs->draw_it=&DrawIt; diff --git a/TempleOS/Demo/GameStarters/RawHide.CPP b/TempleOS/Demo/Games/RawHide.CPP similarity index 92% rename from TempleOS/Demo/GameStarters/RawHide.CPP rename to TempleOS/Demo/Games/RawHide.CPP index ea9b337..a8c29b8 100644 --- a/TempleOS/Demo/GameStarters/RawHide.CPP +++ b/TempleOS/Demo/Games/RawHide.CPP @@ -1,7 +1,7 @@ //This uses $LK,"fixed-point","FI:::/TempleOS/Demo/Lectures/FixedPoint.CPP"$. AcctRegSetDftEntry("TempleOS/RawHide","F64 best_score=9999;\n"); -AcctRegExecuteBranch("TempleOS/RawHide"); +AcctRegExeBranch("TempleOS/RawHide"); F64 t0,tf; @@ -238,9 +238,9 @@ U0 DrawIt(CTask *task,CDC *dc) dc->color=RED; t=tf-t0; if (Blink) - GrPutS(dc,(task->win_pixel_width-FONT_WIDTH*9)>>1-task->win_scroll_x, + GrPutS(dc,(task->win_pixel_width-FONT_WIDTH*14)>>1-task->win_scroll_x, (task->win_pixel_height-FONT_HEIGHT)>>1-task->win_scroll_y, - "Game Over"); + "Game Completed"); } else { dc->color=BLACK; t=tT-t0; @@ -392,10 +392,10 @@ U0 SongTask(I64) Fs->task_end_cb=&SndTaskEndCB; MusicSettingsRst; while (TRUE) { - Play("W13qC2etG!3DCBDC!!ECFqFC!sADAD!qB"); - Play("C2etG!3DCBDC!!ECFqFC!sADAD!qB"); - Play("!2sG3A!2G3A!qG2etG3GDeBBqBFeBAqE"); - Play("!2sG3A!2G3A!qG2etG3GDeBBqBFeBAqE"); + Play("3qC2etG3DCBDCECFqFCsADADqB"); + Play("C2etG3DCBDCECFqFCsADADqB"); + Play("2sG3A2G3AqG2etG3GDeBBqBFeBAqE"); + Play("2sG3A2G3AqG2etG3GDeBBqBFeBAqE"); } } @@ -479,13 +479,13 @@ U0 RawHide() " Restart(,'\n');" "}" ); - Fs->song_task=Spawn(&SongTask,NULL,"Song",Fs); + Fs->song_task=Spawn(&SongTask,NULL,"Song",,Fs); Fs->win_inhibit=WIF_ALL-WIF_BORDER-WIF_GRAB_SCROLL-WIF_MENU; WinMax; WordStat; Preempt(OFF); Init; - Fs->animate_task=Spawn(&AnimateTask,Fs,"Animate",Fs); + Fs->animate_task=Spawn(&AnimateTask,Fs,"Animate",,Fs); DocCursor; DocClear; Fs->draw_it=&DrawIt; @@ -510,6 +510,7 @@ U0 RawHide() } } rh_done: + GetMsg(,,1<peqH48_Oe?YuzV5s(FYZfI0CzeGS!D&F^Y+lUrn050qEZ>B?eUtQl+AzqT=QbQB=cs Gj2Qrx<0Ya1 diff --git a/TempleOS/Demo/GameStarters/RocketScience.CPP b/TempleOS/Demo/Games/RocketScience.CPP similarity index 97% rename from TempleOS/Demo/GameStarters/RocketScience.CPP rename to TempleOS/Demo/Games/RocketScience.CPP index 5036188d3b62e18bbaa138699705825396c6cb0d..a7fd6db5c16fa4ff4a12304eb5eb9437c66a800c 100644 GIT binary patch delta 115 zcmeB9eV4M~GwbBvtV)wr*_0;-uqkh@W>XcAbt~4jD@m;=iBBvkDYA`p_3`l!x3MwN zcJc{zwcb2eOo&m&B|q6YCpEFinoB`JNkzrUUB@THInvQjMMcSa@^Nw5%|FGTFiw6b Od5Qz3a`SGf3*rFHJSPwU delta 149 zcmaEt(w(~DGb=}se?YuzV5s)w&#X!ajwqWlf@6Wi*&NNLDzJHh7(b(gl8TD6kBW+l zij%vJPl$7*qo0b3k~NpYRjGqU)F`uI#fBY8>y MNjF4#p40_#0K+6IdH?_b diff --git a/TempleOS/Demo/GameStarters/Squirt.CPP b/TempleOS/Demo/Games/Squirt.CPP similarity index 93% rename from TempleOS/Demo/GameStarters/Squirt.CPP rename to TempleOS/Demo/Games/Squirt.CPP index 08283ed..9e908ad 100644 --- a/TempleOS/Demo/GameStarters/Squirt.CPP +++ b/TempleOS/Demo/Games/Squirt.CPP @@ -29,6 +29,22 @@ $SP,"<3>",3$ $BG$ + + + + + + + + + + + + + + +$SP+BP,"<4>",4,"::/TempleOS/Demo/Graphics/Camp.CPP.Z,6"$ //Pointer to sprite <6> in Camp.CPP.Z file + #define HOSE_RADIUS 3 #define LINK_SIZE 6 #define NOZZLE_START_Y (GR_HEIGHT-15*FONT_HEIGHT) @@ -53,6 +69,7 @@ U0 DrawIt(CTask *task,CDC *dc) MySpring *temps; CD3I32 poly[4]; + SpritePlot3(dc,0,GROUND_Y,0,$IB,"<4>",4$); if (start_up_timeout>tT) { ode->drag_v2=0.01; //Let hose settle during start-up ode->drag_v3=0.0001; @@ -294,9 +311,7 @@ U0 MoveNozzleTaskY(I64 sign) U0 DrawBackGroundTextLayer() { DocClear; - "$$BG,LTCYAN$$"; - NewLine(GROUND_Y/FONT_HEIGHT); - "$$BG,YELLOW$$"; + "$$BG,LTCYAN$$"; NewLine(GROUND_Y/FONT_HEIGHT); } U0 Init() @@ -322,7 +337,6 @@ U0 CleanUp() QueDel(&ode->next_spring,TRUE); ODEDel(ode); DocClear; - "$$BG$$"; } U0 SongTask(I64) @@ -330,7 +344,7 @@ U0 SongTask(I64) Fs->task_end_cb=&SndTaskEndCB; MusicSettingsRst; while (TRUE) { - Play("W13eAM4/4"); + Play("3eAM4/4"); Play("2qGeGqG3eAq.BqBeBqA2eG3qA"); Play("eB2hG3q.BqBeCq.DD"); Play("qCeBqCeDhB"); @@ -341,7 +355,8 @@ U0 Squirt() { I64 sc; SettingsPush; //See $LK,"SettingsPush","MN:SettingsPush"$ - Fs->song_task=Spawn(&SongTask,NULL,"Song",Fs); + Fs->text_attr=YELLOW<<4+BLUE; + Fs->song_task=Spawn(&SongTask,NULL,"Song",,Fs); WinMax; WinBorder; Preempt(OFF); @@ -365,7 +380,7 @@ U0 Squirt() ); Init; - Fs->animate_task=Spawn(&AnimateTask,NULL,"Animate",Fs); + Fs->animate_task=Spawn(&AnimateTask,NULL,"Animate",,Fs); Fs->draw_it=&DrawIt; try { @@ -374,16 +389,16 @@ U0 Squirt() case 0: switch (sc.u8[0]) { case SC_CURSOR_LEFT: - Spawn(&MoveNozzleTaskX,-1,"Move Nozzle",Fs); + Spawn(&MoveNozzleTaskX,-1,"Move Nozzle",,Fs); break; case SC_CURSOR_RIGHT: - Spawn(&MoveNozzleTaskX,1,"Move Nozzle",Fs); + Spawn(&MoveNozzleTaskX,1,"Move Nozzle",,Fs); break; case SC_CURSOR_UP: - Spawn(&MoveNozzleTaskY,-1,"Move Nozzle",Fs); + Spawn(&MoveNozzleTaskY,-1,"Move Nozzle",,Fs); break; case SC_CURSOR_DOWN: - Spawn(&MoveNozzleTaskY,1,"Move Nozzle",Fs); + Spawn(&MoveNozzleTaskY,1,"Move Nozzle",,Fs); break; } break; diff --git a/TempleOS/Demo/GameStarters/Stadium/Stadium.CPP b/TempleOS/Demo/Games/Stadium/Stadium.CPP similarity index 95% rename from TempleOS/Demo/GameStarters/Stadium/Stadium.CPP rename to TempleOS/Demo/Games/Stadium/Stadium.CPP index e5de0c381afc2a3f1cbcc1d47e0a2ffd45da686a..97ca3046c0d1218d968af144bf7e430fabcb9365 100644 GIT binary patch delta 69 zcmZ21yIFREo3Npsl8&JY7Z(?o0+&i~fR2)l(Z;wu_Q|K&jW)Azlru^wD7dGV_!g&Y Z=;#>Q*!Tv!$9ua*#)k%MuHe*W1pr`Z5)uFa delta 57 zcmdliyI6LDn?zb-o}H48p$Zol7ncH;N^pRVl1)-#PR_>2Jod>a*bUi(OA?DpQj0eK NWG`pj+|8-M3IN)P5pVzi diff --git a/TempleOS/Demo/Games/Stadium/Stadium.GRA b/TempleOS/Demo/Games/Stadium/Stadium.GRA new file mode 100644 index 0000000000000000000000000000000000000000..c84360865df740fcdd59dbdbee337146712290d3 GIT binary patch literal 6413 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 delta 746 zcmextw$FUS4bIIsIStua*w~nvCi4kOv$3(UF)=Ys))$oIWMX1tVrFJ$Vwh|wD9*{m z#KgqGz`y|Jfs}L!$}=)eUL|PD!NkPC%)rOTJo&w#7!w=YWOgB0RwgC}CZ@@nLh{TY zwcbL~%uF0ilQV^+UDz1dm>3v97BRpnkhxII#>T+G24y2r|6yz*(rip@ z3>+L_X*M=yW(H=q$^F98tRU0bCa(vnWME?hOS3bvu`w_~*=)>g3`|U5aW;@RGsEP3 zVQE%2W>CQN3rjPyZ9Xlc&QuQyL@p+noBzWA$lFXz*u~k{;NFHQ|Ife&3MVY$U}3D{ zAS)Qepf)2L#K6Wj`JlKk$m48mY?C*LiLijwLK)0#n^%b^FiArl{vQ(F2>l=}ic+HW zP>V6-p$^3m$EBW)4P-e3hI&3WP@>>tK)0U>EY4win_pixel_left,ipy-Fs->win_pixel_top); else diff --git a/TempleOS/Demo/GameStarters/Varoom.CPP b/TempleOS/Demo/Games/Varoom.CPP similarity index 90% rename from TempleOS/Demo/GameStarters/Varoom.CPP rename to TempleOS/Demo/Games/Varoom.CPP index b3989922e134f240f866885e68574d4d7cf9c7eb..68e0bbc57bdd97c1816cd942d4d080327dfd406a 100644 GIT binary patch delta 295 zcmca&y~37JVS@`BZ)Tc;My8sfrb0EBg2LnntWwNDt}c_)*_0VMCo8b2On$^F!5Z%2 z8R9zmI!uhaRv|T~I2EpAauS;cLiOY;Y-$i5W9?*lb`9pd{F2RX?3|2@Mw|UPYFIdn zG}Lkn;`8!LCSTy$y?F)iD#rS}{F3;T{Jhlow4B8BVp~HSo7{r<juIS6nqGJ2m0bCGQ?EnA( delta 239 zcmZ2sd&PPqqYK;Qr>tTenQDgiL9Q-VlO5SLCQGwvfdsigg5e&XA+A=Fm$9o&mS)qK z{FPmGvm6HpBdbnHVsZB5jeK64%Q$seSc^5(atkJ};oU6-64$jWNv$Y}Pb?`ZvW;~0 z@$nD0u`#jUoWi%3(I6#1FEu_bCo#R)*1(!eK_M-_NI@gh*3dfBCbu9yIj_VzQ(Ie; zOF=jg4cCv%ED*!)UtA3Ffg088lr diff --git a/TempleOS/Demo/Games/Wenceslas.CPP b/TempleOS/Demo/Games/Wenceslas.CPP new file mode 100644 index 0000000..12b0b2f --- /dev/null +++ b/TempleOS/Demo/Games/Wenceslas.CPP @@ -0,0 +1,540 @@ +AcctRegSetDftEntry("TempleOS/Wenceslas","F64 best_score=9999;\n"); +AcctRegExeBranch("TempleOS/Wenceslas"); + +#define BORDER 5 +#define KING_STEP 4 + + + + $SP,"<1>",1$ + + + + + $SP,"<2>",2$ + + + + + + + + + + + + $SP,"<3>",3$ + + + + + $SP,"<4>",4$ + + + + + + + + $SP,"<5>",5$ + + + + + + + + + + + + + + + + + + + + + $SP,"<6>",6$ + + + + + + + + + + $SP,"<7>",7$ + + + +#define NUM_FLAKES 0x8000 +class Flake +{ + U16 x,y; +} flakes[NUM_FLAKES]; + +#define NUM_TREES 8 +class Tree +{ + U16 x,y; + I64 fire_frame_index; +} trees[NUM_TREES]; + +I64 snow_x,snow_y; +I64 king_x,king_y,not_stopped_cnt; +F64 king_é,t0,tf,door_open_t0; + +#define NUM_PEASANTS 16 +class Peasant +{ + Peasant *next,*last; + F64 x,y,é,door_opened_t0; + Bool stopped; +} peasant_root; + +class Step +{ + Step *next,*last; + U16 x,y; + F64 t0; +} step_root,king_step_root; + +U0 DrawIt(CTask *task,CDC *dc) +{ + I64 r[16],i,w=task->win_pixel_width,h=task->win_pixel_height; + U8 *img; + Step *temps; + Peasant *tempp; + F64 tt; + Bool old_preempt=Preempt(OFF); + + dc->pen_width=1; + for (i=0;i",4$; + else + img=$IB,"<5>",5$; + } else + img=$IB,"<3>",3$; + SpritePlot3(dc,trees[i].x,trees[i].y,0,img); + } + } + + SpritePlot3(dc,w/2,h/2,0,$IB,"<6>",6$); + if (tT",7$); + + for (i=0;ih/2) { //Draw trees in front of house + if (trees[i].fire_frame_index) { + if (trees[i].fire_frame_index++&1) + img=$IB,"<4>",4$; + else + img=$IB,"<5>",5$; + } else + img=$IB,"<3>",3$; + SpritePlot3(dc,trees[i].x,trees[i].y,0,img); + } + } + + temps=step_root.next; + while (temps!=&step_root) { + if (tT-temps->t0<2.0) + dc->color=DKGRAY; + else + dc->color=LTGRAY; + dc->pen_width=2; + GrPlot3(dc,temps->x,temps->y,0); + temps=temps->next; + } + + dc->pen_width=1; + tempp=peasant_root.next; + while (tempp!=&peasant_root) { + GrIdentEqu(r); + GrRotYEqu(r,tempp->é+ã/2); + GrRotXEqu(r,ã/6); + if (tempp->stopped) + dc->color=LTCYAN; + else + dc->color=CYAN; + SpritePlotRotMat3b(dc,tempp->x,tempp->y,0,$IB,"<2>",2$,r); + tempp=tempp->next; + } + + dc->pen_width=1; + GrIdentEqu(r); + GrRotYEqu(r,king_é+ã/2); + GrRotXEqu(r,ã/6); + SpritePlotRotMat3b(dc,king_x,king_y,0,$IB,"<1>",1$,r); + + dc->pen_width=1; + dc->color=WHITE; + for (i=0;iwin_pixel_width, + (flakes[i].y+snow_y)%task->win_pixel_height); + + if (tf) { + dc->color=LTRED; + if (Blink) + GrPutS(dc,w/2-(FONT_WIDTH*14)/2,h/2+FONT_HEIGHT,"Game Completed"); + tt=tf; + } else { + tt=tT; + } + dc->color=LTBLUE; + GrPrintF(dc,0,0,"Freezing Peasants:%d Time:%3.2f Best:%3.2f", + not_stopped_cnt,tt-t0,best_score); + + Preempt(old_preempt); +} + +U0 StepNew(CTask *task,I64 x,I64 y,F64 é,Bool king) +{ + Step *temps; + + if (king) { + temps=MAlloc(sizeof(Step),task); + temps->x=x; + temps->y=y; + temps->t0=tT; + QueIns(temps,king_step_root.last); + } + + temps=MAlloc(sizeof(Step),task); + temps->x=x-3.5*Sin(é)+1.0*Cos(é); + temps->y=y+3.5*Cos(é)+1.0*Sin(é); + temps->t0=tT; + QueIns(temps,step_root.last); + + temps=MAlloc(sizeof(Step),task); + temps->x=x+3.5*Sin(é)-1.0*Cos(é); + temps->y=y-3.5*Cos(é)-1.0*Sin(é); + temps->t0=tT; + QueIns(temps,step_root.last); +} + +U0 Init() +{ + I64 i,min_x,max_x,min_y,max_y, + w=Fs->win_pixel_width,h=Fs->win_pixel_height; + Peasant *tempp; + snow_x=0; + snow_y=0; + for (i=0;i",3$,&min_x,&max_x,&min_y,&max_y); + for (i=0;i",1$,&min_x,&max_x,&min_y,&max_y); + QueInit(&peasant_root); + for (i=0;ix=RandU16%(w-2*BORDER-(max_x-min_x+1))+BORDER-min_x; + tempp->y=RandU16%(h-2*BORDER-(max_y-min_y+1))+BORDER-min_y; + tempp->é=ã*2*Rand; + tempp->door_opened_t0=0; + tempp->stopped=FALSE; + QueIns(tempp,peasant_root.last); + } + + king_x=w/2; + king_y=h/2; + king_é=-ã/2; + door_open_t0=0; + t0=tT; + tf=0; +} + +U0 CleanUp() +{ + QueDel(&peasant_root,TRUE); + QueDel(&step_root,TRUE); + QueDel(&king_step_root,TRUE); +} + +U0 Follow(CTask *,Peasant *tempp) +{ + Step *temps=king_step_root.next; + F64 d,best_d=MAX_F64; + while (temps!=&king_step_root) { + if ((d=Sqr(temps->x-tempp->x)+Sqr(temps->y-tempp->y)) && + d<15*15) { + d+=1000*Sqr(tT-temps->t0); + if (dé=Arg(temps->x-tempp->x,temps->y-tempp->y); + } + } + temps=temps->next; + } +} + +U0 AnimateTask(I64) +{//preempt off by default after Spawned + Step *temps,*temps1; + Peasant *tempp; + I64 i,animate_cnt=0,w,h; + while (TRUE) { + w=Fs->parent_task->win_pixel_width; + h=Fs->parent_task->win_pixel_height; + + temps=step_root.next; + while (temps!=&step_root) { + temps1=temps->next; + if (tT-temps->t0>4.0) { + QueRem(temps); + Free(temps); + } + temps=temps1; + } + + temps=king_step_root.next; + while (temps!=&king_step_root) { + temps1=temps->next; + if (tT-temps->t0>4.0) { + QueRem(temps); + Free(temps); + } + temps=temps1; + } + + not_stopped_cnt=0; + tempp=peasant_root.next; + while (tempp!=&peasant_root) { + if (tempp->stopped) { + if (tempp->door_opened_t0 && tT>tempp->door_opened_t0+1.0) { + tempp->door_opened_t0=0; + tempp->y=tempp->x=-9999; + } + } else { + if (Sqr(tempp->x-w/2)+Sqr(tempp->y-h/2)<20*20) { + tempp->stopped=TRUE; + tempp->door_opened_t0=door_open_t0=tT; + } + for (i=0;ix-trees[i].x)+Sqr(tempp->y-trees[i].y)<20*20) { + tempp->stopped=TRUE; + break; + } + if (!tempp->stopped) { + Follow(Fs->parent_task,tempp); + tempp->x+=Cos(tempp->é)/100; + tempp->y+=Sin(tempp->é)/100; + if (!(BORDER/2<=tempp->xyé+=ã; + tempp->x+=3*Cos(tempp->é)/100; + tempp->y+=3*Sin(tempp->é)/100; + } + if (!(animate_cnt&511)) + StepNew(Fs->parent_task,tempp->x,tempp->y,tempp->é,FALSE); + not_stopped_cnt++; + } + } + tempp=tempp->next; + } + if (!not_stopped_cnt && !tf) { + tf=tT; + music_mute=TRUE; + Snd(2000);Sleep(200);Snd(0);Sleep(100); + if (tf-t0task_end_cb=&SndTaskEndCB; + MusicSettingsRst; + music_tempo= 2.480; + music_stacatto_factor= 0.902; + while (TRUE) { + Play("3eCCCDCC2qG3eA2G3ABqCC"); + Play("eCCCDCC2qG3eA2G3ABqCC"); + Play("eGFEDEDqCeA2G3ABqCC"); + } +} + +U0 Wenceslas() +{ + I64 sc; + + MenuPush( + "File {" + " Abort(,CH_SHIFT_ESC);" + " Exit(,CH_ESC);" + "}" + "Play {" + " Restart(,'\n');" + " BurnTree(,CH_SPACE);" + " Up(,,SC_CURSOR_UP);" + " Down(,,SC_CURSOR_DOWN);" + " Left(,,SC_CURSOR_LEFT);" + " Right(,,SC_CURSOR_RIGHT);" + "}" + ); + + SettingsPush; //See $LK,"SettingsPush","MN:SettingsPush"$ + WinMax; + Preempt(OFF); + Fs->song_task=Spawn(&SongTask,NULL,"Song",,Fs); + + PopUpOk(" +Good King Wenceslas looked out +On the feast of Stephen +When the snow lay round about +Deep and crisp and even +Brightly shone the moon that night +Though the frost was cruel +When a poor man came in sight +Gath'ring winter fuel + +\"Hither, page, and stand by me +If thou know'st it, telling +Yonder peasant, who is he? +Where and what his dwelling?\" +\"Sire, he lives a good league hence +Underneath the mountain +Right against the forest fence +By Saint Agnes' fountain.\" + +\"Bring me flesh and bring me wine +Bring me pine logs hither +Thou and I will see him dine +When we bear him thither.\" +Page and monarch forth they went +Forth they went together +Through the rude wind's wild lament +And the bitter weather + +"); +PopUpOk(" +\"Sire, the night is darker now +And the wind blows stronger +Fails my heart, I know not how, +I can go no longer.\" +\"Mark my footsteps, my good page +Tread thou in them boldly +Thou shalt find the winter's rage +Freeze thy blood less coldly.\" + +In his master's steps he trod +Where the snow lay dinted +Heat was in the very sod +Which the Saint had printed +Therefore, Christian men, be sure +Wealth or rank possessing +Ye who now will bless the poor +Shall yourselves find blessing + +"); +PopUpOk(" +$$FG,PURPLE$$$$TX+CX,\"Winceslas Game\"$$$$FG$$ + +Start fires by pressing $$FG,GREEN$$$$FG$$ +on trees. (Yule logs) + +Lead peasants to fires. +"); + + Init; + Fs->animate_task=Spawn(&AnimateTask,NULL,"Animate",,Fs); + WordStat; + + DocCursor; + DocClear; + Fs->draw_it=&DrawIt; + try { + while (TRUE) { + switch (GetKey(&sc)) { + case '\n': + CleanUp; + Init; + break; + case CH_ESC: + case CH_SHIFT_ESC: + goto ws_done; + case CH_SPACE: + BurnTrees; + break; + case 0: + switch (sc.u8[0]) { + case SC_CURSOR_RIGHT: + if (king_x+KING_STEPwin_pixel_width-BORDER) + king_x+=KING_STEP; + king_é=0; + StepNew(Fs,king_x,king_y,king_é,TRUE); + break; + case SC_CURSOR_LEFT: + if (king_x-KING_STEP>=BORDER) + king_x-=KING_STEP; + king_é=ã; + StepNew(Fs,king_x,king_y,king_é,TRUE); + break; + case SC_CURSOR_DOWN: + if (king_y+KING_STEPwin_pixel_height-BORDER) + king_y+=KING_STEP; + king_é=-ã/2; + StepNew(Fs,king_x,king_y,king_é,TRUE); + break; + case SC_CURSOR_UP: + if (king_y-KING_STEP>=BORDER) + king_y-=KING_STEP; + king_é=ã/2; + StepNew(Fs,king_x,king_y,king_é,TRUE); + break; + } + } + } +ws_done: + } catch + CatchAll; + SettingsPop; + MenuPop; + CleanUp; + AcctRegWriteBranch("TempleOS/Wenceslas","F64 best_score=%5.4f;\n",best_score); +} + +Wenceslas; +yþÿÿÿÚÿÿÿÊÿÿÿþÿÿÿÚÿÿÿ äÿÿÿÖÿÿÿ +ÐÿÿÿúÿÿÿÖÿÿÿôÿÿÿìÿÿÿüÿÿÿØÿÿÿúÿÿÿðÿÿÿüÿÿÿðÿÿÿÖÿÿÿüÿÿÿÔÿÿÿòÿÿÿæÿÿÿÒÿÿÿöÿÿÿÂÿÿÿþÿÿÿÔÿÿÿòÿÿÿ¼ÿÿÿþÿÿÿÎÿÿÿ ¼ÿÿÿþÿÿÿÔÿÿÿÊÿÿÿþÿÿÿØÿÿÿäÿÿÿÚÿÿÿÀÿÿÿþÿÿÿÎÿÿÿ´ÿÿÿÊÿÿÿªÿÿÿ¶ÿÿÿøÿÿÿÈÿÿÿ²ÿÿÿ¬ÿÿÿÆÿÿÿ +¶ÿÿÿÌÿÿÿ ÌÿÿÿüÿÿÿÔÿÿÿèÿÿÿÚÿÿÿÖÿÿÿ* ðÿÿÿüÿÿÿðÿÿÿðÿÿÿèÿÿÿþÿÿÿòÿÿÿüÿÿÿæÿÿÿþÿÿÿæÿÿÿàÿÿÿþÿÿÿèÿÿÿüÿÿÿòÿÿÿæÿÿÿðÿÿÿþÿÿÿâÿÿÿàÿÿÿàÿÿÿÞÿÿÿÞÿÿÿâÿÿÿÞÿÿÿÞÿÿÿýÿÿÿäÿÿÿâÿÿÿþÿÿÿäÿÿÿüÿÿÿèÿÿÿüÿÿÿèÿÿÿüÿÿÿòÿÿÿäÿÿÿêÿÿÿæÿÿÿþÿÿÿîÿÿÿìÿÿÿòÿÿÿxþÿÿÿèÿÿÿüÿÿÿòÿÿÿðÿÿÿèÿÿÿðÿÿÿüÿÿÿðÿÿÿþÿÿÿòÿÿÿüÿÿÿæÿÿÿþÿÿÿæÿÿÿàÿÿÿæÿÿÿðÿÿÿãöÿÿÿðÿÿÿøÿÿÿ +ôÿÿÿðÿÿÿòÿÿÿîÿÿÿêÿÿÿ öÿÿÿæÿÿÿúÿÿÿæÿÿÿöÿÿÿèÿÿÿøÿÿÿæÿÿÿæÿÿÿøÿÿÿîÿÿÿþÿÿÿòÿÿÿ  þÿÿÿöÿÿÿôÿÿÿîÿÿÿðÿÿÿðÿÿÿþÿÿÿ üÿÿÿþÿÿÿäÿÿÿþÿÿÿäÿÿÿîÿÿÿäÿÿÿöÿÿÿöÿÿÿöÿÿÿðÿÿÿøÿÿÿüÿÿÿüÿÿÿðÿÿÿ +ðÿÿÿøÿÿÿúÿÿÿþÿÿÿúÿÿÿúÿÿÿðÿÿÿüÿÿÿúÿÿÿ +üÿÿÿüÿÿÿøÿÿÿúÿÿÿøÿÿÿúÿÿÿðÿÿÿòÿÿÿìÿÿÿôöÿÿÿðÿÿÿøÿÿÿ +ôÿÿÿðÿÿÿòÿÿÿîÿÿÿêÿÿÿ öÿÿÿæÿÿÿúÿÿÿæÿÿÿöÿÿÿèÿÿÿøÿÿÿæÿÿÿæÿÿÿøÿÿÿîÿÿÿþÿÿÿòÿÿÿ  þÿÿÿöÿÿÿôÿÿÿîÿÿÿäÿÿÿúÿÿÿâÿÿÿúÿÿÿèÿÿÿúÿÿÿöÿÿÿòÿÿÿîÿÿÿöÿÿÿúÿÿÿöÿÿÿøÿÿÿðÿÿÿöÿÿÿäÿÿÿôÿÿÿôÿÿÿüÿÿÿêÿÿÿþÿÿÿþÿÿÿüÿÿÿôÿÿÿ ôÿÿÿöÿÿÿòÿÿÿâÿÿÿþÿÿÿúÿÿÿöÿÿÿòÿÿÿüÿÿÿøÿÿÿðÿÿÿøÿÿÿ +ôÿÿÿ +üÿÿÿÒbŸžÎÿÿÿhÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ²-ôÿÿÿÔÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ \ No newline at end of file diff --git a/TempleOS/Demo/GameStarters/Whap.CPP b/TempleOS/Demo/Games/Whap.CPP similarity index 100% rename from TempleOS/Demo/GameStarters/Whap.CPP rename to TempleOS/Demo/Games/Whap.CPP diff --git a/TempleOS/Demo/GameStarters/Zing.CPP b/TempleOS/Demo/Games/Zing.CPP similarity index 98% rename from TempleOS/Demo/GameStarters/Zing.CPP rename to TempleOS/Demo/Games/Zing.CPP index 51be9988b606104d218af6050632bd9152ec5dbf..5a3e6e56ddce7575a8f94c6eb599905057029f4f 100644 GIT binary patch delta 12 TcmX@FdO>x=biU2g_$*lfB`^fj delta 12 TcmcbhdR}$IbiU0q_$*ieB{&4s diff --git a/TempleOS/Demo/Games/ZoneOut.CPP b/TempleOS/Demo/Games/ZoneOut.CPP new file mode 100644 index 0000000000000000000000000000000000000000..61b3d58affc246be6553f184025a7d8c33e81ded GIT binary patch literal 111905 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 - "$$CL$$Select ctrl points with left mouse. Right when finished.\n"; + DocClear; + "Select ctrl points with left mouse. Right when finished.\n"; DCFill; do { msg_code=GetMsg(&p1,&p2,1<state; - - dc->color=LTRED; - GrRect(dc, c->left,c->top,DAWG_SETTINGS_SPACING*4+3,DAWG_SETTINGS_SPACING*2+DAWG_SETTINGS_RANGE); - dc->color=BLUE; - GrRect(dc, c->left+DAWG_SETTINGS_BORDER,c->top+DAWG_SETTINGS_BORDER, - DAWG_SETTINGS_SPACING*4+3-2*DAWG_SETTINGS_BORDER,DAWG_SETTINGS_SPACING*2+DAWG_SETTINGS_RANGE-2*DAWG_SETTINGS_BORDER); - dc->color=BLACK; - GrLine(dc,c->left+DAWG_SETTINGS_SPACING,c->top+DAWG_SETTINGS_SPACING, - c->left+DAWG_SETTINGS_SPACING,c->top+DAWG_SETTINGS_SPACING+DAWG_SETTINGS_RANGE-1); - GrLine(dc,c->left+2*DAWG_SETTINGS_SPACING+1,c->top+DAWG_SETTINGS_SPACING, - c->left+2*DAWG_SETTINGS_SPACING+1,c->top+DAWG_SETTINGS_SPACING+DAWG_SETTINGS_RANGE-1); - GrLine(dc,c->left+3*DAWG_SETTINGS_SPACING+1,c->top+DAWG_SETTINGS_SPACING, - c->left+3*DAWG_SETTINGS_SPACING+1,c->top+DAWG_SETTINGS_SPACING+DAWG_SETTINGS_RANGE-1); - - dc->color=LTRED; - GrPrintF(dc,c->left+DAWG_SETTINGS_SPACING-FONT_WIDTH/2, - c->top+DAWG_SETTINGS_SPACING+DAWG_SETTINGS_RANGE+3, - "%d",s->cnt*10/DAWG_SETTINGS_RANGE); - GrPrintF(dc,c->left+2*DAWG_SETTINGS_SPACING+1-FONT_WIDTH/2, - c->top+DAWG_SETTINGS_SPACING+DAWG_SETTINGS_RANGE+3, - "%d",s->n2_amp*10/DAWG_SETTINGS_RANGE); - GrPrintF(dc,c->left+3*DAWG_SETTINGS_SPACING+2-FONT_WIDTH/2, - c->top+DAWG_SETTINGS_SPACING+DAWG_SETTINGS_RANGE+3, - "%d",s->color_scale*10/DAWG_SETTINGS_RANGE); - GrRect(dc,c->left+DAWG_SETTINGS_SPACING-3, c->top+DAWG_SETTINGS_SPACING+DAWG_SETTINGS_RANGE-1-s->cnt-2 ,7,5); - GrRect(dc,c->left+2*DAWG_SETTINGS_SPACING+1-3,c->top+DAWG_SETTINGS_SPACING+DAWG_SETTINGS_RANGE-1-s->n2_amp-2,7,5); - GrRect(dc,c->left+3*DAWG_SETTINGS_SPACING+2-3,c->top+DAWG_SETTINGS_SPACING+DAWG_SETTINGS_RANGE-1-s->color_scale-2,7,5); - dc->color=YELLOW; - GrRect(dc,c->left+DAWG_SETTINGS_SPACING-2, c->top+DAWG_SETTINGS_SPACING+DAWG_SETTINGS_RANGE-1-s->cnt-1 ,5,3); - GrRect(dc,c->left+2*DAWG_SETTINGS_SPACING+1-2,c->top+DAWG_SETTINGS_SPACING+DAWG_SETTINGS_RANGE-1-s->n2_amp-1,5,3); - GrRect(dc,c->left+3*DAWG_SETTINGS_SPACING+2-2,c->top+DAWG_SETTINGS_SPACING+DAWG_SETTINGS_RANGE-1-s->color_scale-1,5,3); -} - -U0 UpdateDerivedDawgSettingsCtrl(CCtrl *c) -{ - DawgSettingsState *s=c->state; - c->left=c->win_task->win_pixel_width-(DAWG_SETTINGS_SPACING*4+3); - c->right=c->left+DAWG_SETTINGS_SPACING*4+3; - c->top=c->win_task->win_pixel_height-(DAWG_SETTINGS_SPACING*2+DAWG_SETTINGS_RANGE); - c->bottom=c->top+DAWG_SETTINGS_SPACING*2+DAWG_SETTINGS_RANGE; - s->cnt =LimitI64(s->cnt,0,DAWG_SETTINGS_RANGE-1); - s->n2_amp=LimitI64(s->n2_amp,0,DAWG_SETTINGS_RANGE-1); - s->color_scale=LimitI64(s->color_scale,0,DAWG_SETTINGS_RANGE-1); -} - -U0 LeftClickDawgSettings(CCtrl *c,I64 x,I64 y,Bool down) -{ - DawgSettingsState *s=c->state; - if (xleft+(c->right-c->left)/3) - s->cnt=DAWG_SETTINGS_RANGE-1-(y-(c->top+DAWG_SETTINGS_SPACING)); - else if (xleft+2*(c->right-c->left)/3) - s->n2_amp=DAWG_SETTINGS_RANGE-1-(y-(c->top+DAWG_SETTINGS_SPACING)); - else - s->color_scale=DAWG_SETTINGS_RANGE-1-(y-(c->top+DAWG_SETTINGS_SPACING)); - if (c->update_derived_vals) - (*c->update_derived_vals)(c); - if (!down) chged=TRUE; -} - -CCtrl *DawgSettingsNew() -{ - Bool old_preempt; - CCtrl *c=CAlloc(sizeof(CCtrl)); - c->win_task=Fs; - c->flags=CTRLF_SHOW|CTRLF_CAPTURE_LEFT_IP; - c->type=CTRLT_GENERIC; -// c->state=CAlloc(sizeof(DawgSettingsState)); - c->state=&glbl_state; - glbl_state.cnt=DAWG_SETTINGS_RANGE/2; - glbl_state.n2_amp=DAWG_SETTINGS_RANGE/2; - glbl_state.color_scale=DAWG_SETTINGS_RANGE/2; - c->draw_it=&DrawDawgSettingsCtrl; - c->left_click=&LeftClickDawgSettings; - c->update_derived_vals=&UpdateDerivedDawgSettingsCtrl; - old_preempt=Preempt(OFF); - QueIns(c,Fs->last_ctrl); - TaskDerivedValsUpdate; - Preempt(old_preempt); - return c; -} - -U0 DawgSettingsDel(CCtrl *c) -{ - Bool old_preempt=Preempt(OFF); - QueRem(c); - Preempt(old_preempt); -// Free(c->state); - Free(c); -} - - - -//This program does a fractel-like thing with -//integer arithmetic. - -class Simplex //This is something I made-up. It's not standard math. -{ - I64 x,y; -}; - -I64 Norm(Simplex *n1) -{ - return AbsI64(n1->x)+AbsI64(n1->y); -} - -Simplex *CopySimplex(Simplex *dst, Simplex *src) -{ - MemCpy(dst,src,sizeof(Simplex)); - return dst; -} - - -Simplex *Mix(Simplex *result,Simplex *n1,Simplex *n2) -{ //This is something I made-up. It's not standard math. - result->x=n1->x*n2->x; - result->y=n1->y*n2->y; - return result; -} - -Simplex *Mangle(Simplex *result,Simplex *n1,Simplex *n2) -{ //This is something I made-up. It's not standard math. - result->x=n1->x*n2->y; - result->y=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; -} - - -U0 Bling() -{ - I64 ch; - I64 x,y,cnt; - I64 d; - F64 color,color_scale; - Simplex n1,n2,n3,n4,n5,n6,n7,n8; - F64 timeout_time; - CCtrl *c=DawgSettingsNew; - CDC *dc=DCAlias; - F64 e=Exp(1); - - SettingsPush; //See $LK,"SettingsPush","MN:SettingsPush"$ - DocCursor; - DocClear; - Fs->win_inhibit=WIF_ALL-WIF_BORDER-WIF_CTRLS; - - chged=FALSE; - WordStat; - WinMax; - while (TRUE) { -next_dotel: - ch=0; - cnt =2e9*(RandU32+0x1000)/MAX_U32*((Exp(ToF64(glbl_state.cnt +10)/DAWG_SETTINGS_RANGE)-1)/e); - n2.x=2e9*Sign(RandI32)*(RandU32+0x1000)/MAX_U32*((Exp(ToF64(glbl_state.n2_amp)/DAWG_SETTINGS_RANGE)-1)/e); - n2.y=2e9*Sign(RandI32)*(RandU32+0x1000)/MAX_U32*((Exp(ToF64(glbl_state.n2_amp)/DAWG_SETTINGS_RANGE)-1)/e); - n8.x=RandI32; - n8.y=RandI32; - color_scale=4.0*(glbl_state.color_scale+1.0)/DAWG_SETTINGS_RANGE+0.5; - timeout_time=tT+0.1; - for (y=0;ytimeout_time) - goto next_dotel; - if (ScanKey(&ch)) - goto next_dotel; - for (x=0;xtimeout_time) - goto next_dotel; - - n1.x=x; n1.y=y; - CopySimplex(&n3,&n1); - - color=0; - d=Norm(&n3); - -//This doesn't make mathematical sense, but it makes nice results. - while (d.u32[0]timeout_time) - goto next_dotel; - Mangle(&n7,Mix(&n4,&n3,&n1), - Add(&n5,&n3,&n2)); - color++; - d=Norm(Add(&n3,&n7,Mangle(&n6,&n3,&n8))); - } - color-=(cnt-d.u32[0])/cnt; - dc->color=ROP_EQU+ - color=gr_rainbow_10[LimitI64(color_scale*(Ln(color)),0,9)]; - GrPlot(dc,x,y); - } - } - dc->color=COLOR_TRANSPARENT; - GrRect(dc,c->left,c->top,c->right-c->left,c->bottom-c->top); - while (TRUE) { - if (chged) { - chged=FALSE; - break; - } - if (ch=ScanChar) - if (ch==CH_SPACE||ch=='\n') - break; - else - goto bling_done; - WinMgrSync; - } - } -bling_done: - SettingsPop; - DCDel(dc); - DCFill; - DawgSettingsDel(c); -} - -Bling; //Start when included diff --git a/TempleOS/Demo/Graphics/Blot.CPP b/TempleOS/Demo/Graphics/Blot.CPP index eb7cc49..414c8b4 100644 --- a/TempleOS/Demo/Graphics/Blot.CPP +++ b/TempleOS/Demo/Graphics/Blot.CPP @@ -9,7 +9,7 @@ GrFloodFill3(img1,30,30,0,TRUE); GrLine3(img1,60,0,0,0,60,0); DCFill(img2); -img2->color=ROP_EQU+RED; +img2->color=RED; img2->brush=img1; GrCircle(img2,256-30,256-30,128,67); img2->color=BLUE; diff --git a/TempleOS/Demo/Graphics/Box.CPP b/TempleOS/Demo/Graphics/Box.CPP index edabf95..f82937c 100644 --- a/TempleOS/Demo/Graphics/Box.CPP +++ b/TempleOS/Demo/Graphics/Box.CPP @@ -21,7 +21,7 @@ U0 DrawIt(CTask *,CDC *) U0 Box() { F64 é=0,è=0,ê=0,s=1,s1=1.05; - dc=DCAlias(gr_dc,Fs); + dc=DCAlias(gr_dc2,Fs); SettingsPush; //See $LK,"SettingsPush","MN:SettingsPush"$ DocClear; @@ -41,9 +41,9 @@ U0 Box() Sleep(20); é+=2*ã/70; - è +=2*ã/90; - ê +=2*ã/110; - s *=s1; + è+=2*ã/90; + ê+=2*ã/110; + s*=s1; if ( !(0.2win_pixel_width/(NUM_DATA_PTS-1); - x2=i*task->win_pixel_width/(NUM_DATA_PTS-1); - for (j=0;jcolor=gr_rainbow_10[j]; - y1=task->win_pixel_height*CPU_idle[j][i-1]; - y2=task->win_pixel_height*CPU_idle[j][i]; - GrLine(dc,x1,y1,x2,y2); - } - dc->color=LTCYAN; - y1=task->win_pixel_height*mem[i-1]; - y2=task->win_pixel_height*mem[i]; - GrLine(dc,x1,y1,x2,y2); - - dc->color=LTPURPLE; - y1=task->win_pixel_height*refresh[i-1]; - y2=task->win_pixel_height*refresh[i]; - GrLine(dc,x1,y1,x2,y2); - } - for (j=0;jwin_height-4-j); - } - PlotWinStr(task,"Mem %",LTCYAN+WHITE<<4,0,task->win_height-3); - PlotWinStr(task,"Refresh Hz",LTPURPLE+WHITE<<4,0,task->win_height-2); -} - -U0 CPUPlot() -{ - I64 cur_pt=0,j; - MemSet(CPU_idle,0,sizeof(CPU_idle)); - MemSet(mem,0,sizeof(F64)*NUM_DATA_PTS); - MemSet(refresh,0,sizeof(F64)*NUM_DATA_PTS); - - SettingsPush; //See $LK,"SettingsPush","MN:SettingsPush"$ - DocCursor; - DocClear; - Fs->draw_it=&DrawIt; - - while (!ScanChar) { - for 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 H3?u*mjOc=m delta 331 zcmX@!z_xW06}-rQj&G;lJj%&i)?*DoFg6mthp2v+>3%zlS?#Gl64Gp40J%+bnVJB^WqCK zD^hdf%QI6-GIT06C)aVQI2apgIXn6W#D{yjgm~x}=;#`nAq(J_*0koD%*QRic@tMV zQ*26pUTS<=PGWkotpUgpY57G88kx3+)|ocB1@XywCDxhR+L~Mn3JMCo0bcn@8fv}) zE=7suzNx7tnR)48XX<2Xg0!MYXn@>5xsP|HIKl=+TSFVDsk(-nUHPKeC!ZAco-8W% KX0wPmuM+?nb!##J diff --git a/TempleOS/Demo/Graphics/CaptureScreen.CPP b/TempleOS/Demo/Graphics/CaptureScreen.CPP index e4306b6..079a1b0 100644 --- a/TempleOS/Demo/Graphics/CaptureScreen.CPP +++ b/TempleOS/Demo/Graphics/CaptureScreen.CPP @@ -1,8 +1,8 @@ -//See $LK-A,"::/TempleOS/Demo/GameStarters/Stadium/StadiumGen.CPP"$. +//See $LK-A,"::/TempleOS/Demo/Games/Stadium/StadiumGen.CPP"$. U0 ViewScreenCapture(U8 *filename) { - CDC *dc=DCAlias(gr_dc2,Fs), + CDC *dc=DCAlias(gr_dc,Fs), *dc2=GRARead(filename); GrBlot(dc,0,0,dc2); DCDel(dc2); diff --git a/TempleOS/Demo/Graphics/CharGraphics.CPP b/TempleOS/Demo/Graphics/CharGraphics.CPP index 4da31c7..3dfa6c6 100644 --- a/TempleOS/Demo/Graphics/CharGraphics.CPP +++ b/TempleOS/Demo/Graphics/CharGraphics.CPP @@ -31,5 +31,5 @@ U0 AnimateTask(I64) } -Spawn(&AnimateTask,NULL,"Animate",Fs); +Spawn(&AnimateTask,NULL,"Animate",,Fs); TaskRep; diff --git a/TempleOS/Demo/Graphics/Circuit.CPP b/TempleOS/Demo/Graphics/Circuit.CPP deleted file mode 100644 index 46345cf..0000000 --- a/TempleOS/Demo/Graphics/Circuit.CPP +++ /dev/null @@ -1,1191 +0,0 @@ - -$SP,"<1>",1$ - -$SP,"<2>",2$ - -$SP,"<3>",3$ - -$SP,"<4>",4$ - -$SP,"<5>",5$ - -$SP,"<6>",6$ - -#define A_EAST 0 -#define A_NORTH 1 -#define A_WEST 2 -#define A_SOUTH 3 - -U0 OrthRot(I64 *_x,I64 *_y,I64 é) -{ - nobound_switch (é&3) { - case A_EAST: - break; - case A_NORTH: - *_y=-*_y; - SwapU64(_x,_y); - break; - case A_WEST: - *_x=-*_x; - *_y=-*_y; - break; - case A_SOUTH: - *_x=-*_x; - SwapU64(_x,_y); - break; - } -} - -#define MAX_TERMINALS 6 - -#define ET_R 0 -#define ET_L 1 -#define ET_C 2 -#define ET_NUM_TYPES 3 - -class ElementType -{ - U8 *black_img,*red_img; - I64 terminals; - CD2I64 term[MAX_TERMINALS]; - I64 min_x,max_x,min_y,max_y; -}; - -ElementType et[ET_NUM_TYPES] = -{ - {$IB,"<1>",1$,$IB,"<2>",2$,2,{{-12,1},{13,1},{0,0},{0,0},{0,0},{0,0}},0,0,0,0}, - {$IB,"<3>",3$,$IB,"<4>",4$,2,{{-14,0},{15,0},{0,0},{0,0},{0,0},{0,0}},0,0,0,0}, - {$IB,"<5>",5$,$IB,"<6>",6$,2,{{-4 ,0},{6 ,0},{0,0},{0,0},{0,0},{0,0}},0,0,0,0}, -}; - -extern class Element; -class Terminal -{ - Element *e; - I64 terminal; -}; - - -#define Df_PROCESSED 0 -#define Df_JUNCTION 1 -#define Df_TERMINAL 2 -#define Df_TERMINAL_LEFT 3 -#define Df_TERMINAL_RIGHT 4 -#define Df_TERMINAL_TOP 5 -#define Df_TERMINAL_BOTTOM 6 - -class Dot //These are points on a node -{ - Dot *next,*last; - I64 x,y,saved_x,saved_y; - Element *e; - U16 flags[4]; - Dot *left,*right,*top,*bottom; -}; - -class Node -{ - Node *next,*last; - I64 cnt; - Terminal *terms; - Dot *dot_root; -} node_root; - -class Element -{ - Element *next,*last; - ElementType *type; - I64 x,y,é,min_x,max_x,min_y,max_y; - Node *nodes[MAX_TERMINALS]; -} el_root; - - -#define MD_CONNECT 0 -#define MD_MOVE 1 -#define MD_NUM_MODES 2 -I64 mode; - -Element *rubber_band; -I64 rubber_band_terminal,rubber_band_x,rubber_band_y; - -U0 DotDel(Dot *root) -{ - if (root) { - QueDel(root,TRUE); - Free(root); - } -} - -U0 DotRst(Dot *root) -{ - Dot *tempd; - if (root) { - Bts(root->flags,Df_PROCESSED); - tempd=root->next; - while (tempd!=root) { - Btr(tempd->flags,Df_PROCESSED); - tempd=tempd->next; - } - } -} - -#define DIR_LT 0 -#define DIR_CT 1 -#define DIR_RT 2 -#define DIR_LC 3 -#define DIR_CC 4 -#define DIR_RC 5 -#define DIR_LB 6 -#define DIR_CB 7 -#define DIR_RB 8 - -I64 ElementSqrDist(Element *tempe,I64 x,I64 y) -{ - I64 i,dx,dy; - if (xmin_x) - i=0; - else if (x<=tempe->max_x) - i=1; - else - i=2; - if (y>=tempe->min_y) { - if (y<=tempe->max_y) - i+=3; - else - i+=6; - } - switch (i) { - case DIR_LT: - dx=tempe->min_x-x; - dy=tempe->min_y-y; - break; - case DIR_CT: - dx=0; - dy=tempe->min_y-y; - break; - case DIR_RT: - dx=x-tempe->max_x; - dy=tempe->min_y-y; - break; - case DIR_LC: - dx=tempe->min_x-x; - dy=0; - break; - case DIR_CC: - dx=0; - dy=0; - break; - case DIR_RC: - dx=x-tempe->max_x; - dy=0; - break; - case DIR_LB: - dx=tempe->min_x-x; - dy=y-tempe->max_y; - break; - case DIR_CB: - dx=0; - dy=y-tempe->max_y; - break; - case DIR_RB: - dx=x-tempe->max_x; - dy=y-tempe->max_y; - break; - } - return SqrI64(dx)+SqrI64(dy); -} - -#define SPACING 10 - -F64 DotNetScore(Dot *root) -{ //higher is better - F64 d,distdist1=0.1,distdist2=0.1,num=1.0,den=0.1; - I64 dx,dy,nonzero_cnt=1; - Element *tempe; - Dot *tempd,*tempd1; - if (root) { - tempd=root->next; - while (tempd!=root) { - - //Calculate clearance from elements like parallel resistors - tempe=el_root.next; - while (tempe!=&el_root) { - if (tempd->e!=tempe) { - d=Sqrt(ElementSqrDist(tempe,tempd->x,tempd->y))+0.1; - if (d>SPACING) d=SPACING; - num*=d; - den+=d; - } - tempe=tempe->next; - } - - //Calculate clearance from junctions like parallel resistors - if (Bt(tempd->flags,Df_TERMINAL)) { - tempd1=root->next; - while (tempd1!=root) { - if (tempd1!=tempd && Bt(tempd1->flags,Df_JUNCTION)) { - d=Sqrt(SqrI64(tempd->x-tempd1->x)+SqrI64(tempd->y-tempd1->y))+0.1; - if (d>SPACING) d=SPACING; - num*=d; - den+=d; - } - tempd1=tempd1->next; - } - } - - if (tempd1=tempd->left) { - dx=SqrI64(tempd->x-tempd1->x); - dy=SqrI64(tempd->y-tempd1->y); - if (d=dx+dy) { - distdist1+=d; - nonzero_cnt++; - } - distdist2+=dy; - } - if (tempd1=tempd->right) { - dx=SqrI64(tempd->x-tempd1->x); - dy=SqrI64(tempd->y-tempd1->y); - if (d=dx+dy) { - distdist1+=d; - nonzero_cnt++; - } - distdist2+=dy; - } - if (tempd1=tempd->top) { - dx=SqrI64(tempd->x-tempd1->x); - dy=SqrI64(tempd->y-tempd1->y); - if (d=dx+dy) { - distdist1+=d; - nonzero_cnt++; - } - distdist2+=dx; - } - if (tempd1=tempd->bottom) { - dx=SqrI64(tempd->x-tempd1->x); - dy=SqrI64(tempd->y-tempd1->y); - if (d=dx+dy) { - distdist1+=d; - nonzero_cnt++; - } - distdist2+=dx; - } - tempd=tempd->next; - } - } - return num/(nonzero_cnt*nonzero_cnt*nonzero_cnt*distdist1*distdist2); -} - -Bool NodeAdd(Node *tempn,Element *tempe,I64 terminal,CTask *mem_task=NULL) -{ - I64 i; - Terminal *a; - for (i=0;icnt;i++) - if (tempn->terms[i].e==tempe&&tempn->terms[i].terminal==terminal) - return TRUE; - a=MAlloc((tempn->cnt+1)*sizeof(Terminal),mem_task); - if (tempn->terms) { - MemCpy(a,tempn->terms,tempn->cnt*sizeof(Terminal)); - Free(tempn->terms); - } - tempn->terms=a; - i=tempn->cnt++; - tempn->terms[i].e=tempe; - tempn->terms[i].terminal=terminal; - return FALSE; -} - -U0 NodeDel(Node *tempn) -{ - if (tempn) { - QueRem(tempn); - Free(tempn->terms); - if (tempn->dot_root) - DotDel(tempn->dot_root); - Free(tempn); - } -} - -extern Dot *DotNew(Node *tempn,CTask *mem_task=NULL); - -U0 NodeReroute(Node *tempn=NULL,CTask *mem_task=NULL) -{ - if (tempn) { - DotDel(tempn->dot_root); - tempn->dot_root=DotNew(tempn,mem_task); - } else { - tempn=node_root.next; - while (tempn!=&node_root) { - DotDel(tempn->dot_root); - tempn->dot_root=DotNew(tempn,mem_task); - tempn=tempn->next; - } - } -} - -U0 ElementExtents(Element *tempe) -{ - ElementType *tempt=tempe->type; - I64 x,y; - x=tempt->min_x; y=tempt->min_y; - OrthRot(&x,&y,tempe->é); - x+=tempe->x; y+=tempe->y; - tempe->min_x=tempe->max_x=x; - tempe->min_y=tempe->max_y=y; - x=tempt->max_x; y=tempt->max_y; - OrthRot(&x,&y,tempe->é); - x+=tempe->x; y+=tempe->y; - if (xmin_x) tempe->min_x=x; - if (x>tempe->max_x) tempe->max_x=x; - if (ymin_y) tempe->min_y=y; - if (y>tempe->max_y) tempe->max_y=y; - if (tempe==rubber_band) { - tempe->min_x+=ipx-rubber_band_x; - tempe->max_x+=ipx-rubber_band_x; - tempe->min_y+=ipy-rubber_band_y; - tempe->max_y+=ipy-rubber_band_y; - } -} - -U0 ElementReroute(Element *tempe,CTask *mem_task=NULL) -{ - I64 i; - ElementType *tempt; - if (tempe) { - tempt=tempe->type; - for (i=0;iterminals;i++) - if (tempe->nodes[i]) - NodeReroute(tempe->nodes[i],mem_task); - } -} - -U0 ElementDel(Element *tempe,CTask *mem_task=NULL) -{ - I64 i,cnt; - Terminal *src,*dst; - Node *tempn=node_root.next,*tempn1; - while (tempn!=&node_root) { - tempn1=tempn->next; - cnt=0; - dst=src=tempn->terms; - for (i=0;icnt;i++) { - if (src->e!=tempe) { - if (dst!=src) - MemCpy(dst,src,sizeof(Terminal)); - cnt++; - dst++; - } - src++; - } - if (tempn->cnt!=cnt) { - tempn->cnt=cnt; - if (!cnt) - NodeDel(tempn); - else if (cnt==1) { - tempn->terms[0].e->nodes[tempn->terms[0].terminal]=NULL; - NodeDel(tempn); - } else { - DotDel(tempn->dot_root); - tempn->dot_root=NULL; - NodeReroute(tempn,mem_task); - } - } - tempn=tempn1; - } - QueRem(tempe); - Free(tempe); -} - -Node *NodeNew(CTask *mem_task=NULL) -{ - Node *result=CAlloc(sizeof(Node),mem_task); - QueIns(result,node_root.last); - return result; -} - -Node *NodeCat(Node *dst,Node *src,CTask *mem_task=NULL) -{ - I64 i; - if (!dst) dst=NodeNew(mem_task); - if (src && dst!=src) { - for (i=0;icnt;i++) { - NodeAdd(dst,src->terms[i].e,src->terms[i].terminal,mem_task); - src->terms[i].e->nodes[src->terms[i].terminal]=dst; - } - NodeDel(src); - } - return dst; -} - -U0 TerminalXY(Element *tempe,I64 terminal,I64 *_x,I64 *_y) -{ - ElementType *tempt=tempe->type; - I64 x=tempt->term[terminal].x,y=tempt->term[terminal].y; - OrthRot(&x,&y,tempe->é); - if (_x) - *_x=tempe->x+x; - if (_y) - *_y=tempe->y+y; -} - -#define CT_NONE 0 -#define CT_LEFT 1 -#define CT_RIGHT 2 -#define CT_TOP 3 -#define CT_BOTTOM 4 - -I64 DotHVDecideConnect(Dot *tempd,Dot *tempd1) -{ - I64 d; - d=tempd->x-tempd1->x; - if (d<0) { - if (!tempd->right && !tempd1->left || - tempd->right==tempd1 && tempd1->left==tempd) - return CT_RIGHT; - } else if (d>0) { - if (!tempd->left && !tempd1->right || - tempd->left==tempd1 && tempd1->right==tempd) - return CT_LEFT; - } - d=tempd->y-tempd1->y; - if (d<0) { - if (!tempd->bottom && !tempd1->top || - tempd->bottom==tempd1 && tempd1->top==tempd) - return CT_BOTTOM; - } else if (d>0) { - if (!tempd->top && !tempd1->bottom || - tempd->top==tempd1 && tempd->bottom==tempd) - return CT_TOP; - } - return CT_NONE; -} - -Bool DotHVConnect(Dot *tempd,Dot *tempd1) -{ - switch (DotHVDecideConnect(tempd,tempd1)) { - case CT_RIGHT: - tempd ->right=tempd1; - tempd1->left =tempd; - return TRUE; - case CT_LEFT: - tempd ->left =tempd1; - tempd1->right=tempd; - return TRUE; - case CT_BOTTOM: - tempd ->bottom=tempd1; - tempd1->top =tempd; - return TRUE; - case CT_TOP: - tempd ->top =tempd1; - tempd1->bottom=tempd; - return TRUE; - default: - return FALSE; - } -} - -Dot *DotHVInterconnect(Dot *tempd,Dot *tempd1,CTask *mem_task=NULL) -{ - I64 type; - Dot *result=CAlloc(sizeof(Dot),mem_task); - if (Bt(tempd ->flags,Df_TERMINAL_LEFT)|| - Bt(tempd ->flags,Df_TERMINAL_RIGHT)) { //d horizontal - type=0; - if (Bt(tempd1->flags,Df_TERMINAL_TOP)|| - Bt(tempd1->flags,Df_TERMINAL_BOTTOM)) {//d1 vertical - if (tempd->yy && Bt(tempd1->flags,Df_TERMINAL_TOP)|| - tempd->y>tempd1->y && Bt(tempd1->flags,Df_TERMINAL_BOTTOM)) - type=1; - } else { - if (tempd->x>tempd1->x && Bt(tempd1->flags,Df_TERMINAL_LEFT)|| - tempd->xx && Bt(tempd1->flags,Df_TERMINAL_RIGHT)) - type=1; - } - } else { //d vertical - type=1; - if (Bt(tempd1->flags,Df_TERMINAL_LEFT)|| - Bt(tempd1->flags,Df_TERMINAL_RIGHT)) { //d1 horizontal - if (tempd->xx && Bt(tempd1->flags,Df_TERMINAL_LEFT)|| - tempd->x>tempd1->x && Bt(tempd1->flags,Df_TERMINAL_RIGHT)) - type=0; - } else { - if (tempd->y>tempd1->y && Bt(tempd1->flags,Df_TERMINAL_TOP)|| - tempd->yy && Bt(tempd1->flags,Df_TERMINAL_BOTTOM)) - type=0; - } - } - if (type==1) { - result->x=tempd1->x; - result->y=tempd ->y; - } else { - result->x=tempd ->x; - result->y=tempd1->y; - } - return result; -} - -Dot *DotNearest(Dot *root,Dot *tempd,Bool just_processed) -{ - I64 best_dd=MAX_I64,dx,dy,dd; - Dot *result=NULL,*tempd1,*tempd2; - if (root && tempd) { - tempd1=root->next; - while (tempd1!=root) { - if (tempd1!=tempd && (!just_processed||Bt(tempd1->flags,Df_PROCESSED))) { - dx=tempd->x-tempd1->x; - dy=tempd->y-tempd1->y; - dd=SqrI64(dx)+SqrI64(dy); - if (0next; - } - } - return result; -} - -Bool DotMarkConnected(Dot *tempd) -{ - if (tempd && !Bts(tempd->flags,Df_PROCESSED)) { - DotMarkConnected(tempd->left); - DotMarkConnected(tempd->right); - DotMarkConnected(tempd->top); - DotMarkConnected(tempd->bottom); - return TRUE; - } else - return FALSE; -} - -U0 DotSpacersAdd(Dot *root,CTask *mem_task=NULL) -{ - Dot *tempd,*tempd1,*tempd2; - if (root) { - tempd=root->next; - if (tempd!=root) { - tempd2=root->last; - do { - if (Bt(tempd->flags,Df_TERMINAL)) { - tempd1=CAlloc(sizeof(Dot),mem_task); - tempd1->x=tempd->x; - tempd1->y=tempd->y; - tempd1->flags[0]=tempd->flags[0]; - tempd1->e=tempd->e; - if (Bt(tempd->flags,Df_TERMINAL_LEFT)) { - tempd->right=tempd1; - tempd1->left=tempd; - tempd->x--; - } - if (Bt(tempd->flags,Df_TERMINAL_RIGHT)) { - tempd->left=tempd1; - tempd1->right=tempd; - tempd->x++; - } - if (Bt(tempd->flags,Df_TERMINAL_TOP)) { - tempd->bottom=tempd1; - tempd1->top=tempd; - tempd->y--; - } - if (Bt(tempd->flags,Df_TERMINAL_BOTTOM)) { - tempd->top=tempd1; - tempd1->bottom=tempd; - tempd->y++; - } - tempd->flags[0]=0; - tempd->e=NULL; - QueIns(tempd1,root->last); - } - tempd=tempd->next; - } while (tempd!=tempd2); - } - } -} - -U0 DotAddSpace(Dot *root) -{ - F64 score,best_score; - I64 i,x,y,best_x,best_y; - Dot *tempd,*tempd1; - if (root) { - tempd=root->next; - while (tempd!=root) { - tempd->saved_x=tempd->x; - tempd->saved_y=tempd->y; - tempd=tempd->next; - } - best_score=DotNetScore(root); - tempd=root->next; - while (tempd!=root) { - if (!Bt(tempd->flags,Df_TERMINAL)) { - best_x=0; - best_y=0; - for (i=0;i<4*SPACING;i++) { - nobound_switch (i&3) { - case A_EAST: x= i>>2; y=0; break; - case A_NORTH: y= i>>2; x=0; break; - case A_WEST: x=-i>>2; y=0; break; - case A_SOUTH: y=-i>>2; x=0; break; - } - tempd->x=tempd->saved_x+x; - tempd1=tempd->top; - while (tempd1 && !Bt(tempd1->flags,Df_TERMINAL)) { - tempd1->x=tempd1->saved_x+x; - tempd1=tempd1->top; - } - tempd1=tempd->bottom; - while (tempd1 && !Bt(tempd1->flags,Df_TERMINAL)) { - tempd1->x=tempd1->saved_x+x; - tempd1=tempd1->bottom; - } - tempd->y=tempd->saved_y+y; - tempd1=tempd->left; - while (tempd1 && !Bt(tempd1->flags,Df_TERMINAL)) { - tempd1->y=tempd1->saved_y+y; - tempd1=tempd1->left; - } - tempd1=tempd->right; - while (tempd1 && !Bt(tempd1->flags,Df_TERMINAL)) { - tempd1->y=tempd1->saved_y+y; - tempd1=tempd1->right; - } - score=DotNetScore(root); - if (score>best_score) { - best_score=score; - best_x=x; - best_y=y; - } - } - tempd->saved_x=tempd->x=tempd->saved_x+best_x; - tempd1=tempd->top; - while (tempd1 && !Bt(tempd1->flags,Df_TERMINAL)) { - tempd1->saved_x=tempd1->x=tempd1->saved_x+best_x; - tempd1=tempd1->top; - } - tempd1=tempd->bottom; - while (tempd1 && !Bt(tempd1->flags,Df_TERMINAL)) { - tempd1->saved_x=tempd1->x=tempd1->saved_x+best_x; - tempd1=tempd1->bottom; - } - tempd->saved_y=tempd->y=tempd->saved_y+best_y; - tempd1=tempd->left; - while (tempd1 && !Bt(tempd1->flags,Df_TERMINAL)) { - tempd1->saved_y=tempd1->y=tempd1->saved_y+best_y; - tempd1=tempd1->left; - } - tempd1=tempd->right; - while (tempd1 && !Bt(tempd1->flags,Df_TERMINAL)) { - tempd1->saved_y=tempd1->y=tempd1->saved_y+best_y; - tempd1=tempd1->right; - } - } - tempd=tempd->next; - } - } -} - -U0 DotJunctions(Dot *root) -{ - I64 cnt; - Dot *tempd; - tempd=root->next; - while (tempd!=root) { - if (Bt(tempd->flags,Df_TERMINAL)) - cnt=1; - else - cnt=0; - if (tempd->left) cnt++; - if (tempd->right) cnt++; - if (tempd->top) cnt++; - if (tempd->bottom) cnt++; - BEqu(tempd->flags,Df_JUNCTION,cnt>2); - tempd=tempd->next; - } -} - -Dot *DotTerminalsNew(Node *tempn,CTask *mem_task=NULL) -{ - I64 i,min_x,max_x,min_y,max_y,dx,dy,x,y; - Element *tempe; - Dot *result=CAlloc(sizeof(Dot),mem_task),*tempd; - QueInit(result); - for (i=0;icnt;i++) - if (tempe=tempn->terms[i].e) { - tempd=CAlloc(sizeof(Dot),mem_task); - Bts(tempd->flags,Df_TERMINAL); - tempd->e=tempe; - TerminalXY(tempe,tempn->terms[i].terminal,&tempd->x,&tempd->y); - x=tempe->x; - y=tempe->y; - if (mode==MD_MOVE && tempe==rubber_band) { - tempd->x+=ipx-rubber_band_x; - tempd->y+=ipy-rubber_band_y; - x+=ipx-rubber_band_x; - y+=ipy-rubber_band_y; - } - - min_x=AbsI64(tempd->x-tempe->min_x); - max_x=AbsI64(tempd->x-tempe->max_x); - if (min_xy-tempe->min_y); - max_y=AbsI64(tempd->y-tempe->max_y); - if (min_yx<=x) - Bts(tempd->flags,Df_TERMINAL_LEFT); - else - Bts(tempd->flags,Df_TERMINAL_RIGHT); - } else { - if (tempd->y<=y) - Bts(tempd->flags,Df_TERMINAL_TOP); - else - Bts(tempd->flags,Df_TERMINAL_BOTTOM); - } - QueIns(tempd,result->last); - } - return result; -} - -Dot *DotNew(Node *tempn,CTask *mem_task=NULL) -{ - I64 cnt,pass=0,last_cnt=0; - Bool cont; - Dot *tempd,*tempd1,*tempd2,*tempd3; - Dot *result=DotTerminalsNew(tempn,mem_task); - do { - pass++; - tempd=result->next; - while (tempd!=result) { - if (!Bt(tempd->flags,Df_PROCESSED)) { - if (tempd1=DotNearest(result,tempd,pass>1)) { - if (tempd->x==tempd1->x || tempd->y==tempd1->y) { - if (tempd->x!=tempd1->x || tempd->y!=tempd1->y) { - if (DotHVConnect(tempd,tempd1)) - DotMarkConnected(tempd); - } - }else { - tempd2=DotHVInterconnect(tempd,tempd1,mem_task); - tempd3=result->next; - while (tempd3!=result) { - if (tempd2->x==tempd3->x && tempd2->y==tempd3->y) - break; - tempd3=tempd3->next; - } - if (tempd3!=result) { - Free(tempd2); - tempd2=tempd3; - } else - QueIns(tempd2,result->last); - - if (DotHVConnect(tempd,tempd2)) { - DotMarkConnected(tempd); - if (DotHVConnect(tempd2,tempd1)) - DotMarkConnected(tempd1); - } else - DotHVConnect(tempd2,tempd1); - } - } - } - tempd=tempd->next; - } - - tempd=result->next; - while (tempd!=result) { - tempd1=tempd->next; - while (tempd1!=result) { - if (tempd1->y==tempd->y) { - if ((tempd2=tempd->left ) && tempd2->xxx) { - tempd ->left =tempd1; - tempd1->right=tempd ; - tempd1->left =tempd2; - tempd2->right=tempd1; - } - if ((tempd2=tempd->right ) && tempd ->xxx) { - tempd2->left =tempd1; - tempd1->right=tempd2; - tempd1->left =tempd ; - tempd ->right=tempd1; - } - } - if (tempd1->x==tempd->x) { - if ((tempd2=tempd->top ) && tempd2->yyy) { - tempd ->top =tempd1; - tempd1->bottom=tempd ; - tempd1->top =tempd2; - tempd2->bottom=tempd1; - } - if ((tempd2=tempd->bottom) && tempd ->yyy) { - tempd2->top =tempd1; - tempd1->bottom=tempd2; - tempd1->top =tempd ; - tempd ->bottom=tempd1; - } - } - tempd1=tempd1->next; - } - tempd=tempd->next; - } - - cont=FALSE; - DotRst(result); - cnt=0; - tempd=result->next; - if (tempd!=result) { - DotMarkConnected(tempd); - while (tempd!=result) { - if (Bt(tempd->flags,Df_PROCESSED)) - cnt++; - else - cont=TRUE; - tempd=tempd->next; - } - if (last_cnt==cnt) - break; - last_cnt=cnt; - } - } while (cont); - DotJunctions(result); - DotSpacersAdd(result,mem_task); - DotAddSpace(result); - DotJunctions(result); - return result; -} - -U0 DotDraw(CDC *dc,Dot *root) -{ - Dot *tempd,*tempd1; - if (root) { - tempd=root->next; - while (tempd!=root) { - Bts(tempd->flags,Df_PROCESSED); - if ((tempd1=tempd->right) && !Bt(tempd1->flags,Df_PROCESSED)) - GrLine(dc,tempd->x,tempd->y,tempd1->x,tempd1->y); - if ((tempd1=tempd->left) && !Bt(tempd1->flags,Df_PROCESSED)) - GrLine(dc,tempd->x,tempd->y,tempd1->x,tempd1->y); - if ((tempd1=tempd->top) && !Bt(tempd1->flags,Df_PROCESSED)) - GrLine(dc,tempd->x,tempd->y,tempd1->x,tempd1->y); - if ((tempd1=tempd->bottom) && !Bt(tempd1->flags,Df_PROCESSED)) - GrLine(dc,tempd->x,tempd->y,tempd1->x,tempd1->y); - if (Bt(tempd->flags,Df_JUNCTION)) { - dc->pen_width=3; - GrPlot3(dc,tempd->x,tempd->y,0); - dc->pen_width=1; - } - tempd=tempd->next; - } - } -} - -U0 DrawIt(CTask *task,CDC *dc) -{ - I64 i,x1,y1,x2,y2; - U8 *img; - Bool old_preempt=Preempt(OFF); - Node *tempn=node_root.next; - Element *tempe=el_root.next; - while (tempe!=&el_root) { - x1=tempe->x; - y1=tempe->y; - if (mode==MD_MOVE && tempe==rubber_band) { - img=tempe->type->red_img; - x1+=ipx-rubber_band_x; - y1+=ipy-rubber_band_y; - } else - img=tempe->type->black_img; - SpritePlotRotZ3b(dc,x1,y1,0,img,tempe->é*pi/2); - tempe=tempe->next; - } - while (tempn!=&node_root) { - dc->color=BLUE; - if (mode==MD_MOVE) - for (i=0;icnt;i++) - if (tempn->terms[i].e==rubber_band) { - dc->color=RED; - break; - } - DotRst(tempn->dot_root); - DotDraw(dc,tempn->dot_root); - tempn=tempn->next; - } - if (mode==MD_CONNECT && rubber_band && rubber_band_terminal>=0) { - TerminalXY(rubber_band,rubber_band_terminal,&x1,&y1); - x2=ipx-task->win_pixel_left-task->win_scroll_x; - y2=ipy-task->win_pixel_top -task->win_scroll_y; - dc->color=RED; - GrLine(dc,x1,y1,x2,y2); - } - Preempt(old_preempt); - - dc->color=BLACK; - GrPutS(dc,0,0,"Right Mouse Change Modes"); - switch (mode) { - case MD_CONNECT: - GrPutS(dc,20,FONT_HEIGHT,"Connect Components"); - break; - case MD_MOVE: - GrPutS(dc,20,FONT_HEIGHT,"Move Components"); - break; - } -} - -U0 RubberReset() -{ - rubber_band=NULL; rubber_band_terminal=-1; - rubber_band_x=0; rubber_band_y=0; -} - -U0 Init() -{ - I64 i; - ElementType *tempt; - for (i=0;iblack_img,&tempt->min_x,&tempt->max_x,&tempt->min_y,&tempt->max_y); - } - mode=MD_CONNECT; - RubberReset; - QueInit(&el_root); - QueInit(&node_root); -} - -U0 CleanUp() -{ - Element *tempe=el_root.next,*tempe1; - Node *tempn=node_root.next,*tempn1; - while (tempe!=&el_root) { - tempe1=tempe->next; - QueRem(tempe); - Free(tempe); - tempe=tempe1; - } - while (tempn!=&node_root) { - tempn1=tempn->next; - NodeDel(tempn); - tempn=tempn1; - } -} - -Element *ElementNew(I64 t,CTask *mem_task=NULL) -{ - Element *tempe=CAlloc(sizeof(Element),mem_task); - tempe->type=&et[t]; - tempe->x=ipx-Fs->win_pixel_left-Fs->win_scroll_x; - tempe->y=ipy-Fs->win_pixel_top -Fs->win_scroll_y; - QueIns(tempe,el_root.last); - ElementExtents(tempe); - return tempe; -} - -Element *ElementFind(I64 x,I64 y,I64 *_terminal) -{ - I64 i,x2,y2,best_dd=MAX_I64,dd; - Element *result=NULL,*tempe=el_root.next; - if (_terminal) *_terminal=0; - while (tempe!=&el_root) { - for (i=0;itype->terminals;i++) { - TerminalXY(tempe,i,&x2,&y2); - dd=SqrI64(x-x2)+SqrI64(y-y2); - if (ddnext; - } - return result; -} - -U0 Circuit() -{ - I64 p1,p2,terminal1=-1,terminal2=-1; - Element *tempe1=NULL,*tempe2=NULL; - Node *tempn; - - PopUpOk( - "This is not useful.\n" - "It just lets you draw\n" - "a circuit.\n"); - - SettingsPush; //See $LK,"SettingsPush","MN:SettingsPush"$ - Preempt(OFF); - WordStat; - WinMax; - MenuPush( -"File {" -" New(,'\n');" -" Abort(,CH_SHIFT_ESC);" -" Exit(,CH_ESC);" -"}" -"Edit {" -" Rotate(,CH_SPACE);" -" DelElement(,,SC_DELETE);" -"}" -"Mode {" -" Connect(,0,SC_F2);" -" Move(,0,SC_F3);" -"}" -"PlaceElement {" -" Resistor(,'r');" -" Inductor(,'l');" -" Capacitor(,'c');" -"}" - ); - Init; - DocCursor; - DocClear; - Fs->draw_it=&DrawIt; - Fs->win_inhibit=WIF_ALL-WIF_BORDER-WIF_MENU-WIF_GRAB_SCROLL; - try { - while (TRUE) { - switch (GetMsg(&p1,&p2,1<win_pixel_left-Fs->win_scroll_x, - ipy-Fs->win_pixel_top -Fs->win_scroll_y,&terminal1); - ElementDel(tempe1,Fs); - tempe1=NULL; terminal1=-1; - tempe2=NULL; terminal2=-1; - RubberReset; - break; - } - break; - case '\n': - CleanUp; - Init; - break; - case CH_ESC: - case CH_SHIFT_ESC: - goto cs_done; - case 'r': - tempe1=ElementNew(ET_R); - terminal1=-1; - break; - case 'l': - tempe1=ElementNew(ET_L); - terminal1=-1; - break; - case 'c': - tempe1=ElementNew(ET_C); - terminal1=-1; - break; - case CH_SPACE: - if (tempe1) { - tempe1->é=(tempe1->é+1)&3; - ElementExtents(tempe1); - ElementReroute(tempe1,Fs); - } - break; - } - break; - case MSG_IP_MOVE: - if (tempe1) { - ElementExtents(tempe1); - ElementReroute(tempe1,Fs); - } - break; - case MSG_IP_L_DOWN: - tempe1=ElementFind(p1,p2,&terminal1); - rubber_band=tempe1; rubber_band_terminal=terminal1; - rubber_band_x=ipx; rubber_band_y=ipy; - break; - case MSG_IP_L_UP: - rubber_band=NULL; - switch (mode) { - case MD_CONNECT: - if (tempe1 && terminal1>=0) { - if ((tempe2=ElementFind(p1,p2,&terminal2)) && - (tempe2!=tempe1 || terminal2!=terminal1)) { - if (!(tempn=tempe1->nodes[terminal1]) && - !(tempn=tempe2->nodes[terminal2])) - tempn=NodeNew; - - NodeAdd(tempn,tempe1,terminal1); - NodeAdd(tempn,tempe2,terminal2); - - if (tempe1->nodes[terminal1]) - NodeCat(tempn,tempe1->nodes[terminal1]); - tempe1->nodes[terminal1]=tempn; - - if (tempe2->nodes[terminal2]) - NodeCat(tempn,tempe2->nodes[terminal2]); - tempe2->nodes[terminal2]=tempn; - - NodeReroute(tempn,Fs); - } - } - break; - case MD_MOVE: - if (tempe1 && terminal1>=0) { - tempe1->x+=ipx-rubber_band_x; - tempe1->y+=ipy-rubber_band_y; - ElementExtents(tempe1); - ElementReroute(tempe1,Fs); - } - break; - } - tempe1=NULL; terminal1=-1; - tempe2=NULL; terminal2=-1; - RubberReset; - break; - case MSG_IP_R_DOWN: - if (mode+1==MD_NUM_MODES) - mode=0; - else - mode++; - tempe1=NULL; terminal1=-1; - tempe2=NULL; terminal2=-1; - RubberReset; - break; - } - } -cs_done: - } catch - CatchAll; - SettingsPop; - CleanUp; - MenuPop; -} - -Circuit; -œöÿÿÿùÿÿÿþÿÿÿùÿÿÿþÿÿÿüÿÿÿüÿÿÿÿÿÿÿþÿÿÿÿÿÿÿþÿÿÿýÿÿÿ -þÿÿÿöÿÿÿôÿÿÿ - òÿÿÿýÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿXüÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿúÿÿÿÿÿÿÿÿÿÿÿúÿÿÿœöÿÿÿùÿÿÿþÿÿÿùÿÿÿþÿÿÿüÿÿÿüÿÿÿÿÿÿÿþÿÿÿÿÿÿÿþÿÿÿýÿÿÿ -þÿÿÿöÿÿÿôÿÿÿ - òÿÿÿýÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿXüÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿúÿÿÿÿÿÿÿÿÿÿÿúÿÿÿ \ No newline at end of file diff --git a/TempleOS/Demo/Graphics/Doodle.CPP b/TempleOS/Demo/Graphics/Doodle.CPP index 63323f7..1f486b9 100644 --- a/TempleOS/Demo/Graphics/Doodle.CPP +++ b/TempleOS/Demo/Graphics/Doodle.CPP @@ -12,7 +12,7 @@ U0 Doodle() WordStat; DCFill; - "$$CL$$"; //$LK,"DocClear","MN:DocClear"$() is better + DocClear; do { msg_code=GetMsg(&p1,&p2, 1<mzvN<2cwnu`l; zjC)ajc|cKqQeskOPG(7^21tKFQGSvp*oj4{C8b4q3LpV3EQZ*HrGXCE!C-$wTnExup;M`ooL6FNpi`7uT$)p23pJ=x2NGzY z@Itc7PzPeCkuBJ2kZgHIW=^Vt2AHp@0E$`#h2*>vZEcXGfWqB^5ABDzI7ta;TA3aAta*r18Ba*={UtwL%}ajHT!7hDC%&72h=5~>31_F6751+pG$ zRHYpx1~tJF3JMS&B%XBbDy`8p7{X+VOOs$)AW?1$3V2YQL%d_C1GS(6#;DW*r5Z>= zg2W%x%@7BI+@uKAgOrCA)YKF}CZk5Ffq^kN%3$6tE=__s%+S`^F()TKSp$^+^V7fy zUQ^Q=8ZL&qb`=nHx^@-TT%1ssgKag`wX1~5RcaeTT!m1(ii0M}o40 zts#g7_9BRZ#odOQAPKOAx^_t3v@tZ$jZoYL635~V14Dg{)K?2(*1C}8`?u84Z=8IHayW-L$ zaF$5bwS(l1R9(AD9RnQ$m?*?JI|Ds)Q>_e5gvV0Bfs%>{vRbZME|4EwiW1AgInUX} zSwSl$SqIrGAPI=Kigh4tNbv{uUpbhB`Vv&IXM(ItN!GPX&d23H%Jq$OGIT-l zQVa=fh!qGa7{5}-02<<;6r-R34_c^csW3BPu~@8At^W1ZJ5cijEUuuCoLHQyU|_=iK4Bo(D5W`o&a(+vrl9uOK7;NuF`p#ZLRFf9o8 z@C<>eKr`Qnp!rTdp)kGJosZ%GG~` z)HZ}BCmHrPb8tO+l#f(wc=OHu=J@=M?@ z29-eCh^zrEhg3YB;O$4K)2WrQ!43p_8Bz{{(lsdUBBxGxkpq&z2zHR5f&x)l9Ap_* zA3{BaGjl_-I8wfb#2eT=nBzfJ7$~HXi(tQgguVDrl_&@gGPADgdsvF>42C1rKjQ!h#UesRNq| z3gTjL4GDI+f`VI7YAU2X2^9dV07pVG*cw>)gF^}IFmU${q%0NcFoXbD2a?0!c>}B* z;xMG@70qGLBnyfcB!{IUISg7sgRKEO4CE>WEfDFKTCRcY9!Mhuy|J2_ngVL9!dl_r zkU&>clA4RE22?@Vg8B)ehGuHUAm>302eox!tm4un5ErD%)7VH=!>t%23F#YyeS)=- zBRx1#TnKL`uf4C z(1r@K1f;csBBH{jpa2T5l%mA)_{f z9`V5*o^B!WuEEZrCO%ZmHP{)fIytcX-|d?q#ykTAO>M3~{<|NsA&yv_3vnzih04kHsEI|~B?!~g&P|AQp9 Ha54Y@fUs9x diff --git a/TempleOS/Demo/Graphics/FontEd.CPP b/TempleOS/Demo/Graphics/FontEd.CPP index a1942a9..3088f4c 100644 --- a/TempleOS/Demo/Graphics/FontEd.CPP +++ b/TempleOS/Demo/Graphics/FontEd.CPP @@ -133,6 +133,7 @@ U0 FontEd() } } fe_done: + GetMsg(,,1<$bG1f>))-g0N0Am9ku-%#vMQ%l@sTv4@ zT7}e{;#B zq@(2PXN4l7!lj_#R;+86Qj}O8pIKt71_?uOAi3lxJLjY(7J(d{lCMx=U|SLbVwY!R z=A^zX$thpGN7#J8B86aQ<0|Nsy0|NsSBL_&>jDdkc zhJk^>j)8&U-~a#rVYCYa1A`n?{LlaY|J@iE7+yf-fBpae-->~O;o1NH|D6~Z7#{uq z|K9animate_task=Spawn(&AnimateTask,NULL,"Animate",Fs); + Fs->animate_task=Spawn(&AnimateTask,NULL,"Animate",,Fs); WordStat; Fs->draw_it=&DrawIt; Fs->win_inhibit=WIF_ALL-WIF_BORDER; @@ -73,7 +73,7 @@ public U0 Life() cnt=0; while (msg_code!=MSG_IP_L_UP) { restart=TRUE; - dc[cur_dc]->color=ROP_EQU+GREEN; + dc[cur_dc]->color=GREEN; dc[cur_dc]->pen_width=0.04*ip_speed; GrLine3(dc[cur_dc],x1,y1,0,x2,y2,0); restart=TRUE; @@ -88,6 +88,7 @@ public U0 Life() break; } } while (msg_code!=MSG_KEY_DOWN || !p1); + GetMsg(,,1<b}FUYJ&&51A1Oex8*voi$ggQ%!PQ<0IHnVwMs zR>GyPuj1paqZD40SfHe%l zMMG1M3+#{Z%sk)pqTtHBWJtidIJ;%$9SVg8*X9LA9Oq`e)RB)DVD#KHF&eCo%z! zra#mWATrqC%1~1uA0G|V9|s74Eau<LM{()`h=Z8>W$AE(YtNmbUuv)Nk4zRN^?FNaEY(L0ENKk-G#a8}9ZHL$oRt{2$ z6lWlNVVIEpaR0&Wgv0`f1Q`pLhcjRb!S;i~i-Uuog99cFvlm7aZ9g9$)L@X0_@Qhh zgCQ1x;v3>Lh!Ti8g!LHx0}||qIsj%Q#2S!=Age(%2t!1{2^GWyMLmim(Q5`$?B|2T zEI0r_0SmGKghBQ~1VKCqM!1p#$@k#$0T%RNnk4&?Ljc`Eh_x^h*?Lg$z%i(N0$U6v zNV6Zw0eI~PTMrH`6wmX4{f`m_B-&4$1EAJ}QUToKPzK2V$POUYek2FL!WxqXg$=|F zP+Jic#C}Bcgk<}n4geLzm=;4sVAi9DJ;)VM`{52C-F|`&0OdK5@3C2rQ9qJlKavAL zK85%hPC{%3MLoRC1Nj?Y%YST$96(O^^PxEa;s_AQ&kn71uzQ|*_9M~&IOy4-mV?3qXVim}09E22WD+Q_ z!B)Yn2GO9z2NDD+z>Z0^pBttD3k|XjQMllw2C@>2 zp*&)&C%XLM=EfHSY)~r^)^iYLJMrls6iz5!M&p3u0Bk#`F$RhVGukiVfh9wCFDMVkG%LjY_)5`o`Vge-~n z<8%O$)nF#V2K+2i?dJwZGN{!FD&G;E39zL|1k6@$ZbZez!H-Z6vlm7amHt4AVfM3w z+<-6-$!ahY$$pSSL0N-?pB#tEkz=* z*$)acY<7dhNVXqTy|RP5{vhqx`rlwDaMQ~FAo~Z_{~QAn|Ih>o8caaWPe@S@W`YAB z)V@Rte`>@(wEP1#FG2YU9QPmsY$+0f&3+UOAWcY^*z|{NKXQ4BWHp$H#eRN#1rQnb zlbZj*1rU;#QJBQr4@&^xD1e&*_B0ZKg%!$sf5q1zUtOu0z;e?YCrnfyqwpBvhw z2Y0rJupbmtFzcz|e~^`^c7sHak{*}|Pk*5P2Ut0T0I9`>i7)@K>E^~A{t)FHh?EKu zKqqNzKe}}o{89T+LjWUy2nc`^9TI^^e*`o_rBQ9iGye!xk4_<34Q7to4+#PEaKgnO z4S&=Sz!gro#KDOUiGYMYVtf;qKA1SF?W5@*7B0lnNI?%~j)p%Z1c(j4(e#HJ0>p+J zOdUAUArX+!AI<-;@F7H_hW=>zM<~3|<&lyem^qsMAR&MrPPq7^=?^soaD@{tad4tT zA|RnZTK?e*FLZI#&>t=T(8GriA1Ud9nWO0s5(0$64JJRD{!l{z7A{27kl@B3iPev4 zJL&l!*YX_t*^hl`1|99k>HvD$kIeyewI7QE=xaZw1L$l&h6CtrKe6_qtD`*sqnk(? mf7E`|5Fjn|C|8YYJ2~Y)Wo{U?A3X#{`J*8)8UiCN1Q-C$wsQ3V delta 803 zcmcaVm+}5w#tn?3lh{Q!i}62Tocv8zV)6kQHiFni+;;LF87_kAAZD>nJ|=E6d9Ms7 z(dykKY$xxN;UHT5F$ufL`(@aPR_`WhPo!E9VHt>J0%^%iM2k`$rZLGiN)EvcIBCQ@dcR` zsX6iGnJFb1`bIjF*%;+FJ2AF1^M~Ynnwe-==ox60glMW6Zoa^Bo=MiNSl6y3wW1_G zv81HPHqzC{$3NW0#zfo6C)Cw?@+|gclkGWP)-PmWU|<4aMh+15|NsC0|Nj5~4`P2q zq8S(%{y@23|NsBb#=yYv3d#p5V?g3Rhl)S?|NlQ!n2Ujd;UmcC|NsBL{Qv*|@Bjb* zgN$Kds0SO%!N9=42r`3#f#EMyo*BdkIRk`2Y&4f5xd`L}kSY)jG6rM>h!3)YfJ;5V hK1FgWI|Bp5XC$YBm>_dO=D|V$#D-cA5&|h<002Ns$Zh}t delta 578 zcmdli@@a6yi{~*gi z+@Ht}W1ig4DOu0(9cs)UBpRd+WF!cK>_xZ+>Nb!B2!kY%97WJgAh&WrLkr}nS3Lj! L{|DI&as>kb-suLx diff --git a/TempleOS/Demo/Graphics/NeatTrick.CPP b/TempleOS/Demo/Graphics/NeatTrick.CPP deleted file mode 100644 index 95bc78c..0000000 --- a/TempleOS/Demo/Graphics/NeatTrick.CPP +++ /dev/null @@ -1,21 +0,0 @@ -U0 DrawIt(CTask *task,CDC *) -{ - if (win_updates&1) - PlotWinStr(task,"test",RED+WHITE*16,10,3); - else - PlotWinStr(task,"test",PURPLE+WHITE*16,10,3); - PlotWinStr(task,"test",RED+WHITE*16,10,2); - PlotWinStr(task,"test",PURPLE+WHITE*16,10,4); -} - -U0 Main() -{ - SettingsPush; //See $LK,"SettingsPush","MN:SettingsPush"$ - DocClear; - Fs->draw_it=&DrawIt; - - GetChar; - SettingsPop; -} - -Main; diff --git a/TempleOS/Demo/Graphics/Pic2ASCII.CPP b/TempleOS/Demo/Graphics/Pic2ASCII.CPP deleted file mode 100644 index c524c9d..0000000 --- a/TempleOS/Demo/Graphics/Pic2ASCII.CPP +++ /dev/null @@ -1,101 +0,0 @@ -U0 Convert() -{ - I64 *ptr; - -//Normally, allocate large objects on the heap -//because stk size can't grow. 256 bytes, however, -//is not that bad. - U8 byte_bit_cnts[256]; - - I64 i,j,row,col,ch,best_ch,score,best_score,cur_char_image,diff_image; - CDC *dc=DCAlias; - -//Set-up a table telling how many 1 bits in a val. - MemSet(byte_bit_cnts,0,sizeof(byte_bit_cnts)); - for (i=0;i<256;i++) - for (j=0;j<7;j++) - if (Bt(&i,j)) - byte_bit_cnts[i]++; - - for (row=0;rowwin_height;row++) { - for (col=0;colwin_width;col++) { - - -//The size of one character is 8x8 pixels -//which fits in a 64-bit var. We'll -//fetch the pixels from the screen using $LK,"GrPeek","MN:GrPeek"$(). - cur_char_image=0; - for (i=0;icolor=ROP_EQU+BLACK; - - SettingsPush; //See $LK,"SettingsPush","MN:SettingsPush"$ - Fs->win_inhibit=WIF_ALL-WIF_BORDER; - - WinMax; - DCFill; - "$$CL$$Draw a picture and hit\na key to convert to ASCII.\n"; - do { - msg_code=GetMsg(&p1,&p2, - 1<pen_width=0.04*ip_speed; - GrLine3(dc,x1,y1,0,x2,y2,0); - msg_code=GetMsg(&p1,&p2, - 1<4fytiv)d}x5C^=4)9UM2wba|^Bj delta 12 TcmX?Wyuo;bn)qgC@h&C+A$|mE diff --git a/TempleOS/Demo/Graphics/PixelCollision.CPP b/TempleOS/Demo/Graphics/PixelCollision.CPP index 470f62b0a6f1b6068861a49f9c2507ecfa069dc0..50fab1ee464705e16a603b1b5cfbf3c9be212d39 100644 GIT binary patch literal 2547 zcmd<$QV9;wQL-_#Q_?Y1;o^evjqH?kj6nQQ0|l3&#B$FP4d;-=;%o)2lEmU{9cLG3 z1+A21O|EJ#1qDwt6NL($N^34I1%(RR%z_GCkQ!aP^31&Wg3OB4ocNs7v=VDB1%*o6 z%z{b`*^>MMkYsQ{QD#YMKu&&%u|`U=PK8dTj)9JfrxV^2tqJW~zyb?E%Ck=Eou)9~+&EGF1 z-ow??-6KTP&dyLr$rQ zNgbNjT(w+Wp#}=RiJ5sCkhBn-T2hjkmtGuDTAX36psydCnyR4UMITov_3`pw0MuNPAfk9>aoYf1I*lCE)l6D}k7ap9E>auL3L!QuZI5 znn5WVB;>`y0Oo^Jvoyif%)-I~HUo(OnF4kvk{AmJAn`#=kQ$I$5F3g?rhzb&%g4tD z_BEIQDTj*x2U`j^k`Jm5B*4PL0#^tX{|^%X|NlRT3pNkLhhdmF#1|mDL54x>1@Zoa zb%Rv%@$s>MFxU+s79Yq+u+tz4K};5~1jr_^6G19KR)Wj}MKMAlNC^ak9L&JL#|J7x zAnN{uECpKwQNhOmmWL<=g%|^pI*`L5%0N0m*267<*bYg}pm2dG18MjVawh{w4CE?s z7=Rccvq3T-Z-Px>0rQ{=LH+}&faX`QX<(;8yE{=7MKOK5$pmMP|$!90f+~dMGzn>;cCIr p08xlg0cC+5jxYcmhEORK3ZxE200)NzbvR5w69)MLO$f?m005jx+|mF5 literal 3338 zcmd<$;!+6?&{486v{TYCRN>;{(%0e&$;d2La1Jgg$}CA$C{HX_NY2kIOD!r%O;ISx zS4dPy$}GuEEa1w_Qz*$uRj_dm3G&emvQx-S%`4SYQ1DDssLU@_NXgGrFM;XgLei%L zmM+iC$x$dM%1=s6%BkckN=?r!E=es?NY2m6$t=#y&ns3)ECw52keQmCTFjMLl&X+Y zlvtjpke{bel3$>ZpQezSn4F=IUy_kpq^F<|nP1A4oS3Ijo?n!$P@Y+mp^&JMm!DUa zT9mI)mYAcEnZ^ZjR&qvuesQWoKFBJtr;xp*$EBsu#l;nBpx{!JSRR~_Sddz*;q2n9 zpp}xW<7sB1Pyr?@!DLZ>fhJcqmx4lOnu11VL3~bBRx1#Tg*41gEAdsQ7s6C?QKI=_vX7S)quia49H+ z=NF{}mn4>e!ZSQG&o{9G#B#|`cFsvnECR91Gct2h6*LrslN0ltGZKq56+rQh91zf0 zQ&4~e0w|E(igoSEGxOpLKz@iX&rB)F&^0nJ&_NZ?NX<;oC;>}=B#jIp@v4BF0#lOF zG=UAXvok~!hL{Bs5AqL)cMS~H1cwdWosgUrpPW}>YXI^Vx+R$f6}qUd%SlZufeRHU z7v<;V#8>EK7F5CoA-*fgFMx|cl~wA19O3NmF)<~3L>*W!w~K|P|3(vo0^ zYmHGYaPoHc_wf$`6$>yY)q)EL62by*HkOb8hZ`wj0XNJL)u9@pdC3`xdFiQ$;7n6U zFN#k|Hc|kU#Oh$1)b%uB-T-?WDVnGkvS6DasTFJq+{rk?7OWoTtXgoX3rcfNIhlFc zuzX8QnuFV8iW)Q?`8g>HKB;LX3cmTJ#i;G{{iUTn#O(%M&w8iWSoG zi@;T7cxGNoez}5gdXYj&VsSQ?zJ5u*LTN!tVo54kzBsukH8oEU>`+iamtGWHnU`$M z#RW4BR43=|~ke{4fT2!n6svx-Z^%K)T^>v~`BG^!v zHQ+KAVK$`1MdGVKYX%go8qNJ)ki3!rF%7t8qt;8M%Q*(DXKq88LDfj2Bb=`STU zF()%G9a1snCgxQtrGT9a4x!|X)Z}cCCPW*9tF#y-0Cu#C zvtMdC#Jv!viiRenSpjdRD3mAWm4Mm{V57M5^KvQ`$}>{I&7ewfzQ{{WEJA9QfSMVg zN;ESkhpQwpJ5`}1KVJb9qI#Ur3QE^eN6E@cKO{A`AScy7Sl=ZzH(%d9F*h~1B(bO@ zwWwG>C_g#7SkE~iKuHDCJVC7!t+^PO7#J8B86d!jnE}ifm11CEkYr$B`27F>|1bX$ zfC&x|Vn{5wEQo<54q<`>kugLRP9jS|*l;Nj10sYwin_pixel_width,h=task->win_pixel_height,cx=w/2,cy=h/2, lo=Gs->num*h/mp_cnt,hi=(Gs->num+1)*h/mp_cnt; F64 yy,y_total=0; - CDC *dc=DCAlias(gr_dc2,task); + CDC *dc=DCAlias(gr_dc,task); for (y=lo;ywin_pixel_width,h=Fs->win_pixel_height,cx=w/2,cy=h/2; CDC *dc=DCAlias; while (TRUE) { - - for (i=1;inum); + LBtr(&mp_not_done_flags,Gs->num); } U0 PredatorPrey() @@ -65,12 +65,11 @@ U0 PredatorPrey() GrLine(dc,OX,0,OX,GR_HEIGHT-FONT_HEIGHT-1); GrLine(dc,0,OY,GR_WIDTH-1,OY); while (!ScanChar) { - mp_done_flags=0; - for (i=1;iictmhR5(}GGeo|m*>g05mI%y*vw_;6eE(L{@WJ6mQXUCk(#A1!~qWF|#qs{+V a*ckb>ZH=@Z>suOt)F>#t+APMljtKxZG8Lcz delta 72 zcmX>ictmhR5(}$ufLDIfcEe$}56ck=5Y!+i%#{>WgloS&H diff --git a/TempleOS/Demo/Graphics/Speedline.CPP b/TempleOS/Demo/Graphics/Speedline.CPP index 503407d..f466eec 100644 --- a/TempleOS/Demo/Graphics/Speedline.CPP +++ b/TempleOS/Demo/Graphics/Speedline.CPP @@ -4,7 +4,7 @@ public U0 SpeedLineDemo() { I64 msg_code,cnt,x1,y1,x2,y2,p1,p2,color=BLACK; CDC *dc=DCAlias; - dc->color=ROP_EQU+color; + dc->color=color; SettingsPush; //See $LK,"SettingsPush","MN:SettingsPush"$ Fs->win_inhibit=WIF_ALL-WIF_BORDER; @@ -12,7 +12,7 @@ public U0 SpeedLineDemo() WinMax; WordStat; DCFill; - "$$CL$$"; + DocClear; do { msg_code=GetMsg(&p1,&p2, 1<=0) - dc->color=ROP_EQU+color; + dc->color=color; break; case MSG_IP_L_DOWN: x1=p1; y1=p2; @@ -41,6 +41,7 @@ public U0 SpeedLineDemo() break; } } while (msg_code!=MSG_KEY_DOWN || !p1); + GetMsg(,,1<k~VCDS$5DKiDgM*u!n-2}JfdE(3nv?kW_+SdbCV~9G z!NJeLF*!ui*$pZMGMyjF=I7u*H3AeI5W^u#AnK4*u}zMZw1yf5lZ0phX$2VuqCprU z3J!S?6BINk*0Hfoj+3;ufcPBjD3EhON25{IZjAwh8fQp3S9 zSx{1V@*P4X9sHnNkbUyV6(uE5u1ER)?E=rF+>B1eBTn>)Oj*3c?Qxx6A z!A=EJSuhzSkl`Q``8hx_Jh_oeVsZ|r20|2+ z>exYsqNoMgg;{7p0e*uK4hF>(AqPWU z0V-WVj$15<%fXt^SO7T~6hM>Fl!C<|VTPg<6pyG%`JpiZ3I=4Q{2UmL1xE!mbT#31 z0w^NjVE~RXP^ci8s>O@!Em)MnRU(C~7K*PRkpPbwkXNB&U&V!og{AD9Ivz$xU7Ks+<3z-r`@+x$lLfY4+CWr@u$ Ht{b@lA)67w delta 961 zcmeymkn!t6#trM37>y>cV^W%Yk?9?Wl8TD6kBW-Y=Htu(!jlEKL^taQK46^8qaZPP zfdVVh*qT>xa*nh<(dv=S-oqr+r* znH(eINV2}0GOi@+iBj+;Nl%P|=csx-c_c>GU~<2b>|{-q)X5W+WF~7tX>BO21E!@X u>!_qno}eT(Sw|&(@&qNx$vP@8Ckt?iZ(d{6AOs?KC-*B!Y<6+o$PECQM1!=5FfcH%fec^~lm;8Xz@Wvzz#zcDz#s%t!@*0-A*s0qIjR1^`i=z!#rnRb#hJm~rMI#tAlJTwGi#!2vo-N;*a=TyU`Q{_z9=q%8=W diff --git a/TempleOS/Demo/Graphics/Symmetry.CPP b/TempleOS/Demo/Graphics/Symmetry.CPP index 2c78324..f7d578c 100644 --- a/TempleOS/Demo/Graphics/Symmetry.CPP +++ b/TempleOS/Demo/Graphics/Symmetry.CPP @@ -12,7 +12,7 @@ U0 SymmetryDemo() WinMax; DCFill; - "$$CL$$"; + DocClear; dc->flags|=DCF_SYMMETRY; GrSetSymmetry(dc,Fs->win_pixel_width/2,0,Fs->win_pixel_width/2,1); do { @@ -53,6 +53,7 @@ U0 SymmetryDemo() break; } } while (msg_code!=MSG_KEY_DOWN || !p1); + GetMsg(,,1<=WIF%G>s9~tmaWB@j%PY;@>@Q%-RF5HTYiMJWTM(a|SE6fZ&847_mS3cxk!fpS zooSO>pa+q$&eYb{VscN*FH+FRv^BKOw8<^d%Pojc z&MUFb)YjJIQczG(@D1?FPts8H4R9$+EcYzYDM>8O*2&bg<^oAU#56!+nw#x}Lj(XM CuptEi diff --git a/TempleOS/Demo/Graphics/WallPaperFish.CPP b/TempleOS/Demo/Graphics/WallPaperFish.CPP index fb0f5b0a80b436bdbfe6e79849eb3b76fff5fa4c..1d2f619d9914654c55ad00f4760506213e1ebb1b 100644 GIT binary patch delta 18 Zcmexj_{DHTJ2Ruv2G{@q delta 16 Xcmexj_{DHTJM-iYW|z&UnKeZLLShD{ diff --git a/TempleOS/Demo/Graphics/WinZBuf.CPP b/TempleOS/Demo/Graphics/WinZBuf.CPP index 6a38763..67c0900 100644 --- a/TempleOS/Demo/Graphics/WinZBuf.CPP +++ b/TempleOS/Demo/Graphics/WinZBuf.CPP @@ -14,8 +14,9 @@ U0 DrawIt(CTask *,CDC *dc) U0 ScrollBars() { SettingsPush; //See $LK,"SettingsPush","MN:SettingsPush"$ + DocClear; Fs->draw_it=&DrawIt; - GetChar(NULL,FALSE); + GetChar(,FALSE); SettingsPop; } diff --git a/TempleOS/Demo/Lectures/64BitAsmQuiz.TXT b/TempleOS/Demo/Lectures/64BitAsmQuiz.TXT index df55312..b8ce42f 100644 --- a/TempleOS/Demo/Lectures/64BitAsmQuiz.TXT +++ b/TempleOS/Demo/Lectures/64BitAsmQuiz.TXT @@ -52,8 +52,6 @@ $WW,1$$FG,5$$TX+CX,"64-Bit Assembly Quiz"$$FG$ 14) On a fresh CPU with an empty TLB, how many memory accesses (page tables) does it take to access one virtual address? -15) Is there an instruction to PUSH or POP all registers? - ---- TempleOS identity-maps everything, all the time, so the usual convention of upper memory being for kernel does not apply. It uses physical addresses, basically. It puts all code in the lowest 2-Gig memory range so that it can use the CALL REL32 instruction, the fastest. It never changes privilege levels or messes with page tables, once it is up-and-running. @@ -89,6 +87,3 @@ ANSWERS: 13) 64-bit mode has 4K or 2Meg page size. 14) For one access, there are 3-4 levels of page tables plus the location itself. - -15) There is no instruction to PUSH or POP all registers. - \ No newline at end of file diff --git a/TempleOS/Demo/Lectures/FixedPoint.CPP b/TempleOS/Demo/Lectures/FixedPoint.CPP index c981868..2386d4e 100644 --- a/TempleOS/Demo/Lectures/FixedPoint.CPP +++ b/TempleOS/Demo/Lectures/FixedPoint.CPP @@ -17,7 +17,7 @@ See $LK-A,"::/TempleOS/Demo/SubIntAccess.CPP"$ for how to access upper or lower 32-bits. For a complete lst of nonstandard compiler -features, see $LK-A,"::/TempleOS/Doc/Differences.TXT"$. +features, see $LK-A,"::/TempleOS/Doc/HolyC.TXT"$. */ @@ -73,7 +73,7 @@ public U64i union I64 penalty. For a complete lst of nonstandard compiler -features, see $LK-A,"::/TempleOS/Doc/Differences.TXT"$. +features, see $LK-A,"::/TempleOS/Doc/HolyC.TXT"$. */ diff --git a/TempleOS/Demo/Lectures/FixedPointAdvanced.CPP b/TempleOS/Demo/Lectures/FixedPointAdvanced.CPP index 795fd23..69ca3e0 100644 --- a/TempleOS/Demo/Lectures/FixedPointAdvanced.CPP +++ b/TempleOS/Demo/Lectures/FixedPointAdvanced.CPP @@ -121,8 +121,8 @@ U0 Main() } end=GetTimeStamp; test_time=end-start; - "Fixed Point Sum :%X\n",sum; - "$$FG,RED$$Fixed Point Cycles :%10.5f$$FG$$\n", + "Fixed-Point Sum :%X\n",sum; + "$$FG,RED$$Fixed-Point Cycles :%10.5f$$FG$$\n", ToF64(test_time)/SAMPLE_SIZE; //Measure fixed point arithmetic @@ -130,8 +130,8 @@ U0 Main() sum=AsmFixedPt; end=GetTimeStamp; test_time=end-start; - "Asm Fixed Point Sum :%X\n",sum; - "$$FG,RED$$Asm Fixed Point Cycles:%10.5f$$FG$$\n", + "Asm Fixed-Point Sum :%X\n",sum; + "$$FG,RED$$Asm Fixed-Point Cycles:%10.5f$$FG$$\n", ToF64(test_time)/SAMPLE_SIZE; //Measure float arithmetic @@ -150,15 +150,28 @@ Main; /* Program Output$HL,0$$WW+H,1$$FD,1$ +Machine 1: 8 Cores 2.660GHz $FG,4$Overhead Cycles : 2.00814$FG$ Float Sum :FFFFE1D361BEED68 $FG,4$Float Cycles : 10.16076$FG$ -Fixed Point Sum :FFFFE1D361729914 -$FG,4$Fixed Point Cycles : 5.29392$FG$ -Asm Fixed Point Sum :FFFFE1D361729914 -$FG,4$Asm Fixed Point Cycles: 4.20464$FG$ +Fixed-Point Sum :FFFFE1D361729914 +$FG,4$Fixed-Point Cycles : 5.29392$FG$ +Asm Fixed-Point Sum :FFFFE1D361729914 +$FG,4$Asm Fixed-Point Cycles: 4.20464$FG$ Asm Float Sum :FFFFE1D361BEED56 $FG,4$Asm Float Cycles : 3.04635$FG$ +Machine 2: +8 Cores 3.395GHz +$FG,4$Overhead Cycles : 4.87040$FG$ +Float Sum :D20A01DB177 +$FG,4$Float Cycles : 10.11558$FG$ +Fixed-Point Sum :D209FD18CC7 +$FG,4$Fixed-Point Cycles : 4.50618$FG$ +Asm Fixed-Point Sum :D209FD18CC7 +$FG,4$Asm Fixed-Point Cycles: 3.02426$FG$ +Asm Float Sum :D20A01DB17B +$FG,4$Asm Float Cycles : 3.21070$FG$ + $HL,1$*/ diff --git a/TempleOS/Demo/Lectures/InterruptDemo.CPP b/TempleOS/Demo/Lectures/InterruptDemo.CPP index f9529a7..a398f5d 100644 --- a/TempleOS/Demo/Lectures/InterruptDemo.CPP +++ b/TempleOS/Demo/Lectures/InterruptDemo.CPP @@ -1,4 +1,4 @@ -//This is the software interrupt num + //This is the software interrupt num //we will use. See $LK,"Software Int's","MN:I_WAKE"$ for //picking a num. Nums are subject to change. diff --git a/TempleOS/Demo/Lectures/MiniCompiler.CPP b/TempleOS/Demo/Lectures/MiniCompiler.CPP index e804f4a..32da377 100644 --- a/TempleOS/Demo/Lectures/MiniCompiler.CPP +++ b/TempleOS/Demo/Lectures/MiniCompiler.CPP @@ -40,7 +40,7 @@ I64 Lex(U8 **_src,I64 *num) *_src=src; return TK_EOF; case CH_SPACE: - case CH_CARRIAGE_RETURN: + case '\r': case '\n': src++; break; diff --git a/TempleOS/Demo/Lectures/PageTableEntries1.CPP b/TempleOS/Demo/Lectures/PageTableEntries1.CPP index 4b4db16..d448582 100644 --- a/TempleOS/Demo/Lectures/PageTableEntries1.CPP +++ b/TempleOS/Demo/Lectures/PageTableEntries1.CPP @@ -10,7 +10,7 @@ U0 PageTableDemo1() { - I64 *pte=MemPtAtPageTableEntry(VGA_GRAPHIC_MEM_BASE),p0,p1; + I64 *pte=MemPageTable(VGA_GRAPHIC_MEM_BASE),p0,p1; "Page table entries for VGA screen memory\n"; DocD(pte); PressAKey; diff --git a/TempleOS/Demo/Lectures/PageTableEntries2.CPP b/TempleOS/Demo/Lectures/PageTableEntries2.CPP index 0be1e4c..8a27371 100644 --- a/TempleOS/Demo/Lectures/PageTableEntries2.CPP +++ b/TempleOS/Demo/Lectures/PageTableEntries2.CPP @@ -1,5 +1,5 @@ I64 *addr=VGA_GRAPHIC_MEM_BASE, - *pte_addr=MemPtAtPageTableEntry(addr), + *pte_addr=MemPageTable(addr), err_code=0, *reported_fault_addr; diff --git a/TempleOS/Demo/Lectures/Uncached.CPP b/TempleOS/Demo/Lectures/Uncached.CPP index 1bab1f4..3cec403 100644 --- a/TempleOS/Demo/Lectures/Uncached.CPP +++ b/TempleOS/Demo/Lectures/Uncached.CPP @@ -9,6 +9,8 @@ U0 TimeIns() CHeapCtrl *hc; Bool old_preempt; + "$$FG,RED$$Now, this demo seems broken, perhaps,\n" + "because I run in a virtual machine.$$FG$$\n\n"; CPURep; shared_blks=1; @@ -34,7 +36,7 @@ U0 TimeIns() "Uncached Cycles: %10,d\n",end-start; "$$FG,GREEN$$The difference is even greater\n" - "because the loop overhead was not subtracted.\n\n"; + "because the loop overhead was not subtracted.$$FG$$\n\n"; Free(cached_I64); Free(uncached_I64); MemBlks2MegFree(bp,shared_blks); diff --git a/TempleOS/Demo/MagicPairs.CPP b/TempleOS/Demo/MagicPairs.CPP index 001337c..e456018 100644 --- a/TempleOS/Demo/MagicPairs.CPP +++ b/TempleOS/Demo/MagicPairs.CPP @@ -261,7 +261,7 @@ class RangeJob CDoc *doc; I64 lo,hi,N,sqrt_primes,cbrt_primes; Prime *primes; - CMPCmd *cmd; + CSrvCmd *cmd; } rj[mp_cnt]; I64 TestCoreSubRange(RangeJob *r) @@ -336,7 +336,7 @@ I64 TestCoreRange(RangeJob *r) I64 MagicPairs(I64 N) { F64 t0=tT; - I64 result; + I64 result=0; I64 sqrt_primes,cbrt_primes,num_powprimes, i,k,n=(N-1)/mp_cnt+1; Prime *primes=PrimesNew(N,&sqrt_primes,&cbrt_primes); @@ -346,7 +346,7 @@ I64 MagicPairs(I64 N) k=2; for (i=0;iN) k=N; @@ -355,14 +355,10 @@ I64 MagicPairs(I64 N) rj[i].sqrt_primes=sqrt_primes; rj[i].cbrt_primes=cbrt_primes; rj[i].primes=primes; - if (i==mp_cnt-1) - result=TestCoreRange(&rj[i]); - else - rj[i].cmd=MPJob(&TestCoreRange,&rj[i],mp_cnt-i-1,0); + rj[i].cmd=JobQue(&TestCoreRange,&rj[i],i,0); } - if (mp_cnt>1) - for (i=0;iwin_inhibit=0; } diff --git a/TempleOS/Demo/MultiCore/Clouds.CPP b/TempleOS/Demo/MultiCore/Clouds.CPP index c7c06c4..5cf3e88 100644 --- a/TempleOS/Demo/MultiCore/Clouds.CPP +++ b/TempleOS/Demo/MultiCore/Clouds.CPP @@ -1,5 +1,22 @@ //This uses $LK,"fixed-point","FI:::/TempleOS/Demo/Lectures/FixedPoint.CPP"$. + + + + + + + + + + + + + + + +$SP+BP,"<1>",1,"::/TempleOS/Demo/Graphics/Camp.CPP.Z,6"$ //Pointer to sprite <6> in Camp.CPP.Z file + #define NUM_CLOUDS 16 #define SKY_LINES 30 #define CLOUD_PTS 512 @@ -22,11 +39,11 @@ class CloudPen CDC *cloud_pen; -I64 mp_done_flags; +I64 mp_not_done_flags; U0 MPDrawClouds(CTask *task) { Cloud *c; - CDC *dc=DCAlias(gr_dc,task); + CDC *dc=DCAlias(gr_dc2,task); I64 i,j,k,xx,yy, lo= Gs->num *CLOUD_PTS/mp_cnt, hi=(Gs->num+1)*CLOUD_PTS/mp_cnt; @@ -54,17 +71,17 @@ U0 MPDrawClouds(CTask *task) GrBlot(dc,xx,yy,cloud_pens[i&(CLOUD_PENS-1)].img); } DCDel(dc); - LBts(&mp_done_flags,Gs->num); + LBtr(&mp_not_done_flags,Gs->num); } -U0 DrawIt(CTask *task,CDC *) +U0 DrawIt(CTask *task,CDC *dc) { I64 i; - mp_done_flags=0; - for (i=1;i",1$); + mp_not_done_flags=1<task_end_cb=&SndTaskEndCB; MusicSettingsRst; while (TRUE) { - Play("W13qBetDA2G3qD2sG!3E2G!3EetCEDqFEeDC"); - Play("qBetDA2G3qD2sG!3E2G!3EetCEDqFEeDC"); - Play("C!GqDeADsDCDCqGEetDAD!2sG3D2G!!3D"); - Play("eC!GqDeADsDCDCqGEetDAD!2sG3D2G!!3D"); + Play("3qBetDA2G3qD2sG3E2G3EetCEDqFEeDC"); + Play("qBetDA2G3qD2sG3E2G3EetCEDqFEeDC"); + Play("CGqDeADsDCDCqGEetDAD2sG3D2G3D"); + Play("eCGqDeADsDCDCqGEetDAD2sG3D2G3D"); } } @@ -163,24 +180,24 @@ U0 CloudScene() { SettingsPush; //See $LK,"SettingsPush","MN:SettingsPush"$ try { - Fs->song_task=Spawn(&SongTask,NULL,"Song",Fs); + Fs->text_attr=YELLOW<<4+BLUE; + Fs->song_task=Spawn(&SongTask,NULL,"Song",,Fs); DocCursor; WinMax; + WinBorder; WordStat; Init; - Fs->animate_task=Spawn(&AnimateTask,NULL,"Animate",Fs); + Fs->animate_task=Spawn(&AnimateTask,NULL,"Animate",,Fs); - "$$CL$$$$BG,LTCYAN$$"; NewLine(SKY_LINES); - "$$BG,YELLOW$$"; - NewLine(5); + DocClear; + "$$BG,LTCYAN$$"; NewLine(SKY_LINES); + "$$BG,YELLOW$$"; NewLine(5); PutBibleVerse("Exodus,14:19",7); Preempt(OFF); Fs->draw_it=&DrawIt; GetChar; WinMgrSync; - - "$$BG$$\n"; } catch CatchAll; SettingsPop; diff --git a/TempleOS/Demo/MultiCore/Layers3DJob.CPP b/TempleOS/Demo/MultiCore/Layers3DJob.CPP deleted file mode 100644 index 1f1500bc2088196d3566939ff95d4d0d8092c117..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2389 zcmd<$;^I;X4$x7uF|$u7ng!UW}1RVZh;=iXoxME3Pq_UrA2wxTnY+cWwt5F zx^_h%E{KtwpOar?>*V9;>$ShXKELO@(sl3J7p*2krw;9eA*S`w6B z;+t3kvZBZkY#hiL6}CnO1|YLRoJwR)T25kmagD8uvs-*fkfUF)n}3k6V~D4}AK1Gf zM(q znoJFJ%uRI+bPNp)bW9Dvu0)bGH`Or(8EXnw0G0*017ezckgKa7#5mWSoXmpaRIoEZ zCV?=>JRKubuqO8+JSub^>l=YpA&mA3ASQ0j!FN@x-Vg#+#c3Q7Bj1j?nLkdkcc;_R4{nOF?c3U&!< zdM$@qV+*$sq!7&qMTn3iH(|LryJhC&Xrv@Vf(R4|1E0>o0i;S6kZzH8tA+L5igBFEMr@6Q35pv zQVc?k!EU&MLXn}Zdy!{KYF-H_ITaZpcw7n!!Ko!BnR)5O0j0$m)(ZOi!KtYVDn8yi zO2`sQI!eBNRwyDWTnY*<`N_^Xsfpn7)~#6AE~O~3JU+9;Rt=JUK(+-GrKaW9&I?Eefr>^!MPGtMxfB#Y!UzLEf)Fvd z0Y*A6Kt%^!6k>pp&P$Le*Z|b9cXRX!1{bmD!4H)HYth#a0M(Zz8L0}Oazr6NO##F% z&&*57FIPw`R!B)KNmR%zNzGL#$ydnAPtpTx^9=wc1~piDq~lhs1FBZQa^abIzUf85 zm3hgaa8`f@qlO}i>lA8g6ksBdB&P}1te_B?nVORVt}GN3UK(lJ8fiV&H-uDE3JNcb zIH4lO;MAs|@X}ZpO^GolR0N`=7L*>qzXUG>0|N-#LLGGU?|XBw1jtqp2Du#M=A2Mbhz@-Q1_nU}1_lYJ M4v+!{28IR(0CYZy`v3p{ diff --git a/TempleOS/Demo/MultiCore/LayersSpawn.CPP b/TempleOS/Demo/MultiCore/LayersSpawn.CPP deleted file mode 100644 index 286d2e1..0000000 --- a/TempleOS/Demo/MultiCore/LayersSpawn.CPP +++ /dev/null @@ -1,83 +0,0 @@ -class MPCtrl -{ - CTask *win_task; - I64 i; - Bool app_done,app_done_ack; - Bool refresh_start,refresh_done; -} mp; - - -U0 DrawIt(CTask *,CDC *dc) -{ - I64 i; - F64 t0=tT,t1; - - mp.refresh_done=FALSE; - mp.refresh_start=TRUE; - mp.i++; - - for (i=0;i<32;i++) { - t1=t0+i*2*ã/64; - dc->color=(mp.i+i)/10&15; - GrEllipse(dc,GR_WIDTH/2,GR_HEIGHT/2, - GR_WIDTH/4*(Sin(t1)+1.0),GR_HEIGHT/4*(Sin(t1)+1.0),t1*2.0); - } - while (!mp.refresh_done) - Yield; -} - -U0 MPDrawIt() -{ - I64 i; - F64 t0=tT,t1; - CDC *dc=DCAlias; - dc->win_task=mp.win_task; - - while (!mp.refresh_start && !mp.app_done) - Yield; - if (mp.app_done) - goto mp_done; - mp.refresh_start=FALSE; - DCFill; - for (i=32;i<64;i++) { - t1=t0+i*2*ã/64; - dc->color=(mp.i+i)/10&15; - GrEllipse(dc,GR_WIDTH/2,GR_HEIGHT/2, - GR_WIDTH/4*(Sin(t1)+1.0),GR_HEIGHT/4*(Sin(t1)+1.0),t1*2.0); - } -mp_done: - DCDel(dc); - mp.refresh_done=TRUE; -} - -U0 MPTask(I64) -{ - while (!mp.app_done) - MPDrawIt; - mp.app_done_ack=TRUE; - DCFill; -} - - -U0 LayersSpawn() -{ - if (mp_cnt<2) throw(EXCEPT_MULTICORE); - - SettingsPush; //See $LK,"SettingsPush","MN:SettingsPush"$ - WinMax; - DocClear; - Fs->draw_it=&DrawIt; - WinBorder; - - mp.i=0; - mp.app_done=FALSE; - mp.win_task=Fs; - MPSpawn(&MPTask); - GetChar; - mp.app_done=TRUE; - while (!mp.app_done_ack) - Yield; - SettingsPop; -} - -LayersSpawn; diff --git a/TempleOS/Demo/MultiCore/LoadTest.CPP b/TempleOS/Demo/MultiCore/LoadTest.CPP index 3a3b4b4..ee0a0d4 100644 --- a/TempleOS/Demo/MultiCore/LoadTest.CPP +++ b/TempleOS/Demo/MultiCore/LoadTest.CPP @@ -1,56 +1,53 @@ -I64 load_test_done; +Bool app_done; +I64 app_done_ack; U0 Job1(I64) { //Compile Compiler TaskInitExt; //Enable file access Preempt(ON); //Off by default Silent(ON); - while (!load_test_done) { + while (!app_done) { Cd("::/TempleOS/Compiler"); Cmp("Compiler"); } - lock {load_test_done--;} + lock {app_done_ack--;} } U0 Job2(I64) { //Log a file TaskInitExt; //Enable file access Preempt(ON); //Off by default - while (!load_test_done) { + while (!app_done) { AdamLog("%F","::/TempleOS/Demo/MultiCore/LoadTest.CPP"); Yield; } - lock {load_test_done--;} + lock {app_done_ack--;} } U0 Job3(I64) { //Log a file TaskInitExt; //Enable file access Preempt(ON); //Off by default - while (!load_test_done) { + while (!app_done) { Cd("::/TempleOS/Compiler"); AdamLog("%F","Compiler.PRJ.Z"); Yield; } - lock {load_test_done--;} + lock {app_done_ack--;} } U0 Main() { - load_test_done=0; + app_done=FALSE; "Running MultiCore Test...\n"; - MPSpawn(&Job1); - MPSpawn(&Job2); - MPSpawn(&Job1); - MPSpawn(&Job3); - Spawn(&Job1); - Spawn(&Job2); - Spawn(&Job1); - Spawn(&Job3); + Spawn(&Job1,,,1); //core #1 + Spawn(&Job2,,,1); + Spawn(&Job3,,,1); PressAKey; - load_test_done=8; //We don't want to yank code from under MP cores. - while (load_test_done) + app_done_ack=3; + app_done=TRUE; + while (app_done_ack) Yield; } diff --git a/TempleOS/Demo/MultiCore/Lock.CPP b/TempleOS/Demo/MultiCore/Lock.CPP index 22c7a20..301e5d3 100644 --- a/TempleOS/Demo/MultiCore/Lock.CPP +++ b/TempleOS/Demo/MultiCore/Lock.CPP @@ -22,15 +22,12 @@ U0 MPUnlockedInc(I64) U0 UnlockedInc() { - I64 i; - CMPCmd *tempm; + CSrvCmd *tempm0,*tempm1; glbl=0; - - tempm=MPJob(&MPUnlockedInc,NULL,1,0); - for (i=0;icolor=BLUE; - for (i=0;icolor=GREEN; - GrPrintF(dc,i*h/(NUM_TESTS-1),v-FONT_HEIGHT,"10e%d",i+1); - GrLine(dc,i*h/(NUM_TESTS-1),0, - i*h/(NUM_TESTS-1),v); + GrPrintF(dc,i*h/(NUM_TESTS-1),v-FONT_HEIGHT,"10e%d",i+MIN_TEST); + GrLine(dc,i*h/(NUM_TESTS-1),0,i*h/(NUM_TESTS-1),v); } PressAKey; diff --git a/TempleOS/Demo/MultiCore/MPPrintF.CPP b/TempleOS/Demo/MultiCore/MPPrintF.CPP index 996c875..c331047 100644 --- a/TempleOS/Demo/MultiCore/MPPrintF.CPP +++ b/TempleOS/Demo/MultiCore/MPPrintF.CPP @@ -1,7 +1,7 @@ U0 Job(CDoc *doc) { I64 i; - for (i=0;i<10;i++) + for (i=0;i<2;i++) DocPrintF(doc,"$$FG,%d$$CPU%d ",Gs->num,Gs->num); } @@ -9,9 +9,9 @@ U0 Job(CDoc *doc) U0 MPPrintFDemo() { I64 i; - for (i=0;i<1000;i++) - MPJob(&Job,DocCur,1+i%(mp_cnt-1)); - Sleep(1000); + for (i=0;i<500;i++) + JobQue(&Job,DocPut,i%mp_cnt); + Sleep(500); "$$FG$$\n"; } diff --git a/TempleOS/Demo/MultiCore/Noise.CPP b/TempleOS/Demo/MultiCore/Noise.CPP deleted file mode 100644 index f3b36d8..0000000 --- a/TempleOS/Demo/MultiCore/Noise.CPP +++ /dev/null @@ -1,63 +0,0 @@ -Bool noise_done; -I64 done_ack; -I64 cnt; - -U0 DrawNoise(CTask *task) -{ - I64 i, - h=task->win_pixel_width, - v=task->win_pixel_height; - CDC *dc=DCAlias(gr_dc2,task); - for (i=0;icolor=RandU16&15; - GrPlot(dc,RandU16%h,RandU16%v); - } - dc->color=WHITE; - GrRect(dc,0,Gs->num*FONT_HEIGHT,12*FONT_WIDTH,FONT_HEIGHT); - dc->color=BLACK; - GrPrintF(dc,0,Gs->num*FONT_HEIGHT,"Cnt:%08X",cnt); - DCDel(dc); -} - -U0 MPTask(CTask *task) -{ - while (!noise_done) { - DrawNoise(task); - WinMgrSync; - } - LBts(&done_ack,Gs->num); -} - -U0 NoiseDemo() -{ - I64 i; - F64 t0; - SettingsPush; //See $LK,"SettingsPush","MN:SettingsPush"$ - WinMax; - WordStat; - cnt=0x1000; - - noise_done=FALSE; - for (i=1;i1.0/80.0) - cnt-=0x100; - else - cnt+=0x100; - WinMgrSync; - } - - done_ack=1; - noise_done=TRUE; - while (done_ack!=1<num); + LBtr(&mp_not_done_flags,Gs->num); } U0 Palindrome(U8 *filename) @@ -83,12 +83,11 @@ U0 Palindrome(U8 *filename) buf=FileRead(filename,&size); PDNormalize; - doc=DocCur; - mp_done_flags=0; - for (i=1;inum],bn[Gs->num]); - LBts(&mp_done_flags,Gs->num); + LBtr(&mp_not_done_flags,Gs->num); } U0 MPRadixSortDemo(I64 dummy=0) @@ -109,11 +109,10 @@ U0 MPRadixSortDemo(I64 dummy=0) j=a1[i]>>k1+k2; //This is a preliminary radix sort. b[j][bn[j]++]=a1[i]; } - mp_done_flags=0; - for (i=1;inum]=TRUE; - return tT-t0; -} - -F64 Sort2(I64 n) -{ - I64 i1=0,i2=n/2,i3=0; - F64 t0=tT; - MemSet(&mp,0,sizeof(MPCtrl)); - MemCpy(&a2[n/2],&a1[n/2],n/2*sizeof(I32)); - MPJob(&Sort1,n/2,1); - QSort(&a2[n/2],n/2,sizeof(I32),&IntCompare); - while (!mp.done[1]) - Yield; - while (i385Us!jBBdD^7i9%3=A(m{Qv*|JFHL_AI=3+3msM2K6W5@^vsa^B`|Np}( zPTo3(D&hJ0x*qxYiXfhW3Kv6wUK9hwwtA4tCXh-khVYDD5U&Kp1F6KRFJmi6T^vZA zbAEmfgCHZwGzAc`nt_3#nSp_!l!1Z4n}LA=B*+Aki1&?*cXD+NU|=S;WB60Scnhl3)go0I-A#h+mYMSK`LN!Nb77;FOwL0FnRz D2QgcK diff --git a/TempleOS/Demo/OldSchool/Demo2/ODMain.BIN b/TempleOS/Demo/OldSchool/Demo2/ODMain.BIN deleted file mode 100644 index d670bcf79471f05ba851368c577d0fd52e631f67..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 368 zcmaFO$H4G{fq|ibk%8gn_AuoW3=9lm9^It^VOfkB3JeSkFJArs|KFqeh(z4ULmUi2 z`K2Y9d8x)$s>NIk*0t6QCpZ`w!ooeeYXx2$1S|Z{Q0Hy@&BO9vt+dDglCKhBSxgxV zLFOz1OCM42_|!EG||kE-A{)OIIjJEK1BxElDjZR!GY)Qb;UH zFIF&ANX$!7Fw)~<5M*RvU|>*S29XmP7#Kns7#MgN7#Ns90x(}OFc~l~F!(2BxuoXi zGjL2}U|ObjDemo("Param1","Param2"); $ID,-2$ -$FG,2$#include$FG$ the file $LK-A,"::/TempleOS/Adam/BinRep.CPP"$ and +$FG,2$#include$FG$ the file $LK-A,"::/TempleOS/Adam/Utils/BinRep.CPP"$ and call $LK,"BinRep","MN:BinRep"$() to analyze the $FG,2$.BIN.Z$FG$ files. diff --git a/TempleOS/Demo/OldSchool/ReadMe.TXT b/TempleOS/Demo/OldSchool/ReadMe.TXT index 182853c..b3998b2 100644 --- a/TempleOS/Demo/OldSchool/ReadMe.TXT +++ b/TempleOS/Demo/OldSchool/ReadMe.TXT @@ -1,4 +1,4 @@ -$WW,1$If you insist on doing $FG,2$AOT$FG$ compiled, old school, programs instead of just-in-time compiled programs, this directory tree has some examples. The main reason to do $FG,2$AOT$FG$ programs is to make closed-source applications. Why not do it like the programs in $FG,2$/TempleOS/Apps$FG$ instead? +$WW,1$If you insist on doing $FG,2$AOT$FG$ compiled, old school, programs instead of just-in-time compiled programs, this directory tree has some examples. The main reason to do $FG,2$AOT$FG$ programs is to make closed-source applications. Why not do it like the programs in $FG,2$/TempleOS/Apps$FG$, instead? See $LK,"Scoping and Linkages","FI:::/TempleOS/Doc/ImportExports.TXT"$ for details on $FG,2$extern$FG$, $FG,2$import$FG$, $FG,2$_extern$FG$, $FG,2$_import$FG$, etc. diff --git a/TempleOS/Demo/PrintF.CPP b/TempleOS/Demo/PrintF.CPP index 2fe3823..5ea3df1 100644 --- a/TempleOS/Demo/PrintF.CPP +++ b/TempleOS/Demo/PrintF.CPP @@ -1,8 +1,8 @@ //TempleOS supports standard $LK,"PrintF","MN:PrintF"$() //codes and extended ones. -//See $LK,"printF codes","FA:::/TempleOS/Doc/Differences.TXT,PrintF_Codes"$. +//See $LK,"printF codes","FA:::/TempleOS/Doc/HolyC.TXT,PrintF_Codes"$. -//This file demonstrates $LK,"sub_fmt","FA:::/TempleOS/Doc/Differences.TXT,sub_fmt"$ codes. +//This file demonstrates $LK,"sub_fmt","FA:::/TempleOS/Doc/HolyC.TXT,sub_fmt"$ codes. diff --git a/TempleOS/Demo/Progress.CPP b/TempleOS/Demo/Progress.CPP index 02afca2..763f242 100644 --- a/TempleOS/Demo/Progress.CPP +++ b/TempleOS/Demo/Progress.CPP @@ -6,8 +6,10 @@ */ -U0 Main() +U0 Main1() { + "\nWith description.\n"; + PressAKey; ProgressBarsRst; StrCpy(progress1_desc,"Progress Demo"); //PROGRESS_DESC_LEN is max progress1_max=400; @@ -17,10 +19,25 @@ U0 Main() } -Main; +Main1; -"$$FG,LTRED$$Now, from asm... It's handy for debugging.$$FG$$\n" +U0 Main2() +{ + "\nNo description.\n"; + PressAKey; + ProgressBarsRst; + //No progress1_desc + progress1_max=400; + while (progress1++!=progress1_max) + Sleep(10); + progress1_max=0; //hide +} + +Main2; + +"\n$$FG,LTRED$$Now, from asm... It's handy for debugging.$$FG$$\n" "$$FG,LTRED$$Watch the progress on the wallpaper.$$FG$$\n"; +WinBorder(ON); PressAKey; asm { diff --git a/TempleOS/Demo/Prompt.CPP b/TempleOS/Demo/Prompt.CPP index cbe5132..6abffa7 100644 --- a/TempleOS/Demo/Prompt.CPP +++ b/TempleOS/Demo/Prompt.CPP @@ -3,7 +3,7 @@ U0 PromptDemo() F64 d; I64 i; U8 *name; - CDate spdt; + CDate cdt; "\n\nNow prompting from the cmd line.\n\n" "$$FG,GREEN$$$$FG$$ keeps default.\n\n"; @@ -18,8 +18,8 @@ U0 PromptDemo() "Name:%s\n",name; Free(name); - spdt=PmtCDate("Date (%D):",GetCurTimeCDate); - "Date=%D\n",spdt; + cdt=PmtCDate("Date (%D):",GetCurTimeDate); + "Date=%D\n",cdt; } PromptDemo; diff --git a/TempleOS/Demo/RegistryDemo.CPP b/TempleOS/Demo/RegistryDemo.CPP index 1926b69..427c6bc 100644 --- a/TempleOS/Demo/RegistryDemo.CPP +++ b/TempleOS/Demo/RegistryDemo.CPP @@ -1,18 +1,18 @@ -//The HOME/Registry.CPP.Z file is C+ code. +//The HOME/Registry.CPP.Z file is Holy C code. //You can execute a branch of it. The Adam //branch is executed in the Adam task boot phase. //Normally, you will place var declarations //in the branch you make, but since an arthmetic expression -//is valid in C+ you can place simple expressions +//is valid in Holy C you can place simple expressions //without vars. AcctRegSetDftEntry("DemoCompany/Game1","F64 best_score=1.23;\n"); AcctRegSetDftEntry("DemoCompany/Game1/SimpleVal","1234;\n"); -AcctRegExecuteBranch("DemoCompany/Game1"); +AcctRegExeBranch("DemoCompany/Game1"); U0 Game() { - I64 i=AcctRegExecuteBranch("DemoCompany/Game1/SimpleVal"); + I64 i=AcctRegExeBranch("DemoCompany/Game1/SimpleVal"); "High Score:%6.5f\n",best_score; "Val:%d\n",i; i++; diff --git a/TempleOS/Demo/ScreenCodes.CPP b/TempleOS/Demo/ScreenCodes.CPP index d98fee4..eaeb6bd 100644 --- a/TempleOS/Demo/ScreenCodes.CPP +++ b/TempleOS/Demo/ScreenCodes.CPP @@ -18,7 +18,7 @@ U0 ScreenCodes() SettingsPush; //See $LK,"SettingsPush","MN:SettingsPush"$ DocClear; Fs->draw_it=&DrawIt; - GetChar(NULL,FALSE); + GetChar(,FALSE); SettingsPop; } diff --git a/TempleOS/Demo/Shared/TreeDemoJoin.CPP b/TempleOS/Demo/Shared/TreeDemoJoin.CPP deleted file mode 100644 index a77db61..0000000 --- a/TempleOS/Demo/Shared/TreeDemoJoin.CPP +++ /dev/null @@ -1,25 +0,0 @@ -U0 TreeSub(CDoc *doc,CDirEntry *tempm) -{ - CDirEntry *tempm1; - while (tempm) { - tempm1=tempm->next; - if (tempm->attr & _ATTR_DIR) { - DocPutS(doc,"$$TR,\"\"$$"); - DocPrintF(doc,"$$MA+A,\"%s\",\"Cd(\\\"%s\\\");Dir;\n\"$$\n", - tempm->name,tempm->full_name); - if (tempm->sub) { - DocPutS(doc,"$$ID,+2$$"); - TreeSub(doc,tempm->sub); - DocPutS(doc,"$$ID,-2$$"); - } - } else { - DocPrintF(doc,"$$LK,\"%s\",\"FI:%s\"$$\n", - tempm->name,tempm->full_name); - } - //Note there is also a routine - //to delete an entire CDirEntry tree. - //See $LK,"CDirLstDel","MN:CDirLstDel"$(). - CDirEntryDel(tempm); - tempm=tempm1; - } -} diff --git a/TempleOS/Demo/Snd/ASCIIOrgan.CPP b/TempleOS/Demo/Snd/ASCIIOrgan.CPP index 6904cc0239760825a1cf1fc7d4aaa0979cf05a53..5008b8066b33e9a6bc0b1d50868be75ba7ca48a0 100644 GIT binary patch delta 12 Ucmcbla86;vPNvO!nWpjr04BQyU;qFB delta 17 ZcmX@7a7kgqP9_$=P#>SoJDH~P0sugX2Aco? diff --git a/TempleOS/Demo/Snd/BeatFreq.CPP b/TempleOS/Demo/Snd/BeatFreq.CPP deleted file mode 100644 index 6685b0a..0000000 --- a/TempleOS/Demo/Snd/BeatFreq.CPP +++ /dev/null @@ -1,68 +0,0 @@ -Bool beat_done; -I64 start_buf_num; -U0 (*fp_task_end_cb)(); -U0 (*fp_old_fill_buf)(SND_OUT_CONTAINER *buf,I64 buf_num)=NULL; - -F64 freq1,freq2; - -U0 BeatFillBuf(SND_OUT_CONTAINER *buf,I64 buf_num) -{ //Gets called by HD Audio task -- $LK,"HDAudioTask","MN:HDAudioTask"$(). - I64 j,m; - F64 t; - if (beat_done) return; - t=ToF64((buf_num-start_buf_num)*(SND_BUF_LEN/SND_OCHANNELS))/SND_SAMPLE_RATE; - j=0; - while (jtask_end_cb; - Fs->task_end_cb=&BeatTaskEndCB; //Catch or Kill() task - start_buf_num=snd_obuf_num; - fp_old_fill_buf=fp_snd_fill_buf; - fp_snd_fill_buf=&BeatFillBuf; - try { - "Pick two frequencies within a few Hz of each other to hear beats.\n" - "Pick two frequencies a multiple of two for an octave harmonic.\n" - "$$FG,GREEN$$$$FG$$ to exit.\n"; - while (TRUE) { - freq1=PmtF64("Freq #1 (%0.2fHz):",freq1,20,20000); - freq2=PmtF64("Freq #2 (%0.2fHz):",freq2,20,20000); - } - } catch { //Catch , but pass it on to next higher handler. - fp_snd_fill_buf=fp_old_fill_buf; - Fs->task_end_cb=fp_task_end_cb; - } - beat_done=TRUE; - fp_snd_fill_buf=fp_old_fill_buf; - Fs->task_end_cb=fp_task_end_cb; -} - -BeatFreq; diff --git a/TempleOS/Demo/Snd/Chords.CPP b/TempleOS/Demo/Snd/Chords.CPP deleted file mode 100644 index 64a0944..0000000 --- a/TempleOS/Demo/Snd/Chords.CPP +++ /dev/null @@ -1,16 +0,0 @@ -U0 Chords(Bool val=ON) -{ - if (snd_dev!=SD_HD_AUDIO) { - "Only works for HD Audio.\n"; - return; - } - HDTonesInit; - if (val) { - _hda->tone_swcs[1]->freq_multiplier=4.0/3.0; - _hda->tone_swcs[1]->amp_multiplier=1.0; - _hda->tone_swcs[2]->freq_multiplier=(4.0/3.0)`2; - _hda->tone_swcs[2]->amp_multiplier=1.0; - } -} - -Chords(ON); diff --git a/TempleOS/Demo/Snd/Echo.CPP b/TempleOS/Demo/Snd/Echo.CPP deleted file mode 100644 index 38740ca..0000000 --- a/TempleOS/Demo/Snd/Echo.CPP +++ /dev/null @@ -1,96 +0,0 @@ -Bool echo_done; - -U0 (*fp_task_end_cb)(); -U0 (*fp_old_fill_buf)(SND_OUT_CONTAINER *buf,I64 buf_num)=NULL; -U0 (*fp_old_copy_buf)(SND_IN_CONTAINER *buf,I64 buf_num)=NULL; - -#define NUM_BUF 8 -SND_IN_CONTAINER my_buf[SND_BUF_LEN*NUM_BUF]; - -I64 my_ibuf_ptr,my_obuf_ptr; - -U0 EchoFillBuf(SND_OUT_CONTAINER *buf,I64) -{ - I64 j; - if (echo_done) return; - j=0; - while (jistr0_buf[0]; - I64 i,x1,y1,x2=0,y2=0, - cy=task->win_pixel_height>>1; - dc->color=BLUE; - for (i=0;iwin_pixel_width/SND_BUF_LEN; - y1=cy-buf[i]*cy/MAX_I16; - GrLine(dc,x2,y2,x1,y1); - x2=x1; - y2=y1; - } -} - -U0 EchoDemo() -{ - if (snd_dev!=SD_HD_AUDIO) { - "Only works for HD Audio.\n"; - return; - } - SettingsPush; //See $LK,"SettingsPush","MN:SettingsPush"$ - HDRun(TRUE,TRUE); - echo_done=FALSE; - fp_task_end_cb=Fs->task_end_cb; - Fs->task_end_cb=&EchoTaskEndCB; //Catch or Kill() task - my_ibuf_ptr=(NUM_BUF/2)*SND_BUF_LEN; - my_obuf_ptr=0; - fp_old_fill_buf=fp_snd_fill_buf; - fp_old_copy_buf=fp_snd_copy_buf; - fp_snd_fill_buf=&EchoFillBuf; - fp_snd_copy_buf=&EchoCopyBuf; - DocCursor; - DocClear; - Fs->draw_it=&DrawIt; - try - GetChar; - catch { //Catch , but pass it on to next higher handler. - fp_snd_fill_buf=fp_old_fill_buf; - fp_snd_copy_buf=fp_old_copy_buf; - Fs->task_end_cb=fp_task_end_cb; - } - echo_done=TRUE; - HDStop(TRUE,FALSE); - fp_snd_fill_buf=fp_old_fill_buf; - fp_snd_copy_buf=fp_old_copy_buf; - Fs->task_end_cb=fp_task_end_cb; - SettingsPop; -} - -EchoDemo; diff --git a/TempleOS/Demo/Snd/Guitar.CPP b/TempleOS/Demo/Snd/Guitar.CPP deleted file mode 100644 index becd733..0000000 --- a/TempleOS/Demo/Snd/Guitar.CPP +++ /dev/null @@ -1,17 +0,0 @@ -U0 Guitar(Bool val=ON,F64 à=0.7) -{ - I64 i; - F64 m; - if (snd_dev!=SD_HD_AUDIO) { - "Only works for HD Audio.\n"; - return; - } - HDTonesInit; - if (val) - for (i=0,m=1.0;itone_swcs[i]->freq_multiplier=i+1; - _hda->tone_swcs[i]->amp_multiplier=m; - } -} - -Guitar(ON); diff --git a/TempleOS/Demo/Snd/MorseCode.CPP b/TempleOS/Demo/Snd/MorseCode.CPP index dcce1ea..7c34b34 100644 --- a/TempleOS/Demo/Snd/MorseCode.CPP +++ b/TempleOS/Demo/Snd/MorseCode.CPP @@ -112,7 +112,7 @@ I64 MorseWaitKey() Yield; } } else - ch=GetChar(NULL,FALSE); + ch=GetChar(,FALSE); m_start=tT; Snd(1000); if (ch==CH_SHIFT_ESC || ch==CH_ESC) { @@ -147,7 +147,7 @@ U0 Morse() //We don't want the tag call back //called before we set it, so preempt off. old_preempt=Preempt(OFF); - doc_e=DocPutS(DocCur,"$$TX+TC,\" \"$$"); + doc_e=DocPutS(DocPut,"$$TX+TC,\" \"$$"); doc_e->tag_cb=&MorseTimes; Preempt(old_preempt); diff --git a/TempleOS/Demo/Snd/PolyPhonic.CPP b/TempleOS/Demo/Snd/PolyPhonic.CPP deleted file mode 100644 index 2e55f92..0000000 --- a/TempleOS/Demo/Snd/PolyPhonic.CPP +++ /dev/null @@ -1,98 +0,0 @@ -Bool poly_done; -I64 start_buf_num; -U0 (*fp_task_end_cb)(); -U0 (*fp_old_fill_buf)(SND_OUT_CONTAINER *buf,I64 buf_num)=NULL; - -U0 PolyFillBuf(SND_OUT_CONTAINER *buf,I64 buf_num) -{ //Gets called by HD Audio task -- $LK,"HDAudioTask","MN:HDAudioTask"$(). - -//Note: the buffer is in uncached memory -//so you might want to avoid multiple -//accesses due to slow speed. (If you were -//to add a bunch of waveforms together, you -//might want to do it in a cached buffer -//and copy it once.) - - I64 j,m,r; - F64 t,d; - if (poly_done) return; - t=ToF64((buf_num-start_buf_num)*(SND_BUF_LEN/SND_OCHANNELS))/SND_SAMPLE_RATE; - j=0; - while (j4.0) { - if (0.908.0) { - if (0.7012.0) { - if (0.3016.0) - m+=0.3*MAX_I32*Caw(t,1.0/6)*Sin(440.0*(2*ã)*t); - } - } - } - - //Samples are 24-bit, placed in upper 24 bits of an I32. - m*=snd_vol; - buf[j++]=ToI64(m*d)&0xFFFFFF00; //Left - buf[j++]=ToI64(m*(1.0-d))&0xFFFFFF00; //Right - - t+=1.0/SND_SAMPLE_RATE; - } -} - -U0 PolyTaskEndCB() -{ - poly_done=TRUE; - fp_snd_fill_buf=fp_old_fill_buf; - if (fp_task_end_cb) - (*fp_task_end_cb)(); - else - Exit; -} - -U0 PolyPhonic() -{ - if (snd_dev!=SD_HD_AUDIO) { - "Only works for HD Audio.\n"; - return; - } - poly_done=FALSE; - fp_task_end_cb=Fs->task_end_cb; - Fs->task_end_cb=&PolyTaskEndCB; //Catch or Kill() task - start_buf_num=snd_obuf_num; - fp_old_fill_buf=fp_snd_fill_buf; - fp_snd_fill_buf=&PolyFillBuf; - try -#if IncludeDepth<2 - PressAKey; -#else - View; -#endif - catch { //Catch , but pass it on to next higher handler. - fp_snd_fill_buf=fp_old_fill_buf; - Fs->task_end_cb=fp_task_end_cb; - } - poly_done=TRUE; - fp_snd_fill_buf=fp_old_fill_buf; - Fs->task_end_cb=fp_task_end_cb; -} - -//This is so I can use this file stand alone -//or as a component of a program. -#if IncludeDepth<2 -PolyPhonic; -#endif diff --git a/TempleOS/Demo/Snd/Record.CPP b/TempleOS/Demo/Snd/Record.CPP deleted file mode 100644 index b40f78a..0000000 --- a/TempleOS/Demo/Snd/Record.CPP +++ /dev/null @@ -1,120 +0,0 @@ -Bool record_stop,record_done; - -U0 (*fp_old_copy_buf)(SND_IN_CONTAINER *buf,I64 buf_num)=NULL; - -#define RECORD_BUF_SIZE (SND_BUF_LEN*0x100) - -SND_IN_CONTAINER *record_buf[2]; -I64 record_buf_iptr,record_ibuf_num,record_obuf_num; - -U0 RecordCopyBuf(SND_IN_CONTAINER *buf,I64) -{ - I64 j; - SND_IN_CONTAINER *_s=record_buf[record_ibuf_num&1]; - j=0; - while (j=RECORD_BUF_SIZE) { - record_buf_iptr=0; - record_ibuf_num++; - } -} - -U0 DrawIt(CTask *task,CDC *dc) -{ - SND_IN_CONTAINER *buf=_hda->istr0_buf[0]; - I64 i,x1,y1,x2=0,y2=0, - cy=task->win_pixel_height>>1; - dc->color=BLUE; - for (i=0;iwin_pixel_width/SND_BUF_LEN; - y1=cy-buf[i]*cy/MAX_I16; - GrLine(dc,x2,y2,x1,y1); - x2=x1; - y2=y1; - } - dc->color=RED; -} - -U0 RecordTaskEndCB() -{ - fp_snd_copy_buf=fp_old_copy_buf; - HDStop(TRUE,FALSE); - Free(record_buf[0]); - Free(record_buf[1]); - record_done=TRUE; - Exit; -} - -U0 RecordTask(U8 *filename) -{ - Bool old_io_snd; - U8 *fname=StrNew(filename),*fname2; - TaskInitExt; //needed for disk access - record_buf[0]=CAlloc(RECORD_BUF_SIZE*sizeof(SND_IN_CONTAINER)); - record_buf[1]=CAlloc(RECORD_BUF_SIZE*sizeof(SND_IN_CONTAINER)); - FileExtRem(fname); - record_buf_iptr=0; - record_ibuf_num=0; - record_obuf_num=0; - record_done=FALSE; - Fs->task_end_cb=&RecordTaskEndCB; - fp_old_copy_buf=fp_snd_copy_buf; - fp_snd_copy_buf=&RecordCopyBuf; - HDRun(TRUE,FALSE); - if (!IsSysDeterministic) - Preempt(ON); - old_io_snd=IOSnd(OFF); - while (!record_stop) { - if (record_ibuf_num>record_obuf_num) { - fname2=MSPrintF("%s%04d.SNZ",fname,record_obuf_num); - SndFileWrite(fname2,record_buf[record_obuf_num&1],RECORD_BUF_SIZE); - record_obuf_num++; - Free(fname2); - } - Sleep(1); - } - fname2=MSPrintF("%s%04d.SNZ",fname,record_obuf_num); - SndFileWrite(fname2,record_buf[record_obuf_num&1],record_buf_iptr); - record_obuf_num++; - Free(fname2); - Free(fname); - IOSnd(old_io_snd); - record_done=TRUE; -} - -U0 RecordDemo(U8 *filename="HOME/Record.SNZ") -{ - if (snd_dev!=SD_HD_AUDIO) { - "Only works for HD Audio.\n"; - return; - } - record_done=FALSE; - record_stop=FALSE; - Spawn(&RecordTask,filename,"Record .SNZ",Fs); - SettingsPush; //See $LK,"SettingsPush","MN:SettingsPush"$ - Preempt(OFF); - DocCursor; - DocClear; - Fs->draw_it=&DrawIt; - try - GetChar; - catch //Catch , but pass it on to next higher handler. - record_stop=TRUE; - record_stop=TRUE; - while (record_done) - Yield; - SettingsPop; - while (TRUE) { - "\n\nPlay "; - if (YorN) - SndFilePlaySeq(filename,record_obuf_num); - else - break; - } - NewLine(2); -} - -RecordDemo; diff --git a/TempleOS/Demo/Snd/SndScope.CPP b/TempleOS/Demo/Snd/SndScope.CPP deleted file mode 100644 index 611b7e5..0000000 --- a/TempleOS/Demo/Snd/SndScope.CPP +++ /dev/null @@ -1,46 +0,0 @@ -U0 DrawIt(CTask *task,CDC *dc) -{ - SND_OUT_CONTAINER *buf=_hda->ostr0_buf[0]; - I64 i,x1,y1,x2,y2, - cy=task->win_pixel_height>>1; - - dc->color=BLUE; - x2=0;y2=cy; - for (i=0;iwin_pixel_width/SND_BUF_LEN; - y1=cy-buf[i]*cy/snd_vol/MAX_I32; - GrLine(dc,x2,y2,x1,y1); - x2=x1;y2=y1; - } - - dc->color=GREEN; - x2=0;y2=cy; - for (i=1;iwin_pixel_width/SND_BUF_LEN; - y1=cy-buf[i]*cy/snd_vol/MAX_I32; - GrLine(dc,x2,y2,x1,y1); - x2=x1; y2=y1; - } -} - -U0 SndScope() -{ - if (snd_dev!=SD_HD_AUDIO) { - "Only works for HD Audio.\n"; - return; - } - SettingsPush; //See $LK,"SettingsPush","MN:SettingsPush"$ - SetWinHorz(1,18); - SetWinVert(15,TEXT_ROWS-2); - DocCursor; - DocClear; - Fs->draw_it=&DrawIt; - GetChar; - SettingsPop; -} - -//This is so I can use this file stand alone -//or as a component of a program. -#if IncludeDepth<2 -SndScope; -#endif diff --git a/TempleOS/Demo/Snd/Synth.CPP b/TempleOS/Demo/Snd/Synth.CPP deleted file mode 100644 index 0d8a320..0000000 --- a/TempleOS/Demo/Snd/Synth.CPP +++ /dev/null @@ -1,280 +0,0 @@ -#define M_WAVEFORM 0 -#define M_FREQUENCY 1 -#define M_ENVELOPE 2 - -#define M_NUM_MODES 3 - -I64 mode; -Bool my_ip_down; -I64 last_x,last_y; - -Bool synth_done; - -U0 (*fp_task_end_cb)(); -U0 (*fp_old_fill_buf)(SND_OUT_CONTAINER *buf,I64 buf_num)=NULL; - -#define NUM_BUF 8 -SND_OUT_CONTAINER my_buf[SND_BUF_LEN*NUM_BUF]; - -#define WF_BUF_LEN 2048 -#define WF_Y_SCALE 2048.0 -I64 waveform_buf[WF_BUF_LEN]; - -#define FQ_BUF_LEN 2048 -#define FQ_Y_SCALE 2048.0 -I64 frequency_buf[FQ_BUF_LEN]; -F64 fq_scale; - -#define EL_BUF_LEN 2048 -#define EL_Y_SCALE 2048.0 -I64 envelope_buf[EL_BUF_LEN]; -F64 el_scale; - -U0 SynthFillBuf(SND_OUT_CONTAINER *buf,I64 buf_num) -{ - I64 i,j,l,k0,k1,k2,k3; - F64 d; - static F64 k=0; - if (synth_done) return; - j=0; - k0=buf_num*(SND_BUF_LEN/SND_OCHANNELS); - while (jwin_pixel_height>>1, - h_max=task->win_pixel_width-1; - - if (!win_show_menu) { - if (ip_lb) { - if (my_ip_down) - switch (mode) { - case M_WAVEFORM: - Line(NULL, - (last_x-task->win_pixel_left-task->win_scroll_x)*WF_BUF_LEN/h_max, - WF_Y_SCALE*(cy-last_y+task->win_pixel_top+task->win_scroll_y)/cy,0, - ( ipx-task->win_pixel_left-task->win_scroll_x)*WF_BUF_LEN/h_max, - WF_Y_SCALE*(cy-ipy+task->win_pixel_top+task->win_scroll_y)/cy,0, - &WFPlot); - break; - case M_FREQUENCY: - Line(NULL, - (last_x-task->win_pixel_left-task->win_scroll_x)*FQ_BUF_LEN/h_max, - FQ_Y_SCALE*(cy-last_y+task->win_pixel_top+task->win_scroll_y)/cy,0, - ( ipx-task->win_pixel_left-task->win_scroll_x)*FQ_BUF_LEN/h_max, - FQ_Y_SCALE*(cy-ipy+task->win_pixel_top+task->win_scroll_y)/cy,0, - &FQPlot); - break; - case M_ENVELOPE: - Line(NULL, - (last_x-task->win_pixel_left-task->win_scroll_x)*EL_BUF_LEN/h_max, - EL_Y_SCALE*(cy-last_y+task->win_pixel_top+task->win_scroll_y)/cy,0, - ( ipx-task->win_pixel_left-task->win_scroll_x)*EL_BUF_LEN/h_max, - EL_Y_SCALE*(cy-ipy+task->win_pixel_top+task->win_scroll_y)/cy,0, - &ELPlot); - break; - } - my_ip_down=TRUE; - last_x=ipx; - last_y=ipy; - } else - my_ip_down=FALSE; - } - - x2=-1; - if (mode==M_WAVEFORM && Blink) { - dc->color=ROPF_DITHER+WHITE<<16+RED; - GrPutS(dc,0,cy-FONT_HEIGHT,"Set Waveform."); - } else - dc->color=RED; - for (i=0;iwin_pixel_width/WF_BUF_LEN; - y1=cy-cy*waveform_buf[i]/WF_Y_SCALE; - if (x2>=0) - GrLine(dc,x2,y2,x1,y1); - x2=x1; - y2=y1; - } - - x2=-1; - if (mode==M_FREQUENCY && Blink) { - dc->color=ROPF_DITHER+WHITE<<16+BLUE; - GrPutS(dc,0,cy-FONT_HEIGHT,"Set Frequency."); - } else - dc->color=BLUE; - for (i=0;iwin_pixel_width/FQ_BUF_LEN; - y1=cy-cy*frequency_buf[i]/FQ_Y_SCALE; - if (x2>=0) - GrLine(dc,x2,y2,x1,y1); - GrLine(dc,x2,cy-(y2-cy),x1,cy-(y1-cy)); - x2=x1; - y2=y1; - } - - x2=-1; - if (mode==M_ENVELOPE && Blink) { - dc->color=ROPF_DITHER+WHITE<<16+GREEN; - GrPutS(dc,0,cy-FONT_HEIGHT,"Set Envelope."); - } else - dc->color=GREEN; - for (i=0;iwin_pixel_width/EL_BUF_LEN; - y1=cy-cy*envelope_buf[i]/EL_Y_SCALE; - if (x2>=0) - GrLine(dc,x2,y2,x1,y1); - GrLine(dc,x2,cy-(y2-cy),x1,cy-(y1-cy)); - x2=x1; - y2=y1; - } - - dc->color=BLACK; - GrLine(dc,0,cy,task->win_pixel_width,cy); -} - -U0 SetMenu() -{ - MenuEntryFind(Fs->cur_menu,"Mode/Waveform")->checked=mode==M_WAVEFORM; - MenuEntryFind(Fs->cur_menu,"Mode/Frequency")->checked=mode==M_FREQUENCY; - MenuEntryFind(Fs->cur_menu,"Mode/Envelope")->checked=mode==M_ENVELOPE; -} - -U0 Init() -{ - my_ip_down=FALSE; - mode=M_WAVEFORM; - MemSetU64(&waveform_buf[0] ,-0.5 *WF_Y_SCALE,WF_BUF_LEN/2); - MemSetU64(&waveform_buf[WF_BUF_LEN/2] , 0.5 *WF_Y_SCALE,WF_BUF_LEN/2); - MemSetU64(frequency_buf , 0.25*FQ_Y_SCALE,FQ_BUF_LEN); - MemSetU64(envelope_buf , 0.75*EL_Y_SCALE,EL_BUF_LEN); - fq_scale=0.02; - el_scale=0.02; - SetMenu; -} - -U0 Synth() -{ - I64 p1,p2; - if (snd_dev!=SD_HD_AUDIO) { - "Only works for HD Audio.\n"; - return; - } - - SettingsPush; //See $LK,"SettingsPush","MN:SettingsPush"$ - Preempt(OFF); - MenuPush( - "File {" - " New(,'\n');" - " Abort(,CH_SHIFT_ESC);" - " Exit(,CH_ESC);" - "}" - "Mode {" - " Waveform(,'1');" - " Frequency(,'2');" - " Envelope(,'3');" - "}" - ); - WordStat; - WinMax; - WinBorder; - Fs->win_inhibit=WIF_ALL-WIF_MENU; - - Init; - - synth_done=FALSE; - fp_task_end_cb=Fs->task_end_cb; - Fs->task_end_cb=&SynthTaskEndCB; //Catch or Kill() task - fp_old_fill_buf=fp_snd_fill_buf; - fp_snd_fill_buf=&SynthFillBuf; - DocCursor; - DocClear; - Fs->draw_it=&DrawIt; - try { - while (TRUE) { - switch (GetMsg(&p1,&p2,1<, but pass it on to next higher handler. - fp_snd_fill_buf=fp_old_fill_buf; - Fs->task_end_cb=fp_task_end_cb; - } - synth_done=TRUE; - fp_snd_fill_buf=fp_old_fill_buf; - Fs->task_end_cb=fp_task_end_cb; - SettingsPop; -} - -Synth; diff --git a/TempleOS/Demo/Snd/WaterFowl.CPP b/TempleOS/Demo/Snd/WaterFowl.CPP index 682fdba9e4d7c1177718e70fd27f6c043b0a24b2..51d0ff487d5d91dd654e746f04a533a8e81ea652 100644 GIT binary patch delta 623 zcmbO#_g~5=)Ive4AU`$NR>i|d$3R8J&0WV#g-a>aZO&uBE`rxxspYPk!!LCi;fCcNJf6CdQpi& zdVXH2jzURBszPE?WpS}Wewso?YGPSx9v9c-U(B+MT$4{Q>oRgpp2n=Jz~z{iqEMWl zpQligkyxTolAoEQP@IvNlcSKDm!iYPHQAe4j*)A!46_y^*W_1BAZ;g@WI@(1U;>#` z#iYo{HQAF1h3f zlTlWhiz_6fQXwrfy|gG*AuT6Av7}fbF(*GSU5{(BHCPopqrMJTSYl>gP9@kwY5CTEJ z%*n~jOIJuqE!W{v;F>5eA;T4tuaKw^o>-Dv1Txo}OG(AeT?G^;hANYbSkoupVlA9J zhds5POF&>%xs+j;O^|KNH delta 1003 zcmew_HC4_j)Ive4AU`$NmWxX%Bwry>Aw01pwJ0sWJSWCLiAyP|QXxDuCnqy8SHZb7 zCnq&e!KtV+F|PzHsQ@M?ce2Q^LReueMo^Y2i-9dzEF_~+p*TM$vm~*oQlUJt(jF`d z(HWMQnU_L0OW_T2R)1CP{51)gc+FMX3sz#R`cE0r};rMGEB^ z`NgRU$%#c!M{H%%f$E&hr05UU>64$As!*Pomy%kPnU}7kkW^Ztke6Sgkdt3rg6tB< zoE(LeM3C<)70NU7(u)-`63bE*(h~FX)KkDFP1a!2g_{1C5$3{sjB?yyS*U;ZGs65c zkrAdknNc?wtR^@=KTjcFJ+(-o1Qg5}sW~O7MX4zYd8w#w3CYMWRWB-0NYBqp)d7ch zVp3&su|j^DLPlz0S!y2Gw25D#o}G9C##k$b?3jrYq#^E|7;OS&7-=Yh^@0+KLQZO8 zib8IsLUBoIL9s$&QD%AuI7lYnVM(9t#9Cw!P+Ag@pPH-T9Fka^t)Qjj?BcATm6ELE zX=b8O4kj}+xvIGo6x_^A6iP~LCnvCpm|1fvD1a1X>SWoLlxS%L_`CYX`*`}f25XyW zYPtFQg~WTfdb)dr=w|2}>2N84K!xpOD>k`$kXBFvFD|hKrEw59C0W-lIX@@A$kxT% zJ;*T##QZN(*;AWIb#ic7R@gG-8hQu8#5OEk3&L87%>wUgJgW(mN803=qD zSe!jMk4s({7JMK9os?vqa-EFHQ`yv*K_T^)O`Oqs@-{YerjnA)EbJM~lY6;rCZFQ6 K+RVyb#RLFy+ZH|m diff --git a/TempleOS/Demo/Spy.CPP b/TempleOS/Demo/Spy.CPP index 71be0bd..8c2f79f 100644 --- a/TempleOS/Demo/Spy.CPP +++ b/TempleOS/Demo/Spy.CPP @@ -12,7 +12,7 @@ U0 SpyStkRep(CTask *task) DocDblBufSwap; WinMgrSync; } - if (DocCur==doc) DocDblBufSwap; + if (DocPut==doc) DocDblBufSwap; DocDblBufEnd; Preempt(old_preempt); } @@ -28,7 +28,7 @@ U0 SpyCallerRep(CTask *task) DocDblBufSwap; WinMgrSync; } - if (DocCur==doc) DocDblBufSwap; + if (DocPut==doc) DocDblBufSwap; DocDblBufEnd; Preempt(old_preempt); } diff --git a/TempleOS/Demo/WebLogExample/WebLogRep.CPP b/TempleOS/Demo/WebLogExample/WebLogRep.CPP index 5975ad6..c154ea6 100644 --- a/TempleOS/Demo/WebLogExample/WebLogRep.CPP +++ b/TempleOS/Demo/WebLogExample/WebLogRep.CPP @@ -75,7 +75,7 @@ U0 PrsSingleLogFile(LogStruct *root,U8 *name) ds.min=A2I(src,10,&src); if (*src++!=':') throw; ds.sec=A2I(src,10,&src); - templg->datetime=CDateStruct2CDate(&ds); + templg->datetime=DateStruct2Date(&ds); if (*src++!=CH_SPACE) throw; i=A2I(src,10,&src); templg->datetime-=(i/100+i%100/60.0)*CDATE_FREQ*60*60; @@ -431,13 +431,11 @@ U0 WebLogRep(U8 *mask,U8 *output_filename) IndexRep(root,start,end); DownLoadRep(root,start,end); - StrCpy(DocCur->filename.name,output_filename); - DocWrite(DocCur,TRUE); + StrCpy(DocPut->filename.name,output_filename); + DocWrite(DocPut,TRUE); "$$WW,1$$"; LogLstDel(root); } -#if IncludeDepth<2 WebLogRep("::/TempleOS/Demo/WebLogExample/*.LOG*","::/TempleOS/Demo/WebLogExample/WebLogRep.TXT.Z"); -#endif diff --git a/TempleOS/Demo/WebLogExample/access_090509.LOG b/TempleOS/Demo/WebLogExample/access_090509.LOG index 494e6ea..95ab9c2 100644 --- a/TempleOS/Demo/WebLogExample/access_090509.LOG +++ b/TempleOS/Demo/WebLogExample/access_090509.LOG @@ -568,7 +568,7 @@ 173.186.151.229 - - [08/May/2009:17:51:32 -0700] "HEAD /media/Tanks.wmv HTTP/1.1" 200 0 "-" "Mozilla/4.0 (compatible; MSIE 5.01; Windows NT 5.0)" "templeos.org" 173.186.151.229 - - [08/May/2009:17:55:48 -0700] "HEAD /media/Demo2c.wmv HTTP/1.1" 404 0 "-" "Mozilla/4.0 (compatible; MSIE 5.01; Windows NT 5.0)" "templeos.org" 173.186.151.229 - - [08/May/2009:17:57:42 -0700] "HEAD /media/Demo1.wmv HTTP/1.1" 200 0 "-" "Mozilla/4.0 (compatible; MSIE 5.01; Windows NT 5.0)" "templeos.org" -173.186.151.229 - - [08/May/2009:17:58:59 -0700] "HEAD /media/BirdLand.wmv HTTP/1.1" 404 0 "-" "Mozilla/4.0 (compatible; MSIE 5.01; Windows NT 5.0)" "templeos.org" +173.186.151.229 - - [08/May/2009:17:58:59 -0700] "HEAD /media/BugBird.wmv HTTP/1.1" 404 0 "-" "Mozilla/4.0 (compatible; MSIE 5.01; Windows NT 5.0)" "templeos.org" 62.102.171.88 - - [08/May/2009:18:00:33 -0700] "GET /v502.html HTTP/1.1" 404 275 "http://www.semantic.hn/" "AppEngine-Google; (+http://code.google.com/appengine)" "www.templeos.org" 107.8.88.161 - - [08/May/2009:18:00:46 -0700] "GET / HTTP/1.1" 200 81188 "http://www.google.com/search?q=64-bit+operating+systems&rls=com.microsoft:en-us:IE-Address&ie=UTF-8&oe=UTF-8&sourceid=ie7&rlz=1I7GPCK_enUS320" "Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 6.0; Win64; x64; Trident/4.0; .NET CLR 2.0.50727; SLCC1; Media Center PC 5.0; MDDC; .NET CLR 3.5.30729; .NET CLR 3.0.30618)" "www.templeos.org" 107.8.88.161 - - [08/May/2009:18:00:46 -0700] "GET /images/Header.JPG HTTP/1.1" 200 2982 "http://www.templeos.org/" "Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 6.0; Win64; x64; Trident/4.0; .NET CLR 2.0.50727; SLCC1; Media Center PC 5.0; MDDC; .NET CLR 3.5.30729; .NET CLR 3.0.30618)" "www.templeos.org" diff --git a/TempleOS/Demo/WebLogExample/access_090510.LOG b/TempleOS/Demo/WebLogExample/access_090510.LOG index 38908e6..710b148 100644 --- a/TempleOS/Demo/WebLogExample/access_090510.LOG +++ b/TempleOS/Demo/WebLogExample/access_090510.LOG @@ -400,8 +400,8 @@ 69.197.213.246 - - [09/May/2009:14:30:38 -0700] "GET /TempleOSCD.ISO HTTP/1.1" 200 4704256 "-" "Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.8.1.6) Gecko/20070725 Firefox/2.0.0.6" "www.templeos.org" 62.102.171.181 - - [09/May/2009:14:34:25 -0700] "GET /v502.html HTTP/1.1" 404 275 "http://www.semantic.hn/" "AppEngine-Google; (+http://code.google.com/appengine)" "www.templeos.org" 93.112.218.191 - - [09/May/2009:14:39:38 -0700] "GET /logs/?D=D HTTP/1.0" 401 395 "-" "Mozilla/5.0 (compatible; Yahoo! Slurp/3.0; http://help.yahoo.com/help/us/ysearch/slurp)" "www.templeos.org" -29.174.77.122 - - [09/May/2009:14:39:57 -0700] "GET /media/BirdLand.wmv HTTP/1.0" 404 275 "http://www.templeos.org/birdland.html" "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1)" "www.templeos.org" -29.174.77.122 - - [09/May/2009:14:39:58 -0700] "GET /media/BirdLand.wmv HTTP/1.0" 404 275 "http://www.templeos.org/birdland.html" "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1)" "www.templeos.org" +29.174.77.122 - - [09/May/2009:14:39:57 -0700] "GET /media/BugBird.wmv HTTP/1.0" 404 275 "http://www.templeos.org/birdland.html" "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1)" "www.templeos.org" +29.174.77.122 - - [09/May/2009:14:39:58 -0700] "GET /media/BugBird.wmv HTTP/1.0" 404 275 "http://www.templeos.org/birdland.html" "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1)" "www.templeos.org" 29.40.241.151 - - [09/May/2009:14:42:04 -0700] "GET /TempleOSCD.ISO HTTP/1.1" 200 4704256 "-" "Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 6.0; Trident/4.0; SLCC1; .NET CLR 2.0.50727; .NET CLR 3.0.04506; InfoPath.2; OfficeLiveConnector.1.3; OfficeLivePatch.1.3)" "www.templeos.org" 29.40.241.151 - - [09/May/2009:14:42:27 -0700] "GET /TempleOSCD.ISO HTTP/1.1" 200 4704256 "-" "Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 6.0; Trident/4.0; SLCC1; .NET CLR 2.0.50727; .NET CLR 3.0.04506; InfoPath.2; OfficeLiveConnector.1.3; OfficeLivePatch.1.3)" "www.templeos.org" 106.236.2.182 - - [09/May/2009:14:42:55 -0700] "GET /V421.html HTTP/1.1" 404 275 "http://www.templeos.org/V421.html" "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1)" "www.templeos.org" diff --git a/TempleOS/Demo/WinMgr2.CPP b/TempleOS/Demo/WinMgr2.CPP deleted file mode 100644 index 0c83ee3..0000000 --- a/TempleOS/Demo/WinMgr2.CPP +++ /dev/null @@ -1,161 +0,0 @@ - -/* -You must "Adam Include" this because the Adam task's memory is never freed, -so the code for this file will not be yanked from underneath the task. - - $WW,1$This is a really bad alternative window mgr. It augments the existing -one found in $LK-A,"::/TempleOS/Adam/Window.CPP"$. It uses the real-time differential equation solver to reposition windows as though they were repulsively charged particles. I find this window mgr 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,"DISPLAYf_USER_HAS_BEEN_RESIZED","MN:DISPLAYf_USER_HAS_BEEN_RESIZED"$ and modified $LK-A,"::/TempleOS/Adam/Window.CPP"$. - -The differential equation stuff was overkill and made it overly complicated. Oh, well. -$WW,0$*/ - -U0 MyDerivative(CMathODE *ode,F64,COrder2D3 *state,COrder2D3 *DstateDt) -{ - I64 i,j,task_cnt=ode->n/6; - F64 f,d,dd,dx,dy; - COrder2D3 *tempo; - if (!task_cnt) return; - - MemSet(DstateDt,0,sizeof(COrder2D3)*task_cnt); - - tempo=DstateDt; - for (i=0;ix=state[i].DxDt; - tempo->y=state[i].DyDt; - for (j=0;jDxDt+=f*dx; //Repulsive force like electro-static - tempo->DyDt+=f*dy; - } - } - } - - tempo=DstateDt; //a=-v (Damp-out motion.) - for (i=0;iDxDt-=state[i].DxDt; - tempo->DyDt-=state[i].DyDt; - } -} - -U0 WinMngTask(I64) -{ //Preempt() is off after Spawn() - Bool same=FALSE; - I64 i,j,w,h,x,y,cnt,task_cnt=0; - COrder2D3 *tempo; - CTask *task,**task_map=NULL; - CMathODE *ode=NULL; - - while (TRUE) { -restart: - WinMgrSync; - while (Bt(&sys_semas[SYS_SEMA_REFRESH_IN_PROGRESS],0)) - Yield; - cnt=0; - task=Fs->next_task; - while (task!=Fs) { - if (Bt(&task->display_flags,DISPLAYf_SHOW)) - cnt++; - task=task->next_task; - } - if (!cnt) { - same=FALSE; - goto restart; - } - - if (same && cnt==task_cnt) { - i=0; - task=Fs->next_task; - while (task!=Fs) { - if (Bt(&task->display_flags,DISPLAYf_SHOW)) - if (task_map[i++]!=task) - same=FALSE; - task=task->next_task; - } - } else - same=FALSE; - if (!same) { - task_cnt=cnt; - if (task_map) { - Free(task_map); - QueRem(ode); - ODEDel(ode); - } - task_map=MAlloc(sizeof(U8 *)*task_cnt); - ode=ODENew(task_cnt*6,0.1); - ode->derivative=&MyDerivative; - QueIns(ode,Fs->last_ode); - - i=0; - task=Fs->next_task; - while (task!=Fs) { - if (Bt(&task->display_flags,DISPLAYf_SHOW)) { - tempo=ode->state(U8 *)+sizeof(COrder2D3)*i; - task_map[i++]=task; - w=task->win_width-1; - h=task->win_height-1; - tempo->x=task->win_left+w>>1; - tempo->y=task->win_top+h>>1; - tempo->DxDt=0; - tempo->DyDt=0; - } - task=task->next_task; - } - same=TRUE; - } else { - tempo=ode->state; - for (i=0;iwin_width-1; - h=task->win_height-1; - if (LBtr(&task->display_flags,DISPLAYf_USER_HAS_BEEN_RESIZED)) { - tempo->x=task->win_left+w>>1; - tempo->y=task->win_top+h>>1; - tempo->DxDt=0; - tempo->DyDt=0; - } else { - x=task->win_left+w>>1; - y=task->win_top+h>>1; - tempo->x=Limit(tempo->x,x-2,x+2); //Only move up to 2 chars at a time - tempo->y=Limit(tempo->y,y-2,y+2); - - j=Round(tempo->x-w>>1); - if (Bt(&task->display_flags,DISPLAYf_NO_BORDER)) - j=LimitI64(j,0,TEXT_COLS-1-w); - else - j=LimitI64(j,1,TEXT_COLS-2-w); - SetWinHorz(j,j+w,task); - - j=Round(tempo->y-h>>1); - if (Bt(&task->display_flags,DISPLAYf_NO_BORDER)) - j=LimitI64(j,0,TEXT_ROWS-1-h); - else - j=LimitI64(j,1,TEXT_ROWS-2-h); - SetWinVert(j,j+h,task); - - x=task->win_left+(task->win_width-1)>>1; - y=task->win_top+(task->win_height-1)>>1; - if (LBtr(&task->display_flags,DISPLAYf_USER_HAS_BEEN_RESIZED)) { - tempo->x=x; - tempo->y=y; - } - tempo->DxDt=Limit(tempo->DxDt,-8.0,8.0); //+/- 8 chars/sec - tempo->DyDt=Limit(tempo->DyDt,-8.0,8.0); - } - } - } - } -} - -Spawn(&WinMngTask,NULL,"Window Mgr 2"); diff --git a/TempleOS/Doc/Acknowledgements.TXT b/TempleOS/Doc/Acknowledgements.TXT index f1fc3ff..e4570fa 100644 --- a/TempleOS/Doc/Acknowledgements.TXT +++ b/TempleOS/Doc/Acknowledgements.TXT @@ -1,7 +1,5 @@ $WW,1$$FG,5$$TX+CX,"Acknowledgements"$$FG$ -I am a for profit company, not an academic. I have never seen a commercial product with acknowledgements like an academic paper. Never-the-less, here are references. (I don't know the original sources on many of these.) - 1) The font, $LK-A,"::/TempleOS/Kernel/Font8x8.CPP"$, is taken from $FG,4$$TX+HTML,"FreeDOS","http://www.freedos.org"$$FG$. 2) $LK-A,"::/TempleOS/Kernel/Dsk/ATADef.HPP"$ originally @@ -15,35 +13,33 @@ from Linux. I later got the spec. 6) The random number generator is from the book, $UL,1$Numeric Recipies in C$UL,0$. -7) The pilgrim game map is from $FG,4$$TX+HTML,"US Geological Survey","http://nationalatlas.gov/mapmaker"$$FG$. (Screen captured and edited with MS Paint and saved as $FG,2$.BMP$FG$ and imported into TempleOS and converted with a program I wrote.) +7) Tne sheep and goats in AfterEgypt are from $FG,4$$TX+HTML,"http://www.public-domain-photos.com","http://www.public-domain-photos.com"$$FG$. -8) Tne sheep in AfterEgypt is from $FG,4$$TX+HTML,"http://www.public-domain-photos.com","http://www.public-domain-photos.com"$$FG$. +8) The $FG,2$FAT32$FG$ file system is owned by MicroSoft. -9) The $FG,2$FAT32$FG$ file system is owned by MicroSoft. +9) A few features were inspired by $FG,2$MATLAB$FG$, such as $FG,2$ans$FG$ in expressions at the command-line. There is a lot of $FG,2$MSDOS$FG$ , $FG,2$Windows$FG$, $FG,2$VAXTMOS$FG$ (VAX Ticketmaster O.S.) and $FG,2$Unix$FG$ inspiration, too, such as drive letters, command names, etc. -10) A few features were inspired by $FG,2$MATLAB$FG$, such as $FG,2$ans$FG$ in expressions at the command-line. There is a lot of $FG,2$MSDOS$FG$ , $FG,2$Windows$FG$, $FG,2$VAXTMOS$FG$ (VAX Ticketmaster O.S.) and $FG,2$Unix$FG$ inspiration, too, such as drive letters, command names, etc. +10) I included $LK+HTML,"PCIDevice Lst File","FI:::/TempleOS/Misc/PCIDevices.TXT","http://www.pcidatabase.com/reports.php?type=tab-delimeted"$. -11) I included $LK+HTML,"PCIDevice Lst File","FI:::/TempleOS/Misc/PCIDevices.TXT","http://www.pcidatabase.com/reports.php?type=tab-delimeted"$. +11) Thanks to whoever wrote this $FG,4$$TX+HTML,"CppHtml.CPP.Z","http://web.archive.org/web/20100325153025/http://home.scarlet.be/zoetrope/cpphtml.htm"$$FG$. I'm a novice on web stuff and you helped me with html. See $LK,"ToHtml","FI:::/TempleOS/Adam/Utils/ToHtml.CPP"$. -12) Thanks to whoever wrote this $FG,4$$TX+HTML,"CppHtml.CPP.Z","http://web.archive.org/web/20100325153025/http://home.scarlet.be/zoetrope/cpphtml.htm"$$FG$. I'm a novice on web stuff and you helped me with html. See $LK,"ToHtml","FI:::/TempleOS/Adam/ToHtml.CPP"$. +12) Yahoo Sitebuilder helped with some html code items. -13) Yahoo Sitebuilder helped with some html code items. +13) I used $FG,4$$TX+HTML,"MagicISO","http://www.magiciso.com"$$FG$ to burn test CD's to help me understand the ISO9660 file system format. I mostly used the $FG,4$$TX+HTML,"ISO9660","http://users.telenet.be/it3.consultants.bvba/handouts/ISO9960.html"$$FG$ spec. -14) I used $FG,4$$TX+HTML,"MagicISO","http://www.magiciso.com"$$FG$ to burn test CD's to help me understand the ISO9660 file system format. I mostly used the $FG,4$$TX+HTML,"ISO9660","http://users.telenet.be/it3.consultants.bvba/handouts/ISO9960.html"$$FG$ spec. +14) I looked at bootable CD boot sects, but didn't learn anything, finding it easier to make my own. -15) I looked at bootable CD boot sects, but didn't learn anything, finding it easier to make my own. +15) I think I got my original PC speaker code from $FG,2$Borland C$FG$. -16) I think I got my original PC speaker code from $FG,2$Borland C$FG$. +16) I found PS/2 keyboard and mouse code on the net and documentation. My code is very different. I found VGA register info on the net. -17) I found PS/2 keyboard and mouse code on the net and documentation. My code is very different. I found VGA register info on the net. +17) Thanks to $FG,4$$TX+HTML,"http://www.osdev.org","http://www.osdev.org"$$FG$ for a couple tips. -18) Thanks to $FG,4$$TX+HTML,"http://www.osdev.org","http://www.osdev.org"$$FG$ for a couple tips. +18) God told me to stick with 640x480 16 color, a single audio voice and kept me from zombie-walking into making child windows like $FG,2$Windows$FG$. Instead, I made one window per task with no child windows. He also guided my progress, very obviously. -19) God told me to stick with 640x480x16 color and kept me from blindly making child windows like $FG,2$Windows$FG$. Instead, I made one window per task with no child windows. He also guided my progress, very obviously. +19) I got $FG,4$$TX+HTML,"Webster's Dictionary","http://www.templeos.org/files/DICTIONARY.TXT"$$FG$ and $FG,4$$TX+HTML,"The King James Bible","http://www.templeos.org/files/BIBLE.TXT"$$FG$ from $FG,4$$TX+HTML,"Project Gutenberg","http://promo.net/pg/"$$FG$. -20) I got $FG,4$$TX+HTML,"Webster's Dictionary","http://www.templeos.org/files/DICTIONARY.TXT"$$FG$ and $FG,4$$TX+HTML,"The King James Bible","http://www.templeos.org/files/BIBLE.TXT"$$FG$ from $FG,4$$TX+HTML,"Project Gutenberg","http://promo.net/pg/"$$FG$. - -In short, I wrote every one of the $TX+D,"139,633","DD_TEMPLEOS_LOC"$ lines myself, no $FG,2$GPL$FG$ code, no linkage or dependence on other code. Anyone who says otherwise is being an ass. +In short, I wrote every one of the $TX+D,"129,624","DD_TEMPLEOS_LOC"$ lines myself, no $FG,2$GPL$FG$ code, no linkage or dependence on other code. Anyone who says otherwise is being an ass. $FG,8$ * "MSDOS", "Windows", "MovieMaker" "MS Paint" and "FAT32" are trademarks of MicroSoft Corp. * "SiteBuilder" is a trademark of Yahoo! Inc. @@ -53,3 +49,4 @@ $FG,8$ * "VAX" is a trademark of Digital Equipment Corp. * "Linux" is probably a trademark owned by Linus Torvalds. * "VAXTMOS" is a trademark of Ticketmaster. +$FG$ \ No newline at end of file diff --git a/TempleOS/Doc/AutoFile.TXT b/TempleOS/Doc/AutoFile.TXT index 2cffdbe..f0a7070 100644 --- a/TempleOS/Doc/AutoFile.TXT +++ b/TempleOS/Doc/AutoFile.TXT @@ -1,8 +1,7 @@ $WW,1$$FG,2$AutoFiles$FG$ are used to generate user input to automate operations. The TempleOS tour is done with an $FG,2$AutoFile$FG$. -When an $FG,2$AutoFile$FG$ runs, a child task is $LK,"Spawn","MN:Spawn"$()ed which intercepts real user input and generates fake input. AutoFiles are $FG,2$C+$FG$ programs run by the child who's stdout goes to the parent's input buffer. $LK,"Msg","MN:Msg"$() can be included in an $FG,2$AutoFile$FG$ to send special keys or mouse cmds to the parent. While an $FG,2$AutoFile$FG$ 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$. +When an $FG,2$AutoFile$FG$ runs, a child task is $LK,"Spawn","MN:Spawn"$()ed which intercepts real user input and generates fake input. AutoFiles are $LK,"Holy C","FI:::/TempleOS/Doc/HolyC.TXT"$ programs run by the child who's stdout goes to the parent's input buffer. $LK,"Msg","MN:Msg"$() can be included in an $FG,2$AutoFile$FG$ to send special keys or mouse cmds to the parent. While an $FG,2$AutoFile$FG$ 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-A,"::/TempleOS/Demo/AutoFile/AFDir.AUT"$. Note: $LK,"Auto","MN:Auto"$("") can be used if all you need is to send ASCII characters. It differs from $LK,"AutoStr","MN:AutoStr"$(). You'll probably use $LK,"Auto","MN:Auto"$() a lot and not $LK,"AutoStr","MN:AutoStr"$(). With $LK,"Auto","MN:Auto"$(), for example, you can place answers to the prompts for recompiling the $FG,2$Kernel$FG$ module during $LK,"MakeOSInstallPrtBootLoader","MN:MakeOSInstallPrtBootLoader"$(). - diff --git a/TempleOS/Doc/Bit.TXT b/TempleOS/Doc/Bit.TXT index b9e69cc..3d860d1 100644 --- a/TempleOS/Doc/Bit.TXT +++ b/TempleOS/Doc/Bit.TXT @@ -6,11 +6,9 @@ $FG,2$Btr$FG$: Bit Test and Rst to zero $FG,2$Btc$FG$: Bit Test and Compliment (toggle) $FG,2$BEqu$FG$: Set bit to value. -$FG$$FG,5$Bit operations are "atomic" meaning they won't be interrupted between the testing of the bit and the alteration. This is important when multitasking. With multiprocessing, you should "Lock" these operations.$FG$ +$FG$$FG,5$Bit operations are "atomic" meaning they won't be interrupted between the testing of the bit and the alteration. This is important when multitasking. With multicore processing, you should "Lock" these operations.$FG$ $FG,5$These don't take a pointer, but the actual field.$FG$ $FG,2$Bsf$FG$: Bit Scan Fwd (Pos of first low one bit or -1) $FG,2$Bsr$FG$: Bit Scan Reverse (Pos of first high one bit or -1) $FG,2$BCnt$FG$: Bit Cnt (Cnt of set bits) - - diff --git a/TempleOS/Doc/Boot.TXT b/TempleOS/Doc/Boot.TXT index 4d7918c437db2f349d85ff34efc8afab00e0bbfe..7ff0b01164f42d9e0e7f0ec5668cd9c473d4ff8b 100644 GIT binary patch delta 109 zcmbQF)UUK*7CVbmetya1x$MQ8g*bTGCoA&H$%Ulm7UZP*2P^nG1u=+UU|?WyU|?W? piB68?pQi)kC^)<52KoCcfDG};PfSTIVi4cKz`#&}tU+DiH2?=JAh!Sj delta 87 zcmeBInxwR07CW;`arWeS?8QuaQJV!hc-be*@GHpq$FG$ bitmap edit menu. +* Changed $LK-A,"::/TempleOS/Demo/Games/BulgeBomber.CPP"$. + +$IV,1$----06/02/13 21:25:49----$IV,0$ +* Got rid of 3 arg in-line (built-in) functions. +* Got rid of $FG,2$? :$FG$ operator. +* Improved unassembler code. +* Improved compiler code. + +$IV,1$----05/27/13 08:15:31----$IV,0$ +* $BK,1$TempleOS version 1.02 Released$BK,0$ +* Added help to $FG,2$$FG$. +* Added $FG,2$PopUp$FG$ flag for links. +* $LK,"R","MN:R"$("Triangle","Tri"); + +$IV,1$----05/25/13 13:47:35----$IV,0$ +* $LK,"R","MN:R"$("PopUpDitherColor","PopUpColorDither"); +* $LK,"R","MN:R"$("PopUpLightingColor","PopUpColorLighting"); +* Changed sprite edit. + +$IV,1$----05/24/13 20:15:47----$IV,0$ +* Fixed compiler bug involving passing float array to function. + +$IV,1$----05/16/13 07:09:21----$IV,0$ +* Changed $LK,"DocPutLine","MN:DocPutLine"$(). +* Moved tag to $LK,"CDocEntryBase","MN:CDocEntryBase"$. + +$IV,1$----05/12/13 14:15:07----$IV,0$ +* Improved documentation. +* Moved profiler from Adam2 to Adam3. + +$IV,1$----05/11/13 03:31:59----$IV,0$ +* $LK,"R","MN:R"$("MemPtAtPageTableEntry","MemPageTable"); +* Removed CGrVectMap. +* Removed demos: WinMgr2, Bling, Noise, Layers3DJob, Rocks, MissileDefense, Chess and Pilgrim. +* Removed hooks for HD Audio. +* Removed accents and waveforms from $LK,"Play","MN:Play"$(). + +$IV,1$----05/08/13 13:04:22----$IV,0$ +* $LK,"R","MN:R"$("NativeFS","RedSeaFS"); +* $LK,"R","MN:R"$("C+","Holy C"); + +$IV,1$----04/30/13 06:15:35----$IV,0$ +* $LK,"R","MN:R"$("GameStarters","Games"); + +$IV,1$----04/26/13 07:25:50----$IV,0$ +* Fixed bug with Bible links. + +$IV,1$----04/10/13 12:41:18----$IV,0$ +* $FG,4$dft_drv$FG$ is now $FG,4$*sys_acct$FG$. +* Made so RAM drives are not reformatted at boot. +* $FG,4$$BK,1$WARNING$BK,0$$FG$: Added new prompt to RAM disk creation. +* Added $LK,"StreamExePutS","MN:StreamExePutS"$() and $LK,"StreamExePrintF","MN:StreamExePrintF"$(). + +$IV,1$----04/08/13 10:46:20----$IV,0$ +* $BK,1$TempleOS version 1.01 Released$BK,0$ +* Compiler optimization for $LK,"Bt","MN:Bt"$(), $LK,"Bts","MN:Bts"$(), $LK,"Btr","MN:Btr"$(), etc. + +$IV,1$----04/06/13 07:39:53----$IV,0$ +* Added $LK,"OptClassFwd","MN:OptClassFwd"$() and $LK,"OptLabelFwd","MN:OptLabelFwd"$(). + +$IV,1$----04/04/13 06:54:53----$IV,0$ +* Cleaned-up $LK-A,"::/TempleOS/Apps/AfterEgypt/Horeb.CPP"$. + +$IV,1$----04/04/13 03:31:30----$IV,0$ +* Cleaned-up $FG,4$::/TempleOS/Demo/Games/Rocks.CPP.Z$FG$. +* Cleaned-up compiler code. +* Improved $LK-A,"::/TempleOS/Demo/Snd/WaterFowl.CPP"$. + +$IV,1$----04/02/13 16:58:49----$IV,0$ +* Redid $FG,2$ReIndent$FG$ in $FG,2$$FG$ menu. Got rid of old nasty indent code. +* Added $FG,2$CompileChk$FG$ to $FG,2$$FG$ menu. +* Changed $LK,"LexNew","MN:LexNew"$() filename arg. +* Added $LK,"LexAttachDoc","MN:LexAttachDoc"$() to replace $FG,4$LexIncludeDoc$FG$(). +* Fixed registry bug. + +$IV,1$----04/02/13 03:09:24----$IV,0$ +* Warning: Changed $LK,"CDFileCreate","MN:CDFileCreate"$(). +* Improved $LK-A,"::/TempleOS/Adam/Boot/DskCDDVD.CPP"$. +* Improved $LK-A,"::/TempleOS/Adam/WallPaper.CPP"$. + +$IV,1$----03/31/13 20:15:32----$IV,0$ +* Added background to $LK-A,"::/TempleOS/Demo/Games/Squirt.CPP"$. +* Added background to $LK-A,"::/TempleOS/Demo/Games/ZoneOut.CPP"$. +* Added option to edit sprite bitmap extents as text. $LK,"PopUpExtents","MN:PopUpExtents"$(). +* Added background to $LK-A,"::/TempleOS/Demo/Graphics/Camp.CPP"$, Quail and Clouds. + +$IV,1$----03/30/13 16:32:31----$IV,0$ +* Changed $LK,"CDoc","MN:CDoc"$ que to $FG,4$put_doc$FG$, $FG,4$display_doc$FG$, and $FG,4$border_doc$FG$. +* Got rid of HDAudio support -- never worked for very many people. + +$IV,1$----03/27/13 04:18:15----$IV,0$ +* Changed $MA+A,"Tour","Cd(\"::/TempleOS/Misc/Tour\");;AutoFile(\"Tour\");\n"$. + +$IV,1$----03/24/13 14:44:28----$IV,0$ +* Made $LK,"PutChar","MN:PutChar"$('Hello') accept multiple chars. This is tricky. My compiler allows multi-byte char constants. + +$IV,1$----03/19/13 16:18:53----$IV,0$ +* Added $LK,"DocType","MN:DocType"$() and $LK,"DocNewLine","MN:DocNewLine"$(). +* Added option for extra new_lines to $LK,"Type","MN:Type"$(). + +$IV,1$----03/19/13 00:38:44----$IV,0$ * $BK,1$TempleOS version 1.00 Released$BK,0$ diff --git a/TempleOS/Doc/Char.TXT b/TempleOS/Doc/Char.TXT index cda769e..9a0b5ba 100644 --- a/TempleOS/Doc/Char.TXT +++ b/TempleOS/Doc/Char.TXT @@ -1,6 +1,6 @@ $WW,1$A $FG,2$Char$FG$acter is a single byte holding an ASCII code for a letter, num or sym. The $FG,2$TempleOS$FG$ term is a $FG,2$U8$FG$. -ASCII values range from 0 to 127. Values below 32 are ctrl key's. So, an ASCII #3 is a $FG,2$$FG$. TempleOS uses a few nonstandard values. In TempleOS ASCII #5 is the cursor location, ASCII 28 is $FG,2$$FG$ and ASCII #31 is a $FG,2$$FG$. See $LK,"Char Definitions","MN:CH_SHIFT_SPACE"$. +ASCII values range from 0 to 127. Values below 32 are ctrl key's. So, an ASCII #3 is a $FG,2$$FG$. TempleOS uses a few nonstandard values. In TempleOS ASCII #5 is the cursor location in a saved file, ASCII 28 is $FG,2$$FG$ and ASCII #31 is a $FG,2$$FG$. See $LK,"Char Definitions","MN:CH_SHIFT_SPACE"$. A $FG,2$Key$FG$ is typically specified with a scan code. TempleOS scan codes contain the key value in the lowest $FG,2$U8$FG$, and flags in the upper bytes. See $LK,"Scan Code Flags","MN:SCF_CTRL"$ and $LK,"Scan Codes","MN:SC_INS"$. @@ -13,4 +13,3 @@ TempleOS stores scan codes in 8 bytes. Run the program $LK-A,"::/TempleOS/Demo/MsgLoop.CPP"$ to examine scan code. A $FG,2$String$FG$ is a bunch of ASCII characters terminated with a zero. - diff --git a/TempleOS/Doc/Charter.TXT b/TempleOS/Doc/Charter.TXT index 935aac3..b6b2b8d 100644 --- a/TempleOS/Doc/Charter.TXT +++ b/TempleOS/Doc/Charter.TXT @@ -1,9 +1,6 @@ $FG,5$$WW,1$$TX+CX,"TempleOS Charter"$$FG$ -The goal of TempleOS is to provide an ideal environment for recreational programming and not imitate $FG,2$Linux$FG$. TempleOS is orders of magnitude simpler than $FG,2$Linux$FG$ to better fulfill the promise of $FG,2$open source$FG$. The vision for TempleOS is a 64-bit, souped-up, multitasking, multicore $FG,2$Commodore 64$FG$ with a $FG,2$C+$FG$ shell instead of $FG,2$BASIC$FG$ that runs $FG,4$$TX+HTML,"x86_64","http://en.wikipedia.org/wiki/Amd64#AMD64"$$FG$ code. - -TempleOS holds no standards sacred -- everything is freshly designed from scratch. This is not a 1970's main frame operating system and, no, it has nothing to do with $FG,2$Commodore 64$FG$ emulation -- it's $FG,4$$TX+HTML,"x86_64","http://en.wikipedia.org/wiki/Amd64#AMD64"$$FG$. - +TempleOS is God's official temple. God said to use 640x480 16 color graphics and God said to have a single audio voice. That is just like how He specified cubits in the Bible! 1) TempleOS is $FG,2$ring-0-only$FG$, running everything in kernel mode including applications. You have full access to memory, I/O ports, instructions, etc. at all times, because that's fun. @@ -15,20 +12,18 @@ TempleOS holds no standards sacred -- everything is freshly designed from scratc 5) TempleOS will always have one video mode, $FG,2$640x480$FG$ by 16 colors, unless that mode becomes unavailable on computers in the future. -6) TempleOS will always be $FG,2$free$FG$. I might sell applications, support, or, possibly, do adware. +6) TempleOS will always just have PC Speaker sound. -7) TempleOS will always be $FG,2$100% open source$FG$ with all source included, unless device drivers or something can only be included with non-disclosure agreements. +7) TempleOS will always be $FG,2$free$FG$. I might sell applications, support, or, possibly, do adware. -8) All function args and returns will be 64-bit. No plans for C++. +8) TempleOS will always be $FG,2$100% open source$FG$ with all source included, unless device drivers or something can only be included with non-disclosure agreements. -9) TempleOS documents are not for printing. They're dynamic and intended for the screen. There will always be just one font, a fixed-width font. No Unicode, just ASCII. +9) All function args and returns will be 64-bit. No plans for C++. -10) TempleOS is not for multimedia. Games will be created by programmers, not artists. Sounds and images will be, primarily, calculated in real-time, not fetched. +10) TempleOS documents are not for printing. They're dynamic and intended for the screen. There will always be just one font, a fixed-width font. No Unicode, just ASCII. -11) All functions, variables and class members will be accessible. There are no C++ $FG,2$public$FG$/$FG,2$private$FG$ protections and all functions, even secondary ones in the kernel, can be called. +11) TempleOS is not for multimedia. Games will be created by programmers, not artists. Sounds and images will be, primarily, calculated in real-time, not fetched. -12) $FG,4$$BK,1$Backward compatibility is NOT guaranteed.$FG$$BK,0$ You are safest working with $FG,2$JIT$FG$ compilation instead of $FG,2$AOT$FG$ binaries because I can add members to classes, reorder members in classes, add default args to existing functions, change $FG,2$#define$FG$ values, etc. all without breaking compatibility. +12) All functions, variables and class members will be accessible. There are no C++ $FG,2$public$FG$/$FG,2$private$FG$ protections and all functions, even secondary ones in the kernel, can be called. -$FG,8$ -* "Commodore 64" was a trademark of Commodore Business Machines. -* "Linux" is probably a trademark owned by Linus Torvalds. +13) $FG,4$$BK,1$Backward compatibility is NOT guaranteed.$FG$$BK,0$ You are safest working with $FG,2$JIT$FG$ compilation instead of $FG,2$AOT$FG$ binaries because I can add members to classes, reorder members in classes, add default args to existing functions, change $FG,2$#define$FG$ values, etc. all without breaking compatibility. diff --git a/TempleOS/Doc/CmdLine.TXT b/TempleOS/Doc/CmdLine.TXT index d77c4bc..19214d6 100644 --- a/TempleOS/Doc/CmdLine.TXT +++ b/TempleOS/Doc/CmdLine.TXT @@ -1,4 +1,4 @@ -$WW,1$The cmd line feeds into a $FG,2$C+$FG$ compiler as you type. A statement outside a function executes immediately. Remember to add a semicolon.$WW,1$ +$WW,1$The cmd line feeds into the $LK,"Holy C","FI:::/TempleOS/Doc/HolyC.TXT"$ compiler as you type. A statement outside a function executes immediately. Remember to add a semicolon.$WW,1$ Look-up the function headers with $FG,2$WordStat$FG$ by hitting $FG,2$$FG$ after typing the first few letters. diff --git a/TempleOS/Doc/Confuse.TXT b/TempleOS/Doc/Confuse.TXT index 9145987..7218678 100644 --- a/TempleOS/Doc/Confuse.TXT +++ b/TempleOS/Doc/Confuse.TXT @@ -1,6 +1,6 @@ $WW,1$$FG,5$$TX+CX,"Clearing-up Confusions"$$FG$ -* I, Terry A. Davis, wrote every one of the $TX+D,"139,633","DD_TEMPLEOS_LOC"$ lines of TempleOS over the past $TX+D,"9.6","DD_TEMPLEOS_AGE"$ years (full-time). It runs on bare hardware with no layering, libraries, tools, modules or anything from other sources. It's 100% independent and stands alone. It has no networking and certainly doesn't call home. Every line of TempleOS src code is including in all distro's, from the kernel to the compiler to the boot loaders. +* I, Terry A. Davis, wrote every one of the $TX+D,"123,088","DD_TEMPLEOS_LOC"$ lines of TempleOS over the past $TX+D,"9.9","DD_TEMPLEOS_AGE"$ years (full-time). It runs on bare hardware with no layering, libraries, tools, modules or anything from other sources. It's 100% independent and stands alone. It has no networking and certainly doesn't call home. Every line of TempleOS src code is including in all distro's, from the kernel to the compiler to the boot loaders. * TempleOS does not execute code not written by me and any time except for a few BIOS calles for cfguration. @@ -18,13 +18,13 @@ $WW,1$$FG,5$$TX+CX,"Clearing-up Confusions"$$FG$ * $LK,"Fs","MN:Fs"$ is a segment register, not "file system". (It is kept pointing to the current task's record.) There is no memory segmentation -- FS and GS are used as general purpose registers, more or less. -* TempleOS uses a flavor of C/C++. It is not PASCAL. I altered the syntax making parenthesis optional on function calls with no paramaters. +* TempleOS uses a dialect of C/C++ called $LK,"Holy C","FI:::/TempleOS/Doc/HolyC.TXT"$. It is not PASCAL. I altered the syntax making parenthesis optional on function calls with no paramaters. * $LK,"Sleep","MN:Sleep"$() makes a program pause. It is not hybernation for a laptop. * $LK,"Yield","MN:Yield"$() saves the current task's registers (context) and loads in the next task. When waiting, it's better to do this than check a condition in a loop until you get preempted. Checking a condition until you get preempted wastes CPU. TempleOS does not use virtual memory, so $LK,"Yield","MN:Yield"$() involves no disk activity. A swap takes half a microsecond. See $LK-A,"::/TempleOS/Demo/Lectures/Spinning.CPP"$. -* I use the term "JIT compilation". This means it is compiled and executable code placed into mem, ready to be called. +* I use the term $LK,"JIT Compile Mode","FF:::/TempleOS/Doc/Glossary.TXT,JIT Compile Mode"$. This means it is compiled and executable code placed into mem, ready to be called. * Files with names ending in "Z" are compressed, not encrypted. $LK,"Copy","MN:Copy"$() or rename them with $LK,"Move","MN:Move"$() to store them uncompressed. @@ -47,3 +47,4 @@ $WW,1$$FG,5$$TX+CX,"Clearing-up Confusions"$$FG$ $FG,8$ * "Linux" is probably a trademark owned by Linus Torvalds. +$FG$ \ No newline at end of file diff --git a/TempleOS/Doc/Ctrls.TXT b/TempleOS/Doc/Ctrls.TXT index f4cc3b2..5aba205 100644 --- a/TempleOS/Doc/Ctrls.TXT +++ b/TempleOS/Doc/Ctrls.TXT @@ -1,3 +1 @@ $WW,1$To create a TempleOS graphic ctrl, you define call-back functions and insert a $LK,"CCtrl","MN:CCtrl"$ structure in the $LK,"CTask","MN:CTask"$ queue. See $LK-A,"::/TempleOS/Demo/Graphics/SliderCtrl.CPP"$, $LK-A,"::/TempleOS/Demo/Graphics/ScrollBars.CPP"$ and $LK,"TermButtonNew","FF:::/TempleOS/Adam/WallPaper.CPP,TermButtonNew"$. There is a managed-code ctrl generator, if you press $FG,2$$FG$. - - diff --git a/TempleOS/Doc/Customize.TXT b/TempleOS/Doc/Customize.TXT index 4add607..d8164ee 100644 --- a/TempleOS/Doc/Customize.TXT +++ b/TempleOS/Doc/Customize.TXT @@ -3,7 +3,4 @@ $WW,1$* You can adjust the mouse movement rate by setting global vars in your st * You can set your local time zone by setting the $FG,4$local_time_offset$FG$ global var in a start-up file. It's units are $LK,"CDATE_FREQ","MN:CDATE_FREQ"$. See $LK,"local time","FF:HOME/Adam3aLocalize.CPP,local_time"$. See $LK,"DateTime.CPP","FI:::/TempleOS/Demo/DateTime.CPP"$ for changing date/time format maps. -* If sound doesn't work, run $LK-A,"::/TempleOS/Adam/Snd/HDCfg.CPP"$ or, comment-out $LK,"#include \"HDAudio\"","FF:HOME/Adam3cSnd.CPP,HDAudio"$ to revert to PC Speaker. - * Get rid of this msg $LK,"here","FF:HOME/DoItOnce.CPP,Customize.TXT"$. - diff --git a/TempleOS/Doc/CutCorners.TXT b/TempleOS/Doc/CutCorners.TXT index db4d330..c26f8dd 100644 --- a/TempleOS/Doc/CutCorners.TXT +++ b/TempleOS/Doc/CutCorners.TXT @@ -4,7 +4,7 @@ There are a few places where I cut corners in the interest of not junking-up cod * I made my type-casting operator post-fix because it makes the compiler way cleaner. -* TempleOS does not figure-out $FG,2$FAT32$FG$ short name alias numbers. $LK,"FAT32DirNew","MN:FAT32DirNew"$(). It can cause hard drive corruption, so I might have to do it. It would really take a lot of junky code for this hatefully, detestable, legacy issue. "Please don't make me ruin my beautiful shiny-new TempleOS with that!" I am also not enthused about $FG,2$FAT32$FG$ because it is in patent limbo. $FG,2$FAT32$FG$ might get removed from TempleOS. There is a TempleOS native, 64-bit, file system that works perfectly well. $FG,2$FAT32$FG$ is useful, however, because it assists in transferring between dual booted operating systems. +* TempleOS does not figure-out $FG,2$FAT32$FG$ short name alias numbers. $LK,"FAT32DirNew","MN:FAT32DirNew"$(). It can cause hard drive corruption, so I might have to do it. It would really take a lot of junky code for this hatefully, detestable, legacy issue. "Please don't make me ruin my beautiful shiny-new TempleOS with that!" I am also not enthused about $FG,2$FAT32$FG$ because it is in patent limbo. $FG,2$FAT32$FG$ might get removed from TempleOS. There is the $FG,2$RedSea$FG$ 64-bit file system that works perfectly well. $FG,2$FAT32$FG$ is useful, however, because it assists in transferring between dual booted operating systems. * I changed the $LK,"asm opcodes","FI:::/TempleOS/Compiler/OpCodes.TXT"$ names to remove the ambiguity between instructions with different numbers of arguments, making my $LK,"assembler","FI:::/TempleOS/Compiler/Assembler.CPP"$ simpler and I did minimal 16-bit asm support, since 64-bit is what you should be using, unless you're doing a $LK,"boot loader","FI:::/TempleOS/Adam/Boot/BootCD.CPP"$. diff --git a/TempleOS/Doc/D3.TXT b/TempleOS/Doc/D3.TXT index e056068..bccfe44 100644 --- a/TempleOS/Doc/D3.TXT +++ b/TempleOS/Doc/D3.TXT @@ -1,4 +1,3 @@ -$WW,1$TempleOS has a class for 3 dimensional points consisting of F64s. TempleOS's compiler is not C++, so it does not support passing or returning values from functions which are not 64-bits, therefore, it can't be implemented with operator overloading. Making all function args and returns 64-bit is a core prinicple of TempleOS. +$WW,1$TempleOS has a class for 3 dimensional points consisting of F64s. Holy C is not C++ -- it does not support passing or returning values from functions which are not 64-bits, therefore, it can't be implemented with operator overloading. Making all function args and returns 64-bit is a core prinicple of TempleOS. As a courtesy, most of the CD3 functions return the addr of the destination vect, so you can nestle calls. They do not allocate new space for the destination vect. - diff --git a/TempleOS/Doc/Dbg.TXT b/TempleOS/Doc/Dbg.TXT index f0f9549..3b2ae59 100644 --- a/TempleOS/Doc/Dbg.TXT +++ b/TempleOS/Doc/Dbg.TXT @@ -2,7 +2,7 @@ $WW,1$* You can enter the debugger with $LK,"Dbg","MN:Dbg"$() or $FG,2$next_doc$FG$ and the main at $FG,4$Fs->last_doc$FG$. When dbl buffering, there are two main's. See $LK-A,"::/TempleOS/Demo/Spy.CPP"$. It is possible to define multiple aux's. To insert a additional aux, use $LK,"DocQueInsRev","MN:DocQueInsRev"$(doc,Fs->next_doc). - -See$LK-A,"::/TempleOS/Demo/Doc/CallBack.CPP"$ and $LK-A,"::/TempleOS/Demo/Doc/CallBackAux2.CPP"$. - +There is one $LK,"CDoc","MN:CDoc"$ for the border, and a pair for double buffering. See $LK-A,"::/TempleOS/Demo/Spy.CPP"$. diff --git a/TempleOS/Doc/Dollar.TXT b/TempleOS/Doc/Dollar.TXT index eb3479f..8bf3266 100644 --- a/TempleOS/Doc/Dollar.TXT +++ b/TempleOS/Doc/Dollar.TXT @@ -1,17 +1,17 @@ $WW,1$$FG,5$$TX+CX,"Dollar Sign Cmds"$$FG$ -TempleOS supports rich-text type cmds which are bracketed with '$$'. Use $FG,2$$FG$ to experiment with them. Use $FG,2$CTRL-T$FG$ to toggle between plain text and rich text. +TempleOS supports rich-text type cmds which are bracketed with '$$'. Use $FG,2$$FG$ to experiment with them. Use $FG,2$$FG$ to toggle between plain text and rich text. The format of '$$' cmds includes a two character code, +/-flags, a comma and args separated by commas. The flags often determine how many and what args the cmd takes. -See $LK-A,"::/TempleOS/Doc/CtrlL.TXT"$ and $LK-A,"::/TempleOS/Demo/Doc/DemoDoc.TXT"$. +See $LK-A,"::/TempleOS/Doc/Widget.TXT"$ and $LK-A,"::/TempleOS/Demo/Doc/DemoDoc.TXT"$. See $LK,"Doc Type Defines","MN:DOCT_TEXT"$ and $LK,"Doc Type Codes","FF:::/TempleOS/Adam/Doc/Doc.CPP,ST_DOC_CMDS"$ $TR,"TX Text"$ $ID,2$Normally, text is not bracketed with "$$", but if you wish to specify flag attr to center text, you can bracket them with "$$" and enter flags such as "$FG,4$+CX$FG$". You can't edit them if they are bracketed by "$$" unless you toggle to plain text mode with . -$ID,-2$$TR,"CR Hard Carriage Return"$ +$ID,-2$$TR,"CR Hard Carriage Return (New Line)"$ $ID,2$Carriage returns are normally specified without being bracketed with "$$". -$ID,-2$$TR,"SR Soft Carriage Return"$ +$ID,-2$$TR,"SR Soft Carriage Return (New Line)"$ $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. @@ -30,22 +30,12 @@ $FG,5$FD$FG$ Default Foreground Color $FG,5$BD$FG$ Default Background Color $FG,5$FG$FG$ Foreground Color $FG,5$BG$FG$ Background Color -$FG,5$F2$FG$ Alt Foreground Color (Paren & Brace coloring) -$FG,5$FL$FG$ Foreground of Links -$FG,5$FM$FG$ Foreground of Macros/Menu-Values -$FG,5$FA$FG$ Foreground of Anchors -$FG,5$FH$FG$ Foreground of Hidden widgets -$FG,5$FE$FG$ Foreground of Trees -$FG,5$FU$FG$ Foreground of User Text -$FG,5$FB$FG$ Foreground of Binary Tags -$FG,5$FY$FG$ Foreground of Keywords -$FG,5$FR$FG$ Foreground of Keywords2 -$FG,5$FC$FG$ Foreground of Comments -$FG,5$FQ$FG$ Foreground of Quotes $ID,-2$$TR,"FU,BU User Prompts"$ $ID,2$special color changing cmds. They are used when the user is prompted for text at the cmd line. They rst the cursor pos if the cursor is posed before them on the line. They are also used to indicate the start of a prompted str. $ID,-2$$TR,"CL clear"$ $ID,2$Clear all previous entries except ones with hold($FG,4$+H$FG$) flags. You might want $FG,4$+H$FG$ on word wrap entries. Alternatively, you can use $LK,"DocClear","MN:DocClear"$(). +$ID,-2$$TR,"PT User Prompt"$ +$ID,2$Start of a user prompt. $ID,-2$$TR,"WW Word Wrap"$ $ID,2$Include a 1 or 0. $ID,-2$$TR,"HL Highlighting"$ @@ -121,7 +111,7 @@ $ID,-2$$TR,"ER Error"$ $ID,2$When errors are detected in dollar cmds, an $FG,5$ER$FG$ entry is generated to hold the garbage so it is not lost. $ID,-2$ See $LK,"Doc Flag Defines","MN:DOCEf1_AUX_STR"$ and $LK,"Doc Flag Codes","FF:::/TempleOS/Adam/Doc/Doc.CPP,ST_DOC_FLAGS"$ -$FE,4$See $LK+S,"dft_flags","FF:::/TempleOS/Adam/Doc/DocPlain.CPP,doc_dft_flags1"$. +See $LK+S,"dft_flags","FF:::/TempleOS/Adam/Doc/DocPlain.CPP,doc_dft_flags1"$. $TR,"FLAGS"$ $ID,2$$TR,"+H Hold"$ $ID,2$Tells it to not delete it when cleared with $FG,5$CL$FG$ or when the doc->max_entries is exceeded. Word wrap is a good one to hold. @@ -151,7 +141,7 @@ $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$ +$ID,-2$$ID,-2$ $FG,5$EXAMPLES: diff --git a/TempleOS/Doc/Features.TXT b/TempleOS/Doc/Features.TXT index 0b63144..4f8994b 100644 --- a/TempleOS/Doc/Features.TXT +++ b/TempleOS/Doc/Features.TXT @@ -12,9 +12,9 @@ $WW,1$$FG,5$$TX+CX,"TempleOS' Features"$$FG$ * Keyboard & mouse support. -* Hard drives, support for $FG,2$FAT32$FG$ and TempleOS native file systems with file compression. +* Hard drives, support for $FG,2$FAT32$FG$ and $FG,2$RedSea$FG$ file systems with file compression. -* $LK,"Partitionming","MN:PrtDsk"$ tool. +* $LK,"Partitioning","MN:PrtDsk"$ tool. * $FG,2$Boot loaders$FG$ for CD-ROM and hard disk. diff --git a/TempleOS/Doc/FileMgr.TXT b/TempleOS/Doc/FileMgr.TXT index 223691a..fe40d63 100644 --- a/TempleOS/Doc/FileMgr.TXT +++ b/TempleOS/Doc/FileMgr.TXT @@ -56,5 +56,5 @@ $ID,-2$ $FG,5$Instructions on Burning CD/DVD's$FG$ $ID,2$Create a temporary holding drive in RAM or on disk, copy files into the holding drive. Make an ISO image of the drive by pressing $FG,2$'M'$FG$ when on top of the holding drive. Press $FG,2$'B'$FG$ when on top of the CD/DVD ROM drive to burn the ISO to disk. If you have not recompiled $FG,2$Kernel$FG$ and defined your CD/DVD drive, exit the file mgr and use $LK,"Mount","MN:Mount"$. -$LK,"Making Your Own Distro","FI:::/TempleOS/Demo/MakeDistro.CPP.Z"$ -$ID,-2$ +$LK,"Making Your Own Distro","FI:::/TempleOS/Demo/MakeDistro.CPP"$ +$ID,-2$ \ No newline at end of file diff --git a/TempleOS/Doc/Glossary.TXT b/TempleOS/Doc/Glossary.TXT index 6353f59..f898bcb 100644 --- a/TempleOS/Doc/Glossary.TXT +++ b/TempleOS/Doc/Glossary.TXT @@ -95,12 +95,14 @@ $FG,5$$FG,5$Sect$FG$ Sector $FG,5$Seq$FG$ Sequence $FG,5$Snd$FG$ Sound $FG,5$Src$FG$ Source +$FG,5$Srv$FG$ Servant $FG,5$Stat$FG$ Status or Statistic $FG,5$$FG,5$Stk$FG$ Stack $FG,5$Str$FG$ String $FG,5$Sym$FG$ Symbol $FG,5$Sys$FG$ System $FG,5$Term$FG$ Terminal +$FG,5$Tri$FG$ Triangle $FG,5$Tx$FG$ Transmit $FG,5$Val$FG$ Value $FG,5$Var$FG$ Variable @@ -124,21 +126,21 @@ $ID,-2$$TR,"Code and Data Heaps"$ $ID,2$TempleOS uses the asm $FG,2$CALL$FG$ instruction exclusively and it's limited to calling routines +/-2 Gig from the current code location. To prevent out-of-range issues, I decided to separate code and data, placing all code within the lowest 2 Gig of memory. The compiler and $LK,"Load","MN:Load"$()er allocate memory from the code heap to store code and glbl vars, unless the compiler option $LK,"OPTf_GLBLS_ON_DATA_HEAP","MN:OPTf_GLBLS_ON_DATA_HEAP"$ is used. When programs call $LK,"MAlloc","MN:MAlloc"$() is comes from the data heap, which in not limited in size, except by how much physical RAM memory you have. You can allocate from any heap you like, or even make independent heaps. $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 $FG,2$Adam$FG$. 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 can get a report on current system tasks with $LK+S,"TaskRep","MN:TaskRep"$(). There is just one possible window per task, so child tasks are needed. +$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 $FG,2$Adam$FG$. Links are kept as to who spawned what so when one task is $LK,"Kill","MN:Kill"$()ed the helper tasks disappear, too. You can get a report on current system tasks with $LK+S,"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 TempleOS is more than $FG,2$C$FG$ and less than $FG,2$C++$FG$, so it's just $FG,2$C+$FG$, perhaps. See $LK,"Differences","FI:::/TempleOS/Doc/Differences.TXT"$. It has the default arg feature of $FG,2$C++$FG$ and uses $FG,2$class$FG$ in place of $FG,2$struct$FG$. It uses $FG,2$U0,U8,U16,U32,I64$FG$ and $FG,2$I0,I8,I16,I32,I64$FG$ for signed and unsigned integers. It has a slightly different operator precedence. See $LK,"OP_precedence","FA:::/TempleOS/Doc/Differences.TXT,OP_precedence"$ It has the $FG,2$PASCAL$FG$-like feature of function calls with no parens, but requires an "$FG,2$&$FG,2$$FG$" when referring to function addresses. +$ID,-2$$TR,"Holy C"$ +$ID,2$The language used by TempleOS is more than $FG,2$C$FG$ and less than $FG,2$C++$FG$. See $LK,"Holy C","FI:::/TempleOS/Doc/HolyC.TXT"$. It has the default arg feature of $FG,2$C++$FG$ and uses $FG,2$class$FG$ in place of $FG,2$struct$FG$. It uses $FG,2$U0,U8,U16,U32,I64$FG$ and $FG,2$I0,I8,I16,I32,I64$FG$ for signed and unsigned integers. It has a slightly different operator precedence. See $LK,"OP_precedence","FA:::/TempleOS/Doc/HolyC.TXT,OP_precedence"$ It has the $FG,2$PASCAL$FG$-like feature of function calls with no parens, but requires an "$FG,2$&$FG,2$$FG$" when referring to function addresses. $ID,-2$$TR,"AOT Compile Mode"$ -$ID,2$I coined this term to refer to conventional AOT compilation mode, but it is not the preferred mode for this operating system and is discouraged. $FG,2$.SP?$FG$ files are compiled to $FG,2$.BI?$FG$ files, skipping $FG,2$.OBJ$FG$ files. 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$AOT Compiled Mode$FG$, use the $LK,"Cmp","MN:Cmp"$() routine or right-click on a link. The $FG,2$Kernel$FG$ modules and compiler are made in $FG,2$AOT$FG$ compiled mode and stored in $FG,2$Kernel.BIN.C$FG$ and $FG,2$Compiler.BIN.Z$FG$, respectively. +$ID,2$This term to refers to conventional compilation mode. It is not the preferred mode for this operating system and is discouraged. $FG,2$.PRJ$FG$ files are compiled to $FG,2$.BIN$FG$ files, skipping $FG,2$.OBJ$FG$ files. After compiling, you do a $LK,"Load","MN:Load"$() cmd which is available by 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$AOT Compiled Mode$FG$, use the $LK,"Cmp","MN:Cmp"$() routine or right-click on a link. The $FG,2$Kernel$FG$ modules and compiler are made in $FG,2$AOT$FG$ compiled mode and stored in $FG,2$Kernel.BIN.C$FG$ and $FG,2$Compiler.BIN.Z$FG$, respectively. -See $LK-A,"::/TempleOS/Demo/GameStarters/EagleDive.CPP"$ for an example of an $FG,2$AOT$FG$ module. +See $LK-A,"::/TempleOS/Demo/Games/EagleDive.CPP"$ for an example of an $FG,2$AOT$FG$ module. $ID,-2$$TR,"JIT Compile Mode"$ $ID,2$In just-in-time mode, the compiler allocates objects, code and data, from the heap, incrementally. This mode is used during cmd 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,"ExeFile","MN:ExeFile"$() routine is the same as $FG,2$#include$FG$ but can be placed in programs. $LK,"ExePutS","MN:ExePutS"$() routine will compile and run a string. $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,"U","MN:U"$(). +$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,"U","MN:U"$(). $ID,-2$$TR,"Partition/Drive"$ $ID,2$There is no distinction between "partition" or "drive." They are specified with a single letter from '$FG,2$A$FG$'-'$FG,2$Z$FG$'. @@ -147,6 +149,9 @@ $ID,2$There is no distinction between "partition" or "drive." They are specifie For commands taking a drive letter as an argument, $FG,2$0$FG$ is the current drive. +$ID,-2$$TR,"RedSea File System"$ +$ID,2$This is a simple, 64-bit, file system which is, basically, FAT32 with nice fixed-size directory entries and no FAT table, just an allocation bitmap. Files cannot grow in size. Directory entries have compressed and uncompressed size and file check-sums. + $ID,-2$$LK,"AutoFile","HI:AutoFile"$ $LK,"Sprite","HI:Graphics/CSprite"$ $LK,"Hash Table","HI:Hash"$ @@ -168,11 +173,11 @@ $FG,5$*.???.C$FG$ $FG,5$*.TXT.Z;*.TXT;*.LOG.Z;*.LOG$FG$ Text Files $FG,5$*.CPP.Z;*.CPP$FG$ - C+ src files. The default C+ compiler type is "$FG,2$.CPP.Z$FG$". + Holy C src files. The default Holy C compiler type is "$FG,2$.CPP.Z$FG$". $FG,5$*.PRJ.Z;*.PRJ$FG$ - C+ src files to be compiled $FG,2$AOT$FG$. + Holy C src files to be compiled $FG,2$AOT$FG$. $FG,5$*.HPP.Z;*.HPP$FG$ - C+ src header files. + Holy C src header files. $FG,5$*.MAP.Z;*.MAP$FG$ Compiler "map" files $FG,5$*.BIN.Z;*.BIN.C;*.BIN$FG$ @@ -182,7 +187,7 @@ $FG,5$*.DAT.Z;*.DAT$FG$ $FG,5$*.ISO$FG$ CD-ROM image file--ISO9660. $FG,5$*.AUT.Z;*.AUT$FG$ - "AutoFile" Basically a C+ program who's stdout goes to the input of a task when $LK,"AutoFile","MN:AutoFile"$() is called. + "AutoFile" Basically a Holy C program who's stdout goes to the input of a task when $LK,"AutoFile","MN:AutoFile"$() is called. $FG,5$*.GRA.Z;*.GRA$FG$ Graphics file @@ -198,35 +203,51 @@ $FG,5$ALL_CAPS$FG$ Assembly Language labels are capitalized with underscores between words. So are $FG,2$#define$FG$'s. $FG,5$_ALL_CAPS$FG$ - Asm routines which are $FG,2$C+$FG$ callible should have a leading underscore. + Asm routines which are $LK,"Holy C","FI:::/TempleOS/Doc/HolyC.TXT"$ callible should have a leading underscore. $FG,5$MixedCaps$FG$ - $FG,2$C+$FG$ Functions and class names are MixedCaps. + $LK,"Holy C","FI:::/TempleOS/Doc/HolyC.TXT"$ 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$_lower_case$FG$ + Function args which are outputs (passed as ptrs) have leading underscores. Also, args which have identically named local variable counterparts have leading underscores. + $FG,5$DOCf_????$FG$ Flags bit nums instead of bit values are designated with a lower case "$FG,2$f$FG$". $FG,5$DOCG_????$FG$ Flag groups are designated with "$FG,2$G$FG$". + +"$FG,5$result$FG$" is reserved for local variables that hold the function return val. + +$FG,5$*$FG$ I used C++ like naming. I place "New", "Del", "Init", "Rst", ect. on the end of a function name instead of at the beginning. "$FG,2$RstMusicSettings$FG$" should be "$FG,2$MusicSettingsRst$FG$". + +$ID,-2$$TR,"Fs"$ +$ID,2$The CPU FS segment register. This register points to the current task's $LK,"CTask","MN:CTask"$. + +$ID,-2$$TR,"Gs"$ +$ID,2$The CPU GS segment register. This register points to the $LK,"CCPU","MN:CCPU"$. + +$ID,-2$$TR,"Bt,Bts,Btr,Btc,LBts,LBtr,LBtc"$ +$ID,2$These are bit manipulation functions named after x86 instructions. They stand for "Bit Test", "Bit Test and Set", "Bit Test and Reset" and "Bit Test and Compliment". An $FG,2$'L'$FG$ means locked with an ASM lock prefix. + +$ID,-2$$TR,"Cli,Sti"$ +$ID,2$Turn on or off interrupts. They are named after the x86 instructions. "Cli" turns off interrupts. + +$ID,-2$$TR,"Heap"$ +$ID,2$Programs can dynamically request chunks of memory allocated from a "heap" using $LK,"MAlloc","MN:MAlloc"$(). They must $LK,"Free","MN:Free"$() it when finished. Ptrs are used to refer to it. The "heap" is dynamically allocated mem. + +$ID,-2$$TR,"Root"$ +$ID,2$The base of a binary tree or the head of a queue is the root. (I don't like the word "head.") + +$ID,-2$$TR,"Join"$ +$ID,2$When two parts of a program have a common low-level routine, that routine is often labeled SomethingJoin. + +$ID,-2$$TR,"user_data"$ +$ID,2$Many operating system structures have space set aside for you to store values. You are on your own managing these with multiple applications and libraries. + +$ID,-2$$TR,"BSP/AP"$ +$ID,2$The "boot-strap processor" is core#0, has the Adam task, and is the master. The "application processors" have Seth tasks and are the slave processors. Only the BSP processor's tasks can have windows. $ID,-2$ -$AN,"Fs","Fs"$ The CPU FS segment register. This register points to the current task's $LK,"CTask","MN:CTask"$. - -$AN,"Gs","Gs"$ The CPU GS segment register. This register points to the $LK,"CCPU","MN:CCPU"$. - -$AN,"Bt,Bts,Btr,Btc,LBts,LBtr,LBtc","Bt,LBts,LBtr,LBtc"$ - These are bit manipulation functions named after Intel instructions. They stand for "Bit Test", "Bit Test and Set", "Bit Test and Rst" and "Bit Test and Compliment". An $FG,2$'L'$FG$ means locked. - -$AN,"Cli,Sti","Cli,Sti"$ Turn on or off interrupts. They are named after the x86 instructions. "Cli" turns off interrupts. - -$AN,"Heap","Heap"$ Programs can dynamically request chunks of memory allocated from a "heap" using $LK,"MAlloc","MN:MAlloc"$(). They must $LK,"Free","MN:Free"$() it when finished. Ptrs are used to refer to it. The "heap" is dynamically allocated mem. - -$AN,"Root","root"$ The base of a binary tree or the head of a queue. (I don't like the word "head.") - -$AN,"Join","Join"$ When two parts of a program have a common low-level routine, that routine is often labeled SomethingJoin. - -$AN,"user_data","user_data"$ Many operating system structures have space set aside for you to store values. You are on your own managing these with multiple applications and libraries. - -$AN,"BSP/AP","BSP/AP"$ Boot-strap Processor/Application Processor diff --git a/TempleOS/Doc/Graphics.TXT b/TempleOS/Doc/Graphics.TXT index 62c8f5ddd69467b4d994951abda6a3bd8b95e60d..d40a2c5c4e17a5a3a7101498b3bc5707216cbcb5 100644 GIT binary patch delta 139 zcmZ2xGSP5C=*DPorpZRkA0$-V+*K4Zixm~kYe6txdHy`FZ#l&8$AC#Y*ojN&yU2O9P!D~#D9e5-rUl8Hs^e-*Z56R3; r^`HDmGV`6s6PoDfiA|6Z!Nv@duTT&YUiNi9? delta 507 zcmbPexXffi=)?fljUhfv^(sEzI!ft9@hQnlI!eBNRuHC<0f-qC$F3eo|tNLRn&w zLRx;2LZU)aW=U>hfkIJgN>O5YoKSd!aH8~OFzT}L=y!6y!g~X!NJoOTV;>x__qWrwf zs?@*~g_3-*9S}b$loq5UmVi8zqEMchmy%zukd$APl3E1Ts{k@PH7_l{2oxCQ8L4?t zMG)EC{Ib-P$@hgdHm9+qa7;eUGkbG7?ACj4ynm^f3_y%)+ami#&5lhCf&B-F)n3!`)(k91<$Ajs8 N;wu=9CZ|bg0{}+AuM_|P diff --git a/TempleOS/Doc/Grub.TXT b/TempleOS/Doc/Grub.TXT index f018a00..a0b440d 100644 --- a/TempleOS/Doc/Grub.TXT +++ b/TempleOS/Doc/Grub.TXT @@ -21,4 +21,3 @@ menuentry "TempleOS I" { set root=(hd1,msdos5) chainloader +1 } - diff --git a/TempleOS/Doc/GuideLines.TXT b/TempleOS/Doc/GuideLines.TXT index 6e36643..0910b07 100644 --- a/TempleOS/Doc/GuideLines.TXT +++ b/TempleOS/Doc/GuideLines.TXT @@ -1,16 +1,34 @@ -$WW,1$$FG,5$$TX+CX,"ACCT FILES"$$FG$ +$WW,1$$FG,5$$TX+CX,"DIRECTORY STRUCTURE"$$FG$ -You can add and remove accts by making or removing directories in the $FG,2$::/TempleOS/Accts$FG$ directory. An empty account directory should be valid because it will get default files from the parent directory. +$FG,2$/TempleOS/Accts$FG$ Each subdirectory is an acct. When you boot, you can select an acct to login to, unless you compile Kernel soas to pick one. Your acct directory is your $FG,2$HOME$FG$ directory and all your user data should be placed in here to ease backing-up your data. When you Install an application it will create a subdirectory of your $FG,2$HOME$FG$ directory for storage. -See $LK-A,"HOME/PersonalMenu.TXT"$ for a personal menu which can be viewed at the cmd line with the $FG,2$$FG$ key or by clicking "$FG,2$MENU$FG$" in the upper left border area of a window. +$FG,2$/TempleOS/Apps$FG$ Applications are placed in subdirectories of $FG,2$/TempleOS/Apps$FG$. Applications should have a file called $FG,2$Install.CPP.Z$FG$ which will install the app for the current user acct. The file, $FG,2$Load.CPP.Z$FG$ will load the application into mem. The file, $FG,2$Run.CPP.Z$FG$, will usually load and execute the app. To add an app to your personal menu, use $FG,2$$FG$, insert a macro with the PopUp option checked and invoke the $FG,2$Run.CPP.Z$FG$ file. -See $LK-A,"HOME/PersonalNotes.TXT"$ for a personal note file which can be viewed with the $FG,2$$FG$ key. +$FG,2$/TempleOS/Demo$FG$ Here you can find lots of sample code to do various things. -See $LK-A,"HOME/DoItOnce.CPP"$ for a file which is invoked at the start-up of the first user. +$FG,2$/TempleOS/Doc$FG$ Here you can find documentation. -See $LK-A,"HOME/Adam3.CPP"$ for the user files that get loaded into the adam task at start-up. These are only loaded once. +$FG,2$/TempleOS/Kernel$FG$ The core of the operating system is found here. Since priviledge levels are not used, calling it a "$FG,2$kernel$FG$" is deceptive. It is $FG,2$AOT$FG$ compiled by $LK,"MakeOSInstallPrtBootLoader","MN:MakeOSInstallPrtBootLoader"$(). It is loaded by the boot loader and must fit in 640K. -$LK-A,"HOME/Registry.CPP"$ can be edited by hand or deleted to rst to defaults. Takes affect next boot. +$FG,2$/TempleOS/Compiler$FG$ The compiler module src code is found here. The compiler is $FG,2$AOT$FG$ compiled to produce a binary file which is loaded at boot. It is also $FG,2$AOT$FG$ compiled by $LK,"MakeOSInstallPrtBootLoader","MN:MakeOSInstallPrtBootLoader"$(). + +$FG,2$/TempleOS/Adam$FG$ The non-kernel part of the operating system is found here. It is JIT compiled during boot. + + + +$FG,5$$TX+CX,"ACCT FILES"$$FG$ + +You can add and remove accts by making or removing directories in the $FG,2$::/TempleOS/Accts$FG$ directory. An empty account directory should be valid because it will get default files from the parent directory. Compile the $LK,"Kernel","MN:MakeOSInstallPrtBootLoader"$ to set the active acct or cause it to prompt an account at boot. + +$LK-A,"HOME/PersonalMenu.TXT"$ a menu viewed with the $FG,2$$FG$ key or by clicking "$FG,2$MENU$FG$" in the upper left border area of a window. + +$LK-A,"HOME/PersonalNotes.TXT"$ a personal note file viewed with the $FG,2$$FG$ key. + +$LK-A,"HOME/DoItOnce.CPP"$ a file invoked at the start-up of the first user. Customize this! + +$LK-A,"HOME/Adam3.CPP"$ files invoked when the adam task starts-up. Customize these! + +$LK-A,"HOME/Registry.CPP"$ can be edited by hand or deleted to reset to defaults. Takes affect next boot. @@ -28,37 +46,55 @@ $FG,5$$TX+CX,"APPLICATION POLICIES"$$FG$ -$FG,5$$TX+CX,"OS PROGRAMMING GUIDELINES:"$$FG$ +$FG,5$$TX+CX,"PROGRAMMING GUIDELINES"$$FG$ -* Virtual mem is not used (It is identity mapped in EM64T mode). The stk 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"$().) +* Virtual mem/Paging is not used -- it is identity mapped in x86_64 mode. The stk 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"$().) -* See $LK,"Naming convention","FF:::/TempleOS/Doc/Glossary.TXT,Naming convention"$. +* See $LK,"Naming Convention","FF:::/TempleOS/Doc/Glossary.TXT,Naming Convention"$ and $LK,"Abbreviations","FF:::/TempleOS/Doc/Glossary.TXT,Abbreviations"$. -* There are two modes of compiling $LK,"AOT Compiled Mode","FF:::/TempleOS/Doc/Glossary.TXT,AOT Compiled Mode"$ and $LK,"JIT Mode","FF:::/TempleOS/Doc/Glossary.TXT,JIT"$. Actual compilation is done in both -- nothing is "interpreted". +* There are two modes of compiling $LK,"AOT Compile Mode","FF:::/TempleOS/Doc/Glossary.TXT,AOT Compile Mode"$ and $LK,"JIT Compile Mode","FF:::/TempleOS/Doc/Glossary.TXT,JIT Compile Mode"$. Actual compilation is done in both -- nothing is "interpreted". -* $LK,"Differences from C/C++","FI:::/TempleOS/Doc/Differences.TXT"$ +* $LK,"Holy C","FI:::/TempleOS/Doc/HolyC.TXT"$ -* $LK,"System Programming Guidelines","FI:::/TempleOS/Doc/SysPgmGuide.TXT"$ +* I often use 64-bit values when smaller would be more appropriate because the compiler generally is more efficient with 64-bit values. (All value get promoted to 64-bit by the TempleOS compiler, when fetched.) -$FG,5$$TX+CX,"Hash sym tables:"$$FG$ +* I use signed ints unless absolutely necessary. I would like to move toward a language with one type of integer more like $FG,2$BASIC$FG$ or something. I think one type of integer is more friendly to new programmers, but I have no plans to actually switch to one type of int. + +* Short circuit logic is assumed. + +* I generally avoid boolean expression assignments. Boolean assignments don't have short circuit logic and are not compiled efficiently. The $FG,2$Bool$FG$ type is just an alias for a 1 byte int -- nothing forces it to 1 or 0. There is a $LK,"ToBool","MN:ToBool"$() function that will, however. + +* If you use floats in your interrupt routine, save and restore the fpu state with $LK,"Fxsave","MN:Fxsave"$() and $LK,"Fxrstor","MN:Fxrstor"$(). The timer interrupt does this. The keyboard and mouse don't use floats. + +* Bracketing code with $FG,2$$FG,2$PushFD;Cli;$FG$ and $FG,2$PopFD;$FG$ will protect against simultaneous accesses from tasks on $UL,1$one$UL,0$ core. To protect against multiple cores, you need a locked semaphore. I think semiphores need to be in their own cache line, but I'm not sure. I use lock bits in a lot of places not aligned. + +* $LK,"SysDbg","MN:SysDbg"$() and $LK,"IsSysDbg","MN:IsSysDbg"$() are really handy when working on the compiler or kernel. It's just a bit you can set and test. + +* I don't use "$FG,2$U0 *$FG$" because the size would be weird for ptr arithmetic. The size of "$FG,2$U0$FG$" is zero. + + + +$FG,5$$TX+CX,"HASH SYM TABLES"$$FG$ * See $LK-A,"::/TempleOS/Adam/Hash2a.CPP"$ for examples of how the hash tables are set-up. Basically, syms are placed into hash tables and child process hash tables are chained to parents. This provides scopes for vars and functions. -* $FG,2$adam_task->hash_table$FG$ holds the C/C++ syms loaded in on start-up. +* $FG,2$adam_task->hash_table$FG$ holds the Holy C syms loaded in on start-up. -* $FG,2$Fs->hash_table$FG$ holds user C+ syms and if a sym is not found, it checks parents. When a duplicate sym is added to the table, it overshadows the previous sym unless you have done $LK,"OptOn","MN:OptOn"$($LK,"OPTf_REPLACE_SYMS","MN:OPTf_REPLACE_SYMS"$). When developing software, typically you include the file at the cmd prompt, make changes and reinclude it. Old syms 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. +* $FG,2$Fs->hash_table$FG$ holds user Holy C syms and if a sym is not found, it checks parents. When a duplicate sym is added to the table, it overshadows the previous sym unless you have done $LK,"OptOn","MN:OptOn"$($LK,"OPTf_REPLACE_SYMS","MN:OPTf_REPLACE_SYMS"$). When developing software, typically you include the file at the cmd prompt, make changes and reinclude it. Old syms 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. $LK,"HashDepthRep","MN:HashDepthRep"$() gives a histogram of how long the chains are, in case you wish to make hash table sizes bigger. -$FG,5$$TX+CX,"Assembly Language Concerns:"$$FG$ + + +$FG,5$$TX+CX,"ASSEMBLY LANGUAGE CONCERNS"$$FG$ * $FG,2$FS$FG$ must always point to the $LK,"CTask","MN:CTask"$. * $FG,2$GS$FG$ must always point to the $LK,"CCPU","MN:CCPU"$. -* Don't change the segment registers unless interrupts are off. +* Don't change the segment registers unless interrupts are off. It's hard to do, anyway. $LK,"SET_FS_BASE","MN:SET_FS_BASE"$ and $LK,"_SET_GS_BASE","MN:_SET_GS_BASE"$. -* When interacting with compiled code, preserve $FG,2$RBP, RSI, RDI, R10-R15$FG$ because the compiler uses these for register vars. You are free to clobber $FG,2$RAX, RBX, RCX, RDX$FG$, $FG,2$R8$FG$ and $FG,2$R9$FG$. +* When interacting with compiled code, preserve $FG,2$RBP, RSI, RDI, R10-R15$FG$ because the compiler uses these for register vars. You are free to clobber $FG,2$RAX, RBX, RCX, RDX$FG$, $FG,2$R8$FG$ and $FG,2$R9$FG$. See $LK,"Compiler Reg Masks","MN:CREG_VARS_MASK"$. * I recommend using the standard stk frame for functions because $LK,"Caller","MN:Caller"$() is used to display the call stk, such as for the wallpaper. $FG,2$ ENTER nnnn diff --git a/TempleOS/Doc/Hash.TXT b/TempleOS/Doc/Hash.TXT index 3a99d22..891deb7 100644 --- a/TempleOS/Doc/Hash.TXT +++ b/TempleOS/Doc/Hash.TXT @@ -1,4 +1,3 @@ -$WW,1$There are sym(hash) tables maintained by each task. When a sym is not found, the parent task's sym table is checked. All process chain back to the $FG,2$Adam$FG$ task. +$WW,1$There are symbol (hash) tables maintained by each task. When a sym is not found, the parent task's sym table is checked. All process chain back to the $FG,2$Adam$FG$ task. TempleOS sym tables are implemented with an array of linked-lists. A num is generated from a string to index into it. Since multiple strings could generate the same num, a linked-list is built. Usually, newer entries overshadow older ones unless otherwise specified, in which case old entries are removed. There are various types of entries. See $LK,"Hash Entry Types","MN:HTT_EXPORT_SYS_SYM"$. - diff --git a/TempleOS/Doc/HelpIndex.TXT b/TempleOS/Doc/HelpIndex.TXT index b547d41e8d9f49f3ba301e026e61fd681c45d4ff..f5e2dbcf2bb5f1cc2c5845e13197154253be2749 100644 GIT binary patch delta 267 zcmZqiJ7u-u1rwV`eom!=^JGURF;)=Md9yt8L8i$wBy1+%W?dtp;^VEOcPU#kPClYi S1M%ZzZ&hyyYx6?YWJUloTUVF> delta 2766 zcmX?Q)#A6|1(TRdW?EWmQEFatYOz9EQGTw1v%a&o_GCvUF>WNO&78~!nI?0yEuYNF z?#jlc5)!1NH2FQ7SiOp;i;j^Bmx`Oaj**IfNNR3DPO5*fzGHH7NwJEXyNZHqVseH; zacNRYW>IQ#Nq$kKLT0f-VxB@`a&n2DfRdpuaJ|Uo|&gmlCPssnwOJWTntfKpPyThnUkvEom!NanxjyhpI8i1T#%WZt&pFW zs;8h3nO|B2woC!V1(hISh^syPeOq)=L%TBMMYSdyqvoRMFe zlcJE6s!))Vn4FrTkXfInkda!H3bHdbu{c#BDKR-aGcR4Yv;d+Pqz&1Zo_WP3AcH{x zP*9MQnVeXXnV+YSS)x#$nUkZCT$GwvlB$r18esWp5W`f!fsEqZdPtC_%uNW388Hr`7 z3W*A7py)_W%*jbjff@nzvz~K6fL;_hpvyBdlQSSb&V&X?Nk*zdVnKld$R{9na%oXf zYF-H>@S$lXBqJ4Uybjc0pZvu76l7yTL70=Dn4$nOArawOh0MH?e1+W9Ts;K^bVGtl z^AJYpKpa(CT$-4ZQ>g$p3zQa8D^in7OHyIxf{e*mNK8plsE0%(DE`4IsvxzfI6p5j zMiWSF7#si35(05>%y zKe;qFHLnDmtg&c?7o~#I8YsT<3sQ>`OEUA)6^bj1OHy+|gN69xaJJmlJnvesE zN}TfZOMLPZQ&Q`TlysDQ{j6{*C{j|<(9}~d+|uF_ zg|y5Ph0Ht!GZO=EEaB%2aaj@AnIRde^)R; zi|}~4BwwMRC_kk%IaMK1At^I2v8WQ9=@cNDHnSMw;uM9%5{0Dv`g~9!4)I)KPH{do zwUZu@#Dyb9*;cRbn39+a3k`+5{5)MqTq_hL7L^d4v>+bv@(h6mXNp2fX%Q$DCFSRr zAmYKmz`y_$_h1V_)djTt1!YlCjH-b1CP)<|q3bz$`sq1?RfBRUxXjH<%uP*ED9%?X z$w({#<@!pna9Ud6_hEEVi07fiHb@{gtkYBuaAyWMoCG5mA-y?dAVM0VtQtBW^uk= za(=E7ZW$GDcxQquO-MxzO_gZzQV)q3P^%&%RiP*|J)=aSxB#4>L5?s|@y|)|bqYd? zLr^qBq(FZ3^>8slk_1=aNvY6Gmzf8(R3Bt3NI9~ric0eoRO&$`3$#q}O)M@+EdnV6 z#ZD?TH{g;~(a;3dIIy}iQ6VF-C`C7=D6=e8As1{CJdjgTi$KZO(?v(uNCn(%bMg1_ zaST!j_S_u7F2>FdYQX6lsZ1{8vt`nYnw%gkHu(}?int conversion, but sometimes you want to override. These functions are better than multiplying by "1.0" to convert to float.) +* A single quote can encompass multiple characters. $FG,2$'ABC'$FG$ is equal to $FG,2$0x434241$FG$. + * The "$FG,2$`$FG$" operator raises a base to a power. -* A single quote can encompass multiple characters. $FG,2$'ABC'$FG$ is equal to $FG,2$0x434241$FG$. +* There is no question-colon operator. * $AN,"","OP_precedence"$TempleOS $LK,"operator precedence","FA:::/TempleOS/Compiler/CmpInit.CPP,OP_precedence"$ $FG,2$`$FG$,$FG,2$>>$FG$,$FG,2$<<$FG$ @@ -100,7 +102,6 @@ $FG$$ID,-2$ $FG,2$&&$FG$ $FG,2$$FG,2$^^$FG$ $FG,2$||$FG$$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$,$FG,2$^=$FG$,$FG,2$+=$FG$,$FG,2$-=$FG$ * You can use $LK,"OptOn","MN:OptOn"$($LK,"OPTf_WARN_PAREN","MN:OPTf_WARN_PAREN"$) to find unnecessary parentheses in code. @@ -117,7 +118,7 @@ $FG$$ID,-2$ * Can't use $FG,2$<>$FG$ with $FG,2$#include$FG$, use $FG,2$""$FG$. -* "$FG,2$$$$FG$" is an escape character. Two dollar signs signify an ordinary $$. See $LK-A,"::/TempleOS/Doc/Dollar.TXT"$. In $FG,2$asm$FG$ or $FG,2$C+$FG$ code, it also refers to the instruction's addr. +* "$FG,2$$$$FG$" is an escape character. Two dollar signs signify an ordinary $$. See $LK-A,"::/TempleOS/Doc/Dollar.TXT"$. In $FG,2$asm$FG$ or $LK,"Holy C","FI:::/TempleOS/Doc/HolyC.TXT"$ code, it also refers to the instruction's addr. * $FG,2$union$FG$ is more like a class, so you don't reference it with a $FG,2$union$FG$ label after you define it. Some common unions are declared in $LK,"Adam1a.HPP","MN:U16"$ 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. See $LK-A,"::/TempleOS/Demo/SubIntAccess.CPP"$. @@ -223,4 +224,4 @@ $ID,-2$ * $FG,2$"%Q"$FG$ will convert "\" to "\\" and quote to backslash quote. (For use in creating strs in strs.) * $FG,2$"%q"$FG$ will reverse a $FG,2$"%Q"$FG$. -$ID,-2$ +$ID,-2$ \ No newline at end of file diff --git a/TempleOS/Doc/ImportExports.TXT b/TempleOS/Doc/ImportExports.TXT index 3a9b7b8..8c88539 100644 --- a/TempleOS/Doc/ImportExports.TXT +++ b/TempleOS/Doc/ImportExports.TXT @@ -1,8 +1,8 @@ $FG,5$$TX+CX,"Details of Scoping and Linkages"$$FG$ $WW,1$ -$LK,"Just-In-Time Compilation","FF:::/TempleOS/Doc/Glossary.TXT,JIT"$ makes use of the current task's hash sym table and its parent tasks' tables. It fetches syms from parent tasks' tables if not found locally in the current task's table and it places new syms in the current task's table. Conceptually, syms are at the scope of environment vars in other operating systems. +$LK,"JIT Compile Mode","FF:::/TempleOS/Doc/Glossary.TXT,JIT Compile Mode"$ makes use of the current task's hash sym table and its parent tasks' tables. It fetches syms from parent tasks' tables if not found locally in the current task's table and it places new syms in the current task's table. Conceptually, syms are at the scope of environment vars in other operating systems. -$LK,"AOT Compilation","FF:::/TempleOS/Doc/Glossary.TXT,AOT Compiled"$ creates a new, empty, sym table which you must populate by $FG,2$#include$FG$ing $LK-A,"::/TempleOS/Kernel/AOTAdam.HPP"$ or whatever to import syms. +$LK,"AOT Compile Mode","FF:::/TempleOS/Doc/Glossary.TXT,AOT Compile Mode"$ creates a new, empty, sym table which you must populate by $FG,2$#include$FG$ing $LK-A,"::/TempleOS/Kernel/AOTAdam.HPP"$ or whatever to import syms. When a sym is placed into a table, older syms with identical names will be overshadowed if they exist, unless you use the compiler option $LK,"OPTf_REPLACE_SYMS","MN:OPTf_REPLACE_SYMS"$. Duplicates are not allowed in many cases, especially in asm blks. Dupicates are allowed, by design in other cases, so that you can repeatedly $FG,2$#include$FG$ the same file from the cmd line while developing it. Or, so you can repeatedly declare a function with a standard name, like "$FG,2$UpdateWin()$FG$". This case might occur when the $FG,2$adam task$FG$ is starting-up loading-in many little utilities. @@ -16,7 +16,7 @@ $FG,2$_extern$FG$ binds a new $LK,"HTT_FUN","MN:HTT_FUN"$ or $LK,"HTT_GLBL_VAR", $FG,2$_import$FG$ binds a new $LK,"HTT_FUN","MN:HTT_FUN"$ or $LK,"HTT_GLBL_VAR","MN:HTT_GLBL_VAR"$ sym to a sym, of a $BK,1$different$BK,0$ name imported from the task's sym table at $LK,"Load","MN:Load"$() time. If no sym exists to bind to at $LK,"Load","MN:Load"$() time, the code using this sym will be left incomplete until the sym is defined. Basically, this binds C to asm from elsewhere. -$WW,0$$FG,2$S$FG$taticModule/$FG,2$J$FG$ustInTime +$WW,0$$FG,2$A$FG$headOfTime/$FG,2$J$FG$ustInTime | Code occurs in $FG,2$G$FG$lobalScope/$FG,2$F$FG$unctionScope | | $FG,2$C$FG$Code/$FG,2$A$FG$smCodeBlk | | | $FG,2$extern$FG$/$FG,2$import$FG$/$FG,2$_extern$FG$/$FG,2$_import$FG$/$FG,2$IMPORT$FG$/$FG,2$static$FG$/$FG,2$class$FG$/$FG,2$goto$FG$ @@ -27,32 +27,32 @@ $WW,0$$FG,2$S$FG$taticModule/$FG,2$J$FG$ustInTime | | | | | | || $FG,2$S$FG$taticVarInit/$FG,2$D$FG$ynamicVarInitAllowed/$FG,2$N$FG$oInitAllowed | | | | | | || | Are dups allowed within the namespace? A dup overshadows the original. | | | | | | || | $FG,2$D$FG$upsAllowed/$FG,2$N$FG$oDups/NoDupsBut$FG,2$P$FG$ad/$FG,2$W$FG$arningUnlessClosedOut -S G A C label:: S MG N -S G A C label: MG N -S G A C @@label: AL N -S G A IMPORT C label; MR N -S F A C label:: S BG N -S F A C label: BG N -S F A C @@label: AL N -S F A IMPORT C label; BR N -S x x #define MR D -S G C C function S MR D -S F C R var FR N -S F C S var FR N -S F C static C var FR D N -S F C goto C label: FG N -S G C C var S MR D D -S G C D var MR N D -S G C class MR D -S G C class member MR P -S G C extern class MR D -S G C extern C function MR W -S G C import C function MR D -S G C import C var MR D -S G C _extern C function MR D -S G C _extern C var MR D -S G C _import C function MR D -S G C _import C var MR D +A G A C label:: S MG N +A G A C label: MG N +A G A C @@label: AL N +A G A IMPORT C label; MR N +A F A C label:: S BG N +A F A C label: BG N +A F A C @@label: AL N +A F A IMPORT C label; BR N +A x x #define MR D +A G C C function S MR D +A F C R var FR N +A F C S var FR N +A F C static C var FR D N +A F C goto C label: FG N +A G C C var S MR D D +A G C D var MR N D +A G C class MR D +A G C class member MR P +A G C extern class MR D +A G C extern C function MR W +A G C import C function MR D +A G C import C var MR D +A G C _extern C function MR D +A G C _extern C var MR D +A G C _import C function MR D +A G C _import C var MR D J G A C label:: S Tg N J G A C label: BG N J G A C @@label: AL N @@ -75,8 +75,8 @@ J G C extern class C TR D J G C extern C function F TR W J G C extern C var G TR D J G C extern D var G TR D -J G C _extern C function F TR D -J G C _extern C var G TR D +J G C _extern C function F TR D +J G C _extern C var G TR D $WW,1$ * GoTo labels must not have the same name as global scope objects. GoTo's are rare and I don't want to slow the compiler and add code to fix this. You will get errors if a collision happens, so it's not very dangerous, but the error message is baffling. @@ -84,7 +84,7 @@ $WW,1$ * Use $FG,2$reg$FG$ or $FG,2$noreg$FG$ in front of local var names to override automatic register var allocation. You can, optionally, specify a reg after the "$FG,2$reg$FG$" keyword. -* Local nonregister function vars can be accessed in asm blks with $FG,2$&i[RBP]$FG$ for example. +* Local non-register function vars can be accessed in asm blks with $FG,2$&i[RBP]$FG$ for example. * Glbl vars and functions can be accessed in asm with and $FG,2$&$FG$ as in $FG,2$MOV RAX,I64 [&glbl_var] @@ -95,7 +95,7 @@ $WW,1$ * All offspring tasks of a task inherit syms. -* The $FG,2$sizeof()$FG$ and C+ structure members can be used in asm blks. +* The $FG,2$sizeof()$FG$ and Holy C structure members can be used in asm blks. * No register vars are used in functions with a try/catch. They will be force to $FG,2$noreg$FG$. @@ -106,4 +106,3 @@ $WW,1$ * Note: $FG,2$static$FG$ function vars do not go on the data heap, no matter the setting of the $LK,"OPTf_GLBLS_ON_DATA_HEAP","MN:OPTf_GLBLS_ON_DATA_HEAP"$$FG$. They may in the future. * $LK,"OPTf_EXTERNS_TO_IMPORTS","MN:OPTf_EXTERNS_TO_IMPORTS"$ will treat $FG,2$_extern$FG$ as $FG,2$_import$FG$ and $FG,2$extern$FG$ as $FG,2$import$FG$. This allows a header to be used either as a $FG,2$JIT compiled$FG$ or $FG,2$AOT compiled$FG$ header. -$WW,0$ \ No newline at end of file diff --git a/TempleOS/Doc/InputPointer.TXT b/TempleOS/Doc/InputPointer.TXT index ad8bf35..7de748a 100644 --- a/TempleOS/Doc/InputPointer.TXT +++ b/TempleOS/Doc/InputPointer.TXT @@ -2,6 +2,6 @@ $WW,1$"Input Ptr" is the mouse at this point. $LK,"ipx","MN:ipx"$ and $LK,"ipy","MN:ipy"$ can be used to access the x and y coordinates of the input ptr. They are relative to the screen, not window. These can be used if you don't want to use msg passing. $LK,"ipz","MN:ipz"$ is the wheel. -$LK,"iptx","MN:iptx"$ and $LK,"ipty","MN:ipty"$ are the text column and row of the input ptr. See $LK-A,"::/TempleOS/Demo/Maze.CPP"$. +$LK,"iptx","MN:iptx"$ and $LK,"ipty","MN:ipty"$ are the text column and row of the input ptr. See $LK-A,"::/TempleOS/Demo/Games/Maze.CPP"$. You can make the input ptr snap to a grid by adjusting $FG,4$Fs->snap$FG$. diff --git a/TempleOS/Doc/Install.TXT b/TempleOS/Doc/Install.TXT index 0c181e6..f53fb96 100644 --- a/TempleOS/Doc/Install.TXT +++ b/TempleOS/Doc/Install.TXT @@ -24,7 +24,7 @@ $BK,1$WARNING:$BK,0$ This command erases everything on a hard drive. It repart $BK,1$WARNING:$BK,0$ This command doesn't play well with other operating systems. You'll need to do a $LK,"MasterBootZero","MN:MasterBootZero"$() to restore your drive to a state where other operating systems can partition it. $ID,-2$ $ID,-2$2) $LK,"Fmt","MN:Fmt"$($FG,2$'D'$FG$,$FG,2$TRUE,FALSE,PT_FAT32$FG$) -$ID,2$This command formats a partition with $FG,2$FAT32$FG$ or the TempleOS native file system type. Use the drive letter of the partition in place of $FG,2$'D'$FG$. +$ID,2$This command formats a partition with $FG,2$FAT32$FG$ or the $FG,2$RedSea$FG$ file system type. Use the drive letter of the partition in place of $FG,2$'D'$FG$. $BK,1$WARNING:$BK,0$ If you are upgrading, be sure not to lose the file, $FG,2$/0000Boot/OldMBR.BIN.C$FG$. @@ -46,3 +46,4 @@ $ID,-2$ $FG,8$ * "Windows" is a trademark of MicroSoft Corp. * "Linux" is probably a trademark owned by Linus Torvalds. +$FG$ \ No newline at end of file diff --git a/TempleOS/Doc/Lex.TXT b/TempleOS/Doc/Lex.TXT index 1c59530..243e823 100644 --- a/TempleOS/Doc/Lex.TXT +++ b/TempleOS/Doc/Lex.TXT @@ -1,4 +1,3 @@ $WW,1$The compiler's lexical analyzer can be used in your programs to simplify parsing. See $LK,"Doc Parsing","FF:::/TempleOS/Adam/Doc/DocPlain.CPP,LexNew"$ or $LK,"Parse Opcode File","FF:::/TempleOS/Compiler/CmpInit.CPP,Opcodes.TXT"$. See $LK,"Tokens","MN:TK_IDENT"$. - diff --git a/TempleOS/Doc/Mem.TXT b/TempleOS/Doc/Mem.TXT index 7933e77a57f9fa02dc1109f9b6b8bbab899260b0..59217114fc7509ab508907889c0bcf37848570a7 100644 GIT binary patch delta 986 zcmbPhctcNKB|KcmP$eKSJu@#|A+uN^F()^_xI`f@zeJ(5I5lOWj;y;vNxni-szPFN zNoHB9o`OPHW>HCLVh%`kW=d*aNoGl!EB^mjp=@|-%IXMc6DJey%#l@+`3W-Ij3NZZ$VLb%} zBL&~obcKS%^i+kC#H5^5h19%~qD-g`kUMo0QY(^E3rZA9GEx=NGK-2!AbNBZ$}=*P zGeCYRRxru*Mlz!qW{94Gf?s|~1}FfE%M%NVLB2@IEY8+ZNX;zCNG;Oi;_}Q>2uaN? z$Vv4N)&X0QlV6?+w!=L$T_HbBAvZNQzo-%vB*}?6IjJd==P*f&D!?_V7b_&^=N4q< zq!vvMW>l&7@(oZ>Q*d_l@lnXkD=sN2O)kmI&ns3)N=;5IElyQ1Gto`TECDMhRwzl# zPE{x=&qqepOUJOoS3JOpO;gq z0CJW>qC#3}UUEq$Q-0p$H;hv(l=Ku7Ldx?MK%U4fRw&3x%`2(YQAo+pQ!h~{&o3&f z)Z^lc%r6BSlU$UVSdyxcms+l~`81On6SJ#<@#HTolbI~dCwHMEv|V(R%-tYBNk_@WB|bPZINrn6F(BT@)7LXZNo8{{hcpulCnqQ8fvr#g*_@JC zk_fUHWCbVZ!`A8}k%E4hM;wfUJX9sG#7P gmy%kLng_~nFnKeOJV+}vwQO$YPhi^oL~th?0K^9+t^fc4 delta 1327 zcmcbiH`h={B|KcmP{mUrB{L;Yy+olrF|S0SBwwMlI8~t_F+DX!AvZNQzo=3nH$NqH zqP%Rqo`Ql~evv|APL4umUP)?RNwGp=UW!6NX;DFbacZ%SLRn@}NoisZNS}g6L1KDl zUb?12X0bwEehJ9b6g>rnkks6QoK*i{h0K)Hypqh4N`>6Sf?}|J#URTIGAfHRlObm0 z7gg#hC^+WiC?w|>r4~=@mNC>*PzXp&PgN*MOv*`BNX;uL%1kX*$Ver=%)?OakdjE6oF&q@z%hk*WaWDdd(GmnbBqDwJoIWMt+k7%5E7 zW9pL8Q&La}$;d2L$jL8HEiO?oQgF{qSMUTIHo2csT7-)$GQU(IIWbQmxhOTUBvm0V zwS2Pyvl*ft#l6>yy9DS%P|ekWT)wLvtRsCee3q!y&+feIf5 V+}c6bo2hKJ;7e!PJWpU38vw$FG$$FG$. Normally, they are packed together in a list and the addr of the first is passed to routines. +$WW,1$A $FG,4$CSprite$FG$, is an ordered list of $LK,"these","MN:GRST_END"$ elements, created with $FG,2$$FG$$FG$. Normally, they are packed together in a list and the address of the first is passed to routines. See $LK-A,"::/TempleOS/Demo/Graphics/SpritePlot.CPP"$, $LK-A,"::/TempleOS/Demo/Graphics/SpritePlot3D.CPP"$ and $LK-A,"::/TempleOS/Demo/Graphics/SpritePut.CPP"$ and $LK,"CSpriteMesh","MN:CSpriteMesh"$(). Be aware that copying $FG,2$SP$FG$, $FG,2$IB$FG$, or $FG,2$IS$FG$ entries with the clipboard results in duplicate entries with different nums. You can manually remove dups by editing with $FG,2$$FG$ and setting to the original num. See $LK,"::/TempleOS/Adam/Gr/GrSpritePlot.CPP","FL:::/TempleOS/Adam/Gr/GrSpritePlot.CPP,1"$ for how CSprite are stored.$FG$ - diff --git a/TempleOS/Doc/SpriteBitMap.TXT b/TempleOS/Doc/SpriteBitMap.TXT new file mode 100644 index 0000000..4072dc2 --- /dev/null +++ b/TempleOS/Doc/SpriteBitMap.TXT @@ -0,0 +1,3 @@ +$WW,1$$FG,5$$TX+CX,"Sprite BitMap Menu Help"$$FG$ + +Bitmaps have a background color. If you delete to the clipboard, what's left will be background colored. diff --git a/TempleOS/Doc/SpriteEd.TXT b/TempleOS/Doc/SpriteEd.TXT new file mode 100644 index 0000000..fd2a952 --- /dev/null +++ b/TempleOS/Doc/SpriteEd.TXT @@ -0,0 +1,9 @@ +$WW,1$$FG,5$$TX+CX,"Sprite Edit Menu Help"$$FG$ + +Order of elements matters. They are executed in the order they appear in the side-bar. You can set the current element by clicking the element in the side-bar and making it RED. + +DELETE will delete the RED element in the side-bar. You can just delete elements directly in the side-bar as long as you click another element to update things. + +You can delete or select elements graphically. + +You can insert an element which shifts around all subsequent other elements. Perhaps, you inserted a sprite's elements from the clip-board and want to chift it around. This command is also useful if you interpolate in programs. diff --git a/TempleOS/Doc/SpriteEdText.TXT b/TempleOS/Doc/SpriteEdText.TXT new file mode 100644 index 0000000..2d11cb3 --- /dev/null +++ b/TempleOS/Doc/SpriteEdText.TXT @@ -0,0 +1,7 @@ +$WW,1$$FG,5$$TX+CX,"Sprite Edit as Text Help"$$FG$ + +You can cut, paste and duplicate elements. + +See the format for $LK,"CSprites","MN:CSprite"$. + +Sadly, you cannot change the length of variable-length element types. diff --git a/TempleOS/Doc/SpriteMain.TXT b/TempleOS/Doc/SpriteMain.TXT new file mode 100644 index 0000000..335fe4d --- /dev/null +++ b/TempleOS/Doc/SpriteMain.TXT @@ -0,0 +1,9 @@ +$WW,1$$FG,5$$TX+CX,"Sprite Main Menu Help"$$FG$ + +Order of elements matters. They are executed in the order they appear in the side-bar. You can set the insert point for new elements by click the element in the side-bar and making it RED. + +After you create a 3D Mesh, you can edit it by selecting it in the side-bar so it is colored RED. Then, click EDIT-3D-MESH. A shiftable 3D mesh has a 2D offset to position the origin. You can convert between shiftable and non-shiftable by editing it with the other command. + +You can convert all elements to a BitMap if END is RED in the side-bar and you CONVERT-TO-BITMAP. Later, you can edit that bitmap by selecting it in the side bar so it is colored RED and clicking EDIT-BITMAP. + +If you have a 3D icon, you might want to place a background-colored rectangle under the 3D icon, so it hovers above. Use TRANSFORM-OFF and TRANSFORM-ON. You will also need to set the Z offset of the icon. Go to the Edit menu and select EDIT-AS-TEXT and change the third INT to Z offset. Good luck. diff --git a/TempleOS/Doc/SpriteSideBar.TXT b/TempleOS/Doc/SpriteSideBar.TXT new file mode 100644 index 0000000..8e086dc --- /dev/null +++ b/TempleOS/Doc/SpriteSideBar.TXT @@ -0,0 +1,7 @@ +$FG,5$$TX+CX,"Sprite SideBar Help"$$FG$ + +$WW,1$You can cut and paste elements in this side-bar to reorder, delete or duplicating them. Click an element in the side-bar after you make changes to cause the changes to take-effect. + +You can click on an element to make it the insert point for new elements. + +The RED element is the current element and it is the insert point for new elements. \ No newline at end of file diff --git a/TempleOS/Doc/Start.TXT b/TempleOS/Doc/Start.TXT index 8bf66eb..32c8ca7 100644 --- a/TempleOS/Doc/Start.TXT +++ b/TempleOS/Doc/Start.TXT @@ -27,5 +27,3 @@ $ID,-2$ Remember to terminate cmds with a semicolon. $LK,"Help Index","FI:::/TempleOS/Doc/HelpIndex.TXT"$ $LK,"Quick Start--Command Line","HI:Cmd Line (Typically)"$ - - diff --git a/TempleOS/Doc/Strategy.TXT b/TempleOS/Doc/Strategy.TXT index b7ef89b..56457a2 100644 --- a/TempleOS/Doc/Strategy.TXT +++ b/TempleOS/Doc/Strategy.TXT @@ -44,5 +44,3 @@ The $FG,2$$TX+HTML,"trivial solution","http://en.wikipedia.org/wiki/Trivial_solu * No need for namespaces -- scoping occurs automatically based on task symbol table hierarchy with the $FG,2$Adam task$FG$'s symbol system-wide global. * Sometimes, I $LK,"cut corners","FI:::/TempleOS/Doc/CutCorners.TXT"$ in the interest of keeping the code beautiful. - -$FG,8$ diff --git a/TempleOS/Doc/SysPgmGuide.TXT b/TempleOS/Doc/SysPgmGuide.TXT deleted file mode 100644 index e4e6898..0000000 --- a/TempleOS/Doc/SysPgmGuide.TXT +++ /dev/null @@ -1,31 +0,0 @@ -$WW,1$$FG,5$$TX+CX,"System Programming Guide-Lines"$$FG$ - -* See $LK,"Naming convention","FF:::/TempleOS/Doc/Glossary.TXT,Naming convention"$. - -* See $LK,"Abbreviations","FF:::/TempleOS/Doc/Glossary.TXT,Abbreviations"$. - -* I avoid the '$FG,2$?$FG$' operator. It's not very efficient with my compiler since it executes both expressions and I just don't like it. - -* I place "New", "Del", "Init", "Rst", ect. on the end of a function name instead of beginning. "$FG,4$RstMusicSettings$FG$" should be "$FG,4$MusicSettingsRst$FG$". - -* I often use 64-bit values in function args when smaller would be more appropriate because the compiler generally is more efficient with 64-bit values. (All value get promoted to 64-bit by the TempleOS compiler, when fetched.) - -* Short circuit logic is assumed. - -* I generally avoid boolean expression assignments because $FG,2$TRUE$FG$ is dangerous with different compilers, though, the TempleOS compiler should use $FG,2$1$FG$ for TRUE values, not just nonzero. Boolean assignments don't have short circuit logic and are not compiled efficiently. The $FG,2$Bool$FG$ type is just an alias for a 1 byte int -- nothing forces it to 1 or 0. There is a $LK,"ToBool","MN:ToBool"$() function. - -* If you use floats in your interrupt routine, save and restore the fpu state with $LK,"Fxsave","MN:Fxsave"$() and $LK,"Fxrstor","MN:Fxrstor"$(). The timer interrupt does this. The keyboard and mouse don't use floats. - -* Bracketing code with $FG,2$$FG,2$PushFD;Cli;$FG$ and $FG,2$PopFD;$FG$ will protect against simultaneous accesses from tasks on $UL,1$one$UL,0$ core. To protect against multiple cores, you need a locked semaphore. - -* I put an '$FG,2$_$FG$' on the front of the name of pass-by-ref fun args. - -* I put an '$FG,2$_$FG$' on the front of C callable ASM routines. - -* $LK,"SysDbg","MN:SysDbg"$() and $LK,"IsSysDbg","MN:IsSysDbg"$() are really handy when working on the compiler or Kernel. It's just a bit you can set and test. - -* I don't use "$FG,2$U0 *$FG$" because the size would be weird for ptr arithmetic. - -* "$FG,2$result$FG$" is reserved for local variable that holds function return val. - -* I use $FG,2$I64$FG$ instead of $FG,2$U64$FG$ unless necessary. diff --git a/TempleOS/Doc/TSZ.TXT b/TempleOS/Doc/TSZ.TXT index 3cd772f..5a49c76 100644 --- a/TempleOS/Doc/TSZ.TXT +++ b/TempleOS/Doc/TSZ.TXT @@ -3,23 +3,19 @@ $WW,1$$FG,5$$TX+CX,"Linux TSZ Utility"$$FG$ $FG,2$TSZ [-ascii] filename$FG$ -Will uncompress a single file from Linux. The $FG,2$-ascii$FG$ flag will convert the irregular TempleOS ASCII 5 and ASCII 31 characters to spaces. (ASCII 5 is used to mark the cursor pos and ASCII 31 is used for shifted space characters and will cause problems unless you convert them.) +Will uncompress a single file from within Linux. The $FG,2$-ascii$FG$ flag will convert the irregular TempleOS ASCII 5 and ASCII 31 characters to spaces. (ASCII 5 is used to mark the cursor pos and ASCII 31 is used for shifted space characters and will cause problems unless you convert them.) $FG,5$$TX+CX,"Windows TSZ Utility"$$FG$ -$FG,2$TSZ$FG$ is a Windows cmd line program which will assist transferring files from TempleOS to Windows. It will also uncompress TempleOS files you have gotten to Windows. There are three ways to get files from TempleOS to Windows -- via CD-ROM, a $FG,2$FAT32$FG$ partition or via a "file partition" you have created with $FG,2$TSZ$FG$ on a Windows partition. +$FG,2$TSZ$FG$ will uncompress TempleOS files you have gotten to Windows. There are two ways to get files from TempleOS to Windows -- via CD-ROM or via a $FG,2$FAT32$FG$ partition. -$FG,2$TSZ -expand [-ascii] dirname$FG$: +$FG,2$TSZ [-ascii] dirname$FG$: will uncompress all TempleOS files with names ending in "$FG,2$.Z$FG$" in a Windows directory and in all subdirectories. The $FG,2$-ascii$FG$ flag used in combination will convert the irregular TempleOS ASCII 5 and ASCII 31 characters to spaces. (ASCII 5 is used to mark the cursor pos and ASCII 31 is used for shifted space characters and will cause problems unless you convert them.) Note: If you pick names not ending in "$FG,2$.Z$FG$", they will not need to be uncompressed. You can $LK,"Move","MN:Move"$() or $LK,"Copy","MN:Copy"$() them to a name not ending in "$FG,2$.Z$FG$" and they will be stored uncompressed. -allocated by Windows and located by TempleOS, and if you don't mess with them, you can use them to transfer files between TempleOS and Windows. This is a little risky. It's pretty safe if you create this file on a partition dedicated for this purpose. - -$BK,1$WARNING:$BK,0$ Do not run a defrag operation on a partition holding a file partition. If you store files to it after such an operation, you'll ruin data on your hard drive. - - $FG,8$ * "Windows" is a trademark of MicroSoft Corp. * "Linux" is probably a trademark owned by Linus Torvalds. +$FG$ \ No newline at end of file diff --git a/TempleOS/Doc/TimeCycles.TXT b/TempleOS/Doc/TimeCycles.TXT index 7b3270f..19a1985 100644 --- a/TempleOS/Doc/TimeCycles.TXT +++ b/TempleOS/Doc/TimeCycles.TXT @@ -1,3 +1 @@ $WW,1$Intel/AMD have an instruction that returns the num of CPU cycles since boot. This is not calibrated to an accurate real time value and, the CPU speed is throttled! TempleOS measures it and you can convert with $LK,"time_stamp_freq","MN:time_stamp_freq"$, a value continuously calibrated from other timers. This is the fastest timer available. - - diff --git a/TempleOS/Doc/TimeDate.TXT b/TempleOS/Doc/TimeDate.TXT index 3ea3056..98782a8 100644 --- a/TempleOS/Doc/TimeDate.TXT +++ b/TempleOS/Doc/TimeDate.TXT @@ -1,5 +1,3 @@ $WW,1$TempleOS uses a 64-bit value, $LK,"CDate","MN:CDate"$, for date/time. The upper 32-bits are the days since Christ. The lower 32-bits store time of day divided by 4 billion which works out to 49710ths of a second. You can subtract two $LK,"CDate","MN:CDate"$'s to get a time span. Use $LK,"CDATE_FREQ","MN:CDATE_FREQ"$ to convert. - - diff --git a/TempleOS/Doc/TimeJiffy.TXT b/TempleOS/Doc/TimeJiffy.TXT index 3a3c690..3c5325d 100644 --- a/TempleOS/Doc/TimeJiffy.TXT +++ b/TempleOS/Doc/TimeJiffy.TXT @@ -5,5 +5,3 @@ $LK,"SysTimerRead","MN:SysTimerRead"$ reads the timer ticks since boot. It's no Use $LK,"JIFFY_FREQ","MN:JIFFY_FREQ"$ to convert $LK,"sys_jiffies","MN:sys_jiffies"$. Use $LK,"SYS_TIMER_FREQ","MN:SYS_TIMER_FREQ"$ to convert $LK,"SysTimerRead","MN:SysTimerRead"$. - - diff --git a/TempleOS/Doc/Tips.TXT b/TempleOS/Doc/Tips.TXT index df35279..9abd768 100644 --- a/TempleOS/Doc/Tips.TXT +++ b/TempleOS/Doc/Tips.TXT @@ -23,13 +23,9 @@ $FG,5$M(\"D:/TempleOS/*\",\"E:/TempleOS/*\",\"+r+d\");$FG$ to check my changes. * You can set your local time zone by setting the $LK,"local_time_offset","MN:local_time_offset"$ global var in a start-up file. It's units are $LK,"CDATE_FREQ","MN:CDATE_FREQ"$. See $LK,"local time","FF:HOME/Adam3aLocalize.CPP,local_time"$. -* Use $LK,"DocCurAttr","MN:DocCurAttr"$() in $LK,"UserStartUp","MN:UserStartUp"$() to set terminal window colors. - * See $MA+A-X+PU,"Key Map","KeyMap;View;\n"$ for a list of defined keys. Define your own keys in $LK,"MyPutKey","MN:MyPutKey"$(). See $LK-A,"::/TempleOS/Doc/KeyBoard.TXT"$. -* $FG,2$$FG$ in the editor to autoindent a $FG,2$C+$FG$ function or renumber an asm routine's local labels. If it does not have $FG,2$#exe$FG$ config stuff, select "recompile." Otherwise, don't recompile$FG$ and it will use the compiler info collected when it was most recently compiled. $BK,1$$FG,2$$FG$ can be used to test if a file will compile.$BK,0$ - -* While developing applications, keeping everything in one source file allows you to use the $FG,2$$FG$ compile check/autoindent feature. Alternatively, you can $FG,2$#include$FG$ the files in a project a file depends on before entering the editor and $FG,2$$FG$ it. +* $FG,2$$FG$ in the editor to reindent a $LK,"Holy C","FI:::/TempleOS/Doc/HolyC.TXT"$ function or renumber an asm routine's local labels. * You can use $FG,2$filter_lines$FG$ in the editor text search form ($FG,2$$FG$) to temporarily display just lines near each match. A value of $FG,2$filter lines$FG$ set to $FG,2$5$FG$ will display lines within 5 lines of matches. Then, you can do another find to a different string and achieve a $FG,2$AND$FG$ search. When finished, press $FG,2$$FG$. @@ -130,7 +126,7 @@ $FG,5$M(\"D:/TempleOS/*\",\"E:/TempleOS/*\",\"+r+d\");$FG$ to check my changes. * You can delete the $FG,4$HOME/Registry.CPP.Z$FG$ file. The policy is that deleting it will restore defaults. It should plain text, if you want to edit it. Be careful of tree indentations. -* Study $LK-A,"::/TempleOS/Adam/MemRep.CPP"$ and $LK,"WallPaper","MN:WallPaper"$() to learn how the system resources are put together. +* Study $LK-A,"::/TempleOS/Adam/Utils/MemRep.CPP"$ and $LK,"WallPaper","MN:WallPaper"$() to learn how the system resources are put together. * The editor's select-text mechanism allows for disjoint portions of selected text. This is a feature, not a bug -- you can cut-and-paste disjoint text. @@ -146,4 +142,6 @@ $FG,5$M(\"D:/TempleOS/*\",\"E:/TempleOS/*\",\"+r+d\");$FG$ to check my changes. * Use $LK,"Fix","MN:Fix"$() to edit and fix the last compiler err. +* You can use $FG,2$$FG$ to do a check for compile errors. + * You can use $LK,"DocOpt","MN:DocOpt"$() to optimize links. (Mostly just removes .Z) diff --git a/TempleOS/Doc/Transform.TXT b/TempleOS/Doc/Transform.TXT index 5539431..18a0dcb 100644 --- a/TempleOS/Doc/Transform.TXT +++ b/TempleOS/Doc/Transform.TXT @@ -10,5 +10,4 @@ The 4th dimension allows a neat trick where you can place pos shifts (translatio Finally, $LK,"CDC","MN:CDC"$'s have an $FG,2$x$FG$, $FG,2$y$FG$ and $FG,2$z$FG$ which is an additional shift (translation). -The transformation is implemented as a callback on the $LK,"CDC","MN:CDC"$'s $FG,2$transform()$FG$ member. The default $FG,2$transfrom()$FG$ callback is $LK,"GrTransform","MN:GrTransform"$(). See $LK-A,"::/TempleOS/Demo/GameStarters/EagleDive.CPP"$ or $LK-A,"::/TempleOS/Demo/GameStarters/FPS.CPP"$ to see how to change the $FG,2$transfrom()$FG$ callback for foreshortening. - +The transformation is implemented as a callback on the $LK,"CDC","MN:CDC"$'s $FG,2$transform()$FG$ member. The default $FG,2$transfrom()$FG$ callback is $LK,"GrTransform","MN:GrTransform"$(). See $LK-A,"::/TempleOS/Demo/Games/EagleDive.CPP"$ or $LK-A,"::/TempleOS/Demo/Games/CastleFrankenstein.CPP"$ to see how to change the $FG,2$transfrom()$FG$ callback for foreshortening. diff --git a/TempleOS/Doc/TrivialSolutions.TXT b/TempleOS/Doc/TrivialSolutions.TXT index b58c66d..c94b0c8 100644 --- a/TempleOS/Doc/TrivialSolutions.TXT +++ b/TempleOS/Doc/TrivialSolutions.TXT @@ -1,7 +1,7 @@ $WW,1$$FG,5$$TX+CX,"Trivial Solutions"$$FG$ -The $FG,2$$TX+HTML,"trivial solution","http://en.wikipedia.org/wiki/Trivial_solution"$$FG$ in math is the simple, obvious answer. The fable that NASA spent millions on a space pen while Russia used a pencil is another example. TempleOS uses many $LK,"trivial solutions","FI:::/TempleOS/Doc/Strategy.TXT"$. +The $FG,2$$TX+HTML,"trivial solution","http://en.wikipedia.org/wiki/Trivial_solution"$$FG$ in math is the simple, obvious answer. The fable that NASA spent millions on a space pen while Russia used a pencil is an example. TempleOS uses many $LK,"trivial solutions","FI:::/TempleOS/Doc/Strategy.TXT"$. See $LK-A,"::/TempleOS/Doc/Acknowledgements.TXT"$. diff --git a/TempleOS/Doc/Upgrade.TXT b/TempleOS/Doc/Upgrade.TXT index 42d7f4b..a5955a4 100644 --- a/TempleOS/Doc/Upgrade.TXT +++ b/TempleOS/Doc/Upgrade.TXT @@ -5,4 +5,3 @@ To upgrade, you generally boot the new TempleOS CD/DVD, install on top of your p The $FG,2$INSTALL$FG$ option when you boot a CD will install on top of an existing install if you tell it not to delete the $FG,2$/TempleOS$FG$ directory. See the $LK,"Installing","FI:::/TempleOS/Doc/Install.TXT"$ documentation. - diff --git a/TempleOS/Doc/Welcome.TXT b/TempleOS/Doc/Welcome.TXT index 91d07a9..0149439 100644 --- a/TempleOS/Doc/Welcome.TXT +++ b/TempleOS/Doc/Welcome.TXT @@ -1,19 +1,20 @@ $WW,1$$FG,5$$TX+CX,"Welcome to TempleOS"$$FG$ $LK,"Trivial Solutions","FI:::/TempleOS/Doc/TrivialSolutions.TXT"$'s TempleOS is a x86_64, multi-cored, multi-tasking, ring-0-only, single-address_mapped (identity), operating system for recreational programming: -$ID,2$* Professional hobby projects -* Teenager projects -* Non-professional, older-person projects -$ID,-2$ -Simplicity is a goal to $LK,"keep the line count down","FI:::/TempleOS/Doc/Strategy.TXT"$, so it's easy to tinker with. As it turns-out, simplicity makes it faster in some ways, too. It never switches privilege levels, never changes address maps, tends to load whole contiguous files and other, similar things which boost speed. It's only $TX+D,"139,633","DD_TEMPLEOS_LOC"$ lines of code including the kernel, the 64-bit compiler, the graphics library and all the tools. More importantly, it's designed to keep the user's line count down -- you can do a "hello world" application in one line of code and can put graphics on the screen with a three line program! -It's a kayak, not a Titanic -- it will crash if you do something wrong. You quickly reboot, however. DOS and the 8-bit home computers of the 80's worked fine without memory protection and most computers in the world -- the embedded ones -- operate without protection. The resulting simplicity of no protections is why TempleOS has value. In facts, that's the point of TempleOS. See the $LK,"TempleOS Constitition","FI:::/TempleOS/Doc/Charter.TXT"$. +$ID,2$* Professionals doing hobby projects +* Teenagers doing projects +* Non-professional, older-persons projects +$ID,-2$ +Simplicity is a goal to $LK,"keep the line count down","FI:::/TempleOS/Doc/Strategy.TXT"$, so it's easy to tinker with. As it turns-out, simplicity makes it faster in some ways, too. It never switches privilege levels, never changes address maps, tends to load whole contiguous files and other, similar things which boost speed. It's only $TX+D,"129,156","DD_TEMPLEOS_LOC"$ lines of code including the kernel, the 64-bit compiler, the graphics library and all the tools. More importantly, it's designed to keep the user's line count down -- you can do a "hello world" application in one line of code and can put graphics on the screen with a three line program! + +It's a kayak, not a Titanic -- it will crash if you do something wrong. You quickly reboot, however. DOS and the 8-bit home computers of the 80's worked fine without memory protection and most computers in the world -- the embedded ones -- operate without protection. The resulting simplicity of no protections is why TempleOS has value. In facts, that's the point of TempleOS. See the $LK,"TempleOS Charter","FI:::/TempleOS/Doc/Charter.TXT"$. Two things to know about TempleOS are that $UL,1$tasks$UL,0$ have $LK,"MAlloc","MN:MAlloc"$/$LK,"Free","MN:Free"$ heap memory, not applications, and tasks have compiler symbol tables that persist at a scope like environment variables in other operating systems, and the symbols can include functions. -In other operating systems, I hated learning one language for command line scripts and another for programming. With $FG,2$TempleOS$FG$, the command line feeds right into the $FG,2$C+$FG$ (more than $FG,2$C$FG$, less than $FG,2$C++$FG$) compiler, line by line, and it places code into memory it $LK,"MAlloc","MN:MAlloc"$()s. The compiler is paused at the command line, waiting for input. Naturally, you $FG,2$#include$FG$ a program to load it into memory and, usually, start it. During the boot process, many files get compiled before you have access to the command line. (Don't worry, booting takes only a couple seconds.) All the header declarations for the operating system are compiled and are available for use in your programs without needing to $FG,2$#include $FG$them. Everything is truly compiled to native $FG,4$$TX+HTML,"x86_64","http://en.wikipedia.org/wiki/Amd64#AMD64"$$FG$ and nothing is "interpreted". +In other operating systems, I hated learning one language for command line scripts and another for programming. With $FG,2$TempleOS$FG$, the command line feeds right into the $LK,"Holy C","FI:::/TempleOS/Doc/HolyC.TXT"$ (more than $FG,2$C$FG$, less than $FG,2$C++$FG$) compiler, line by line, and it places code into memory it $LK,"MAlloc","MN:MAlloc"$()s. The compiler is paused at the command line, waiting for input. Naturally, you $FG,2$#include$FG$ a program to load it into memory and, usually, start it. During the boot process, many files get compiled before you have access to the command line. (Don't worry, booting takes only a couple of seconds.) All the header declarations for the operating system are compiled and are available for use in your programs without needing to $FG,2$#include $FG$them. Everything is truly compiled to native $FG,4$$TX+HTML,"x86_64","http://en.wikipedia.org/wiki/Amd64#AMD64"$$FG$ and nothing is "interpreted". -Statements at the global scope (outside the scope of $FG,2$C+$FG$ functions) execute immediately. There is no $FG,2$main()$FG$ function. Instead, you give meaningful names to what would be $FG,2$main()$FG$ functions and you invoke them by calling them with a statement in the global scope, usually at the bottom of your file. +Statements at the global scope (outside the scope of $LK,"Holy C","FI:::/TempleOS/Doc/HolyC.TXT"$ functions) execute immediately. There is no $FG,2$main()$FG$ function. Instead, you give meaningful names to what would be $FG,2$main()$FG$ functions and you invoke them by calling them with a statement in the global scope, usually at the bottom of your file. I started with $FG,2$C$FG$ syntax, but didn't like the command line for a directory listing looking like this: @@ -29,13 +30,13 @@ $FG$I didn't like that, so I made parentheses optional on calls with no args and The syntax change created an ambiguity when specifying function addresses. To resolve it, I made a '$FG,2$&$FG$' required in front of function names when specifying an address of a function, which is better anyway. -Once I was no longer using standard syntax, I decided to change everything I didn't like. Here are the new $LK,"operator precedence","FA:::/TempleOS/Doc/Differences.TXT,OP_precedence"$ rules. See $LK,"Departures from C/C++","FI:::/TempleOS/Doc/Differences.TXT"$. It's Biblical! See $LK,"Luke,5:37","BF:Luke,5:37"$. +Once I was no longer using standard C/C++ syntax, I decided to change everything I didn't like and call it $LK,"Holy C","FI:::/TempleOS/Doc/HolyC.TXT"$. Here are the new $LK,"operator precedence","FA:::/TempleOS/Doc/HolyC.TXT,OP_precedence"$ rules. It's Biblical! See $LK,"Luke,5:37","BF:Luke,5:37"$. There are no object files in TempleOS and, normally, you don't make executable files either, but you can. That's known as "$FG,2$Ahead-Of-Time$FG$" compilation. Instead, you "$FG,2$Just-In-Time$FG$" compile. Tasks have no priority scheme and are never removed from the queue. Instead, they often poll whatever they are waiting on and swap-out. (Swapping tasks takes half a microsecond and does not involve disk activity or memory maps.) See $LK,"Scheduler","FL:::/TempleOS/Kernel/Scheduler.CPP,1"$. Polling keeps it simple. It's might be a problem if you had lots of tasks busy, which rarely happens on a home computer. The order of the tasks in the queue determines front-to-back window order. See $LK,"TempleOS MultiTasking","FI:::/TempleOS/Doc/MultiTasking.TXT"$. -The TempleOS native file system is simple, so I don't get sued. There is an allocation bitmap for clusters and all files are stored contiguously. You can't grow files. +The TempleOS $FG,2$RedSea$FG$ file system is simple, so I don't get sued. There is an allocation bitmap for clusters and all files are stored contiguously. You can't grow files. TempleOS is geared toward reading and writing whole files. Since whole files are processed, checksums and compression are possible. Filenames ending in "$FG,2$.Z$FG$" are automatically compressed or uncompressed when stored or fetched. TempleOS supports direct block random access into files, however -- $LK,"FRBlks","MN:FRBlks"$() and $LK,"FWBlks","MN:FWBlks"$(). diff --git a/TempleOS/Doc/CtrlL.TXT b/TempleOS/Doc/Widget.TXT similarity index 92% rename from TempleOS/Doc/CtrlL.TXT rename to TempleOS/Doc/Widget.TXT index 9957a2b..387c5c6 100644 --- a/TempleOS/Doc/CtrlL.TXT +++ b/TempleOS/Doc/Widget.TXT @@ -1,6 +1,8 @@ -$WW,1$See $LK-A,"::/TempleOS/Doc/Dollar.TXT"$ for details on dollar sign cmds. +$WW,1$$FG,5$$TX+CX,"Text-Widget Help"$$FG$ -$FG,2$"Expression"$FG$ a num or C+ algebraic term with operators and C+ syms can be entered. +See $LK-A,"::/TempleOS/Doc/Dollar.TXT"$ for details on dollar sign cmds. + +$FG,2$"Expression"$FG$ a num or Holy C algebraic term with operators and Holy C syms can be entered. $FG,2$"Macro"$FG$ Most entries can behave like macro entries if you assign them macro strs. $FG,2$"AutoStr"$FG$ Like a macro except it is an $LK,"AutoFile","FF:::/TempleOS/Doc/Glossary.TXT,AutoFile"$. You can't have both an autostr and macro text defined. diff --git a/TempleOS/Doc/WordStat.TXT b/TempleOS/Doc/WordStat.TXT index f90ff9f..bc8b64c 100644 --- a/TempleOS/Doc/WordStat.TXT +++ b/TempleOS/Doc/WordStat.TXT @@ -5,4 +5,3 @@ It provides auto-complete typing and jump-to-code or jump-to-dictionary_definiti Tip: If you use consistent var names for items of different classes, you'll usually be able to autocomplete the member vars. I always use $FG,2$lx$FG$ for $LK,"CLex","MN:CLex"$ ptrs; $FG,2$doc$FG$ for $LK,"CDoc","MN:CDoc"$ ptrs; $FG,2$doc_e$FG$ or $FG,2$doc_ce$FG$ for $LK,"CDocEntry","MN:CDocEntry"$ ptrs, etc. If you have the raw Project Gutenberg dictionary file, you can generate the TempleOS processed dictionary files with the stand-alone program $LK-A,"::/TempleOS/Adam/WordStat/WSDictGen.CPP"$. - diff --git a/TempleOS/Kernel/Adam1a.HPP b/TempleOS/Kernel/Adam1a.HPP index e41858c..bb170da 100644 --- a/TempleOS/Kernel/Adam1a.HPP +++ b/TempleOS/Kernel/Adam1a.HPP @@ -1,10 +1,10 @@ //This is the main TempleOS header file -//for data structures and vals. +//for data structures and classes. //There is no code in this file. //The internal types are U16i,I32i, etc. //They are defined $LK,"internal_types_table","MN:internal_types_table"$. -//TempleOS C+ has a feat where a +//Holy C has a feature where a //union structure is treated as a //whole if no member is specified. //See $LK-A,"::/TempleOS/Demo/SubIntAccess.CPP"$. @@ -140,7 +140,6 @@ public class CQue #define INVALID_PTR MAX_I64 #define INVALID_CLUSTER -1 -#define ALL_MASK -1 //x86 opcodes #define OC_OP_SIZE_PREFIX 0x66 @@ -149,6 +148,7 @@ public class CQue #define OC_NOP 0x90 #define OC_BPT 0xCC #define OC_CALL 0xE8 +#define OC_JMP_REL8 0xEB //Function Stack Frame #define SF_RBP 0x00 @@ -171,7 +171,7 @@ extern class CExeImportExport; extern class CHeapCtrl; extern class CExeHeapGlbl; extern class CDC; -extern class CMPCmdCtrl; +extern class CSrvCtrl; extern class CIntermediateCode; #define QUE_VECT_U8_CNT 512 @@ -304,7 +304,6 @@ public class CMass F64 mass,drag_profile_factor; U0 saved_state; F64 x,y,z,DxDt,DyDt,DzDt; - I64 user_data; U0 end_saved_area; }; @@ -321,7 +320,6 @@ public class CSpring U32 flags,num, end1_num,end2_num; F64 constant,rest_len; - I64 user_data; U0 end_saved_area; }; @@ -368,7 +366,7 @@ public class CMathODE class CBinFile { -/* See $LK,"Bin File Header Generation","FF:::/TempleOS/Compiler/CmpMain.CPP,NATIVE_XSUM"$ by compiler. +/* See $LK,"Bin File Header Generation","FF:::/TempleOS/Compiler/CmpMain.CPP,TEMPLEOS_XSUM"$ by compiler. Bin files have this 16-byte header, followed by code, @@ -477,7 +475,6 @@ class CMemE820 #define GDT_CS64_RING3_SEL 0x50 //$LK,"Ring3","FI:::/TempleOS/Demo/Lectures/Ring3.CPP"$, in case you want to play around. #define GDT_ZERO_DS_SEL 0x60 #define GDT_ZERO_DS_RING3_SEL 0x70 -#define GDT_END1 0x80 #define GDT_CPU_TR_SELS 0x80 #define GDT_CPU_TR_RING3_SELS (GDT_CPU_TR_SELS +MP_MAX_PROCESSORS*16) #define GDT_SIZE (GDT_CPU_TR_RING3_SELS+MP_MAX_PROCESSORS*16) @@ -573,7 +570,7 @@ class CKernel #define LAPIC_LVT_LINT1 (LAPIC_BASE+0x360) #define LAPIC_LVT_ERR (LAPIC_BASE+0x370) -#define MPN_VECT 0x7F +#define MPN_VECT 0x97 #define MP_VECT_ADDR (MPN_VECT*0x1000) //I/O APIC Memory mapped window @@ -737,12 +734,6 @@ class CDbgInfo U8 *body[1]; }; -class CIndentInfo -{ - U32 min_line,max_line; - I8 body[1]; -}; - public class CHash { //Hash entries are not normally ever removed. Normally, a new @@ -772,7 +763,6 @@ public class CHashSrcSym:CHash U8 *src_link; U8 *index; CDbgInfo *debug; - CIndentInfo *indent; U8 *import_name; CExeImportExport *ie_lst; }; @@ -790,12 +780,12 @@ public class CHashGeneric:CHash #define REGT_FSTK 5 #define REGT_MM 6 #define REGT_XMM 7 + public class CHashReg:CHash { U8 reg_num,reg_type; }; - public class CHashTable { CHashTable *next; @@ -976,57 +966,52 @@ public class CHashGlblVar:CHashSrcSym #define ARf_CSPRITE_PTS_RECTANGLES 9 #define ARf_MANAGE_SLIDER 10 -#define TASKCf_WAKE_MASTER 0 -#define TASKCf_FOCUS_MASTER 1 -#define TASKCf_EXIT_ON_COMPLETE 2 -#define TASKCf_DONT_FILTER 3 -#define TASKCf_HIGHEST_PRIORITY 4 +#define SVCf_WAKE_MASTER 0 +#define SVCf_FOCUS_MASTER 1 +#define SVCf_EXIT_ON_COMPLETE 2 +#define SVCf_DONT_FILTER 3 +#define SVCf_HIGHEST_PRIORITY 4 +//MP flags +#define SVCf_DONE 5 +#define SVCf_DISPATCHED 6 +#define SVCf_FREE_ON_COMPLETE 7 +#define SVCf_ADD_TO_QUE 8 -#define TASKCT_TEXT_INPUT 0 -#define TASKCT_MSG 1 -#define TASKCT_EXECUTE_STR 2 -#define TASKCT_EXECUTE_FILE 3 +#define SVCT_TEXT_INPUT 0 +#define SVCT_MSG 1 +#define SVCT_EXE_STR 2 +//MP cmds +#define SVCT_CALL 3 +#define SVCT_SPAWN_TASK 4 -class CTaskCmd +class CSrvCmd { - CTaskCmd *next,*last; + CSrvCmd *next,*last; + CSrvCtrl *ctrl; I64 cmd_code; - I64 msg_code; - I64 p1,p2; I64 flags; - U8 *data; + + I64 target_cpu; + I64 servant_cpu_num; + + I64 msg_code; + + I64 (*add)(U8 *fun_arg); + U8 *fun_arg; + + U8 *aux_str; + I64 aux1,aux2; I64 result; + + CTask *spawned_task; CTask *master_task; }; - -#define MPCf_DONE 0 -#define MPCf_DISPATCHED 1 -#define MPCf_FREE_ON_COMPLETE 2 - -#define MPCT_CALL 1 -#define MPCT_SPAWN_TASK 2 - -class CMPCmd +#define SVCRf_LOCKED 0 +class CSrvCtrl { - CMPCmd *next,*last; - CMPCmdCtrl *ctrl; - I64 cmd_code; - I64 flags; - I64 (*add)(U8 *data); - U8 *data; - U8 *desc; - I64 target_cpu_mask; - CTask *task; //spawned task - I64 handler_cpu; //CPU accepting job - I64 result; -}; - -#define MPCCf_LOCKED 0 -class CMPCmdCtrl -{ - CMPCmd *next_waiting,*last_waiting; - CMPCmd *next_done,*last_done; + CSrvCmd *next_waiting,*last_waiting; + CSrvCmd *next_done,*last_done; I64 flags; }; @@ -1067,50 +1052,39 @@ class CBpt #define DOCT_BACKGROUND 15 #define DOCT_DFT_FOREGROUND 16 #define DOCT_DFT_BACKGROUND 17 -#define DOCT_ALT_FOREGROUND 18 -#define DOCT_LINK_FOREGROUND 19 -#define DOCT_MACRO_FOREGROUND 20 -#define DOCT_ANCHOR_FOREGROUND 21 -#define DOCT_HIDDEN_FOREGROUND 22 -#define DOCT_TREE_FOREGROUND 23 -#define DOCT_USER_FOREGROUND 24 -#define DOCT_BINARY_FOREGROUND 25 -#define DOCT_KEYWORD_FOREGROUND 26 -#define DOCT_KEYWORD2_FOREGROUND 27 -#define DOCT_COMMENT_FOREGROUND 28 -#define DOCT_QUOTE_FOREGROUND 29 -#define DOCT_WORD_WRAP 30 -#define DOCT_UNDERLINE 31 -#define DOCT_INVERT 32 -#define DOCT_BLINK 33 -#define DOCT_SHIFTED_X 34 -#define DOCT_SHIFTED_Y 35 -#define DOCT_CURSOR_MOVEMENT 36 -#define DOCT_ANCHOR 37 -#define DOCT_LINK 38 -#define DOCT_BUTTON 39 -#define DOCT_CHECK_BOX 40 -#define DOCT_MACRO 41 -#define DOCT_MENU_VAL 42 -#define DOCT_HEX_ED 43 -#define DOCT_HIDE_START 44 -#define DOCT_HIDE_END 45 -#define DOCT_TREE 46 -#define DOCT_SPRITE 47 -#define DOCT_INS_BINARY 48 -#define DOCT_INS_BINARY_TYPE 49 -#define DOCT_INS_BINARY_SIZE 50 -#define DOCT_BPT 51 -#define DOCT_SONG 52 -#define DOCT_HIGHLIGHT 53 -#define DOCT_LOCK_TO_PAGE 54 -#define DOCT_LOCK_TO_CENTER 55 -#define DOCT_HTML_IMG 56 -#define DOCT_HTML_VIDEO 57 -#define DOCT_HTML_CODE 58 -#define DOCT_ERROR 59 +#define DOCT_PMT 18 +#define DOCT_WORD_WRAP 19 +#define DOCT_UNDERLINE 20 +#define DOCT_INVERT 21 +#define DOCT_BLINK 22 +#define DOCT_SHIFTED_X 23 +#define DOCT_SHIFTED_Y 24 +#define DOCT_CURSOR_MOVEMENT 25 +#define DOCT_ANCHOR 26 +#define DOCT_LINK 27 +#define DOCT_BUTTON 28 +#define DOCT_CHECK_BOX 29 +#define DOCT_MACRO 30 +#define DOCT_MENU_VAL 31 +#define DOCT_HEX_ED 32 +#define DOCT_HIDE_START 33 +#define DOCT_HIDE_END 34 +#define DOCT_TREE 35 +#define DOCT_SPRITE 36 +#define DOCT_INS_BINARY 37 +#define DOCT_INS_BINARY_TYPE 38 +#define DOCT_INS_BINARY_SIZE 39 +#define DOCT_BPT 40 +#define DOCT_SONG 41 +#define DOCT_HIGHLIGHT 42 +#define DOCT_LOCK_TO_PAGE 43 +#define DOCT_LOCK_TO_CENTER 44 +#define DOCT_HTML_IMG 45 +#define DOCT_HTML_VIDEO 46 +#define DOCT_HTML_CODE 47 +#define DOCT_ERROR 48 -#define DOCT_NUM_TYPES 60 +#define DOCT_NUM_TYPES 49 //CDocEntry.type flags upper bits #define DOCET_BLINK ATTRF_BLINK @@ -1124,9 +1098,9 @@ class CBpt #define DOCEt_UNDERLINE ATTRf_UNDERLINE #define DOCG_DBL_BUF_FLAGS (DOCF_OVERSTRIKE|DOCF_PLAIN_TEXT|DOCF_PLAIN_TEXT_WITH_TABS| \ - DOCF_MIN_SIZE|DOCF_NO_CURSOR|DOCF_FORM|DOCF_ATTR_BY_PRT| \ - DOCF_ATTR_BY_FILENAME|DOCF_DBL_DOLLARS|DOCF_DONT_SWAP_OUT| \ - DOCF_DO_FULL_REFRESH|DOCF_AUX_DOC|DOCF_HIDE_CURSOR|DOCF_CARRIAGE_RETURN) + DOCF_MIN_SIZE|DOCF_NO_CURSOR|DOCF_FORM| \ + DOCF_DBL_DOLLARS|DOCF_DONT_SWAP_OUT| \ + DOCF_DO_FULL_REFRESH|DOCF_BORDER_DOC|DOCF_HIDE_CURSOR|DOCF_CARRIAGE_RETURN) //CDocEntry.flag flags #define DOCEF1_AUX_STR 1 @@ -1275,7 +1249,6 @@ class CBpt #define DOCBT_GENERIC_DATA 1 #define DOCBT_CSPRITE 2 #define DOCBT_DEBUG_LINES 3 -#define DOCBT_INDENTS 4 public class CDocBin { @@ -1297,18 +1270,32 @@ public class CDocBin #define DOCSSF_BPT 8 +#define TERM_ATTR_TEXT WHITE<<4+BLUE +#define TERM_ATTR_BORDER WHITE<<4+LTBLUE +#define DOC_ATTR_DFT_TEXT WHITE<<4+BLACK + +#define DOC_COLOR_ALT_TEXT LTGRAY +#define DOC_COLOR_LINK RED +#define DOC_COLOR_MACRO LTBLUE +#define DOC_COLOR_ANCHOR DKGRAY +#define DOC_COLOR_HIDDEN DKGRAY +#define DOC_COLOR_TREE PURPLE +#define DOC_COLOR_PMT GREEN +#define DOC_COLOR_BIN CYAN +#define DOC_COLOR_KEYWORD BLUE +#define DOC_COLOR_KEYWORD2 LTRED +#define DOC_COLOR_COMMENT GREEN +#define DOC_COLOR_QUOTE BROWN + public class CDocSettings { CDocSettings *next,*last; U0 start; I16 left_margin,right_margin,indent; U16 page_len,header,footer; - I8 shifted_x,shifted_y,pad[2]; + I8 shifted_x,shifted_y; U8 state,comment_depth,paren_depth,brace_depth; - U8 cur_text_attr,dft_text_attr,alt_text_attr,link_attr, - macro_attr,anchor_attr,hidden_attr,tree_attr, - user_attr,bin_attr,keyword_attr, - keyword2_attr,comment_attr,quote_attr,pad[2]; + U8 cur_text_attr,dft_text_attr; }; #define DOC_DFT MIN_I32 @@ -1319,6 +1306,7 @@ public class CDocEntryBase //cmds like the text cmd which //don't require the full CDocEntry structure. CDocEntryBase *next,*last; + U8 *tag; union { U8 type_u8; //this stores the code U32 type; //these store attr flags @@ -1333,7 +1321,6 @@ public class CDocEntryBase //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.) - CDocSettings *settings; I64 user_data; @@ -1341,11 +1328,6 @@ public class CDocEntryBase public class CDocEntry:CDocEntryBase { - union { - U8 *tag; - I64 hex_ed_width; - }; - union { I64 attr; I64 cursor_x_offset; @@ -1368,6 +1350,7 @@ public class CDocEntry:CDocEntryBase U8 *bin_ptr_link; U8 *html_link; U8 *my_fmt_data; + I64 hex_ed_width; union { I32 scroll_len; I32 width; @@ -1388,6 +1371,7 @@ public class CDocEntry:CDocEntryBase #define DOF_INTERCEPT_TASK_END 2 #define DOF_DONT_HOME 4 #define DOF_WIN_MAX 8 +#define DOF_DONT_TEXT_ATTR 16 class CEdFindText { @@ -1427,22 +1411,21 @@ class CEdFileName #define DOCF_IN_DOLLAR 0x20 #define DOCF_MORE 0x40 #define DOCF_FORM 0x80 -#define DOCF_ATTR_BY_PRT 0x100 -#define DOCF_ATTR_BY_FILENAME 0x200 -#define DOCF_DBL_DOLLARS 0x400 -#define DOCF_NULL_GRAB_SCROLL 0x800 -#define DOCF_BACKWARD_MOVEMENT 0x1000 -#define DOCF_HAS_SONG 0x2000 -#define DOCF_UNDO_DIRTY 0x4000 -#define DOCF_ALLOW_UNDO 0x8000 -#define DOCF_SUPERSCRIPT_MODE 0x10000 -#define DOCF_SUBSCRIPT_MODE 0x20000 -#define DOCF_DONT_SWAP_OUT 0x40000 -#define DOCF_DONT_SHOW 0x80000 -#define DOCF_DO_FULL_REFRESH 0x100000 -#define DOCF_BREAK_UNLOCKED 0x200000 -#define DOCF_AUX_DOC 0x400000 -#define DOCF_HIDE_CURSOR 0x800000 //use $LK,"DocCursor","MN:DocCursor"$ +#define DOCF_DBL_DOLLARS 0x100 +#define DOCF_NULL_GRAB_SCROLL 0x200 +#define DOCF_BACKWARD_MOVEMENT 0x400 +#define DOCF_HAS_SONG 0x800 +#define DOCF_UNDO_DIRTY 0x1000 +#define DOCF_ALLOW_UNDO 0x2000 +#define DOCF_SUPERSCRIPT_MODE 0x4000 +#define DOCF_SUBSCRIPT_MODE 0x8000 +#define DOCF_DONT_SWAP_OUT 0x10000 +#define DOCF_DONT_SHOW 0x20000 +#define DOCF_DO_FULL_REFRESH 0x40000 +#define DOCF_BREAK_UNLOCKED 0x80000 +#define DOCF_BORDER_DOC 0x100000 +#define DOCF_HIDE_CURSOR 0x200000 //use $LK,"DocCursor","MN:DocCursor"$ +//2 unused flags #define DOCF_HIGHLIGHT DOCEF1_HIGHLIGHT #define DOCF_LOCK_TO_PAGE DOCEF1_LOCK_TO_PAGE @@ -1464,22 +1447,21 @@ class CEdFileName #define DOCf_IN_DOLLAR 5 #define DOCf_MORE 6 #define DOCf_FORM 7 -#define DOCf_ATTR_BY_PRT 8 -#define DOCf_ATTR_BY_FILENAME 9 -#define DOCf_DBL_DOLLARS 10 -#define DOCf_NULL_GRAB_SCROLL 11 -#define DOCf_BACKWARD_MOVEMENT 12 -#define DOCf_HAS_SONG 13 -#define DOCf_UNDO_DIRTY 14 -#define DOCf_ALLOW_UNDO 15 -#define DOCf_SUPERSCRIPT_MODE 16 -#define DOCf_SUBSCRIPT_MODE 17 -#define DOCf_DONT_SWAP_OUT 18 -#define DOCf_DONT_SHOW 19 -#define DOCf_DO_FULL_REFRESH 20 -#define DOCf_BREAK_UNLOCKED 21 -#define DOCf_AUX_DOC 22 -#define DOCf_HIDE_CURSOR 23 //use $LK,"DocCursor","MN:DocCursor"$ +#define DOCf_DBL_DOLLARS 8 +#define DOCf_NULL_GRAB_SCROLL 9 +#define DOCf_BACKWARD_MOVEMENT 10 +#define DOCf_HAS_SONG 11 +#define DOCf_UNDO_DIRTY 12 +#define DOCf_ALLOW_UNDO 13 +#define DOCf_SUPERSCRIPT_MODE 14 +#define DOCf_SUBSCRIPT_MODE 15 +#define DOCf_DONT_SWAP_OUT 16 +#define DOCf_DONT_SHOW 17 +#define DOCf_DO_FULL_REFRESH 18 +#define DOCf_BREAK_UNLOCKED 19 +#define DOCf_BORDER_DOC 20 +#define DOCf_HIDE_CURSOR 21 //use $LK,"DocCursor","MN:DocCursor"$ +//2 unused flags #define DOCf_HIGHLIGHT DOCEf1_HIGHLIGHT #define DOCf_LOCK_TO_PAGE DOCEf1_LOCK_TO_PAGE @@ -1508,7 +1490,6 @@ class CDocUndo #define DOCM_CANCEL (-1) #define DOC_SIGNATURE_VAL 'DocS' -#define DOC_IN_QUE_SIGNATURE_VAL 'DocQ' #define DOC_RECALC_ALL 0 #define DOC_RECALC_PARTIAL 1 @@ -1529,18 +1510,18 @@ public class CDoc //Linked Text File header U8 *dollar_buf; CTask *win_task,*mem_task; CDocEntry *recalc_start; - U32 start_text_attr; I32 page_line_num; I32 x,y,min_x,max_x,min_y,max_y; - I64 undo_cnt; + I32 undo_cnt; I64 line,col,best_d; I64 old_win_top,old_win_bottom, old_win_left,old_win_right; I64 cmd_U8; - U32 doc_signature,doc_in_que_signature; - I32 max_entries,ww_lines_back,cur_bin_num,pad; + U32 doc_signature; + I32 max_entries,ww_lines_back,cur_bin_num; + I64 refresh_cnt; CTask *owning_task; CEdFindText *find_replace; @@ -1560,16 +1541,15 @@ public class CDoc //Linked Text File header Bool (*user_put_key)(CDoc *doc,U8 *data,I64 ch,I64 sc); Bool (*user_put_s)(CDoc *doc,U8 *data,U8 *st); - CDoc *next_doc,*last_doc; CDoc *parent_doc; U8 desc[8]; //Be careful -- only 7 characters and terminator - CDocBin bin_root; - CDocSettings settings_root; + CDocBin bin_root; //size & 7 ==4 + CDocSettings settings_root; //size & 7 ==4 CDocUndo undo_root; I64 user_data; -#assert !($$&7) +U0 pad;#assert !($$&7) //(compiler lags one token) }; //MGetS flags @@ -1627,42 +1607,39 @@ class CLexUndef CHashExport *hash; }; -#define ICF_R_TO_F64 0x0000000001 -#define ICF_R_TO_INT 0x0000000002 -#define ICF_P1_TO_F64 0x0000000004 -#define ICF_P1_TO_INT 0x0000000008 -#define ICF_P2_TO_F64 0x0000000010 -#define ICF_P2_TO_INT 0x0000000020 -#define ICF_P3_TO_F64 0x0000000040 -#define ICF_P3_TO_INT 0x0000000080 -#define ICF_USE_F64 0x0000000100 -#define ICF_USE_UNSIGNED 0x0000000200 -#define ICF_USE_INT 0x0000000400 //highest priority -#define ICF_NO_DEPEND_RESULT 0x0000000800 -#define ICF_CODE_FINAL 0x0000001000 -#define ICF_NOT_ADDR 0x0000002000 -#define ICF_SHORT_JMP 0x0000004000 -#define ICF_P1_FIRST 0x0000008000 -#define ICF_PUSH_RESULT 0x0000010000 -#define ICF_TRACE 0x0000020000 -#define ICF_R_WAS_STK 0x0000040000 -#define ICF_P1_WAS_STK 0x0000080000 -#define ICF_P2_WAS_STK 0x0000100000 -#define ICF_P3_WAS_STK 0x0000200000 -#define ICF_PUSH_CMP 0x0000400000 //for 50drive directly in case a drive has been remapped. //Use $LK,"Prt2Drv","MN:Prt2Drv"$(). I64 locked_flags; @@ -2694,9 +2683,28 @@ class CMemUsedAllocated #endif -//TempleOS does not mess with page tables -//after boot $LK,"SYS_INIT_MEM","MN:SYS_INIT_MEM"$ identity maps. -//PAGE_SIZE is arbitrary, not related to CPU hardware. +//TempleOS does not mess with page tables after it +//identity-maps them during boot -- $LK,"SYS_INIT_MEM","MN:SYS_INIT_MEM"$. +//$LK,"PAGE_SIZE","MN:PAGE_SIZE"$ is arbitrary, and is not related to CPU hardware. +//I need some unit for memory allocation so I invented "$LK,"PAGE_SIZE","MN:PAGE_SIZE"$". +// +//All virtual addresses are identical to physical, always. +//There is no high kernel memory because RAM's physical +//addresses are low. (All motherboards that I know of +//put RAM in low addresses of 64-bit address space.) +//It's ring-0-only so all (or none) is kernel, remember. +// +//2 Meg hardware pages are use except the first 2 Meg. +//0xA0000-0xBFFFF must be write thru. Hardware pages +//don't matter except the caching bit. Remember, it is ring-0-only +//and identity-mapped! Do I need to repeat? +//Ring-0-only and 100% identity-mapped, all the time. +// +//All code is placed in just the lowest 2 Gig, so the CALL REL32 +//instruction always works. It never changes out of ring-0, remember, +//so I don't need to waste cycles on use SYSCALL or software interrupts. +//Everything just uses CALL REL32. + #define PAGE_BITS 9 #define PAGE_SIZE (1<>4) diff --git a/TempleOS/Kernel/Compress.CPP b/TempleOS/Kernel/Compress.CPP index 2ba83a0..425d27f 100644 --- a/TempleOS/Kernel/Compress.CPP +++ b/TempleOS/Kernel/Compress.CPP @@ -1,4 +1,4 @@ -//See $LK-A,"::/TempleOS/Doc/Acknowledgements.TXT"$ (4). +//See $LK-A,"::/TempleOS/Doc/Acknowledgements.TXT"$. //See $LK,"CArcCompress","MN:CArcCompress"$, $LK,"CArcEntry","MN:CArcEntry"$, and $LK,"CArcCtrl","MN:CArcCtrl"$ asm { @@ -283,7 +283,10 @@ CArcCompress *CompressBuf(U8 *src,I64 size, size_out=(c->dst_pos+7)>>3; result=MAlloc(size_out,mem_task); MemCpy(result,c->dst_buf,size_out); - result->compression_type=text_only ? CT_7_BIT:CT_8_BIT; + if (text_only) + result->compression_type=CT_7_BIT; + else + result->compression_type=CT_8_BIT; result->compressed_size=size_out; } else { result=MAlloc(size+sizeof(CArcCompress),mem_task); diff --git a/TempleOS/Kernel/DataTypes1a.CPP b/TempleOS/Kernel/DataTypes1a.CPP new file mode 100644 index 0000000..831ac0a --- /dev/null +++ b/TempleOS/Kernel/DataTypes1a.CPP @@ -0,0 +1,323 @@ +U0 LinkedLstDel(U8 **_lst) +{ + U8 **templ; + while (_lst) { + templ=*_lst; + Free(_lst); + _lst=templ; + } +} + +U8 *LinkedLstCopy(U8 **_lst,CTask *mem_task=NULL) +{ + U8 *result=NULL,**templ=&result; + while (_lst) { + templ=*templ=MAllocIdentical(_lst,mem_task); + _lst=*_lst; + } + return result; +} + +I64 LinkedLstCnt(U8 **_lst) +{ + I64 result=0; + while (_lst) { + result++; + _lst=*_lst; + } + return result; +} + +I64 LinkedLstSize(U8 **_lst) +{ + I64 result=0; + while (_lst) { + result+=MSize2(_lst); + _lst=*_lst; + } + return result; +} + +U0 QueDel(CQue *root,Bool querem=FALSE) //Does not delete root +{ + CQue *tempq=root->next,*tempq1; + while (tempq!=root) { + tempq1=tempq->next; + if (querem) + QueRem(tempq); + Free(tempq); + tempq=tempq1; + } +} + +CQue *QueCopy(CQue *root,CTask *mem_task=NULL) +{ + CQue *result=MAllocIdentical(root,mem_task),*tempq=root->next,*tempq1; + QueInit(result); + while (tempq!=root) { + tempq1=MAllocIdentical(tempq,mem_task); + QueIns(tempq1,result->last); + tempq=tempq->next; + } + return result; +} + +I64 QueCnt(CQue *root) //Does not include root +{ + CQue *tempq=root->next; + I64 result=0; + while (tempq!=root) { + result++; + tempq=tempq->next; + } + return result; +} + +I64 QueSize(CQue *root) //Does not include root +{ + CQue *tempq=root->next; + I64 result=0; + while (tempq!=root) { + result+=MSize2(tempq); + tempq=tempq->next; + } + return result; +} + +CQueVectU8 *QueVectU8New(I64 min_index=0) +{ + CQueVectU8 *result=MAlloc(sizeof(CQueVectU8)); + result->next=result->last=result; + result->total_cnt=result->node_cnt=0; + result->min_index=min_index; + return result; +} + +U0 QueVectU8Put(CQueVectU8 *v,I64 index,U8 ch) +{ + CQueVectU8 *tempv; + index-=v->min_index; + if (index<0) return; + if (indextotal_cnt) { + tempv=v; + do { + index-=tempv->node_cnt; + if (index<0) { + tempv->body[index+tempv->node_cnt]=ch; + return; + } + tempv=tempv->next; + } while (tempv!=v); + } else + index-=v->total_cnt; + + while (TRUE) { + tempv=v->last; + if (tempv->node_cnt>=QUE_VECT_U8_CNT) { + tempv=MAlloc(sizeof(CQueVectU8)); + tempv->node_cnt=0; + QueIns(tempv,v->last); + } + if (index--) { + tempv->body[tempv->node_cnt++]=0; + v->total_cnt++; + } else { + tempv->body[tempv->node_cnt++]=ch; + v->total_cnt++; + break; + } + } +} + +U0 QueVectU8Del(CQueVectU8 *v) +{ + if (v) { + QueDel(v); + Free(v); + } +} + +I64 QueVectU8Get(CQueVectU8 *v,I64 index) +{ + CQueVectU8 *tempv; + index-=v->min_index; + if (!(0<=indextotal_cnt)) return 0; + tempv=v; + do { + index-=tempv->node_cnt; + if (index<0) + return tempv->body[index+tempv->node_cnt]; + tempv=tempv->next; + } while (tempv!=v); + return 0; +} + +CFifoU8 *FifoU8New(I64 size,CTask *mem_task=NULL) +{ + CFifoU8 *f; + if (!mem_task) mem_task=Fs; + f=MAlloc(sizeof(CFifoU8),mem_task); + f->buf=MAlloc(size,mem_task); + f->mask=size-1; + f->in_ptr=0; + f->out_ptr=0; + return f; +} + +U0 FifoU8Del(CFifoU8 *f) +{ + Free(f->buf); + Free(f); +} + +Bool FifoU8Ins(CFifoU8 *f,U8 b) +{ + I64 new_in_ptr; + PushFD; + Cli; + new_in_ptr=(f->in_ptr+1)&f->mask; + if (new_in_ptr==f->out_ptr) { + PopFD; + return FALSE; + } else { + f->buf[f->in_ptr]=b; + f->in_ptr=new_in_ptr; + PopFD; + return TRUE; + } +} + +Bool FifoU8Rem(CFifoU8 *f,U8 *_b) +{ + PushFD; + Cli; + if (f->in_ptr==f->out_ptr) { + PopFD; + return FALSE; + } else { + *_b=f->buf[f->out_ptr]; + f->out_ptr=(f->out_ptr+1)&f->mask; + PopFD; + return TRUE; + } +} + +Bool FifoU8Peek(CFifoU8 *f,U8 *_b) +{ + PushFD; + Cli; + if (f->in_ptr==f->out_ptr) { + PopFD; + return FALSE; + } else { + *_b=f->buf[f->out_ptr]; + PopFD; + return TRUE; + } +} + +U0 FifoU8Flush(CFifoU8 *f) +{ + PushFD; + Cli; + f->out_ptr=f->in_ptr; + PopFD; +} + +I64 FifoU8Cnt(CFifoU8 *f) +{ + I64 result; + PushFD; + 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; + PopFD; + return result; +} + +CFifoI64 *FifoI64New(I64 size,CTask *mem_task=NULL) +{ + CFifoI64 *f; + if (!mem_task) mem_task=Fs; + f=MAlloc(sizeof(CFifoI64),mem_task); + f->buf=MAlloc(size*sizeof(I64),mem_task); + f->mask=size-1; + f->in_ptr=0; + f->out_ptr=0; + return f; +} + +U0 FifoI64Del(CFifoI64 *f) +{ + Free(f->buf); + Free(f); +} + +Bool FifoI64Ins(CFifoI64 *f,I64 q) +{ + I64 new_in_ptr; + PushFD; + Cli; + new_in_ptr=(f->in_ptr+1)&f->mask; + if (new_in_ptr==f->out_ptr) { + PopFD; + return FALSE; + } else { + f->buf[f->in_ptr]=q; + f->in_ptr=new_in_ptr; + PopFD; + return TRUE; + } +} + +Bool FifoI64Rem(CFifoI64 *f,I64 *_q) +{ + PushFD; + Cli; + if (f->in_ptr==f->out_ptr) { + PopFD; + return FALSE; + } else { + *_q=f->buf[f->out_ptr]; + f->out_ptr=(f->out_ptr+1)&f->mask; + PopFD; + return TRUE; + } +} + +Bool FifoI64Peek(CFifoI64 *f,I64 *_q) +{ + PushFD; + Cli; + if (f->in_ptr==f->out_ptr) { + PopFD; + return FALSE; + } else { + *_q=f->buf[f->out_ptr]; + PopFD; + return TRUE; + } +} + +U0 FifoI64Flush(CFifoI64 *f) +{ + PushFD; + Cli; + f->out_ptr=f->in_ptr; + PopFD; +} + +I64 FifoI64Cnt(CFifoI64 *f) +{ + I64 result; + PushFD; + 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; + PopFD; + return result; +} diff --git a/TempleOS/Kernel/Date.CPP b/TempleOS/Kernel/Date.CPP index 91643c9..67f8d01 100644 --- a/TempleOS/Kernel/Date.CPP +++ b/TempleOS/Kernel/Date.CPP @@ -11,9 +11,9 @@ I64 YearStartDate(I64 year) return year*365+yd4-yd100+yd400-yd4000; } -CDate CDateStruct2CDate(CDateStruct *_ds) +CDate DateStruct2Date(CDateStruct *_ds) { - CDate spdt; + CDate cdt; I64 i1,i2; i1=YearStartDate(_ds->year); i2=YearStartDate(_ds->year+1); @@ -21,9 +21,9 @@ CDate CDateStruct2CDate(CDateStruct *_ds) i1+=mon_start_days1[_ds->mon-1]; else i1+=mon_start_days2[_ds->mon-1]; - spdt.date=i1+_ds->day_of_mon-1; - spdt.time=(_ds->sec10000+100*(_ds->sec100+100*(_ds->sec+60*(_ds->min+60*_ds->hour))))<<21/(15*15*3*625); - return spdt; + cdt.date=i1+_ds->day_of_mon-1; + cdt.time=(_ds->sec10000+100*(_ds->sec100+100*(_ds->sec+60*(_ds->min+60*_ds->hour))))<<21/(15*15*3*625); + return cdt; } I64 DayOfWeek(I64 i) @@ -35,9 +35,9 @@ I64 DayOfWeek(I64 i) return 6-(6-i)%7; } -U0 CDate2CDateStruct(CDateStruct *_ds,CDate spdt) +U0 Date2DateStruct(CDateStruct *_ds,CDate cdt) { - I64 i,k,date=spdt.date; + I64 i,k,date=cdt.date; _ds->day_of_week=DayOfWeek(date); _ds->year=(date+1)*100000/CDATE_YEAR_DAYS_INT; i=YearStartDate(_ds->year); @@ -59,7 +59,7 @@ U0 CDate2CDateStruct(CDateStruct *_ds,CDate spdt) } _ds->mon=k+1; _ds->day_of_mon=date+1; - k=(625*15*15*3*spdt.time)>>21+1; + k=(625*15*15*3*cdt.time)>>21+1; _ds->sec10000=ModU64(&k,100); _ds->sec100=ModU64(&k,100); _ds->sec=ModU64(&k,60); @@ -70,53 +70,53 @@ U0 CDate2CDateStruct(CDateStruct *_ds,CDate spdt) I64 FirstDayOfMon(I64 i) { CDateStruct ds; - CDate spdt=0; - spdt.date=i; - CDate2CDateStruct(&ds,spdt); + CDate cdt=0; + cdt.date=i; + Date2DateStruct(&ds,cdt); ds.day_of_mon=1; - spdt=CDateStruct2CDate(&ds); - return spdt.date; + cdt=DateStruct2Date(&ds); + return cdt.date; } I64 LastDayOfMon(I64 i) { CDateStruct ds; - CDate spdt=0; - spdt.date=i; - CDate2CDateStruct(&ds,spdt); + CDate cdt=0; + cdt.date=i; + Date2DateStruct(&ds,cdt); ds.mon++; if (ds.mon==13) { ds.mon=0; ds.year++; } ds.day_of_mon=1; - spdt=CDateStruct2CDate(&ds); - return spdt.date-1; + cdt=DateStruct2Date(&ds); + return cdt.date-1; } I64 FirstDayOfYear(I64 i) { CDateStruct ds; - CDate spdt=0; - spdt.date=i; - CDate2CDateStruct(&ds,spdt); + CDate cdt=0; + cdt.date=i; + Date2DateStruct(&ds,cdt); ds.day_of_mon=1; ds.mon=1; - spdt=CDateStruct2CDate(&ds); - return spdt.date; + cdt=DateStruct2Date(&ds); + return cdt.date; } I64 LastDayOfYear(I64 i) { CDateStruct ds; - CDate spdt=0; - spdt.date=i; - CDate2CDateStruct(&ds,spdt); + CDate cdt=0; + cdt.date=i; + Date2DateStruct(&ds,cdt); ds.day_of_mon=1; ds.mon=1; ds.year++; - spdt=CDateStruct2CDate(&ds); - return spdt.date-1; + cdt=DateStruct2Date(&ds); + return cdt.date-1; } @@ -189,11 +189,11 @@ U0 GetCurTimeCDateStruct(CDateStruct *_ds) if (_ds->sec>59) _ds->sec=59; } -CDate GetCurTimeCDate() +CDate GetCurTimeDate() { CDateStruct ds; GetCurTimeCDateStruct(&ds); - return CDateStruct2CDate(&ds)-local_time_offset; + return DateStruct2Date(&ds)-local_time_offset; } U0 DateTimeFmtMapsRst() @@ -205,279 +205,279 @@ U0 DateTimeFmtMapsRst() time_fmt_map[i]=i; } -U8 *MSPrintFTime(CDate spdt,I64 sub_fmt) +U8 *MSPrintFTime(CDate cdt,I64 sub_fmt) { CDateStruct ds; if (sub_fmt=12) return MSPrintF("%02d:%02d:%02d pm",ds.hour-12,ds.min,ds.sec); else return MSPrintF("%02d:%02d:%02d am",ds.hour,ds.min,ds.sec); case TF_HH12_MM_AM: - CDate2CDateStruct(&ds,spdt+local_time_offset); + Date2DateStruct(&ds,cdt+local_time_offset); if (ds.hour>=12) return MSPrintF("%02d:%02d pm",ds.hour-12,ds.min); else return MSPrintF("%02d:%02d am",ds.hour,ds.min); case TF_HH12_MM_SSA: - CDate2CDateStruct(&ds,spdt+local_time_offset); + Date2DateStruct(&ds,cdt+local_time_offset); if (ds.hour>=12) return MSPrintF("%02d:%02d:%02dp",ds.hour-12,ds.min,ds.sec); else return MSPrintF("%02d:%02d:%02da",ds.hour,ds.min,ds.sec); case TF_HH12_MMA: - CDate2CDateStruct(&ds,spdt+local_time_offset); + Date2DateStruct(&ds,cdt+local_time_offset); if (ds.hour>=12) return MSPrintF("%02d:%02dp",ds.hour-12,ds.min); else return MSPrintF("%02d:%02da",ds.hour,ds.min); case TF_H_M: - CDate2CDateStruct(&ds,spdt); - return MSPrintF("%dh %02dm",ds.hour+spdt.date*24,ds.min); + Date2DateStruct(&ds,cdt); + return MSPrintF("%dh %02dm",ds.hour+cdt.date*24,ds.min); case TF_H_M_S: - CDate2CDateStruct(&ds,spdt); - return MSPrintF("%dh %02dm %02ds",ds.hour+spdt.date*24,ds.min,ds.sec); + Date2DateStruct(&ds,cdt); + return MSPrintF("%dh %02dm %02ds",ds.hour+cdt.date*24,ds.min,ds.sec); case TF_D_H_M: - CDate2CDateStruct(&ds,spdt); - return MSPrintF("%dd %02dh %02dm",spdt.date,ds.hour,ds.min); + Date2DateStruct(&ds,cdt); + return MSPrintF("%dd %02dh %02dm",cdt.date,ds.hour,ds.min); case TF_D_H_M_S: - CDate2CDateStruct(&ds,spdt); - return MSPrintF("%dd %02dh %02dm %02ds",spdt.date,ds.hour,ds.min,ds.sec); + Date2DateStruct(&ds,cdt); + return MSPrintF("%dd %02dh %02dm %02ds",cdt.date,ds.hour,ds.min,ds.sec); case TF_D_H_M_Sh: - CDate2CDateStruct(&ds,spdt); - return MSPrintF("%dd %02dh %02dm %02d.%02ds",spdt.date,ds.hour,ds.min,ds.sec,ds.sec100); + Date2DateStruct(&ds,cdt); + return MSPrintF("%dd %02dh %02dm %02d.%02ds",cdt.date,ds.hour,ds.min,ds.sec,ds.sec100); case TF_H_M_Sh: - CDate2CDateStruct(&ds,spdt); - return MSPrintF("%dh %02dm %02d.%02ds",ds.hour+spdt.date*24,ds.min,ds.sec,ds.sec100); + Date2DateStruct(&ds,cdt); + return MSPrintF("%dh %02dm %02d.%02ds",ds.hour+cdt.date*24,ds.min,ds.sec,ds.sec100); case TF_Sh: - CDate2CDateStruct(&ds,spdt); - return MSPrintF("%d.%02d",60*((spdt.date*24+ds.hour)*60+ds.min)+ds.sec,ds.sec100); + Date2DateStruct(&ds,cdt); + return MSPrintF("%d.%02d",60*((cdt.date*24+ds.hour)*60+ds.min)+ds.sec,ds.sec100); case TF_M_Sh: - CDate2CDateStruct(&ds,spdt); - return MSPrintF("%02d:%02d.%02d",60*(spdt.date*24+ds.hour)+ds.min,ds.sec,ds.sec100); + Date2DateStruct(&ds,cdt); + return MSPrintF("%02d:%02d.%02d",60*(cdt.date*24+ds.hour)+ds.min,ds.sec,ds.sec100); case TF_H_M_Sh2: - CDate2CDateStruct(&ds,spdt); - return MSPrintF("%02d:%02d:%02d.%02d",spdt.date*24+ds.hour,ds.min,ds.sec,ds.sec100); + Date2DateStruct(&ds,cdt); + return MSPrintF("%02d:%02d:%02d.%02d",cdt.date*24+ds.hour,ds.min,ds.sec,ds.sec100); case TF_D_H_M_Sht: - CDate2CDateStruct(&ds,spdt); - return MSPrintF("%dd %02dh %02dm %02d.%04ds",spdt.date,ds.hour,ds.min,ds.sec,100*ds.sec100+ds.sec10000); + Date2DateStruct(&ds,cdt); + return MSPrintF("%dd %02dh %02dm %02d.%04ds",cdt.date,ds.hour,ds.min,ds.sec,100*ds.sec100+ds.sec10000); case TF_H_M_Sht: - CDate2CDateStruct(&ds,spdt); - return MSPrintF("%dh %02dm %02d.%04ds",ds.hour+spdt.date*24,ds.min,ds.sec,100*ds.sec100+ds.sec10000); + Date2DateStruct(&ds,cdt); + return MSPrintF("%dh %02dm %02d.%04ds",ds.hour+cdt.date*24,ds.min,ds.sec,100*ds.sec100+ds.sec10000); case TF_Sht: - CDate2CDateStruct(&ds,spdt); - return MSPrintF("%d.%04d",60*((spdt.date*24+ds.hour)*60+ds.min)+ds.sec,100*ds.sec100+ds.sec10000); + Date2DateStruct(&ds,cdt); + return MSPrintF("%d.%04d",60*((cdt.date*24+ds.hour)*60+ds.min)+ds.sec,100*ds.sec100+ds.sec10000); case TF_M_Sht: - CDate2CDateStruct(&ds,spdt); - return MSPrintF("%02d:%02d.%04d",60*(spdt.date*24+ds.hour)+ds.min,ds.sec,100*ds.sec100+ds.sec10000); + Date2DateStruct(&ds,cdt); + return MSPrintF("%02d:%02d.%04d",60*(cdt.date*24+ds.hour)+ds.min,ds.sec,100*ds.sec100+ds.sec10000); case TF_H_M_Sht2: - CDate2CDateStruct(&ds,spdt); - return MSPrintF("%02d:%02d:%02d.%04d",spdt.date*24+ds.hour,ds.min,ds.sec,100*ds.sec100+ds.sec10000); + Date2DateStruct(&ds,cdt); + return MSPrintF("%02d:%02d:%02d.%04d",cdt.date*24+ds.hour,ds.min,ds.sec,100*ds.sec100+ds.sec10000); case TF_HH24: - CDate2CDateStruct(&ds,spdt+local_time_offset); + Date2DateStruct(&ds,cdt+local_time_offset); return MSPrintF("%02d",ds.hour); case TF_MM: - CDate2CDateStruct(&ds,spdt+local_time_offset); + Date2DateStruct(&ds,cdt+local_time_offset); return MSPrintF("%02d",ds.min); case TF_SS: - CDate2CDateStruct(&ds,spdt+local_time_offset); + Date2DateStruct(&ds,cdt+local_time_offset); return MSPrintF("%02d",ds.sec); case TF_HH24_MM_SS: default: - CDate2CDateStruct(&ds,spdt+local_time_offset); + Date2DateStruct(&ds,cdt+local_time_offset); return MSPrintF("%02d:%02d:%02d",ds.hour,ds.min,ds.sec); } } -U8 *MSPrintFDate(CDate spdt,I64 sub_fmt) +U8 *MSPrintFDate(CDate cdt,I64 sub_fmt) { CDateStruct ds; if (sub_fmt>32); + return MSPrintF("%d mons",ToI64(cdt/(CDATE_YEAR_DAYS/12))>>32); case DF_Y: - return MSPrintF("%d years",ToI64(spdt/CDATE_YEAR_DAYS)>>32); + return MSPrintF("%d years",ToI64(cdt/CDATE_YEAR_DAYS)>>32); case DF_D2: - return MSPrintF("%d",spdt.date); + return MSPrintF("%d",cdt.date); case DF_M2: - return MSPrintF("%d",ToI64(spdt/(CDATE_YEAR_DAYS/12))>>32); + return MSPrintF("%d",ToI64(cdt/(CDATE_YEAR_DAYS/12))>>32); case DF_Y2: - return MSPrintF("%d",ToI64(spdt/CDATE_YEAR_DAYS)>>32); + return MSPrintF("%d",ToI64(cdt/CDATE_YEAR_DAYS)>>32); case DF_D3: - return MSPrintF("%0.1f",spdt/ToF64(MAX_U32+1)); + return MSPrintF("%0.1f",cdt/ToF64(MAX_U32+1)); case DF_M3: - return MSPrintF("%0.1f",spdt/ToF64(MAX_U32+1)/(CDATE_YEAR_DAYS/12)); + return MSPrintF("%0.1f",cdt/ToF64(MAX_U32+1)/(CDATE_YEAR_DAYS/12)); case DF_Y3: - return MSPrintF("%0.1f",spdt/ToF64(MAX_U32+1)/CDATE_YEAR_DAYS); + return MSPrintF("%0.1f",cdt/ToF64(MAX_U32+1)/CDATE_YEAR_DAYS); case DF_MM_DD_YY: default: - CDate2CDateStruct(&ds,spdt+local_time_offset); + Date2DateStruct(&ds,cdt+local_time_offset); return MSPrintF("%02d/%02d/%02d",ds.mon,ds.day_of_mon,ds.year%100); } } diff --git a/TempleOS/Kernel/Dbg1a.CPP b/TempleOS/Kernel/Dbg1a.CPP index f4c3628..3712424 100644 --- a/TempleOS/Kernel/Dbg1a.CPP +++ b/TempleOS/Kernel/Dbg1a.CPP @@ -10,7 +10,22 @@ Bool IsDbgTask() Bool ChkPtr(U8 *ptr) { if (sys_heap_base<=ptr<=MAPPED_MEM_SPACE) { - if (*MemPtAtPageTableEntry(ptr)&1) + if (*MemPageTable(ptr)&1) + return TRUE; + else + return FALSE; + } else if (ptr16 ? 16:cnt; + if (cnt>16) + j=16; + else + j=cnt; for (i=0;i$$FG$$ to exit):"); + "First Drive Letter ($$FG,PURPLE$$$$FG$$ to exit):"); DefineLoad("ST_MOUNT_DRV_TYPE", "\t$$FG,PURPLE$$1$$FG$$=RAM\n\t$$FG,PURPLE$$2$$FG$$=ATA(Harddisk)\n" "\t$$FG,PURPLE$$3$$FG$$=ATAPI(CD-ROM)\n" "Type:"); DefineLoad("ST_MOUNT_BLKS", "Blks of 512 bytes:"); + DefineLoad("ST_MOUNT_ADDR", + "Addr of RAM disk ($$FG,PURPLE$$$$FG$$ to MAlloc):"); DefineLoad("ST_MOUNT_UNIT", "\t$$FG,PURPLE$$0$$FG$$=Master\n\t$$FG,PURPLE$$1$$FG$$=Slave\nUnit:"); DefineLoad("ST_MOUNT_FMT_WHOLE_DRV", "\nReformat WHOLE drive!"); DefineLoad("ST_MOUNT_BOOTED_CDROM", " to use booted CD-ROM\n"); - DefineLoad("ST_INCLUDE_0X", - "Include $$FG,PURPLE$$0x$$FG$$ prefix\n"); DefineLoad("ST_MOUNT_BASE0", "Include $$FG,PURPLE$$0x$$FG$$ prefix.\n" "I/O Port Base0:\n"); @@ -95,7 +96,7 @@ U0 LoadSysStrs() DefineLstLoad("ST_COLORS","BLACK\0BLUE\0GREEN\0CYAN\0" "RED\0PURPLE\0BROWN\0LTGRAY\0DKGRAY\0LTBLUE\0LTGREEN\0" - "LTSCYAN\0LTRED\0LTPURPLE\0YELLOW\0WHITE\0"); + "LTCYAN\0LTRED\0LTPURPLE\0YELLOW\0WHITE\0"); DefineLstLoad("ST_INT_NAMES", "Divide Error\0SingleStep\0NMI\0Breakpoint\0Overflow\0BOUND Range Exceeded\0Invalid Opcode\0No Math Coprocessor\0" "Double Fault\0Coprocessor Segment Fault\0Invalid TASK\0Segment Not Present\0Stk Segment Fault\0General Protection\0Page Fault\0 \0" diff --git a/TempleOS/Kernel/Display.CPP b/TempleOS/Kernel/Display.CPP index 1d00028..ea78213 100644 --- a/TempleOS/Kernel/Display.CPP +++ b/TempleOS/Kernel/Display.CPP @@ -80,7 +80,7 @@ See also $LK,"GrUpdateScreen","MN:GrUpdateScreen"$(). ptr=ptr1=col+row*gr_width; ptr+=VGA_GRAPHIC_MEM_BASE; ptr1+=sys_dc_screen_image; //Write to cached image as well - ptr2=&gr_font[ch.u8[0]*FONT_HEIGHT]; + ptr2=&gr_font[(ch&255)*FONT_HEIGHT]; for (i=0;i>3; @@ -179,27 +179,29 @@ Bool AKDInputFilterPutS(U8 *st) U0 PutKey(I64 ch,I64 sc) { //See $LK,"PutKeyHandling","FA:::/TempleOS/Doc/KeyBoard.TXT,PutKeyHandling"$ - CKeyDev *tempp=sys_put_key_root.next; - if (!Bt(&Fs->display_flags,DISPLAYf_SILENT)) { - if (sys_cur_scan_code & SCF_SCROLL) { - if (sys_focus_task==Fs) { + CKeyDev *tempp; + if (ch||sc) { + tempp=sys_put_key_root.next; + if (!Bt(&Fs->display_flags,DISPLAYf_SILENT)) { + if (sys_cur_scan_code & SCF_SCROLL && sys_focus_task==Fs) while (sys_cur_scan_code & SCF_SCROLL) - Yield; - } - } - while (tempp!=&sys_put_key_root) { - if (!(sc & SCF_KEY_DESC) || tempp->flags & KDF_HAS_DESCS) { - if ((*tempp->put_key)(ch,sc)) + Yield; //Wait on SCROLL LOCK Key + while (tempp!=&sys_put_key_root) { + if ((!(sc & SCF_KEY_DESC) || tempp->flags & KDF_HAS_DESCS) && + (*tempp->put_key)(ch,sc)) break; + tempp=tempp->next; } - tempp=tempp->next; } } } -U0 PutChar(I64 ch) -{ - PutKey(ch,0); +U0 PutChar(U64 ch) +{ //You can pack multiple chars into a U64. + while (ch) { + PutKey(ch&255,0); + ch>>=8; + } } U0 PutS(U8 *st) @@ -209,12 +211,9 @@ U0 PutS(U8 *st) if (!st) return; CKeyDev *tempp=sys_put_key_root.next; if (!Bt(&Fs->display_flags,DISPLAYf_SILENT)) { - if (sys_cur_scan_code & SCF_SCROLL) { - if (sys_focus_task==Fs) { - while (sys_cur_scan_code & SCF_SCROLL) - Yield; - } - } + if (sys_cur_scan_code & SCF_SCROLL && sys_focus_task==Fs) + while (sys_cur_scan_code & SCF_SCROLL) + Yield; while (cont && tempp!=&sys_put_key_root) { if (tempp->put_s) { if ((*tempp->put_s)(st)) diff --git a/TempleOS/Kernel/Dsk/ATADef.HPP b/TempleOS/Kernel/Dsk/ATADef.HPP index 75a9696..9059e80 100644 --- a/TempleOS/Kernel/Dsk/ATADef.HPP +++ b/TempleOS/Kernel/Dsk/ATADef.HPP @@ -1,4 +1,4 @@ -//See $LK-A,"::/TempleOS/Doc/Acknowledgements.TXT"$ (2). +//See $LK-A,"::/TempleOS/Doc/Acknowledgements.TXT"$. #define ATA_NOP 0x00 #define ATA_DEV_RST 0x08 diff --git a/TempleOS/Kernel/Dsk/Dsk1a.CPP b/TempleOS/Kernel/Dsk/Dsk1a.CPP index 577db0f..b4bd55a 100644 --- a/TempleOS/Kernel/Dsk/Dsk1a.CPP +++ b/TempleOS/Kernel/Dsk/Dsk1a.CPP @@ -66,16 +66,16 @@ Bool BlkDevInit(CBlkDev *bdev) bdev->flags|=BDF_INIT_IN_PROGRESS; switch(bdev->type) { case BDT_RAM: - bdev->RAM_dsk=AMAlloc((bdev->max_blk+1)<max_blk=MSize(bdev->RAM_dsk)>>BLK_SIZE_BITS-1; - p->type=PT_NATIVE; - if (sys_boot_code.u8[0]!=BOOT_CODE_RAM || - !NativeFSDrvValidate(bdev->first_drv_let)) - NativeFSFmt(bdev->first_drv_let); - else { - p->size=bdev->max_blk+1; - NativeFSPrtInit(p); + if (!bdev->RAM_dsk) { + bdev->RAM_dsk=AMAlloc((bdev->max_blk+1)<max_blk=MSize(bdev->RAM_dsk)>>BLK_SIZE_BITS-1; } + p->type=PT_REDSEA; + p->size=bdev->max_blk+1; + if (RedSeaFSDrvValidate(bdev->first_drv_let)) + RedSeaFSPrtInit(p); + else + RedSeaFSFmt(bdev->first_drv_let); result=TRUE; break; case BDT_ATA: @@ -214,7 +214,7 @@ U0 CleanMAPBuf(CPrt *p,I64 MAP_select=-1) WBlks(p,p->cur_map_blk(I64)+i<map2+i+p->cur_map_blk_num,1); } -U0 SetNativeBuf(CPrt *p,I64 c,I64 map_select=-1) +U0 SetFSBuf(CPrt *p,I64 c,I64 map_select=-1) { I64 MAP_blk_num; if (c==INVALID_CLUSTER) @@ -264,7 +264,7 @@ U0 WZeroBlks(CPrt *p,I64 blk,I64 cnt) } //Very dangerous -Bool SetDrvType(U8 drv_let,I64 type=PT_NATIVE) +Bool SetDrvType(U8 drv_let,I64 type=PT_REDSEA) { I64 i,j,ext_base,prt_num,offset,cur_type; CMasterBoot mbr; @@ -285,8 +285,8 @@ Bool SetDrvType(U8 drv_let,I64 type=PT_NATIVE) else { if (prt_num+'A'==ToUpper(drv_let)) { switch (type) { - case PT_NATIVE: - mbr.p[i].type=MBR_PT_NATIVE; + case PT_REDSEA: + mbr.p[i].type=MBR_PT_REDSEA; break; case PT_FAT32: mbr.p[i].type=MBR_PT_FAT32a; @@ -416,7 +416,7 @@ U0 ChgDsk(U8 drv_let=0) else if (bdev->flags&BDF_REMOVABLE) DskCacheInvalidate(p); Drv(drv_let); - NativeFSFreeFreeLst(p); + RedSeaFSFreeFreeLst(p); Preempt(old_preempt); } @@ -464,7 +464,7 @@ U0 PrtRep() drv_let=Prt2Drv(p); if (Bt(&p->type,PTf_DISABLE)) "$$FG,RED$$X"; - else if (drv_let==dft_drv) + else if (drv_let==*sys_acct) "$$FG,GREEN$$:"; else '' CH_SPACE; @@ -495,12 +495,12 @@ I64 ClusterNumNext(CPrt *p,I64 c,I64 cnt=1) unlock=PrtLock(p); switch (p->type) { case PT_ISO9660: - case PT_NATIVE: + case PT_REDSEA: c+=cnt; break; case PT_FAT32: while (cnt-->0 && 0cur_map_blk[c & (BLK_SIZE/4-1)]; } if (!(0type) { case PT_ISO9660: - case PT_NATIVE: + case PT_REDSEA: RBlks(p,buf,p->data+c*p->spc,blks); c+=(blks+p->spc-1)/p->spc; break; @@ -590,8 +590,8 @@ I64 Name2DirCluster(CPrt *p,U8 *dirname) StrFirstRem(buf,"/",buf2); if (*buf2) { switch (p->type) { - case PT_NATIVE: - cont=NativeFSFileFind(p,cur_dir_cluster,buf2,&de,FUF_JUST_DIRS); + case PT_REDSEA: + cont=RedSeaFSFileFind(p,cur_dir_cluster,buf2,&de,FUF_JUST_DIRS); break; case PT_FAT32: cont=FAT32FileFind(p,cur_dir_cluster,buf2,&de,FUF_JUST_DIRS); @@ -636,8 +636,8 @@ I64 Name2ParentDirCluster(CPrt *p,U8 *dirname) StrFirstRem(buf,"/",buf2); if (*buf2) { switch (p->type) { - case PT_NATIVE: - cont=NativeFSFileFind(p,cur_dir_cluster,buf2,&de,FUF_JUST_DIRS); + case PT_REDSEA: + cont=RedSeaFSFileFind(p,cur_dir_cluster,buf2,&de,FUF_JUST_DIRS); break; case PT_FAT32: cont=FAT32FileFind(p,cur_dir_cluster,buf2,&de,FUF_JUST_DIRS); @@ -676,7 +676,7 @@ I64 WClustersBlks(CPrt *p,U8 *buf,I64 c,I64 blks) try { unlock=PrtLock(p); switch (p->type) { - case PT_NATIVE: + case PT_REDSEA: WBlks(p,buf,p->data+c*p->spc,blks); c=0; break; @@ -715,8 +715,8 @@ I64 ClusersAlloc(CPrt *p,I64 c=0,I64 cnt=1,Bool contiguous=FALSE) PrtChk(p); if (cnt<=0) return c; switch (p->type) { - case PT_NATIVE: - return NativeFSAllocClusters(p,cnt); + case PT_REDSEA: + return RedSeaFSAllocClusters(p,cnt); case PT_FAT32: if (contiguous) { if (c) throw(EXCEPT_FILE,3); diff --git a/TempleOS/Kernel/Dsk/Dsk1b.CPP b/TempleOS/Kernel/Dsk/Dsk1b.CPP index 7fe7cb7..fa45f75 100644 --- a/TempleOS/Kernel/Dsk/Dsk1b.CPP +++ b/TempleOS/Kernel/Dsk/Dsk1b.CPP @@ -25,7 +25,7 @@ Bool Drv(U8 drv_let) Free(Fs->cur_dir); Fs->cur_dir=StrNew("/"); switch (p->type) { - case PT_NATIVE: + case PT_REDSEA: case PT_FAT32: case PT_ISO9660: return TRUE; @@ -44,7 +44,7 @@ Bool Cd(U8 *dirname,Bool make_dirs=FALSE) if (!*dirname) return TRUE; if (dirname[1]==':') { if (*dirname==':') { - if (Fs->cur_prt->drv_let!=dft_drv) + if (Fs->cur_prt->drv_let!=*sys_acct) if (!Drv(*dirname)) return FALSE; } else { if (Fs->cur_prt!= @@ -85,8 +85,8 @@ Bool Cd(U8 *dirname,Bool make_dirs=FALSE) p=Fs->cur_prt; cur_dir_cluster=Name2DirCluster(p,new_cur_dir); switch (p->type) { - case PT_NATIVE: - result=NativeFSCd(buf,cur_dir_cluster); + case PT_REDSEA: + result=RedSeaFSCd(buf,cur_dir_cluster); break; case PT_FAT32: result=FAT32Cd(buf,cur_dir_cluster); @@ -248,8 +248,8 @@ I64 Del(U8 *files_find_mask,Bool print_msg=TRUE) CFileAccess *fa; if (fa=FileAccessNew(files_find_mask)) { switch (fa->p->type) { - case PT_NATIVE: - result=NativeFSFilesDel(fa->p,Fs->cur_dir,fa->mask,0,FALSE,print_msg); + case PT_REDSEA: + result=RedSeaFSFilesDel(fa->p,Fs->cur_dir,fa->mask,0,FALSE,print_msg); break; case PT_FAT32: result=FAT32FilesDel(fa->p,Fs->cur_dir,fa->mask,0,FALSE,print_msg); @@ -296,8 +296,8 @@ U8 *FileRead(U8 *filename,I64 *_size=NULL,I64 *_attr=NULL,Bool raw=FALSE) curname=altname; if (fa=FileAccessNew(curname)) { switch (fa->p->type) { - case PT_NATIVE: - result=NativeFSFileRead(fa->p,Fs->cur_dir,fa->mask,&size,&attr,raw,&ac); + case PT_REDSEA: + result=RedSeaFSFileRead(fa->p,Fs->cur_dir,fa->mask,&size,&attr,raw,&ac); break; case PT_FAT32: result=FAT32FileRead(fa->p,Fs->cur_dir,fa->mask,&size,&attr,raw,&ac); @@ -322,8 +322,8 @@ U8 *FileRead(U8 *filename,I64 *_size=NULL,I64 *_attr=NULL,Bool raw=FALSE) while (!result && StrCmp(Fs->cur_dir,"/")) { Cd(".."); switch (Fs->cur_prt->type) { - case PT_NATIVE: - result=NativeFSFileRead(fa->p,Fs->cur_dir,fa->mask,&size,&attr,raw,&ac); + case PT_REDSEA: + result=RedSeaFSFileRead(fa->p,Fs->cur_dir,fa->mask,&size,&attr,raw,&ac); break; case PT_FAT32: result=FAT32FileRead(fa->p,Fs->cur_dir,fa->mask,&size,&attr,raw,&ac); @@ -383,8 +383,8 @@ Bool FileFind(U8 *filename,CDirEntry *rde=NULL,I64 fuf_flags=0) if (fa=FileAccessNew(curname)) { cur_dir_cluster=Name2DirCluster(fa->p,Fs->cur_dir); switch (fa->p->type) { - case PT_NATIVE: - result=NativeFSFileFind(fa->p,cur_dir_cluster,fa->mask,&de,fuf_flags); + case PT_REDSEA: + result=RedSeaFSFileFind(fa->p,cur_dir_cluster,fa->mask,&de,fuf_flags); break; case PT_FAT32: result=FAT32FileFind(fa->p,cur_dir_cluster,fa->mask,&de,fuf_flags); @@ -411,8 +411,8 @@ Bool FileFind(U8 *filename,CDirEntry *rde=NULL,I64 fuf_flags=0) Cd(".."); cur_dir_cluster=Name2DirCluster(fa->p,Fs->cur_dir); switch (fa->p->type) { - case PT_NATIVE: - result=NativeFSFileFind(fa->p,cur_dir_cluster,fa->mask,&de,fuf_flags); + case PT_REDSEA: + result=RedSeaFSFileFind(fa->p,cur_dir_cluster,fa->mask,&de,fuf_flags); break; case PT_FAT32: result=FAT32FileFind(fa->p,cur_dir_cluster,fa->mask,&de,fuf_flags); @@ -458,7 +458,7 @@ I64 FileSizeExpanded(U8 *filename,I64 fuf_flags=0) if (FileFind(filename,&de,fuf_flags)) { p=Drv2Prt(*de.full_name); Free(de.full_name); - if (p->type==PT_NATIVE && de.expanded_size) + if (p->type==PT_REDSEA && de.expanded_size) return de.expanded_size; else { if (de.size && FileAttr(de.name) & _ATTR_COMPRESSED) { @@ -472,7 +472,7 @@ I64 FileSizeExpanded(U8 *filename,I64 fuf_flags=0) } I64 FileWrite(U8 *filename,U8 *fbuf, - I64 size,CDate spdt=0,I64 attr=0,Bool raw=FALSE) + I64 size,CDate cdt=0,I64 attr=0,Bool raw=FALSE) { I64 c=0; CHashGeneric *temph; @@ -481,13 +481,13 @@ I64 FileWrite(U8 *filename,U8 *fbuf, U8 *absname=FileNameAbs(filename); if (fa=FileAccessNew(filename,FALSE,TRUE)) { switch (fa->p->type) { - case PT_NATIVE: - c=NativeFSFileWrite(fa->p,Fs->cur_dir,fa->mask, - fbuf,size,spdt,attr,raw,&ac); + case PT_REDSEA: + c=RedSeaFSFileWrite(fa->p,Fs->cur_dir,fa->mask, + fbuf,size,cdt,attr,raw,&ac); break; case PT_FAT32: c=FAT32FileWrite(fa->p,Fs->cur_dir,fa->mask, - fbuf,size,spdt,attr,raw,&ac); + fbuf,size,cdt,attr,raw,&ac); break; case PT_ISO9660: PutDefineErr("ST_NOT_WRITABLE"); diff --git a/TempleOS/Kernel/Dsk/Dsk1c.CPP b/TempleOS/Kernel/Dsk/Dsk1c.CPP index 9e28015..0ac7cde 100644 --- a/TempleOS/Kernel/Dsk/Dsk1c.CPP +++ b/TempleOS/Kernel/Dsk/Dsk1c.CPP @@ -31,7 +31,7 @@ Bool CopySingle(U8 *f1,U8 *f2) //Just one file { U8 *absf1=FileNameAbs(f1),*absf2=FileNameAbs(f2),*buf; I64 cnt,n,size,attr1=FileAttr(f1),attr2=FileAttr(f2), - xsum=NATIVE_XSUM,i,j; + xsum=TEMPLEOS_XSUM,i,j; CFile *in_file=NULL,*out_file=NULL; if (!StrCmp(absf1,absf2)) { //onto self? @@ -111,8 +111,8 @@ Bool MkDir(U8 *filename) name=MStrUtil(fa->mask, SUF_REM_LEADING|SUF_REM_TRAILING|SUF_REM_CTRL_CHARS); switch (fa->p->type) { - case PT_NATIVE: - result=NativeFSMkDir(fa->p,Fs->cur_dir,name); + case PT_REDSEA: + result=RedSeaFSMkDir(fa->p,Fs->cur_dir,name); break; case PT_FAT32: result=FAT32MkDir(fa->p,Fs->cur_dir,name); @@ -137,8 +137,8 @@ I64 SysDel(U8 *wild,Bool make_mask) //this is dangerous CFileAccess *fa; if (fa=FileAccessNew(wild,make_mask)) { switch (fa->p->type) { - case PT_NATIVE: - result=NativeFSFilesDel(fa->p,Fs->cur_dir,fa->mask,0,TRUE,TRUE); + case PT_REDSEA: + result=RedSeaFSFilesDel(fa->p,Fs->cur_dir,fa->mask,0,TRUE,TRUE); break; case PT_FAT32: result=FAT32FilesDel(fa->p,Fs->cur_dir,fa->mask,0,TRUE,TRUE); @@ -168,11 +168,11 @@ U0 Fmt(I64 drv_let,Bool quick=TRUE,Bool confirm=TRUE,I64 type=PT_FAT32) return; } switch (type) { - case PT_NATIVE: + case PT_REDSEA: Silent(ON); Drv(drv_let); Silent(old_silent); - NativeFSFmt(drv_let,quick); + RedSeaFSFmt(drv_let,quick); DskCacheInvalidate(Drv2Prt(drv_let)); Drv(drv_let); break; @@ -266,7 +266,10 @@ U0 CDImageWriteTask(CDualBuf *d) n=cnt; if (n>d->CD_bdev->max_writes) n=d->CD_bdev->max_writes; - buf=d->in_buf&1 ? d->buf1:d->buf0; + if (d->in_buf&1) + buf=d->buf1; + else + buf=d->buf0; while (d->in_buf>d->out_buf+1) Yield; FRBlks(f,buf,blk,n); @@ -345,7 +348,10 @@ U0 CDImageWrite(U8 cd_drv_let,U8 *in_name=NULL,I64 media_type=MT_CD) n=cnt; if (n>bdev->max_writes) n=bdev->max_writes; - buf=d->out_buf&1 ? d->buf1:d->buf0; + if (d->out_buf&1) + buf=d->buf1; + else + buf=d->buf0; while (d->in_buf<=d->out_buf) Yield; ATAPIWriteBlks(bdev,buf,blk/spc,(n+spc-1)/spc); diff --git a/TempleOS/Kernel/Dsk/DskATA.CPP b/TempleOS/Kernel/Dsk/DskATA.CPP index 7bde5e3..8e7c61a 100644 --- a/TempleOS/Kernel/Dsk/DskATA.CPP +++ b/TempleOS/Kernel/Dsk/DskATA.CPP @@ -662,8 +662,6 @@ Bool BootCdProbe(CBlkDev *bdev) Bool result=FALSE; "Port: %04X,%04X Unit: %02X ",bdev->base0,bdev->base1,bdev->unit; if (ATAProbe(bdev->base0,bdev->base1,bdev->unit)==BDT_ATAPI) { - //After preboot + BootCD.BIN.Z comes Kernel.BIN.C - //See $LK,"CDBOOT","FA:::/TempleOS/Adam/Dsk/DskCDDVD.CPP,CDBOOT"$, See $LK,"CD Boot Blk","FF:::/TempleOS/Adam/Boot/BootCD.CPP,BOOT_CODE_CDROM"$ " ATAPI"; if (ATAPIStartStop(bdev,TRUE,tS+5.0)) { " Started"; @@ -774,20 +772,15 @@ U0 ATARepEntry(I64 base0,I64 base1,I64 unit,I64 irq,U8 *msg,CATARep **_root,I64 } } -Bool hint_ata_disable=FALSE; - -U0 ATARepExitAllApplications() +Bool ATARepExitAllApplications() { - I64 ch; PutDefine("ST_GOING_TO_PROBE_HARDWARE"); PutDefine("ST_EXIT_ALL_APPLICATIONS"); - PutDefine("ST_PRESS_A_KEY"); - "Press '$$FG,PURPLE$$p$$FG$$' to probe or '$$FG,PURPLE$$s$$FG$$' to skip.\n"; - ch=ToUpper(GetChar(NULL,FALSE)); - if (ch=='S') - hint_ata_disable=TRUE; + PutDefine("ST_PROBE_OR_SKIP"); + if (ToUpper(GetChar(,FALSE))=='S') + return TRUE; else - hint_ata_disable=FALSE; + return FALSE; } public I64 ATARep(Bool pmt=TRUE,Bool just_ide=FALSE,CATARep **_root=NULL) @@ -800,9 +793,7 @@ public I64 ATARep(Bool pmt=TRUE,Bool just_ide=FALSE,CATARep **_root=NULL) if (_root) *_root=NULL; - if (pmt) - ATARepExitAllApplications; - if (hint_ata_disable) + if (pmt && ATARepExitAllApplications) return 0; old_preempt=Preempt(OFF); @@ -870,13 +861,13 @@ public I64 ATARep(Bool pmt=TRUE,Bool just_ide=FALSE,CATARep **_root=NULL) return num_hints; } -CATARep *ATAIDDrvs(CATARep *root,U8 _dft_drv,CATARep **_ata_drv,CATARep **_atapi_drv) +CATARep *ATAIDDrvs(CATARep *root,U8 _sys_acct_drv,CATARep **_ata_drv,CATARep **_atapi_drv) { CATARep *result=NULL,*tempha=root,*ata_drv=NULL,*atapi_drv=NULL; CBlkDev *bdev; Bool was_silent=Silent(ON); try - bdev=Drv2BlkDev(_dft_drv); + bdev=Drv2BlkDev(_sys_acct_drv); catch { Fs->catch_except=TRUE; bdev=NULL; @@ -929,7 +920,7 @@ I64 AutoMountIDE() I64 result=0; CATARep *root=NULL,*ata_drv=NULL,*atapi_drv=NULL,*tempha; ATARep(FALSE,TRUE,&root); - ATAIDDrvs(root,dft_drv,&ata_drv,&atapi_drv); + ATAIDDrvs(root,*sys_acct,&ata_drv,&atapi_drv); if (ata_drv && ATAMount(sys_first_hd_drv_let,BDT_ATA, ata_drv->base0,ata_drv->base1,ata_drv->unit)) result++; diff --git a/TempleOS/Kernel/Dsk/DskAddDev.CPP b/TempleOS/Kernel/Dsk/DskAddDev.CPP index c33235b..483e205 100644 --- a/TempleOS/Kernel/Dsk/DskAddDev.CPP +++ b/TempleOS/Kernel/Dsk/DskAddDev.CPP @@ -31,13 +31,13 @@ I64 BlkDevAdd(CBlkDev *bdev,Bool one_prt,Bool make_free) if (make_free) p=PrtMakeFree(bdev->first_drv_let+result); else - p=PrtNextFree(bdev->first_drv_let); + p=PrtNextFree(bdev->first_drv_let+result); p->bdev=bdev; p->size=bdev->max_blk+1; switch (bdev->type) { case BDT_RAM: p->pt_signature=PRT_SIGNATURE_VAL; - p->type=PT_NATIVE; + p->type=PT_REDSEA; p->rblks=&RAMRBlks; p->wblks=&RAMWBlks; //This is to force creation of a RAM @@ -61,7 +61,7 @@ I64 BlkDevAdd(CBlkDev *bdev,Bool one_prt,Bool make_free) if (one_prt) { p->pt_signature=PRT_SIGNATURE_VAL; result++; - p->type=PT_NATIVE; + p->type=PT_REDSEA; p->rblks=&ATARBlks; p->wblks=&ATAWBlks; p->size=bdev->max_blk+1; @@ -82,18 +82,18 @@ I64 BlkDevAdd(CBlkDev *bdev,Bool one_prt,Bool make_free) if (make_free) p=PrtMakeFree(bdev->first_drv_let+result); else - p=PrtNextFree(bdev->first_drv_let); + p=PrtNextFree(bdev->first_drv_let+result); p->bdev=bdev; p->rblks=&ATARBlks; p->wblks=&ATAWBlks; p->offset=mbr.p[i].offset+offset; p->size =mbr.p[i].size; switch (mbr.p[i].type) { - case MBR_PT_NATIVE: + case MBR_PT_REDSEA: p->pt_signature=PRT_SIGNATURE_VAL; result++; - p->type=PT_NATIVE; - NativeFSPrtInit(p); + p->type=PT_REDSEA; + RedSeaFSPrtInit(p); break; case MBR_PT_FAT32a: case MBR_PT_FAT32b: @@ -104,9 +104,9 @@ I64 BlkDevAdd(CBlkDev *bdev,Bool one_prt,Bool make_free) ATAReadBlks(bdev,&br,p->offset,1); p->pt_signature=PRT_SIGNATURE_VAL; result++; - if (br.signature==MBR_PT_NATIVE) { - p->type=PT_NATIVE; - NativeFSPrtInit(p); + if (br.signature==MBR_PT_REDSEA) { + p->type=PT_REDSEA; + RedSeaFSPrtInit(p); } else { p->type=PT_FAT32; FAT32PrtInit(p); @@ -185,7 +185,7 @@ U0 Mount(Bool repartition=FALSE) { CBlkDev *bdev; I64 first_prt_num,type,unit,num_hints; - U8 blks_buf[32],base0_buf[128],base1_buf[128]; + U8 blks_buf[128],addr_buf[128],base0_buf[128],base1_buf[128]; Bool add; CATARep *root,*tempha; @@ -201,7 +201,7 @@ U0 Mount(Bool repartition=FALSE) unit=0; if (type==BDT_ATA || type==BDT_ATAPI) { - num_hints=ATARep(TRUE,,&root); + num_hints=ATARep(,,&root); do { if (num_hints) PutDefine("ST_MOUNT_BASE0_HINT"); @@ -231,15 +231,20 @@ U0 Mount(Bool repartition=FALSE) LinkedLstDel(root); } if (type==BDT_RAM) { + PutDefine("ST_MOUNT_ADDR"); + GetS(addr_buf,128); PutDefine("ST_MOUNT_BLKS"); - GetS(blks_buf,32); + GetS(blks_buf,128); } if (BDT_NULLunit=unit; - if (type==BDT_RAM) + if (type==BDT_RAM) { + if (!*addr_buf) StrCpy(addr_buf,"0"); + bdev->RAM_dsk=A2I(addr_buf); bdev->max_blk=A2I(blks_buf)-1; + } if (type==BDT_ATA || type==BDT_ATAPI) { bdev->base0=A2I(base0_buf); @@ -269,7 +274,10 @@ I64 SysPmtI64() U8 st[136]; StrCpy(st,"0x"); GetS(st+2,134,FALSE); - return A2I(st); + if (!st[2]) + return 0; + else + return A2I(st); } Bool PmtBaseUnit(CBlkDev *bdev) @@ -287,12 +295,19 @@ Bool PmtBaseUnit(CBlkDev *bdev) PutDefine("ST_CDROM_PORTS_PMT1"); bdev->base0=SysPmtI64; bdev->base1=0; - "\nUnit (0 or 1): "; - do ch=GetChar(NULL,FALSE); - while (!('0'<=ch<='1')); - '' ch; - bdev->unit=ch-'0'; - return TRUE; + bdev->unit =0; + if (bdev->base0) { + "\nUnit (0 or 1): "; + do ch=GetChar(,FALSE); + while (!('0'<=ch<='1')); + '' ch; + bdev->unit=ch-'0'; + cdrom_boot_is_good=BootCdProbe(bdev); + return TRUE; + } else { + cdrom_boot_is_good=FALSE; + return FALSE; + } } return FALSE; } @@ -307,11 +322,11 @@ U0 BlkDevsInitAll() drv_to_prt[i]=&sys_prts[i]; sys_raw_dc_col=0; #exe { - if (kernel_cfg->opts[CFG_AUTO_MOUNT_IDE]) - StreamPutS("AutoMountIDE;"); - StreamPutS("#exe {OptOff(OPTf_WARN_PAREN);}"); - StreamDoc(kernel_cfg->add_dev); - StreamPutS("#exe {OptOn(OPTf_WARN_PAREN);}"); + if (kernel_cfg->opts[CFG_AUTO_MOUNT_IDE]) + StreamPutS("AutoMountIDE;"); + StreamPutS("#exe {OptOff(OPTf_WARN_PAREN);}"); + StreamDoc(kernel_cfg->add_dev); + StreamPutS("#exe {OptOn(OPTf_WARN_PAREN);}"); }; PrtRep; } diff --git a/TempleOS/Kernel/Dsk/DskCFile.CPP b/TempleOS/Kernel/Dsk/DskCFile.CPP index 28b7b44..71d0997 100644 --- a/TempleOS/Kernel/Dsk/DskCFile.CPP +++ b/TempleOS/Kernel/Dsk/DskCFile.CPP @@ -22,11 +22,11 @@ CFile *FOpen(U8 *filename,U8 *flags,I64 cnt=0) f->file_cluster_num=INVALID_CLUSTER; full_name=FileNameAbs(filename); f->p=Drv2Prt(*full_name); - if (f->p->type==PT_NATIVE) + if (f->p->type==PT_REDSEA) contiguous=TRUE; if (contiguous) { f->flags|=FF_CONTIGUOUS; - if (f->p->type!=PT_NATIVE) { + if (f->p->type!=PT_REDSEA) { if (!(FileAttr(filename) & _ATTR_CONTIGUOUS)) throw(EXCEPT_FILE,2); } @@ -82,7 +82,7 @@ U0 FClose(CFile *f) if (f->flags & FF_NEEDS_WRITE) { if (fa=FileAccessNew(f->de.full_name)) { if (!(f->flags & FF_USE_OLD_DATETIME)) - f->de.datetime=GetCurTimeCDate; + f->de.datetime=GetCurTimeDate; if (f->flags & FF_NEW_FILE) CDirNew(fa->p,Fs->cur_dir,&f->de,TRUE); else @@ -152,7 +152,10 @@ Bool FRBlks(CFile *f,U8 *buf,I64 blk=FFB_NEXT_BLK,I64 cnt=1) if (i=blk%spc) { c=FSetCluster(f,c,blk,TRUE); - j= cntcluster_buf+i<cluster_buf+BLK_SIZE*i,buf,j<flags|=FF_BUF_DIRTY; buf+=j<type) { - case PT_NATIVE: - return NativeFSDirNew(p,cur_dir,tempm,free_old_chain); + case PT_REDSEA: + return RedSeaFSDirNew(p,cur_dir,tempm,free_old_chain); case PT_FAT32: return FAT32DirNew(p,cur_dir,tempm,free_old_chain); case PT_ISO9660: @@ -151,8 +151,8 @@ CDirEntry *SysFilesFind(U8 *files_find_mask,I64 fuf_flags) CDirEntry *result=NULL; PrtChk(p); switch (p->type) { - case PT_NATIVE: - result=NativeFSFilesFind(files_find_mask,fuf_flags); + case PT_REDSEA: + result=RedSeaFSFilesFind(files_find_mask,fuf_flags); break; case PT_FAT32: result=FAT32FilesFind(files_find_mask,fuf_flags); @@ -237,7 +237,7 @@ U0 Dir2(U8 *files_find_mask,I64 fuf_flags,Bool full) esize=Bsr(esize)/4+1; c=Bsr(c)/4+1; - "$$MA+A,\"Directory \",\"PopUpCd;Dir;\n\"$$ of %s\n",st; + "$$MA+A,\"Directory\",\"PopUpCd;Dir;\n\"$$ of %s\n",st; if (full) "__DATE__ __TIME__ %*ts %*ts %*ts\n", csize,"SIZE",esize,"UNCMPSIZE",c,"CLUSTER"; diff --git a/TempleOS/Kernel/Dsk/DskStr.CPP b/TempleOS/Kernel/Dsk/DskStr.CPP index 6c07947..546922d 100644 --- a/TempleOS/Kernel/Dsk/DskStr.CPP +++ b/TempleOS/Kernel/Dsk/DskStr.CPP @@ -100,7 +100,7 @@ CPrt *Drv2Prt(U8 drv_let=0) p=Fs->cur_prt; else { if (drv_let==':') - drv_let=dft_drv; + drv_let=*sys_acct; p=drv_to_prt[ToUpper(drv_let)-'A']; } PrtChk(p); @@ -159,7 +159,7 @@ U8 *DirNameAbs(U8 *_dirname) drv[2]=0; if (*dirname && dirname[1]==':') { if (*dirname==':') - *drv=dft_drv; + *drv=*sys_acct; else *drv=*dirname; dirname=dirname+2; @@ -267,18 +267,19 @@ U8 *DftExt(U8 *filename,U8 *extension) return result; } -CDirEntry *CdDir(CDirEntry *tempm,U8 *abs_name) +CDirEntry *Cd2DirEntry(CDirEntry *tempm,U8 *abs_name) { I64 i; while (tempm) { i=StrLen(tempm->full_name); - if (StrNCmp(tempm->full_name,abs_name,i)) + if (StrNCmp(tempm->full_name,abs_name,i)|| + i && tempm->full_name[i-1]!='/' && abs_name[i] && abs_name[i]!='/') tempm=tempm->next; else if (StrLen(abs_name)==i) return tempm; else - return CdDir(tempm->sub,abs_name); + return Cd2DirEntry(tempm->sub,abs_name); } return NULL; } diff --git a/TempleOS/Kernel/Dsk/FileSysFAT.CPP b/TempleOS/Kernel/Dsk/FileSysFAT.CPP index 186afc0..07c3eba 100644 --- a/TempleOS/Kernel/Dsk/FileSysFAT.CPP +++ b/TempleOS/Kernel/Dsk/FileSysFAT.CPP @@ -1,7 +1,7 @@ -U0 CDate2Dos(U16 *t,U16 *d,CDate spdt) +U0 CDate2Dos(U16 *t,U16 *d,CDate cdt) { CDateStruct ds; - CDate2CDateStruct(&ds,spdt+local_time_offset); + Date2DateStruct(&ds,cdt+local_time_offset); *d=ds.day_of_mon+(ds.mon+(ds.year-1980)<<4)<<5; *t=ds.sec>>1+(ds.min+ds.hour<<6)<<5; } @@ -16,7 +16,7 @@ CDate Dos2CDate(U16 t,U16 d) ds.sec=(t&0x1F)*2; t=t>>5; ds.min=t&0x3F; ds.hour=t>>6; - return CDateStruct2CDate(&ds)-local_time_offset; + return DateStruct2Date(&ds)-local_time_offset; } U0 FAT32PrtInit(CPrt *p) @@ -71,9 +71,9 @@ U0 FAT32Fmt(U8 drv_let,Bool quick=TRUE) PrtLock(p); SetDrvType(drv_let,PT_FAT32); p->type=PT_FAT32; - br->jump_and_nop[0]=0xEB; - br->jump_and_nop[1]=0x58; - br->jump_and_nop[2]=0x90; + br->jump_and_nop[0]=OC_JMP_REL8; + br->jump_and_nop[1]=offset(CFAT32Boot.code)-2; + br->jump_and_nop[2]=OC_NOP; MemCpy(br->oem_name,"MSWIN4.1",8); br->bytes_per_sect=BLK_SIZE; if (p->size<= 500000) @@ -163,7 +163,10 @@ I64 FATNameXSum(U8 *src) { I64 i,result=0; for (i=0;i<11;i++) - result.u8[0]=(result&1?0x80:0)+result>>1+*src++; + if (result&1) + result.u8[0]=0x80+result>>1+*src++; + else + result.u8[0]=result>>1+*src++; return result; } @@ -288,7 +291,7 @@ Bool FAT32DirFill(CFAT32DirEntry *de,CDirEntry *tempm,I64 *_de_cnt=NULL) de[de_cnt].size=tempm->size; de[de_cnt].attr=tempm->attr; if (!tempm->datetime) - tempm->datetime=GetCurTimeCDate; + tempm->datetime=GetCurTimeDate; CDate2Dos(&de[de_cnt].WrtTime,&de[de_cnt].WrtDate,tempm->datetime); if (_de_cnt) *_de_cnt=de_cnt+1; @@ -447,7 +450,7 @@ U0 FAT32FreeClusters(CPrt *p,I64 c) unlock=PrtLock(p); CleanMAPBuf(p); do { - SetNativeBuf(p,c,0); + SetFSBuf(p,c,0); next=p->cur_map_blk[c&(BLK_SIZE/4-1)]; p->cur_map_blk[c&(BLK_SIZE/4-1)]=0; LBts(p->buffered_map_dirty_bits,0); @@ -457,7 +460,7 @@ U0 FAT32FreeClusters(CPrt *p,I64 c) c=saved_c; do { - SetNativeBuf(p,c,1); + SetFSBuf(p,c,1); next=p->cur_map_blk[c&(BLK_SIZE/4-1)]; p->cur_map_blk[c&(BLK_SIZE/4-1)]=0; LBts(p->buffered_map_dirty_bits,0); @@ -498,14 +501,14 @@ I64 FAT32AllocClusters(CPrt *p,I64 c,I64 cnt) j=1; wrap_around=TRUE; } - SetNativeBuf(p,j); + SetFSBuf(p,j); if (!p->cur_map_blk[j&(BLK_SIZE/4-1)]) break; } if (!(0cur_map_blk[c&(BLK_SIZE/4-1)]=j; LBts(p->buffered_map_dirty_bits,0); } @@ -513,7 +516,7 @@ I64 FAT32AllocClusters(CPrt *p,I64 c,I64 cnt) } if (0cur_map_blk[c&(BLK_SIZE/4-1)]=0x0FFFFFFF; LBts(p->buffered_map_dirty_bits,0); } @@ -552,7 +555,7 @@ I64 FAT32AllocContiguousClusters(CPrt *p,I64 cnt) while (cont && ispc+p->data>p->size+p->offset) Dbg; - SetNativeBuf(p,first+i); + SetFSBuf(p,first+i); if (p->cur_map_blk[(first+i)&(BLK_SIZE/4-1)]) cont=FALSE; else @@ -564,7 +567,7 @@ I64 FAT32AllocContiguousClusters(CPrt *p,I64 cnt) CleanMAPBuf(p); for (i=0;icur_map_blk[(first+i)&(BLK_SIZE/4-1)]=0x0FFFFFFF; else @@ -574,7 +577,7 @@ I64 FAT32AllocContiguousClusters(CPrt *p,I64 cnt) CleanMAPBuf(p,0); for (i=0;icur_map_blk[(first+i)&(BLK_SIZE/4-1)]=0x0FFFFFFF; else @@ -834,7 +837,7 @@ I64 FAT32FilesDel(CPrt *p,U8 *cur_dir,U8 *files_find_mask,I64 fuf_flags, } I64 FAT32FileWrite(CPrt *p,U8 *cur_dir,U8 *name,U8 *buf,I64 size, - CDate spdt=0,I64 attr=0,Bool raw=FALSE, + CDate cdt=0,I64 attr=0,Bool raw=FALSE, CArcCompress **_ac2=NULL) { CDirEntry de; @@ -844,8 +847,8 @@ I64 FAT32FileWrite(CPrt *p,U8 *cur_dir,U8 *name,U8 *buf,I64 size, MemSet(&de,0,sizeof(CDirEntry)); if (_ac2) *_ac2=NULL; if (size<0) size=0; - if (!spdt) - spdt=GetCurTimeCDate; + if (!cdt) + cdt=GetCurTimeDate; if (p->type!=PT_FAT32) PutDefine("ST_NOT_FAT32"); else if (!CFileNameTo(de.name,name)) @@ -869,7 +872,7 @@ I64 FAT32FileWrite(CPrt *p,U8 *cur_dir,U8 *name,U8 *buf,I64 size, c=0x0FFFFFFF; de.cluster=c; de.attr=attr; - de.datetime=spdt; + de.datetime=cdt; if (blk_cnt) WClustersBlks(p,buf,c,blk_cnt); FAT32DirNew(p,cur_dir,&de,TRUE); @@ -979,7 +982,7 @@ Bool FAT32MkDir(CPrt *p,U8 *cur_dir,U8 *name) d_native.name[1]=0; d_native.cluster=c; d_native.size=0; - d_native.datetime=GetCurTimeCDate; + d_native.datetime=GetCurTimeDate; FAT32DirFill(dFAT,&d_native); dFAT++; @@ -990,7 +993,7 @@ Bool FAT32MkDir(CPrt *p,U8 *cur_dir,U8 *name) d_native.name[2]=0; d_native.cluster=cur_dir_cluster; d_native.size=0; - d_native.datetime=GetCurTimeCDate; + d_native.datetime=GetCurTimeDate; FAT32DirFill(dFAT,&d_native); WClusters(p,buf,c,1); Free(buf); diff --git a/TempleOS/Kernel/Dsk/FileSysISO1.CPP b/TempleOS/Kernel/Dsk/FileSysISO1.CPP index f9728c5..30bfcf7 100644 --- a/TempleOS/Kernel/Dsk/FileSysISO1.CPP +++ b/TempleOS/Kernel/Dsk/FileSysISO1.CPP @@ -57,10 +57,10 @@ ipi_done: return result; } -U0 CDate2ISO1(CISO1Date *dst,CDate spdt) +U0 Date2ISO1(CISO1Date *dst,CDate cdt) { CDateStruct ds; - CDate2CDateStruct(&ds,spdt); + Date2DateStruct(&ds,cdt); dst->year=ds.year-ISO1_BASE_YEAR; dst->mon=ds.mon; dst->day=ds.day_of_mon; @@ -81,7 +81,7 @@ CDate ISO1DateStruct2CDate(CISO1Date *dt) ds.sec=dt->sec; ds.min=dt->min; ds.hour=dt->hour; - return CDateStruct2CDate(&ds); + return DateStruct2Date(&ds); } Bool ISO1FromName(U8 *dst,U8 *src) diff --git a/TempleOS/Kernel/Dsk/FileSysNative.CPP b/TempleOS/Kernel/Dsk/FileSysRedSea.CPP similarity index 86% rename from TempleOS/Kernel/Dsk/FileSysNative.CPP rename to TempleOS/Kernel/Dsk/FileSysRedSea.CPP index f0f6f76..bad873d 100644 --- a/TempleOS/Kernel/Dsk/FileSysNative.CPP +++ b/TempleOS/Kernel/Dsk/FileSysRedSea.CPP @@ -1,4 +1,4 @@ -U0 NativeFSFreeFreeLst(CPrt *p) +U0 RedSeaFSFreeFreeLst(CPrt *p) { CFreeLst *tempf,*tempf1; Bool unlock; @@ -20,7 +20,7 @@ U0 NativeFSFreeFreeLst(CPrt *p) PrtUnlock(p); } -U0 NativeFSFreeLstBuild(CPrt *p) +U0 RedSeaFSFreeLstBuild(CPrt *p) { Bool unlock; CFreeLst *tempf; @@ -30,13 +30,13 @@ U0 NativeFSFreeLstBuild(CPrt *p) try { unlock=PrtLock(p); if (p->next_free) - NativeFSFreeFreeLst(p); + RedSeaFSFreeFreeLst(p); p->next_free=&p->next_free; p->last_free=&p->next_free; while (firstcur_map_blk,(first+i)&(BLK_SIZE<<3-1))) break; else @@ -57,18 +57,18 @@ U0 NativeFSFreeLstBuild(CPrt *p) PrtUnlock(p); } -U0 NativeFSPrtInit(CPrt *p) +U0 RedSeaFSPrtInit(CPrt *p) { CBootStruct br; Bool unlock; try { unlock=PrtLock(p); RBlks(p,&br,p->offset,1); - if (br.signature!=MBR_PT_NATIVE || + if (br.signature!=MBR_PT_REDSEA || br.signature2!=0xAA55) throw(EXCEPT_PRT,7); - p->type=PT_NATIVE; - NativeFSFreeFreeLst(p); + p->type=PT_REDSEA; + RedSeaFSFreeFreeLst(p); p->spc=br.sects_per_cluster; p->size=br.sects; p->data=p->offset+1+br.bitmap_sects-p->spc; @@ -83,16 +83,16 @@ U0 NativeFSPrtInit(CPrt *p) PrtUnlock(p); } -Bool NativeFSDrvValidate(U8 drv_let) +Bool RedSeaFSDrvValidate(U8 drv_let) { CPrt *p; CBootStruct br; Bool result=FALSE; try { p=Drv2Prt(drv_let); - if (p->type==PT_NATIVE && + if (p->type==PT_REDSEA && RBlks(p,&br,p->offset,1) && - br.signature==MBR_PT_NATIVE && + br.signature==MBR_PT_REDSEA && br.signature2==0xAA55 && br.sects==p->size) result=TRUE; @@ -101,7 +101,7 @@ Bool NativeFSDrvValidate(U8 drv_let) return result; } -U0 NativeFSFmt(U8 drv_let,Bool quick=TRUE) +U0 RedSeaFSFmt(U8 drv_let,Bool quick=TRUE) { U8 *root_dir; CDirEntry *d_native; @@ -110,9 +110,9 @@ U0 NativeFSFmt(U8 drv_let,Bool quick=TRUE) I64 i,n; try { PrtLock(p); - // SetDrvType(drv_let,PT_NATIVE); + // SetDrvType(drv_let,PT_REDSEA); SetDrvType(drv_let,PT_FAT32); - p->type=PT_NATIVE; + p->type=PT_REDSEA; br->U8s_per_sect=BLK_SIZE; if (p->size<0x20000) br->sects_per_cluster=1; @@ -127,7 +127,7 @@ U0 NativeFSFmt(U8 drv_let,Bool quick=TRUE) else br->sects_per_cluster=32; - br->signature=MBR_PT_NATIVE; + br->signature=MBR_PT_REDSEA; br->signature2=0xAA55; br->sects=p->size; n=br->sects_per_cluster*(BLK_SIZE<<3); @@ -143,7 +143,7 @@ U0 NativeFSFmt(U8 drv_let,Bool quick=TRUE) WZeroBlks(p,p->offset,i); WBlks(p,br,p->offset,1); - NativeFSPrtInit(p); + RedSeaFSPrtInit(p); ClusersAlloc(p,0,1,FALSE); //Alloc #1 br->root_cluster=ClusersAlloc(p,0,1,FALSE); WBlks(p,br,p->offset,1); @@ -156,7 +156,7 @@ U0 NativeFSFmt(U8 drv_let,Bool quick=TRUE) d_native->cluster=br->root_cluster; d_native->size=p->spc<expanded_size=d_native->size; - d_native->datetime=GetCurTimeCDate; + d_native->datetime=GetCurTimeDate; d_native(U8 *)+=CDIR_SIZE; @@ -164,10 +164,10 @@ U0 NativeFSFmt(U8 drv_let,Bool quick=TRUE) d_native->name[1]='.'; d_native->attr=_ATTR_DIR|_ATTR_CONTIGUOUS; d_native->cluster=br->root_cluster; - d_native->datetime=GetCurTimeCDate; + d_native->datetime=GetCurTimeDate; WBlks(p,root_dir,p->data+br->root_cluster*p->spc,p->spc); - NativeFSPrtInit(p); + RedSeaFSPrtInit(p); PrtUnlock(p); } catch PrtUnlock(p); @@ -175,7 +175,7 @@ U0 NativeFSFmt(U8 drv_let,Bool quick=TRUE) Free(root_dir); } -Bool NativeFSFileFind(CPrt *p,I64 cur_dir_cluster,U8 *name,CDirEntry *_result,I64 fuf_flags=0) +Bool RedSeaFSFileFind(CPrt *p,I64 cur_dir_cluster,U8 *name,CDirEntry *_result,I64 fuf_flags=0) { //$LK,"FUF_JUST_DIRS","MN:FUF_JUST_DIRS"$, $LK,"FUF_JUST_FILES","MN:FUF_JUST_FILES"$ CDirEntry *buf,*buf2,*ptr; U8 dname[CDIR_FILENAME_LEN]; @@ -185,8 +185,8 @@ Bool NativeFSFileFind(CPrt *p,I64 cur_dir_cluster,U8 *name,CDirEntry *_result,I6 throw(EXCEPT_FUF,10); MemSet(_result,0,sizeof(CDirEntry)); PrtChk(p); - if (p->type!=PT_NATIVE) - PutDefineErr("ST_NOT_NATIVE"); + if (p->type!=PT_REDSEA) + PutDefineErr("ST_NOT_REDSEA"); else if (!CFileNameTo(dname,name)) PutDefineErr("ST_INVALID_FILENAME"); else { @@ -229,7 +229,7 @@ exit_this: -U8 *NativeFSFileRead(CPrt *p,U8 *cur_dir,U8 *filename,I64 *_size, +U8 *RedSeaFSFileRead(CPrt *p,U8 *cur_dir,U8 *filename,I64 *_size, I64 *_attr,Bool raw,CArcCompress **_ac2) { U8 *buf=NULL; @@ -241,20 +241,20 @@ U8 *NativeFSFileRead(CPrt *p,U8 *cur_dir,U8 *filename,I64 *_size, if (_size) *_size=0; if (_ac2) *_ac2=NULL; if (_attr) *_attr=0; - if (p->type!=PT_NATIVE) - PutDefineErr("ST_NOT_NATIVE"); + if (p->type!=PT_REDSEA) + PutDefineErr("ST_NOT_REDSEA"); else { try { PrtLock(p); cur_dir_cluster=Name2DirCluster(p,cur_dir); - if (NativeFSFileFind(p,cur_dir_cluster,filename,&de,FUF_JUST_FILES)) { + if (RedSeaFSFileFind(p,cur_dir_cluster,filename,&de,FUF_JUST_FILES)) { if (_attr) *_attr=de.attr; blk_cnt=(de.size+BLK_SIZE-1)>>BLK_SIZE_BITS; buf=MAlloc(blk_cnt<cur_prt->type!=PT_NATIVE) - PutDefineErr("ST_NOT_NATIVE"); + if (Fs->cur_prt->type!=PT_REDSEA) + PutDefineErr("ST_NOT_REDSEA"); else { - if (NativeFSFileFind(Fs->cur_prt,cur_dir_cluster, + if (RedSeaFSFileFind(Fs->cur_prt,cur_dir_cluster, name,&de,FUF_JUST_DIRS)) return TRUE; else { @@ -298,20 +298,20 @@ Bool NativeFSCd(U8 *name,I64 cur_dir_cluster) return FALSE; } -U0 NativeFSFreeClusters(CPrt *p,I64 c,I64 cnt) +U0 RedSeaFSFreeClusters(CPrt *p,I64 c,I64 cnt) { CFreeLst *tempf; Bool found=FALSE,unlock,unlock_break; PrtChk(p); if (!c) return; - if (p->type!=PT_NATIVE) - PutDefineErr("ST_NOT_NATIVE"); + if (p->type!=PT_REDSEA) + PutDefineErr("ST_NOT_REDSEA"); else { try { unlock_break=BreakLock; unlock=PrtLock(p); if (!p->next_free) - NativeFSFreeLstBuild(p); + RedSeaFSFreeLstBuild(p); tempf=p->next_free; while (!found && tempf!=&p->next_free) { if (tempf->start+tempf->size==c) { @@ -331,7 +331,7 @@ U0 NativeFSFreeClusters(CPrt *p,I64 c,I64 cnt) QueIns(tempf,p->last_free); } while (cnt-->0) { - SetNativeBuf(p,c); + SetFSBuf(p,c); LBtr(p->cur_map_blk,c&(BLK_SIZE<<3-1)); LBts(p->buffered_map_dirty_bits,0); c++; @@ -351,7 +351,7 @@ U0 NativeFSFreeClusters(CPrt *p,I64 c,I64 cnt) } } -I64 NativeFSAllocClusters(CPrt *p,I64 cnt) +I64 RedSeaFSAllocClusters(CPrt *p,I64 cnt) { CFreeLst *tempf,*best_free=NULL; I64 i,first,best_size=MAX_I64; @@ -362,7 +362,7 @@ I64 NativeFSAllocClusters(CPrt *p,I64 cnt) unlock_break=BreakLock; unlock=PrtLock(p); if (!p->next_free) - NativeFSFreeLstBuild(p); + RedSeaFSFreeLstBuild(p); tempf=p->next_free; while (tempf!=&p->next_free) { if (tempf->size>=cnt && tempf->sizestart; for (i=0;icur_map_blk,(first+i)&(BLK_SIZE<<3-1)); LBts(p->buffered_map_dirty_bits,0); } @@ -402,7 +402,7 @@ I64 NativeFSAllocClusters(CPrt *p,I64 cnt) } -Bool NativeFSDirNew(CPrt *p,U8 *cur_dir,CDirEntry *de,Bool free_old_chain) +Bool RedSeaFSDirNew(CPrt *p,U8 *cur_dir,CDirEntry *de,Bool free_old_chain) { CDirEntry *buf,*buf2,*ptr,de2; CBootStruct *br; @@ -434,7 +434,7 @@ Bool NativeFSDirNew(CPrt *p,U8 *cur_dir,CDirEntry *de,Bool free_old_chain) else { buf2=CAlloc(dir_size+p->spc<>BLK_SIZE_BITS+p->spc-1)/p->spc); dir_size+=p->spc<>BLK_SIZE_BITS+p->spc-1)/p->spc,TRUE); @@ -460,12 +460,12 @@ Bool NativeFSDirNew(CPrt *p,U8 *cur_dir,CDirEntry *de,Bool free_old_chain) Free(parent_dir); parent_dir=StrNew("/"); } - if (NativeFSFileFind(p,Name2DirCluster(p,parent_dir), + if (RedSeaFSFileFind(p,Name2DirCluster(p,parent_dir), temp,&de2,FUF_JUST_DIRS)) { de2.cluster=c; de2.size=dir_size; de2.expanded_size=dir_size; - NativeFSDirNew(p,parent_dir,&de2,FALSE); + RedSeaFSDirNew(p,parent_dir,&de2,FALSE); } else Dbg; Free(temp); @@ -483,7 +483,7 @@ Bool NativeFSDirNew(CPrt *p,U8 *cur_dir,CDirEntry *de,Bool free_old_chain) } else { if (!StrCmp(de->name,ptr->name)) { if (free_old_chain) - NativeFSFreeClusters(p,ptr->cluster, + RedSeaFSFreeClusters(p,ptr->cluster, (ptr->size+p->spc<spc<start,&de->start,CDIR_SIZE); @@ -514,7 +514,7 @@ Bool NativeFSDirNew(CPrt *p,U8 *cur_dir,CDirEntry *de,Bool free_old_chain) return FALSE; } -I64 NativeFSFilesDel(CPrt *p,U8 *cur_dir,U8 *files_find_mask,I64 fuf_flags, +I64 RedSeaFSFilesDel(CPrt *p,U8 *cur_dir,U8 *files_find_mask,I64 fuf_flags, Bool del_dir,Bool print_msg) { CDirEntry *buf,*buf2,*ptr; @@ -550,7 +550,7 @@ I64 NativeFSFilesDel(CPrt *p,U8 *cur_dir,U8 *files_find_mask,I64 fuf_flags, ptr->attr|=_ATTR_DELETED; WBlks(p,buf(U8 *)+j<data+cur_dir_cluster*p->spc+j,1); - NativeFSFreeClusters(p,ptr->cluster, + RedSeaFSFreeClusters(p,ptr->cluster, (ptr->size+p->spc<spc<type!=PT_NATIVE) - PutDefineErr("ST_NOT_NATIVE"); + if (p->type!=PT_REDSEA) + PutDefineErr("ST_NOT_REDSEA"); else if (!CFileNameTo(de.name,name)) PutDefineErr("ST_INVALID_FILENAME"); else { - NativeFSFilesDel(p,cur_dir,de.name,0,FALSE,FALSE); + RedSeaFSFilesDel(p,cur_dir,de.name,0,FALSE,FALSE); attr=FileAttr(name,attr); attr|=_ATTR_CONTIGUOUS; contiguous=TRUE; @@ -601,17 +601,17 @@ I64 NativeFSFileWrite(CPrt *p,U8 *cur_dir,U8 *name,U8 *buf,I64 size, buf=ac; } de.size=size; - de.xsum=ArcXSum(buf,size)^NATIVE_XSUM; + de.xsum=ArcXSum(buf,size)^TEMPLEOS_XSUM; if (blk_cnt=(size+BLK_SIZE-1)>>BLK_SIZE_BITS) c=ClusersAlloc(p,0,(blk_cnt+p->spc-1)/p->spc,contiguous); else c=INVALID_CLUSTER; de.cluster=c; de.attr=attr; - de.datetime=spdt; + de.datetime=cdt; if (blk_cnt) WClustersBlks(p,buf,c,blk_cnt); - NativeFSDirNew(p,cur_dir,&de,TRUE); + RedSeaFSDirNew(p,cur_dir,&de,TRUE); if (_ac2) *_ac2=ac; else @@ -620,7 +620,7 @@ I64 NativeFSFileWrite(CPrt *p,U8 *cur_dir,U8 *name,U8 *buf,I64 size, return c; } -CDirEntry *NativeFSFilesFind(U8 *files_find_mask,I64 fuf_flags,CDirEntry *parent=NULL) +CDirEntry *RedSeaFSFilesFind(U8 *files_find_mask,I64 fuf_flags,CDirEntry *parent=NULL) { CPrt *p=Fs->cur_prt; CDirEntry *buf,*buf2,*ptr,*result=NULL,*tempm; @@ -657,7 +657,7 @@ CDirEntry *NativeFSFilesFind(U8 *files_find_mask,I64 fuf_flags,CDirEntry *parent tempm->full_name=DirNameAbs(tempm->name); PrtUnlock(p); if (Cd(tempm->name)) { - tempm->sub=NativeFSFilesFind(files_find_mask,fuf_flags,tempm); + tempm->sub=RedSeaFSFilesFind(files_find_mask,fuf_flags,tempm); Cd(".."); } PrtLock(p); @@ -679,7 +679,7 @@ CDirEntry *NativeFSFilesFind(U8 *files_find_mask,I64 fuf_flags,CDirEntry *parent return result; } -Bool NativeFSMkDir(CPrt *p,U8 *cur_dir,U8 *name) +Bool RedSeaFSMkDir(CPrt *p,U8 *cur_dir,U8 *name) { I64 size=p->spc<cluster=c; d_native->size=size; d_native->expanded_size=size; - d_native->datetime=GetCurTimeCDate; + d_native->datetime=GetCurTimeDate; d_native(U8 *)+=CDIR_SIZE; d_native->attr=_ATTR_DIR|_ATTR_CONTIGUOUS; @@ -705,7 +705,7 @@ Bool NativeFSMkDir(CPrt *p,U8 *cur_dir,U8 *name) d_native->cluster=cur_dir_cluster; d_native->size=0; d_native->expanded_size=0; - d_native->datetime=GetCurTimeCDate; + d_native->datetime=GetCurTimeDate; WClusters(p,buf,c,1); Free(buf); if (unlock_break) diff --git a/TempleOS/Kernel/EdLite.CPP b/TempleOS/Kernel/EdLite.CPP index 5befbf5..07be7fd 100644 --- a/TempleOS/Kernel/EdLite.CPP +++ b/TempleOS/Kernel/EdLite.CPP @@ -61,7 +61,7 @@ U0 EdLite(U8 *filename,I64 num=1) //Light weight text editor for debugging U8 *src,*src2,*src3,*dst,*buf,*bin_data=NULL; I64 i,cnt=0,ch,sc,size,bin_size=0,line_start_col=0,cur_col=0, - old_dc_flags=sys_raw_dc_flags; + old_dc_flags=sys_raw_dc_flags; CLine root,*templ,*templ1,*cur_line; Bool old_raw=Raw(ON), old_debug=InDbg(ON), @@ -81,12 +81,12 @@ U0 EdLite(U8 *filename,I64 num=1) src=buf; while (*src) { src2=src; - while ((ch=*src++) && ch!=CH_CARRIAGE_RETURN && ch!='\n'); + while ((ch=*src++) && ch!='\r' && ch!='\n'); src--; *src++=0; if (!ch) src--; - while (ch==CH_CARRIAGE_RETURN && *src=='\n' || *src==CH_CURSOR) + while (ch=='\r' && *src=='\n' || *src==CH_CURSOR) src++; dst=src3=src2; while (ch=*src3++) @@ -195,7 +195,7 @@ U0 EdLite(U8 *filename,I64 num=1) } break; case '\n': - case CH_CARRIAGE_RETURN: + case '\r': templ=MAlloc(sizeof(CLine)); templ->line=StrNew(cur_line->line+cur_col); cur_line->line[cur_col]=0; @@ -249,7 +249,6 @@ U0 EdLite(U8 *filename,I64 num=1) cur_line->line=src; cur_col++; } - break; } } while (ch!=CH_SHIFT_ESC && ch!=CH_ESC); @@ -294,7 +293,7 @@ U0 EdLite(U8 *filename,I64 num=1) PopFD; } -U0 EdLiteFileLine(U8 *_fl_file_line) +U0 ToFileLine(U8 *_fl_file_line,U8 **_filename,I64 *_linenum) { U8 *st,*fl_file_line=StrNew(_fl_file_line); I64 linenum; @@ -303,8 +302,17 @@ U0 EdLiteFileLine(U8 *_fl_file_line) StrLastRem(fl_file_line,",",st); linenum=A2I(st); Free(st); - EdLite(fl_file_line,linenum); - Free(fl_file_line); + *_filename=fl_file_line; + *_linenum=linenum; +} + +U0 EdLiteFileLine(U8 *fl_file_line) +{ + U8 *filename; + I64 linenum; + ToFileLine(fl_file_line,&filename,&linenum); + EdLite(filename,linenum); + Free(filename); } U0 SetFix(U8 *filename,I64 line) diff --git a/TempleOS/Kernel/FIFO.CPP b/TempleOS/Kernel/FIFO.CPP deleted file mode 100644 index 235ca8e..0000000 --- a/TempleOS/Kernel/FIFO.CPP +++ /dev/null @@ -1,169 +0,0 @@ -CFifoU8 *FifoU8New(I64 size,CTask *mem_task=NULL) -{ - CFifoU8 *f; - if (!mem_task) mem_task=Fs; - f=MAlloc(sizeof(CFifoU8),mem_task); - f->buf=MAlloc(size,mem_task); - f->mask=size-1; - f->in_ptr=0; - f->out_ptr=0; - return f; -} - -U0 FifoU8Del(CFifoU8 *f) -{ - Free(f->buf); - Free(f); -} - -Bool FifoU8Ins(CFifoU8 *f,U8 b) -{ - I64 new_in_ptr; - PushFD; - Cli; - new_in_ptr=(f->in_ptr+1)&f->mask; - if (new_in_ptr==f->out_ptr) { - PopFD; - return FALSE; - } else { - f->buf[f->in_ptr]=b; - f->in_ptr=new_in_ptr; - PopFD; - return TRUE; - } -} - -Bool FifoU8Rem(CFifoU8 *f,U8 *_b) -{ - PushFD; - Cli; - if (f->in_ptr==f->out_ptr) { - PopFD; - return FALSE; - } else { - *_b=f->buf[f->out_ptr]; - f->out_ptr=(f->out_ptr+1)&f->mask; - PopFD; - return TRUE; - } -} - -Bool FifoU8Peek(CFifoU8 *f,U8 *_b) -{ - PushFD; - Cli; - if (f->in_ptr==f->out_ptr) { - PopFD; - return FALSE; - } else { - *_b=f->buf[f->out_ptr]; - PopFD; - return TRUE; - } -} - -U0 FifoU8Flush(CFifoU8 *f) -{ - PushFD; - Cli; - f->out_ptr=f->in_ptr; - PopFD; -} - -I64 FifoU8Cnt(CFifoU8 *f) -{ - I64 result; - PushFD; - 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; - PopFD; - return result; -} - -CFifoI64 *FifoI64New(I64 size,CTask *mem_task=NULL) -{ - CFifoI64 *f; - if (!mem_task) mem_task=Fs; - f=MAlloc(sizeof(CFifoI64),mem_task); - f->buf=MAlloc(size*sizeof(I64),mem_task); - f->mask=size-1; - f->in_ptr=0; - f->out_ptr=0; - return f; -} - -U0 FifoI64Del(CFifoI64 *f) -{ - Free(f->buf); - Free(f); -} - -Bool FifoI64Ins(CFifoI64 *f,I64 q) -{ - I64 new_in_ptr; - PushFD; - Cli; - new_in_ptr=(f->in_ptr+1)&f->mask; - if (new_in_ptr==f->out_ptr) { - PopFD; - return FALSE; - } else { - f->buf[f->in_ptr]=q; - f->in_ptr=new_in_ptr; - PopFD; - return TRUE; - } -} - -Bool FifoI64Rem(CFifoI64 *f,I64 *_q) -{ - PushFD; - Cli; - if (f->in_ptr==f->out_ptr) { - PopFD; - return FALSE; - } else { - *_q=f->buf[f->out_ptr]; - f->out_ptr=(f->out_ptr+1)&f->mask; - PopFD; - return TRUE; - } -} - -Bool FifoI64Peek(CFifoI64 *f,I64 *_q) -{ - PushFD; - Cli; - if (f->in_ptr==f->out_ptr) { - PopFD; - return FALSE; - } else { - *_q=f->buf[f->out_ptr]; - PopFD; - return TRUE; - } -} - -U0 FifoI64Flush(CFifoI64 *f) -{ - PushFD; - Cli; - f->out_ptr=f->in_ptr; - PopFD; -} - -I64 FifoI64Cnt(CFifoI64 *f) -{ - I64 result; - PushFD; - 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; - PopFD; - return result; -} diff --git a/TempleOS/Kernel/Font8x8.CPP b/TempleOS/Kernel/Font8x8.CPP index 3ef4886..3d24ea3 100644 --- a/TempleOS/Kernel/Font8x8.CPP +++ b/TempleOS/Kernel/Font8x8.CPP @@ -1,4 +1,4 @@ -//See $LK-A,"::/TempleOS/Doc/Acknowledgements.TXT"$ (1). +//See $LK-A,"::/TempleOS/Doc/Acknowledgements.TXT"$. U8 sys_font_8x8[256*8]= { 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, diff --git a/TempleOS/Kernel/Hash1a.CPP b/TempleOS/Kernel/Hash1a.CPP index a219b95..480cc9f 100644 --- a/TempleOS/Kernel/Hash1a.CPP +++ b/TempleOS/Kernel/Hash1a.CPP @@ -299,12 +299,12 @@ _HASH_ADD:: MOV U64 CHash.next[RCX],RBX MOV U64 [RAX],RCX -//Queins +//QueIns RCX MOV RBX,U64 CHashTable.last_added[RDI] + MOV U64 CHash.next_added[RCX],RDI MOV U64 CHash.last_added[RCX],RBX MOV U64 CHash.next_added[RBX],RCX MOV U64 CHashTable.last_added[RDI],RCX - MOV U64 CHash.next_added[RCX],RDI POPFD POP RDI @@ -324,12 +324,12 @@ _HASH_ADD_AFTER:: MOV U64 CHash.next[RCX],RBX MOV U64 [RAX],RCX -//QueIns +//QueIns RCX MOV RBX,U64 CHashTable.last_added[RDI] + MOV U64 CHash.next_added[RCX],RDI MOV U64 CHash.last_added[RCX],RBX MOV U64 CHash.next_added[RBX],RCX MOV U64 CHashTable.last_added[RDI],RCX - MOV U64 CHash.next_added[RCX],RDI POPFD POP RDI @@ -357,7 +357,7 @@ _HASH_REPLACE:: MOV RCX,U64 SF_ARG1[RBP] JZ @@05 //Z set by find -//QueRem/QueIns +//QueRem RAX,QueIns RCX MOV RBX,U64 CHash.next_added[RAX] MOV U64 CHash.next_added[RCX],RBX MOV U64 CHash.last_added[RBX],RCX @@ -368,12 +368,12 @@ _HASH_REPLACE:: MOV RBX,U64 CHash.next[RAX] JMP @@10 -//QueIns +//QueIns RCX @@05: MOV RBX,U64 CHashTable.last_added[RDI] + MOV U64 CHash.next_added[RCX],RDI MOV U64 CHash.last_added[RCX],RBX MOV U64 CHash.next_added[RBX],RCX MOV U64 CHashTable.last_added[RDI],RCX - MOV U64 CHash.next_added[RCX],RDI MOV RBX,RAX @@ -418,7 +418,7 @@ _HASH_REM_DEL:: MOV RBX,U64 CHash.next[RAX] MOV U64 [RDX],RBX -//QueRem +//QueRem RAX MOV RBX,U64 CHash.next_added[RAX] MOV RDX,U64 CHash.last_added[RAX] MOV U64 CHash.next_added[RDX],RBX @@ -486,10 +486,8 @@ U0 HashDel(CHashSrcSym *temph) Free(temph->index); Free(temph->import_name); LinkedLstDel(temph->ie_lst); - if (temph->type & (HTT_FUN | HTT_EXPORT_SYS_SYM)) { + if (temph->type & (HTT_FUN | HTT_EXPORT_SYS_SYM)) Free(temph->debug); - Free(temph->indent); - } if (temph->type & (HTT_FUN | HTT_CLASS)) //Assumes code not on heap, so doesn't Free. //$LK,"MemberLstDel","MN:MemberLstDel"$() is an import to the Kernel module @@ -779,7 +777,7 @@ U8 *Load(U8 *filename,I64 ld_flags=0,CBinFile *bfh_addr=INVALID_PTR) lo_skip: module_base=bfh_addr(U8 *)+sizeof(CBinFile); - if (ArcXSum(bfh_addr,bfh_addr->file_size)!=NATIVE_XSUM) + if (ArcXSum(bfh_addr,bfh_addr->file_size)!=TEMPLEOS_XSUM) throw(EXCEPT_ARC_XSUM); absname=FileNameAbs(fbuf); diff --git a/TempleOS/Kernel/Interrupts.CPP b/TempleOS/Kernel/Interrupts.CPP index c46baac..261db9b 100644 --- a/TempleOS/Kernel/Interrupts.CPP +++ b/TempleOS/Kernel/Interrupts.CPP @@ -183,8 +183,7 @@ U0 IntInit1() } ptr=temp_ptr; *ptr(U16 *)++=256*16-1; - *ptr(U32 *)++=sys_idt(I64).u32[0]; - *ptr(U32 *)++=sys_idt(I64).u32[1]; + *ptr(I64 *)++=sys_idt; *ptr(U16 *)++=0; SetRAX(temp_ptr); asm { LIDT U64 [RAX] } diff --git a/TempleOS/Kernel/KCfg.CPP b/TempleOS/Kernel/KCfg.CPP index 59dec04..1a21df1 100644 --- a/TempleOS/Kernel/KCfg.CPP +++ b/TempleOS/Kernel/KCfg.CPP @@ -24,19 +24,23 @@ class CKernelCfg U8 *acct_name; U8 *dsk_cache_size_exp; CDoc *add_dev; - Bool opts[CFG_NUM_OPTIONS]; U8 mem_init_val,heap_init_val,var_init_val, - dft_drv,auto_mount_ide_hd_let,auto_mount_ide_cd_let; + sys_acct_drv,auto_mount_ide_hd_let,auto_mount_ide_cd_let; Bool cdrom_ports_pmt; }; CDoc *KernelCfgAddDev(CKernelCfg *c) { I64 num_hints,first_prt_num,type,unit,cnt=0; - U8 blks_buf[256],base0_buf[128],base1_buf[128],drv_let; + U8 blks_buf[256],addr_buf[256],base0_buf[128],base1_buf[128]; CATARep *root=NULL,*tempha; CDoc *doc=DocNew; + Bool make_free; + + //See $LK,"InsBootDstDrv","FF:::/TempleOS/Adam/Boot/InsBoot.CPP,InsBootDstDrv"$ + if (!(c->sys_acct_drv=NamedFramePtr("InsBootDstDrv"))) + c->sys_acct_drv=Fs->cur_prt->drv_let; PutDefine("ST_MOUNT_INTRO"); do { @@ -50,11 +54,13 @@ CDoc *KernelCfgAddDev(CKernelCfg *c) unit=0; if (type==BDT_RAM) { + PutDefine("ST_MOUNT_ADDR"); + GetS(addr_buf,256); PutDefine("ST_MOUNT_BLKS"); GetS(blks_buf,256); } else if (type==BDT_ATA || type==BDT_ATAPI) { - num_hints=ATARep(TRUE,,&root); + num_hints=ATARep(,,&root); if (type==BDT_ATAPI) { PutDefine("ST_MOUNT_BOOTED_CDROM"); if (num_hints) @@ -94,27 +100,28 @@ CDoc *KernelCfgAddDev(CKernelCfg *c) if (BDT_NULLunit=%d;",first_prt_num+'A',type,unit); - if (type==BDT_RAM) + if (type==BDT_RAM) { + if (!*addr_buf) StrCpy(addr_buf,"0"); + DocPrintF(doc,"bdev->RAM_dsk=%s;",addr_buf); DocPrintF(doc,"bdev->max_blk=(%s)-1;",blks_buf); + } + make_free=FALSE; if (type==BDT_ATA || type==BDT_ATAPI) { if (type==BDT_ATAPI && !*base0_buf) { c->cdrom_ports_pmt=TRUE; DocPrintF(doc,"boot_drv_pmt=PmtBaseUnit(bdev);"); + if (first_prt_num+'A'==c->sys_acct_drv) + make_free=TRUE; } else DocPrintF(doc,"bdev->base0=%s;bdev->base1=%s;", base0_buf,base1_buf); } - DocPrintF(doc,"BlkDevAdd(bdev,FALSE,FALSE);"); + DocPrintF(doc,"BlkDevAdd(bdev,FALSE,%d);",make_free); cnt++; } else PutDefine("ST_FAILED"); } } while (!cnt || 0<=first_prt_numcur_prt->drv_let; - c->dft_drv=drv_let; return doc; } @@ -191,6 +198,7 @@ U0 KernelCfgOptions(CKernelCfg *c) c->auto_mount_ide_hd_let=0; c->auto_mount_ide_cd_let=0; } + break; } } } while (*st); diff --git a/TempleOS/Kernel/KEnd.CPP b/TempleOS/Kernel/KEnd.CPP index 196e8bb..adcf68a 100644 --- a/TempleOS/Kernel/KEnd.CPP +++ b/TempleOS/Kernel/KEnd.CPP @@ -44,9 +44,9 @@ U0 SysGlblsInit() KeyDevAdd(&AKDRawDisplayPutKey,&AKDRawDisplayPutS,0x60000000,FALSE); #exe { if (*kernel_cfg->acct_name) - StreamPrintF("sys_acct=StrNew(\"%C:/TempleOS/Accts/%s\");",kernel_cfg->dft_drv,kernel_cfg->acct_name); + StreamPrintF("sys_acct=StrNew(\"%C:/TempleOS/Accts/%s\");",kernel_cfg->sys_acct_drv,kernel_cfg->acct_name); else - StreamPrintF("sys_acct=StrNew(\"%C:/TempleOS/Accts\");",kernel_cfg->dft_drv); + StreamPrintF("sys_acct=StrNew(\"%C:/TempleOS/Accts\");",kernel_cfg->sys_acct_drv); StreamPutS("#exe{OptOff(OPTf_WARN_PAREN);}"); StreamPrintF("DskCacheInit(%s);",kernel_cfg->dsk_cache_size_exp); StreamPutS("#exe{OptOn(OPTf_WARN_PAREN);}"); @@ -55,6 +55,10 @@ U0 SysGlblsInit() for (i=-308;i<309;i++) pow10_I64[i+309]=Pow10(i); + QueInit(&snd_record_root); + snd_record_root.freq=0; + snd_record_root.time_stamp=tT; + //$AN,"Independent Heap Ctrl Example","Independent Heap Ctrl Example"$ i=1; //Rqst 1 blk, we might get more. m=MemBlksUncachedAlloc(&i,sys_code_bp); @@ -150,7 +154,7 @@ U0 Reboot() SysHlt; } -U0 Kernel() +U0 KernelMain() { //Continued from $LK,"Kernel","FF:::/TempleOS/Kernel/KStart.CPP,I32 &Kernel"$ adam_task=Fs; HeapsInit; @@ -166,8 +170,7 @@ U0 Kernel() SysGrInit; StrCpy(Fs->task_name,"Adam Task CPU#0"); StrCpy(Fs->task_title,Fs->task_name); - Fs->text_attr=WHITE<<4+PURPLE; - Fs->border_attr=WHITE<<4+LTPURPLE; + Fs->title_src=TTS_TASK_NAME; Fs->win_right=text_cols-2; Fs->win_top++; TaskDerivedValsUpdate; @@ -210,7 +213,7 @@ U0 Kernel() else if (mp_cnt<2) Spawn(&MouseDriverInstall); else - MPSpawn(&MouseDriverInstall); + Spawn(&MouseDriverInstall,,,1); "BlkDevsInitAll\n"; BlkDevsInitAll; @@ -235,13 +238,15 @@ U0 Kernel() try ExeFile("Adam1"); //Continues $LK,"/TempleOS/Kernel/Adam1.CPP","FL:/TempleOS/Kernel/Adam1.CPP,1"$ catch { + Raw(ON); CatchAll; Dbg; } LBts(&sys_run_level,RLf_ADAM_SERVER); - ServantTaskCont; //Never to return + SrvTaskCont; //Never to return } asm { ALIGN 16,OC_NOP -SYS_KERNEL_END::} +SYS_KERNEL_END:: +} diff --git a/TempleOS/Kernel/KExts.CPP b/TempleOS/Kernel/KExts.CPP index c9ab098..2ac65c7 100644 --- a/TempleOS/Kernel/KExts.CPP +++ b/TempleOS/Kernel/KExts.CPP @@ -5,7 +5,8 @@ before import is resolved, you can use var and check it before calling. */ import U0 MemberLstDel(CHashClass *tempc); -import I64 ExePutS(U8 *buf,U8 *filename=NULL,Bool just_load=FALSE); +import I64 ExePutS(U8 *buf,U8 *filename=NULL, + Bool just_load=FALSE,CLexHashTableContext *htc=NULL); import I64 ExeFile(U8 *name,Bool just_load=FALSE); import U0 DisplaySpecialKeys(I64 sc); import Bool DocUnlock(CDoc *doc); @@ -34,6 +35,9 @@ extern U0 Dm(U8 *buf,I64 cnt=0x80); extern U0 MPInt(I64 num,I64 cpu_num=1); extern U0 XTalk(CTask *task,U8 *fmt,...); extern Bool Suspend(CTask *task=NULL,Bool state=TRUE); +extern U0 SrvCmdDel(CSrvCmd *tempc); +extern U0 SrvCmdQueDel(CSrvCmd *root); +extern U0 SrvCtrlInit(CSrvCtrl *ctrl); extern Bool TaskValidate(CTask *task); extern U8 *FileExtRem(U8 *src,U8 *dst=NULL); @@ -42,23 +46,23 @@ extern Bool FileFind(U8 *filename,CDirEntry *rde=NULL,I64 fuf_flags=0); extern Bool ISOPrtInit(CPrt *p,I64 blk); extern Bool ISO1FileFind(CPrt *p,I64 cur_dir_cluster,U8 *name,CDirEntry *_result,I64 fuf_flags=0); extern CDirEntry *ISO1FilesFind(U8 *files_find_mask,I64 fuf_flags,CDirEntry *parent=NULL); -extern U0 NativeFSFreeFreeLst(CPrt *p); -extern U0 NativeFSPrtInit(CPrt *p); +extern U0 RedSeaFSFreeFreeLst(CPrt *p); +extern U0 RedSeaFSPrtInit(CPrt *p); extern U0 FAT32PrtInit(CPrt *p); -extern Bool NativeFSDrvValidate(U8 drv_let); -extern U0 NativeFSFmt(U8 drv_let,Bool quick=TRUE); -extern Bool NativeFSFileFind(CPrt *p,I64 cur_dir_cluster,U8 *name,CDirEntry *_result,I64 fuf_flags=0); +extern Bool RedSeaFSDrvValidate(U8 drv_let); +extern U0 RedSeaFSFmt(U8 drv_let,Bool quick=TRUE); +extern Bool RedSeaFSFileFind(CPrt *p,I64 cur_dir_cluster,U8 *name,CDirEntry *_result,I64 fuf_flags=0); extern Bool FAT32FileFind(CPrt *p,I64 cur_dir_cluster,U8 *name,CDirEntry *_result,I64 fuf_flags=0); extern U8 *FileRead(U8 *filename,I64 *_size=NULL,I64 *_attr=NULL,Bool raw=FALSE); -extern I64 NativeFSAllocClusters(CPrt *p,I64 cnt); +extern I64 RedSeaFSAllocClusters(CPrt *p,I64 cnt); extern I64 FAT32AllocClusters(CPrt *p,I64 c,I64 cnt); extern I64 FAT32AllocContiguousClusters(CPrt *p,I64 cnt); -extern Bool NativeFSDirNew(CPrt *p,U8 *cur_dir,CDirEntry *de,Bool free_old_chain); +extern Bool RedSeaFSDirNew(CPrt *p,U8 *cur_dir,CDirEntry *de,Bool free_old_chain); extern Bool FAT32DirNew(CPrt *p,U8 *cur_dir,CDirEntry *de,Bool free_old_chain); -extern CDirEntry *NativeFSFilesFind (U8 *files_find_mask,I64 fuf_flags,CDirEntry *parent=NULL); +extern CDirEntry *RedSeaFSFilesFind (U8 *files_find_mask,I64 fuf_flags,CDirEntry *parent=NULL); extern CDirEntry *FAT32FilesFind(U8 *files_find_mask,I64 fuf_flags,CDirEntry *parent=NULL,I64 *_dir_size=NULL); extern I64 FileWrite(U8 *filename,U8 *fbuf, - I64 size,CDate spdt=0,I64 attr=0,Bool raw=FALSE); + I64 size,CDate cdt=0,I64 attr=0,Bool raw=FALSE); extern U0 Exit(); extern U0 AdamLog(U8 *fmt,...); @@ -66,16 +70,21 @@ extern U0 Dbg(U8 *msg=NULL,I64 msg_num=0); extern Bool BptS(U8 *add,CTask *task=NULL,Bool live=TRUE); extern U0 DbgHelp(); extern U8 *Caller(I64 num=1); +extern CTask *SpawnQue(U0 (*fp_add)(U8 *data),U8 *data=NULL, + U8 *task_name=NULL, + I64 target_cpu, + CTask *parent=NULL, //NULL means adam + I64 stk_size=0,I64 flags=1<auto_mount_ide_hd_let='C'; if (!kernel_cfg->auto_mount_ide_cd_let) kernel_cfg->auto_mount_ide_cd_let='T'; - StreamPrintF("U8 dft_drv=%d,sys_first_hd_drv_let=%d,sys_first_cd_drv_let=%d;", - ToUpper(kernel_cfg->dft_drv),kernel_cfg->auto_mount_ide_hd_let,kernel_cfg->auto_mount_ide_cd_let); + StreamPrintF("U8 sys_first_hd_drv_let=%d,sys_first_cd_drv_let=%d;", + kernel_cfg->auto_mount_ide_hd_let,kernel_cfg->auto_mount_ide_cd_let); } -Bool boot_drv_pmt=FALSE; +Bool boot_drv_pmt=FALSE,cdrom_boot_is_good=TRUE; CPrt *drv_to_prt[32]; U8 *sys_acct; U8 *reverse_bits_table,*set_bits_table; @@ -70,9 +69,7 @@ CMemRange sys_mem32_dev_root; U8 *sys_mem64_dev_ptr=MAPPED_MEM_SPACE; F64 snd_freq=0; -I64 snd_dev=SD_PC_SPEAKER; Bool snd_record=FALSE; -F64 snd_vol=0.1,snd_reverb_intensity=0.2,snd_reverb_delay=0.3; F64 *pow10_I64; @@ -124,14 +121,12 @@ U32 key_down_bitmap[8]; //BitTest, $LK,"Bt","MN:Bt"$(), with an unmerged scan code. U32 key_down_bitmap2[8]; -U0 (*fp_snd)(F64 freq,I64 waveform,F64 amp)=NULL; -U0 (*fp_snd_record)(F64 freq,I64 waveform,F64 amp)=NULL; -U0 (*fp_snd_fill_buf)(SND_OUT_CONTAINER *buf,I64 buf_num)=NULL; -U0 (*fp_snd_copy_buf)(SND_IN_CONTAINER *buf,I64 buf_num)=NULL; +CSndData snd_record_root; + U8 *(*fp_mgets)(I64 flags=0)=NULL; U0 (*fp_prs_stream_blk)(CLex *lx)=NULL; U0 (*fp_update_ctrls)(CTask *task)=NULL; -CDoc *(*fp_doc_cur)(CTask *task=NULL)=NULL; +CDoc *(*fp_doc_put)(CTask *task=NULL)=NULL; U0 (*fp_set_std_palette)()=NULL; CPSectCache *psect_cache; diff --git a/TempleOS/Kernel/KStart.CPP b/TempleOS/Kernel/KStart.CPP index b713731..bc4143c 100644 --- a/TempleOS/Kernel/KStart.CPP +++ b/TempleOS/Kernel/KStart.CPP @@ -7,7 +7,7 @@ It continues here: $LK,"Kernel","FF:::/TempleOS/Kernel/KEnd.CPP,U0 Kernel"$. The boot loader jumps here, in real-mode (16-bit). It actually jumps to the $LK,"CBinFile","MN:CBinFile"$ which is placed -just before this $LK,"generated by the compiler","FF:::/TempleOS/Compiler/CmpMain.CPP,NATIVE_XSUM"$. +just before this $LK,"generated by the compiler","FF:::/TempleOS/Compiler/CmpMain.CPP,TEMPLEOS_XSUM"$. The header begins with a short jmp to the start of this file's code which begins with the following small jump past some data. @@ -16,9 +16,9 @@ This file is first in the Kernel image because it is #included first. $LK,"Kernel.PRJ","FF:::/TempleOS/Kernel/Kernel.PRJ,KStart:1"$ */ USE16 -SYS_TEMPLEOS_START1:: +SYS_KERNEL_START1:: //This must match $LK,"CKernel","MN:CKernel"$. - JMP U16 SYS_TEMPLEOS_START2 + JMP U16 SYS_KERNEL_START2 // ************************************ // ASM Global vars required for 16-bit start-up @@ -26,7 +26,7 @@ SYS_TEMPLEOS_START1:: ALIGN 4,OC_NOP SYS_BOOT_BASE:: DU32 0; //Fixed offset from start used by reboot SYS_BOOT_PATCH_TABLE_BASE:: DU32 0; -#exe {StreamPrintF("SYS_COMPILE_TIME:: DU64 0x%X;",GetCurTimeCDate);} +#exe {StreamPrintF("SYS_COMPILE_TIME:: DU64 0x%X;",GetCurTimeDate);} //See $LK,"BootCdProbe","MN:BootCdProbe"$ #assert SYS_COMPILE_TIME+8+16task_flags,TASKf_USER); @@ -10,26 +9,24 @@ U0 InputFilterTask() old_filter=LBts(&Fs->last_input_filter_task->task_flags,TASKf_FILTER_INPUT); LBEqu(&Fs->task_flags,TASKf_FILTER_INPUT,old_filter); while (TRUE) { - ServantCmdsHandler; + SrvCmdsHandler; Cli; - tempc1=&Fs->next_servant_cmd; + tempc1=&Fs->srv_ctrl.next_waiting; tempc=tempc1->next; if (tempc==tempc1) break; else { - if (tempc->cmd_code==TASKCT_TEXT_INPUT) { + if (tempc->cmd_code==SVCT_TEXT_INPUT) { QueRem(tempc); SetFlags(old_flags); - st=tempc->data; - Free(tempc); if (!IsSysDeterministic) Preempt(ON); try - ExePutS(st); + ExePutS(tempc->aux_str); catch Fs->catch_except=TRUE; Preempt(OFF); - Free(st); + SrvCmdDel(tempc); } else break; } @@ -44,28 +41,28 @@ U0 InputFilterTask() I64 ScanMsg(I64 *_p1=NULL,I64 *_p2=NULL,I64 mask=~1,CTask *task=NULL) { I64 result,old_flags; - CTaskCmd *tempc,*tempc1; + CSrvCmd *tempc,*tempc1; if (!task) task=Fs; old_flags=GetFlags; - tempc1=&task->next_servant_cmd; + tempc1=&task->srv_ctrl.next_waiting; while (TRUE) { if (task==Fs) - ServantCmdsHandler; + SrvCmdsHandler; Cli; tempc=tempc1->next; if (tempc==tempc1) break; else { - if (tempc->cmd_code==TASKCT_MSG) { + if (tempc->cmd_code==SVCT_MSG) { QueRem(tempc); SetFlags(old_flags); result=tempc->msg_code; if (_p1) - *_p1=tempc->p1; + *_p1=tempc->aux1; if (_p2) - *_p2=tempc->p2; - Free(tempc); - if ((result!=MSG_KEY_DOWN || !(tempc->p2&SCF_KEY_DESC) || + *_p2=tempc->aux2; + SrvCmdDel(tempc); + if ((result!=MSG_KEY_DOWN || !(tempc->aux2&SCF_KEY_DESC) || Bt(&mask,MSGF_ALLOW_KEY_DESC)) && Bt(&mask,result)) goto sm_done; } @@ -140,13 +137,12 @@ I64 GetKey(I64 *_scancode=NULL,Bool echo=FALSE,Bool raw_cursor=FALSE) { I64 ch,sc; Bool old_preempt=Preempt(OFF),cursor_on=FALSE; - while (!ScanKey(&ch,&sc,FALSE)) { if (IsRaw && raw_cursor) { - if (!cursor_on && Blink) { + if (!cursor_on && ToI64(GetTimeStamp*5/time_stamp_freq)&1) { 'Û'; cursor_on=TRUE; - } else if (cursor_on && !Blink) { + } else if (cursor_on && !(ToI64(GetTimeStamp*5/time_stamp_freq)&1)) { '' CH_BACKSPACE; cursor_on=FALSE; } @@ -159,7 +155,7 @@ I64 GetKey(I64 *_scancode=NULL,Bool echo=FALSE,Bool raw_cursor=FALSE) PushFD; Cli; KbdMouseHandler(TRUE,FALSE); - KbdQueMsgs; + KbdMsgsQue; PopFD; if (old_preempt && GetFlags&1<r10 0000 0000000008 DefineStr -$LK,"_R11 ","FL:D:/TempleOS/Kernel/Adam1a.HPP,3656"$Fs->r11 0000 0000000008 DefineStr -$LK,"_R12 ","FL:D:/TempleOS/Kernel/Adam1a.HPP,3657"$Fs->r12 0000 0000000008 DefineStr -$LK,"_R13 ","FL:D:/TempleOS/Kernel/Adam1a.HPP,3658"$Fs->r13 0000 0000000008 DefineStr -$LK,"_R14 ","FL:D:/TempleOS/Kernel/Adam1a.HPP,3659"$Fs->r14 0000 0000000008 DefineStr -$LK,"_R15 ","FL:D:/TempleOS/Kernel/Adam1a.HPP,3660"$Fs->r15 0000 0000000008 DefineStr -$LK,"_R8 ","FL:D:/TempleOS/Kernel/Adam1a.HPP,3653"$Fs->r8 0000 0000000008 DefineStr -$LK,"_R9 ","FL:D:/TempleOS/Kernel/Adam1a.HPP,3654"$Fs->r9 0000 0000000008 DefineStr -$LK,"_RAX ","FL:D:/TempleOS/Kernel/Adam1a.HPP,3644"$Fs->rax 0000 0000000008 DefineStr -$LK,"_RBP ","FL:D:/TempleOS/Kernel/Adam1a.HPP,3650"$Fs->rbp 0000 0000000008 DefineStr -$LK,"_RBX ","FL:D:/TempleOS/Kernel/Adam1a.HPP,3645"$Fs->rbx 0000 0000000008 DefineStr -$LK,"_RCX ","FL:D:/TempleOS/Kernel/Adam1a.HPP,3646"$Fs->rcx 0000 0000000008 DefineStr -$LK,"_RDI ","FL:D:/TempleOS/Kernel/Adam1a.HPP,3649"$Fs->rdi 0000 0000000008 DefineStr -$LK,"_RDX ","FL:D:/TempleOS/Kernel/Adam1a.HPP,3647"$Fs->rdx 0000 0000000008 DefineStr -$LK,"_REP_IN_U16 ","FL:D:/TempleOS/Kernel/Utils1a.CPP.Z,135"$0000002FF5 0001 ExportSysSym -$LK,"_REP_IN_U32 ","FL:D:/TempleOS/Kernel/Utils1a.CPP.Z,124"$0000002FDD 0001 ExportSysSym -$LK,"_REP_IN_U8 ","FL:D:/TempleOS/Kernel/Utils1a.CPP.Z,146"$000000300E 0001 ExportSysSym -$LK,"_REP_OUT_U16 ","FL:D:/TempleOS/Kernel/Utils1a.CPP.Z,168"$000000303E 0001 ExportSysSym -$LK,"_REP_OUT_U32 ","FL:D:/TempleOS/Kernel/Utils1a.CPP.Z,157"$0000003026 0001 ExportSysSym -$LK,"_REP_OUT_U8 ","FL:D:/TempleOS/Kernel/Utils1a.CPP.Z,179"$0000003057 0001 ExportSysSym -$LK,"_RIP ","FL:D:/TempleOS/Kernel/Adam1a.HPP,3652"$Fs->rip 0000 0000000008 DefineStr -$LK,"_ROUND ","FL:D:/TempleOS/Kernel/Math1a.CPP.Z,360"$0000003514 0001 ExportSysSym -$LK,"_RSI ","FL:D:/TempleOS/Kernel/Adam1a.HPP,3648"$Fs->rsi 0000 0000000008 DefineStr -$LK,"_RSP ","FL:D:/TempleOS/Kernel/Adam1a.HPP,3651"$Fs->rsp 0000 0000000008 DefineStr -$LK,"_SAVE_EXCEPT_REGS ","FL:D:/TempleOS/Kernel/Except.CPP.Z,40"$0000014FDB 0001 ExportSysSym -$LK,"_SET_GS_BASE ","FL:D:/TempleOS/Kernel/Utils1a.CPP.Z,290"$000000314F 0004 ExportSysSym -$LK,"_SET_MSR ","FL:D:/TempleOS/Kernel/Utils1a.CPP.Z,318"$0000003186 0001 ExportSysSym -$LK,"_SIGN ","FL:D:/TempleOS/Kernel/Math1a.CPP.Z,329"$00000034BB 0001 ExportSysSym -$LK,"_SQR ","FL:D:/TempleOS/Kernel/Math1a.CPP.Z,320"$00000034A7 0000 ExportSysSym -$LK,"_STRCAT ","FL:D:/TempleOS/Kernel/Str1a.CPP.Z,71"$000000B226 0001 ExportSysSym -$LK,"_STRCMP ","FL:D:/TempleOS/Kernel/Str1a.CPP.Z,106"$000000B265 0001 ExportSysSym -$LK,"_STRCPY ","FL:D:/TempleOS/Kernel/Str1a.CPP.Z,91"$000000B24B 0001 ExportSysSym -$LK,"_STRICMP ","FL:D:/TempleOS/Kernel/Str1a.CPP.Z,138"$000000B2A5 0001 ExportSysSym -$LK,"_STRISTR ","FL:D:/TempleOS/Kernel/Str1a.CPP.Z,283"$000000B3F3 0001 ExportSysSym -$LK,"_STRNCMP ","FL:D:/TempleOS/Kernel/Str1a.CPP.Z,175"$000000B2FA 0001 ExportSysSym -$LK,"_STRNICMP ","FL:D:/TempleOS/Kernel/Str1a.CPP.Z,204"$000000B33E 0001 ExportSysSym -$LK,"_STRSTR ","FL:D:/TempleOS/Kernel/Str1a.CPP.Z,244"$000000B39C 0001 ExportSysSym -$LK,"_SYS_HLT ","FL:D:/TempleOS/Kernel/Utils1a.CPP.Z,327"$00000031A0 0005 ExportSysSym -$LK,"_TAKE_EXCEPT ","FL:D:/TempleOS/Kernel/Except.CPP.Z,34"$0000014FC9 0001 ExportSysSym -$LK,"_TEST_EXCEPT ","FL:D:/TempleOS/Kernel/Except.CPP.Z,18"$0000014F92 0001 ExportSysSym -$LK,"_TRUNC ","FL:D:/TempleOS/Kernel/Math1a.CPP.Z,378"$0000003541 0001 ExportSysSym -$LK,"_XCHG_U16 ","FL:D:/TempleOS/Kernel/Utils1a.CPP.Z,76"$0000002F67 0001 ExportSysSym -$LK,"_XCHG_U32 ","FL:D:/TempleOS/Kernel/Utils1a.CPP.Z,69"$0000002F56 0001 ExportSysSym -$LK,"_XCHG_U64 ","FL:D:/TempleOS/Kernel/Utils1a.CPP.Z,62"$0000002F43 0001 ExportSysSym -$LK,"_XCHG_U8 ","FL:D:/TempleOS/Kernel/Utils1a.CPP.Z,83"$0000002F7B 0001 ExportSysSym -$LK,"adam_task ","FL:D:/TempleOS/Kernel/KGlbls.CPP.Z,14"$0000003918 0018 0000000008 GlbVar -$LK,"alpha_bitmap ","FL:D:/TempleOS/Kernel/Str1a.CPP.Z,342"$000000B464 0000 0000000040 GlbVar -$LK,"alpha_numeric_bitmap ","FL:D:/TempleOS/Kernel/Str1a.CPP.Z,345"$000000B4A4 0002 0000000040 GlbVar -$LK,"alpha_numeric_no_at_bitmap","FL:D:/TempleOS/Kernel/Str1a.CPP.Z,348"$000000B4E4 0000 0000000040 GlbVar -$LK,"ans ","FL:D:/TempleOS/Kernel/Adam1a.HPP,3151"$(Fs->answe 0000 0000000018 DefineStr -$LK,"ans0 ","FL:D:/TempleOS/Kernel/Adam1a.HPP,3152"$(Fs->answe 0000 0000000018 DefineStr -$LK,"ans1 ","FL:D:/TempleOS/Kernel/Adam1a.HPP,3153"$(Fs->answe 0000 0000000018 DefineStr -$LK,"ans2 ","FL:D:/TempleOS/Kernel/Adam1a.HPP,3154"$(Fs->answe 0000 0000000018 DefineStr -$LK,"ans3 ","FL:D:/TempleOS/Kernel/Adam1a.HPP,3155"$(Fs->answe 0000 0000000018 DefineStr -$LK,"ansf ","FL:D:/TempleOS/Kernel/Adam1a.HPP,3157"$(Fs->answe 0000 0000000018 DefineStr -$LK,"ansf0 ","FL:D:/TempleOS/Kernel/Adam1a.HPP,3158"$(Fs->answe 0000 0000000018 DefineStr -$LK,"ansf1 ","FL:D:/TempleOS/Kernel/Adam1a.HPP,3159"$(Fs->answe 0000 0000000018 DefineStr -$LK,"ansf2 ","FL:D:/TempleOS/Kernel/Adam1a.HPP,3160"$(Fs->answe 0000 0000000018 DefineStr -$LK,"ansf3 ","FL:D:/TempleOS/Kernel/Adam1a.HPP,3161"$(Fs->answe 0000 0000000018 DefineStr +$LK,"_ARC_GET_ENTRY ","FL:D:/TempleOS/Kernel/Compress.CPP.Z,44"$00000076C8 0001 ExportSysSym +$LK,"_ARG ","FL:D:/TempleOS/Kernel/Math1a.CPP.Z,347"$00000035DA 0001 ExportSysSym +$LK,"_ATTR_ARCHIVE ","FL:D:/TempleOS/Kernel/Adam1a.HPP,3523"$0x20 0008 0000000008 DefineStr +$LK,"_ATTR_COMPRESSED ","FL:D:/TempleOS/Kernel/Adam1a.HPP,3529"$0x800 000A 0000000008 DefineStr +$LK,"_ATTR_CONTIGUOUS ","FL:D:/TempleOS/Kernel/Adam1a.HPP,3530"$0x1000 000C 0000000008 DefineStr +$LK,"_ATTR_DELETED ","FL:D:/TempleOS/Kernel/Adam1a.HPP,3526"$0x100 0006 0000000008 DefineStr +$LK,"_ATTR_DIR ","FL:D:/TempleOS/Kernel/Adam1a.HPP,3522"$0x10 0029 0000000008 DefineStr +$LK,"_ATTR_ENCRYPTED ","FL:D:/TempleOS/Kernel/Adam1a.HPP,3527"$0x200 0000 0000000008 DefineStr +$LK,"_ATTR_FIXED ","FL:D:/TempleOS/Kernel/Adam1a.HPP,3531"$0x2000 0000 0000000008 DefineStr +$LK,"_ATTR_HIDDEN ","FL:D:/TempleOS/Kernel/Adam1a.HPP,3519"$0x02 0012 0000000008 DefineStr +$LK,"_ATTR_LONG_NAME ","FL:D:/TempleOS/Kernel/Adam1a.HPP,3524"$(_ATTR_REA 0012 0000000040 DefineStr +$LK,"_ATTR_LONG_NAME_MASK ","FL:D:/TempleOS/Kernel/Adam1a.HPP,3525"$(_ATTR_LON 0008 0000000030 DefineStr +$LK,"_ATTR_READ_ONLY ","FL:D:/TempleOS/Kernel/Adam1a.HPP,3518"$0x01 0012 0000000008 DefineStr +$LK,"_ATTR_RESIDENT ","FL:D:/TempleOS/Kernel/Adam1a.HPP,3528"$0x400 0003 0000000008 DefineStr +$LK,"_ATTR_SYSTEM ","FL:D:/TempleOS/Kernel/Adam1a.HPP,3520"$0x04 0012 0000000008 DefineStr +$LK,"_ATTR_VOL_ID ","FL:D:/TempleOS/Kernel/Adam1a.HPP,3521"$0x08 0016 0000000008 DefineStr +$LK,"_BEQU ","FL:D:/TempleOS/Kernel/Utils1a.CPP.Z,91"$0000002F28 0001 ExportSysSym +$LK,"_BIT_FIELD_EXTRACT_U32 ","FL:D:/TempleOS/Kernel/Utils1a.CPP.Z,169"$0000002FF4 0001 ExportSysSym +$LK,"_BIT_FIELD_OR_U32 ","FL:D:/TempleOS/Kernel/Utils1a.CPP.Z,156"$0000002FCF 0001 ExportSysSym +$LK,"_CALL ","FL:D:/TempleOS/Kernel/Utils1a.CPP.Z,147"$0000002FBC 0001 ExportSysSym +$LK,"_CALLEXTNUM ","FL:D:/TempleOS/Kernel/Utils1a.CPP.Z,356"$00000031B2 0001 ExportSysSym +$LK,"_CALLEXTSTR ","FL:D:/TempleOS/Kernel/Utils1a.CPP.Z,386"$00000031F7 0001 ExportSysSym +$LK,"_CALLIND ","FL:D:/TempleOS/Kernel/Utils1a.CPP.Z,328"$0000003178 0001 ExportSysSym +$LK,"_CEIL ","FL:D:/TempleOS/Kernel/Math1a.CPP.Z,415"$0000003684 0001 ExportSysSym +$LK,"_CFG_HEAP_DBG ","FL:D:/TempleOS/Kernel/Adam1a.HPP,2649"$FALSE 0005 0000000008 DefineStr +$LK,"_CPUID ","FL:D:/TempleOS/Kernel/Utils1a.CPP.Z,314"$0000003154 0001 ExportSysSym +$LK,"_D3_ADD ","FL:D:/TempleOS/Kernel/Math1a.CPP.Z,126"$00000033A6 0001 ExportSysSym +$LK,"_D3_ADD_EQU ","FL:D:/TempleOS/Kernel/Math1a.CPP.Z,227"$00000034AE 0001 ExportSysSym +$LK,"_D3_COPY ","FL:D:/TempleOS/Kernel/Math1a.CPP.Z,202"$0000003465 0001 ExportSysSym +$LK,"_D3_CROSS ","FL:D:/TempleOS/Kernel/Math1a.CPP.Z,79"$0000003339 0001 ExportSysSym +$LK,"_D3_DIST ","FL:D:/TempleOS/Kernel/Math1a.CPP.Z,38"$00000032D5 0001 ExportSysSym +$LK,"_D3_DIV ","FL:D:/TempleOS/Kernel/Math1a.CPP.Z,176"$0000003425 0001 ExportSysSym +$LK,"_D3_DIV_EQU ","FL:D:/TempleOS/Kernel/Math1a.CPP.Z,274"$0000003521 0001 ExportSysSym +$LK,"_D3_DOT ","FL:D:/TempleOS/Kernel/Math1a.CPP.Z,109"$000000337B 0001 ExportSysSym +$LK,"_D3_EQU ","FL:D:/TempleOS/Kernel/Math1a.CPP.Z,215"$000000348B 0001 ExportSysSym +$LK,"_D3_MUL ","FL:D:/TempleOS/Kernel/Math1a.CPP.Z,160"$00000033FE 0001 ExportSysSym +$LK,"_D3_MUL_EQU ","FL:D:/TempleOS/Kernel/Math1a.CPP.Z,259"$00000034FE 0001 ExportSysSym +$LK,"_D3_NORM ","FL:D:/TempleOS/Kernel/Math1a.CPP.Z,5"$0000003289 0001 ExportSysSym +$LK,"_D3_SQR_DIST ","FL:D:/TempleOS/Kernel/Math1a.CPP.Z,59"$0000003308 0001 ExportSysSym +$LK,"_D3_SQR_NORM ","FL:D:/TempleOS/Kernel/Math1a.CPP.Z,22"$00000032B0 0001 ExportSysSym +$LK,"_D3_SUB ","FL:D:/TempleOS/Kernel/Math1a.CPP.Z,143"$00000033D2 0001 ExportSysSym +$LK,"_D3_SUB_EQU ","FL:D:/TempleOS/Kernel/Math1a.CPP.Z,243"$00000034D6 0001 ExportSysSym +$LK,"_D3_UNIT ","FL:D:/TempleOS/Kernel/Math1a.CPP.Z,289"$0000003544 0001 ExportSysSym +$LK,"_D3_ZERO ","FL:D:/TempleOS/Kernel/Math1a.CPP.Z,192"$000000344C 0001 ExportSysSym +$LK,"_EXP ","FL:D:/TempleOS/Kernel/Math1a.CPP.Z,525"$00000037A7 0001 ExportSysSym +$LK,"_EXT_FIND ","FL:D:/TempleOS/Kernel/Hash1a.CPP.Z,217"$0000007EF4 0000 ExportSysSym +$LK,"_FAR_CALL32 ","FL:D:/TempleOS/Kernel/BIOS32.CPP.Z,72"$000001BBF7 0001 ExportSysSym +$LK,"_FCLEX ","FL:D:/TempleOS/Kernel/Math1a.CPP.Z,605"$0000003855 0001 ExportSysSym +$LK,"_FLDCW ","FL:D:/TempleOS/Kernel/Math1a.CPP.Z,587"$0000003837 0001 ExportSysSym +$LK,"_FLOOR ","FL:D:/TempleOS/Kernel/Math1a.CPP.Z,396"$0000003653 0001 ExportSysSym +$LK,"_FREE ","FL:D:/TempleOS/Kernel/Memory.CPP.Z,793"$0000005F1F 0001 ExportSysSym +$LK,"_FSTCW ","FL:D:/TempleOS/Kernel/Math1a.CPP.Z,593"$0000003842 0001 ExportSysSym +$LK,"_FSTSW ","FL:D:/TempleOS/Kernel/Math1a.CPP.Z,600"$0000003850 0001 ExportSysSym +$LK,"_FXRSTOR ","FL:D:/TempleOS/Kernel/Math1a.CPP.Z,616"$0000003869 0001 ExportSysSym +$LK,"_FXSAVE ","FL:D:/TempleOS/Kernel/Math1a.CPP.Z,609"$0000003859 0001 ExportSysSym +$LK,"_HASH_ADD ","FL:D:/TempleOS/Kernel/Hash1a.CPP.Z,288"$0000007FA9 0001 ExportSysSym +$LK,"_HASH_ADD_AFTER ","FL:D:/TempleOS/Kernel/Hash1a.CPP.Z,316"$0000007FEA 0000 ExportSysSym +$LK,"_HASH_BUCKET_FIND ","FL:D:/TempleOS/Kernel/Hash1a.CPP.Z,276"$0000007F90 0001 ExportSysSym +$LK,"_HASH_FIND ","FL:D:/TempleOS/Kernel/Hash1a.CPP.Z,247"$0000007F49 0001 ExportSysSym +$LK,"_HASH_REM_DEL ","FL:D:/TempleOS/Kernel/Hash1a.CPP.Z,397"$00000080B4 0001 ExportSysSym +$LK,"_HASH_REPLACE ","FL:D:/TempleOS/Kernel/Hash1a.CPP.Z,340"$0000008020 0001 ExportSysSym +$LK,"_HASH_SINGLE_TABLE_FIND ","FL:D:/TempleOS/Kernel/Hash1a.CPP.Z,261"$0000007F6A 0001 ExportSysSym +$LK,"_HASH_STR ","FL:D:/TempleOS/Kernel/Hash1a.CPP.Z,238"$0000007F36 0001 ExportSysSym +$LK,"_LBEQU ","FL:D:/TempleOS/Kernel/Utils1a.CPP.Z,106"$0000002F4F 0001 ExportSysSym +$LK,"_LIMIT_I64 ","FL:D:/TempleOS/Kernel/Utils1a.CPP.Z,123"$0000002F78 0001 ExportSysSym +$LK,"_LIMIT_U64 ","FL:D:/TempleOS/Kernel/Utils1a.CPP.Z,135"$0000002F9A 0001 ExportSysSym +$LK,"_LN ","FL:D:/TempleOS/Kernel/Math1a.CPP.Z,577"$0000003821 0001 ExportSysSym +$LK,"_LOG10 ","FL:D:/TempleOS/Kernel/Math1a.CPP.Z,557"$00000037F5 0001 ExportSysSym +$LK,"_LOG2 ","FL:D:/TempleOS/Kernel/Math1a.CPP.Z,567"$000000380B 0001 ExportSysSym +$LK,"_LXCHG_U16 ","FL:D:/TempleOS/Kernel/Utils1a.CPP.Z,231"$0000003099 0001 ExportSysSym +$LK,"_LXCHG_U32 ","FL:D:/TempleOS/Kernel/Utils1a.CPP.Z,223"$0000003087 0001 ExportSysSym +$LK,"_LXCHG_U64 ","FL:D:/TempleOS/Kernel/Utils1a.CPP.Z,215"$0000003073 0001 ExportSysSym +$LK,"_LXCHG_U8 ","FL:D:/TempleOS/Kernel/Utils1a.CPP.Z,239"$00000030AE 0001 ExportSysSym +$LK,"_MALLOC ","FL:D:/TempleOS/Kernel/Memory.CPP.Z,588"$0000005D77 0001 ExportSysSym +$LK,"_MEMCMP ","FL:D:/TempleOS/Kernel/Utils1a.CPP.Z,72"$0000002EFE 0001 ExportSysSym +$LK,"_MEMCPY ","FL:D:/TempleOS/Kernel/Utils1a.CPP.Z,57"$0000002EE0 0001 ExportSysSym +$LK,"_MEMSET ","FL:D:/TempleOS/Kernel/Utils1a.CPP.Z,5"$0000002E6D 0002 ExportSysSym +$LK,"_MEMSET_U16 ","FL:D:/TempleOS/Kernel/Utils1a.CPP.Z,18"$0000002E89 0001 ExportSysSym +$LK,"_MEMSET_U32 ","FL:D:/TempleOS/Kernel/Utils1a.CPP.Z,31"$0000002EA6 0001 ExportSysSym +$LK,"_MEMSET_U64 ","FL:D:/TempleOS/Kernel/Utils1a.CPP.Z,44"$0000002EC2 0001 ExportSysSym +$LK,"_MHEAP_CTRL ","FL:D:/TempleOS/Kernel/Memory.CPP.Z,936"$0000006031 0001 ExportSysSym +$LK,"_MSIZE ","FL:D:/TempleOS/Kernel/Memory.CPP.Z,907"$0000005FE7 0001 ExportSysSym +$LK,"_MSIZE2 ","FL:D:/TempleOS/Kernel/Memory.CPP.Z,922"$000000600E 0001 ExportSysSym +$LK,"_POW ","FL:D:/TempleOS/Kernel/Math1a.CPP.Z,485"$0000003744 0001 ExportSysSym +$LK,"_POW10 ","FL:D:/TempleOS/Kernel/Math1a.CPP.Z,493"$0000003759 0001 ExportSysSym +$LK,"_R10 ","FL:D:/TempleOS/Kernel/Adam1a.HPP,3652"$Fs->r10 0000 0000000008 DefineStr +$LK,"_R11 ","FL:D:/TempleOS/Kernel/Adam1a.HPP,3653"$Fs->r11 0000 0000000008 DefineStr +$LK,"_R12 ","FL:D:/TempleOS/Kernel/Adam1a.HPP,3654"$Fs->r12 0000 0000000008 DefineStr +$LK,"_R13 ","FL:D:/TempleOS/Kernel/Adam1a.HPP,3655"$Fs->r13 0000 0000000008 DefineStr +$LK,"_R14 ","FL:D:/TempleOS/Kernel/Adam1a.HPP,3656"$Fs->r14 0000 0000000008 DefineStr +$LK,"_R15 ","FL:D:/TempleOS/Kernel/Adam1a.HPP,3657"$Fs->r15 0000 0000000008 DefineStr +$LK,"_R8 ","FL:D:/TempleOS/Kernel/Adam1a.HPP,3650"$Fs->r8 0000 0000000008 DefineStr +$LK,"_R9 ","FL:D:/TempleOS/Kernel/Adam1a.HPP,3651"$Fs->r9 0000 0000000008 DefineStr +$LK,"_RAX ","FL:D:/TempleOS/Kernel/Adam1a.HPP,3641"$Fs->rax 0000 0000000008 DefineStr +$LK,"_RBP ","FL:D:/TempleOS/Kernel/Adam1a.HPP,3647"$Fs->rbp 0000 0000000008 DefineStr +$LK,"_RBX ","FL:D:/TempleOS/Kernel/Adam1a.HPP,3642"$Fs->rbx 0000 0000000008 DefineStr +$LK,"_RCX ","FL:D:/TempleOS/Kernel/Adam1a.HPP,3643"$Fs->rcx 0000 0000000008 DefineStr +$LK,"_RDI ","FL:D:/TempleOS/Kernel/Adam1a.HPP,3646"$Fs->rdi 0000 0000000008 DefineStr +$LK,"_RDX ","FL:D:/TempleOS/Kernel/Adam1a.HPP,3644"$Fs->rdx 0000 0000000008 DefineStr +$LK,"_REP_IN_U16 ","FL:D:/TempleOS/Kernel/Utils1a.CPP.Z,259"$00000030DA 0001 ExportSysSym +$LK,"_REP_IN_U32 ","FL:D:/TempleOS/Kernel/Utils1a.CPP.Z,248"$00000030C2 0001 ExportSysSym +$LK,"_REP_IN_U8 ","FL:D:/TempleOS/Kernel/Utils1a.CPP.Z,270"$00000030F3 0001 ExportSysSym +$LK,"_REP_OUT_U16 ","FL:D:/TempleOS/Kernel/Utils1a.CPP.Z,292"$0000003123 0001 ExportSysSym +$LK,"_REP_OUT_U32 ","FL:D:/TempleOS/Kernel/Utils1a.CPP.Z,281"$000000310B 0001 ExportSysSym +$LK,"_REP_OUT_U8 ","FL:D:/TempleOS/Kernel/Utils1a.CPP.Z,303"$000000313C 0001 ExportSysSym +$LK,"_RIP ","FL:D:/TempleOS/Kernel/Adam1a.HPP,3649"$Fs->rip 0000 0000000008 DefineStr +$LK,"_ROUND ","FL:D:/TempleOS/Kernel/Math1a.CPP.Z,360"$00000035F9 0001 ExportSysSym +$LK,"_RSI ","FL:D:/TempleOS/Kernel/Adam1a.HPP,3645"$Fs->rsi 0000 0000000008 DefineStr +$LK,"_RSP ","FL:D:/TempleOS/Kernel/Adam1a.HPP,3648"$Fs->rsp 0000 0000000008 DefineStr +$LK,"_SAVE_EXCEPT_REGS ","FL:D:/TempleOS/Kernel/Except.CPP.Z,40"$0000015003 0001 ExportSysSym +$LK,"_SET_GS_BASE ","FL:D:/TempleOS/Kernel/Utils1a.CPP.Z,414"$0000003234 0004 ExportSysSym +$LK,"_SET_MSR ","FL:D:/TempleOS/Kernel/Utils1a.CPP.Z,442"$000000326B 0001 ExportSysSym +$LK,"_SIGN ","FL:D:/TempleOS/Kernel/Math1a.CPP.Z,329"$00000035A0 0001 ExportSysSym +$LK,"_SQR ","FL:D:/TempleOS/Kernel/Math1a.CPP.Z,320"$000000358C 0000 ExportSysSym +$LK,"_STRCAT ","FL:D:/TempleOS/Kernel/Str1a.CPP.Z,71"$000000B44C 0001 ExportSysSym +$LK,"_STRCMP ","FL:D:/TempleOS/Kernel/Str1a.CPP.Z,106"$000000B48B 0001 ExportSysSym +$LK,"_STRCPY ","FL:D:/TempleOS/Kernel/Str1a.CPP.Z,91"$000000B471 0001 ExportSysSym +$LK,"_STRICMP ","FL:D:/TempleOS/Kernel/Str1a.CPP.Z,138"$000000B4CB 0001 ExportSysSym +$LK,"_STRISTR ","FL:D:/TempleOS/Kernel/Str1a.CPP.Z,283"$000000B619 0001 ExportSysSym +$LK,"_STRNCMP ","FL:D:/TempleOS/Kernel/Str1a.CPP.Z,175"$000000B520 0001 ExportSysSym +$LK,"_STRNICMP ","FL:D:/TempleOS/Kernel/Str1a.CPP.Z,204"$000000B564 0001 ExportSysSym +$LK,"_STRSTR ","FL:D:/TempleOS/Kernel/Str1a.CPP.Z,244"$000000B5C2 0001 ExportSysSym +$LK,"_SYS_HLT ","FL:D:/TempleOS/Kernel/Utils1a.CPP.Z,451"$0000003285 0005 ExportSysSym +$LK,"_TAKE_EXCEPT ","FL:D:/TempleOS/Kernel/Except.CPP.Z,34"$0000014FF1 0001 ExportSysSym +$LK,"_TEST_EXCEPT ","FL:D:/TempleOS/Kernel/Except.CPP.Z,18"$0000014FBA 0001 ExportSysSym +$LK,"_TRUNC ","FL:D:/TempleOS/Kernel/Math1a.CPP.Z,378"$0000003626 0001 ExportSysSym +$LK,"_XCHG_U16 ","FL:D:/TempleOS/Kernel/Utils1a.CPP.Z,200"$000000304C 0001 ExportSysSym +$LK,"_XCHG_U32 ","FL:D:/TempleOS/Kernel/Utils1a.CPP.Z,193"$000000303B 0001 ExportSysSym +$LK,"_XCHG_U64 ","FL:D:/TempleOS/Kernel/Utils1a.CPP.Z,186"$0000003028 0001 ExportSysSym +$LK,"_XCHG_U8 ","FL:D:/TempleOS/Kernel/Utils1a.CPP.Z,207"$0000003060 0001 ExportSysSym +$LK,"adam_task ","FL:D:/TempleOS/Kernel/KGlbls.CPP.Z,13"$0000003A28 001A 0000000008 GlbVar +$LK,"alpha_bitmap ","FL:D:/TempleOS/Kernel/Str1a.CPP.Z,342"$000000B68C 0000 0000000040 GlbVar +$LK,"alpha_numeric_bitmap ","FL:D:/TempleOS/Kernel/Str1a.CPP.Z,345"$000000B6CC 0002 0000000040 GlbVar +$LK,"alpha_numeric_no_at_bitmap","FL:D:/TempleOS/Kernel/Str1a.CPP.Z,348"$000000B70C 0000 0000000040 GlbVar +$LK,"ans ","FL:D:/TempleOS/Kernel/Adam1a.HPP,3167"$(Fs->answe 0000 0000000018 DefineStr +$LK,"ans0 ","FL:D:/TempleOS/Kernel/Adam1a.HPP,3168"$(Fs->answe 0000 0000000018 DefineStr +$LK,"ans1 ","FL:D:/TempleOS/Kernel/Adam1a.HPP,3169"$(Fs->answe 0000 0000000018 DefineStr +$LK,"ans2 ","FL:D:/TempleOS/Kernel/Adam1a.HPP,3170"$(Fs->answe 0000 0000000018 DefineStr +$LK,"ans3 ","FL:D:/TempleOS/Kernel/Adam1a.HPP,3171"$(Fs->answe 0000 0000000018 DefineStr +$LK,"ansf ","FL:D:/TempleOS/Kernel/Adam1a.HPP,3173"$(Fs->answe 0000 0000000018 DefineStr +$LK,"ansf0 ","FL:D:/TempleOS/Kernel/Adam1a.HPP,3174"$(Fs->answe 0000 0000000018 DefineStr +$LK,"ansf1 ","FL:D:/TempleOS/Kernel/Adam1a.HPP,3175"$(Fs->answe 0000 0000000018 DefineStr +$LK,"ansf2 ","FL:D:/TempleOS/Kernel/Adam1a.HPP,3176"$(Fs->answe 0000 0000000018 DefineStr +$LK,"ansf3 ","FL:D:/TempleOS/Kernel/Adam1a.HPP,3177"$(Fs->answe 0000 0000000018 DefineStr $LK,"bios_gr_mode ","FL:D:/TempleOS/Kernel/Adam1b.HPP,28"$0000000C60 0003 0000000002 GlbVar -$LK,"boot_drv_pmt ","FL:D:/TempleOS/Kernel/KGlbls.CPP.Z,46"$00000039FB 0002 0000000001 GlbVar -$LK,"c32_eax ","FL:D:/TempleOS/Kernel/BIOS32.CPP.Z,160"$000001B99B 0008 0000000004 GlbVar -$LK,"c32_ebx ","FL:D:/TempleOS/Kernel/BIOS32.CPP.Z,161"$000001B99F 0009 0000000004 GlbVar -$LK,"c32_ecx ","FL:D:/TempleOS/Kernel/BIOS32.CPP.Z,162"$000001B9A3 0007 0000000004 GlbVar -$LK,"c32_edi ","FL:D:/TempleOS/Kernel/BIOS32.CPP.Z,165"$000001B9AF 0006 0000000004 GlbVar -$LK,"c32_edx ","FL:D:/TempleOS/Kernel/BIOS32.CPP.Z,163"$000001B9A7 0000 0000000004 GlbVar -$LK,"c32_eflags ","FL:D:/TempleOS/Kernel/BIOS32.CPP.Z,166"$000001B9B3 0000 0000000004 GlbVar -$LK,"c32_esi ","FL:D:/TempleOS/Kernel/BIOS32.CPP.Z,164"$000001B9AB 0001 0000000004 GlbVar -$LK,"cpu_structs ","FL:D:/TempleOS/Kernel/Adam1b.HPP,191"$0000002350 000C 0000000008 GlbVar -$LK,"ctrl_alt_let_descs ","FL:D:/TempleOS/Kernel/KGlbls.CPP.Z,54"$0000003B30 0003 0000000008 GlbVar -$LK,"ctrl_alt_let_in_irq_flags ","FL:D:/TempleOS/Kernel/KGlbls.CPP.Z,52"$0000003B20 0004 0000000008 GlbVar -$LK,"ctrl_alt_let_ret_addr ","FL:D:/TempleOS/Kernel/KGlbls.CPP.Z,52"$0000003B28 0002 0000000008 GlbVar -$LK,"date_fmt_map ","FL:D:/TempleOS/Kernel/KGlbls.CPP.Z,140"$0000003EE8 0003 0000000008 GlbVar -$LK,"dec_numeric_bitmap ","FL:D:/TempleOS/Kernel/Str1a.CPP.Z,357"$000000B5A4 0003 0000000040 GlbVar -$LK,"dft_drv ","FL:HOME/Temp.TXT.Z,1"$00000039F8 0005 0000000001 GlbVar -$LK,"displayable_chars_bitmap ","FL:D:/TempleOS/Kernel/Str1a.CPP.Z,384"$000000B7E4 0001 0000000040 GlbVar -$LK,"drv_to_prt ","FL:D:/TempleOS/Kernel/KGlbls.CPP.Z,48"$0000003A00 0003 0000000100 GlbVar +$LK,"boot_drv_pmt ","FL:D:/TempleOS/Kernel/KGlbls.CPP.Z,45"$0000003B0A 0002 0000000001 GlbVar +$LK,"c32_eax ","FL:D:/TempleOS/Kernel/BIOS32.CPP.Z,160"$000001BBD3 0008 0000000004 GlbVar +$LK,"c32_ebx ","FL:D:/TempleOS/Kernel/BIOS32.CPP.Z,161"$000001BBD7 0009 0000000004 GlbVar +$LK,"c32_ecx ","FL:D:/TempleOS/Kernel/BIOS32.CPP.Z,162"$000001BBDB 0007 0000000004 GlbVar +$LK,"c32_edi ","FL:D:/TempleOS/Kernel/BIOS32.CPP.Z,165"$000001BBE7 0006 0000000004 GlbVar +$LK,"c32_edx ","FL:D:/TempleOS/Kernel/BIOS32.CPP.Z,163"$000001BBDF 0000 0000000004 GlbVar +$LK,"c32_eflags ","FL:D:/TempleOS/Kernel/BIOS32.CPP.Z,166"$000001BBEB 0000 0000000004 GlbVar +$LK,"c32_esi ","FL:D:/TempleOS/Kernel/BIOS32.CPP.Z,164"$000001BBE3 0001 0000000004 GlbVar +$LK,"cdrom_boot_is_good ","FL:D:/TempleOS/Kernel/KGlbls.CPP.Z,45"$0000003B0B 0002 0000000001 GlbVar +$LK,"cpu_structs ","FL:D:/TempleOS/Kernel/Adam1b.HPP,191"$0000002360 000C 0000000008 GlbVar +$LK,"ctrl_alt_let_descs ","FL:D:/TempleOS/Kernel/KGlbls.CPP.Z,53"$0000003C40 0003 0000000008 GlbVar +$LK,"ctrl_alt_let_in_irq_flags ","FL:D:/TempleOS/Kernel/KGlbls.CPP.Z,51"$0000003C30 0004 0000000008 GlbVar +$LK,"ctrl_alt_let_ret_addr ","FL:D:/TempleOS/Kernel/KGlbls.CPP.Z,51"$0000003C38 0002 0000000008 GlbVar +$LK,"date_fmt_map ","FL:D:/TempleOS/Kernel/KGlbls.CPP.Z,135"$0000003FD8 0003 0000000008 GlbVar +$LK,"dec_numeric_bitmap ","FL:D:/TempleOS/Kernel/Str1a.CPP.Z,357"$000000B7CC 0003 0000000040 GlbVar +$LK,"displayable_chars_bitmap ","FL:D:/TempleOS/Kernel/Str1a.CPP.Z,384"$000000BA0C 0001 0000000040 GlbVar +$LK,"drv_to_prt ","FL:D:/TempleOS/Kernel/KGlbls.CPP.Z,47"$0000003B10 0003 0000000100 GlbVar $LK,"eps ","FL:D:/TempleOS/Kernel/Adam1a.HPP,139"$(0x3CB0000 0000 0000000020 DefineStr $LK,"exp_1 ","FL:D:/TempleOS/Kernel/Adam1a.HPP,132"$(0x4005BF0 0000 0000000020 DefineStr -$LK,"ext ","FL:D:/TempleOS/Kernel/Adam1b.HPP,295"$0000001840 0003 0000000008 GlbVar -$LK,"fat_long_name_map ","FL:D:/TempleOS/Kernel/Dsk/FileSysFAT.CPP.Z,185"$000002708D 0006 000000000D GlbVar -$LK,"filename_chars_bitmap ","FL:D:/TempleOS/Kernel/Str1a.CPP.Z,354"$000000B564 0002 0000000040 GlbVar -$LK,"fp_ctrl_alt_let_cbs ","FL:D:/TempleOS/Kernel/KGlbls.CPP.Z,51"$0000003B18 0006 0000000008 GlbVar -$LK,"fp_doc_cur ","FL:D:/TempleOS/Kernel/KGlbls.CPP.Z,134"$0000003EC8 0002 0000000008 GlbVar -$LK,"fp_mgets ","FL:D:/TempleOS/Kernel/KGlbls.CPP.Z,131"$0000003EB0 0005 0000000008 GlbVar -$LK,"fp_prs_stream_blk ","FL:D:/TempleOS/Kernel/KGlbls.CPP.Z,132"$0000003EB8 0000 0000000008 GlbVar -$LK,"fp_set_std_palette ","FL:D:/TempleOS/Kernel/KGlbls.CPP.Z,135"$0000003ED0 0002 0000000008 GlbVar -$LK,"fp_snd ","FL:D:/TempleOS/Kernel/KGlbls.CPP.Z,127"$0000003E90 0003 0000000008 GlbVar -$LK,"fp_snd_copy_buf ","FL:D:/TempleOS/Kernel/KGlbls.CPP.Z,130"$0000003EA8 0000 0000000008 GlbVar -$LK,"fp_snd_fill_buf ","FL:D:/TempleOS/Kernel/KGlbls.CPP.Z,129"$0000003EA0 0000 0000000008 GlbVar -$LK,"fp_snd_record ","FL:D:/TempleOS/Kernel/KGlbls.CPP.Z,128"$0000003E98 0002 0000000008 GlbVar -$LK,"fp_update_ctrls ","FL:D:/TempleOS/Kernel/KGlbls.CPP.Z,133"$0000003EC0 0002 0000000008 GlbVar -$LK,"getkey_chars_bitmap ","FL:D:/TempleOS/Kernel/Str1a.CPP.Z,378"$000000B764 0001 0000000040 GlbVar -$LK,"gr_font ","FL:D:/TempleOS/Kernel/KGlbls.CPP.Z,27"$0000003998 0002 0000000008 GlbVar -$LK,"gr_height ","FL:D:/TempleOS/Kernel/KGlbls.CPP.Z,26"$0000003990 000F 0000000008 GlbVar -$LK,"gr_width ","FL:D:/TempleOS/Kernel/KGlbls.CPP.Z,25"$0000003988 0014 0000000008 GlbVar -$LK,"hex_digits ","FL:D:/TempleOS/Kernel/Str1a.CPP.Z,1"$000000B0EC 0001 0000000010 GlbVar -$LK,"hex_numeric_bitmap ","FL:D:/TempleOS/Kernel/Str1a.CPP.Z,360"$000000B5E4 0001 0000000040 GlbVar -$LK,"hint_ata_disable ","FL:D:/TempleOS/Kernel/Dsk/DskATA.CPP.Z,777"$000001F24C 0003 0000000001 GlbVar +$LK,"ext ","FL:D:/TempleOS/Kernel/Adam1b.HPP,295"$0000001850 0003 0000000008 GlbVar +$LK,"fat_long_name_map ","FL:D:/TempleOS/Kernel/Dsk/FileSysFAT.CPP.Z,188"$00000271FB 0006 000000000D GlbVar +$LK,"filename_chars_bitmap ","FL:D:/TempleOS/Kernel/Str1a.CPP.Z,354"$000000B78C 0002 0000000040 GlbVar +$LK,"fp_ctrl_alt_let_cbs ","FL:D:/TempleOS/Kernel/KGlbls.CPP.Z,50"$0000003C28 0006 0000000008 GlbVar +$LK,"fp_doc_put ","FL:D:/TempleOS/Kernel/KGlbls.CPP.Z,129"$0000003FB8 0002 0000000008 GlbVar +$LK,"fp_mgets ","FL:D:/TempleOS/Kernel/KGlbls.CPP.Z,126"$0000003FA0 0005 0000000008 GlbVar +$LK,"fp_prs_stream_blk ","FL:D:/TempleOS/Kernel/KGlbls.CPP.Z,127"$0000003FA8 0000 0000000008 GlbVar +$LK,"fp_set_std_palette ","FL:D:/TempleOS/Kernel/KGlbls.CPP.Z,130"$0000003FC0 0002 0000000008 GlbVar +$LK,"fp_update_ctrls ","FL:D:/TempleOS/Kernel/KGlbls.CPP.Z,128"$0000003FB0 0002 0000000008 GlbVar +$LK,"getkey_chars_bitmap ","FL:D:/TempleOS/Kernel/Str1a.CPP.Z,378"$000000B98C 0001 0000000040 GlbVar +$LK,"gr_font ","FL:D:/TempleOS/Kernel/KGlbls.CPP.Z,26"$0000003AA8 0002 0000000008 GlbVar +$LK,"gr_height ","FL:D:/TempleOS/Kernel/KGlbls.CPP.Z,25"$0000003AA0 000F 0000000008 GlbVar +$LK,"gr_width ","FL:D:/TempleOS/Kernel/KGlbls.CPP.Z,24"$0000003A98 0014 0000000008 GlbVar +$LK,"hex_digits ","FL:D:/TempleOS/Kernel/Str1a.CPP.Z,1"$000000B312 0001 0000000010 GlbVar +$LK,"hex_numeric_bitmap ","FL:D:/TempleOS/Kernel/Str1a.CPP.Z,360"$000000B80C 0001 0000000040 GlbVar $LK,"inf ","FL:D:/TempleOS/Kernel/Adam1a.HPP,128"$(0x7FF0000 0000 0000000020 DefineStr -$LK,"ip_cb ","FL:D:/TempleOS/Kernel/KGlbls.CPP.Z,91"$0000003D55 0003 0000000001 GlbVar -$LK,"ip_cb_last ","FL:D:/TempleOS/Kernel/KGlbls.CPP.Z,90"$0000003D52 0000 0000000001 GlbVar -$LK,"ip_dev ","FL:D:/TempleOS/Kernel/KGlbls.CPP.Z,88"$0000003D38 0002 0000000008 GlbVar -$LK,"ip_has_wheel ","FL:D:/TempleOS/Kernel/KGlbls.CPP.Z,93"$0000003D57 0001 0000000001 GlbVar -$LK,"ip_last_move_time ","FL:D:/TempleOS/Kernel/KGlbls.CPP.Z,94"$0000003D58 0001 0000000008 GlbVar -$LK,"ip_lb ","FL:D:/TempleOS/Kernel/KGlbls.CPP.Z,91"$0000003D54 0004 0000000001 GlbVar -$LK,"ip_lb_last ","FL:D:/TempleOS/Kernel/KGlbls.CPP.Z,90"$0000003D51 0001 0000000001 GlbVar -$LK,"ip_on ","FL:D:/TempleOS/Kernel/KGlbls.CPP.Z,89"$0000003D50 0001 0000000001 GlbVar -$LK,"ip_rb ","FL:D:/TempleOS/Kernel/KGlbls.CPP.Z,92"$0000003D56 0004 0000000001 GlbVar -$LK,"ip_rb_last ","FL:D:/TempleOS/Kernel/KGlbls.CPP.Z,91"$0000003D53 0001 0000000001 GlbVar -$LK,"ip_snap_last ","FL:D:/TempleOS/Kernel/KGlbls.CPP.Z,95"$0000003D60 0008 0000000030 GlbVar -$LK,"ip_speed ","FL:D:/TempleOS/Kernel/KGlbls.CPP.Z,87"$0000003D30 0001 0000000008 GlbVar -$LK,"ip_throttle ","FL:D:/TempleOS/Kernel/KGlbls.CPP.Z,83"$0000003CE0 0003 0000000008 GlbVar -$LK,"iptx ","FL:D:/TempleOS/Kernel/KGlbls.CPP.Z,88"$0000003D40 0004 0000000008 GlbVar -$LK,"ipty ","FL:D:/TempleOS/Kernel/KGlbls.CPP.Z,89"$0000003D48 0004 0000000008 GlbVar -$LK,"ipx ","FL:D:/TempleOS/Kernel/KGlbls.CPP.Z,82"$0000003CC8 0009 0000000008 GlbVar -$LK,"ipx_offset ","FL:D:/TempleOS/Kernel/KGlbls.CPP.Z,84"$0000003D00 0006 0000000008 GlbVar -$LK,"ipx_presnap ","FL:D:/TempleOS/Kernel/KGlbls.CPP.Z,83"$0000003CE8 0003 0000000008 GlbVar -$LK,"ipx_scale ","FL:D:/TempleOS/Kernel/KGlbls.CPP.Z,85"$0000003D18 0004 0000000008 GlbVar -$LK,"ipy ","FL:D:/TempleOS/Kernel/KGlbls.CPP.Z,82"$0000003CD0 0009 0000000008 GlbVar -$LK,"ipy_offset ","FL:D:/TempleOS/Kernel/KGlbls.CPP.Z,84"$0000003D08 0006 0000000008 GlbVar -$LK,"ipy_presnap ","FL:D:/TempleOS/Kernel/KGlbls.CPP.Z,83"$0000003CF0 0003 0000000008 GlbVar -$LK,"ipy_scale ","FL:D:/TempleOS/Kernel/KGlbls.CPP.Z,85"$0000003D20 0004 0000000008 GlbVar -$LK,"ipz ","FL:D:/TempleOS/Kernel/KGlbls.CPP.Z,82"$0000003CD8 0004 0000000008 GlbVar -$LK,"ipz_offset ","FL:D:/TempleOS/Kernel/KGlbls.CPP.Z,85"$0000003D10 0003 0000000008 GlbVar -$LK,"ipz_presnap ","FL:D:/TempleOS/Kernel/KGlbls.CPP.Z,84"$0000003CF8 0002 0000000008 GlbVar -$LK,"ipz_scale ","FL:D:/TempleOS/Kernel/KGlbls.CPP.Z,86"$0000003D28 0003 0000000008 GlbVar -$LK,"kbd2_fifo ","FL:D:/TempleOS/Kernel/KGlbls.CPP.Z,115"$0000003E18 0007 0000000008 GlbVar -$LK,"kbd_evt_time ","FL:D:/TempleOS/Kernel/KGlbls.CPP.Z,60"$0000003B78 0004 0000000008 GlbVar -$LK,"kbd_fifo ","FL:D:/TempleOS/Kernel/KGlbls.CPP.Z,114"$0000003E10 0007 0000000008 GlbVar -$LK,"kbd_irqs_working ","FL:D:/TempleOS/Kernel/KGlbls.CPP.Z,65"$0000003C10 0002 0000000001 GlbVar -$LK,"kbdmouse_rst ","FL:D:/TempleOS/Kernel/KGlbls.CPP.Z,112"$0000003E02 0006 0000000001 GlbVar -$LK,"key_desc ","FL:D:/TempleOS/Kernel/KGlbls.CPP.Z,64"$0000003B90 0001 0000000080 GlbVar -$LK,"key_down_bitmap ","FL:D:/TempleOS/Kernel/KGlbls.CPP.Z,124"$0000003E50 0003 0000000020 GlbVar -$LK,"key_down_bitmap2 ","FL:D:/TempleOS/Kernel/KGlbls.CPP.Z,126"$0000003E70 0003 0000000020 GlbVar -$LK,"key_handler ","FL:D:/TempleOS/Kernel/KGlbls.CPP.Z,66"$0000003C18 0001 0000000008 GlbVar -$LK,"local_time_offset ","FL:D:/TempleOS/Kernel/KGlbls.CPP.Z,54"$0000003B38 003F 0000000008 GlbVar +$LK,"ip_cb ","FL:D:/TempleOS/Kernel/KGlbls.CPP.Z,88"$0000003E45 0003 0000000001 GlbVar +$LK,"ip_cb_last ","FL:D:/TempleOS/Kernel/KGlbls.CPP.Z,87"$0000003E42 0000 0000000001 GlbVar +$LK,"ip_dev ","FL:D:/TempleOS/Kernel/KGlbls.CPP.Z,85"$0000003E28 0002 0000000008 GlbVar +$LK,"ip_has_wheel ","FL:D:/TempleOS/Kernel/KGlbls.CPP.Z,90"$0000003E47 0001 0000000001 GlbVar +$LK,"ip_last_move_time ","FL:D:/TempleOS/Kernel/KGlbls.CPP.Z,91"$0000003E48 0001 0000000008 GlbVar +$LK,"ip_lb ","FL:D:/TempleOS/Kernel/KGlbls.CPP.Z,88"$0000003E44 0004 0000000001 GlbVar +$LK,"ip_lb_last ","FL:D:/TempleOS/Kernel/KGlbls.CPP.Z,87"$0000003E41 0001 0000000001 GlbVar +$LK,"ip_on ","FL:D:/TempleOS/Kernel/KGlbls.CPP.Z,86"$0000003E40 0001 0000000001 GlbVar +$LK,"ip_rb ","FL:D:/TempleOS/Kernel/KGlbls.CPP.Z,89"$0000003E46 0004 0000000001 GlbVar +$LK,"ip_rb_last ","FL:D:/TempleOS/Kernel/KGlbls.CPP.Z,88"$0000003E43 0001 0000000001 GlbVar +$LK,"ip_snap_last ","FL:D:/TempleOS/Kernel/KGlbls.CPP.Z,92"$0000003E50 0008 0000000030 GlbVar +$LK,"ip_speed ","FL:D:/TempleOS/Kernel/KGlbls.CPP.Z,84"$0000003E20 0001 0000000008 GlbVar +$LK,"ip_throttle ","FL:D:/TempleOS/Kernel/KGlbls.CPP.Z,80"$0000003DD0 0003 0000000008 GlbVar +$LK,"iptx ","FL:D:/TempleOS/Kernel/KGlbls.CPP.Z,85"$0000003E30 0004 0000000008 GlbVar +$LK,"ipty ","FL:D:/TempleOS/Kernel/KGlbls.CPP.Z,86"$0000003E38 0004 0000000008 GlbVar +$LK,"ipx ","FL:D:/TempleOS/Kernel/KGlbls.CPP.Z,79"$0000003DB8 0009 0000000008 GlbVar +$LK,"ipx_offset ","FL:D:/TempleOS/Kernel/KGlbls.CPP.Z,81"$0000003DF0 0006 0000000008 GlbVar +$LK,"ipx_presnap ","FL:D:/TempleOS/Kernel/KGlbls.CPP.Z,80"$0000003DD8 0003 0000000008 GlbVar +$LK,"ipx_scale ","FL:D:/TempleOS/Kernel/KGlbls.CPP.Z,82"$0000003E08 0004 0000000008 GlbVar +$LK,"ipy ","FL:D:/TempleOS/Kernel/KGlbls.CPP.Z,79"$0000003DC0 0009 0000000008 GlbVar +$LK,"ipy_offset ","FL:D:/TempleOS/Kernel/KGlbls.CPP.Z,81"$0000003DF8 0006 0000000008 GlbVar +$LK,"ipy_presnap ","FL:D:/TempleOS/Kernel/KGlbls.CPP.Z,80"$0000003DE0 0003 0000000008 GlbVar +$LK,"ipy_scale ","FL:D:/TempleOS/Kernel/KGlbls.CPP.Z,82"$0000003E10 0004 0000000008 GlbVar +$LK,"ipz ","FL:D:/TempleOS/Kernel/KGlbls.CPP.Z,79"$0000003DC8 0004 0000000008 GlbVar +$LK,"ipz_offset ","FL:D:/TempleOS/Kernel/KGlbls.CPP.Z,82"$0000003E00 0003 0000000008 GlbVar +$LK,"ipz_presnap ","FL:D:/TempleOS/Kernel/KGlbls.CPP.Z,81"$0000003DE8 0002 0000000008 GlbVar +$LK,"ipz_scale ","FL:D:/TempleOS/Kernel/KGlbls.CPP.Z,83"$0000003E18 0003 0000000008 GlbVar +$LK,"kbd2_fifo ","FL:D:/TempleOS/Kernel/KGlbls.CPP.Z,112"$0000003F08 0007 0000000008 GlbVar +$LK,"kbd_evt_time ","FL:D:/TempleOS/Kernel/KGlbls.CPP.Z,59"$0000003C88 0004 0000000008 GlbVar +$LK,"kbd_fifo ","FL:D:/TempleOS/Kernel/KGlbls.CPP.Z,111"$0000003F00 0007 0000000008 GlbVar +$LK,"kbd_irqs_working ","FL:D:/TempleOS/Kernel/KGlbls.CPP.Z,64"$0000003D20 0002 0000000001 GlbVar +$LK,"kbdmouse_rst ","FL:D:/TempleOS/Kernel/KGlbls.CPP.Z,109"$0000003EF2 0006 0000000001 GlbVar +$LK,"key_desc ","FL:D:/TempleOS/Kernel/KGlbls.CPP.Z,63"$0000003CA0 0001 0000000080 GlbVar +$LK,"key_down_bitmap ","FL:D:/TempleOS/Kernel/KGlbls.CPP.Z,121"$0000003F40 0003 0000000020 GlbVar +$LK,"key_down_bitmap2 ","FL:D:/TempleOS/Kernel/KGlbls.CPP.Z,123"$0000003F60 0003 0000000020 GlbVar +$LK,"key_handler ","FL:D:/TempleOS/Kernel/KGlbls.CPP.Z,65"$0000003D28 0001 0000000008 GlbVar +$LK,"local_time_offset ","FL:D:/TempleOS/Kernel/KGlbls.CPP.Z,53"$0000003C48 003F 0000000008 GlbVar $LK,"log10_2 ","FL:D:/TempleOS/Kernel/Adam1a.HPP,135"$(0x3FD3441 0000 0000000020 DefineStr $LK,"log2_10 ","FL:D:/TempleOS/Kernel/Adam1a.HPP,133"$(0x400A934 0000 0000000020 DefineStr $LK,"log2_e ","FL:D:/TempleOS/Kernel/Adam1a.HPP,134"$(0x3FF7154 0000 0000000020 DefineStr $LK,"loge_2 ","FL:D:/TempleOS/Kernel/Adam1a.HPP,136"$(0x3FE62E4 0000 0000000020 DefineStr -$LK,"mon_start_days1 ","FL:D:/TempleOS/Kernel/Date.CPP.Z,3"$0000008BF4 0003 0000000018 GlbVar -$LK,"mon_start_days2 ","FL:D:/TempleOS/Kernel/Date.CPP.Z,5"$0000008C0C 0003 0000000018 GlbVar -$LK,"mouse2_fifo ","FL:D:/TempleOS/Kernel/KGlbls.CPP.Z,116"$0000003E28 0005 0000000008 GlbVar -$LK,"mouse_buttons ","FL:D:/TempleOS/Kernel/KGlbls.CPP.Z,105"$0000003DF8 000B 0000000005 GlbVar -$LK,"mouse_evt ","FL:D:/TempleOS/Kernel/KGlbls.CPP.Z,109"$0000003DFF 0004 0000000001 GlbVar -$LK,"mouse_evt_time ","FL:D:/TempleOS/Kernel/KGlbls.CPP.Z,60"$0000003B70 0007 0000000008 GlbVar -$LK,"mouse_fifo ","FL:D:/TempleOS/Kernel/KGlbls.CPP.Z,115"$0000003E20 0005 0000000008 GlbVar -$LK,"mouse_has_ext_buttons ","FL:D:/TempleOS/Kernel/KGlbls.CPP.Z,108"$0000003DFE 0004 0000000001 GlbVar -$LK,"mouse_has_wheel ","FL:D:/TempleOS/Kernel/KGlbls.CPP.Z,107"$0000003DFD 0004 0000000001 GlbVar -$LK,"mouse_install_attempt_in_progress","FL:D:/TempleOS/Kernel/KGlbls.CPP.Z,111"$0000003E01 0005 0000000001 GlbVar -$LK,"mouse_install_attempts ","FL:D:/TempleOS/Kernel/KGlbls.CPP.Z,119"$0000003E40 0003 0000000008 GlbVar -$LK,"mouse_installed ","FL:D:/TempleOS/Kernel/KGlbls.CPP.Z,110"$0000003E00 0007 0000000001 GlbVar -$LK,"mouse_irqs_working ","FL:D:/TempleOS/Kernel/KGlbls.CPP.Z,113"$0000003E03 0004 0000000001 GlbVar -$LK,"mouse_last_evt_time ","FL:D:/TempleOS/Kernel/KGlbls.CPP.Z,120"$0000003E48 0003 0000000008 GlbVar -$LK,"mouse_pkt_size ","FL:D:/TempleOS/Kernel/KGlbls.CPP.Z,60"$0000003B80 0004 0000000008 GlbVar -$LK,"mouse_speed ","FL:D:/TempleOS/Kernel/KGlbls.CPP.Z,103"$0000003DD8 0002 0000000008 GlbVar -$LK,"mp_apic_ids ","FL:D:/TempleOS/Kernel/KGlbls.CPP.Z,12"$00000038D0 0004 0000000040 GlbVar -$LK,"mp_cnt ","FL:D:/TempleOS/Kernel/Adam1b.HPP,187"$0000002358 0013 0000000008 GlbVar -$LK,"mp_cnt_initial ","FL:D:/TempleOS/Kernel/Adam1b.HPP,187"$0000002360 0003 0000000008 GlbVar -$LK,"mp_cnt_lock ","FL:D:/TempleOS/Kernel/Adam1b.HPP,189"$0000002368 0003 0000000008 GlbVar -$LK,"mp_crash ","FL:D:/TempleOS/Kernel/KGlbls.CPP.Z,10"$00000038C8 000A 0000000008 GlbVar -$LK,"mp_ctrl ","FL:D:/TempleOS/Kernel/KGlbls.CPP.Z,9"$00000038C0 0009 0000000008 GlbVar -$LK,"mxx ","FL:D:/TempleOS/Kernel/KGlbls.CPP.Z,101"$0000003DC0 0008 0000000008 GlbVar -$LK,"mxx_prescale ","FL:D:/TempleOS/Kernel/KGlbls.CPP.Z,100"$0000003DA8 0005 0000000008 GlbVar -$LK,"mxx_scale ","FL:D:/TempleOS/Kernel/KGlbls.CPP.Z,96"$0000003D90 0004 0000000008 GlbVar -$LK,"myy ","FL:D:/TempleOS/Kernel/KGlbls.CPP.Z,101"$0000003DC8 0008 0000000008 GlbVar -$LK,"myy_prescale ","FL:D:/TempleOS/Kernel/KGlbls.CPP.Z,100"$0000003DB0 0005 0000000008 GlbVar -$LK,"myy_scale ","FL:D:/TempleOS/Kernel/KGlbls.CPP.Z,96"$0000003D98 0004 0000000008 GlbVar -$LK,"mzz ","FL:D:/TempleOS/Kernel/KGlbls.CPP.Z,102"$0000003DD0 0005 0000000008 GlbVar -$LK,"mzz_prescale ","FL:D:/TempleOS/Kernel/KGlbls.CPP.Z,101"$0000003DB8 0005 0000000008 GlbVar -$LK,"mzz_scale ","FL:D:/TempleOS/Kernel/KGlbls.CPP.Z,97"$0000003DA0 0004 0000000008 GlbVar -$LK,"non_eol_chars_bitmap ","FL:D:/TempleOS/Kernel/Str1a.CPP.Z,390"$000000B864 0000 0000000040 GlbVar -$LK,"non_eol_white_space_bitmap","FL:D:/TempleOS/Kernel/Str1a.CPP.Z,366"$000000B664 0000 0000000040 GlbVar -$LK,"num_lock_map ","FL:D:/TempleOS/Kernel/KbdMouse/Keyboard.CPP.Z,176"$0000016497 0001 0000000100 GlbVar -$LK,"old_mxx ","FL:D:/TempleOS/Kernel/KGlbls.CPP.Z,103"$0000003DE0 0005 0000000008 GlbVar -$LK,"old_myy ","FL:D:/TempleOS/Kernel/KGlbls.CPP.Z,103"$0000003DE8 0005 0000000008 GlbVar -$LK,"old_mzz ","FL:D:/TempleOS/Kernel/KGlbls.CPP.Z,104"$0000003DF0 0003 0000000008 GlbVar +$LK,"mon_start_days1 ","FL:D:/TempleOS/Kernel/Date.CPP.Z,3"$0000008E22 0003 0000000018 GlbVar +$LK,"mon_start_days2 ","FL:D:/TempleOS/Kernel/Date.CPP.Z,5"$0000008E3A 0003 0000000018 GlbVar +$LK,"mouse2_fifo ","FL:D:/TempleOS/Kernel/KGlbls.CPP.Z,113"$0000003F18 0005 0000000008 GlbVar +$LK,"mouse_buttons ","FL:D:/TempleOS/Kernel/KGlbls.CPP.Z,102"$0000003EE8 000B 0000000005 GlbVar +$LK,"mouse_evt ","FL:D:/TempleOS/Kernel/KGlbls.CPP.Z,106"$0000003EEF 0004 0000000001 GlbVar +$LK,"mouse_evt_time ","FL:D:/TempleOS/Kernel/KGlbls.CPP.Z,59"$0000003C80 0007 0000000008 GlbVar +$LK,"mouse_fifo ","FL:D:/TempleOS/Kernel/KGlbls.CPP.Z,112"$0000003F10 0005 0000000008 GlbVar +$LK,"mouse_has_ext_buttons ","FL:D:/TempleOS/Kernel/KGlbls.CPP.Z,105"$0000003EEE 0004 0000000001 GlbVar +$LK,"mouse_has_wheel ","FL:D:/TempleOS/Kernel/KGlbls.CPP.Z,104"$0000003EED 0004 0000000001 GlbVar +$LK,"mouse_install_attempt_in_progress","FL:D:/TempleOS/Kernel/KGlbls.CPP.Z,108"$0000003EF1 0005 0000000001 GlbVar +$LK,"mouse_install_attempts ","FL:D:/TempleOS/Kernel/KGlbls.CPP.Z,116"$0000003F30 0003 0000000008 GlbVar +$LK,"mouse_installed ","FL:D:/TempleOS/Kernel/KGlbls.CPP.Z,107"$0000003EF0 0007 0000000001 GlbVar +$LK,"mouse_irqs_working ","FL:D:/TempleOS/Kernel/KGlbls.CPP.Z,110"$0000003EF3 0004 0000000001 GlbVar +$LK,"mouse_last_evt_time ","FL:D:/TempleOS/Kernel/KGlbls.CPP.Z,117"$0000003F38 0003 0000000008 GlbVar +$LK,"mouse_pkt_size ","FL:D:/TempleOS/Kernel/KGlbls.CPP.Z,59"$0000003C90 0004 0000000008 GlbVar +$LK,"mouse_speed ","FL:D:/TempleOS/Kernel/KGlbls.CPP.Z,100"$0000003EC8 0002 0000000008 GlbVar +$LK,"mp_apic_ids ","FL:D:/TempleOS/Kernel/KGlbls.CPP.Z,11"$00000039E0 0004 0000000040 GlbVar +$LK,"mp_cnt ","FL:D:/TempleOS/Kernel/Adam1b.HPP,187"$0000002368 0012 0000000008 GlbVar +$LK,"mp_cnt_initial ","FL:D:/TempleOS/Kernel/Adam1b.HPP,187"$0000002370 0003 0000000008 GlbVar +$LK,"mp_cnt_lock ","FL:D:/TempleOS/Kernel/Adam1b.HPP,189"$0000002378 0003 0000000008 GlbVar +$LK,"mp_crash ","FL:D:/TempleOS/Kernel/KGlbls.CPP.Z,9"$00000039D8 000A 0000000008 GlbVar +$LK,"mxx ","FL:D:/TempleOS/Kernel/KGlbls.CPP.Z,98"$0000003EB0 0008 0000000008 GlbVar +$LK,"mxx_prescale ","FL:D:/TempleOS/Kernel/KGlbls.CPP.Z,97"$0000003E98 0005 0000000008 GlbVar +$LK,"mxx_scale ","FL:D:/TempleOS/Kernel/KGlbls.CPP.Z,93"$0000003E80 0004 0000000008 GlbVar +$LK,"myy ","FL:D:/TempleOS/Kernel/KGlbls.CPP.Z,98"$0000003EB8 0008 0000000008 GlbVar +$LK,"myy_prescale ","FL:D:/TempleOS/Kernel/KGlbls.CPP.Z,97"$0000003EA0 0005 0000000008 GlbVar +$LK,"myy_scale ","FL:D:/TempleOS/Kernel/KGlbls.CPP.Z,93"$0000003E88 0004 0000000008 GlbVar +$LK,"mzz ","FL:D:/TempleOS/Kernel/KGlbls.CPP.Z,99"$0000003EC0 0005 0000000008 GlbVar +$LK,"mzz_prescale ","FL:D:/TempleOS/Kernel/KGlbls.CPP.Z,98"$0000003EA8 0005 0000000008 GlbVar +$LK,"mzz_scale ","FL:D:/TempleOS/Kernel/KGlbls.CPP.Z,94"$0000003E90 0004 0000000008 GlbVar +$LK,"non_eol_chars_bitmap ","FL:D:/TempleOS/Kernel/Str1a.CPP.Z,390"$000000BA8C 0000 0000000040 GlbVar +$LK,"non_eol_white_space_bitmap","FL:D:/TempleOS/Kernel/Str1a.CPP.Z,366"$000000B88C 0000 0000000040 GlbVar +$LK,"num_lock_map ","FL:D:/TempleOS/Kernel/KbdMouse/Keyboard.CPP.Z,176"$000001645F 0001 0000000100 GlbVar +$LK,"old_mxx ","FL:D:/TempleOS/Kernel/KGlbls.CPP.Z,100"$0000003ED0 0005 0000000008 GlbVar +$LK,"old_myy ","FL:D:/TempleOS/Kernel/KGlbls.CPP.Z,100"$0000003ED8 0005 0000000008 GlbVar +$LK,"old_mzz ","FL:D:/TempleOS/Kernel/KGlbls.CPP.Z,101"$0000003EE0 0003 0000000008 GlbVar $LK,"pi ","FL:D:/TempleOS/Kernel/Adam1a.HPP,130"$(0x400921F 0000 0000000020 DefineStr -$LK,"pow10_I64 ","FL:D:/TempleOS/Kernel/KGlbls.CPP.Z,78"$0000003CB8 0003 0000000008 GlbVar -$LK,"printable_chars_bitmap ","FL:D:/TempleOS/Kernel/Str1a.CPP.Z,381"$000000B7A4 0001 0000000040 GlbVar -$LK,"progress1 ","FL:D:/TempleOS/Kernel/Adam1b.HPP,43"$0000002238 0008 0000000008 GlbVar -$LK,"progress1_desc ","FL:D:/TempleOS/Kernel/Adam1b.HPP,45"$0000002248 0005 0000000030 GlbVar -$LK,"progress1_max ","FL:D:/TempleOS/Kernel/Adam1b.HPP,44"$0000002240 0005 0000000008 GlbVar -$LK,"progress2 ","FL:D:/TempleOS/Kernel/Adam1b.HPP,46"$0000002278 0000 0000000008 GlbVar -$LK,"progress2_desc ","FL:D:/TempleOS/Kernel/Adam1b.HPP,48"$0000002288 0000 0000000030 GlbVar -$LK,"progress2_max ","FL:D:/TempleOS/Kernel/Adam1b.HPP,47"$0000002280 0000 0000000008 GlbVar -$LK,"progress3 ","FL:D:/TempleOS/Kernel/Adam1b.HPP,49"$00000022B8 0000 0000000008 GlbVar -$LK,"progress3_desc ","FL:D:/TempleOS/Kernel/Adam1b.HPP,51"$00000022C8 0000 0000000030 GlbVar -$LK,"progress3_max ","FL:D:/TempleOS/Kernel/Adam1b.HPP,50"$00000022C0 0000 0000000008 GlbVar -$LK,"progress4 ","FL:D:/TempleOS/Kernel/Adam1b.HPP,52"$00000022F8 0000 0000000008 GlbVar -$LK,"progress4_desc ","FL:D:/TempleOS/Kernel/Adam1b.HPP,54"$0000002308 0000 0000000030 GlbVar -$LK,"progress4_max ","FL:D:/TempleOS/Kernel/Adam1b.HPP,53"$0000002300 0000 0000000008 GlbVar -$LK,"psect_cache ","FL:D:/TempleOS/Kernel/KGlbls.CPP.Z,138"$0000003ED8 0003 0000000008 GlbVar -$LK,"psect_cache_index ","FL:D:/TempleOS/Kernel/KGlbls.CPP.Z,139"$0000003EE0 0002 0000000008 GlbVar -$LK,"reverse_bits_table ","FL:D:/TempleOS/Kernel/KGlbls.CPP.Z,49"$0000003B08 0003 0000000008 GlbVar -$LK,"safe_dollar_chars_bitmap ","FL:D:/TempleOS/Kernel/Str1a.CPP.Z,387"$000000B824 0001 0000000040 GlbVar -$LK,"scan_code_fifo ","FL:D:/TempleOS/Kernel/KGlbls.CPP.Z,114"$0000003E08 0004 0000000008 GlbVar -$LK,"scan_code_map ","FL:D:/TempleOS/Kernel/KbdMouse/Keyboard.CPP.Z,155"$0000016397 0001 0000000100 GlbVar -$LK,"set_bits_table ","FL:D:/TempleOS/Kernel/KGlbls.CPP.Z,50"$0000003B10 0003 0000000008 GlbVar -$LK,"snd_dev ","FL:D:/TempleOS/Kernel/KGlbls.CPP.Z,73"$0000003C90 0001 0000000008 GlbVar -$LK,"snd_freq ","FL:D:/TempleOS/Kernel/KGlbls.CPP.Z,72"$0000003C88 0003 0000000008 GlbVar -$LK,"snd_record ","FL:D:/TempleOS/Kernel/KGlbls.CPP.Z,74"$0000003C98 0001 0000000001 GlbVar -$LK,"snd_reverb_delay ","FL:D:/TempleOS/Kernel/KGlbls.CPP.Z,75"$0000003CB0 0000 0000000008 GlbVar -$LK,"snd_reverb_intensity ","FL:D:/TempleOS/Kernel/KGlbls.CPP.Z,75"$0000003CA8 0000 0000000008 GlbVar -$LK,"snd_vol ","FL:D:/TempleOS/Kernel/KGlbls.CPP.Z,75"$0000003CA0 0001 0000000008 GlbVar -$LK,"sprintf_neg_powers_lets ","FL:D:/TempleOS/Kernel/Str1a.CPP.Z,1332"$000000D980 0001 0000000008 GlbVar -$LK,"sprintf_neg_powers_lst ","FL:D:/TempleOS/Kernel/Str1a.CPP.Z,1330"$000000D948 0000 0000000008 GlbVar -$LK,"sprintf_pos_powers_lets ","FL:D:/TempleOS/Kernel/Str1a.CPP.Z,1327"$000000D930 0001 0000000008 GlbVar -$LK,"sprintf_pos_powers_lst ","FL:D:/TempleOS/Kernel/Str1a.CPP.Z,1325"$000000D8F8 0000 0000000008 GlbVar +$LK,"pow10_I64 ","FL:D:/TempleOS/Kernel/KGlbls.CPP.Z,75"$0000003DA8 0003 0000000008 GlbVar +$LK,"printable_chars_bitmap ","FL:D:/TempleOS/Kernel/Str1a.CPP.Z,381"$000000B9CC 0001 0000000040 GlbVar +$LK,"progress1 ","FL:D:/TempleOS/Kernel/Adam1b.HPP,43"$0000002248 0008 0000000008 GlbVar +$LK,"progress1_desc ","FL:D:/TempleOS/Kernel/Adam1b.HPP,45"$0000002258 0005 0000000030 GlbVar +$LK,"progress1_max ","FL:D:/TempleOS/Kernel/Adam1b.HPP,44"$0000002250 0005 0000000008 GlbVar +$LK,"progress2 ","FL:D:/TempleOS/Kernel/Adam1b.HPP,46"$0000002288 0000 0000000008 GlbVar +$LK,"progress2_desc ","FL:D:/TempleOS/Kernel/Adam1b.HPP,48"$0000002298 0000 0000000030 GlbVar +$LK,"progress2_max ","FL:D:/TempleOS/Kernel/Adam1b.HPP,47"$0000002290 0000 0000000008 GlbVar +$LK,"progress3 ","FL:D:/TempleOS/Kernel/Adam1b.HPP,49"$00000022C8 0000 0000000008 GlbVar +$LK,"progress3_desc ","FL:D:/TempleOS/Kernel/Adam1b.HPP,51"$00000022D8 0000 0000000030 GlbVar +$LK,"progress3_max ","FL:D:/TempleOS/Kernel/Adam1b.HPP,50"$00000022D0 0000 0000000008 GlbVar +$LK,"progress4 ","FL:D:/TempleOS/Kernel/Adam1b.HPP,52"$0000002308 0000 0000000008 GlbVar +$LK,"progress4_desc ","FL:D:/TempleOS/Kernel/Adam1b.HPP,54"$0000002318 0000 0000000030 GlbVar +$LK,"progress4_max ","FL:D:/TempleOS/Kernel/Adam1b.HPP,53"$0000002310 0000 0000000008 GlbVar +$LK,"psect_cache ","FL:D:/TempleOS/Kernel/KGlbls.CPP.Z,133"$0000003FC8 0003 0000000008 GlbVar +$LK,"psect_cache_index ","FL:D:/TempleOS/Kernel/KGlbls.CPP.Z,134"$0000003FD0 0002 0000000008 GlbVar +$LK,"reverse_bits_table ","FL:D:/TempleOS/Kernel/KGlbls.CPP.Z,48"$0000003C18 0003 0000000008 GlbVar +$LK,"safe_dollar_chars_bitmap ","FL:D:/TempleOS/Kernel/Str1a.CPP.Z,387"$000000BA4C 0001 0000000040 GlbVar +$LK,"scan_code_fifo ","FL:D:/TempleOS/Kernel/KGlbls.CPP.Z,111"$0000003EF8 0004 0000000008 GlbVar +$LK,"scan_code_map ","FL:D:/TempleOS/Kernel/KbdMouse/Keyboard.CPP.Z,155"$000001635F 0001 0000000100 GlbVar +$LK,"set_bits_table ","FL:D:/TempleOS/Kernel/KGlbls.CPP.Z,49"$0000003C20 0003 0000000008 GlbVar +$LK,"snd_freq ","FL:D:/TempleOS/Kernel/KGlbls.CPP.Z,71"$0000003D98 0002 0000000008 GlbVar +$LK,"snd_record ","FL:D:/TempleOS/Kernel/KGlbls.CPP.Z,72"$0000003DA0 0001 0000000001 GlbVar +$LK,"snd_record_root ","FL:D:/TempleOS/Kernel/KGlbls.CPP.Z,125"$0000003F80 0004 0000000020 GlbVar +$LK,"sprintf_neg_powers_lets ","FL:D:/TempleOS/Kernel/Str1a.CPP.Z,1323"$000000DAF8 0001 0000000008 GlbVar +$LK,"sprintf_neg_powers_lst ","FL:D:/TempleOS/Kernel/Str1a.CPP.Z,1321"$000000DAC0 0000 0000000008 GlbVar +$LK,"sprintf_pos_powers_lets ","FL:D:/TempleOS/Kernel/Str1a.CPP.Z,1318"$000000DAA8 0001 0000000008 GlbVar +$LK,"sprintf_pos_powers_lst ","FL:D:/TempleOS/Kernel/Str1a.CPP.Z,1316"$000000DA70 0000 0000000008 GlbVar $LK,"sqrt2 ","FL:D:/TempleOS/Kernel/Adam1a.HPP,137"$(0x3FF6A09 0000 0000000020 DefineStr -$LK,"sys_acct ","FL:D:/TempleOS/Kernel/KGlbls.CPP.Z,49"$0000003B00 0009 0000000008 GlbVar -$LK,"sys_auto_mount_ide_cnt ","FL:D:/TempleOS/Kernel/KGlbls.CPP.Z,37"$00000039F0 0001 0000000008 GlbVar -$LK,"sys_blkdevs ","FL:D:/TempleOS/Kernel/KGlbls.CPP.Z,36"$00000039E0 0007 0000000008 GlbVar -$LK,"sys_boot_base ","FL:D:/TempleOS/Kernel/Adam1b.HPP,36"$0000000004 0003 0000000004 GlbVar -$LK,"sys_boot_code ","FL:D:/TempleOS/Kernel/Adam1b.HPP,37"$0000000018 0002 0000000004 GlbVar +$LK,"sys_acct ","FL:D:/TempleOS/Kernel/KGlbls.CPP.Z,48"$0000003C10 000E 0000000008 GlbVar +$LK,"sys_auto_mount_ide_cnt ","FL:D:/TempleOS/Kernel/KGlbls.CPP.Z,36"$0000003B00 0001 0000000008 GlbVar +$LK,"sys_blkdevs ","FL:D:/TempleOS/Kernel/KGlbls.CPP.Z,35"$0000003AF0 0007 0000000008 GlbVar +$LK,"sys_boot_base ","FL:D:/TempleOS/Kernel/Adam1b.HPP,36"$0000000004 0004 0000000004 GlbVar +$LK,"sys_boot_code ","FL:D:/TempleOS/Kernel/Adam1b.HPP,37"$0000000018 0001 0000000004 GlbVar $LK,"sys_boot_patch_table_base ","FL:D:/TempleOS/Kernel/Adam1b.HPP,39"$0000000008 0001 0000000004 GlbVar -$LK,"sys_cache_line_width ","FL:D:/TempleOS/Kernel/Adam1b.HPP,164"$0000002500 0001 0000000008 GlbVar -$LK,"sys_clipboard_doc ","FL:D:/TempleOS/Kernel/KGlbls.CPP.Z,33"$00000039C0 0000 0000000008 GlbVar -$LK,"sys_code_bp ","FL:D:/TempleOS/Kernel/Adam1b.HPP,120"$0000002228 0009 0000000008 GlbVar +$LK,"sys_cache_line_width ","FL:D:/TempleOS/Kernel/Adam1b.HPP,164"$00000024C0 0001 0000000008 GlbVar +$LK,"sys_clipboard_doc ","FL:D:/TempleOS/Kernel/KGlbls.CPP.Z,32"$0000003AD0 0000 0000000008 GlbVar +$LK,"sys_code_bp ","FL:D:/TempleOS/Kernel/Adam1b.HPP,120"$0000002238 0009 0000000008 GlbVar $LK,"sys_compile_time ","FL:D:/TempleOS/Kernel/Adam1b.HPP,33"$000000000C 0001 0000000008 GlbVar -$LK,"sys_ctrl_alt_flags ","FL:D:/TempleOS/Kernel/Adam1b.HPP,32"$0000001838 0005 0000000008 GlbVar -$LK,"sys_cur_scan_code ","FL:D:/TempleOS/Kernel/KGlbls.CPP.Z,61"$0000003B88 0017 0000000008 GlbVar -$LK,"sys_data_bp ","FL:D:/TempleOS/Kernel/Adam1b.HPP,121"$0000002230 0005 0000000008 GlbVar -$LK,"sys_dbg_focus_task ","FL:D:/TempleOS/Kernel/KGlbls.CPP.Z,5"$00000038A8 0002 0000000008 GlbVar -$LK,"sys_dbg_msg ","FL:D:/TempleOS/Kernel/KGlbls.CPP.Z,6"$00000038B0 0004 0000000008 GlbVar -$LK,"sys_dbg_msg_num ","FL:D:/TempleOS/Kernel/KGlbls.CPP.Z,7"$00000038B8 0004 0000000008 GlbVar -$LK,"sys_dc_screen_image ","FL:D:/TempleOS/Kernel/KGlbls.CPP.Z,24"$0000003968 0006 0000000008 GlbVar -$LK,"sys_dft_iso_name ","FL:D:/TempleOS/Kernel/KGlbls.CPP.Z,34"$00000039C8 0003 0000000008 GlbVar -$LK,"sys_dsk_cache_base ","FL:D:/TempleOS/Kernel/KGlbls.CPP.Z,18"$0000003938 0008 0000000008 GlbVar -$LK,"sys_dsk_cache_ctrl ","FL:D:/TempleOS/Kernel/KGlbls.CPP.Z,18"$0000003940 000A 0000000008 GlbVar -$LK,"sys_dsk_cache_hash_table ","FL:D:/TempleOS/Kernel/KGlbls.CPP.Z,19"$0000003948 0005 0000000008 GlbVar -$LK,"sys_dsk_cache_size ","FL:D:/TempleOS/Kernel/KGlbls.CPP.Z,21"$0000003950 0003 0000000008 GlbVar -$LK,"sys_dsk_reads ","FL:D:/TempleOS/Kernel/KGlbls.CPP.Z,34"$00000039D0 0002 0000000008 GlbVar -$LK,"sys_dsk_writes ","FL:D:/TempleOS/Kernel/KGlbls.CPP.Z,35"$00000039D8 0002 0000000008 GlbVar -$LK,"sys_fault_handlers_code ","FL:D:/TempleOS/Kernel/KGlbls.CPP.Z,17"$0000003930 0003 0000000008 GlbVar -$LK,"sys_first_cd_drv_let ","FL:HOME/Temp.TXT.Z,1"$00000039FA 0002 0000000001 GlbVar -$LK,"sys_first_hd_drv_let ","FL:HOME/Temp.TXT.Z,1"$00000039F9 0002 0000000001 GlbVar -$LK,"sys_fix_file_line ","FL:D:/TempleOS/Kernel/KGlbls.CPP.Z,27"$00000039A0 0003 0000000008 GlbVar -$LK,"sys_focus_task ","FL:D:/TempleOS/Kernel/Adam1b.HPP,24"$0000002338 001B 0000000008 GlbVar -$LK,"sys_font_8x8 ","FL:D:/TempleOS/Kernel/Font8x8.CPP.Z,3"$0000004A0E 0001 0000000800 GlbVar +$LK,"sys_ctrl_alt_flags ","FL:D:/TempleOS/Kernel/Adam1b.HPP,32"$0000001848 0005 0000000008 GlbVar +$LK,"sys_cur_scan_code ","FL:D:/TempleOS/Kernel/KGlbls.CPP.Z,60"$0000003C98 0017 0000000008 GlbVar +$LK,"sys_data_bp ","FL:D:/TempleOS/Kernel/Adam1b.HPP,121"$0000002240 0005 0000000008 GlbVar +$LK,"sys_dbg_focus_task ","FL:D:/TempleOS/Kernel/KGlbls.CPP.Z,5"$00000039C0 0002 0000000008 GlbVar +$LK,"sys_dbg_msg ","FL:D:/TempleOS/Kernel/KGlbls.CPP.Z,6"$00000039C8 0004 0000000008 GlbVar +$LK,"sys_dbg_msg_num ","FL:D:/TempleOS/Kernel/KGlbls.CPP.Z,7"$00000039D0 0004 0000000008 GlbVar +$LK,"sys_dc_screen_image ","FL:D:/TempleOS/Kernel/KGlbls.CPP.Z,23"$0000003A78 0006 0000000008 GlbVar +$LK,"sys_dft_iso_name ","FL:D:/TempleOS/Kernel/KGlbls.CPP.Z,33"$0000003AD8 0003 0000000008 GlbVar +$LK,"sys_dsk_cache_base ","FL:D:/TempleOS/Kernel/KGlbls.CPP.Z,17"$0000003A48 0008 0000000008 GlbVar +$LK,"sys_dsk_cache_ctrl ","FL:D:/TempleOS/Kernel/KGlbls.CPP.Z,17"$0000003A50 000A 0000000008 GlbVar +$LK,"sys_dsk_cache_hash_table ","FL:D:/TempleOS/Kernel/KGlbls.CPP.Z,18"$0000003A58 0005 0000000008 GlbVar +$LK,"sys_dsk_cache_size ","FL:D:/TempleOS/Kernel/KGlbls.CPP.Z,20"$0000003A60 0003 0000000008 GlbVar +$LK,"sys_dsk_reads ","FL:D:/TempleOS/Kernel/KGlbls.CPP.Z,33"$0000003AE0 0002 0000000008 GlbVar +$LK,"sys_dsk_writes ","FL:D:/TempleOS/Kernel/KGlbls.CPP.Z,34"$0000003AE8 0002 0000000008 GlbVar +$LK,"sys_fault_handlers_code ","FL:D:/TempleOS/Kernel/KGlbls.CPP.Z,16"$0000003A40 0003 0000000008 GlbVar +$LK,"sys_first_cd_drv_let ","FL:HOME/Temp.TXT.Z,1"$0000003B09 0002 0000000001 GlbVar +$LK,"sys_first_hd_drv_let ","FL:HOME/Temp.TXT.Z,1"$0000003B08 0002 0000000001 GlbVar +$LK,"sys_fix_file_line ","FL:D:/TempleOS/Kernel/KGlbls.CPP.Z,26"$0000003AB0 0003 0000000008 GlbVar +$LK,"sys_focus_task ","FL:D:/TempleOS/Kernel/Adam1b.HPP,24"$0000002348 001B 0000000008 GlbVar +$LK,"sys_font_8x8 ","FL:D:/TempleOS/Kernel/Font8x8.CPP.Z,3"$0000004AFE 0001 0000000800 GlbVar $LK,"sys_gdttab ","FL:D:/TempleOS/Kernel/Adam1b.HPP,165"$00000003E0 0004 0000000880 GlbVar -$LK,"sys_heap_base ","FL:D:/TempleOS/Kernel/Adam1b.HPP,122"$0000001820 0002 0000000004 GlbVar -$LK,"sys_heap_dbg ","FL:D:/TempleOS/Kernel/Adam1b.HPP,131"$0000001836 0000 0000000001 GlbVar -$LK,"sys_heap_init_flag ","FL:D:/TempleOS/Kernel/Adam1b.HPP,125"$0000001832 0000 0000000001 GlbVar -$LK,"sys_heap_init_val ","FL:D:/TempleOS/Kernel/Adam1b.HPP,126"$0000001833 0000 0000000001 GlbVar -$LK,"sys_heap_limit ","FL:D:/TempleOS/Kernel/Adam1b.HPP,123"$0000001828 0002 0000000004 GlbVar -$LK,"sys_idt ","FL:D:/TempleOS/Kernel/KGlbls.CPP.Z,12"$0000003910 0005 0000000008 GlbVar -$LK,"sys_init_fpu_mmx ","FL:D:/TempleOS/Kernel/Adam1b.HPP,255"$0000002AF0 0001 0000000200 GlbVar -$LK,"sys_jiffies ","FL:D:/TempleOS/Kernel/Adam1b.HPP,208"$0000002348 0004 0000000008 GlbVar -$LK,"sys_key_cnt ","FL:D:/TempleOS/Kernel/KGlbls.CPP.Z,117"$0000003E30 0002 0000000008 GlbVar -$LK,"sys_last_down_scan_code ","FL:D:/TempleOS/Kernel/KGlbls.CPP.Z,118"$0000003E38 0002 0000000008 GlbVar -$LK,"sys_macro_root ","FL:D:/TempleOS/Kernel/KGlbls.CPP.Z,3"$0000003820 0002 0000000050 GlbVar -$LK,"sys_macro_util_task ","FL:D:/TempleOS/Kernel/KGlbls.CPP.Z,4"$00000038A0 0001 0000000008 GlbVar -$LK,"sys_mem32_dev_root ","FL:D:/TempleOS/Kernel/KGlbls.CPP.Z,70"$0000003C58 0008 0000000028 GlbVar -$LK,"sys_mem64_dev_ptr ","FL:D:/TempleOS/Kernel/KGlbls.CPP.Z,70"$0000003C80 0006 0000000008 GlbVar -$LK,"sys_mem_init_flag ","FL:D:/TempleOS/Kernel/Adam1b.HPP,127"$0000001830 0001 0000000001 GlbVar -$LK,"sys_mem_init_val ","FL:D:/TempleOS/Kernel/Adam1b.HPP,128"$0000001831 0001 0000000001 GlbVar -$LK,"sys_num_installed_compilers","FL:D:/TempleOS/Kernel/KGlbls.CPP.Z,66"$0000003C20 0000 0000000008 GlbVar -$LK,"sys_num_spawned_users ","FL:D:/TempleOS/Kernel/KGlbls.CPP.Z,14"$0000003920 0001 0000000008 GlbVar -$LK,"sys_num_task_inits ","FL:D:/TempleOS/Kernel/KGlbls.CPP.Z,14"$0000003928 0001 0000000008 GlbVar +$LK,"sys_heap_base ","FL:D:/TempleOS/Kernel/Adam1b.HPP,122"$0000001828 0003 0000000004 GlbVar +$LK,"sys_heap_dbg ","FL:D:/TempleOS/Kernel/Adam1b.HPP,131"$0000001846 0000 0000000001 GlbVar +$LK,"sys_heap_init_flag ","FL:D:/TempleOS/Kernel/Adam1b.HPP,125"$0000001842 0000 0000000001 GlbVar +$LK,"sys_heap_init_val ","FL:D:/TempleOS/Kernel/Adam1b.HPP,126"$0000001843 0000 0000000001 GlbVar +$LK,"sys_heap_limit ","FL:D:/TempleOS/Kernel/Adam1b.HPP,123"$0000001830 0003 0000000004 GlbVar +$LK,"sys_idt ","FL:D:/TempleOS/Kernel/KGlbls.CPP.Z,11"$0000003A20 0004 0000000008 GlbVar +$LK,"sys_init_fpu_mmx ","FL:D:/TempleOS/Kernel/Adam1b.HPP,255"$0000002AB0 0001 0000000200 GlbVar +$LK,"sys_jiffies ","FL:D:/TempleOS/Kernel/Adam1b.HPP,208"$0000002358 0004 0000000008 GlbVar +$LK,"sys_key_cnt ","FL:D:/TempleOS/Kernel/KGlbls.CPP.Z,114"$0000003F20 0002 0000000008 GlbVar +$LK,"sys_last_down_scan_code ","FL:D:/TempleOS/Kernel/KGlbls.CPP.Z,115"$0000003F28 0002 0000000008 GlbVar +$LK,"sys_macro_root ","FL:D:/TempleOS/Kernel/KGlbls.CPP.Z,3"$0000003908 0002 0000000080 GlbVar +$LK,"sys_macro_util_task ","FL:D:/TempleOS/Kernel/KGlbls.CPP.Z,4"$00000039B8 0001 0000000008 GlbVar +$LK,"sys_mem32_dev_root ","FL:D:/TempleOS/Kernel/KGlbls.CPP.Z,69"$0000003D68 0008 0000000028 GlbVar +$LK,"sys_mem64_dev_ptr ","FL:D:/TempleOS/Kernel/KGlbls.CPP.Z,69"$0000003D90 0006 0000000008 GlbVar +$LK,"sys_mem_init_flag ","FL:D:/TempleOS/Kernel/Adam1b.HPP,127"$0000001840 0001 0000000001 GlbVar +$LK,"sys_mem_init_val ","FL:D:/TempleOS/Kernel/Adam1b.HPP,128"$0000001841 0001 0000000001 GlbVar +$LK,"sys_num_installed_compilers","FL:D:/TempleOS/Kernel/KGlbls.CPP.Z,65"$0000003D30 0000 0000000008 GlbVar +$LK,"sys_num_spawned_users ","FL:D:/TempleOS/Kernel/KGlbls.CPP.Z,13"$0000003A30 0001 0000000008 GlbVar +$LK,"sys_num_task_inits ","FL:D:/TempleOS/Kernel/KGlbls.CPP.Z,13"$0000003A38 0001 0000000008 GlbVar $LK,"sys_pci_busses ","FL:D:/TempleOS/Kernel/Adam1b.HPP,30"$0000000C62 0000 0000000002 GlbVar -$LK,"sys_pci_dev_root ","FL:D:/TempleOS/Kernel/KGlbls.CPP.Z,69"$0000003C28 0001 0000000030 GlbVar -$LK,"sys_pci_services ","FL:D:/TempleOS/Kernel/BIOS32.CPP.Z,167"$000001B90B 0007 0000000004 GlbVar -$LK,"sys_progresses ","FL:D:/TempleOS/Kernel/Adam1b.HPP,42"$0000002238 0002 0000000100 GlbVar -$LK,"sys_prts ","FL:D:/TempleOS/Kernel/KGlbls.CPP.Z,37"$00000039E8 0006 0000000008 GlbVar -$LK,"sys_put_key_root ","FL:D:/TempleOS/Kernel/KGlbls.CPP.Z,4"$0000003870 0007 0000000030 GlbVar -$LK,"sys_raw_dc_col ","FL:D:/TempleOS/Kernel/KGlbls.CPP.Z,22"$0000003958 0015 0000000008 GlbVar -$LK,"sys_raw_dc_flags ","FL:D:/TempleOS/Kernel/KGlbls.CPP.Z,22"$0000003960 0014 0000000008 GlbVar -$LK,"sys_rnd_seed ","FL:D:/TempleOS/Kernel/KGlbls.CPP.Z,32"$00000039B8 0019 0000000008 GlbVar -$LK,"sys_run_level ","FL:D:/TempleOS/Kernel/Adam1b.HPP,38"$00000015EC 0009 0000000004 GlbVar -$LK,"sys_semas ","FL:D:/TempleOS/Kernel/Adam1b.HPP,192"$0000002530 0049 00000005C0 GlbVar -$LK,"sys_task_being_screen_updated","FL:D:/TempleOS/Kernel/KGlbls.CPP.Z,30"$00000039B0 0001 0000000008 GlbVar -$LK,"sys_temp_cpu0_struct ","FL:D:/TempleOS/Kernel/Adam1b.HPP,190"$0000002370 0001 0000000158 GlbVar -$LK,"sys_temp_filename ","FL:D:/TempleOS/Kernel/KGlbls.CPP.Z,2"$0000003794 0003 0000000088 GlbVar -$LK,"sys_timer ","FL:D:/TempleOS/Kernel/Adam1b.HPP,207"$0000002340 0002 0000000008 GlbVar -$LK,"sys_uncached_heap ","FL:D:/TempleOS/Kernel/KGlbls.CPP.Z,80"$0000003CC0 0001 0000000008 GlbVar -$LK,"sys_var_init_flag ","FL:D:/TempleOS/Kernel/Adam1b.HPP,129"$0000001834 0000 0000000001 GlbVar -$LK,"sys_var_init_val ","FL:D:/TempleOS/Kernel/Adam1b.HPP,130"$0000001835 0000 0000000001 GlbVar -$LK,"sys_winmgr_task ","FL:D:/TempleOS/Kernel/KGlbls.CPP.Z,29"$00000039A8 0004 0000000008 GlbVar -$LK+BI,"tJ ","FL:D:/TempleOS/Kernel/Misc1a.CPP.Z,144",1251$$LK+BI,"","tJ",1252$0000012AD2 0000 0000000022 Funct -$LK+BI,"tS ","FL:D:/TempleOS/Kernel/Misc1a.CPP.Z,149",1253$$LK+BI,"","tS",1254$0000012AFA 001B 0000000021 Funct -$LK+BI,"tT ","FL:D:/TempleOS/Kernel/Misc1a.CPP.Z,121",1255$$LK+BI,"","tT",1256$0000012A2A 0002 00000000A8 Funct -$LK,"text_cols ","FL:D:/TempleOS/Kernel/KGlbls.CPP.Z,25"$0000003980 001D 0000000008 GlbVar -$LK,"text_mode ","FL:D:/TempleOS/Kernel/KGlbls.CPP.Z,25"$0000003970 0003 0000000001 GlbVar -$LK,"text_rows ","FL:D:/TempleOS/Kernel/KGlbls.CPP.Z,25"$0000003978 0011 0000000008 GlbVar -$LK+BI,"throw ","FL:D:/TempleOS/Kernel/Except.CPP.Z,165",1257$$LK+BI,"","throw",1258$00000154CF 0027 0000000022 Funct -$LK+BI,"throw_join ","FL:D:/TempleOS/Kernel/Except.CPP.Z,136",1259$$LK+BI,"","throw_join",1260$00000153AF 0002 0000000104 Funct -throw_no_log 00000154B7 0001 ExportSysSym -$LK+BI,"throw_no_log ","FL:D:/TempleOS/Kernel/Except.CPP.Z,160",1261$$LK+BI,"","throw_no_log",1262$00000154B7 0001 0000000014 Funct -$LK,"time_fmt_map ","FL:D:/TempleOS/Kernel/KGlbls.CPP.Z,141"$0000003EF0 0003 0000000008 GlbVar -$LK,"time_stamp_freq ","FL:D:/TempleOS/Kernel/KGlbls.CPP.Z,57"$0000003B58 0009 0000000008 GlbVar -$LK,"time_stamp_freq_calibrated","FL:D:/TempleOS/Kernel/KGlbls.CPP.Z,55"$0000003B40 0001 0000000001 GlbVar -$LK,"time_stamp_freq_initial ","FL:D:/TempleOS/Kernel/KGlbls.CPP.Z,59"$0000003B68 0001 0000000008 GlbVar -$LK,"time_stamp_kHz_freq ","FL:D:/TempleOS/Kernel/KGlbls.CPP.Z,58"$0000003B60 0001 0000000008 GlbVar -$LK,"white_space_bitmap ","FL:D:/TempleOS/Kernel/Str1a.CPP.Z,363"$000000B624 0006 0000000040 GlbVar -$LK,"word_bitmap ","FL:D:/TempleOS/Kernel/Str1a.CPP.Z,351"$000000B524 0000 0000000040 GlbVar -$LK,"zero_cr_nl_cursor_bitmap ","FL:D:/TempleOS/Kernel/Str1a.CPP.Z,369"$000000B6A4 0000 0000000040 GlbVar -$LK,"zero_tab_ff_cr_nl_cursor_bitmap","FL:D:/TempleOS/Kernel/Str1a.CPP.Z,372"$000000B6E4 0000 0000000040 GlbVar -$LK,"zero_tab_ff_cr_nl_cursor_dollar_bitmap","FL:D:/TempleOS/Kernel/Str1a.CPP.Z,375"$000000B724 0000 0000000040 GlbVar +$LK,"sys_pci_dev_root ","FL:D:/TempleOS/Kernel/KGlbls.CPP.Z,68"$0000003D38 0001 0000000030 GlbVar +$LK,"sys_pci_services ","FL:D:/TempleOS/Kernel/BIOS32.CPP.Z,167"$000001BB43 0007 0000000004 GlbVar +$LK,"sys_progresses ","FL:D:/TempleOS/Kernel/Adam1b.HPP,42"$0000002248 0002 0000000100 GlbVar +$LK,"sys_prts ","FL:D:/TempleOS/Kernel/KGlbls.CPP.Z,36"$0000003AF8 0006 0000000008 GlbVar +$LK,"sys_put_key_root ","FL:D:/TempleOS/Kernel/KGlbls.CPP.Z,4"$0000003988 0007 0000000030 GlbVar +$LK,"sys_raw_dc_col ","FL:D:/TempleOS/Kernel/KGlbls.CPP.Z,21"$0000003A68 0015 0000000008 GlbVar +$LK,"sys_raw_dc_flags ","FL:D:/TempleOS/Kernel/KGlbls.CPP.Z,21"$0000003A70 0014 0000000008 GlbVar +$LK,"sys_rnd_seed ","FL:D:/TempleOS/Kernel/KGlbls.CPP.Z,31"$0000003AC8 0019 0000000008 GlbVar +$LK,"sys_run_level ","FL:D:/TempleOS/Kernel/Adam1b.HPP,38"$00000015FC 0009 0000000004 GlbVar +$LK,"sys_semas ","FL:D:/TempleOS/Kernel/Adam1b.HPP,192"$00000024F0 0049 00000005C0 GlbVar +$LK,"sys_task_being_screen_updated","FL:D:/TempleOS/Kernel/KGlbls.CPP.Z,29"$0000003AC0 0001 0000000008 GlbVar +$LK,"sys_temp_cpu0_struct ","FL:D:/TempleOS/Kernel/Adam1b.HPP,190"$0000002380 0001 0000000130 GlbVar +$LK,"sys_temp_filename ","FL:D:/TempleOS/Kernel/KGlbls.CPP.Z,2"$0000003879 0002 0000000088 GlbVar +$LK,"sys_timer ","FL:D:/TempleOS/Kernel/Adam1b.HPP,207"$0000002350 0002 0000000008 GlbVar +$LK,"sys_uncached_heap ","FL:D:/TempleOS/Kernel/KGlbls.CPP.Z,77"$0000003DB0 0001 0000000008 GlbVar +$LK,"sys_var_init_flag ","FL:D:/TempleOS/Kernel/Adam1b.HPP,129"$0000001844 0000 0000000001 GlbVar +$LK,"sys_var_init_val ","FL:D:/TempleOS/Kernel/Adam1b.HPP,130"$0000001845 0000 0000000001 GlbVar +$LK,"sys_winmgr_task ","FL:D:/TempleOS/Kernel/KGlbls.CPP.Z,28"$0000003AB8 0004 0000000008 GlbVar +$LK+BI,"tJ ","FL:D:/TempleOS/Kernel/Misc1a.CPP.Z,144",631$0000012C7A 0000 0000000022 Funct +$LK+BI,"tS ","FL:D:/TempleOS/Kernel/Misc1a.CPP.Z,149",632$0000012CA2 001B 0000000021 Funct +$LK+BI,"tT ","FL:D:/TempleOS/Kernel/Misc1a.CPP.Z,121",633$0000012BD2 0004 00000000A8 Funct +$LK,"text_cols ","FL:D:/TempleOS/Kernel/KGlbls.CPP.Z,24"$0000003A90 001D 0000000008 GlbVar +$LK,"text_mode ","FL:D:/TempleOS/Kernel/KGlbls.CPP.Z,24"$0000003A80 0003 0000000001 GlbVar +$LK,"text_rows ","FL:D:/TempleOS/Kernel/KGlbls.CPP.Z,24"$0000003A88 0011 0000000008 GlbVar +$LK+BI,"throw ","FL:D:/TempleOS/Kernel/Except.CPP.Z,165",634$00000154F7 0026 0000000022 Funct +$LK+BI,"throw_join ","FL:D:/TempleOS/Kernel/Except.CPP.Z,136",635$00000153D7 0002 0000000104 Funct +throw_no_log 00000154DF 0001 ExportSysSym +$LK+BI,"throw_no_log ","FL:D:/TempleOS/Kernel/Except.CPP.Z,160",636$00000154DF 0001 0000000014 Funct +$LK,"time_fmt_map ","FL:D:/TempleOS/Kernel/KGlbls.CPP.Z,136"$0000003FE0 0003 0000000008 GlbVar +$LK,"time_stamp_freq ","FL:D:/TempleOS/Kernel/KGlbls.CPP.Z,56"$0000003C68 000B 0000000008 GlbVar +$LK,"time_stamp_freq_calibrated","FL:D:/TempleOS/Kernel/KGlbls.CPP.Z,54"$0000003C50 0001 0000000001 GlbVar +$LK,"time_stamp_freq_initial ","FL:D:/TempleOS/Kernel/KGlbls.CPP.Z,58"$0000003C78 0001 0000000008 GlbVar +$LK,"time_stamp_kHz_freq ","FL:D:/TempleOS/Kernel/KGlbls.CPP.Z,57"$0000003C70 0001 0000000008 GlbVar +$LK,"white_space_bitmap ","FL:D:/TempleOS/Kernel/Str1a.CPP.Z,363"$000000B84C 0006 0000000040 GlbVar +$LK,"word_bitmap ","FL:D:/TempleOS/Kernel/Str1a.CPP.Z,351"$000000B74C 0000 0000000040 GlbVar +$LK,"zero_cr_nl_cursor_bitmap ","FL:D:/TempleOS/Kernel/Str1a.CPP.Z,369"$000000B8CC 0000 0000000040 GlbVar +$LK,"zero_tab_ff_cr_nl_cursor_bitmap","FL:D:/TempleOS/Kernel/Str1a.CPP.Z,372"$000000B90C 0000 0000000040 GlbVar +$LK,"zero_tab_ff_cr_nl_cursor_dollar_bitmap","FL:D:/TempleOS/Kernel/Str1a.CPP.Z,375"$000000B94C 0000 0000000040 GlbVar $LK,"\343 ","FL:D:/TempleOS/Kernel/Adam1a.HPP,131"$(0x400921F 0000 0000000020 DefineStr $LK,"\354 ","FL:D:/TempleOS/Kernel/Adam1a.HPP,129"$(0x7FF0000 0007 0000000020 DefineStr -  `RþRþfþnþ|þ‡þ‹þ‘þ—þ¨þ¹þÎþÓþÙþðþõþûþÿÿÿ4ÿ9ÿ?ÿMÿQÿmÿ€ÿ�ÿ•ÿ¤ÿ±ÿÁÿÐÿÝÿðÿúÿ-4BTTTgi|~‘“¦¦ÂÙßåðK `¨`²4;AQX`fmƒ‘•𧵏½ÀÀÐÞàòô .<?AMOot{„Š�—ššª¸ººâ ;Q\`² ù*„ʄʠʣʨʻÊÎÊÑÊÝÊàÊæÊèÊõÊËË-Ë:Ë\ËiËkËkËvË|˂˄ˊË�˒˘˞ˠ˦ˬˮˮËÃËÐËÒËÒËÒËÕËæËÌÌ;ù*�Äó—e—e¨e²eºeºeÌeÑeÑeãeèeèeúeÿeÿefff(f-f-f-f-f4f9f9fKfPfPfbfgfgfgf~f®f¿f¿fÐf×fÞfçföf@h9Äó @a†ÏaÏaáaêa÷abb)b)b=b?b?bSbSb[b[bpb}b}bŠb’b’b¡b³b»b»bÏbábébébýbccc -/a† @Êϼ_¼_Å_Ò_×_ ÊÏ xš¦B"B"R"b"v"‚"œ"¢"¤"¤"¬"š¦ˆ¦´²"²"¾"Î"â"ì"ý"# #!#!#)#¦´`†�Ú!Ú!ã!í!ó!ù!û!û!"†�p�š"" "" "+"3"5"5";"�š@¾Ãd_d_m_z__¾Ã@Úß4`4`=`J`O`Úß@´a´a½aÊaÏaÐÌÒÌÒÕÒæÒõÒÓÓ Ó0Ó@ÓOÓ^ÓnÓ~ÓŸÓ¡Ó°Ó¿ÓÏÓßÓÔÔ Ô!X;CDÕDÕSÕ_ÕmÕvÕ{Õ�Õ;C Ø­ÅÌÙÌÙÜÙèÙùÙÚÚ0ÚSÚ^ÚhÚqÚ~Ú‹Ú˜ÚµÚ¼ÚÀÚÈÚÌÚÔÚ "­Å!HCi„Õ„Õ©Õ®ÕÀÕÊÕÔÕàÕàÕèÕÖÖ Ö(Ö+Ö/Ö/ÖIÖ_ÖbÖeÖkÖ‰Ö�Ö”Ö˜ÖšÖ¥Ö¥ÖªÖªÖ¹ÖÉÖ"0Ci#Pi�½÷½÷Á÷á÷ë÷ -øøø&ø3ø@øuø|ø²øÂøâøù(ù(ùKùYùrù¬ù´ùÄùÝùúúúú"ú;úOúSúWú$1i�%Ba<à<àHàSàSàaàhàhà‡à“à“à¢à¯à¼àÁàÊàÙàßàæàæàêàêàêàêà÷àúà -á&)Ba'��Ÿ]ú]ú€ú›ú©ú´ú¸ú¼úÀúÊúÔúÔúÖúäú(�Ÿ)p0;ÄÔÄÔÍÔÍÔõÔÕ$Õ1Õ;Õ@Õ*0;+¸)=´è´èÈèÈèðèé é-é8éEéNéXébélévé~é†é,)=-¶ÔtätäŽä�ä¥ä¸äÊäÕäÕäàäöäúä -ååå$å$å*ånåuåuå—å—å¯åÝåãåæ.(¶Ô/ •¶ÌâÌâåâåâóâóâããã=ã`ãnã~ã‰ã¢ã½ãÒãêãÿãä2ä2ä4ä6äKäPäPäbäeäqä0+•¶1$ÄÝÄÝÔÝÝÝîÝîÝÞ9ÞHÞUÞ`ÞmÞwÞ�Þ‹Þ•ÞŸÞ²ÞÅÞÅÞÕÞÕÞâÞôÞþÞß2'$3$B ß ßß$ß-ß>ß>ßf߉ߘߥ߽߰ßÌßÛßåßòßüßàààà à"à/à2à:à4($B5¨…—Ü×Ü×ê×êר5ØBØOØZØgØw؀؊ؔ؞ئجØ6…—7°r… × ×××=×`×m×zׅגן׬׶×À×Ê×Ò×××8r…9È—­¬Ø¬Ø»Ø»ØãØÙÙ,ÙDÙIÙaÙaÙvÙvً٠ٵٿÙÅÙ: —­;à)ÄçÄçÎçÓçÛçâçççççè2è?èLèWèdènèxè‚èŒè–èžè¥è¥è¨è®è<#)= ar á ááá$á3áDáHáUámásáyá~á€á…á>ar?È=sŒéŒéžé¦é°é¼éÊéÚéÚéê%ê4êAêPê\êkêwê�ê…ê�ê—ê—ê¿êâêðêë ëë'ë3ëBëNëXëhëmëuë ë¤ë¶ë»ëÈëÒëàëàëêëôë@@=sA`irÌÖÌÖÛÖåÖîÖùÖ×× ×BirCx‰•\â\âpâ‚â‰âŒâ�â“âšâºâÊâD‰•EÀÔé æ æ*æ.æ4æ:æ=æ=æHæHæ\æiæsævæyæ{æ‰æF ÔéGÐr‰ŒáŒáªá°á¹á¹áÂáÂáÑáÞá ââââ-â-â-â>âKâKâYâH!r‰I(ÅÔÚÔÚÞÚæÚëÚôÚôÚÛ?ÛGÛOÛZÛ_ÛsÛ‘Û˜Û˜Û¦Û¯Û´Û¶Û¿ÛÎÛÕÛÜÜÜ%Ü4ÜUÜ]ÜpÜ€Ü�ܠܯܿÜÏÜßÜùÜþÜÝÝ ÝÝ+ÝLÝWÝfÝv݆ݖݭݭݭݹݿÝJLÅK˜i=ó=óSófóróróró~ó~ó�ó�ó£ó¬ó½óÆóðóõóõóôôô-ô-ô9ô9ô`ôcôcô‚ô¡ôÀôÎôåôüôþôõ -õõ&õ=õ\õ{õ‰õ õ·õ¼õÂõÈõÍõäõûõûõöööö"ö9öPöPöVö\öaöxö�ö–öŸö©ö¿öÞöâöº÷LZiMðî ÄðÄðîðòðöð ññ3ñ3ñCñOñkñpñ|ñ‚ñ…ñŒñ�ñ”ñ˜ñœñœñœñFòN%î Oˆ MòMòRò\òfòpòzò˜ò˜ò¥ò®ò®ò6óP Qp­¸õ!õ!"" " """ "("R­¸Ss’ôëôëìì ì(ì1ì:ìBìHìKìKìWìWìƒì�ìšì�ì ì§ì²ì¸ìÅìÅìÅì×ìT)s’Ux$0lÔlÔuÔuÔ“Ô—Ô¤Ô°Ô¸Ô¸Ô¸Ô½ÔV$0Wx$ÔÔÔÔ;Ô?ÔLÔXÔ`Ô`Ô`ÔeÔX$YPéŒæŒæªæ°æ¹æ¹æÅæÅæÔæáæåæïæççç ç$ç&ç;çFçNçSçbçbçbçiçwç…ç�ç’ç˜ç¥ç²ç²çÄçZ1é[À3߳߳󳴴)´B´I´K´W´p´Š´•´›´Ÿ´©´\ 3]ˆ?Mµµ)µ<µUµ[µjµqµ‡µ�µ“µ­µ^?M_x3?¯´¯´¿´Ñ´×´æ´í´µ µµ`3?a�`oïPïPóPQQ'Q9QXQ_QuQyQ‹Q‹Q´Qb`oc yªŽuŽu¢u¢u©u±u±uÆuÏuÏuÏuêuðuðuúuv vvv/v1v<p‘ˆ5ü5ü>üDüDüOügürüwüƒü‰ü‹ü‹ü�ü’“ ¿MM`cct€‘•˜˜¥®®¸¸¾ÅÉÒÒÛàðÿ ”) ¿•°/íüíüüüýý ý%ý*ý4ýHýOýWý`ýeýkýmýmýsý–/—°,?='='C'V'i'q'¢'ü'(˜,?™xp|¥ÿ¥ÿ«ÿ³ÿÄÿÄÿæÿîÿñÿóÿ÷ÿšp|› ^o¤c¤c¸c¸cácâcãcícïcøcücdd ddddœ^o�pozdd.d@dRdfdpdydƒdžozŸ’¯ÜìÜìêìùìüìí=íGíhírí{í©í¶íÀíÆíÐíÐíÜíßíáíáíëíñíôíWî '’¯¡¯î\î\îlîsîƒîŠîŠî î î¬îÓîòîïï/ï3ï9ïGïKïQï_ï_ï_ï~ï�ï²ïÇïËïÑïßïãïéïûïûïûïûïþïððð ð#ð)ð4ð8ð>ðIðIðIðNðTðeðiðoðzð~ð„ð�ð�ð�ðÂð¢I¯î£Ø‘© -A -A'A*A8A9A:ADAKAPASAYA\A\AdAiAiAnAqAtAwA‡A¤"‘©¥¨¾ÐBB:B=BKBLBMB_BoBzB€B€B‹B‹BŒB�B�B¦¾Ð§À©¾ŠAŠA£A©A·A¸A¹AËAÖAÚAáAäAîAõAB B B -B BB¨ ©¾©HÇͧU§U°U¾UÚUßUªÇÍ«ˆÍÛßUßUéU÷U VVV)V(>(K(K(U(Y(Y(c(e(e(º(ÒÓ`:Cååó -$Ô:CÕˆ�›RËRË`ËqËtËxˆË�Ë�˞˱˴˺ËÖ�›×8Y�w›w›{›ˆ›—›œ›œ›°›Å›Þ›÷›ÿ›œ1œEœ“œ•œ™œØNY�Ù 5Fj4j4v4|4‡4‡4�4“4 4©4©4­4°4¸4Ú5FÛÀ“¨Z7Z7j7x7}7ƒ7Ž7—7—7¡7­7±7É7É7Ð7Ó7Õ7ø7Ü “¨Ý@ÛàGVGVKVPV_VÞÛà߸&zªšªšÀšÚɚؚãšíšùš››$›3›O›O›S›o›{›˜›˜›¥›¥›¥›³›ì›ø›œœ$œ1œ1œBœTœaœaœrœ„œŒœœœ­œ³œÚœìœñœøœ��� �"�"�-�/�/�:�<�<�F�I�I�U�a�z�ƒ�Œ�—�§�®�®�®�®�¿�Ø�Þ�å�ë�î�Sžà^&zᘔɔɤɩÉÂÉÎÉÖÉíÉ÷ÉÊÊÊ Êâã>|ˆ@ˆ@–@›@¢@¸@¸@¿@Ö@Ö@Ü@äH>|åH)/à?à?î?õ? @@æ)/爙§ý -ý -   . . ; = J Q W q { è™§épø|È|ÈŒÈËÈÒÈØÈåÈðÈøÈûÈÉêøëˆ'‚3‚3’3”3•3–3›3Ï3Ô3ï3ô3õ3ø34ì'í� -33#3@3I3V3X3Z3i3i3x3z3z33î -ï€ÌÙ���²ºÆé <AIðÌÙñ ÉÚÕÕðö 4=HHQsòÉÚóH ÅÅÓÙäêô õé ��‘šª¹ÅÞÞÞæëë?W_aajjj|ƒƒ•š¾ö*é ÷¸tˆ  79R_fq…�Ÿ¸ÅÅ øtˆù  -¶y¶yØyòyþyzzz)z1z7z=zFzUzazwzŽz‘z“z¥z»zÁzËzÏzÔzÝzãzæzøzú+ -û(`Bº\ºvº�º™º�º¯º¸ºÁºȺȺѺÚºÚºòº»»»,»5»?»Q»Q»i»|»…»™»¡»§»°»¶»½»¿»»Æ»Ö»ã»ó»ö»¼ ¼¼!¼(¼,¼4¼<¼D¼V¼\¼b¼i¼o¼y¼¼‹¼’¼”¼æ¼üL`ýÈB¹T¹V¹^¹{¹„¹š¹¨¹­¹À¹عÞ¹ê¹ô¹ô¹ººBºþ ÿ@JOú1ú1þ1 22JOhOY222 202Q2f2f2f2j2OY@EJâ1â1æ1õ1ù1EJ@Y^j2j2n2{22Y^@^c‚2‚2†2‹2�2^c @ch’2’2–2«2¯2 -ch @hm²2²2¶2Å2É2 hm 8mqÊ2Ê2Î2á2mq€‡”´Ã´ÃÄÃÒÃÒÃßÃÄ ÄÄ Ä"Ä*ć”-Z;Z;w;z;ƒ;ƒ;Ÿ;²;Ò;Ú;ô;ü; <<<$<*<1<1<><A<J<M<P<U<|<(-`3<¢<¢<°<¼<Ó<×<Ù<í<3<`ÇМ’œ’¡’©’¹’Ã’Ó’Õ’Ø’ÇÐ`&|�|�…�…�…�›�¸�¸�½�&p³¾"O"O0O1O2O9O@OBOIO³¾ðOj’J’JšJ¤J²JÊJ×JìJìJK"K)K6KAKHKYKYKjKqKxK“K®K´K%Oj˜Ýíº9º9Ì9Í9Î9Ø9ó9:::.:4:I:Ýí  íþJ:J:b:c:d:n:‰:”:¡:¢:½:Ã:Ï: íþ! þÒ:Ò:ê:ë:ì:ö:;;';(;C;I;U;"þ# ÌÝ*9*9697989B9]9q9~99š9 9µ9$ÌÝ%(-OFFF(FŒJ&,-O' »Ì’8’8¤8¥8¦8°8Ë8Ý8ê8ë89 9$9(»Ì)°¨»ú7ú7 8 88838=8D8K8X8Y8t8z8Œ8*¨»+pãî»»»%»0»0»;»?»?»E»,ãî-�x‡ ¿ ¿#¿/¿6¿B¿O¿W¿b¿b¿y¿‹¿Ž¿˜¿.x‡/‡§œ¿œ¿¹¿¼¿È¿Ï¿Ü¿ß¿å¿ñ¿ö¿ À+À/À:À:ÀPÀSÀYÀYÀjÀvÀxÀxÀxÀ�À¡À¤À´À0*‡§1Pü»ü»¼¼'¼1¼23PK R : -: -P -c -l -r -z -4K R 5ˆîüL»L»\»y»‡»—»™»›»§»«»«»³»6îü7pü´»´»¾»Õ»à»à»ë»ó»ó»ù»8ü9Ðõ r¢r¢…¢‡¢š¢¯¢¯¢Ì¢΢΢ë¢í¢í¢÷¢ù¢ù¢££ £ £a£:!õ ;p É ÉÉ[ÉbÉmÉxɀɃÉ�É<=hëõ2¢2¢C¢V¢b¢h¢h¢p¢>ëõ?ÐÖ ].].x.z.Œ.š.¦.µ.º.Ã.Ã.Æ.Ë.Ë.Õ.Õ.ß.ß.é.ì.//*/¹B¹RS€ ­e!e!i!m!|!Œ!Ò!Ù!æ!ì!ð!T ­U�¶Åý ý    $ 0 8 U d j m y V¶ÅW�§¶} } Ž ˜ › ¤ ° ¸ Õ ä ê í ù X§¶YÀK`¤Ï¤ÏÀÏÌÏ×ÏÜÏêÏõÏÐ -Ð#Ð'Ð+Ð1Ð4Ð;ÐFÐFÐRÐZ K`[x?K\Ï\ÏnÏxÏ|Ï�Ï�ϒϖϚϤÏ\?K]H'-”ΔΞΦθξÎ^'-_H'$Í$Í2Í=ÍBÍPÍ\ÍhÍqÍ|͇͒͗ͥͳÍÁÍÁÍÚÍèÍïÍÎ"Î*Î2Î=Î?ÎPÎ[ÎpÎ{Î}ΆÎ�Î`0'aȃ™- -- -1 -= -F -U -a -j -q -€ -� -” -š -Ë -Ë -Ë -Ý -ä -ä -ö -÷ -û -b ƒ™cÈ`vTÐTÐ`ÐpÐ{ЀÐ�ЖКРЦЮжоÐÝÐàÐëÐëÐóÐd `vep4?ÏÏÏ/Ï;Ï?ÏCÏGÏOÏWÏf4?gP-4ÄÎÄÎÍÎÛÎêÎùÎþÎh-4ixý ²í²íÈíÛíàíëíôíúíúíîjý kˆ;)ÙÙ,Ù4ÙOÙZÙgÙtÙ�٘٭ٮٯÙÊÙÕÙãÙóÙüÙÿÙ Ú Ú(Ú-Ú4Ú4Ú<ÚVÚYÚgÚvÚ‡Ú�Ú“Ú“ÚŸÚ®ÚÆÚÊÚÏÚÜÚùÚÛÛÛÛ,Û,Û>ÛFÛHÛRÛRÛRÛYÛaÛhÛrÛ{Û‰ÛŸÛÂÛÂÛÝÛÝÛäÛîÛÜ&Ü+Ü+Ü2Ü:ÜPÜrÜwÜwÜzܙܜܨܫܮÜÌÜÌÜÑÜÑÜÑÜÙÜÞÜâÜòÜõÜÝÝÝÝ&Ý-Ý7ÝMÝkÝnÝpÝpÝƒÝŠÝ’Ý¨ÝÆÝÉÝËÝËÝêÝíÝ ÞMÞXÞcÞlÞuÞyÞ‡Þ�Þ�ÞªÞªÞªÞ¯Þ¯Þ¯Þ»ÞÎÞØÞéÞìÞïÞôÞôÞùÞßß:ß>ß~߉ߔ߭߶߿ßÃßÑß×ßÚßßßßßïßòßõßà ààààà.à:àFàVànà“à©à­àÃàÝàëàôàøàûàûàûà áááá$á0áMáPáRácájává�á¥á¨á¯á²á´áÔáéáðáðá÷áâ ââ$â*â1â<âEâTâcârâ’â“â×ãlø;)m€)6ÚãÚãèãôãä ää%ä+ä3ä9äGän)6o¸;z×z×�טלןת׼׼×Ê×ß×ì×ï×ø×ØØ Ø(Ø,Ø6Ø>ØAØDØXØXØoØw؎ؕ؞ءأسضظؽØÇØÍØÔØרøØÿØÙp>;qX Ê&Ê&Î&Ö&Þ&æ&ê&î&r shò&ò&ö&þ&''''"'&'tuˆ)*'*'.'6'>'F'N'V'^'f'n'r'v'v)w€JOJOVOYOgOnOzO}O€O…O�Oxy9v ¢ ¢5¢8¢E¢W¢k¢{¢¢•¢ ¢¯¢¢ñ¢ñ¢õ¢£ ££££££££'£B£B£G£U£h£s£|£†£•£Ï£ÿ£<¤N¤^¤~¤~¤�¤�¤�¤œ¤œ¤¬¤°¤°¤µ¤µ¤ï¤zG9v{¨—˜—˜›˜´˜ØÕ˜Ú˜ð˜÷˜ ™™/™I™J™Y™^™^™`™|}xfr|¾|¾�¾‹¾•¾£¾¯¾³¾·¾·¾â¾~frØ-Eþzþz{${.{A{K{h{j{v{�{ˆ{Œ{”{˜{ {¦{¬{¬{»{€"-E�ðàB}B}F}J}R}c}r}|}ˆ}Ã}Õ}ç}ç}ë}ú}~~~~ ~/~L~S~S~i~q~„~“~´~Ä~Ì~Ñ~ä~ó~$/ASnuu‡‡••–¨¨¶º¾‚EàƒYÂÂÆÎßîø€€€€€-€g€v€Š€±€º€ÀÀÈ€Û€à€ë€���M�ƒ�—�§�½�Ñ�Ø� ‚?‚S‚c‚e‚e‚l‚l‚~‚~‚Œ‚Œ‚�‚Ÿ‚Ÿ‚­‚±‚µ‚„HY…ˆåóÒqÒqâqâqïqÿqrr$r;r>rFr†åó‡ £´²z²zÀzÊzÚzÜzôzÿzÿz{{{{E{ˆ£´‰Øó+JrJrdrgrjr{r‰r”r¬r²r¼rßrìrýr ss)s4s]sbshsŽs–sœsŸs¬s½sËsÜsésñsttt7tvSvevmv’v—v¢v´vÙvívûv w$wo£“˜Dtê‘ê‘’’’'’3’;’;’M’M’`’s’‚’‡’œ’ª’ª’¸’Á’Ï’ß’â’å’é’ú’(“0“4“9“A“A“R“c“c“k“s“s“v“©“”:Dt•ØìD"�"�&�>�S�b�l�u�†�ž�¶�Æ�Ù�á�ý�Ž3Ž;Ž`ŽeŽpނޔޝޝŽÓŽñŽüŽ� ��!�0�8�8�g���Á�”�œ�‡�ç����7�Q�[�n�v�a�Á�Á�Á�÷�÷� ‘ ‘#‘5‘=‘P‘h‘{‘ƒ‘ƒ‘‘‘𑥑¥‘³‘º‘őőӑӑؑ摖bìD  —˜tĪ“ª“®“¹“ɓѓѓõ“””"”6”N”^”t”‡”�”«”À”Ò”Ú”ÿ”•••.•S•g•†•••Á•̕ԕï•ú•–2–R–^–g–}–�–¸–ÖË–è–ó–ó–þ–þ–——*—<—O—O—X—X—k—~—†—†—†—”—Ÿ—¦—±—²—Æ—Ê—Ñ—˜ZtÄ ™P@‡mjmjqj�j‘j¡j°j¹jÇjÕjÜjæjñjkkk.k;kOk\kpkzkŽk˜k¬k¶kÊk×k×käkïkúkl5lClQl^liltl…l£l·lÇlÑlâlólmmmHmVmkm�m§m°m¿mÚmñmúmn nn!n*nLnšQ@‡›x´àJ{J{N{V{_{~{…{•{š{©{³{¿{Ê{Ê{Ù{ú{|+|3|I|T|T|\|\|k|Œ|­|½|Å|Û|æ|æ|ø|ø|} } } } }-}-}.}.}?}œ6´à�`ÄíÒ—Ò—Ö—æ—÷—˜˜ ˜-˜H˜]˜c˜g˜k˜s˜{˜„˜š˜¢˜·˜½˜Á˜ŘɘјÙ˜â˜ø˜ ™™™%™,™,™=™F™ž3ÄíŸà/MhMhQh`hoh}h˜h¸hØhöh'i:iKiVicizi•i•iªi±i±iÆiÇiËi #/¡�ª¹ÅoÅoÙoÜoôoýop+p=pIpSpfptp{p‡p¢ª¹£ð‡¢MnMn]nrnxn„n”n—n›n¤n´n·nÀnÃnÙnÿnooooJoOoUobo¤%‡¢¥X¢ªeoeooowoo·o½oÃo¦¢ª§èJdÒ±Ò±ܱå±ë±²²²#²#²2²2²O²h²n²²²‹²”²š²š² ²¨$Jd©  JB¯B¯^¯m¯y¯„¯�¯�¯£¯¶¯Á¯ͯܯã¯ï¯ô¯ø¯°°$°$°$°?°Q°e°s°ˆ°ްް²°º°º°°ưʰà°î°ô°ô°(±7±N±R±Y±d±i±i±i±~±„±£±¨±¨±´±º±À±±Ò±ªK J« ‚³Â³³ä³ì³ø³ ´ ´´%´5´D´D´J´e´h´m´{´�´–´ ´ ´µ´µ´Ë´Ù´µ0µ:µ=µ@µEµSµsµ}µ€µƒµ‹µ™µ¹µõƵƵ͵ѵ㵬;‚³­d‚¢²¢²Á²ŲÒ²زܲï²³³³³0³<³C³V³[³_³r³“³“³�³�³±³±³´³³®(d‚¯X "¯"¯+¯+¯6¯8¯8¯=¯° ±¸³êµêµ¶ ¶¶%¶%¶6¶>¶N¶N¶[¶j¶p¶ˆ¶‹¶�¶•¶¤¶¯¶¶¶º¶¾¶̶à¶ç¶ñ¶÷¶ú¶· ···2·4·7·7·9·S·_·Š·³···÷Ê·Ñ·×·Ú·ç·ç·ü·ü·ü·¸ ¸.¸2¸=¸@¸C¸I¸L¸Y¸Y¸n¸n¸n¸v¸‚¸£¸§¸²¸µ¸¼¸͸Ô¸å¸å¸ì¸¹²^³³X‹³M2M9M9MUM_MdMwM‚M‚M˜M¢M´M¹MÃMÍMÕMßMòMüMN0NTNZN^NaNuN}N„NŠN‘N˜N©N®N®N!O´2‹³µ j‹ºKºKÄKÅKÆKÐKèKóKLL-LBLKLPLPLZLfLlLxL�L�L²L¼L¼LÅLÊLÐLÑLM¶+j‹·xžªtttt t tAtNtOtXt¸žª¹Hbhórórürs -ssºbh»X–žósósüsýsþstt t¼–ž½ hyss#s$s%s3s9s:s>s>sLsPsQsUsUs]s¾hy¿xVb“r“r£r±r¼rÍrÕrÝrårèrðrÀVbÁˆˆ–³s³sÁsÂsÃsÍsÎsÒsÒsãsäsèsèsîsˆ–Ã�yˆcscsqsrsss}s~s‚s‚s“s¢s£s§s§s­sÄyˆÅ€IVKrKrUrVrWrWryr†r‡rŠr�rÆIVÇH CqCqLqTqZq_qÈ ÉXAI+r+r4r5r6r>r?rDrÊAIË $cqcqtquqvq„qŠq‹q�q�q™q�qžq¢q¢qªqÌ$Íx ëpëpûp qq q'q/q7q:qBqΠψ3Aóqóqrrr rrrr r r$r$r*rÐ3AÑ�$3«q«q¹qºq»qÅqÆqÊqÊq×qæqçqëqëqñqÒ$3Ó¸zŽZžZždžnžuž|ž…ž“žžž ž­ž¹žÖžßžèžîžöžÔzŽÕÈŽÄúžúžŸŸ(Ÿ(Ÿ8Ÿ;ŸMŸWŸhŸ~Ÿ–ŸšŸÌŸÞŸéŸòŸ  C S c o o ƒ † ” ¡ ª º ¼ Ï Ù é ò ¡ ¡ ¡ ¡¡¡¡"¡$¡'¡F¡Ö@ŽÄ×p)ÊÊ"Ê(Ê2Ê9Ê?ÊIÊLÊRÊØ)Ù` -¿¿¿¿7¿=¿?¿E¿Ú -Ûx -L¿L¿\¿k¿k¿{¿~¿€¿ˆ¿‹¿“¿Ü -Ý j»"¨"¨<¨?¨B¨B¨b¨r¨¨¨ލ˜¨®¨®¨·¨½¨Ô¨ç¨ü¨ü¨©©©4©6©6©Q©S©S©]©]©g©”©š©�©éé̩ҩé©ü© ª+ª>ªSªSªnªpªpª‹ª�ª�ª«ª°ª°ªºªºªɪöªüªÿª ««0«4«G«G«P«S«ò«Þ[j»ß(ÖøôÆôÆÇÇÇÇ&Ç)Ç:Ç>ÇBÇeÇrÇ‚Ç�Ç—ÇžÇÝÇåÇÈÈÈ$È+È2ÈSÈYÈ`ÈcÈyÈà,Öøá˜)9TÊTÊ^ÊaÊmÊzʄʑʩʩÊÈÊÈÊåÊéÊíÊóÊâ)9ãØ db£b£}££�£—£££±£¼£é£¤#¤+¤C¤U¤c¤h¤z¤‘¤›¤³¤³¤¸¤ΤΤÖ¤ܤó¤ ¥ ¥4¥6¥6¥^¥`¥`¥ˆ¥Š¥Š¥”¥”¥š¥�¥¢¥¸¥¸¥À¥Æ¥Ý¥¦ ¦(¦(¦P¦R¦R¦z¦¦¦§¦¬¦¬¦¶¦¶¦Á¦ĦΦâ¦ì¦§ §§@§I§P§Y§\§ÿ§äb dåh»Åò«ò«¬¬¬ ¬"¬"¬(¬æ»ÅçÀÅÚ*¬*¬:¬S¬h¬t¬‰¬’¬’¬´¬Ò¬߬æ¬æ¬æ¬ê¬ê¬ò¬è ÅÚéXÚò¬ò¬­­ ­.­G­\­\­\­„­†­†­†­®­°­°­º­¼­¼­Æ­Æ­ê­ÿ­®®®1®H®i®r®x®®‚®ß®ê2ÚëØÄÜJ¡J¡\¡\¡|¡�¡�¡£¡§¡ª¡´¡ì"ÄÜíh(RtÀtÀˆÀ”À·À¹À¹ÀÇÀÑÀÛÀëÀíÀòÀòÀÿÀÁÁ"Á>Á@ÁBÁ^Á`ÁbÁ~Á€Á‚ÁžÁ Á¢Á§Á§Á§Á§Á¬Á¬Á³ÁºÁ½ÁBÂî4(RïpFQŒ�Œ�•��� �®�²�À�Ä�É�ðFQñxam$�$�-�5�8�F�J�N�\�`�e�òamó @Qºäºä¿äÊäÏäâäëäðäõäå -å -ååô@Qõh4>8@8@F@F@a@a@d@{@{@�@ö4>÷@$)¸?¸?Æ?Ú?à?ø$)ùXYa¯Œ¯Œ¹Œ»ŒÍŒÕŒÚŒàŒúYaûP�ÄR¿R¿r¿{¿ƒ¿ˆ¿�¿—¿—¿œ¿¦¿«¿¹¿¹¿À¿Æ¿Ì¿Ô¿à¿æ¿è¿è¿ï¿õ¿û¿ÀÀÀÀÀ!À#À#À-À-À•Àü1�ÄýèõzCzCˆC–C¬C»CÀCÊCÌCÕCáCéCôCDD'D'D.D.D.D"Eþ$õÿp"E"E0E>EFEQEjEoEvE|Ehµ¿ç�ç�ÿ� ���'�*�?�µ¿PÀÇt’t’x’‚’“’•’ÀÇè†Àô�ô�‘‘‘‘‘"‘$‘&‘,‘,‘0‘9‘;‘?‘F‘L‘S‘Y‘`‘f‘m‘s‘z‘€‘‡‘�‘”‘𑥑«‘¯‘¹‘Á‘Á‘ʑˑˑܑï‘ñ‘’ ’’*’9’H’W’f’f’p’D†À`2 ; ’ ’ ¦ ´ º 2 ;  €*WÌÌ.Ì7ÌZÌdÌ~Ì�̑̔̚Ì�ÌËÌØÌÞÌíÌíÌ÷ÌüÌÍÍÍ$Í'Í1Í4ÍbÍoÍǘ͎͓͙̈́ͨͨͨͨͳͳÍÁÍ -7*W ²2 RRptww‹ž­·»¾ÀÊÎÑ×Úí(8BNRehty„ŒŸ¹ÅÈÈÜðúú 1=XXXl€Ž“““§·¾ÃÃÃ×çþ -KPPVjz˜���±ÁÏÔÔÔèø    /=??????Sgwyyy��§§®®··À’  в2  h‹µoŽoŽ‰ŽŸŽ¹ŽÈŽâŽìŽñŽ ����%�/�0�1�:�?�@�N�S�U�d�i�x�‘�˜�²�²�Ä�Ð�Ô�à�4‹µ�apçŒçŒ��'�0�D�M�R�]�w�z�ˆ�apx T¼T¼Y¼c¼c¼t¼v¼¨¼¯¼¯¼¯¼²¼ ð–±g¯g¯y¯z¯{¯Œ¯ޝ ¯£¯¨¯²¯À¯ϯЯЯܯå¯ë¯ñ¯ô¯°°°°%–±8Æê_�_�z�|���’�œ�½�Ö�à�ë�‘ -‘ ‘ ‘‘$‘*‘,‘2‘8‘;‘A‘C‘L‘X‘^‘^‘^‘e‘v‘.ÆêH#ïWïWùWXX X#` -åå$å.åBåHåJåPå -ßÿllu�œ¥®·ÀËÔÝÝèîð€ € €€%€%€K€K€M€]€c€h€*ßÿ€ ´€´€Ü€ê€õ€ù€ý€����!�1�  ˆÿ l€l€x€€ƒ€ˆ€Œ€’€•€ €¦€®€ ÿ !hÕß,8KS[^f"Õß#XÍÕì~ì~õ~õ~$ÍÕ%¨�¡eee e1e:e=eDeTege{e…e�e’eže&�¡'€[ˆüjüj kk k k'k'k4k6kLkSkSkZksk€k‰k”k£k¦k­k²k²kºk¿kÌkÑkãkêkll,l,l,l0l5l5lCl(7[ˆ)Pb i ú -ú -þ -   S *b i +H j/u/·/Ë/Î/Ô/, -èg�Ç\Ç\Ë\Ö\á\ì\÷\] ]])]:]K]V]a]s]…]Œ]“]š]¡]¨]¯]¶]Â]á].$g�/P#J X XHXRXvX�X�XËXËXïXYYDYDYiY€Y€Y­Y­YÕYýY&Z8ZHZ]ZvZˆZ˜Z­ZÆZÍZÔZÛZùZ[%[01#J1Ès‰m=m=…=–=¨=°=¸=È=È=Õ=ã=ê=ù=>>> >">.>2 s‰3˜ôýBýB CC%C'C?CJCJC[CeCeCgC’C4ô5ˆIW=<=<F<W<_<g<u<}<…<�<•<Ÿ<¤<6IW7ð‰Ä5>5>9>=>=>a>j>q>�>†>•>¡>¹>Ï>ô>*?L?d?m?o?w??–?ž?©?¶?º?¾?À?Ó?Ú?í?@@@4@6@:@:@:@F@R@R@W@`@`@r@y@y@‹@Œ@‘@¤@8E‰Ä9˜Äô¥@¥@©@±@º@Î@â@ö@ý@ AA!A*A>AeAzA�AªA²AÎAðAûAB7B@BNB`BbBtB€B‚B�B¡B¡BÂBÂBÍBÔBßBàBäB÷B::Äô;Ð;•C•C«C²CÃCÆCÆCêCýCD!DJDfDwD~D€DƒD‰D�DžD¨D®D±D´D¶DÂDÙDáDýDEEE&E6EBEUEqE†E‰EŒEœE¤E¤E¬E³EºEºEÈEàE<A;=øWs¥<¥<¹<Ê<Ñ<Ý<à<õ<ø<ü<þ<== ====.=.=8=N=T=W=Y=_=k=>&Ws?Ð<11 1151I1M1\1h1v1…1½1½1ì1 22 2E2E2S2p2p22Ž2¢2Ç2Ë2Í2Í2Ü2Ü2Þ2Þ2è2÷2÷2û23 3 33"303?3j3s3s3…3…3‹3Ý;@A<A88<r1|1¡1¦1B8<Cp,ç‰ç‰ë‰ñ‰ŠŠŠ5ŠRŠRŠYŠZŠkŠvŠvŠ…Š…Š–Š¨Š­Š¹ŠŠÇŠ׊׊óŠúŠ‹‹‹!‹!‹!‹A‹a‹a‹{‹€‹‚‹D5,E@•š#o#o'o2o4oF•šGxeqëmëm÷mn nnn!n$n,nHeqIÀq†3n3nQnUn_npnqnrn~n‡n¦n²n»nÅnÆnÉn×nJ q†Kˆ¡¯[o[ocozo…o‹o‘o—oªo±o¶o¼oL¡¯M¨¯ÁÃoÃoÉoÕoèoóo p ppp&p2p;p?pCpGpN¯ÁOÀÁÖKpKpPpQpRpZpvpxpŽp¤p·pÍpçpëpP ÁÖQPš¡;o;oCoIoOoTo[oRš¡S€1>²'²'·'·'Ï'Ñ'Û'æ'ï'ý'( -((T1>U�†•ÛnÛnßnånënñn÷nýno oooooV†•W` -â2â2ç2ñ2 33333X -Y�Ü뺡º¡Ê¡ß¡é¡û¡¢¢ ¢¢¢¢,¢ZÜë[` (ÀÀÀ&À_ÀeÀgÀgÀmÀ\ (]` ”¿”¿ž¿¶¿ï¿õ¿÷¿÷¿ý¿^ _`~‡„ÄÃ�ØØãççíÃ`~‡a8<@ª1®1¼1¾1b<@c8ùýò.ö.//dùýe8 Ú/Þ/õ/÷/f g8,0ú0þ0 1!1h,0i8J/N/e/g/jk848Z1^1l1n1l48m`DMßšßšèšöšüš››››nDMo82060D0F0pq8 #‚0†0”0–0r #s&†/s/sVsYs]sfsispspstsœs¸s»sÊsÎsÕsîs÷sùsttt"t't,t6t;t@t@tGtLtQt[t`tetetltqtvt€t…tŠtŠtŠt–t˜t§t§t§t³tµtÄtÄtÄtÐtÚtßtâtätätätít÷tütÿtuuu -uuuuuu,u1u5u7u7uø>ü>ü>??$?(?,?ž -Ÿh&DbDbNbPbUbXb[b`bfb &¡hüaüa bb b.b1b7b?b¢£hÔaÔaÞaãaæaìaïaña÷a¤¥h&0lblbvbxb}b†b‰bŽb”b¦&0§ ß l‰l‰†‰—‰®‰´‰»‰»‰Å‰É‰É‰Ø‰ä‰ä‰ ŠŠŠ%Š4ŠGŠGŠSŠpŠrŠ�Š’Š•Š—Š—ŠšŠšŠ°Š·Š·Š»ŠÆŠÝŠÝŠéŠïŠýŠ‹+‹A‹G‹Z‹Z‹t‹}‹€‹˜‹¨Kß ©h *œ‹œ‹ ‹À‹ñ‹ª *«8?ƒt‚t‚Š‚•‚—‚›‚³‚¿‚Â߂é‚ð‚û‚ƒƒƒ ƒ'ƒ1ƒ7ƒ>ƒJƒVƒ^ƒgƒkƒ|ƒ|ƒ|ƒ…ƒ‰ƒ�ƒ”ƒ”ƒ¦ƒ¹ƒÂƒÅƒÅƒÓƒâƒäƒäƒïƒûƒûƒûƒ„„+„0„C„H„a„a„a„t„ž„¬N?ƒ­ðŽÉü„ü„……-…9…=…Y…k…k…k…w…ƒ…Š…Š…•…Ÿ…¯…¹…¾…¾…Ç…×…Ü…Ü…Ü…î…ó…ö…††#†%†%†%†;†A†M†Y†`†d†t†t†w†ƒ†”†¦†¨†¨†­†Ï‡®EŽÉ¯ÈÉßÔ‡Ô‡è‡÷‡ý‡ˆˆ)ˆ)ˆ3ˆ5ˆ5ˆ?ˆAˆAˆLˆLˆNˆj‰° Éß±�tZ Z ^ o € ‘ ¢ ³ Ä Õ æ ÷   * ; L ] n †  — � ¨ ¡ ¹ ² à Ô å ö     0 ) A : R K c \ t m … ~ – � §   ¸ ± É  Ú Ó ä ü õ  þ²yt³œÚ¹¹"¹,¹/¹9¹S¹S¹_¹i¹s¹v¹y¹y¹}¹}¹º¹½¹À¹Â¹Õ¹Ø¹Û¹î¹ô¹ú¹ú¹º -ººººº$º$º0º2º2º<º<º<º>ºLºSºSºSºYº\ºaºdºiºtº{º~º�º´HœÚµ°‰œ¤¸¤¸²¸»¸Ç¸Í¸Ð¸Õ¸ß¸â¸ç¸ç¸ô¸ø¸û¸û¸¹¶‰œ·hßéT`T`t`x`Ž`¢`¬`¯`¿`¸ßé¹pÏÚÜ_Ü_î_÷_` ` `#`-`ºÏÚ»P¿Æ?�?�H�Y�^�¼¿Æ½ØÔìzÍzÍ~͇ͯÍÕÍàÍòÍõÍÎÎ Î Îξ"Ôì¿`{„šÒšÒžÒ£Ò½ÒÖÒÛÒÝÒÀ{„ÁXìÎÎÎ Î5Î8ÎCÎQÎZÎeÎn΀΀ΕΠΡΣΣΣÎÇÎåÎåÎåÎïÎøÎþÎÏ ÏÏ'Ï0Ï9Ï?Ï?ÏHÏJÏJÏoÏÂ2ìÃP†ÚÊÚÊãÊôÊûÊË ËĆÅx„�âÒâÒîÒñÒöÒùÒÓÓÓÓÓ#ÓÆ„�ÇhòÖòÖöÖûÖ× ××:×t×ÈÉP»Â‚̢̖̠̂̆̑ÌÊ»ÂËäâÕâÕçÕóÕóÕ ÖÖÖ"Ö.Ö.Ö<Ö<ÖWÖ|Ö†ÖŒÖ�Ö·ÖÂÖÐÖÙÖãÖèÖèÖëÖÌ*äÍ ›¬ºËºËÉËÒËÜËÞËíËíËîËïËöËþËÌ*Ì+Ì1ÌΛ¬Ïh¬¶2Ì2Ì<Ì=Ì>ÌEÌMÌ]Ì^ÌcÌЬ¶ÑXJR*Ñ*ÑDÑ\ÑfÑÒJRÓ¸RfjÑjÑvÑzіѠѥѨѩѴѹÑÉÑÒÑÓÑ×ÑàÑæÑéÑñÑÔRfÕ@¶»jÌjÌnÌyÌ{ÌÖ¶»×0'JÐÐ(Ð7ÐXÐbÐbÐrÐrÐ�ЋÐ�ГЗЛЧÐÈÐÕÐÖÐ×ÐâÐçÐþÐÑÑÑÑ$ÑØ-'JÙ°'rÏrÏwτυυϊϕϠϲϾϾÏÖÏåÏìÏûÏûÏýÏýÏÚ'ÛÀf{òÑòÑÒ/Ò9Ò>ÒDÒHÒIÒJÒUÒZÒjÒsÒtÒ}ÒƒÒ†Ò–ÒÜ f{ݸ�ä*Ó*Ó6Ó<ÓKÓXÓ]Ó]Ó^Ó_ÓlÓsÓxÓ‚Ó–Ó Ó­Ó»ÓÌÓéÓ+ÔEÔ[ÔfÔƒÔ…Ô�ÔšÔ¥Ô¯ÔºÔÄÔÏÔÝÔäÔäÔðÔðÔþÔÕ$Õ2ÕXÕcÕkÕrÕÕƒÕˆÕ�Õ—Õ«ÕµÕ·Õ¼Õ¾Õ¿ÕÆÕàÕÞ^�äߨÂԢ̢̧̼ÌËÌÌÌÍÌêÌóÌÍ+Í3ÍNÍkÍkÍtÍyÍàÂÔáXC K ò ò  - -" -( -+ -3 -âC K ãà+ä<œ<œEœEœYœkœkœ�œ¤œ¤œÈœºœéœéœ�ÿœ<�<�R�{�{�¥�‘�Æ�Æ�Ü�žž1žžRžRžhž˜ž˜žÉž®žêžêžŸ*Ÿ*ŸUŸ@ŸvŸvŸŒŸ¼Ÿ¼ŸíŸÒŸ  $ U U k Ž Ž ² ¤ Ó Ó ¡é &¡&¡<¡e¡e¡�¡{¡°¡°¡Æ¡ð¡ð¡¢¢<¢<¢R¢‚¢‚¢³¢˜¢Ô¢Ô¢ê¢££?£*£`£`£v£¦£¦£×£¼£ø£ø£¤?¤?¤U¤~¤~¤”¤Å¤Å¤Û¤¥¥¥K¥K¥a¥Š¥Š¥ ¥Á¥Á¥×¥ø¥ø¥¦1¦1¦G¦j¦j¦€¦©¦©¦¿¦è¦è¦þ¦/§/§E§v§v§Œ§µ§µ§Ë§ô§ô§ -¨;¨;¨Q¨‚¨‚¨˜¨»¨»¨Ñ¨ì¨ì¨©©:©:©m©m©ˆ©ˆ©»©»©î©î©ªª?ª?ªiªiªiªª«ªæ°äÃ+äåЌÄτϙϩϰϸϿϿÏÛÏíÏíÏòÏûÏÐ ÐÐÐ!Ð*Ð,Ð,Ð5Ð>Ð@Ð@ÐIÐRÐWÐWÐ`ÐiÐnÐnÐnÐwЀЅЅДÐ�ТЫÐÈÐåÐøÐøÐÑ -ÑþÓæAŒÃçðÐ+Ü’Ü’å’å’ù’ “ “!“D“D“Z“Z“’“¼“¼“Ò“Ò“”&”&”<”<”t”ž”ž”´”´”唕••C•C•Q•…•…•“•¼•¼•Ê•ú•ú•–?–?–M–ˆ–ˆ–––Û–Û–é–)—)—7—r—r—€———З˜˜$˜t˜t˜‚˜Í˜Í˜Û˜!™!™7™S™S™i™‚™‚™˜™±™±™±™Ç™ì™ì™;œèeÐ+é`Ã,ÔÔÔ&Ô-Ô5Ô<Ô<ÔXÔ\Ô\Ô|Ô|ԇԊԌԌԗԚԜԜԧԪԬԬԷԺԼԼÔÇÔÊÔÏÔÏÔÚÔÝÔâÔâÔíÔðÔõÔõÔõÔ÷ÔúÔúÔÕ$Õ$Õ8ÕHÕHÕJÕJÕMÕWÕ\Õ\Õ\Õ^ÕaÕaÕhÕwÕ„Õ†Õ†Õ‰Õ“Õ˜Õ˜Õ˜ÕšÕ�ÕŸÕŸÕ£Õ¦Õ¦Õ¦Õ­Õ¼ÕÊÕÌÕÌÕÏÕÙÕÞÕÞÕéÕéÕúÕÖÖ ÖÖÖ(Ö,ÖòØêsÃ,  ë¨YkÆÆ(Æ4Æ<ÆCÆLÆRÆUÆUÆiÆvÆ|ÆÆ‹ÆìYkíˆ  -î -îî îIîRîTîiîqîwî…îî ï€¿Ì  !-9=Qfnƒ‰ð¿Ìñp J™J™Y™o™~™™™�™£™¥™¥™«™ò óXP?P?T?T?h?l?l?p?ôõý\h\hrh}h‚h‹hžh¶h¾hÆhÓhÝhähëhïhóhþhi iii i#i1i3iAiö)ý÷ -DiDiNiUi`ieini}iƒiŠiŒi�iši iø-ùø¾Ú´f´fºfÇfØfâféfðfùfgg g'g1g9g@gGgOgUg`gdgfgfgjgú&¾Úû¡¾¤e¤e°e·eÊeÖeýefff!f)f5fGfYfYfsffˆf–fœf¢f¥f¬f´fü'¡¾ý ->¤i¤i²iµiÀiÅiÒiÝiìij jjj!j+jþ->ÿp>I,j,j:jAjLjQjSjjjjjsjyj>I¨5G7\7\C\D\E\P\R\X\a\d\k\n\y\z\‚\5GpA¬/W/WEWLWNWZW[W\WfWhWnWnWuWuW{W‚W‚W�W�W—W�W¢W¢W®W¸W¼WÁWÁWÁWÁWÈWÈWÓWÖWØWÝWÝWèWêWòWòWXX XXX(X3X7XBXPX\XfXjXlXlXoXyX}XŠX—X›X¡X¤X«X­X­X½XÃXÌXÓX×XÙXÙXÙXÙXÙXàXäXèXïXòXöXûXYYY%Y/Y0Y3YEYuA¬øàüWZWZqZzZ†Z‰Z–Z›Z¤Z°Z¶Z¿ZÂZÃZÍZÏZÙZäZïZöZúZ[[[[&àüXü$[[-[E[O[d[l[l[r[r[u[|[‡[‹[�[–[ [¦[©[«[®[±[±[¶[Å[È[Ú[2ü$  $5ß[ß[í[ò[ó[ô[ô[\\\ \.\/\/\5\ -$5 p×"'U'U=U?UBUNUOUPUZU\UgUtU|U�U“U•U•U™U©U·UÇUÒU×U×UÞUÞUéUéUVV!V#V)V+V-V/V/V:V}F}F}S}U}b}b}e}&%'PÀç׃׃áƒëƒóƒûƒ„„$„)„;„P„f„|„’„’„¥„¬„¬„ÄЄЄç„ö„ö„ý„… ………(1Àç)€ ß|ß|ë|ì|ò|ø|ÿ|}}}!},}* +x G|G|K|i|z|Š|›|§|Á|Ù|Û|Ý|, -%ƒg}g}k}o}o}v}}}}}…}“}¤}¬}³}³}Å}Å}Ô}Ù}å}ñ}û} ~~!~%~,~9~=~G~K~M~a~h~u~v~€~Š~”~›~¥~¬~±~»~Â~Ç~Ñ~Ø~â~ì~ó~ý~ -8?LMQs€• ­­´Öãéë.h%ƒ/p•À���#�#�q�q�¿�¿� ‚ ‚+‚I‚g‚�‚�‚˂˂ׂÙ‚ö‚ö‚4ƒ4ƒ@ƒBƒ_ƒ_ƒ�ƒ–ƒ›ƒ¥ƒÀƒǃɃ΃Ôƒ05•À1X�•¯€¯€¹€ã€ë€�� -�2�•3@ÖÛ7±7±Q±c±m±4ÖÛ5ˆëùš.š.¥.ª.«.¬.À.Ò.Ó.ç.ê.ð.6ëù7xCo%%)-QZiu� ¸ÈÝÝþ!##DFFOOWWcw�‰‰›¢¢´ÁÍÑ 86Co9�ož  9BQ]iu”œ´ÄÙÙýÿÿ#%%IKKTT\\h|†ŽŽ §§¹ÆÒÖ:9ož;h$4�4�D�R�j�u�w�w��<$=@$)„�„�˜�ª�²�>$)?x3?‚‚&‚)‚7‚T‚X‚g‚j‚t‚@3?Ah)3´�´�Ê�Ø�ð�‚‚‚‚B)3C°b•uUuUyU�U�U�UŸU®U¸UÄUÏUÝUìUýUV!V-V5V=V=VHVJV\VhVzVŽV¯VÃVÐVëVW -WW%W%W7W7WEWLWLW^W^WlWlWqWuWD=b•E -¥R¥R³R½RÍRÚRÏRçRòRòRS S SS9SF-G˜•uWuWyWšW¡W°W½WÉWØWìWXXX'X:X[X[XjXwX€X€X™X™XÇXåXîX/Y4YSYœYnY¬Y¿YZ -ZZ Z1ZCZUZuZŠZ�Z·ZÌZæZòZ[ [[-[E[U[a[t[t[§[²[½[È[â[í[ù[\\ -\\+\w\O\�\—\œ\¼\¼\Ã\]]4]B]B]ƒ]…]…]Š]¥]¬]·]·]Å]Å]Ú]Ú]ë]ò]ò]^^^^^#^Hz•I¨Vh•I•I™I I¯I¿IÆIìIìIýIJ#J*J7J@JDJJVhKȲèåMåMéMíMíMN#N,N3NCNVNeNjNyN…N�N°N°N½NÐNîN÷N÷NOOOO'O1O@OVOlO„O¨O¬O®O³O¸OÁOÁOÓOÚOÚOìOíOòOPL@²èM¸èPP!P)P2PFPZPnPuP…PŠP™P¢P¶PÝPòPQ"Q*QFQNQaQxQxQšQ¥QÆQáQêQøQ -R RR*R,R7RKRKRlRlRwR~R‰RŠRŽR RN>èO >o½`½`ã`î`ð`aaaa(a(a(a;aNa]abawa…aŠa‘a•a£aµa¸a»a¿aÓaäabb b$b,b,b=bNbNbVb^b^bab•bP;>oQà>%^%^)^I^X^b^k^|^”^§^§^´^Ç^å^î^î^û^____(_M_`__’_™_£_±_¸_æ_Ä_.`ü_?`D`V`Z`b`b`p`{`{`‰`�`›`›`©`©`®`¼`RC>Sðoª•b•b™b¤b¬b¬bÐbßbèbübc'c'c4cGcecncnc{c†c‘c–c³c¸c¸cÅcÏcâcïcd"dVdadid„d�d¤dÂdÎd×dõde8eCeKehesesexe†e‘e˜e£e¨e¯eTEoªUhh²EJEJIJYJiJxJ�J�J�JªJ²JÈJÕJëJõJ KK+K5KQK`K`KkK{K�K¡K½KËKäKóKóKLL)L@LILXLtL‹L£L£L°L½LÈLÝLöL MMM"M-M8MEMZMlM¢M«M¶M½MÈMÒMÛMßMVTh²WÀ-b=S=SASESNS\ScSsSxS‡S‘S�S¨S¶SÅSåSÿSTT4TLT[T_TjTvT�T�TŸTÂTÐTßTùT U UUU,U,U:UAUAUSUSUaUaUbUbUtUX?-bYÈåEåEéEøEFF)F4F=FEFGFYFYFkFrFrF„F…F‰FZ [@<�F�F‘F™FÐFßFëFöFG G:GHGPG^GrG”G–GšGšG¥G°G¿GÎGñGüGHHHH,H-H1H\/<]@ªÏµeµe¹eÉeÚeéeöeff*f7fIfXfgfvfˆf�fšf¥f°f»fÊfÙfèfúf ggg$g+g+g9gBg^/ªÏ_è<V5H5H9HHHWHrHrH‘H H®H·HÊHÜH I I7IOIZIZIoIvIvI‹IŒI�I`$<VaH %´¼´¼½¼Ã¼Ð¼Ò¼×¼b %cÐuŒ”ΔÎÀÎÀÎÈÎâÎìÎïÎôÎüÎÏ Ï+Ï-Ï;ÏGÏWÏjÏlÏlÏ~Ïd!uŒePƒŠº@º@¿@É@Î@Ô@×@fƒŠgÐ)T¾T¾d¾e¾f¾q¾v¾‚¾‰¾�¾«¾á¾ê¾ó¾ô¾ÿ¾h!)i°¿Òt»t»�»‘»’»�»¢»®»È»Ï»Ü»é»ð»ù»ú»ý» ¼j¿Òk°Òå ¼ ¼(¼)¼*¼5¼:¼F¼`¼g¼t¼¼†¼�¼�¼“¼Ÿ¼lÒåm°¬¿Üºܺøºùºúº» -»»0»7»D»Q»X»a»b»e»q»n¬¿o�ô4½4½T½U½V½a½f½r½Œ½“½š½§½°½±½½½pôq�ĽĽä½å½æ½ñ½ö½¾¾#¾*¾7¾@¾A¾M¾rs�åô¤¼¤¼ļżƼѼÖ¼â¼ü¼½ -½½ ½!½-½tåôuà5Nbæbæxæ�æ�æ±æÀæÕæÜæÜæäæççç2çIçNçWçqçqççv#5Nw¸Nb‚ç‚ç”ç›çªç±çºçºçÐçÜçäçøçèèèè0èxNbyp -5RåRålånåxå{å�å�å�å—å å¤å­å­å»å½åÈåÍåÖåÝåìåøåûåþåæ æ"æ.æ1æ4æ4æ8æ@æHæKæ]æz5 -5{à,u&u&�&‘&¡&«&³&º&Ä&Ò&á&ç&ï&õ&÷&<'|#,}X º&º&¾&Â&Ä&~ pÅЇ°‡°§°²°İ¼°×°è°è°è°ô°€ÅÐ�h$p?p?y?y?Ž?Ž?›?°?°?µ?‚$ƒp[f4¾4¾9¾C¾Q¾]¾a¾e¾e¾w¾„[f…X; C º º Ê Ü â è î †; C ‡XR Z z -z -Š -œ -£ -© -¯ -µ -ˆR Z ‰XZ b º -º -Ê -Ü -ã -é -ï -õ -ŠZ b ‹@@EÂ1Â1Æ1Þ1à1Œ@E�XX`tÂtÂ}Â}‰Â�”™ŽX`�HRXDÂDÂMÂ^ÂmÂmÂrÂ�RX‘€•ü•üžü¤ü­üÂüÌüÑüÝüãüåüåüêü’“x‡“EERiw†š«²µ½”‡“•€“ ½½Èßíüü%1@BH–“ —8Åé} } ‰ “ š § · » Ä Î Ø Ú ñ ú  ú 6 E V \ k | ‚ ‚ ¢ ³ ½  Š˜.Å陀/<uýuý„ýŠýŸý©ý±ý¹ý¾ýÄýÆýÆýÌýš/<›p|‡ýÿýÿ  4<?AEœ|‡�@ÈÍÂ#Â#Ë#Ó#Ø#žÈÍŸ@4¼4¼=¼I¼N¼ ¡H?Et½t½}½„½Š½�½¢?E£HEK”½”½�½¤½ª½¯½¤EK¥€ÉÖí-í-÷-þ-....+.1.1.V.¦ÉÖ§h+5½½ ½½½!½'½.½.½:½¨+5©àoˆ·Q·Q»QÏQðQR RCRURyR~R–RÃRÌRÎRØRðRS&S&S2S2S¨Sª#oˆ«è¯Éµ,µ,Ì,Ö,à,à,÷,-----1-F-H-H-b-w-w-~-~-è-¬$¯É­X \±\±j±u±„±Ž±”±® ¯¸´È*#*#:#A#Q#[#j#j#y#{#{#Š#˜#¨#¯#¯#²#´#´#¼#°´È±øÍéÚ#Ú#ê#ð#ú#$$ $.$.$=$?$?$S$\$j$q$q$t$~$”$œ$ž$¡$£$£$¯$²&Íé³�îýíí0íCíCí\íqíwí}í}í…í‡í¯í´îýµh5?<½<½E½J½T½Y½_½f½f½s½¶5?·H’ø�•�•±•Ä•ΕΕѕՕé•î•– -– ––––+–0–4–P–Y–i–i–z–}––Š–Š–›–ž–¡–£–©–¾–Á–Ë–Жá–é–é–ì–ø–#—(—9—B—D—G—\—q—†—†—™—¢—¥—À—É—Þ—ã—ø— ˜"˜%˜'˜2˜2˜G˜J˜M˜O˜U˜n˜q˜{˜‚˜‚˜”˜¸p’ø¹x4`�’�’©’©’¬’°’Ä’É’Ü’æ’è’ì’ø’ø’“ ““,“1“A“A“R“U“W“b“b“r“u“x“z“€“•“˜“¢“°“º64`»¨`’·“·“Ý“å“å“è“ô“ ”$”5”>”@”C”X”m”‚”‚”•”ž”¡”¼”Ŕڔߔô” ••!•#•.•.•C•F•I•K•Q•j•m•w•‰•¼<`’½°4w‘w‘“‘�‘�‘ ‘¤‘´‘¹‘Ê‘Ô‘Ö‘Ú‘æ‘æ‘õ‘ú‘þ‘’’.’.’?’B’D’O’Z’]’`’b’q’t’~’~’Ž’¾=4¿pHSDcPcScUcZc]c`cecmcÀHSÁx<HÜbÜbðbÿbc cc+c.c3c?cÂ<HÃx0<”b§bªb¯b²b²bÅbËbÎbÐbÚbÄ0<Å�g–×­×­ý­® ®®2®9®C®G®O®^®b®f®n®v®~®®‰®‰®˜®¡®¢®º®»®Å®Ï®Ö®ã®å®ò®ø®ú®ü®¯ ¯#¯,¯-¯2¯M¯P¯b¯Æ9g–ÇpS^tc€cƒc…cŠc“c–c›c£cÈS^ÉX’š Ò Ò(Ò,Ò2Ò\Ò`ÒlÒÊ’šËPš¡lÒlÒˆÒŒÒ’Ò¶ÒÆÒÌš¡Í @aµµ¹½ÉÒãòþET`g…�š¿æø888JQQcimÎ+@aÏøv’ôÐôÐÑ Ñ+Ñ0Ñ2Ñ8ÑJÑiÑyъњќќќѢѻÑäÑôÑöÑöÑÿÑÿÑ ÒÐ&v’Ñ@5:­­ÇØâÒ5:ÓH5ííñú -%>>>k�••ÀÈÐâ.6;MOOXXXjqqƒˆ¬Ô05Õh¤®€B€B„B²BÐBâBóBýBÖ¤®×`ÖßÐDÐDÔDE0EBESE]EØÖßÙH´º@C@CDCoC}CCÚ´ºÛHÀÆÀCÀCÄCïCüCþCÜÀÆÝXÎÖhDhDlDšDÈDÌDÎDÞÎÖßH®´CCC/C=C?Cà®´áHºÀ€C€C„C¯C»C½CâºÀãXÆÎDDD2D`DdDfDäÆÎåH‚ˆ A A$AOAWAYA悈çHŽ”˜A˜AœAÇAÎAÐA莔éXœ¤(B(B,BZBxB|B~BꜤëH|‚à@à@ä@AAAì|‚íHˆŽ`A`AdA�A•A—AïX”œÐAÐAÔAB B$B&Bð”œñ8ßã`E`EiE{Eòßãó`#,š0¤0¤0®0õ0ú0ô#,õ@Uz:>:>H>O>Y>g>g>o>ˆ>«>­>Ï>æ>æ>?.?.?P?Z?d?r?Š?—? ? ?¹?Ã?Ü?ê?ì?ó?ú?0@ö/Uz÷`"6DKU]go‰ŽŽ–°µµ½Çáææíôô -!(4;Qaczœ²À -ð/ft~•›Ÿ¤­¶ æ) \ � � § ¨ © ¼ à Í à é    " ) C S øi`ù�Š™JôJôOôTôUôUôgôoôtôzô~ô‚ô’ô—ôšôúŠ™û@/4@@@2@8@ü/4ý°-‚E�EžEŸE E¶E¿EËEÓEÞEèEïEFFFFFFþ-ÿØ *þ*þ>þLþRþ" xWcÄÍÄÍÔÍ×ÍßÍèÍóÍÎ -ÎÎWcˆ9’ْ٤٦٦پÙÇÙÊÙÕÙ×ÙêÙôÙÿÙÚ Ú*Ú8Ú<Ú@ÚFÚTÚXÚ\ÚbÚdÚxÚ’Ú¢Ú¦Ú¦Ú»ÚÌÚÏÚÝÚáÚõÚÛ Û#Û#Û8ÛIÛMÛSÛSÛWÛ[Û_ÛcÛcÛ}Û}Û�Û…Û‡Û‡Û‹Û�Û‘Û‘Û•Û™Û›Û›ÛŸÛ£Û¥Û¥Û©Û«Û«Û­Û­Û¯Û¯Û·Û¿ÛÉÛÎÛÒÛÖÛäÛèÛìÛñÛõÛÜÜÜÜ1Ü3ÜAÜEÜIÜOÜc܃ܗܗܗܗܗܛܞÜÀÜÀÜÀÜÕÜíÜ ÝÝÝÝ&ÝCÝbÝgÝgÝgÝ|Ý›ÝºÝÆÝËÝËÝËÝàÝÞ#Þ/Þ4Þ4Þ4ÞIÞfÞ…Þ‘Þ–Þ–ÞšÞ¯ÞØÞÜÞûÞßßßßBßFßeßjßjßjßß—ßžß¾ßÃßÃßÃߨßðß÷ßàà9à@àbàgàgàgà|à�à¼àÈàÍàÍàÍàâàá"á.á3á3á3áHáHáná�á°áµáµáµáÊáâáìáðáââââ'â,â7âAâAâwâ…âŠâ�â£â¬â¬â¬â¹â¾â¾âÅâÕâÞâÞâæâñâñâã0ã?ãHãSãWãcãmãmã{ã}ãˆã–ã˜ã®ã®ã³ã³ãéãúãääääää ä8äAäAäIäTäTäjäyä‡ä‰ä˜ä¦ä¨ä¾ä¾ä¾äÍäääæäæäæäÿäåååå5åMåaåeå{å{å’å’å’å£å«å±å±å¼åÔåÝåÝåéåøåæææ*æ;æ=æ=æ=æ=æIæaæpæpæ‹æœæ§æÈæÍæÕæðæóæçç)ç6ç6çQç\çeç�çšç­ç³çÁçÁçÎçÒçåç è.è.è.èJèWè[ènè¦è¦è¨è¨èÄèÏèÕèÕèâèæèùè4éIéRéeékéxé}é}éŠéŽé¡éÜéñéúéÿéÿé êêê*êBêVêZêpêŒêŒêŒêºêÇêÇêäêäêèêûêëëëë&ë&ë,ë_ëwëwë•ë¨ëÀëÐëöë -ìì(ì,ìIì[ìgìkìpìpìpìtìyìyì‡ì‹ì‹ì¤ì¼ìÐìÔìêìíí4íAícíhíhíhívízízí“í«í¯íÃíÇíÝíÝíùíîî:îGîdîiîiîÁîÎîÎîüîïï ïï#ï+ï9ïDïOïSï\ï\ï‚ï�ï�ï«ïÀïÈïÍïÍïçïøïøï ðYðiðið™ðžðÌðÑðíðøðñññ:ñFñFñoñ‡ñŠñŠñ¥ñ¥ñ¥ñªñ°ñãñûñûñò,ò5òMòvòŽò‘ò‘ò¬ò¬ò¬ò¬ò·òÕòèòòòó(ó<óVócógókóˆó¢ó¯ó³ó·ó¼ó¼ó¼óÀóÅóÅóÅóÞóöóô ô ô'ôCôFôXômôvô‰ô�ôœô¡ô¡ô¡ô½ôÙôÜôîôõ õ õ õ%õ=õHõRõRõnõŠõ�õŸõ´õ½õÐõÖõãõèõèõèõö ö#ö5öNöSöSöSöSölö„ö�ö™ö™ö¾öÏöäöíö÷÷÷÷÷÷9÷J÷c÷h÷h÷h÷h÷�÷™÷¤÷®÷®÷Ó÷å÷ú÷øøø%ø*ø*ø*øOøaøzøøøŠøŠøœøœø¬ø³ø%þØ9 -        - - - -xbŽ2è2èNèQèZènèxèƒè…è™è™è§è°è´è´è½èËèÐèäèäè é"é)é+é+éOégégégéiéiéiéƒé˜é˜éàé6bލcuÎÎ/Î2Î7Î:ÎCÎNÎaÎvÎzÎ}Î}΃ΆΔÎcu hˆ’DlDlZlllllvl�lšl -ˆ’ Ð<Ã<ÃNÃPÃ_Ã_ÃsÃuÃ~ÀÀÃßÃßÃìÃöÃÄÄÄÄ,Ä ! pp{����“�´�¸�Ë�Ô�Ø�Ú�p{À†›ccc&c&c1c1cEcNcNcbcdcdcxcxc|c|c†c‹c‹c‘c †›°ó&GhGhMhThThmhmh†h†hŸh³h¾hèhîhóh i$i;iRiii€i—i®iÅiÜiói -j!j8jOjfj}j”j«jÂjÙjðjkk2kFkZknk‚k”k”k£k*s=ó&˜{‹ß�ß�ô�ŽŽ(Ž4Ž4ŽFŽLŽLŽXŽdŽfŽfŽnŽ{‹€,Y‡‹‡‹£‹±‹¶‹À‹À‹Æ‹Ò‹Ó‹Ö‹Ö‹Ý‹Ý‹ä‹ò‹õ‹ù‹ù‹ŒŒŒŒ$Œ9Œ;Œ;Œ;Œ>ŒFŒFŒRŒRŒ^Œ}Œ€Œ•Œ•Œ˜Œ›Œ«Œ7,Y0�À È È&È)ÈAÈAÈCÈCÈUÈbÈnÈsȋȎȎșÈ�È�È�È�ȩȽÈÀÈÀÈËÈÏÈÏÈÏÈØÈÛÈéÈ-�ÀHÐÖ÷°÷°±$±*±6±ÐÖ0Ûo±o±s±�±”±”±•±¤±¦±·±±бÛ±ã±û±ÿ±²²#²2²:²g²…²Œ²™²¯²½²¾²Ͳϲô²³³³"³-³;³F³T³Y³Y³f³o³t³y³‡³”³�³¢³¢³¯³¸³½³½³½³³³ϳÔ³سܳMÛˆ W W [ b b i ~ ­ ´ àҠנ٠٠   o€···.·6·[·h·{·‡·˜· ·¦·ª·¼· o€!h›¥¦¦ƒ¦’¦™¦µ¦ʦϦñ¦"›¥#Èuu�’’”””�®ºÑÜßáäææ$ %pôÿ%%6%M%S%d%z%™%®%®%¸%&ôÿ'À @ÝÝôþ '':ANajvy~𬬾ÀÀÒÔÔÝÝî - - *17ILhhmm¯(? @ - - - - - -)h6@JäJäZäpä{ä€äŽä›ä¤äµä*6@+Jg'['[O[c[t[{[Œ[“[“[©[©[·[¿[Í[Õ[ã[ë[ë[\1\T\c\x\x\‡\‡\¡\Á\,'Jg-péô²$²$Ä$×$è$ö$ü$%%%.éô/˜ç÷ … …E…O…_…i…‰…©…Ê…Ñ…Ø…ß…é…÷…0ç÷1hƒ�ïïõ€B€X€™€§€«€2ƒ�3¸ÙíMMccxxˆ‘—Ÿ£®Æàààê4Ùí5ˆ_V_VmVrVuVyV}V†VŽV–VžVžV¤V67ˆSa_a_acara~aŠa–a¤a°a·a¼aÉaÊaÎa8Sa9@ý -//A/F/:ý;804"1,1Q1V1<04=p²½ú+ú+,, ,0,0,5,>²½?p§²¢+¢+¬+Ç+Ñ+Ö+ñ+÷+@§²Aˆ×V×VÜVðVW@WuW¥WÄWÞWèWëWBC8½á:,:,C,a,p,Ž,™,©,Ü,õ,-----8-k-€-†-Œ-“- -¼-¼-¼-Ü-õ-þ-þ-.D.½áEH%+ܼܼå¼ë¼ø¼ú¼ÿ¼F%+G�±àôÀôÀ ÁÁÁÁ Á Á,Á7ÁAÁKÁKÁWÁYÁ_ÁfÁiÁlÁxÁ„ÁŠÁ�Á•Á˜ÁšÁ¥Á«Á±ÁºÁºÁÂÁËÁÑÁÚÁÚÁÜÁÜÁâÁêÁíÁýÁH9±àIPä ßžßžŸ Ÿ&Ÿ2Ÿ>ŸEŸSŸSŸpŸpŸ�Ÿ—ŸŸŸ¦Ÿ®Ÿ¸ŸÀŸÔŸåŸ     & , 4 5 8 U J1ä K€¥²÷¦÷¦ §&§,§1§D§Q§W§Z§b§L¥²M¨Üî‚ì‚ìžì±ì½ì½ìÉìßìåìðìöìûìýìíNÜîOPµÜBëBëXë[ësëë”ë³ë»ëÅëÎëðëöëöëì -ìììì ì ì ì#ì%ì)ì)ì)ì.ì=ìMì]ìcìeìeì{ìP1µÜQP޵âéâéøéêê$ê4êDêHêRê_ê�ê‡ê‡ê“ê›ê¥êªê­ê¹ê¹ê¹ê¼êÐêßêîêëëë#ë#ë#ë'ë;ëR1޵S˜c“z5z5Ž5˜5¦5¬5¶5·5¸5Ã5É5Í5Ð5Ò5Ù5à5ê5ö5ÿ56606M6=6b6b6–6˜6¥6¥6¬6Ã6Ã6Ï6×6Ù6í677!7Z7T:c“U¸åùÄÉÄÉÚÉÊ Ê7ÊLÊXÊ^Ê`ÊcÊoÊrÊ€ÊVåùWhkuŒÆŒÆœÆ¸ÆºÆÅÆÇÆÇÆÏÆXkuY˜u…ÔÆÔÆîÆôÆùÆÇÇ!Ç?ÇAÇNÇTÇWÇeÇZu…[`…ŽlÇlÇ~ǀNJǘǡǦǰÇ\…Ž]�Ž�´Ç´ÇÊÇÚÇÚÇêÇîÇðÇðÇüÇÿÇÈ È^Ž�_�ôDaDaVa[ataa”a–a¢a¥a¨a²a`ôah§±´À´ÀÄÀÆÀÏÀÏÀÜÀäÀéÀñÀb§±cY,Ä,Ä@ÄFÄFÄ`ÄcÄtăĊđėĵĺÄÂÄÂÄÄÄÑÄ×Ä×Ä×ÄÜÄãÄæÄéÄïÄ ÅÅ'Å)Å6Å6Å;Å;Å;Å`ÅfÅhÅxÅ|ŋőŔŖŦŪŹſÅÂÅÄÅÔÅØÅëÅîÅñÅóÅÆÆÆdJYeˆ6Dwšwšˆš–š—š˜šžšÍšÑšÒšÕšÝšf6Dg@¯´TT T+T:Th¯´i@´¹?T?THTSTdTj´¹kHú/0)0.0lmІ�b¾u¾w¾оŸ¾Ÿ¾¼¾¾¾¾¾Û¾ݾݾç¾é¾é¾ó¾ó¾ù¾ü¾Q¿n!†�o@ J0T0y0~0p qð”¯Å+Å+Õ+Ü+ä+ë+ý+ý+ -, , ,,,,*,,,,,6,>,>,G,Q,Q,n,n,r,µ,r%”¯s8EŠîŠî�îœî¬î½îÕîâîóîïï)ï0ï0ïCïUï]ïqï€ïžï°ï¸ïÁïÎïÙïéïúïúï ð ð+ð+ð>ðIð^ðvð‡ð©ðùð ññSñUñ]ñqñ‹ñ�ñ ñ°ñµñÁñüñtNEu@Ejòòòòò7ò>òLòWòbòdòoòzòŒòžò§ò°òÜòóó óó ó*ó5ó`ó`óbóv/EjwPŠ‘Ú@Ú@Þ@ò@AAxŠ‘yX 5&5&9&K&_&p&u&z {pƒŽ¤„¤„´„фلè„ï„ñ„ù„|ƒŽ}�­¼÷T÷TûT U!U#U1U8U=UBUIUVUVUXU~­¼°>Q((((((2(4(:(X(\(j(j(~(‡(ˆ(‹(�(€>Q��DSPP PP%P4PCPXPlP{P„P…P§P¬P°P‚DSƒ€S`·P·P»PÉPÊPËPÝPÞPçPéP„S`…@RWÒÈÒÈáÈÉ É†RW‡XW -É -ÉÉ'É-ÉDÉWÉnÉ�ɘɫÉÂÉÙÉðÉðÉÊ ÊÊÊÊ/ÊHÊVÊ]Ê]ÊuÊyÊʆʊʜʵÊÃÊÊÊÍÊ×ʈ2W‰(àÂÂÂ9ÂEÂXÂ^ÂoÂwÂ|ˆ™²¸»¾ÂÁÂÆÂËÂÏÂÛÂìÂà ÃÃÃÃà Ã#Ã5Ê,à‹Fcº4º4Õ4ã4ó4ÿ45555!5-51515;5;5B5E5K5K5U5c5j5j5j5x5Œ'Fc�˜)ß ß î ü ý þ  ¡ ¡¡¡0¡?¡H¡Q¡R¡X¡Ž)�H»!—§—§¥§®§·§À§̧اà§é§ï§÷§¨¨¨$¨7¨L¨Z¨f¨t¨ލލލ“¨˜¨¦¨­¨²¨²¨»¨¨ǨÓ¨Þ¨ç¨ç¨ò¨ô¨©©© ©©©© ©*©-©2©5©>©E©H©J©O©Y©Y©b©i©u©€©€©œ©œ©œ©¤©¤©«©²©¹©À©À©Ç©Ωթܩܩã©é©ò©þ©ªª$ª'ª3ª�p»!‘`²»g§g§p§y§y§Œ§’§—§’²»“è!;7ª7ª=ªOªOªVª\ª_ªdªuªyª”$!;•H‰�ädädídódùdþd–‰�—�z‰„d„d–d–d£d¦d­d±d¸dÀdÐdÓdÝd˜z‰™P†�ËËË3Ë;Ë>ËKËš†�›@ŸäŸœŸœ¯œ¾œ¾œלללללללùœ��*�D�D�D�`�`�`�s�������«�¹�Ç�Ý�žžžž5žIžIžIžNžUž_žfžfžwž†ž�ž–ž�ž¥žµž½žÍžОØžœOŸä�˜)9_¡_¡i¡z¡¡„¡“¡ ¡­¡»¡Ó¡Ü¡è¡¢¢ž)9Ÿˆt‚.I.I>I?I@INIUIcIjIqIxIyI�I t‚¡x�›ÆIÆIÒIÓIÔIâIéI÷IþIJJ¢�›£€‚�†I†I’I“I”I›I¢I©I°I·I¸IÀI¤‚�¥à<Uò<ò<===*=6=?=H=Q=Z=c=l=u=~=‡=�=™=¢=«=«=­=3>¦#<U§H6«««-«>«T«[«e«i«q«y«„«Œ«�«Ž«™«›«¨«©«²«¸«¼«¼«Å«Ë«ã«ì«ö«ÿ«¬¬¬¬¬¨06©�ªª‰ª�ª«ª¶ª¿ªɪÔªâªäªäªþª«ª«pMX › ›#›9›D›S›m›q›u›¬MX­@QV’(’(–(Â(Ä(®QV¯`g™g™p™‚™—™›™Ÿ™Ÿ™¤™°±¸±Å°°#°1°=°>°?°?°F°P°[°u°w°|°°°‡°²±Å³Hdj¨¨¨¨!¨´djµ8â®â®ö®!¯¶· 6g¬¬7¬K¬\¬m¬ƒ¬�¬¤¬®¬²¬º¬¾¬ɬѬÒ¬Ò¬â¬â¬­­­­ ­0­9­:­E­G­T­]­c­e­g­p­v­Ž­—­˜­²­µ­Ò­¸;6g¹p¼Ç_U_UhUxU…U…UŒU›U¢U¢U§Uº¼Ç»0Vyâ(â(ç(÷(ø(ù()&)8):)X)g)g)x)Ž)¦)§)®)¯)°)¼)Ç)Ö)Ø)ã)ï)ÿ)***¼-Vy½jŠbóbóhónóuó{ó‘ó¶óËóËóÐó×óïóô!ô&ô*ô,ô7ôBôBôFô¾*jŠ¿hlv¼Ì¼ÌÆÌÑÌÜÌûÌÍ ÍÀlvÁ`Ú㔺”º�º§º­º·ºÅº»ÂÚãÈ'544 4444"4A4[4\4_4e4Ä'5Å€Ž›×¥×¥Û¥ê¥ñ¥¦+¦@¦Q¦Z¦_¦{¦ÆŽ›ÇØvŽï¤ï¤ó¤÷¤÷¤¥(¥7¥@¥I¥a¥s¥|¥ƒ¥Ž¥˜¥¸¥Á¥Æ¥Ò¥Ô¥È"vŽÉ@`eZ Z ^ g i Ê`eË(aƒmmqu�Š›ª¶¿ÆÙè& 5 A L V { ¢ ¬ À Ò Ù ô ô ô  - - - -% -) -Ì,aƒÍHÃÉ��·ÈÒÎÃÉÏ@žÃ"2AMff“›  ­ÃÌÔÜî':BGGPPPbii{€œÐ/žÃÑí íí,>SY^dggu�„‡‡“˜¡¦­ÃÃÙÒ(í Ó@ÀåìÈìÈÉÉÉÉ'É.É7É7ÉAÉJÉJÉPÉTÉWÉaÉlÉlÉ{ɄɄɗɜɟɢɥɨɱɱɱɱɱɱɿÉÔ/ÀåÕ e†j j s � � ‚ ƒ ™ ¯ ¾ × ó !!7!A!O!]!k!y!{!‘!§!½!Ó!Ô!Ù!Ö+e†×pMX¯µ¯µǵÚµîµúµ¶¶¶ØMXÙP™ w¸w¸�¸ ¸«¸±¸¹¸Ú™ ÛP §¿¸¿¸Õ¸è¸ó¸ù¸¹Ü §ÝhXb¶¶/¶B¶V¶b¶h¶n¶u¶…¶ÞXbßH$Œ$Œ6ŒpŒ†Œ”Œàá˜K[´½´½¹½Ã½Ã½á½ç½ñ½÷½ý½¾ ¾ ¾ ¾2¾âK[ã@�•Ò*Ò*Ö*ê*ô*ä�•å@•šú*ú*þ*++敚çÐy�****/*/*^*^*_*`*`*x*z*ˆ*·*¾*Ç*È*Ï*Ï*Ò*è!y�éP¥¬ÏTÏTØTãTîTñTê¥¬ëØˆ ¯S¯S³SÁSÒSãSøST"T'T2TüBüFüPüZüZü\üjüp0;ãÖãÖìÖìÖ×7×C×P×Z×_׸)=£ê£ê·ê·êßêëëë'ë4ë=ëGëQë[ëeëmëuë¶Ô{æ{æ‘æ æ¨æ»æÍæØæØæäæûæçç"ç"ç(ç(ç-çqçxçxç–ç–ç®çÏçÕç÷ç •¶ÓäÓäìäìäúäúäåååDågåuå…å�å©åÄåÙåñåææ9æ9æ;æ=æRæWæWæiælæxæ$ÓßÓßãßìßýßýß%àHàWàdàoà|à†à�àšà¤à®àÁàÔàÔàäàäàñàá áá$Báá'á3á<áMáMáuá˜á§á´á¿áÌáÛáêáôáâ â â%â'â)â/â1â>âAâI⨅—óÙóÙÚÚ)ÚLÚYÚfÚqÚ~ÚŽÚ—Ú¡Ú«ÚµÚ½ÚÃÚ°r…#Ù#Ù,Ù,ÙTÙwلّٜ٩ٶÙÃÙÍÙ×ÙáÙéÙîÙÈ—­ÃÚÃÚÒÚÒÚúÚÛ(ÛCÛ[Û`ÛxÛxÛ�Û�Û¢Û·ÛÌÛÖÛÜÛà)³é³é½éÂéÊéÑéÖéÖéþé!ê.ê;êFêSê]êgêqê{ê…ê�ê”ê”ê—ê�ê  arãã$ã$ã3ãBãSãWãdã{ã�ã‡ãŒãŽã“ã È=s{ë{ë�ë•ëŸë«ë¹ëÉëÉëñëì#ì0ì?ìKìZìfìpìtì|ì†ì†ì®ìÑìßìïìúìíí"í1í=íGíWí\ídí�í“í¥íªí·íÁíÏíÏíÙíãí!`irãØãØòØüØÙÙÙÙ#Ù"x‰•cäcäwä…äŒä�ä’ä–ä�ä½äÍä#ÀÔéûçûçèè#è)è,è,è7è7èKèXèbèeèhèjèxè$Ðr‰“ã“ã±ã·ãÀãÀãÉãÉãØãåãää#ä%ä4ä4ä4äEäRäRä`ä%(ÅëÜëÜõÜýÜÝ Ý Ý3ÝVÝ^ÝfÝqÝv݉ݧݮݮݼÝÅÝÊÝÌÝÕÝäÝëÝÞÞÞ2ÞAÞbÞjÞ}Þ�Þ�Þ­Þ¼ÞÌÞÜÞìÞß ßßßß)ß8ßYßdßsßƒß“ß£ßºßºßºßÆßÌß&ˆ`ÓôÓôéôüôõõõ õ õ4õ=õNõWõxõ}õ}õ˜õŸõŸõµõµõÁõÁõèõëõëõ +ö)öHöVömö„ö†öŒö’ö—ö®öÅöäö÷÷(÷?÷D÷J÷P÷U÷l÷ƒ÷ƒ÷‹÷™÷Ÿ÷¥÷ª÷Á÷Ø÷Ø÷Þ÷ä÷é÷øøø'ø1øGøføjøBù'ðì³ò³òÝòáòåòüò ó"ó"ó2ó>óZó_ókóqótó{óóƒó‡ó‹ó‹ó‹ó5ô(p;ô;ô?ôIôSô]ôxô„ô†ô†ôÍô)p­¸ # #######.#1#6#>#*s’ãíãíî îîî î)î1î7î:î:îFîFîsî€îŠî�î�î—î¢î¨îµîµîµîÇî+x$0“ֺ֓֜֜־ÖËÖÖÖÞÖÞÖÞÖãÖ,x$CÖCÖLÖLÖjÖnÖ{Ö†ÖŽÖŽÖŽÖ“Ö-Pé{è{è™èŸè¨è¨è³è³èÂèÏèÓèÝèïèïèÿè ééé)é4é<éAéPéPéPéXéfété~é�é‡é”é¡é¡é³é.À‚—¶¶¶.¶B¶Q¶j¶q¶s¶¶˜¶²¶½¶öǶѶ/ˆ£±?·?·Q·d·}·ƒ·’·™·¯·µ·»·Õ·0x—£×¶×¶ç¶ù¶ÿ¶··+·1·=·1�`oQQQ?Q+QOQaQ€Q‡Q�Q¡Q³Q³QÜQ2 yªûwûwxxxxx3x�âñÚBÚBñBôBõBöBCCC C!C$C.C?Èñ2C2CGCJCXCYCZCaClCqCtC„C�C•C˜C›CžC¡C­C@X)1")")()*)2)L)Q)W)A¨óliliviƒi�i�i®i°i·i¾i¾iÐiÔiÖiàièiBp{†â’â’î’ð’ø’ “““ “ChØâú.ú. //&/2/9/H/T/T/Z/Dp "³"³8³<³?³J³n³r³w³�³EHš Ê,Ê,Î,Û,--F` KKfipp†™�©¾¾ÅÌÝîôü  &+29@CJ[lxŠ�’™™««ÁÈÕôô +!2C^v¡¡¨«²¸½½½½½½½ÑØÛìóùû + + ""),336;EYci~�  ¥¥¥¬¯¶ÇØàààë÷ú”"GXnv;Å;ÅDÅUÅdÅvÅ…Å…ÅŠÅH¸<pKÿKÿYÿhÿ~ÿ�ÿ’ÿ§ÿ§ÿ°ÿÅÿÚÿâÿîÿúÿ  '.4:CEELWvv‰�–œ¥¶¶¶ÂÉÎÕïòIˆ»ý»ýÄýÊýÊýÕýíýøýýý þþþþþJ ¿ËËÞááòþ %%//5<@IIRWgvx‚K°/sþsþ‚þˆþˆþ“þ«þ°þºþÁþÈþÐþÙþÞþäþæþæþìþL°;Nû(û())')/)`)Â)Ë)Mxp|##)1BBdloquN œbœb°b°bÒbÓbÔbÞbàbébíbôbøbübcc cOp$cc&c3cEcYccclcvcPð’­ËîËîÙîèîëî ï,ï6ïWïaïjï˜ï¥ï¯ïµï¿ï¿ïËïÎïÐïÐïÚïàïãïFðQ­ìKðKð[ðbðrðyðyð�ð�ð›ðÂðáðñ ññ"ñ(ñ6ñ:ñ@ñNñNñNñmñŒñ¡ñ¶ñºñÀñÎñÒñØñêñêñêñêñíñòñ÷ñýñòòò#ò'ò-ò8ò8ò8ò=òCòTòXò^òiòmòsò|ò|ò|ò±òRØ£»BABA_AbApAqArA|AƒAˆA‹A‘A”A”AœA¡A¡A¦A©A¬A¯A¿AS¨ÐâRBRBrBuBƒB„B…B—B§B²B¸B¸BÃBÃBÄBÇBÕBTÀ»ÐÂAÂAÛAáAïAðAñABBBBB&B-B=BABABBBEBQBUHÇÍÏUÏUØUæUVVVˆÍÛVVV V4V?VEVQVdVdVgVmVWP §"-,-3-;-=-C-XPÃÊt`t`„`�`˜`›`£`Ypéôœaœa¼aÀaÖaêaôaþabbZ€Äñ`Á`ÁvÁ…Á•Á¤Á´ÁÇÁÒÁØÁØÁðÁðÁüÁÂÂÂ'Â,Â,Â8ÂBÂVÂVÂ^Â^ÂdÂÇÂÎÂÎÂÎÂûÂûÂà ÃÃà Ã+Ã2Ã;ÃcÃ[�ŒˆÄˆÄšÄ¦Ä®Ä½ÄÁÄÁÄÕÄçÄõÄÅÅÅÅÅ2Å;Å;ÅSÅaÅaÅlÅ‚ÅŽÅ˜Å§Å§Å«Å±Å¼Å¼ÅÆÅÆÅÊÅÎÅÝÅíÅñÅñÅÆ*Æ*Æ9Æ;ÆEÆYÆ_ÆgÆgÆyƎƘƘƧƬƬƸƸÆÇÆÐÆÐÆ߯ ÇÇÇÇ Ç*Ç*Ç@ÇUÇ^ÇkÇuÇwÇ}ÇŠÇ�ǗǤǪǪDZÇÇÇÑÇØÇÝÇåÇíÇöÇýÇÈ"ȆÈ\0úhÃhÃzÃ�ÆÖÃ�èÃÁÃÖÃàÃàÃîÃóÃúÃÄÄÄÄÄ(Ä6Ä@ÄXÄ\Ä_ÄbÄnÄ�Ä]X »h»hÏhäh +i-i5i^È:PK+K+]+a+a+n+n+{+{+ˆ+ˆ+—+¦+µ+Ä+Ö+à+ï+ï+ù+_Xƒ*ƒ*Œ*‘*š* * *¥*``"«*«*´*¹*Â*Ë*Ñ*Ñ*Ö*aðy”û,û,----)-/-2-:-C-R-Z-Z-e-e-m-o-o-v-y-…-b`Pyû+û+ ,,,, ,$,',*,6,H,K,N,S,c,f,|,,‚,Ž,’,¦,¬,³,º,º,½,Â,Â,Õ,Ø,Ú,Ú,í,í,í,û,cøÌèrr r#r)r4r|xAxA†A‹A’A¨A¨A¯AÆAÆAÌApH)/Ð@Ð@Þ@å@ù@ÿ@qˆ™§; ; J T X l l y { ˆ � • ¯ ¹ rpøÃÊÃÊÓÊËË Ë,Ë7Ë?ËBËLËs�(¢3¢3«3Ä3Í3Ù3Û3Ý3ì3ì3û3ý3ý34tˆ(64444444O4T4o4t4u4x4€4u� +:3:3C3`3i3u3w3y3ˆ3ˆ3—3™3™3ž3v€ÌÙ(0=`{ƒ‘´¹Áw ÉÚ  &,7HHQQVjs~~‡©xH "(yé ËËÏØè÷$))M\}•�ŸŸ¨¨¨ºÁÁÓØüz¸u‰ÊÊÓçÿ'.9Meg€��Ó{8 0#|#|E|_|k|o|s|‚|–|ž|¤|ª|³|Â|Î|Ú|Ú|å|í|ð|ò|}}}"}&}+}4}:}=}O}|(`øº»,»F»O»S»e»n»w»~»~»‡»�»�»¨»·»·»Ï»â»ë»ô»¼¼¼-¼6¼J¼N¼T¼]¼c¼n¼p¼s¼{¼‹¼š¼ª¼­¼¸¼¼˼ؼß¼ã¼ë¼ï¼÷¼ ½½½½"½,½2½>½E½G½™½}Èø¹ +º ºº1º:ºPº^ºcºvºŽº”º ºªºªº¶º¸ºøº~@AF222-212hFP222262@2P2q2†2†2†2Š2€@<A22222�@PUŠ2Š2Ž2›2Ÿ2‚@UZ¢2¢2¦2«2¯2ƒ@Z_²2²2¶2Ë2Ï2„@_dÒ2Ò2Ö2å2é2…8dhê2ê2î23†€‡”ëÅëÅûÅ Æ ÆÆAÆJÆNÆ_ÆbÆjƇ ?¢;¢;¿;Â;Ë;Ë;ç;ú;ú;< +<<,<4<A<K<P<\<b<i<i<v<y<‚<…<ˆ<�<´<ˆ`ENÚ<Ú<è<ô< ===%=‰&Fò�ò�þ�� �#�1�6�9�G�L�e�m�—�›�»�½�Å�ï�ó�‘‘$‘:‘U‘q‘�‘©‘°‘¸‘Š€<I›=›=©=´=Á=É=Ñ=Ù=á=é=ñ=÷=‹�ÂŽÂŽÎŽÜŽìŽòŽ�A�R�—�›�£�Œ`ÇД”ǔϔߔé”ù”û”þ”�`&ª�ª�³�³�³�É�æ�æ�ë�ŽpÅÐJOJOXOYOZOaOhOjOqO�ða|ÊJÊJÒJÜJêJKK$K$K?KZKaKnKyK€K‘K‘K¢K©K°KÃKÖKÜK�˜ìü::,:-:.:8:S:e:r:s:†:Œ:¡:‘ ü ¢:¢:º:»:¼:Æ:á:ì:ù:ú: ;; ;’  ";";:;;;<;F;a;j;w;x;‹;‘;�;“ Ûì’9’9ž9Ÿ9 9ª9Å9Ù9æ9ç9ú9::”(?aRFRFVF`FÄJ• ÊÛ99999 9;9M9Z9[9n9t9Œ9–°·Êr8r8„8…8†8�8«8µ8¼8Ã8Ð8Ñ8ä8ê8ü8—pãî$½$½.½E½P½P½[½_½_½e½˜�l{ÄÀÄÀÛÀçÀîÀúÀÁÁÁÁ1ÁCÁFÁPÁ™{›TÁTÁqÁtÁ€Á‡Á”Á—Á�Á©Á®ÁÃÁÖÁÚÁåÁåÁûÁþÁÂÂÂ!Â#Â#Â#Â:ÂLÂOÂ_šP¾¾:¾6¾G¾Q¾›PE L Š Š   ³ ¼  Ê œˆîül½l½|½˜½¦½¶½¸½º½Å½É½É½Ñ½�püÔ½Ô½Þ½õ½¾¾ ¾¾¾¾žÐõ H£H£[£]£p£…£…£¥£§£§£Ç£É£É£Ó£Õ£Õ£ߣߣå£è£=¤ŸpSËSËcˢ˩˴˿ËÇËÊËÔË hëõ£££+£8£>£>£F£¡ÐÖ #0#0>0@0R0`0l0{0€0‰0‰0Œ0‘0‘0›0›0¥0¥0¯0²0È0Ü0ð0111,1E1N1Q1Q1\1V1€1‚1 1 1±1Á1Á1È1Î1Ñ1Ö1à1ç1Ã2¢°:mcÍcÍuÍ„Í�Í�ͥͼͼÍÍÍåÍòÍÎÎÎ,Î,ÎNÎPÎPÎmÎzÎzÎz΋ηξÎÇÎÍÎÔÎÚÎßÎåÎéÎðÎûÎÏÏ+Ï£(”ÖkÆkÆ{Æ�ƭƭƽÆÀÆÊÆÎÆÒÆãÆãÆûÆÇÇÇ-Ç7Ç>ÇMÇPÇPÇ[Ç�ǜǨǰǺÇÈÇÈÇÙÇìÇùÇùÇ +ÈÈ%È6È<ÈcÈuȃȈȓȣȫȫȫȷÈÛÈçÈòÈùÈÉÉ ÉÉ:ɤH?Eº<º<È<Ñ<×<¥€ ;i;iKiYigiqi‚i“i�i§i¸i¾i¦`Œ•j@j@t@‚@Š@­@Æ@î@§è &hšhšuššƒš‰š•š•š£š¯š¯š¾š¾šÈšך÷š›››››››››_›¨Xv~‹Å‹Å˜Å¢Å¦Å¬Å¯Å·Å©ˆ`nÓÄÓÄÞÄÞÄêÄìÄìÄýÄ+Å1Å4Å:ŪP°¹°¹´¹ȹè¹ï¹ó¹«€ ­›"›"Ÿ"£"²"Â"ì"ó"## +#¬�¶Å; ; L V Y b n v “ ¢ ¨ « · ­�§¶» » Ì Ö Ù â î ö  " ( + 7 ®ÀK`ÒÒ/Ò;ÒFÒKÒYÒdÒsÒyÒŠÒŽÒ’Ò˜Ò›Ò¢Ò­Ò­Ò¹Ò¯x?KËÑËÑÝÑçÑëÑðÑüÑÒÒ ÒÒ°H'-ÑÑ ÑÑ'Ñ-ѱH'“ϓϡϬϱϿÏËÏ×ÏàÏëÏöÏÐÐÐ"Ð0Ð0ÐIÐWÐ^ÐrБЙСЬЮпÐÊÐßÐêÐìÐõÐÿвȃ™k k o { „ “ Ÿ ¨ ¯ ¾ Ë Ò Ø     " " 4 5 9 ³È`v»Ò»ÒÇÒ×ÒâÒçÒôÒýÒÓÓ ÓÓÓ%ÓDÓGÓRÓRÓZÓ´p4?sÑsÑÑžÑªÑ®Ñ²Ñ¶Ñ¾ÑÆÑµP-43Ñ3Ñ<ÑJÑYÑhÑmѶxZëZëpë‚ë‡ë’ëœë¢ë¢ë¬ë·€;(:Ö:ÖLÖTÖoÖzÖ‡Ö”Ö¡Ö¸ÖÍÖÎÖÏÖêÖõÖ××× ×)×-×H×M×T×T×\×v×yׇזק׭׳׳׿×Î׿×ê×ï×üר(Ø/Ø/Ø6ØDØDØVØ^Ø`ØjØjØjØqØy؀؊ؓءطØÚØÚØõØõØüØÙÙ>ÙCÙCÙJÙRÙhÙŠÙ�Ù�ْٱٴÙÀÙÃÙÆÙäÙäÙéÙéÙéÙñÙöÙúÙ +Ú Ú&Ú&Ú+Ú+Ú>ÚEÚOÚeÚƒÚ†ÚˆÚˆÚ›Ú¢ÚªÚÀÚÞÚáÚãÚãÚÛÛ%ÛeÛpÛ{Û„Û�Û‘ÛŸÛ¥Û¥ÛÂÛÂÛÂÛÇÛÇÛÇÛÓÛæÛðÛÜÜÜ Ü ÜÜ)Ü,ÜRÜVܖܡܬÜÅÜÎÜ×ÜÛÜéÜïÜòÜ÷Ü÷ÜÝ +Ý ÝÝ$Ý*Ý-Ý2Ý2ÝFÝRÝ^Ýn݆ݫݸݼÝÒÝìÝúÝÞÞ +Þ +ÞÞ$Þ,Þ,Þ3Þ?Þ\Þ_ÞaÞrÞyÞ…ÞžÞ«Þ®ÞµÞ¸ÞºÞÒÞçÞîÞîÞõÞß ßß"ß(ß/ß:ßCßRßaßpß�ß‘ßÕà¸`5>RáRá[ákáxá�á†á¹¸;¢Ô¢Ô¸Ô¿ÔÃÔÇÔÒÔãÔãÔñÔÕÕÕÕ'Õ>ÕCÕLÕOÕYÕaÕdÕgÕ{Õ{Õ’ÕšÕ±Õ¸ÕÁÕÄÕÆÕÖÕÙÕÛÕâÕìÕðÕ÷ÕúÕÖ!Ö9ÖºX r(r(v(~(†(Ž(’(–(»hš(š(ž(¦(®(¶(¾(Æ(Ê(Î(¼ˆ)Ò(Ò(Ö(Þ(æ(î(ö(þ()))))½€rOrO~O�O�O–O¢O¥O¨O­OµO¾@8}· · Í ß ø ¡¡#¡5¡J¡Z¡^¡o¡z¡‰¡”¡§¡§¡«¡¶¡¡Ä¡Ä¡Ä¡Ê¡Ê¡Í¡ססò¡ü¡ü¡¢¢"¢-¢6¢@¢O¢‰¢¹¢ö¢££8£8£J£J£J£`£p£‡£�£—£—£§£«£«£°£°£ê£¿¨——ƒ—œ—«—½——Ø—ß—ñ—˜˜1˜2˜A˜F˜F˜H˜ÀØ0HS}S}g}y}ƒ}–} }°}²}¾}É}Ð}Ô}Ü}à}è}î}ô}ô}~Áðãh~h~l~p~x~‰~˜~¢~®~é~û~   **:BFUryy�—ª¹Úêò÷ +€€:€J€U€g€y€”€›€›€­€­€»€»€¼€΀΀Ü€à€ä€Â\è€è€ì€ô€���*�*�.�6�:�S���œ�°�×�à�é�é�î�‚‚‚'‚;‚B‚s‚©‚½‚Í‚ã‚÷‚þ‚/ƒeƒyƒ‰ƒ‹ƒ‹ƒ’ƒ’ƒ¤ƒ¤ƒ²ƒ²ƒ³ƒŃŃÓƒ׃ÛƒÈèö0s0s@s@sMs]srsys‚s™sœs¤sÄ ¦·Ø{Ø{æ{ð{|||%|%|6|@|@|B|k|ÅØö.¨s¨sÂsÅsÈsÒsàsëst tt6tCtNt\tmtzt…t®t³t¹tßtçtítðtýtuu'u4u’Q’Y’Y’g’p’{’{’‰’�’›’›’©’©’®’¼’̘wÇ€”€”„”�”Ÿ”§”§”˔ڔë”ô” •#•3•I•\•d•€•••§•¯•Ô•Ù•ä•ñ•––+–J–Y–…–�–˜–³–¾–Ó–ö–—"—+—A—a—|—‡—�—¬—·—·———Ó—Ó—æ—ø— ˜ ˜˜˜'˜:˜B˜B˜B˜P˜[˜b˜m˜n˜‚˜†˜�˜ÍP@‡ãkãkçk÷kll&l/l=lKlRl\lgl|l‰l‘l¥l²lÆlÓlçlñlmm#m-mAmNmNm[mfmqm…m¬mºmÈmÕmàmëmümn&n6n@nQnbnsn„n„n·nÅnÚnÿno o.oIo`oioto{o†o�o™o»oÎx·ãp|p|t|||…|¤|«|»|À|Ï|Ù|å|ð|ð|ÿ| }A}Q}Y}o}z}z}‚}‚}‘}²}Ó}ã}ë}~ ~ ~~~,~3~3~E~E~S~S~T~T~e~Ï`Çð�˜�˜”˜¤˜µ˜ĘϘޘ똙™™!™%™-™5™>™T™\™m™s™w™{™™‡™�™˜™®™Á™Ê™Ê™Û™â™â™ó™ü™Ðà/ÃiÃiÇiÖiåióij.jNjlj�j°jÁjÌjÙjðj k k k'k'k·W·Z·_·d·t··†·Š·Ž·œ·°···Á·Ç·Ê·Ø·Þ·î·î·¸¸ +¸ +¸ ¸&¸2¸8¸A¸M¸n¸r¸~¸…¸Œ¸’¸•¸£¸£¸¹¸¹¸¹¸¾¸ʸâ¸æ¸ñ¸ô¸÷¸ý¸¹¹¹$¹$¹$¹,¹8¹P¹T¹_¹b¹i¹z¹�¹’¹’¹™¹¯¹ÚX�ÅBMZMaMaM}M‡MŒMŸMªMªMÀMÊMÜMáMëMõMýMNN$N>NXN|N‚N†N‰N�N¥N¬N²N¹NÀNÑNÖNÖNIOÛ |�âKâKìKíKîKøKLL0L@LULjLsLxLxL‚LŽL”L L·L·LÚLäLäLíLòLøLùL>MÜx8D€v€vŠv‹vŒvŒv®v»v¼vÅvÝHü`u`uiuquwu|uÞX08`v`vivjvkvsvtvyvß €u€u�u‘u’u u¦u§u«u«u¹u½u¾uÂuÂuÊuàxðüuuuu)u:uBuJuRuUu]uáˆ"0 v v.v/v0v:v;v?v?vPvQvUvUv[vâ�"ÐuÐuÞußuàuêuëuïuïuvvvvvvã€ãð¸t¸tÂtÃtÄtÄtætótôt÷týtäH§­°s°s¹sÁsÇsÌsåXÛã˜t˜t¡t¢t£t«t¬t±tæ ­¾ÐsÐsásâsãsñs÷søsüsüst +t ttttçx›§XsXshsvs�sŒs”sœs¤s§s¯sèˆÍÛ`t`tntotptzt{tttŒt�t‘t‘t—té�¾Ítt&t't(t2t3t7t7tDtStTtXtXt^tê¸zŽ(Ÿ(Ÿ2Ÿ<ŸCŸJŸSŸaŸlŸnŸ{ŸŠŸªŸ³Ÿ¼ŸŸÊŸëÈŽÄППìŸòŸþŸþŸ  & 0 A W o s ¥ ·  Ë ï ÷ ¡,¡<¡H¡H¡\¡_¡m¡z¡ƒ¡“¡•¡¨¡²¡¡Ë¡Û¡â¡â¡â¡é¡ð¡õ¡û¡ý¡¢ ¢ìp *ƒÌƒÌ‘̵̸̗̠̦̬̾Ìí` +;Á;ÁEÁOÁnÁtÁvÁ|Áîx +ƒÁƒÁ“Á¢Á¢Á²ÁµÁ·Á¿ÁÂÁÊÁï j»©©"©*©-©-©M©]©i©i©x©‚©˜©˜©¡©¦©½©Ó©è©è©ªªª ª"ª"ª=ª?ª?ªIªIªSª„ªŠª�ª³ª³ª¼ªÁªت «6«K«K«f«h«h«ƒ«ˆ«ˆ«£«¨«¨«²«²«Á«ò«ø«û«¬ +¬¬#¬0¬0¬7¬:¬Ù¬ð(Öø;É;ÉOÉOÉ_ÉbÉmÉpÉ�ɅɉɬɹÉÉÉÔÉÞÉåÉ$Ê,ÊKÊ\ÊdÊkÊrÊyʚʠʧʪÊÀÊñ˜*:ÃÌÃÌÍÌÐÌÜÌéÌóÌÍÍÍ7Í7ÍTÍXÍ\ÍbÍòØ d@¤@¤[¤]¤m¤u¤�¤�¤š¤Ǥñ¤¥¥ ¥2¥@¥E¥W¥e¥o¥‡¥‡¥Œ¥¢¥¢¥ª¥°¥Ç¥à¥à¥ ¦ ¦ ¦8¦:¦:¦e¦g¦g¦q¦q¦w¦z¦¦•¦•¦�¦£¦º¦à¦ì¦§§3§5§5§`§e§e§�§•§•§Ÿ§Ÿ§ª§­§·§˧Õ§é§õ§¨)¨2¨9¨B¨E¨è¨óh»Åà¬à¬î¬ÿ¬­­­­­ôÀÅÚ­­(­A­V­b­w­€­€­¡­¿­Ì­Ó­Ó­Ó­×­×­ß­õXÚà­à­®®®®5®J®J®J®u®w®w®w®¢®¤®¤®®®°®°®º®º®Þ®ó®ü® ¯ ¯%¯<¯]¯f¯l¯s¯v¯Ó¯öØÄÜ ¢ ¢2¢2¢R¢e¢s¢y¢}¢€¢Š¢÷h(R«Â«Â¿ÂËÂîÂðÂðÂþÂÃÃ"Ã$Ã)Ã)Ã6ÃRÃTÃYÃuÃwÃyÕ×Ùõ÷ùÃÕÃ×ÃÙÃÞÃÞÃÞÃÞÃãÃãÃêÃñÃôÃyÄøpFQº‘º‘ÑˑΑܑà‘î‘ò‘÷‘ùxamR’R’[’c’f’t’x’|’Š’Ž’“’ú HYúáúáÿá +ââ"â+â0â5â@âJâJâSâûh4>(A(A6A6AQAQATAkAkAqAü@$)¨@¨@¶@Ê@Ð@ýXV^GŒGŒQŒSŒeŒmŒrŒxŒþP�ÄÀÀ8ÀAÀIÀNÀSÀ]À]ÀbÀlÀqÀÀÀ†ÀŒÀ’ÀšÀ¦À¬À®À®ÀµÀ»ÀÁÀÉÀÕÀÛÀÝÀÝÀçÀéÀéÀóÀóÀ[Áÿè!²C²CÀCÎCäCóCøCDD DD!D,DFDPD_D_DfDfDfDZEp!,ZEZEhEvE~E‰E¢E§E®E´Eh±»����§�´�¹�¹�Ï�Ò�ç�è†À"“"“0“3“=“>“?“J“L“N“T“T“X“`“b“f“m“s“z“€“‡“�“”“š“¡“§“®“´“»“Á“Ë“Ñ“Õ“Þ“æ“æ“ï“ð“ð“”””*”1”@”O”^”m”|”‹”‹”•”PÀÇš”š”ž”¨”¹”»”`, 5 â +â +ö +  + €!N”͔ͮͷÍÚÍäÍþÍÎÎÎÎÎKÎXÎ^ÎmÎmÎwÎ|΂ΑΑΤΧαδÎâÎïÎõÎÏÏÏÏÏ(Ï(Ï(Ï(Ï3Ï3ÏAϬ, ¢¢ÀÄÇÇÛîý !'*=Uaddxˆ’ž¢µ¸ÄÉÔÜï ,@JJYg��¨¨¨¼ÐÞããã÷'7NSSYm}›  ¦ºÊèííí $$$8HV[[[o�������£·ÇÉÉÉÝí÷÷þþ   â +`ˆ±ŽŽ!Ž7ŽQŽ`Ž„ŽŽŽ“Ž¹ŽÀŽÂŽÂŽÑŽÛŽÜŽÝŽæŽëŽìŽùŽþŽ���#�<�C�]�]�o�{��‹��^mŒŒ�Œ±Œ¿ŒÈŒÜŒåŒêŒõŒ�� � x t¾t¾y¾ƒ¾ƒ¾”¾–¾È¾Ï¾Ï¾Ï¾Ò¾ +ÈÍãw¯w¯�¯†¯–¯›¯ª¯¯¯±¯»¯ʯϯѯà¯ë¯ï¯õ¯ 8Âæ��"�$�5�:�D�e�r�|�†�ž�¥�§�§�¹�¿�Æ�È�Î�Ô�×�Þ�à�é�õ�ü�ü�ü�‘‘ H#XXXX"X(X ` +ZâZâdânâ‚âˆâŠâ�âßý±�±�º�Ä�Ä�Ô�á�ê�ó�ü�‚‚‚‚$‚*‚,‚<‚E‚E‚X‚a‚a‚‡‚‡‚‰‚™‚Ÿ‚¤‚€ ñ‚ñ‚ƒ'ƒ2ƒ6ƒ:ƒ>ƒBƒNƒ[ƒ^ƒnƒˆý ©‚©‚µ‚¼‚À‚łɂς҂݂ã‚ë‚hÕßa�a�q�}���˜� �£�«�XÍÕ1�1�:�:�U�[�[�`�¨9Kücücdd$d-d0d7dGdZdndxd‚d…d‘d€2ìiìiüi jjjjj$j&j>>">0>8>@>H>P>Z>_>ð‰Äã?ã?ç?ë?ë?@@ @/@4@C@O@g@}@¢@Ø@ú@AAA%A-ADALAWAdAhAlAnA�AˆA›A¯A¶AÌAâAäAèAèAèAôABBBBB B'B'B9B:B?BRB˜ÄôSBSBWB_BhB|B�B¤B«B»BÀBÏBØBìBC(C>CXC`C|C�C¨CÉCäCíCûC DD!D-D/D:DNDNDoDoDzD�DŒD�D‘D¤DÐ;CECEYE`EtEwEwE›E®EÀEÒEûEF(F/F1F4F:F>FOFYF_FbFeFgFsFŠF’F®F±F´FÂF×FçFóFG"G7G:G=GMGUGUG]GdGkGkGyG‘G øWsc>c>w>�>ˆ>”>—>¬>¯>³>µ>¸>»>Ã>Æ>Æ>Ò>æ>æ>ð>? ????#? Ð<Ã2Ã2Ç2Ó2ó23 33&343C3{3{3ª3Ç3Ñ3Þ3444.4.4=4L4`4…4‰4‹4‹4š4š4œ4œ4¦4µ4µ4¹4¾4Ç4Ç4Ù4à4î4ý4(51515C5C5I5›=!8/3¢1¬1¿1Ä1"X)—‰—‰›‰¡‰°‰·‰Ɖå‰þ‰þ‰ŠŠŠ"Š"Š1Š1ŠBŠTŠYŠ^ŠnŠnŠ�ЗФайоооŠÞŠþŠþŠ‹‹ ‹#@•šnnn'n)n$xeqàlàlìlýlmmmmm!m%Àq†(m(mFmJmTmemfmgmsm|m›m§m°mºm»m¾mÌm&ˆ¡¯PnPnXnonzn€n†nŒnŸn¦n«n±n' ¯À¸n¸n¾nÊnÝnènooooo&o*o.o2o(ÀÀÕ8o8o=o>o?oGocoeo{o‘o¤oºoÔoØo)Pš¡0n0n8n>nDnInPn*€1>Z)Z)_)_)w)y)ƒ)Ž)—)¥)°)²)·)+�†•ÐmÐmÔmÚmàmæmìmòmømþmn +nnn,` +3333+313333363-�Üë�¢�¢ ¢µ¢¿¢Ñ¢Ø¢Ý¢á¢ç¢î¢ñ¢£.` (;Â;ÂEÂ]–œžž¤Â/` ËÁËÁÕÁíÁ&Â,Â.Â.Â4Â0`~‡»Å»ÅÆÅÏÅÏÅÚÅÞÅÞÅäÅ1837Ê1Î1Ü1Þ128ðôª/®/¼/¾/38R0V0m0o048#':1>1_1a158ùýê/î/0068+/Š1Ž1œ1ž17`DM¯™¯™¸™Æ™Ì™ä™æ™æ™ë™88 š0ž0¬0®098Ú0Þ0ì0î0:ú¢Î¢ÎÌÎÝÎìÎùÎùÎ Ï ÏÏÏ!Ï%Ï)Ï-ÏPÏQÏRÏ]ÏbÏyςσϊÏ�ÏŸÏ;&†ÿrÿr&s)s-s6s9s@s@sDscswszs‰s�s”s­s¶s¸sÑsÚsÚsásæsësõsúsÿsÿst ttt t$t$t+t0t5t?tDtItItItUtWtftftftrtttƒtƒtƒt�t™tžt¡t£t£t£t¬t¶t»t¾tÀtÀtÀtÉtÓtØtÛtÝtÝtëtðtôtötötûtu$u<P+2‡_‡_‹_¡_¦_º_¼_Æ_=`"+/_/_3_I_N_b_n_{_…_>x"Ç^Ç^Ö^ì^_ ____!_/_?ˆÙWyWy]yny�y�yªy¸yÉyøyøyzzzz!z,z5z@zRz„z–z¸z¸z½zËzÔzçzîzøz{{2{4{J{`{`{`{d{@àÀÙwwww{wŠw�w›w§w³w¼wÈwÏwÔwáwøw +x#x‰L‰Z‰a‰l‰w‰~‰…‰–‰GÀg{g{o{q{€{–{¢{³{©{»{À{Ì{Â{Ô{Ù{Ù{Û{Þ{ä{H€†³7u7u=u[ulu|uƒu²uÆuÐu×uéuîuõuv vv&vLvZv|v�v�v�v�v’v¥v³vÄvÜvÞvÞvñvwwww wI�2AÇ_Ç_Ë_ß_ã_` `=`L`X`f`m`z`—`›`J�úRòRòVòcòhòqò›ò ò¥òªò¯ò´òÌòíòúòó!ó*ó/ó4ó9óBóGó\ó\óaófópóvó€ó…óŽó“ó˜ó·óÀóÅóÊóÏóÔóàóâóô/ô/ô9ô>ô\ô\ôaôjôtô€ô—ô—ô£ôªô³ô¿ôáôáôèôíôöô÷ôõõÔõK¨þb'b'ƒ'—'ž'¨'¬'°'´'´'¾'¾'È'Û'õ'ø'(LP +( +((((6(P(\(Mè6�˜�˜¦˜º˜ŘŘÓ˜טã˜÷˜÷˜™™ ™™™ ™4™4™4™N™\™N˜Qaú‘ú‘’ ’’’ ’*’.’1’5’C’J’O’Oˆm{š’š’£’«’®’¼’À’Ä’Ç’Õ’Ü’á’P` +è?è?ì?ì?@@@@@Qh HpHpRpTpYp\p_pdpjpRh ppp p$p2p5p;pCpSh ØoØoâoçoêoðoóoõoûoTh )ppppzp|p�pŠp�p’p˜pU Ý¡‹¡‹»‹Ì‹ã‹é‹ð‹ð‹ú‹þ‹þ‹ ŒŒŒ>ŒKŒKŒZŒiŒ|Œ|ŒˆŒ¥Œ§ŒÅŒÇŒÊŒÌŒÌŒÏŒÏŒÛŒâŒâŒæŒñŒ����(�0�V�l�r�…�…�Ÿ�¨�«�Ã�Vh(É�É�Í�í�ŽW8=�±„±„DŽ΄ЄԄç„î„ñ„ ………(…-…-…1…M…T…^…d…k…w…ƒ…‹…”…˜…©…©…©…²…¶…½…Á…Á…Ó…æ…ï…ó…󅆆††%†1†1†1†F†K†a†f†y†~†—†—†—†§†Ñ†XðŒÇ)‡)‡C‡E‡^‡j‡n‡Š‡œ‡œ‡œ‡¨‡´‡»‡»‡Æ‡Ñ‡á‡é‡î‡î‡÷‡ˆ +ˆ +ˆ +ˆˆ!ˆ$ˆ0ˆAˆQˆSˆSˆSˆjˆpˆ|ˆˆˆ�ˆ—ˆ§ˆ§ˆªˆ¶ˆÇˆÚˆÜˆÜˆáˆŠYÈÇÝ Š ŠŠ,Š2Š5ŠPŠ^Š^ŠhŠjŠjŠtŠvŠvŠ�Š�ŠƒŠŸ‹Z˜uª ª ® ¿ Ð á ò   % 6 G X i z ‹ œ ­ ¾ Ï ç à ø ñ  $5FWoh€y‘Š¢›³¬Ä½ÕÎæß÷ð*#;4E]VngxÅ[œÚ,»,»J»T»X»b»z»z»‚»Œ»–»™»œ»œ»Ÿ»Ÿ»Ü»ß»â»ä»÷»ú»ý»¼¼¼¼'¼*¼.¼0¼6¼6¼B¼B¼P¼R¼R¼\¼\¼\¼^¼l¼s¼s¼s¼y¼|¼�¼„¼‰¼”¼›¼ž¼°¼\°‰œ̺̺ںãºïºõºøºýº» +»»»» »#»#»)»]hßé,a,aLaPafaza„a‡a—a^pÏÚÄ`Ä`Ö`ß`è`ó`ü`ÿ` a_P»Âç�ç�ð���`ØÌä’Í’Í–ÍŸÍÇÍíÍøÍÎ +ÎÎÎ!Î!Î#Îa`7@bÐbÐfÐkЅОУХÐbh­·ÔÔÔ#Ô.Ô5Ô=ÔbÔœÔcP³º¢Ì¢Ì¦Ì±Ì¶ÌÀÌÂÌd�­:Ó:Ó?ÓKÓKÓaÓlÓlÓzÓzÓ•Ó«ÓµÓ»ÓÌÓæÓñÓüÓÔÔÔÔÔe “¤ÚËÚËéËòËüËþË Ì ÌÌÌÌÌ<ÌJÌKÌQÌfh¤®RÌRÌ\Ì]Ì^ÌeÌmÌ}Ì~̃Ìg@®³ŠÌŠÌŽÌ™Ì›ÌhÈäú*Î*Î2ÎBÎEÎFÎFÎKÎVÎYÎlÎuÎzΉÎ�ΟΟΟΟΡΡÎi˜@�ªÐªÐ¶Ð¼ÐËÐØÐÝÐÝÐÞÐßÐìÐóÐøÐÑÑ'Ñ;Ñ=ÑXшѢѸÑÃÑãÑåÑðÑúÑÒÒÒ$Ò/Ò=ÒDÒDÒPÒPÒ^ÒrÒ‹Ò³Ò¾ÒÆÒÍÒ×ÒÛÒàÒåÒïÒÓ ÓÓÓÓÓÓ9Ój¨ºÌÂÌÂÌËÌäÌåÌæÌÍÍÍ3Í;Í;ÍPÍk͈͉͉͎ÍkX= E B B T g r x { ƒ là+äbžbžkžkžž‘ž‘ž§žÊžÊžîžàžŸŸAŸ%ŸbŸbŸxŸ¡Ÿ¡ŸËŸ·ŸìŸìŸ , , W B x x Ž ¾ ¾ ï Ô ¡¡&¡P¡P¡{¡f¡œ¡œ¡²¡â¡â¡¢ø¡4¢4¢J¢{¢{¢‘¢´¢´¢Ø¢Ê¢ù¢ù¢+££L£L£b£‹£‹£µ£¡£Ö£Ö£ì£¤¤A¤,¤b¤b¤x¤¨¤¨¤Ù¤¾¤ú¤ú¤¥:¥:¥e¥P¥†¥†¥œ¥Ì¥Ì¥ý¥â¥¦¦4¦e¦e¦{¦¤¦¤¦º¦ë¦ë¦§*§*§@§q§q§‡§°§°§Æ§ç§ç§ý§¨¨4¨W¨W¨m¨�¨�¨¦¨Ï¨Ï¨å¨©©$©U©U©k©œ©œ©²©Û©Û©ñ©ªª0ªaªaªwª¨ª¨ª¾ªáªáª÷ª««-«-«`«`«“«“«®«®«á«á«¬¬;¬;¬e¬e¬�¬�¬�¬¥¬Ñ¬ ³mЃºÑÑÑ)Ñ0Ñ8Ñ?Ñ?Ñ[ÑmÑmÑrÑ{Ñ„Ñ�іјѡѪѬѬѵѾÑÀÑÀÑÉÑÒÑ×Ñ×ÑàÑéÑîÑîÑîÑ÷ÑÒÒÒÒÒ"Ò+ÒHÒeÒxÒxÒ†ÒŠÒ~ÕnðÐ+•• • • •1•1•G•j•j•€•€•¸•â•â•ø•ø•)–L–L–b–b–š–Ä–Ä–Ú–Ú– —.—.—<—i—i—w—«—«—¹—â—â—ð— ˜ ˜.˜e˜e˜s˜®˜®˜¼˜™™™O™O™]™˜™˜™¦™è™è™ö™<š<šJššššš¨šóšóš›G›G›]›y›y›�›¨›¨›¾›×›×›×›í›œœažo`º#„Õ„Õ–Õ¦Õ­ÕµÕ¼Õ¼ÕØÕÜÕÜÕüÕüÕÖ Ö Ö ÖÖÖÖÖ$Ö'Ö)Ö)Ö3Ö6Ö8Ö8ÖBÖEÖJÖJÖTÖWÖ\Ö\ÖfÖiÖnÖnÖnÖqÖtÖtÖŽÖžÖžÖ²ÖÂÖÂÖÄÖÄÖÇÖÑÖÖÖÖÖÖÖÙÖÜÖÜÖãÖòÖÿÖ××××××××××× ×"×"×"×)×8×F×H×H×K×U×Z×Z×d×d×u×ׇׂבבנפ×jÚp¨M_¬Ç¬ÇÀÇÌÇÓÇÙÇâÇèÇëÇëÇþÇ ÈÈÈ Èqˆ*²ë²ë¾ëÈëñëúëüëìì ì-ìr€¿Ìƒƒ‘—£¯³ÇÜäùÿsp ššš%š4šOšSšYš[š[šaštX@@@@D@D@X@\@\@`@u§ÆLgLgbgmgrg{gŽg¦g®g¶gÃgÍgÔgÛgßgãgîgôgýgh +hhh!h#h1hv Æ×4h4h>hEhPhUh^hmhshzh|hhŠh�hwøh„¤e¤eªe·eÈeÒeÙeàeéeñe fff!f)f0f7f?fEfPfTfVfVfZfxKh”d”d d§dºdÆdíd÷de eee%e7eIeIeceoexe†eŒe’e•eœe¤ey ×è”h”h¢h¥h°hµhÂhÍhÜhòhühiiiizpèóii*i1iXJXKXLXVXXX^X^XeXeXkXrXrX}XX‡X�X’X’XžX¨X¬X±X±X±X±X¸X¸XÃXÆXÈXÍXÍXØXÚXâXâXóXõXûXYYY#Y'Y2Y@YLYVYZY\Y\Y_YiYmYzY‡Y‹Y‘Y”Y›Y�Y�Y­Y³Y¼YÃYÇYÉYÉYÉYÉYÉYÐYÔYØYÛYÞYâYçYñYZ +ZZZZ!Z3Z}øàüG[G[a[j[v[y[†[‹[•[¡[§[±[´[µ[¿[Á[Ê[Ô[ß[æ[ê[ò[ó[ó[\~Xü$\\\5\?\T\\\\\b\b\e\l\w\{\€\†\�\–\™\›\ž\¡\¡\¦\µ\¸\Ê\ $5Ï\Ï\Ý\â\ã\ä\ä\ö\ø\]]] ] ]%]€p×"VV-V/V2V>V?V@VJVLVWVdVlVqVƒV…V…V‰V™V§V·VÂVÇVÇVÎVÎVÙVÙVøVWWWWWW W W*W,W4W:W}E}E}M}[}l}t}{}{}�}�}œ}¡}­}¹}Ã}Õ}ä}é}í}ô}~~~~~)~0~=~>~H~R~\~c~m~t~y~ƒ~Š~�~™~ ~ª~´~»~Å~É~Ò~Ú~ã~;H]huu|ž«±³’p•À×€×€á€ë€ë€9�9�‡�‡�Õ�Õ�ó�‚/‚F‚F‚„‚„‚�‚’‚¯‚¯‚í‚í‚ù‚û‚ƒƒHƒOƒTƒ^ƒyƒ€ƒ‚ƒ‡ƒ�ƒ“X�•w€w€�€«€³€Ê€Ì€Ò€”`±±1±C±M±•ˆâðZ/Z/e/j/k/l/s/…/†/š/�/£/–xCo[[_c‡�Ÿ«·Öîþ466WYYz||……��™­·¿¿ÑØØê÷C—�ožCCGKox‡“Ÿ«ÊÒêú355Y[[��ŠŠ’’ž²¼ÄÄÖÝÝïü H˜h"qƒqƒ�ƒ�ƒ§ƒ²ƒ´ƒ´ƒ¼ƒ™@"'ÁƒÁƒÕƒçƒïƒšx1=Q„Q„c„f„t„‘„•„¤„§„±„›h'1ñƒñƒ„„-„@„B„B„L„œH %ԾԾݾã¾ð¾ò¾÷¾�ÐlƒÐÐ@Ð@ÐHÐbÐlÐoÐtÐ|Ð�РЭЯнÐÊÐÚÐîÐðÐðÐÑžP•œò@ò@÷@AA AAŸÐ)‹À‹À›ÀœÀ�À¨À­À¹ÀÀÀÆÀâÀÁ!Á*Á+Á6Á °¿Ò«½«½ǽȽɽÔ½Ù½å½ÿ½¾¾ ¾'¾0¾1¾4¾@¾¡°ÒåC¾C¾_¾`¾a¾l¾q¾}¾—¾ž¾«¾¶¾½¾ƾǾʾÖ¾¢°¬¿½½/½0½1½<½A½M½g½n½{½ˆ½�½˜½™½œ½¨½£�ôk¿k¿‹¿Œ¿�¿˜¿�¿©¿ÿʿѿ޿ç¿è¿ô¿¤�û¿û¿ÀÀÀ(À-À9ÀSÀZÀaÀnÀwÀxÀ„À¥�åôÛ¾Û¾û¾ü¾ý¾¿ ¿¿3¿:¿A¿N¿W¿X¿d¿¦à:SÊãÊãàãéãää'ä<äCäCäKägägäuä™ä©ä¯ä¸äÒäÒäà䧸Sgâäâäôäûä +åååå0å;åCåWå`åfåqåqå�娘 +:’â’â¬â¯â²â¼âÂâÎâÑâØâáâåâîâñâøâã ããã ã)ã2ã@ãGãVãbãeãhãqãvã�ã™ãœãŸãŸãŸãŸã£ã«ã³ã¶ãÈã©; ( (('(7(A(I(P(T(\(f(t(ƒ(‰(‘(�(£(£(ª(®(®(°(õ(ªX b(b(f(j(l(«p÷g°g°‡°’°¤°œ°·°ȰȰȰÔ°¬h$`@`@i@i@~@~@‹@ @ @¥@­p[fTÀTÀYÀcÀqÀ}À�À…À…À—À®X5 = +  +  , 2 8 > ¯XL T Ê Ê Ú ì ó ù ÿ  °XT \ +  +  , 3 9 ? E ±@7<â1â1æ1ý1ÿ1²XX`«Ä«Ä´Ä´ÄÀÄÆÄËÄÐijHRX{Ä{ĄĕĤĤĩĴ€þþ$þ*þ3þHþRþWþcþiþkþkþpþµx‡“ÃÃÐçõ%,/7¶€“ ;;F]kzzŽ£¯¾ÀÆ·8Åé» » Ç Ñ Ø å õ ù  #2;Y;w†—�¬½ÃÃãôþ˸€/<óþóþÿÿÿ'ÿ/ÿ7ÿ<ÿBÿDÿDÿJÿ¹p|‡{{�‰�²º½¿ÃºXÇÏZ%Z%c%h%w%{%}%‚%»@T¾T¾]¾i¾n¾¼H?E”¿”¿�¿¤¿ª¿¯¿½HEK´¿´¿½¿Ä¿Ê¿Ï¿¾€ÉÖ³/³/½/Ä/É/Ô/Ö/ß/ñ/÷/÷/0¿h+5$¿$¿-¿2¿<¿A¿G¿N¿N¿Z¿ÀàoˆßQßQãQ÷QR:RGRkR}R¡R¦R¾RëRôRöRSSESNSNSZSZSÐSÁè¯É{.{.’.œ.¦.¦.½.È.Í.Ø.Ý.Ý.÷. ///(/=/=/D/D/®/ÂX ‚³‚³�³›³ª³´³º³Ã°´Çº$º$Ê$Ø$ß$ï$%%%(%5%J%L%O%Q%Q%Q%Y%ÄàÏè‚%‚%’%˜%¢%©%½%Ö%Ö%å%û%&&&&&&&<&D&F&I&K&K&W&Å�ÂêÂêØêëêëêëë ë%ë%ë-ë/ëWëÆh5?\¿\¿e¿j¿t¿y¿¿†¿†¿“¿Ç@‘öϔϔñ”•••••)•.•@•J•L•P•\•\•k•p•t•�•™•©•©•º•½•¿•ʕʕەޕá•ã•é•þ•– ––!–)–)–,–8–V–[–l–u–w–z–„–�–—–—–ª–¯–²–Í–Ö–ë–ð–ú–— —————2—5—8—:—@—Y—\—f—m—m——Èx3_/’/’I’I’L’P’d’i’|’†’ˆ’Œ’˜’˜’§’¬’°’Í’Ò’â’â’ó’ö’ø’““““““!“7“:“D“R“ɨ_‘W“W“y“}“}“€“Œ“¨“­“½“Ɠȓ˓Փޓè“è“û“”””&”;”@”J”S”]”`”b”m”m”„”‡”Š”Œ”’”­”°”º”̔ʨ3‘‘3‘=‘=‘@‘D‘T‘Y‘j‘t‘v‘z‘†‘†‘•‘š‘ž‘¹‘¾‘ΑΑß‘â‘ä‘ï‘ú‘ý‘’’’’’’.’ËpALHqTqWqYq^qaqdqiqqqÌx5Aàpàpôpq +qqq/q2q7qCqÍx)5˜p«p®p³p¶p¶pÉpÏpÒpÔpÞpÎpLWxq„q‡q‰qŽq—qšqŸq§qÏX„ŒÐrÐrÙrÞrærìrìrñrÐ�Œ›ørørss!s$s$s+s+sDsGsLsNsVsÑ`W`¨q¨q²qÁqËqÛqßqâqèqÒ8`„èqèqÿqrrrrr r%r6r;r>rCrLrLrLrPrZrirqr†r‘r£r§r©r»r¿rÁrÁrÁrËrÓX’š[Ô[ÔwÔ{Ô�Ô›ÔŸÔ«ÔÔPš¡«Ô«ÔÇÔËÔÑÔëÔûÔÕ @a##'+7@Q`lu³ÂÎÕóþ  G Y c j q Œ Œ Œ ž ¥ ¥ · ½ Á Öøv’[Ó[ÓwÓ‡Ó’Ó—Ó™ÓŸÓ±ÓÃÓÓÓäÓôÓöÓöÓöÓüÓÔ2ÔBÔDÔDÔMÔMÔYÔ×@5:ëë ØH5++/8HWc|||©ÎÓÓþ MYlty‹��–––¨¯¯ÁÆêÙh¤®pCpCtC¢CÀCÒCãCíCÚ`ÖßÀEÀEÄEòE F2FCFMFÛH´º0D0D4D_DmDoDÜHÀưD°D´DßDìDîDÝXÎÖXEXE\EŠE¸E¼E¾EÞH®´ðCðCôC D-D/DßHºÀpDpDtDŸD«D­DàXÆÎðDðDôD"EPETEVEáH‚ˆBBB?BGBIBâHŽ”ˆBˆBŒB·B¾BÀBãXœ¤CCCJChClCnCäH|‚ÐAÐAÔAÿAB BåHˆŽPBPBTBB…B‡BæX”œÀBÀBÄBòBCCCç8ßãPFPFYFkFè`#ò0ü0ü010151é@gŒr>r>€>‡>‘>Ÿ>Ÿ>§>À>ã>å>???@?f?f?ˆ?’?œ?ª?Â?Ï?Ø?Ø?ñ?û?@"@$@+@2@h@ê`ÚÚð"*4<V[[c}‚‚Š”®³³¹ÀÀÖÞåìóþ  + - A c y ‡ Ë ³ ä  # - D G K P Y b ¬ ’ Ç ö !+!5!6!7!J!Q![!p!y!�!ž!¯!²!¹!Ó!å!ë�Ž�òòò ò ò ò ò'ò,ò2ò6ò:òJòOòRòì°b•WWW W-W-W=WLWVWbWmW{WŠW›W·W¿WËWÓWÛWÛWæWèWúWXX,XNXbXoXŠX§X©X»XÄXÄXÖXÖXäXëXëXýXýX Y YYYí -CTCTQT[TkTxTmT…T�T�T¡T«T«T­T×TYY Y@YGYVYcYoY~Y’YªYÀYÀYÍYàYZZZZ&Z&Z?Z?ZbZ€Z‰ZÊZÏZîZ0[[@[S[•[ž[¦[³[Å[×[é[ \\1\K\`\z\†\˜\�\¯\Á\Ù\é\õ\]];]F]Q]\]v]�]�]™]™]ž]­]»]ü]Ô]^^!^A^A^H^‹^‹^®^¼^¼^ý^ÿ^ÿ^_ _&_1_1_?_?_T_T_e_l_l_�_�_’_’_•_�_ï¨VhCKCKGKNK]KmKtKšKšK«KÊKÑKØKåKîKòKðȲè“O“O—O›O›O¿OÌOÕOÜOìOÿOPP"P.PFPYPYPfPyP—P P P­P¸PÃPÃPÐPÚPéPÿPQ-QFQJQLQQQVQ_Q_QqQxQxQŠQ‹Q�Q¶Qñ¸è»Q»Q¿QÇQÐQäQøQ RR#R(R7R@RTR{R�R¦RÀRÈRäRìRÿRSS7SBScS~S‡S•S§S©S»SÇSÉSÔSèSèS T TTT&T'T+T=Tò >o;b;bablbnb|bˆb�b�b¢b¢b¢bµbÈb×bÜbñbÿbc ccc/c2c5c9cMc^cŒc•c™cžc¦c¦c·cÈcÈcÐcØcØcÛcdóà>£_£_§_Ç_Ö_à_é_ú_`%`%`2`E`c`l`l`y`„`�`�`œ`¦`Ë`Þ`ý`aa!a/a6adaBa¬aza½aÂaÔaØaàaàaîaùaùabbbb'b'b,b:bôðoªddd"d*d*dNd]dfd}d•d¨d¨dµdÈdædïdïdüdeee7eMOMkMyM’M¡M¡M´MÂM×MîM÷MN"N9NQNQN^NkNvN‹N¤N¹NËNËNÐNÛNæNóNOOPOYOdOkOvO€O‰O�OöÀ-bÛTÛTßTãTìTúTUUU%U/U;UFUTUcUƒU�UµU¹UÒUêUùUýUVV V.V=V`VnV}V˜V¨V¬V¹V¹VËVËVÙVàVàVòVòVWWWWW÷È“G“G—G¦G²GÆG×GâGëGóGõGHHH H H2H3H7Hø@<;H;H?HGH~H�H™H¤H²HÍHèHöHþH I ICIEIIIIITI_InI}I I«I°IÂIÉIÉIÛIÜIàIù@ªÏ+g+g/g?gPg_glg{g…g g­g¿gÎgÝgìgþghhh&h1h@hOh^hphƒhŒhŒhšh¡h¡h¯h¸húè<VãIãIçIöIJ J J?JNJ\JeJxJŠJ»JÍJåJýJKKK$K$K9K:K>Kû@/4AAA"A(Aü°,?ºEÈEÖE×EØEîE÷EF FF F'F?F?F?FFFGFMFýØþŠÿŠÿžÿ¬ÿ²ÿþxNZDÏDÏTÏWÏ_ÏiÏtσϋϕÏÿˆ0þ +Û +Û Û#Û#Û7Û@ÛCÛNÛPÛcÛmÛxÛÛ“ÛžÛ¨Û¬Û¯ÛµÛ¿ÛÃÛÆÛÌÛÎÛáÛöÛÜÜÜÜ+Ü.Ü8Ü;ÜNÜcÜoÜrÜr܇ܘܜܢܢܦܪܮܲܲÜÈÜÈÜËÜÏÜÑÜÑÜÔÜØÜÚÜÚÜÝÜáÜãÜãÜæÜêÜìÜìÜïÜñÜñÜóÜóÜõÜõÜýÜýÜ ÝÝÝÝ!Ý$Ý(Ý-Ý1Ý;Ý>Ý>ÝSÝhÝjÝtÝwÝ{Ý�ݔݯÝÃÝÃÝÃÝÃÝÃÝÇÝÊÝçÝçÝçÝüÝÞ3Þ8Þ8Þ8ÞMÞjÞ‰ÞŽÞŽÞŽÞ£ÞÂÞáÞíÞòÞòÞòÞß+ßJßVß[ß[ß[ßpß�߬߸߽߽ßÃߨßàà&à+à+à1àFàqàuà”à™à™à™à®àÆàÍàíàòàòàòàá á&á4áDáháoá‘á–á–á–á«áÌáëá÷áüáüáüáâ2âQâ]âbâbâbâwâwâ�â¿âßâäâäâäâùâãã ã0ã0ã7ãAãVã[ãfãvãvã¬ãºãÀãÓãÛãäãäãäãðãôãôãûã ääää'ä'ä9äkäzä„ä�ä—ä£ä­ä­ä»ä½äÈäÖäØäîäîäóäóä)å:åCåCåCåOåVåVå]åuå~å~åŠå•å•å«åºåÈåÊåÙåçåéåÿåÿåÿåæ%æ'æ'æ'æ@æXæ]æ]æ]ævæŽæ¢æ¦æ¼æ¼æÓæÓæÓæãæêæðæðæ÷æççç$ç3çAçCçYçdçuçwçwçwçwçƒç›çªçªçÅçÖçÞçÿçè è&è)è9è>è_èlèlè‡è’è�è¹èÔèçèïèýèýè +éé!é\éjéjéjé†é“é—éªéâéâéäéäéê êêê ê$ê7êrê‡ê‘ê¤ê¬ê¹ê¾ê¾êËêÏêâêë2ë;ë@ë@ëNëRëRëkëƒë—ë›ë±ëÍëÍëÍëûëìì%ì%ì)ì<ìDìOìZì^ìgìgìlìŸì·ì·ìÕìèìíí6íJí\íhílí‰í›í§í«í°í°í°í´í¹í¹íÇíËíËíäíüíîî*îFîFîtî�î£î¨î¨î¨î¶îºîºîÓîëîïîïïïï9ïDïDïzï‡ï¤ï©ï©ïððð<ðHðHðLðPðcðkðyð„ð�ð“ðœðœðÂðÍðÍðëðññ ñ ñ'ñ8ñ8ñ`ñ™ñ©ñ©ñÙñÞñ òò-ò8òPò[ò[òzò†ò†ò¯òÇòÊòÊòåòåòåòêòïò"ó:ó:óXókótóŒóµóÍóÐóÐóëóëóëóëóöóô'ô1ôAôgô{ô•ô¢ô¦ôªôÇôáôîôòôöôûôûôûôÿôõõõõ5õ@õPõPõlõˆõ‹õ�õ²õ¼õÏõ×õäõéõéõéõö!ö$ö6öOöTöTöTömö…ö�ö ö ö¼öØöÛöíö÷ ÷ ÷'÷4÷9÷9÷9÷U÷q÷t÷†÷Ÿ÷¤÷¤÷¤÷¤÷½÷Õ÷à÷ð÷ð÷ø&ø;øEøXø`øiønønønø“ø¤ø½øÂøÂøÂøÂøÛøóøþøùù3ùEùZùdùwùùˆù�ù�ù�ù²ùÄùÝùâùâùíùíùÿùÿùúúˆÿpg’’å’å®å±åºåÎåØåãåååùåùåæææææ/æ4æHæHæmæ†æ�æ�æ�æ³æËæËæÍæÍæÍæçæüæüæDç¨ZlœÏœÏ·ÏºÏ¿ÏÂÏËÏÖÏéÏôÏøÏûÏûÏÐÐÐh2<HŠáŠášá°á»áÀáÎáÛáäáõáJg[[?[S[d[k[|[ƒ[ƒ[™[™[§[¯[½[Å[Ó[Û[Û[þ[!\D\S\h\h\w\w\‘\±\pèóZ&Z&l&&�&ž&¤&¬&¶&¾&˜ç÷ׄׄý„……!…A…a…‚…‰…�…—…¡…¯…hƒ�··½Ü +€ €a€o€s€ˆ‡V‡V•VšV�V¡V¥V®V¶V¾VÆVÆVÌVˆSa/a/a3aBaNaZafata€a‡aŒa™ašaža@ôùÂ/Ì/ß/ä/8'+b1l11„1p²½š-š-£-£-­-Ð-Ð-Õ-p§²J-J-T-o-y-~-‘-—-ˆÿVÿVWW=WhW�W¾WÝW÷WXXð½ØÚ-Ú-ß-í-ü- ..>.S.Y._.f.s.�.�.£.­.µ.¾.Ö.ß.ß.ô.H%+ü¾ü¾¿ ¿¿¿ ¿�¥Ô¤Â¤Â¼ÂÂÂÂÂÌÂÏÂÏÂÜÂçÂñÂûÂûÂà ÃÃÃÃÃ(Ã4Ã:Ã?ÃEÃHÃJÃUÃ[ÃaÃjÃjÃrÃ{Ã�ÊÊÌÌÒÚÃ�íà xá ‡�‡�¯�¯�Í�å�ì�ø�ž žžž6ž6žSž]žežlžtž~ž†žšž«ž¼žÑžØžÙžÚžäžêžòžóžöžŸ 7¢Ï¢ÏÈÏäÏîÏýÏÐÐÐÐÐÐÐ(Ð-Ð=ÐFÐGÐMÐPÐbÐ!€ª·ߥߥñ¥¦¦¦1¦>¦D¦G¦O¦"¨ï*ê*êFêYêeêeêqê‡ê�ê˜êžê£ê¥ê¾ê#PÈïúèúèéé+é6éFéXé\éjésé•é›é›é§é¯éºéÄéÌéÐéÐéÐéÓéÕéÙéÙéÙéÞéìéúéê êêê%ê$È’ÈJçJç`çxç„ç”ç¦çªçªç­ç¶ç¹ç¹çÊçÊçÊçÑçßçâçççäç9èMèPèRèfèièkèsèƒèƒèŒè›è©è¹èÇèÐè×èÜèÜèÜèâèöè%H/©/©8©A©G©L©&pO©O©[©^©c©f©t©z©}©©‡©'°dO±O±S±_±g±s±}±…±�±©±©±»±ȱܱé±ñ±:²€²…²…²—²¤²¸²ŲʲÙ²³³"³(³-³-³?³L³`³m³r³�³°³·³ijʳ̳̳Ô³Ô³á³ö³´´´´:´G´W´\´f´t´´‰´”´”´ž´§´²´³´´Ç´é´ö´µµµ$µ(µ\µ(d‚_µ_µoµvµ„µ„µ…µ“µ•µ¡µ¤µ¤µ«µµµŵǵǵ̵̵εεεеܵߵ⵶)P‡©‡©�©š©¥©­©²©*€ ŸŸŸ"Ÿ"Ÿ?ŸbŸiŸxŸ‡ŸŒŸŽŸŽŸ+ Óä7¹7¹K¹^¹f¹�¹�¹°¹¼¹͹չ۹߹ñ¹,h ªo¥o¥s¥‚¥‰¥¥¥º¥¿¥Ù¥-˜r¢ú5ú566&6,6667686C6I6M6P6R6Y6`6j6v66“6”6¨6Å6µ6Ú6Ú67777$7;7;7G7O7Q7e7€7Œ7™7Ò7.¸Ùí\Ë\Ër˫˷ËÏËØËäËêËìËïËûËþË Ì/h_i$È$È4ÈPÈRÈ]È_È_ÈgÈ0˜iylÈlȆȌȑȭȳȹÈ×ÈÙÈæÈìÈïÈýÈ1`y‚ÉÉÉÉ"É/É8É=ÉGÉ2�‚‘LÉLÉbÉrÉrɂɆɈɈɔɗɚɤÉ3�ôbb&b+bDbPbYb[bgbjbmbwb4h›¥dÂdÂtÂvÂÂŒ”™¡Â5 M¼Å¼ÅÐÅÖÅÖÅñÅôÅÆÆÆ#Æ)ÆHÆMÆUÆUÆWÆdÆjÆjÆjÆoÆvÆyÆ|ƂƞƮƺƼÆÉÆÉÆÎÆÎÆÎÆôÆúÆüÆ ÇÇ Ç%Ç(Ç*Ç:Ç>ÇMÇSÇVÇXÇhÇlǀǃdžLjǘǛǧÇ6ˆ6D_™_™p™~™™€™†™œ™ ™¡™¤™¬™7@¯´UUUU*U8@´¹/U/U8UCUTU9H r0|0�0”0:І� ¿3¿5¿H¿]¿]¿}¿¿¿Ÿ¿¡¿¡¿«¿­¿­¿·¿·¿½¿À¿À;@²0¼0Ï0Ô0<𔯋-‹-›-¢-ª-±-Ã-Ã-Ð-Ò-Ò-á-ã-ã-ð-ò-ò-ü-.. ...4.4.8.{.=XI2ì2ì8ìDìTìeì}ìŠì›ì©ì½ìÍìÔìÔìçìùìíí%íCíUí]ígítíí�í í í³íÆíÑíÑíäíïíîî)îKî›î®îÀîõî÷îïï ï ï'ï;ïUïZïjïzïï‹ïÆï>@InÊïÊïÎïÎïßïÿïðð ð*ð,ð7ðBðTðfðoðxðšð¾ðÀðÇðÒðÝðèðóðñññ?Pœ£AAA*A9A=A@p»'»'¿'Ñ'å'å'ó'(( (Ap�Œццá†ý†‡‡‡‡&‡B�­¼ U U#U3UIUKUYU`UeUjUqU~U~U€UC°>Qº)º)À)Á)Â)Â)Ú)Ü)â)****%*.*/*2*6*D�DS/P/P3P@PMP\PkP€P”P£P¬P­PÏPÔPØPE€S`ßPßPãPñPòPóPQQQQF@RWBÉBÉQÉkÉqÉGXWrÉrÉ€É�ɕɩɼÉÓÉæÉýÉÊ'Ê>ÊUÊUÊmÊqÊwÊ~ʂʔʭʻÊÂÊÂÊÚÊÞÊäÊëÊïÊËË(Ë/Ë2Ë<ËH(Ôö´Ã´ÃÊÃéÃõÃÄÄ Ä'Ä,Ä8ÄIÄUÄ[Ä^ÄaÄdÄiÄkÄoÄ{ČĚĠģĦĩĩijĶÄÈÄIUr:5:5U5c5s55…5Ž5•5œ5¡5­5±5±5»5»5Â5Å5Ë5Ë5Õ5ã5ê5ê5ê5ø5J˜*�Ÿ�ŸžŸ¬Ÿ­Ÿ®Ÿ¹Ÿ»ŸßßàŸïŸøŸ   KèÀ¦¦‡¦�¦™¦¢¦®¦º¦¦˦ѦÙ¦ç¦ò¦ú¦§§.§<§H§V§p§p§p§u§z§ˆ§�§”§”§�§¤§©§µ§À§ɧɧÔ§Ö§æ§è§ê§÷§¨ ¨¨¨¨#¨/¨:¨:¨V¨V¨V¨^¨^¨e¨l¨s¨z¨z¨�¨ˆ¨�¨–¨–¨�¨£¨¯¨¸¨ĨÒ¨ܨä¨ç¨í¨L@(M?ª?ªUªeªvªŒª“ª ª¤ª¬ª´ª¿ªʪ˪̪Úªܪéªêªðªôªôªýª««'«1«:«?«?«@«C«M«M`·ÀO¦O¦X¦a¦a¦t¦z¦¦Nè4ï¨ï¨õ¨©© ©©©©'©+©OH39ÜcÜcåcëcñcöcP�$3|c|cŽcŽc›cžc¥c©c°c¸cÈcËcÕcQP†BËBËGËeËmËpË}ËR(Ÿáo›o››Ž›Ž›§›§›§›§›§›§›§›É›Þ›é›ú›œœœ0œ=œKœYœgœuœ‹œ§œ¶œ¸œ¿œÖœêœêœêœïœöœ����'�0�7�>�E�L�T�d�l�|��‡�Sˆ*8   * / 4 C Q i r ~ ª ´ Tˆ|ª­­=­@­K­\­r­y­†­Š­’­¡­¥­©­±­²­¼­¼­Ë­Ô­Õ­í­î­ø­® ®®$®&®3®9®;®=®F®L®d®p®q®v®‘®”®¦®Uˆt‚JJ.J/J0J>JEJSJZJaJhJiJqJVx�›¶J¶JÂJÃJÄJÒJÙJçJîJõJþJW€‚�vJvJ‚JƒJ„J‹J’J™J J§J¨J°JXàNg*=*=8=J=V=b=n=w=€=‰=’=›=¤=­=¶=¿=È=Ñ=Ú=ã=ã=å=k>Y�(·©·©Á©Õ©ã©î©÷©ª ªªªª6ª<ªZpMXï™ï™ó™ šš#š=šAšEš[�M|O«O«i«}«�«ž«´«ΫÕ«â«æ«î«ö«¬¬ ¬¬9¬:¬H¬O¬V¬g¬p¬{¬|¬ЬŒ¬™¬ ¬£¬¥¬®¬´¬̬جÙ¬ó¬ö¬­\@QV:*:*>*j*l*]`O˜O˜X˜j˜˜ƒ˜‡˜‡˜Œ˜^¸ã÷÷¯÷¯°°°°°°%°/°:°T°V°[°^°^°f°_Hdjè¨è¨ö¨©©`8دد쯰ap¼Ç‡U‡U�U U­U­U´UÃUÊUÊUÏUb0VyŠ*Š*�*Ÿ* *¡*­*Î*à*â*+++ +6+N+O+V+W+X+d+o+~+€+‹+—+§+¨+¯+Â+cnŽññ ñ&ñ-ñ3ñIñnñƒñƒñˆñ�ñ§ñÀñÙñÞñâñäñïñúñúñþñd€(5ÚàÚàôàá áá$á1á7á:á=áOáehmw+Ï+Ï5Ï@ÏKÏjπώÏf`Úã´¼´¼½¼Ç¼Í¼×¼å¼#½gˆ6D‚4‚4Œ4š4›4œ4¢4Á4Û4Ü4ß4å4h€“ ǤǤˤÚ¤á¤ÿ¤¥0¥A¥J¥O¥k¥iÈ}“ï£ï£ó£÷£÷£¤(¤7¤@¤I¤a¤s¤|¤ƒ¤¦¤¯¤´¤À¤¤j@`eê!ê!î!÷!ù!k(aƒà à Ç Ë × à ñ  + + + +/ +> +| +‹ +— +¢ +¬ +Ä +ë +õ +ü +  0 0 0 B I I [ a e lHÃÉÓÓíþm@žÃKKOXhwƒœœÉÑÖÖãù +$Q]px}}†††˜ŸŸ±¶Òní cc}Œ¢´ÉÏÔÚÝÝë÷úýý #99Oo@´Ù„Ê„ÊšÊ Ê Ê¯Ê¿ÊÆÊÏÊÏÊÙÊâÊâÊèÊìÊïÊùÊËËËËË/Ë4Ë7Ë:Ë=Ë@ËIËIËIËIËIËIËWËp e†ú!ú!""""")"?"N"g"ƒ"’"«"Ç"Ñ"ß"í"û" # #!#7#M#c#d#i#qp±¼×·×·ï·¸¸"¸(¸.¸>¸rPý¯º¯ºźغãºéºñºsP ÷º÷º » »+»1»?»th¼Æ?¸?¸W¸j¸~¸Џ�¸–¸�¸­¸uHRŽRŽdŽžŽ´ŽÂŽv˜K[Ô¿Ô¿Ù¿ã¿ã¿ÀÀÀÀÀ'À+À+À+ÀRÀw@�•z,z,~,’,œ,x@•š¢,¢,¦,¹,Ã,yÐy�Ò+Ò+×+×+,,,,, ,",0,_,f,o,p,w,w,z,zP¥¬÷T÷TU UUU{؈ ×S×SÛSéSúS T T-TJTOTZTdTqTT‘TšT¦T«T·TÃTÛT|@ ¥ßTßTãTñTóT \ No newline at end of file diff --git a/TempleOS/Kernel/Kernel.PRJ b/TempleOS/Kernel/Kernel.PRJ index a176318..e3bb502 100644 --- a/TempleOS/Kernel/Kernel.PRJ +++ b/TempleOS/Kernel/Kernel.PRJ @@ -24,7 +24,7 @@ kernel_cfg=KernelCfgNew; #include "Font8x8" #include "Memory" #include "Interrupts" -#include "FIFO" +#include "DataTypes1a" #include "Compress" #include "Hash1a" #include "Date" @@ -41,7 +41,7 @@ kernel_cfg=KernelCfgNew; #include "QSort" #include "Task1a" -#include "TaskCmd" +#include "SrvCmd" #include "BIOS32" #exe {Cd("Dsk");}; @@ -53,7 +53,7 @@ kernel_cfg=KernelCfgNew; #include "DskAddDev" #include "DskDir" #include "FileSysISO1" -#include "FileSysNative" +#include "FileSysRedSea" #include "FileSysFAT" #include "Dsk1b" #include "DskCFile" diff --git a/TempleOS/Kernel/Math1b.CPP b/TempleOS/Kernel/Math1b.CPP index 1c0931d..ce5a0b6 100644 --- a/TempleOS/Kernel/Math1b.CPP +++ b/TempleOS/Kernel/Math1b.CPP @@ -70,7 +70,7 @@ I64 CeilI64(I64 num,I64 to) } } -//See $LK-A,"::/TempleOS/Doc/Acknowledgements.TXT"$ (6). +//See $LK-A,"::/TempleOS/Doc/Acknowledgements.TXT"$. #ifdef SYS_DETERMINISTIC $FG,6$U16 RandU16() { diff --git a/TempleOS/Kernel/Memory.CPP b/TempleOS/Kernel/Memory.CPP index 3d6bd5b..e01963c 100644 --- a/TempleOS/Kernel/Memory.CPP +++ b/TempleOS/Kernel/Memory.CPP @@ -1,6 +1,6 @@ asm { /* -See $LK-A,"::/TempleOS/Doc/Acknowledgements.TXT"$ (3). +See $LK-A,"::/TempleOS/Doc/Acknowledgements.TXT"$. See $LK-A,"::/TempleOS/Doc/Mem.TXT"$ */ @@ -190,7 +190,7 @@ I64 MemPageSize(U8 *a) return 0x200000; } -I64 *MemPtAtPageTableEntry(U8 *a) +I64 *MemPageTable(U8 *a) { if (a>12 *8; @@ -201,7 +201,7 @@ I64 *MemPtAtPageTableEntry(U8 *a) Bool MemPagePresentMark(U8 *a,Bool val) { - I64 *pte=MemPtAtPageTableEntry(a); + I64 *pte=MemPageTable(a); Bool result=*pte&1; if (val) *pte=*pte|1; //Mark present @@ -415,7 +415,7 @@ am_done: m=result; m1=m(U8 *)+i; while (mnext,*d1; - while (d!=root) { - d1=d->next; - if (querem) - QueRem(d); - Free(d); - d=d1; - } -} - -CQue *QueCopy(CQue *root,CTask *mem_task=NULL) -{ - CQue *result=MAllocIdentical(root,mem_task),*d=root->next,*d1; - QueInit(result); - while (d!=root) { - d1=MAllocIdentical(d,mem_task); - QueIns(d1,result->last); - d=d->next; - } - return result; -} - -I64 QueCnt(CQue *root) //Does not include root -{ - CQue *d=root->next; - I64 result=0; - while (d!=root) { - result++; - d=d->next; - } - return result; -} - -I64 QueSize(CQue *root) //Does not include root -{ - CQue *d=root->next; - I64 result=0; - while (d!=root) { - result+=MSize2(d); - d=d->next; - } - return result; -} - U0 BlkPoolAdd(CBlkPool *bp,CMemBlk *m,I64 pages512) { if (sys_mem_init_flag) @@ -1330,7 +1244,7 @@ U8 *Mem64DevAlloc(I64 *_pages2Meg) Yield; while (i--) { sys_mem64_dev_ptr-=0x200000; - pte=MemPtAtPageTableEntry(sys_mem64_dev_ptr); + pte=MemPageTable(sys_mem64_dev_ptr); *pte=*pte&~0x18 |0x11; //Uncached and present InvlPg(sys_mem64_dev_ptr); } diff --git a/TempleOS/Kernel/Misc1a.CPP b/TempleOS/Kernel/Misc1a.CPP index df2a05d..12804f3 100644 --- a/TempleOS/Kernel/Misc1a.CPP +++ b/TempleOS/Kernel/Misc1a.CPP @@ -186,38 +186,29 @@ U0 Sleep(I64 mS) SleepUntil(sys_jiffies+mS*JIFFY_FREQ/1000); } -U0 Snd(F64 freq,I64 waveform=WF_SQUARE,F64 amp=1.0) -// The internal PC speaker only does square waves. -// waveform and amp are for HDAudio. -// Use $LK,"SndFilePlay","MN:SndFilePlay"$() or $LK-A,"::/TempleOS/Demo/Snd/PolyPhonic.CPP"$ as a template for -// doing polyphonic or fancy HD Audio snd. +U0 Snd(F64 freq) { I64 p; - if (!Bt(&sys_semas[SYS_SEMA_MUTE],0) && snd_vol && - !LBts(&sys_semas[SYS_SEMA_SND],0)) { - if (!IsInDbg && snd_dev!=SD_PC_SPEAKER) { + CSndData *d; + if (!Bt(&sys_semas[SYS_SEMA_MUTE],0) && + !LBts(&sys_semas[SYS_SEMA_SND],0)) { + if (freq!=snd_freq) { snd_freq=freq; - if (fp_snd) { - if (00) - (*fp_snd)(freq,waveform,amp); - else - (*fp_snd)(0,waveform,0); - } - } else { - if (freq!=snd_freq) { - snd_freq=freq; - if (00) { - p=SYS_TIMER_FREQ/freq; - OutU8(0x43,0xB6); - OutU8(0x42,p); - OutU8(0x42,p.u8[1]); - OutU8(0x61,3|InU8(0x61)); - } else - OutU8(0x61,InU8(0x61)&~3); - } + if (0freq=freq; + d->time_stamp=tT; + QueIns(d,snd_record_root.last); } - if (!IsInDbg && snd_record && fp_snd_record) - (*fp_snd_record)(freq,waveform,amp); LBtr(&sys_semas[SYS_SEMA_SND],0); } } diff --git a/TempleOS/Kernel/MultiProc.CPP b/TempleOS/Kernel/MultiProc.CPP index cb29dc5..9808ce8 100644 --- a/TempleOS/Kernel/MultiProc.CPP +++ b/TempleOS/Kernel/MultiProc.CPP @@ -80,7 +80,7 @@ USE64 } U0 TSSBusy(I64 tr,Bool val=OFF) -{ +{ //See $LK-A,"::/TempleOS/Demo/Lectures/Ring3.CPP"$. LBEqu((&sys_gdttab)(U8 *)+tr+4,9,val); } @@ -124,16 +124,9 @@ CTSS *TSSNew(I64 cpu_num) return tss; } -U0 MPCmdCtrlInit(CMPCmdCtrl *ctrl) -{ - MemSet(ctrl,0,sizeof(CMPCmdCtrl)); - QueInit(ctrl); - ctrl->next_done=ctrl->last_done=&ctrl->next_done; -} - CTask *TaskIdleInit() { - CTask *task=Spawn(0,NULL,"Idle Task",Fs,,0); + CTask *task=Spawn(0,NULL,"Idle Task",,Fs,,0); Bts(&task->task_flags,TASKf_IDLE); return task; } @@ -144,7 +137,6 @@ CCPU *CPUStructInit(I64 num,CCPU *c) c->addr=c; c->num=num; c->idle_factor=0.01; - MPCmdCtrlInit(&c->cmd_ctrl); if (num) c->idle_task=TaskIdleInit; else @@ -158,7 +150,7 @@ U0 MPInt(U8 num,I64 cpu_num=1) if (!Bt(&sys_run_level,RLf_MP)) return; else - throw(EXCEPT_MULTICORE,0); + throw(EXCEPT_MULTICORE,1); } PushFD; Cli; //multitasking safe because each core has a local apic and IRQ's are off @@ -191,22 +183,22 @@ U0 MPHalt() BusyWait(10000); } -U0 MPWake(I64 target_cpu_mask) +U0 MPWake(I64 target_cpu) { - I64 i; - target_cpu_mask&=1<num); - PushFD; - Cli; - for (i=Bsf(target_cpu_mask);target_cpu_mask;i++) - if (Btr(&target_cpu_mask,i)) { - if (Bt(&cpu_structs[i].cpu_flags,CPUf_SETH_SLEEP)) - cpu_structs[i].seth_task->wake_jiffy=0; - MPInt(I_WAKE,i); - if (Bt(&cpu_structs[i].cpu_flags,CPUf_SETH_SLEEP)) //In case went back to sleep - cpu_structs[i].seth_task->wake_jiffy=0; - } - PopFD; + if (0<=target_cpuwake_jiffy=0; + if (!target_cpu) + LBtr(&adam_task->task_flags,TASKf_AWAITING_MSG); + MPInt(I_WAKE,target_cpu); + if (!target_cpu) + LBtr(&adam_task->task_flags,TASKf_AWAITING_MSG); + if (Bt(&cpu_structs[target_cpu].cpu_flags,CPUf_SETH_SLEEP)) //In case went back to sleep + cpu_structs[target_cpu].seth_task->wake_jiffy=0; + PopFD; + } } U0 MPAPICInit() @@ -231,148 +223,88 @@ U0 MPAPICInit() } } -#assert !offset(CMPCmdCtrl.next_waiting) - -Bool MPCmdCtrlDo(CMPCmdCtrl *ctrl) -{ //Called while locked - CMPCmd *tempm=ctrl->next_waiting; - while (tempm!=ctrl && !Bt(&tempm->target_cpu_mask,Gs->num)) - tempm=tempm->next; - if (tempm!=ctrl) { - QueRem(tempm); - LBts(&tempm->flags,MPCf_DISPATCHED); - tempm->handler_cpu=Gs->num; - LBtr(&ctrl->flags,MPCCf_LOCKED); - switch (tempm->cmd_code) { - case MPCT_CALL: - tempm->result=(*tempm->add)(tempm->data); - Preempt(OFF); - Sti; - break; - case MPCT_SPAWN_TASK: - if (tempm->desc) - tempm->task=Spawn(tempm->add,tempm->data,tempm->desc); - else - tempm->task=Spawn(tempm->add,tempm->data,"MP Job"); - break; - } - if (Bt(&tempm->flags,MPCf_FREE_ON_COMPLETE)) { - Free(tempm->desc); - Free(tempm); - } else { - while (LBts(&ctrl->flags,MPCCf_LOCKED)) - Yield; - QueIns(tempm,ctrl->last_done); - LBts(&tempm->flags,MPCf_DONE); - LBtr(&ctrl->flags,MPCCf_LOCKED); - } - return TRUE; - } else { - LBtr(&ctrl->flags,MPCCf_LOCKED); - return FALSE; - } -} +#assert !offset(CSrvCtrl.next_waiting) U0 MPSethServerTask() { - CMPCmdCtrl *my_ctrl=&Gs->cmd_ctrl; + CSrvCtrl *my_ctrl=&Fs->srv_ctrl; + CSrvCmd *tempc,*tempc1=&my_ctrl->next_waiting; Sti; while (TRUE) { TaskFinishOffDying; - if (!LBts(&my_ctrl->flags,MPCCf_LOCKED) && - !MPCmdCtrlDo(my_ctrl) && //Jobs for this core are highest priority. - !LBts(&mp_ctrl->flags,MPCCf_LOCKED)) - MPCmdCtrlDo(mp_ctrl); - if (my_ctrl->next_waiting==my_ctrl && - mp_ctrl->next_waiting==mp_ctrl) { - LBts(&Gs->cpu_flags,CPUf_SETH_SLEEP); - Sleep(20); //We don't want this too long because of need for $LK,"TaskFinishOffDying","MN:TaskFinishOffDying"$(). - LBtr(&Gs->cpu_flags,CPUf_SETH_SLEEP); + if (!LBts(&my_ctrl->flags,SVCRf_LOCKED)) { + tempc=tempc1->next; + //Jobs for this core are highest priority. + if (tempc==tempc1 || !SrvCmdRun(tempc,GetFlags)) { + LBtr(&my_ctrl->flags,SVCRf_LOCKED) ; + if (my_ctrl->next_waiting==my_ctrl) { + LBts(&Gs->cpu_flags,CPUf_SETH_SLEEP); + Sleep(20); //We don't want this too long because of need for $LK,"TaskFinishOffDying","MN:TaskFinishOffDying"$(). + LBtr(&Gs->cpu_flags,CPUf_SETH_SLEEP); + } + } } } } -CMPCmd *MPQueJob(I64 (*fp_add)(U8 *data),U8 *data=NULL, - U8 *desc=NULL, - I64 flags=1<desc=AStrNew(desc); - if (spawn) - tempm->cmd_code=MPCT_SPAWN_TASK; - else - tempm->cmd_code=MPCT_CALL; - tempm->add=fp_add; - tempm->data=data; - tempm->target_cpu_mask=target_cpu_mask; - tempm->flags=flags; - if (i==Bsr(target_cpu_mask)) - tempm->ctrl=ctrl=&cpu_structs[i].cmd_ctrl; - else - tempm->ctrl=ctrl=mp_ctrl; + CSrvCtrl *ctrl; + CSrvCmd *tempc; + if (!(0<=target_cpuaux_str=AStrNew(aux_str); + tempc->cmd_code=cmd_code; + tempc->add=fp_add; + tempc->fun_arg=data; + tempc->target_cpu=target_cpu; + tempc->flags=flags; + tempc->aux1=aux1; + tempc->aux2=aux2; + tempc->ctrl=ctrl=&cpu_structs[target_cpu].seth_task->srv_ctrl; PushFD; Cli; - while (LBts(&ctrl->flags,MPCCf_LOCKED)) + while (LBts(&ctrl->flags,SVCRf_LOCKED)) Yield; - QueIns(tempm,ctrl->last_waiting); - LBtr(&ctrl->flags,MPCCf_LOCKED); + QueIns(tempc,ctrl->last_waiting); + LBtr(&ctrl->flags,SVCRf_LOCKED); PopFD; - MPWake(target_cpu_mask); - return tempm; + MPWake(target_cpu); + return tempc; } -CMPCmd *MPJob(I64 (*fp_add)(U8 *data),U8 *data=NULL, - I64 target_cpu=1,I64 flags=1<ctrl; - if (mp_cnt<2) throw(EXCEPT_MULTICORE,2); - while (!Bt(&tempm->flags,MPCf_DONE)) - Yield; - PushFD; - Cli; - while (LBts(&ctrl->flags,MPCCf_LOCKED)) - Yield; - QueRem(tempm); - LBtr(&ctrl->flags,MPCCf_LOCKED); - PopFD; - result=tempm->result; - Free(tempm->desc); - Free(tempm); - return result; -} - -CTask *MPSpawn(U0 (*fp_add)(U8 *data),U8 *data=NULL,U8 *name=NULL,I64 target_cpu=1) +CTask *SpawnQue(U0 (*fp_add)(U8 *data),U8 *data=NULL, + U8 *task_name=NULL, + I64 target_cpu, + CTask *parent=NULL, //NULL means adam + I64 stk_size=0,I64 flags=1<flags,MPCf_DONE)) + CSrvCmd *tempc=JobQue(fp_add,data,target_cpu,flags,SVCT_SPAWN_TASK,task_name,parent,stk_size); + CSrvCtrl *ctrl; + + while (!Bt(&tempc->flags,SVCf_DONE)) { + LBts(&Fs->task_flags,TASKf_IDLE); Yield; - result=tempm->task; - ctrl=tempm->ctrl; + } + LBtr(&Fs->task_flags,TASKf_IDLE); + + result=tempc->spawned_task; + ctrl=tempc->ctrl; PushFD; Cli; - while (LBts(&ctrl->flags,MPCCf_LOCKED)) + while (LBts(&ctrl->flags,SVCRf_LOCKED)) Yield; - QueRem(tempm); - LBtr(&ctrl->flags,MPCCf_LOCKED); + QueRem(tempc); + LBtr(&ctrl->flags,SVCRf_LOCKED); PopFD; - Free(tempm->desc); - Free(tempm); + SrvCmdDel(tempc); return result; } @@ -385,18 +317,6 @@ U0 MPCPUTaskInit() TaskContextRestore; } -U0 MPCmdQueDel(CMPCmd *root) -{ - CMPCmd *tempm=root->next,*tempm1; - while (tempm!=root) { - tempm1=tempm->next; - QueRem(tempm); - Free(tempm->desc); - Free(tempm); - tempm=tempm1; - } -} - U0 MPStart() { //Called by adam during start-up //and can be called again to rst multicores. @@ -420,11 +340,9 @@ U0 MPStart() MPHalt; //sets mp_cnt to 1 for (i=1;icmd_ctrl.next_waiting); - MPCmdQueDel(&c->cmd_ctrl.next_done); + SrvCmdQueDel(&c->seth_task->srv_ctrl.next_waiting); + SrvCmdQueDel(&c->seth_task->srv_ctrl.next_done); } - MPCmdQueDel(&mp_ctrl->next_waiting); - MPCmdQueDel(&mp_ctrl->next_done); } MemSet(&cpu_structs[1],0,sizeof(CCPU)*(MP_MAX_PROCESSORS-1)); @@ -457,10 +375,8 @@ U0 MPStart() for (i=1;irflags=SYS_START_RFLAGS; //$LK,"CTask","MN:CTask"$ allocated off this core's seth_task's heap (Which is Adam) task->task_in_que_signature=TASK_IN_QUE_SIGNATURE_VAL; @@ -490,9 +406,6 @@ U0 MPInit() mp_cnt_initial=mp_cnt=1; mp_cnt_lock=0; - mp_ctrl=AMAlloc(sizeof(CMPCmdCtrl)); - MPCmdCtrlInit(mp_ctrl); - mp_crash=ACAlloc(sizeof(CMPCrash)); //Must be in code heap because init code uses 32 bit addr of cpu_struct diff --git a/TempleOS/Kernel/PSect.CPP b/TempleOS/Kernel/PSect.CPP index f4b4307..4d7e307 100644 --- a/TempleOS/Kernel/PSect.CPP +++ b/TempleOS/Kernel/PSect.CPP @@ -11,35 +11,40 @@ CHash *PSectFind(U8 *add,I64 *_offset) { //See $LK,"::/TempleOS/Kernel/Hash1a.CPP","FL:::/TempleOS/Kernel/Hash1a.CPP,1"$ CHash *result=NULL; CHashExport *tempess; - CHashTable *h=Fs->hash_table; Bool has_lower=FALSE; - U64 best=0x8000,j; - if (!ChkPtr(add)) { + CHashTable *h=Fs->hash_table; + U64 best=0xFFFF,j; + if (!ChkCodePtr(add)) { *_offset=best; return NULL; } while (h) { tempess=h->next_added; while (tempess!=h) { - if (tempess->type&HTT_FUN) - j=tempess(CHashFun *)->executable_addr; - else if (tempess->type&HTT_EXPORT_SYS_SYM) + j=0; + if (tempess->type&HTT_FUN) { + if (!Bt(&tempess(CHashFun *)->flags,Cf_EXTERN) && + !Bt(&tempess(CHashFun *)->flags,Ff_INTERNAL)) + j=tempess(CHashFun *)->executable_addr; + } else if (tempess->type&HTT_EXPORT_SYS_SYM) j=tempess->val; - else - j=0; - j=add(I64)-j; - if (tempess->type&HTT_EXPORT_SYS_SYM) { - if (jstr); - best=j; - result=tempess; - } - } else if (tempess->type&HTT_FUN) { - if (jtype&HTT_EXPORT_SYS_SYM||!has_lower)) { - has_lower=HasLower(tempess->str); - best=j; - result=tempess; + if (j) { + j=add(I64)-j; + if (0<=j<=best) { + if (tempess->type&HTT_EXPORT_SYS_SYM) { + if (jstr); + best=j; + result=tempess; + } + } else if (tempess->type&HTT_FUN) { + if (jtype&HTT_EXPORT_SYS_SYM||!has_lower)) { + has_lower=HasLower(tempess->str); + best=j; + result=tempess; + } + } } } tempess=tempess->next_added; @@ -114,20 +119,19 @@ U0 SPrintFPSect(U8 *buf,I64 add,I64 field_len) } } if (str) { - if (offset<=0xFFFF) { - if (is_fun) { - str2=MSPrintF("&%s",str); - if (field_len>7) - SPrintF(buf,"%*ts+0x%04X",field_len-7,str2,offset); - else - SPrintF(buf,"%s+0x%04X",str2,offset); - Free(str2); - } else { - if (field_len>7) - SPrintF(buf,"%*ts+0x%04X",field_len-7,str,offset); - else - SPrintF(buf,"%s+0x%04X",str,offset); - } + if (offset>0xFFFF) offset=0xFFFF; + if (is_fun) { + str2=MSPrintF("&%s",str); + if (field_len>7) + SPrintF(buf,"%*ts+0x%04X",field_len-7,str2,offset); + else + SPrintF(buf,"%s+0x%04X",str2,offset); + Free(str2); + } else { + if (field_len>7) + SPrintF(buf,"%*ts+0x%04X",field_len-7,str,offset); + else + SPrintF(buf,"%s+0x%04X",str,offset); } return; } @@ -142,40 +146,55 @@ U0 SPrintFPSect(U8 *buf,I64 add,I64 field_len) I64 SrcLineNum(U8 *add,I64 cnt=1) { CHashSrcSym *temph; - I64 i,ii,j,offset,best=-1,d,best_d; + I64 cur_line,first_line,last_line,num_lines,offset; CDbgInfo *dbg; U8 **body,*src,*src2; if (temph=PSectFind(add,&offset)) { if (temph->type&(HTT_FUN|HTT_EXPORT_SYS_SYM)) { if (dbg=temph->debug) { - j=dbg->max_line-dbg->min_line+1; + num_lines=dbg->max_line-dbg->min_line+1; body=dbg->body; - best_d=MAX_I64; - for (i=0;imin_line; - } - } - } + + //find first nonzero + first_line=0; + while (!body[first_line]) { + first_line++; + if (first_line>=num_lines) + return -1; } - } else if (temph->src_link && !offset) { + + //find last nonzero + last_line=num_lines-1; + while (!body[last_line] && last_line>first_line) + last_line--; + + //interpolate to guess line num + cur_line=LimitI64(ToF64(add-body[first_line])*(last_line-first_line+1)/ + (body[last_line]-body[first_line]+1),first_line,last_line); + + //retreat while too high + while ((!body[cur_line] || body[cur_line]>=add) && cur_line>first_line) + cur_line--; + + //advance while to low + while ((!body[cur_line] || body[cur_line]min_line; + + } else if (temph->src_link) { src =StrNew(temph->src_link); src2=StrNew(temph->src_link); StrLastRem(src,",",src2); - best=A2I(src2); + cur_line=A2I(src2); Free(src); Free(src2); + return cur_line; } } } - return best; + return -1; } U8 *SrcFileName(U8 *add,I64 cnt=1,CTask *mem_task=NULL) diff --git a/TempleOS/Kernel/QSort.CPP b/TempleOS/Kernel/QSort.CPP index 132af7c..26bf809 100644 --- a/TempleOS/Kernel/QSort.CPP +++ b/TempleOS/Kernel/QSort.CPP @@ -5,8 +5,7 @@ For assending strings: Compare can return StrCmp(e1,e2); For assending ints : Compare can return e1-e2; Don't use e1-e2 if numbers can overflow, return -1,0 or 1 with if's. -Maybe, look at $LK-A,"::/TempleOS/Demo/MultiCore/Sort.CPP"$ or -$LK-A,"::/TempleOS/Demo/MultiCore/RadixSort.CPP"$. +Maybe, look at $LK-A,"::/TempleOS/Demo/MultiCore/RadixSort.CPP"$. */ I64 i,*less,*greater,pivot; if (num>1) { @@ -150,8 +149,7 @@ For assending strings: Compare can return StrCmp(*e1,*e2); For assending ints : Compare can return *e1-*e2; Don't use e1-e2 if numbers can overflow, return -1,0 or 1 with if's. -Maybe, look at $LK-A,"::/TempleOS/Demo/MultiCore/Sort.CPP"$ or -$LK-A,"::/TempleOS/Demo/MultiCore/RadixSort.CPP"$. +Maybe, look at $LK-A,"::/TempleOS/Demo/MultiCore/RadixSort.CPP"$. */ I64 i; U8 *less,*greater,*temp,*pivot; diff --git a/TempleOS/Kernel/Scheduler.CPP b/TempleOS/Kernel/Scheduler.CPP index c34b155..8ffb591 100644 --- a/TempleOS/Kernel/Scheduler.CPP +++ b/TempleOS/Kernel/Scheduler.CPP @@ -184,7 +184,7 @@ SYS_YIELD:: PUSH RAX MOV RAX,SYS_SEMAS BT U32 SYS_SEMA_SINGLE_USER*SEMA_STRUCT_SIZE[RAX],0 - JC @@05 + JC @@05 //If single user, don't change task. POP RAX CLI @@ -192,12 +192,12 @@ SYS_YIELD:: XOR RSI,RSI MOV RSI,FS:CTask.addr[RSI] CMP U64 CTask.next_task[RSI],RSI - JNE @@15 + JNE @@15 //Jmp if not just one task on core. PUSH RAX MOV RAX,U64 [SYS_JIFFIES] CMP U64 CTask.wake_jiffy[RSI],RAX - JA @@10 + JA @@10 //If needs to sleep, jmp and swap-out. POP RAX POP RSI @@ -233,7 +233,7 @@ RESTORE_RSI_TASK_NO_KEY_CHECK: MOV RAX,U64 [SYS_JIFFIES] CMP U64 CTask.wake_jiffy[RSI],RAX - JA @@25 + JA @@25 //Jmp if not ready, yet. CMP U32 CTask.task_in_que_signature[RSI],TASK_IN_QUE_SIGNATURE_VAL JNE SWAP_IN_SETH_TASK @@ -244,15 +244,15 @@ RESTORE_RSI_TASK_NO_KEY_CHECK: @@25: MOV RSI,U64 CTask.next_task[RSI] XOR RAX,RAX CMP U64 GS:CCPU.seth_task[RAX],RSI - JNE @@20 + JNE @@20 //Jmp if not Seth LOCK BTR U32 GS:CCPU.cpu_flags[RAX],CPUf_HAD_IRQ_OPPORTUNITY - JC @@20 + JC @@20 //Jmp if had chance for IRQ already MOV RAX,U64 GS:CCPU.idle_task[RAX] MOV RSP,U64 CTask.stk[RAX] ADD RSP,DFT_STK+CTaskStk.stk_base //Rst to top CALL SET_FS_BASE - STI + STI //Swap-in idle task so we can unmask IRQs. HLT SYS_IDLE_PT:: CLI diff --git a/TempleOS/Kernel/SrvCmd.CPP b/TempleOS/Kernel/SrvCmd.CPP new file mode 100644 index 0000000..976a1bc --- /dev/null +++ b/TempleOS/Kernel/SrvCmd.CPP @@ -0,0 +1,522 @@ +U0 SrvCmdDel(CSrvCmd *tempc) +{ + Free(tempc->aux_str); + Free(tempc); +} + +U0 SrvCmdQueDel(CSrvCmd *root) +{ + CSrvCmd *tempc=root->next,*tempc1; + while (tempc!=root) { + tempc1=tempc->next; + QueRem(tempc); + SrvCmdDel(tempc); + tempc=tempc1; + } +} + +U0 SrvCtrlInit(CSrvCtrl *ctrl) +{ + QueInit(&ctrl->next_waiting); + QueInit(&ctrl->next_done); + ctrl->flags=0; +} + +U0 TaskRstAwaitingMsg(CTask *task=NULL) +{ //Pop-ups get parent messages so wake-up our pop-ups if we got a msg. + Bool old_preempt=Preempt(OFF); + if (!task) task=Fs; + if (TaskValidate(task)) { + LBtr(&task->task_flags,TASKf_AWAITING_MSG); + while (task=task->popup_task) + if (TaskValidate(task)) + LBtr(&task->task_flags,TASKf_AWAITING_MSG); + else + break; + } + Preempt(old_preempt); +} + +CSrvCmd *TaskExeStrQue(CTask *srv,CTask *master, + U8 *data,I64 flags) +{ + CSrvCmd *result; + if (!data || !TaskValidate(srv) || + master && !TaskValidate(master) || + srv->popup_task && !Bt(&srv->task_flags,TASKf_FILTER_INPUT)) + return NULL; + result=ACAlloc(sizeof(CSrvCmd)); + result->master_task=master; + result->cmd_code=SVCT_EXE_STR; + result->flags=flags; + result->aux_str=AStrNew(data); + result->ctrl=&srv->srv_ctrl; + + PushFD; + Cli; + while (LBts(&srv->srv_ctrl.flags,SVCRf_LOCKED)) + Pause; + if (!TaskValidate(srv)) { + PopFD; + SrvCmdDel(result); + return NULL; + } else { + LBtr(&srv->task_flags,TASKf_IDLE); + TaskRstAwaitingMsg(srv); + QueIns(result,srv->srv_ctrl.last_waiting); + LBtr(&srv->srv_ctrl.flags,SVCRf_LOCKED); + if (Bt(&flags,SVCf_WAKE_MASTER)) { + Suspend(master); + Yield; + } + } + PopFD; + return result; +} + +CSrvCmd *TaskTextInputQue(CTask *srv,CTask *master, + U8 *data,I64 flags) +{ + CSrvCmd *result; + Bool old_preempt=Preempt(OFF); + CTask *task; + if (!data || !TaskValidate(srv) || + master && !TaskValidate(master) || + srv->popup_task && !Bt(&srv->task_flags,TASKf_FILTER_INPUT)) { + Preempt(old_preempt); + return NULL; + } + result=ACAlloc(sizeof(CSrvCmd)); + result->master_task=master; //in case somebody cares + result->cmd_code=SVCT_TEXT_INPUT; + result->flags=flags; + result->aux_str=AStrNew(data); + + PushFD; + if (Bt(&flags,SVCf_HIGHEST_PRIORITY) || + srv->next_input_filter_task==srv) { + task=Spawn(&InputFilterTask,NULL,"Input Filter",,srv); + Cli; + task->next_input_filter_task=srv->next_input_filter_task; + task->last_input_filter_task=srv; + srv->next_input_filter_task=task; + task->next_input_filter_task->last_input_filter_task=task; + } else + task=srv->next_input_filter_task; + result->ctrl=&task->srv_ctrl; + Cli; + while (LBts(&task->srv_ctrl.flags,SVCRf_LOCKED)) + Pause; + if (!TaskValidate(task)) { + SrvCmdDel(result); + result=NULL; + } else { + LBtr(&task->task_flags,TASKf_IDLE); + TaskRstAwaitingMsg(task); + QueIns(result,task->srv_ctrl.last_waiting); + LBtr(&task->srv_ctrl.flags,SVCRf_LOCKED); + } + PopFD; + Preempt(old_preempt); + return result; +} + +CSrvCmd *TaskMsgQue(CTask *_srv,CTask *master, + I64 msg_code,I64 p1,I64 p2,I64 flags) +{ + CSrvCmd *tempc1,*tempc; + CTask *srv=_srv; + if (!TaskValidate(srv) || + master && !TaskValidate(master)|| + srv->popup_task && !Bt(&srv->task_flags,TASKf_FILTER_INPUT)) + return NULL; + tempc=ACAlloc(sizeof(CSrvCmd)); + tempc->master_task=master; + tempc->cmd_code=SVCT_MSG; + tempc->msg_code=AbsI64(msg_code); //negative means do a down and up + tempc->aux1=p1; + tempc->aux2=p2; + tempc->flags=flags; + PushFD; + if (Bt(&sys_semas[SYS_SEMA_RECORD_MACRO],0) && + srv!=sys_macro_util_task && + msg_code==MSG_KEY_DOWN) { + tempc1=AMAllocIdentical(tempc); + Cli; + QueIns(tempc1,sys_macro_root.last); + } + Cli; + while (Bt(&srv->task_flags,TASKf_FILTER_INPUT) && + !Bt(&flags,SVCf_DONT_FILTER)) + srv=srv->next_input_filter_task; + tempc->ctrl=&srv->srv_ctrl; + while (LBts(&srv->srv_ctrl.flags,SVCRf_LOCKED)) + Pause; + if (!TaskValidate(srv)) { + SrvCmdDel(tempc); + tempc=NULL; + } else { + LBtr(&srv->task_flags,TASKf_IDLE); + TaskRstAwaitingMsg(srv); + QueIns(tempc,srv->srv_ctrl.last_waiting); + LBtr(&srv->srv_ctrl.flags,SVCRf_LOCKED); + } + PopFD; + if (msg_code<0) //Down-Up + TaskMsgQue(_srv,master,-msg_code+1,p1,p2,flags); + return tempc; +} + +Bool ScanResult(CSrvCmd *rqst=NULL,I64 *_result=NULL) +{ + CSrvCtrl *ctrl; + CSrvCmd *tempc,*tempc1; + if (!rqst || Bt(&rqst->flags,SVCf_DONE)) { + if (!rqst || rqst->master_task) + ctrl=&Fs->srv_ctrl; + else + ctrl=rqst->ctrl; + PushFD; + Cli; + while (LBts(&ctrl->flags,SVCRf_LOCKED)) + Pause; + tempc1=&ctrl->next_done; + tempc=tempc1->next; + while (tempc!=tempc1) { + if (!rqst || rqst==tempc) { + QueRem(tempc); + LBtr(&ctrl->flags,SVCRf_LOCKED); + PopFD; + if (_result) + *_result=tempc->result; + SrvCmdDel(tempc); + return TRUE; + } + tempc=tempc->next; + } + LBtr(&ctrl->flags,SVCRf_LOCKED); + PopFD; + } + if (_result) + *_result=0; + return FALSE; +} + +I64 GetResult(CSrvCmd *rqst=NULL) +{ + I64 result; + CSrvCmd *tempc1; + if (!rqst) { + tempc1=&Fs->srv_ctrl.next_done; + while (tempc1==tempc1->next) { + LBts(&Fs->task_flags,TASKf_IDLE); + Yield; + } + } else { + while (!Bt(&rqst->flags,SVCf_DONE)) { + LBts(&Fs->task_flags,TASKf_IDLE); + Yield; + } + } + LBtr(&Fs->task_flags,TASKf_IDLE); +//Could get taken by someone else. + ScanResult(rqst,&result); + return result; +} + +U0 TaskWait(CTask *task=NULL) +{ + CTask *task1; + CSrvCmd *tempc1; + if (!task) task=Fs; + if (TaskValidate(task)) { + PushFD; + Cli; + while (TRUE) { + task1=task->last_input_filter_task; + tempc1=&task1->srv_ctrl.next_waiting; + if (TaskValidate(task1) && tempc1==tempc1->next && + (task1==Fs || Bt(&task1->task_flags,TASKf_IDLE))) + break; + Yield; + } + PopFD; + } +} + +U0 PostMsg(CTask *task,I64 msg_code,I64 p1,I64 p2,I64 flags=0) +{ + if (TaskValidate(task)) { + if (Bt(&task->task_flags,TASKf_INPUT_FILTER_TASK)) + TaskMsgQue(task->last_input_filter_task,NULL,msg_code,p1,p2, + flags|1<ctrl; + CTask *master; + Bool old_preempt=IsPreempt; + I64 result,flags=tempc->flags; + if (Bt(&flags,SVCf_EXIT_ON_COMPLETE)) + result=SCR_EXIT; + else + result=SCR_CONT; + switch (tempc->cmd_code) { + case SVCT_SPAWN_TASK: + QueRem(tempc); + LBts(&tempc->flags,SVCf_DISPATCHED); + tempc->servant_cpu_num=Gs->num; + LBtr(&ctrl->flags,SVCRf_LOCKED); + if (tempc->aux_str) + tempc->spawned_task=Spawn(tempc->add,tempc->fun_arg,tempc->aux_str,,tempc->aux1,tempc->aux2,tempc->flags); + else + tempc->spawned_task=Spawn(tempc->add,tempc->fun_arg,"Unnamed",,tempc->aux1,tempc->aux2,tempc->flags); + break; + case SVCT_CALL: + QueRem(tempc); + LBts(&tempc->flags,SVCf_DISPATCHED); + tempc->servant_cpu_num=Gs->num; + LBtr(&ctrl->flags,SVCRf_LOCKED); + SetFlags(old_flags); + LBtr(&Fs->task_flags,TASKf_IDLE); + try + tempc->result=(*tempc->add)(tempc->fun_arg); + catch + Fs->catch_except=TRUE; + SetFlags(old_flags); + break; + case SVCT_EXE_STR: + QueRem(tempc); + LBts(&tempc->flags,SVCf_DISPATCHED); + tempc->servant_cpu_num=Gs->num; + LBtr(&ctrl->flags,SVCRf_LOCKED); + SetFlags(old_flags); + LBtr(&Fs->task_flags,TASKf_IDLE); + try + tempc->result=ExePutS(tempc->aux_str); + catch + Fs->catch_except=TRUE; + SetFlags(old_flags); + break; + default: + result=SCR_DONE; + } + if (result) { + if (master=tempc->master_task) { + if (!Bt(&flags,SVCf_FREE_ON_COMPLETE)) { + Cli; + while (LBts(&master->srv_ctrl.flags,SVCRf_LOCKED)) + Pause; + QueIns(tempc,master->srv_ctrl.last_done); + LBts(&tempc->flags,SVCf_DONE); + LBtr(&master->srv_ctrl.flags,SVCRf_LOCKED); + SetFlags(old_flags); + } + if (Bt(&flags,SVCf_FOCUS_MASTER) && + Bt(&master->task_flags,TASKf_USER)) + sys_focus_task=master; + if (Bt(&flags,SVCf_WAKE_MASTER)) + Suspend(master,FALSE); + } + if (Bt(&flags,SVCf_FREE_ON_COMPLETE)) + SrvCmdDel(tempc); + else if (!master) { + Cli; + while (LBts(&ctrl->flags,SVCRf_LOCKED)) + Yield; + QueIns(tempc,ctrl->last_done); + LBts(&tempc->flags,SVCf_DONE); + LBtr(&ctrl->flags,SVCRf_LOCKED); + SetFlags(old_flags); + } + } + Preempt(old_preempt); + return result; +} + +I64 SrvCmdsHandler(CTask *task=NULL) +{ + I64 cnt=0,old_flags=GetFlags; + CSrvCmd *tempc,*tempc1; + if (!task) task=Fs; + while (TRUE) { + Cli; + while (LBts(&task->srv_ctrl.flags,SVCRf_LOCKED)) + Pause; + tempc1=&task->srv_ctrl.next_waiting; + tempc=tempc1->next; + if (tempc==tempc1) + goto sch_done; + else + switch (SrvCmdRun(tempc,old_flags)) { + case SCR_CONT: + cnt++; + break; + case SCR_EXIT: + Exit; + case SCR_DONE: + goto sch_done; + } + } +sch_done: + LBtr(&task->srv_ctrl.flags,SVCRf_LOCKED); + SetFlags(old_flags); + return cnt; +} + +I64 Adam(U8 *fmt,...) +//Sends text to the adam task which gets +//compiled and run. +{ + I64 result; + U8 *st=SPrintFJoin(NULL,fmt,argc,argv); + Bool old_preempt=Preempt(OFF); + CSrvCmd *tempc; + if (Fs==adam_task) { + tempc=TaskExeStrQue(adam_task,Fs,st,0); + SrvCmdsHandler; + } else { + TaskWait(adam_task); + tempc=TaskExeStrQue(adam_task,Fs,st,1<task_flags,TASKf_INPUT_FILTER_TASK)) + ExePutS(st2); + else + TaskTextInputQue(Fs,0,st2,1<popup_task=task; + tempc=TaskExeStrQue(task,Fs,st,1<popup_task=NULL; + Kill(task,FALSE); + Free(st); + return result; +} + +U0 AutoStr(U8 *fmt,...) +//Sends text in the nature of an AutoFile to one's +//own input buffer. +{ + U8 *st=SPrintFJoin(NULL,fmt,argc,argv); + if (Bt(&Fs->task_flags,TASKf_INPUT_FILTER_TASK)) + ExePutS(st); + else + TaskTextInputQue(Fs,0,st,1<task_flags,TASKf_INPUT_FILTER_TASK)) + ExeFile(name2); + else + AutoStr("%F",name2); + Free(name2); +} + + +//This sends text of an AutoFile nature to a +//task's input buffer. +U0 XTalkStr(CTask *task,U8 *fmt,...) +{ + U8 *st=SPrintFJoin(NULL,fmt,argc,argv); + TaskTextInputQue(task,0,st,0); + Free(st); +} + +U0 XTalkStrWait(CTask *task,U8 *fmt,...) +{ + U8 *st=SPrintFJoin(NULL,fmt,argc,argv); + TaskTextInputQue(task,0,st,0); + Free(st); + TaskWait(task); +} diff --git a/TempleOS/Kernel/Str1a.CPP b/TempleOS/Kernel/Str1a.CPP index c6eeed5..ac4ad13 100644 --- a/TempleOS/Kernel/Str1a.CPP +++ b/TempleOS/Kernel/Str1a.CPP @@ -535,7 +535,7 @@ U0 GetOutOfDollar() if (sys_raw_dc_flags&RDCF_IN_DOLLAR) '$$'; } else { - if (fp_doc_cur && (doc=(*fp_doc_cur)(Fs)) && doc->flags&DOCF_IN_DOLLAR) + if (fp_doc_put && (doc=(*fp_doc_put)(Fs)) && doc->flags&DOCF_IN_DOLLAR) '$$'; } } @@ -589,12 +589,12 @@ Bool YorN() I64 ch; "(y or n)? "; while (TRUE) { - ch=ToUpper(GetChar(NULL,FALSE)); + ch=ToUpper(GetChar(,FALSE)); if (ch=='Y') { - "$$FU$$YES$$FG$$\n"; + "$$PT$$YES$$FG$$\n"; return TRUE; } else if (ch=='N') { - "$$FU$$NO$$FG$$\n"; + "$$PT$$NO$$FG$$\n"; return FALSE; } } @@ -604,19 +604,7 @@ Bool PressAKey() { I64 ch; PutDefine("ST_PRESS_A_KEY"); - ch=GetChar(NULL,FALSE); - if (ch==CH_SHIFT_ESC || ch==CH_ESC) - return FALSE; - else - return TRUE; -} - -Bool ExitAllApplications() -{ - I64 ch; - PutDefine("ST_EXIT_ALL_APPLICATIONS"); - PutDefine("ST_PRESS_A_KEY"); - ch=GetChar(NULL,FALSE); + ch=GetChar(,FALSE); if (ch==CH_SHIFT_ESC || ch==CH_ESC) return FALSE; else @@ -1019,7 +1007,7 @@ I64 A2I(U8 *st,I64 radix=10,U8 **_end_ptr=NULL) Bool neg=FALSE; U8 ch; I64 result=0,k=0; - if (radix<2||radix>36) return 0; + if (!(2<=radix<=36)) return 0; while (Bt(white_space_bitmap,*st)) st++; if (*st=='-') { @@ -1060,7 +1048,10 @@ ai_skip: k++; } if (_end_ptr) *_end_ptr=st-1; - return neg ? -result:result; + if (neg) + return -result; + else + return result; } U0 GetFFlags(U8 *f,U8 *lst,U8 *st) @@ -1187,7 +1178,7 @@ U8 *MSPrintFQ(U8 *ptr,Bool dollar_flag) SPrintFPutChar(_dst,'\\',_buf); SPrintFPutChar(_dst,'n',_buf); break; - case CH_CARRIAGE_RETURN: + case '\r': SPrintFPutChar(_dst,'\\',_buf); SPrintFPutChar(_dst,'r',_buf); break; @@ -1234,7 +1225,7 @@ U8 *MSPrintFq(U8 *ptr) ptr++; break; case 'r': - SPrintFPutChar(_dst,CH_CARRIAGE_RETURN,_buf); + SPrintFPutChar(_dst,'\r',_buf); ptr++; break; case '"': @@ -1335,7 +1326,7 @@ U8 *sprintf_neg_powers_lets= #define SLOP 8 U8 *SPrintFJoin(U8 *dst,U8 *src,I64 argc,I64 *argv) -{ //$LK,"printF codes","FA:::/TempleOS/Doc/Differences.TXT,PrintF_Codes"$ +{ //$LK,"printF codes","FA:::/TempleOS/Doc/HolyC.TXT,PrintF_Codes"$ /* In float formatting, do not exceed 18-digits before or after the decimal point @@ -2058,7 +2049,7 @@ U8 *SPrintF(U8 *dst,U8 *fmt,...) } /* -A2CDate() +A2Date() This routine recognizes the following formats: 1) "*+nnnn" "*-nnnn" 2) mm/dd @@ -2076,7 +2067,7 @@ the start of mon for seven days before today. */ -CDate A2CDate(U8 *_src) +CDate A2Date(U8 *_src) //ASCII date to CDate { CDate result=0; @@ -2106,7 +2097,7 @@ CDate A2CDate(U8 *_src) p1++; if (*p1=='+' || *p1=='-') result.date=A2I(p1,10,&p1); - result+=GetCurTimeCDate+local_time_offset; + result+=GetCurTimeDate+local_time_offset; } else { StrFirstRem(p1,"/",v); //Put mon into v ds.mon=A2I(v); @@ -2118,10 +2109,10 @@ CDate A2CDate(U8 *_src) ds.year+=2000; } else { ds.day_of_mon=A2I(p1,10,&p1); - CDate2CDateStruct(&ds1,GetCurTimeCDate+local_time_offset); + Date2DateStruct(&ds1,GetCurTimeDate+local_time_offset); ds.year=ds1.year; } - result=CDateStruct2CDate(&ds); + result=DateStruct2Date(&ds); } if (*p1==')') p1++; @@ -2220,7 +2211,10 @@ to avoid this. } a2f_end: if (_end_ptr) *_end_ptr=src-1; - return neg ? -d:d; + if (neg) + return -d; + else + return d; } U8 *GetFJoin(U8 *src,U8 *fmt,I64i argc,I64i *argv) @@ -2340,7 +2334,7 @@ U8 *GetFJoin(U8 *src,U8 *fmt,I64i argc,I64i *argv) if (cur_arg>=argc) throw(EXCEPT_GETF,1); i_ptr=argv[cur_arg++]; - *i_ptr=A2CDate(buf); + *i_ptr=A2Date(buf); break; } Free(buf); @@ -2361,7 +2355,7 @@ U8 *GetF(U8 *src,U8 *fmt,...) U0 PrintF(U8 *fmt,...) -{//$LK,"PrintF Extended Codes","FA:::/TempleOS/Doc/Differences.TXT,PrintF_Codes"$ +{//$LK,"PrintF Extended Codes","FA:::/TempleOS/Doc/HolyC.TXT,PrintF_Codes"$ //See $LK,"SPrintFJoin","MN:SPrintFJoin"$() U8 *buf=SPrintFJoin(NULL,fmt,argc,argv); "" buf; diff --git a/TempleOS/Kernel/Task1a.CPP b/TempleOS/Kernel/Task1a.CPP index 8d9cd9a..aaab46f 100644 --- a/TempleOS/Kernel/Task1a.CPP +++ b/TempleOS/Kernel/Task1a.CPP @@ -181,12 +181,7 @@ I64 TaskInit(CTask *task,I64 stk_size) task->last_child_task= (&task->next_child_task)(U8 *)-offset(CTask.next_sibling_task); - task->next_doc= - task->last_doc= - (&task->next_doc)(U8 *)-offset(CDoc.next_doc); - - QueInit(&task->next_servant_cmd); - QueInit(&task->next_master_cmd); + SrvCtrlInit(&task->srv_ctrl); QueInit(&task->next_lex); QueInit(&task->next_except); QueInit(&task->next_ctrl); @@ -215,8 +210,10 @@ I64 TaskInit(CTask *task,I64 stk_size) task->rsp=(&temps->stk_base)(U8 *)+temps->stk_size; task->answers_displayed=1; //from 0-8 - task->text_attr =WHITE<<4+BLUE; - task->border_attr=WHITE<<4+LTBLUE; + task->text_attr =TERM_ATTR_TEXT; + task->border_attr=TERM_ATTR_BORDER; + task->border_src =BDS_CONST; + task->title_src =TTS_CONST; task->win_left =1; task->win_right =text_cols-2; task->win_top =1; @@ -227,13 +224,17 @@ I64 TaskInit(CTask *task,I64 stk_size) CTask *Spawn(U0 (*fp_start_add)(U8 *data),U8 *data=NULL, U8 *task_name=NULL, + I64 target_cpu=-1, //-1 means current CPU CTask *parent=NULL, //NULL means adam I64 stk_size=0, //0=default - I64 flags=SPAWNF_ADD_TO_QUE) + I64 flags=1<code_heap); + CTask *task; + if (target_cpu>=0) + return SpawnQue(fp_start_add,data,task_name,target_cpu,parent,stk_size,flags); + task=CAlloc(sizeof(CTask),adam_task->code_heap); task->task_signature=TASK_SIGNATURE_VAL; if (!task_name) task_name="Unnamed Task"; if (!parent) parent=Gs->seth_task; @@ -252,11 +253,12 @@ CTask *Spawn(U0 (*fp_start_add)(U8 *data),U8 *data=NULL, task->rsp(U8 *)-=8; *task->rsp=&Exit; task->hash_table->next=parent->hash_table; - MemCpy(task->task_title,task_name,TASK_TITLE_LEN+1); MemCpy(task->task_name,task_name,TASK_NAME_LEN+1); + StrCpy(task->task_title,task->task_name); + task->title_src=TTS_TASK_NAME; PushFD; Cli; - if (flags&SPAWNF_ADD_TO_QUE) { + if (Bt(&flags,SVCf_ADD_TO_QUE)) { TaskQueInsChild(task); TaskQueIns(task); } @@ -264,13 +266,12 @@ CTask *Spawn(U0 (*fp_start_add)(U8 *data),U8 *data=NULL, return task; } -U0 ServantTaskCont() +U0 SrvTaskCont() { FlushMsgs; while (TRUE) { - if (ServantCmdsHandler) - if (!Bt(&Fs->task_flags,TASKf_LOCK_TITLE)) - MemCpy(Fs->task_title,Fs->task_name,TASK_NAME_LEN+1); + if (SrvCmdsHandler && Fs->title_src==TTS_TASK_NAME) + MemCpy(Fs->task_title,Fs->task_name,TASK_NAME_LEN+1); FlushMsgs; LBts(&Fs->task_flags,TASKf_IDLE); LBts(&Fs->task_flags,TASKf_AWAITING_MSG); @@ -300,8 +301,6 @@ U0 TaskInitExt(Bool from_dbg=FALSE) return; if (!from_dbg) { LBts(&Fs->display_flags,DISPLAYf_HAS_CLOSE_WIN); - Fs->text_attr =WHITE<<4+BLUE; - Fs->border_attr=WHITE<<4+LTBLUE; Fs->win_top =13; Fs->win_bottom=text_rows-2; TaskDerivedValsUpdate; @@ -312,21 +311,23 @@ U0 TaskInitExt(Bool from_dbg=FALSE) I64 ExeCmdLine(CLex *lx) { - I64 result=0,i,type; - U8 *ptr,*ptr2,*ptr3,*code; + I64 result=0,i,type,old_title_src=Fs->title_src; + U8 *ptr,*ptr2,*ptr3,*code,*old_task_title=StrNew(Fs->task_title); F64 t0; CDocEntry *doc_e; CDoc *doc; + if (Fs->title_src!=TTS_LOCKED_CONST) + Fs->title_src=TTS_CUR_LEX; while (lx->token && (lx->token!='}' || !(lx->flags & LF_EXE_BLK)) ) { - if (!Bt(&Fs->task_flags,TASKf_LOCK_TITLE)) { + if (Fs->title_src==TTS_CUR_LEX) { ptr2=&Fs->task_title; ptr3=ptr2+TASK_TITLE_LEN; if (lx->cur_lfn->flags & LFSF_IS_DOC) { - doc_e=lx->cur_lfn->line_start; + doc_e=lx->cur_lfn->cur_entry; doc=lx->cur_lfn->doc; while (doc_e!=doc && ptr2type_u8 && ptr2type_u8) { case DOCT_TEXT: ptr=doc_e->tag; while (*ptr && ptr2next; } + if (ptr2cur_lfn->line_start) + if ((ptr=lx->cur_lfn->line_start) && *ptr) MemCpy(ptr2,ptr,TASK_TITLE_LEN); } lx->flags&=~LF_HAS_MISC_DATA; @@ -362,6 +364,11 @@ I64 ExeCmdLine(CLex *lx) Free(code); } } + if (Fs->title_src!=TTS_LOCKED_CONST) { + Fs->title_src=old_title_src; + StrCpy(Fs->task_title,old_task_title); + } + Free(old_task_title); if (lx->flags&LF_JUST_LOAD) { if (lx->error_cnt) return FALSE; @@ -386,9 +393,7 @@ U0 UserTaskCont() QueRem(lx); LexDel(lx); } catch { - doc=Fs->last_doc; - if (doc!=(&Fs->next_doc)(U8 *)-offset(CDoc.next_doc) && - doc->doc_in_que_signature==DOC_IN_QUE_SIGNATURE_VAL) + if ((doc=Fs->put_doc) && doc->doc_signature==DOC_SIGNATURE_VAL) DocUnlock(doc); CatchAll; } @@ -408,14 +413,14 @@ U0 UserCmdLine(I64 dummy=0) UserTaskCont; } -U0 ServantUserCmdLine(I64 dummy=0) +U0 SrvUserCmdLine(I64 dummy=0) { nounusedwarn dummy; LBts(&Fs->task_flags,TASKf_USER); TaskInitExt; - if (HashFind("ServantStartUp",adam_task->hash_table,HTT_FUN)) - CallExtStr("ServantStartUp"); - ServantTaskCont; + if (HashFind("SrvStartUp",adam_task->hash_table,HTT_FUN)) + CallExtStr("SrvStartUp"); + SrvTaskCont; } CTask *SpawnUser(U8 *fmt=NULL,...) @@ -443,7 +448,6 @@ U0 TaskFinishOff(CTask *task) I64 TaskEnd() { //called with irq's off CTask *task=Fs,*tempt,*tempt1; - CTaskCmd *tempc,*tempc1,*tempc2; if (task==sys_task_being_screen_updated) { LBts(&task->task_flags,TASKf_KILL_TASK); return task->next_task; @@ -483,23 +487,11 @@ I64 TaskEnd() while (LBts(&task->locked_flags,TASKLf_TASK_LOCK)) Pause; - tempc1=&task->next_servant_cmd; - tempc=tempc1->next; - while (tempc!=tempc1) { - tempc2=tempc->next; - Free(tempc->data); - Free(tempc); - tempc=tempc2; - } + while (LBts(&task->srv_ctrl.flags,SVCRf_LOCKED)) + Pause; - tempc1=&task->next_master_cmd; - tempc=tempc1->next; - while (tempc!=tempc1) { - tempc2=tempc->next; - Free(tempc->data); - Free(tempc); - tempc=tempc2; - } + SrvCmdQueDel(&task->srv_ctrl.next_waiting); + SrvCmdQueDel(&task->srv_ctrl.next_done); if (IsRaw) VGAFlush; @@ -528,6 +520,7 @@ I64 TaskEnd() tempt =task->next_task; //save to return TaskQueRem(task); + LBtr(&task->srv_ctrl.flags,SVCRf_LOCKED); LBtr(&task->locked_flags,TASKLf_TASK_LOCK); if (sys_winmgr_task) { diff --git a/TempleOS/Kernel/TaskCmd.CPP b/TempleOS/Kernel/TaskCmd.CPP deleted file mode 100644 index cb12f8b..0000000 --- a/TempleOS/Kernel/TaskCmd.CPP +++ /dev/null @@ -1,422 +0,0 @@ -U0 TaskRstAwaitingMsg(CTask *task=NULL) -{ //Pop-ups get parent messages so wake-up our pop-ups if we got a msg. - Bool old_preempt=Preempt(OFF); - if (!task) task=Fs; - if (TaskValidate(task)) { - LBtr(&task->task_flags,TASKf_AWAITING_MSG); - while (task=task->popup_task) - if (TaskValidate(task)) - LBtr(&task->task_flags,TASKf_AWAITING_MSG); - else - break; - } - Preempt(old_preempt); -} - -CTaskCmd *TaskRqstQue(CTask *servant,CTask *master, - U8 *data,I64 flags) -{ - CTaskCmd *result; - if (!data || !TaskValidate(servant) || - master && !TaskValidate(master) || - servant->popup_task && !Bt(&servant->task_flags,TASKf_FILTER_INPUT)) - return NULL; - result=AMAlloc(sizeof(CTaskCmd)); - result->master_task=master; - result->cmd_code=TASKCT_EXECUTE_STR; - result->flags=flags; - result->data=AStrNew(data); - result->result=NULL; - - PushFD; - Cli; - while (LBts(&servant->locked_flags,TASKLf_TASK_LOCK)) - Pause; - if (!TaskValidate(servant)) { - PopFD; - Free(result->data); - Free(result); - return NULL; - } else { - LBtr(&servant->task_flags,TASKf_IDLE); - TaskRstAwaitingMsg(servant); - QueIns(result,servant->last_servant_cmd); - LBtr(&servant->locked_flags,TASKLf_TASK_LOCK); - if (Bt(&flags,TASKCf_WAKE_MASTER)) { - Suspend(master); - Yield; - } - } - PopFD; - return result; -} - -CTaskCmd *TextInputQue(CTask *servant,CTask *master, - U8 *data,I64 flags) -{ - CTaskCmd *result; - Bool old_preempt=Preempt(OFF); - CTask *task; - if (!data || !TaskValidate(servant) || - master && !TaskValidate(master) || - servant->popup_task && !Bt(&servant->task_flags,TASKf_FILTER_INPUT)) { - Preempt(old_preempt); - return NULL; - } - result=AMAlloc(sizeof(CTaskCmd)); - result->master_task=master; //in case somebody cares - result->cmd_code=TASKCT_TEXT_INPUT; - result->flags=flags; - result->data=AStrNew(data); - result->result=NULL; - - PushFD; - if (flags&1<next_input_filter_task==servant) { - task=Spawn(&InputFilterTask,NULL, - "Input Filter",servant); - Cli; - task->next_input_filter_task=servant->next_input_filter_task; - task->last_input_filter_task=servant; - servant->next_input_filter_task=task; - task->next_input_filter_task->last_input_filter_task=task; - } else - task=servant->next_input_filter_task; - Cli; - while (LBts(&task->locked_flags,TASKLf_TASK_LOCK)) - Pause; - if (!TaskValidate(task)) { - Free(result->data); - Free(result); - result=NULL; - } else { - LBtr(&task->task_flags,TASKf_IDLE); - TaskRstAwaitingMsg(task); - QueIns(result,task->last_servant_cmd); - LBtr(&task->locked_flags,TASKLf_TASK_LOCK); - } - PopFD; - Preempt(old_preempt); - return result; -} - -CTaskCmd *QueMsg(CTask *_servant,CTask *master, - I64 msg_code,I64 p1,I64 p2,I64 flags) -{ - CTaskCmd *tempc1,*tempc; - CTask *servant=_servant; - if (!TaskValidate(servant) || - master && !TaskValidate(master)|| - servant->popup_task && !Bt(&servant->task_flags,TASKf_FILTER_INPUT)) - return NULL; - tempc=AMAlloc(sizeof(CTaskCmd)); - tempc->master_task=master; - tempc->cmd_code=TASKCT_MSG; - tempc->msg_code=AbsI64(msg_code); //negative means do a down and up - tempc->p1=p1; - tempc->p2=p2; - tempc->flags=flags; - tempc->data=NULL; - tempc->result=NULL; - PushFD; - if (Bt(&sys_semas[SYS_SEMA_RECORD_MACRO],0) && - servant!=sys_macro_util_task && - msg_code==MSG_KEY_DOWN) { - tempc1=AMAllocIdentical(tempc); - Cli; - QueIns(tempc1,sys_macro_root.last); - } - Cli; - while (Bt(&servant->task_flags,TASKf_FILTER_INPUT) && - !Bt(&flags,TASKCf_DONT_FILTER)) - servant=servant->next_input_filter_task; - while (LBts(&servant->locked_flags,TASKLf_TASK_LOCK)) - Pause; - if (!TaskValidate(servant)) { - Free(tempc); - tempc=NULL; - } else { - LBtr(&servant->task_flags,TASKf_IDLE); - TaskRstAwaitingMsg(servant); - QueIns(tempc,servant->last_servant_cmd); - LBtr(&servant->locked_flags,TASKLf_TASK_LOCK); - } - PopFD; - if (msg_code<0) //Down-Up - QueMsg(_servant,master,-msg_code+1,p1,p2,flags); - return tempc; -} - -Bool GetRqstResult(CTaskCmd *rqst=NULL,I64 *_result=NULL) -{ - CTaskCmd *tempc,*tempc1; - PushFD; - Cli; - while (LBts(&Fs->locked_flags,TASKLf_TASK_LOCK)) - Pause; - tempc1=&Fs->next_master_cmd; - tempc=tempc1->next; - while (tempc!=tempc1) { - if (!rqst || rqst==tempc) { - QueRem(tempc); - LBtr(&Fs->locked_flags,TASKLf_TASK_LOCK); - PopFD; - if (_result) - *_result=tempc->result; - Free(tempc->data); - Free(tempc); - return TRUE; - } - tempc=tempc->next; - } - LBtr(&Fs->locked_flags,TASKLf_TASK_LOCK); - PopFD; - return FALSE; -} - -U0 TaskWait(CTask *task=NULL) -{ - CTask *task1; - CTaskCmd *tempc; - if (!task) task=Fs; - if (TaskValidate(task)) { - PushFD; - Cli; - while (TRUE) { - task1=task->last_input_filter_task; - tempc=&task1->next_servant_cmd; - if (TaskValidate(task1) && tempc==*tempc && - (task1==Fs || Bt(&task1->task_flags,TASKf_IDLE))) - break; - Yield; - } - PopFD; - } -} - -U0 PostMsg(CTask *task,I64 msg_code,I64 p1,I64 p2,I64 flags=0) -{ - if (TaskValidate(task)) { - if (Bt(&task->task_flags,TASKf_INPUT_FILTER_TASK)) - QueMsg(task->last_input_filter_task,NULL,msg_code,p1,p2, - flags| 1<locked_flags,TASKLf_TASK_LOCK)) - Pause; - tempc1=&task->next_servant_cmd; - tempc=tempc1->next; - while (tempc!=tempc1) { - tempc=tempc1->next; - if (tempc->cmd_code==TASKCT_EXECUTE_STR || - tempc->cmd_code==TASKCT_EXECUTE_FILE) { - cnt++; - QueRem(tempc); - LBtr(&task->locked_flags,TASKLf_TASK_LOCK); - SetFlags(old_flags); - try { - if (tempc->cmd_code==TASKCT_EXECUTE_STR) - tempc->result=ExePutS(tempc->data,sys_temp_filename); - else - tempc->result=ExeFile(tempc->data); - } catch - Fs->catch_except=TRUE; - if (master=tempc->master_task) { - if (!Bt(&tempc->flags,TASKCf_EXIT_ON_COMPLETE)) { - Cli; - while (LBts(&master->locked_flags,TASKLf_TASK_LOCK)) - Pause; - QueIns(tempc,master->last_master_cmd); - LBtr(&master->locked_flags,TASKLf_TASK_LOCK); - SetFlags(old_flags); - } - if (Bt(&tempc->flags,TASKCf_FOCUS_MASTER) && - Bt(&master->task_flags,TASKf_USER)) - sys_focus_task=master; - if (Bt(&tempc->flags,TASKCf_WAKE_MASTER)) - Suspend(master,FALSE); - if (!Bt(&tempc->flags,TASKCf_EXIT_ON_COMPLETE)) - goto start_over; - else { - Free(tempc->data); - Free(tempc); - Exit; - } - } else { - if (!Bt(&tempc->flags,TASKCf_EXIT_ON_COMPLETE)) { - Free(tempc->data); - Free(tempc); - goto start_over; - } else { - Free(tempc->data); - Free(tempc); - Exit; - } - } - } else - break; - } - LBtr(&task->locked_flags,TASKLf_TASK_LOCK); - SetFlags(old_flags); - return cnt; -} - -I64 Adam(U8 *fmt,...) -//Sends text to the adam task which gets -//compiled and run. -{ - I64 result; - U8 *st=SPrintFJoin(NULL,fmt,argc,argv); - Bool old_preempt=Preempt(OFF); - CTaskCmd *tempc; - if (Fs==adam_task) { - tempc=TaskRqstQue(adam_task,Fs,st,0); - ServantCmdsHandler; - } else { - TaskWait(adam_task); - tempc=TaskRqstQue(adam_task,Fs,st,1<task_flags,TASKf_INPUT_FILTER_TASK)) - ExePutS(st2); - else - TextInputQue(Fs,0,st2,1<popup_task=task; - tempc=TaskRqstQue(task,Fs,st,1<popup_task=NULL; - Kill(task,FALSE); - Free(st); - return result; -} - -U0 AutoStr(U8 *fmt,...) -//Sends text in the nature of an AutoFile to one's -//own input buffer. -{ - U8 *st=SPrintFJoin(NULL,fmt,argc,argv); - if (Bt(&Fs->task_flags,TASKf_INPUT_FILTER_TASK)) - ExePutS(st); - else - TextInputQue(Fs,0,st,1<task_flags,TASKf_INPUT_FILTER_TASK)) - ExeFile(name2); - else - AutoStr("%F",name2); - Free(name2); -} - - -//This sends text of an AutoFile nature to a -//task's input buffer. -U0 XTalkStr(CTask *task,U8 *fmt,...) -{ - U8 *st=SPrintFJoin(NULL,fmt,argc,argv); - TextInputQue(task,0,st,0); - Free(st); -} - -U0 XTalkStrWait(CTask *task,U8 *fmt,...) -{ - U8 *st=SPrintFJoin(NULL,fmt,argc,argv); - TextInputQue(task,0,st,0); - Free(st); - TaskWait(task); -} diff --git a/TempleOS/Kernel/Utils1a.CPP b/TempleOS/Kernel/Utils1a.CPP index bebb6e6..51eabe7 100644 --- a/TempleOS/Kernel/Utils1a.CPP +++ b/TempleOS/Kernel/Utils1a.CPP @@ -1,10 +1,78 @@ asm { USE64 // ************************************ +_MEMSET:: + ENTER 0 + PUSH RDI + CLD + MOV RDI,U64 SF_ARG1[RBP] + MOV RAX,U64 SF_ARG2[RBP] + MOV RCX,U64 SF_ARG3[RBP] + REP_STOSB + MOV RAX,RDI + POP RDI + LEAVE + RET1 24 +// ************************************ +_MEMSET_U16:: + ENTER 0 + PUSH RDI + CLD + MOV RDI,U64 SF_ARG1[RBP] + MOV RAX,U64 SF_ARG2[RBP] + MOV RCX,U64 SF_ARG3[RBP] + REP_STOSW + MOV RAX,RDI + POP RDI + LEAVE + RET1 24 +// ************************************ +_MEMSET_U32:: + ENTER 0 + PUSH RDI + CLD + MOV RDI,U64 SF_ARG1[RBP] + MOV RAX,U64 SF_ARG2[RBP] + MOV RCX,U64 SF_ARG3[RBP] + REP_STOSD + MOV RAX,RDI + POP RDI + LEAVE + RET1 24 +// ************************************ +_MEMSET_U64:: + ENTER 0 + PUSH RDI + CLD + MOV RDI,U64 SF_ARG1[RBP] + MOV RAX,U64 SF_ARG2[RBP] + MOV RCX,U64 SF_ARG3[RBP] + REP_STOSQ + MOV RAX,RDI + POP RDI + LEAVE + RET1 24 +// ************************************ +_MEMCPY:: + ENTER 0 + PUSH RSI + PUSH RDI + CLD + MOV RDI,U64 SF_ARG1[RBP] + MOV RSI,U64 SF_ARG2[RBP] + MOV RCX,U64 SF_ARG3[RBP] + REP_MOVSB + MOV RAX,RDI + POP RDI + POP RSI + LEAVE + RET1 24 +// ************************************ _MEMCMP:: ENTER 0 PUSH RSI PUSH RDI + CLD MOV RSI,U64 SF_ARG1[RBP] MOV RDI,U64 SF_ARG2[RBP] MOV RCX,U64 SF_ARG3[RBP] @@ -19,6 +87,62 @@ _MEMCMP:: LEAVE RET1 24 // ************************************ +_BEQU:: + ENTER 0 + XOR RAX,RAX + MOV RDX,U64 SF_ARG3[RBP] + MOV RBX,U64 SF_ARG1[RBP] + MOV RCX,U64 SF_ARG2[RBP] + OR RDX,RDX + JZ @@5 + BTS U64 [RBX],RCX + JMP @@10 +@@5: BTR U64 [RBX],RCX +@@10: ADC AL,0 + LEAVE + RET1 24 +// ************************************ +_LBEQU:: + ENTER 0 + XOR RAX,RAX + MOV RDX,U64 SF_ARG3[RBP] + MOV RBX,U64 SF_ARG1[RBP] + MOV RCX,U64 SF_ARG2[RBP] + OR RDX,RDX + JZ @@5 + LOCK + BTS U64 [RBX],RCX + JMP @@10 +@@5: LOCK + BTR U64 [RBX],RCX +@@10: ADC AL,0 + LEAVE + RET1 24 +// ************************************ +_LIMIT_I64:: + ENTER 0 + MOV RAX,U64 SF_ARG1[RBP] + MOV RCX,U64 SF_ARG2[RBP] + MOV RDX,U64 SF_ARG3[RBP] + CMP RAX,RCX + CMOVL RAX,RCX + CMP RAX,RDX + CMOVG RAX,RDX + LEAVE + RET1 24 +// ************************************ +_LIMIT_U64:: + ENTER 0 + MOV RAX,U64 SF_ARG1[RBP] + MOV RCX,U64 SF_ARG2[RBP] + MOV RDX,U64 SF_ARG3[RBP] + CMP RAX,RCX + CMOVB RAX,RCX + CMP RAX,RDX + CMOVA RAX,RDX + LEAVE + RET1 24 +// ************************************ _CALL:: ENTER 0 MOV RAX,U64 SF_ARG1[RBP] diff --git a/TempleOS/Misc/OSTestSuite.CPP b/TempleOS/Misc/OSTestSuite.CPP index 3d5250c..cd6fbb4 100644 --- a/TempleOS/Misc/OSTestSuite.CPP +++ b/TempleOS/Misc/OSTestSuite.CPP @@ -1,4 +1,4 @@ -I64 ts_num; +$PL,1000$I64 ts_num; U0 TSStart() { ts_num=0; @@ -6,7 +6,7 @@ U0 TSStart() U0 TS() { progress4=ts_num++; - progress4_max=156; + progress4_max=142; *progress4_desc=0; } U0 TSEnd() @@ -213,21 +213,6 @@ U0 DoKeyBitMap() LBtr(key_down_bitmap,i_sc); } -U0 DoGolf() -{ - CTask *task=SpawnUser; - XTalkWait(task,"#include \"::/TempleOS/Demo/Graphics/Golf\";\n"); - Sleep(300); - SendMsg(task,MSG_KEY_DOWN_UP,CH_SPACE,0); - Sleep(300); - SendMsg(task,MSG_KEY_DOWN_UP,CH_SPACE,0); - Sleep(300); - SendMsg(task,MSG_KEY_DOWN_UP,CH_SPACE,0); - Sleep(300); - SendMsg(task,MSG_KEY_DOWN_UP,CH_SHIFT_ESC,0); - XTalk(task,"Exit;\n"); -} - U0 DoMountain() { CTask *task=SpawnUser; @@ -239,7 +224,7 @@ U0 DoMountain() U0 DoCoach() { CTask *task=SpawnUser; - XTalkWait(task,"#include \"::/TempleOS/Demo/GameStarters/Coach\";\n"); + XTalkWait(task,"#include \"::/TempleOS/Demo/Games/Coach\";\n"); SendMsg(task,MSG_KEY_DOWN_UP,CH_SPACE,0); Sleep(1000); SendMsg(task,MSG_KEY_DOWN_UP,CH_SHIFT_ESC,0); @@ -249,7 +234,7 @@ U0 DoCoach() U0 DoDigits() { CTask *task=SpawnUser; - XTalkWait(task,"#include \"::/TempleOS/Demo/Digits\";\n"); + XTalkWait(task,"#include \"::/TempleOS/Demo/Games/Digits\";\n"); Sleep(100); SendMsg(task,MSG_KEY_DOWN_UP,CH_SPACE,0); Sleep(100); @@ -261,15 +246,6 @@ U0 DoDigits() XTalk(task,"Exit;\n"); } -U0 DoCPUPlot() -{ - CTask *task=SpawnUser; - XTalkWait(task,"#include \"::/TempleOS/Demo/Graphics/CPUPlot\";\n"); - Sleep(1000); - SendMsg(task,MSG_KEY_DOWN_UP,CH_SPACE,0); - XTalk(task,"Exit;\n"); -} - U0 DoDither() { CTask *task=SpawnUser; @@ -346,7 +322,7 @@ U0 DoPullDownMenu() U0 DoStadium() { CTask *task=SpawnUser; - XTalkWait(task,"#include \"::/TempleOS/Demo/GameStarters/Stadium/Stadium\";\n"); + XTalkWait(task,"#include \"::/TempleOS/Demo/Games/Stadium/Stadium\";\n"); Sleep(50); SendMsg(task,MSG_IP_L_DOWN_UP,100,10); Sleep(300); @@ -372,7 +348,7 @@ U0 DoPalette() U0 DoHalogen() { CTask *task=SpawnUser; - XTalkWait(task,"#include \"::/TempleOS/Demo/GameStarters/Halogen\";\n"); + XTalkWait(task,"#include \"::/TempleOS/Demo/Games/Halogen\";\n"); SendMsg(task,MSG_KEY_DOWN,0,SC_CURSOR_UP); Sleep(1000); SendMsg(task,MSG_KEY_UP,0,SC_CURSOR_UP); @@ -387,7 +363,7 @@ U0 DoTheDead() { I64 i; CTask *task=SpawnUser; - XTalkWait(task,"#include \"::/TempleOS/Demo/GameStarters/TheDead\";\n"); + XTalkWait(task,"#include \"::/TempleOS/Demo/Games/TheDead\";\n"); for (i=0;i<15;i++) { SendMsg(task,MSG_KEY_DOWN_UP,0,SC_CURSOR_DOWN); SendMsg(task,MSG_KEY_DOWN_UP,CH_SPACE,0); @@ -402,11 +378,11 @@ U0 DoTheDead() XTalk(task,"Exit;\n"); } -U0 DoBomber() +U0 DoBulgeBomber() { I64 i; CTask *task=SpawnUser; - XTalkWait(task,"#include \"::/TempleOS/Demo/GameStarters/Bomber\";\n"); + XTalkWait(task,"#include \"::/TempleOS/Demo/Games/BulgeBomber\";\n"); for (i=0;i<7;i++) { SendMsg(task,MSG_KEY_DOWN_UP,0,SC_CURSOR_UP); SendMsg(task,MSG_KEY_DOWN_UP,0,SC_CURSOR_RIGHT); @@ -424,7 +400,7 @@ U0 DoZoneOut() { I64 i; CTask *task=SpawnUser; - XTalk(task,"#include \"::/TempleOS/Demo/GameStarters/ZoneOut\";\n"); + XTalk(task,"#include \"::/TempleOS/Demo/Games/ZoneOut\";\n"); while (!TaskValidate(task->popup_task)) Yield; TaskWait(task->popup_task); @@ -443,7 +419,7 @@ U0 DoVaroom() { I64 i; CTask *task=SpawnUser; - XTalk(task,"#include \"::/TempleOS/Demo/GameStarters/Varoom\";\n"); + XTalkWait(task,"#include \"::/TempleOS/Demo/Games/Varoom\";\n"); for (i=0;i<15;i++) { SendMsg(task,MSG_KEY_DOWN_UP,0,SC_CURSOR_UP); Sleep(50); @@ -455,32 +431,10 @@ U0 DoVaroom() XTalk(task,"Exit;\n"); } -U0 DoRocks() -{ - I64 i; - CTask *task=SpawnUser; - XTalk(task,"#include \"::/TempleOS/Demo/GameStarters/Rocks\";\n"); - while (!TaskValidate(task->popup_task)) - Yield; - TaskWait(task->popup_task); - SendMsg(task->popup_task,MSG_KEY_DOWN_UP,CH_SPACE,0); - while (TaskValidate(task->popup_task)) - Yield; - SendMsg(task,MSG_KEY_DOWN,0,SC_CURSOR_RIGHT); - Sleep(300); - for (i=0;i<15;i++) { - SendMsg(task,MSG_KEY_DOWN_UP,CH_SPACE,0); - Sleep(100); - } - SendMsg(task,MSG_KEY_UP,0,SC_CURSOR_RIGHT); - SendMsg(task,MSG_KEY_DOWN_UP,CH_SHIFT_ESC,0); - XTalk(task,"Exit;\n"); -} - -U0 DoNavy() +U0 DoFlatTops() { CTask *task=SpawnUser; - XTalk(task,"#include \"::/TempleOS/Demo/GameStarters/Navy\";\n"); + XTalk(task,"#include \"::/TempleOS/Demo/Games/FlatTops\";\n"); while (!TaskValidate(task->popup_task)) Yield; TaskWait(task->popup_task); @@ -497,7 +451,7 @@ U0 DoWenceslas() { I64 i; CTask *task=SpawnUser; - XTalk(task,"#include \"::/TempleOS/Demo/GameStarters/Wenceslas\";\n"); + XTalk(task,"#include \"::/TempleOS/Demo/Games/Wenceslas\";\n"); while (!TaskValidate(task->popup_task)) Yield; TaskWait(task->popup_task); @@ -522,42 +476,10 @@ U0 DoWenceslas() XTalk(task,"Exit;\n"); } -U0 DoChess() -{ - I64 i; - CTask *task=SpawnUser; - XTalk(task,"#include \"::/TempleOS/Demo/GameStarters/Chess\";\n"); - while (!TaskValidate(task->popup_task)) - Yield; - TaskWait(task->popup_task); - SendMsg(task->popup_task,MSG_KEY_DOWN_UP,CH_SPACE,0); - Sleep(100); - while (!TaskValidate(task->popup_task)) - Yield; - TaskWait(task->popup_task); - SendMsg(task->popup_task,MSG_KEY_DOWN_UP,CH_SPACE,0); - Sleep(100); - for (i=0;i<8;i++) { - SendMsg(task,MSG_KEY_DOWN_UP,0,SC_CURSOR_DOWN); - SendMsg(task,MSG_KEY_DOWN_UP,0,SC_CURSOR_RIGHT); - Sleep(25); - } - SendMsg(task,MSG_KEY_DOWN_UP,0,SC_CURSOR_UP); - Sleep(250); - SendMsg(task,MSG_KEY_DOWN,CH_SPACE,0); - SendMsg(task,MSG_KEY_DOWN_UP,0,SC_CURSOR_UP); - Sleep(250); - SendMsg(task,MSG_KEY_DOWN_UP,0,SC_CURSOR_UP); - SendMsg(task,MSG_KEY_UP,CH_SPACE,0); - Sleep(1000); - SendMsg(task,MSG_KEY_DOWN_UP,CH_SHIFT_ESC,0); - XTalk(task,"Exit;\n"); -} - U0 DoChessNet() { CTask *task=SpawnUser; - XTalk(task,"#include \"::/TempleOS/Demo/GameStarters/ChessNet\";\n"); + XTalk(task,"#include \"::/TempleOS/Demo/Games/ChessNet\";\n"); while (!TaskValidate(task->popup_task)) Yield; TaskWait(task->popup_task); @@ -572,7 +494,7 @@ U0 DoChessNet() U0 DoRainDrops() { CTask *task=SpawnUser; - XTalkWait(task,"#include \"::/TempleOS/Demo/GameStarters/RainDrops\";\n"); + XTalkWait(task,"#include \"::/TempleOS/Demo/Games/RainDrops\";\n"); Sleep(1000); SendMsg(task,MSG_KEY_DOWN_UP,CH_SHIFT_ESC,0); XTalk(task,"Exit;\n"); @@ -626,7 +548,7 @@ U0 DoBlackDiamond() { I64 i; CTask *task=SpawnUser; - XTalkWait(task,"#include \"::/TempleOS/Demo/GameStarters/BlackDiamond\";\n"); + XTalkWait(task,"#include \"::/TempleOS/Demo/Games/BlackDiamond\";\n"); for (i=0;i<15;i++) { SendMsg(task,MSG_KEY_DOWN_UP,0,SC_CURSOR_RIGHT); Sleep(75); @@ -648,6 +570,9 @@ U0 DoCtrlR1() while (!TaskValidate(task->popup_task)) Yield; TaskWait(task->popup_task); + task_num=task->popup_task->task_num; + for (i=0;i<1;i++) + SendMsg(task->popup_task,MSG_KEY_DOWN_UP,0,SC_CURSOR_DOWN); PostMsg(task->popup_task,MSG_KEY_DOWN_UP,CH_SPACE,0); while (TaskValidate(task->popup_task)) Yield; @@ -658,8 +583,10 @@ U0 DoCtrlR1() //Color while (!TaskValidate(task->popup_task)) Yield; - task_num=task->popup_task->task_num; TaskWait(task->popup_task); + task_num=task->popup_task->task_num; + for (i=0;i<1;i++) + SendMsg(task->popup_task,MSG_KEY_DOWN_UP,0,SC_CURSOR_DOWN); PostMsg(task->popup_task,MSG_KEY_DOWN_UP,CH_SPACE,0); while (!TaskValidate(task->popup_task)||task->popup_task->task_num==task_num) Yield; @@ -673,9 +600,9 @@ U0 DoCtrlR1() while (!TaskValidate(task->popup_task)||task->popup_task->task_num==task_num) Yield; TaskWait(task->popup_task); - SendMsg(task->popup_task,MSG_KEY_DOWN_UP,0,SC_CURSOR_DOWN); - SendMsg(task->popup_task,MSG_KEY_DOWN_UP,0,SC_CURSOR_DOWN); task_num=task->popup_task->task_num; + for (i=0;i<3;i++) + SendMsg(task->popup_task,MSG_KEY_DOWN_UP,0,SC_CURSOR_DOWN); PostMsg(task->popup_task,MSG_KEY_DOWN_UP,CH_SPACE,0); while (!TaskValidate(task->popup_task)||task->popup_task->task_num==task_num) Yield; @@ -689,7 +616,8 @@ U0 DoCtrlR1() while (!TaskValidate(task->popup_task)||task->popup_task->task_num==task_num) Yield; TaskWait(task->popup_task); - for (i=0;i<6;i++) + task_num=task->popup_task->task_num; + for (i=0;i<7;i++) SendMsg(task->popup_task,MSG_KEY_DOWN_UP,0,SC_CURSOR_DOWN); PostMsg(task->popup_task,MSG_KEY_DOWN_UP,CH_SPACE,0); while (TaskValidate(task->popup_task)) @@ -708,8 +636,10 @@ U0 DoCtrlR1() //Color while (!TaskValidate(task->popup_task)) Yield; - task_num=task->popup_task->task_num; TaskWait(task->popup_task); + task_num=task->popup_task->task_num; + for (i=0;i<1;i++) + SendMsg(task->popup_task,MSG_KEY_DOWN_UP,0,SC_CURSOR_DOWN); PostMsg(task->popup_task,MSG_KEY_DOWN_UP,CH_SPACE,0); while (!TaskValidate(task->popup_task)||task->popup_task->task_num==task_num) Yield; @@ -723,7 +653,8 @@ U0 DoCtrlR1() while (!TaskValidate(task->popup_task)||task->popup_task->task_num==task_num) Yield; TaskWait(task->popup_task); - for (i=0;i<9;i++) + task_num=task->popup_task->task_num; + for (i=0;i<10;i++) SendMsg(task->popup_task,MSG_KEY_DOWN_UP,0,SC_CURSOR_DOWN); PostMsg(task->popup_task,MSG_KEY_DOWN_UP,CH_SPACE,0); while (TaskValidate(task->popup_task)) @@ -751,48 +682,6 @@ U0 DoTicTacToe() } */ -U0 DoCircuit() -{ - CTask *task=SpawnUser; - XTalk(task,"#include \"::/TempleOS/Demo/Graphics/Circuit\";\n"); - while (!TaskValidate(task->popup_task)) - Yield; - TaskWait(task->popup_task); - SendMsg(task->popup_task,MSG_KEY_DOWN_UP,CH_SPACE,0); - while (TaskValidate(task->popup_task)) - Yield; - SetIP(300,350); - SendMsg(task,MSG_KEY_DOWN_UP,'r',0); - SetIP(400,350); - SendMsg(task,MSG_KEY_DOWN_UP,'l',0); - SetIP(350,400); - SendMsg(task,MSG_KEY_DOWN_UP,'c',0); - SendMsg(task,MSG_KEY_DOWN_UP,CH_SPACE,0); - SendMsg(task,MSG_IP_L_DOWN,350,385); - SendMsg(task,MSG_IP_L_UP,390,350); - Sleep(500); - SendMsg(task,MSG_IP_L_DOWN,350,385); - SendMsg(task,MSG_IP_L_UP,310,350); - Sleep(500); - SendMsg(task,MSG_KEY_DOWN_UP,CH_SHIFT_ESC,0); - XTalk(task,"Exit;\n"); -} - -U0 DoSpaceShip() -{ - CTask *task=SpawnUser; - SetIP(300,300); - XTalkWait(task,"#include \"::/TempleOS/Demo/GameStarters/SpaceShip\";\n"); - Sleep(150); - AFSetIP(3,125,125); - SetIP(,,,TRUE); - Sleep(50); - SetIP(,,,FALSE); - Sleep(500); - SendMsg(task,MSG_KEY_DOWN_UP,CH_SHIFT_ESC,0); - XTalk(task,"Exit;\n"); -} - U0 DoBox() { CTask *task=SpawnUser; @@ -851,17 +740,6 @@ U0 DoRotateTank() XTalk(task,"Exit;\n"); } -/* -U0 DoPic2ASCII() -{ - CTask *task=SpawnUser; - XTalkWait(task,"#include \"::/TempleOS/Demo/Graphics/Pic2ASCII\";\n"); - Sleep(500); - SendMsg(task,MSG_KEY_DOWN_UP,CH_SPACE,0); - XTalk(task,"Exit;\n"); -} -*/ - U0 DoScreenCodes() { CTask *task=SpawnUser; @@ -879,15 +757,6 @@ U0 DoExtendedChars() XTalk(task,"Exit;\n"); } -U0 DoNeatTrick() -{ - CTask *task=SpawnUser; - XTalkWait(task,"#include \"::/TempleOS/Demo/Graphics/NeatTrick\";\n"); - Sleep(1500); - SendMsg(task,MSG_KEY_DOWN_UP,CH_SPACE,0); - XTalk(task,"Exit;\n"); -} - U0 DoCharGraphics() { CTask *task=SpawnUser; @@ -900,7 +769,7 @@ U0 DoCharGraphics() U0 DoMaze() { CTask *task=SpawnUser; - XTalkWait(task,"#include \"::/TempleOS/Demo/Maze\";\n"); + XTalkWait(task,"#include \"::/TempleOS/Demo/Games/Maze\";\n"); Sleep(750); SendMsg(task,MSG_KEY_DOWN_UP,CH_SHIFT_ESC,0); XTalk(task,"Exit;\n"); @@ -953,15 +822,6 @@ U0 DoMPPrintF() XTalk(task,"Exit;\n"); } -U0 DoLayers3DJob() -{ - CTask *task=SpawnUser; - XTalkWait(task,"#include \"::/TempleOS/Demo/MultiCore/Layers3DJob\";\n"); - Sleep(1500); - SendMsg(task,MSG_KEY_DOWN_UP,CH_SPACE,0); - XTalk(task,"Exit;\n"); -} - U0 DoCartesian() { CTask *task=SpawnUser; @@ -994,7 +854,7 @@ U0 DoLife() U0 DoZing() { CTask *task=SpawnUser; - XTalkWait(task,"#include \"::/TempleOS/Demo/GameStarters/Zing\";\n"); + XTalkWait(task,"#include \"::/TempleOS/Demo/Games/Zing\";\n"); Sleep(500); SendMsg(task,MSG_KEY_DOWN_UP,CH_SPACE,0); XTalk(task,"Exit;\n"); @@ -1002,15 +862,6 @@ U0 DoZing() */ -U0 DoFlowers() -{ - CTask *task=SpawnUser; - XTalkWait(task,"#include \"::/TempleOS/Demo/Graphics/Flowers\";\n"); - Sleep(3000); - SendMsg(task,MSG_KEY_DOWN_UP,CH_SHIFT_ESC,0); - XTalk(task,"Exit;\n"); -} - U0 DoCommonAncestor() { CTask *task=SpawnUser; @@ -1055,15 +906,6 @@ U0 DoLock() XTalk(task,"Exit;\n"); } -U0 DoLayersSpawn() -{ - CTask *task=SpawnUser; - XTalkWait(task,"#include \"::/TempleOS/Demo/MultiCore/LayersSpawn\";\n"); - Sleep(1500); - SendMsg(task,MSG_KEY_DOWN_UP,CH_SPACE,0); - XTalk(task,"Exit;\n"); -} - U0 DoClouds() { CTask *task=SpawnUser; @@ -1073,15 +915,6 @@ U0 DoClouds() XTalk(task,"Exit;\n"); } -U0 DoNoise() -{ - CTask *task=SpawnUser; - XTalkWait(task,"#include \"::/TempleOS/Demo/MultiCore/Noise\";\n"); - Sleep(1500); - SendMsg(task,MSG_KEY_DOWN_UP,CH_SPACE,0); - XTalk(task,"Exit;\n"); -} - /* U0 Do() { @@ -1091,20 +924,7 @@ U0 Do() SendMsg(task,MSG_KEY_DOWN_UP,CH_SPACE,0); XTalk(task,"Exit;\n"); } -*/ -U0 DoBling() -{ - CTask *task=SpawnUser; - XTalkWait(task,"#include \"::/TempleOS/Demo/Graphics/Bling\";\n"); - Sleep(500); - SendMsg(task,MSG_KEY_DOWN_UP,CH_SPACE,0); - Sleep(500); - SendMsg(task,MSG_KEY_DOWN_UP,CH_SHIFT_ESC,0); - XTalk(task,"Exit;\n"); -} - -/* U0 Do() { CTask *task=SpawnUser; @@ -1124,11 +944,11 @@ U0 Do() } */ -U0 DoBirdLand() +U0 DoBugFlapper() { I64 i; CTask *task=SpawnUser; - XTalk(task,"#include \"::/TempleOS/Demo/GameStarters/BirdLand\";\n"); + XTalk(task,"#include \"::/TempleOS/Demo/Games/BugBird\";\n"); while (!TaskValidate(task->popup_task)) Yield; TaskWait(task->popup_task); @@ -1144,36 +964,10 @@ U0 DoBirdLand() XTalk(task,"Exit;\n"); } - -U0 DoMissileDefense() -{ - I64 i; - CTask *task=SpawnUser; - XTalk(task,"#include \"::/TempleOS/Demo/GameStarters/MissileDefense\";\n"); - while (!TaskValidate(task->popup_task)) - Yield; - task->popup_task->user_data0=Fs; - TaskWait(task->popup_task); - SendMsg(task->popup_task,MSG_KEY_DOWN_UP,CH_SPACE,0); - while (!TaskValidate(task->popup_task)||task->popup_task->user_data0==Fs) - Yield; - TaskWait(task->popup_task); - SendMsg(task->popup_task,MSG_KEY_DOWN_UP,CH_SPACE,0); - while (TaskValidate(task->popup_task)) - Yield; - for (i=0;i<10;i++) { - SetIP(RandU16%task->win_pixel_width,RandU16%task->win_pixel_height); - SendMsg(task,MSG_KEY_DOWN_UP,RandU16%3+'1',0); - Sleep(200); - } - SendMsg(task,MSG_KEY_DOWN_UP,CH_SHIFT_ESC,0); - XTalk(task,"Exit;\n"); -} - -U0 DoWarGame() +U0 DoBattleLines() { CTask *task=SpawnUser; - XTalk(task,"#include \"::/TempleOS/Demo/GameStarters/WarGame\";\n"); + XTalk(task,"#include \"::/TempleOS/Demo/Games/BattleLines\";\n"); while (!TaskValidate(task->popup_task)) Yield; TaskWait(task->popup_task); @@ -1191,7 +985,7 @@ U0 DoBigGuns() { I64 i; CTask *task=SpawnUser; - XTalk(task,"#include \"::/TempleOS/Demo/GameStarters/BigGuns\";\n"); + XTalk(task,"#include \"::/TempleOS/Demo/Games/BigGuns\";\n"); while (!TaskValidate(task->popup_task)) Yield; task->popup_task->user_data0=Fs; @@ -1217,7 +1011,7 @@ U0 DoDunGen() { I64 i; CTask *task=SpawnUser; - XTalkWait(task,"#include \"::/TempleOS/Demo/GameStarters/DunGen\";\n"); + XTalkWait(task,"#include \"::/TempleOS/Demo/Games/DunGen\";\n"); for (i=0;i<10;i++) { SendMsg(task,MSG_KEY_DOWN_UP,0,SC_CURSOR_RIGHT); Sleep(100); @@ -1238,7 +1032,7 @@ U0 DoTimeOut() { I64 i; CTask *task=SpawnUser; - XTalkWait(task,"#include \"::/TempleOS/Apps/Timeout/Run\";\n"); + XTalkWait(task,"#include \"::/TempleOS/Apps/TimeOut/Run\";\n"); Sleep(200); SendMsg(task,MSG_KEY_DOWN_UP,CH_SPACE,0); for (i=0;i<3;i++) { @@ -1262,7 +1056,7 @@ U0 DoTimeOut() U0 DoCollision() { CTask *task=SpawnUser; - XTalkWait(task,"#include \"::/TempleOS/Demo/GameStarters/Collision\";\n"); + XTalkWait(task,"#include \"::/TempleOS/Demo/Games/Collision\";\n"); Sleep(1500); SendMsg(task,MSG_KEY_DOWN_UP,CH_SPACE,0); XTalk(task,"Exit;\n"); @@ -1287,14 +1081,6 @@ U0 DoPrimes() XTalk(task,"Exit;\n"); } -U0 DoSort() -{ - CTask *task=SpawnUser; - XTalkWait(task,"#include \"::/TempleOS/Demo/MultiCore/Sort\";\n"); - Sleep(1000); - XTalk(task,"Exit;\n"); -} - U0 DoRadixSort() { CTask *task=SpawnUser; @@ -1327,19 +1113,6 @@ U0 DoStkGrow() XTalk(task,"Exit;\n"); } -U0 DoPilgrims() -{ - CTask *task=SpawnUser; - XTalk(task,"#include \"::/TempleOS/Apps/Pilgrims/Run\";\n"); - while (!TaskValidate(task->popup_task)) - Yield; - TaskWait(task->popup_task); - SendMsg(task->popup_task,MSG_KEY_DOWN_UP,CH_SPACE,0); - Sleep(2500); - SendMsg(task,MSG_KEY_DOWN_UP,CH_SHIFT_ESC,0); - XTalk(task,"Exit;\n"); -} - U0 DoSpan() { CTask *task=SpawnUser; @@ -1353,10 +1126,86 @@ U0 DoSpan() XTalk(task,"Exit;\n"); } +U0 DoStrut() +{ + CTask *task=SpawnUser; + XTalkWait(task,"#include \"::/TempleOS/Apps/Strut/Run\";\n"); + + SetIP(200,200,,TRUE); + SendMsg(task,MSG_IP_L_DOWN,0,0); + WinMgrSync(2); + + SetIP(GR_WIDTH-200,200,,TRUE); + SendMsg(task,MSG_IP_L_DOWN,0,0); + + SetIP(GR_WIDTH/2,400,,TRUE); + SendMsg(task,MSG_IP_L_DOWN,0,0); + + SendMsg(task,MSG_KEY_DOWN_UP,'s',0); + + SetIP(200,200,,TRUE); + SendMsg(task,MSG_IP_L_DOWN,0,0); + SetIP(GR_WIDTH-200,200,,TRUE); + SendMsg(task,MSG_IP_L_UP,0,0); + + SetIP(200,200,,TRUE); + SendMsg(task,MSG_IP_L_DOWN,0,0); + SetIP(GR_WIDTH/2,400,,TRUE); + SendMsg(task,MSG_IP_L_UP,0,0); + + SetIP(GR_WIDTH-200,200,,TRUE); + SendMsg(task,MSG_IP_L_DOWN,0,0); + SetIP(GR_WIDTH/2,400,,TRUE); + SendMsg(task,MSG_IP_L_UP,0,0); + + SetIP(GR_WIDTH/2,GR_HEIGHT/2,,TRUE); + SendMsg(task,MSG_IP_L_DOWN,0,0); + SetIP(GR_WIDTH-200,200,,TRUE); + SendMsg(task,MSG_IP_L_UP,0,0); + + SetIP(GR_WIDTH/2,GR_HEIGHT/2,,TRUE); + SendMsg(task,MSG_IP_L_DOWN,0,0); + SetIP(GR_WIDTH/2,400,,TRUE); + SendMsg(task,MSG_IP_L_UP,0,0); + + SetIP(GR_WIDTH/2,GR_HEIGHT/2,,TRUE); + SendMsg(task,MSG_IP_L_DOWN,0,0); + SetIP(200,200,,TRUE); + SendMsg(task,MSG_IP_L_UP,0,0); + + SendMsg(task,MSG_KEY_DOWN_UP,'t',0); + + SetIP(GR_WIDTH/2,400,,TRUE); + SendMsg(task,MSG_IP_L_DOWN,0,0); + SetIP(GR_WIDTH-200,200,,TRUE); + SendMsg(task,MSG_IP_L_UP,0,0); + + SetIP(GR_WIDTH/2,400,,TRUE); + SendMsg(task,MSG_IP_L_DOWN,0,0); + SetIP(200,200,,TRUE); + SendMsg(task,MSG_IP_L_UP,0,0); + + SetIP(,,,FALSE); + + SendMsg(task,MSG_KEY_DOWN_UP,CH_SPACE,0); + LBts(key_down_bitmap,A2ScanCode('1')); + Sleep(600); + LBtr(key_down_bitmap,A2ScanCode('1')); + SendMsg(task,MSG_KEY_DOWN_UP,'Z',0); + Sleep(200); + SendMsg(task,MSG_KEY_DOWN_UP,'Z',0); + Sleep(200); + SendMsg(task,MSG_KEY_DOWN_UP,'Z',0); + Sleep(200); + + SendMsg(task,MSG_KEY_DOWN_UP,CH_SHIFT_ESC,0); + XTalk(task,"Exit;\n"); +} + U0 DoRawHide() { CTask *task=SpawnUser; - XTalk(task,"#include \"::/TempleOS/Demo/GameStarters/RawHide\";\n"); + XTalk(task,"#include \"::/TempleOS/Demo/Games/RawHide\";\n"); while (!TaskValidate(task->popup_task)) Yield; TaskWait(task->popup_task); @@ -1416,7 +1265,7 @@ U0 DoPoleZeros() U0 DoWhap() { CTask *task=SpawnUser; - XTalkWait(task,"#include \"::/TempleOS/Demo/GameStarters/Whap\";\n"); + XTalkWait(task,"#include \"::/TempleOS/Demo/Games/Whap\";\n"); SetIP(300,200); Sleep(500); AFSetIP(3,350,300); @@ -1455,25 +1304,24 @@ U0 DoPick3D() XTalk(task,"Exit;\n"); } +U0 DoTransform() +{ + CTask *task=SpawnUser; + XTalkWait(task,"#include \"::/TempleOS/Demo/Graphics/Transform\";\n"); + Sleep(750); + SendMsg(task,MSG_KEY_DOWN_UP,CH_SHIFT_ESC,0); + XTalk(task,"Exit;\n"); +} + /* U0 Do() { CTask *task=SpawnUser; - XTalkWait(task,"#include \"::/TempleOS/Demo/Graphics/Transform\";\n"); + XTalkWait(task,"#include \"::/TempleOS/Apps/ToTheFront\";\n"); Sleep(500); SendMsg(task,MSG_KEY_DOWN_UP,CH_SPACE,0); XTalk(task,"Exit;\n"); } - -U0 Do() -{ - CTask *task=SpawnUser; - XTalkWait(task,"#include \"::/TempleOS/Apps/Tanks\";\n"); - Sleep(500); - SendMsg(task,MSG_KEY_DOWN_UP,CH_SPACE,0); - XTalk(task,"Exit;\n"); -} - */ U0 DoGrModels() @@ -1514,19 +1362,10 @@ U0 DoKeepAway() XTalk(task,"Exit;\n"); } -U0 DoCamp() -{ - CTask *task=SpawnUser; - XTalkWait(task,"#include \"::/TempleOS/Demo/Graphics/Camp\";\n"); - Sleep(1250); - SendMsg(task,MSG_KEY_DOWN_UP,CH_SPACE,0); - XTalk(task,"Exit;\n"); -} - U0 DoRocket() { CTask *task=SpawnUser; - XTalkWait(task,"#include \"::/TempleOS/Demo/GameStarters/Rocket\";\n"); + XTalkWait(task,"#include \"::/TempleOS/Demo/Games/Rocket\";\n"); SendMsg(task,MSG_KEY_DOWN_UP,0,SC_CURSOR_UP); Bts(key_down_bitmap,SC_CURSOR_UP); Sleep(1000); @@ -1543,7 +1382,7 @@ U0 DoRocket() U0 DoRocketScience() { CTask *task=SpawnUser; - XTalk(task,"#include \"::/TempleOS/Demo/GameStarters/RocketScience\";\n"); + XTalk(task,"#include \"::/TempleOS/Demo/Games/RocketScience\";\n"); while (!TaskValidate(task->popup_task)) Yield; TaskWait(task->popup_task); @@ -1559,7 +1398,7 @@ U0 DoRocketScience() U0 DoMassSpring() { CTask *task=SpawnUser; - XTalk(task,"#include \"::/TempleOS/Demo/GameStarters/MassSpring\";\n"); + XTalk(task,"#include \"::/TempleOS/Demo/Games/MassSpring\";\n"); while (!TaskValidate(task->popup_task)) Yield; TaskWait(task->popup_task); @@ -1591,7 +1430,7 @@ U0 DoMassSpring() U0 Do() { CTask *task=SpawnUser; - XTalkWait(task,"#include \"::/TempleOS/Demo/GameStarters/Whap\";\n"); + XTalkWait(task,"#include \"::/TempleOS/Demo/Games/Whap\";\n"); Sleep(500); SendMsg(task,MSG_KEY_DOWN_UP,CH_SPACE,0); XTalk(task,"Exit;\n"); @@ -1602,7 +1441,7 @@ U0 DoSquirt() { I64 i; CTask *task=SpawnUser; - XTalkWait(task,"#include \"::/TempleOS/Demo/GameStarters/Squirt\";\n"); + XTalkWait(task,"#include \"::/TempleOS/Demo/Games/Squirt\";\n"); for (i=0;i<5;i++) { SendMsg(task,MSG_KEY_DOWN_UP,0,SC_CURSOR_UP); Sleep(100); @@ -1647,13 +1486,7 @@ U0 DoFPS() { I64 i; CTask *task=SpawnUser; - XTalk(task,"#include \"::/TempleOS/Demo/GameStarters/FPS\";\n"); - while (!TaskValidate(task->popup_task)) - Yield; - TaskWait(task->popup_task); - SendMsg(task->popup_task,MSG_KEY_DOWN_UP,CH_SPACE,0); - while (TaskValidate(task->popup_task)) - Yield; + XTalkWait(task,"#include \"::/TempleOS/Demo/Games/CastleFrankenstein\";\n"); for (i=0;i<15;i++) { SendMsg(task,MSG_KEY_DOWN_UP,0,SC_CURSOR_UP); Sleep(50); @@ -1678,7 +1511,7 @@ U0 DoEagleDive() { I64 i; CTask *task=SpawnUser; - XTalkWait(task,"Cd(\"::/TempleOS/Demo/GameStarters\");Del(\"EagleDive.BIN.Z\");\n"); + XTalkWait(task,"Cd(\"::/TempleOS/Demo/Games\");Del(\"EagleDive.BIN.Z\");\n"); XTalkWait(task,"Cmp(\"EagleDive.CPP\");\n"); Sleep(500); XTalkWait(task,"Load(\"EagleDive\");\n"); @@ -1691,20 +1524,11 @@ U0 DoEagleDive() Sleep(50); } SendMsg(task,MSG_KEY_DOWN_UP,CH_SHIFT_ESC,0); - XTalkWait(task,"Del(\"::/TempleOS/Demo/GameStarters/EagleDive.BIN.Z\");\n"); + XTalkWait(task,"Del(\"::/TempleOS/Demo/Games/EagleDive.BIN.Z\");\n"); XTalk(task,"Exit;\n"); } /* -U0 Do() -{ - CTask *task=SpawnUser; - XTalkWait(task,"#include \"::/TempleOS/Apps/Span\";\n"); - Sleep(500); - SendMsg(task,MSG_KEY_DOWN_UP,CH_SPACE,0); - XTalk(task,"Exit;\n"); -} - U0 Do() { CTask *task=SpawnUser; @@ -2084,14 +1908,6 @@ U0 DoCallBack() XTalk(task,"Exit;\n"); } -U0 DoCallBackAux2() -{ - CTask *task=SpawnUser; - XTalkWait(task,"#include \"::/TempleOS/Demo/Doc/CallBackAux2\";\n"); - Sleep(1500); - XTalk(task,"Exit;\n"); -} - U0 DoDefine() { CTask *task=SpawnUser; @@ -2162,6 +1978,14 @@ U0 DoDivByHand() XTalk(task,"Exit;\n"); } +U0 DoPutDec() +{ + CTask *task=SpawnUser; + XTalkWait(task,"#include \"::/TempleOS/Demo/Asm/PutDec\";\n"); + Sleep(1000); + XTalk(task,"Exit;\n"); +} + U0 DoGlblVars() { CTask *task=SpawnUser; @@ -2170,235 +1994,164 @@ U0 DoGlblVars() XTalk(task,"Exit;\n"); } -/* -U0 Do() -{ - CTask *task=SpawnUser; - XTalkWait(task,"#include \"::/TempleOS/Demo/WinMgr2\";\n"); - Sleep(500); - SendMsg(task,MSG_KEY_DOWN_UP,CH_SPACE,0); - XTalk(task,"Exit;\n"); -} - -U0 Do() -{ - CTask *task=SpawnUser; - XTalkWait(task,"#include \"::/TempleOS/Demo/Snd/PolyPhonic\";\n"); - Sleep(500); - SendMsg(task,MSG_KEY_DOWN_UP,CH_SPACE,0); - XTalk(task,"Exit;\n"); -} - -U0 Do() -{ - CTask *task=SpawnUser; - XTalkWait(task,"#include \"::/TempleOS/Demo/Snd/SndScope\";\n"); - Sleep(500); - SendMsg(task,MSG_KEY_DOWN_UP,CH_SPACE,0); - XTalk(task,"Exit;\n"); -} - -U0 Do() -{ - CTask *task=SpawnUser; - XTalkWait(task,"#include \"::/TempleOS/Demo/Snd/Synth\";\n"); - Sleep(500); - SendMsg(task,MSG_KEY_DOWN_UP,CH_SPACE,0); - XTalk(task,"Exit;\n"); -} - -U0 Do() -{ - CTask *task=SpawnUser; - XTalkWait(task,"#include \"::/TempleOS/Demo/Snd/Record\";\n"); - Sleep(500); - SendMsg(task,MSG_KEY_DOWN_UP,CH_SPACE,0); - XTalk(task,"Exit;\n"); -} - -U0 Do() -{ - CTask *task=SpawnUser; - XTalkWait(task,"#include \"::/TempleOS/Demo/Snd/Echo\";\n"); - Sleep(500); - SendMsg(task,MSG_KEY_DOWN_UP,CH_SPACE,0); - XTalk(task,"Exit;\n"); -} -*/ - - U0 DoReps() { CTask *task=SpawnUser; -TS; XTalkWait(task,"DocMax;ProfAll;HeapLog(ON);\n"); -TS; XTalkWait(task,"PCIRep;Sleep(1000);\n"); -TS; XTalkWait(task,"MemBIOSRep;Sleep(1000);\n"); -TS; XTalkWait(task,"MemRep;Sleep(1000);\n"); -TS; XTalkWait(task,"ProfRep;Sleep(1000);\n"); -TS; XTalkWait(task,"HeapLogRep; HeapLog(OFF);Sleep(1000);\n"); -TS; XTalkWait(task,"BlkDevRep;Sleep(1000);\n"); -TS; XTalkWait(task,"ChkDsk;Sleep(1000);\n"); -TS; XTalkWait(task,"DrvView;\n"); + TS; XTalkWait(task,"DocMax;ProfAll;HeapLog(ON);\n"); + TS; XTalkWait(task,"PCIRep;Sleep(1000);\n"); + TS; XTalkWait(task,"MemBIOSRep;Sleep(1000);\n"); + TS; XTalkWait(task,"MemRep;Sleep(1000);\n"); + TS; XTalkWait(task,"ProfRep;Sleep(1000);\n"); + TS; XTalkWait(task,"HeapLogRep; HeapLog(OFF);Sleep(1000);\n"); + TS; XTalkWait(task,"BlkDevRep;Sleep(1000);\n"); + TS; XTalkWait(task,"ChkDsk;Sleep(1000);\n"); + TS; XTalkWait(task,"DrvView;\n"); Sleep(1500); SendMsg(task,MSG_KEY_DOWN_UP,CH_SPACE,0); XTalkWait(task,"DskView;\n"); Sleep(1500); SendMsg(task,MSG_KEY_DOWN_UP,CH_SPACE,0); -TS; XTalkWait(task,"ATARep;\npSleep(1000);\n"); -TS; XTalkWait(task,"HashDepthRep(adam_task->hash_table);Sleep(1000);\n"); -TS; XTalkWait(task,"HAllRep;Sleep(1000);\n"); -TS; XTalkWait(task,"PrtRep;Sleep(1000);\n"); -TS; XTalkWait(task,"TaskRep;Sleep(1000);\n"); + TS; XTalkWait(task,"ATARep;\npSleep(1000);\n"); + TS; XTalkWait(task,"HashDepthRep(adam_task->hash_table);Sleep(1000);\n"); + TS; XTalkWait(task,"HAllRep;Sleep(1000);\n"); + TS; XTalkWait(task,"PrtRep;Sleep(1000);\n"); + TS; XTalkWait(task,"TaskRep;Sleep(1000);\n"); XTalk(task,"Exit;\n"); } U0 OSTestSuite() { -TSStart; -TS; DoSpaceShip; -TS; DoBlackDiamond; -TS; if (IsDrvWritable(':')) DoEagleDive; -TS; DoRocks; -TS; DoNavy; -TS; DoDunGen; -TS; DoFPS; -TS; DoZoneOut; -TS; DoVaroom; -TS; DoRocket; -TS; DoRocketScience; -TS; DoMissileDefense; -TS; DoWarGame; -TS; DoBigGuns; -TS; DoBirdLand; -TS; DoTimeOut; -TS; DoPilgrims; -TS; if (!sys_heap_init_flag) /* FloodFill */ DoSpan; -TS; DoRawHide; -TS; DoKeepAway; -TS; DoAfterEgypt; -TS; DoXCaliber; -TS; DoWenceslas; -TS; DoBomber; -TS; DoTheDead; -TS; DoChess; -TS; DoChessNet; -TS; DoMPAdd; -TS; DoPrimes; -TS; DoPalindrome; -TS; DoClouds; -TS; DoNoise; -TS; if (mp_cnt>1) DoRadixSort; -TS; if (mp_cnt>1) DoLoadTest; -TS; if (mp_cnt>1) DoMPPrintF; -TS; if (mp_cnt>1) DoLayers3DJob; -TS; if (mp_cnt>1) DoLock; -TS; if (mp_cnt>1) DoLayersSpawn; -TS; if (mp_cnt>1) DoInterrupts; -TS; if (mp_cnt>1) DoSort; -TS; DoSpritePlot; -TS; DoSpritePlot3D; -TS; DoSpritePut; -TS; DoSpritePutExt; -TS; DoSpriteText; -TS; DoEdCSprite; -TS; DoExtents; -TS; DoDotNet; -TS; DoLowPassFilter; -TS; DoMathAudioDemo; -TS; DoLines; -TS; if (!IsSysDeterministic) DoBounce; -TS; DoMsgLoop; -TS; DoASCIIOrgan; -TS; DoMorseCode; -TS; DoDoodle; -TS; DoMassSpring; -TS; DoSpeedLine; -TS; DoKeyBitMap; -TS; DoGolf; -TS; DoMountain; -TS; DoCoach; -TS; DoCPUPlot; -TS; DoDither; -TS; DoBSpline; -TS; DoGrModels; -TS; DoBlot; -TS; if (IsDrvWritable(':')) DoCaptureScreen; -TS; DoPick; -TS; DoPick3D; -TS; DoWhap; -TS; DoPalette; -TS; DoPrintF; -TS; DoCamp; -TS; DoShading; -TS; DoRotateTank; -TS; Do3DPoly; -TS; DoBox; -TS; DoSymmetry; -TS; DoShadow; -TS; DoPredatorPrey; -TS; DoPoleZeros; -TS; DoDateTime; -TS; DoDigits; -TS; DoStadium; -TS; DoHalogen; -TS; DoMaze; -TS; DoFontEd; -TS; DoCtrlR1; -TS; DoLogo; -TS; DoSubIntAccess; -TS; DoDemoDoc; -TS; DoTreeDemo; -TS; DoTextDemo; -TS; DoCursorMove; -TS; DoMiniCompiler; -TS; DoMiniGrLib; -TS; DoPhoneNumWords; -TS; DoUnusedSpaceRep; -TS; DoExceptions; -TS; DoScreenCodes; -TS; DoExtendedChars; -TS; DoNeatTrick; -TS; DoCharGraphics; -TS; DoMagicPairs; -TS; DoHanoi; -TS; DoSquirt; -TS; DoFlowers; -TS; DoCommonAncestor; -TS; DoCartesian; -TS; DoBling; -TS; DoRainDrops; -TS; DoCollision; -TS; DoOrderedIO; -TS; DoLogic; -TS; DoCircuit; -TS; DoCompileDemo; -TS; DoPrompt; -TS; if (IsDrvWritable(':')) DoWebLog; -TS; DoDefine; -TS; DoGlblVars; -TS; DoFileRead; -TS; DoParenWarn; -TS; DoDefineStr; -TS; DoData; -TS; DoCallBack; -TS; DoCallBackAux2; -TS; DoClassMeta; -TS; DoForm; -TS; DoMenuButton; -TS; DoMenuSprite; -TS; DoSuggestedSpelling; -TS; DoWordSearch; -TS; DoStkGrow; -TS; DoWaterFowl; -TS; DoAsmHelloWorld; -TS; DoAsmAndC; -TS; DoAsmAndC2; -TS; DoMulByHand; -TS; DoDivByHand; -TS; DoBuzzFizz; -TS; DoPageTableEntries2; -DoReps; -TSEnd; + TSStart; + TS; DoBlackDiamond; + TS; if (IsDrvWritable(':')) DoEagleDive; + TS; DoFlatTops; + TS; DoDunGen; + TS; DoFPS; + TS; DoZoneOut; + TS; DoVaroom; + TS; DoRocket; + TS; DoRocketScience; + TS; DoBattleLines; + TS; DoBigGuns; + TS; DoBugFlapper; + TS; DoTimeOut; + TS; if (!sys_heap_init_flag) /* FloodFill */ DoSpan; + TS; DoStrut; + TS; DoRawHide; + TS; DoKeepAway; + TS; DoAfterEgypt; + TS; DoXCaliber; + TS; DoWenceslas; + TS; DoBulgeBomber; + TS; DoTheDead; + TS; DoChessNet; + TS; DoMPAdd; + TS; DoPrimes; + TS; DoPalindrome; + TS; DoClouds; + TS; if (mp_cnt>1) DoRadixSort; + TS; if (mp_cnt>1) DoLoadTest; + TS; if (mp_cnt>1) DoMPPrintF; + TS; if (mp_cnt>1) DoLock; + TS; if (mp_cnt>1) DoInterrupts; + TS; DoSpritePlot; + TS; DoSpritePlot3D; + TS; DoSpritePut; + TS; DoSpritePutExt; + TS; DoSpriteText; + TS; DoEdCSprite; + TS; DoExtents; + TS; DoDotNet; + TS; DoLowPassFilter; + TS; DoMathAudioDemo; + TS; DoLines; + TS; if (!IsSysDeterministic) DoBounce; + TS; DoMsgLoop; + TS; DoASCIIOrgan; + TS; DoMorseCode; + TS; DoDoodle; + TS; DoMassSpring; + TS; DoSpeedLine; + TS; DoKeyBitMap; + TS; DoMountain; + TS; DoCoach; + TS; DoDither; + TS; DoBSpline; + TS; DoGrModels; + TS; DoBlot; + TS; if (IsDrvWritable(':')) DoCaptureScreen; + TS; DoPick; + TS; DoPick3D; + TS; DoWhap; + TS; DoPalette; + TS; DoPrintF; + TS; DoShading; + TS; DoRotateTank; + TS; Do3DPoly; + TS; DoBox; + TS; DoSymmetry; + TS; DoShadow; + TS; DoTransform; + TS; DoPredatorPrey; + TS; DoPoleZeros; + TS; DoDateTime; + TS; DoDigits; + TS; DoStadium; + TS; DoHalogen; + TS; DoMaze; + TS; DoFontEd; + TS; DoCtrlR1; + TS; DoLogo; + TS; DoSubIntAccess; + TS; DoDemoDoc; + TS; DoTreeDemo; + TS; DoTextDemo; + TS; DoCursorMove; + TS; DoMiniCompiler; + TS; DoMiniGrLib; + TS; DoPhoneNumWords; + TS; DoUnusedSpaceRep; + TS; DoExceptions; + TS; DoScreenCodes; + TS; DoExtendedChars; + TS; DoCharGraphics; + TS; DoMagicPairs; + TS; DoHanoi; + TS; DoSquirt; + TS; DoCommonAncestor; + TS; DoCartesian; + TS; DoRainDrops; + TS; DoCollision; + TS; DoOrderedIO; + TS; DoLogic; + TS; DoCompileDemo; + TS; DoPrompt; + TS; if (IsDrvWritable(':')) DoWebLog; + TS; DoDefine; + TS; DoGlblVars; + TS; DoFileRead; + TS; DoParenWarn; + TS; DoDefineStr; + TS; DoData; + TS; DoCallBack; + TS; DoClassMeta; + TS; DoForm; + TS; DoMenuButton; + TS; DoMenuSprite; + TS; DoSuggestedSpelling; + TS; DoWordSearch; + TS; DoStkGrow; + TS; DoWaterFowl; + TS; DoAsmHelloWorld; + TS; DoAsmAndC; + TS; DoAsmAndC2; + TS; DoMulByHand; + TS; DoDivByHand; + TS; DoBuzzFizz; + TS; DoPutDec; + TS; DoPageTableEntries2; + DoReps; + TSEnd; } OSTestSuite; diff --git a/TempleOS/Misc/Tour/Tour.AUT b/TempleOS/Misc/Tour/Tour.AUT index 107a2c8..d4e2cff 100644 --- a/TempleOS/Misc/Tour/Tour.AUT +++ b/TempleOS/Misc/Tour/Tour.AUT @@ -5,7 +5,7 @@ public I64 PopUpTourPart() DocPutS(doc,"$$FG,PURPLE$$TempleOS Tours$$FG$$\n\n" "$$CM+LX,4,4$$$$BT,\"Part 1: The basics\",1$$" "$$CM+LX,4,4$$$$BT,\"Part 2: Editing and running programs\",2$$" - "$$CM+LX,4,4$$$$BT,\"Part 3: Adding macros to your personal menu\",3$$" + "$$CM+LX,4,4$$$$BT,\"Part 3: Adding macros to personal menu\",3$$" "$$CM+LX,4,4$$$$BT,\"Part 4: Choose filename, choose dir\",4$$" "$$CM+LX,4,4$$$$BT,\"Part 5: WordStat\",5$$" "$$CM+LX,4,4$$$$BT,\"Part 6: Search (Grep)\",6$$" @@ -15,7 +15,7 @@ public I64 PopUpTourPart() "$$CM+LX,4,4$$$$BT,\"Part 10: Test Suite\",10$$" "$$CM+LX,4,4$$$$BT,\"Done\",DOCM_CANCEL$$\n"); doc->flags|=DOCF_FORM; - i=ServantUser("WinMax;DocMenuDo(0x%X,0);",doc); + i=SrvUser("WinMax;DocMenuDo(0x%X,0);",doc); DocDel(doc); return i; } @@ -35,5 +35,7 @@ U0 TourMenu() } "DocClear;WinMax;\n"; +WinMgrSync(2); TourMenu; -"Cd(\"HOME\");\n"; +Msg(MSG_KEY_DOWN,0,SC_CURSOR_DOWN|SCF_CTRL); +"Cd(\"HOME\");Dir;\n"; diff --git a/TempleOS/Misc/Tour/Tour1.AUT b/TempleOS/Misc/Tour/Tour1.AUT index 65ad2e7..2981e52 100644 --- a/TempleOS/Misc/Tour/Tour1.AUT +++ b/TempleOS/Misc/Tour/Tour1.AUT @@ -23,7 +23,7 @@ PopUpOk( "Press $$FG,GREEN$$$$FG$$.\n\n" "This will access your personal menu.\n" "You can customize it. It's like your\n" -"START menu.\n"); +"START menu and desktop.\n"); AFGetChar(CH_CTRLM); Sleep(1000); @@ -32,27 +32,6 @@ PopUpOk( "by clicking on the word \"$$FG,GREEN$$MENU$$FG$$\" in the\n" "title bar.\n"); -PopUpOk( -"$$FG,LTPURPLE$$Keyboard$$FG$$\n" -"$$UL,1$$$$FG,LTBLUE$$Blue Underlined Text are Macros$$FG$$$$UL,0$$\n" -"\t$$FG,GREEN$$$$FG$$\tExecute Macro\n" -"$$UL,1$$$$FG,LTRED$$Red Underlined Text are Links$$FG$$$$UL,0$$\n" -"\t$$FG,GREEN$$$$FG$$\tEdit (view)\n" -"\t$$FG,GREEN$$$$FG$$\t\tRight-click menu\n\n" -"\t$$FG,GREEN$$$$FG$$\t\tSave and exit\n" -"\t$$FG,GREEN$$$$FG$$\tAbort\n" -"\n" -"$$FG,LTPURPLE$$Mouse$$FG$$\n" -"$$UL,1$$$$FG,LTBLUE$$Blue Underlined Text are Macros$$FG$$$$UL,0$$\n" -"\t$$FG,GREEN$$Left-Click$$FG$$\tExecute Macro\n" -"$$UL,1$$$$FG,LTRED$$Red Underlined Text are Links$$FG$$$$UL,0$$\n" -"\t$$FG,GREEN$$Left-Click$$FG$$\tEdit (view)\n" -"\t$$FG,GREEN$$Right-Click$$FG$$\tRight-click menu\n\n" -"\t$$FG,GREEN$$Double-Left$$FG$$\tSave and exit\n" -"\t$$FG,GREEN$$Double-Right$$FG$$\tAbort\n" -"\n" -); - PopUpOk( "After clicking $$FG,GREEN$$[OKAY]$$FG$$, you will be back at\n" "the personal menu.\n\n" @@ -65,6 +44,14 @@ I64 i; for (i=0;i<9;i++) AFGetKey(SC_CURSOR_DOWN); +PopUpOk( +"Keyboard commands are:\n\n" +"$$FG,GREEN$$$$FG$$\tLeft-action\n" +"$$FG,GREEN$$$$FG$$\t\tRight-action\n" +"$$FG,GREEN$$$$FG$$\t\tSave and exit\n" +"$$FG,GREEN$$$$FG$$\tAbort\n" +); + PopUpOk( "After clicking $$FG,GREEN$$[OKAY]$$FG$$, the cursor will be\n" "on top of a macro we wish to run.\n" @@ -89,12 +76,13 @@ PopUpOk( "different from the personal menu.\n" "Both use the same commands and have the same\n" "'widgets' available.\n\n" -"Both utilize the same underlying document format.\n" -"It is similar to $$FG,GREEN$$html$$FG$$ because it has ASCII\n" -"behind it. TempleOS documents can include graphics.\n\n" +"Both utilize the same underlying document\n" +"format. It is similar to $$FG,GREEN$$html$$FG$$ because\n" +"it has ASCII behind it. TempleOS documents\n" +"can include graphics.\n\n" "\"$$FG,GREEN$$$$FG$$\" after clicking $$FG,GREEN$$[OKAY]$$FG$$ to toggle\n" "to plain text mode.\n"); -AFGetChar(20); +AFGetChar(CH_CTRLT); Sleep(1000); PopUpOk( @@ -103,6 +91,7 @@ PopUpOk( "stands for \"macro\".\n\n" "Now, \"$$FG,GREEN$$$$FG$$\" to toggle back to\n" "regular mode.\n"); -AFGetChar(20); +AFGetChar(CH_CTRLT); +Msg(MSG_KEY_DOWN,0,SC_CURSOR_DOWN|SCF_CTRL); Sleep(1000); diff --git a/TempleOS/Misc/Tour/Tour2.AUT b/TempleOS/Misc/Tour/Tour2.AUT index 2ef4759..7efc540 100644 --- a/TempleOS/Misc/Tour/Tour2.AUT +++ b/TempleOS/Misc/Tour/Tour2.AUT @@ -4,15 +4,15 @@ Msg(MSG_KEY_DOWN,0,SC_CURSOR_DOWN|SCF_CTRL); PopUpOk( "Now, we're going to demonstrate how to work\n" -"with programs. We'll change to the $$FG,GREEN$$/TempleOS/Demo/Snd$$FG$$ \n" -"directory.\n\n" +"with programs. We'll change to the\n" +"$$FG,GREEN$$/TempleOS/Demo/Games$$FG$$ directory.\n\n" "Note, that directories are specified with\n" "a forward slash, not a backslash.\n" "Drives can be specified in a $$FG,GREEN$$Cd()$$FG$$ command\n" "and the boot drive is specified with \"$$FG,GREEN$$::$$FG$$\".\n\n" "$$FG,GREEN$$$$FG$$ to complete the command.\n"); -AFDelayedPutS("Cd(\"::/TempleOS/Demo/Snd\");Dir;",25); +AFDelayedPutS("Cd(\"::/TempleOS/Demo/Games\");Dir;",25); AFPmtStr("\n"); PopUpOk( @@ -22,53 +22,48 @@ PopUpOk( "type it on the command line.\n\n" "$$FG,GREEN$$$$FG$$ to complete the command.\n"); -AFDelayedPutS("Ed(\"ASCIIOrgan.CPP.Z\");",25); +AFDelayedPutS("Ed(\"CastleFrankenstein.CPP.Z\");",25); AFPmtStr("\n"); +Msg(MSG_KEY_DOWN_UP,0,SC_CURSOR_UP|SCF_CTRL); Sleep(1000); +Msg(MSG_KEY_DOWN_UP,0,SC_CURSOR_DOWN|SCF_CTRL); PopUpOk( -"This program gets keys and plays frequencies.\n" +"This is a first-person-shooter.\n" "It quits when you press $$FG,GREEN$$$$FG$$.\n\n" "There is no \"$$FG,GREEN$$main()$$FG$$\" function in TempleOS\n" "programs. Any program statements outside\n" "functions get executed when you $$FG,GREEN$$#include$$FG$$\n" "them at the command line.\n\n" -"The \"$$FG,GREEN$$ASCIIOrgan;$$FG$$\" statement at the bottom\n" -"will run the program when we $$FG,GREEN$$#include$$FG$$ it.\n"); +"The \"$$FG,GREEN$$CastleFrankenstein;$$FG$$\" statement at the\n" +"bottom will run the program when we\n" +"$$FG,GREEN$$#include$$FG$$ it.\n"); + PopUpOk( -"The editor and most things exit when you press\n" -"$$FG,GREEN$$$$FG$$. $$FG,GREEN$$$$FG$$ will abort (cancel) most things.\n\n" -"The $$FG,GREEN$$$$FG$$ key can be simulated with a left\n" -"double-click, while the $$FG,GREEN$$$$FG$$ key can be\n" -"simulated with a right double-click. When\n" -"you browse documentation, you'll left-click\n" -"on links and right double-click to go back,\n" -"unless you want to save changes to documents\n" -"using left double-click.\n\n" "$$FG,GREEN$$$$FG$$ to abort the editor.\n" ); AFGetChar(CH_SHIFT_ESC,CH_ESC); PopUpOk( -"Now, we'll run the ASCIIOrgan.CPP.Z program.\n" -"$$FG,GREEN$$$$FG$$ at the command line to\n" -"$$FG,GREEN$$#include$$FG$$ it. Then press keys to\n" -"cause sounds and $$FG,GREEN$$$$FG$$ when\n" -"you are done.\n"); +"Now, we'll run the CastleFrankenstein.CPP.Z\n" +"program. Press $$FG,GREEN$$$$FG$$. Then, move around\n" +"with cursor keys and $$FG,GREEN$$$$FG$$\n" +"when you are done.\n"); -AFDelayedPutS("#include \"ASCIIOrgan\";",25); +AFDelayedPutS("#include \"CastleFrankenstein\";",25); AFPmtStr("\n"); AFUntilChar(CH_SHIFT_ESC,CH_ESC); PopUpOk( "The program is still in memory and we\n" -"can start it again by typing \"$$FG,GREEN$$ASCIIOrgan;$$FG$$\".\n\n" +"can start it again by typing\n" +"\"$$FG,GREEN$$CastleFrankenstein;$$FG$$\".\n\n" "$$FG,GREEN$$$$FG$$ at the command line to\n" "run it again.\n"); -AFDelayedPutS("ASCIIOrgan;",25); +AFDelayedPutS("CastleFrankenstein;",25); AFPmtStr("\n"); AFUntilChar(CH_SHIFT_ESC,CH_ESC); @@ -79,20 +74,14 @@ PopUpOk( "$$FG,GREEN$$$$FG$$\tEnter debugger\n" "$$FG,GREEN$$$$FG$$\tSpawn new user terminal window\n" "$$FG,GREEN$$$$FG$$\tFlush screen VGA cache\n" -"$$FG,GREEN$$$$FG$$\tEnter debugger\n" "$$FG,GREEN$$$$FG$$\tMutes sound\n" "$$FG,GREEN$$$$FG$$\tSwitch tasks\n" -"$$FG,GREEN$$$$FG$$\tSound volume +\n" -"$$FG,GREEN$$$$FG$$\tSound volume -\n" "$$FG,GREEN$$$$FG$$\tKill task (window)\n" ); -AFDelayedPutS("Ed(\"ASCIIOrgan.CPP.Z\");\n",50); +AFDelayedPutS("Ed(\"CastleFrankenstein.CPP.Z\");\n",50); PopUpOk( -"$$FG,GREEN$$$$FG$$\t\t'#include' the current file link\n" -"or the file you are currently editing.\n" -"$$FG,GREEN$$$$FG$$\t'Adam Include' the current file.\n\n\n" "$$FG,GREEN$$$$FG$$ in the editor to run the file being edited.\n" ); @@ -114,9 +103,8 @@ PopUpOk( AFUntilChar(CH_SHIFT_ESC,CH_ESC); PopUpOk( -"Explore the $$LK,\"DemoIndex\",\"FI:::/TempleOS/Doc/DemoIndex.TXT\"$$.\n" -"You'll find it on your menu.\n" -"It's arranged by increasing difficulty.\n" +"Explore the $$LK+PU,\"DemoIndex\",\"FI:::/TempleOS/Doc/DemoIndex.TXT\"$$. You'll find it\n" +"on your menu. It's arranged by difficulty.\n" "Hit $$FG,GREEN$$$$FG$$ on a demo index listing\n" "and $$FG,GREEN$$$$FG$$ to run from the editor.\n" ); diff --git a/TempleOS/Misc/Tour/Tour3.AUT b/TempleOS/Misc/Tour/Tour3.AUT index 2d51542..b54ca86 100644 --- a/TempleOS/Misc/Tour/Tour3.AUT +++ b/TempleOS/Misc/Tour/Tour3.AUT @@ -1,10 +1,11 @@ //This puts the cursor at the bottom Msg(MSG_KEY_DOWN,0,SC_CURSOR_DOWN|SCF_CTRL); -"\nCd(\"::/TempleOS/Demo/Snd\");Dir;\n"; +"\nCd(\"::/TempleOS/Demo/Games\");Dir;\n"; PopUpOk( -"Now, we're going to add the ASCIIOrgan.CPP.Z\n" -"program to your personal menu.\n\n" +"Now, we're going to add the\n" +"CastleFrankenstein.CPP.Z program\n" +"to your personal menu.\n\n" "Press $$FG,GREEN$$$$FG$$\n" "to get to your personal menu.\n"); AFGetChar(CH_CTRLM); @@ -41,7 +42,7 @@ AFDelayedPutS("Click Here"); Msg(MSG_KEY_DOWN,0,SC_CURSOR_DOWN); PopUpOk("Now, we'll fill-in the macro text.\n"); -AFDelayedPutS("Cd(\"::/TempleOS/Demo/Snd\");;#include \"ASCIIOrgan\";\\n"); +AFDelayedPutS("Cd(\"::/TempleOS/Demo/Games\");;#include \"CastleFrankenstein\";\\n"); PopUpOk("$$FG,GREEN$$$$FG$$ to exit the form.\n"); AFGetChar(CH_ESC); @@ -51,7 +52,7 @@ PopUpOk( "Press $$FG,GREEN$$$$FG$$ to insert a line feed.\n" "($$FG,GREEN$$$$FG$$ does a page break and $$FG,GREEN$$$$FG$$\n" "would execute the macro.)\n"); -AFGetKey(SC_CARRIAGE_RETURN|SCF_CTRL|SCF_SHIFT); +AFGetKey(SC_ENTER|SCF_CTRL|SCF_SHIFT); Sleep(1000); Msg(MSG_KEY_DOWN,0,SC_CURSOR_UP|SCF_CTRL); @@ -71,7 +72,7 @@ for (i=0;i<6;i++) Msg(MSG_KEY_DOWN,0,SC_CURSOR_DOWN); AFDelayedPutS(" Click here for Pop-up version"); Msg(MSG_KEY_DOWN,0,SC_CURSOR_DOWN); -AFDelayedPutS("Cd(\"::/TempleOS/Demo/Snd\");;#include \"ASCIIOrgan\";\\n"); +AFDelayedPutS("Cd(\"::/TempleOS/Demo/Games\");;#include \"CastleFrankenstein\";\\n"); Msg(MSG_KEY_DOWN,0,SC_CURSOR_LEFT|SCF_CTRL); PopUpOk( @@ -90,14 +91,14 @@ AFGetChar(CH_ESC); Sleep(500); PopUpOk("$$FG,GREEN$$$$FG$$ to insert a line feed.\n"); -AFGetKey(SC_CARRIAGE_RETURN|SCF_CTRL|SCF_SHIFT); +AFGetKey(SC_ENTER|SCF_CTRL|SCF_SHIFT); Sleep(500); Msg(MSG_KEY_DOWN,0,SC_CURSOR_UP|SCF_CTRL); PopUpOk( "$$FG,GREEN$$$$FG$$ to test it.\n"); AFPmtStr(" "); -Sleep(5000); +Sleep(3000); PopUpOk( "$$FG,GREEN$$$$FG$$ to save your\n" diff --git a/TempleOS/Misc/Tour/Tour5.AUT b/TempleOS/Misc/Tour/Tour5.AUT index fd0e1b8..9d95cb1 100644 --- a/TempleOS/Misc/Tour/Tour5.AUT +++ b/TempleOS/Misc/Tour/Tour5.AUT @@ -52,7 +52,7 @@ PopUpOk( PopUpOk( "You can also use the $$FG,GREEN$$Man()$$FG$$ function\n" "to jump to source code. (I use WordStat.)\n" -"The $$FG,GREEN$$Man()$$FG$$ is good for short symbols\n" +"The $$FG,GREEN$$Man()$$FG$$ is good for short symbol names\n" "or when inside the debugger.\n"); AFDelayedPutS("Man(\"MakeOSInstallPrtBootLoader\");"); Sleep(1000); diff --git a/TempleOS/Misc/Tour/Tour7.AUT b/TempleOS/Misc/Tour/Tour7.AUT index 6519bc9..10fe231 100644 --- a/TempleOS/Misc/Tour/Tour7.AUT +++ b/TempleOS/Misc/Tour/Tour7.AUT @@ -1,4 +1,4 @@ -"Ed(\"::/TempleOS/Misc/Tour/Tour7.AUT.Z\");\n"; +"Ed(\"::/TempleOS/Misc/Bible.TXT.Z\");\n"; Sleep(1000); PopUpOk( @@ -7,7 +7,7 @@ PopUpOk( AFGetChar(CH_CTRLF); -""; +AFDelayedPutS("new song",150); PopUpOk("Cursor down 8 times.\n"); I64 i; @@ -15,9 +15,9 @@ for (i=0;i<8;i++) AFGetKey(SC_CURSOR_DOWN); PopUpOk( -"Press '$$FG,GREEN$$1$$FG$$' to show\n" -"all lines within 1 of a match.\n"); -AFPmtStr("1"); +"Press '$$FG,GREEN$$2$$FG$$' to show\n" +"all lines within 2 of a match.\n"); +AFPmtStr("2"); Sleep(1000); PopUpOk("Press $$FG,GREEN$$$$FG$$.\n"); diff --git a/TempleOS/ReadMe.TXT b/TempleOS/ReadMe.TXT index 3a364ea..85aac34 100644 --- a/TempleOS/ReadMe.TXT +++ b/TempleOS/ReadMe.TXT @@ -17,4 +17,4 @@ difficult for TempleOS to figure-out port numbers, automatically.) The source code can also be found at the TempleOS web site, http://www.templeos.org but cannot be compiled outside TempleOS because -it's a nonstandard language, a dialect of C/C++ and asm. +it's Holy C, a nonstandard C/C++ dialect, and asm.