C0ROM ²½¤Î¼ê½ç

£±¡£C0ROM ²½¤ËɬÍ×¤Ê¥×¥í¥°¥é¥à

£á¡Ë£Ò£Ï£Í²½¥ß¥Ë¡¦¥¹¥¿¡Ý¥È¡¦¥¢¥Ã¥×¡¦¥ë¡¼¥Á¥ó¡ÊC0ROM¡Ë C0ROM ¤ÎºÇ½é¤Ë location-data¡§ HO: ¡¡HEXÊÑ´¹»þ¡¢C0ROM ÉղóÎǧ¤Ë¤¿¤á¤Îµ­¹æ ROM_addr: 1_TEXT ¤¬Æþ¤ë½é¤á¤Î addr (f000h para) RAM_addr : _DGROUP ¤¬Æþ¤ë½é¤á¤Î addr(50h para) ROM_size : 1000h para (64K) RAM_size : 1000h para (64K) init_dt_ad: DGROUP¤Î START_addr ¼¡¤Ë¡¢¥¹¥¿¡Ý¥È¡¦¥¢¥Ã¥×¡¦¥ë¡¼¥Á¥ó DGROUP (_DATA, CONST, BSS) ¤ò RAM_addr °Ê¹ß¤Ë copy ¤¹¤ë¡£ ¥³¥Ã¥Ô¥¤¤·¤¿ BSS Îΰè¤Ï zero-clear ¤¹¤ë¡£ SP ¤ò RAM_addr +DGROUP_size +STACK_size ÈÖÃϤˤ¹¤ë¡£ CS:IP ¤«¤é¥×¥í¥°¥é¥à¤ò start¡£ £â¡Ë¥×¥í¥°¥é¥àËÜÂΡ§ ¥»¥°¥á¥ó¥È CS DGROUP¡ÊDATA, CONST, BSS¡Ë ¡¡¡¡¡¡¤«¤é¤Ê¤ë¡£

£²¡£C0ROM²½¤Î¼ê½ç

£á¡Ë¥ß¥Ë¡¦¥¹¥¿¡Ý¥È¡¦¥¢¥Ã¥×¡¦¥ë¡¼¥Á¥ó¤¬ÀèÆ¬¤ËÉÕ¤¤¤¿ *.EXE ¤ò¤Ä¤¯¤ë¡£ ¡¡ (¥¤)¥ß¥Ë¡¦¥¹¥¿¡Ý¥È¡¦¥¢¥Ã¥×¡¦¥ë¡¼¥Á¥ó¡ÊC0ROM.obj¡Ë¤òºî¤ë¡£ ¥¢¥»¥ó¥Ö¥é¤Ç½ñ¤¤¤Æ¤¢¤ë¤«¤é¡¢ masm C0ROM ¡¿Mx ---> C0ROM.obj ¡¡ (¥í)¥×¥í¥°¥é¥àËÜÂΤΠ¥ª¥Ö¥¸¥§¥¯¥È¡¦¥×¥í¥°¥é¥à XX,obj ¤òºî¤ë¡£ ¡¡¡¡¡¡(Ž2)¥¢¥»¥ó¥Ö¥é¡¦¥×¥í¥°¥é¥à¡§ £Ã¡Ý¥×¥í¥°¥é¥àŸ³«·Á¼°¤Ç½ñ¤¯¡£ masm XX /Mx ---> XX.obj ¡¡¡¡¡¡ (Ž[)£Ã¥×¥í¥°¥é¥à¡§ Non-Library ¥×¥í¥°¥é¥à·Á¼°¤Ç½ñ¤¯¡£ ¡¡ cl/c [Gs] XX ---> XX.obj ¡¡ (¥Ï) ¥¤, ¥í ξ¼Ô¤«¤é¡¢MS-Link ¤òÍѤ¤¤ÆEXE-¥Õ¥¡¥¤¥ë¤òºî¤ë¡£ ¡¡link/NOI /NOD C0ROM xx, xx ---> xx.exe¡¡ £â¡Ëexe2hex XX.obj ¤ò¼Â¹Ô¤·¤Æ¡¢XX.hex ¤ò¤Ä¤¯¤ë¡£ ¡¡¡¡(¥¤)XX.exe ¤Î header ¤Ë¤Ï¡¢Relocateble ¹àÌܰìÍ÷ (offset, segment) ¤¬¤¢¤ë¡£¤½¤Î Reloc ¹àÌܤËÂбþ¤¹¤ëÌ¿Îá¤Î operand ¤Ç¡¢ ¡¡CS ¤ò»Ø¤¹¤â¤Î¤Ï¡¢¡¡¡¡+ROM_addr ¡¡¡¡¡¡ DGROUP ¤ò»Ø¤¹¤â¤Î¤Ï¡¢+RAM_addr -DGROUP ¤È¤¹¤ë¡£ ¡¡¡¡(¥í)¥×¥í¥°¥é¥à¤ò¡¢Intel-hex ·Á¼°¥Õ¥¡¥¤¥ë¤ËÊÑ´¹¤¹¤ë¡£ ¡¡¡¡(¥Ï)¥×¥í¥°¥é¥à¤ÎºÇ¸å¤Ë¡¢¥Ñ¥ï¡¼¡¦¥ª¥ó¡¦¥¹¥¿¡¼¥ÈÈÖÃÏ(0ffff0)¤Ë¥¸¥ã¥ó¥× ¡¡¡¡ ¡¡Ì¿Îá¡ãjmp ip:cs¡ä¤ò¥í¡¼¥É¤¹¤ë¥Ç¡¼¥¿¤òÉղ乤롣¡Ê¤³¤ÎÌ¿Îá¤Ç¡¢Ì¿Îá ¡¡ ¡¡¡¡¥ª¥Ú¥é¥ó¥É¤Î cs ¤¬¡¢CS-¥ì¥¸¥¹¥¿¤ÎÆâÍÆ¤È¤Ê¤ë¡£¤¹¤Ê¤ï¤Á¡¢¥³¡Ý¥É¡¦ ¥»¥°¥á¥ó¥È¤¬·è¤Þ¤ë¡£¤Ä¤¤¤Ç¡¢¥ª¥Õ¥»¥Ã¥È¡¦ÈÖÃÏ ip ¤ËÈô¤Ö¡£¡Ë £ã¡ËXX.hex ¤ò WU10 ¤ò»È¤Ã¤Æ¡¢ROM ¤Ë¥í¡¼¥É¤¹¤ë¡£ £ä¡ËC-MONOTOR¡Ê¸¡ºº´ï¦¡Ë¤ÈDEBUGGER (ROM¦¡Ë¤Ç¸¡ºº¡£¤³¤Î¤È¤­¡¢¤Þ¤º ¥Ñ¥ï¡¼¡¦¥ª¥ó¡¦¥¹¥¿¡¼¥È¤Î JMPÀè¡Ý¡ä¥Ç¥Ã¥Ð¥¬¤Î¥¹¥¿¡¼¥ÈÈÖÃÏ ¥Ç¥Ã¥Ð¥¬¤Î¥æ¡¼¥¶¡¦¥¨¥ê¥¢¤òÀßÄê ¥Ç¥Ã¥Ð¥¬¤Î¥ï¡¼¥¯¡¦¥¨¥ê¥¢¤òÀßÄê ¡¡¡¡¤Ë¤·¤ÆÃÖ¤¯¡£ £å¡Ë´°À®¤·¤¿¤é ¥Ñ¥ï¡¼¡¦¥ª¥ó¡¦¥¹¥¿¡¼¥È¤Î JMP Àè¡Ý¡ä¥æ¡¼¥¶¡¦¥×¥í¥°¥é¥à ¡¦¥¹¥¿¡¼¥ÈÈÖÃϤËÌ᤹¡£

£³¡£ÉÕÏ¿£±

¡¡¥í¥à²½¥×¥í¥°¥é¥àÃæ¡¢¥ß¥Ë¡¦¥¹¥¿¡¼¥È¡¦¥¢¥Ã¥×¡¦¥ë¡¼¥Á¥ó¡§ DGROUP (_DATA, CONST, BSS) ¤ò RAM_addr °Ê¹ß¤Ë COPY ¤¹¤ë¡£ ¥³¥Ã¥Ô¥¤¤·¤¿ BSS Îΰè¤Ï zero-clear ¤¹¤ë¡£ Stack Pointer ¤ò RAM_addr +DGROUP_size +STACK_size ÈÖÃϤˤ¹¤ë¡£ ¡¡¤ÎÁàºî¤¬¡¢ÉÔɬÍפʤâ¤Î¤¬¤¢¤ë¡£ ¡¡¤³¤Î¤È¤­¤Ï¡¢ 1)¥×¥í¥¯¥é¥à¤ÎÀèÆ¬¤Ë dw 'HO' rom_addr dw 0f000h ram_addr dw 50h rom_size dw 1000h ram_size dw 1000h init_dt_ad: dw DGROUP dw 0, 0 ¤Î¤è¤¦¤Ë EXE2HEX ¤ËɬÍפʥإÀ¡¼¤ò½ñ¤¤¤ÆÃÖ¤¯¡£ 2)¼¡¤Ë¡¢ masm /mx link exe2hex ¤È¤¹¤ë¤Ð¡¢¥×¥í¥°¥é¥à ROM ¤Ë³äÉÕ¤±¤é¤ì¡¢Æ±»þ¤Ë hex file ¤òºî¤ë»ö¤¬½ÐÍè¤ë¡£

£´¡£ÉÕÏ¿£²

¡¡RAM ¥×¥í¥°¥é¥à¤Ç¤Ï¡¢¥ß¥Ë¡¦¥¹¥¿¡¼¥È¡¦¥¢¥Ã¥×¡¦¥ë¡¼¥Á¥ó¤ÏɬÍפʤ¤¡£ 1)¥×¥í¥¯¥é¥à¤ÎÀèÆ¬¤Ë dw 'HO' rom_addr dw 50h ram_addr dw 50h rom_size dw 1000h ram_size dw 1000h init_dt_ad: dw DGROUP dw 0, 0 ¤Î¤è¤¦¤Ë EXE2HEX ¤ËɬÍפʥإÀ¡¼¤ò½ñ¤¤¤ÆÃÖ¤¯¡£ 2)¼¡¤Ë¡¢ masm /mx link exe2hex ¤È¤¹¤ë¡£¥×¥í¥°¥é¥à RAM ¤Ë³äÉÕ¤±¤é¤ì¡¢Æ±»þ¤Ë hex file ¤òºî¤ë»ö¤¬½ÐÍè¤ë¡£