ããã«ããç§ã®ååã¯ç§ã«1ã€ã®æçšãªè² è·ãäžããŸããã éžæç倱æã®å±éºæ§ã«ã€ããŠç°¡åã«è©±ãããŸãã圌女ãšäžç·ã«ãããšãç§ãã¡ã®æ¥çã¯å®å
šã«å®å
šã§ã¯ãªãããã§ãã ããã§ã¯ããŸããç§ãã¡ã®å
±éã®æµã§ããå¿ãŸããã倱æãšæŠãåã«ãã³ãã¥ããã£ãå®éã«ã©ãããã¹ããã確å®ã«ç¥ãããã«ãã³ãã¥ããã£ãèŠãªããã®ã®äŸãè°è«ããç ç©¶ããŸãããã
ç©èª
ã ããã1986-89ã ãã¯ã©ãŠã¹ã»ã¯ãŒã¹ãšåœŒã®ååã¯ãã°ã©ãã£ã«ã«ãŠãŒã¶ãŒã€ã³ã¿ãŒãã§ã€ã¹ãã€ã³ã¿ãŒãã§ã€ã¹ã§ããã¹ãã䜿çšããããã®é«åºŠãªæŠå¿µããããŠå
šäœãšããŠN.ã¯ãŒã¹ã®æŠå¿µã®é©çšæ§ã®éèŠãªèšŒæ ã§ãããOberonã·ã¹ãã ã®æåã®ããŒãžã§ã³ããã·ã³ãOberonèšèªã³ã³ãã€ã©ãããã³System Oberonãªãã¬ãŒãã£ã³ã°ã·ã¹ãã ãéçºããŸããã ãã®ãªãã¬ãŒãã£ã³ã°ã·ã¹ãã ã¯ã補åãšèšèªã®é²åçåå²ã®å§ãŸããå°é£ãªéåœã§ããŒã¯ããŸããããããããåå¥ã®èšäºã«å€ããŸãã

ã»ãŒ30幎åŸãITã«ããã補åã®å¶åŸ¡äžèœãªå䜵çã®ç¶æ³ã芳å¯ããN. Wirthã¯ãå°åã§åŒ·åãã€ä¿¡é Œæ§ã®é«ãã·ã¹ãã ãæ§ç¯ããæ¹æ³ã«ã€ããŠã®ããžã§ã³ãããäžåºŠçºè¡šããããšã«ããŸããã èè
ã®ä»äºãã®ãã®ãããã®ãããªã·ã¹ãã ãååšããŠæ©èœããŠãã蚌æ ãšããŠåœ¹ç«ã¡ãŸãã
ãã¹ãŠãæµãããã¹ãŠãå€åãã
倿ããããã«ãå
ã®ã·ã¹ãã ã§äœ¿çšãããŠããããã»ããµã¢ãã«ã¯ãã§ã«åžå Žããå§¿ãæ¶ããŠããŸãã 建ç¯ç©ã®ããã«ã N. Wirthã¯ãæ¢è£œã®åçšãœãªã¥ãŒã·ã§ã³ã䜿çšãã代ããã«ãã·ã¹ãã ãå¥ã®ã³ã³ããŒãã³ãã§ãã
LolaãšããFPGAããã°ã©ãã³ã°èšèªã®ããŒãžã§ã³ã§è£å®ããããšã«ããŸããã ãããã£ãŠãæ°ãããã·ã³ã®ããã»ããµã¯ãRISCã«åºã¥ããŠWirthèªèº«ãéçºããŸããã ããã«ã€ããŠã¯ãèšäºã®å¥ã®ã»ã¯ã·ã§ã³ã§æ€èšããŸãã ã·ã¹ãã å
šäœã¯ã1 MBã®ã¡ã¢ãªãš25 MHzã®ããã»ããµãåããã¶ã€ãªã³ã¯ã¹Spartan-3éçºããŒãã§åäœããŸããã
ã€ãŸãããŒãããã³ã³ãã¥ãŒãã£ã³ã°ã³ã³ãã¬ãã¯ã¹ã®éçºã®ãã«ãµã€ã¯ã«ãå®è£
ããããšã³ãžãã¢/ããã°ã©ããŒãå©çšã§ãããã®ãããžã§ã¯ãã®ãã¹ãŠã®æ®µéãå®è£
ããããããžã§ã¯ãããããŸãã
CPU
RISCã¢ãŒããã¯ãã£ã¯ãããŒã¿ã䜿çšããããã»ããµæäœã®ç¹å¥ãªã·ãŒã±ã³ã¹ã«ãã£ãŠåºå¥ãããŸãã ãã¹ãŠã®ããã»ããµããã»ããµåœä»€ã¯ã¬ãžã¹ã¿ã«ããããŒã¿ã§åäœããããŒã¿ã¯ç¹å¥ãªããã»ããµåœä»€SAVEããã³LOADã«ãã£ãŠã¡ã¢ãªãšã®éã§è»¢éãããŸãã ãããã£ãŠãåœä»€ããšã®ã¯ããã¯ãµã€ã¯ã«æ°ãäºæž¬å¯èœãªå Žåã«äœæ¥ã®å調æ§ãéæãããå€ãã®å Žåãã»ãšãã©ã®åœä»€ã1ã¯ããã¯ãµã€ã¯ã«ã«åãŸããŸãã Wirthããã»ããµã®æ©èœã¯ãããŒã¿ãã¡ã¢ãªã«æžã蟌ãããã®ãã€ãã©ã€ã³ã®äžŠååäœã§ããããŸããããã®ãããçµæã®ããã»ããµã®åšæ³¢æ°ã50ã25 MHzããååã«æžããå¿
èŠããããŸããã
ã³ãã³ãã·ã¹ãã ã¯32ãããã¯ãŒãã«åºã¥ããŠãããã³ãã³ãã®åœ¢åŒã決å®ããããã«æäžäœ4ããããäžããããŸãã ã³ãã³ãã®åœ¢åŒã«ãã£ãŠãæäœã®ã¯ã©ã¹ããªãã©ã³ãã®æ°ãããã³ãããã®å Žæãæ±ºãŸããŸãã
ALUã³ãã³ãã¯ã3ã€ã®ã¬ãžã¹ã¿ãŒãŸãã¯2ã€ã®ã¬ãžã¹ã¿ãŒãšå®æ°ã䜿çšããŠãç®è¡ããã³è«çæŒç®ã®ã»ãããå®çŸ©ããŸãã ALUããŒã ã¯ãç¹å¥ãªã·ã³ã°ã«ãããã¬ãžã¹ã¿ã«çµæã®ç¬Šå·ã«è¿œå ã®å€ãæ®ããŸãã
ã¡ã¢ãªã³ãã³ãã¯ãã¡ã¢ãªã«ããŒãããŠãã¬ãžã¹ã¿ã®1ã¯ãŒããŸãã¯1ãã€ããã¡ã¢ãªããèªã¿åãåœä»€ãå®çŸ©ããŸãã
ãããŒå¶åŸ¡ã³ãã³ãã䜿çšãããšãPCã¬ãžã¹ã¿ã®å€ãå¶åŸ¡ããŠãã¬ãžã¹ã¿ãŸãã¯å®æ°ã®å€ã«åºã¥ããŠæ¡ä»¶ä»ãããã³ç¡æ¡ä»¶ã®é·ç§»ãèšè¿°ããããšãã§ããŸãã
ã·ã¹ãã ã«ã¯16åã®ã¬ãžã¹ã¿ããããŸãããããã€ãã®äžäœã¬ãžã¹ã¿ã¯ãªãã¬ãŒãã£ã³ã°ã·ã¹ãã ãšã³ã³ãã€ã©ã«ãã£ãŠãµãŒãã¹ãšããŠäºçŽãããã¹ã¿ãã¯ãžã®ãã€ã³ã¿ãã¢ãžã¥ãŒã«ããŒãã«ã®ã¢ãã¬ã¹ãªã©ãæ ŒçŽããŸãã
次ã®ããã«ãªããŸãã

äžé£ã®æç€ºã«ã€ããŠã®è©³çްã¯ã
äžè¬åãããããã¥ã¡ã³ããš
ç¹å®ã®ããã¥ã¡ã³ãã«èšèŒãããŠããŸãã Verilogèšèªã§ããã»ããµãšåšèŸºæ©åšã®å³ãæäŸããŸããããã®åŸã®ãšãã£ã·ã§ã³ã§ã¯ã远å ã®ãããã°ãšæ€èšŒã®åŸãWirthã¯èšèªã®èª¬æãšãšãã«Lolaåè·¯ãæäŸããŸããã
Wirthã¯ãRS232ãªã©ã®ããã€ãã®æšæºã€ã³ã¿ãŒãã§ã€ã¹ã䜿çšããäœæ¥ã®ã¹ããŒã ãšå®è£
ã«ã€ããŠã説æããããŒã¿ã¹ãã¬ãŒãžãšããŠSDã«ãŒããæ¥ç¶ããæ¹æ³ã«ã€ããŠã説æããŸãã åšèŸºæ©åšã®å®è£
æ¹æ³ã¯ãããžã§ã¯ãã®ããã¥ã¡ã³ãã«èšèŒãããŠããŸããç§ã¯äž»ã«ããã°ã©ãã§ãããé»åæè¡è
ã§ã¯ãªããããéåžžã«å¹Œçšãªééããé²ãããã«è©³çްã説æããŸããã ãããããçµéšè±å¯ãªåå¿ããã®ã®ã£ãããåããã®ã«åœ¹ç«ã€ã§ãããã
ã·ã¹ãã
OSã®äž»ãªç®æšã¯ããŠãŒã¶ãŒãšããã°ã©ããŒã«äžå®ã¬ãã«ã®æœè±¡åãæäŸããããšã§ãã I / Oããã€ã¹ãã¹ãã¬ãŒãžããã€ã¹ãããã³ãããã®ããã€ã¹ãšããåãããããã®ã€ã³ã¿ãŒãã§ã€ã¹ãããã³ããŒããŠã§ã¢ã®å¶éã Oberonã·ã¹ãã ã§éžæãããæœè±¡åã®æè»æ§ã«ãããããŸããŸãªãœãããŠã§ã¢ãã©ãããã©ãŒã / OSã§ç¬ç«ããããã°ã©ã ãšããŠã·ãŒã ã¬ã¹ã«å®è¡ã§ããããã»ããµã¬ãã«ãŸãã¯æœè±¡åã®ãœãããŠã§ã¢å®è£
ã®ã¬ãã«ããšãã¥ã¬ãŒãã§ããŸãã
èšèª
ãã¡ãããOberonã¯å°æ¥ã®OSãäœæããããã®ããã°ã©ãã³ã°èšèªãšããŠéžã°ããŸããã ãœãŒã¹èšèªã¯2007å¹Žã«æ¹èšããããã®ãããžã§ã¯ãã®æ çµã¿ã®äžã§ãWirthã¯èšèªãããã«ç°¡çŽ åããæå¹æ§ã®ç¹ã§çãããæ©èœãåãé€ããŸããã æå°éã®æ©èœã»ããã«ãããåäœããã³ã³ãã€ã©ã®å®è£
ãç°¡çŽ åãããã³ãŒãã®å¶åŸ¡ãæ¹åãããŸãã ã·ã¹ãã ããŒãããäœæãããããããã¯éèŠã§ãã
Oberon OSãæ§ç¯ããããã«éèŠãªäž»ãªæ©èœã¯ãã¢ãžã¥ãŒã«æ§ãåºæ¬çãªã¡ã¿æ
å ±ãã¢ãžã¥ãŒã«ã®åçããŒããããã³ã¬ããŒãžã³ã¬ã¯ã¿ãŒãå¿
èŠãªã¡ã¢ãªã¢ãã«ã§ãã
ããããã«ã€ããŠç°¡åã«èª¬æããŸãã
ã¢ãžã¥ãŒã«æ§
Oberonã§ã¯ãã¢ãžã¥ãŒã«ã¯ã¢ã«ãŽãªãºã ãšããŒã¿æ§é ãæ§é åããææ®µã§ããã ãã§ãªããã³ã³ãã€ã«ãããŒããããã³é
åžã®åäœã§ããããŸãã ã€ãŸããã¢ãžã¥ãŒã«ã¯ãã³ã³ãã€ã©ãŒãã³ã³ãã€ã«ã§ããæå°ã®ãšã³ãã£ãã£ãŒã§ãã ä»ã®ã¢ãžã¥ãŒã«ã«å¯Ÿãã1ã€ã®ã¢ãžã¥ãŒã«ã®äŸåé¢ä¿ã¯èªåçã«èšç®ãããŸãããããã¢ãžã¥ãŒã«ããå¥ã®ã¢ãžã¥ãŒã«ãžã®ã³ãŒãã®çµã¿èŸŒã¿ã«ã¯ã€ãªãããŸããã ã³ãŒãã®ããŒãžã§ã³ãå¶åŸ¡ããããã«ãã€ã³ããŒãããããšã³ãã£ãã£ã®èå¥åãšäŸåé¢ä¿ã®ããã·ã¥ã³ãŒãã®ã¿ãå«ãŸããŸãã
ã¢ãžã¥ãŒã«ã¯ããŒãåäœã§ããã€ãŸããç¹å¥ãªå Žåãé€ããã¢ãžã¥ãŒã«ã³ãŒãã¯ãšã³ããªãã€ã³ãããããç¡å¶éã®æéå®è¡ã§ããå®å
šãªããã°ã©ã ã§ãã ã€ãŸããå®å
šãªããã°ã©ã ã§ãã OSã«ãŒãã«ã§ãããã¡ã¢ãªã«ããŒããããæåã®ã¢ãžã¥ãŒã«ã«ãããŸããã
ãŸããã¢ãžã¥ãŒã«ã¯ããœãŒã¹ã®åœ¢ã ãã§ãªãããââã€ããªãŒã®åœ¢ã§ããã€ã³ã¿ãŒãã§ãŒã¹éšåã®åœ¢ã§ãé
åžãããããšãæ³å®ããŠããããã®èµ·åã«ã¯ç¹å®ã®ãã©ãããã©ãŒã ãŸãã¯è€æ°ã®ãã©ãããã©ãŒã ã®ã¿ãå¿
èŠã§ãã äžè¬ã«ããããã®æŠå¿µã¯Oberonã®ã¢ãžã¥ãŒã«æ§ã®æŠå¿µã«å«ãŸããŠãããã¢ãžã¥ãŒã«æåããã°ã©ãã³ã°ãæ§æããŸãã
åºæ¬çãªã¡ã¿æ
å ±
ã¢ãžã¥ãŒã«æ§ã®æŠå¿µã¯ãä»»æã®æ°ã®ã¢ãžã¥ãŒã«ãåæã«ã¡ã¢ãªå
ã«ååšã§ããããšãåæãšããŠããŸããããã¹ãŠã®ã¢ãžã¥ãŒã«ãäºãã«ã€ããŠäœããç¥ãããšãã§ãããšã¯æ³å®ãããŠããŸããã ãã®å ŽåããŠãŒã¶ãŒãŸãã¯ããã°ã©ããŒã¯ããã®ãããªã¢ãžã¥ãŒã«å
ã®ãšã³ãã£ãã£ãŒã«ã¢ã¯ã»ã¹ããå¿
èŠããããŸãã ãã®ãããã¡ã¿æ
å ±ã®ååšã®èŠä»¶ãOberonèšèªå®è¡ç°å¢ã®èŠä»¶ã«å°å
¥ãããŠããŸãã ã¢ãžã¥ã©ãŒã·ã¹ãã å
ã®ç¹å®ã®ãšã³ãã£ãã£ãäžæã§ããå¯èœæ§ãããããããã®ãããžã§ã¯ãã§ã¯ãã¡ã¿æ
å ±ã¯ãã«ããŒã ã§ã¢ãžã¥ãŒã«ã®ãšã¯ã¹ããŒããããããã·ãŒãžã£ã«å¶åŸ¡ãç§»ãããšãã§ããããšã®ã¿ãå¿
èŠã§ãã
åçãªã¢ãžã¥ãŒã«æ§
OSãã€ã³ãã©ã¹ãã©ã¯ãã£è£œåã§ãããããèªäœã§ã¯ãŠãŒã¶ãŒåãã®ç¹å®ã®ã¢ããªã±ãŒã·ã§ã³ãæããªãããããŠãŒã¶ãŒã¯ããã°ã©ã ã®ããã»ã¹ã§å¿
èŠãªã¢ãžã¥ãŒã«ãããŒãã§ããå¿
èŠããããŸãã ã åæã«ãã¢ãžã¥ãŒã«ã«ã¯ãšã³ããªãã€ã³ããš1åå®è¡ãããæ¬äœããããŸãããéèŠãªãã€ã³ãã¯ãã¢ãžã¥ãŒã«ãã¡ã¢ãªã«ããŒãããããŸãŸã§ãããä»ã®ã¢ãžã¥ãŒã«ã®ãããªãäœæ¥ã®ããã«ãã®ã¿ã€ããšæé ãæäŸã§ãããšããäºå®ã§ãã ãã®ãããOSãæ¢ã«ããŒããããŠããã¢ãžã¥ãŒã«ã«å¶åŸ¡ãç§»ããåæã«ã¢ãžã¥ãŒã«ãããŒãããŠãã®ããã·ãŒãžã£ãå®è¡ã§ããããã«ããã«ã¯ãååã§ããã·ãŒãžã£ãå®è¡ã§ããå¿
èŠããããŸããã ãã¡ããããã®æ©èœã«ã¯äž»æµã®æ³åãçµ¶ããã»ã©è€éãªé¡äŒŒç©ããããŸãããçŸæç¹ã§ã¯ãã®æ©èœã§ååã§ãã ãšã«ãããããã¯ã©ã€ãã©ãªã«å®è£
ãããŠããŸãããèšèªã«äœã远å ããå¿
èŠã¯ãããŸããã
ãã¿åé
Oberonãªãã¬ãŒãã£ã³ã°ã·ã¹ãã ã§ã¯ãããŒãäžã®åçãªããžã§ã¯ãã®é
眮ãå¶åŸ¡ããã¬ããŒãžã³ã¬ã¯ã·ã§ã³ãOSã«ãŒãã«ã¬ãã«ã§å®è¡ãããŸãã ã³ã³ããŒãã³ãç°å¢ã®å Žåãã¯ã©ã€ã¢ã³ãã«åçãªããžã§ã¯ããæäŸããã³ã³ããŒãã³ãã¯ã¡ã¢ãªãããããããã€åé€ããããæ±ºå®ã§ããªããããã¬ããŒãžã³ã¬ã¯ã¿ãŒã¯æããã«å¿
èŠã§ãã
ãã®ããŒãã«é¢ããWirthèªèº«ããã®åŒçšã以äžã«ç€ºããŸãã
Oberonã·ã¹ãã ã¯ã倿°ãåç
§ãããªããªãããšãããã°ã©ããéç¥ã§ããããã«ããæç€ºçãªå²ãåœãŠè§£é€æé ãæäŸããŸããã ãã®çç¥ã®æåã®çç±ã¯ãéåžžãããã°ã©ããŒãå²ãåœãŠè§£é€ããã€åŒã³åºããããããªãããšã§ãã ãããŠç¬¬äºã«ããã®ããã³ããã¯
ä¿¡é Œã§ãããšã¿ãªãããªãã 誀ã£ãå²ãåœãŠè§£é€ãã€ãŸãåé¡ã®ãªããžã§ã¯ããžã®åç
§ããŸã ååšãããšãã«çºçããå²ãåœãŠè§£é€ã¯ãåãã¹ããŒã¹ã®è€æ°ã®å²ãåœãŠããããããæ²æšãªçµæãæãå¯èœæ§ããããŸãã ãããã£ãŠãã¹ãã¢ã®ã©ã®é åãæ¬åœã«åå©çšå¯èœãã倿ããããã«ãã·ã¹ãã 管çã«å®å
šã«äŸåããããšãè³¢æãšæãããŸãã
ãããã£ãŠãèšèªãšãã®å®è¡ç°å¢ïŒOSãã©ã³ã¿ã€ã ïŒã®èŠä»¶ãå®çŸ©ãããããã³ãŒãã®èšè¿°ãéå§ã§ããŸãã å®éãäžé£ã®æ©èœã®OSã¯ã»ãã®æ°åã®ã¢ãžã¥ãŒã«ã§èšè¿°ã§ããŸãã ä»ã®æ©èœã¯ããµãŒãããŒãã£ã®ã³ã³ããŒãã³ãã«åŒãç¶ãããšãã§ããŸãã ã³ã³ãã€ã©ã¯OSã®äžéšã§ããå¿
èŠã¯ãããŸãããããããªãã§ã¯ããã»ããµçšã®åäžã®ã³ãã³ããäœæã§ããªããããæåã«æ€èšããŸãã
ã³ã³ãã€ã©
ããã°ã©ãã³ã°èšèªãšã¯ãæ§æãæ§æããéãããåŒã®ã»ããã«ãã£ãŠãªã³ã¯ãããããŒã¯ãŒãã®ã»ããããã®æåã®ç¡éã®ã»ããã§ãã ååŒã¯ããããèšè¿°ããããã®èŠåãåããæ§ææ§é ã§ãã èšè¿°å
å®¹ã®æå³ã¯ãåæ§æã«é¢é£ä»ããããäžé£ã®ã»ãã³ãã£ãã¯ã«ãŒã«ã«ãã£ãŠæ±ºãŸããŸãã
ãªããã³
åçã®Oberonã¯ãæ§æã«äœåãªãã®ããªãèšèªãšããŠèããããŠããŸããã èšèªã®ããããªãºã ã«é¢é£ããæãããªåé¡ã解決ããããã«ãã¢ãžã¥ãŒã«æ§ã®æŠå¿µãææ¡ãããŸããã ãããã£ãŠãç°ãªãæ©èœã®ã¢ãžã¥ãŒã«ã®ã»ããã¯ãèšèªèªäœã®æ©èœã®æ¡åŒµçãªæé·ã广çã«çœ®ãæããããšãã§ãããšæ³å®ãããŠããŸããã èšèªã®èª¬æã¯20ããŒãžæªæºã§ãã³ã³ãã€ã©ã¯éåžžã«è¿
éã«å®è£
ãããŸããäžè¬çã«ãWirthã¯åŠç¿ã«åªããèšèªã§ããããšã倿ããããšã匷調ããŸããïŒPascalãããåªããŠããŸãïŒã ãã¡ãããéªæªãªèã¯ããã«ãã®ãã¬ãŒãºãæŸãäžãããããæ¥ãã§ããªããã³ã¯åŠç¿ã«ã®ã¿é©ããŠãããšäž»åŒµããŸããã ãŸããäžå·ã¯æ ¹çµ¶ãããããæçš®ããæ¹ãç°¡åã§ãã
ãã®ãããžã§ã¯ãã§ãããããã«ãOberonãšãã®æŠå¿µã¯ãããããã¬ãã«ãäœã¬ãã«ãããã«ãŠã§ã¢ãé«ã¬ãã«ã®åè·¯ãšãã£ã¿ãŒãã¡ãŒã©ãŒãªã©ã§ã³ãŒããå®è£
ããã®ã«é©ããŠããŸãã Wirthã¯ãããããã¹ãŠã®ã¢ããªã±ãŒã·ã§ã³ã圌ã®OSã®æŠå¿µå®èšŒãšããŠå®è£
ããŸããã
Oberonèšèªã®äœã¬ãã«ã³ãŒãã®äŸãã«ãŒãã«ã¢ãžã¥ãŒã«ãã¬ããŒãžã³ã¬ã¯ã¿ãŒã
github.com/ilovb/ProjectOberon2013/blob/master/Sources/Kernel.Mod#L82(* ---------- Garbage collector ----------*)
PROCEDURE Mark*(pref: LONGINT);
VAR pvadr, offadr, offset, tag, p, q, r: LONGINT;
BEGIN SYSTEM.GET(pref, pvadr); (*pointers < heapOrg considered NIL*)
WHILE pvadr # 0 DO
SYSTEM.GET(pvadr, p); SYSTEM.GET(p-4, offadr);
IF (p >= heapOrg) & (offadr = 0) THEN q := p; (*mark elements in data structure with root p*)
REPEAT SYSTEM.GET(p-4, offadr);
IF offadr = 0 THEN SYSTEM.GET(p-8, tag); offadr := tag + 16 ELSE INC(offadr, 4) END ;
SYSTEM.PUT(p-4, offadr); SYSTEM.GET(offadr, offset);
IF offset # -1 THEN (*down*)
SYSTEM.GET(p+offset, r); SYSTEM.GET(r-4, offadr);
IF (r >= heapOrg) & (offadr = 0) THEN SYSTEM.PUT(p+offset, q); q := p; p := r END
ELSE (*up*) SYSTEM.GET(q-4, offadr); SYSTEM.GET(offadr, offset);
IF p # q THEN SYSTEM.GET(q+offset, r); SYSTEM.PUT(q+offset, p); p := q; q := r END
END
UNTIL (p = q) & (offset = -1)
END ;
INC(pref, 4); SYSTEM.GET(pref, pvadr)
END
END Mark;
PROCEDURE Scan*;
VAR p, q, mark, tag, size: LONGINT;
BEGIN p := heapOrg;
REPEAT SYSTEM.GET(p+4, mark); q := p;
WHILE mark = 0 DO
SYSTEM.GET(p, tag); SYSTEM.GET(tag, size); INC(p, size); SYSTEM.GET(p+4, mark)
END ;
size := p - q; DEC(allocated, size); (*size of free block*)
IF size > 0 THEN
IF size MOD 64 # 0 THEN
SYSTEM.PUT(q, 32); SYSTEM.PUT(q+4, -1); SYSTEM.PUT(q+8, list3); list3 := q; INC(q, 32); DEC(size, 32)
END ;
IF size MOD 128 # 0 THEN
SYSTEM.PUT(q, 64); SYSTEM.PUT(q+4, -1); SYSTEM.PUT(q+8, list2); list2 := q; INC(q, 64); DEC(size, 64)
END ;
IF size MOD 256 # 0 THEN
SYSTEM.PUT(q, 128); SYSTEM.PUT(q+4, -1); SYSTEM.PUT(q+8, list1); list1 := q; INC(q, 128); DEC(size, 128)
END ;
IF size > 0 THEN
SYSTEM.PUT(q, size); SYSTEM.PUT(q+4, -1); SYSTEM.PUT(q+8, list0); list0 := q; INC(q, size)
END
END ;
IF mark > 0 THEN SYSTEM.GET(p, tag); SYSTEM.GET(tag, size); SYSTEM.PUT(p+4, 0); INC(p, size)
ELSE (*free*) SYSTEM.GET(p, size); INC(p, size)
END
UNTIL p >= heapLim
END Scan;
Texts, .
github.com/ilovb/ProjectOberon2013/blob/master/Sources/Texts.Mod#L127 PROCEDURE Store* (VAR W: Files.Rider; T: Text);
VAR p, q: Piece;
R: Files.Rider;
off, rlen, pos: LONGINT;
N, n: INTEGER;
ch: CHAR;
Dict: ARRAY 32, 32 OF CHAR;
BEGIN pos := Files.Pos(W); Files.WriteInt(W, 0); (*place holder*)
N := 1; p := T.trailer.next;
WHILE p # T.trailer DO
rlen := p.len; q := p.next;
WHILE (q # T.trailer) & (q.fnt = p.fnt) & (q.col = p.col) & (q.voff = p.voff) DO
rlen := rlen + q.len; q := q.next
END;
Dict[N] := p.fnt.name;
n := 1;
WHILE Dict[n] # p.fnt.name DO INC(n) END;
Files.WriteByte(W, n);
IF n = N THEN Files.WriteString(W, p.fnt.name); INC(N) END;
Files.WriteByte(W, p.col); Files.WriteByte(W, p.voff); Files.WriteInt(W, rlen);
p := q
END;
Files.WriteByte(W, 0); Files.WriteInt(W, T.len);
off := Files.Pos(W); p := T.trailer.next;
WHILE p # T.trailer DO
rlen := p.len; Files.Set(R, p.f, p.off);
WHILE rlen > 0 DO Files.Read(R, ch); Files.Write(W, ch); DEC(rlen) END ;
p := p.next
END ;
Files.Set(W, Files.Base(W), pos); Files.WriteInt(W, off); (*fixup*)
T.changed := FALSE;
IF T.notify # NIL THEN T.notify(T, unmark, 0, 0) END
END Store;
(Active Oberon), (Component Pascal, Zonnon), (JVM, CLR, JS), Java. Microsoft Singularity. , , , .
. , , , .
:

symbol character, , .
. . , RISC. .
, .
, , , . . .
, , , - . â -, ROM .
, , , .
, - FPGA .
. , , , . . , . .
, , .
, , , . , SD SPI. , - .
Modules. ( ) , . , , . .
Files, SD-. Files . , , .
, . , , . .
:

, . , , .
, . . , . BlackBox Windows, .
, , .
, , , â . , .
, , ( ), , . , , . .
, , , . , .

, , , .
.
, , , , , .
, , . , , , .
, . ? â , , , , .
, , , , , , , , - , . , , , .
, , , GNU/Linux , ( , ).
, , , , , -, . , , , . â , , , . , .
. , â . . âŠ( ), â , , . , . ⊠, . âŠ