From c0b964b4f40541591b68efe2af881613fc69656a Mon Sep 17 00:00:00 2001 From: Hiroaki Sakai Date: Thu, 28 Dec 2000 12:00:00 +0900 Subject: [PATCH] =?UTF-8?q?Added=20dummy=20function=20of=20=5Fasm=5F*().?= =?UTF-8?q?=20Set=20FP=5FOFF=20=E2=80=8B(),=20FP=5FSEG()=20for=20the=20cal?= =?UTF-8?q?lback=20function=20at=20interrupt=20setting=20in=20WonderWitch?= =?UTF-8?q?=20Adjust=20appropriately=20according=20to=20the=20setting=20me?= =?UTF-8?q?thod.=20=20(Fit=20to=20wwterm)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit UNIXTimer.c: UNIXTimer_Unpause() ((unix_timer -> pause == 1) && (unix_timer -> interrupt_in_pause == 0)) Fixed a bug that was not unix_timer-> pause--; when it was. (It was not unposted when interrupt was not applied during pause) Serial receive interrupt, keyboard interrupt added. (corresponding to wwterm, operation confirmed) Added UNIXSerialPort class. With this, at WonderWitch, com_intvector.callback = (void (near *) ()) FP_OFF ​​(com_handler); com_intvector.cs = _ asm_inline ("\tmov \tax, cs"); com_intvector.ds = _ asm_inline ("\tmov \tax, ds"); sys_interrupt_set_hook (SYS_INT_RECEIVEREADY, & com_intvector, & com_last_intvector); Interrupt setting like that shown in Fig. For warning, add WonX_Warning (). Move WonX_Error () to WonX.c. comm_send_string (), text_put_string (), text_put_substring () When executed Fix output message. Implement cursor display function. (Add WWCursor class) (Do not blink. Display only) When displaying the cursor, text information inside WWDisplay_DrawLCDPanel () Since we need to be able to read it, we will discontinue the WonXText class and add the WWText class I moved to a member of the WWDisplay class. In palette_get_color (), transparent color is displayed when executing WWPalette_GetMappedColors () Since it was not considered to be returned as -1, palette_get_color () Fixed a bug where return value was wrong value. Character color palette, LCD color palette initial value, with WonderWitch It was made to coincide with the initial value. As a sample, add wwterm - b 05. (Add wwterm target to Makefile) Version 1.1 - from wonx-1.1.tar.gz --- HISTORY | 47 ++++++ MANUAL | 20 +-- Makefile | 22 ++- README | 209 ++++++++++++++++++++++++-- UNIXSerialPort.c | 180 +++++++++++++++++++++++ UNIXSerialPort.h | 82 +++++++++++ WonXTextP.h => UNIXSerialPortP.h | 12 +- UNIXTimer.c | 8 +- UNIXTimer.h | 10 +- WWCharacter.c | 2 +- WWCharacter.h | 10 +- WWColorMap.c | 2 +- WWColorMap.h | 10 +- WWCursor.c | 67 +++++++++ WWCursor.h | 57 ++++++++ WonXText.h => WWCursorP.h | 22 ++- WWDisplay.c | 77 +++++++++- WWDisplay.h | 27 +++- WWDisplayP.h | 2 + WWInterrupt.c | 2 +- WWInterrupt.h | 14 +- WWLCDPanel.c | 2 +- WWLCDPanel.h | 8 +- WWPalette.c | 3 +- WWPalette.h | 10 +- WWScreen.c | 17 ++- WWScreen.h | 17 ++- WWSerialPort.c | 12 +- WWSerialPort.h | 32 ++-- WWSerialPortP.h | 2 +- WWSprite.c | 12 +- WWSprite.h | 14 +- WWText.c | 6 +- WWText.h | 12 +- WWTimer.c | 2 +- WWTimer.h | 14 +- WonX.c | 41 +++--- WonX.h | 17 ++- WonXDisplay.c | 2 +- WonXDisplay.h | 14 +- WonXP.h | 1 - WonXSerialPort.c | 31 +++- WonXSerialPort.h | 19 ++- WonXSerialPortP.h | 1 + WonXSystem.c | 50 ++++++- WonXSystem.h | 12 +- WonXText.c | 55 ------- XDisplay.h | 14 +- comm.c | 170 ++++++++++++--------- disp.c | 18 ++- etc.c | 30 ++-- etc.h | 16 +- makefile_for_wwterm | 36 +++++ service.c | 52 +++++++ sout2str.pl | 3 +- system.c | 7 - text.c | 244 ++++++++++++++++++++++++++++--- wonx_include/service.h | 68 +++++++++ wonx_include/system.h | 2 - wwterm-b05.zip | Bin 0 -> 45063 bytes 60 files changed, 1577 insertions(+), 371 deletions(-) create mode 100644 UNIXSerialPort.c create mode 100644 UNIXSerialPort.h rename WonXTextP.h => UNIXSerialPortP.h (84%) create mode 100644 WWCursor.c create mode 100644 WWCursor.h rename WonXText.h => WWCursorP.h (69%) delete mode 100644 WonXText.c create mode 100644 makefile_for_wwterm create mode 100644 service.c create mode 100644 wwterm-b05.zip diff --git a/HISTORY b/HISTORY index 12d5fdf..f0c121c 100644 --- a/HISTORY +++ b/HISTORY @@ -1,3 +1,50 @@ +2000/12/28(ÌÚ) + +wonx-1.1 ¸ø³« + +_asm_*() ¤Î¥À¥ß¡¼´Ø¿ô¤òÄɲᥠ+FP_OFF(), FP_SEG() ¤ò¡¤WonderWitch ¤Ç¤Î³ä¤ê¹þ¤ßÀßÄê»þ¤Î¥³¡¼¥ë¥Ð¥Ã¥¯´Ø¿ô¤Î +ÀßÄêÊýË¡¤Ë¤¢¤ï¤»¤Æ¡¤Å¬ÀÚ¤ËÊѹ¹¡¥(wwterm ¤Ë¹ç¤ï¤»¤¿) + +UNIXTimer.c:UNIXTimer_Unpause() ¤Ç¡¤ +((unix_timer->pause == 1) && (unix_timer->interrupt_in_pause == 0)) +¤À¤Ã¤¿¤È¤­¤Ë unix_timer->pause--; ¤µ¤ì¤Ê¤¤¥Ð¥°¤ò½¤Àµ¡¥ +(¥Ý¡¼¥ºÃæ¤Ë³ä¤ê¹þ¤ß¤¬¤«¤«¤é¤Ê¤«¤Ã¤¿¾ì¹ç¤Ë¡¤¥¢¥ó¥Ý¡¼¥º¤µ¤ì¤Æ¤¤¤Ê¤«¤Ã¤¿) + +¥·¥ê¥¢¥ë¼õ¿®³ä¤ê¹þ¤ß¡¤¥­¡¼¥Ü¡¼¥É³ä¤ê¹þ¤ßÄɲá¥(wwterm ¤ËÂбþ¡¤Æ°ºî³ÎǧºÑ) +UNIXSerialPort ¥¯¥é¥¹Äɲᥠ+ +¤³¤ì¤Ë¤è¤ê¡¤WonderWitch ¤Ç¤Î¡¤ + com_intvector.callback = (void (near *)())FP_OFF(com_handler); + com_intvector.cs = _asm_inline("\tmov\tax,cs"); + com_intvector.ds = _asm_inline("\tmov\tax,ds"); + sys_interrupt_set_hook(SYS_INT_RECEIVEREADY, + &com_intvector, &com_last_intvector); +¤Î¤è¤¦¤Ê³ä¤ê¹þ¤ß¤ÎÀßÄ꤬Àµ¤·¤¯¼Â¹Ô¤µ¤ì¤ë¤è¤¦¤Ë¤Ê¤Ã¤¿¡¥ + +¥ï¡¼¥Ë¥ó¥°ÍѤˡ¤WonX_Warning() Äɲᥠ+WonX_Error() ¤ò WonX.c ¤Ë°Üư¡¥ + +comm_send_string(), text_put_string(), text_put_substring() ¼Â¹Ô»þ¤Î +½ÐÎÏ¥á¥Ã¥»¡¼¥¸¤ò½¤Àµ¡¥ + +¥«¡¼¥½¥ëɽ¼¨µ¡Ç½¤ò¼ÂÁõ¡¥(WWCursor ¥¯¥é¥¹ÄɲÃ)(ÅÀÌǤϤ·¤Ê¤¤¡¥É½¼¨¤Î¤ß) +¥«¡¼¥½¥ëɽ¼¨¤ò¤¹¤ëºÝ¤Ë¡¤WWDisplay_DrawLCDPanel() ÆâÉô¤Ç¥Æ¥­¥¹¥È¾ðÊó¤¬ +ÆÉ¤á¤ëɬÍפ¬¤¢¤ë¤Î¤Ç¡¤WonXText ¥¯¥é¥¹¤òÇѻߤ·¤Æ¡¤WWText ¥¯¥é¥¹¤ò +WWDisplay ¥¯¥é¥¹¤Î¥á¥ó¥Ð¤Ë°Üư¤·¤¿¡¥ + +palette_get_color() Æâ¤Ç¡¤WWPalette_GetMappedColors() ¤Î¼Â¹Ô»þ¤ËÆ©ÌÀ¿§¤¬ +-1¤È¤·¤ÆÊÖ¤µ¤ì¤ë¤³¤È¤ò¹Íθ¤·¤Æ¤¤¤Ê¤«¤Ã¤¿¤¿¤á¤Ë¡¤palette_get_color() ¤Î +Ìá¤êÃͤ¬¤ª¤«¤·¤ÊÃͤˤʤäƤ¤¤¿¥Ð¥°¤ò½¤Àµ¡¥ + +¥­¥ã¥é¥¯¥¿¥«¥é¡¼¥Ñ¥ì¥Ã¥È¡¤LCD¥«¥é¡¼¥Ñ¥ì¥Ã¥È¤Î½é´üÃͤò¡¤WonderWitch ¤Ç¤Î +½é´üÃͤȰìÃפµ¤»¤¿¡¥ + +¥µ¥ó¥×¥ë¤È¤·¤Æ¡¤wwterm-b05 ¤òÄɲá¥(Makefile ¤Ë wwterm ¥¿¡¼¥²¥Ã¥È¤òÄɲÃ) + + + + 2000/11/23(ÌÚ) wonx-1.0 ¸ø³« diff --git a/MANUAL b/MANUAL index f316d63..8184c8c 100644 --- a/MANUAL +++ b/MANUAL @@ -29,23 +29,23 @@ WonderWitch ¨§¨¡ WWCharacter[512] ¨£¨¡WWDisplay ¨¡¨«¨¡ WWSprite[128] ¨£¨¡ WonXDisplay ¨¡¨¡¨© ¨§¨¡ WWScreen[2] - ¨¢ ¨¦¨¡XDisplay ¨¦¨¡ WWLCDPanel - ¨¢ + ¨¢ ¨¦¨¡XDisplay ¨§¨¡ WWLCDPanel + ¨¢ ¨§¨¡ WWText + ¨¢ ¨¦¨¡ WWCursor ¨¢ ¨£¨¡ WWInterrupt - ¨§¨¡ WonXSystem ¨¡¨¡¨¡¨«¨¡ WWTimer[3] +WonX ¨¡¨«¨¡ WonXSystem ¨¡¨¡¨¡¨«¨¡ WWTimer[3] ¨¢ ¨¦¨¡ UNIXTimer -WonX ¨¡¨© - ¨¢ - ¨§¨¡ WonXText ¨¡¨¡¨¡¨¡¨¡¨¡ WWText ¨¢ ¨¢ - ¨¦¨¡ WonXSerialPort ¨¡¨¡¨¡ WWSerialPort + ¨¢ ¨£¨¡ WWSerialPort + ¨¦¨¡ WonXSerialPort ¨¡¨© + ¨¦¨¡ UNIXSerialPort WW ¤È¤¤¤¦ÀÜÆ¬¸ì¤¬¤Ä¤¯¥¯¥é¥¹¤Ï WonderWitch °Í¸¤Î¤â¤Î¤Ç¤¹¡¥¼ç¤Ë WonderSwan ¤Î¾õÂÖ¾ðÊó¤ò³ÊǼ¤·¤Þ¤¹¡¥ X ¤È¤¤¤¦ÀÜÆ¬¸ì¤¬¤Ä¤¯¥¯¥é¥¹¤Ï X °Í¸¤Î¤â¤Î¡¤UNIX ¤È¤¤¤¦ÀÜÆ¬¸ì¤¬¤Ä¤¯¥¯¥é¥¹¤Ï UNIX °Í¸¤Î¤â¤Î¤Ç¤¹¡¥ -Wonx ¤È¤¤¤¦ÀÜÆ¬¸ì¤¬¤Ä¤¯¥¯¥é¥¹¤Ï¤½¤ì¤é¤òÅý³ç¤¹¤ë¤â¤Î¤Ç¤¹¡¥ +WonX ¤È¤¤¤¦ÀÜÆ¬¸ì¤¬¤Ä¤¯¥¯¥é¥¹¤Ï¤½¤ì¤é¤òÅý³ç¤¹¤ë¤â¤Î¤Ç¤¹¡¥ ¥Ä¥ê¡¼¹½Â¤¤òÍý²ò¤·¤¿¤«¤Ã¤¿¤é¡¤³Æ¥¯¥é¥¹¤Î *P.h ¥Õ¥¡¥¤¥ë¤Î¥á¥ó¥Ð¤ÎÄêµÁ¤È¡¤ *.c ¥Õ¥¡¥¤¥ë¤Î *_Create() ´Ø¿ô¤ò»²¾È¤·¤Æ¤¯¤À¤µ¤¤¡¥ @@ -56,8 +56,8 @@ Wonx ´Ø¿ô¤¬ÍѰդµ¤ì¤Æ¤¤¤Þ¤¹¡¥ WonX_Create() ¤¬¸Æ¤Ð¤ì¤ë¤È¡¤ÆâÉô¤Ç WonXDisplay_Create(), WonXSystem_Create(), -WonXText_Create(), WonXSerialPort_Create() ¤¬¸Æ¤Ð¤ì¡¤»Ò¤Î WonXDisplay, -WonXSystem, WonXText, WonXSerialPort ¥ª¥Ö¥¸¥§¥¯¥È¤¬À¸À®¤µ¤ì¤Þ¤¹¡¥ +WonXSerialPort_Create() ¤¬¸Æ¤Ð¤ì¡¤»Ò¤Î WonXDisplay, WonXSystem, +WonXSerialPort ¥ª¥Ö¥¸¥§¥¯¥È¤¬À¸À®¤µ¤ì¤Þ¤¹¡¥ WonXDisplay_Create() ¤¬¸Æ¤Ð¤ì¤ë¤È¡¤ÆâÉô¤Ç WWDisplay_Create(), XDisplay_Create() ¤¬¸Æ¤Ð¤ì¡¤... ¤È¤¤¤¦¤è¤¦¤Ë³¤¤¤Æ¡¤¤¹¤Ù¤Æ¤Î¥Ä¥ê¡¼¤« À¸À®¤µ¤ì¤Þ¤¹¡¥ diff --git a/Makefile b/Makefile index 027cbf9..6383d51 100644 --- a/Makefile +++ b/Makefile @@ -2,12 +2,13 @@ XINCLUDEDIR = /usr/X11R6/include INCLUDEDIR = . XLIBDIR = /usr/X11R6/lib -VERSION = WonX-1.0 -PKGNAME = wonx-1.0 +VERSION = WonX-1.1 +PKGNAME = wonx-1.1 SMAC = smac-b02 +WWTERM = wwterm-b05 -OBJS = WWCharacter.o WWColorMap.o WWDisplay.o WWLCDPanel.o WWPalette.o WWScreen.o WWSprite.o WWText.o WWInterrupt.o WWTimer.o WWSerialPort.o WonX.o WonXDisplay.o WonXText.o WonXSystem.o WonXSerialPort.o XDisplay.o UNIXTimer.o bank.o comm.o disp.o text.o key.o sound.o system.o timer.o etc.o +OBJS = WWCharacter.o WWColorMap.o WWDisplay.o WWLCDPanel.o WWPalette.o WWScreen.o WWSprite.o WWCursor.o WWText.o WWInterrupt.o WWTimer.o WWSerialPort.o WonX.o WonXDisplay.o WonXSystem.o WonXSerialPort.o XDisplay.o UNIXTimer.o UNIXSerialPort.o bank.o comm.o disp.o text.o key.o sound.o system.o timer.o service.o etc.o CC = gcc @@ -44,13 +45,24 @@ smac : libwonx.a cd $(SMAC) ; ./sys2wonx.pl *.[ch] cd $(SMAC) ; $(MAKE) +wwterm : libwonx.a + unzip $(WWTERM).zip + cp -R wonx_include $(WWTERM) + cp libwonx.a $(WWTERM) + mv $(WWTERM)/makefile $(WWTERM)/makefile.orig + cp makefile_for_wwterm $(WWTERM)/makefile + cp sys2wonx.pl $(WWTERM) + echo "¤³¤³¤Ç»ß¤Þ¤Ã¤¿¤È¤­¤Ï¡¤sys2wonx.pl ¤Î£±¹ÔÌܤËŬÀÚ¤Êperl¤ò»ØÄꤷ¤Æ¤¯¤À¤µ¤¤" + cd $(WWTERM) ; ./sys2wonx.pl *.[ch] + cd $(WWTERM) ; $(MAKE) + package : mkdir -p $(PKGNAME) rm -fR $(PKGNAME)/* mkdir -p $(PKGNAME)/wonx_include cp COPYING COPYRIGHT HISTORY README MANUAL OMAKE.jpn Makefile \ - makefile_for_smac *.pl \ - *.h *.c smac*.zip $(PKGNAME) + makefile_for_smac makefile_for_wwterm *.pl \ + *.h *.c $(SMAC).zip $(WWTERM).zip $(PKGNAME) cp wonx_include/*.h $(PKGNAME)/wonx_include tar cvzf $(PKGNAME).tar.gz $(PKGNAME) diff --git a/README b/README index 8f3e70b..dbf91a2 100644 --- a/README +++ b/README @@ -57,7 +57,7 @@ WonX ¥µ¥ó¥×¥ë¥×¥í¥°¥é¥à¤ò¥³¥ó¥Ñ¥¤¥ë¡¦¼Â¹Ô¤·¤Æ¤ß¤Þ¤·¤ç¤¦¡¥ °Ê²¼¤Î¤è¤¦¤Ë¤·¤Æ¤ß¤Æ¤¯¤À¤µ¤¤¡¥ -~>% tar xvzf wonx.tgz +~>% tar xvzf wonx-x.x.tar.gz (ÃæÎ¬) ~>% cd wonx @@ -100,6 +100,85 @@ smac p ¤ò²¡¤·¤ÆÉÑÈˤËÉÁ²è¤Î ON, OFF ¤òÀÚÂØ¤¨¤ë¤Î¤Ï¡¤ÉÁ²è¤¬Èó¾ï¤ËÃÙ¤¤¤¿¤á¡¤ ON¤Î¤Þ¤Þ¤À¤È²èÌÌ¥¯¥ê¥¢¤È¤«¤Ë°Û¾ï¤Ë»þ´Ö¤¬¤«¤«¤ë¤«¤é¤Ç¤¹¡¥ +ºÇ¸å¤Ë¡¤WonderWitch ÍѤÎüËö¥¨¥ß¥å¥ì¡¼¥¿ "WWTerm" ¤ò¥³¥ó¥Ñ¥¤¥ë¡¦¼Â¹Ô +¤·¤Æ¤ß¤Þ¤¹¡¥ + +~/wonx>% make wwterm +(ÃæÎ¬) +~/wonx>% cd wwterm +~/wonx/smac>% ./terminal + +¢£ 10ʬWonX + +¼¡¤Ë¡¤¤Ê¤Ë¤«¤¢¤Ê¤¿¤¬ºî¤Ã¤¿ WonderWitch ÍÑ¤Î¥×¥í¥°¥é¥à¤ò WonX »È¤Ã¤Æ +¥³¥ó¥Ñ¥¤¥ë¡¦¥ê¥ó¥¯¤·¤Æ¡¤X Window System ¾å¤Çưºî¤¹¤ë¤è¤¦¤Ê¼Â¹Ô·Á¼°¤ò +ºî¤Ã¤Æ¤ß¤Þ¤·¤ç¤¦¡¥ + +¤Þ¤º¡¤WonX ¤òŸ³«¤·¤Æ¡¤make ¤·¤Æ¤¯¤À¤µ¤¤¡¥libwonx.a ¤¬¤Ç¤­¤¢¤¬¤ê¤Þ¤¹¡¥ + +~>% tar xvzf wonx-x.x.tar.gz +(ÃæÎ¬) +~>% cd wonx +~/wonx>% make +(ÃæÎ¬) +~/wonx>% ls libwonx.a +libwonx.a +~/wonx>% + +¼¡¤Ë¡¤libwonx.a ¤È¡¤wonx_include ¥Ç¥£¥ì¥¯¥È¥ê¤È¡¤sys2wonx.pl ¤ò +¤¢¤Ê¤¿¤Îºî¤Ã¤¿¥×¥í¥°¥é¥à¤Î¥Ç¥£¥ì¥¯¥È¥ê(¤³¤³¤Ç¤ÏÎã¤È¤·¤Æ¡¤yoursample ¤È¤·¤Þ¤¹) +¤Ë¥³¥Ô¡¼¤·¤Þ¤¹¡¥ + +~/wonx>% cp -R libwonx.a wonx_include sys2wonx.pl ../yoursample +~/wonx>% cd ../yoursample +~/yoursample>% + +¤¢¤Ê¤¿¤Îºî¤Ã¤¿¥×¥í¥°¥é¥à¤Î¤¹¤Ù¤Æ¤Î¥Õ¥¡¥¤¥ë¤ò¡¤MS-DOS ¥Æ¥­¥¹¥È·Á¼°¤«¤é +UNIX ¤Î¥Æ¥­¥¹¥È·Á¼°¤ËÊÑ´¹¤·¤Þ¤¹¡¥(¤Ä¤Þ¤ê¡¤²þ¹Ô¥³¡¼¥É¤ò \r\n ¤«¤é \n ¤Ë +ÊÑ´¹¤·¤Æ¡¤´Á»ú¥³¡¼¥É¤ò SJIS ¤«¤é EUC ¤ËÊÑ´¹¤·¤Þ¤¹) + +~/yoursample>% cat makefile | qkc -I -O -e -u > makefile.new +~/yoursample>% mv makefile.new makefile +~/yoursample>% cat sample.c | qkc -I -O -e -u > sample.c.new +~/yoursample>% mv sample.c.new sample.c +...(°Ê²¼¤¹¤Ù¤Æ¤Î¥Õ¥¡¥¤¥ë¤Ë¤Ä¤¤¤Æ¡¤Æ±Íͤ˷«¤êÊÖ¤·¡¥ÃæÎ¬)... + +*.C ¤È¤¤¤¦¥Õ¥¡¥¤¥ë̾¤Î¥Õ¥¡¥¤¥ë¤¬¤¢¤Ã¤¿¤é¡¤*.c ¤ËÊѹ¹¤·¤Þ¤¹¡¥ +(*.C ¤À¤È C++ ¤Î¥×¥í¥°¥é¥à¤À¤È»×¤ï¤ì¤Æ¤·¤Þ¤¦¤Î¤Ç) + +~/yoursample>% mv SAMPLE2.C sample2.c + +makefile ¤ò°Ê²¼¤Î¤è¤¦¤Ë½¤Àµ¤¹¤ë¡¥ +¡¦¥³¥ó¥Ñ¥¤¥é¤Ë¤Ï gcc ¤ò»ÈÍѤ¹¤ë¡¥ +¡¦¥ª¥Ö¥¸¥§¥¯¥È¥Õ¥¡¥¤¥ë¤ò *.obj ¤«¤é *.o ¤ËÊѹ¹¡¥ +¡¦¥³¥ó¥Ñ¥¤¥ë¥Õ¥é¥°¤Ë -I. -L. -L/usr/X11R6/lib -lwonx -lX11 -lXt ¤òÄɲᥠ+¡¦mkfent ¤Ê¤É¤Ë¤è¤ë *.fx ¥Õ¥¡¥¤¥ë¤ÎºîÀ®¤Ê¤É¤¬¤¢¤Ã¤¿¤é¡¤¥³¥á¥ó¥È¥¢¥¦¥È¤¹¤ë¡¥ + +~/yoursample>% emacs makefile + +¤ª¤½¤é¤¯¡¤makefile ¤Î½¤Àµ¤¬£²ÈÖÌܤËÌÌÅݤǤ¹¡¥(°ìÈÖÌÌÅݤʤΤϡ¤WonX ¤¬¤¦¤Þ¤¯ +ŬÍѤǤ­¤Ê¤«¤Ã¤¿¤È¤­¤Î¥½¡¼¥¹¤Î½¤Àµ¤Ç¤¹) +źÉդΠmakefile_for_smac ¤ä makefile_for_wwterm ¤ò»²¹Í¤Ë¤·¤Æ¡¤makefile ¤ò +½¤Àµ¤·¤Æ¤¯¤À¤µ¤¤¡¥ + +¼¡¤Ë¡¤sys2wonx.pl ¤ò¤«¤±¤Æ¡¤¥×¥í¥°¥é¥àÃæ¤Î #include ¤Î¤è¤¦¤Ê¤Î¤ò¡¤ +#include "wonx_include/disp.h" ¤ËÊѹ¹¤¹¤ë¡¥ +(Ãí°Õ! sys2wonx.pl ¤Ï¡¤¥Õ¥¡¥¤¥ë¤ÎËÜÂΤò½ñ¤­´¹¤¨¤Æ¤·¤Þ¤¦¤Î¤Ç¡¤Êѹ¹¤µ¤ì¤ë¤È + º¤¤ë¤è¤¦¤Ê¥Õ¥¡¥¤¥ë¤Ïɬ¤º¥Ð¥Ã¥¯¥¢¥Ã¥×¤·¤Æ¤¯¤À¤µ¤¤¡¥ + #include ¤Î¤è¤¦¤ÊÉôʬ¤¬Ìµ¤¤¥Õ¥¡¥¤¥ë¤Î¾ì¹ç¤À¤È¡¤ÆÉ¤ß¹þ¤ó¤Ç + ¤½¤Î¤Þ¤Þ½ÐÎϤ¹¤ë¤Î¤Ç¡¤¥Õ¥¡¥¤¥ë¤ÎÆâÍÆ¼«ÂΤÏÊѤï¤é¤Ê¤¤¤È»×¤¤¤Þ¤¹¤¬¡¤ + ÆüÉÕ¤ÏÊѤï¤Ã¤Æ¤·¤Þ¤¤¤Þ¤¹) + +~/yoursample>% ./sys2wonx.pl *.[ch] + +ºÇ¸å¤Ë¡¤make ¤ò¤·¤Þ¤¹¡¥ + +~/yoursample>% make + +¤¦¤Þ¤¯¤¤¤±¤Ð¡¤°ì·â¤Ç¥³¥ó¥Ñ¥¤¥ë¤¬Ä̤äơ¤¼Â¹Ô¤Ç¤­¤Þ¤¹¡¥ + +~/yoursample>% ./sample + ¢£ WonX ³µÍ× WonX ¤Ï¡¤WonderWitch ¤Î display_control() ¤È¤« display_status() ¤È¤¤¤Ã¤¿ @@ -156,7 +235,7 @@ WonX 1. WonX ¤òŸ³«¤¹¤ë¡¥ -~>% tar xvzf wonx.tar.gz +~>% tar xvzf wonx-x.x.tar.gz ~>% cd wonx ~/wonx>% @@ -286,7 +365,7 @@ smac /* ²èÌ̤Υ¯¥ê¥¢ */ for (y = 0; y < 32; y++) for (x = 0; x < 32; x++) { - screen_fill_char(0, x, y, 1, 1, 0x0000); /* ¤³¤³¤ÇËè²óºÆÉÁ²è¤µ¤ì¤ë */ + screen_fill_char(0, x, y, 1, 1, 0); /* ¤³¤³¤ÇËè²óºÆÉÁ²è¤µ¤ì¤ë */ } } @@ -329,8 +408,8 @@ WonX ´Ø¿ô¤ò¸Æ¤Ó½Ð¤·¤Æ¤â¡¤²¿¤âµ¯¤³¤ê¤Þ¤»¤ó¡¥(¶õ¤Î´Ø¿ô¤Ë¤Ê¤Ã¤Æ¤¤¤ë) ¡¦¥µ¥¦¥ó¥É -¡¦¥«¡¼¥½¥ëɽ¼¨ -¡¦¤½¤Î¾¤¤¤Ã¤Ñ¤¤ +¡¦¥×¥í¥»¥¹ +¡¦¥¤¥ó¥À¥¤¥ì¥¯¥È¥é¥¤¥Ö¥é¥ê ¢£ Ãí°Õ¤·¤Ê¤±¤ì¤Ð¤Ê¤é¤Ê¤¤¤³¤È @@ -344,8 +423,10 @@ UNIX ¤«¤Ê¤ê²óÈò¤Ç¤­¤ë¤È»×¤¤¤Þ¤¹¡¥(¥Ó¥Ã¥È¥Þ¥Ã¥×Áàºî¤Ê¤É¤Ç¡¤short int ¤Ë¤¹¤Ù¤­ ¤È¤³¤í¤Ç¤Ï¡¤¾Êά¤»¤º¤Ë¤Á¤ã¤ó¤È short int ¤ÈÌÀ¼¨¤¹¤ë¤È¤«) -¤Þ¤¢¡¤WonX ¤ÎÌÜŪ¤ÏÏÀÍýŪ¤Ê¥Ð¥°¤òÁᤤÃʳ¬¤Ç̵¤¯¤¹¤³¤È¤Ë¤¢¤ë¤Î¤Ç¡¤¤³¤Î¤Ø¤ó¤Ï -¤½¤¦¤¤¤¦¤â¤Î¤À¤È³ä¤êÀڤäƻȤäƤ¯¤À¤µ¤¤¡¥ +¤Þ¤¢¡¤WonX ¤ÎÌÜŪ¤ÏÏÀÍýŪ¤Ê¥Ð¥°¤òÁᤤÃʳ¬¤Ç̵¤¯¤¹¤³¤È¤È¡¤ +ÏÀÍýŪ¥Ð¥°¤È¥Ï¡¼¥É¤¬¤é¤ß¤Î¥Ð¥°¤òÀÚ¤êÎ¥¤·¤Æ¸¶°ø¤ò¶¹¤á¤ë¤³¤È¤È¡¤ +ºä°æ¤¬Åż֤ÎÃæ¤Ç¤â WonderWitch ¤Î¥×¥í¥°¥é¥à¤ò½ñ¤±¤ë¤è¤¦¤Ë¤¹¤ë¤³¤È¤Ë¤¢¤ë¤Î¤Ç¡¤ +¤³¤Î¤Ø¤ó¤Ï¤½¤¦¤¤¤¦¤â¤Î¤À¤È³ä¤êÀڤäƻȤäƤ¯¤À¤µ¤¤¡¥ WonX ¤ò»È¤¦¸Â¤ê¡¤¤Ê¤ë¤Ù¤¯µ¡¼ï°Í¸¤ò̵¤¯¤¹¤è¤¦¤Ë¿´¤¬¤±¤Þ¤·¤ç¤¦¡¥ (¤È¤¯¤Ë int ¤Î¥µ¥¤¥º¤Ë¤¢¤Þ¤ê°Í¸¤·¤Ê¤¤¤è¤¦¤Ë¤·¤Þ¤·¤ç¤¦) @@ -386,9 +467,9 @@ font_set_colordata() ¤Î¤Ç¡¤char * ¤ÇÄêµÁ¤·¤¿¥­¥ã¥é¥¯¥¿¥Ç¡¼¥¿¤ò short int * ¤Ë¥­¥ã¥¹¥È¤·¤Æ font_set_colordata()¤ËÅϤ¹¤Ê¤É¤Î¤³¤È¤ò¤·¤Æ¤¤¤ë¤È¡¤²èÁü¤¬¤Ò¤Ã¤¯¤êÊÖ¤ë ¤³¤È¤¬¹Í¤¨¤é¤ì¤Þ¤¹¡¥ -i386 ·Ï¤Î PC-UNIX ¤Ê¤é¤Ð¡¤¤ª¤½¤é¤¯ÌäÂê¤Ï̵¤¤¤Ç¤·¤ç¤¦¡¥ +i386 ·Ï¤Î¤¤¤ï¤æ¤ë PC-UNIX ¤Ê¤é¤Ð¡¤¤ª¤½¤é¤¯ÌäÂê¤Ï̵¤¤¤Ç¤·¤ç¤¦¡¥ -[³ä¤ê¹þ¤ß¤ÎÌäÂê] +[¥¿¥¤¥Þ³ä¤ê¹þ¤ß¤ÎÌäÂê] WonderWitch ¤Ë¤Ï¥¿¥¤¥Þ³ä¤ê¹þ¤ß¤¬¤¢¤ê¤Þ¤¹¤¬¡¤WonX ¤Îưºî¤ÏÈó¾ï¤ËÃÙ¤¤¤¿¤á¡¤ WonderWitch ¤Î»þ´Öñ°Ì¤ò¤½¤Î¤Þ¤Þ UNIX ¤Ë»ý¤Ã¤Æ¤­¤¿¤é¡¤³ä¤ê¹þ¤ß¤¬ @@ -400,6 +481,51 @@ WonderWitch Ìá¤Ã¤¿½Ö´Ö¤Ë¤Þ¤¿¥Ï¥ó¥É¥é¤¬¸Æ¤Ð¤ì¤Æ¡¤Á´Á³¼Â¹Ô¤¬Àè¤Ë¿Ê¤Þ¤Ê¤¤¡¤¤È¤¤¤¦¤³¤È¤Ë ¤Ê¤êÆÀ¤Þ¤¹¡¥ +[¥­¡¼ÆþÎϳä¤ê¹þ¤ß¡¤¥·¥ê¥¢¥ë¼õ¿®³ä¤ê¹þ¤ß¤ÎÌäÂê] + +(¤¢¤Þ¤ê¤ä¤ë¤³¤È¤Ï¤Ê¤¤¤È»×¤¤¤Þ¤¹¤¬)¥­¡¼ÆþÎϳä¤ê¹þ¤ß¤È¥­¡¼ÆþÎϸ¡ººÍÑ´Ø¿ô¤ò +Ʊ°ì¥ë¡¼¥×Æâ¤ÇÊ»ÍѤ¹¤ë¤È¡¤³ä¤ê¹þ¤ß¤Î¤È¤ê¤³¤Ü¤·¤¬µ¯¤­¤ä¤¹¤¯¤Ê¤ë²ÄǽÀ­¤¬ +¤¢¤ê¤Þ¤¹¡¥ +¤Ä¤Þ¤ê¡¤°Ê²¼¤Î¤è¤¦¤Ê¥×¥í¥°¥é¥à¤ò½ñ¤¯¤È¤­¤Ë¤ÏÃí°Õ¤·¤Æ¤¯¤À¤µ¤¤¡¥ + +void far key_handler() +{ + /* ¥­¡¼ÆþÎϤνèÍý¤¬¤³¤³¤ËÆþ¤ë */ +} + +static intvector_t key_intvector; +static intvector_t key_last_intvector; + +main() +{ + key_intvector.callback = (void (near *)())FP_OFF(key_handler); + key_intvector.cs = _asm_inline("\tmov\tax,cs"); + key_intvector.ds = _asm_inline("\tmov\tax,ds"); + + sys_interrupt_set_hook(SYS_INT_KEY, &key_intvector, &key_last_intvector); + + while (1) { + /* + * ¥­¡¼ÆþÎϳä¤ê¹þ¤ßÂÔ¤Á¤Î¾õÂ֤ʤΤˡ¤key_press_check() ¤Ç¥­¡¼ÆþÎϾõÂ֤Π+ * ¸¡ºº¤â¹Ô¤¦ + */ + key = key_press_check(); + /* ¤Ê¤ó¤«Å¬Åö¤Ê½èÍý¤ò¤³¤Î¤Ø¤ó¤Ç¹Ô¤Ã¤¿¤ê¤¹¤ë */ + } +} + +¥­¡¼ÆþÎϳä¤ê¹þ¤ß¤òÂÔ¤Á¤Ê¤¬¤é¡¤key_press_check() ¤Ç¥­¡¼¤ÎÆþÎϾõÂÖ¤ò +Ê̸Ĥ˸¡ºº¤¹¤ë¡¤¤È¤¤¤¦¤³¤È¤ò¤ä¤ë¤È¡¤³ä¤ê¹þ¤ß¤Î¤È¤ê¤³¤Ü¤·¤¬µ¯¤­¤ë²ÄǽÀ­¤¬ +¤¢¤ê¤Þ¤¹¡¥ +(¤¿¤À¤·¡¤¥­¡¼ÆþÎϳä¤ê¹þ¤ß¤Ë¤è¤Ã¤Æ¸Æ¤Ó½Ð¤µ¤ì¤ë³ä¤ê¹þ¤ß¥Ï¥ó¥É¥éÆâ¤Ç + key_press_check() ¤ò»ÈÍѤ¹¤ë¤³¤È¤ÏÌäÂꤢ¤ê¤Þ¤»¤ó¡¥(¤Ç¤Ê¤¤¤È³ä¤ê¹þ¤ß¤Î + °ÕÌ£¤¬Ìµ¤¯¤Ê¤Ã¤Æ¤·¤Þ¤¦¤·¤Í) ¤¢¤¯¤Þ¤Ç¡¤Æ±¤¸¥ë¡¼¥×Æâ¤ÇÊ»ÍѤ¹¤ë¤ÈÌäÂ꤬ + ȯÀ¸¤¹¤ë²ÄǽÀ­¤¬¤¢¤ë¡¤¤È¤¤¤¦¤³¤È¤Ç¤¹) + +¤Ç¤â¡¤¤³¤ó¤Ê¤Ø¤ó¤Ê¥×¥í¥°¥é¥à¤¢¤Þ¤ê½ñ¤¯¤³¤È̵¤¤¤À¤í¤¦¤·¡¤¤¤¤¤¤«¤Ê¤È»×¤Ã¤Æ¤Þ¤¹¡¥ +(¤³¤ì¤òľ¤½¤¦¤È¤¹¤ë¤È¡¤¤È¤Æ¤â¤¿¤¤¤Ø¤ó¤Ê¤Î¤Ç) +¤³¤Î¤³¤È¤Ï¡¤¥·¥ê¥¢¥ë¼õ¿®³ä¤ê¹þ¤ß¤Ë´Ø¤·¤Æ¤â¡¤Æ±ÍͤǤ¹¡¥ + [¥­¡¼ÆþÎϤˤĤ¤¤Æ] ¥­¡¼ÆþÎϤϡ¤¥­¡¼ÆþÎÏÍÑ´Ø¿ô¤¬¸Æ¤Ð¤ì¤¿¤È¤­¤Î¤ß´¶ÃΤ¹¤ë¤Î¤Ç¡¤Ä¹¤á¤Ë²¡¤·¤Æ¤Ê¤¤¤È @@ -420,6 +546,8 @@ gcc -g -o smac $(OBJS) -L. -L/usr/X11R6/lib -lwonx -lX11 -lXt ¤Î¤è¤¦¤Ê¹Ô¤¬¤¢¤Ã¤¿¤È¤·¤Æ¡¤¤³¤ì¤¬ MS-DOS ¤Î¥Æ¥­¥¹¥È·Á¼°¤Î¥Õ¥¡¥¤¥ë¤À¤È¡¤ -lXt ¤Î¤¢¤È¤Ë;ʬ¤Ê²þ¹Ô¥³¡¼¥É(\r)¤¬Éղäµ¤ì¤Æ¤·¤Þ¤¦¤¿¤á¡¤UNIX ¾å¤Ç make ¤·¤Æ¤â¡¤¡Ö-lXt ¤ËÁêÅö¤¹¤ë¥é¥¤¥Ö¥é¥ê¤¬Ìµ¤¤¡×¤ÈÅܤé¤ì¤Æ¤·¤Þ¤¤¤Þ¤¹¡¥ +(¼ÂºÝ¤Ë¤Ï¥³¥ó¥Ñ¥¤¥é¤Ï¡¤-lXt\r ¤À¤È»×¤Ã¤Æ¤·¤Þ¤Ã¤Æ¡¤libXt\r.a ¤È¤¤¤¦¥é¥¤¥Ö¥é¥ê¤ò + õ¤·¤Æ¤·¤Þ¤¦¤Î¤Ç¤¹) (¤·¤«¤â¡¤¥Õ¥¡¥¤¥ë¤ò emacs ¤ä less ¤Ê¤É¤Ç»²¾È¤·¤Æ¤â¡¤²þ¹Ô¥³¡¼¥É¤Ïɽ¼¨¤µ¤ì¤Ê¤¤ ¤¿¤á¡¤¸¶°ø¤¬¤ï¤«¤ê¤Ë¤¯¤¤) ¤Þ¤¿¡¤ @@ -458,7 +586,66 @@ SAMPLE.C źÉդΠsout2str.pl ¤òÄ̤¹¤³¤È¤Ë¤è¤ê¡¤¥·¥ê¥¢¥ëÄÌ¿®¤Ø¤Î½ÐÎϤΤßÃê½Ð¤·¤Æ¡¤ üËö¤Ø¤Î½ÐÎϤΥ¤¥á¡¼¥¸¤Çɽ¼¨¤µ¤»¤ë¤³¤È¤¬¤Ç¤­¤Þ¤¹¡¥ -[¥½¡¼¥¹Ãæ¤Î WonX °Í¸Éôʬ¤Î¤¯¤¯¤ê¤«¤¿] +¢£ ³ä¤ê¹þ¤ß¤Ë¤Ä¤¤¤Æ + +¥­¡¼ÆþÎϳä¤ê¹þ¤ß¤ä¥·¥ê¥¢¥ë¼õ¿®³ä¤ê¹þ¤ß¤Ê¤É¤Ï¡¤UNIX¤Î¥¢¥é¡¼¥à¥·¥°¥Ê¥ë¤ò +ÍøÍѤ·¤Æ¼ÂÁõ¤·¤Æ¤¤¤Þ¤¹¡¥(°ìÄê»þ´Ö¤ª¤­¤Ë¥Ý¡¼¥ê¥ó¥°¤·¤Æ¤¤¤ë) +¤·¤¿¤¬¤Ã¤Æ¡¤°Ê²¼¤Î¤è¤¦¤Ê¥×¥í¥°¥é¥à¤â¥³¥ó¥Ñ¥¤¥ë¤·¤ÆÀµ¾ï¤Ëưºî¤µ¤»¤ë +¤³¤È¤¬¤Ç¤­¤Þ¤¹¡¥ + +void far key_handler() +{ + int key; + key = key_press_check(); + /* ¥­¡¼ÆþÎϤνèÍý¤¬¤³¤³¤ËÆþ¤ë */ +} + +/* ¥·¥ê¥¢¥ë¼õ¿®¤Î³ä¤ê¹þ¤ß¥Ï¥ó¥É¥é */ +void far com_handler() +{ + int c; + c = comm_receive_char(); + /* ¥·¥ê¥¢¥ë¼õ¿®¤Î½èÍý¤¬¤³¤³¤ËÆþ¤ë */ +} + +static intvector_t key_intvector; +static intvector_t key_last_intvector; +static intvector_t com_intvector; +static intvector_t com_last_intvector; + +main() +{ + key_intvector.callback = (void (near *)())FP_OFF(key_handler); + com_intvector.callback = (void (near *)())FP_OFF(com_handler); + key_intvector.cs = _asm_inline("\tmov\tax,cs"); + key_intvector.ds = _asm_inline("\tmov\tax,ds"); + com_intvector.cs = _asm_inline("\tmov\tax,cs"); + com_intvector.ds = _asm_inline("\tmov\tax,ds"); + + sys_interrupt_set_hook(SYS_INT_KEY, + &key_intvector, &key_last_intvector); + sys_interrupt_set_hook(SYS_INT_RECEIVEREADY, + &com_intvector, &com_last_intvector); + + while (1) { + /* ̵¸Â¥ë¡¼¥×¡¥³ä¤ê¹þ¤ß¤¬Æþ¤Ã¤¿¤é¡¤¤½¤Î¥Ï¥ó¥É¥é¤ËÈô¤Ö */ + } +} + +_asm_inline() ¤Ï¾ï¤Ë0¤òÊÖ¤¹¥À¥ß¡¼´Ø¿ô¤È¤·¤ÆÄêµÁ¤µ¤ì¤Æ¤¤¤Þ¤¹¡¥ +¤Þ¤¿¡¤FP_OFF(), FP_SEG() ¤Ï¡¤ +#define FP_OFF(p) (p) +#define FP_SEG(p) (0) +¤Î¤è¤¦¤ËÄêµÁ¤µ¤ì¤Æ¤¤¤Þ¤¹¡¥¤è¤Ã¤Æ¡¤¾åµ­¤Î¤è¤¦¤Ê¥×¥í¥°¥é¥à¤â WonX ¤Ç +¥³¥ó¥Ñ¥¤¥ë¤·¤Æ¼Â¹Ô¤¹¤ë¤³¤È¤¬¤Ç¤­¤Þ¤¹¡¥ + +¤³¤Î¤è¤¦¤Ë¡¤while (1) {} ¤Ç̵¸Â¥ë¡¼¥×¤ò²ó¤·¤Æ¡¤³ä¤ê¹þ¤ß¤¬¤¢¤Ã¤¿¤È¤­¤À¤± +½èÍý¤¹¤ë¤è¤¦¤Ê¥×¥í¥°¥é¥à¤ò½ñ¤¤¤Æ¤â¡¤Àµ¾ï¤Ëưºî¤·¤Þ¤¹¡¥ +¤·¤«¤·¡¤¥­¡¼ÆþÎϤϥݡ¼¥ê¥ó¥°¤µ¤ì¤Æ¤¤¤ë¤È¤­¤·¤«´¶ÃΤµ¤ì¤Ê¤¤¤Î¤Ç¡¤ +¥­¡¼ÆþÎϳä¤ê¹þ¤ß¤ò¤«¤±¤ë¤Ë¤Ï¡¤Ä¹¤á¤Ë¥­¡¼¤ò²¡¤·¤Æ¤ä¤ëɬÍפ¬¤¢¤ê¤Þ¤¹¡¥ +(¥­¡¼¤Ï´ðËÜŪ¤ËÆß¤¤¤Î¤Ç¡¤È¿±þ¤¹¤ë¤Þ¤ÇŤá¤Ë²¡¤·¤Æ¤¯¤À¤µ¤¤) + +¢£ ¥½¡¼¥¹Ãæ¤Î WonX °Í¸Éôʬ¤Î¤¯¤¯¤ê¤«¤¿ WonderWitch ÍÑ¤Î¥×¥í¥°¥é¥à¤ò³«È¯¤·¤Æ¤¤¤¯ºÝ¤Ë¡¤WonX ¤Î¾ì¹ç¤Î¤ßÁȤ߹þ¤ß¤¿¤¯¤Æ¡¤ WonderSwan ¾å¤Ç¼Â¹Ô¤¹¤ë¤È¤­¤Ë¤Ï¼è¤ê½ü¤­¤¿¤¤¥³¡¼¥É¤¬¤¢¤Ã¤¿¤È¤·¤Þ¤¹¡¥ @@ -467,7 +654,7 @@ WonderSwan #define _WONX_ ¤·¤Æ¤¢¤ë¤Î¤Ç¡¤¤½¤Î¤è¤¦¤Ê¾ì½ê¤Ï #ifdef _WONX_ ¤Ç¤¯¤¯¤Ã¤Æ¤¯¤À¤µ¤¤¡¥ -[¥À¥ó¥×¥Ç¡¼¥¿¤Î¼è¤ê¤«¤¿] +¢£ ¥À¥ó¥×¥Ç¡¼¥¿¤Î¼è¤ê¤«¤¿ ¥½¡¼¥¹Ãæ¤Ë¡¤ diff --git a/UNIXSerialPort.c b/UNIXSerialPort.c new file mode 100644 index 0000000..3b3f0fe --- /dev/null +++ b/UNIXSerialPort.c @@ -0,0 +1,180 @@ +/*****************************************************************************/ +/* ¤³¤³¤«¤é */ +/*****************************************************************************/ + +#include +#include +#include +#include + +#include "UNIXSerialPortP.h" +#include "WonX.h" +#include "etc.h" + +/*****************************************************************************/ +/* ¥á¥ó¥Ð´Ø¿ô¤ÎÄêµÁ */ +/*****************************************************************************/ + +/*---------------------------------------------------------------------------*/ +/* ¥Ý¡¼¥È¤Î open/close */ +/*---------------------------------------------------------------------------*/ + +int UNIXSerialPort_Open(UNIXSerialPort unix_serial_port) +{ + unix_serial_port->opened = 1; + return (0); +} +int UNIXSerialPort_Close(UNIXSerialPort unix_serial_port) +{ + unix_serial_port->opened = 0; + return (0); +} + +int UNIXSerialPort_IsOpened(UNIXSerialPort unix_serial_port) +{ return (unix_serial_port->opened != 0); } +int UNIXSerialPort_IsClosed(UNIXSerialPort unix_serial_port) +{ return (unix_serial_port->opened == 0); } + +/*---------------------------------------------------------------------------*/ +/* ¼õ¿®¥Ç¡¼¥¿¤¬¤¢¤ë¤«¤É¤¦¤« */ +/*---------------------------------------------------------------------------*/ + +/* + * ¥¿¥¤¥à¥¢¥¦¥È»þ´Ö¤ò¥ß¥êÉÃñ°Ì¤Ç»ØÄê¡¥ + * 0 ¤Î¤È¤­¤Ï¡¤Â¨»þ + * -1 ¤Î¤È¤­¤Ï¡¤Ìµ´ü¸ÂÂÔ¤Á + */ + +int UNIXSerialPort_IsDataExisting(UNIXSerialPort unix_serial_port, + int timeout) +{ + fd_set bitmap; + struct timeval t; + struct timeval * t_p; +#if 0 + int c; +#endif + + if (UNIXSerialPort_IsClosed(unix_serial_port)) return (0); + + /* + * 0 ¤Î¤È¤­¤Ï¡¤Â¨»þ + * -1 ¤Î¤È¤­¤Ï¡¤Ìµ´ü¸ÂÂÔ¤Á + */ + if (timeout == -1) { + t_p = NULL; + } else { + t.tv_sec = timeout / 1000; + t.tv_usec = (timeout % 1000) * 1000; + t_p = &t; + } + + /* + * FreeBSD3.4 ¤Ç¼Â¸³¤·¤¿¤È¤³¤í¡¤ + * ¥¢¥é¡¼¥à¥·¥°¥Ê¥ë¤ò»ÈÍѤ¹¤ë¾ì¹ç¡¤select()¤Ç¤Î¥Ö¥í¥Ã¥¯Ãæ¤Ë + * ¥¢¥é¡¼¥à¥·¥°¥Ê¥ë¤¬È¯À¸¤¹¤ë¤È¡¤¤½¤Îľ¸å¤Ëselect()¤â¥¿¥¤¥à¥¢¥¦¥È + * ¤·¤Æ¤·¤Þ¤¦¤Î¤Ç¡¤Ãí°Õ¡¥ + * (select() ¤¬¥¿¥¤¥à¥¢¥¦¥È¤·¤¿¸å¤Ë¥¢¥é¡¼¥à¥·¥°¥Ê¥ë¤¬È¯À¸¤¹¤ë¾ì¹ç¤Ï¡¤ + * Àµ¾ï¤Ëưºî¤·¤¿) + * ÏÀÍý¾å¤ÏÌäÂ̵꤬¤¤¤¬¡¤´üÂÔ¤·¤¿»þ´Ö¤À¤±ÂԤäƤ¯¤ì¤Ê¤¤¤È¤¤¤¦¸½¾Ý¤¬ + * µ¯¤­¤ë²ÄǽÀ­¤¬¤¢¤ë¡¥ + */ + +#if 0 + /* ÆÉ¤ßÈô¤Ð¤·¤¿¤¤Ê¸»ú¤¬¤¢¤ë¤È¤­¤Ï¡¤¤³¤Ã¤Á¤Î¥³¡¼¥É¤ò»È¤¦ */ + do { + FD_ZERO(&bitmap); + FD_SET(fileno(stdin), &bitmap); + select(fileno(stdin) + 1, &bitmap, NULL, NULL, t_p); + + if (!FD_ISSET(fileno(stdin), &bitmap)) + return (0); + + c = fgetc(stdin); + } while (0); /* ÆÉ¤ßÈô¤Ð¤·¤¿¤¤Ê¸»ú¤¬¤¢¤ë¤È¤­¤Ï¡¤¤³¤³¤Çc¤ò¥Á¥§¥Ã¥¯¤¹¤ë */ + ungetc(c, stdin); +#else + FD_ZERO(&bitmap); + FD_SET(fileno(stdin), &bitmap); + select(fileno(stdin) + 1, &bitmap, NULL, NULL, t_p); + + if (!FD_ISSET(fileno(stdin), &bitmap)) + return (0); +#endif + + return (1); +} + +/*---------------------------------------------------------------------------*/ +/* ¼õ¿® */ +/*---------------------------------------------------------------------------*/ + +int UNIXSerialPort_ReceiveCharacter(UNIXSerialPort unix_serial_port, + int timeout) +{ + int c; + + if (UNIXSerialPort_IsClosed(unix_serial_port)) return (-1); + + c = UNIXSerialPort_IsDataExisting(unix_serial_port, timeout) + ? fgetc(stdin) : -1; + c = (c == '\n') ? '\r' : c; /* \r ¤Î¥¨¥ß¥å¥ì¡¼¥·¥ç¥ó */ + + return (c); +} + +/*---------------------------------------------------------------------------*/ +/* Á÷¿® */ +/*---------------------------------------------------------------------------*/ + +int UNIXSerialPort_SendCharacter(UNIXSerialPort unix_serial_port, + unsigned char c) +{ + if (UNIXSerialPort_IsClosed(unix_serial_port)) return (0); + + wonx_print_character(stdout, c); + + return (1); +} + +/*---------------------------------------------------------------------------*/ +/* ¥ª¥Ö¥¸¥§¥¯¥È¤ÎºîÀ® */ +/*---------------------------------------------------------------------------*/ + +UNIXSerialPort UNIXSerialPort_Create() +{ + UNIXSerialPort unix_serial_port; + + unix_serial_port = (UNIXSerialPort)malloc(sizeof(_UNIXSerialPort)); + if (unix_serial_port == NULL) + WonX_Error("UNIXSerialPort_Create", "Cannot allocate memory."); + + unix_serial_port->opened = 0; + + return (unix_serial_port); +} + +/*---------------------------------------------------------------------------*/ +/* ¥ª¥Ö¥¸¥§¥¯¥È¤Îºï½ü */ +/*---------------------------------------------------------------------------*/ + +UNIXSerialPort UNIXSerialPort_Destroy(UNIXSerialPort unix_serial_port) +{ + if (unix_serial_port == NULL) + WonX_Error("UNIXSerialPort_Destroy", "Object is not created."); + + if (UNIXSerialPort_IsOpened(unix_serial_port)) + UNIXSerialPort_Close(unix_serial_port); + + free(unix_serial_port); + + return (NULL); +} + +/*****************************************************************************/ +/* ¤³¤³¤Þ¤Ç */ +/*****************************************************************************/ + +/*****************************************************************************/ +/* End of File. */ +/*****************************************************************************/ diff --git a/UNIXSerialPort.h b/UNIXSerialPort.h new file mode 100644 index 0000000..8176d08 --- /dev/null +++ b/UNIXSerialPort.h @@ -0,0 +1,82 @@ +#ifndef _UNIXSerialPort_h_INCLUDED_ +#define _UNIXSerialPort_h_INCLUDED_ + +/*****************************************************************************/ +/* ¤³¤³¤«¤é */ +/*****************************************************************************/ + +/*****************************************************************************/ +/* ¥¯¥é¥¹¤ÎÄêµÁ */ +/*****************************************************************************/ + +typedef struct _UNIXSerialPort * UNIXSerialPort; + +/*****************************************************************************/ +/* ¥Ø¥Ã¥À¥Õ¥¡¥¤¥ë¤Î¥¤¥ó¥¯¥ë¡¼¥É */ +/*****************************************************************************/ + +#include +#include + +/*****************************************************************************/ +/* ¥á¥ó¥Ð´Ø¿ô¤ÎÀë¸À */ +/*****************************************************************************/ + +/*---------------------------------------------------------------------------*/ +/* ¥Ý¡¼¥È¤Î open/close */ +/*---------------------------------------------------------------------------*/ + +int UNIXSerialPort_Open(UNIXSerialPort unix_serial_port); +int UNIXSerialPort_Close(UNIXSerialPort unix_serial_port); + +int UNIXSerialPort_IsOpened(UNIXSerialPort unix_serial_port); +int UNIXSerialPort_IsClosed(UNIXSerialPort unix_serial_port); + +/*---------------------------------------------------------------------------*/ +/* ¼õ¿®¥Ç¡¼¥¿¤¬¤¢¤ë¤«¤É¤¦¤« */ +/*---------------------------------------------------------------------------*/ + +/* + * ¥¿¥¤¥à¥¢¥¦¥È»þ´Ö¤ò¥ß¥êÉÃñ°Ì¤Ç»ØÄê¡¥ + * 0 ¤Î¤È¤­¤Ï¡¤Â¨»þ + * -1 ¤Î¤È¤­¤Ï¡¤Ìµ´ü¸ÂÂÔ¤Á + */ + +int UNIXSerialPort_IsDataExisting(UNIXSerialPort unix_serial_port, + int timeout); + +/*---------------------------------------------------------------------------*/ +/* ¼õ¿® */ +/*---------------------------------------------------------------------------*/ + +int UNIXSerialPort_ReceiveCharacter(UNIXSerialPort unix_serial_port, + int timeout); + +/*---------------------------------------------------------------------------*/ +/* Á÷¿® */ +/*---------------------------------------------------------------------------*/ + +int UNIXSerialPort_SendCharacter(UNIXSerialPort unix_serial_port, + unsigned char c); + +/*---------------------------------------------------------------------------*/ +/* ¥ª¥Ö¥¸¥§¥¯¥È¤ÎºîÀ® */ +/*---------------------------------------------------------------------------*/ + +UNIXSerialPort UNIXSerialPort_Create(); + +/*---------------------------------------------------------------------------*/ +/* ¥ª¥Ö¥¸¥§¥¯¥È¤Îºï½ü */ +/*---------------------------------------------------------------------------*/ + +UNIXSerialPort UNIXSerialPort_Destroy(UNIXSerialPort unix_serial_port); + +/*****************************************************************************/ +/* ¤³¤³¤Þ¤Ç */ +/*****************************************************************************/ + +#endif + +/*****************************************************************************/ +/* End of File. */ +/*****************************************************************************/ diff --git a/WonXTextP.h b/UNIXSerialPortP.h similarity index 84% rename from WonXTextP.h rename to UNIXSerialPortP.h index f639cd2..b376159 100644 --- a/WonXTextP.h +++ b/UNIXSerialPortP.h @@ -1,19 +1,19 @@ -#ifndef _WonXTextP_h_INCLUDED_ -#define _WonXTextP_h_INCLUDED_ +#ifndef _UNIXSerialPortP_h_INCLUDED_ +#define _UNIXSerialPortP_h_INCLUDED_ /*****************************************************************************/ /* ¤³¤³¤«¤é */ /*****************************************************************************/ -#include "WonXText.h" +#include "UNIXSerialPort.h" /*****************************************************************************/ /* ¥¯¥é¥¹¤ÎÄêµÁ */ /*****************************************************************************/ -typedef struct _WonXText { - WWText ww_text; -} _WonXText; +typedef struct _UNIXSerialPort { + int opened; /* open/close */ +} _UNIXSerialPort; /*****************************************************************************/ /* ¤³¤³¤Þ¤Ç */ diff --git a/UNIXTimer.c b/UNIXTimer.c index 133e3b3..ba8450e 100644 --- a/UNIXTimer.c +++ b/UNIXTimer.c @@ -6,7 +6,7 @@ #include #include "UNIXTimerP.h" -#include "etc.h" +#include "WonX.h" /*****************************************************************************/ /* ¥á¥ó¥Ð´Ø¿ô¤ÎÄêµÁ */ @@ -171,6 +171,8 @@ int UNIXTimer_Unpause(UNIXTimer unix_timer) { if (unix_timer->pause == 0) WonX_Error("UNIXTimer_Unpause", "Duplicated unpause."); + if (unix_timer->pause < 0) + WonX_Error("UNIXTimer_Unpause", "Invalid pause."); if (unix_timer->pause == 1) { if (unix_timer->interrupt_in_pause > 0) { @@ -198,6 +200,10 @@ int UNIXTimer_Unpause(UNIXTimer unix_timer) /* ¥³¡¼¥ë¥Ð¥Ã¥¯´Ø¿ô¤Î¸Æ¤Ó½Ð¤· */ UNIXTimer_CallBackFunction(0); + } else { + if (unix_timer->interrupt_in_pause < 0) + WonX_Error("UNIXTimer_Unpause", "Invalid interrupt_in_pause."); + unix_timer->pause--; /* ¥Ý¡¼¥º¤Ï¥Í¥¹¥È¤Ç¤­¤ë */ } } else { unix_timer->pause--; /* ¥Ý¡¼¥º¤Ï¥Í¥¹¥È¤Ç¤­¤ë */ diff --git a/UNIXTimer.h b/UNIXTimer.h index 7fa6b42..431b8be 100644 --- a/UNIXTimer.h +++ b/UNIXTimer.h @@ -5,9 +5,6 @@ /* ¤³¤³¤«¤é */ /*****************************************************************************/ -#include -#include - /*****************************************************************************/ /* ¥¯¥é¥¹¤ÎÄêµÁ */ /*****************************************************************************/ @@ -15,6 +12,13 @@ typedef struct _UNIXTimer * UNIXTimer; typedef int (*UNIXTimerCallBack)(void *); +/*****************************************************************************/ +/* ¥Ø¥Ã¥À¥Õ¥¡¥¤¥ë¤Î¥¤¥ó¥¯¥ë¡¼¥É */ +/*****************************************************************************/ + +#include +#include + /*****************************************************************************/ /* ¥á¥ó¥Ð´Ø¿ô¤ÎÀë¸À */ /*****************************************************************************/ diff --git a/WWCharacter.c b/WWCharacter.c index 8b469b6..c0f5eb3 100644 --- a/WWCharacter.c +++ b/WWCharacter.c @@ -3,7 +3,7 @@ /*****************************************************************************/ #include "WWCharacterP.h" -#include "etc.h" +#include "WonX.h" /*****************************************************************************/ /* ¥á¥ó¥Ð´Ø¿ô¤ÎÄêµÁ */ diff --git a/WWCharacter.h b/WWCharacter.h index ddbb9a0..d52e1ee 100644 --- a/WWCharacter.h +++ b/WWCharacter.h @@ -5,15 +5,19 @@ /* ¤³¤³¤«¤é */ /*****************************************************************************/ -#include -#include - /*****************************************************************************/ /* ¥¯¥é¥¹¤ÎÄêµÁ */ /*****************************************************************************/ typedef struct _WWCharacter * WWCharacter; +/*****************************************************************************/ +/* ¥Ø¥Ã¥À¥Õ¥¡¥¤¥ë¤Î¥¤¥ó¥¯¥ë¡¼¥É */ +/*****************************************************************************/ + +#include +#include + /*****************************************************************************/ /* ¥á¥ó¥Ð´Ø¿ô¤ÎÀë¸À */ /*****************************************************************************/ diff --git a/WWColorMap.c b/WWColorMap.c index 4acf0ad..4d206ec 100644 --- a/WWColorMap.c +++ b/WWColorMap.c @@ -3,7 +3,7 @@ /*****************************************************************************/ #include "WWColorMapP.h" -#include "etc.h" +#include "WonX.h" /*****************************************************************************/ /* ¥á¥ó¥Ð´Ø¿ô¤ÎÄêµÁ */ diff --git a/WWColorMap.h b/WWColorMap.h index fb6c53b..7c3461f 100644 --- a/WWColorMap.h +++ b/WWColorMap.h @@ -5,15 +5,19 @@ /* ¤³¤³¤«¤é */ /*****************************************************************************/ -#include -#include - /*****************************************************************************/ /* ¥¯¥é¥¹¤ÎÄêµÁ */ /*****************************************************************************/ typedef struct _WWColorMap * WWColorMap; +/*****************************************************************************/ +/* ¥Ø¥Ã¥À¥Õ¥¡¥¤¥ë¤Î¥¤¥ó¥¯¥ë¡¼¥É */ +/*****************************************************************************/ + +#include +#include + /*****************************************************************************/ /* ¥á¥ó¥Ð´Ø¿ô¤ÎÀë¸À */ /*****************************************************************************/ diff --git a/WWCursor.c b/WWCursor.c new file mode 100644 index 0000000..f3f8c1c --- /dev/null +++ b/WWCursor.c @@ -0,0 +1,67 @@ +/*****************************************************************************/ +/* ¤³¤³¤«¤é */ +/*****************************************************************************/ + +#include "WWCursorP.h" +#include "WonX.h" + +/*****************************************************************************/ +/* ¥á¥ó¥Ð´Ø¿ô¤ÎÄêµÁ */ +/*****************************************************************************/ + +int WWCursor_ON( WWCursor p) { return (p->on = 1); } +int WWCursor_OFF( WWCursor p) { return (p->on = 0); } +int WWCursor_IsON( WWCursor p) { return (p->on != 0); } +int WWCursor_IsOFF(WWCursor p) { return (p->on == 0); } + +int WWCursor_GetX( WWCursor p ) { return (p->x ); } +int WWCursor_SetX( WWCursor p, int n) { return (p->x = n); } +int WWCursor_GetY( WWCursor p ) { return (p->y ); } +int WWCursor_SetY( WWCursor p, int n) { return (p->y = n); } +int WWCursor_GetWidth( WWCursor p ) { return (p->width ); } +int WWCursor_SetWidth( WWCursor p, int n) { return (p->width = n); } +int WWCursor_GetHeight( WWCursor p ) { return (p->height ); } +int WWCursor_SetHeight( WWCursor p, int n) { return (p->height = n); } +int WWCursor_GetInterval(WWCursor p ) { return (p->interval ); } +int WWCursor_SetInterval(WWCursor p, int n) { return (p->interval = n); } + +WWPalette WWCursor_GetPalette(WWCursor p) +{ return (p->palette ); } +WWPalette WWCursor_SetPalette(WWCursor p, WWPalette plt) +{ return (p->palette = plt); } + +WWCursor WWCursor_Create(WWPalette palette) +{ + WWCursor cursor; + + cursor = (WWCursor)malloc(sizeof(_WWCursor)); + if (cursor == NULL) + WonX_Error("WWCursor_Create", "Cannot allocate memory"); + + WWCursor_OFF(cursor); + + WWCursor_SetX( cursor, 0); + WWCursor_SetY( cursor, 0); + WWCursor_SetWidth( cursor, 1); + WWCursor_SetHeight( cursor, 1); + WWCursor_SetInterval(cursor, 30); + + WWCursor_SetPalette(cursor, palette); + + return (cursor); +} + +WWCursor WWCursor_Destroy(WWCursor cursor) +{ + if (cursor == NULL) return (NULL); + free(cursor); + return (NULL); +} + +/*****************************************************************************/ +/* ¤³¤³¤Þ¤Ç */ +/*****************************************************************************/ + +/*****************************************************************************/ +/* End of File. */ +/*****************************************************************************/ diff --git a/WWCursor.h b/WWCursor.h new file mode 100644 index 0000000..f9e80e7 --- /dev/null +++ b/WWCursor.h @@ -0,0 +1,57 @@ +#ifndef _WWCursor_h_INCLUDED_ +#define _WWCursor_h_INCLUDED_ + +/*****************************************************************************/ +/* ¤³¤³¤«¤é */ +/*****************************************************************************/ + +/*****************************************************************************/ +/* ¥¯¥é¥¹¤ÎÄêµÁ */ +/*****************************************************************************/ + +typedef struct _WWCursor * WWCursor; + +/*****************************************************************************/ +/* ¥Ø¥Ã¥À¥Õ¥¡¥¤¥ë¤Î¥¤¥ó¥¯¥ë¡¼¥É */ +/*****************************************************************************/ + +#include +#include + +#include "WWPalette.h" + +/*****************************************************************************/ +/* ¥á¥ó¥Ð´Ø¿ô¤ÎÀë¸À */ +/*****************************************************************************/ + +int WWCursor_ON( WWCursor p); +int WWCursor_OFF( WWCursor p); +int WWCursor_IsON( WWCursor p); +int WWCursor_IsOFF(WWCursor p); + +int WWCursor_GetX( WWCursor p ); +int WWCursor_SetX( WWCursor p, int n); +int WWCursor_GetY( WWCursor p ); +int WWCursor_SetY( WWCursor p, int n); +int WWCursor_GetWidth( WWCursor p ); +int WWCursor_SetWidth( WWCursor p, int n); +int WWCursor_GetHeight( WWCursor p ); +int WWCursor_SetHeight( WWCursor p, int n); +int WWCursor_GetInterval(WWCursor p ); +int WWCursor_SetInterval(WWCursor p, int n); + +WWPalette WWCursor_GetPalette(WWCursor p); +WWPalette WWCursor_SetPalette(WWCursor p, WWPalette plt); + +WWCursor WWCursor_Create(WWPalette palette); +WWCursor WWCursor_Destroy(WWCursor cursor); + +/*****************************************************************************/ +/* ¤³¤³¤Þ¤Ç */ +/*****************************************************************************/ + +#endif + +/*****************************************************************************/ +/* End of File. */ +/*****************************************************************************/ diff --git a/WonXText.h b/WWCursorP.h similarity index 69% rename from WonXText.h rename to WWCursorP.h index 99b3f81..1a3984a 100644 --- a/WonXText.h +++ b/WWCursorP.h @@ -1,25 +1,23 @@ -#ifndef _WonXText_h_INCLUDED_ -#define _WonXText_h_INCLUDED_ +#ifndef _WWCursorP_h_INCLUDED_ +#define _WWCursorP_h_INCLUDED_ /*****************************************************************************/ /* ¤³¤³¤«¤é */ /*****************************************************************************/ -#include "WWText.h" -#include "WWScreen.h" -#include "WWPalette.h" +#include "WWCursor.h" /*****************************************************************************/ /* ¥¯¥é¥¹¤ÎÄêµÁ */ /*****************************************************************************/ -typedef struct _WonXText * WonXText; - -WWText WonXText_GetWWText(WonXText wonx_text); -WWText WonXText_SetWWText(WonXText wonx_text, WWText ww_text); -WonXText WonXText_Create(WWScreen screen, int x, int y, int width, int height, - WWPalette palette); -WonXText WonXText_Destroy(WonXText wonx_text); +typedef struct _WWCursor { + int on; /* ɽ¼¨/Èóɽ¼¨¤Î¥Õ¥é¥° */ + int x, y; /* ¥«¡¼¥½¥ëºÂɸ */ + int width, height; /* ¥«¡¼¥½¥ë¤Î¥µ¥¤¥º */ + int interval; /* ÅÀÌǼþ´ü */ + WWPalette palette; /* ¥«¡¼¥½¥ëɽ¼¨Íѥѥì¥Ã¥È */ +} _WWCursor; /*****************************************************************************/ /* ¤³¤³¤Þ¤Ç */ diff --git a/WWDisplay.c b/WWDisplay.c index ae4baf5..c2700af 100644 --- a/WWDisplay.c +++ b/WWDisplay.c @@ -2,8 +2,11 @@ /* ¤³¤³¤«¤é */ /*****************************************************************************/ +#include "wonx_include/disp.h" +#include "wonx_include/text.h" + #include "WWDisplayP.h" -#include "etc.h" +#include "WonX.h" /*****************************************************************************/ /* ¥á¥ó¥Ð´Ø¿ô¤ÎÄêµÁ */ @@ -20,6 +23,8 @@ WWCharacter WWDisplay_GetCharacter(WWDisplay d, int n) WWSprite WWDisplay_GetSprite(WWDisplay d, int n) { return (d->sprite[n]); } WWScreen WWDisplay_GetScreen(WWDisplay d, int n) { return (d->screen[n]); } WWLCDPanel WWDisplay_GetLCDPanel(WWDisplay d) { return (d->lcd_panel); } +WWText WWDisplay_GetText(WWDisplay d) { return (d->text); } +WWCursor WWDisplay_GetCursor(WWDisplay d) { return (d->cursor); } int WWDisplay_GetSpriteEnable(WWDisplay d) { return (d->sprite_enable); } int WWDisplay_GetSpriteWindowEnable(WWDisplay d) @@ -58,6 +63,10 @@ WWScreen WWDisplay_SetScreen(WWDisplay d, int n, WWScreen s) { return (d->screen[n] = s); } WWLCDPanel WWDisplay_SetLCDPanel(WWDisplay d, WWLCDPanel p) { return (d->lcd_panel = p); } +WWText WWDisplay_SetText(WWDisplay d, WWText p) +{ return (d->text = p); } +WWCursor WWDisplay_SetCursor(WWDisplay d, WWCursor p) +{ return (d->cursor = p); } int WWDisplay_SetSpriteEnable(WWDisplay d, int f) { return (d->sprite_enable = f); } @@ -94,16 +103,29 @@ WWDisplay WWDisplay_Create(int lcd_panel_width, int lcd_panel_height, { WWDisplay display; int i; + static int default_lcd_colors[] = { + 0x00, 0x02, 0x04, 0x06, 0x08, 0x0a, 0x0c, 0x0f + }; + static struct palette_colors { + int colors[4]; + } default_palette_colors[] = { + {{0, 3, 5, 7}}, {{2, 3, 5, 7}}, {{0, 0, 0, 7}}, {{2, 0, 0, 7}}, + {{0, 0, 3, 7}}, {{0, 7, 7, 7}}, {{0, 7, 7, 7}}, {{0, 0, 2, 7}}, + {{2, 5, 7, 7}}, {{7, 7, 7, 7}}, {{7, 6, 5, 7}}, {{3, 7, 5, 7}}, + {{0, 0, 4, 7}}, {{0, 0, 0, 7}}, {{0, 7, 7, 5}}, {{0, 7, 3, 7}} + }; display = (WWDisplay)malloc(sizeof(_WWDisplay)); if (display == NULL) WonX_Error("WWDisplay_Create", "Cannot allocate memory."); - WWDisplay_SetColorMap(display, WWColorMap_Create(NULL)); + WWDisplay_SetColorMap(display, WWColorMap_Create(default_lcd_colors)); for (i = 0; i < 16; i++) { WWDisplay_SetPalette(display, i, - WWPalette_Create(i, NULL, ((i / 4) % 2) ? 1 : 0)); + WWPalette_Create(i, + default_palette_colors[i].colors, + ((i / 4) % 2) ? 1 : 0)); } for (i = 0; i < 512; i++) { @@ -129,6 +151,23 @@ WWDisplay WWDisplay_Create(int lcd_panel_width, int lcd_panel_height, WWDisplay_SetLCDPanel(display, WWLCDPanel_Create(lcd_panel_width, lcd_panel_height)); + + + /* ¥Ç¥Õ¥©¥ë¥È¤Î¥Æ¥­¥¹¥Èɽ¼¨Íѥѥì¥Ã¥È¤Ï0 */ + WWDisplay_SetText(display, + WWText_Create(WWDisplay_GetScreen(display, SCREEN2), + 0, 0, + TEXT_SCREEN_WIDTH, TEXT_SCREEN_HEIGHT, + WWDisplay_GetPalette(display, 0))); + + /* + * WWDisplay_GetPalette() ¤ò¸Æ¤Ó½Ð¤¹¤Î¤Ç¡¤¥Ñ¥ì¥Ã¥È¤òÀßÄꤷ¤Æ¤«¤é + * ¥«¡¼¥½¥ë¤ÎÀßÄê¤ò¹Ô¤¦¤³¤È¡¥ + * ¥Ç¥Õ¥©¥ë¥È¤Î¥«¡¼¥½¥ë¥Ñ¥ì¥Ã¥È¤Ï£± + */ + WWDisplay_SetCursor(display, + WWCursor_Create(WWDisplay_GetPalette(display, 1))); + WWDisplay_SetSpriteEnable(display, 0); WWDisplay_SetSpriteWindowEnable(display, 0); @@ -188,6 +227,14 @@ WWDisplay WWDisplay_Destroy(WWDisplay display) WWDisplay_SetLCDPanel(display, WWLCDPanel_Destroy(WWDisplay_GetLCDPanel(display))); + if (WWDisplay_GetText(display) != NULL) + WWDisplay_SetText(display, + WWText_Destroy(WWDisplay_GetText(display))); + + if (WWDisplay_GetCursor(display) != NULL) + WWDisplay_SetCursor(display, + WWCursor_Destroy(WWDisplay_GetCursor(display))); + free(display); return (NULL); @@ -197,7 +244,8 @@ WWDisplay WWDisplay_Destroy(WWDisplay display) /* LCD¥Ñ¥Í¥ë¤ÎÉÁ²è */ /*===========================================================================*/ -static int WWDisplay_DrawScreen(WWDisplay display, WWScreen screen) +static int WWDisplay_DrawScreen(WWDisplay display, WWScreen screen, + WWCursor cursor) { WWLCDPanel lcd_panel; int lcd_panel_width; @@ -267,7 +315,8 @@ static int WWDisplay_DrawScreen(WWDisplay display, WWScreen screen) px = x + WWScreen_GetRollX(screen); - pixel = WWScreen_GetPixel(screen, px, py); + /* Æ©ÌÀ¿§¤Î¾ì¹ç¤Ë¤Ï¡¤-1¤¬Ê֤äƤ¯¤ë */ + pixel = WWScreen_GetPixel(screen, px, py, cursor); /* Æ©ÌÀ¿§¤Î¾ì¹ç */ if (pixel == -1) continue; @@ -300,7 +349,7 @@ static int WWDisplay_DrawSprite(WWDisplay display, WWSprite sprite) for (y = 0; y < 8; y++) { for (x = 0; x < 8; x++) { - pixel = WWSprite_GetPixel(sprite, x, y); + pixel = WWSprite_GetPixel(sprite, x, y); /* Æ©ÌÀ¿§¤Ï-1¤¬Ê֤äƤ¯¤ë */ /* Æ©ÌÀ¿§¤Î¾ì¹ç */ if (pixel == -1) continue; @@ -337,7 +386,9 @@ int WWDisplay_DrawLCDPanel(WWDisplay display) int lcd_panel_height; WWColorMap color_map; int border; + WWScreen screen; WWSprite sprite; + WWCursor cursor; lcd_panel = WWDisplay_GetLCDPanel(display); lcd_panel_width = WWLCDPanel_GetWidth( lcd_panel); @@ -354,7 +405,12 @@ int WWDisplay_DrawLCDPanel(WWDisplay display) } /* ¥¹¥¯¥ê¡¼¥ó£±ÉÁ²è */ - WWDisplay_DrawScreen(display, WWDisplay_GetScreen(display, 0)); + screen = WWDisplay_GetScreen(display, 0); + if (WWText_GetScreen(WWDisplay_GetText(display)) == screen) + cursor = WWDisplay_GetCursor(display); + else + cursor = NULL; + WWDisplay_DrawScreen(display, screen, cursor); /* ¥¹¥×¥é¥¤¥ÈÉÁ²è(¥¹¥¯¥ê¡¼¥ó£²¤è¤êÍ¥Àè¤Ç¤Ê¤¤¤â¤Î) */ /* ½Å¤Ê¤Ã¤¿¾ì¹ç¤Ï¡¤ÈÖ¹æ¤Î¼ã¤¤¤â¤Î¤¬¼êÁ°¤Ëɽ¼¨¤µ¤ì¤ë */ @@ -369,7 +425,12 @@ int WWDisplay_DrawLCDPanel(WWDisplay display) } /* ¥¹¥¯¥ê¡¼¥ó£²ÉÁ²è */ - WWDisplay_DrawScreen(display, WWDisplay_GetScreen(display, 1)); + screen = WWDisplay_GetScreen(display, 1); + if (WWText_GetScreen(WWDisplay_GetText(display)) == screen) + cursor = WWDisplay_GetCursor(display); + else + cursor = NULL; + WWDisplay_DrawScreen(display, screen, cursor); /* ¥¹¥×¥é¥¤¥ÈÉÁ²è(¥¹¥¯¥ê¡¼¥ó£²¤è¤êÍ¥Àè¤Ê¤â¤Î) */ /* ½Å¤Ê¤Ã¤¿¾ì¹ç¤Ï¡¤ÈÖ¹æ¤Î¼ã¤¤¤â¤Î¤¬¼êÁ°¤Ëɽ¼¨¤µ¤ì¤ë */ diff --git a/WWDisplay.h b/WWDisplay.h index 6921189..ab566a8 100644 --- a/WWDisplay.h +++ b/WWDisplay.h @@ -5,13 +5,6 @@ /* ¤³¤³¤«¤é */ /*****************************************************************************/ -#include "WWColorMap.h" -#include "WWPalette.h" -#include "WWCharacter.h" -#include "WWSprite.h" -#include "WWScreen.h" -#include "WWLCDPanel.h" - /*****************************************************************************/ /* ¥¯¥é¥¹¤ÎÄêµÁ */ /*****************************************************************************/ @@ -19,7 +12,20 @@ typedef struct _WWDisplay * WWDisplay; /*****************************************************************************/ -/* ¥á¥ó¥Ð´Ø¿ô¤ÎÄêµÁ */ +/* ¥Ø¥Ã¥À¥Õ¥¡¥¤¥ë¤Î¥¤¥ó¥¯¥ë¡¼¥É */ +/*****************************************************************************/ + +#include "WWColorMap.h" +#include "WWPalette.h" +#include "WWCharacter.h" +#include "WWSprite.h" +#include "WWScreen.h" +#include "WWLCDPanel.h" +#include "WWText.h" +#include "WWCursor.h" + +/*****************************************************************************/ +/* ¥á¥ó¥Ð´Ø¿ô¤ÎÀë¸À */ /*****************************************************************************/ /*===========================================================================*/ @@ -32,6 +38,9 @@ WWCharacter WWDisplay_GetCharacter(WWDisplay d, int n); WWSprite WWDisplay_GetSprite(WWDisplay d, int n); WWScreen WWDisplay_GetScreen(WWDisplay d, int n); WWLCDPanel WWDisplay_GetLCDPanel(WWDisplay d); +WWText WWDisplay_GetText(WWDisplay d); +WWCursor WWDisplay_GetCursor(WWDisplay d); + int WWDisplay_GetSpriteEnable(WWDisplay d); int WWDisplay_GetSpriteWindowEnable(WWDisplay d); @@ -58,6 +67,8 @@ WWCharacter WWDisplay_SetCharacter(WWDisplay d, int n, WWCharacter c); WWSprite WWDisplay_SetSprite(WWDisplay d, int n, WWSprite s); WWScreen WWDisplay_SetScreen(WWDisplay d, int n, WWScreen s); WWLCDPanel WWDisplay_SetLCDPanel(WWDisplay d, WWLCDPanel p); +WWText WWDisplay_SetText(WWDisplay d, WWText p); +WWCursor WWDisplay_SetCursor(WWDisplay d, WWCursor p); int WWDisplay_SetSpriteEnable(WWDisplay d, int f); int WWDisplay_SetSpriteWindowEnable(WWDisplay d, int f); diff --git a/WWDisplayP.h b/WWDisplayP.h index 18d58d5..bdd2396 100644 --- a/WWDisplayP.h +++ b/WWDisplayP.h @@ -19,6 +19,8 @@ typedef struct _WWDisplay { WWSprite sprite[128]; WWScreen screen[2]; WWLCDPanel lcd_panel; + WWText text; + WWCursor cursor; /* ¥Ç¥£¥¹¥×¥ì¥¤¤Î°À­¾ðÊó */ int sprite_enable; /* ¥¹¥×¥é¥¤¥Èɽ¼¨¥¤¥Í¡¼¥Ö¥ë¥Õ¥é¥° */ diff --git a/WWInterrupt.c b/WWInterrupt.c index d4f4d6f..dc659fa 100644 --- a/WWInterrupt.c +++ b/WWInterrupt.c @@ -3,7 +3,7 @@ /*****************************************************************************/ #include "WWInterruptP.h" -#include "etc.h" +#include "WonX.h" /*****************************************************************************/ /* ¥á¥ó¥Ð´Ø¿ô¤ÎÄêµÁ */ diff --git a/WWInterrupt.h b/WWInterrupt.h index be7877a..262cbcc 100644 --- a/WWInterrupt.h +++ b/WWInterrupt.h @@ -5,11 +5,6 @@ /* ¤³¤³¤«¤é */ /*****************************************************************************/ -#include -#include - -#include "wonx_include/system.h" - /*****************************************************************************/ /* ¥¯¥é¥¹¤ÎÄêµÁ */ /*****************************************************************************/ @@ -17,6 +12,15 @@ typedef struct _WWInterrupt * WWInterrupt; typedef void (*WWInterruptCallback)(); +/*****************************************************************************/ +/* ¥Ø¥Ã¥À¥Õ¥¡¥¤¥ë¤Î¥¤¥ó¥¯¥ë¡¼¥É */ +/*****************************************************************************/ + +#include +#include + +#include "wonx_include/system.h" + /*****************************************************************************/ /* ¥á¥ó¥Ð´Ø¿ô¤ÎÀë¸À */ /*****************************************************************************/ diff --git a/WWLCDPanel.c b/WWLCDPanel.c index 0c3d7b1..131db4a 100644 --- a/WWLCDPanel.c +++ b/WWLCDPanel.c @@ -3,7 +3,7 @@ /*****************************************************************************/ #include "WWLCDPanelP.h" -#include "etc.h" +#include "WonX.h" /*****************************************************************************/ /* ¥á¥ó¥Ð´Ø¿ô¤ÎÄêµÁ */ diff --git a/WWLCDPanel.h b/WWLCDPanel.h index d8250c9..ff769c0 100644 --- a/WWLCDPanel.h +++ b/WWLCDPanel.h @@ -5,14 +5,18 @@ /* ¤³¤³¤«¤é */ /*****************************************************************************/ -#include - /*****************************************************************************/ /* ¥¯¥é¥¹¤ÎÄêµÁ */ /*****************************************************************************/ typedef struct _WWLCDPanel * WWLCDPanel; +/*****************************************************************************/ +/* ¥Ø¥Ã¥À¥Õ¥¡¥¤¥ë¤Î¥¤¥ó¥¯¥ë¡¼¥É */ +/*****************************************************************************/ + +#include + /*****************************************************************************/ /* ¥á¥ó¥Ð´Ø¿ô¤ÎÀë¸À */ /*****************************************************************************/ diff --git a/WWPalette.c b/WWPalette.c index 145beac..5d62824 100644 --- a/WWPalette.c +++ b/WWPalette.c @@ -3,6 +3,7 @@ /*****************************************************************************/ #include "WWPaletteP.h" +#include "WonX.h" #include "etc.h" /*****************************************************************************/ @@ -91,7 +92,7 @@ int WWPalette_PrintData(WWPalette p, FILE * f) fprintf(f, "palette[%d] :\tnumber = %d\n", n, WWPalette_GetNumber(p)); fprintf(f, "palette[%d] :\ttransparent = %s\n", - n, true_false(WWPalette_GetTransparent(p))); + n, wonx_true_false(WWPalette_GetTransparent(p))); for (i = 0; i < 4; i++) { fprintf(f, "palette[%d] :\tcolor[%d] = %d\n", diff --git a/WWPalette.h b/WWPalette.h index f123f43..f015095 100644 --- a/WWPalette.h +++ b/WWPalette.h @@ -5,15 +5,19 @@ /* ¤³¤³¤«¤é */ /*****************************************************************************/ -#include -#include - /*****************************************************************************/ /* ¥¯¥é¥¹¤ÎÄêµÁ */ /*****************************************************************************/ typedef struct _WWPalette * WWPalette; +/*****************************************************************************/ +/* ¥Ø¥Ã¥À¥Õ¥¡¥¤¥ë¤Î¥¤¥ó¥¯¥ë¡¼¥É */ +/*****************************************************************************/ + +#include +#include + /*****************************************************************************/ /* ¥á¥ó¥Ð´Ø¿ô¤ÎÀë¸À */ /*****************************************************************************/ diff --git a/WWScreen.c b/WWScreen.c index 82cbf5f..571bf2a 100644 --- a/WWScreen.c +++ b/WWScreen.c @@ -3,7 +3,7 @@ /*****************************************************************************/ #include "WWScreenP.h" -#include "etc.h" +#include "WonX.h" /*****************************************************************************/ /* ¥á¥ó¥Ð´Ø¿ô¤ÎÄêµÁ */ @@ -159,7 +159,7 @@ int WWScreen_SetDrawWidth( WWScreen s, int n) { return (s->draw_width = n); } int WWScreen_SetDrawHeight(WWScreen s, int n) { return (s->draw_height = n); } /* ¥«¥é¡¼¥Þ¥Ã¥×¤Î¿§(0¡Á7)¤òÊÖ¤¹(Æ©ÌÀ¿§¤Ï-1¤òÊÖ¤¹) */ -int WWScreen_GetPixel(WWScreen screen, int x, int y) +int WWScreen_GetPixel(WWScreen screen, int x, int y, WWCursor cursor) { int cx, cy, px, py; int pixel; @@ -180,10 +180,21 @@ int WWScreen_GetPixel(WWScreen screen, int x, int y) if (WWScreen_GetVertical( screen, cx, cy)) py = 7 - py; character = WWScreen_GetCharacter(screen, cx, cy); + + /* ¥«¡¼¥½¥ëɽ¼¨¤Î½èÍý */ palette = WWScreen_GetPalette(screen, cx, cy); + if (cursor != NULL) { + if ( WWCursor_IsON(cursor) && + (cx >= WWCursor_GetX(cursor)) && + (cx <= WWCursor_GetX(cursor) + WWCursor_GetWidth( cursor) - 1) && + (cy >= WWCursor_GetY(cursor)) && + (cy <= WWCursor_GetY(cursor) + WWCursor_GetHeight(cursor) - 1) ) { + palette = WWCursor_GetPalette(cursor); + } + } pixel = WWCharacter_GetPixel(character, px, py); - pixel = WWPalette_GetMappedColor(palette, pixel); + pixel = WWPalette_GetMappedColor(palette, pixel); /*Æ©ÌÀ¿§¤Ï-1¤¬Ê֤äƤ¯¤ë*/ return (pixel); } diff --git a/WWScreen.h b/WWScreen.h index 4129459..97a4f4f 100644 --- a/WWScreen.h +++ b/WWScreen.h @@ -5,17 +5,22 @@ /* ¤³¤³¤«¤é */ /*****************************************************************************/ -#include - -#include "WWPalette.h" -#include "WWCharacter.h" - /*****************************************************************************/ /* ¥¯¥é¥¹¤ÎÄêµÁ */ /*****************************************************************************/ typedef struct _WWScreen * WWScreen; +/*****************************************************************************/ +/* ¥Ø¥Ã¥À¥Õ¥¡¥¤¥ë¤Î¥¤¥ó¥¯¥ë¡¼¥É */ +/*****************************************************************************/ + +#include + +#include "WWPalette.h" +#include "WWCharacter.h" +#include "WWCursor.h" + /*****************************************************************************/ /* Äê¿ô¤ÎÄêµÁ */ /*****************************************************************************/ @@ -66,7 +71,7 @@ int WWScreen_SetDrawY( WWScreen s, int n); int WWScreen_SetDrawWidth( WWScreen s, int n); int WWScreen_SetDrawHeight(WWScreen s, int n); -int WWScreen_GetPixel(WWScreen screen, int x, int y); +int WWScreen_GetPixel(WWScreen screen, int x, int y, WWCursor cursor); WWScreen WWScreen_Create(int number, int width, int height, diff --git a/WWSerialPort.c b/WWSerialPort.c index 95722fe..efcd01b 100644 --- a/WWSerialPort.c +++ b/WWSerialPort.c @@ -3,16 +3,16 @@ /*****************************************************************************/ #include "WWSerialPortP.h" -#include "etc.h" +#include "WonX.h" /*****************************************************************************/ /* ¥á¥ó¥Ð´Ø¿ô¤ÎÄêµÁ */ /*****************************************************************************/ -int WWSerialPort_ON( WWSerialPort s) { return (s->port_on = 1); } -int WWSerialPort_OFF( WWSerialPort s) { return (s->port_on = 0); } -int WWSerialPort_IsON( WWSerialPort s) { return (s->port_on != 0); } -int WWSerialPort_IsOFF(WWSerialPort s) { return (s->port_on == 0); } +int WWSerialPort_Open( WWSerialPort s) { return (s->opened = 1); } +int WWSerialPort_Close( WWSerialPort s) { return (s->opened = 0); } +int WWSerialPort_IsOpened(WWSerialPort s) { return (s->opened != 0); } +int WWSerialPort_IsClosed(WWSerialPort s) { return (s->opened == 0); } int WWSerialPort_GetBaudrate(WWSerialPort s) { return (s->baudrate); } int WWSerialPort_SetBaudrate(WWSerialPort s, int baudrate) @@ -53,7 +53,7 @@ WWSerialPort WWSerialPort_Create() if (ww_serial_port == NULL) WonX_Error("WWSerialPort_Create", "Cannot allocate memory."); - WWSerialPort_OFF(ww_serial_port); + WWSerialPort_Close(ww_serial_port); WWSerialPort_SetBaudrate38400(ww_serial_port); WWSerialPort_SetSendTimeout(ww_serial_port, 100); WWSerialPort_SetReceiveTimeout(ww_serial_port, 100); diff --git a/WWSerialPort.h b/WWSerialPort.h index 1011ed1..c6f5e74 100644 --- a/WWSerialPort.h +++ b/WWSerialPort.h @@ -5,28 +5,36 @@ /* ¤³¤³¤«¤é */ /*****************************************************************************/ -#include -#include - -#include "wonx_include/comm.h" - -#define WW_SERIAL_PORT_BAUDRATE_9600 0 -#define WW_SERIAL_PORT_BAUDRATE_38400 1 - /*****************************************************************************/ /* ¥¯¥é¥¹¤ÎÄêµÁ */ /*****************************************************************************/ typedef struct _WWSerialPort * WWSerialPort; +/*****************************************************************************/ +/* ¥Ø¥Ã¥À¥Õ¥¡¥¤¥ë¤Î¥¤¥ó¥¯¥ë¡¼¥É */ +/*****************************************************************************/ + +#include +#include + +#include "wonx_include/comm.h" + +/*****************************************************************************/ +/* Äê¿ô¤ÎÄêµÁ */ +/*****************************************************************************/ + +#define WW_SERIAL_PORT_BAUDRATE_9600 0 +#define WW_SERIAL_PORT_BAUDRATE_38400 1 + /*****************************************************************************/ /* ¥á¥ó¥Ð´Ø¿ô¤ÎÀë¸À */ /*****************************************************************************/ -int WWSerialPort_ON( WWSerialPort s); -int WWSerialPort_OFF( WWSerialPort s); -int WWSerialPort_IsON( WWSerialPort s); -int WWSerialPort_IsOFF(WWSerialPort s); +int WWSerialPort_Open( WWSerialPort s); +int WWSerialPort_Close( WWSerialPort s); +int WWSerialPort_IsOpened(WWSerialPort s); +int WWSerialPort_IsClosed(WWSerialPort s); int WWSerialPort_GetBaudrate(WWSerialPort s); int WWSerialPort_SetBaudrate(WWSerialPort s, int baudrate); diff --git a/WWSerialPortP.h b/WWSerialPortP.h index 035c3db..bc816a1 100644 --- a/WWSerialPortP.h +++ b/WWSerialPortP.h @@ -13,7 +13,7 @@ typedef struct _WWSerialPort { - int port_on; /* ¥Ý¡¼¥È¤Î¾õÂÖ */ + int opened; /* ¥Ý¡¼¥È¤Î¾õÂÖ(open/close) */ int baudrate; /* ¥Ü¡¼¥ì¡¼¥È */ /* diff --git a/WWSprite.c b/WWSprite.c index e68e586..6b272cf 100644 --- a/WWSprite.c +++ b/WWSprite.c @@ -3,6 +3,7 @@ /*****************************************************************************/ #include "WWSpriteP.h" +#include "WonX.h" #include "etc.h" /*****************************************************************************/ @@ -37,6 +38,7 @@ int WWSprite_SetPosition(WWSprite sprite, int x, int y) return (0); } +/* ¥¹¥×¥é¥¤¥È¤Î¥Ô¥¯¥»¥ëÃͤòÊÖ¤¹¡¥(Æ©ÌÀ¿§¤Ï-1¤òÊÖ¤¹) */ int WWSprite_GetPixel(WWSprite sprite, int x, int y) { WWPalette p; @@ -50,7 +52,7 @@ int WWSprite_GetPixel(WWSprite sprite, int x, int y) if (WWSprite_GetVertical( sprite)) y = 7 - y; pixel = WWCharacter_GetPixel(c, x, y); - pixel = WWPalette_GetMappedColor(p, pixel); + pixel = WWPalette_GetMappedColor(p, pixel); /* Æ©ÌÀ¿§¤Ï -1 ¤òÊÖ¤¹ */ return (pixel); } @@ -96,13 +98,13 @@ int WWSprite_PrintData(WWSprite s, FILE * f) fprintf(f, "sprite[%d] :\tnumber = %d\n", n, WWSprite_GetNumber(s)); fprintf(f, "sprite[%d] :\thorizontal = %s\n", - n, true_false(WWSprite_GetHorizontal(s))); + n, wonx_true_false(WWSprite_GetHorizontal(s))); fprintf(f, "sprite[%d] :\tvertical = %s\n", - n, true_false(WWSprite_GetVertical( s))); + n, wonx_true_false(WWSprite_GetVertical( s))); fprintf(f, "sprite[%d] :\tpriority = %s\n", - n, true_false(WWSprite_GetPriority( s))); + n, wonx_true_false(WWSprite_GetPriority( s))); fprintf(f, "sprite[%d] :\tclipping = %s\n", - n, true_false(WWSprite_GetClipping( s))); + n, wonx_true_false(WWSprite_GetClipping( s))); fprintf(f, "sprite[%d] :\tpalette number = %d\n", n, WWPalette_GetNumber(WWSprite_GetPalette(s))); fprintf(f, "sprite[%d] :\tcharacter number = %d\n", diff --git a/WWSprite.h b/WWSprite.h index 9f32160..bd41235 100644 --- a/WWSprite.h +++ b/WWSprite.h @@ -5,17 +5,21 @@ /* ¤³¤³¤«¤é */ /*****************************************************************************/ -#include - -#include "WWPalette.h" -#include "WWCharacter.h" - /*****************************************************************************/ /* ¥¯¥é¥¹¤ÎÄêµÁ */ /*****************************************************************************/ typedef struct _WWSprite * WWSprite; +/*****************************************************************************/ +/* ¥Ø¥Ã¥À¥Õ¥¡¥¤¥ë¤Î¥¤¥ó¥¯¥ë¡¼¥É */ +/*****************************************************************************/ + +#include + +#include "WWPalette.h" +#include "WWCharacter.h" + /*****************************************************************************/ /* ¥á¥ó¥Ð´Ø¿ô¤ÎÀë¸À */ /*****************************************************************************/ diff --git a/WWText.c b/WWText.c index d2ec660..2bcc2c2 100644 --- a/WWText.c +++ b/WWText.c @@ -3,7 +3,7 @@ /*****************************************************************************/ #include "WWTextP.h" -#include "etc.h" +#include "WonX.h" /* ¥Õ¥©¥ó¥È¤Î¥Ó¥Ã¥È¥Þ¥Ã¥×¥Ç¡¼¥¿ */ #include "WWTextFonts.c" @@ -74,7 +74,7 @@ int WWText_PutCharacter(WWText ww_text, int x, int y, int character, WWCharacter ww_character; if ((character < 0) || (character > 127)) { - printf("warning : WWText_PutCharacter() : Character number is out of range.\n"); + WonX_Warning("WWText_PutCharacter", "Character number is out of range."); fflush(stdout); return (-1); } @@ -86,7 +86,7 @@ int WWText_PutCharacter(WWText ww_text, int x, int y, int character, if ( (x < 0) || (x > WWText_GetWidth( ww_text) - 1) || (y < 0) || (y > WWText_GetHeight(ww_text) - 1) ) { - printf("warning : WWText_PutCharacter() : Position is out of range.\n"); + WonX_Warning("WWText_PutCharacter", "Position is out of range."); fflush(stdout); return (-1); } diff --git a/WWText.h b/WWText.h index 566afc0..d18b932 100644 --- a/WWText.h +++ b/WWText.h @@ -5,16 +5,20 @@ /* ¤³¤³¤«¤é */ /*****************************************************************************/ -#include "WWDisplay.h" -#include "WWScreen.h" -#include "WWPalette.h" - /*****************************************************************************/ /* ¥¯¥é¥¹¤ÎÄêµÁ */ /*****************************************************************************/ typedef struct _WWText * WWText; +/*****************************************************************************/ +/* ¥Ø¥Ã¥À¥Õ¥¡¥¤¥ë¤Î¥¤¥ó¥¯¥ë¡¼¥É */ +/*****************************************************************************/ + +#include "WWDisplay.h" +#include "WWScreen.h" +#include "WWPalette.h" + /*===========================================================================*/ /* ¥á¥ó¥Ð¤Î¼èÆÀ */ /*===========================================================================*/ diff --git a/WWTimer.c b/WWTimer.c index 440a873..9164c14 100644 --- a/WWTimer.c +++ b/WWTimer.c @@ -3,7 +3,7 @@ /*****************************************************************************/ #include "WWTimerP.h" -#include "etc.h" +#include "WonX.h" /*****************************************************************************/ /* ¥á¥ó¥Ð´Ø¿ô¤ÎÄêµÁ */ diff --git a/WWTimer.h b/WWTimer.h index ada61b5..eb2abe3 100644 --- a/WWTimer.h +++ b/WWTimer.h @@ -5,17 +5,21 @@ /* ¤³¤³¤«¤é */ /*****************************************************************************/ -#include -#include - -#include "wonx_include/timer.h" - /*****************************************************************************/ /* ¥¯¥é¥¹¤ÎÄêµÁ */ /*****************************************************************************/ typedef struct _WWTimer * WWTimer; +/*****************************************************************************/ +/* ¥Ø¥Ã¥À¥Õ¥¡¥¤¥ë¤Î¥¤¥ó¥¯¥ë¡¼¥É */ +/*****************************************************************************/ + +#include +#include + +#include "wonx_include/timer.h" + /*****************************************************************************/ /* ¥á¥ó¥Ð´Ø¿ô¤ÎÀë¸À */ /*****************************************************************************/ diff --git a/WonX.c b/WonX.c index 7ebaddc..177c1fa 100644 --- a/WonX.c +++ b/WonX.c @@ -2,14 +2,9 @@ #include "etc.h" #include "wonx_include/disp.h" -#include "wonx_include/text.h" #include "wonx_include/system.h" #include "wonx_include/comm.h" -/*****************************************************************************/ -/* ¥Ç¥£¥¹¥×¥ì¥¤¤Î³ÎÊÝ */ -/*****************************************************************************/ - static WonX wonx = NULL; int WonX_IsCreated(void) @@ -19,9 +14,6 @@ int WonX_IsCreated(void) void WonX_Create(void) { - WWScreen screen; - WWPalette palette; - wonx = (WonX)malloc(sizeof(_WonX)); if (wonx == NULL) WonX_Error("WonX_Create", "Cannot allocate memory."); @@ -29,15 +21,6 @@ void WonX_Create(void) WonXDisplay_Create(LCD_PIXEL_WIDTH * 2, LCD_PIXEL_HEIGHT * 2, LCD_PIXEL_WIDTH, LCD_PIXEL_HEIGHT, SCREEN_CHAR_WIDTH, SCREEN_CHAR_HEIGHT); - screen = - WWDisplay_GetScreen(WonXDisplay_GetWWDisplay(wonx->wonx_display), SCREEN2); - /* ¥Ç¥Õ¥©¥ë¥È¤Î¥Æ¥­¥¹¥Èɽ¼¨Íѥѥì¥Ã¥È¤Ï0 */ - palette = - WWDisplay_GetPalette(WonXDisplay_GetWWDisplay(wonx->wonx_display), 0); - - wonx->wonx_text = - WonXText_Create(screen, 0, 0, TEXT_SCREEN_WIDTH, TEXT_SCREEN_HEIGHT, - palette); wonx->wonx_system = WonXSystem_Create(); @@ -51,11 +34,6 @@ WonXDisplay WonX_GetWonXDisplay(void) return (wonx->wonx_display); } -WonXText WonX_GetWonXText(void) -{ - return (wonx->wonx_text); -} - WonXSystem WonX_GetWonXSystem(void) { return (wonx->wonx_system); @@ -66,3 +44,22 @@ WonXSerialPort WonX_GetWonXSerialPort(void) return (wonx->wonx_serial_port); } +/*===========================================================================*/ +/* ¥¨¥é¡¼½èÍý */ +/*===========================================================================*/ + +int WonX_Error(char * funcname, char * message) +{ + fprintf(stderr, "error : %s(): %s\n", funcname, message); + exit (1); +} + +int WonX_Warning(char * funcname, char * message) +{ + fprintf(stderr, "warning : %s(): %s\n", funcname, message); + return (0); +} + +/*****************************************************************************/ +/* End of File. */ +/*****************************************************************************/ diff --git a/WonX.h b/WonX.h index 32ff75e..b76cd39 100644 --- a/WonX.h +++ b/WonX.h @@ -2,19 +2,24 @@ #define _wonx_h_INCLUDED_ #include "WonXDisplay.h" -#include "WonXText.h" #include "WonXSystem.h" #include "WonXSerialPort.h" -/*****************************************************************************/ -/* ¥Ç¥£¥¹¥×¥ì¥¤¤Î³ÎÊÝ */ -/*****************************************************************************/ - int WonX_IsCreated(void); void WonX_Create(void); WonXDisplay WonX_GetWonXDisplay(void); -WonXText WonX_GetWonXText(void); WonXSystem WonX_GetWonXSystem(void); WonXSerialPort WonX_GetWonXSerialPort(void); +/*===========================================================================*/ +/* ¥¨¥é¡¼½èÍý */ +/*===========================================================================*/ + +int WonX_Error(char * funcname, char * message); +int WonX_Warning(char * funcname, char * message); + #endif + +/*****************************************************************************/ +/* End of File. */ +/*****************************************************************************/ diff --git a/WonXDisplay.c b/WonXDisplay.c index da117f4..2e2d2a4 100644 --- a/WonXDisplay.c +++ b/WonXDisplay.c @@ -3,7 +3,7 @@ /*****************************************************************************/ #include "WonXDisplayP.h" -#include "etc.h" +#include "WonX.h" /*****************************************************************************/ /* ¥á¥ó¥Ð´Ø¿ô¤ÎÄêµÁ */ diff --git a/WonXDisplay.h b/WonXDisplay.h index 2e01c53..f1eca05 100644 --- a/WonXDisplay.h +++ b/WonXDisplay.h @@ -5,15 +5,23 @@ /* ¤³¤³¤«¤é */ /*****************************************************************************/ -#include "XDisplay.h" -#include "WWDisplay.h" - /*****************************************************************************/ /* ¥¯¥é¥¹¤ÎÄêµÁ */ /*****************************************************************************/ typedef struct _WonXDisplay * WonXDisplay; +/*****************************************************************************/ +/* ¥Ø¥Ã¥À¥Õ¥¡¥¤¥ë¤Î¥¤¥ó¥¯¥ë¡¼¥É */ +/*****************************************************************************/ + +#include "XDisplay.h" +#include "WWDisplay.h" + +/*****************************************************************************/ +/* ¥á¥ó¥Ð´Ø¿ô¤ÎÀë¸À */ +/*****************************************************************************/ + XDisplay WonXDisplay_GetXDisplay(WonXDisplay wonx_display); WWDisplay WonXDisplay_GetWWDisplay(WonXDisplay wonx_display); WonXDisplay WonXDisplay_Create(int x_width, int x_height, diff --git a/WonXP.h b/WonXP.h index b815649..f7a5e7a 100644 --- a/WonXP.h +++ b/WonXP.h @@ -13,7 +13,6 @@ typedef struct _WonX { WonXDisplay wonx_display; - WonXText wonx_text; WonXSystem wonx_system; WonXSerialPort wonx_serial_port; } _WonX; diff --git a/WonXSerialPort.c b/WonXSerialPort.c index 21adfde..c02c8ae 100644 --- a/WonXSerialPort.c +++ b/WonXSerialPort.c @@ -3,22 +3,29 @@ /*****************************************************************************/ #include "WonXSerialPortP.h" -#include "etc.h" +#include "WonX.h" /*****************************************************************************/ /* ¥á¥ó¥Ð´Ø¿ô¤ÎÄêµÁ */ /*****************************************************************************/ -WWSerialPort WonXSerialPort_GetWWSerialPort(WonXSerialPort wonx_serial_port) -{ return (wonx_serial_port->ww_serial_port); } -WWSerialPort WonXSerialPort_SetWWSerialPort(WonXSerialPort wonx_serial_port, - WWSerialPort ww_serial_port) -{ return (wonx_serial_port->ww_serial_port = ww_serial_port); } +WWSerialPort WonXSerialPort_GetWWSerialPort(WonXSerialPort wonx_sp) +{ return (wonx_sp->ww_serial_port); } +WWSerialPort WonXSerialPort_SetWWSerialPort(WonXSerialPort wonx_sp, + WWSerialPort ww_sp) +{ return (wonx_sp->ww_serial_port = ww_sp); } + +UNIXSerialPort WonXSerialPort_GetUNIXSerialPort(WonXSerialPort wonx_sp) +{ return (wonx_sp->unix_serial_port); } +UNIXSerialPort WonXSerialPort_SetUNIXSerialPort(WonXSerialPort wonx_sp, + UNIXSerialPort unix_sp) +{ return (wonx_sp->unix_serial_port = unix_sp); } WonXSerialPort WonXSerialPort_Create() { WonXSerialPort wonx_serial_port; WWSerialPort ww_serial_port; + UNIXSerialPort unix_serial_port; wonx_serial_port = (WonXSerialPort)malloc(sizeof(_WonXSerialPort)); if (wonx_serial_port == NULL) @@ -30,12 +37,19 @@ WonXSerialPort WonXSerialPort_Create() "Cannot create WonderWitch serial port."); WonXSerialPort_SetWWSerialPort(wonx_serial_port, ww_serial_port); + unix_serial_port = UNIXSerialPort_Create(); + if (unix_serial_port == NULL) + WonX_Error("WonXSerialPort_Create", + "Cannot create UNIX serial port."); + WonXSerialPort_SetUNIXSerialPort(wonx_serial_port, unix_serial_port); + return (wonx_serial_port); } WonXSerialPort WonXSerialPort_Destroy(WonXSerialPort wonx_serial_port) { WWSerialPort ww_serial_port; + UNIXSerialPort unix_serial_port; if (wonx_serial_port == NULL) WonX_Error("WonXSerialPort_Destroy", "Object is not created."); @@ -45,6 +59,11 @@ WonXSerialPort WonXSerialPort_Destroy(WonXSerialPort wonx_serial_port) WonXSerialPort_SetWWSerialPort(wonx_serial_port, WWSerialPort_Destroy(ww_serial_port)); + unix_serial_port = WonXSerialPort_GetUNIXSerialPort(wonx_serial_port); + if (unix_serial_port) + WonXSerialPort_SetUNIXSerialPort(wonx_serial_port, + UNIXSerialPort_Destroy(unix_serial_port)); + free(wonx_serial_port); return (NULL); diff --git a/WonXSerialPort.h b/WonXSerialPort.h index c206793..7f93117 100644 --- a/WonXSerialPort.h +++ b/WonXSerialPort.h @@ -5,21 +5,30 @@ /* ¤³¤³¤«¤é */ /*****************************************************************************/ -#include "WWSerialPort.h" - /*****************************************************************************/ /* ¥¯¥é¥¹¤ÎÄêµÁ */ /*****************************************************************************/ typedef struct _WonXSerialPort * WonXSerialPort; +/*****************************************************************************/ +/* ¥Ø¥Ã¥À¥Õ¥¡¥¤¥ë¤Î¥¤¥ó¥¯¥ë¡¼¥É */ +/*****************************************************************************/ + +#include "WWSerialPort.h" +#include "UNIXSerialPort.h" + /*****************************************************************************/ /* ¥á¥ó¥Ð´Ø¿ô¤ÎÄêµÁ */ /*****************************************************************************/ -WWSerialPort WonXSerialPort_GetWWSerialPort(WonXSerialPort wonx_serial_port); -WWSerialPort WonXSerialPort_SetWWSerialPort(WonXSerialPort wonx_serial_port, - WWSerialPort ww_serial_port); +WWSerialPort WonXSerialPort_GetWWSerialPort(WonXSerialPort wonx_sp); +WWSerialPort WonXSerialPort_SetWWSerialPort(WonXSerialPort wonx_sp, + WWSerialPort ww_sp); + +UNIXSerialPort WonXSerialPort_GetUNIXSerialPort(WonXSerialPort wonx_sp); +UNIXSerialPort WonXSerialPort_SetUNIXSerialPort(WonXSerialPort wonx_sp, + UNIXSerialPort unix_sp); WonXSerialPort WonXSerialPort_Create(); WonXSerialPort WonXSerialPort_Destroy(WonXSerialPort wonx_serial_port); diff --git a/WonXSerialPortP.h b/WonXSerialPortP.h index a9b1692..c5ef0e6 100644 --- a/WonXSerialPortP.h +++ b/WonXSerialPortP.h @@ -13,6 +13,7 @@ typedef struct _WonXSerialPort { WWSerialPort ww_serial_port; + UNIXSerialPort unix_serial_port; } _WonXSerialPort; /*****************************************************************************/ diff --git a/WonXSystem.c b/WonXSystem.c index 30edeaa..7896c7f 100644 --- a/WonXSystem.c +++ b/WonXSystem.c @@ -5,7 +5,7 @@ #include "wonx_configure.h" #include "WonXSystemP.h" -#include "etc.h" +#include "WonX.h" /*****************************************************************************/ /* ¥á¥ó¥Ð´Ø¿ô¤ÎÄêµÁ */ @@ -47,9 +47,24 @@ static int WonXTimer_Callback(WonXSystem wonx_system) { WWTimer ww_timer; WWInterrupt ww_interrupt; + WonXDisplay wonx_display; + XDisplay x_display; + WonXSerialPort wonx_serial_port; + WWSerialPort ww_serial_port; + UNIXSerialPort unix_serial_port; + + unsigned int old_key; + unsigned int new_key; ww_interrupt = WonXSystem_GetWWInterrupt(wonx_system); + wonx_display = WonX_GetWonXDisplay(); + x_display = WonXDisplay_GetXDisplay(wonx_display); + + wonx_serial_port = WonX_GetWonXSerialPort(); + ww_serial_port = WonXSerialPort_GetWWSerialPort(wonx_serial_port); + unix_serial_port = WonXSerialPort_GetUNIXSerialPort(wonx_serial_port); + ww_timer = WonXSystem_GetWWVBlankTimer(wonx_system); if (WWTimer_IsON(ww_timer)) { if (WWTimer_Count(ww_timer)) @@ -68,6 +83,39 @@ static int WonXTimer_Callback(WonXSystem wonx_system) WWInterrupt_ExecuteHBlankCountUpCallback(ww_interrupt); } + /* ¥­¡¼ÆþÎϳä¤ê¹þ¤ß */ + /* + * XDisplay_Sync() ¤¬Â¾¤Î¤È¤³¤í¤«¤é¸Æ¤Ð¤ì¤¿¾ì¹ç¤Ë³ä¤ê¹þ¤ß¤ò¤È¤ê + * ¤³¤Ü¤·¤Æ¤·¤Þ¤¦¤Î¤Ç¡¤XDisplay ¥¯¥é¥¹¤Î¤Û¤¦¤Ç³ä¤ê¹þ¤ß¤Î½èÍý¤ò¤¹¤ë¤«¡¤ + * ¥Õ¥é¥°¤òΩ¤Æ¤ë¤è¤¦¤Ë²þÎɤ¹¤ëɬÍפ¬Í­¤ë¤«¤â¡¥ + * (Ê̤ξì½ê¤ÇÉÑÈË¤Ë XDisplay_Sync() ¤¬¸Æ¤Ð¤ì¤Æ¤¤¤ë¤È¡¤¥­¡¼³ä¤ê¹þ¤ß¤¬ + * ȯÀ¸¤·¤Ê¤¯¤Ê¤Ã¤Æ¤·¤Þ¤¦) + * ¤È¤ê¤¢¤¨¤º¤Ï´Ê°×Ū¤Ë¤³¤Î¤è¤¦¤Ê¼ÂÁõ¤Ë¤·¤Æ¤ª¤¤¤ÆÌäÂê̵¤¤¤À¤í¤¦¡¥ + */ + old_key = XDisplay_GetKeyPress(x_display); + XDisplay_Sync(x_display); + new_key = XDisplay_GetKeyPress(x_display); + /* ¿·¤·¤¤¥­¡¼¤¬²¡¤µ¤ì¤¿¾ì¹ç */ + /* + * WonderWitch ¤Ç¼Â¸³¤·¤¿¤È¤³¤í¡¤¥­¡¼¤òÎ¥¤·¤¿¾ì¹ç¤Ë¤Ï³ä¤ê¹þ¤ß¤Ï + * ¤«¤«¤é¤Ê¤¤¤è¤¦¤À¤Ã¤¿¤Î¤Ç¡¤²¡¤µ¤ì¤¿¤È¤­¤Î¤ß¥³¡¼¥ë¥Ð¥Ã¥¯´Ø¿ô¤ò¸Æ¤Ó½Ð¤¹¡¥ + */ + if (new_key & (~old_key)) { + WWInterrupt_ExecuteKeyCallback(ww_interrupt); + } + + /* ¥·¥ê¥¢¥ë¼õ¿®³ä¤ê¹þ¤ß */ + /* + * ¾å¤ÈƱ¤¸Íýͳ¤Ç³ä¤ê¹þ¤ß¤ò¤È¤ê¤³¤Ü¤¹²ÄǽÀ­¤¬Í­¤ë¤Î¤Ç¡¤UNIXSerialPort ¤Î + * ¤Û¤¦¤Ç³ä¤ê¹þ¤ß¤Î½èÍý¤ò¤¹¤ë¤«¡¤¥Õ¥é¥°¤òΩ¤Æ¤ë¤è¤¦¤Ë²þÎɤ¹¤ëɬÍפ¬Í­¤ë¤«¤â¡¥ + * ¤È¤ê¤¢¤¨¤º¤Ï´Ê°×Ū¤Ë¤³¤Î¤è¤¦¤Ê¼ÂÁõ¤Ë¤·¤Æ¤ª¤¤¤ÆÌäÂê̵¤¤¤À¤í¤¦¡¥ + */ + if (WWSerialPort_IsOpened(ww_serial_port) && + UNIXSerialPort_IsOpened(unix_serial_port)) { + if (UNIXSerialPort_IsDataExisting(unix_serial_port, 0)) + WWInterrupt_ExecuteReceiveReadyCallback(ww_interrupt); + } + return (0); } diff --git a/WonXSystem.h b/WonXSystem.h index 9ac6d78..f22423a 100644 --- a/WonXSystem.h +++ b/WonXSystem.h @@ -5,16 +5,20 @@ /* ¤³¤³¤«¤é */ /*****************************************************************************/ -#include "WWInterrupt.h" -#include "WWTimer.h" -#include "UNIXTimer.h" - /*****************************************************************************/ /* ¥¯¥é¥¹¤ÎÄêµÁ */ /*****************************************************************************/ typedef struct _WonXSystem * WonXSystem; +/*****************************************************************************/ +/* ¥Ø¥Ã¥À¥Õ¥¡¥¤¥ë¤Î¥¤¥ó¥¯¥ë¡¼¥É */ +/*****************************************************************************/ + +#include "WWInterrupt.h" +#include "WWTimer.h" +#include "UNIXTimer.h" + /*****************************************************************************/ /* ¥á¥ó¥Ð´Ø¿ô¤ÎÄêµÁ */ /*****************************************************************************/ diff --git a/WonXText.c b/WonXText.c deleted file mode 100644 index 464f72b..0000000 --- a/WonXText.c +++ /dev/null @@ -1,55 +0,0 @@ -/*****************************************************************************/ -/* ¤³¤³¤«¤é */ -/*****************************************************************************/ - -#include "WonXTextP.h" -#include "etc.h" - -/*****************************************************************************/ -/* ¥á¥ó¥Ð´Ø¿ô¤ÎÄêµÁ */ -/*****************************************************************************/ - -WWText WonXText_GetWWText(WonXText wonx_text) -{ return (wonx_text->ww_text); } -WWText WonXText_SetWWText(WonXText wonx_text, WWText ww_text) -{ return (wonx_text->ww_text = ww_text); } - -WonXText WonXText_Create(WWScreen screen, int x, int y, int width, int height, - WWPalette palette) -{ - WonXText wonx_text; - WWText ww_text; - - wonx_text = (WonXText)malloc(sizeof(_WonXText)); - if (wonx_text == NULL) - WonX_Error("WonXText_Create", "Cannot allocate memory."); - - ww_text = WWText_Create(screen, x, y, width, height, palette); - if (ww_text == NULL) - WonX_Error("WonXText_Create", "Cannot create WonderWitch text."); - WonXText_SetWWText(wonx_text, ww_text); - - return (wonx_text); -} - -WonXText WonXText_Destroy(WonXText wonx_text) -{ - if (wonx_text == NULL) - WonX_Error("WonXText_Destroy", "Object is not created."); - - if (WonXText_GetWWText(wonx_text)) - WonXText_SetWWText(wonx_text, - WWText_Destroy(WonXText_GetWWText(wonx_text))); - - free(wonx_text); - - return (NULL); -} - -/*****************************************************************************/ -/* ¤³¤³¤Þ¤Ç */ -/*****************************************************************************/ - -/*****************************************************************************/ -/* End of File. */ -/*****************************************************************************/ diff --git a/XDisplay.h b/XDisplay.h index 566b08a..5f60315 100644 --- a/XDisplay.h +++ b/XDisplay.h @@ -5,10 +5,6 @@ /* ¤³¤³¤«¤é */ /*****************************************************************************/ -#include "wonx_include/key.h" - -#include "WWLCDPanel.h" - /*****************************************************************************/ /* ¥¯¥é¥¹¤ÎÄêµÁ */ /*****************************************************************************/ @@ -16,7 +12,15 @@ typedef struct _XDisplay * XDisplay; /*****************************************************************************/ -/* ¥á¥ó¥Ð´Ø¿ô¤ÎÄêµÁ */ +/* ¥Ø¥Ã¥À¥Õ¥¡¥¤¥ë¤Î¥¤¥ó¥¯¥ë¡¼¥É */ +/*****************************************************************************/ + +#include "wonx_include/key.h" + +#include "WWLCDPanel.h" + +/*****************************************************************************/ +/* ¥á¥ó¥Ð´Ø¿ô¤ÎÀë¸À */ /*****************************************************************************/ unsigned int XDisplay_GetKeyPress(XDisplay x_display); diff --git a/comm.c b/comm.c index 44bc1b5..9a77758 100644 --- a/comm.c +++ b/comm.c @@ -14,6 +14,9 @@ #include "wonx_configure.h" #include "WonX.h" +#include "WonXSerialPort.h" +#include "WWSerialPort.h" +#include "UNIXSerialPort.h" #include "etc.h" /*****************************************************************************/ @@ -38,7 +41,9 @@ void comm_open(void) { + WonXSerialPort wonx_serial_port; WWSerialPort ww_serial_port; + UNIXSerialPort unix_serial_port; if (!WonX_IsCreated()) WonX_Create(); @@ -48,12 +53,17 @@ void comm_open(void) printf("call : comm_open() : \n"); fflush(stdout); - ww_serial_port = WonXSerialPort_GetWWSerialPort(WonX_GetWonXSerialPort()); + wonx_serial_port = WonX_GetWonXSerialPort(); + ww_serial_port = WonXSerialPort_GetWWSerialPort(wonx_serial_port); + unix_serial_port = WonXSerialPort_GetUNIXSerialPort(wonx_serial_port); - if (WWSerialPort_IsON(ww_serial_port)) - WonX_Error("comm_open", "Serial port has already opened."); + if (WWSerialPort_IsOpened(ww_serial_port)) + WonX_Warning("comm_open", "WW serial port has already opened."); + WWSerialPort_Open(ww_serial_port); - WWSerialPort_ON(ww_serial_port); + if (UNIXSerialPort_IsOpened(unix_serial_port)) + WonX_Warning("comm_open", "UNIX serial port has already opened."); + UNIXSerialPort_Open(unix_serial_port); WonXDisplay_Sync(WonX_GetWonXDisplay()); @@ -68,7 +78,9 @@ void comm_open(void) void comm_close(void) { + WonXSerialPort wonx_serial_port; WWSerialPort ww_serial_port; + UNIXSerialPort unix_serial_port; if (!WonX_IsCreated()) WonX_Create(); @@ -78,12 +90,17 @@ void comm_close(void) printf("call : comm_close() : \n"); fflush(stdout); - ww_serial_port = WonXSerialPort_GetWWSerialPort(WonX_GetWonXSerialPort()); + wonx_serial_port = WonX_GetWonXSerialPort(); + ww_serial_port = WonXSerialPort_GetWWSerialPort(wonx_serial_port); + unix_serial_port = WonXSerialPort_GetUNIXSerialPort(wonx_serial_port); - if (!WWSerialPort_IsON(ww_serial_port)) - WonX_Error("comm_close", "Serial port is not opened."); + if (!WWSerialPort_IsClosed(ww_serial_port)) + WonX_Warning("comm_close", "WW serial port is not opened."); + WWSerialPort_Close(ww_serial_port); - WWSerialPort_OFF(ww_serial_port); + if (!UNIXSerialPort_IsClosed(unix_serial_port)) + WonX_Warning("comm_close", "UNIX serial port is not opened."); + UNIXSerialPort_Close(unix_serial_port); WonXDisplay_Sync(WonX_GetWonXDisplay()); @@ -98,75 +115,55 @@ void comm_close(void) static void comm_output(unsigned char c) { - if (c == '\n') printf("\\n"); - else if (c == '\r') printf("\\r"); - else if (c == '\t') printf("\\t"); - else if (isprint(c)) fputc(c, stdout); - else printf("^%02x", (int)c); - fflush(stdout); + WonXSerialPort wonx_serial_port; + UNIXSerialPort unix_serial_port; + + wonx_serial_port = WonX_GetWonXSerialPort(); + unix_serial_port = WonXSerialPort_GetUNIXSerialPort(wonx_serial_port); + UNIXSerialPort_SendCharacter(unix_serial_port, c); + return; } static int comm_input(int timeout) { - int tmp; + WonXSerialPort wonx_serial_port; + UNIXSerialPort unix_serial_port; int c; - fd_set bitmap; - struct timeval t; - struct timeval * t_p; - /* - * 0 ¤Î¤È¤­¤Ï¡¤Â¨»þ - * -1 ¤Î¤È¤­¤Ï¡¤Ìµ´ü¸ÂÂÔ¤Á - */ - if (timeout == -1) { - t_p = NULL; - } else { - tmp = WONX_SERIAL_PORT_TIMETICKS * timeout; - t.tv_sec = tmp / 1000; - t.tv_usec = (tmp % 1000) * 1000; - t_p = &t; - } - - FD_ZERO(&bitmap); - FD_SET(fileno(stdin), &bitmap); - - /* - * FreeBSD3.4 ¤Ç¼Â¸³¤·¤¿¤È¤³¤í¡¤ - * ¥¢¥é¡¼¥à¥·¥°¥Ê¥ë¤ò»ÈÍѤ¹¤ë¾ì¹ç¡¤select()¤Ç¤Î¥Ö¥í¥Ã¥¯Ãæ¤Ë - * ¥¢¥é¡¼¥à¥·¥°¥Ê¥ë¤¬È¯À¸¤¹¤ë¤È¡¤¤½¤Îľ¸å¤Ëselect()¤â¥¿¥¤¥à¥¢¥¦¥È - * ¤·¤Æ¤·¤Þ¤¦¤Î¤Ç¡¤Ãí°Õ¡¥ - * (select() ¤¬¥¿¥¤¥à¥¢¥¦¥È¤·¤¿¸å¤Ë¥¢¥é¡¼¥à¥·¥°¥Ê¥ë¤¬È¯À¸¤¹¤ë¾ì¹ç¤Ï¡¤ - * Àµ¾ï¤Ëưºî¤·¤¿) - * ÏÀÍý¾å¤ÏÌäÂ̵꤬¤¤¤¬¡¤´üÂÔ¤·¤¿»þ´Ö¤À¤±ÂԤäƤ¯¤ì¤Ê¤¤¤È¤¤¤¦¸½¾Ý¤¬ - * µ¯¤­¤ë²ÄǽÀ­¤¬¤¢¤ë¡¥ - */ - select(fileno(stdin) + 1, &bitmap, NULL, NULL, t_p); - - c = FD_ISSET(fileno(stdin), &bitmap) ? fgetc(stdin) : -1; - c = (c == '\n') ? '\r' : c; + wonx_serial_port = WonX_GetWonXSerialPort(); + unix_serial_port = WonXSerialPort_GetUNIXSerialPort(wonx_serial_port); + c = UNIXSerialPort_ReceiveCharacter(unix_serial_port, + WONX_SERIAL_PORT_TIMETICKS * timeout); return (c); } int comm_send_char(unsigned char c) { - int ret; - + WonXSerialPort wonx_serial_port; WWSerialPort ww_serial_port; + UNIXSerialPort unix_serial_port; + int ret; if (!WonX_IsCreated()) WonX_Create(); /* ¥¿¥¤¥Þ¤ò°ì»þÄä»ß¤¹¤ë */ UNIXTimer_Pause(WonXSystem_GetUNIXTimer(WonX_GetWonXSystem())); - printf("call : comm_send_char() : character = 0x%02x\n", (int)c); + printf("call : comm_send_char() : character = \'"); + wonx_print_character(stdout, c); + printf("\'\n"); fflush(stdout); - ww_serial_port = WonXSerialPort_GetWWSerialPort(WonX_GetWonXSerialPort()); + wonx_serial_port = WonX_GetWonXSerialPort(); + ww_serial_port = WonXSerialPort_GetWWSerialPort(wonx_serial_port); + unix_serial_port = WonXSerialPort_GetUNIXSerialPort(wonx_serial_port); - if (!WWSerialPort_IsON(ww_serial_port)) - WonX_Error("comm_send_char", "Serial port is not opened."); + if (!WWSerialPort_IsOpened(ww_serial_port)) + WonX_Error("comm_send_char", "WW serial port is not opened."); + if (!UNIXSerialPort_IsOpened(unix_serial_port)) + WonX_Error("comm_send_char", "UNIX serial port is not opened."); printf("output to serial port : "); comm_output(c); @@ -187,7 +184,9 @@ int comm_send_char(unsigned char c) int comm_receive_char(void) { + WonXSerialPort wonx_serial_port; WWSerialPort ww_serial_port; + UNIXSerialPort unix_serial_port; int c; int ret; @@ -199,10 +198,14 @@ int comm_receive_char(void) printf("call : comm_receive_char() : \n"); fflush(stdout); - ww_serial_port = WonXSerialPort_GetWWSerialPort(WonX_GetWonXSerialPort()); + wonx_serial_port = WonX_GetWonXSerialPort(); + ww_serial_port = WonXSerialPort_GetWWSerialPort(wonx_serial_port); + unix_serial_port = WonXSerialPort_GetUNIXSerialPort(wonx_serial_port); - if (!WWSerialPort_IsON(ww_serial_port)) - WonX_Error("comm_receive_char", "Serial port is not opened."); + if (!WWSerialPort_IsOpened(ww_serial_port)) + WonX_Error("comm_receive_char", "WW serial port is not opened."); + if (!UNIXSerialPort_IsOpened(unix_serial_port)) + WonX_Error("comm_receive_char", "UNIX serial port is not opened."); c = comm_input(WWSerialPort_GetReceiveTimeout(ww_serial_port)); @@ -222,7 +225,9 @@ int comm_receive_char(void) int comm_receive_with_timeout(int timeout) { + WonXSerialPort wonx_serial_port; WWSerialPort ww_serial_port; + UNIXSerialPort unix_serial_port; int c; int ret; @@ -234,10 +239,14 @@ int comm_receive_with_timeout(int timeout) printf("call : comm_receive_with_timeout() : timeout = %d\n", timeout); fflush(stdout); - ww_serial_port = WonXSerialPort_GetWWSerialPort(WonX_GetWonXSerialPort()); + wonx_serial_port = WonX_GetWonXSerialPort(); + ww_serial_port = WonXSerialPort_GetWWSerialPort(wonx_serial_port); + unix_serial_port = WonXSerialPort_GetUNIXSerialPort(wonx_serial_port); - if (!WWSerialPort_IsON(ww_serial_port)) - WonX_Error("comm_receive_with_timeout", "Serial port is not opened."); + if (!WWSerialPort_IsOpened(ww_serial_port)) + WonX_Error("comm_receive_with_timeout", "WW serial port is not opened."); + if (!UNIXSerialPort_IsOpened(unix_serial_port)) + WonX_Error("comm_receive_with_timeout", "UNIX serial port is not opened."); c = comm_input(timeout); @@ -257,8 +266,11 @@ int comm_receive_with_timeout(int timeout) int comm_send_string(char * string) { + WonXSerialPort wonx_serial_port; WWSerialPort ww_serial_port; + UNIXSerialPort unix_serial_port; int ret; + char * p; int i; if (!WonX_IsCreated()) WonX_Create(); @@ -266,13 +278,19 @@ int comm_send_string(char * string) /* ¥¿¥¤¥Þ¤ò°ì»þÄä»ß¤¹¤ë */ UNIXTimer_Pause(WonXSystem_GetUNIXTimer(WonX_GetWonXSystem())); - printf("call : comm_send_string() : string = %s\n", string); + printf("call : comm_send_string() : string = \""); + for (p = string; *p != '\0'; p++) wonx_print_character(stdout, *p); + printf("\"\n"); fflush(stdout); - ww_serial_port = WonXSerialPort_GetWWSerialPort(WonX_GetWonXSerialPort()); + wonx_serial_port = WonX_GetWonXSerialPort(); + ww_serial_port = WonXSerialPort_GetWWSerialPort(wonx_serial_port); + unix_serial_port = WonXSerialPort_GetUNIXSerialPort(wonx_serial_port); - if (!WWSerialPort_IsON(ww_serial_port)) - WonX_Error("comm_send_string", "Serial port is not opened."); + if (!WWSerialPort_IsOpened(ww_serial_port)) + WonX_Error("comm_send_string", "WW serial port is not opened."); + if (!UNIXSerialPort_IsOpened(unix_serial_port)) + WonX_Error("comm_send_string", "UNIX serial port is not opened."); printf("output to serial port : "); for (i = 0; string[i]; i++) { @@ -295,7 +313,9 @@ int comm_send_string(char * string) int comm_send_block(void * buffer, int size) { + WonXSerialPort wonx_serial_port; WWSerialPort ww_serial_port; + UNIXSerialPort unix_serial_port; int ret; int i; @@ -307,10 +327,14 @@ int comm_send_block(void * buffer, int size) printf("call : comm_send_block() : buffer = %p, size = %d\n", buffer, size); fflush(stdout); - ww_serial_port = WonXSerialPort_GetWWSerialPort(WonX_GetWonXSerialPort()); + wonx_serial_port = WonX_GetWonXSerialPort(); + ww_serial_port = WonXSerialPort_GetWWSerialPort(wonx_serial_port); + unix_serial_port = WonXSerialPort_GetUNIXSerialPort(wonx_serial_port); - if (!WWSerialPort_IsON(ww_serial_port)) - WonX_Error("comm_send_block", "Serial port is not opened."); + if (!WWSerialPort_IsOpened(ww_serial_port)) + WonX_Error("comm_send_block", "WW serial port is not opened."); + if (!UNIXSerialPort_IsOpened(unix_serial_port)) + WonX_Error("comm_send_block", "UNIX serial port is not opened."); printf("output to serial port : "); for (i = 0; i < size; i++) { @@ -333,7 +357,9 @@ int comm_send_block(void * buffer, int size) int comm_receive_block(void * buffer, int size) { + WonXSerialPort wonx_serial_port; WWSerialPort ww_serial_port; + UNIXSerialPort unix_serial_port; int ret; int c; int i; @@ -347,10 +373,14 @@ int comm_receive_block(void * buffer, int size) buffer, size); fflush(stdout); - ww_serial_port = WonXSerialPort_GetWWSerialPort(WonX_GetWonXSerialPort()); + wonx_serial_port = WonX_GetWonXSerialPort(); + ww_serial_port = WonXSerialPort_GetWWSerialPort(wonx_serial_port); + unix_serial_port = WonXSerialPort_GetUNIXSerialPort(wonx_serial_port); - if (!WWSerialPort_IsON(ww_serial_port)) - WonX_Error("comm_receive_block", "Serial port is not opened."); + if (!WWSerialPort_IsOpened(ww_serial_port)) + WonX_Error("comm_receive_block", "WW serial port is not opened."); + if (!UNIXSerialPort_IsOpened(unix_serial_port)) + WonX_Error("comm_receive_block", "UNIX serial port is not opened."); ret = 0; for (i = 0; i < size; i++) { diff --git a/disp.c b/disp.c index 561b3d0..cc3b41f 100644 --- a/disp.c +++ b/disp.c @@ -1082,6 +1082,7 @@ unsigned int palette_get_color(unsigned int palette_num) int mapped_colors[4]; WWPalette palette; unsigned short int ret; + int i; if (!WonX_IsCreated()) WonX_Create(); @@ -1094,17 +1095,22 @@ unsigned int palette_get_color(unsigned int palette_num) palette = WWDisplay_GetPalette(WonXDisplay_GetWWDisplay(WonX_GetWonXDisplay()), palette_num); + /* Æ©ÌÀ¿§¤Ï -1 ¤ÇÊÖ¤µ¤ì¤ë¤Î¤ÇÃí°Õ¤¹¤ë¤³¤È */ WWPalette_GetMappedColors(palette, mapped_colors); + /* Æ©ÌÀ¿§¤Ï -1 ¤Çɽ¤µ¤ì¤ë¤Î¤Ç¡¤0¤Ë¤¹¤ë */ + for (i = 0; i < 4; i++) + if (mapped_colors[i] == -1) mapped_colors[i] = 0; + ret = 0; - ret |= mapped_colors[0] & 0x07; + ret |= mapped_colors[0] & 0x07; ret |= (mapped_colors[1] & 0x07) << 4; ret |= (mapped_colors[2] & 0x07) << 8; ret |= (mapped_colors[3] & 0x07) << 12; WonXDisplay_Sync(WonX_GetWonXDisplay()); - printf("call : palette_get_color() : return value = %u\n", (int)ret); + printf("call : palette_get_color() : return value = 0x%04x\n", (int)ret); fflush(stdout); /* ¥¿¥¤¥Þ¤ò¤â¤È¤ËÌ᤹ */ @@ -1172,10 +1178,10 @@ unsigned long int lcd_get_color(void) ret |= ((unsigned long int)lcd_colors[1] & 0x0f) << 4; ret |= ((unsigned long int)lcd_colors[2] & 0x0f) << 8; ret |= ((unsigned long int)lcd_colors[3] & 0x0f) << 12; - ret |= (unsigned long int)lcd_colors[0] & 0x0f; - ret |= ((unsigned long int)lcd_colors[1] & 0x0f) << 4; - ret |= ((unsigned long int)lcd_colors[2] & 0x0f) << 8; - ret |= ((unsigned long int)lcd_colors[3] & 0x0f) << 12; + ret |= ((unsigned long int)lcd_colors[4] & 0x0f) << 16; + ret |= ((unsigned long int)lcd_colors[5] & 0x0f) << 20; + ret |= ((unsigned long int)lcd_colors[6] & 0x0f) << 24; + ret |= ((unsigned long int)lcd_colors[7] & 0x0f) << 28; WonXDisplay_Sync(WonX_GetWonXDisplay()); diff --git a/etc.c b/etc.c index bb4e62e..c1a83a5 100644 --- a/etc.c +++ b/etc.c @@ -1,26 +1,30 @@ #include "etc.h" -#include -#include - -/*===========================================================================*/ -/* ¥¨¥é¡¼½èÍý */ -/*===========================================================================*/ - -int WonX_Error(char * funcname, char * message) -{ - fprintf(stderr, "%s(): %s\n", funcname, message); - exit (1); -} +#include /*===========================================================================*/ /* "true", "false" ¤Îʸ»úÎó¤òÊÖ¤¹ */ /*===========================================================================*/ -char * true_false(int b) +char * wonx_true_false(int b) { char * s[] = {"false", "true"}; b = b ? 1 : 0; return (s[b]); } +/*===========================================================================*/ +/* ʸ»ú¤Î½ÐÎÏ */ +/*===========================================================================*/ + +int wonx_print_character(FILE * fp, unsigned char c) +{ + if (c == '\n') fprintf(fp, "\\n"); + else if (c == '\r') fprintf(fp, "\\r"); + else if (c == '\t') fprintf(fp, "\\t"); + else if (c == ' ' ) fprintf(fp, "\\s"); + else if (isprint(c)) fputc(c, fp); + else fprintf(fp, "^%02x", (int)c); + fflush(fp); + return (0); +} diff --git a/etc.h b/etc.h index e13781c..2ae48fd 100644 --- a/etc.h +++ b/etc.h @@ -1,17 +1,19 @@ #ifndef _etc_h_INCLUDED_ #define _etc_h_INCLUDED_ -/*===========================================================================*/ -/* ¥¨¥é¡¼½èÍý */ -/*===========================================================================*/ - -int WonX_Error(char * funcname, char * message); +#include +#include /*===========================================================================*/ /* "true", "false" ¤Îʸ»úÎó¤òÊÖ¤¹ */ /*===========================================================================*/ -char * true_false(int b); +char * wonx_true_false(int b); + +/*===========================================================================*/ +/* ʸ»ú¤Î½ÐÎÏ */ +/*===========================================================================*/ + +int wonx_print_character(FILE * fp, unsigned char c); #endif - diff --git a/makefile_for_wwterm b/makefile_for_wwterm new file mode 100644 index 0000000..ba39e02 --- /dev/null +++ b/makefile_for_wwterm @@ -0,0 +1,36 @@ +VERSION = WWTerm-b05 +PKGNAME = wwterm-b05 + +#OBJS = terminal.obj termlib.obj lib.obj keyboard.obj keymap.obj com.obj screen.obj escape.obj esclib.obj +#OBJS_FULL = D:\\terminal.obj D:\\termlib.obj D:\\lib.obj D:\\keyboard.obj D:\\keymap.obj D:\\com.obj D:\\screen.obj D:\\escape.obj D:\\esclib.obj +OBJS = terminal.o termlib.o lib.o keyboard.o keymap.o com.o screen.o escape.o esclib.o + +#.SUFFIXES: .c .obj +.SUFFIXES: .c .o + +#terminal.fx : terminal.bin +# doscmd mkfent16 D:\\terminal.cf + +#terminal.bin : $(OBJS) +# echo $(OBJS_FULL) > objs +# doscmd lcc86 -O -o D:\\terminal.bin @D:\\objs + +terminal : $(OBJS) + $(CC) -O -o terminal $(OBJS) -L. -L/usr/X11R6/lib -lwonx -lX11 -lXt + +#.c.obj : $*.c +# doscmd lcc86 -c D:\\$*.c -O -I. + +.c.o : $*.c + $(CC) -c $*.c -O -I. + +clean : +# rm -f terminal.fx terminal.bin *.obj $(PKGNAME).zip + rm -f terminal *.o $(PKGNAME).zip + +package : terminal.bin terminal.fx + mkdir -p $(PKGNAME) + rm -fR $(PKGNAME)/* + cp COPYING COPYRIGHT OMAKE.jpn makefile \ + *.h *.c *.bin *.cf *.fx $(PKGNAME) + zip -r $(PKGNAME) $(PKGNAME) diff --git a/service.c b/service.c new file mode 100644 index 0000000..ca68c6d --- /dev/null +++ b/service.c @@ -0,0 +1,52 @@ +/*****************************************************************************/ +/* ¤³¤³¤«¤é */ +/*****************************************************************************/ + +#include + +#include "wonx_include/service.h" + +#include "WonX.h" + +/*****************************************************************************/ +/* ¥À¥ß¡¼´Ø¿ô¤ÎÄêµÁ */ +/*****************************************************************************/ + +int _asm_inline(char * code) { return (0); } +int _asm_int(char * code, int ax) { return (0); } +int _asm_intb(char * code, int ax, unsigned char bl) { return (0); } +int _asm_intbb(char * code, int ax, unsigned char bl, unsigned char cl) { return (0); } +int _asm_intw(char * code, int ax, int bx) { return (0); } +int _asm_intww(char * code, int ax, int bx, int cx) { return (0); } +int _asm_intwww(char * code, int ax, int bx, int cx, int dx) { return (0); } +int _asm_intwwww(char * code, int ax, int bx, int cx, int dx, int si) { return (0); } +int _asm_intwp(char * code, int ax, int bx, int (*dummy)(void), void * dx) { return (0); } +int _asm_intwwp(char * code, int ax, int bx, int cx, void * dx) { return (0); } +int _asm_intwwwp(char * code, int ax, int bx, int cx, int dx, void * si) { return (0); } +int _asm_intwfp(char * code, int ax, int bx, void * dsdx) { return (0); } +int _asm_intfp(char * code, int ax, void * bxdx) { return (0); } + +long int _asm_intl(char * code, int ax) { return (0); } +long int _asm_intlw(char * code, int ax, int bx) { return (0); } +long int _asm_intlww(char * code, int ax, int bx, int cx) { return (0); } +long int _asm_intlwww(char * code, int ax, int bx, int cx, int dx) { return (0); } +long int _asm_intlwwww(char * code, int ax, int bx, int cx, int dx, int si) { return (0); } +long int _asm_intlwp(char * code, int ax, int bx, int (*dummy)(void), void * dx) { return (0); } +long int _asm_intlwwp(char * code, int ax, int bx, int cx, void * dx) { return (0); } +long int _asm_intlwwwp(char * code, int ax, int bx, int cx, int dx, void * si) { return (0); } +long int _asm_intlwfp(char * code, int ax, int bx, void * dsdx) { return (0); } + +void bios_exit() +{ + printf("call : bios_exit() : \n"); + fflush(stdout); + exit (0); +} + +/*****************************************************************************/ +/* ¤³¤³¤Þ¤Ç */ +/*****************************************************************************/ + +/*****************************************************************************/ +/* End of File. */ +/*****************************************************************************/ diff --git a/sout2str.pl b/sout2str.pl index 002c79e..44913af 100644 --- a/sout2str.pl +++ b/sout2str.pl @@ -4,10 +4,11 @@ use FileHandle; while () { if (/output to serial port : /) { - ($string) = /output to serial port : (.*)/; + ($string) = /output to serial port : \"(.*)\"\n/; $string =~ s/\\n/\n/; $string =~ s/\\r/\n/; $string =~ s/\\t/\t/; + $string =~ s/\\s/ /; print "$string"; STDOUT->autoflush(); } diff --git a/system.c b/system.c index 3438dda..ebc90a9 100644 --- a/system.c +++ b/system.c @@ -177,13 +177,6 @@ unsigned int sys_get_resume(void) return (0); } -void bios_exit() -{ - printf("call : bios_exit() : \n"); - fflush(stdout); - exit (0); -} - /*****************************************************************************/ /* ¤³¤³¤Þ¤Ç */ /*****************************************************************************/ diff --git a/text.c b/text.c index 6d9c40a..331b481 100644 --- a/text.c +++ b/text.c @@ -10,6 +10,9 @@ #include "WonX.h" #include "WWText.h" +#include "WWDisplay.h" +#include "WWCursor.h" +#include "etc.h" /*****************************************************************************/ /* ¸ß´¹´Ø¿ô¤ÎÄêµÁ */ @@ -33,11 +36,11 @@ static void _text_window_init(int x, int y, int w, int h, unsigned int base) { - WWText ww_text; WWDisplay ww_display; + WWText ww_text; - ww_text = WonXText_GetWWText(WonX_GetWonXText()); ww_display = WonXDisplay_GetWWDisplay(WonX_GetWonXDisplay()); + ww_text = WWDisplay_GetText(ww_display); WWText_SetTextWindow(ww_text, x, y, w, h, base, ww_display); @@ -112,11 +115,11 @@ int text_get_mode(void) static void _text_put_char(int x, int y, unsigned int c) { - WWText ww_text; WWDisplay ww_display; + WWText ww_text; - ww_text = WonXText_GetWWText(WonX_GetWonXText()); ww_display = WonXDisplay_GetWWDisplay(WonX_GetWonXDisplay()); + ww_text = WWDisplay_GetText(ww_display); WWText_PutCharacter(ww_text, x, y, c, ww_display); @@ -130,7 +133,9 @@ void text_put_char(int x, int y, unsigned int c) /* ¥¿¥¤¥Þ¤ò°ì»þÄä»ß¤¹¤ë */ UNIXTimer_Pause(WonXSystem_GetUNIXTimer(WonX_GetWonXSystem())); - printf("call : text_put_char() : x = %d, y = %d, character = %u\n", x, y, (int)c); + printf("call : text_put_char() : x = %d, y = %d, character = \'", x, y); + wonx_print_character(stdout, c); + printf("\'\n"); fflush(stdout); _text_put_char(x, y, c); @@ -148,11 +153,11 @@ void text_put_char(int x, int y, unsigned int c) static int _text_put_string(int x, int y, char * string) { int i, len, ret; - WWText ww_text; WWDisplay ww_display; + WWText ww_text; - ww_text = WonXText_GetWWText(WonX_GetWonXText()); ww_display = WonXDisplay_GetWWDisplay(WonX_GetWonXDisplay()); + ww_text = WWDisplay_GetText(ww_display); len = strlen(string); ret = 0; @@ -167,13 +172,16 @@ static int _text_put_string(int x, int y, char * string) int text_put_string(int x, int y, char * string) { int ret; + char * p; if (!WonX_IsCreated()) WonX_Create(); /* ¥¿¥¤¥Þ¤ò°ì»þÄä»ß¤¹¤ë */ UNIXTimer_Pause(WonXSystem_GetUNIXTimer(WonX_GetWonXSystem())); - printf("call : text_put_string() : x = %d, y = %d, string = %s\n", x, y, string); + printf("call : text_put_string() : x = %d, y = %d, string = \"", x, y); + for (p = string; *p != '\0'; p++) wonx_print_character(stdout, *p); + printf("\"\n"); fflush(stdout); ret = _text_put_string(x, y, string); @@ -192,19 +200,21 @@ int text_put_string(int x, int y, char * string) int text_put_substring(int x, int y, char * s, int length) { int i, ret; - WWText ww_text; WWDisplay ww_display; + WWText ww_text; if (!WonX_IsCreated()) WonX_Create(); /* ¥¿¥¤¥Þ¤ò°ì»þÄä»ß¤¹¤ë */ UNIXTimer_Pause(WonXSystem_GetUNIXTimer(WonX_GetWonXSystem())); - printf("call : text_put_substring() : x = %d, y = %d, string = %s, length = %d\n", x, y, s, length); + printf("call : text_put_substring() : x = %d, y = %d, length = %d, string = \"", x, y, length); + for (i = 0; i < length; i++) wonx_print_character(stdout, s[i]); + printf("\"\n"); fflush(stdout); - ww_text = WonXText_GetWWText(WonX_GetWonXText()); ww_display = WonXDisplay_GetWWDisplay(WonX_GetWonXDisplay()); + ww_text = WWDisplay_GetText(ww_display); ret = 0; for (i = 0; i < length; i++) { @@ -292,8 +302,8 @@ void text_fill_char(int x, int y, int length, int c) void text_set_palette(int palette_num) { - WWText ww_text; WWDisplay ww_display; + WWText ww_text; if (!WonX_IsCreated()) WonX_Create(); @@ -303,8 +313,8 @@ void text_set_palette(int palette_num) printf("call : text_set_palette() : palette = %d\n", palette_num); fflush(stdout); - ww_text = WonXText_GetWWText(WonX_GetWonXText()); ww_display = WonXDisplay_GetWWDisplay(WonX_GetWonXDisplay()); + ww_text = WWDisplay_GetText(ww_display); WWText_SetPalette(ww_text, WWDisplay_GetPalette(ww_display, palette_num)); @@ -321,6 +331,7 @@ void text_set_palette(int palette_num) int text_get_palette(void) { + WWDisplay ww_display; WWText ww_text; int num; @@ -332,7 +343,8 @@ int text_get_palette(void) printf("call : text_get_palette() : \n"); fflush(stdout); - ww_text = WonXText_GetWWText(WonX_GetWonXText()); + ww_display = WonXDisplay_GetWWDisplay(WonX_GetWonXDisplay()); + ww_text = WWDisplay_GetText(ww_display); num = WWPalette_GetNumber(WWText_GetPalette(ww_text)); @@ -361,8 +373,8 @@ void text_get_fontdata(int c, void * buffer) void text_set_screen(int screen) { - WWText ww_text; WWDisplay ww_display; + WWText ww_text; if (!WonX_IsCreated()) WonX_Create(); @@ -372,8 +384,8 @@ void text_set_screen(int screen) printf("call : text_set_screen() : screen = %d\n", screen); fflush(stdout); - ww_text = WonXText_GetWWText(WonX_GetWonXText()); ww_display = WonXDisplay_GetWWDisplay(WonX_GetWonXDisplay()); + ww_text = WWDisplay_GetText(ww_display); WWText_SetScreen(ww_text, WWDisplay_GetScreen(ww_display, screen)); @@ -390,6 +402,7 @@ void text_set_screen(int screen) int text_get_screen(void) { + WWDisplay ww_display; WWText ww_text; int n; @@ -401,7 +414,8 @@ int text_get_screen(void) printf("call : text_get_screen() : \n"); fflush(stdout); - ww_text = WonXText_GetWWText(WonX_GetWonXText()); + ww_display = WonXDisplay_GetWWDisplay(WonX_GetWonXDisplay()); + ww_text = WWDisplay_GetText(ww_display); n = WWScreen_GetNumber(WWText_GetScreen(ww_text)); @@ -418,29 +432,219 @@ int text_get_screen(void) void cursor_display(int flag) { + WWDisplay ww_display; + WWCursor ww_cursor; + + if (!WonX_IsCreated()) WonX_Create(); + + /* ¥¿¥¤¥Þ¤ò°ì»þÄä»ß¤¹¤ë */ + UNIXTimer_Pause(WonXSystem_GetUNIXTimer(WonX_GetWonXSystem())); + + printf("call : cursor_display() : flag = %d\n", flag); + fflush(stdout); + + ww_display = WonXDisplay_GetWWDisplay(WonX_GetWonXDisplay()); + ww_cursor = WWDisplay_GetCursor(ww_display); + + switch (flag) { + case 0: WWCursor_OFF(ww_cursor); break; + case 1: WWCursor_ON( ww_cursor); break; + default: + WonX_Warning("cursor_display", "Cursor flag is 0 or 1."); + WWCursor_ON(ww_cursor); /* °ì±þ ON ¤Ë¤·¤È¤¯ */ + } + + WonXDisplay_Flush(WonX_GetWonXDisplay()); + + printf("call : cursor_display() : return value = none\n"); + fflush(stdout); + + /* ¥¿¥¤¥Þ¤ò¤â¤È¤ËÌ᤹ */ + UNIXTimer_Unpause(WonXSystem_GetUNIXTimer(WonX_GetWonXSystem())); + + return; } int cursor_status(void) { - return (0); + WWDisplay ww_display; + WWCursor ww_cursor; + int ret; + + if (!WonX_IsCreated()) WonX_Create(); + + /* ¥¿¥¤¥Þ¤ò°ì»þÄä»ß¤¹¤ë */ + UNIXTimer_Pause(WonXSystem_GetUNIXTimer(WonX_GetWonXSystem())); + + printf("call : cursor_status() : \n"); + fflush(stdout); + + ww_display = WonXDisplay_GetWWDisplay(WonX_GetWonXDisplay()); + ww_cursor = WWDisplay_GetCursor(ww_display); + + ret = WWCursor_IsON(ww_cursor) ? 1 : 0; + + WonXDisplay_Sync(WonX_GetWonXDisplay()); + + printf("call : cursor_status() : return value = %d\n", ret); + fflush(stdout); + + /* ¥¿¥¤¥Þ¤ò¤â¤È¤ËÌ᤹ */ + UNIXTimer_Unpause(WonXSystem_GetUNIXTimer(WonX_GetWonXSystem())); + + return (ret); } void cursor_set_location(int x, int y, int w, int h) { + WWDisplay ww_display; + WWCursor ww_cursor; + + if (!WonX_IsCreated()) WonX_Create(); + + /* ¥¿¥¤¥Þ¤ò°ì»þÄä»ß¤¹¤ë */ + UNIXTimer_Pause(WonXSystem_GetUNIXTimer(WonX_GetWonXSystem())); + + printf("call : cursor_set_location() : x = %d, y = %d, w = %d, h = %d", + x, y, w, h); + fflush(stdout); + + ww_display = WonXDisplay_GetWWDisplay(WonX_GetWonXDisplay()); + ww_cursor = WWDisplay_GetCursor(ww_display); + + if (x < 0) + WonX_Warning("cursor_set_location", "Value of x is too small."); + if (x > TEXT_SCREEN_WIDTH - 1) + WonX_Warning("cursor_set_location", "Value of x is too large."); + if (y < 0) + WonX_Warning("cursor_set_location", "Value of y is too small."); + if (y > TEXT_SCREEN_HEIGHT - 1) + WonX_Warning("cursor_set_location", "Value of y is too large."); + if (w <= 0) + WonX_Warning("cursor_set_location", "Value of w is too small."); + if (h <= 0) + WonX_Warning("cursor_set_location", "Value of h is too small."); + + WWCursor_SetX(ww_cursor, x); + WWCursor_SetY(ww_cursor, y); + WWCursor_SetWidth( ww_cursor, w); + WWCursor_SetHeight(ww_cursor, h); + + WonXDisplay_Flush(WonX_GetWonXDisplay()); + + printf("call : cursor_set_location() : return value = none\n"); + fflush(stdout); + + /* ¥¿¥¤¥Þ¤ò¤â¤È¤ËÌ᤹ */ + UNIXTimer_Unpause(WonXSystem_GetUNIXTimer(WonX_GetWonXSystem())); + + return; } unsigned long int cursor_get_location(void) { - return (0); + WWDisplay ww_display; + WWCursor ww_cursor; + unsigned long int ret; + + if (!WonX_IsCreated()) WonX_Create(); + + /* ¥¿¥¤¥Þ¤ò°ì»þÄä»ß¤¹¤ë */ + UNIXTimer_Pause(WonXSystem_GetUNIXTimer(WonX_GetWonXSystem())); + + printf("call : cursor_get_location() : \n"); + fflush(stdout); + + ww_display = WonXDisplay_GetWWDisplay(WonX_GetWonXDisplay()); + ww_cursor = WWDisplay_GetCursor(ww_display); + + ret = 0; + ret |= (((unsigned long int)WWCursor_GetX( ww_cursor) & 0xff) << 0); + ret |= (((unsigned long int)WWCursor_GetY( ww_cursor) & 0xff) << 8); + ret |= (((unsigned long int)WWCursor_GetWidth( ww_cursor) & 0xff) << 16); + ret |= (((unsigned long int)WWCursor_GetHeight(ww_cursor) & 0xff) << 24); + + WonXDisplay_Sync(WonX_GetWonXDisplay()); + + printf("call : cursor_get_location() : return value = 0x%08x\n", (int)ret); + fflush(stdout); + + /* ¥¿¥¤¥Þ¤ò¤â¤È¤ËÌ᤹ */ + UNIXTimer_Unpause(WonXSystem_GetUNIXTimer(WonX_GetWonXSystem())); + + return (ret); } void cursor_set_type(int palette_num, int interval) { + WWDisplay ww_display; + WWCursor ww_cursor; + + if (!WonX_IsCreated()) WonX_Create(); + + /* ¥¿¥¤¥Þ¤ò°ì»þÄä»ß¤¹¤ë */ + UNIXTimer_Pause(WonXSystem_GetUNIXTimer(WonX_GetWonXSystem())); + + printf("call : cursor_set_type() : palette = %d, interval = %d", + palette_num, interval); + fflush(stdout); + + ww_display = WonXDisplay_GetWWDisplay(WonX_GetWonXDisplay()); + ww_cursor = WWDisplay_GetCursor(ww_display); + + if (palette_num < 0) + WonX_Error("cursor_set_type", "Palette number is too small."); + if (palette_num > 15) + WonX_Error("cursor_set_type", "Palette number is too large."); + if (interval < 0) + WonX_Warning("cursor_set_type", "Value of interval is too small."); + if (interval > 255) + WonX_Warning("cursor_set_type", "Value of interval is too small."); + + WWCursor_SetPalette(ww_cursor, + WWDisplay_GetPalette(ww_display, palette_num)); + WWCursor_SetInterval(ww_cursor, interval); + + WonXDisplay_Flush(WonX_GetWonXDisplay()); + + printf("call : cursor_set_type() : return value = none\n"); + fflush(stdout); + + /* ¥¿¥¤¥Þ¤ò¤â¤È¤ËÌ᤹ */ + UNIXTimer_Unpause(WonXSystem_GetUNIXTimer(WonX_GetWonXSystem())); + + return; } unsigned long int cursor_get_type(void) { - return (0); + WWDisplay ww_display; + WWCursor ww_cursor; + unsigned long int ret; + + if (!WonX_IsCreated()) WonX_Create(); + + /* ¥¿¥¤¥Þ¤ò°ì»þÄä»ß¤¹¤ë */ + UNIXTimer_Pause(WonXSystem_GetUNIXTimer(WonX_GetWonXSystem())); + + printf("call : cursor_get_type() : \n"); + fflush(stdout); + + ww_display = WonXDisplay_GetWWDisplay(WonX_GetWonXDisplay()); + ww_cursor = WWDisplay_GetCursor(ww_display); + + ret = WWPalette_GetNumber(WWCursor_GetPalette(ww_cursor)); + ret |= (((unsigned long int)WWCursor_GetInterval(ww_cursor) & 0xff) << 8); + + WonXDisplay_Sync(WonX_GetWonXDisplay()); + + printf("call : cursor_get_type() : return value = 0x%08x\n", (int)ret); + fflush(stdout); + + /* ¥¿¥¤¥Þ¤ò¤â¤È¤ËÌ᤹ */ + UNIXTimer_Unpause(WonXSystem_GetUNIXTimer(WonX_GetWonXSystem())); + + return (ret); } int text_printf(int x, int y, const char *format, ...) diff --git a/wonx_include/service.h b/wonx_include/service.h index 69bb74f..f637060 100644 --- a/wonx_include/service.h +++ b/wonx_include/service.h @@ -6,8 +6,76 @@ #define MK_WORD(high,low) (((unsigned short int)(high) << 8) | ((unsigned short int)(low))) #define MK_DWORD(high,low) (((unsigned long int)(high) << 16) | ((unsigned long int)(low))) #define MK_FP(seg,off) ((void *)MK_DWORD(seg,off)) + +#if 0 #define FP_OFF(p) ((unsigned short int)((unsigned long int)(p) & 0xffff)) #define FP_SEG(p) ((unsigned short int)((unsigned long int)(p) >> 16)) +#else +#define FP_OFF(p) (p) +#define FP_SEG(p) (0) +#endif + +int _asm_inline(char * code); +int _asm_int(char * code, int ax); +int _asm_intb(char * code, int ax, unsigned char bl); +int _asm_intbb(char * code, int ax, unsigned char bl, unsigned char cl); +int _asm_intw(char * code, int ax, int bx); +int _asm_intww(char * code, int ax, int bx, int cx); +int _asm_intwww(char * code, int ax, int bx, int cx, int dx); +int _asm_intwwww(char * code, int ax, int bx, int cx, int dx, int si); +int _asm_intwp(char * code, int ax, int bx, int (*dummy)(void), void * dx); +int _asm_intwwp(char * code, int ax, int bx, int cx, void * dx); +int _asm_intwwwp(char * code, int ax, int bx, int cx, int dx, void * si); +int _asm_intwfp(char * code, int ax, int bx, void * dsdx); +int _asm_intfp(char * code, int ax, void * bxdx); + +long int _asm_intl(char * code, int ax); +long int _asm_intlw(char * code, int ax, int bx); +long int _asm_intlww(char * code, int ax, int bx, int cx); +long int _asm_intlwww(char * code, int ax, int bx, int cx, int dx); +long int _asm_intlwwww(char * code, int ax, int bx, int cx, int dx, int si); +long int _asm_intlwp(char * code, int ax, int bx, int (*dummy)(void), void * dx); +long int _asm_intlwwp(char * code, int ax, int bx, int cx, void * dx); +long int _asm_intlwwwp(char * code, int ax, int bx, int cx, int dx, void * si); +long int _asm_intlwfp(char * code, int ax, int bx, void * dsdx); + +#define service(vec, ah) _asm_int(NULL,0) +#define serviceb(vec, ah, bl) _asm_intb(NULL,0,0) +#define servicebb(vec, ah, bl, cl) _asm_intbb(NULL,0,0,0) +#define servicew(vec, ah, bx) _asm_intw(NULL,0,0) +#define serviceww(vec, ah, bx, cx) _asm_intww(NULL,0,0,0) +#define servicewww(vec, ah, bx, cx, dx) _asm_intwww(NULL,0,0,0,0) +#define servicew_w(vec, ah, bx, dx) _asm_intwww(NULL,0,0,0,0) +#define servicewwww(vec, ah, bx, cx, dx, si) _asm_intwwww(NULL,0,0,0,0,0) +#define servicewp(vec, ah, bx, dx) _asm_intwp(NULL,0,0,0,0) +#define servicewwp(vec, ah, bx, cx, dx) _asm_intwwp(NULL,0,0,0,0) +#define servicewwwp(vec, ah, bx, cx, dx, si) _asm_intwwwp(NULL,0,0,0,0,0) +#define servicewfp(vec, ah, bx, dsdx) _asm_intwfp(NULL,0,0,0) +#define servicewwfp(vec, ah, bx, cx, dsdx) _asm_intwfp(NULL,0,0,0) +#define servicefp(vec, ah, bxdx) _asm_intwfp(NULL,0,0,0) + +#define servicex(vec, ah, al) _asm_int(NULL,0) +#define servicexw(vec, ah, al, bx) _asm_intw(NULL,0,0) +#define servicexww(vec, ah, al, bx, cx) _asm_intww(NULL,0,0,0) +#define servicexwww(vec, ah, al, bx, cx, dx) _asm_intwww(NULL,0,0,0,0) +#define servicexwwww(vec, ah, al, bx, cx, dx, si) _asm_intwwww(NULL,0,0,0,0,0) +#define servicexwp(vec, ah, al, bx, dx) _asm_intwp(NULL,0,0,0,0) +#define servicexwwp(vec, ah, al, bx, cx, dx) _asm_intwwp(NULL,0,0,0,0) +#define servicexwfp(vec, ah, al, bx, dsdx) _asm_intwfp(NULL,0,0,0) + +#define servicel(vec, ah) _asm_intl(NULL,0) +#define servicelw(vec, ah, bx) _asm_intlw(NULL,0,0) +#define servicelww(vec, ah, bx, cx) _asm_intlww(NULL,0,0,0) +#define servicelwww(vec, ah, bx, cx, dx) _asm_intlwww(NULL,0,0,0,0) +#define servicelwp(vec, ah, bx, dx) _asm_intlwp(NULL,0,0,0,0) +#define servicelwfp(vec, ah, bx, dsdx) _asm_intlwfp(NULL,0,0,0) + +#define servicelx(vec, ah, al) _asm_intl(NULL ,0) +#define servicelxw(vec, ah, al, bx) _asm_intlw(NULL,0,0) +#define servicelxww(vec, ah, al, bx, cx) _asm_intlww(NULL,0,0,0) +#define servicelxwww(vec, ah, al, bx, cx, dx) _asm_intlwww(NULL,0,0,0,0) +#define servicelxwp(vec, ah, al, bx, dx) _asm_intlwp(NULL,0,0,0,0) +#define servicelxwfp(vec, ah, al, bx, dsdx) _asm_intlwfp(NULL,0,0,0) void bios_exit(); diff --git a/wonx_include/system.h b/wonx_include/system.h index f7f1ad1..ef283dd 100644 --- a/wonx_include/system.h +++ b/wonx_include/system.h @@ -53,6 +53,4 @@ int sys_swap(int core); void sys_set_resume(unsigned int flags); unsigned int sys_get_resume(void); -void bios_exit(); - #endif diff --git a/wwterm-b05.zip b/wwterm-b05.zip new file mode 100644 index 0000000000000000000000000000000000000000..421cbf0730cb3eaaf051bdd70ef6e9f59a3f13a3 GIT binary patch literal 45063 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 a#D4_@1Al%81;Tp1?m;}~e}4Y)*?$44VHart literal 0 HcmV?d00001