ç©èª
ã ããã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 , ( , ).
, , , , , -, . , , , . â , , , . , .
. , â . . âŠ( ), â , , . , . ⊠, . âŠ